松屋 チキングリル定食 シャリアピンソースを添えて。
3/21より「チキングリル定食」が発売されました。
なので、さっそく食べてみました。
いつものように、ライスミニで注文して、ライスなし。
60円返金がありました。
620円で60円返金があったため、560円です。
単品の栄養素は以下になります。
カロリー | 555kcal |
たんぱく質 | 36.2g |
脂質 | 37.5g |
炭水化物 | 17.8g |
ナトリウム | 1760mg |
食塩相当量 | 4.5g |
食物繊維は書いてませんが、食物繊維っぽいのは玉ねぎくらいかな?
糖質は、味も甘目でポテトサラダもついているため、多分15g程度かともいます。
お味のほうは、シャリアピンソースが結構濃いです!
ご飯なしだときびしいかもしれません。
あと、ニンニクがかなりきいています!
デート前とかには注意しましょう!
かつや タルタルチキンカツ定食
ここのブログのアクセストップがなぜか「やみつきスパイスのチキンカツ定食」だったりします。
kei0425tan.hatenablog.com
なので、3/17から期間限定メニューの「タルタルチキンカツ定食」を頼んでみました。
いつものようにご飯抜き。
かつやの場合は「タルタルチキンカツ定食単品で。あとトン汁小!」と頼むとスムーズです。
タルタルソースがたっぷりなので、キャベツをタルタルソースで食べるとちょうどいい感じです。
税抜き590円(税込637円)
単品で200円引き
割引券で100円引き
トン汁小で120円
計410円(税込442円)でした!
ちなみに、ロカボの場合マヨネーズは糖質がほとんどないためいくら食べても大丈夫です。
タルタルソースも基本的にマヨネーズ+ゆで卵+ピクルスのため、糖質ほとんどありません。
なので、ロカボにタルタルソースは相性がよいかと思います。
mochaでasync/awaitが使えるようになってました!
node v7.0からasync/awaitが実装されていましたが、起動オプションに--harmony-async-awaitの指定が必要でした。
しかし、v7.6からJavaScriptエンジンのV8がバージョン5.5に上がったため、起動オプションの指定が不要になりました。
その前に、nodeでの非同期処理の扱いについて簡単に解説
コールバック時代
元々ノンブロッキングでイベントドリブンで記述するのがnodeの特徴のため、読み込みイベントにコールバックを登録して処理を記述します。
どこに処理を記述するのかわかりにくいですね。
ただし、chunk形式のため、非常に大きな入力でも対応できるのがメリットです。
コールバック版標準入力読み込み
Promise時代
コールバックを利用すると、ネストがどんどん深くなってしまう欠点がありました。
(複数ファイルを読み込むだけで、単純にそのファイル数だけネストしてしまったりなど)
まあ、無名関数にせずに全部通常の関数化して記述すればネストについては何とかなるのですが、手軽に記述できるとは言い難いです。
そこで、Promiseという仕組みを偉い人が考えました。
(元はデザインパターンのひとつのFutureだそうです。)
future - Wikipedia
ようは、コールバックの中にコールバックを記述するのではなく、チェインして連続して記述できる仕組みです。
(めっちゃ大雑把だけどゆるしてね)
Promise版標準入力読み込み
Promise化の方法
関数の中身を以下で記述します。
function hoge() { return new Promise((resolve, reject) => { hogehoge(param, (err, data) { if (err) { // 失敗した場合 reject(err); } else { // 成功した場合 resolve(data); } } }); }
resolveは必須です。rejectはなくてもかまいません。
async/await時代
Promiseを経て、コールバック地獄からは免れるようになったのですが、まだ見た目が慣れないことが多いです。
さらに、無名関数が多数書かれることによる変数のスコープの問題や、例外の問題などもあります。
そこで、async/awaitを使うことにより、通常のプログラムと同じく上から下へ記述できるようになり、コールバック関数も不要になり、ブロッキングもされないようになりました。
async/await版標準入力読み込み
paiza.ioのnodeのバージョンがv6のため、async/awaitに未対応なので、gistです。
async/await 標準入力読み込み
async/await化の方法
まず、Promise化を行います。
その後、呼び出し側の関数定義に、asyncを付けて、呼び出す関数は結果を待つ場合には、awaitをつけます。
非同期で呼び出したい場合には、awaitを付けなければ従来通り非同期になります。
ユニットテストではどうする?
そんなわけで、async/awaitを利用すると非常に記述しやすい&読みやすくなります。
でも、ユニットテストを書くときはどうするのでしょう??
答えは簡単。普通に無名関数を記述する箇所をasync function() にすれば大丈夫でした。
rejectされた場合もちゃんと例外が発生します。
ただし、assert.throwsはasyncつけてもうまく動作しませんでした。
仕方がないので、try/catchで検査しましょう。
結果は以下。
case2は例外が発生したケース
case3はassert.throwsを使って補足できなかったケース
なので、失敗します。
test ✓ case1 1) case2 2) case3 (node:11613) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 2): Error: ENOENT: no such file or directory, open './test/nofile' (node:11613) DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code. ✓ case4 2 passing (24ms) 2 failing 1) test case2: Error: ENOENT: no such file or directory, open './test/nofile' 2) test case3: AssertionError: Missing expected exception (Error).. at _throws (assert.js:345:5) at Function.throws (assert.js:369:3) at Context.<anonymous> (test/await-test.js:23:16)
.Net DataGridViewのセルのチェックボックスの制御
DataGridView便利でよくつかいますよね?
日本人は表が好きなので、なんでもグリッドにすることが多いかと思います。
そこで、グリッドのセルにチェックボックスも、ウィザードで簡単に追加できるかと思います。
データの設定も、grid.DataSource = で一発で設定できるし便利便利!!
と思っていたのですが、チェックボックスの制御をしようと思うと途端に難しくなります。
普通は、各オブジェクトからイベントが発生するので、そのイベントに応じて処理を書けばよいのですが、DataGridViewのセルのチェックボックスからはイベントが発生しません。
普通は、CheckedChanged、CheckStateChanged、Clickなどのイベントを拾えるのに、、、、、
なので、定石としては、親のDataGridViewのCellMouseClickを拾うのがよいそうです。
ただし、全てのセルに対して、マウスクリックイベントが発生するため、DataGridViewのCellMouseClickを拾ったあとは
eから、RowIndexとColumnIndexを取得し、どのセルがクリックされたかを特定してイベントの処理を行います。
注意点としましては、DataGridViewのCellMouseClickを実行したあと、拾えない内部のチェックボックスのクリックイベントが発生して、データの書き換えを行うようなので、ダイアログボックスを表示したりすると表示がちぐはぐになります。
さらに、キャンセルをしたくても、強制的にチェックボックスのクリックイベントが発生するため、キャンセルできません。
対応するためには、DataGridViewでチェックボックスを定義する際には、ReadOnly = Trueに設定しておきましょう。
それによって、チェックボックスのオンオフのイベントは発生しません。
勝手に変わらないため、CellMouseClickイベントで自力でON/OFFの制御をしましょう。
というわけでサンプルです。
DataGridViewを作成し、列として、3つチェックボックスを追加しています。
ReadOnlyはTrueにしています。
制御用のコードはこちら
If で判定して成立した場合には自力でValueを反転しています。
成立しない場合には、メッセージボックスを出力しています。
試しに、ReadOnlyをFalseにするとおかしな動きをするのがわかると思います。
Private Sub DataGridView1_CellMouseClick(sender As Object, e As DataGridViewCellMouseEventArgs) Handles DataGridView1.CellMouseClick Dim columnIndex = e.ColumnIndex Dim rowIndex = e.RowIndex Dim dgv As DataGridView = sender Dim row = dgv.Rows(e.RowIndex) If columnIndex = 0 OrElse row.Cells(columnIndex - 1).Value Then row.Cells(columnIndex).Value = Not row.Cells(columnIndex).Value Else MessageBox.Show("左のチェックボックスがONでないと変更できません。") End If End Sub
Nexus5Xシステムアップデート(2017年3月分)
Nexus5Xのシステムアップデートが降ってきたのでメモ
バージョンアップ自体は5分ほどで終了しました。
バージョンアップ前
Androidバージョン
7.1.1
Androidセキュリティパッチレベル
20017年2月5日
ベースバンドバージョン
M8994F-2.6.36.2.20
カーネルバージョン
3.10.73-gfe160e5
android-build@wpho2.hot.corp.google.com #1
Wed Dec 7 20:26:32 UTC 2016
ビルド番号
N4F26O
バージョンアップ後(太字が変更点)
Androidバージョン
7.1.1
Androidセキュリティパッチレベル
20017年3月5日
ベースバンドバージョン
M8994F-2.6.36.2.20
カーネルバージョン
3.10.73-gd3d680c
android-build@wpho11.hot.corp.google.com #1
Thu Jan 19 07:19:06 UTC 2017
ビルド番号
N4F26T
セキュリティアップデートみたいですね。
Android Security Bulletin—March 2017 | Android Open Source Project
スシローでラーメン
糖質制限中にどうしてもラーメンが恋しくなって食べたいときどうしますか?
実はスシローでラーメンが売ってるんですね。
濃厚えび味噌ラーメン 税抜300円
小さめに作られていて、1食のカロリーは288kcal
通常のラーメンの約半分ぐらいです。
糖質は調べきれなかったのですが、おそらく量が半分なので糖質も30gぐらいでしょう。
普通のラーメン屋さんに行くとなかなか少ない量を頼むことはできないので回転ずしでラーメンが食べられるのはありがたいです。
味のほうも、海老がかなり効いていておいしかったです。
他にもいろいろ食べてみました。
牛塩カルビ 120円
海老チーズ 120円
タコの唐揚げ 300円
すしドック 120円
中に入っているウインナーはシャウエッセンだそうです。
フレッシュ苺のメルバ 200円
メルバっていうのは人の名前みたいですね。
ストロベリーアイスと苺と生クリームとカステラでした。
ミルクレープのメルバっていうのもあったみたいで、そっちのほうがおいしそうでした。
ロカボで回転ずしはありえないかと思いますが、自分で量が調整できるし、最近は握りずし以外のメニューも充実しているので、これはこれでありかなって思います。
でも、ネタだけ食べてシャリを残すのは見苦しい気がしますのでやめたほうがいいですよー。