OmniAICreator/Qiita-1.07M huggingface dataset:
DevTools tips — day 7: async consoleの楽しみ

この記事は[Tomek Sułkowski](https://medium.com/@tomsu)さんによる
フロントエンドエンジニア向けアドベントカレンダーの翻訳記事です。
とても勉強になったので許可を得て翻訳させていただきました。元記事は[こちら](https://medium.com/@tomsu/devtools-tips-day-7-the-simple-joys-of-async-console-578f4ce67df4)。
 
---

*休暇まであと24日です。私はこれからDevToolをより効果的に、そしてもっと楽しく使うためのコツを紹介する短い記事を書いていきたいと思います。[昨日](https://qiita.com/rena_m/items/31c11def5a83676f482f)はCommand Menuについて知りましたね。今日は21個目から始めます。*

# 21. Consoleはasync
最近では、Promiseベースのブラウザ関連APIが増えています。promiseを扱うときは普通`.then(handlerFn)`を使うか`async`関数でラップして`await`で結果を待つでしょう。

これはよくJavaScriptやTypeScriptのコードで出てくるものですが、コンソールでこうした構造を書くのが楽とは言えません。

いずれかのようになるでしょう。
![5.png](https://qiita-image-store.s3.amazonaws.com/0/318825/1f0a5c0a-8a18-624e-131a-d7abcb8f3e93.png)

![6.png](https://qiita-image-store.s3.amazonaws.com/0/318825/e71bde86-9aa0-9345-a290-0e73f65fd83e.png)

恐ろしいですね！私は過去にこれを書こうとして2回失敗しました。括弧を忘れたり、書き終える前にうっかりコードを実行してしまったりしたのです。

では、**コンソールがもとから'async'でラップされていたらどうでしょう。**

もう気づきましたか？そう、実は本当にそうなっているのです！直接`await`を使うことができます。

![7.gif](https://qiita-image-store.s3.amazonaws.com/0/318825/ca9fcf4f-b749-be6d-2794-b27b341dafdd.gif)

コンソールでpromiseを使うのは実際にはソースコードで使うよりも簡単なのです！

# 22. asyncコンソールで出来る素敵なこと
fetchの例はとてもつまらなかったですね、私もそれは認めます。ですから、コンソールから簡単にアクセスできるもっと面白い情報についてご紹介したいと思います。

- **systemのusageとquotaを保存する**
![8.png](https://qiita-image-store.s3.amazonaws.com/0/318825/cd3574b0-9827-19bb-ffc7-3b0bfcd19dc0.png)

- **デバイスのバッテリー情報**
他の日に学んだ`console.table`と合わせるとよい良い効果が得られます。
注意: これはdeprecatedになったAPIです。とても良さそうに見えるのですが…

![9.png](https://qiita-image-store.s3.amazonaws.com/0/318825/d1edf03e-89fa-49c7-f912-a482e56dceb9.png)

- **Media Capabilities**
![10.png](https://qiita-image-store.s3.amazonaws.com/0/318825/cb861917-030f-5ff6-d6bd-aa28365c5323.png)

- **ストレージのキーをキャッシュする**
![11.png](https://qiita-image-store.s3.amazonaws.com/0/318825/b9f2983f-de71-7de4-a325-b01156412733.png)
このようにいろいろなことができます。コンソールから簡単にpromiseでラップされたvalueがとれるようになりますね。

---

いつも通り、**なにか新しいことを学べたらぜひ**
→ もっと多くの人の目に止まるように**拍手👏ボタンをお願いします！**
→ 他の投稿も見逃さないように**[Twitter (@sulco)をフォロー](https://twitter.com/sulco)**してください！
VSCodeの設定画面(JSON)を表示させるショートカットの設定

みなさん、[VS Code](https://code.visualstudio.com/) 使ってますか？


フォントの大きさやTabのスペースの数など、設定で変更したいことがいくつかありますよね。
VSCodeにある様々なプラグインの追加設定なども設定画面から行えます。
プラグインの追加設定の方法などを見ると、User SettingsやWorkspace SettingsのJSONファイルを直接いじっている所が殆どだと思います。

その、JSONファイルの開き方ですが、まず左下の:gear: アイコン、または`⌘+,` (`Ctrl+,`)でVSCodeの設定画面のUIが開けます。

そこから、 右上の`{}`アイコンをクリックすることで設定がJSONフォーマットで編集できるようになります。

ただ、毎回 `{}` アイコンをクリックしに行くのはめんどうくさい‥

**今回はVSCodeの設定をJSONフォーマットで開く為のショートカットの設定方法について記載します。**

## キーボードショートカット一覧の表示

- `Code` > `Preferences` > `Keyboard Shortcut`でキーボードショートカットの一覧が表示されます。
    * `⌘+K ⌘+S`(`Ctrl+K Ctrl+S`)でもショートカットの一覧が表示されます。
- 検索画面でSettingsと入力してください
- `Open Settings (JSON)`というコマンドが表示されます。
- デフォルトではなんのキーもアサインされていないので、好きなショートカットを設定しましょう。
- 個人的には設定画面のUIは使わないのでもともと設定UIを開く`⌘+,`を上書きして使っています
（同じキーバインドが複数ある場合、Userが設定されたキーバインドが優先されます）


**これでらくらくVS Codeの設定がいじれます！**
添付プロパティをBindingのPathに指定する場合はカッコを付ける

BindingのPathに添付プロパティを指定する場合、カッコをつけないと「BindingExpression path error」になる。

```xml:XAML
<Window x:Class="Sample.MainView"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:Sample"
        Title="MainView" Height="300" Width="300">
    <Grid>
        <TextBox>
            <TextBox.Style>
                <Style TargerType="TextBox">
                    <Style.Triggers>
                        <!--Pathにカッコを付ける-->
                        <DataTrigger Binding="{Binding Path=(local:AttachedXXX.XXX), RelativeSource={RelativeSource Self}}" Value="True">
                            <Setter Property="Background" Value="Blue"/>
                        </DataTrigger>
                    </Style.Triggers>
                </Style>
            </TextBox.Style>
        </TextBox>
    </Grid>
</Window>
```
[ボクの考えたフレームワーク]

1.垂直ロールシザーズ型アプローチ
  →市場の上位レイヤーに適用

2.バレルロール型アプローチ
  →市場の中下位レイヤーに適用

3.Mk17強化型水爆(11t)を用いた反跳投弾
 →市場の反体制勢力に対して適用

#コンサルティング
【行動戦略】

1.Go for Broke(見敵必戦)
 →未開拓市場へ参入する際は大量の事業資産を集中投入し市場占有率100%を目指す

 2.Search and Destroy(索敵殲滅)
→新規参入勢力に対しては全方面からモグラ叩き作戦を実施し参入意欲を殲滅する

 3.Endlösung der Frage(最終的解決)
→潜在的敵対勢力はあらゆる手段を用いて粛清する
#コンサルティング
2018年取り組んでみたこと


# はじめに
年末なので今年を振り返ってみました。
今年は初めてのことに色々と取り組み、濃厚で刺激の多い年となりました。

以下、今年取り組んだことをいくつかあげてみたいと思います。

# 今年やったこと
## もくもく会に参加（初・もくもく会）
社外のもくもく会というものに参加したことがなかったのですが、参加してみるともくもくする時間を確保できるのですごく良かったです:clap:

## Angularのドキュメント翻訳（初・翻訳）
本当にちょっとだけですがドキュメントの翻訳をしました。英語への心理的ハードル高かったので、ほんの少しの分量の翻訳からと思い、やってみました。
実際やってみると、英語よりもgithubのリポジトリからフォークして修正してプルリク送る、という行為が初だったのと、submodule ってなに？ってところから操作が不安でそこに時間がかかってしまったように思います。

そしてこの翻訳作業、Angular日本ユーザー会のオーガナイザー、lacoさんがレビューしてくださいました。
単語の表記はこうした方が良いというお作法や、`text lint --fix`かけてね（表記揺れを修正してくれる）とか2、3回リジェクトをいただきました。内容もこういう表現の方が良いとか細かく見ていただき、英語に抵抗があっても安心して翻訳に参加することができました。リジェクトが数回あったので、お手数をおかけしてしまい申し訳なかったのですが、こういった経験をさせていただき、感謝の気持ちでいっぱいです！

2018年8月21日にマージされ、私のコントリビュート記念日となりました:clap:

Angularのドキュメント翻訳は、ちょっとでも翻訳するとコントリビューターとして自分のアカウントが表示されます！！！！！これ、めちゃくちゃ嬉しいです。めちゃくちゃテンション上がるし、いつ見てもニヤニヤしてしまいます:relaxed:こうやってみんなコントリビュートにはまっていくのかな。

ちなみにコントリビュータのアカウントや翻訳手順は [README](https://github.com/angular/angular-ja) にのっています。

## イベントのボランティアスタッフ（初・イベントボランティアスタッフ）

今年は数回、イベントのボランティアスタッフをしました。

初めてボランティアスタッフとして参加したイベントではほぼ知り合いの方がおらず、かなり心細かったのですが、コミュニティ活動をされている方々は優しく、おかげさまで知りあいの方が増えました！自分にとってはかなり大きな変化でした。お話を聞いていると知らないことばかりで、勉強させていただいています。

イベントを主催されている方々の思いというものも多少知ることが出来たように思います。イベント参加者として参加する際も、視点が変わり、以前に増して感謝するようになりました。

## 技術書典に購入者として参加（初・技術書典参加）
Qiitaにも書きましたが、初めて技術書典の存在を知り、実際いってみました。その記事は[こちら](https://qiita.com/shira_/items/f1942dbc1a7b646a8ecf)。

本書くってすごいなー、かっこいいなー、自分も書いてみたいなーという気持ちが芽生えました。本を買って、読んだきりになっていたりするので、もくもくしてアウトプットしたいです:writing_hand:

## 社内LT会企画・開催（初・社内LT企画、開催）
アウトプット欲が高まった結果、社内LT会を主催しました。

LT会を企画した話はスライドにまとめています。詳細は[こちら](https://speakerdeck.com/shira/she-nei-ltda-hui-kai-cui-nizhi-rumadefalsehua)です。

初の取り組みでしたが、30人前後の方が参加してくださり、すごく盛り上がる会となりました。次回以降「LTしたい！」という声も多く、自分だけでなく周りの方にとっても良い場を作れたと思い、嬉しい限りです:clap:

## Angularアドベントカレンダー投稿（初・Angularの記事投稿、初・Angularアドカレ）
アウトプットの取り組みの一つとして、LT以外にも「記事を書く」というアプローチをやっていきたいと思っており、かつ、Angular関連の記事を書いてみたいと思っていました。自分は今年の秋頃から仕事でAngularを使うプロジェクトに携わっていますが、まだまだ初心者状態なので、アドカレに登録したのは良いけど、ネタが思いつかず、かなり追い込まれました笑

結果、書いたのは[こちら](https://qiita.com/shira_/items/c5d323fb72e38e5e798e)です。

こんな簡単な内容の記事で良いのかな？とも思ったのですが、いいねを押してもらえるとアウトプットを応援していただけているような気がして励まされました。
そうやって背中を押し押されしながら成長できるような世界って幸せだし、素敵だなと個人的には思っています。

## 来年やりたいこと

- アウトプットを増やす、習慣にする
 - サンプル程度でもコードを書く
 - アプリを作る
 - 記事を書く
 - LTする
 - といった方法でアウトプット量を増やし、理解を深め、定着させていきたいです。
 - good first issue を見つけてプルリクを送るのもやってみたいです
- コードを読む、習慣にする

  
## まとめ
上記、今年取り組んだことをいくつかあげてみました。

最初は

- 自分にプレッシャーを与えたい
- 会社外のエンジニアの方とのつながりを持ちたい
- 仕事と関係なく興味あることをやってみたい

という視点から、興味あることに取り組んできました。

それらはとても刺激的でプラスでしかありませんでした。

途中からは　「自分にはアウトプットが足りていない、アウトプットに注力したい！」と思うようになり、LT大会やアドカレ等のアウトプット、来年の目標にも繋がっています。
無理したり、楽しく無くなると続かないので、少しずつでも続けることを大切にしていきたいと思っています。

最後に、この記事がどなたかの参考になれば幸いです。

メリクリッ:santa_tone1::christmas_tree:
(小ネタ) snapshotを自動作成しちゃうシェルスクリプト for DartVM用コマンド


先週の記事( https://qiita.com/takutaro/items/79d5cfe51138e45060c8 )の続編です。

「なぜpath指定ではsnapshotにpre-compileしてくれないのか・・」と嘆いた訳ですが、Activate時にsnapshotを作成してくれなくても、普段のdartコマンド実行時に似たことをすれば良い訳です。

## シェルスクリプトを作りました

snapshotを自動的に作り直し、それを実行します。2回め以降のDartコマンド起動が爆速になります。

bashです。Linuxで軽く動作確認しましたので多分動きます。macOSもbashが標準シェルと聞きましたので、多分動きます、知らんけど。
Windows用(PowerShellとか)は需要と供給(やる気)のバランスを考え、作るのはやめました。

```bash
#!/usr/bin/env bash

firstdir=$(pwd)
cd $(dirname $0)
mydir=$(pwd)
myname=$(basename $0)

# エントリポイントとなるdartファイルが存在しない場合はエラーとする
dartname="${mydir}/${myname}.dart"
if [ ! -f $dartname ]; then
  echo "${myname}.dart not found."
  exit 1
fi

# git管理対象ファイルのうち、一番新しいファイルの日時を取得する
cd $(git rev-parse --show-toplevel)
f=$(ls -t `git ls-files --full-name` 2> /dev/null | head -1)
if [ ! -f $f ]; then
  echo "Please manage with git."
  exit 1
fi
newest=$(date +%Y%m%d%H%M%S -r $f)

# snapshotファイルの日時を取得する
snapname="${dartname}.snapshot"
if [ -f $snapname ]; then
  snaptime=$(date +%Y%m%d%H%M%S -r $snapname)
else
  snaptime="00000000000000"
fi

# snapshotファイルが最新でない場合は作り直す
if [[ $newest > $snaptime ]]; then
  dart --snapshot=$snapname $dartname || exit 1
fi

# そしてsnapshotを実行！
cd $firstdir
dart $snapname "$@"
```

上記をコピペして下さい。

* エントリポイントとなるdartファイルと同じ場所に置きましょう
* ファイル名は、エントリポイントとなるdartファイルから拡張子(.dart)を除いたものにして下さい
* 実行権限を付けましょう(chmod +x)

なお実装の都合上、置き場所は ***git管理*** している必要があります。

## 起動が速いぞ！

個人的に欲しかったやつです。満足満足。
DeepChemをAnacondaの仮想環境にインストールする

化合物のDeepLearningライブラリであるDeepChemを真っさらなAnacondaの仮想環境にインスト―ルしたいと思います。

#動作環境
- CentOS7
- Anaconda3
- python3.6
- deepchem2.1.0

#インストール
まずはanacondaの仮想環境を作成します。

```
$ conda create -n deepchem python=3.6
```

仮想環境(deepchem)が作成されたことを確認します。

```
$conda info -e
# conda environments:
#
base                  *  /home/kimisyo/anaconda3
deepchem                 /home/kimisyo/anaconda3/envs/deepchem
django                   /home/kimisyo/anaconda3/envs/django

```

作成した仮想環境を有効にします。

```
$ source activate deepchem
(deepchem) $
```

続いてDeepChemのサイトに載っているコマンドをコピペしてインストールを行います。

```
$conda install -c deepchem deepchem=2.1.0 python=3.6
Solving environment: failed

PackagesNotFoundError: The following packages are not available from current channels:

  - deepchem=2.1.0
  - pdbfixer==1.4
  - deepchem=2.1.0
  - rdkit==2017.09.1
  - deepchem=2.1.0
  - xgboost==0.6a2

Current channels:

  - https://conda.anaconda.org/deepchem/linux-64
  - https://conda.anaconda.org/deepchem/noarch
  - https://repo.anaconda.com/pkgs/main/linux-64
  - https://repo.anaconda.com/pkgs/main/noarch
  - https://repo.anaconda.com/pkgs/free/linux-64
  - https://repo.anaconda.com/pkgs/free/noarch
  - https://repo.anaconda.com/pkgs/r/linux-64
  - https://repo.anaconda.com/pkgs/r/noarch
  - https://repo.anaconda.com/pkgs/pro/linux-64
  - https://repo.anaconda.com/pkgs/pro/noarch

To search for alternate channels that may provide the conda package you're
looking for, navigate to

    https://anaconda.org

and use the search bar at the top of the page.

```

PackagesNotFoundErrorが発生し、インストールに失敗しました。DeepChemの公式サイト[^1]を参考にしたのですが、RDkit、Xgboost等、依存するパッケージが見つからないようです。
そこでGitHubの方のサイト[^2]の方に記載されている以下のコマンドを実行したところ、数十分かかりましたがうまくインストールできました。

```
$conda install -c deepchem -c rdkit -c conda-forge -c omnia deepchem=2.1.0
```

インストール後、ライブラリをimportできるか確認したところ、警告はでるもののインポートはできましたので、インストールは完了です。

```
$ python
Python 3.6.6 | packaged by conda-forge | (default, Oct 12 2018, 14:08:43)
[GCC 4.8.2 20140120 (Red Hat 4.8.2-15)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import deepchem
/home/kimisyo/anaconda3/envs/deepchem/lib/python3.6/site-packages/sklearn/ensemble/weight_boosting.py:29: DeprecationWarning: numpy.core.umath_tests is an internal NumPy module and should not be imported. It will be removed in a future NumPy release.
  from numpy.core.umath_tests import inner1d
```

さぁ、バンバン化合物でDeepLearningやるぞ！

#参考文献
[^1]: https://deepchem.io/
[^2]: https://github.com/deepchem/deepchem
ARKitでシーンの重力を変更する方法

#やりたいこと
ARKitでオブジェクトの落下スピードを変更する方法を調べました。

#シーン内の重量を変更する
シーン内の重力を変更する方法です。gravityプロパティでX、Y、Z軸に対して変更を加えます。

```swift
// Y軸方向に重力を増減せたい値を設定する
sceneView.scene.physicsWorld.gravity = SCNVector3(0, -0.1, 0)

```

[SCNPhysicsWorld](https://developer.apple.com/documentation/scenekit/scnphysicsworld/1512855-gravity)

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">アプリ空間上の重力変更すれば落下スピード変えれた！<a href="https://twitter.com/hashtag/AR?src=hash&amp;ref_src=twsrc%5Etfw">#AR</a> <a href="https://twitter.com/hashtag/ARKit?src=hash&amp;ref_src=twsrc%5Etfw">#ARKit</a> <a href="https://t.co/Vte8QLXuX9">pic.twitter.com/Vte8QLXuX9</a></p>&mdash; TatsunoriMorita (@king_of_morita) <a href="https://twitter.com/king_of_morita/status/1074132587134693376?ref_src=twsrc%5Etfw">2018年12月16日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


#まとめ
重力変更以外にオブジェクトの落下スピードを変える方法として、オブジェクトの空気抵抗を変更するやりかたもあります。
場合によって使い分ければいいかと思います。

```swift
// 空気抵抗の値を変更する
scnNode.physicsBody?.damping = 1

```

[SCNPhysicsBody](https://developer.apple.com/documentation/scenekit/scnphysicsbody)
DevTools tips — day 6: Command Menu

この記事は[Tomek Sułkowski](https://medium.com/@tomsu)さんによる
フロントエンドエンジニア向けアドベントカレンダーの翻訳記事です。
とても勉強になったので許可を得て翻訳させていただきました。元記事は[こちら](https://itnext.io/devtools-tips-day-6-thecommand-menu-449eb3966d9)。
 
---

*休暇まであと24日です。私はこれからDevToolをより効果的に、そしてもっと楽しく使うためのコツを紹介する短い記事を書いていきたいと思います。[昨日](https://qiita.com/rena_m/items/445e414cc8f66b6b5935)の16個目は1つだけでしたが、非常に興味深い内容でしたね。それでは続きをやっていきましょう。*

# 17. コマンドメニューを使い始める(使ったことがなければ)
Chrome開発者ツールの一部の機能は特定のタブやメニューの奥深いところに埋められています。そのうえ、さらにそれらの下に隠されているものもあります。これこそが、*Command Menu*が不可欠なツールである理由です。

もしもこれまでにWebStormで`"Find Action"`やVisual Studio Codeで`"Command Palette"`を使ったことがあれば、まさにそれと似た機能です。表示する方法は2つあります。
- `[Ctrl]+[Shift]+[P]`(Macでは`[⌘]+[Shift]+[P]`)を開発者ツールを開いている時に(フォーカスしていなくても大丈夫)押す
- 開発者ツールの`⋮`ドロップダウンボタンで出てくる選択肢から選ぶ

![1.png](https://qiita-image-store.s3.amazonaws.com/0/318825/946bf9e8-23c6-18c9-4d03-d2d7b7d482f9.png)

そうすると、コマンドの入力欄と利用できる数多のコマンドの一覧を見ることができます。このリストは以下の画像のようにいくつかにグループ分けされています。

![2.png](https://qiita-image-store.s3.amazonaws.com/0/318825/a65afd3d-9521-a4c8-1c10-a6c718beacf4.png)

> ところで、私は個人的にこの画像は開発者ツールがいかに*ありえないほどパワフル*であるかをよく示していると感じています！

ここに隠されている素晴らしい機能の一部を見ていきましょう。

# 18. 大小のスクリーンショットを撮る
特定のDOM nodeのスクリーンショットを撮りたければ、nodeを選択して、Command Menuを開き、`Capture node screenshot `コマンドを探してください。

更に便利なのが、同じように`Capture full size screenshot`を利用すればフルページのスクリーンショットも撮ることができるということです。フルページというのは、もちろんウィンドウに映っている部分だけではありません。昔はこのために拡張を使わなければいけなかったことを思い出しますね!

![2.gif](https://qiita-image-store.s3.amazonaws.com/0/318825/c3150db5-e77d-955c-7525-b39bd2625dd7.gif)

# 19. タブのレイアウトを瞬時に切り替える
開発者ツールはデュアルタブのレイアウトを使い(例えば*Elements*や*Sources*など)、画面サイズに応じて横並びか縦並びにして読みやすく表示しようとしています。とはいえ、時にはこのレイアウトではない方がいい時もあります。

(htmlのプレビューの下にある*Styles*を右側、または別の場所に移そうと開発者ツールをリサイズしたことはありませんか？まさにそのことです😉)

**Commands Menu**を開いて**"layout"**と入力すると、3つのあり得る選択肢の中から2つが表示されます(現在アクティブになっている選択肢は表示されません)。
- Use horizontal panel layout
- Use vertical panel layout
- Use automatic panel layout
お好きなものを選んでください。

![3.gif](https://qiita-image-store.s3.amazonaws.com/0/318825/b2150109-f91a-c29e-1812-257a1d69f5a6.gif)

# 20. テーマを瞬時に切り替える
急に光を不快に思い始めたり、明るく輝く画面を見ていられないと思ったことはありますか？もしくは、ダークモードで仕事をしているのに開発者ツールで急に日が昇り、輝き始めて何も見えなくなったことはありませんか？

**Commands Menu**で**"theme"**から始める選択肢を探し、瞬時にダークテーマとライトテーマを切り替えてください。
![4.gif](https://qiita-image-store.s3.amazonaws.com/0/318825/f3477993-789c-dd34-87c9-83a6c1017bb6.gif)

---

今日はこれくらいにしましょう。
いつも通り、**なにか新しいことを学べたらぜひ**
→ もっと多くの人の目に止まるように**拍手👏ボタンをお願いします！**
→ 他の投稿も見逃さないように**[Twitter (@sulco)をフォロー](https://twitter.com/sulco)**してください！
Railsのprovideとyieldの関係

viewで**provideヘルパー**を利用することで、ここのテンプレートからレイアウト側にタイトルを引き渡すことができる。

```view/home.html.erb
<%　provide :title, 'タイトルの例' %>
```
レイアウト側からは、**yield メソッド**を利用することで呼び出せる。

```layouts/application.html.erb
<title><%= yield(:title) || 'Rails入門' %></title>
```
raspberry pi 1でgtkmm その3

#概要

raspberry pi 1でgtkmmやってみた。
時計やってみた。

#写真

![2018-12-22-111524_1440x900_scrot.png](https://qiita-image-store.s3.amazonaws.com/0/18104/d390f9c2-62fa-a4c5-156e-f7d418ce8f72.png)


#サンプルコード

```
#include <gtkmm/drawingarea.h>
#include <ctime>
#include <cmath>
#include <cairomm/context.h>
#include <glibmm/main.h>
#include <gtkmm/application.h>
#include <gtkmm/window.h>

class Clock: public Gtk::DrawingArea
{
public:
	Clock();
	virtual ~Clock();
protected:
	bool on_draw(const Cairo::RefPtr<Cairo::Context>& cr) override;
	bool on_timeout();
	double m_radius;
	double m_line_width;
};
Clock::Clock(): m_radius(0.42), m_line_width(0.05)
{
	Glib::signal_timeout().connect( sigc::mem_fun(* this, &Clock::on_timeout), 1000);
}
Clock::~Clock()
{
}
bool Clock::on_draw(const Cairo::RefPtr<Cairo::Context>& cr)
{
	Gtk::Allocation allocation = get_allocation();
	const int width = allocation.get_width();
	const int height = allocation.get_height();
	cr->scale(width, height);
	cr->translate(0.5, 0.5);
	cr->set_line_width(m_line_width);
	cr->save();
	cr->set_source_rgba(0.337, 0.612, 0.117, 0.9);
	cr->paint();
	cr->restore();
	cr->arc(0, 0, m_radius, 0, 2 * M_PI);
	cr->save();
	cr->set_source_rgba(1.0, 1.0, 1.0, 0.8);
	cr->fill_preserve();
	cr->restore();
	cr->stroke_preserve();
	cr->clip();
	for (int i = 0; i < 12; i++)
	{
		double inset = 0.05;
		cr->save();
		cr->set_line_cap(Cairo::LINE_CAP_ROUND);
		if (i % 3 != 0)
		{
			inset *= 0.8;
			cr->set_line_width(0.03);
		}
		cr->move_to((m_radius - inset) * cos (i * M_PI / 6), (m_radius - inset) * sin (i * M_PI / 6));
		cr->line_to (m_radius * cos (i * M_PI / 6), m_radius * sin (i * M_PI / 6));
		cr->stroke();
		cr->restore();
	}
	time_t rawtime;
	time(&rawtime);
	struct tm * timeinfo = localtime(&rawtime);
	double minutes = timeinfo->tm_min * M_PI / 30;
	double hours = timeinfo->tm_hour * M_PI / 6;
	double seconds= timeinfo->tm_sec * M_PI / 30;
	cr->save();
	cr->set_line_cap(Cairo::LINE_CAP_ROUND);
	cr->save();
	cr->set_line_width(m_line_width / 3);
	cr->set_source_rgba(0.7, 0.7, 0.7, 0.8);
	cr->move_to(0, 0);
	cr->line_to(sin(seconds) * (m_radius * 0.9), -cos(seconds) * (m_radius * 0.9));
	cr->stroke();
	cr->restore();
	cr->set_source_rgba(0.117, 0.337, 0.612, 0.9);
	cr->move_to(0, 0);
	cr->line_to(sin(minutes + seconds / 60) * (m_radius * 0.8), -cos(minutes + seconds / 60) * (m_radius * 0.8));
	cr->stroke();
	cr->set_source_rgba(0.337, 0.612, 0.117, 0.9);
	cr->move_to(0, 0);
	cr->line_to(sin(hours + minutes / 12.0) * (m_radius * 0.5), -cos(hours + minutes / 12.0) * (m_radius * 0.5));
	cr->stroke();
	cr->restore();
	cr->arc(0, 0, m_line_width / 3.0, 0, 2 * M_PI);
	cr->fill();
	return true;
}
bool Clock::on_timeout()
{
	auto win = get_window();
	if (win)
	{
		Gdk::Rectangle r(0, 0, get_allocation().get_width(), get_allocation().get_height());
		win->invalidate_rect(r, false);
	}
	return true;
}
int main(int argc, char ** argv)
{
	 auto app = Gtk::Application::create(argc, argv, "org.gtkmm.example");
	 Gtk::Window win;
	 win.set_title("Cairomm Clock");
	 Clock c;
	 win.add(c);
	 c.show();
	 return app->run(win);
}



```

以上。
超初学者がSQL周りを雑学した

webエンジニアとしてインターンをさせていただいている大学生ですが、先日SQL文を書く機会がございまして。
これを機に少しざっくり学んでみようと思った次第です。

いきなりSQLの構文を学ぶのも良いですが、せっかくなので範囲を広げて、浅く、ざっくりと学んでみました。


# DBMSとは

DataBase Management Systemの略。

サービスを作る際に必要となるデータ群を管理するソフトウェアの総称。


# RDBMSとは

Relational DataBase Management Systemの略。

RDBというデータベース構造でデータ群を管理するソフトウェアの総称。

主なものとして
- MySQL
- SQLite
- PostgreSQL

がある。

## RDBとは

Relational DataBaseの略。日本では「関係データベース」とも呼ばれる。

エクセルのように表形式でデータを管理する。

[詳しくはこちら](http://e-words.jp/w/%E3%83%AA%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%8A%E3%83%AB%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9.html)

# NoSQLとは

SQLを使わないデータベース構造なので、NoSQL。

主なものとして
- Cassandra
- MongoDB

がある。


# 図にまとめるとこんな感じ
<img width="878" alt="スクリーンショット 2018-12-22 11.21.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/231086/ed2ace39-1ed3-e4de-276b-b22133659601.png">



# SQLとは
文中で「SQL」というワードが良くでてきましたが、これは1つの「言語」として捉えるのが正しいでしょう。

SQLは「データベース言語」と呼ばれます。一般的な「プログラミング言語」とは少し違いますね。

SQLを用いることで、RDBMSを操作することができます。


# 参考
書いた後に見つけたのですが、こちらの方が詳しく書かれています。

[データベースの基礎：RDBMS、MySQLの基礎、ビッグデータ](https://qiita.com/KazukiKawamura/items/1f053ab614b61a93500e)
raspberry pi 1でgtkmm

#概要

raspberry pi 1でgtkmmやってみた。
raspberry pi 1 model bに、インストールしてみた。
hello worldやってみた。

#環境

Raspberry pi 1 model b(element14)
sd-card 8GB
raspbian 2016-11-25 jessie with pixel

#インストール

sudo aptitude install gtkmm-3.0-dev

#写真
![2018-12-22-094302_1440x900_scrot.png](https://qiita-image-store.s3.amazonaws.com/0/18104/07d7fea2-0000-2be9-bfea-7e6b4df1f35e.png)

#Makefileを書く。

```
CXXFLAGS ?= `pkg-config gtkmm-3.0 --cflags --libs` -I../tensorflow -I../tensorflow/tensorflow/lite/tools/make/downloads/flatbuffers/include
LDFLAGS ?= -L../tensorflow/tensorflow/lite/tools/make/gen/rpi_armv6l/lib

.PHONY: all clean

all: main

main: main.cpp
	g++ --std=c++11 main.cpp -O2 $(CXXFLAGS) $(LDFLAGS) -ltensorflow-lite -lstdc++ -lpthread -ldl -lm -lasound -o test

clean:
	rm -f test

```

#サンプルコード


```
#include <gtkmm.h>

class MainWin: public Gtk::Window
{
	Gtk::Button m_bt;
public:
	MainWin();
private:
	void on_bt_clicked();
};
MainWin::MainWin(): m_bt("click")
{
	m_bt.signal_clicked().connect(sigc::mem_fun(* this, &MainWin::on_bt_clicked));
	add(m_bt);
	show_all_children();
}
void MainWin::on_bt_clicked()
{
	Gtk::MessageDialog diag(* this, "Hello World!");
	diag.run();
}
int main(int argc, char * argv[])
{
	Gtk::Main kit(argc, argv);
	MainWin mainwin;
	Gtk::Main::run(mainwin);
	return 0;
}

```

以上。
FragmentのViewにlateinitをつけてはいけないのでは?

この投稿は[Android Advent Calendar 2018](https://qiita.com/advent-calendar/2018/android) 20日めの代理です。

# 言いたいこと
FragmentのViewは動的に生成されて動的に破棄されるからNullable

# 経緯
AndroidとKotlinで開発していると FragmentのBindingやfindViewById()したViewをどうやってプロパティに保持するか困ってしまいます。
Viewの生成はonCreateView()で行われます。
そのため、クラスインスタンスの初期化時に初期化が必要なvalを使うことが出来ません。

Lazyを使ってはいけないというのはこちらのエントリにあるとおりで、lateinitを使うのがデファクトになりつつある気がします。
[FragmentでKotlinのby lazyを使ってfindViewByIdするとレイアウト反映できない&リークする件](
https://qiita.com/takahirom/items/49e18ec7084bb3b1937e)

私もlateinitを使っていました。
これをどうにかカスタムLazyを使って再現できないかと考えていた時、突然、何だかやってはいけないことをやっている気持ちになったのです。


# なぜか?

FragmentのViewはNullableだからです。
本来lateinitはDIのようにインスタンス初期化時には初期化されていないがその直後使用前には必ず初期化されることが保証されているものにたいして例外的に使用されることを想定した仕様ではないでしょうか？

FragmentのViewはその仕様にそぐわない気がします。
`fragment#getView()` にも明確に `@Nullable` と宣言されています。
`onCreateView()` が終了して `onDestoryView()` の間だけViewが存在し、その外ではNullになる可能性があります。

カスタムLazyを作っている時も、view#findViewById()を呼びたいが、当のviewがnullableである問題が発生し `!!` でviewのNull可能性を無視すればnon nullな値を返すことはできるけれど、うっかりViewが生成されていないタイミングで呼び出すと `NullPointerException` が発生します。

たしかに、 `lateinit` を使ってもライフサイクルを意識してコーディングを行えば、viewがnullのときにアクセスしてしまうことはないかもしれません。

でも、それって要するにNullableをプログラマが上手に回避しているだけですよね
せっかくのKotlinが作ったNull安全なしくみをあえて崩しているように思います。
そこまでして、Nullチェックをしないメリットも見当たりません。

# ではどうするか?

素直にNullableを使って、アクセス前はNullチェックをするというのはどうでしょう？

## DataBindingを使っている場合
もし、DataBindingを使っているなら、onCreateViewで作ったBindingをonDestoryViewで破棄すればBindingのNullチェックを行うことでView全体のNullチェックが可能です。

 
onCreateView()でViewの初期化とBindingプロパティに値をセットする。
 
``` kotlin
private var binding: FragmentFooBinding? = null
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
// 中略
        return FragmentFooBinding.inflate(LayoutInflater.from(activity)).also{binding ->
            this.binding = binding
// Viewの初期化処理

        }.root
}
```



onDestoryで破棄

``` kotlin
override fun onDestory(){
    super.onDestory()
    binding = null
```
Binding内の各Viewはnon nullなので [^1] Bindingをnullチェックすれば一つ一つのViewの存在チェックは不要です。

``` kotlin
binding?.let{binding ->
  binding.textView.text = "foo"
}
```

## DataBindingを使っていない場合
DataBindingを使っていないならViewを保持するViewHolderクラスをつくるのが便利かと思います。

``` kotlin
class ViewHolder(val textView:TextView,val imageView:ImageView)
```
 
onCreateView()でViewHolderに値をセットする。
 
``` kotlin

private var viewHolder:ViewHolder? = null
override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View {
        val view = inflater.inflate(R.layout.main_fragment, container, false)
        viewHolder = ViewHolder(textView = view.findViewById(R.id.textView), imageView = view.findViewById(R.id.imageView))
..
```

onDestoryで破棄

``` kotlin
override fun onDestory(){
    super.onDestory()
    viewHodler = null
```


これなら、うっかりライフサイクルの外でViewを呼んでしまっても安心です。

#追記
[FragmentのViewをさらに考察してみる。](https://qiita.com/kenz_firespeed/items/5989a6f2e24c79e92410)
[^1]: 実はData Bindingにはにくい機能があって、画面サイズや向きによって存在しないViewがあった場合はしっかりnullableにしてくれます。
RancherOSでもvimしたい！

[こうなる](https://forums.rancher.com/t/problem-with-installation/1861/3)前に。

# How

```bash
$ sudo vi /etc/profile.d/vim.sh
$ source /etc/profile.d/vim.sh
```

```sh:/etc/profile.d/vim.sh
alias vim='docker run -it --rm -v $HOME:/root -v $PWD:/work -w /work thinca/vim:latest'
```

# この`vim`にできないこと

* 開けるファイルはカレントディレクトリ（と`$HOME`）のみ。`sudo vim /etc/...`とかできないです。
* `:terminal`はおそらく意図通りの動きをしないです。コンテナ内なので。

# コード化したいときは

cloud-configで`write_files`使う。

```bash
$ sudo vi /var/lib/rancher/conf/cloud-config.d/user_config.yml
```

```yaml:/var/lib/rancher/conf/cloud-config.d/user_config.yml
#cloud-config
...(snip)...
write_files:
  - container: console
    path: /etc/profile.d/vim.sh
    permission: "0644"
    owner: root:root
    content: |+
      alias vim='docker run -it --rm -v $HOME:/root -v $PWD:/work -w /work thinca/vim:latest'
```
シンボルとは

この記事は[ギークハウス新宿界隈 Advent Calendar 2018 7日目](https://adventar.org/calendars/3550)の記事です。


##はじめに
公式ドキュメントでは、シンボルついて以下のように説明されています。
> シンボルを表すクラス。シンボルは任意の文字列と一対一に対応するオブジェクトです。
文字列の代わりに用いることもできますが、必ずしも文字列と同じ振る舞いをするわけではありません。 同じ内容のシンボルはかならず同一のオブジェクトです。

なんとなく、「文字列と似たような働きができるのかな？」程度は理解できるのですが、
この説明だけでは文字列と比較して、どのような利点があるのかがわからなかったのでまとめてみました。

##基本形
```ruby
:symbol_name
```

##シンボルと文字列の違い
###クラスが違う
  - シンボルはSymbolクラス ``:apple.class #=> Symbol``
  - 文字列はStringクラス   ``'apple'.class #=> String``

###処理速度がシンボルの方が速い
シンボルは表面的には文字列と同じように見えますが、<strong>整数として管理される</strong>ために文字列より高速に処理されます。

###メモリの使用効率が良い
シンボルが同じであれば全く同じオブジェクトになるため、文字列よりもシンボルの方がメモリの使用効率が良くなります。
※同じオブジェクトであるかは、object_idメソッドでわかる。

```ruby
#シンボル
:apple.object_id #=> 1282588
:apple.object_id #=> 1282588

#文字列
'apple'.object_id #=> 70191702696840
'apple'.object_id #=> 70191706838180
```
###シンボルはイミュータブルなオブジェクト
シンボルは文字列と違いイミュータブルなオブジェクトであるため、文字列のように破壊的な変更はできません。
名前を指し示す時に使うことで、勝手に名前を変更されないようにすることができます。
[イミュータブルがわからない方はこちらを参照](https://tomoyuki65.com/what-is-mutable-and-immutable-in-ruby/)

```ruby
string = 'apple' #=> "apple"
string.upcase! #=> "APPLE"
string #=> "APPLE"

symbol = :apple #=> :apple
symbol.upcase! #=> NoMethodError (undefined method `upcase!' for :apple:Symbo
```
##用途
文字列と比較した時の<strong>処理速度の速さと、メモリの使用効率の良さ</strong>を活かし、
名前を識別したいが、その名前が文字列である必要がない場合に使われます。

以下、代表的な利用例。
###ハッシュのキー

```ruby
{:name => 'Tom', :mail => 'tom@mail.com'}
```
###アクセサの引数で渡すインスタンス変数名

```ruby
attr_render :name
```
##参考
[公式リファレンス](https://docs.ruby-lang.org/ja/latest/class/Symbol.html)
[プロを目指す人のためのRuby入門](https://www.amazon.co.jp/%E3%83%97%E3%83%AD%E3%82%92%E7%9B%AE%E6%8C%87%E3%81%99%E4%BA%BA%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AERuby%E5%85%A5%E9%96%80-%E8%A8%80%E8%AA%9E%E4%BB%95%E6%A7%98%E3%81%8B%E3%82%89%E3%83%86%E3%82%B9%E3%83%88%E9%A7%86%E5%8B%95%E9%96%8B%E7%99%BA%E3%83%BB%E3%83%87%E3%83%90%E3%83%83%E3%82%B0%E6%8A%80%E6%B3%95%E3%81%BE%E3%81%A7-Software-Design-plus%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA/dp/4774193976/ref=sr_1_1?s=books&ie=UTF8&qid=1545445352&sr=1-1&keywords=%E3%83%97%E3%83%AD%E3%82%92%E7%9B%AE%E6%8C%87%E3%81%99%E4%BA%BA%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AEruby%E5%85%A5%E9%96%80+%E8%A8%80%E8%AA%9E%E4%BB%95%E6%A7%98%E3%81%8B%E3%82%89%E3%83%86%E3%82%B9%E3%83%88%E9%A7%86%E5%8B%95%E9%96%8B%E7%99%BA+%E3%83%87%E3%83%90%E3%83%83%E3%82%B0%E6%8A%80%E6%B3%95%E3%81%BE%E3%81%A7)
busyboxに救われたお話

# はじめに
かなりの大事故をやらかし「うわー、にっちもさっちもいかない・・・(ノД`)・゜・。」的な状況になったのですが、首の皮一枚で救われた(´▽｀) こんな経験から記事を起こしてみました。
みなさまには決して経験していただきたくはないので、経験した内容も含めて書いていこうと思います。

# 何やらかしたのさ？
細かいところは省略しますが、RedHatLinux6(64ビット)のサーバ作業中に、rootユーザでシェルスクリプトを使ってこんなコマンドを流してしまいました。

```
# mv /* 
```
で、どうなったかというと

```
# ls
-bash: /bin/ls: No such file or directory
# /path/bin/ls
-bash: /path/bin/ls: /lib64/ld-linux-x86-64.so.2: bad ELF interpreter: No such file or directory
# /path/bin/mv
-bash: /path/bin/mv: /lib64/ld-linux-x86-64.so.2: bad ELF interpreter: No such file or directory
```
ありとあらゆる基本コマンドが使えなくなり、新たにSSH接続を行えない状態に。使えるのは `echo`、`cd`、`export` といった程度・・・
普通でしたらサーバをインストールDVD/CDメディアで起動し、トラブルとなったディスクをマウントして救済、という手段を思いつくのですが、このケースでは当方でマシン自身を触って操作を行うことができない状況でした。

# あらこんなところに!
サーバ構築や運用経験がそれほど多くない私ではどうにもできず、いろんな方にヘルプを求め、わしゃわしゃしてるときにでてきた案が今回の「`busybox` を使ってみては？」でした。
「それって何? おいしいの? ls や cat も使えないのに大丈夫なのかな? そもそもこのサーバに入っているのかな・・・?」と半信半疑なのでしたが・・・探してみたら・・・いました！
藁にもすがる思いでコマンドポチポチ。

```
# /path/to/busybox ls
README  testfile.txt
# /path/to/busybox cat testfile.txt
abcdefg
hijklmn
```
「出た～～～！」
\# お化けじゃないって・・・

mv も使えるようになってるかな・・・期待して、急ぎ、最低限のバイナリ群を戻してみる。

```
# /path/to/busybox mv /path2/lib64 /
# /path/to/busybox mv /path2/lib /
# /path/to/busybox mv /path2/bin /
```
成功! (≧▽≦)
これで使えるようになるはず・・・

```
# ls
README  testfile.txt
```
うわぁん! 嬉しすぎる!!

# busyboxって何者?
今回のトラブルの救世主となった `busybox` 。結局どんなモジュールなのか調べてみました。
　◆[BusyBoxサイト](https://busybox.net/about.html)
英語なんでざっくり一言でまとめると「UNIXコマンドをひとまとめに詰め込んだ、これ単体で完結するアーミーナイフ(=十徳ナイフ)みたいなもの」だそうです。
`busybox [UNIXコマンド]` のようにコマンド投入すると指定したUNIXコマンドが実行できる優れモノです。
~~こいつ~~ 救世主 `busybox` ですが、ルーターとかミュージックプレーヤーとかの機器でLinuxを使う際に利用されているようです。

# 最後に
もし現在のサーバにこれが入っていないようであれば、「何かあったときのため」に入れておくのもよいかと思います。

> こんなことにならないために、いくら時間が限られていても、コードレビューと入念なテスト、必要に応じて別の人に作業中の確認を行ってもらうことが大切です。

\#これがあるから root ユーザで作業するのはすごく怖く、極力やりたくない・・・
Civic Hack Night で使ってる Google Forms

# Civic Hack Night で使える Google Forms

[Code for Kanazawa Civic Hack Night](https://www.facebook.com/CivicHackNight/) というイベントの運営を手伝っております。その中でもイベント終了時にかならず使っている Google Forms を紹介します。

## Google Forms とは

そもそも「フォームって何？」という説明が必要ですね。

[フォーム (ウェブ) - Wikipedia](https://ja.wikipedia.org/wiki/%E3%83%95%E3%82%A9%E3%83%BC%E3%83%A0_(%E3%82%A6%E3%82%A7%E3%83%96))

Wikipedia でもだいぶ技術よりな内容ですが、よくみかけるのは、ウェブページ上の申し込みページやアンケートページ、ウェブページの入力欄のことです。

これを作成するには Wikipedia に記載されているようなHTMLを使ったページを作成したり、それをみせるウェブサーバを用意したりといろんなことを準備しないといけません。

が、それらを Google Forms が代行してくれて、こちらとしては設問を用意するぐらいでフォームを作り、みんなに入力してもらうことができるというGoogle の サービスです。

本家のページを参照してみてください。 

[Google フォーム - アンケートを作成、分析できる無料サービス](https://www.google.com/intl/ja_jp/forms/about/)


## 基本的な使い方

新規フォームを選択し、タイトルと説明を入れたら設問を作成していきます。最初は右下の「？」から使い方ガイドを表示させるとよいです。

かなりいろいろな入力方法が選べてファイルのアップロードまであります。入力必須にすることもできます。

![スクリーンショット 2018-12-22 10.31.46.png](https://qiita-image-store.s3.amazonaws.com/0/50220/03b4a747-e763-2289-3e26-384bbe0ec965.png)

どの場合にどの項目を使うのがベターか？というのは基本的なパソコンやウェブでなれているものばかりなのですが、いざ自分で作ってみるとなるとイマイチピンとこないでしょうので、項目を作成したら右上の目アイコンをクリックして自分で実施してみてください。

基本的な例やガイドラインはヘルプを参照してください。

[フォームの質問を選択する - ドキュメント エディタ ヘルプ](https://support.google.com/docs/answer/7322334?hl=ja&ref_topic=6063584)

## 活用法 お問い合わせフォームとして使う

結構あるのがこの使い方ではないでしょうか。最近はSNSなどもありますが、何もログインしてなくても使えるというのは結構大きいです。

## 活用法 正規化したデータを集める

メール・LINEなどの自由入力で情報を集めるとどうしても人それぞれになってしまいます。それをある程度書式化して集めることで、オープンデータの作成や共同入力がとても便利になります。

## 活用法 とにかくアウトプットしてもらう

Civic Hack Night ではみんなに気軽にアウトプットしてもらおうと思って採用しています。QRコードで入力URLをシェアし最後に10分使ってみんなに一言コメントを入力してもらいます。連携したスプレッドシートをスクリーンに表示しておくと、リアルタイムでコメントやアンケート結果をみんなでみることができてとてもおもしろいです。

[このようにシェアできます](https://docs.google.com/spreadsheets/d/1KW0i52Cn9PxZ5xB5noJEQiutchmZ3d5UHyiVVsEZIyQ/edit?usp=sharing)。

連携方法は回答を見るタブのところにあります。

![スクリーンショット 2018-12-22 10.52.17.png](https://qiita-image-store.s3.amazonaws.com/0/50220/f1a0d591-2007-97cc-57ad-af637985267e.png)

なにか1つでもスマホやパソコンを使ってアウトプットできればICTを活用したっぽくていいです。


# まとめ

まずは使ってみる・作ってみるハードルが一気に下るツールですのでぜひ使ってみてください。こういったものが普及してくるとどうしてデベロッパがオープンデータの形式についてこだわるか、そこが腕前になるのか、という気持ちが少しはわかりあえるんじゃないかなあ。
Why named Haskell?

Haskell is the name of a person who studied logic. His name is **Haskell Brooks Curry**, an American Mathematician. 

During his career, his work on the relationship between logic  and  the types of programming languages had a  profound effect on the development of modern programming languages such as the one now called Haskell.

Most of the programmers may have heard of his name from two  sources;  one is the programming language Haskell, and the other from the theory about a relationship between Type theory and Logic, called Curry-Howard isomorphism. The programming language Haskell, through its purity, makes the great use of Curry-Howard isomorphism for real world applications.

For example, one could write a 'proof' of Yoneda Lemma in Haskell:

```haskell

-- Hom(A, B) <-> Nat( Hom_op(A, -), Hom_op(B, -)).

y :: (a -> b) ->  (forall c. (c->a)  -> (c->b) )
y = undefined

y_inv :: (forall c. (c->a) -> (c->b)) -> (a -> b)
y_inv  = undefined
```
Replacing undefined with proper  Haskell terms y_inv .  y = id and y . y_inv == id is left as an exercise.

In simpler terms, Curry-Howard isomorphism says that the types correspond to a logical statement, and terms to the proofs of the statement. So, writing the terms for above types is the same thing as proving the Yoneda  lemma for the category of Haskell types.

Thanks guys!
***
Haskellってある人物の名前だったのですね。
無論、SPJも影響されています。
DynamoDB用のQuery DSLを作ってみた

はじめまして、LOBでGopherをやっているChifung Cheungです。

最近は筋トレに集中してあんまりネタがないので、夏休みに作ってみたDSLについて軽く話したいと思います。

# やりたいこと

みんなさんAWS DynamoDBのコマンドラインツール`aws-cli`を使ったことがありましょうか？
簡単なCRUD操作をするには、`aws-cli`ではかなり複雑になります。

例えば、`users`テーブル内の`group_id = 1`(HashKey)と`user_id = "DUMMY_USER_1"`(RangeKey)のユーザをGETするには、

```
aws dynamodb get-item --table-name users  --key '{ "group_id": {"N": "1" }, "user_id": {"S": "DUMMY_USER_1"} }'
```

のように書けなければならない。

このような煩雑なコマンドを、

```
select * from users where group_id = 1 and user_id = "DUMMY_USER_1";
```

のようなSQL-likeのように書けるなら、大喜びでしょうね。

便宜上、この自作言語を**DDQL**(DynamoDB Query Language)と名付けます。

# 設計

## アーキテクチャ

目標を達成するには、ASTParserとExecutor、２つのパーツが必要です。

![Screen Shot 2018-12-19 at 12.03.16.png](https://qiita-image-store.s3.amazonaws.com/0/86204/ced0a462-58c0-057d-a56c-60d482c2b23a.png)

* ASTParserは、DDQLを機械が読めるデータ構造AST(Abstract syntax tree)に変換する役目を担います。極ピュアなパーツであります。
* Executorは、ASTを読み込んでAWS形式に変換してAWSで実行するためのパーツです。要注意なのは、ASTとAWSのコマンドは一対一の関係ではありません。例えば上記のDDQLを見るだけで、`group_id`と`user_id`はHashKeyかRangeKeyかわからないので、AWSの`describe table`でテーブルのスキーマを取得してその情報で`get`か`query`かどちらを使うのを決めないといけません。

MySQLのようなしっかりしたシステムだと、上記の部分だけではなく、OptimizerやSchedulerなどの登場人物がいって、複雑なSQLを簡素化したり実行環境によって効率的な実行計画を練ったりしますが、今回のタスクでは特に必要がありません。

また、世の中ではASTParserというパーツが存在しないQuery DSLも存在します。例えばaws-cliが使っているDynamoDB Low-Level APIの[仕様](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Programming.LowLevelAPI.html)をご覧ください。



```
POST / HTTP/1.1
......
X-Amz-Target: DynamoDB_20120810.GetItem

{
    "TableName": "Pets",
    "Key": {
        "AnimalType": {"S": "Dog"},
        "Name": {"S": "Fido"}
    }
}
```

DynamoDB Low-Level APIは、ASTをJSONの形式で表現して、マシンにとってはとても読み取りやすい構造になっています。ほかに、Elasticsearchの[Query DSL](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl.html)も似た思想で設計されています。　
JSON以外に、YAMLやS式でDSLを表現するのもかなりあります。既存のフォーマットでDSLを表すのが、AST Parserを設計・開発するの手間を省け、本来価値があるべきの部分の開発に集中できます。
とはいえ、使いやすさこそがDSLの存在価値なので、手軽くDynamoDBのデータを確認できるツールはやはりほしいですね。

## Tech Stack

parserを書く方法は、大体三種類に分かれています。

- **手書き**。本気で自作言語を作るならこの手でしょうね。一番実行効率的な方法ですが、開発時間が長くて腕次第で汚いコードになってしまう可能性があります。この問題に対して、既存のオープンソースのparserをベースで開発するのも割といい選択肢です。近年、parserをライブラリとして公開する言語が多くて、例えばgolang, TypeScript, Pythonのような言語にはparser/compiler/astのようなライブラリがあって、ASTベースで言語をカスタマイズするのも可能になりました。Golangのastに基づいて開発したHashiCorpの[Sentinel](https://www.hashicorp.com/sentinel)はその一例です。
- **Parser Generator**。構文定義ファイルからParserを作る手法です。その代表はYaccとbisonです。強力ですが、学習コストが高いので僕みたいの初心者にはハードルが高いです。
- **Paser Combinator**。複数の簡単なParserから複雑なParserを作る考え方。構造がキレイで初心者に優しくてそこそこのパーフォーマンスが出ます。SQL-likeの言語を作るぐらいなら割とふさわしい。

なので、Parser Combinatorでやるのを決めました。

Gopherなのでgoで書こうとしたらgoにはいいParser Combinatorのライブラリがないので**Rust**にしました。ライブラリは[nom](https://github.com/Geal/nom)にしました。

Parser Combinatorについて詳しく下記のスライドに参考できればと思います。

https://www.slideshare.net/cct-inc/parser-combinator-38470836

# 開発

まだまだ開発中ですが、簡単なselect文を実行するまでにはできました。
そろそろ年末年始になるので正月太りにならないように頑張って筋トレをするので細かく紹介を割愛します。
興味ある方はぜひコードをご一読ください。

`https://github.com/cheung-chifung/ddql`

バイバイ
ヨーロッパ最大のアジャイル・テスト自動化カンファレンス「AgileTestingDays2018」に参加してきた

この投稿は、[アジャイル開発 Advent Calendar 2018](https://qiita.com/advent-calendar/2018/agile)の24日目です。

昨日は、@kamontiaさんの「夫婦でKPTしてみた」でした。

<!-- 心が温まりました。 -->

この投稿は、今年11月にドイツで開催されたカンファレンス[AgileTestingDays2018](https://agiletestingdays.com/2018/program/)で学んだことについてまとめました。このカンファレンスでは、「アジャイル」と「テスト自動化」について多くの学びがありました。

# 背景

昨年三ヶ月間、シリコンバレーのスタートアップでエンジニアとしてインターンさせて頂く機会がありました。
このインターンで学んだこととして、技術力の向上もあります(普段PMなどの業務が中心だったので、コーディングに集中できる日々は幸せでした）が、それ以外にも「良いチームとは何か」ということを体感し、学べたことが大きかったです。[^1] [^2]

[^1]: アジャイル的な組織づくりについて：[シリコンバレーで三ヶ月働いて体感した自律型組織のススメ](https://speakerdeck.com/matsu0228/organizationtheory-of-engineering)

[^2]: 帰国直後に書いたインターン振り返り:[シリコンバレーのスタートアップにて、３ヶ月のインターンを終えて](http://mats.hatenablog.jp/entry/2017/12/30/シリコンバレーのスタートアップにて、３ヶ月の)

その後、日本企業でアジャイル的な組織づくりを実践する中で、改めてアジャイルについて体系的に学びたかった、というのが一番の動機でした。

# 報告資料

本題の「AgileTestingDays2018」レポート資料はこちら↓からご覧ください。
[「AgileTestingDays2018」レポート資料](https://speakerdeck.com/matsu0228/report-of-agiletestingdays2018)

明日は、アドベントカレンダー最終日、 @mpls104 さんの「半年間のスクラムマスター経験から得た体験談とアンチパターン集」です。
ぜひお楽しみに！
要約 Angular + Firebase Authentication

どれくらい前からかわからないのですが、Angular で Firebase Authentication を実装するのがたいへん楽になっていて感動したので手順をまとめてみます。

※ ほぼここからの抜粋です
https://github.com/angular/angularfire2

## 事前準備
この記事では以下が済んでいることを前提とします。
1. ng new などして、Angular app を作成しておきます。
2. Firebase project を setup しておきます。https://console.firebase.google.com

## 手順

### AngularFire と Firebase を install します
```sh
$ npm install @angular/fire firebase --save
```

### app.module.ts に追加

```typescript
import { AngularFireModule } from '@angular/fire';
import { AngularFireAuthModule } from '@angular/fire/auth';
```

```typescript
  imports: [
    ...,
    AngularFireModule.initializeApp({
      apiKey: '<your-key>',
      authDomain: '<your-project-authdomain>',
      databaseURL: '<your-database-URL>',
      projectId: '<your-project-id>',
      storageBucket: '<your-storage-bucket>',
      messagingSenderId: '<your-messaging-sender-id>'
    }),
    AngularFireAuthModule
  ],
```
上記の設定内容は、Firebase console https://console.firebase.google.com のメニュー Develop > Authentication に行ったページで右上の "Web setup" というボタンを押すとコピペできるようになっています。すばらしい気配り。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/210165/89bc6401-12d4-e0f2-edcd-e19c10257ee4.png)

### app.component.ts に追加
(または適宜必要なページに追加)

```typescript
import { AngularFireAuth } from '@angular/fire/auth';
import { auth } from 'firebase/app';
```

```typescript
export class AppComponent {
  // ...

  constructor(public afAuth: AngularFireAuth) {
  }
  login() {
    this.afAuth.auth.signInWithPopup(new auth.GoogleAuthProvider());
  }
  logout() {
    this.afAuth.auth.signOut();
  }
```

### app.component.html に追加
(または相当するページの template に適宜追加)

```html
<div *ngIf="afAuth.user | async as user; else showLogin">
  <h1>Hello {{ user.displayName }}!</h1>
  <button (click)="logout()">Logout</button>
</div>
<ng-template #showLogin>
  <p>Please login.</p>
  <button (click)="login()">Login with Google</button>
</ng-template>
```

これだけです。(のハズ)

ng serve して試してみると、ログインボタンから認証、ログアウトが確認できると思います。Firebase console から設定を変更していろいろ試してみましょう。この先でやりたいことは様々異なってきますが、ここまでの "とっかかり" が非常に近くなったのはうれしいことですね。

この記事では、以下のバージョンで確認しました。

```
@angular 類 @7.1.3
@angular/fire@5.1.1
firebase@5.7.0
```

ちなみに今回はあんまり関係ないですが、すべて WSL を使って確認しています。まだまだハマることも多いですが、がんばれ WSL。
課題への取り組み方

みんさんはこんにちは！この記事は[Classi Advent Calendar 2018](https://qiita.com/advent-calendar/2018/classi) 22日目の記事です。

ちょうどjoinして3ヶ月、今はdeveloper successというチームで組織を横断した技術課題を一つずつ片付けています。
今回は沢山の課題がある中で、自分なりに課題に対してどう向き合い、進め対応しているか、備忘録として残しておきたいと思います。

# 一次情報を取りに行く

組織が大きくなるにつれ、コミュニケーション課題から、技術的な課題は尽きず、ステークホルダーが多い環境に至っては、特にこの優先度を決めることが難しく感じています。
組織として抱えている課題が明白で、チームで共通認識がとれており、やることが明確である。理想ではあるけども、関わる人が増えれば増えるほどこの決定の難易度が高くなりますし、また、時間もかかります。課題が直接的に依頼されていな場合の温度感もそうです。
ただ、ここで立ち止まっても物事は何も前に進まないので、こういう環境であるからこそ一次情報を自身で取りにいくしかないと思っています。

# オープンに

何事も情報をオープンにしないことには始まりません。まずは対象を小さく、情報を徐々に広げることを意識していたりします。最初から大きくしてしまうと、埋もれてしまったり、時に発散してしまうケースもありますよね。どの情報をどのスコープに、どのタイミングで公開していくか、幾らか気をつけ行っています。

<img width="584" alt="スクリーンショット 2018-12-21 14.14.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/13253/f4800e83-01da-226d-50b2-72d055c2ceb6.png">

パフォーマンス改善タスクのやりとりでサーマライズデータがないという発言からの流れ。
作業中で困っていること・考えていることを小さく共有するだけでもチームからアドバイスが頂けたり、新たな発見が生まれたりします。

# 対象を広げる

Classiではエンジニア向けにesaというツールが導入されています。WIPという機能のおかけで書く敷居が低く、整理されていない段階でも気軽に情報をアウトプットできて本当に助かっています。ある程度整理した段階で、ｼｯﾌﾟｲｯﾄ!!もう手放せません。パフォーマンス改善にあたっては、ある程度整理した情報を直接お客様とやりとりしているCSチームへも共有（ログはログだけで、お客様の温度感までは分かりません）

![スクリーンショット 2018-12-21 14.53.07.png](https://qiita-image-store.s3.amazonaws.com/0/13253/9d2ca74f-021c-52ef-fe1b-53ee0ff94412.png)

情報が可視化されることで問題視した・していた方が集まり、結果、athenaによるログの分析基盤が整い、グルーピングされただけのCSVファイルがtableauで可視化されるまでに。分析にあたって時系列の比較も重要ですが、グラフにより視覚化されることで問題点がより分かりやすくなります。情報を広げた結果、新たな視点が得られます。

# 協同する

![4d9a9b44-e18a-4083-a7ac-0faf29b410cc.jpeg](https://qiita-image-store.s3.amazonaws.com/0/13253/9c52ed34-42a4-fa68-5ab0-54dc25e18ba9.jpeg)

役割を限定的にして、このタスクはこの部署がやるという形だけではなく、各々が自発的に改善に向かうチームを目指したいと思っています。ただ日々主の業務があることが前提ですし、率先して進めるのは課題と感じる自分しかありません。
ちょうど今Classiでは[整地部](https://www.wantedly.com/companies/classi/post_articles/145844)という取り組みが行われており、持ち込み企画としてこのパフォーマンス改善の対応を行っていたりします。今現在はスピンアウトし、パフォ部（仮）という精鋭チームで改善を継続して行っています。

<img width="480" alt="スクリーンショット 2018-12-21 19.07.08.png (62.2 kB)" src="https://img.esa.io/uploads/production/attachments/6763/2018/12/21/24451/bf307a33-d2d2-43bf-bd97-4ea336a79c8b.png">

最近は詰められ気味です...

# まとめ

先日他社さんのブログで紹介されていた[Working Out Loud](https://quipper.hatenablog.com/entry/2018/11/14/working-out-loud)の話に通じる話かもしれません。
大声とは言わず、まずは小さく声をあげてみること、それだけでも沢山のことが得られると思っています。
ちょうど大きめな課題をつぶすときがやってきそうなので、次回は何かの場で今度は大声出していきたいと思います。
曇った窓に指☝で描く表現を実装してみた

室外との気温差や、湿度によって、窓ガラスが曇っていることがありますよね。
そんな**曇った窓**に、指で文字/絵を描いたことがある人は多いと思います。
楽しいようであり、どこか儚さもあり。
![ogp_window.jpg](https://qiita-image-store.s3.amazonaws.com/0/27057/69715723-166b-2e03-69d4-574e969f6bad.jpeg)
それを**WebアプリケーションとしてJavaScriptで実装**してみました。

※前回投稿した「[スマホで砂に絵を描けるWebサービスをWebGLで作ってみた](https://qiita.com/negi3d/items/2f9d582ff49c56a906eb)」の別バージョンです。

# 先に今回の完成品
![movie3.gif](https://qiita-image-store.s3.amazonaws.com/0/27057/5a399880-ef9e-f08f-d313-edd98499656e.gif)

前回同様、タッチイベントに対応しているので、スマホ・タブレット等でアクセスすれば、**指で窓に描くことができます**。
~~また描いた絵は、サイトにアップロードしたり、ツイートできるようにしています。~~

👇から試せます
**Pittura**
※元々heroku上で動かしていましたが、Github Pagesに載せ替えて動かしています。
　アップロードやツイート等の機能はすべて外しています。
https://negi141.github.io/pittura-demo/

# Canvas上のタッチイベント処理
タッチイベント処理等は、[前回](https://qiita.com/drafts/2f9d582ff49c56a906eb/edit)と同様なので、そちらをご参照ください。

# 曇った窓の表現について
↓は実写ですが、これを目指して行きたいと思います。
![ogp_window.jpg](https://qiita-image-store.s3.amazonaws.com/0/27057/69715723-166b-2e03-69d4-574e969f6bad.jpeg)
よくよくこの写真を観察してみると、
①描かれる前
・・・背景が曇りによってボカされ、また白っぽくなっている。
窓の外側に水滴が付いている。

②描かれた後
・・・背景はクリア。窓の外側に水滴がついている。

この2つは、水滴が垂れたり、背景が動いたりしない限りは変わらないので、
2つの画像をあらかじめ画像加工ソフト等で用意します。
▼オリジナル画像
![w3.jpg](https://qiita-image-store.s3.amazonaws.com/0/27057/65ac790b-75df-ce3a-c29c-7942fb870759.jpeg)


▼①描かれる前
ぼかした背景＋明るさ＋水滴
![w2.jpg](https://qiita-image-store.s3.amazonaws.com/0/27057/616393d8-db43-fd37-aefe-507c163e92ed.jpeg)

▼②描かれた後
クリアな背景＋水滴
![w.jpg](https://qiita-image-store.s3.amazonaws.com/0/27057/88169937-254f-fa89-3d74-7bd5e4414eed.jpeg)

# 実装
画像ができたら、次に①をテクスチャにしたメッシュを配置します。
その後ろに②をテクスチャにしたメッシュを配置します。

タッチによる軌跡は[前回バンプマップを作った要領](https://qiita.com/negi3d/items/2f9d582ff49c56a906eb#%E5%87%B9%E5%87%B8%E3%81%AE%E8%A1%A8%E7%8F%BE%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6)で画面上には表示していないバッファに、白黒画像として残していきます。

この白黒画像を、①のアルファマップとして適用して透過させることで、後ろから②が出てきて、窓ガラスらしくなります。

```js:[①描かれる前]のマテリアル(Three.js)
   // materialBlur ＝ ①描かれる前 のマテリアル
   materialBlur = new THREE.MeshPhongMaterial( { 
       specular: 0x000000, shininess: 0, overdraw: 0.5,
       // textureBlur ＝ ①描かれる前 のテクスチャ
       map: textureBlur,
       // textureAlpha ＝ タッチによる軌跡を残したテクスチャ
       // これをアルファマップとして読み込む
       alphaMap: textureAlpha,
       transparent: true, depthTest: false } );

   meshBlur = new THREE.Mesh( geometryBlur, materialBlur );        
   group.add( meshBlur );
```
▼完成品
![movie4.gif](https://qiita-image-store.s3.amazonaws.com/0/27057/8f3c50e7-f04e-36b3-ed74-45f73c2272b2.gif)

https://pittura.herokuapp.com で試せますので、是非スマホでアクセスしてみてください！
※herokuの無料枠なためアクセス時に10秒程度待ちます。
Chromeプロセス数を減らしてメモリを節約する

Chromeの常駐プロセス数を一定の数に抑え、メモリ圧迫を防ぎます。

設定方法
----
Chrome の起動オプションに「--renderer-process-limit=数字」を付けるだけです。
これでレンダープロセスの数が制限されます。
感覚としては「--renderer-process-limit=5」くらいあれば十分な気がします。

Chromeショートカットのプロパティから
![20130625053417.png](https://qiita-image-store.s3.amazonaws.com/0/315849/79c60daf-9667-b32e-08c8-dcd5024e6ef7.png)

「 --renderer-process-limit=5」を付与
![20130626012810.png](https://qiita-image-store.s3.amazonaws.com/0/315849/9db2edb9-67c5-36d5-1a5e-7f8b6ca2ae8e.png)

以上で設定は終わりです。

メモリの少ないPCなどで設定しておくといいと思います。
Docker on Heroku 最新情報

Docker Advent Calendar 2018 23日目、本日はかしゆかの誕生日、おめでとうございます。みなさまからも祝福をいただけることをお祈りしながら、本年のネタを紹介します。

昨年のHerou Advent Calendar「[Heroku で Docker を使う場合の諸注意](https://qiita.com/sho7650/items/9654377a8fc2d4db236d)」からの `Docker` on Heroku 情報について、Heroku の Advent Calendar ではなく、`Docker`まで出張ってきての情報発信です。えげつなくてごめんなさい。

# [Building Docker Images with heroku.yml](https://devcenter.heroku.com/articles/build-docker-images-heroku-yml)

2018/11/13に「[Building Docker images with heroku.yml is now generally available](https://devcenter.heroku.com/changelog-items/1520)」として、新しい機能が公開されました。

昨年の執筆時点では、手元で準備したDockerイメージをコンテナリポジトリへ登録することによって、Heroku上で公開できるような仕組みとなっていました。「DockerイメージをHerokuに配置できる」という状況ですね。たしかにHerokuの上で動かすことはできていました。

今回の更新で何ができるようになったかと申し上げますと、「Heroku上でDockerイメージをビルドできるようになった」です。これにあわせて、`heroku.yml`というマニフェストファイルの記述が必要になったのですが、これがまたお便利を助長するような素晴らしいものなので、ご連絡に上がった次第です。

これまでの`Dockerfile`を活かしたまま、Herokuのアドオンや設定情報一緒に定義して、Dockerを実行できるようになりました。感覚的には`docker-compose`で一つのサービスに必要なDockerイメージをまるごと作って、全部でプロイしちゃおうに近しいです。

手元でビルドが不用意なったので...

- 手元に docker がなくてもアプリが作れる
- github と連携して Review Apps が作れる

ソースコードのまま管理できるようになったので、ようやく開発ライフサイクルに載せられるようになったわけです。これってすごい進化じゃないですか。

## heroku.yml の実態

サンプルをそのまま紹介します。

```
setup:
  addons:
    - plan: heroku-postgresql
      as: DATABASE
  config:
    S3_BUCKET: my-example-bucket
build:
  docker:
    web: Dockerfile
    worker: worker/Dockerfile
  config:
    RAILS_ENV: development
    FOO: bar
release:
  command:
    - ./deployment-tasks.sh
  image: worker
run:
  web: bundle exec puma -C config/puma.rb
  worker: python myworker.py
  asset-syncer:
    command:
      - python asset-syncer.py
    image: worker
```

### setup:

`setup:` では、Heroku アプリケーションの環境定義を記述できます。

例えば使いたいアドオンだったり、環境変数の定義です。というかそれらが定義できます。このサンプルでは、`Heroku Postgres`アドオンをプロビジョンし、`S3_BUCKET`環境変数を定義しています。

### build:

`Docker`イメージとプロセスタイプのヒモ付や、ビルドの際に必要な環境変数の定義ができます。

ここでは、`web`プロセスタイプのDockerイメージは、ソースコードツリーのルートにある`Dockerfile`を使ってイメージを生成しろ、`worker`プロセスタイプのDockerイメージは、`worker/Dockerfile`を使ってイメージを準備しろという指示をしています。

`config` 内で環境変数が定義されています。`RAILS_ENV`と`FOO`ですね。ビルドのときに使われる環境変数です。

もう一つ `release`というものがあります。これは、本家機能の `Release Phase`と同じもので、デプロイしたときに「一度だけ」実行されるタスクを指定します。例えば、データベースのマイグレーションであったり、CDNのキャッシュ更新など、ソースコードや構成が変更されることによって、実行しておくべきことをデプロイ時に実行できるというお得機能です。ええやんけ。

### run:

`run:` では、[Procfile](https://devcenter.heroku.com/articles/procfile)で指定するように、プロセスタイプごとの起動コマンドを設定します。

ここでは、`web`と`worker`のプロセスタイプを前もって準備していたので、各々について定義されていますね。それとは別に、`asset-syncer`が増えています。`image:`で定義されている Dockerイメージ内で起動できる別のプロセスタイプも個々で指定できるようになっています。

プロセスタイプごとにDockerのイメージを作るということは現実的ではありませんね。一つのイメージの中でも、複数のプロセスタイプで起動できるよう、定義もできるようになっています。

# デプロイする前に

あとは、通常通りデプロイすればよいのですが、Heroku側には「これはDockerですよ」という指示を事前にしておく必要があります。基本的に各言語、自動的に検出してランタイム環境を自動的に生成してくれるHeroku様ですが、Dockerに限っては、まだ手動設定が必要です。

とはいえ、次の一つだけです。Herokuアプリケーションを準備したら

```
heroku stack:set container
```

としてあげるだけです。カンタンですね。
子育てとふりかえり

#はじめに

この記事は[子育てエンジニア Advent Calendar 2018](https://adventar.org/calendars/3178#list-2018-12-10)の22日目の記事です。

# 子育てとエンジニアリングのネタ

はじめまして。森です。普段はチームファシリテーターとして、いろんな所でふりかえりやチームビルディングなど、チームをよりよくしていくための活動をしています。
実はエンジニアです。

子供は今1歳4ヶ月で、駆け回ったり、話せる単語がちょっとずつ増えてきて、毎日子供の成長を楽しんでいます。

今回、子育てエンジニアということて何を書くか迷いました。書こうかなと思って消えていったものは以下です。

1. Line Clover使ってみた
スマートスピーカーです。我が家にもスマートスピーカーが...!と考えていたのですが、まだ未購入。
絵本を読ませたり、寝かしつけの音楽を流してもらったり、TVでアンパンマンのチャンネルにしてもらったり、色々と楽しいことができそうです。
こちらは購入したら開発もやってみます。

2. Scratchで子供とプログラミング
e-テレでも取り上げられていて、子供にプログラミングを楽しく知ってもらういい言語だと思います。「モノづくり」の楽しさを知ってもらうのも、子供がもうちょっと大きくなったらやってみたいですね。

3. ニンテンドーラボで子供とUX
こちらもモノづくり系。あのソフトウェアを考えた人は凄い。色んなハードを組み合わせて、作ったものが実際にカッコよく動作する。まさにUX。うん、これも子供がまだまだ小さいからね...

4. 子育てとチームビルディング
こちらは初日にYoshiki Iidaさんの[素敵な記事](http://yo-iida.hatenablog.com/entry/2018/12/01/042433)が出ています。とても勉強になりました。

で、何を書くか

いろいろ「やってみた」話は出ているので、「やってみたい」話をしてもいいかなーと。 私自身、子供の成長にどうコミットできるかなー、と考えたときに、一番役に立ちそうなのが「ふりかえり」でした。教育の現場でもふりかえりが使われはじめていますし、そろそろ子供も物心が付いてくる。自分なりの「家庭におけるふりかえり」を妄想してみて、Tryしてみようかな、と思い立ちました。

そんなわけで妄想の話です。

# 子育てとふりかえり

これから、私の子供は色んなことを体験し、学んでいきます。そのとき、経験から得たものを強めてより伸ばしていく、ということを考えます。「学び」の強化という側面で、学びとふりかえりは密接な関係があります。

ふりかえりの中で「どんなことをしたのか」ということを思い出し、話すことで、沈殿していた記憶が呼び起こされ、関連する記憶との統合が行われます。整理された情報が頭の中に再度インプットされます。

（ここから想像）

そして、経験から得られた楽しさや、気づきなどを、親子で喜び合うことにより、子供はより多くのことを「やってみたい」と考えてくれるようにならないかな、と。
子供には色んなことに興味を持ってもらいたいですし、色んなことに触れる機会は作りたいと考えています。ただ、経験がどう子供の中に残ったか、というのは、子供の感受性の問題だけではなく、親の受け取り方とフィードバックにも大きく関連すると考えます。

仕事における学習の「転移」のなかで、転移するために大切なのは、学習開始前の上司の動機付けと、学習後の外へのアウトプット、学習後の自身のふりかえりです。同じ理屈が子育てにも使えるとすれば、子供に経験させるときの動機付けと、外（親）へのアウトプットの機会と、ふりかえりが大事になる、ということです。
大人と違い、子供は素直ですので、どんなことをやったのかを話してもらい、（親の笑顔や褒めるといった行為の）フィードバックがあると、よりモチベーションも上がり、色んなことにチャレンジしたいと思うマインドが形成されていくのではないか、と考えています。

そういった学びを深め、フィードバックをするために、「ふりかえり」の手法が役に立つのではないかと考えています。

ふりかえりという形で実施する必要はなく、夕食時の会話といった、家族の会話の一コマを使う、「対話の中で行われる自然なふりかえり」が出来るといいですね。

「今日どんなことやったの？」「どんな遊びをしたの？」「どこが面白かった？」「何か難しくて困っちゃったりはしなかった？大丈夫？」
といった具合で引き出す。また、全てに心からの共感をすることで、子供の感情に寄り添う。最後に、「明日はどんなことをやってみたい？」と聞き、何かしらの反応が得られれば嬉しいですね。

（ここまで想像）

とまぁやってもいないことに対して色々書いてみたのですが、子供が単語が喋れなくても、上記のような流れで話しかけてみる、ということは出来そうです。
そして、子供が体験したことを想像しながら、うんと褒めてあげる。子供が経験したことを喜ぶ。そうすることによって子供との距離もどんどん近くなっていけるのかな、と思います。

思い立ったらまずはやってみる、ということで今日からやってみます。

子供の心理的なものも、学ぶ機会を作って学んでみると面白いかもしれませんね。

まとまりがない文章になってしまいましたが、ここらへんで筆を置きたいとおまいます。

皆様も、よい子育てエンジニアライフを。