『最速の仕事術はプログラマーが知っている』読んだ

自己啓発系の本は最近ほとんど買わなくなったんだけど、 shi3z 氏が書いた本とあって興味が湧いたので買ってしまった。

優れたプログラマーがプログラミングでやっている習慣や考え方なんかを、非プログラマー向けにアレンジした感じの本。 プログラマーが使う専門用語が頻繁に出てきて、説明は載っているとはいえ理解できるのかな。 プログラミングの経験がないと難しい気がする。

Markdown紹介したのなら、Git のようなバージョン管理ツールも紹介すればよかったのに。 Markdown との相性も抜群だと思うけど、非プログラマーにはハードルが高すぎるかな。

個人的に、プログラマーは自分で生産性を上げるためのアプリやサービスを、 自分で作れるのが一番の強みだと思っている。 それに対し、プログラミングができない人は他人や企業が作ったアプリやサービスを使うしかない。 「最速の仕事術はプログラマーが知っている」という主張に異論は無い。

最速の仕事術はプログラマーが知っている

最速の仕事術はプログラマーが知っている

大宰府八ちゃんラーメン天神店

天神4丁目、以前葱一があった場所に、大宰府八ちゃんラーメン天神店がオープンしていた。

f:id:griefworker:20150807175621j:plain

大宰府にある本店には行ったことがないけど、評判は良いみたい。 久しぶりに外食してみるか、ってことで入店。

がっつり食べたい気分だったので、ラーメンと焼き飯(ハーフサイズ)のセット(900円)を注文してみた。 ラーメンは背脂入りでこってりした豚骨スープ。けっこうガツンとくる飲み口だけど後に引かなかった。 なにより、チャーシューが甘口で美味い。チャーシュー麺にすればよかった。

f:id:griefworker:20150807175852j:plain

焼き飯はあっさり味。ラーメンが濃厚だけに、良い口休めになったというか、 ちょうど良いバランス。 ただ、端に添えてある福神漬けがなぁ。漬物苦手なので。 いや、まったく個人の好き嫌いでしかないけど。

f:id:griefworker:20150807180119j:plain

関連ランキング:ラーメン | 天神駅中洲川端駅西鉄福岡駅(天神)

家族で写真を共有するのに wellnote というサービスを使ってみた

家族で写真を手軽に共有したい。 まずはお試しの取り組みなので無料で使えるやつがいい。 両親はPC持ってるけど、スマホタブレットは持ってないから、アプリだけのやつは使えない。 WEBブラウザからも見れないとダメ。 そんな条件で探して、唯一該当したのが『wellnote』っていうサービス。

wellnote.jp

この wellnote、写真だけでなく動画も共有できるし、家族の身長と体重を記録できたりして、 特に子供の成長記録を共有するのに向いている。 家族 SNS なので、コメントやスタンプを使ったコミュニケーションもできる。 まぁ今のところ、一方的に写真を見せ付けるだけの使い方になってるけど。

wellnoteは今はまだ無料で使える。 でもいずれは DropBoxやOneDriveみたいに、2GBまで無料でそれ以上は有料ってなりそうな気がする。 今ならGoogle フォトという選択肢も有りかな。 探し始めた当時はまだ無かったんだよね。 もしサービス終了してしまった場合には、Google フォトに移る予定。 ただその場合、うっかり赤ちゃんの沐浴写真をアップして、アカウント停止されないかが心配だ。

LINQ で左外部結合

いつも忘れて、その度ネットで調べているので、ブログにメモしておく。 DefaultIfEmpty を使うのがポイント。

using System;
using System.Linq;

namespace LinqLeftOuterJoinSample
{
    public class Sector
    {
        public int Id { get; set; }
        public string Name { get; set; }
    }

    class User
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public int SectorId { get; set; }
    }

    class Program
    {
        static void Main(string[] args)
        {
            var sectors = new Sector[]
            {
                new Sector { Id = 1, Name = "営業部" },
                new Sector { Id = 2, Name = "開発部" },
            };
            var users = new User[]
            {
                new User { Id = 1, Name = "武藤", SectorId = 1 },
                new User { Id = 2, Name = "宇佐美" },
                new User { Id = 3, Name = "柴崎", SectorId = 2 },
                new User { Id = 4, Name = "本田", SectorId = 1 },
            };

            var result = from u in users
                         join s in sectors on u.SectorId equals s.Id into tmp
                         from s2 in tmp.DefaultIfEmpty()
                         select new
                         {
                             UserName = u.Name,
                             SectorName = (s2 != null) ? s2.Name : "未所属",
                         };

            foreach(var r in result)
            {
                Console.WriteLine($"{r.UserName}({r.SectorName})");
            }

            Console.ReadLine();
        }
    }
}

『.NET のエンタープライズアプリケーションアーキテクチャ第2版』読んだ

本書の内容は、.NET に限らず Java や他の言語でも適用できそうだ。 ただ、内容を理解するにはドメイン駆動開発や GoFデザインパターン、 Martin Fowler のエンタープライズアプリケーションアーキテクチャパターン等の知識が必要。 ドメイン駆動開発はまだやってないので、その部分はなんとなくの理解にとどまってしまった。

オンラインストアを題材に本書のアーキテクチャを実践したサンプルおかげで、 どういった設計をやればいいのかは理解できたので良しとしよう。 やっぱり論よりコードだな。

ASP.NET MVC で作っているアプリがスパゲッティになりつつあって、最初の設計のマズさに悩んでいた。 大規模なリファクタリングを考えていたんだけど、ドメインモデル、 とりわけアプリケーションサービスは良いヒントになった。 コマンドクエリ責務分離を適用して恩恵を受けられるほどの複雑度ではないし。

ASP.NET MVC で二重サブミットを防止したい

フォームなんかでボタンをうっかりダブルクリックしちゃって二重に投稿されてしまうのを防ぎたい。 クリックしたらボタンを無効にできればなお良し。

単純に JavaScript でボタンクリックされたら無効にするイベントハンドラ書けばいいと思ってたら、クライアントバリデーションに失敗したときボタンが押せなくなって困った。

なので今のところ

$(function () {
    $("form").on("submit", function (e) {
        var $form = $(this);
        // クライアントバリデーションに成功したら submit を無効にする
        if ($form.valid()) {
            $(this).find("[data-disable-with]").each(function () {
                var $button = $(this);
                var text = $button.attr("data-disable-with");
                $button.val(text);
                $button.prop("disabled", true);
            });
        }
    });
});

な感じでクライアントバリデーションに成功したらボタンを無効にするようにしている。Rails をマネして、data-disable-with 属性でボタンを無効にしたとき、ボタンのタイトルも変更できるようにもしてみた。

ビューでは

<input type="submit" value="ログイン" class="btn btn-lg btn-primary btn-block" data-disable-with="ログイン中..." />

という風に使っている。

Launchpad に勝手に追加された Chrome アプリを削除

Launchpad に Chrome アプリが勝手に追加されてうざかったので、 下記のフォルダを削除したら表示されなくなった。

Macintosh HD/ユーザ/<ユーザー名>/アプリケーション/Chrome アプリ

Launchpad に表示されなくなるだけで、Chrome アプリ自体が削除されるわけじゃないから、フォルダを削除しても実害なし。