OSC名古屋でしゃべってきた!

OSC名古屋に行ってきました。
目的はセミナーでしゃべってくることでした。
OSC自体初参加なのに講師で話すのは色々と緊張しました。


さて、そのときの資料を公開します。
少しでも役に立てればと思います。

資料:http://goo.gl/NEds8

あと資料で大きく間違っている点があるので修正させていただきます。
46ページ、最小値は「端から最も近い蟻が落ちるまで」ではなく「各々の蟻が近い方の端に落ちるまでの時間の中で最大値」です。

某キャンプに行ってきた!

某キャンプに行ってきました。
と言っても今年は参加者としてではありませんが。
なので特に私からは書くことはありません。
むしろ優秀な参加者がたくさん面白いことを書いてくれてますのでそちらを各自で参照してください。


そこで少し発表してきたのでその資料をここに上げておきます。
内容は散々使ったものなので特に新しいことはありません。
ただ、これまでにはなかった図と少しプログラムの説明が書いてあるので多少なりとも意味はあるかなとは思います。


発表資料:http://goo.gl/NsiJX

参考

自己紹介のプログラム:http://d.hatena.ne.jp/rofi/20100417/1271519352
本文のプログラム:http://d.hatena.ne.jp/rofi/20110110/1294598847

Windows 7 x64でフォルダ操作時の警告

いつぞやからフォルダの操作(リネーム、移動など)をするとちゃんと存在するにもかかわらず「この項目は見つかりませんでした。」という警告が表示されるようになっていました。
実際にはちゃんと存在するためそのダイアログで再試行をするとちゃんと実行されるのですが、毎回出て邪魔なことこの上なかったのですが、ようやく解決策見つけたので備忘録。

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\FolderDescriptions\{2112AB0A-C86A-4ffe-A368-0DE96E47012E}]
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\FolderDescriptions\{2112AB0A-C86A-4ffe-A368-0DE96E47012E}\PropertyBag]
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\FolderDescriptions\{491E922F-5643-4af4-A7EB-4E7A138D8174}]
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\FolderDescriptions\{491E922F-5643-4af4-A7EB-4E7A138D8174}\PropertyBag]
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\FolderDescriptions\{7b0db17d-9cd2-4a93-9733-46cc89022e7c}]
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\FolderDescriptions\{7b0db17d-9cd2-4a93-9733-46cc89022e7c}\PropertyBag]
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\FolderDescriptions\{A302545D-DEFF-464b-ABE8-61C8648D939B}]
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\FolderDescriptions\{A302545D-DEFF-464b-ABE8-61C8648D939B}\PropertyBag]
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\FolderDescriptions\{A990AE9F-A03B-4e80-94BC-9912D7504104}]
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\FolderDescriptions\{A990AE9F-A03B-4e80-94BC-9912D7504104}\PropertyBag]

Windows 7 x64 でフォルダーをリネームすると怒られる件 : TEMTECOMAI ORTHOSTATIC HYPOTENSION

以上のキーを消して再起動でいいらしいです。

参考先の参考先サイトURL:http://answers.microsoft.com/en-us/windows/forum/windows_7-files/renaming-folders-causes-item-not-found-error-in/e2cf38c7-9e77-4256-89de-6308df53d5f9

2014/09/14追記何度も手でやるのが面倒になってきたのでregファイル作成した
https://dl.dropboxusercontent.com/u/53019640/win7exp.reg

規制通知bot

twitterでたくさんポストしている人なら1度は掛かったことのあるポスト規制。
規制に掛かるタイミングを自分で計算するのが面倒になり頭に来たのでbotを作ってしまいました。
前まではその機能に一般的なbotの機能を追加していきこっそりやってたのですが、安定してきたのといつの間にか人が増えたのでその機能だけのbotを新しく作りサービスとして動かすことにしました。

とりあえず簡易的な説明だけ書いておきます。

機能(Ver 1.07 β時点)

[twitter:@post_limit]

  • フォローしたのち、「登録」とだけreplyを送ってください
    • ※フォロー返しされていないと一切の機能が使えません
    • 登録が完了すると完了通知が来ます
  • セクション(後述)辺りに120ポスト目と125ポスト目にそれぞれお知らせしてくれます
  • セクション辺り127ポストすると解除点(後述)のタイミングで通知してくれます
  • 「規制」「解除」「いくつ」「いつ」の単語のいずれかを含むreplyを送ると今のポスト数などを知らせてくれます
  • 「リセット」「りせっと」「正確」の単語のいずれかを含むreplyを送ると規制の時間を過去のポストを拾ってきて再度計算します
    • botからの返答で不正確って言われた場合にリセットをしてみてください
  • 「n個前」(nは数字)というのを含んだreplyを送るとn個前のポストの時間を教えてくれます
  • 規制されたときにも調べられるようにリセット機能とn個前のポストを知らせてくれる機能はDで送っても機能します
  • Dでメッセージを送るとbotがその内容をポストします

技術的資料

このbottwitterのポスト規制は以下のようにして判定されています。

  1. あるポスト(ここでは基準点と呼ぶことにする)から3時間以内に全部で127ポストまでできる
  2. 127ポストしてしまうと基準点から3時間後(ここでは解除点と呼ぶことにする)までは一切ポストできない
  3. この基準点から解除点までをここではセクションと呼ぶことにしている
  4. セクション内で127ポストに満たなかったとしてもその余りは次のセクションには持ち越されない(つまりどのセクションも最大127ポストまで)
  5. ポストには公式RTも含まれる
  6. ポストを消してもその分のポストが出来るようになるわけではない
  7. あるセクションの次のセクションは解除点を過ぎた後の始めてのポストが次のセクションの基準点となる

これらはtwitterで明文化されておらず(多分)これまでの経験則であるため、あるとき急に仕様が変わる可能性があります。
またこれまでもこの条件に合致しないことが何度か報告されているため、セクション辺り127ポストしたからと言って規制掛かるとは限りません。
しかし概ねこのような規則で合っているためこのように組んであります。


より詳細でわかりやすい資料は
http://ltzz.info/alpha/twitter_kisei.html
を参考にしてください。

注意

私個人が欲しかったので作ったものを公開してるだけなのでこれを使用して何か問題があっても一切責任は取りません。
規制通知が来なくて規制に掛かったなどの場合があっても知りませんのでご注意を。
要望などは聞きますが、必ずしも組み込まれるとも限りません。
また、急にbotの運用をやめるかもしれません。
なにせ気まぐれでやってるので・・・

iterator

ちょっと気になって実験したのでその結果を。
本当はもっとしっかり調べて考察するべきでしょうが、ただ単に捨てるのが勿体無かったからなのが主な理由なのでちゃんと調べてません。

for(iterator it = v.begin(), stop = v.end() ; it != stop ; ++it)

forループ内でコンテナの要素に対して変更を行わない場合、forループで上記のように書けばv.end()の呼び出しが1回で済み高速になる・・・とどこかで見た気がしてずっとそうだと信じ込んでたのですが、それが本当か改めて調べてみました。
使用したコードは以下のコードです。

#include <iostream>
#include <vector>
#include <set>
#include <windows.h>

using namespace std;

// ↓コメントインでstd::vectorを、コメントアウトでstd::setを使用します
#define		CONT_VECTOR
// ↓コンテナに入れる要素の大きさ
const int	NUM = 10000000;


#ifdef		CONT_VECTOR
	typedef	vector<int>		CONTAINER;
#	define	pb				push_back
#else
	typedef	set<int>		CONTAINER;
#	define	pb				insert
#endif

int main() {
	CONTAINER	v;

#ifdef		CONT_VECTOR
	v.reserve( NUM );
#endif
	for( int i = 0 ; i < NUM ; ++i )
		v.pb( i );

	DWORD	start, end;
	int		sum;

	timeBeginPeriod(1);

	sum = 0;
	start = timeGetTime();
	for( CONTAINER::iterator it = v.begin() ; it != v.end() ; ++it )
		for( int i = 0 ; i < *it ; ++i )
			sum += *it;
	end = timeGetTime();

	cout << sum << ", iterator it != v.end(): " << (end - start) << endl;

	sum = 0;
	start = timeGetTime();
	for( CONTAINER::iterator it = v.begin(), stop = v.end() ; it != stop ; ++it )
		for( int i = 0 ; i < *it ; ++i )
			sum += *it;
	end = timeGetTime();

	cout << sum << ", iterator it != stop: " << (end - start) << endl;

	sum = 0;
	start = timeGetTime();
	for( CONTAINER::const_iterator it = v.begin() ; it != v.end() ; ++it )
		for( int i = 0 ; i < *it ; ++i )
			sum += *it;
	end = timeGetTime();

	cout << sum << ", const_iterator it != v.end(): " << (end - start) << endl;

	sum = 0;
	start = timeGetTime();
	for( CONTAINER::const_iterator it = v.begin(), stop = v.end() ; it != stop ; ++it )
		for( int i = 0 ; i < *it ; ++i )
			sum += *it;
	end = timeGetTime();

	cout << sum << ", const_iterator it != stop: " << (end - start) << endl;

	timeEndPeriod(1);

	return 0;
}

Windows用です。
コンパイル時にはwinmm.libのリンクを忘れずに。


結果としてはどれも変わりませんでした。
まともに調べてないので具体的な数字は書きませんが、速い結果が出たと思ってももう一回実行すると遅くなったりで、平均すると結果は全部同じでした。


v.end()の呼び出し回数を減らしても最適化でその差は消えちゃうのかなぁ〜

gitのマージツールにWinMergeを使う

前置き

gitにはconflictを起こしたときにマージを支援するための仕組みがあります。
それが

git mergetool

です。

LinuxだとMeldとかがあるようですが、Windowsだとgit用にというのが見つけられなかったので一般的なWinMergeを使うことにしました。
ちなみにgitはCygwinのgitでやってます。
のでmsysgitの方はよくわからないです・・・
#一緒?

ちなみに自分はマージツールだけ変更したかったのでマージツールだけWinMergeに切り替えてますが、diffツールとしてWinMergeを使うことも出来るようです。
また、私はWinMergeを使いましたがDiffMergeというツールも使えるようです。

概要

長々と説明なんか要らないという人のために。

http://rubenlaguna.com/wp/2010/08/05/visual-difftool-cygwin-git/

ここのを使わせてもらいます。
のでここの通りにやればできます。
ただし.cmdの部分に指定する値が少し間違ってるので注意!

\"\$LOCAL\" \"\$REMOTE\"" \"\$BASE\"" \"\$MERGED\"

\"\$LOCAL\" \"\$REMOTE\" \"\$BASE\" \"\$MERGED\"

に変更してください。
(二箇所ダブルクオートを消す。ダブルクオートの対応が間違っているため)

説明

上記URL先のを使用させてもらうので上記URL先を読みましょう。

リンク先にあるリンクからgithubに飛んで以下の必要なものを落としパスが通ってるところに置く
  • githelperfunctions.sh ← 必須
  • winmerge-merge.sh   ← WinMergeでマージを行う
  • winmerge-diff.sh    ← WinMergeでdiffを行う
  • diffmerge-merge.sh   ← DiffMergeでマージを行う
  • diffmerge-diff.sh   ← DiffMergeでdiffを行う
githelperfunctions.shの最終行辺りを編集
  1. 必要な行をコメントイン
  2. 不必要な行をコメントアウト(しなくても問題ないとは思いますが)
  3. WinMerge/DiffMergeへのパスをインストールした場所に設定
以下のコマンドを実行し、gitにツール登録を行う
# diffツールとして使う場合
## DiffMergeを使う場合
git config --global difftool.diffmerge.cmd "diffmerge-diff.sh \"\$LOCAL\" \"\$REMOTE\" \"\$BASE\" \"\$MERGED\""
## WinMergeを使う場合
git config --global difftool.winmerge.cmd "winmerge-diff.sh \"\$LOCAL\" \"\$REMOTE\" \"\$BASE\" \"\$MERGED\""
## プロンプトの設定(WinMerge/DiffMerge共通)
git config --global difftool.prompt false

# マージツールとして使う場合
## DiffMergeを使う場合
git config --global mergetool.diffmerge.cmd "diffmerge-merge.sh \"\$LOCAL\" \"\$REMOTE\" \"\$BASE\" \"\$MERGED\""
git config --global mergetool.diffmerge.trustExitCode false
## WinMergeを使う場合
git config --global mergetool.winmerge.cmd "winmerge-merge.sh \"\$LOCAL\" \"\$REMOTE\" \"\$BASE\" \"\$MERGED\""
git config --global mergetool.winmerge.trustExitCode false
最後にmergetool/difftoolに先ほど登録したものを設定する(各リポジトリごとの設定)
# diffツールとしてDiffMergeを使う
git difftool -t diffmerge
# diffツールとしてWinMergeを使う
git difftool -t winmerge
# マージツールとしてDiffMergeを使う
git mergetool -t diffmerge
# マージツールとしてWinMergeを使う
git mergetool -t winmerge

デフォルトとして設定するならglobalに設定する

# diffツールとしてDiffMergeを使う
git config --global diff.tool diffmerge
# diffツールとしてWinMergeを使う
git config --global diff.tool winmerge
# マージツールとしてDiffMergeを使う
git config --global merge.tool diffmerge
# マージツールとしてWinMergeを使う
git config --global merge.tool winmerge


以上でWinMergeがmergetoolとして(他の設定すればそのように)なります。

第六回 カーネル/ VM 探検隊で発表してきた

資料

発表資料: http://goo.gl/FqRXo
プログラム及び加算器: http://goo.gl/eeYix
参考: http://d.hatena.ne.jp/rofi/20110507/1304759918

内容

発表してきました。
内容は前回のゲームプログラミング勉強会と同じです。
今回は前回ほど高速にではなかったのでまだ話の内容がわかったのではないかなぁ〜と思います。