Author Archives: admin

1>mfcs140ud.lib(dllmodul.obj) : error LNK2005: _DllMain@12 は既に MSVCRTD.lib(dll_dllmain_stub.obj) で定義されています。


MFCDLLに普通のDLLを追加したら起きた。

解決法

MFCDLLの「追加の依存ファイル」にmfcs140u.libを追加する。

mfcs140uは強制的にリンクされるらしく、それはCRTよりも早くリンクされなければならないのにDLLを追加したらから順番がずれた?

140とかuとかは場合によって変わるかもしれない。140はVisual Studio 2019あるいはもっと前のバージョン、uはユニコード?、デバッグバージョンのものもあるかもしれないが大変なので無視

ググるといろんな解決法が提示されているけど自分の場合はこれで直った。

追記

デバッグでビルドすると警告が出るが、mfcs140ud.libにすると消える

Dicregateでページを読み込み後一部のエレメントを消す

Remove an element from the page on Dicregate

必要のないタグを見つける

  1. chromeで対象のページを開く
  2. Ctrl+Shift+Iで「開発ツール」を開く
  3. Ctrl+Shift+Cで「エレメント選択モード」に入る
  4. 消したい部分をクリックする
  5. 開発ツールにクリックしたエレメントが表示されるので右クリックして「コピー」「JS Pathをコピー」をクリック
  6. 開発ツールの上のタブから「Console」を選ぶ
  7. コンソールに「貼り付け」てから.remove()を追加してエンターを押す。
  8. 消えるかどうか確認する
  9. .remove()まで含めてコピーする

Dicregateのイベントに登録

  1. Dicregateの辞書のタブから「辞書の編集」をクリックして、編集ダイアログの「イベント」を選択する。
  2. 「ページの読み込み後Javascript実行」をチェックする
  3. コード欄に先ほどコピーしたJavascriptコードを張り付ける。
  4. 「OK」をクリックする
  5. ページで検索などしてみて消えるかどうか確認する

C++ テンプレート関数をソース・ファイルに書く

前提

まだ完全にはわからない

Tが汎用の場合

std::vector<T>などのTに何でも入れられることを前提にしてつくられているクラスはヘッダに書くしかないと思う。

Tが一部の型のみの場合

この場合はソースファイルにかける。

ここでは文字列の長さをを返す関数でchar*とwchar_t*をとるGetStringLength()を考える。

ヘッダ

最初のテンプレート関数は汎用のTを受け取る。もしテンプレート関数が実体化されたときはstatic_assertでエラーになるようにしている(sizeof(T)は決して0にならない。falseを指定してしまうと実体化しなくてもエラーになってしまう(コンパイラ依存))。char*とwchar_t*で特殊化するので、それ以外のポインタで呼ばれたときに実体化される。

次の2つは特殊化の宣言。定義はソースに書く。
次の2つは特殊化が実体化されるときの場所の指定。externでどこかにそれがあることを示している。

ソース

最初の2つは特殊化の定義。
次の2つは特殊化が定義されるときここに実体化されることを意味する。

main.cpp

今回の場合は実装がほぼないのでテンプレートにする意味があんまりないが、2つの実装がほぼ同じで、一部だけ書き換えたいときは汎用Tの方に実装を書くこともできる。その場合にこのテンプレートを使うこともできる。

Tが一部の型のみの場合(バージョン2)

ヘッダー

ソース&main.cpp

ソース:https://github.com/ambiesoft/blogprogs/tree/master/6038

考察

テンプレート関数の定義をソース・ファイルに書くと、他のソース・ファイルからは見ることができないのでリンカーでつなげることになる。よって鉤括弧なしのtemplateは実装を実体化し外部に公開して他のソース・ファイルから見えるようにしているのだと思われる。

鉤括弧ありのテンプレートはあくまでコンパイルフェーズで解決するものであり、宣言だけのテンプレートを実体化しても宣言だけになり、それがリンクされることもないのだと思われる。

C++のテンプレート関数で特定の型でエラーにする

std::is_class

is_class<T>を使うとTがクラス(構造体含む)かどうか判定してくれる。

テンプレート関数funcクラスや、クラスへのポインターや、クラスへのポインターのポインターを渡すとエラーになる。 ただしクラスへのポインターのポインターのポインターを渡すことはできる。

ソース

https://github.com/ambiesoft/blogprogs/tree/master/6022/isClass

vimで複数行の先頭や最後にに文字列を入力

複数行の先頭や末尾に同じ文字列を追加する方法

行の先頭に文字列を挿入

  1. カーソルを行の先頭に移動
  2. Ctrl+V (ビジュアルモードに入る)
  3. カーソルを最後の行に移動
  4. I (入力モード)
  5. テキストを入力
  6. ESC
  7. 少し待つ

行の途中に文字列を挿入

  1. カーソルを先頭の行の挿入したいところへ移動
  2. Ctrl+V (ビジュアルモードに入る)
  3. カーソルを最後の行に移動
  4. A (入力モード)
  5. テキストを入力
  6. ESC
  7. 少し待つ

行の最後に文字列を挿入

  1. カーソルを行の先頭に移動
  2. Ctrl+V (ビジュアルモードに入る)
  3. カーソルを最後の行に移動
  4. $ (最後へ移動)
  5. A (入力モード(最後に))
  6. テキストを入力
  7. ESC
  8. 少し待つ

 

テンプレートのvariadic引数で型をチェックする

普通の型チェック

Tがポインタだとエラーになる。

variadicの場合

最初の引数の型Tに対してチェックしている。CheckKataに渡される引数がwchar_t*だったりポインタのポインタだったらエラーになる。ただwchar_tはセーフにしている。

remove_cvなどの挙動がいまいちよくわからないのでこの書き方であっているのか不明。以下のようなコードで実行時の型を表示してくれる。

is_sameは渡された2つの型が同じならtrue
decayは配列参照などをポインタにしてくれる。
remove_cvconstvolatileを除去
remove_pointerはポインタを1つ除去する。

_vで終わるのはvalue,is_same::valueなどと同じ。
_tで終わるのはtype,remove_cv::typeなどと同じ。

ソース:https://github.com/ambiesoft/blogprogs/tree/master/6006/ConsoleApplication1

エクスプローラに表示されるファイルのタイプを取得する

SHGetFileInfoを使う

ubuntu serverでipv6を無効にする

ipv6有効だとちゃんとネット関連で対応してないと遅くなったりするのでとりあえず無効にしたい。

TLTR

/etc/sysctl.confに以下を追加

/etc/netplan/(file).yamlに以下を追加
link-local: [ ipv4 ]

バージョン確認

今現在ipv6が有効になっているかを確認する ip a

有効になっているとinet6が表示される。

無効にする

無効にするには/proc/sys以下のカーネル設定を叩けばいいがこれをやるコマンドがsysctl。この設定ファイル/etc/sysctl.confに以下の三行を追加する。

この設定を反映するには、sysctl -p

これで永続的に無効になるはずなのになぜか無効にならない。再起動後の値が以下。

netplanが有効にしてるかもしれないので試してみる。netplanはubuntu serverでipの設定をしているものらしい。

やはりnetplanが設定を変えてしまうようだ。そこでnetplanの設定ファイル/etc/netplan/以下の.yamlファイルに以下のようにlink-local: [ ipv4 ]を追加したら再起動しても無効になった。

git submoduleで特定のハッシュやタグでaddする

もともとsubmoduleは勝手に更新されたりしないので、普通にgit submodule addすると、そのときの最新状態に固定される。もっと古いものにしたいときは一旦addしてからsubmoduleのなかでgit checkout SOMETAG or HASHして、上のディレクトリでgit commitする。

実行イメージ

git cleanでいらないファイルを削除する

TLTR

git clean -Xi
または
git clean -Xid

便利コマンド -n

-nをつけるとドライランになって。実際には削除せず、何を削除するかを表示するだけなので確認するのに便利。

-X

.gitignoreで指定されているファイルを削除する。

警告がでる

clean.requireForceが設定されていなくてデフォルトでtrueになるので、もっとオプションが必要らしい。

  • -i: インタラクティブ、一個ずつ確認しながら削除する。
  • -f: clean.requireForceを無視して削除する。

-irmなどと違ってすごく高機能。

危険領域

-X.gitignoreで指定されているファイルを削除するので一番安全と思われる。-Xをつけないとgit statusで表示されるようなuntrackedなファイルも削除する。しかし前述のようにclean.requireForcefalseでない限りは追加オプションが必要になるので危険性は弱くなっている。-fだけで実行すると大事なファイルが削除されてしまう可能性が高い。しかし-dをつけないとディレクトリは削除されないようになっている。-iが高機能なので-fは一切使わないほうがいいだろう。