libAlexandrina.so.octopress

IEEE 754 の Double しかない世界と反省

| Comments

普通のプログラマであれば、整数で値を決めたい場合、浮動小数点演算を使いることはない。x30%といわれれば x * 0.3 とせず(精度指定文字リテラルは省く & 小数以下は切り捨てるとして) x * 30 / 100 としたりして、とにかくなるべく使わない。

しかし 今回 AngularJS の入力フォームからパーセントな値を受け取った(バリデータも使えるし、htmlのstep属性とかも使えて便利だしね)ら、 JavaScript は IEEE 754 の double しかない世界である。

IEEE 754 - Wikipedia

Chrome のデバッグコンソールを出して以下を実行すればすぐ試せる。

1
2
> 1/0.7
< 1.4285714285714286

こ、、、こんな精度いるぅ? 言われてみると俺の愛する C++ は精度指定なし小数点付き数字は精度 double だった。そして Java もそうである。最近は Java をやっててたまたまIDE開いていたのでそれで試す。

1
2
System.out.println(1.0/0.7);
// -> 1.4285714285714286    

つらい。どれぐらいつらいかというとこのぐらいのつらさであった

1
2
3
4
5
> 16.40*100
< 1639.9999999999998

> Math.floor(16.40*100)
< 1639

16.40 を 100倍して小数以下切り捨てたら 1639! IEEE 754 だとそうだっつーのか! マジかよ! 信じない! Java 先生にお伺いをたててやる!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
System.out.println(16.40D*100);
// -> 1639.9999999999998

System.out.println(16.40D*100D);
// -> 1639.9999999999998

System.out.println(16.40D*100F);
// -> 1639.9999999999998

System.out.println(16.40F*100);
// -> 1640.0

System.out.println(16.40F*100D);
// -> 1639.9999618530273

System.out.println(16.40F*100F);
// -> 1640.0

// DやFを省略すると D(double)扱いになるので指定なしは省略

やはり IEEE 754 の double の世界ではこれが正しいらしい。ちなみに以下のような有様である。

1
2
3
4
5
6
System.out.println(16.40 *      1);  // ->      16.4 
System.out.println(16.40 *     10);  // ->     164.0 
System.out.println(16.40 *    100);  // ->    1639.9999999999998 
System.out.println(16.40 *   1000);  // ->   16400.0 
System.out.println(16.40 *  10000);  // ->  164000.0 
System.out.println(16.40 * 100000);  // -> 1639999.9999999998 

今回得た教訓は

  • JavaScript はどうがんばっても Number とは IEEE 754 double であり、それしかない世界である
  • Excel から計算の移植は楽勝だと思ったが、小数絡んだ計算をするととたんに大変になる
    • 単純な計算といっても小数の精度は調査すること
    • 大変じゃなくなるようなライブラリをちゃんと知っておくこと
  • LibreOffice と Microsoft Excel では日付計算周りが値が違うことがある
    • OneDrive でちゃんと確認せよ
    • これも日付計算ライブラリをちゃんと知っておくこと

Qiitaに書くべきだったかな?

ブレース2つってJekyllで処理されてしまうん?

| Comments

ブレース2つ、全角で書くと {{ をコードブロックに入れたかったんだけどなぜか非表示。

1
<li ng-repeat="r in getRecords()">    </li>
1
<li ng-repeat="r in getRecords()"> {{r["k1"]}} {{r["k2"]}} {{r["k3"]}} </li>

をやりたかったんだ。ああ、LiquidとかJekyllとかかな? 全角で書くと raw プラグインを使って {% raw %}{% endraw %} を使ってエスケープするしかないのかな?

AngularJS久しぶりにやる

| Comments

1.x系。2系とか React はちょっとまだ手を出せていないのでいったんこれで。

カスタムバリデータ実装

昔は結構苦労したつもりが最近の1系は簡単に実装できるようだ。

AngularJS: Developer Guide: Forms

Custom Validation を読めばかんたんにできる。ていうかやりたいことがそのままサンプルとして乗ってる。ていうか、これぐらいのバリデータはデフォで用意してくれよ〜。頼むよ〜。

ng-if で実行しないようにするとデータに影響

ng-ifng-showng-hide かをちゃんと正しく使わないといけないね。という話。

ていうか、作り的に

  • *.html が View
  • *.js が Model とか Controller

というつもりで作ると考えてるのに *.html の書き方次第でシーケンスが代わってデータに影響あるなんてあきらかに俺の実装が悪いんだろうなー。

直接ハッシュをかえすと ng-repeat エラー

ちょっとこれは理由がわからん。ビューはこれ。

1
<li ng-repeat="r in getRecords()"> {{r["k1"]}} {{r["k2"]}} {{r["k3"]}} </li>

NGパターン

1
2
3
4
5
6
function getRecords() {
    return [
        {"k1":  "v1", "k2":  "v2", "k3":  "v3"},
        {"k1": "v11", "k2": "v22", "k3": "v33"}
    ];
};

OKパターン

1
2
3
4
5
6
7
8
var records = [
    {"k1":  "v1", "k2":  "v2", "k3":  "v3"},
    {"k1": "v11", "k2": "v22", "k3": "v33"},
];

function getRecords() {
    return records;
};

何が違うんだ?

でかいハッシュをかえしてもエラーる

でかいハッシュをかえすようにして、 ng-repeat でまわすと謎死。まず関数実装はこれ

1
2
3
4
5
6
7
8
9
10
11
var records = [
    {"k1": "v1", "k2": "v2", "k3": "v3"},
    {"k1": "v1", "k2": "v2", "k3": "v3"},
    {"k1": "v1", "k2": "v2", "k3": "v3"},
    {"k1": "v1", "k2": "v2", "k3": "v3"},
    // ... とたくさん
];

function getRecords() {
    return records;
};

エラーメッセージは rootscope infdig apply digest 〜 でデバッグログが埋め尽くされるほどで、まったくピンとこない感じ。

ググるとこれに出会った人はまるでおまじないのようないろいろをやっている模様。まぁデバッグログがうめつくされているのをみると、たぶん、ビューに返しているデータがでかすぎるとおかしいことになってるんじゃないかと予想。メモリが足りないとか、パラメータに食えないとか。

結局まとめてドーンと渡さず、アクセサを作ってそれを用いればなんとかなった

1
2
3
4
5
6
7
8
9
10
11
12
13
var records = [];

function fetchRecords() {
    records = [
        {"k1": "v1", "k2": "v2", "k3": "v3"},
        {"k1": "v1", "k2": "v2", "k3": "v3"},
        {"k1": "v1", "k2": "v2", "k3": "v3"},
        {"k1": "v1", "k2": "v2", "k3": "v3"},
        // .... とたくさん
    ];
};

function getRecord(index) { return records[index]; };

こんな感じ。数字を指定してループするのがイマイチピンとこなかったんだが、なんだか track by っていうのあるらしい。もうちょっとこのあたり読み込まないとな。

AngularJS: API: ngRepeat

VisualStudioCode for macOS

素晴らしい。何にもカスタムなしで JavaScript + HTML サクサクかけるよ。マジオススメ。

昼食をアウトソーシングした

| Comments

最近は完全に自宅に引きこもって仕事をし、朝・昼・夜と、Amazonで業務用キューピーのパスタソースと日清カレーメシを延々ループする日々を続けている。カレーメシは1個200円を切っていたら定期的に補充するようにし、ループに加えている。

どれもとっても美味しい! ベーコンやソーセージを刻んで入れたり、みじん切りニンニクを足したり、黒胡椒をマシマシたりして食している。

だとしてもやっぱり、飽きるものは飽きるし、何より明らかに血糖値が限界突破だ! 1食100gは越えないようにはしているが。

そして加えて「買い物好きには買いだめは全くオトクにならない」という重大な原則がある。新しいものを買ってみたくなるので、買いだめたものが消費されないのだ。

こういろいろ考えると要件として

  • 私が考えなくてもバラエティあふれるように
    • (高校時代はお弁当でした。「ありがとう、かあちゃん」と普段思ってることを再報告)
  • 献立、バランスも考えたくない
  • 充分に安い(500円は越えたくない、本当は300円以下ぐらいがいいんだが)
  • 家から一歩も出ない
  • 調理すらしたくない(お湯を注ぐ、レンチンする、調味料を入れるぐらいに抑えたい)
  • 残飯も処理したくない
  • 洗い物もほぼしなくていい
  • 摂取する炭水化物量を抑える

が並んだので、「オフィス弁当を我が家に宅配していもらうのがいいのではないか?」との結論にいたり、結局「ジョワの樹」さんにお願いすることになった。

ここは前お世話になっていたオフィス弁当の「ジョイフル」さんと同じ系列らしい。分岐点がよくわからない(たぶん、宅配ルートであろう)が、オフィス弁当はNGで、一般向けの宅配弁当ということになった。

ライスなし、450円で一発目がコレ。うーん。素晴らしいやんけ。

ビックリするが「メニューがない」らしい。なんで? わしの楽しみにしていたなんたらが、入ってない!!! とかでクレームになったり、内容見てキャンセルしたり、これは抜いてくれとか言われたりするからじゃないかなと予想。

この宅配弁当は、私の祖母や私のように「独居人」には死活線なサービスになると考える。ぜひ、機会があれば現場の人と少し話をしてみたいもんだ。

しかし、先日きた営業の人はとても現場と離れてる感じがしたが…。新聞の契約と同じ感じの業務体系なのかな? ここも含めてウォッチしたい。

『「他人のために頑張る人」がコミュニティにとって害悪である』と言われて気分悪くなって少し考える

| Comments

元ネタはコレ。

コミュニティが大きくなると必ず現れる「みんなのために何かしてあげようとしてくるやつ」 | RYUKEN OFFICIAL BLOG

言いたいことはよくわかるようで、よくわからないようで、それが単に俺が納得したくないだけなのか…といろいろあるが、とりま、思ったことを箇条書きにする。

  • いるわーこういう「仕事しろよ」っていいたくなるようなヤツ。
    • そもそもやりたいことをやりたいようにやりたいけど「〜に所属してる」とか「給与はでる」とかそういう権益は捨てられないんだよな
  • 害悪とは何か
    • コミュニティが本来の目標を達成しえない、目的を見失うということか
    • 誰でもウェルカムなコミュニティがそんな「目標を達成したり」「目的を見失わずにすむ」なんてことはあるのか
      • 絞ったら雰囲気悪くなる、人が集まらなくなる、、、わかるが、それはコミュニティを形成しないべきではないのか
        • ブラック企業が存続できてしまう理由とにてる気がする
  • そもそも成長とは何か
    • そもそもやはり人生観としてのゴール(= 成長)が違う人間がただ他人をディスってるだけじゃないのかこれは
  • 家族のためにがんばる、は他人のためか自分のためか
    • 家族のために奴隷状態になるということが社会制度として求められているのではないか
    • 嫁や子供のためにがんばるというのが害悪なのか
      • じゃあやっぱり家族は自分なのか
        • ファミリーが自分ならば、自分が所属しているコミュニティ、会社、地方は自分じゃないのか
          • その分岐点は何か
            • 気分か?
  • 多くを望まない人は成長しないというのか?
  • 18年勤めた会社を辞めた我が弟の人生観を再考
    • 「よい子」「いいやつ」をどう使うか、使われるか
    • 便利な子の寿命
  • サーバント型リーダー論
  • 費用対効果のいい「ありがとう」を集め続けて物事は成し遂げられるか
  • 「目の前のありがとう」なんて気にしない人を受け入れられるか
  • 物事の優先順位が付けられない人
  • 物事の優先順位の決定権は誰にあるのか
    • それが自分じゃない人
    • それが自分にあって
      • 成功してる人
        • 成功とは何か
      • 失敗している人
        • 失敗とは何か
  • 多くを望まない人と多くを望む人がコスト勝負したらどうなるのか
  • 多くを望まなければコスト勝負で勝てるハズ
    • 勝つ…というのは、普通「利益率の高い仕事が得られる」ではないか
    • それが「明日食べる食事を稼げれば、嫁も子供も車も家もいらぬ」という人間にとっては勝つ…とは明日の稼ぎを得られるということじゃないか。

まー、軽く書き出しただけでもこれぐらいあって、とてもこの「気分悪い感じ」を整理できぬ。ここでディスられてる人間に自分を投影しているからだと考える。

これを受け止め、以下のように解釈する。

「自分の目的は何か」ということが定まらずに組織に参加すると「我慢すること」「使われること」が仕事、唯一貢献できることになってしまい、結局どこでも辛くなってしまうから注意せよ。

(のあとに「そういうやつは相手にするな」と書いてあるのがトゲあるだけだよな。きっと、たぶん、おそらく、maybe。)

だいたいウツになったり、突然やる気でなくなったり、出社しなくなったり、って子は「こういうところあるよね」ってほんと思うわ。そういう人間もケアできるのが強い組織なんだろうけど、その組織に寄生するヤツとかほんといるよね。まー余裕( = キャッシュ)がなくなったらあっという間に弱い組織になってしまうのがツライ。

特に、こういった超真面目奉仕型人間ほど寄生しているのが許せなくなって、会社を辞めちゃったりするんだよな。潔癖なんだよ。

  • 「他人の寄生がゆるせないパターン」
  • 「俺が寄生してると思っちゃって脱出するパターン」
  • 「ある日突然俺はイイように使われてるだけじゃないかと気づいちゃったパターン」
  • 「奉仕ゲージが限界突破で燃え尽きた」

とかね。ほんと見るわ。せっかく会社員やってるならとことん寄生しろよ、不況のときぐらい、って思うんだけどなかなかね。会社としてもこういう子のほうが解雇するの楽だろうしね。

まーほんと組織(コミュニティ)って難しいね。私は完全に諦めてフリーランスやってるが。そもそも「他人はどうにもならない」という前提で生きるならば、組織論なんて論じてはいけないんじゃないかと考えるし、それを乗り越えて組織、会社をやってる方々、そこに所属している方々に尊敬の念を抱かざるをえない。

この「会社組織は何かを成し遂げるために必要である」と思え、会社を信じられる人と「会社組織なんて経営者や株主が、いかに安く労働者を使って利益をあげるかしか考えてない組織である」と思え、会社を信じられない人、の違いってどこからくるんだろうね? 教育? 殆どの場合は最初に接した会社組織次第って読みがあるんだがどうだろうか?

サラダドレッシングで「スモークチキン」と「いかくん」に挑戦中

| Comments

明日、スモークする予定。楽しみだ。これとは別にハチミツ味噌ベーコン・鶏、とベーコンを仕込んでいる。

サラダドレッシングスモークチキン

YouTube でバーベキューで即食べるようなグリルチキンの動画を見て、味付けを決めようと思ったら

  • サラダ油
  • 塩、コショウ、ニンニクなど

んん? これ完全にサラダドレッシングのレシピやん?

ちょうど冷凍庫に先日のBBQで余った鶏もも肉もある。胸肉は25円/100gで買ってきた。そしてワゴンセールでドレッシング売ってる。よし! 決行だ!

  • 胸肉2枚
  • もも肉2枚
  • 日清ドレッシングダイエット 香味しょうが 200ml
  • 日清ドレッシングダイエット あっさり和風 200ml

これに漬け込んでスモークチキン作ってみます!

ふぁらお加藤さん(@pharaohkj)が投稿した写真 -

以上をグリル、スモークする前日にジップロックにいれてモミモミし、漬け込んだ。あと肉2枚はいけるかも。贅沢な感じ。

いかくん

いかの燻製のソミュール液レシピをみており、「どうして市販のいかくんは酸っぱいのか? それはビネガーを使ってるからだ」という記述があり。んん? これは完全にノンオイルドレッシングのレシピやん?

そういうわけで

  • ロールいか(超でかい)
  • キユーピー ノンオイルゆずこしょう 150ml

以上をスモークする前日にジップロックにいれてモミモミし、漬け込んだ。

偏頭痛

| Comments

月曜日の朝にやらかした(このタイミングが一番多い)が、本日もやらかす。朝にかけて宗教儀礼があるんだが。

体調が悪いと書いたりなんだりは「俺寝てないわ〜寝てないわ〜」と同じでネタだよなと思いつつ、ご迷惑をおかけしてる方面もあって申し訳なし。

ちゃんと日記にメモることで周期など、わかっていいのかもしれぬ。偏頭痛管理アプリとかどうか。

OSunC2016金沢の反省会(仮

| Comments

まーやり方の反省点はあれど私の分はこんな感じ。

  • 思ったより集客できなかった
  • 思ったより展示が気合入っていたのでこっちもちゃんとしないと
  • 今回のをネタに冬は集客すればよさそう

という気持ち。特に展示についてはまた書く。とりま、カッコカリということで。

キーワード引数のバカっぽいコードと引数評価順序

| Comments

キーワード引数、名前付き引数(C# ではこう呼ぶらしく、英語では Named Arguments らしい)がなにやらいろんな言語で採用されるらしいが、私も Ruby 2系で「コレいいかもな」と思った仕組みである。

例えば、四角の面積を求める関数があったとして C++ ならば関数定義に int 面積(int width, int height); とし、呼び出し側では area = 面積(10, 30); としてあっても、どっちが幅( width )で、どっちが高さ( height )なのか区別がピンとこない。(サンプルが悪くてどっちでもいいじゃんてのは置いておいて)

これがキーワード引数だと、まぁちょっと仮想言語記述だが呼び出し時に

1
area = 面積(width: 10, height: 30);

とかけるので、ピンとくる。

キーワード引数なしでも似たようなことはできて、

1
2
3
4
width  = 10;
height = 30;

area = 面積(width, height);

とまぁ、キーワード引数なしでもとても読みやすく、書きやすく書ける。それにほとんどの場合は以下のように「どこかの関数」「メンバで持つ値」などを用いるので、これを小さいスコープの変数に取り込んだほうがコンパイラ最適化などもきいていい。

1
2
3
4
width  = GUI.InputValues['Width'].Text.toInt();
height = GUI.InputValues['Height'].Text.toInt();

area = 面積(width, height);

さて、これをキーワード引数で書くと

1
2
3
4
width  = GUI.InputValues['Width'].Text.toInt();
height = GUI.InputValues['Height'].Text.toInt();

area = 面積(width: width, height: height);

になってしまい、 width: width, height: height あたりがとてつもなくバカっぽい。かしこいフリをして以下のようにかく。

1
2
3
4
area = 面積(
    width:  GUI.InputValues['Width'].Text.toInt(),
    height: GUI.InputValues['Height'].Text.toInt()
);

これはいい感じだ。

1
2
3
4
area = 面積(
    GUI.InputValues['Width'].Text.toInt(),
    GUI.InputValues['Height'].Text.toInt()
);

これよりも読みやすい。ステキだ。

こうなってくると次は「関数に渡す引数一覧の評価順序はどうなってるんだ?」というのが気になってくる。パラメータで指定できるので、引数の順序は意味をもたず、呼び出す側の気まぐれな順序でも問題ないからだ。

みなさんご存知のように古いC言語やC++では、 引数の評価順序は未定義で実装依存 であり「左から右に実行されている」のは直感、たまたまにすぎない。( a = a + 1 と書いて、右辺から評価されることは直感的に受け入れられるよう訓練しても、関数に指定した引数の最後から評価されることは直感的に受け入れられないよな。)

昔のVisualC++では、その関数の 呼出規約のスタックに積む順番で呼ばれていたような記憶がある。

つまり、ある日コンパイラオプションをかえたりすると、呼び出される順序が変わるというツラサ。まぁこのツラサは C11、C++11 ではちゃんと定義された。ていうかこんなことでツラミを感じるのはコードが悪いというのはおっしゃるとおり。そして、お仕事でC11以降が使えるかどうかはまた別だしね。

Java、Python、Ruby、JavaScript(ECMAScript)、PHPは左から右と決まってるので安心していい。

んん? 呼び出しの順なのかそれとも定義時の順なのか気になる。Rubyぐらいは試しておくか。

1
2
3
4
5
6
7
8
9
10
11
12
13
def area(param1: 0, param2: 0)
end

def func1
  p 'func1'
end

def func2
  p 'func2'
end

area(param1: func1, param2: func2)
area(param2: func2, param1: func1)

結果

1
2
3
4
5
6
7
8
irb(main):013:0* area(param1: func1, param2: func2) # 関数定義は 1 -> 2、呼び出しも 1 -> 2
"func1"
"func2"
=> nil
irb(main):014:0> area(param2: func2, param1: func1) # 関数定義は 1 -> 2、呼び出しは 2 -> 1
"func2"
"func1"
=> nil

ちゃんと呼び出し側の直感であろう期待通りだ。安心した。

本当に稚拙なのを書いてしまう男!

| Comments

本当に稚拙なのを書いてしまう男!スパイダーマッ!

朝から熱中してたら神社の掃除をすっぽかすという大惨事スタート。

午後まで Service Fabric を試す。うーん。出てくる用語がすでにわからん。調べなからちょろちょろ。

実際クラスタ作成開始したら、スキマ時間ができまくるので、まずは ha4go をやることにした。

昼ぐらいから ha4go の実装。RSS(= XML)の作成でハマる。というか、コントローラのメソッドを private に書いてしまったタメだと思うが、コントローラのメソッドは呼ばれずにviewがレンダリングされようとし、そんなメンバしらねーとなってぬるぽでこけてた。

ルーティングからビューへの流れの理解が浅い、デバッグの仕方が適当なのがよくないのであろう。springを再起動したり、ルーティングを確認したり数時間もいってしまった。

23時ごろになって、本日1食目をとろうと思ったら、wpについてちょっと助けて欲しいと連絡が。なんかまぁ、添字がヘンとかポカミスぐらいだろうなと思って甘い考えでクビを突っ込んだら、そもそもロジックからってことになってしまい、「まぁ、これを機会に俺もWordPress少しやっておくのもいいかな」と思って朝までお付き合いしてしまった。

Codex:WordPress Codex 日本語版について - WordPress Codex 日本語版 よくできてる。すぐに調べられてよかった。まーあとはやっぱ

  • データ(配列)の取得、関数構文
  • そのデータへのアクセス
  • そのデータの出力
  • 繰り返し構文
  • 分岐構文

これだけできればRailsだろうがWPだろうがある程度はできるので、回り道だと思ってもこれら上から1個1個確認して進めるのがはやいね。

で、早朝うわーやべー、Azure Service Fabric 続きやんねーとー。と思ってクラスター作成し、デプロイ中に寝落ちして今に至る。うん。モチは餅屋、AzureはまずはWindows+VisualStudioだわ(FabricのサンプルのGitHub上のリポジトリをみたら *.sln があることを確認)と考えたところまでは記憶がある。