2004年09月01日

flex / bisonの導入

flex/bisonはじめて8時間以内FAQを見て導入。
bisonとflexはSourceForge GnuWIn32 File Listからとってくる。
以前、インストールした時はいろいろと足りなくて、いろいろ入れた気が・・・。
で、普通にbison.simpleとかないっすね。
バージョンが
bison 1.875
flex 2.5.4a
となっていたので、参考にしたページよりかなりbisonのバージョンが上がってますね。
とりあえず、解凍して出来た物をそれぞれC:\bisonとC:\flexに入れて、それぞれのbinへパスを通す。
で、動きやがれ!
動いた。一部コンパイルでエラーが出ているが、昔のバージョンから何かが変わって、指定方法が違うようになってしまったからだろう。
特に問題はないことにしよう。
bisonよりflexが使いたくて入れたわけだし。
なので、うまくいかなかったら、また調べることにする。

投稿者 Takenori : 03:55 | トラックバック

2004年12月03日

ロジクールのキーボード

少し前からキーボードのテンキーの0が時々凹んだままになって、000・・・って打たれてしまうようになった。
これはそろそろ替え時かなとロジクールのキーボード iK-27を購入。
今日届いたので、つなぎ替えた。
で、後ろの足を立てて、置くと・・・ 水平なんですけど。
確かにスーパーフラットキーボードって書いてあったけど・・・
これは・・・
でも、せっかく買ったので少し使ってみるとことにした。
そしたら意外や意外、打ちやすいかも。
いや、キータッチが好きなかたさと感触なのかな?
メカニカルでやたらカタカタ鳴るのがいいと思っていたけど、ややソフトなタッチ感のほうが良いのかも。
まあ、そんなにこだわりがあるわけではないが。

投稿者 Takenori : 10:28 | トラックバック

2005年01月18日

クリエティブ・コモンズ

http://internet.impress.co.jp/im/pdf/cc.pdf
http://hotwired.goo.ne.jp/matrix/0311/

すばらしい。
著作権などのライセンスにかかわることを自動化しようという試み。
これから積極的に取り入れていきたいと思う。

投稿者 Takenori : 03:45 | トラックバック

2005年02月16日

Nortonアンインストーラ

Norton Internet Security 2005 が、他のアプリをアンインストールしたらうまく動かなくなったので、再インストールするために、アンインストールしようとしたがエラーの嵐。
仕方なく [無視] をひたすら押してアンインストールを進めると「アンインストールは無事終了しました」というようなメッセージが出て終了。全然無事じゃない気がするけど・・・
で、インストールしようとするが、案の定途中で「instopts.dat が見つかりません」とかエラーが出る。
Symantec だからね。Nortonではいつものことだ。
そこで、レジストリからSymantec が付く物をすべて削除。
すごく数が多かった。
また、フォルダやファイルも削除。
それでも同じように「instopts.dat が見つかりません」が出る。
今度はNorton が付く物をすべて削除。
これも結構な数あった。
が、やはり「instopts.dat が見つかりません」が出る。
再びフォルダやファイルを削除して、再度実行するが結果は同じ。
何だこれは? いつもより強力だ。
で、いろいろと探すと、SymUninst.exe という物があった。
何らかの原因でアンインストールがうまくいかなかった時、インストール情報を一掃してくれるツールのようだ。
なんだかなぁと思いつつ実行。
結構時間がかかって、再起動。
起動中にシステム更新のプログレスバーが出た。なんだ?
そして、インストールを実行。
が、コンポーネントの更新かインストールか何かのところで失敗する。
なんだ?
IEのバージョンか? と思って、バージョンを確認するが、バージョン番号が表示されない。(一度インストールしているので、IEのバージョンなわけはないのだが)
???
IE6のセットアッププログラムをDLして、インストール。
そして、再びNorton Internet Security 2005 のインストールを実行。
無事にインストールできた。
なんかすさまじく時間を費やした気がする。

投稿者 Takenori : 15:54 | コメント (2) | トラックバック

2005年04月10日

Ajaxに少し興味を

Ajax解説ページ
ようはJavaScriptで通信をして動的にブラウザの画面を書き換える手法のことみたい。
Ajaxに当たるかどうか分からないけど、GoogleSuggestは楽しい。
携帯の予測変換みたいに言葉を提示してくれる。
日本語でもきちんと処理されるところがすごい。
インクリメンタル検索で、確定するまで検索が行われないものが多いので、変換中に文字を取得して何かするって言うのは出来ないのかと思っていたけど、そうでもないのか。でも、よく考えたら、Excelとか他のセルと同じ言葉っぽいのは途中でも候補が出るか。インクリメンタル検索は使い勝手の問題かな。

で、Ajaxを使えば、ブラウザをUIとするアプリの使い勝手が向上しそうだ。
Javaを使えばいろいろと出来るが、VMの起動が遅くていらいらするので、あまり使いたくないというか、あんまり使ったことない。
JavaScriptならブラウザが立ち上がっていれば、即座に動くので快適。動作速度も気になるほど遅いようには感じない。
これはなかなか良いなぁと思ったけど、Flashでもいいんじゃないか? とふと思った。なぜだか知らないけど、Flashはすぐに動き出す。それにXMLも扱える。
FlashをUIとするアプリを作っても面白いかもしれない。
Mingを何に使うのか考えていたけど、フォームデザイナみたいなのを作ると面白いかも。
C++Builderのようにイベントを割り当てたりして、アプリを作るような。
でも、そういうのってC#とかに近いかも。
まあ、なんにしてもいろいろと出来そうだな。

その他 Ajaxメモ
Ajax で画面遷移なしの Amazon 検索
Ajax: A New Approach to Web Applications
BMediaNode::JavaScript Templates
JavaScript Templates

投稿者 Takenori : 15:49 | トラックバック

2006年01月29日

blogger API クライアント

mixi Alertに日記投稿機能を追加したら、思っていたよりも使い勝手が良いので、blogger API クライアントを試してみることにした。
Windows 環境で使える blogger API クライアントの一覧にある程度まとまっている様子。
シェアウェアだけど、よさげなBlogWriteをとりあえず試用してみることにした。
ブログの投稿が活発化するかも。
試用期間は2週間なので、あんまり使わなかったら良さはわからないし。

投稿者 Takenori : 20:35 | トラックバック

2006年02月06日

サーバーのハードディスクが壊れた

昨日まで何ともなかったのに今日いきなりアクセス出来なくなった。
ログインしようとしたらフリーズしてしまったので、再起動するとHDDが認識されなかった。
いろいろとやってみるがHDDが壊れた可能性が高い。
バージョン管理しているソースコードがー
まあ、最新のはあるので特に問題はないけど、気分的に悲しい。
それで、とりあえずいつも使っているWinマシンにSubversionを入れようとしたらApacheのバージョンが古いと言われたので、Apacheのバージョンを上げてからSubversionをインストール。
リポジトリを作って最新のソースを入れた。
なんか、ローカルで使うだけならWinの方が使い勝手がよくていいかも。
今後はローカル用は普段のWinマシンで、公開するのはLinuxのサーバーにしようかな。
でも、またインストールして設定するのかと思うと気が重い。
今後のためにAcronis True Image 8.0のようなバックアップソフトを購入しようか迷う。

投稿者 Takenori : 23:01 | トラックバック

2006年11月24日

関数呼び出しグラフ

Doxygenでは生成できなくて、ずっと欲しいと思っていたら、いつの間にか追加されていたみたい。
ChangeLogを見るとDoxygen Release 1.4.7 (release date 11-06-2006) で追加されたみたい。
どうも誰かが追加したみたいですね。
6月ってことは今入れてるやつでは出来ないので、入れ替えないと。

投稿者 Takenori : 12:34 | トラックバック

2007年03月03日

入力インターフェイスとしてのカメラ

カメラを入力インターフェイスとして見た場合、大体カメラを固定してそこに映ったものをどうにかするというアプローチが多い。
ピンポン球とウェブカメラで作る6自由度インタフェース 3Dインタフェースも、カメラを固定して、そこに映ったピン球の位置で座標を得るような仕組みだ。
でも、Wiiライクな操作でスクロールできるNetFrontの新ブラウザを見て衝撃を受けた。
カメラを動かして、映った映像の動きを検出して、それを入力とするとは。
携帯電話の場合は、ほとんどの機種にカメラが付いているので、それを入力機器として利用するのもすごい。(ただ、携帯電話の場合は画面も動いてしまうので少々見づらい気がするが・・・)

この発想でいけば、HMDにカメラ付けて、そのカメラを入力デバイスとすれば、実際に見た方向を映すことができる。
動き検出は様々な場面で使われているので、上下左右移動は問題ないと思うが、拡大縮小の検出はどうなのだろうか?
それが出来れば、前後移動も検出でき、3軸の入力デバイスとして扱える。
手につけて3D空間上の任意の位置をポイントすることも可能になるはず。
空中で操作するマウスのようなデバイスが出来そうだ。
3Dデスクトップに3Dマウス。
使い勝手はわからないが、なんだか楽しそうだ。

ゲームでもカメラを動かすとゲーム中のカメラが動くようにすると操作性が上がるだろう。

投稿者 Takenori : 19:20 | トラックバック

2007年03月14日

TRACのマイルストーン

TRACのマイルストーンは今まで使ってなかったけど、きちんと入れてみると少しうれしい。
マイルストーンを入れると、全チケット数と解決済みチケット数で進捗度があらわされるようになるので、後やらなければならないことがどれくらいかわかりやすい。
進捗管理などをしているリーダーにとっては、常時チケット数をメトリクスとして進捗を把握できる。
進捗が目に見えるので、モチベーションの向上につながる。
でも、実質的な効果はないかもしれない。
ただ、開発はモチベーションがすべてなので、少しでもモチベーションが向上すればやる価値はあるだろう。

投稿者 Takenori : 21:29 | トラックバック

2007年10月10日

「IPAフォント」が一般配布されたということで

※ 2007/10/10 回答追記

IPAが日本語フォント「IPAフォント」を一般に配布
一般利用者向けIPAフォントのダウンロード

使用許諾条件で、レンダリング済みフォントの扱いについてわかりづらいので問い合わせてみた。

内容は以下の通り

----

お問い合わせ項目:お問い合わせ
お問い合わせ内容:
IPAフォント使用許諾契約についての質問です。

IPAフォントをレンダリングし、bitmap形式のファイルなどに保存、テキストを表示する時に、そのbitmap形式のファイルから文字ごとに切り出して、テキストを表示するような用途で利用する場合についてどのような扱いになるのか疑問に思いましたので、ご教授願います。

1. レンダリング済みのbitmap形式のファイル自体を単体で配布する。
2. レンダリング済みのbitmap形式のファイルをゲーム等のコンテンツ内に含めて配布する。
3. レンダリング済みのbitmap形式のファイルとIPAフォントそのままのファイルをゲーム等のコンテンツ内に含めて、bitmap形式のファイルを使用してテキストを描画するコンテンツを配布する。
4. ゲーム等へIPAフォントをそのままの形で同梱し、実行時にbitmapへレンダリングしたものを表示する。

上記の1~4のケースについて可能か不可かをご教授願いたく。

以上、よろしくお願いいたします。

----

使用許諾契約書を読むと、4はまず大丈夫だと思うが、他は微妙なので質問。
2がOKとなると、かなりありがたいのだが。

以下、回答内容。

----

ご回答
お問い合わせの項目のうち、
1. は内容に変更を加えた物の再配布に当たりますので、配布できません。
2.について、フォントの一部があらかじめ文書等に埋め込まれた状態のものであ
れば、配布可能です。文書がダイナミックに生成される場合については、フォン
トがあらかじめ文書に埋め込まれたものの配布であるとは認定し難いと考えます。
3.改変されたものが含まれますので、これを再配布することはできません。
4.は可能です。

----

ある程度予想通りだが、一番辛い結果。。。
レンダリング済みフォントとして組み込むことは出来ないか。
やはり実行時レンダリングか。

投稿者 Takenori : 15:28 | トラックバック

2007年11月11日

インデント

ここ最近ソースコードをよく読んでいた。
その際、気になるのがインデント。
まあ、自分のスタイルと違っていてもと言うか、多くの場合は違っているけど、そのまま読む。
読むだけなら、たいした影響はない。
でも、それらのソースコードを自分のソースコードに取り込もうとした時、インデントが違っていると気にくわない。
でまあ、自分のソースコードに合うようにインターフェイスなどを合わしつつ、インデントも合わせていた。
そうすると、インデントを合わすのが面倒くさい。
と言うことで、インデントしてくれるツールを使うことにした。
初めに思いつくのは indent だけど、とりあえず検索してみた。

C/C++ソース整形ツール と言うページ発見。
この中で対応言語の多い Uncrustify を試すことにした。
で、まずはオプションを見て、設定ファイルを書く。
長い...
以前、indent を使おうとして、設定ファイルの途中で面倒になってやめことを思い出す。
でも、今回は一応書いた。
こんな感じ Uncrustify_opt.zip
完全に期待通りではないが、いつもの書き方と大体同じになったのでよしとした。
今後使いながら、直せそうなら設定ファイル直すかな。
ちなみに、上のはShift-JISにしていない。
でも、意外と細かい部分で自分のルールがあるものだと気付いた。
たとえば、普段は、小括弧の中に変数などがあるとスペースを入れるが、while(1)の時は入れないとか ( でも、これは上の設定ファイルでは反映できていない ) 。
設定ファイルが長くなってしまうわけだ。

投稿者 Takenori : 21:04 | トラックバック

2008年01月28日

処理負荷のバーとか出して遊んでみる

D3D で処理負荷のバーを出して遊んでみる。
こんな感じ。
bar_image_20080128.png

GeForce 8600 GTだとこの程度では振り切れてる。
770FPS超え。
以下はオンボードの GeForce 6100 で実行したところ。
青いのが60FPSなので、200FPSぐらいかな。
結構適当に作っているので、がんばればもっと行くと思う。
追記 : オンボードだとメモリアクセスに食われていそう。
だから、単純な Clear で時間食っているかも。

bar_image_20080128_2.png

一応、ソースコード
D3D の処理とか、結構適当。

投稿者 Takenori : 01:47 | トラックバック

2008年03月20日

TortoiseSVN のインストール方法

TortoiseSVN のダウンロードページにアクセスして本体と日本語パックをダウンロードする。
本体は、ページの上の方にある ( 下の画像のようなリンク ) 。
32 Bit TortoiseSVN-1.4.8.12137-win32-svn-1.4.6.msi Installer と書かれたもの ( OSが64bitなら64bitの方 ) 。
20080320_TortoiseSVN_DLPage_01.png

日本語パックは少し下にあるので、スクロールすると以下のようなリンクがある。
20080320_TortoiseSVN_DLPage_02.png
この中の 18 Japanese Setup …… と書かれた Setup をクリックして、ダウンロードする。
これも 32 Bit の方。

両方ダウンロードしたら、最初に本体をインストールする。
ダウンロードした「TortoiseSVN-1.4.8.12137-win32-svn-1.4.6.msi」をダブルクリックして起動する。
20080320_TortoiseSVN_Inst01.png
Next を押す。
20080320_TortoiseSVN_Inst02.png
ライセンスを確認して問題なければ、「I accept the terms in the License Agreement」にチェックして Next を押す。
20080320_TortoiseSVN_Inst03.png
インストール先を選択する。「C:\Program Files\TortoiseSVN\」で問題なければそのまま。
Next を押す。
20080320_TortoiseSVN_Inst04.png
この次に進んで他のアプリが起動していると、インストール時にアプリによっては終了してくれと出るので、あらかじめ起動しているほかのアプリは終了しておく。
Install を押す。
20080320_TortoiseSVN_Inst05.png
インストールが始まる。
もし、インストールを阻害するアプリが起動していたら警告が出るので、そのアプリを終了してから Retry を押す。
20080320_TortoiseSVN_Inst06.png
インストール終了。
Show Chengelog のチェックはどちらでもいいが、ほとんどの人は見ないだろうから外しておいてかまわない。
Finish を押す。
20080320_TortoiseSVN_Inst07.png
再起動確認が出る。
再起動してからでないと、日本語パックが入れられないので、ここで Yes を押して再起動。


再起動したら日本語パックをインストールする。
LanguagePack-1.4.8.12137-win32-ja.exe をダブルクリックして、インストーラを起動する。
20080320_TortoiseSVN_JP_Inst01.png
「インストール」を押す。
20080320_TortoiseSVN_JP_Inst02.png
「完了」を押す。
これで日本語が入ったので、次に日本語が表示されるように設定する。

適当なフォルダで右クリックする。
20080320_TortoiseSVN_Setting_01.png
TorsoiseSVN を選んで、その下の Settings を選ぶ。
20080320_TortoiseSVN_Setting_02.png
設定画面が出るので、Language:のEnglishを選んで、日本語にしてから「OK」を押す。
これで表示が日本語になる。
以上でインストールは終了。

投稿者 Takenori : 15:47 | トラックバック

TortoiseSVN でのチェックアウトと更新

開発メンバーの中にはバージョン管理どうこうではなく、単純にリポジトリからデータを落としてきて、そのデータを使うと言うか、動かしてみてみるだけの人も多いと思う。
その人用にチェックアウトと更新のみ解説する。
まずは、データをダウンロードするフォルダを作る。
ここは以後更新するたびにずっと使う。
作成したフォルダで右クリックする。

20080320_TortoiseSVN_CheckOut_01.png

「SVNチェックアウト」を選択する。

20080320_TortoiseSVN_CheckOut_02.png

リポジトリのURLに指定されたパスを入力する。
チェックアウトディレクトリは、右クリックしたフォルダの名前になっているはず。
「トップフォルダのみチェックアウトする」にチェックが入っているときは外す ( すべて落とす時 ) 。
「OK」を押す。
これでチェックアウトが行われる。
パスワードなどが必要な場合は、聞かれると思うので、ユーザー名とパスワードを入力する。
しばらく待てばチェックアウトが終了する。
以上、データがダウンロードできたことになる。

次に更新。
開発作業中では、全てのデータが更新されることはまれで、だいたい一部のファイルのみ更新される。
バージョン管理を使って開発しているプログラマーなどは、その更新したファイルをリポジトリに反映するので、データを利用するメンバーはその更新したデータを取得する必要がある。
TortoiseSVN を使っていればこの作業は簡単。
上のチェックアウト用に作ったフォルダで右クリックする。

20080320_TortoiseSVN_Update_01.png

前回と少しメニュー項目が変わっていると思う。
ここで「SVN更新」をクリックする。
クリックすれば更新が行われるので、しばらく待つ。
完了すると変更のあったファイルのみ更新されているので、後は動かして動作を確認すればよい。

投稿者 Takenori : 15:52 | トラックバック

2008年05月22日

ディジタル神話

「音楽 CD は、バイナリがまったく同一でプレイヤーも同じなら音質は変わらない。」は間違いだ。
これは事実として認識しても間違いないようだ。

事の発端はガラスで出来た CD の音が良いと言う話題から。
そんなことはありえないと言う意見が多かったが、私は「ディジタルを構成しているものは全てアナログなのだから、何か影響があってもおかしくない」と言う意見だった。
つまり、音は変わることはあり得るという考えだ。

まず、疑ったのは音楽 CD は、読み込みエラーが多いと言う考え。
CD は、読み取りエラーが発生すると、エラー訂正によってほぼ元のデータに復元される。もし、それでも復元されなければ、補間によって、元のデータに近いと考えられるデータになる。
つまり、補間がかかればデータが変わるのだ。
だが、CD の読み取り面が綺麗で、CD プレイヤー自体も経年劣化などしてないければ、読み取りエラー自体発生しないようだ。
また、通常使用時においても、エラー訂正で訂正できないレベル以上、つまり補間がかかることはまずないということが複数の検証サイトによって検証されている。
補間がかかるというか、読み取りに失敗するのは、CD プレーヤー自体に衝撃が加わった時。
これの対策としてポータブル CD プレイヤーには音飛び防止バッファが数十秒積まれている。
ただ、カーオーディオにおいては、この音飛び防止バッファが削られていっているらしい。
理由は至極納得できるもので、常に振動が加わる車では音飛び防止バッファがいくらあっても、バッファを使い切ってしまうと言うことのようだ。
そのため、音飛び防止バッファに頼るのではなく、CD プレイヤーに加わる振動を軽減し、読み取りエラー自体が発生しないようにする方向に進んでいるんだとか。
話がそれたが、エラーによって音が変わるということはなさそうだ。
このエラー以外に音が変わる原因についての論拠は尽きたが、どうも釈然としないためさらにいろいろと調べた。

比較的信頼にたるソースとして、プレクスターの技術者が記者のインタビューに答えると言う記事が見付かった。
プレクスターと言えば、高性能 CD-R ライタで有名だったメーカーだ。
第14回:迷信だらけのデジタルオーディオ[特別編] ~ドライブメーカー「プレクスター」に聞く、CD-Rの変化~

CD-R に焼くと、どうも音がこもった感じがするような気がしていたが、その感覚は間違いではなさそうだ。
さらに有名な検証サイトを以下にリンクしておく。
かなり、長いので上の記事で納得できない人や興味のある人は読むといいと思う。

以下、今日の必ず得する一言 より
音楽CDの音質とジッタの関係のナゾ(CDの神髄編)
音楽CDの音質とジッタの関係のナゾその2(原信号特性編)
音楽CDの音質とジッタの関係のナゾその3(ジッタ変動とスタビライザーX編)
音楽CDの音質とジッタの関係のナゾその4(みんなでジッタサウンド編)
音楽CDの音質とジッタの関係のナゾその5(ジッタの電源ライン波及編)
音楽CDの音質とジッタの関係のナゾその6(緑に塗ったりカットしたり編)
音楽CDの音質とジッタの関係のナゾその7(ジッタの影響はDACか?アンプか?)
音楽CDの音質とジッタの関係のナゾその8(ジッタ量とエラー訂正頻度)
音楽CDの音質とジッタの関係のナゾその9(TE信号とエラー信号記録法)
音楽CDの音質とジッタの関係のナゾその10(山本式メカニカルダンパー変造)
CD-Rのジッタとメーカーの言い分のナゾ

A-1 DRIVE
CD(ディジタルオーディオ -S/PDIF) エラーカウンタ/ステータスモニタの製作

ジッタ計測などを行っているページ efu's page

これらの記事を読んでどう判断するかは自由だが、私は音は変わるという意見になった。
まあ、元々そうだったんだが……

投稿者 Takenori : 10:46 | トラックバック

デジタルトキワ荘とSNS

気付いたらデジタルトキワ荘が SNS になっていました。
今月のはじめごろに登録し、活用しています(?)。

mixi とは異なり、クリエーターの方ばかりでいろいろと刺激があります。
似たような悩みを持っている人や考えている人、開発上の話など、読みたいと思う日記が多いです。
それで、よくぐおーーーっもっとかんばってもっと早く開発しなければ!と思います。
負けず嫌いなので、すごい人とか見ると、絶対負けない、がんばると思います。

デジタルトキワ荘では、ブログと同じような日記を書いていますが、マニアックな内容は少し避けています。
読んでもそのことに詳しいプログラマ以外わからないようなこともブログでは気にせずガンガン書いていますが、日記ではもう少し軽めです。
後、ある程度クローズドなので、実験的に作ったものを適当に置いてみたりしてます。
ここだと、ある程度しっかりしないと公開し辛い面がありますが、SNS なら、まっ、いっかと。
日記も途中の段階であれこれ考えていることを書いています。
ここのブログはそうじゃないときもありますが、ある程度まとまってから書くようにしているので、途絶えたりする時がありますが、日記ではこーかな?あーかな?と書いてたりします。

後、○○出来る人募集とか、探したりするのもやりやすそうです。
これ出来る人いない? こういう人探しているんだけどとか、今こういうことやってるけどうまくいかないなど、同じ開発者だからわかることや出来ることが出来そうで期待しています。
似たような人たちだから距離も近く感じます。
また SNS をしている人はわかると思いますが、ブログよりも SNS の日記の方がコメントしやすいです。

ちなみに私のページはここです。
よほど変な人でなければ、マイフレンド申請してもらえば OK します。
ただ、ある程度どんな人かわかるようにプロフィールなど書いておいて欲しいです。
さすがにどんな人かわらないのに OK すること出来ないので。

ま、気が向いたら一度お試しあれ。

投稿者 Takenori : 13:34 | トラックバック

2009年12月11日

まるまるC MAGAZINE Complete

まるまるC MAGAZINE Complete を買った。
C MAGAZINE には、役立つ記事が多かったので、ずっと欲しかったんだけど 55,000円 と高いのが難点。
全部雑誌で購入していたらもっと高いんだけど。

内容は、DVD 1枚で 容量約 7GB 弱、ファイル数 約 8000。
HDD へのコピーは4時間かかった。
namazu のインデックス作成には 2時間かかった。
さすがにファイル数が多いので時間がかかった。

これでずっとおいていた C MAGAZINE を捨てられる。
後、PC で必要な時に読めるのもいい。
インデックスも作ったので全文検索で必要な記事を見つけやすい。
ただ、購入してから2週間経つんだけど、まだ最初に少し読んだだけで、それ以来見ていない。
まあ、何か新しいものを作り始めた時などに参照するだろう。

投稿者 Takenori : 22:00 | トラックバック

2011年03月18日

西日本への移動を真剣に検討してみては?

ただ我慢して他の誰かが以前の日常を取り戻してくれると思っている人達へ。

まず書いておくけど、原子力発電所の放射能云々の話ではない。
電力不足とそれに伴う影響を考えて、思考が硬直しないように論理的な判断を促すために書いている。

運転休止中の火力発電所を次々稼働へ 東電

このニュースを見るといろいろと数値が合わないので福島以外も止まってしまっている可能性もある。
また、4月中には回復するかもしれないが、夏になるとまた計画停電が予定されている。
4月に回復したとしても燃料費が上がるだろうから、電気代への影響は避けられない。

福島の原子力発電所が復旧するのはいつになるかわからない。
そもそも福島で原子力発電所を再開できるのかどうかも疑問が残る。
原子力発電所に対する激しい反対が起こるのは簡単に想像できる。
では、他の場所に原子力発電所を建てることは出来るのだろうか?
それもしばらくは難しいと考えられる。

では、どうやって関東で電気を作るのか?
火力発電等でお茶を濁す?
他の方法の発電所を作るとしても、一朝一夕で出来るようなものではないのは簡単にわかる。
数ヶ月、数年はかかるだろうことも。

東電:ガスタービン発電所を新設 藤本副社長が方針

このニュースを見ると少しは夏場の電力を補えるかもしれないが、計画停電は避けられそうにない。
数値を見ればわかるが、1機の出力が不足分に対して二桁も違う。

この先長期間節電や計画停電、減った電車を我慢しつつ、非効率に仕事をして過ごすのか?
東日本にいるとわかりづらいかもしれないが、西日本は今回の地震で全くと言っていいほど被害が出ていない。
計画停電等はない。
普通に仕事できる環境がそこにある。
余震もほとんど起きておらず、揺れることの方が少ない。

東京-大阪間は新幹線で2時間半。
Skype 等離れていてもある程度打ち合わせできる道具もある。
必要なら少し時間はかかるが直接会いに行くのは無理な距離じゃない。
また、ウィークリーマンションやマンスリーマンションもあるので、家具付きのところなら持って行く物も少ない。
仕事の効率を考えるのなら、さっさと西日本に移動して仕事を開始してしまえばいい。

当然、西日本に移動する人が増えれば関東の消費電力は減り、その内電力の需給バランスが取れるかもしれない。
消費する食料なども減り、被災地に届きやすくなるかもしれない。
あまり移動しなければ変わらない。

東京等の大都市は人口が増えているが、他の都市は減少しているのである程度の人数を受け入れる余力は地方都市にはあるはずだ。
もとは人がいたのだから。
東京一極集中は確かに効率的だが、いざというときは脆弱だ。
今回はその一極集中の脆弱性があらわになっている。
もっと分散されていれば、被害は減り、回復もしやすかっただろう。
より強固な環境を作るためには多少効率が落ちるが分散した方がよい。
早期に経済を立ちなおさらせるためには、現在効率的に仕事できる環境が必要だ。

問題となるのはお金だろう。
早期に西日本に移動して効率的に仕事をするために投資するのが良いか、今のまま非効率な環境で疲弊して仕事するのが良いか。
どちらがいいのかは簡単には判断できないかもしれない。
ただ、日本全体で考えるのなら、効率的に仕事をする人が増える方が良いに決まっている。

スマートフォン:アプリ開発業者を支援 岐阜県

このようにしばらくは無料で利用できるオフィスもあるようだ。

東京から移動したと聞いたら、過剰反応とか、臆病者とか言う書込みを目にするが、冷静に論理的判断ができるのであれば、それが合理的な判断であることはわかるはずだ。
過剰反応や臆病者と考える人は冷静さを失っていないか自問してみた方が良い。

どのように行動するかは個人の自由だ。
とどまる方が良い人もいれば、移動した方が良い人もいるだろう。
そもそも移動が非現実的な人も。
とにかく未来を考え冷静に判断した方が良い。

日本は変わる。
変えざるを得ない。
私たちが大きなターニングポイントに立たされているのは間違いない。

投稿者 Takenori : 21:47 | トラックバック

2011年05月21日

Eee Slate EP121 をしばらく使ってみて

スレートPC は、デスクトップ、ノート、スレートと3つの領域で使えそう。
USB か Bluetooth で、キーボードとマウスをつないで、mini HDMI でディスプレイをつなげば、本体と合わせて 2画面で表示できていつものキーボードマウスが使えるから デスクトップ と同じ感覚で使える。
3画面にしたければ、USB ディスプレイアダプタをつなぐことで可能だが、解像度が高いとUSB ディスプレイアダプタでは厳しいようだ。
IO-DATA の USB-RGB/D2 をつないで、1600x1200 で表示してみたが描画の遅延が気になって、ちょっと使えないなぁと言う感想。

本体の mini HDMI を HDMI の変換アダプタつけて、それを HDMI - DVI ケーブルでディスプレイにつなぎ、1600x1200 で表示すると、特に問題ない速度で描画された。
3D 関係の表示を行わなければ、1600x1200 のディスプレイと本体の1280x800の2画面表示で問題なく使えそうだ。
表示は縦でも横でも使えるので、サブディスプレイとして使う場合は、縦にしてドキュメント表示などにいい。

消費電力は 11W~53.39W(最大は公式から)
実際に使っていると、ほとんど操作せず処理も少ない時は11W~20Wの辺りで、操作して処理している時などは30W程度のよう。
53Wはなかなか届かない。
使っていてるとだいたい、20W~30Wの辺りで動作している。

速度はだいぶ速いんだけど、普段 Corei7 920 を使っていたせいか、少しレスポンスが遅いと感じる場面もある。

指でのマルチタッチとスタイラスでの筆圧感知に対応しているので、液晶タブレットとしても使えるのではないかと思う。
少し描いてみた感じよさそうだったが、プログラマなので絵描きさん的にどうかはわからない。
Bamboo 程度のスペックという話だけど。
普段は、細かい操作するときはスタイラスで、単に押せばいいときは指がやりやすい。
指は触れたら反応するのに対して、スタイラスは少し押さないとクリックにならないので、状況によって使い分けている。
指で触ると指紋がつくのでたまに拭く必要が出てくるが。

アプリケーションの操作としては、グラブスクロールがあるかないかでかなり操作感が変わる。
Firefox にグラブスクロールのアドオン入れたら一気に快適になった。
グラブスクロールは、マウスでも操作しやすくなるので、対応していった方がいいかもしれない。

Windows 7 の機能で、長押しで右クリック、ジェスチャーに対応しているので、それである程度ほかのアプリも操作性が上がる。
ソフトウェアキーボードは、スタイラスを使えば普通に入力できるんだけど、ソフトウェアキーボードが表示されたらウィンドウサイズが縮んでソフトウェアキーボード表示、入力後ソフトウェアキーボード非表示となるんだけど、ウィンドウサイズが元に戻らないのが困る。
ウィンドウサイズの問題があるので、BTキーボードで入力した方がいいけど、キーボードなくてもソフトウェアキーボードでそこそこ入力できるのは、ありがたいことはありがたい。

タッチ操作を意識してかデフォルトでフォントサイズが大きくなっているので、これは小さいに変更しておいた方がいいと思う。
指ではなく、普段はスタイラスかマウスで操作するのなら。

スタンドはiPad用のものが使えるので、iPad用のものを買って使っている。

ノベルゲームはかなり快適にプレイできる。
読み進めるのは指でタップして進めていけて楽。
ただ、ボタンなどが小さいゲームは指だと押せないので困る。
スタイラスに持ち替えて押さないといけない ( スタイラスのないスレートPCだとかなり困るはず )。
ボタンはある程度大きく作っておいた方がいい。
それと、バックログではグラブスクロールが欲しい。
後はジェスチャー等に対応して欲しいところ。
長押しで右クリック出来るのでいいんだけど、やはり長押しは少し待たされるので素早く操作できるジェスチャーは欲しい。

Windowsを積んだスレートPCはずっと欲しかったんだけど、ONKYO のはスペック的に不安だったので見送っていた。
Eee Slate EP121 は、問題なさそうなスペックだったので購入して、かなり満足している。
メインとしても使えるかも?と試してみたが、自分としては速度的に少し厳しい。
元々はサブでゲームや図を描く用に使う予定だったので、まあその辺りは予定通りといえば予定通り。
でも、もう少しスペックの高いものが出て来て欲しいところ。
そしたら、メインはスレートPC でデスクトップ、ノート、スレートと全般的に使っていきたい。

やはりスレートPCはかなり気に入った。
今後多く出てくることに期待。

投稿者 Takenori : 00:18 | トラックバック

2011年05月26日

モバイル Sandy Bridge の Corei7 へ

モバイル Sandy Bridge の Corei7 の省電力性能にびっくりした。
以下、交換した話。

デスクトップの代わりに使用できると言う条件で検討。
・2台の外部ディスプレイを利用できる。
・USB 3.0 が利用できる。
・今使用しているキーボードとマウスを接続できる。
ということで、購入したのは、EPSON DIRECT Endeavor NJ5500E Quad Core モデル

構成は、
Windows 7 Professional 64bit
インテル Core i7-2720QM プロセッサー (2.2GHz)
4.0GB(2.0GB×2) PC3-10600 DDR3 SDRAM
320GB シリアルATA 300MB/s対応 5400rpm → Intel 510 250GBへ載せ替え
スリムBlu-ray Discコンボドライブ シリアルATA 対応

HDD は、Intel 510 120GB なら選択可能なので、そちらを選択した方がよかったかもしれない。
ただ、自分で載せ替えると、元のHDDのインストール用データ領域を残して、フルで SSD が利用できるのでその点はメリットあったかも。
バッテリーは約5.3時間となっているので、そこそこ持つ。

ワットチェッカーで 2日間使用して測った平均消費電力は、15W ( 1日測って15Wでおかしいと思ってもう1日測ったがやはり15Wだった )。
使用時見ていると 13W ~ 40W 辺りをうろうろしている。
アイドル時は 13W まで下がっている。
さらに、しばらく経ってディスプレイ出力が OFF になると 9W まで下がる。
Blender で 8スレッドでレンダリングを実行してみたところ、33W ~ 77W 辺りをうろうろして頻繁に数値が変わっていた。
終了したら 13W に低下した。
以前使用していたデスクトップPCが Corei7 920 + GeForce 9600GT で、平均消費電力が 130W だったのでそれよりも全然低い。
スペック上最大で105.9W ( 理論値 ) となっているので、最大でも前の平均に届かない。

USB 3.0 の HDD や USBメモリは既に使用していたので、その高速さは実感していて、SSD の容量の少なさを埋めるのに欲しいということで条件にいれていた。

以前使用していたデスクトップPCと比較して感覚的には速度が遅くなったとは感じない。
前は HDD、今回 SSD なので、その分で早くなったと感じる場面が多い。
かなりの省電力化出来て、体感速度が上がってうれしいところ。
デュアル外部ディスプレイと今までのキーボード+マウスということで、使用感も変わっていない。
ディスプレイ出力は、HDMI と ミニD-SUB15ピン となっていて、2画面外部出力すると本体側はOFFに(クローンなら3画面出来る模様)。

負荷が高まるとファンが回り出すが、普段はほとんど無音。
SSD なのでガリガリという音もしない。
最初は違和感があったが、慣れると静寂さが心地いい。
ただ、音がしないというのは少し物足りない気もする。


金額的には 15万程度 (1/3がSSD) と、デスクトップPC を組むのと大差ない価格となった。
それで消費電力が 1/8 以下となって速度的にも快適になった。
バッテリー駆動なので、電源が断たれてもしばらく動き続けてくれるという安心感もある。
今後は、デスクトップよりもノートPCやスレートPCがいいかもしれない。

投稿者 Takenori : 16:39 | トラックバック

2012年09月19日

Matroska のファイル構造

MKV ( Matroska ) のファイルフォーマットは、Matroska のページに載っている。
WebM もコンテナは Matroska 。
Matroska を扱うライブラリとして、libmatroska があるんだけど、LGPL 。

基本構造
Matroska の基本構造は、よくある ID + size でチャンクを構成すると言うもの。
XML のように入れ子構造にはなっているが、基本はチャンク構造と同じ。
ただ、ID も サイズも可変長になっているのでその辺り少し取り扱いに注意がいる。
ID は1~4バイト。
MSB から 4ビットの範囲でどこにビットが立っているかで ID 長が決定される。
つまり、以下のような形。

2進数バイト長
1xxx xxxx1バイト
01xx xxxx xxxx xxxx2バイト
001x xxxx xxxx xxxx xxxx xxxx3バイト
0001 xxxx xxxx xxxx xxxx xxxx xxxx xxxx4バイト

ID は、長さを表すビット部分も含んだ形で ID となっている。
つまり、ID の値を見れば長さがわかる。

サイズも同様にどこにビットが立っているかで長さが決まる。
サイズの場合は8バイトまで許容されている。

2進数バイト長
1xxx xxxx1バイト
01xx xxxx xxxx xxxx2バイト
001x xxxx xxxx xxxx xxxx xxxx3バイト
0001 xxxx xxxx xxxx xxxx xxxx xxxx xxxx4バイト
0000 1xxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx5バイト
0000 01xx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx6バイト
0000 001x xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx7バイト
0000 0001 xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx8バイト

サイズは ID と異なり、MSB から最初に1が立っているところまでは無視して、残りで長さを表す。
仮想コードで書くのなら、以下のような形。

u8 v = firstByte;
u8 len = 0;
for( int i = 0; i < 8; i++ ) {
  if( (v & (0x80>>i)) != 0 ) {
    len = i+1;
    break;
  }
}
u8 mask = (0x80 >> (len-1));
mask -= 1;
u64 ret = v & mask;
for( int i = 0; i < (len-1); i++ ) {
  v = stream.readByte();
  ret <<= 8;
  ret |= (((u64)v)&0xff);
}

サイズは、ID と サイズ部分の長さを含まない。
つまり、サイズを読み込んだ後、そのサイズ分シークすれば次のチャンク ( Element ) に飛べる。

ここまでの情報があれば、後は上述の Matroska のファイルフォーマットのページを見て、それぞれの値や入れ子構造を見てデータを読み込める。
入れ子の深さを表す Level と、複数格納されている可能性があるかどうかの Multiple 、必須かどうかの Mandatory、後は Element Type の integer や string などに注意して表を見ればだいたい問題ない。

投稿者 Takenori : 18:25 | トラックバック

2012年11月04日

不正使用について考え方を変えた

コピーガード等は別になくてもいいし、多少コピーされるのは仕方ないと思っていた。
でも、今は必須だと考え方を変えた。
自転車に鍵を付けずに駐輪場に置いていたらすぐに盗まれてしまうのと同じで、ソフトウェアにも鍵がないとすぐに盗まれてしまうのだろう。

考え方を変えるきっかけは Android アプリ。
有料の Android アプリはキャンセルされるとメールが届く。
また、有効インストール数(ユーザー数)というものが見えるので、キャンセル後も使っている(インストールされている)かどうかわかる。
Android アプリを購入後キャンセルしても使い続ける方法はここでは書かないが簡単。
しばらく、キャンセルと有効インストール数(ユーザー数)を見ていれば、キャンセルされてもユーザー数はほとんど減らないことがわかる(持続的に使うアプリであれば)。
元々、広告付きの無料版もあるアプリなので、購入前に十分確認可能なため、有料版を購入後キャンセルすることは少ないと考えられるが、実際は半数以上キャンセルされている。
つまり、キャンセルされる ≒ 不正使用されている、ということになる。
こうなると、キャンセルされたというメールは、不正使用をわざわざ教えてくれるメールと等しくなってくる。
不正使用もわからなければダメージはないし、特に気のすることもないと考える方だったが、何度も通知されると精神的にまいってくる。
はっきり言って拷問だ。
目の前で商品が盗まれてて、盗まれたら、盗まれましたよと教えてくれるのである。
不正使用者のために正規購入者の利便性を落とすのは忍びないと考えていたが、この拷問に耐えかねてライセンスサービス(DRM)を使うことにした。
実際にテストしてみると、認証はバックグラウンドで行われるため、ライセンス認証を追加したことよるストレスはほとんどない。
追加工数も、ライブラリの追加とソースコードに20行程度追加するだけで簡単。
これなら最初から入れておけばよかったと思えるほど。
今後は、有料のAndroidアプリをリリースする時は、必ずライセンスサービスは組み込もうと思う。
また、他の対策も組み入れて行った方が良いと考えている。

盗む人が一番悪いのは間違いないが、鍵をかけない人もまた悪いのだ。

投稿者 Takenori : 22:12 | トラックバック

2012年11月09日

マット削除

公開で書いていなかったので公開。

3D で作られたα動画のふちに白いのが出てるから何とかならないかと言われた。
アルファがちゃんと入ってないのが原因だと思うけど、LightWave でレンダリングするとそうなるものなの?
で、静止画などで重ねる時は、PhotoShop で白マット削除してから使うんだとか。

根本原因はレンダリング時に正しくアルファが書き出されていないことだと思う。
予想では、背景色とアンチエイリアシングされて白が混ざっているのではないかと (3Dの場合はマルチサンプリングで合成かな?)。
で、α動画は画像を AddAlpha 形式で保持しているので、背景色が黒になるようにしてレンダリングすると綺麗になると推測できる。

----

3D ソフトでレンダリングされ出力されたアルファ付き画像には、
1. プレマルチプライアルファ
2. ストレートアルファ
の2種類あるんだとか。
で、デフォルトはプレマルチプライアルファらしい。
Blender にも Premul という項目があるので、これで切り替えられそうだ。
この辺りのことは以下のサイトが参考になる。

レンダリング結果のアルファチャンネル抜き

α動画だけど、予想通り背景を黒にしてプレマルチプライアルファで出力するか、ストレートアルファで出力することでうまくいくようだ。
プレマルチプライアルファは、背景と混ぜ合わさせるという事なので、背景が黒で AddAlpha ならうまくいくよう。

投稿者 Takenori : 18:55 | トラックバック

2013年01月25日

影響範囲とテスト

B. 直った。これでコミットしてしまう。
A. 待って、影響範囲のテストしないで該当個所の確認だけなのは、デグレとか心配。
B. レアケースなのでとりあえず様子見?
A. 普通に影響範囲のテストすればいいだけでは。
B. 影響的には、○○と言う処理がなくなるだけなので悪影響はないです。たぶん。
A. そのパスを通る処理をテストして、悪影響が出ていないことを確認するのがテスト。
B. 一応そのパスを通る処理で、いままでが異常だったのが直ったのが現状。

と言うように、全く話が通じないと感じる状況があったので書く。
コミットはリリースされるリポジトリに入れると言う話。
リリース済みのソフトウェアの不具合修正の話で、回帰テストの話なわけだけど、それが何か理解されていないのかな。

普通は影響範囲を調査して、その範囲のテストのやり直しと、必要であれば追加テストケースを書いてテストするはずで、修正されたことを確認だけで終了というのはしないと思っていたけど、そうではないようだ。
ゲームでリリース前の開発途中の場合は、単なる動作確認でどんどん進めてしまって、最後にランダムテストでできるだけつぶす形で開発を進めるのはあるけど、リリース後もそれと同じのりでやってしまうのは気になる。

どこか修正した場合、その影響はどこに及ぶかわからないから全部テストし直すべきだという意見もあるが、工数的な理由から影響範囲を調査して、その範囲をテストし直すと言うことがよくとられる(テストが自動化されている場合、全部テストしても工数はほとんどかからないので積極的に自動化すべきと言う意見も)。
では、影響範囲とはどの範囲か?
・修正対象関数を呼び出している関数を調べて、それらの関数が外部から操作可能な操作。
・クラスメンバ変数等の状態を変更している場合は、その変数にアクセスしている関数とその関数を呼び出している関数を調べて、それらの関数が外部から操作可能な操作。
基本的には、これが影響範囲だと考えられる。
言うまでもなく、テストは入力変数を考慮してテストケースを作る必要がある。
関数の呼び出し範囲は、関数呼び出しグラフを生成してくれるドキュメント自動生成ツールなどがあるので、それを使うと少し楽。
該当個所に及ぶ効果が重複する場合などで、テストケースを削ることもある。
もちろん手作業ではなく、テストプログラムを書いて自動テストすることもある。
該当不具合を検出できるテストケース等も当然追加する。
また、類似バグと言うのは良くあるので、似たような構造を持った箇所や動作のテストケースも追加してテストすると芋づる式に不具合が見つかることが良くあるため、そのようなテストも行うと効果的。

最初のやりとりを見るとテスト仕様書を作ることもうまく通じていない気もするけど、影響範囲のテストはこんな感じだろうか。

知識ゼロから学ぶ ソフトウェアテスト この辺り分かりやすいので、読んでおいた方がいいと思う。

投稿者 Takenori : 15:22 | トラックバック

2013年03月27日

ネットワーク認証

一般的なローカルのパスワード認証では、パスワードそのものを保存して比較するという方法はとらず、パスワードを一方向関数を通したものを保存し、認証時は入力されたパスワードを同じ一方向関数を通し、その出力結果を比較することで認証する。
つまり、パスワード自体は保存されていないし、パスワードでの比較も行われない。
一方向関数とは、入力から出力は求められるが、出力から入力は現時点では求められない関数。
ハッシュなどが用いられる。
以下、一方向関数は、ハッシュと書く。

ネットワークでの認証も基本的にはこれと同じ考え方。
当然のことながら秘密キーをネットワークで送るなんてことはしない。
コマンド+秘密キーをハッシュ通して、コマンドにそのハッシュ値を付与したものを送信すれば、秘密キーはネットワークに流れない(一般的に使われる HMAC-XXX などはもう少し複雑な計算をしている)。
認証側も同じように、秘密キーを加えてハッシュ計算する。
そして、ハッシュ値で比較すれば秘密キーが一致しているかどうかわかる。

ただ、この方法では不完全で、同じコマンドを送るのなら同じハッシュ値になるため、秘密キー関係なしに認証が通ってしまう。
そのため毎回ハッシュ値が異なるようにしなければならない。
異なるようにするには日時を入れればいい。
当然過去に使われた日時が使えると無意味(同じハッシュ値が使える)なので、最後に認証した日時よりも未来の時間でないと以後認証しないようにする必要がある。

つまり、いかにローカルの秘密キーを隠すかが鍵となる。
で、この 超軽量Twitterクライアント「もふったー」コンシューマシークレットキー難読化最後の挑戦 記事の話。

TweetDeck は、そのまま秘密キーが保存されているから、バイナリ見れば見つけられる。
もふったーは、暗号化して保存されていたけど、実行時に複合化するから、実行時にメモリ見れば見つけられる。
強化版、デバッグ処理削除版ともに HMAC 計算部分にブレーク貼ってメモリ見れば見つけられる。
さらに強化した。
と言う流れの様子。

ネットワーク認証を行うにはここくらいまでは求められるということだろうか?
秘密キーの管理をユーザーにゆだねるのであれば、そこをどう隠すかは関係なくなるけど。
ただ、複合化のための秘密キーを隠すことになるか。

投稿者 Takenori : 23:12 | トラックバック

2014年01月01日

Python 2.7 で ez_setup.py で出るエラーを回避する

Python 2.7.6 で python ez_setup.py を実行すると以下のようなエラーが出る。

  File "C:\Python27\lib\mimetypes.py", line 249, in enum_types
    ctype = ctype.encode(default_encoding) # omit in 3.x!
UnicodeDecodeError: 'ascii' codec can't decode byte 0x83 in position 0: ordinal
not in range(128)
Something went wrong during the installation.
See the error message above.

該当個所見ると、どうもレジストリからの読込みで2バイト文字が混じっているとエラーになる様子。
検索するとレジストリの方を削除する対応方法などが見つかるが、それは明らかにまずい。
スクリプトを見てみると、# omit in 3.x!と書かれている。
Python 3.3 を入れて、Python 3.3 で ez_setup.py を実行すれば問題なく終わるが、Python 2.7 系でないとエラーが出るものがあるので、Python 2.7 を入れたい。
3.3 の Lib\mimetypes.py の read_windows_registry を見てみると、エンコード周りの処理がない。
と言うことで、2.7 の mimetypes.py も同じように修正してしまう。
228行目から対応する箇所をコメントアウトするとこんな感じ。

    def read_windows_registry(self, strict=True):
        """
        Load the MIME types database from Windows registry.

        If strict is true, information will be added to
        list of standard types, else to the list of non-standard
        types.
        """

        # Windows only
        if not _winreg:
            return

        def enum_types(mimedb):
            i = 0
            while True:
                try:
                    ctype = _winreg.EnumKey(mimedb, i)
                except EnvironmentError:
                    break
#                try:
#                    ctype = ctype.encode(default_encoding) # omit in 3.x!
#                except UnicodeEncodeError:
#                    pass
                else:
                    yield ctype
                i += 1

#        default_encoding = sys.getdefaultencoding()
        with _winreg.OpenKey(_winreg.HKEY_CLASSES_ROOT, '') as hkcr:
            for subkeyname in enum_types(hkcr):
                try:
                    with _winreg.OpenKey(hkcr, subkeyname) as subkey:
                        # Only check file extensions
                        if not subkeyname.startswith("."):
                            continue
                        # raises EnvironmentError if no 'Content Type' value
                        mimetype, datatype = _winreg.QueryValueEx(
                            subkey, 'Content Type')
                        if datatype != _winreg.REG_SZ:
                            continue
#                        try:
#                            mimetype = mimetype.encode(default_encoding)
#                            subkeyname = subkeyname.encode(default_encoding)
#                        except UnicodeEncodeError:
#                            continue
                        self.add_type(mimetype, subkeyname, strict)
                except EnvironmentError:
                    continue

これでエラーは出ずに ez_setup.py が実行できてインストールできた。

投稿者 Takenori : 19:21 | トラックバック

2014年03月10日

mozjpeg はどのようにして圧縮率を上げているのか?

ざっくりソースコード見たりしただけなので、間違っているかもしれないが書いておく。

一言で書くと「プログレッシブ方式で、DC成分の分割サイズを最適なものにすることで偏りを増やし圧縮率を上げている」ということのようだ。
この説明だと知っている人以外にとっては意味不明だと思うので、どのように圧縮しているのかある程度説明し、なぜ圧縮率が上がるのか説明してみる。

JPEG では、色空間変換 → DCT → 量子化 → ハフマン符号化+ランレングス と言う手順で圧縮している。
この中で実際に圧縮を行っているのは、「ハフマン符号化」と「ランレングス」の部分。
これらはデータの偏りが大きいほど圧縮率が上がる。
わかりやすいランレングスを説明すると、00000000 と8個0が並んでいるとすると、これを0×8と表現することでデータを圧縮している。
ハフマン符号化は、もう少し複雑だが今回の説明を理解する上ではだいたい似たようなものと言う認識で構わない。

実際に圧縮行っている処理から、データの偏りを大きくできれば、圧縮率が上がることがわかる。
このデータの偏りを大きくする処理が JPEG では DCT と 量子化 と呼ばれる処理。
DCT とは、離散コサイン変換の略で、周波数領域に変換する処理。
画像を周波数領域に変換?と言われても意味は分かりづらい。
音だと高い音や低い音に分ける処理に当たるので、音だと直感的に理解しやすい。
画像でも同じように変換すると変化が大きいところは高周波成分に、変化が少ないところは低周波成分に当たる。
JPEG では、高周波成分を荒くすることで圧縮率を上げているので、エッジなど変化の大きいところがぼやけやすい。
圧縮率を高くすると、より荒く記録するので、よりぼやける。
( 高周波成分は画質への影響が少ないので荒く記録する )
荒く記録するというのが、量子化に当たる処理。
量子化と言うたいそうな名前がついているが、JPEG で実際に行うのは単なる割り算。
例えば、元の値 100 を 50 で割り、出てきた値 2 を記録する ( デコード時は逆に 50 をかければ元に戻る )。
ここでは綺麗に割り切れる値を使ったが、実際は小数点以下の値も出る。
この小数点以下の部分は捨てて記録するので劣化が起こる。
ここが荒く記録するという部分。
大きな値で割ると、数値は 0 に近づいていく。
高周波成分ほど大きな値で割るので、高周波成分は 0 が多くなる。
これら DCT と量子化は8x8のブロック単位で行われる。

ここからが mozjpeg に関係する部分。
通常方式はブロックごとに記録していくが、プログレッシブ方式では周波数帯単位などで記録していく。
ブロック単位では8x8=64個の範囲で高周波と低周波成分が繰り返されるが、周波数帯単位で記録していくと、低周波成分、高周波成分が連続して記録される。
高周波成分が連続するということは、0 が多く連続する。
つまり、偏りが大きくなり圧縮率が上がる。
どのように周波数帯を分割して記録するのが最適かを求めて記録するのが mozjpeg が行っている処理のようだ。
ここまでの説明からわかるようにプログレッシブ方式にするだけでも、ある程度圧縮率は向上する様子。

元々プログレッシブ方式は、遅い回線で少しずつ画像が表示できるようにするものだったが、これが圧縮率向上に寄与するというのは興味深い。

----------------------------

2014/03/12 追記
「どのように周波数帯を分割して記録する~」の部分について勘違いしている人がいるようなので補足。
周波数帯を変更するのではなく、DC係数を何個ずつに分けるか、もしくはさらに何ビットずつに分けるかというもの。
プログレッシブが元々そのように分割できたので、その分割方法の中で最適なものを選択するということ。

投稿者 Takenori : 23:27 | トラックバック

2015年02月14日

Javaからの変換いろいろ

Microsoft、クロスプラットフォームのモバイルアプリ開発でJavaを推進 を読んだのでまとめる(この記事はタイトル詐欺だと思われる)。
記事中の JUniversal は、現在のところ Java から C# へ変換するツールのよう。
パフォーマンス重視のアプリ ( Windows/AndroidNDK ) 用に C++ へも間もなく対応するようなことが書かれているので、その辺り興味深い。
Objective C++ も対応するようではあるが、現時点では Google の j2objc を使って対応できると言うことのようだ。

Java から C# へ変換するのは他にもいくつかある

この手のものとしては Sharpen が比較的完成度が高い様子
Android を C# 化する XobotOS を作る時に使われたなどが有名だろうか。

他に Java 2 CSharp Translator for Eclipse ( sourceforge ) などもある。


ソースコードの変換ではなく、ネイティブ化するものもある。
RoboVM は、VM と付いているか、VM ではなく、Java のバイトコード ( class ファイル ) を LLVM ビットコードに変換して、それとサポートライブラリ( GC やスレッド等 ) をリンクすることによって、ネイティブコード化して動かすもの。
iOS メイン。
Linux や MacOS へも対応している様子。
Windows でもネイティブ化して動くようになると更に色々と使えそう。
Ingress は libGDX で作られていると言う話なので、iOS 版はこの RoboVM が使われているのではないかと思われる。


IKVM は Java VM を .NET で実装したもの。
VM の上に VM を重ねているので重そうな印象を受けるが、最近だとそうでもない気がする。
IKVM で動かしたことはないけれど。

JavaScript に変換する GWT や、ネイティブ化するものは他にもあるけれど、とりあえずはこんなところだろうか。
Java は現時点だとマルチプラットファーム化するとしたら、C/C++ の次くらいの選択肢だろうか?
C# も同じくらいかもしれないけれど、Xamarin や Unity などプロプラエタリなものへの依存がまだあるように思えるので、その辺りネック。
CoreCLR is now Open Source で、MS が VM を MIT ライセンスで OSS 化したり、.NET Native などで徐々に解消されて行ってるが。

投稿者 Takenori : 22:58

 
Total : Today : Yesterday :