プロファイルフォルダを開く
[Ctrl]+[Win]キーでファイルの実行ダイアログを表示して以下を入力。
1 |
%APPDATA%\Mozilla\Firefox\Profiles |
1 |
%APPDATA%\Mozilla\Firefox\Profiles |
以下のコードで変数iをプロセスで共有できる。すべてのプロセスがなくなると消える。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
#include <iostream> #if defined(__GNUC__) #define shareattr __attribute__((section ("shared"), shared)) #else #pragma section("shared",shared) #define shareattr __declspec(allocate("shared")) #endif shareattr int i=0 ; using namespace std; int main() { i++; cout << "i=" << i << endl; getchar(); return 0; } |
プロジェクトは以下を参照
https://github.com/ambiesoft/blogprogs/tree/master/5637
WinformのTextコントロールにはvalidatingとvalidatedイベントがある。
Textコントロールがフォーカスを失ったり、親のフォームが閉じられようとすると呼ばれる。引数はCancelEventArgsであり、Cancelにtrueを設定することで、キャンセルすることができる。
キャンセルされると、フォーカスが移動できなかったりする。
validatingが成功すると(Cancelされなかった)呼ばれる。validatingは上記のような状況で呼ばれるので、そのときに呼ばれる。Text変更時にはvalidatingもvalidatedも呼ばれない。
https://github.com/ambiesoft/blogprogs/tree/master/5623/txtvalidateandchange
注意:これをやると壊れます。
Dellのinspiron-620sというマシンをWindows10で使っていたのだが、それに積んでいるHDDがLED点灯状態になる問題が発生した(普通は点滅する)。この現象に伴ってファイルが読めなくなる(読み込むと固まる)などの問題が発生したため、HDDのファームウェアのアップデートをしてみることにした。
HDDはST31000524ASという型番、検索するとDellでファームウェアのアップデートが提供されていたので実行してみることにした。
圧縮ファイルに含まれる、B7000100.exeというファイルを実行すると、おそらくファームウェアを適用したあとに再起動したのだが、HDDからブートできなくなってしまった。幸いこのマシンにはSSDも積んでいてそこからもブートできるようになっていたので、起動することはでき、HDDの中身も無事みたいだが、HDDが1つしかない場合は、Windowsを再インストールすることになると思う。
SSDからHDDで起動したあとにEasyBCDを使って再びHDDにBCDを書き込んで、HDDからブートできるように戻すことができた。
このソフトはブート時に使ったBCDの情報を表示するようだ。ここでE:\になっているのはシステムで予約済みの領域で、bootやEFIなどのフォルダとbootmgr,BOOTNXTなどのファイルがある。ここにBCDを書き込むことでもとに戻すことができた。
LED点灯問題は今のところ起きていないが、しばらく様子を見ないとわかない。
更新前のファームのバージョンは確認しなかったが、更新後の情報はHWiNFO64でみると以下のようになっていた。
上記のファームウェアアップデートをしても同じ問題が再現したのでファームウェアの問題ではないようだった。その後色々しらべるとSEAGATEからディスク診断修復ツールであるSeaToolsというものがあるとわかったのでこれを試してみることにした。
ベーシックテストでもエラーはでなかったのでHDDにエラーはないものと思われる。
その後いろいろ調べてみると、同じような問題でDVDドライブがおかしくなるとLED点灯が起こるとあったので調べてみると問題が発生しているときはDVDドライブが見えなくなっていることがわかった。起動時から見えないときもあるし、起動してしばらくしてから見えなくなることもある。これが原因かもしれないので更に調査してみようと思う。
timeコマンドを使う
1 2 3 4 5 6 |
$ time ls dist.bat src/ real 0m0.062s user 0m0.000s sys 0m0.046s |
powershellのMesure-Commandを使う
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
> Measure-Command {ls} Days : 0 Hours : 0 Minutes : 0 Seconds : 0 Milliseconds : 1 Ticks : 14565 TotalDays : 1.68576388888889E-08 TotalHours : 4.04583333333333E-07 TotalMinutes : 2.4275E-05 TotalSeconds : 0.0014565 TotalMilliseconds : 1.4565 > |
1 2 3 4 5 |
vector<string> vs = { "aaa", "bbb", "ccc" }; ostringstream oss; std::copy(vs.begin(), vs.end(), ostream_iterator<string>(oss, " ")); |
<<で渡された値を内部に持っているstringに追加していく。
1 2 3 4 5 6 7 8 9 10 |
ostringstream oss; oss << 1 ; oss << 10 << "\n"; oss << 100 << "\n"; oss << "xxx" << "\n"; oss << "yyy" << "\n"; oss << "zzz" << "\n"; cout << oss.str() << endl; |
=で渡された値をコンストラクタで渡された出力ストリームに追加していく。
コンストラクタの2番めの引数はデリミタを指定する。=でストリームに追加したあとにこの値も追加する。デフォルトでは何も追加しない。
++演算では何もしない。これにより下記のcopyで役に立つ。
1 2 3 4 5 6 7 8 9 10 11 12 |
{ ostream_iterator<int> osi(cout, "\n"); osi = 1; osi = 2; osi = 3; } { ostream_iterator<string> osi(cout, "\n"); osi = "osstest1"; osi = "osstest2"; osi = "osstest3"; } |
上のコードは以下のようにコンソールに出力される。
1 2 3 4 5 6 |
1 2 3 osstest1 osstest2 osstest3 |
第一引数と第二引数のイテレータで入力範囲を指定する。
第三引数で出力イテレータを指定する。
入力出力とも++で一個ずつずらしていって=でコピーする。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
{ vector<int> vi = { 1, 2, 3 }; vector<int> vi2(3); copy(vi.begin(), vi.end(), vi2.begin()); } { vector<string> vs = { "a", "b", "c" }; vector<string> vs2(3); copy(vs.begin(), vs.end(), vs2.begin()); } |
ostream_iteratorの++は何もしないで=で値をストリームに追加する。(最初のコード参照)
CreateProcessでブレークポイントを設定するには、新規ブレークポイントで以下のように入力する。
1 |
{,,kernel32.dll}_CreateProcessW@40 |
kernel32.dllはこの関数を実装しているDLL40、はこの関数の引数のバイト数だと思われる。
プログラムの最初の方で適当なブレークポイントを設定し、以下のコードの結果を調べる。
1 |
void* addr = (void*)CreateProcess; |
ShellExecuteExなどはCreateProcessを他のスレッドで呼ぶらしい。その場合はデバッグの場所でメインスレッドを指定する。
スタックトレースがうまく表示されないときはシンボルのロードをする。
関数ブレークポイントの設定で以下のように入力する(アンダーバーと@以下を削除する)。
1 2 |
{,,kernel32.dll}CreateProcessW {,,user32.dll}CreateWindowExW |
1 |
> Set-PSReadlineKeyHandler -Key Tab -Function Complete |
上記の内容を書いたファイルをC:\Users\
セキュリティ警告が出たときは以下を実行(管理者権限のpowershell)
1 |
> Set-ExecutionPolicy RemoteSigned |
Cygwinやmsysなどのgitからpullすると実行できないことがある。その場合は以下のコマンドで実行属性をつける。
1 |
$ chmod 775 some.bat |