2009-11-30 (月)
会社に行ったりする.
cppflのイベント周りが危険な感じだったので,外見だけ取り繕っておく.普通の関数ポインタとメンバ関数ポインタを別々に管理していたのを,無理やりまとめた.
この日記はフィクションです.登場する人名・団体名・地名・職業などはぜんぶ架空のものです. なので実際のものとは何も関係がありません. それから,写真のように見える画像はCGもしくは念写によるものです.
会社に行ったりする.
cppflのイベント周りが危険な感じだったので,外見だけ取り繕っておく.普通の関数ポインタとメンバ関数ポインタを別々に管理していたのを,無理やりまとめた.
VisualStudioなんか不安定だ.そしてドキュメント類が見れなくて困っている.「MSHelpListener.exe は動作を停止しました」とか言われてしまう.なんか,必要なサービスが足りてないんだろうか.まぁ,cl.exeが動くからいいか.
生成されるコードを少し見てみる.最適化とかの様子を見てみたいところだったけど,VC++6.0から2005にしたときほどの感動は無かった.単純な例しか試してないので,もう少し意味のある処理をしてみれば違いがありそう.
肉じゃが作るなどした.
最近のJavaVMのJITコンパイラやMSILの実行時最適化ってどの程度やってくれるんでしょう?少し調べたけど,良い資料が見つからなかった.
なんとなく,JITとかだと高度な最適化はしにくいから遅そうというイメージがあるんですが.もしかしたら,実行するCPUに合わせてSSE命令とか駆使してくれるのかもとか,期待したいのですが,実際のJavaや.NETのアプリケーションの動作を見ていると,あんまり期待できない.
ベンチマークレベルではなくて,どんな処理がどのような命令列に変換されているのかまで見ておきたい.間に中間コードがあるので,ソースコードと対応付けるのが面倒だと思ってたけど,VisualStudioは,CLI使っててもアンマネージドなコードまでデバッガで見られるっぽいので暇があったらやってみよう.
インストールする.Beta1をインストールしてあったんですが,殆ど使う間もなくBeta2が出ていたのでインストールして試してみる.
とりあえず,C++,C#,F#を入れておきました.
まずは自分に一番影響がありそうなC++で様子を見る.
eclipseみたいに,プログラムを書くとその場で構文チェックされます.
赤の波線が出るので,コンパイルしてみるまでもなく,文法エラーが発見できるのは良い.
static_assertが使えます.
コンパイル時に静的なチェックを入れられるので結構便利.非対応コンパイラの場合はマクロで無効にするとかが妥当かな.
decltypeも使えます.
関数の型が欲しくなったときに威力を発揮しそうです.DLLを動的に読み込むときに,GetProcAddressを使うときとか,decltypeがあるととても良さそう.というか,もっと早く欲しかった.
無名関数も使えます.
ただ,構文が無理やりだなぁ.なるべく現行のコードに影響を与えないようにという配慮だろうけど,ちょっとなぁ.
autoに新しい意味が加わりました.予約語増やしたくないからって,一つの語の意味を増やすのはどうかと.これでイテレータも怖くありません.
ただ,
auto main() -> int{return 0;};
は,エディタ上だとエラーになりますね.コンパイルは通るようですが.なんか,トップレベルでauto使うと怒られるようです.Cのautoを引きずっているのかとも思いましたが,関数内なら,static autoとかやっても大丈夫なので,何か間違っているのかなぁ.
以下のものは期待していたのに使えない.
sang0がkwui使っているといっていたけど,公開されているバージョン古いな.というか,cppflという名前に改名するつもりで放置してた.少しだけ更新.ついでに,手元に合ったサンプルを置いた.
今後半年の目標設定とかした.仕様書を揃えるとか,タスクの管理とか色々.13時に出社するという裏の目標が一番達成が困難であるように思える.
共通のディレクトリにバイナリを全部突っ込むなんていう乱暴なことはいまどきあまりしないし,WindowsではProgram Files以下に個々のアプリケーションのディレクトリがあるので,個別のアプリケーションにパスを通さなければいけない.
アプリケーションによっては,自動的に環境変数に追加してくれるけど,変数の内容が際限なく長くなっていくので,後から編集しにくい.出来の悪いインストーラがpathに変な文字を入れたせいで,コマンドが使えなくなったりするのも困ります.別の管理方法にして欲しい.
もうハル研のプロコン始まってるのか.今年の賞品なんだろう.学生はいいなぁ.
最近,mixiアプリというものが話題になっているようなので,どんなものか試してみる.なんか,色々なアプリがあるようですが,まずは自分で作ってみるが手っ取り早そう.
mixiのユーザなら気軽に使えるし,ユーザ管理もmixiがやってくれるので,手っ取り早く人を集めるには良いかもしれません.
注意:ほとんどmixiアプリ開発の説明を読んでないので間違ったこと書いてるかも
当然のようにmixiのアカウントが必要です.さらに,mixiアプリの開発をするためにはデベロッパー登録をする必要があります.個人と法人で手順が違うようですが,個人での登録なら携帯のメールアドレスとか住所とかを入力して完了です.
規約を読むと,mixiアプリ用のAPIで取得した情報はmixiアプリのためにしか使えないようです.他のサービスとの連携とかはだめなのかな.個人情報についてはユーザの同意の範囲で使えるっぽいので,そちらの規定が優先されるなら,同意をとればアカウントの紐付けは可能かも.
個人と法人の選択肢はあるのですが,同人サークルのような法人格を持たない団体でのアプリの開発は不可能なんでしょうか?代表者のアカウントで公開すればいいのですが,登録したアプリの管理画面は,そのアカウントでしか開けないので不便です.開発者で共用のアカウントを作ることも考えられますが,mixiのライセンス上禁止されています.
郵便番号を入力したら住所は自動で入れて欲しいなぁ.
デベロッパ登録が済めばすぐに開発をはじめられます.
xmlを適当なサーバにアップロードして,mixiアプリの登録画面で必要事項を埋めるだけ.xmlのサンプルは用意されているので簡単.要は,OpenSocial.
これだけで,mixiアプリとして動いて,自分のトップページに表示させたりも出来るようです.
ただ,「開発中」のアプリは開発者が承認したユーザのみが利用できるようです.公開するためには,カテゴリ申請が必要ですが,10人以上利用者がいないと申請できないようなので,私みたいにmixi上の友達が少ない人は不利ですね.
デバッグ用にalert()とか入れたけど,これって他の人が来てもダイアログ表示されてしまうのか….色々想像してしまったけど,変なことは規約で禁止されていたので,大丈夫でしょう.
セキュリティとかも,どうやって確保されているか良く分からないので,挙動を観察してみる.
アプリはiframeで埋め込まれるようです.javascriptで変なこと出来ないようになってますね.
スクリプトが埋め込まれるページが存在するホスト名もアプリごとに違うようです.「[ハッシュ値っぽい文字列].app0.mixi-platform.com」というような名前でした.
JavaScriptだけでも遊べますが,Flashを使うとさらに楽しそうです.
flashをrequireして,gadgets.flash.embedFlashで埋め込めるようです.HTMLにswfを埋め込むのって,全てのブラウザで動くように書くのが面倒ですがAPI側でやってくれるので簡単.
JavaScriptとFlash間でデータをやり取りするために,flash.external.ExternalInterfaceを使ってみました.
まず,embedFlashでidとかallowScriptAccessとか必要なパラメータを設定.Flash側のSecurity.allowDomainで,アプリがおかれているホストを設定する必要がありますが,とりあえず"*"で.本来なら,Flashのパラメータ経由で受け取るのが良いでしょう.
とりあえず,今日の成果をおいておく.
やっとクレジットカード届いたかと思ったら,ETCカードだった.そういや申し込んだような気がする.車持ってないし意味ないけど.
キャッシュカードを無事に発見したのでお金の心配はなくなったので良いのですが.
寝る.
今日はニワン語を勉強した.仕事とは関係ないです.ニコニコ動画まとめwikiはすごく役に立ちますね.
趣味のプログラミングはやる気が出なかったり,飽きてきたりで,予定なんて立てられませんが,仕事は違いますね.
予定どおりに進められるのか,かなり不安だったけれど,やってみると,なんとかなっているのが不思議で仕方がない.
毎日かなりの時間をかけているのと,ちゃんとスケジューリングしている人がいるので,当たり前といえば,当たり前なのだけど.
C++で実体を代入でコピーしても仮想関数テーブルはコピーされないっぽい.あとで確認しよう.
C++でポリモーフィズムを実現するためには,仮想関数を持った基底クラスを作るか,テンプレートを使うかの二択になるけど,作り始めるときにどちらかを選ばないといけない.それぞれ一長一短があるので,場合によって使い分ける必要がある.でも書くコードが違いすぎるので,途中でもう一方に変更しにくいのが問題.
あるクラスのvirtualを全て無効にした上で,そのクラスを受け取る関数は全てテンプレート関数にするくらいのことが一瞬で出来るとうれしい.マクロを駆使すれば可能かな.
情報漏洩に関する事件で,窃盗罪で罪に問うのは危険ではないのかなぁ.CD-Rを盗んだ罪で実刑とか聞くと,社内のCD-Rを使ったか,自分で用意したCD-Rを使ったかという些細な違いで適用できる法律が変わってしまって,判決にも影響が出るのではと心配してしまう.
眠い
$ find xxxxxx -name "*.php" -exec cat {} ';' | wc -l 190075
一応プロジェクト名は伏せて.
いままで,PHPで正の整数かチェックするのに,ctype_digit()を使っていたのですが,罠が.この関数,int型の数値を渡すとfalseになるんですね….
「ctype_digit(''.$d)」と書けば解決なんですが,空の文字列と結合して無理やりやっているのが汚い.
となると次案は「(is_int($d) && $d>=0) || ctype_digit($d)」かな?
これは,$d=1.0のときも false になる.$d=1.0;や$d=true;のとき$dの文字列表現は「1」なので,ctype_digit(''.$d)だと true になってしまう.厳密には,1.0は整数だけれど,falseにする方が処理的には奇麗かなぁ.
Perlなら何も気にせず「/^\d+$/」って書きますが,PHPでpreg_match(~とか書いていると,黒魔術を使っているような罪悪感に襲われるのでなるべく使いたくない.
PHPはとても奥が深い.プログラミングに対する認識が変わる.
昨日は半田付けだけして寝てしまった.
良い感じに収まった.マトリックスLEDを挿すソケットは,16ピンのICソケットを2つに切って代用.部品代は全部あわせても,400円くらいです.
光らせてみる.プログラムは,先週のとほとんど一緒.
あとは通信用のコネクタつけて,たくさんつなげられるようにする予定.
昼過ぎまで寝る.選択とか掃除とか.夕ご飯食べたら眠くなったので寝る.
回路がマトリックスLEDの裏に全て収まることを確認.
R=100~200Ωくらい.電源系は省略.LEDのピン配置は秋月のTOM-1588.BA823は鈴商で100円で買えます.
テストを書くのが大変.
このまえ,秋月に行ったときに気づいたけど,SHARPのGP2Y0A21YKが400円なのか.安い.
少し高くなりますが,5.5mまで測れるモジュールも売ってるので,色々遊べるかも.
今日は仕事を休んで一日寝ていた.
体調が悪いので早めに帰って寝る.
金曜の夜から微熱が続いている.なんか,週末になると体調悪くなるなぁ.
鈴商で買ったBA823を使ってみる.ドットごとの明るさを制御するなら,MAX7219を使うよりずっと楽です.200mA以上流せるので外付けのトランジスタもいりません.何よりもICの値段が1/10.
#define F_CPU 8000000 #include <avr/io.h> #include <avr/interrupt.h> #include <util/delay.h> volatile uint8_t framebuf[] = { 0,2,4,6,8,10,12,16, 16,1,2,4,6,8,10,12, 12,16,1,2,4,6,8,10, 10,12,16,1,2,4,6,8, 8,10,12,16,1,2,4,6, 6,8,10,12,16,1,2,4, 4,6,8,10,12,16,1,2, 2,4,6,8,10,12,16,1, }; // タイマ割り込み ISR(TIMER0_OVF_vect) { static uint8_t cnt = 0; static uint8_t frame = 0; if ((PORTD&2)==0) { PORTD|= 2; // CLK H uint8_t d=0; uint8_t i; for (i=0;i<8;i++) { d>>=1; if (frame<framebuf[cnt*8+i]) d|=0x80; } PORTB=d; cnt=(cnt+1)&7; } else { PORTD&= ~2; // CLK L PORTB=0x00; if (cnt==0) { frame=(frame+1)&15; PORTD|= 1; // DAT H } else { PORTD&=~1; // DAT L } } } // 指定された時間だけ待つ void delay_ms(uint16_t w){ while (w-->0) _delay_ms(1); } int main() { DDRB = 0xff; // LED matrix anode(0-7) DDRD = 0x0f; // LED cathode(BA823) PD0->dat PD1->clk PORTD=0x00; PORTB=0x00; TCCR0B = _BV(CS00); TIMSK = _BV(TOIE0); sei(); for(;;) { uint8_t t; uint8_t i; for (i=0;i<64;i++) { delay_ms(20); t=framebuf[i]; framebuf[i]=framebuf[(i+23)&63]; framebuf[(i+23)&63]=t; } } }
以前使っていた秩父インターネットを解約したのですが,先月あたりからアカウントが使えなくなった.なので,chichibu.ne.jpの方のメールアドレスではもう受け取れません.binzume.netの方に送るようにしてください.
ずっとメールをまともにチェックできていないので,連絡がある方は掲示板で書いてもらえると助かります.
鈴商でBA823を買う.あとICソケットをたくさん買う.1列のピンソケットが欲しいときは,ICソケットを切って代用したほうが安いので.
AVRの不満点は任意ビットシフト命令が無いことだよなぁ.まぁ,mega系は乗算が2クロックでできるので困らないけど.
秋月の店内が少し変わっていた.レシートも変わった気がする.
動画を投稿したユーザのIDが分かるようになったし,そこから別のユーザをウオッチリストで辿ってみる.
意外と,見覚えのあるユーザを見つけることができるから危険だ.
以前は今の私と同じような時間に出社していた人が午前中に会社に来ている(らしい)上に,もう(出社時間は)戻らないの?みたいなことを言ってきたので,早く出社しようと思った.
なんとか15時に出社しているので,個人的には問題視していなかったのですが.
とあるシステムの謎のエラーに悩まされて原因を調べたらディスクスペース不足だった….コードばかり見ていても解決しないわけだ.
ふと,先月にあった戦略報告会の会場に入るとき,社員かどうかの確認をされたかが気になった.入口には,普通にD社戦略報告会とか書いてあったけど….無意識のうちに誰かに社員証とか見せてたかなぁ….たぶん,誰でも参加できてしまうなんてことはないでしょう.
長くなってしまったので気が向いたら書き直す.
Lightweightな言語で良いという人も多いと思いますが,私はまだRubyやPHPだけでプログラミングの勉強はできないような気がします.
プログラミング言語の勉強する上で,良い解説書や,インターネット上のサンプルの量は重要だと思います.そういう点では,言語を勉強する環境は整っていると思います.
ただ,言語の勉強には十分だけど,実際に良いプログラムを書くための,プログラミングの勉強は難しそうというのがWebプログラマをやってみて思いました.
私が,それなりにプログラムを書けるようになったのは,TextMaidというテキストエディタと,FreeBSDのおかげだと思います.TextMaidというフリーでソースの公開されているテキストエディタを使っていたいたのですが,自分で使うには足りない機能や,邪魔な機能も多かったので,テキストエディタで,そのエディタを改造していました.あとは,FreeBSDを使い始めて,そのソースを弄ったりしていると,ある程度の規模のソフトがどう作られているのか分かるようになりました.
テキストエディタでデータ構造やアルゴリズムを勉強して,OSでソフトウェアの構造を勉強するのは,後から思えば良かった思うのですが,Lightweightな言語でも似たような経験ができるのかなぁ.
それまでも,N88-BASICやHSPでプログラムを書いていましたが,C言語を覚えたときから,見える世界がとても広がりました.今は,RubyやPHPで書かれたソフトもたくさんありますが,本当に良いプログラミングの勉強になるソフトってなかなか無さそうというのが現状な気がします.
というわけで,C言語の勉強するのがいいと思います.
アセンブリ言語も良いと思います.自分で使っているソフトを逆アセンブルして,中を見ているととても勉強になるし,世の中のソフトウェアがどの程度の技術で作られているのかも見えてきます.
200mAは結構眩しいので,少し暗めにすることに.暗すぎない程度まで落として,60mA程度か.なんとかAVRだけで駆動できるなぁ.明らかに定格に収まっていないけど.
シンプルで使いやすそうなLEDドライバを探したら,鈴商の通販でNECのμPD6345GSとロームのBA823を発見.BA823の方が安いからこれにしようかなぁ.
天気が良い.電子工作日和ですね.
秋月で買った,8x8のマトリックスLEDに繋いで光らせてみた.全部光らせると,電流は200mAくらいか.これならギリギリ2313の絶対最大定格に収まるけど,やめておいたほうが良さそうだ.
MAX7219が勝手にダイナミック点灯してくれるので,明るさ制御するとき少し困るなぁ.全体の明るさなら設定できるんですが.
カソードの出力を監視して垂直(?)同期を取れば16階調までならちらつきも気にならない感じです.
写真だといまいち.
気合で同期を取っているひともいるみたいです.http://d.hatena.ne.jp/KZR/20090824/p2
100円のマトリックスLEDと100円のマイコンに,1000円もするLEDドライバがつながっているのは,何か間違っている気がするのでどうにかしたい.ちょっと多めに電流が流せるシフトレジスタどこかに無いかなぁ.2313が意外と電流流せるし,かなり無理しても殆ど壊れたこと無いので,シフトレジスタ代わりに使ってしまうか….
とても眠い.
昨日,MAX7219をたくさん買ってしまったのだけど,よく考えたら,マイコンとトランジスタアレイで作ったほうが安く作れますね.まぁ,面積を小さくするためには仕方ない.
秋葉原で電子パーツ漁ったり,逆アセンブルしたりする日.
千石,秋月,鈴商,ヒロセ,マルツあたりを何度か回る.
goto(eldesh)と焼肉食べた.
とりあえず,ファームウェアを読む.
とても久しぶりにARM.もう命令忘れているこの辺を見て勉強.
とりあえず,一番それらしい BASE.RKW を見てみる.rkwというのは,実行ファイル形式のようですね.ヘッダもなんとなく意味は分かりますが,コードを見た感じだと,.rkwの0x2c以降が,0x6000000のアドレスに読み込まれるようです.0x2cからジャンプした先が普通の関数っぽいので,すぐに分かります.
読み進めていくと,ARMの割り込みベクタとかを書き換えているので,まともなOS上で動いているわけでは無いようです.
ちょっとがんばれば自作のプログラムを作れそうですが,そもそも,まだファームウェアが上書きできないので,どうしようもないです.ファームウェアが入ったパーティションは読み取り専用でマウントされているっぽい.最悪,フラッシュメモリを直接書き換えないと,遊べないかも.
という夢を見た気がしますが,気のせいでしょう.
掃除したりする.
みずほ銀行のキャッシュカードを発見.これで給料を使うことが出来ます.
少し間が開いてしまったけど,つづきを読む.
「未来を作る」と謳いながら過去のことしか書いていないのか.
昔住んでいた場所と今住んでいる場所をGoogleマップで比較してみた.
今
昔
…縮尺は同じです.