Author Archives: admin

C#で複数形を単数形に変換する

.NET4のFULLが必要(Client Profileの場合プロジェクトの設定を変える)
System.Data.Entity.Designを参照に追加

C++ 右辺値参照とmove

右辺値参照は「あとは死ぬだけになったオブジェクトの参照」

右辺値参照がわかりづらいのでメモ&テスト

まず、生のデータNamaを定義しよう。

次にこれを扱うクラスNamaHandlerを定義しよう。

問題ない。コンストラクタでNAMAを初期化し、デストラクタで解放。なお例外はスルー。
しかしこのクラスには問題がある。コピーコンストラクタを定義してないので、コピーするとポインタがコピーされ、デストラクタで2重deleteになってしまう。よってコピーコンストラクタを定義しよう。

アサインメントのオペレーターも定義しよう。

コピーコンストラクタはインスタンスを作成するときに呼ばれる(=を使っても)。operator=は=したとき呼ばれる。
実行しよう

ここでNamaHanderを返す関数getNama()を定義しよう。

全部まとめたソース

このコードには論理的に問題はないが、やたらとコピーが呼ばれる。上の42行目と44行目でやたらと呼ばれる、しかも作ったオブジェクトをすぐ捨てていてもったいない。そこで右辺値参照を定義してみる。

&を&&に置き換えただけだが、実行してみるとここに来ることがわかる。どういう条件でくるのか?
参照があとは死ぬだけであとはデストラクタが動くだけのオブジェクトの参照のときに呼ばれる。
これを生かして実装を変えてみよう。

&&で受け取ったオブジェクトのコピーをせずにポインタだけコピーしている。nameの方はNULLをセットしてデストラクタが呼ばれても大丈夫なようにしている。

と思ったが上のコードにはひとつ問題が。ある?
thisと&&が同じ場合のときを考えていなかったがそんなことはあるだろうか?ここではないとしてスルー

std::move()

上記の例は全部コンパイラが勝手に呼んでくれたものだった。
コンパイラは死ぬだけになったオブジェクトを判別できれば呼んでくれるが、すべてのものを判別できるとは限らない。

4行目のn1はもう使ってないので&&を呼んでくれてもいいのに呼んでくれない。そこで書き換えよう。

ここまで全部のソース

std::moveはよっぽど特殊じゃないと使わない気がするし間違うとやばい。

boostのビルドに時間がかかるので別のプリコンパイルヘッダを作成する

プリコンパイルヘッダはwindows.hなどの固定的なファイルをある程度までコンパイルしておいて、1ファイルのコンパイルのたびに最初からやり直さずにすることでビルドを高速化させるものです。通常はstdafx.hがプリコンパイルの対象になります。boostをこの中に入れてもいいのですが、このファイルを編集するとプリコンパイルヘッダ作成が必要で時間がかかるのでboost関係は別のプリコンパイルヘッダを作る方法です。

まずプリコンパイル用のファイルboostheader.hboostheader.cppを用意します。boostheader.hにはboostをインクルードし、boostheader.cppboostheader.hだけをインクルードします。

Visual Studioの設定でboostheader.cppを以下のようにしてプリコンパイルヘッダboostheader.pchを作成します。
clipshot 2015-12-01 05-36-33

boostを使う関数を書いたファイルboostfunc.cppはstdafx.hの代わりにboostheader.hをインクルードします。

boostfunc.cppの設定を以下のようにします。
a

Adobe Reader DCのアップデート設定

勝手にUPDATEされてたのでメモ。ダイアログからは設定できないらしい

このレジストリキーで変更できるのかもしれない。
デフォルトの値は3
設定値は以下
0: ダウンロードもインストールもしない
1: 0と同じ
2: ダウンロードはするけど自動インストールはしない
3: 自動ダウンロード&インストール
4: ダウンロードの通知をする

ソース:http://www.adobe.com/devnet-docs/acrobatetk/tools/PrefRef/Windows/Updater-Win.html

タスクバーをクリックしてもウインドウが表示されない

タスクバーには表示されているのにクリックしてもCtrl+Tabをしてもウインドウが表示されない場合、ウインドウの座標がなんかの拍子に画面外に言ってしまっていることがあるのでいかのように復元する。

1、タスクバーの対象アプリをクリックしてアクティブにする。
2、Alt+Spaceでシステムメニューを表示し、「移動」を選択する。
3、カーソルキーでいろいろ動かす。

アプリが固まっていなければこれで元に戻る。

C言語でフラグのビット反転

XOR演算子 ^ を使う
この演算子はビットごとのXORを返す。

命題 P 命題 Q PQ

printwhatyoulikeが使えない場合

WEBからのURL指定でうまく動かない場合はbookmarkにwhatyoulikeを追加してやるとできる(ここではFirefox)。printwhatyoulikeのbookmarkのページを開き以下の図のようにlinkをメニューバーのブックマークにドラッグする。メニューが表示されてない場合はツールバーの☆にドラッグしてもいい。

printwhatyoulikebookmark

ブックマークに追加したらプリントしたいページを開いてから追加したブックマークを開く。

openwithprintwhatyoulike

MFCのダイアログアプリでダイアログを閉じた後メッセージボックスが表示できない

Win32ではPostQuitMessage()を呼んだあとGetMessage()がFALSEを返すまでの間はメッセージボックスが表示できないようだ。

解決法1:
以下の行を削除する。MFCはm_pMainWndが閉じられたときPostQuitMessage()を呼ぶのであらかじめセットしなければ呼ばれない。


解決法2:

ダイアログを閉じた後メッセージループを回してキューを空にする。

PumpMessageはGetMessageがFALSEだとFALSEを返す。通常1回しか呼ばれないはず。この後ならメッセージボックスを表示できる。