move from/to ccr
2015/04/30
VS2013 で Consolas + MS ゴシック (Meiryo でも可) を実現するもう一つの方法
見やすいので重宝しています。
が、全角罫線文字 (U+2500 付近) を使って絵を書くと、ずれてしまいます。
これは、どうも、Consolas がこの U+2500 のグリフを持っているので、代替フォントセット GlobalMonospace.CompositeFont に定義されている文字を使用しないため、のようです。(推測)
Ricty などのフォントを使うのが一般的なようですが、Consolas フォントはライセンスの都合使えませんから、半角文字に Consolas が使いたい、という要望は満たせません。
TTC を合成してしまう方法もあるようです。が、かなり面倒なようです。
調べたところ、VS2008 以前では Windows の FontLink 機能あるいは vsFontLk.dat ファイルで フォントリンクを作って合成できた、のかもしれません。
が、VS2013 では、WPF/DirectWrite を使用しているため、この方法は使えない、ということのようです。
WPF を使っている、ということなので、IDE のコードエディタが内部で使っているであろう FontFamily プロパティに自分で作成した CompositeFont を指定できれば、なんとかなるのではないかと思ってやってみました。
まず、XML を自力で一から書くのは面倒なため、既存の CompositeFont を流用します。
管理者コマンドプロンプトで作業します。
>C:
>cd C:\Windows\Fonts
>copy GlobalMonospace.CompositeFont MyFont.CompositeFont
>notepad MyFont.CompositeFont
MyFont.CompositeFont を書き換えます。
FontFamily.FamilyNames の内容にフォント名があるので、
<system:string x:key="en-us">MyFont</system:string>
のように に書き換えます。
<FontFamily.FontFamilyMaps> の 内容 を一度全部消して、
<FontFamilyMap Unicode="0000-007F" Target="Consolas" Scale="1.0" />
<FontFamilyMap Unicode="0080-2FFFF" Target="MS Gothic" Scale="1.0" />
にします。
ここからがちょっとイタイんですが、この複合フォントファイルを VS2013 に指定するまっとうな方法が、ありません。
(裏ワザに近いけど、EtherNEC ほどじゃないです)
VS2013 を立ち上げます。
メニューの、[オプション] - [環境] - [フォント及び色] で、フォントを変えたいところを、既定値以外の特定の値、 例えば Consolas に変えておきます。
あとでエディタで置換するためです。
メニューの [ツール] - [設定のインポートとエクスポート] で、
[選択された環境設定をエクスポート]
次へ
[すべての設定] のところのチェックボックスをクリアして、一度全部クリアされた状態にします。
[オプション] - [環境] - [フォントおよび色] のところだけチェックします。
次へ
ファイル名を付けて保存します。
完了
閉じる
テキストエディタでさっき保存した設定エクスポートファイルを開きます。
置換機能で、
Consolas -> C:/Windows/Fonts/MyFont.CompositeFont#MyFont
に全部置換します。 保存しておきます。
VS2013 に戻り、
編集した設定ファイルをインポートします。
既知の問題
VS2013 のオプション設定画面、フォントおよび色を表示したあとに OK を押すと、設定が失われる(インポートやりなおし)。
MyFont.CompositeFont ファイルを、VS2013 を開いたまま編集して保存して、VS2013 が新しい文字をレンダリングしようとする(スクロールさせる)と、 VS2013 が強制終了する。
当方のモニタ等で合わせ込んだ設定。
8pt 設定
<FontFamilyMap Unicode="0000-007F" Target="Consolas" Scale="1.0" />
<FontFamilyMap Unicode="0080-24FF,2600-2FFFF" Target="Meiryo" Scale="1.09" />
<FontFamilyMap Unicode="2500-25FF" Target="MS Gothic" Scale="1.0" />
---
Windows10 Thinkpad25 VS2017
<FontFamilyMap Unicode="0000-007F" Target="Consolas" Scale="1.0" />
<FontFamilyMap Unicode="0080-24FF,2600-2FFFF" Target="Meiryo" Scale="1.15" />
<FontFamilyMap Unicode="2500-25FF" Target="MS Gothic" Scale="1.1" />
TODO:ファイルとかのアップロードは、また次の機会。
2015/04/28
C# int.Parse 系関数の挙動
(ホントかよ・・?)
ってことでやってみた。
Windows7(日本語)SP1 .Net4.5.1(4.5.51209) VS2013Pro 12.0.31101.00 Upd4
こんなかんじのコード。
public static void hoge(string s)
{
int a;
bool r = int.TryParse(s, out a);
Console.WriteLine(r.ToString());
}
"1" | True | アスキーの 1 なら当然変換できる |
"1" | False | 全角 1 は変換できない |
"一" | False | 漢数字 一 は変換できない |
ついでなので、
char.IsDigit("1", 0) | True | アスキーの 1 |
char.IsDigit("1", 0) | True | 全角 1 |
char.IsDigit("一", 0) | False | 漢数字 一 |
もうひとつ。
char.IsNumber("1", 0) | True | アスキーの 1 |
char.IsNumber("1", 0) | True | 全角 1 |
char.IsNumber("一", 0) | False | 漢数字 一 |
結論
カルチャに依存するかもしれないが、全角アラビア数字や漢数字は変換できなかった。
漢数字変換は特に、表記法や位取り法が決定的でないから、考えただけでも嫌気がするぐらい面倒なので、これがシステムでサポートされているとは考えにくい。
2014/02/02
XM6i IPIPE2 メモ
IPIPE2
118.711
r5977
120.5033558
IPIPE2 : ポストフィル
108.800635
ポストフィル + memmove
118.035984
118.627880
ポストフィル + memmove + フィル時シフト
108.112210
ページプリフェッチ
4word: 104.325887
8word: 102.689859
16word: 106.564168
128word:183.164249
分岐ブレーク
8word: 104.130537
Bxxのみブレーク
8word: 101.507216
16word: 102.214255
最適化
6word: 102.159446
8word: 100.751292
10word:100.856234
16word: 100.900621
32word: 103.232428
ブレークなし:
8word: 101.004908
バースト+ループモード
16word: 100.823055
8word: 100.694827
8word: 100.147181
10word: 98.264171
10word: 98.711751
12word: 99.069446
ループモードデバッグ後
10word: 97.831422
18word: 94.077431
32word: 97.475270
16word: 94.380805
20word: 98.565045
14word: 94.148213
12word: 95.090167
10word: 96.229707
8word: 96.950465
6word: 98.323310
4word: 102.934603
18word:93.622686
IPIPE
102.144
2013/07/31
FreeNAS 8.3.1 p2 インストール
- USBメモリに FreeNAS の (iso ではなく) img の方を書く。
- USBメモリから起動して、シングルユーザモードにする。
- # sysctl -w kern.geom.debugflags=0x10
- # dd if=/dev/(USBメモリ) of=/dev/(内蔵SSD) bs=1m count=2000
- USBメモリに iso を書いても起動できない。(あたりまえ)
- kern.geom.debugflags = 0x10 しないと書き込みが許可されない。
- シングルユーザモードで起動する。
- # sysctl -w kern.geom.debugflags=0x10
(ここで必要かは、正直不明) - # gpart resize -i 4 -s (サイズ) /dev/(SSD)
サイズは gpart show して表示されるサイズから計算。
今回は少し余らせた。(growfs のバグに気づかなかった為) - # newfs -L FreeNASs4 /dev/(SSD)s4
- # mount -uw /
- # mkdir mnt2
- USBメモリ挿入。
- # mount /dev/(USBメモリ)s4 /mnt2
- # mount /dev/(SSD)s4 /mnt
- # cd /mnt2
- # cp -a * /mnt
- umount するなりして再起動
- growfs はバグがあるので使えない。(2日つぶした)
kern/170431: Partition resize and growfs destroys label entry in /dev/ufs
なので newfs して書き戻す必要がある。 - インストール直後でないと上記手順は使えない。/data の中身をどこかに退避できれば、同じ考え方で行けるかもしれない。
この後の手順。
- コンソールから、ネットワークの設定。IPv6 の設定は後からGUIでやるほうが簡単。
- 以下GUIから、Account - Admin Account - Change Password で パスワード設定。
- Network - Global Configuration から Hostname 設定。
- Network - Interface 設定。IPv6 設定。
- System - Settings - General から Language, Timezone 設定。
- System - Settings - Email 設定。root のメールを自分宛に設定して、テスト。
- Storage - Volume でボリューム作る。プールとデータセット。
- ssh で入れるようにする。
- home ごにょごにょして パッチ作るとか。
- /boot/loader.conf に speaker_load="YES"
- このへんから speaker.ko をもってきて /boot/kernel/ にコピーしておく。
ftp://ftp.jp.freebsd.org/pub/FreeBSD/releases/amd64/ISO-IMAGES/8.3/FreeBSD-8.3-RELEASE-amd64-bootonly.iso - /conf/etc/base/rc.local, rc.shutdown.local でスピーカを鳴らす。
- CIFSなりなんなりの設定。
共有にアクセスするユーザを制限するには、高度な設定で、
valid users=(ユーザ)
ハマリポイント: CIFS 設定したあとで追加したユーザは、smbcontrol smbd reload-config しても、CIFS サービスを再起動しないと passdb を再読み込みしてくれないようで、認証に失敗する。 - pkg_add -r php5
- ftp でユーザホームではなく共通ディレクトリに chroot するには、
<Global>
DefaultRoot (共通ディレクトリパス)
</Global>
を高度な設定で追加。
- ファイルマネージャが無くなった。シェルに降りないと共有用のディレクトリさえ作れない。データセットをたくさん作れ、ということなのかも。
- php がインストールされてない。pkg_add。
- /home が存在しないディレクトリにシンボリックリンクされてる。
- ユーザの home に /home 以下のディレクトリを指定できない。python をパッチした。(またか)
- /mnt で始まるマウントポイントを作ると、ディレクトリ選択肢に出るけども、設定できない。
- 起動音、終了音が鳴らない。
- SMARTの対象に、システムを入れたディスクが指定できない。
- GUI、見た目はともかく、機能がしょぼい。チップヘルプも少ない感。
- ログを GUI から確認できない。
- GUI のツリーメニューがピヨピヨしてうざい。
- ping とか打てない。全部シェルから。えーと。
- シェルウィンドウはいいんだけど、設定見ながらとかできないから、ssh の設定を最優先ってことでいいですか。
- レポートメールをいつ、なにを送るかをどうやって設定するの?
(フォーラムでも指摘されてる。) - cron まんまの時間指定はどうにかなりませんか。まえも cron だったけどもう少しわかりやすかった気が。
- ZFS 採用のくせに、メモリ使用量を確認するにはグラフを下までスクロール、とか勘弁して下さい。
- GUI からアップグレード出来るっぽい(やってはいない)
なにもかもなつかしい・・・
2013/06/03
TortoiseHg 対応の Exclude エクステンション書いてみた
ちょっとした代替手段の提案です。
Mercurial の Exclude エクステンション
http://mercurial.selenic.com/wiki/ExcludeExtension
を改造して、TortoiseHg に対応してみました。
対象: TortoiseHg 2.8, Mercurial 2.6
他のバージョンでは確認していないし、動く可能性も低いと思います。
ここからダウンロード
http://www.codebox.rni.jp/hgext/exclude.py
使用方法:
元の ExcludeExtension をインストールして、exclude.py を差し替えて下さい。
設定方法は元のものと同じです。
TortoiseHg の ciexclude(除外ファイル)とは以下の点が違います。
- syntax 指定が使えます。(.hgignore と同じ書式です。)
- exclude されたファイルは、コミットペインに表示されません。 (ciexclude はチェックが外れるだけです。)
Tips:
svn の changeset のように複数のセットを直接定義することはできませんが、カスタムツールと合わせて .hgexlcude を変更することで、(かなり遠いけれどこれまでよりは)近い雰囲気を実現できます。
まずファイルを2つ作っておきます。
.hgexclude.empty
(空のファイル)
.hgexclude.ignore-on-commit
syntax:glob
*/AssemblyInfo.cs
と用意しておいて、
cmd /c copy "{ROOT}¥.hgexclude.ignore-on-commit" "{ROOT}¥.hgexclude"
を実行するカスタムツールと、
cmd /c copy "{ROOT}¥.hgexclude.empty" "{ROOT}¥.hgexclude"
を実行するカスタムツールをそれぞれ作成します。
ボタンを押してから、更新ボタンを押します。
2013/05/27
Mercurial 運用開始までのメモ
この文書は無保証です。
要約
svn 単独で運用していた環境から、svn をメインリポジトリサーバとして使用したままで、hg を使った 分散リポジトリ環境に移行した。キーワード
hgsubversion 拡張, largefiles 拡張, hg graft コマンド環境と前提条件
OS | hg | |
PC1 | Mac OS X 10.6 | hg 2.5.2 |
PC2 | Windows7 Professional SP1 x86 (32bit) | Tortoisehg 2.8, Mercurial 2.6 |
- PC1 と PC2 のユーザは別人である。
- svn サーバへアクセス出来るのは PC1 のみである (SSH 鍵の都合上)。
- PC2 からのコミットを検証して、PC1 から svn サーバに push する。
- 透過的コミットは、はなから目的としない。
結論
概要
- svn サーバからは必要な svn ブランチのみ clone すること。svn ブランチ間のマージは諦める。(svn でやる)
- svn のタグは諦める。
- svn との連係は default ブランチ、hg 側は base ブランチと決める。
- repoB は連係専用とし、repoB で通常の編集作業は行わない。 これを守ることで、repoB の default と base の間の同期作業で、graft 時にローカル変更との衝突が発生しない。
構築手順(svn ブランチごとに行う)
- repoB の構築
- hgsubversion 拡張を enable する。
- largefiles 拡張を enable する。
- hg clone svn://svnserver/repoA/svnbranch repoBS
- hg lfconvert repoBS repoB
- cd repoB
- cp ../repoBS/.hg/hgrc .hg/hgrc
(済んだら repoBS は消して良い) - hg svn rebuildmeta
- hg up
- hg branch base
- hg commit -m 'create base branch'
- hg serve --port 8881
ポート番号はブランチごとによしなに決める。
- repoC の構築
- hg clone repoB repoC
- hg up -r base
- repoD の構築
- hgsubversion 拡張を enable する。
- largefiles 拡張を enable する。
- hg clone http://PC1:8881/ repoD
- hg up -r base
運用手順
- repoB から svn に push する
- hg up -r base
- よしなに確認する。
- hg up -r default
- hg graft -r 'branch(base)'
- hg outgoing
最終確認する - hg push
- repoB に svn repoA から pull する
- hg up -r default
- hg incoming
- hg pull
- hg up -r base
- hg graft -r 'branch(default)'
- repoC, repoD での通常作業
- base ブランチに対してcommit。base ブランチからさらにブランチしてもよい。 base ブランチの内容だけが svn への push 候補となる。
- 普通に push, pull する。
知識とは失敗である、その手順
失敗: largefiles 拡張が必要
まずなにも考えず hg clone で svnリポジトリ全体をクローンする。
- PC1
- hgsubversion 拡張を enable する。
- hg clone svn://svnserver/repo1 repo1
→成功。2時間ぐらいかかった。 - cd repo1
- hg serve --port 8881
- PC2
- hg clone http://PC1:8881/ repo1
→数十分後に OutOfMemory の Python 例外
- hg clone http://PC1:8881/ repo1
調べたり聞いたりしたところによると、hg が想定しているファイルサイズは <10MB だそうで。 ファイルを全部メモリに展開するみたいで、32bit OS では Python のアドレス空間が不足する。
Twitter で愚痴を言ってみたところ、、、
Mercurial の Out Of Memory 地獄にハメられた。
— Y.Sugaharaさん (@moveccr) 2013年5月13日
@moveccr #mercurialjp もしかしてhgsubversion併用での hg clone 時の out of memory でしょうか?であれば、以下の回避方法が参考になると思います groups.google.com/d/msg/mercuria…
— FUJIWARA Katsunoriさん (@flyingfoozy) 2013年5月13日
@moveccr 管理対象ファイルが余程大きくなければ out of mermory は発生しない(ファイル数上はmozilla規模のソースでも大丈夫)と思いますが、潜在的問題の可能性もあるので、--traceback 付きでの実行結果&再現条件等を知らせて頂けると助かります
— FUJIWARA Katsunoriさん (@flyingfoozy) 2013年5月13日
@flyingfoozy ええと、hgsubversion(MacOSX)でcloneしたリポジトリをさらにhg clone(Win7 x86)しようとしたとき、です。
— Y.Sugaharaさん (@moveccr) 2013年5月13日
@flyingfoozyWin7 x86でhg clone -r1 xxxxhg pull -r365してからhg pull -r366したものがこちらです。moveccr.blogspot.com/2013/05/mercur…
— Y.Sugaharaさん (@moveccr) 2013年5月13日
@flyingfoozy r366 には 4ファイルあってサイズ合計は1GBほどです。大きすぎるんだと思いますが、はっきり言って、hg 使うのは諦めようかと考えている状態です。
— Y.Sugaharaさん (@moveccr) 2013年5月13日
@moveccr 情報ありがとうございます。pull での連携先リポジトリの設定ファイルで [server] preferuncompressed=True を設定して再度 pull を試してみてもらえますか? mercurial-users.jp/manual/hgrc.5.…
— FUJIWARA Katsunoriさん (@flyingfoozy) 2013年5月13日
@flyingfroozy タスクマネージャでワーキングセットサイズを観測していると、1GBを超えたあたりで out of memory で終了するようです。
— Y.Sugaharaさん (@moveccr) 2013年5月13日
@flyingfoozy はい、やってみます
— Y.Sugaharaさん (@moveccr) 2013年5月13日
@flyingfoozy やってみました。が、全く同じ結果となりました。
— Y.Sugaharaさん (@moveccr) 2013年5月13日
@moveccr #mercurialjp あるいは、pull 連携先において hg bundle -t none で無圧縮bundleファイルの書き出し⇒ファイル転送⇒win側で hg unbundle でも回避できるかも?(ネットワークが切れやすい場合などにも使えます)
— FUJIWARA Katsunoriさん (@flyingfoozy) 2013年5月13日
@moveccr #mercurialjp あぁ、発生位置からすると、履歴に記録する際の圧縮処理でmemory errorが発生しているみたいなので、単純にx86環境での利用可能メモリの上限に引っかかっているのかもしれませんねぇ。だとすると、運用で回避するのは難しいかも……
— FUJIWARA Katsunoriさん (@flyingfoozy) 2013年5月13日
@moveccr #mercuraljp Mac側で問題無いのはMacOSが64bit環境だからだと思われます mercurial.selenic.com/wiki/HandlingL… Windows側でも64bit版バイナリを使用すれば大丈夫だと思いますが、OSが32bit版だったりします?
— FUJIWARA Katsunoriさん (@flyingfoozy) 2013年5月13日
@moveccr おっと、何故かメンションが機能してなくて、見落としてました。やはり 32bit 環境の壁でメモリ不足になっている印象ですね > 1GBを超えたあたりで out of memory
— FUJIWARA Katsunoriさん (@flyingfoozy) 2013年5月13日
@flyingfoozy Windows7のほうは32bit版です。なお、Window7 x64 では clone 出来ました。私個人が使うぶんには良いのですが、他の人全員64bitにしろとは言えないので、困っています。
— Y.Sugaharaさん (@moveccr) 2013年5月13日
@moveccr #mercurialjp largefilesエクステンション mercurial-users.jp/manual/hg.1.ht… の lfconvert 変換により大容量ファイルを分離する手もありますが、ファイルサイズ次第では結局メモリが不足する可能性はありますねぇ>32bit環境
— FUJIWARA Katsunoriさん (@flyingfoozy) 2013年5月13日
@moveccr #mercurialjp もしも largefiles エクステンションに興味があれば、以下のエントリが参考になれば幸いです d.hatena.ne.jp/flying-foozy/2…
— FUJIWARA Katsunoriさん (@flyingfoozy) 2013年5月13日
@moveccr #mercurialjp largefiles エクステンション使用時は、large 扱いの管理対象ファイルは圧縮を行わないので、通信の圧縮設定さえ外せばそこそこのサイズのファイルまで扱えるとは思います(確定的な情報が無くて済みません)
— FUJIWARA Katsunoriさん (@flyingfoozy) 2013年5月13日
@flyingfoozy lfconvertについて調べてみます。ありがとうございました。
— Y.Sugaharaさん (@moveccr) 2013年5月13日
@flyingfoozy lfconvert したリポジトリに対して、hg pull することで、完走しました。ありがとうございました!
— Y.Sugaharaさん (@moveccr) 2013年5月13日
@moveccr #mercurialjp 無事利用可能になった様で何よりです。largefiles は(コーナーケース的な)パターン指定時の hg status 時の挙動や、性能的な点で、まだ問題がありますが、可能な範囲で対処しますので、気になる点があったらお知らせください。
— FUJIWARA Katsunoriさん (@flyingfoozy) 2013年5月13日
@flyingfoozy さんご親切にありがとうございました。
というわけで largefiles 拡張が要るとのこと。
→やりなおし
失敗: hg lfconvert + hg svn rebuildmeta の罠
- PC1
- largefiles 拡張を enable する。
- hg clone svn://svnserver/repo1 repo1S
- hg lfconvert repo1S repo1
- cd repo1
- hg pull
→エラー。paths の設定は lfconvert で引き継がれていない、というか hgrc がコピーされない。 - cp ../repo1S/.hg/hgrc .hg/hgrc
- hg pull
→svn のリビジョンをもう一度全部 pull して来ようとする。
lfconvert したリポジトリは repo1S とは全く別のリポジトリで、ハッシュ値も全く違うものになる。 なのでリポジトリ内の clone した時のリビジョンと、svn の対応リビジョンの情報が一致しなくなり、 hg pull (incoming) で見える svn 側のリビジョンは別のものとして扱われてしまう。
→hg svn rebuildmeta
失敗: hgsubversion default ブランチの罠
hgsubversion 拡張は default ブランチを svn との連係に使用するが、svn にはマージリビジョンの 概念がないので、マージリビジョンがあると push できない。
さらに
- うっかりローカル変更があると、svn 側と衝突したときのマージが面倒。
- commit 後、svn に push するとハッシュ値やユーザ名が svn 側のものに変わる。
→push するまでハッシュが確定しない。したがってリビジョンを参照する(ログに関連リビジョンのハッシュを記載する)ことは不可能。
世の中を見ると、merge - commit - revert する方法が提案されていて、確かに可能だが、
- 複数のコミットで構成されるマージの場合、コミットがまとめられてしまう。
- 一つ一つのコミットを svn に送信したい場合は、一つづつ merge - commit - revert しなければならない。
- commit ログをもう一回入力しなければならない。
- リビジョングラフの形が気持ち悪い。
(イマイチ理解していないのでどこか間違ったのかもしれない)
さらに世の中には rebase する方法も提案されているが、試すより先に graft を思いついたので試していない。
解決策
- default ブランチは svn との連係専用にしてここで編集しない。
- repoC, repoD でのコミットは、base ブランチに行う。default は(過去ログ以外)見ない。
- graft を使う。この場合、default ブランチと base ブランチはリビジョングラフ上で交差しない。
これは嫌な人には嫌だろうが、今回のケースでは svn に push したコミットの author が書き換えられるため、 同じ変更でも別のコミットに見えてくれる方が都合が良く、怪我の功名。
graft は今回の用途には非常に都合よくできていて
- マージリビジョンは無視される。
- graft したリビジョンは記録されていて、何回も graft されるようなことはない。
- コミットログはそのままコピーされる。
失敗: 非標準レイアウトの罠
非標準レイアウトの場合 hgsubversion は全てのブランチとタグを通常のディレクトリとして svn から取得する。
これは svn の ブランチとタグが只のコピーと区別がつかないせいだが、clone したディレクトリが 恐ろしく肥大化してしまい、何をしても時間がかかるようになってしまう。
解決策
- 個別のブランチを svn から取り出す。svn ブランチ間マージは hg では実行しない。
2013/05/13
Mercurial at Win7 x86 の Out Of Memory error
pulling from http://x.x.x.x:y/ searching for changes adding changesets adding manifests adding file changes transaction abort! rollback completed Traceback (most recent call last): File "mercurial¥dispatch.pyo", line 88, in _runcatch File "mercurial¥dispatch.pyo", line 771, in _dispatch File "mercurial¥dispatch.pyo", line 540, in runcommand File "mercurial¥dispatch.pyo", line 866, in _runcommand File "mercurial¥dispatch.pyo", line 837, in checkargs File "mercurial¥dispatch.pyo", line 766, inFile "mercurial¥util.pyo", line 506, in check File "mercurial¥extensions.pyo", line 143, in wrap File "mercurial¥util.pyo", line 506, in check File "hgext¥largefiles¥overrides.pyo", line 733, in overridepull File "mercurial¥util.pyo", line 506, in check File "mercurial¥commands.pyo", line 4543, in pull File "mercurial¥localrepo.pyo", line 1692, in pull File "mercurial¥localrepo.pyo", line 58, in wrapper File "mercurial¥localrepo.pyo", line 2330, in addchangegroup File "mercurial¥revlog.pyo", line 1244, in addgroup File "mercurial¥revlog.pyo", line 1115, in _addrevision File "mercurial¥revlog.pyo", line 1026, in compress MemoryError abort: out of memory
2012/12/07
2012/09/06
C# で static class のファイナライザを書く
シングルトンを使え、という方針は正しいが、
それでも static class のファイナライザが実装したいときはある。
private 定義のクラスのインスタンスに肩代わりしてもらう方法を考えてみた。
public static class FinalizableStaticClass
{
private class FinalizeWorkClass
{
~FinalizeWorkClass()
{
// ファイナライザ
}
}
private static FinalizeWorkClass finalizeWorkClass = new FinalizeWorkClass();
}
- FinalizableStaticClass に一度もアクセスしなければ、FinalizeWorkClass のインスタンスは生成されないので、当然ファイナライザも呼ばれない。
- ファイナライザが呼び出されるタイミングは、通常のフォームアプリケーションだと Main が終了した後。確かめていないけど、多分アプリケーションドメインが終わった時。
- ファイナライザではアンマネージリソースの後片付けとかぐらいにしておくこと。
2012/08/23
Thinkpad T410i でグラフィックコントロールパネルが再起動するたびに表示される問題を修正する
ログインするたびに、インテル グラフィック メディア コントロールパネル(GfxUI.exe) が
毎回実行されるようになってしまった。
インテルから Intel HD Graphics の最新ドライバをインストールしたら治った。
2012/05/30
NetBSD PR lib/46433 についてのコメント
この問題は、 m68k FPE のデバッグをしている時に、libm の exp() のテストがおかしいんじゃないかという疑問を持ったことに端を発する。
2012/05 時点で、m68k FPE の exp(x) が stub 実装で、常に x を返すという痛々しい事実はまず忘れておいて、そもそもこのテストコードの意味を考えてみる。
テストとは、
「信頼されたもの」を使って、「信頼出来るかわからないもの」が信頼出来るかどうか調べる行為である。
今回問題になってるテストコードは
exp(x + y) - exp(x) * exp(y) < eps
さてここで、「信頼されていないもの=調べたいもの」には .N をつけてみよう。
exp.N(x + y) - exp.N(x) * exp.N(y) < eps
左辺に信頼されていないものを集めて、右辺に信頼出来るものを集める。が、もうこれ以上移項できない。
そうするとこの式を見て分かるように、このテストコードでは、「左辺の式が eps 以下である」ことしかテストできていない。exp 自体が信頼できるかどうかは、このコードでは分からない。
仮に exp 自体がすでに信用出来るものである、とすると、このテストコードがテストすることになるのは、数学領域の「exp(x+y) = exp(x)*exp(y)」という式が数学的に正しいかどうか、であって libm の exp ではない。
このテストコードを、まがりなりにも libm のテストとして成立するように書きなおすとしたら、
#define Ex (計算済みのexp(x)を定数にしたもの)
#define Ey (計算済みのexp(y)を定数にしたもの)
exp(x + y) - Ex * Ey < eps
とすれば、
exp.N(x + y) < eps + Ex * Ey
となって、「exp(x + y) が信頼出来るかどうか」のテストコードとして成立する。
もちろんこうなると、信頼されている Ex * Ey は事前に計算してよいので、
#define Exy (計算済みの exp(x) * exp(y) を定数にしたもの)
exp.N(x + y) - Exy < eps
としてよい。
また、x+y も信頼されているので事前に計算してよい。z=x+y とおけば、
exp.N(z) - Ez < eps
となる。すでにこれは exp[2f]?_product のテストではない。掛け算どこにも出てこない。
以上、libm のテスト exp[2f]?_product は意味が無い、という考察でした。
もしかして、数学の正しさをテストしたかったんならごめん、ライブラリのテストコードじゃなくて他所でやって・・・
2012/05/18
IDispose 実装のパターン
class Foo: IDisposable
{
// アンマネージリソース
private IntPtr unmanaged;
// IDisposable を実装している他のクラス(このクラスがオーナー)
private OtherDisposableClass other;
// イベントを持ってて、このクラスがイベントをサブスクライブしてる
// このクラスは参照してるだけ
private ReferencedWithEvent refwe;
// 自分のイベント
public event EventHandler AnyEvent;
// もし、アンマネージリソースをこのクラスが直接管理していなければ、
// ファイナライザを用意しなくていい。
~Foo()
{
Dispose(false);
}
public void Dispose()
{
Dispose(true);
GC.SupressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
if (disposing) {
// Dispose() から呼び出された時は、保持しているIDisposableメンバを
// null チェックしてから Dispose() を呼び出して null にセットしておく。
// 他の例にあるような disposed フラグは使わない。
// その理由は、other のインスタンスが Open() などのように
// コンストラクタ外で確保される場合でも同じパターンでコードを書くため。
// また、null チェックして null 代入しておけば Dispose() が複数回コールされても大丈夫。
if (other != null) {
other.Dispose();
other = null;
}
if (refwe != null) {
// サブスクライブしたイベントを解除
// More Effective C# 23
// イベントハンドラの定義宣言は省略...
refwe.Event -= refwe_Event;
refwe = null;
}
}
// 直接このクラスが管理しているアンマネージリソースの解放処理をここに書く。
// 仮に other がアンマネージリソースを保持していることを知っていても、
// ここで Dispose を呼び出してはいけない。
// ここはファイナライザからの呼び出しでも実行される場所で、ファイナライザからの
// 呼び出しである場合、other はすでにファイナライズされているかもしれない。
// .Net の GC は参照カウントでなくルート探索で動作するので、自分が参照して
// いるからといって、そのオブジェクトがファイナライズされていない保証はない。
// したがって、ここでは他のオブジェクトを参照してはいけない。
// http://msdn.microsoft.com/ja-jp/library/system.idisposable.dispose.aspx
// もし、IntPtr.Zero も有効な値なのであれば、
// 別のフラグを用意して、開放したかどうかを管理する。
if (unmanaged != IntPtr.Zero) {
UnmanagedResource.Free(unmanaged);
unmanaged = IntPtr.Zero;
}
// 単なる null 代入でいいものはここに書く。
AnyEvent = null;
// ObjectDisposedException を実装したければ、ここでフラグ立てるとかする。
// もし、このクラスが継承クラスなら、
// base.Dispose(disposing);
}
}
2012/05/02
OS X 10.7+XCode 4.3+wxWidgets2.8+cmake で XM6i をmakeしようとして挫折するまで
2012/04/24
2012/04/17
MRU と LRU
キャッシュにおいては、
LRU は、「最後に使われてからの時間が最長 = 使われなかったもの」を「捨てる」
MRU は、「最後に使われてからの時間が最短 = 使われたもの」を「捨てる」
メニューとかに表示してるリストだと、
LRU は、「最後に使われてからの時間が最長 = 使われなかったもの」を「表示する」
MRU は、「最後に使われてからの時間が最短 = 使われたもの」を「表示する」
ええと、「メニューにMRU表示するアイテムをLRUキャッシュする」は、正しいんかのう。
2012/03/30
NetBSD 5.99 fd デバッグ on XM6i for Mac ログ
00000CE0 IOSC 要求していない割り込み <- dd if=/dev/rfd0c of=/dev/null bs=512 count=1
00000CE0 IOSC 要求していない割り込み
00000CE0 IOSC 要求していない割り込み
00000CE0 IOSC 要求していない割り込み
00000CE0 IOSC 要求していない割り込み
00000CE0 IOSC 要求していない割り込み
00000CE0 IOSC 要求していない割り込み
0003BEF0 FDD イジェクト禁止 ドライブ0
00000CE0 IOSC 要求していない割り込み
00000CE0 IOSC 要求していない割り込み
00000CE0 IOSC 要求していない割り込み
00000CE0 IOSC 要求していない割り込み
0003AC48 FDD モータON ドライブ0セレクト
0003ABEE FDC INVALIDコマンド
0003ABEE FDC SPECIFYコマンド
0003ABEE FDC SEEKコマンド
0003ABEE FDC シーク成功 ドライブ0 シリンダ00
0003ABEE IOSC 割り込み要求 ベクタ$60
00000CE0 IOSC 割り込みACK ベクタ$60
0008C826 IOSC 割り込み要求 ベクタ$60
00000758 IOSC 割り込みACK ベクタ$60
0003BF0C IOSC 割り込み要求 ベクタ$60
0003ABEE FDC SENSE INTERRUPT STATUSコマンド
0003ABEE IOSC 割り込みキャンセル ベクタ$60
0003B13A FDC DMA転送完了 0 bytes
0008D082 DMAC CCR STR ON
0008D082 DMAC チャネル0 スタート
0008D082 DMAC Ch=0 DAR=00e94001 <- e94001=FDCステータスレジスタ
0003ABEE FDC READ DATAコマンド
0003ABEE FDC (C:00 H:00 R:01 N:02)
0003ABEE FDD リードセクタ C:00 H:00 R:01 N:02
0003B15A DMAC TransDMA dma[0].type=0 <- なので DMA しまくってもステータスレジスタが読めるだけ
0003B15A DMAC TransDMA dma[0].type=0
0003B15A DMAC TransDMA dma[0].type=0
0003B15A DMAC TransDMA dma[0].type=0
0003B15A DMAC TransDMA dma[0].type=0
0003B15A DMAC TransDMA dma[0].type=0
0003B15A DMAC TransDMA dma[0].type=0
0003B15A DMAC TransDMA dma[0].type=0
0003B15A DMAC TransDMA dma[0].type=0
0003B15A DMAC TransDMA dma[0].type=0
0003B15A DMAC TransDMA dma[0].type=0
0003B15A DMAC TransDMA dma[0].type=0
0003B15A DMAC TransDMA dma[0].type=0
0003B15A DMAC TransDMA dma[0].type=0
0003B15A DMAC TransDMA dma[0].type=0
0003B15A DMAC TransDMA dma[0].type=0
0003B15A DMAC TransDMA dma[0].type=0
0003B15A DMAC TransDMA dma[0].type=0
0003B15A DMAC TransDMA dma[0].type=0
0003B15A DMAC TransDMA dma[0].type=0
0003B15A DMAC TransDMA dma[0].type=0
0003B15A DMAC TransDMA dma[0].type=0
0003B15A DMAC TransDMA dma[0].type=0
0003B15A DMAC TransDMA dma[0].type=0
0003B15A DMAC TransDMA dma[0].type=0
0003B15A DMAC TransDMA dma[0].type=0
0003B15A DMAC TransDMA dma[0].type=0
0003B15A DMAC TransDMA dma[0].type=0
0003B15A DMAC TransDMA dma[0].type=0
0003B15A DMAC TransDMA dma[0].type=0
0003B15A DMAC TransDMA dma[0].type=0
0003B15A DMAC TransDMA dma[0].type=0
0003B15A DMAC TransDMA dma[0].type=0
0003B15A DMAC TransDMA dma[0].type=0
0003B15A DMAC TransDMA dma[0].type=0
0003B15A DMAC TransDMA dma[0].type=0
0003B15A DMAC TransDMA dma[0].type=0
0003B15A DMAC TransDMA dma[0].type=0
0003B15A DMAC TransDMA dma[0].type=0
0003B15A DMAC TransDMA dma[0].type=0
0003B15A DMAC TransDMA dma[0].type=0
0003B15A DMAC TransDMA dma[0].type=0
0003B15A DMAC TransDMA dma[0].type=0
0003B15A DMAC TransDMA dma[0].type=0
0003B15A DMAC TransDMA dma[0].type=0
0003B15A DMAC TransDMA dma[0].type=0
0003B15A DMAC TransDMA dma[0].type=0
0003B15A DMAC TransDMA dma[0].type=0
0003B15A DMAC TransDMA dma[0].type=0
0003B15A DMAC TransDMA dma[0].type=0
0003B15A DMAC TransDMA dma[0].type=0
0003B15A DMAC TransDMA dma[0].type=0
0003B15A DMAC TransDMA dma[0].type=0
0003B15A DMAC TransDMA dma[0].type=0
0003B15A DMAC TransDMA dma[0].type=0
0003B15A DMAC TransDMA dma[0].type=0
0003B15A DMAC TransDMA dma[0].type=0
0003B15A DMAC TransDMA dma[0].type=0
0003B15A DMAC TransDMA dma[0].type=0
0003B15A DMAC TransDMA dma[0].type=0
0003B15A DMAC TransDMA dma[0].type=0
0003B15A DMAC TransDMA dma[0].type=0
0003B15A DMAC TransDMA dma[0].type=0
0003B15A DMAC TransDMA dma[0].type=0
0003B15A FDC DMA転送完了 64 bytes <- fdc.cpp が1回のイベントで64バイトまで転送する
0003B146 FDC Read. len=511 <- だれかがやっとデータレジスタ読んだ、が、すでにえらいこっちゃ
00000D0C DMAC TransDMA dma[0].type=0
00000D0C DMAC TransDMA dma[0].type=0
0
2012/02/15
VisualStudio2010 ビルド イベントの不思議な挙動
static Main()
{
Console.WriteLine("Error : hoge");
}
な C# プログラムを書く。これをビルドして hoge.exe とする。
他のプロジェクト(ProjAとする)のビルド後イベントに hoge.exe を実行するように記述する。
で、ProjA をビルドすると、ビルドエラーになる。
どうも、標準出力に
^Error(|¥s+.*):.*
を書き出すと、エラーとして処理を停止してくれる、らしい。
ただ、この挙動、ドキュメントされてないみたい。プロセスの終了コードのことはドキュメント
されているのを見たけど、標準出力のことは書いてないようだ。
2012/01/19
Thinkpad T410i キーボード交換
どこが壊れたかって言うと、キーボードフィルムと接続フレキの間の接触不良。だれだこんな設計した奴。
でごそごそやっても改善しないので、キーボードを交換することにした。
55Y9024の中身がどうも同じものらしい
外した電源ボタン。
2012/01/06
ロックアウトゲート
ロックアウトゲート(いま勝手に考えた言葉)とは:
# ロックアウトされていないときは入りたいスレッド(従業員)が好きなだけ出入りできる。
# あるスレッド(経営者)がロックアウトしようとしたとき、
* いま入っている従業員スレッドが全員出るまで待つ。
* 新たに入ろうとする従業員スレッドは無期限に待たされる。
* 全員出たらロックアウト状態として制御を返す。
# 経営者スレッドがロックアウトを解除するまではだれも入れない。経営者も入れない(笑)。
ReaderWriterLockSlim を使って実装できそうな気がするんだがなんかうまくいかん。
最終目的はロックアウトゲートじゃないから、他の実現方法を考えたほうがいいということか。
2011/12/19
Bazaar 導入メモ
1.6ぐらいの頃に一度WindowsXPに入れてみて、遅くて使えねー、という
評価をしたが、今回格段に速くなっとる。
さて評価。これまで Subversion を使ってきたので、主にそこと違う点。
よくわかってないので間違ってるかもね。
- NULL commit 可能。
- これだけでも移行する価値がある。
- リポジトリの見た目はディレクトリ。
- svn はデータベース(的:FSFS)なリポジトリだが bzr は普通のディレクトリに見える。
svn でリポジトリを分けてプロジェクトを複数管理している場合には、あるファイルがどのプロジェクトにあるかを探すために、svn ls svn://host/{$repo} をまわして調べ上げないといけないが、bzr では find で探せる。
Windowsホストの場合、コマンドラインを使わなければ、svn はリポジトリブラウザでURL切り替えて検索、に対して bzr はエクスプローラで検索一発なので、bzr 優位。
→どうもそういうことじゃなくてリポジトリとツリーを同一の場所に置ける、ということみたい。
- ローカルリポジトリ上で直接作業可能。
- ローカルリポジトリを作業コピーとみなして、その場でコミットとか可能。
- チェックアウトすれば svn ぽい。
- ブランチ/マージは格段に賢い。
- TortoiseBzr のブランチマージ履歴が楽しい。
- ブランチ/マージは格段に賢い。
あと調べないといけないこと:
- タグ。
- svn ではタグの使い所が難しい、ていうかタグの意味わかってないだろう、という機構なので、ほとんど使ってなかった。bzr ではどうなのか。
- リポジトリのマージ。
- リポジトリの分割。
- アクセス権限関係。
- リポジトリの分割。
- これは svn が出来過ぎているっぽいので妥協点を見つけること。
- ネットワーク越しの動作。
2011/11/24
Task と OperationCanceledException
Task の開始後に CancellationToken を Cancel 状態にした場合は、自分で ThrowIfCancellationRequested() を呼び出さない限り、OperationCanceledException は発生しない。
しかし、Task の開始前に Cancel 状態にした場合は、Task.Wait() で OperationCanceledException が発生する。
Task 開始前に Cancel 状態にならないようにする
または
Wait() を try-catch して、開始前のキャンセルを処理する
のどちらか。
2011/11/15
C# AllocHGlobal と AllocCoTaskMem
http://msdn.microsoft.com/ja-jp/library/s69bkh17(v=vs.80).aspx
GlobalAlloc を使用して、プロセスのアンマネージ メモリからメモリを割り当てます。
Marshal クラスにはメモリ割り当て API メソッドが 2 つ用意されていますが、AllocHGlobal はその 1 つです。(なお、もう 1 つはMarshal.AllocCoTaskMem です。このメソッドは Kernel32.dll の LocalAlloc Win32 API を公開します。LocalAlloc の詳細については、MSDN ライブラリを参照してください。
どっちやねん、と思ったら、
http://msdn.microsoft.com/ja-jp/library/s69bkh17(v=VS.100).aspx
指定したバイト数を使用して、プロセスのアンマネージ メモリからメモリを割り当てます。
修正されてた。
2011/11/12
Windows7 で Win-U-U が使えなくなったとお嘆きの方へ。
パスの通ったディレクトリにこれだけは置いとく。
Win-U-U-Enter で電源が切れる。
uu.cmd
shutdown -s -t 0
uh.cmd
shutdown -h -t 0
ur.cmd
shutdown -r -t 0us.cmd
Rundll32.exe Powrprof.dll,SetSuspendState Sleep
ur.cmd とかプログラムメニュー内の URL ファイルに阻害されて、一番上に候補として
上がらないことがある。どうにかならんかな。
2011/11/04
諸君、私はNetBSDが好きだ
一部事実に基づく創作であり、実際の NetBSD オペレーティングシステムとはほんの少ししか関係ありません。
諸君、私はNetBSDが好きだ
諸君、私はNetBSDが好きだ
諸君、私はNetBSDが大好きだ
カーネルが好きだ
ユーザランドが好きだ
ブートローダが好きだ
MI-MD構造が好きだ
クロスビルド環境が好きだ
x68kで
zaurusで
luna68kで
amigaで
alpha,acorn26,acorn32,cats,evbarm,hpcarm,lyonix,netwinder,shark,hp700,i386,xen,sun2,atari,cesfic,hp300,mac68k,mvme68k,news68k,next68k,sun3,emips,evbmips,ews4800mips,mipsco,newsmips,sbmips,sgimips,algor,arc,cobalt,hpcmips,pmax,amigappc,bebox,evbppc,ibmnws,macppc,mvmeppc,ofppc,prep,rs6000,sandpoint,evbsh3,mmeye,dreamcast,landisk,hpcsh,sparc,sparc64,vax,amd64で
この地上に存在するありとあらゆるNetBSDが大好きだ
移植性の高い設計が好きだ
他のOSのコードにNetBSD由来のRCSIDを見つけた時など心がおどる
全くドキュメントに記載されていない#define 定数が好きだ
三週間かかって1にするだけで動作することが分かった時など胸がすくような気持ちだった
i386のブートローダが1文字出力するたびにリアルモードとプロテクトモードを行き来することが好きだ
nop 6個だったところを256個にしたらカーネルが起動した時など感動すらおぼえる
m68k FPEなどもうたまらない
誰一人呼び出したことのなかったコードを正しく実装するのは最高だ
GPLで書かれたのを
BSDライセンスでコードを見ないで再実装した時など絶頂すら覚える
動作するコードが好きだ
謎コミットで動作しないアーキテクチャが増えることはとてもとても悲しいものだ
二条項BSDライセンスが好きだ
山のようなCopyright表示が巻末についていないのは屈辱の極みだ
諸君 私はNetBSDを カーネルが動けば完結する様なNetBSDを望んでいる
諸君 私に付き従うNetBSD好きの諸君 君たちは一体何を望んでいる?
更なるNetBSDを望むか
糞の様なNetBSDを望むか?
骨董品のようなマシンでもIPv6 Readyだぜヒャッハー!のようなNetBSDを望むか?
NetBSD!! NetBSD!! NetBSD!!
よろしい ならばNetBSDだ
だが、まともなデスクトップが無いので減り続けるdeveloperに耐え続けて来た我々には
ただのNetBSDではもはや足りない!!
大NetBSDを!! 一心不乱の大NetBSDを!!
我々はわずかに小数
NetBSDが移植されていないアーキテクチャに比べれば物の数ではない
だが諸君は一騎当千のカーネルオタクだと私は信じている
ならば我らは諸君と私で総兵力100万と1人の移植大好き集団となる
我らを忘却の彼方へと追いやり、仕様を公開しないメーカーを叩きのめそう
髪の毛をつかんで引きずり下ろし 眼(まなこ)をあけて思い出させよう
連中に真のリバースエンジニアリングを思い出させてやる
連中に割り込みアクノリッジサイクルを思い出させてやる
NetBSDには奴らの哲学では思いもよらない締め切りドリブン開発がある事を思い出させてやる
1000人のカーネルオタクの集団で 世界を``Of course it runs NetBSD''で埋め尽くしてやる
目標 iPhone
どこでもNetBSD作戦 状況を開始せよ
征くぞ 諸君
2011/09/01
C# ポインタを一行でポストインクリメントすると遅くなる
2011/02/06 追記: 実行環境下では JIT 最適化で、関係なくなるようだ。
C# では、*p++ は使わないほうがいい。
*p; p++; に分解すること。
Visual Studio 2010 version 10.0.30319.1
.Net Framework 4.0.30319
の話。/unsafe な release ビルド(最適化ON)。
volatile int r;
int[] a;
...
unsafe {
fixed (int* a0 = a) {
int* p = a0;
...
r = *p++;
...
の逆アセンブルウィンドウでの結果。
r = *p++;
0000008f mov eax,dword ptr [ebp-8]
00000092 mov dword ptr [ebp-10h],eax
00000095 add dword ptr [ebp-8],4
00000099 mov eax,dword ptr [ebp-10h]
0000009c mov eax,dword ptr [eax]
0000009e mov dword ptr ds:[007716C0h],eax
[ebp-10h]は一時変数。かなり間抜けだ。
r = *p++;
を
r = *p;
p++;
に分けると、こうなる。
r = *p;
0000008f mov eax,dword ptr [ebp-8]
00000092 mov eax,dword ptr [eax]
00000094 mov dword ptr ds:[005B16C0h],eax
p++;
00000099 add dword ptr [ebp-8],4
2011/08/26
C# IDeque
LinkedList<T> があるから実装は簡単だけど、実装がどうこうからインタフェースを切り離したい。
で、こういういかにも後からライブラリデフォルトができそうなインタフェースを手前味噌で決めると命名が大変。
Microsoft.VisualC.StlClr.IDeque<T> はちょっと違うしなぁ。