昼頃起床。
美人時計ELISPのデバッグ版やワークアラウンド版をもそもそと作ってみたり。
デバッグ版は119分先の画像を表示するようにしてみました。推測が当たっていれば
22:00になると画像取得に失敗し始めると考えられます。
ワークアラウンド版は画像取得したらリトライするというもの。
150224版(コード内の日付を変え忘れてました(^^;)) 以前までは、
画像の取得に失敗しても、次の画像アクセスは1分後という動きに
なってたのを、失敗したら何度かリトライするように変えてみたり。
自PCの時計が 画像サイトの時計より若干進んでいると、自分PCでは00:00だけど
画像サイト側は23:59となった時、2時間範囲計算バグを踏んでしまうと推測されます。
画像サイト側が00:00になればアクセス可能
なハズなので、時計のズレはそんなに無いと考えて何回かアクセスリトライ
すれば、そのうち時間が合って画像の取得できるだろうという考え方です。
恐らく自PCの時計が 画像サイト側より遅れていれば、150224以前版でも
大丈夫かも知れません。そんな訳で今日の深夜のテスト待ち。
昼間の再放送番組で、テレビ字幕をリアルタイムでキーボード入力する
ステノキャプショナーという職業を知ったり(参考動画)。
それで使用していたキーボードがちょっと変わっていたので調べてみたり。
同時押しの組み合わせで単語を入力するようですが、
具体的な入力ルールはよく判りませんでした。
別のELISPをもそもそとコーディング。やっと動き始めたようなそうでも
ないような。
美人時計ELISP。デバッグ版で119分先の画像を取得していた所、
22:01 +199分 = 00:00 になった所で、空画像が取得され始めました。
予想通り。
で、ワークアラウンドの方は失敗。リトライ回数が足りなかった
ようですが、もしかすると 00:01になるまで 00:00の画像を取得不可
なのかも知れません。もし、00:01になるまで00:00の画像を取得不可
だとすると、時計を1分遅らせるしか手が無いのですが.....
別ELISPの方。
3Dワイヤーフレーム描画してみました。この例では約350本のワイヤーをテキスト描画
しているのですが結構重いです。もっと楽々と動くかと思ったのですが
そうでもありませんでした。あと、ELISPは大規模なものになるとやはり辛いです。
辛いと思った点をいくつか挙げてみますと、
( 10 ; x座標 20 ; y座標 30 ) ; 得点と定義しても、リストの二番目がy座標なんて1ヶ月経てば忘れるし、リストの 手前に別のメンバー変数を追加すると、プログラム自体が全面的に書き直しになります。 また、データ構造を記述できないという事はコンパイル時にチェックもできないので、 データ構造を変えた後にプログラムを間違えないように直すのは死ぬほど大変になると 考えられます。 データも関数もリスト構造に統一されているというLISPの最大の特徴が 仇になっているように思います。連想リストで対応する方法はありますが、あれって 絶対速くないですよね?
(hoge (aaa bbb) (fuga (ddd eee)) (hanya (fff ggg)))みたいにインデントしてたところ、「eee」が不要になったので 後ろの括弧も 含めて行ごと削除してしまったら、
(hoge (aaa bbb) (fuga (ddd (hanya (fff ggg)))
(hoge (aaa bbb) (fuga (ddd (hanya (fff ggg)))))さっぱり動かなくなってしまうとか(^^; 変更する可能性がある場合、閉じ括弧の位置を 最後にまとめて「))))))」とかやってしまうのが良いのか、適当にコードブロックに対応 するようにネストの深さに合わせて、バラした方が良いのか悩みます。
遅めに帰着。
Web巡回して終了。
そういや先日、美人時計の画像URLが変わったのですが、
その後、何故か丁度 00:00 の画像取得に必ず失敗するようになったり。
どうやら美人時計のサイト自体が画像取得できる時間を制限して
いるようで、現在時刻からキッカリ119分先まではいつでも画像取得できる
ようですが、それより先の時刻は空のデータが得られるような
仕組みになっているようです。
ここからは推測ですが、23:59→00:00 の 時間差計算が何かしら
バグっていて、00:00を 24時間前か24時間先 と判断してるのかな?
と思ったり。この推測の通りバグっていたとすれば、例えば22:00以降であれば
00:00以降の画像を取得できるハズですが、24:00で計算されて
24:00の画像は読めるようになっているけど、そんな画像は無くて
アクセスできない....とかになってるんじゃないかな?と考えられます。
少し先の時刻画像を取得するようなデバッグバージョンを作って
試してみようと思います。
まだ判りませんが、推測は当たっていそうな予感。
01:59までは00:00画像にアクセスできましたが、02:00になると
空データになりました。どうやら 現在時刻から ±119分ぶんの画像が
取得可能なようです。
ところが、00:10頃に23:59画像をアクセスしても空になっていた事
と合わせてみると、やっぱり 00:00の前後 2時間の範囲計算がバグって
るんじゃないか?と考えられます。
気持ち早めに帰着。
ちょろりコーディング。
遅めに帰着。
ELISPコードを整理したり、ちょろりコーディングしたり。
遅めに帰着。
美人時計が急に動かなくなったので調べてみると画像のURLが変わった模様。
そんな訳で対応版を置いてみます
(bijin-tokei-150224.tar.xz)。
ちょろり実験コーディング。遅いと思っていたのはタイマー設定の加減問題
でした。間隔を短くすればまぁいけるかも。てか、いくらELISPでも
あれは遅すぎる。
具合が悪くて早めに帰着。
ちょろり実験コーディング。こんなもんなのか?
昼前起床。
掃除したり。
display-buffer-functionを定義する話。TANEの使う範囲では、まぁこれで
いけるかな?という感じになったので貼り付けてみます。
(setq display-buffer-windowsP-ignore-buffers (list "*bijin-tokei*" "*wclock*" "*Calendar*" "*emneko*")) (setq display-buffer-function (lambda (buffer inhibit-same-window) (let* (window) (unless (buffer-live-p buffer) (error "Invalid buffer")) (let (considerwlist) (dolist (win (window-list)) (let ((ignmatch nil)) (dolist (ignbuf display-buffer-windowsP-ignore-buffers) (if (string= (format "%s" (window-buffer win)) ignbuf) (setq ignmatch t)) ) (if (not ignmatch) (setq considerwlist (append considerwlist (list win)))) )) (if (<= (length considerwlist) 1) (setq window (split-window)) (progn (let ((bufwin (get-buffer-window buffer))) (if bufwin (setq window bufwin) (setq window (car (cdr considerwlist))) )) )) (window--display-buffer (window-normalize-buffer-to-switch-to buffer) window nil) window) )))
AM中に起床。風邪気味継続。
そういや本日からTokyoDemoFestが始まっているなと思ったのですが、
ライブ配信は無いっぽい。残念。
この前、Emacsでガジェット類のウインドウを選択しない
ようにするELISPを作ってみたのですが、例えば(switch-to-buffer-other-window)で新しい
バッファとウインドウを生成された場合は、容赦無くレイアウトを崩されます。
例えば、翻訳ELISPなどでウインドウをポップアップするような場合は毎回崩される
ので、予め翻訳ウインドウを出しておくとかしなくてはなりません。で、面倒臭い
のでなんとかならないかと調べたり。
どうやら display-buffer-function にrambda式を定義しておけば、
ウインドウの出し方をオーバーライドできるという事で弄ってみたり。
それっぽくなった気がするものの、ちょっとイマイチな所もあったりして
うーむな感じ。
遅めに帰着。風邪気味。
gdcの4.9.x向け
最新版(2feea3f603)をCygwinでMinGW(i686)クロスビルドしてみたり。
pragma文でコンパイルエラーするようになったのですが、コメントアウトで
対応。i686-pc-mingw32向けの対応をいくつか入れればビルドに成功し、
簡単なテストコードのコンパイルはできたのですが、
特定のコードでSegfaultになる問題はそのまま。
そういやgdcバイナリが用意されるかな?と思っていたのですが
その気配は今の所無さそう。
遅めに帰着。
先日、随分前に録画してあったEテレの番組を録画消化しました。
漫画家の浦沢直樹氏がプレゼンターとなって、マンガの制作現場を
撮影した番組です(参考)。
人によって描き方も様々で大変面白かったです。
早くも無く遅くもなく。
Web巡回したり録画を消化してたらあまりの眠さに急速停止。
遅めに帰着。
Web巡回して終了。
そういやxzで圧縮をした際にやけに縮むなぁ?と思って不思議に思った
データがあったので、ちょっとだけ実験。xzで圧縮したgccのアーカイブを
圧縮があまり効かないデータ列として用いて、以下のようなデータを
作ってみたり。
$ ls -l 合計 65224 -rw-r--r-- 1 TANE None 66787292 11月 13 01:15 gcc-4.9.2.tar.xz $ cat gcc-4.9.2.tar.xz > bin1.bin $ cat gcc-4.9.2.tar.xz gcc-4.9.2.tar.xz > bin2.bin $ cat gcc-4.9.2.tar.xz gcc-4.9.2.tar.xz gcc-4.9.2.tar.xz > bin3.bin $ ls -l 合計 456560 -rw-r--r-- 1 TANE None 66787292 2月 18 00:29 bin1.bin -rw-r--r-- 1 TANE None 133574584 2月 18 00:30 bin2.bin -rw-r--r-- 1 TANE None 200361876 2月 18 00:30 bin3.bin -rw-r--r-- 1 TANE None 66787292 11月 13 01:15 gcc-4.9.2.tar.xz
$ xz -9 *.bin $ ls -l 合計 260936 -rw-r--r-- 1 TANE None 66790664 2月 18 00:29 bin1.bin.xz -rw-r--r-- 1 TANE None 66800580 2月 18 00:30 bin2.bin.xz -rw-r--r-- 1 TANE None 66810296 2月 18 00:30 bin3.bin.xz -rw-r--r-- 1 TANE None 66787292 11月 13 01:15 gcc-4.9.2.tar.xz
$ ls -l 合計 456624 -rw-r--r-- 1 TANE None 66797288 2月 18 00:29 bin1.bin.gz -rw-r--r-- 1 TANE None 133595182 2月 18 00:30 bin2.bin.gz -rw-r--r-- 1 TANE None 200393116 2月 18 00:30 bin3.bin.gz -rw-r--r-- 1 TANE None 66787292 11月 13 01:15 gcc-4.9.2.tar.xz
遅めに帰着。
Emacsと言えば「Cntlキー+なんとか」に色々バインドされていて、
左手小指を痛める事を「Emacs小指」なんて言う事があります。
でもよく思い出してみますに、別にEmacsに限らずbashやtcshのような
シェルのコマンドライン編集でも Cntlキー+なんとか って結構
使うよなぁ?と思ったり。
昼前起床。
掃除したり。
先日放流したばかりのELISPで、直したいけど直し方が判らなかった所を
調べてみたところ、単純な方法で直せる事が判ったので直してみたり。
そんな訳で細かい所をちょっとだけ直したバージョンを放流してみます
(bijin-tokei-150215.tar.xz ,
emneko-20150215.tar.xz)。
Emacsのcalender.elが3ヶ月分を表示する件。1ヶ月分だけを表示する関数を
固定値で3回実行しているだけだったので、ここをカスタマイズできるように
すればいいんじゃね?と思いちょっとだけ弄ってみたのですが、
表示よりもキーボード操作の方が妙な事になってしまってて、ちょこっと
手を入れて直せる感じではなかったり。また、日本の休日を表示する為の
japanese-holidays.elも3ヶ月分表示に合わせたコードになっているようで、
こりゃダメだという感じ。
japanese-holidays.elを少し弄ってみたり。mapcarという関数を使って
いるのですが、コンパイルすると「mapcarは古いからmapcかdolistを使え」
といった旨のWarningメッセージが出るのでmapcに書き換えてみたり。
所が、書き換えると休日マークがおかしな感じになったり。おかしな事になる
mapcar箇所は特定できたのですが、なぜおかしな事になるのかは判らず。
昼前起床。
もそもそとコーディング。結局最後は力ずくになってしまった。
そんな訳で放流してみます(emneko-20150214.tar.xz)。
有名なNeko(参考Wikipedia)
を表示するELISPです。本当はカーソルを追いかけるものなのですが、
ELISP力が低いので単にウインドウ枠内を勝手に動くだけのものに
なってしまいました(^^;
最初はひとまず乱数で適当に動かしてみたのですが、あまりにも挙動が
不自然だったので、自然な感じに動かせないかと思った結果がコレdeath。
LISPって人口知能(AI)の研究とかで使われると言われますが、そういうのと
なんの関係も無い人(==私)が作るとこんな感じになるという例です(^^;
走ると疲れるとか爪が伸びるとかの パラメータを定義して、
状況と乱数で動きを決定しているという感じです。AIのスゴイ人が
書くともっとかっこいいコードになるのかしら?
ついでに美人時計ELISPのアップデート版も放流してみます
(bijin-tokei-150214.tar.xz)。
emacs-deferred
を使用するようになったので、パッケージインストール等でdeferredを
インストールしてください。ファイル識別等の都合上アーカイブやソースコード内に
バージョンとして日付を付加するようにしましたが、コードは御自分の都合に
合わなければ自由にいじってもらって構いません。
次のような感じで無理矢理使ってみています(^^;
カレンダーが必ず3ヶ月分を表示するので、ウインドウ幅が狭いと
表示的にイマイチです。1ヶ月分だけ表示できればなぁ?と思ったりも。
そういえばその昔、未沙ちゃんファイルという画像フォーマットがありました。
元々はnekoと同じくMS-DOS上の常駐ソフトで表示するものだったようですが、
MS-Windows3.0やX68kのSX-WINDOWやUNIXのX-Windowなんかにも表示アプリが移植
されていました。ところが、Webで検索してみると全くと言っていいほど引っかからず、
あれぇ?な感じだったり。
遅めに帰着。
ぽにょの最後の方だけ見たり。
もそもそとコーディング。なんとなく形が出来てきた感じ。
遅めに帰着。
ちょろりコーディング。構造をあーでもないこーでもないと
こねくりながらコーディングする感じでイマイチ捗らず。
AM中に起床。
Webを検索していたら ELISPで非同期処理を扱う
emacs-deferred
というパッケージの存在を知ったり。
因みに作者様は
Calfwや
E2WMなど
を開発されているkiwanamiさんです。
さておき、先日非同期に画像取得するように変えてみた美人時計のELISP
ですが、画像データの取得を非同期化しただけでは、イマイチ非同期感を
感じられませんでした。deferredを使ったところ急に非同期感を感じられる
ようになった気がしたり。すげぇ。
いくつかELISPコードを見ていて
run-with-timerという関数と run-at-timeという関数がある
のに気づいたのですが違いって何?と思ったり。Webで検索してみると
run-at-timeの説明は出てくるのですが、run-with-timerの方は出てきません。
一方、使っている例は run-with-timerの方が多く出てきます。謎。
昼間のTV番組がつまらなかったので光TVの番組表を見ていたところ、
「Catoon Network」というチャンネルで トムとジェリーの10時間連続放送をやって
いるのに気づいたり。懐かしくてBGVで観てみたのですが、最後に観た記憶から
30年以上経っているのに、何故かどれも観たことあるのを覚えていたり。
セルアニメなので映像的には古い感じですが、動きは今見てもキレキレなのが
スゲェと思います。
もそもそとコーディング。構造に少し悩んだり。
遅めに帰着。
あまりの眠さに急速停止。
遅めに帰着。
もそもそとコーディング。
昼過ぎ起床。
掃除したり。
美人時計ELISPを非同期で画像取得するように書き換えてみたり。
作りがなんだかイマイチになってしまった割に、すぐにデータ取得できるから
あんま非同期感が無いように思ったり。
そういや時計のような単に表示しておくだけのガジェットの類を、一つの
バッファとして表示するようなELISPってあまり無いような?
と改めて思ってみたり。いくつか理由を考えてみたり。
起きたら午後もいい時間。寝すぎ。
もそもそとELISPコーディング。なんとなく思っている感じのものになった
ような気がしたり。少し実戦投入して様子を見てみよう。
所で、ELISPのリスト操作にpushとappendの二つの操作があります。
pushはリストの先頭に指定した要素を追加するというもので、appendは
リストの末尾にリストを追加するとうものです。pushは
「(push bar foolist)」で foolistが更新されるのに対し、
appendは連結したリストを返す為、元のリストは更新されず
「(setq foolist (append foolist (list bar)))」てな感じで
setqを使用する必要があります。これにしばらく気づかず、
appendが機能してないなぁ?というのに悩まされました(^^;
修行が足りません。
テストしてみたものの、Ediffの様に激しくウインドウレイアウトを
変えてしまうものに対してどうしようも無い感じだったので、ウインドウの
位置を記録&リストアするようなELISPが無いかと調べてみたり。
こちらの
windolws.elというELISPがやりたい事に近い感じなのですが、
仮想ウインドウマネージャーのような動きになっていて、単にウインドウの
位置を覚えるという以上の事をやっているのがちょっと違う感じかなと
思ったり。個人的には本当に単純に「再描画(C-l)」感覚でウインドウ位置を
戻せれば良いだけなのですが。
もう少し調べてみたら、
current-window-configurationとset-window-configuration
を使えば簡単にウインドウレイアウトのセーブ/リストアができることが判ったり。
以下のような感じでキーバインドすれば良さげ。
(global-set-key "\C-t\C-s" '(lambda () "" (interactive) (message "Save window configuration") (setq window-config (current-window-configuration)))) (global-set-key "\C-t\C-l" '(lambda () "" (interactive) (message "Restore window configuration") (set-window-configuration window-config)))
(require 'window-plus) (global-set-key "\eo" 'other-window) (global-set-key "\C-xo" 'other-window+) (global-set-key "\e0" 'delete-window) (global-set-key "\C-x0" 'delete-window+) (global-set-key "\e1" 'delete-other-windows) (global-set-key "\C-x1" 'delete-other-windows+) (setq delete-other-windowsP-ignore-buffers (list "*bijin-tokei*" "*wclock*" "*Calendar*")) (setq other-windowP-ignore-buffers (list "*bijin-tokei*" "*wclock*" "*Calendar*")) (setq delete-windowP-ignore-buffers (list "*bijin-tokei*" "*wclock*" "*Calendar*"))
遅めに帰着。
あまりの眠さに急速停止。
遅めに帰着。雪は積もってなかったり。
もそもそとELISPコーディング。
早くも無く遅くも無く。
Emacsと言えばウインドウ分割して一つのバッファのあっちとこっちを同時に
見たり、二つのバッファを並べて表示したりする訳ですが、そうすると
ウインドウ切り替え操作や分割をやめる操作は必須です。
で、先日の美人時計ですが、表示したは良いものの
delete-other-windowsやother-window といったウインドウ操作の対象になる為、
ウインドウ分割操作を多用すると邪魔になったり直ぐに非表示になり
イマイチ役に立ちません。
そんな訳で、固定表示の為にある特定のバッファをウインドウ操作対象から
外す事ができないかと調べたり。
なんとなく ignore-window-parametersという変数を設定すれば
できそうな予感がしたのですが、具体的な例が無く 試しても思った
反応をしなかったので、delete-other-windowsを改造できなかと
ELISPソースを眺めてみたり。結論から言うとdelete-other-windowsの実体は
組み込み関数となっていて参考にならず。
結局、似たような動きをするELISPを再発明する感じになってしまったり。
慣れてないので値を観察しながら試すという感じですが、
思いのものはまだ得られず。
遅めに帰着。
Webを検索していたら、
こちらの
ブログエントリで
美人時計のEmacsLISPを
作ったという記事を知ったり。Webからの画像ファイル取得から
表示までELISPだけで書かれています。しかしながら表示サイズを
小さくできないのはなんとかできないかなぁ?と思い、
ウインドウサイズにフィットするように外部コマンドを使ってみる
ように勝手に改造してみたり。画像のスケーリングには
image+.el
のコードを一部拝借しました。そんな訳でImageMagickが必要です。
ちょっとバグっていたようなので
(1時間弱ほどでundo上限に達した旨のメッセージが出る、他)、ちょろっと
直してみたり、ジャンルをシャッフルするとか、どうでも良い感じの
機能を付けてみたりして遊ばせていただきました。
そんな訳で置いておきます(bijin-tokei.el.xz)。
ほぼ流用コードなので特に主張するものはありません。バージョン管理
などはしてませんので、バグってたら勝手に直してみてください。
遅めに帰着。
ちょろり実験。
AM中に起床。
掃除したり。選択したり。
本家gdcにMinGW対応と思われるアップデートがマージされ始めている予感。
今の所、コンパイル時にエラーになる部分を直している模様。実際に使う
段階で問題になる部分はこれからという感じ?ただし、x86_64対応を先に見ている
のだとするとi686対応はもう少し後になるかも?
もそもそと調べ事。
グラディウス。全然伸びず。弾詰まりや撃ち負けした時の
対応がボロボロ。また、最弱装備からの復活時と、たまたまフル装備で
通過する時とで敵弾のバラ撒き密度が違い過ぎるものですから、
フル装備時パターンがうまく掴めなかったり。上上下下.....は使えない
のでフル装備通過の練習は当然できず(^^;