がるの健忘録 このページをアンテナに追加 RSSフィード

2017-02-15

[]低糖質チョコケーキ

そのまま食べるには、ちょいと甘さが控えめかなぁ。

「アイスとか生クリームとかかけて食べる」か、もうちょっと甘味を強めにするか。


材料

おからパウダー:30g

・純ココア:40g

・砂糖(うちはラカント):40g

・ベーキングパウダー:5g

・卵:2個

・牛乳:100ml

・バター:40g

ラム酒その他香り付けのお酒:大さじ1

・くるみ:適量(20g前後くらい)


レシピ

・材料一通りまぜる

・180度のオーブンで35分


一晩くらい寝かせると、落ち着きます。

焼いた直後は、結構、ぱさぱさw

2017-02-14

[]ようはバランスなんだが…

色々と「むつかしいなぁ」と思ったエントリ、が、元ネタ。


スタートアップに向く人、向かない人(エンジニア編)

https://note.mu/etomiho/n/nd3b3c62bac22


正直「どっちの言い分もわかるなぁ」というのがあるので、おいちゃん的見解をざっくりと。

最終的な落としどころは

https://twitter.com/gallu/status/831398322946453505

おいちゃん的には「設計は"隙間があって隙のない"設計を、ある程度丁寧に」「実装は、いらん部分を切り捨てつつ、必要に応じて雑にスピーディーに」かなぁ。 実装が雑でよいのは「後で容易に修正出来るから」だし、容易に修正出来るように組むから。

なんだけど。

そこに至るまでの考察などを、ちょいと、つらつらと。


その段階では、完璧なものを作るより「とにかく速く世の中に出す」ということが最優先される。

しかし夫は、これまでに何度かそうやって「スタートアップ時に雑に作られたシステム」のせいでひどい目にあってきており、いわば「穴のあいた壺」の穴を埋める仕事をずっとやってきていた。

うんまぁこの時点ですでに「どちらも理解できる」上に、基本的に「埋めにくいレベルで深い溝がある」事もわかる。

旦那さんのまずい所はおそらく

彼が最初から「穴のない壺」を作りたいと思う

ってあたり。

ただ

「穴があいていてもいいから速く壺を作ってくれ」

は、穴の「箇所とレベルと深度と質と種類」に依る、かなぁ。


新しい機能を実装しようと依頼したときの第一声が「拒否(防御)」のスタンスから入られることが多い

については。

正直「エンジニア側の気持ちがよくわかる」のと、だからこそ「信頼関係をしっかりと構築する」事の重要性が、この辺は、もっと声高に叫ばれてもいいんじゃなかろうかなぁ、って思う。

現実問題として「防御が必要な案件」も多いですし、「防御が必要な案件で防御せずに死ぬほど痛い目にあっている」ケースも散見されるので、「防御するな」とは、口が裂けてもいえる状況ではないので。


そして、「どのくらいかかりますか?」と作業工数の見積もりを依頼したときの返答が、やたら渋い(日数が長い)。これはおそらくなのだが、受託のときの癖で「とにかく納期には絶対遅れてはいけない」という思いから、万が一に備えて長めの見積もりを出すようにしているのではないかと思う。

これについても。

一番初め…ではないのかもしれないけど、先頭付近にやるべき一つは「技術者との信頼関係を構築して、安心を与える事」だと思う。

ナウシカ経営者(マネージャ)、キツネリス「テト」が技術者、って言うと、少し伝わるのかしらん?w


で。

そんな中で、私たちのような年長者が若者に打ち勝っていくには、いかに転んだときの「痛みの記憶」を忘れ去るか、にあるような気がしている。でなければ、全速力で走ることができない。

ん……これは違うと思う。

これだと、結局「手痛くすっころぶ」前提での体力勝負、にしかならないし。

「転ぶな」は難しいのかもしれないけど。「ダメージの少ない転び方」とか「受け身の取り方」くらいは、把握しておいたほうがいいと思う。


で。

それなりの炎上案件をやっぱり潜り抜けたおいちゃんが、現時点でお勧めするのが

・設計は"隙間があって隙のない"設計( http://d.hatena.ne.jp/gallu/20100506/p1 )を、ある程度丁寧に

・実装は、いらん部分を切り捨てつつ、必要に応じて雑にスピーディーに

って方針


設計で「隙間のないガチガチの設計」すると、後での改修が難しいので、そうするとどうしても「水も漏らさぬ穴のない壺」になる…んだけど、そもそもスタートアップ(に限らずビジネス全般)は「ある程度の(高)頻度で流転していく」ものなので、そもそも「ガチガチに組んだ」ら、組んだ瞬間から時代遅れになってしまいます。

また、逆に「設計が隙だらけ穴だらけ」だと。「建物立てた後に基礎工事やりなおします?」ってお話になって、シャレにならん工数がかかるうえにそのかかる工数って基本的に「全くお金を生まない」ので、経営的に大変にシビアな選択となります。


翻って。

実装を「一端雑に」するのは、雑にする箇所と雑レベルにもよるのですが…「きれいなコード」ってのは本来的に「後でいかようにも修正が出来る」ような作りになるので、「とりあえず雑に、後で手直し」って方法が出来るので。

「きれいで雑に組む」と、割合と「スタートアップ向き」のコードになりやすいんじゃないかなぁ、と思うのです。

この方法だと、まぁ「雑に組んだコードを捨てる可能性」はあるにしても、「短時間で組んだコード」なら「早期にチャンスをつかむための捨てコスト」ってみなしても、まぁ、許容できるんじゃないかなぁ、と思うです。


この辺は本当に「さじ加減」なので。

「全部雑」だと、だれかが尻拭いをする…か、サービスが終了します( http://appmarketinglabo.net/kinokore/ とか、当人たちには申し訳ないのですが、好例だと思われます)。

ちなみに「尻拭い」はめっちゃコストがかかるので、割とあっというまにコストセンター扱いされやすい等の不遇の扱いを受けやすいのですが、「本当に尻拭いが出来るエンジニア」は多分ものすごくレアなので、そのレアカードが切れると、多分、色々と死ねます。


ただ一方で「滅多に出てこない例外処理に1週間」とかかけられても、特に序盤でのそれはかなり痛いので。

「滅多にないだろう」については「捕捉可能」にしておいた上で、一端「ざっくりとチェックしたり処理したり」っていう思い切り、は、必要なんですよね。

あと「脊髄反射でコードを思いつかない」場合は「一端、ベタに書いておく」っていう思い切り。「後でよい書き方が天から降りてきた」ら、タイミング見計らって書き直せばよいのです。


でまぁ…

・隙間があって隙のない設計、が出来る

・コードで「手を抜いていい箇所」がわかる(+、基本的に組むのが早い)

ってのは…多分、ま〜ま〜「ハイレイヤー要求スペック」で(苦笑

もしかすると、スタートアップで一番しんどいのは「ハイレイヤー技術者との接点が薄い」「技術者が(技術力+経営まで見越せる、って意味で)ハイレベルなのか、の判断が難しい」に加えて、ぶっちゃけ「人件費が出ない」ってのが、ある可能性、も、あるんじゃないかなぁ、っと*1


まぁその辺を考えると。

今日ランチしたうちの弟子とも話をしていたのですが「ビジネスがわかる技術者」ってのは、色々な意味で、必要だし重要だしレアなんだろうなぁ、と。

一方で、経営者って本来的に「金を集めてくる」のが一番初めのお仕事だと思うので、そのあたり、頑張っていただけるとなぁ、と(他人事w)。


なんてことを、色々とつらつらと。

*1:おいちゃんも「内容は面白いんだけど単価があんまりにも合わなくてごめんなさいした」案件とか、割とあるですしねぇ……

2017-02-13

[]PHPUnitの、小数点同士の比較

PHPUnitの本体記事は今度書く予定ですが、今日はちょろっと、横道を。

おいちゃん、2a問題( http://d.hatena.ne.jp/gallu/20061108/p1 )があったりあったりするので。

PHPUnitでは、まずもってassertEqualsを使うためしはなく、必ずと言っていいほど(っていうか必ず)assertSameを使うのですが。


ふと、本当にふと、微妙疑問に思って「まぁNGになるだろう」と思ったコードでNGを返してこず、些か「……はて?」となりました。

    $this->assertSame(0.1 + 0.2, 0.3);

あれれ???

念の為、確認。

    $this->assertSame(true, (0.1 + 0.2) === 0.3);

うんこっちはちゃんとNGになる。

……なんざましょ? って思って、コード潜ってみました、という備忘録。


とりあえず、Sameメソッド

    public static function assertSame($expected, $actual, $message = '')
    {
        if (is_bool($expected) && is_bool($actual)) {
            static::assertEquals($expected, $actual, $message);
        } else {
            $constraint = new PHPUnit_Framework_Constraint_IsIdentical(
                $expected
            );

            static::assertThat($actual, $constraint, $message);
        }
    }

ifん中は今回は通らないので、else句をチェック。

まず、PHPUnit_Framework_Constraint_IsIdenticalは

    public function __construct($value)
    {
        parent::__construct();
        $this->value = $value;
    }

なので、単純に「値を保持している」だけのクラスぽい。…存在意義は不明(コードあちこち広域に読んだらわかるんだろうけど)。

で、次の行のassertThatが

    public static function assertThat($value, PHPUnit_Framework_Constraint $constraint, $message = '')
    {
        self::$count += count($constraint);

        $constraint->evaluate($value, $message);
    }

って感じ。

多分self::$countは「テストした数のカウント」だと予想しているので(コード未チェック)、その行はすっとばし。

$constraint->evaluateが、基本的には

        } else {
            $success = $this->value === $other;
        }

        if ($returnResult) {
            return $success;
        }

ってなってるので、「型厳密な、===による比較」が一端行われてるんだなぁ、というのは、理解。

ただ、その手前で

        if (is_double($this->value) && is_double($other) &&
            !is_infinite($this->value) && !is_infinite($other) &&
            !is_nan($this->value) && !is_nan($other)) {
            $success = abs($this->value - $other) < self::EPSILON;

ってのがあるので&self::EPSILONが

    const EPSILON = 0.0000000001;

なので。

小数点の比較の場合は、誤差を割合と丁寧にチェックしてる」事が判明。


ははぁ面白い事やってるなぁ、と。

まぁ「双方が浮動小数点数の時だけ誤差チェック」なので、Sameに対する信頼はゆるぎないものとして相変わらず君臨しているので、腑に落ちた感じで調査終了。


余談。

assertEqualsメソッドは「なんかごちゃごちゃしてた」し使うつもりも基本まったくないので、まともに読んでませんw

2017-02-09

[]マグロの血合いのカレー

安く手に入ったので。


マグロの血合い:適量

・玉ねぎ:1個

・ホールトマト:缶の半分

ココナッツミルク:200mm、またはココナッツパウダー60g+牛乳150mm

ニンニクショウガ:適量(小さじ1くらいづつ。きざみでもすったのでも)

・水:3カップ半くらい

ナンプラー:大さじ2、またはこれと等価の塩(小さじ1ちょい、くらいかなぁ)

・スパイスA

 クミンシード:小さじ1

 マスタードシード:小さじ1

・スパイスB

 レッドペッパー:小さじ1/4(辛いのが好きなら、小さじ1くらいまで増量してもいいのかなぁ)

 ターメリック:小さじ2

 コリアンダー:小さじ1/2

 カルダモン:小さじ1

・スパイスC

 ガラムマサラ:小さじ2


調理手順

マグロの血合いは切って軽く赤ワインにつけて水洗い。

赤ワインは省いて「水洗いを数度」だけ、でもよいかも。水はおおざっぱに切っておく。


玉ねぎの皮をむいて、マジックジューサーでペースト状にする。

「剥いた玉ねぎの皮」は、水で煮てベジブロス作っておく。


ココナッツパウダー使うときは、このタイミングで牛乳をチンして、あったかい牛乳にしてからパウダーいれて溶かしておく。


フライパンに油(オリーブオイル使った)引いて、クミンシードマスタードシード(スパイスA)を入れる。

適当に泡だったら「ペースト状の玉ねぎ」入れてしばらく炒める。


玉ねぎがある程度色づいてきたら、ニンニクショウガを投入。

ホールトマト、スパイスBも合わせて投入。


1〜2分炒めたらマグロの血合いを入れる。


血合いを入れて1〜2分したら、ココナッツミルク(またはココナッツパウダー+牛乳)、ベジブロスを投入。

10分くらい煮込んだタイミングでナンプラー(または塩)投入。

さらに10分ほど煮込んで、とろみが少し出てきたら、ガラムマサラを入れて出来上がり。

2017-01-25

[][][]PHPエンジニアPythonに触れてみる:まずはインストール

さておいちゃんが果たして「PHPエンジニアなのか?」というのは、微妙に疑問もあるのですが(PHPばっかりではないし、さりとて最近はPHPが圧倒的に多いのも事実だし)。

いわゆる「初めての**」的な感じのPython版は、書籍なりWebなり色々あるかと思うので。

ちと切り口を変えて「PHPはある程度がっちょりやってるエンジニアPythonをやってみる」って切り口での学習ルートを残しておこうかなぁ、と思ったのがきっかけでございます。


Pythonをやろうかなぁと思う理由は、建前を取り繕えば多々あれど、本音ぶっちゃけると「綺麗だし切り口が気に入っているから」(笑

まぁ、人間が何かに興味を持つ時なんて、そんな程度のものでございますw


で、先日、信頼おけるPythonエンジニアのむーちゃんに質問をしたのですが、ものっそざっくりと要約すると「これから学習するんなら3でもいいんぢゃね?」って話だったので。

Pythonの2系についてはバッサリと一端切り落としをして、3系を学習したいと思います。


プログラムを学習する以上当然ながら「実行環境」が必須のmustでないと死んじゃうので。

…ただ、手持ちのサーバが(ある意味都合よい事に)Pythonの2系が入ってたので、まずは「3系のinstall」をいたしませう、というあたりから。

鯖はLinuxなので、それ以外の環境は適宜自主的にどうにかしてくださいw


総本山っぽい

https://www.python.org/

に伺うと「Download」なる所があるので、そこの「Latest:」にあるリンク先を選択

今なら

https://www.python.org/downloads/release/python-360/


tarballでのインストールが基本のおいちゃんなので、Gzipped source tarball( https://www.python.org/ftp/python/3.6.0/Python-3.6.0.tgz )を把握。

Linux鯖なので

wget https://www.python.org/ftp/python/3.6.0/Python-3.6.0.tgz

で一撃のもとに取得。


tar zvxf Python-3.6.0.tgz

cd Python-3.6.0

./configure --prefix=/opt/lang/python-3.6.0

make -j 3

sudo make install


で、一端「バージョン番号のついたディレクトリ」にインストール

対して深い意味もないんだけど細かい話をすると「複数バージョンを気軽にごにょごにょしたり出来る」ので、一応。

シンボリックリンクを使うんだけど、そのあたりは http://d.hatena.ne.jp/gallu/20120724/p1 を参照。

なんかいくつかのサイトを見ていると「Pythonコンパイルの前に入れておかないといけないライブラリ」がいくつかあるぽいんだけど、多分おいちゃんの現在環境だと「すでにtarballで入れてる」と思われるので、なんの引っかかりもなくインストール完了。

この辺は、後でコメントとかあったら直すかも。


で、この状態で

/opt/lang/python-3.6.0/bin/python3.6

叩くと動くので、最低限これでもよし。

ただまぁ「pathが通ってるところに入ってるほうが色々と好都合だなぁ」ってのはあるので、以下のコマンドを追加でぶっこみ。

sudo ln -s /opt/lang/python-3.6.0/bin/python3.6 /usr/bin/python3

これで、よっぽど奇異な設定かましてる鯖でなければ

python3

だけで動くようになったと思う。


いや「/usr/bin/pythonを上書き」とかでもよかったんだけど、installした時のbinのファイル名が「python3.6」だったので、なんとな〜く。

「万が一、2系との挙動差分を楽しみたい」なんて事が、なきにしもあらずんば、かもしれない風な可能性が予見されないでもないので。

恐らく九分九厘、近々のタイミングで「pip3」とか必要になるんだろうけど「必要なものは必要になってから」のほうがよいと思っているので、あえてここでは一端無視。


ここまでで、とりあえず「学習環境」が最低限整いました。

なんかこの時点での突っ込みどころなどありましたら、ご連絡くださいませ。