2013/08/29

OKWave

何か分かんないことがあってGoogle検索するとOKWaveとその提携質問サイトが上位に来ることが多い。しかも同じQAの別サイト版として複数出てくる。これが邪魔だったりするんだが、、
そのQAサイトにはプログラム系のカテゴリもあるので、ふと思いついてユーザ登録し、回答してみた。

 さて質問3つほどに回答してみて、3つとも放置されている お礼が2件来たよ!
「困ってます」「○○する方法知りませんか?」などと書き込んでおいてそれに対する回答やアドバイスがあっても無視ですか…(遅れてお礼が来たよ)
他の質問のページではお礼、補足などがあたり前のようにあるからそういうもんだと思ってたが、3人に無視されてさすがに意気消沈し、「OKWave、放置」で検索すると同様の経験をした人も多いようだ。気になって幾つか覗いてみると他の質問ページでも質問放置はかなり多かった…
 何度か海外製のライブラリやソフトウェアのコミュニティに質問を投稿して回答を貰ったことがあるが、プアな英語の質問に対して「お前の言うことはよく分からんがこうしてみたらどうか」的なレスポンスがあり、なんとか解決できた時には大急ぎでお礼を書込んだもんだ。
解決したとか、諦めたとか、そういう意味じゃないとかさ、質問して回答があったんだからその後の経過くらい書くのが常識じゃないか。

しかし考えてみるとその思い付きのおかげで全く触ったことのないものに触ることが出来た。HTAとVBScriptでブラウザをインターフェースにしてバッチファイルを起動したりするものを作ったり、C#を使ったWebアプリを作ってみたり、久々にJava Appletを触ったりできたのでまぁ気分的にはプラマイ0かなぁ。

お礼が2つ来た。
解決したようで良かった。

2013/08/28

5分ごとにベルを鳴らして

 「1から10まで足してくれ」という作業は比較的簡単にプログラムで書いてコンピュータにやってもらうことが出来るけど、「5分ごとにベルを鳴らして」ってのは簡単な作業だけどコンピュータでも分かるように書くのは??

 簡単そうだけど、、まず現在の時間を記録して、無限ループに入り、「もし、5分過ぎてたら、ベルを鳴らす」というプログラムを書きそうじゃない?それではCPUがホットプレートみたくなっちゃう。ぶっちゃけプログラムとしては間違ってないと思うがコンピュータはまじめすぎるので、こう書くと5分過ぎるまで1秒間に何千万回(最新のCPUならもっともっとたくさん)も時間をチェックしようとしてパンクしちゃう。
 正しくは無限ループの中で「もし、5分過ぎてたらベルを鳴らす、んで、まぁ、5分たってなかったら1秒くらい休んでていいよ、どうせ5分1秒でも誰も気にしないし」と教えてやんないとダメ。これは「無限ループにはsleep(休憩)が必要」って知ってるのと「5分ごとにベルを鳴らす」のに加えて「5分1秒でも良い」と決めないといけないことだ。「ずれて良いのは100分の1秒まで」ってんなら「100分の1秒だけ休んでいい」に変わるだけだ。てかね「5分ごとにベルを鳴らして」っていう課題に対して「5分1秒でも良いですか?」なんて聞くのは馬鹿げてるよね(どうせ研究発表のベル鳴らしとかを自動でやりたかっただけでしょ)。だからプログラマが勝手に仕様書に無い仕様を作りこんじゃうんだよね。で出来上がったものを見せて「ベルの間隔が1秒ずれるんだけど!」って怒られるんだよね。実は「100分の1秒だけ休んでいい」に変えてもそんなに変わんないし、、、この場合、コンピュータに楽をさせようと1秒も休ませちゃったプログラマが悪いってことになりがちだし。。でもプログラマはなぜかコンピュータに楽させようと考えるんだよね。その方が効率的で速いプログラムってことだからね。ほんとは「誤差100分の1秒まで」ってのを要求に入れなかったのも悪いんだよ。そうすりゃプログラマはコンピュータに楽させつつ誤差100分の1秒のプログラムを考える分けだ。つまり、「5分までまだまだある」なら「1秒くらい休んで良いよ(5秒くらい休ませても良いかもしれない)」で「もうすぐ5分だ」となったら100分の1秒に1回のペースでチェックさせるんだ。実は人間も無意識にこうやってるよね(きっと)。これは「1秒休む」のに比べたら複雑なプログラムだけどね。

(この問題、いきなり300秒休んでからベルを鳴らす、にしたらどうなるんだろう?多分、sleepっていう関数はあまり正確じゃないんで、コンピュータの時間を取得するAPIを使った方が正確に5分測れるって感じだと思う。もちろんコンピュータの時計以上に正確ではないけど。)
(「1から10まで足す」というのはプログラム的には普通はfor文使って書くけど、「((1+10)*10)/2」という公式があるよね。
こういう最適化するとプログラムが柔軟じゃなくなっちゃうけど、こういうことが出来るって覚えておくのは悪くない。)

VC++版、5分ごとに「Bell.mp3」を鳴らすプログラム。mciSendStringって面白いね。プログラムの中でコマンド叩いてるみたい。
#include <tchar.h>
#include <windows.h>
#include <mmsystem.h>
 
int _tmain(int argc, _TCHAR* argv[])
{
   mciSendString(L"stop all"NULL, 0, NULL);
   DWORD startT = GetTickCount();
 
   while(true) {
      DWORD currentT = GetTickCount();
      if(currentT - startT >= 300000){
         mciSendString(L"open Bell.mp3 type mpegvideo alias Bell",
            NULL, 0, NULL);
         mciSendString(L"play Bell from 0"NULL, 0, NULL);
         startT = currentT;
      }
      Sleep(1000);
   }
 
   mciSendString(L"close Bell"NULL, 0, NULL);
   return 0;
}
startT と currentTの差によってSleep間隔を調整する、なんてしないでも十分。

2013/08/27

Watch

腕時計について
革バンドの渋いやつを付けたところかぶれてしまって付けられなくなった。(かぶれるって漢字が無い?)

それ以来付けるのは貰い物のチタンバンドのやつになった。
高くも安くもないと思う値段だが、チタン製で軽く、電波時計で狂わない上にアナログ+デジタル表示で見やすく、ソーラー充電で電池切れも無い。

どう考えても腕時計としてはこれ以上無いようなやつだ…
デザインは好みがあるだろうが変な主張をしないので見慣れてくると良くなってくる

細かい型番は忘れたが確かこれ系のやつ↓
CASIO LINEAGE LCW-M100TD-1AJF
難点は若干風防に傷が付きやすいかな?特に強いガラスって訳じゃなさそうだ。

2013/08/26

Excelごときで…

エクセルで空白セルに対して数値計算の関数を通すと0扱いです。
例えば四捨五入したい場合、
=ROUND(E13,15)
これはE13のセルを15ケタで四捨五入(?)する命令なわけですが、E13のセルが空白の場合0になります。
でもほんとは、0なら0、空白セルなら空白セル、と出力して欲しい気がします(そうでもない?)。
そこで、
=IF(ISBLANK(E13),  "",  ROUND(E13,15))
とするとE13が空白なら空白、それ以外なら計算。

さらにE13が空白でなく文字列だった場合やエラー値だった場合、出力はエラーになるが、用途によってはエラーでも空白で出力してしまいたい、と思ったり思わなかったり。

これが案外難しくて、試行錯誤中。
=IF(OR(ISBLANK(E13) , ISERR(E13) , NOT(ISNUMBER(E13)), "", ROUND(E13,15)
とかなんとかだと思うけどこれを1セルに書込むと見辛いし、もう混乱して正しく動いてるのか意味不

ちょっと嵌ったのはROUND関数で13桁で四捨五入しても、標準だと表示桁数は変わらず10桁しかないってこと。何となく13桁で四捨五入したんだから13桁表示してるんじゃないかと勝手に思ってた。実際数えてみると10桁しかないのでセルの書式を変えて数値、小数点以下15桁表示、にした。これに気が付かないと「なんで表示は同じなのに比較演算すると違うって出るんだろ~」って何日も数値の羅列を凝視しながら考える羽目に…

2013/08/22

eel

お盆は久しぶりにお家に帰ってました。
北海道は涼しいはずなのに暑く感じたのは実家のエアコンが弱いせいでしょうか。北海道は冬はストーブオンリーでエアコンは使いません。たぶん室外機が凍りついてて無理に動かすと壊れると思います。なのでどうせ冷房にしか使わない→そんなに良いやつじゃなくていい。な感じになってると思います。
さて、
あれだけ批判したのに鰻食べてしまいましたなぁ。
鰻を食わしてやるのが子孝行だと思っているんでしょうか。
一応「絶滅危惧種だし…」と言ってみたんですが「食べれなくなる前に食べる」という例の理論です。
これで僕は年に2度ほど鰻を食べていることになるのですが、4人家族で年に2回、鰻は1匹で2人分くらいあるんでしょうか。つまり4人家族で年に4匹ほど?
このペースなら絶滅しないと思いましたが。。

ウナギについてちょっと計算してみました。だいたいこんな数字かな~とは思いますが間違ってても責任取れません。

ピーク時16万トン(2000年頃)
人口1億3千万
年間一人で1200g(6匹 (ウナギを200gとして))

現在3万7千トン
年間一人で280g(1.4匹)

うな重換算ではピーク時年間5~6回
現在は年1~2回
て感じ?

16万トンとかの数値は消費量ではなく国内に出回った量だそうですがまぁ消費量と考えても大きく違わないはずです。

2013/08/19

Destroy (・∀・)

休みが長かったせいで頭がだるい。気持ちが沈んでいる。こんなときは面白そうな作業、簡単そうな作業、から手を付けて慣らすのが良いでしょう。
というわけでrailsアプリの修理。

railsアプリで登録したデータを削除するボタンがDestroyという名前。
デストロイという物騒な名前は如何なもんかと思ったが、scaffoldで作った時のデフォルトらしい。

その削除ボタンは滅多に押さなかったし、まさか動いてないとはしばらく気が付かなかった。で直そうと思ったらなかなか直らない、というか削除の仕組みがよく分からない。
controllerにはdestroyというメソッドで作ってあるのにリンクのところにはdeleteとなっているじゃん。リンク先のアドレスは表示用と同じアドレスだし、なにがどうなって動いてるのかさっぱり。

やっと分かったことはjquery.js、jquety_ujs.js、を読込んでないとデストロイが効かないということのようだ。

これらを配置すれば対処療法的に解決はするが、そもそもの原因はjavascriptの管理がassetとかいう訳分かんないのに変わってて訳分かんなかったので無視してたってこと、
とprototypeで作ってて「jquery...まぁいらねぇかなぁ」となったことだろうか。
別にJQueryが嫌いではないけどPrototype、ExtJS、は使ったことがあって、たまたまjqueryとは縁が無かったんで。jsライブラリにはそれぞれに特長があるだろうけど余程のことをするんでなければ、どれか一つだけを深く知ってた方が良いと思う(根拠は無いけど)。

まぁそれはそれとして、assetが本気でよく分かんないので、とりあえず静的配置で直しつつ、ちょっと真剣にasset使ったテストプロジェクト作って試さないとダメな感じ。

2013/08/09

scarecrow

スケアクロウ
日本語訳はカカシ(カラスを除けるあれ)
ロードムービーということで見てみたが、アメリカンなノリについていけなかった。
何をそんなに騒いでるんだろうと。
あとこういう喧嘩っ早い男はダメだと思う。常識的に考えて。
まぁそれは置いといても、正直結末の意味が分かんなかった。
もうちょっと最期まで描いてくれないとダメなんじゃないかと。引き込まれて見ている人はあれで分かるのかもしれないけど、終わり近くなっても興味を持てなかった人はあれで完全に放り出されてしまう。ていうかあらすじを先に見てたから良いものの、最初も唐突過ぎて意味分からなかった。
1から10までの4,5,6くらいを見せられた気分。
これじゃ好き嫌い割れるだろうなーと思ったら意外と高評価な映画らしい。

2013/08/01

HTMLのSelectタグやInputタグのRadioボタンをReadOnlyにする方法

チェックボックスをリードオンリーにする方法を調べていたとき、実はコンボボックス(Selectタグ)をリードオンリーにする方法も同時に調べていて、挫折した。
でも案外簡単。
必要な部分以外を削ったソースはこんな感じ
<select>
  <option disabled=""></option>
  <option disabled=""></option>
  <option selected="">オランウータン</option>
  <option disabled="">うさぎ</option>
</select>
で結果が こうなる。
SelectタグもReadonly属性では無理なので散々迷ったが実際なんのことない、selected属性を付けたoption以外はdisableにするだけ(実は選択可能なオプションが1つだけなのでselected=""は無くても同じだが有った方が分かりやすいでしょ)。
selectタグはdisableじゃないのでちゃんと見えるしフォーム送信も出来る。で変更することは出来ない。
こうすると以前はブラウザによって見た目に違和感があったが、最近の表示では違和感なく有効なセレクトボックスに見えるだろう。
もし見た目に何か強調したいなら、selectタグに「style="background-color: #cccccc;"」など設定することもできる( こうなる)。

Selectタグに関してもう一つ、Select内のリストに絞込み検索をする方法を書きました。 
 
ちなみに、他をDisableにして選択している一つだけを有効にする、というのはRadioでも使えます。というわけでRadioButtonを読み取り専用にする方法(こっちはdisabled="" の代わりに onclick="return false;" でも効くかもしれない)。
<label><input type="radio" name="animals" disabled="" />犬</label><br/>  
<label><input type="radio" name="animals" disabled="" />猫</label><br/>  
<label><input type="radio" name="animals" checked="" />オランウータン</label><br/>   
これで表示すると、こう↓
あなたの好きな動物は?



オランウータン以外選択できません。

ソースは簡単なんだけどPHPやRailsでHTMLを吐かせる時に、選択するものにchecked、それ以外にdisabledを付けるってのが意外と厄介かも。