読者です 読者をやめる 読者になる 読者になる

もしも社会人プログラマーがtopcoderのイエローコーダーを目指したら

略してもしイエ。技術的な話とか、パソコンに関する話とかを書いていきます。

カレーつくった

自炊

材料

  • 鶏むね肉(安い)
  • にんじん(1/3くらい)
  • じゃがいも(2個くらい)
  • たまねぎ(1/2玉くらい)
  • にんにく(2~3片)
  • 鷹の爪(お好み)
  • 牛脂(わりとタダでもらえたりする)
  • カレールゥ(今回はバーモンドの甘口。やすかった。1/2箱)
  • オリーブオイル(サラダ油でもいい)

作り方

  1. 野菜と肉を好きな大きさに切る。じゃがいもは水につけてアク抜き。玉ねぎはなんか細く切るのオススメ。鶏肉は塩胡椒をたっぷりとふって数分置いておくとヨイ。にんにくはスライス。

  2. オリーブオイル大さじ1~2くらいを鍋で温める。温まったらにんにくを入れる(にんにくを揚げている風になる)。にんにくが焦げすぎないように火は中火くらい。

  3. 今回はバーモンドカレーの甘口がやすかったのでルゥを甘口にしたけど、ちょっと甘すぎたので、にんにくにちょっと色がついてきたらタイミングで鷹の爪を入れた。入れすぎると辛くなるので注意。また、完成後の見た目がちょっと悪くなるので入れすぎないように。

  4. 玉ねぎを入れる。相変わらず中火でたまねぎが焦げないように注意する。しなっとするまでめっちゃ炒める。

  5. 牛脂を入れて鶏肉をいれて炒める。塩コショウが足りないとちょっと物足りない味になったりする気がする(要出典)。牛脂をいれると美味しくなるって何処かで読んだ。牛脂はだいたいスーパーでタダでもらえるので入れておいて損はないんじゃないかな。

  6. じゃがいもとにんじんを入れて軽く炒める。

  7. 水投入(750~850mlくらい)。沸騰してから15分くらいコトコト。

  8. カレールゥを1/2箱入れる

  9. 完成。

感想とか反省

  • カレールゥが少なかったからもっと入れたら美味しくなっていたかもしれない。鶏肉の塩コショウもそうだけど、味付けはかなり重要。
  • 牛脂の効果はいまいちわからなかった。
  • にんにくはうまい。
  • 鷹の爪は入れないですむなら入れないでいい(気がする)ので辛口のルゥを買ったら良いと思う。あと入れるタイミングも実は一番最初じゃないほうがいいかもしれない。
  • 悪くはなかったけどもっと美味しくできたと思う!!!

写真

モンスターエナジードリンク4種を飲み比べしてみた

普段はRed Bullを飲んでいます

ちなみに、僕は普段Red Bullを飲んでいます。 カフェイン含有量がエナジードリンクの中では少ないということらしいので、昼ごはんの後眠くなる時などに、小さい方の缶を飲んでいます。 とはいえ、飲み過ぎるとカフェインに慣れてきて効果がなくなってくる上に、中毒になるのか、異様にRed Bullを欲する時がでてくるので、基本は飲まないようにしています。

Monsterはこれまでにオレンジの果汁入りのものを1回しか飲んだことがありません。今回たまたまMonsterをちょうど4種を手に入れる機会があったので飲み比べてみました。すごく簡単に味の感想を書きます。

今回飲んだMONSTER ENERGYと味の感想

今回飲んだモンスターエナジードリンクは4種類です。 モンスターはRed Bullに比べて量が多く、カフェイン含有量も多いので、2,3日に分けて飲まないと僕にはしんどかったです。

MONSTER ENERGY プレーン(緑)

一番スタンダードな味です。いわゆる普通のエナジードリンクの味でした。色も普通のエナジードリンクの色です。特筆することはありません。

アサヒ飲料 モンスター エナジー 355ml×24本

アサヒ飲料 モンスター エナジー 355ml×24本

MONSTER ENERGY アブソリュートゼロ(青)

プレーンのカロリーゼロ版です。見た目は味は基本的にプレーンと同じなのですが、コカ・コーラゼロのような、人工甘味料的な味がして僕は好きじゃありませんでした。カロリーを気にしないのであればプレーンの方が良いと思います。

MONSTER ENERGY ウルトラ(白)

プレーンとはちょっとだけ成分が違っており、ゼロカロリーらしいです。パッケージだけでなく液体も白く、味はスポーツドリンク *1 に近い味かな、という印象でした。 (個人の感想です)

MONSTER ENERGY カオス(オレンジ)

りんごやオレンジの果汁が30%入っているらしいです。果汁30%のオレンジジュース?的な味+若干人口甘味料っぽい風味?(個人の感想です)

アサヒ飲料 モンスター カオス 355ml×24本

アサヒ飲料 モンスター カオス 355ml×24本

まとめ

結局プレーンが一番飲めると思いました。

*1:アクエリアスとか。ただチョット薄味

東銀座の中華料理屋「ブルーリリー」のランチ麻婆豆腐がおいしかった

ごはん 銀座

先日、ブルーリリーの麻婆豆腐が美味しいという話を聞き、ランチに麻婆豆腐を食べに行ってきました。

https://tabelog.com/tokyo/A1301/A130101/13138046/

「餃子が美味しい店だけど、麻婆豆腐も美味しいよ」という話を聞き、麻婆豆腐を食べに行きました。後日餃子と元祖担々麺も食べに行きました。 *1

店の雰囲気や接客

店は広くてそこそこ綺麗で、お昼時はそれなりに人がいます。

接客に関してはハッキリいってかなり微妙と言わざるを得ません。 ほんとに必要最低限といった接客で、他の銀座の店と比べると店員の態度はそこまでよくありません(声が小さかったり)。 僕達が行った時は混雑時を外したので、お昼のピーク時間帯あたりの接客はさらに微妙になる可能性があります。 接客には期待しないほうがいいです。その代わり値段が安いので諦めましょう。

注文してから料理が出て来るまではかなりスムーズです。

メニュー

麻婆豆腐

f:id:yoshiki_utakata:20161228122051j:plain

いろいろ食べましたが、僕は麻婆豆腐が一番美味しいと思いました。中辛と大辛があるのでとりあえず中辛を頼んだのですが、かなり辛かったです。辛いものが少しでも苦手な人は避けたほうがいいです。大辛は辛いものが相当好きじゃないと厳しいと思います。価格は980円。銀座にしてはリーズナブルです。

大餃子定食

f:id:yoshiki_utakata:20161228122257j:plain

大餃子定食は6個910円と、8個1000円があります。手前が僕の餃子6個、奥が友人の餃子8個。写真では伝わりづらいかもしれないですが、餃子1つがかなり大きいので、僕は6個で十分でした。中身がぎっしり詰まっていて、非常に美味しいです。こちらも食べてみる価値はあると思います。

元祖担々麺

f:id:yoshiki_utakata:20161228122709j:plain

汁なしの担々麺です。汁なし担々麺的なものは人生で初めて食べたのですが、思ったほど辛くなかったのが残念でした。

ということで

僕のオススメは麻婆豆腐です。機会があれば食べに訪れてみてください。

*1:全部ランチ時間帯に食べに行きました

LGTMoonの画像のレスポンスヘッダにCache-Controlを追加した

LGTMoonとは

LGTM画像を簡単に作れるサービスです。

LGTMoon - 最もシンプルなLGTM画像ジェネレーター

LGTMoonの画像保存/配信の仕組み

LGTMoonは画像をバイナリにしてPostgreSQLのImageテーブルに保存しています。

画像に対するリクエストを受けた場合は (例: http://lgtmoon.herokuapp.com/images/2045Scalaでこのリクエストを受け、DBからバイナリを読み出して返しています。 *1

class ImageBinaryController extends Controller {
  /** idを受け取り画像のバイナリデータを返す */
  def image(id: Long)  = Action.async { request =>
    // DBから引っ張ってくる
    ImageRepository.image(id).map {
      case Some(image) => {
        image.bin match {
          case Some(bin) => {
            // image/png としてレスポンスを返す
            Result(
              header = ResponseHeader(200),
              body = Enumerator.fromStream(new ByteArrayInputStream(bin))
            ).withHeaders(CONTENT_TYPE -> "image/png")
          }
          case None => NotFound("Not Found")
        }
      }
      case None => NotFound("Not Found")
    }
  }
}

フロントでの「最近の画像」表示の仕組み

フロントではvue.jsを使い、最近の画像一覧取得API(Recent API)を叩いて返ってきた結果をDOMに落とし込んでいます。 Recent APIは最新20枚の画像のURLを返すので、10秒に1回このRecent APIを叩き、結果をそのままvue.jsにかませてDOMを表示しています。

つまり、10秒に1回、imageタグを一旦全部消して、Recent APIを叩き、imageタグを追加、というステップを行っています。

レスポンスヘッダのCache-Controlについて

さて、いままで画像のレスポンスのヘッダにはCache-Controlは付けていませんでした。Cache-Controlとは キャッシュについて整理してみた - Qiita あたりを参考にしていただければわかります。ブラウザ側に「この画像はキャッシュしないでくれ」「この画像は1時間までならキャッシュしていいよ」などと伝えることができます。

Cache-Control を指定していなかった場合の問題

Cache-Controlを指定していなかった場合、キャッシュの動作について、ブラウザごとに細かい動作の違いがありました。

Google Chrome

Google Chrome において、Recent APIを叩いた結果同じ画像が存在した場合、画像へのリクエストは発生しません。

f:id:yoshiki_utakata:20161222163548p:plain

Safari

今回問題になったのはSafariでした。Safariにおいて、Recent APIを叩いた結果同じ画像が存在した場合でも、画像へのリクエストが発生します。 つまり、10秒に1回、画像20枚分のリクエストが発生することになります。

本当の原因はSafariの実装を知らなければ分かりませんが、おそらく、Cache-Controlを指定しない場合、Safariは画像をいい感じにキャッシュしてくれないのかなーという感じです。

Cache-Control を Scala Play で指定する

そこで、Cache-Controlで、画像を1時間キャッシュしろという命令をレスポンスヘッダに含めました。 *2 Scala Play で Cache-Control をレスポンスヘッダに含める方法は以下の通りです。

/** 画像のバイナリデータを返すコントローラー */
class ImageBinaryController extends Controller {
  /** idを受け取り画像のバイナリデータを返す */
  def image(id: Long)  = Action.async { request =>
    ImageRepository.image(id).map {
      case Some(image) => {
        image.bin match {
          case Some(bin) => {
            Result(
              header = ResponseHeader(200),
              body = Enumerator.fromStream(new ByteArrayInputStream(bin))
            ).withHeaders(
              CONTENT_TYPE -> "image/png",
              CACHE_CONTROL -> "max-age=3600") // 1時間キャッシュしろ
          }
          case None => NotFound("Not Found")
        }
      }
      case None => NotFound("Not Found")
    }
  }
}

これを行うことにより、Safariでも画像のキャッシュが効くようになり、Recent APIを叩いた後での画像へのリクエスト数が激減しました。 さらに、Chromeなどでもページをリロードした際には積極的にキャッシュが使われるようになります。

f:id:yoshiki_utakata:20161222164417p:plain

今回の画像は一度作られたら変わらないものなので、キャッシュ時間をさらに長くすることも可能です。

まとめ

HTTPレスポンスヘッダーのCache-Controlについて学んだお話でした。

Ubuntuにdockerをインストールする

開発環境を整える連載

はじめに

JenkinsとかGitなどを、Docker上で動かしたいため、家にあるUbuntuサーバーにDockerを入れたいと思います。

環境

$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=14.04
DISTRIB_CODENAME=trusty
DISTRIB_DESCRIPTION="Ubuntu 14.04.2 LTS"

Dockerのインストール

以下に従って行います

docs.docker.com

aptのupdate

$ sudo apt-get update
...
以下の鍵 ID に対して利用可能な公開鍵がありません:
1397BC53640DB551

えぇ...

とりあえず以下のリンクを参考に

abyssluke.hatenablog.com

$ sudo apt-key adv --recv-keys --keyserver keyserver.ubuntu.com 1397BC53640DB551

としてから再開

$ sudo apt-get update
$ sudo apt-get install apt-transport-https ca-certificates
$ sudo apt-key adv --keyserver hkp://ha.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D

今回は Ubuntu 14.04 なので、以下のコマンドを実行。

$ echo "deb https://apt.dockerproject.org/repo ubuntu-trusty main" | sudo tee /etc/apt/sources.list.d/docker.list
$ sudo apt-get update

以下のコマンドを実行して、インストールされるバージョン候補が表示されたらたぶんここまでは大丈夫です。

$ apt-cache policy docker-engine

Dockerインストールの準備

$ sudo apt-get install linux-image-extra-$(uname -r) linux-image-extra-virtual

Dockerのインストール

$ sudo apt-get install docker-engine

Dockerの起動

$ sudo service docker start
start: Job is already running: docker

Hello World でインストールされていることを確認

$  sudo docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
c04b14da8d14: Pull complete
Digest: sha256:0256e8a36e2070f7bf2d0b0763dbabdd67798512411de4cdcf9431a1feb60fd9
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

次回

次回はDockerを試す意味も含めてJenkinsをインストールしてみたいと思います。