OmniAICreator/Qiita-1.07M huggingface dataset:
AWS Fargate BlueGreenDeployment

# はじめに

AWS FargateはContainerインスタンスの管理をAWSにお任せすることができるサービスです。

現状、ECS(LaunchType EC2)を使っているのですが、JenkinsからECSにBlueGreenDeployするときに[ecs-deploy](https://github.com/silinternational/ecs-deploy)を使っています。
ecs-deployはaws cliとjqには依存していますがshellだけで書かれてるので持ち運びが便利なんですね。

ecs-deployはFargateに対応していないので対応させてみました。

https://github.com/uzresk/ecs-deploy.git

# 使い方

１. aws cliはFargateに対応しているバージョンをお使いください。

ちなみに私の環境はこちら

```
aws-cli/1.14.7 Python/2.7.12 Linux/4.9.62-21.56.amzn1.x86_64 botocore/1.8.11
```

２. コマンドはecs-deployと全く同じです

```
./ecs-deploy -c [cluster-name] -n [service-name] -i [registry-url]:[tag] -t 300 -r us-east-1
```

デフォルトのタイムアウトは90秒なのですが、終わらないことが何回かあったので少し長めにしておくのがおススメです。

# 実行結果

```
Using image name: xxxx.dkr.ecr.ap-northeast-1.amazonaws.com/xxxx:0.0.1-SNAPSHOT
Current task definition: arn:aws:ecs:us-east-1:xxxx:task-definition/xxxx:25
Current requires compatibilities FARGATE
New task definition: arn:aws:ecs:us-east-1:xxxx:task-definition/xxxx:26
Service updated successfully, new task definition running.
Waiting for service deployment to complete...
Service deployment successful.
```

# 変更点

Fargateが追加されたことによりrequiresCompatibilitiesの指定を引き継ぐようにしたのと、
cpu, memoryの設定も合わせて引き継ぐようにしました。
LaunchTypeがEC2の場合はcpu,memoryは設定されません。

```
[root@ip-10-0-0-100 ecs-deploy]# git diff
diff --git a/ecs-deploy b/ecs-deploy
index 637e793..8ad1cb1 100755
--- a/ecs-deploy
+++ b/ecs-deploy
@@ -261,11 +261,17 @@ function createNewTaskDefJson() {
     fi

     # Default JQ filter for new task definition
-    NEW_DEF_JQ_FILTER="family: .family, volumes: .volumes, containerDefinitions: .containerDefinitions"
+    NEW_DEF_JQ_FILTER="family: .family, volumes: .volumes, containerDefinitions: .containerDefinitions, requiresCompatibilities: .requiresCompatibilities"

     # Some options in task definition should only be included in new definition if present in
     # current definition. If found in current definition, append to JQ filter.
-    CONDITIONAL_OPTIONS=(networkMode taskRoleArn placementConstraints)
+    LAUNCH_TYPE=$(echo "$TASK_DEFINITION" | jq -r '.taskDefinition.requiresCompatibilities[0]')
+    echo "Current requires compatibilities $LAUNCH_TYPE"
+    if [ $LAUNCH_TYPE == FARGATE ]; then
+      CONDITIONAL_OPTIONS=(networkMode taskRoleArn executionRoleArn placementConstraints memory cpu)
+    else
+      CONDITIONAL_OPTIONS=(networkMode taskRoleArn executionRoleArn placementConstraints)
+    fi
     for i in "${CONDITIONAL_OPTIONS[@]}"; do
       re=".*${i}.*"
       if [[ "$DEF" =~ $re ]]; then
```

# おわりに

もう少し動作確認したらプルリクエスト送ろうと思いますが、だいぶメンテされていないようなので多分マージされない気がします。。。
自作CPUを創る際に効率よくテストケースを準備する方法

CPUを自作する際に、もっとも重要なのは一歩一歩テスト駆動開発していくことだ。なぜなら非常にデバッグが辛いから。バグを早期にあぶり出すのが結果的にリードタイム向上につながるのである。（自論）


### 既存リポジトリ

（私はいまMIPS Release 1を自作しているので）このへんがめちゃいいのである。車輪の再発明、ダメ。
https://github.com/YurongYou/MIPS-CPU-Test-Cases



### 自分でテストケースを作る場合は

```sh
mipsel-sde-elf-gcc -c foo.c
mipsel-sde-elf-objcopy -j .text -O binary foo.o foo.bin
```
とすればRAWバイナリが生成される。勿論、gccに食わせるのはasmファイルでも構わない。結果は `od -x foo.bin` 等で確認できる。modelsimなどシミュレータで使用するなら、4バイト毎に改行してほしいので

```sh
od -An -tx4 -w4 foo.bin | tr -d ' '
```

でOK（唐突なシェル芸）

```
20020004
20030004
10430002
20040004
.....
```

こんな感じで機械語が良い感じに出力される。
Tangram で重ね合わせを行うには

# Mapzen, Tangram, Tilezen
ニューヨークを本拠にする Mapzen さんは、Leaflet でバイナリベクトルタイルを読むためのソフトウェアである Tangram の提供者として有名です。Tangram は表示の設定を scene.yaml という YAML ファイルで行い、柔軟な設定を心地よいコードで行える特徴があります。Mapzen さんはソフトウェアの提供だけではなく、タイルの提供も行っており、（ベクトル）タイル提供のためのソフトウェアの一群を [Tilezen](https://github.com/tilezen/)で提供しています。

# Tangram でベクトルを重ねるなら z-index を 500 よりも上に
Tangram を使って地図を表示し、地図の上に GeoJSON や CenterCross を載せようとしたときに、載せたはずのデータがうまく表示されないということはないでしょうか。その場合には、z-index を 500 よりも上に上げれば大丈夫なのです。ちょうど [ここで z-index: 1000 としている]ように、CSS レベルで z-index を思い切り大きくしてください。そうすることで、ベクトルタイルの地図の上にあなたのデータが無事に表示されます。

# client side order range
この、z-index は、どのように設計されているのでしょうか。それは、[gh:tilezen/vector-datasource](https://github.com/tilezen/vector-datasource/blob/master/docs/layers.md) で client side order range として次のように定義されています。

|z-index|利用法|
| --- | --- |
|0-9|under everything|
|190-199|under water (landuse)|
|290-299|under roads = classic underlay|
|490-499|over all line and polygon features = classic raster map overlay|

基本地図のベクトルタイルのために、これだけのレイヤ数を予約してあるというのは、興味深いですね。
GitHubのソースコードへのリンクを貼る時にはCanonical Formにしようという話

# GitHubのソースコードへのリンクを貼る時にはCanonical Formにしようという話

GitHubのショートカットを調べていた時にまとめたくなったので書きます。

## 1行で

GitHub上のその瞬間のコード片へリンクを貼るときは **`y` を押してから** リンクをコピーしよう。

## もうちょっと詳しく

### 背景

特定のコード片について語る時に、GitHubのリンクをよく貼って説明する機会などがよくあると思います。
ただその時にGitのブランチには、当然変更などが累積されていくためブランチに依存したリンクを貼ってしまうと、ブランチのその瞬間について語る場合あとで変更が入った場合に文脈的におかしくなってしまいます。

そのためにリポジトリ内コード検索などでコミットハッシュなどを特定してからリンクをコピーするといったことをしている方もいるかと思います。（というか、わたしだけ？）
ただ、それもけっこう煩雑です。
コードを特定する検索キーワードをうまく見つけるという謎技能を身に着けたり、周辺のコードを検索したいなどの言ってることがよくわからないケースを除き、そんなことをわざわざ毎回する人もそういないかと思います。

### こんなこと言い出した理由
そして、最近GitHubのショートカットを個人的にまとめてた時に気がついたのが

> `y`	Expand URL to its canonical form

というショートカットです。
まず、 `canonical form` というのがよくわからないかと思います。
なので先に、ブランチに依存したリンクを現在参照している場合は恐らく「参照的な」といった意味で `referencial form` といった呼び方を（仮に）します。
そして、その参照的なリンクからコミットハッシュを特定してブランチ名の部分をそのコミットハッシュで置き換えたリンクを `canonical form` というみたいです。
（あんまり正確じゃない気がするのですが便宜的にすいません。）

### メリット
`canonical from` にするとブランチに変更が入った場合に嬉しいです。
ブランチ依存で参照していたコードだと該当箇所が変更されると行などで位置がずれたり変更で修正後の方を参照してしまうといったことになります。
そして、 `canonical form` でコミットハッシュを特定した場合はそのコミットハッシュの瞬間の情報を必ず参照できます。

### デメリット
行単位へのリンクだとそれなりに効力を発揮するのですが、ファイル単位だとそれほど動くことがないはずなので、それほど効力がないです。
で、かつブランチの最新を参照したいリンクの場合だと当然 `canonical form` にする必要はありません。
まあ、世の常で使い方を考えないといけないですね。

### Gitの内部構造について
ややGitの内部構造に寄った話をすると、コミットハッシュで参照できるオブジェクトは一度作られたら変更されないことが保証されているので絶対参照になります。
ただ、ブランチは参照先が変更が累積される度に変わるので、間接参照になります。
やはり、不変オブジェクトはよいです。

### まとめ
といった感じで、GitHub上のコード片をSNSなどでリンクとして貼る場合は `y` を押してからにしましょう。
デザイナーの成長戦略について〜Bonfire Design @Yahoo に行ってきた！

# イベント内容
* 会場: ヤフーの [LODGE](https://lodge.yahoo.co.jp/)
* connpass: https://yj-meetup.connpass.com/event/71967/
* ハッシュタグ: [#yjbonfire](https://twitter.com/search?q=%23yjbonfire&src=typd)


![IMG_5580.JPG](https://qiita-image-store.s3.amazonaws.com/0/19698/b7fc5400-d5bf-788b-9f53-f4d810eee750.jpeg)
イベントの発表と同時進行でグラフィックレコーディングがされていく型式でした。資料公開されたらこちらの記事も更新していきます。


## アプリ開発におけるデザイナーの成長について
> 細見 沙央梨 (@shosomin) ◆ ヤフー株式会社 デザイナー
> 明治大学とデジタルハリウッド専門スクールをWで通学・卒業後、2014年ヤフー株式会社にデザイナーで新卒入社。「Yahoo! JAPANアプリ」など、アプリのUI、UX設計を中心に担当。その他デザイン関連イベントも主催。Hack Day 2016で最優秀賞を受賞するなど、社外でもアプリ開発を活発に行っている

[資料](https://www.slideshare.net/techblogyahoo/bonfire-design-2-83904445)

![GraphicRec01.JPG](https://qiita-image-store.s3.amazonaws.com/0/19698/585cca09-a70f-5de5-2adf-53978f25c48c.jpeg)

## 深める仕事と広げる仕事
> 池田 拓司 (@tikeda) ◆ デザインアンドライフ株式会社 代表取締役
> 多摩美術大学卒業。ニフティ株式会社、株式会社はてなを経て、クックパッド株式会社に入社。ユーザーファースト推進部長・執行役などを務める。2017年4月に会社設立。Web・アプリを中心としたデザイン業を軸に、スタートアップやベンチャーのサービス作りに関する仕事も手がける。「WEB+DB PRESS（技術評論社）」で「縁の下のUIデザイン」連載中

![GraphicRec02.JPG](https://qiita-image-store.s3.amazonaws.com/0/19698/a2321e10-0baf-fa33-54a7-120b93590b83.jpeg)


## プロダクトと一緒に成長していく話
> 三笠 斉輝 (@acke_red) ◆ dely株式会社 リードデザイナー
> 同志社大学商学部卒業。大学在学中、スタートアップにてwebサービスの立ち上げを経験。その中でインターネットを通じたものづくりに惹かれ、独学でUIデザインを学び始める。delyに入社以来、クラシルの1人目のデザイナーとしてプロダクトのUI/UXデザインを担当。現在は主に、データ分析から施策考案、UI設計まで一貫してプロダクト開発に従事している

[資料](https://www.slideshare.net/toshikimikasa/bonfire-design-2)


![GraphicRec03.JPG](https://qiita-image-store.s3.amazonaws.com/0/19698/cd78b707-e942-d40c-ceca-4fb0a9bae92c.jpeg)

## デザイナー目線のスタートアップ企業
> 竹渓 潤 (@takejune) ◆ プロダクトマネージャー/デザイナー/Co-Founder
> 名古屋芸術大学卒。2007年に株式会社ECナビ(現VOYAGE GROUP)に入社。新規事業のデザイナーとして、サービスの立ち上げ・グロースに携わる。2010年に株式会社ライブドアに入社し、新規サービスのディレクターを経験。2012年に株式会社Fablicを設立し、日本初のフリマアプリ「フリル」をリリース。ユーザーファーストなものづくりと、それを追求する組織づくりが仕事のテーマ。

[資料](https://speakerdeck.com/takejune/dezainamu-xian-falsesutatoatupuqi-ye)

![GraphicRec04.JPG](https://qiita-image-store.s3.amazonaws.com/0/19698/d5605aab-839b-fc28-7021-6d7390f3a086.jpeg)

## 数々の失敗から得られた教訓
> 関 豪志 ◆ ヤフー株式会社 デザイナー
> 多摩美術大学卒業。IT企業数社とフリーランスを経て、ヤフー株式会社に入社。2013年よりY!乗換案内アプリのデザインを担当。公共交通利用シーンでのあらゆる課題に対して、デザインを通じた解決策を日々模索中

[資料](https://www.slideshare.net/techblogyahoo/bonfire-design-2-84046303?ref=https://yj-meetup.connpass.com/event/71967/presentation/?utm_campaign=new_event_links_to_participant&utm_source=notifications&utm_medium=email&utm_content=detail_btn)


![GraphicRec05.JPG](https://qiita-image-store.s3.amazonaws.com/0/19698/fac1f6fc-9357-0f84-c8d1-321399cc28ed.jpeg)

## 感想
自分はエンジニアなので、デザイナーさんのコアの話はわからなかったですが、エンジニアから見たイベントの感想を書きます。

それぞれ皆さん違う立場や得意分野、経験をお持ちの方でしたが、デザイナーの成長戦略としては同じようなイメージを持たれているように感じました。多様なスキルが必要とされていく中で、自分のスキルをどう深めて、どう広げていくか。これはエンジニアにも言える話で、１つの技術を極めるタイプと、浅くても広く知識を得ていくフルスタックエンジニアタイプに分かれていくのと同じだと思いました。デザイナーさんのこういった俯瞰した視点を知れたのは良い収穫でした。

あと、グラフィックレコーディング良いですね！限られた時間で１つの絵にまとめられるのはすごい。そして、発表後の懇親会でこれを眺めながら（、飲みながら）話せるという構成も、さすがヤフーだなーと。

エンジニアとしても参加したい、良いイベントでした！
Unity+NGUIでUIPlayAnimationの使い方、既存のUIButtonを一括でぷるんアニメーション化

NGUIのUIPlayAnimationでスクリプトで設定したくて、色々探したのですが情報がなかったので、
ここにまとめます。



## UIPlayAnimationをつかったボタンアニメーション

![image.png](https://qiita-image-store.s3.amazonaws.com/0/37406/dfbb86be-2570-e1f0-f2d5-4d872910d675.png)

NGUIのサンプルシーンにある、このUIButtonのGameObjectに、**UIPlayAnimation**というコンポーネントが、
アタッチされていますが。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/37406/83b191db-dffa-f6a1-b25e-ac1fb5935860.png)

### UIPlayAnimationのAnimationについて

このコンポーネントの引数がAnimationとなっておりますが、ここハマるのでご注意ください。
インスペクタ上では、Animationファイルを指定すれば良いように見えますが、
実は、**AnimationコンポーネントをもったGameObject**でなければいけません。

↓　こういうGameObject
![image.png](https://qiita-image-store.s3.amazonaws.com/0/37406/6f1f3e9e-46bf-13fa-7263-9c6b5af3b8d9.png)

なので、AnimationをアタッチしたgameObjectを、UIPlayAnimationのAnimationにアタッチするという形になります。

### UIPlayAnimationのState Nameについて

こちらは、Animationで、指定したAnimationのクリップ名を指定すると事で、
Aのアニメーションは、クリック時(OnClick時）など、
アニメーションの出し分けが可能です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/37406/78e24c2a-2c87-4c00-230b-51fde8553ca6.png)

Animationの方は、下記ように２つ用意し、
クリップ名で呼び出しアニメーションを指定。


![image.png](https://qiita-image-store.s3.amazonaws.com/0/37406/0d1b9691-13ab-1670-270e-927cda57cfac.png)

これで、NGUIのTweenを使わなず、いつものFlashのようなタイムライン形式でアニメーションの実装がやりやすくなります。


![UIPlayAnimation_NGUI.gif](https://qiita-image-store.s3.amazonaws.com/0/37406/260f180f-6d70-a0e2-0e53-56ee16163614.gif)


## ボタン１つで、ゲーム内のボタン系すべてにアニメーションをアタッチするエディタ拡張など用意すると便利です。

いま作っているアプリでは、ゲーム内の大量のUIButtonに自動で、共通のアニメーションをアタッチするようにして
つかってます。(シーン内＆プロジェクトファイル内すべて走査し適宜追加しています）

いままで作ったNGUIの過去アプリもすべて、このエディタ拡張機能で一括で差し替えると便利かもしれません。汗
【G Suite】Google Spread Sheet で行を固定する方法

Google Spread Sheet でフィルド行を固定したい場合は、
以下の操作手順で実現できます。

#### 操作手順
- メニューバー＞[表示]＞[固定]
- [固定]＞以下の何れを選択
  - 行ない
  - １行
  - ２行
  - 現在の行(n)まで

#### 詳細について
**行なし：**固定の取り消し
**１行　：**第一行の固定
**２行　：**第一第二行の固定
**現在の行(n)まで：**
　　　　特定の行にカーソルを移動し、その行までの全ての行が固定され

---
#### 検証環境
Google Chrome Version: 62.0.3202.94
1行も書かずにはじめるSCSS

SCSS、以前から名前は聞いていたんですが敬遠してました。

* だって仕事のスコープ違うし。デザインしないし。
* CSSはデザイナーさんがいじってるからいいんじゃないの？　そこのアーキテクチャに自分がからむの違うんじゃないの？
* ほら習得コストもかかるっていうか、デザイナーさんに教える責任もしかして自分にふりかかってくるのいやっていうか。労多くして実り少ないっていうか
* つまりはめんどくさい
* だいたい、SCSS導入するとして、既存のこの大量のCSSをどうするの。全部SCSSに移行？　正気ですか？

と思ってたんですけど自分間違ってた。

SCSS最高だった。

控えめに言って、最高だった。

むしろ既存CSSたくさん抱えているサービスにこそ導入をおすすめしたい。

そんなわけで以下に簡単な導入手順を書きます。

SCSSのコードなんか1行もかかずに導入できますよ。


# 1. SCSSのコンパイルツール入れる

なんでもいいです。とにかくいれます。

心当たりがなければ[このサイトを参考に](http://sass-lang.com/install)どうぞ。


# 2. 既存の.cssファイルをコピペし、拡張子を.scssに変える

なんでもいいです。全部でもいいです。でもここで挫折しないよう、まずは１ファイルだけにしておこう！

# 3. 1. でインストールしたツールで、2.で作成した.scssファイルをコンパイルする

なんでもいいです。コンパイルします。cssファイルできました？

# 4. SCSS導入完了

コンパイルされたcssファイルのパスがおかしい場合には（※）とりあえずコピペで正しい場所に配置しましょう。

これで導入完了です。

.cssファイルを.scssからコンパイルして作成した時点で大体導入完了です。

※コンパイルの設定次第で正しい場所への配置ももちろんできますが、それはまた後で考えましょう。

# だましてない

SCSSで最大にいいな！と思ったのはCSSの構文そのままを許容してくれるところ。
CSSファイルの内容そのままでも、なにもSCSS構文を含まなくても、SCSSファイルとして管理できる。ここは設定の共通化しておきたい、とか、ここはSCSSの構文使うと楽に管理できそう、みたいなところを見つけたら順次対応していくということでね。まずはSCSSからCSSにコンパイルできる仕組みを入れてみる。あとはそれから考える。
設計面倒くさいと思ってたんですけど、一度導入してしまうと、既存コードを構造化していくの超楽しいですし（私見）。
変更前後のCSSが同じであるかどうかのチェックツールとか作って、まかせるお仕事がない新人さんあたりに設計のお勉強がてらやらせてみるのもいいかなあ、とか思いました。

いろいろ考えると面倒くさくなっちゃうので、導入時のスコープはなるべく小さくしてやってみるのがいいよね、という話。

# おまけ：ちょっとくらいは書いてみる

例えばこんなところを

```
p {
   color: #000;
}
```

こう変更

```
$p_color: #000;

p {
   color: $p_color;
}
```

あるいはこんなところを

```
.special-list ul{
   color: #000;
}
.special-list ul .title{
   color: #f00;
}
```

こう変更してもいい

```
.special-list{
 ul{
   color: #000;
   .title{
     color: #f00;
   }
 }
}
```


そしてコンパイル

導入完了！（二回目）
sudo (grep or pgrep -f) はプロセス数がsudo分増えるよ

# 動き

![grep.gif](https://qiita-image-store.s3.amazonaws.com/0/62354/93316673-ef8c-4556-4bfa-b1547291539c.gif)


以上
(打ち間違えすぎ)(pgrepは-aがfullなので-lは冗長)

# まとめ

(テーブル記法にパイプ使えない)
コマンド毎の不要な出力増加数。
(sudo)は有無が結果に影響しないと考えている部分。

プロセス名を対象とした場合

## `ps ax | grep hoge`

`grep`自身が`grep`に引っかかり、+1

## `(sudo) ps ax | sudo grep hoge`

`grep`自身と`sudo`が引っかかり、+2

## `pgrep hoge`

コマンドラインには反応しないので、+0

## `sudo pgrep hoge`

コマンドラインには反応しないので、+0

## `pgrep -f hoge`

`grep`と異なり、自身は対象外になるのか、+0

## `sudo pgrep -f hoge`

`sudo`のコマンドラインに反応して、+1

## `(sudo) ps ax | sudo grep hoge | (sudo) grep -v grep`

`grep -v grep`が、`sudo grep hoge`、`grep hoge`、`grep -v grep`を消し、+3 → +0。最後に`sudo`を付けても同様に+4 → +0(推測)


***

冗長そうな`grep -v grep`が一番安全。
`pgrep`も`-f`を付けずプロセス名に限定するならば安全。
だが、引数駆動している場合、ex)`php ファイル名`
コマンドラインが対象で全体含めて検索したいなら該当してしまう。


# メモ

プロセスチェックしませんか。重複起動防止などに。

`ps ax | grep hoge`
すると、`grep hoge`しようとしているgrepコマンド自体も引っかかってしまうことは有名。
なので更に
 `grep -v hoge`したり、
`wc -l`の結果から1引いたり、
`pgrep`つかおう！
となります。

一方`sudo`は、うっかりapacheユーザーで権限エラーが出るのを防いだり、実行コマンドがログとして残ったり、~~パスが通ってなくて死んだり~~おまじない的、セキュリティ的に付与されることがあります。

私もいっとき全部のコマンド呼び出しに`sudo`追加してくれと言われたり、逆に毎分の処理でログが出過ぎてなんとかして欲しいなどと言われました。

そんな`sudo`は、あくまで`sudo`で一コマンド。後続の実行コマンドはというと、

>sudo は、コマンドを実行するとき、まず fork(2) を呼び、 実行環境を上記のように設定してから、子プロセスで execve システムコールを呼び出す。 メインの sudo プロセスは、コマンドが完了するまで wait し、完了したら、 コマンドの終了ステータスをセキュリティポリシーの close 関数に渡してから、 終了する。
[Man page of SUDO]

と子プロセスで(sudoなしのコマンドがroot権限で)実行されます。
このことは`ps`をツリー表示したらわかるんだと思います。

```
 > sudo ps axf 
.
.
.
11379 pts/1    S      0:07          \_ fish
21115 pts/1    S+     0:00              \_ sudo ps axf
21116 pts/1    R+     0:00                  \_ ps axf
.
.
.
```

なので、子プロセスが自身のコマンドをリストに表示・検索対象にするかしないかに関わらず、
実行時点で親プロセスの`sudo`が子プロセスのコマンドを抱えたままプロセスリストに載ってしまい、
場合によっては一つHIT数が増えてしまいます。

`ps`,`pgrep`はよく調べず既存のオプションを流用することがあるので(今回まともに調べた)、不要なオプションがあるかもしれないし、そうであるならば外した方が安全そうだ。`sudo`含めて。

***

重複起動防止だけだとアドバイザリロックしたいんですが、
実行時間を見たり自殺したり他殺したり[^1]ロックファイルと併用していたり他の特殊動作があったりそもそもチェック方法何種類も点在してたりとカオスなのでつらい。


# 参考

* [PHPでバッチ処理するときの二重起動防止対応の手法をなるべく丁寧にまとめる - Qiita]
* [sudo - Wikipedia]
* [Man page of SUDO]
* [pgrep/pkillを使おう - Qiita]
* [改めてsudoについて調べてみた - Qiita]



[PHPでバッチ処理するときの二重起動防止対応の手法をなるべく丁寧にまとめる - Qiita]:https://qiita.com/n0bisuke/items/ad7c37d68ff0d5b87742

[sudo - Wikipedia]:https://ja.wikipedia.org/wiki/Sudo

[Man page of SUDO]:https://linuxjm.osdn.jp/html/sudo/man8/sudo.8.html

[pgrep/pkillを使おう - Qiita]:https://qiita.com/uraura/items/12ff6112fd392f1be424


[改めてsudoについて調べてみた - Qiita]:https://qiita.com/genreh/items/98f4a7ff5d1443e1e5cd

[^1]: `less`でファイル見てたら殺された。と報告されたこともあった…
機械学習論文読みメモ_107


[Mask R-CNN](https://arxiv.org/abs/1703.06870)
Object instance segmentationのための手法を提案する．
このタスクでは，object detectionを行った際に，bboxを作成するのではなくそのobjectのsegmentionを与える．
提案手法では，従来のFaster R-CNNを拡張し，従来のbbox推論に並行する形でsegmentationを行うブランチを追加する．
この手法は計算コストを上げる事なく高速に動かす事が可能である．
またhuman pose estimationなどのタスクへ簡単に拡張可能である．

[High-Resolution Image Synthesis and Semantic Manipulation with Conditional GANs](https://arxiv.org/abs/1711.11585)
Conditional GANを用いたsemantic segmentation labelからrealistic imageを生成する手法を提案する．
従来のconditional GANは低解像度の画像に対する適用に限られたが，本論では各層の特徴マッチングを考慮に入れた新たなadversarial loss，またマルチスケールのgeneratorとdiscriminatorを導入する事で高解像度でかつrealisticな画像生成を可能にした．
またこのフレームワークを拡張する事でインタラクティブな画像編集も可能にした．
この編集の実現にあたってはobject instance segmentationの情報を用いる事でそのobjectに対する編集や除去を可能にした．
また同じ入力に対して多様の出力を可能にした事で，各物体のappearanceをインタラクティブに変更可能にした．

[Predicting Deeper into the Future of Semantic Segmentation](https://arxiv.org/abs/1703.07684)
未来予測のアルゴリズムは，realtime systemの制御などにおいて特に大事である．
従来は未来時点での各ピクセルのrgb情報を予測してきたが，
本論ではsemantic segmentationの予測を行う．
つまり，semantic label付きのvideo sequenceが与えられた時に、未来のsemantic labelを予測する．
本論ではautoregressiveなCNNを提案し，逐次的に未来の予測を行う．
従来のRGB値を予測してからそのセグメンテーションを予測する場合に比べて本手法は
有意に高い性能を得た．
Git メモ

Git コマンドをしょっちゅう忘れたり、調べたりしているので、いい加減ブログにしておく。

# コミットをまとめる

`rebase -i` で良い

失敗して、変なのコミットしたので、直近の２つのコミットをまとめたい。

```
$ git rebase -i HEAD~2
```

エディタがたちがある。

```
pick e8ccc98 Returning body only
pick 5c02485 fix slow FileUpload

# Rebase b4bf38e..5c02485 onto b4bf38e (2 commands)
#
# Commands:
# p, pick = use commit
# r, reword = use commit, but edit the commit message
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
# f, fixup = like "squash", but discard this commit's log message
# x, exec = run command (the rest of the line) using shell
# d, drop = remove commit
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
# However, if you remove everything, the rebase will be aborted.
#
# Note that empty commits are commented out
```

まとめたいコミットは、`pick` を　`s` に変更する。 結果は、`git log` で確認するといよい。

# コミットメッセージを変更したい

`git commit --amend`　で良い。ちなみに、直前ではなく、ちょっと前のコミットを修正したい場合は`git rebase -i HEAD~xx` を使って、特定のコミットを`edit`にする詳しくはこちら

* [【備忘録】過去のコミットメッセージを変更する](http://nnsnodnb.hatenablog.jp/entry/how-to-git-rebase)

# GitHub のブランチを削除する

```
git push origin :branch
```

で良い

```
git push origin branch
```

は
```
git origin branch(local):branch(remote)
```

の意味なので、空がプッシュされる。

```
$ git push origin :fix/slowbackend
Enter passphrase for key '/Users/ushio/.ssh/id_rsa': 
To github.com:Azure-Samples/customer-car-reviews.git
 - [deleted]         fix/slowbackend

```

* [Githubのブランチ削除](https://qiita.com/kwgch/items/98bbaae8e9f40a9548e0)
TableViewでColumn数を変える (MacOSX)

「Attributes Inspector」というやつでTableViewのColumn数を変更できるらしいが、
なぜか「Columns」が表示されない。
![スクリーンショット 2017-12-12 9.26.33.png](https://qiita-image-store.s3.amazonaws.com/0/129820/9d992986-fd9e-bc2c-ce26-27571dd3473c.png)

外側のTable Viewではなく、
![スクリーンショット 2017-12-12 9.26.17.png](https://qiita-image-store.s3.amazonaws.com/0/129820/e37a9927-bb4f-8490-837e-1cf6340bdfe4.png)

内側のやつを選ぶらしい。
![スクリーンショット 2017-12-12 9.26.53.png](https://qiita-image-store.s3.amazonaws.com/0/129820/95392ac0-f43c-1dae-669f-1c9e621ad790.png)

![スクリーンショット 2017-12-12 9.27.08.png](https://qiita-image-store.s3.amazonaws.com/0/129820/cdff4e48-4fe3-dfbd-65eb-7228f1494aa6.png)

分かりづらすぎる。
CSSで、内容がないときでもテキスト1行分の高さを確保する方法

CSSで、内容がないときでもテキスト1行分の高さを確保するには、次のようにすればよい。

```css
.container::before {
  content: "";
  display: inline-block;
}
```

☞ [デモ](https://codepen.io/bita-shimada/pen/GMOWxZ)

## 未来

`lh`という単位が[草案にある](https://drafts.csswg.org/css-values/#lh)。1lhはテキスト1行分の高さに等しい。これが使用可能になれば、次のようにできるであろう。

```css
.container {
  min-height: 1lh;
}
```
Haskell っぽく JavaScript で関数合成したい

[Lodash-fp](https://github.com/lodash/lodash/wiki/FP-Guide) を使って JavaScript で関数合成してみます。
Lodash-fp は有名なユーティリティライブラリ [Lodash](https://lodash.com/docs/) の関数型プログラミングっぽくかけるモジュールの1つです。

## 前提知識

- JavaScript の基本的な開発経験があること
- Haskell は比較対象として登場しますが知らなくてもたぶん読めます

## 簡単な例題から考える

例題: 配列 [7,2,3,6] の各値に1を加えて偶数の値だけ取り出してすべて足す。

1. 各要素に1を足す(map)  
[7,2,3,6] -> [8,3,4,7]
2. 偶数の値だけ取り出す(filter)  
[8,3,4,7] -> [8,4]
3. すべての要素を足す(sum)  
[8,4] -> 12

上記の問題設定自体には特に意味はありません。

### Haskell

愚直にカッコを多用して Haskell で書いてみます。

```haskell
xs = [7, 2, 3, 6]
sum (filter (\t -> t `mod` 2 == 0) (map (\x -> x + 1) xs))
```

### Haskell with point-free style

Haskell っぽくポイントフリー(関数合成)スタイルで書いてみます。

```haskell
xs = [7, 2, 3, 6]
f = sum . filter ((0 ==) . flip mod 2) . map (+ 1)
f xs
```

もっと短くも書けます。

```haskell
f = sum . filter even . map (+1)
```

### Lodash

次は Lodash を使って JavaScript で書いてみます。

```js
const _ = require('lodash');
const xs = [7, 2, 3, 6];
_.sum(_.filter(_.map(xs, x => x + 1), t => t % 2 == 0));
```

### Lodash with chain

JavaScript っぽく `chain` で書いてみます。

```js
const _ = require('lodash');
const xs = [7, 2, 3, 6];
_.chain(xs).map(x => x + 1).filter(t => t % 2 == 0).sum().value();
```

`chain` はやはり最後に必要な `value()` が残念な感じがします。
[Why using `_.chain` is a mistake.](https://medium.com/making-internets/why-using-chain-is-a-mistake-9bc1f80d51ba)


### Lodash-fp

Lodash-fp を使って JavaScript で書いてみます。

```js
const fp = require('lodash/fp');
const xs = [7,2,3,6];
fp.sum(fp.filter(t => t % 2 ==0, fp.map(x => x + 1, xs)));
```

### Lodash-fp with compose

最後に Lodash-fp の `compose` を使って関数合成して書いてみます。

```js
const fp = require('lodash/fp');
const xs = [7, 2, 3, 6];
let f = fp.compose(fp.sum, fp.filter(t => t % 2 == 0), fp.map(x => x + 1))
f(xs);
```

`compose` の分だけやや長くなるけど、Haskell の関数合成の書き方に近くなりました。

## まとめ

Lodash-fp の `compose` を使えば JavaScript でも Haskell と似たような順番で関数合成して書けます。
Goで標準出力をキャプチャするパッケージを書いた

[Go2 Advent Calendar 2017](https://qiita.com/advent-calendar/2017/go2) 12日目の記事です。
昨日たまたま空きを見つけたので代筆させていただきます。

## はじめに

先日Go4 Advent Calendar 2017 2日目で[Goで標準出力をテストする方法](https://qiita.com/kami_zh/items/ff636f15da87dabebe6c)という記事を書きました。
要約すると、理想的には `fmt.Fprint()` などで `io.Writer` を渡す形でテスタブルに実装した方がよいが、都合上できない場合は `os.Stdout` を差し替えてそれを読むようにすればよい、という内容です。

ただこれを毎回実装するのも面倒なので、パッケージとして公開しました。

- [kami-zh/go-capturer: Capture stdout and/or stderr in Go.](https://github.com/kami-zh/go-capturer)

## 使い方

パッケージの使い方はREADMEや[godoc](https://godoc.org/github.com/kami-zh/go-capturer)のとおりですが、以下に例を示します。
[先日の記事](https://qiita.com/kami_zh/items/ff636f15da87dabebe6c)では、次のようなコードに対してテストを実装しました。

`main.go`:

```go
package main

import (
    "flag"
    "fmt"
    "os"
)

const (
    ExitCodeOK = iota
    ExitCodeError
)

func main() {
    os.Exit(run(os.Args[1:]))
}

func sum(x, y int) int {
    return x + y
}

func run(args []string) int {
    var x, y int

    flags := flag.NewFlagSet("sum", flag.ContinueOnError)
    flags.IntVar(&x, "x", 0, "Value for x")
    flags.IntVar(&y, "y", 0, "Value for y")
    flags.Parse(args)

    fmt.Printf("%d + %d = %d\n", x, y, sum(x, y))

    return ExitCodeOK
}
```

この標準出力をともなう `main()` に対するテストは、[go-capturer](https://github.com/kami-zh/go-capturer)を用いると次のように書けます。

`main_test.go`:

```go
package main

import (
	"testing"

	"github.com/kami-zh/go-capturer"
)

func TestRun(t *testing.T) {
    var code int

    out := capturer.CaptureStdout(func() {
        code = run([]string{"-x", "2", "-y", "3"})
    })

    if code != ExitCodeOK {
        t.Errorf("Unexpected exit code: %d", code)
    }

    if out != "2 + 3 = 5\n" {
        t.Errorf("Unexpected output: %s", out)
    }
}
```

標準出力だけでなく標準エラー出力も取得でき、また上のように関数の返り値も得ることができます。

## 思ったこと

今回はじめてGoのパッケージをつくったのですが、

- GitHubにリポジトリを追加してREADMEを書くだけで[godoc](https://godoc.org/github.com/kami-zh/go-capturer)ができており、さらにExampleなどもあってすごい
- [go report](https://goreportcard.com/report/github.com/kami-zh/go-capturer)という外部サービスでgofmtやgolintによるチェックとを行ってくれるので便利

という感想を持ちました。

---

筆者アカウント: [Twitter](https://twitter.com/kami_zh), [GitHub](https://github.com/kami-zh)
まだブラウザ操作の自動化してないの？？

# 概要

特に優先度高くないものだけど、いちいちブラウザ操作してるものって多々あるよね。
ビジネス職でもエンジニアでもブラウザって必ず操作するはずです。

# Seleniumとは
Webブラウザを使ってWebアプリケーションをテストするツールです。

# 見たほうが早いと思うのでスクショ！
1. Qiitaのログインページに遷移
2. ログイン情報の入力
3. いいねをつけたい記事に遷移
4. いいねをする

![c28147019c6b988bccb47a22f0f23f3f.gif](https://qiita-image-store.s3.amazonaws.com/0/63048/cf050816-a183-fd63-f3eb-e6bc7ef6d8f9.gif)



# 具体的に何が自動化できるの？
- 定期的に見ているデータの取得
  - 情報メディア
  - SNS
  - ECサイト
- ブラウザを人間が叩いて行う簡単なフローのテスト


#インストール
事前に[Chromedriver](https://sites.google.com/a/chromium.org/chromedriver/downloads)をダウンロードしとく
解凍したものを$home/binに配置


# サンプルコード

``` Ruby
require 'dotenv'
require 'selenium-webdriver'

# ENVの読み込み
Dotenv.load
QIITA_LOGIN_EMAIL = ENV['QIITA_LOGIN_USER_NAME']
QIITA_LOGIN_PW = ENV['QIITA_LOGIN_PW']

# QIITAのログインページのURL
LOGIN_URL = 'https://qiita.com/'

class QiitaCrawlUser
  attr_reader :driver, :target_url

  def initialize(target_url)
    @target_url = target_url
    @driver = Selenium::WebDriver.for :chrome # ここでブラウザ指定
    @driver.manage.timeouts.implicit_wait = 10 # 10.seconds
  end

  def like
    login
    puts "like start"
    driver.navigate.to target_url
    parent_classes = driver.find_elements(:class => "likable")[0].attribute('class')
    return if parent_classes.split(" ")[2] == 'liked'

    driver.execute_script "document.getElementsByClassName('likable')[0].children[1].click();"
    driver.quit
  end

  private
  def login
    puts "login start"
    driver.navigate.to LOGIN_URL #ログイン画面に繊維

     driver.find_element(:name, 'identity').send_keys(QIITA_LOGIN_EMAIL)
     driver.find_element(:name, 'password').send_keys(QIITA_LOGIN_PW)
     driver.find_element(:name, 'commit').click
   end
 end
 article_url = "https://qiita.com/tomerun/items/9cb81d7a98150ff22f53"
 QiitaCrawlUser.new(article_url).like
```


# 組み合わせると便利 Slack
僕はgemの 'slack-ruby-client'を使ってSlackへポストすることはよくやりますね。
自動化した時に監視や認知は必須なので。。。


Twitterで特定の単語とってくるとかAPIを用いてごにょごにょのときによく使う。

``` Ruby
require 'slack-ruby-client'
Slack.configure do |config|
  config.token = ENV['SLACK_API_TOKEN']
end
slack_oauth = Slack::Web::Client.new
slack_oauth.chat_postMessage(channel: '#times_watch_twitter', text: '送りたいメッセージ', unfurl_links: true, as_user: true)

```

unfurl_links: trueにするとリンクが展開されるようになるので、リンクだけ送る用途はよく使います。


# 最後に
やるからには全部自動化したほうが良くて。
人間がやらなくていいことは自動化しましょ!
alexaとRailsを連携してみちゃう

こんにちは！
アマゾンエコーが日本で発売されて１ヶ月ほど経ちました。せっかく応募に当選して購入することができたので、スキル作りに挑戦したいと思います。

# Rails側の対応

`alexa_rubykit` という便利gemがあるのでそれを利用します。Railsからエコーに返すJSONを簡単に作ってくれます。
これをGemfileに追加します。

```ruby
gem 'alexa_rubykit'
```

続いてコントローラーを作ります。エコーから受け取った音声の文字列をそのままエコーに返します。
単純なオウム返しのスキルだと思って下さい。

```ruby
class TalksController < ApplicationController
  protect_from_forgery with: :null_session

  def create
    request = AlexaRubykit::build_request(params)
    response = AlexaRubykit::Response.new
    response.add_speech("あなたの名前は#{request.slots[:MyName][:value]}ですね")
    render json: response.build_response
  end
end
```

`request.slots[:MyName][:value]` この部分がエコーから渡ってくるパラメーターになります。この設定はこのあと行います。

# Alexa側の対応

## スキルの登録

[開発者ポータル](https://developer.amazon.com/ja) にてスキルを登録していきます。

![スクリーンショット 2017-12-12 8.12.23.png](https://qiita-image-store.s3.amazonaws.com/0/10699/9ed84d62-b967-dac7-b741-8db39841d07a.png)

## Slill Builder

次へを押すとスキルビルダーに画面が切り替わると思います。そこでインテントを追加します。

![スクリーンショット 2017-12-12 8.15.59.png](https://qiita-image-store.s3.amazonaws.com/0/10699/c5ed6ace-cfdd-bbd4-7640-344f70536feb.png)

今回は、 `YourNameIntent` という名前のインテントを作成します。続いて `Sample Utterances` を設定していきます。

![スクリーンショット 2017-12-12 8.19.45.png](https://qiita-image-store.s3.amazonaws.com/0/10699/d625fd26-79ab-4140-d934-60cb742abfc6.png)

`MyName` という箇所をAlexaが解析して文字列としてRailsへPOSTしてくれます。設定が終わったらビルドモデルしてください。

## エンドポイントの設定

![スクリーンショット 2017-12-12 8.22.31.png](https://qiita-image-store.s3.amazonaws.com/0/10699/dd453444-3813-c69e-7cb4-5da1786df2fe.png)

RailsアプリへのURLを設定します。 `https` ということで `heroku` を使った方が特に何も用意しなくてよいのでオススメです。

## グローバルフィールドの設定

![スクリーンショット 2017-12-12 8.31.31.png](https://qiita-image-store.s3.amazonaws.com/0/10699/75fc9f73-bd64-d8ba-e9cc-1b6c2eff2a99.png)

ここではサブドメインをチェックを入れて下さい。

## テスト

![スクリーンショット 2017-12-12 8.33.25.png](https://qiita-image-store.s3.amazonaws.com/0/10699/b5f6352d-f8b4-bed9-2e3b-c53e3cc1a6ee.png)

サービスシュミレーターでテストを行います。発音する言葉を入力して見てください。ここで、 `Sample Utterances` とのつながりが分かると思います。
テストでも無事に名前を認識してますね、さすがエコー。

## 感想
以上、簡単なRailsとの連携でした。データベースを利用したりすればもっと幅の広がるスキルができると思います。
みなさんもアマゾンエコーでスキルを作って遊んでみませんかー？？

[サンプルコードはコチラ](https://github.com/yameguun/echo-sample)
M-1 2017決勝のあのネタをPythonにやらせよう

## はじめに
M-1グランプリ2017決勝のジャルジャルのネタを見て思ったのは、「ズンドコきよし」[^1][^2]っぽいなでした。
Python３の勉強を兼ねて自動化してみました。
（注意：本記事はジャルジャルの漫才が「退屈なこと」と暗示しているわけではありません）
なお、先駆者さんがいらっしゃいます。[M-1グランプリ2017決勝のジャルジャルネタ再現してみた](https://qiita.com/miumiu0917/items/dd2ec733503d3a561d47)

## 仕様
ボケ（変な校内放送）とツッコミ（盛り上げ方）は以下のような対応関係です。

|ボケ|ツッコミ|
|:---:|:---:|
|ピンポンパンポンピン|1個多いな|
|ピンポンパン|1個少ないな|
|ピンポン|誰か来ましたよ|
|ポンピン|来ましたよ誰か|
|ピン|背筋伸びてるやん|
|ピンポンパンライス|ファミレス行ってピンポン押して店員さん呼んでハンバーグ定食頼んでパンオアライスって聞かれてるやん|

「ピン」が5回連続したとき、「背筋伸びてるやん」の代わりに「背筋伸び切ってるやん」と返して終了することにします。

## 実装

```python3:hennna_kounaihousou.py
import random

class Jarujaru():
    rule = {
        'ピンポンパンポンピン': '1個多いな',
        'ピンポンパン'      : '1個少ないな',
        'ピンポン'         : '誰か来ましたよ',
        'ポンピン'         : '来ましたよ誰か',
        'ピン'            : '背筋伸びてるやん',
        'ピンポンパンライス' : 'ファミレス行ってピンポン押して店員さん呼んでハンバーグ定食頼んでパンオアライスって聞かれてるやん'
    }
    boke = list(rule.keys())
    pattern = len(rule)

    def __init__(self, name):
        self.name = name
        self.pin_count = 0

    def bokeru(self):
        i = random.randint(0, Jarujaru.pattern-1)
        return Jarujaru.boke[i]

    def tsukkomu(self, word):
        if word in Jarujaru.rule:
            if word == 'ピン':
                self.pin_count += 1
                if self.pin_count >= 5:
                    ans = '背筋伸び切ってるやん'
                else:
                    ans = Jarujaru.rule[word]
            else:
                self.pin_count = 0
                ans = Jarujaru.rule[word]
            return ans

def main():
    Fukutoku = Jarujaru('福徳')
    Gotou = Jarujaru('後藤')
    while True:
        boke = Fukutoku.bokeru()
        print(say(Fukutoku.name, boke))
        tsukkomi = Gotou.tsukkomu(boke)
        print(say(Gotou.name, tsukkomi))
        if Gotou.pin_count >= 5:
            break

def say(person, word):
    return '{}: {}'.format(person, word)


if __name__ == '__main__':
    main()
```


## 実行結果
Python3.6.3で動作確認しています。

```
$ python hennna_kounaihousou.py 
福徳: ピンポンパンライス
後藤: ファミレス行ってピンポン押して店員さん呼んでハンバーグ定食頼んでパンオアライスって聞かれてるやん
福徳: ピンポン
後藤: 誰か来ましたよ
福徳: ピンポンパンポンピン
後藤: 1個多いな
福徳: ピンポンパン
後藤: 1個少ないな
 :
 : <長くなるので省略>
 :
福徳: ポンピン
後藤: 来ましたよ誰か
福徳: ピン
後藤: 背筋伸びてるやん
福徳: ピン
後藤: 背筋伸びてるやん
福徳: ピン
後藤: 背筋伸びてるやん
福徳: ピン
後藤: 背筋伸びてるやん
福徳: ピン
後藤: 背筋伸び切ってるやん
$
```

## 残課題
- ボケとツッコミが逆転する展開は未実装です。
- 読み上げできないか調べてみます。

## 脚注
[^1]: >「ズン」「ドコ」のいずれかをランダムで出力し続けて「ズン」「ズン」「ズン」「ズン」「ドコ」の配列が出たら「キ・ヨ・シ！」って出力した後終了 (仕様はこちらのツイート：https://twitter.com/kumiromilk/status/707437861881180160)
[^2]: エンジニア界隈に一大ブームを巻き起こしたそうです。[ズンドコキヨシまとめ](https://qiita.com/shunsugai@github/items/971a15461de29563bf90)
決定木、あなたはどっち派？

# Python ? 、R ?

![Python_or_R.png](https://qiita-image-store.s3.amazonaws.com/0/148136/b33d4c3c-073e-4501-5c1d-65ce4824c965.png)




# 決定木とは？
決定木は、教師あり学習の一つであり、分類モデルを作るために用いられる手法です。同じ分類モデルのサポートベクターマシーンやニューラルネットワークと比べて、説明変数がどのように影響しているのかがわかりやすいのが特徴です。

# 違いは、カテゴリー変数の扱いと分岐にあり！

## Python(scikit-learn)の場合
Python(scikit-learn)でカテゴリー変数を扱う場合、ダミー変数に変換する必要があります。ダミー変数への変換はPandasの[get_dummies](https://pandas.pydata.org/pandas-docs/stable/generated/pandas.get_dummies.html)を使うと便利です。

また、scikit-learnで（決定木を含む）予測モデルを作る場合、PandasからNumpyに変換する必要があるので、[as_matrix](https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.as_matrix.html)も扱えるようになると作業がはかどります。

scikit-learnで作成した決定木は[Graphviz](https://www.graphviz.org/)で可視化できます。以下のような図になります。

![Python_decision_tree.png](https://qiita-image-store.s3.amazonaws.com/0/148136/0399a937-d97a-e128-0e83-fa5b5f808fc5.png)
上図のように、ジニ係数が0になるか、指定した最大深さに到達するまで分岐し続けます。色を指定する場合、各ノードにおける色は到達したデータのクラスの割合を表し、色が濃い程、割合が偏り、色が薄い程偏りが弱いことを表します。白の場合、割合が50:50となります。

画像は[公式](http://scikit-learn.org/stable/modules/tree.html)から

Graphvizの画像が好みでない人にはD3.jsでグラフを描くのも良いでしょう。
こちらの[PythonとJavaScriptではじめるデータビジュアライゼーション](https://www.amazon.co.jp/Python%E3%81%A8JavaScript%E3%81%A7%E3%81%AF%E3%81%98%E3%82%81%E3%82%8B%E3%83%87%E3%83%BC%E3%82%BF%E3%83%93%E3%82%B8%E3%83%A5%E3%82%A2%E3%83%A9%E3%82%A4%E3%82%BC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3-Kyran-Dale/dp/4873118085)を参考にしてみてはいかがでしょうか？

![Python_JavaScriptではじめるデータビジュアライゼーション.png](https://qiita-image-store.s3.amazonaws.com/0/148136/e4dbc4db-701e-4a12-bffb-adbf90506448.png)



## R(rpart)の場合
R(rpart)の場合、Pythonと違い、カテゴリー変数をそのまま説明変数として扱うことができます。**文字列（日本語を含む）**型でも問題ありません。また、**<font color='blue'>OR条件</font>**も適用されます。OR条件とは、例えば、カテゴリー変数に「都道府県」があった場合、「東京都、大阪府、北海道」のいずれかか、それ以外かで分岐するといった具合です。

rpartで作成した決定木はrpart.plotで可視化することができます。以下のような図になります。

![R_decision_tree.png](https://qiita-image-store.s3.amazonaws.com/0/148136/da0a8217-3544-3c32-9b40-d9c559d6a3be.png)
画像元は[こちら](https://gormanalysis.com/decision-trees-in-r-using-rpart/)

上図からもわかるように、R(rpart)で決定木を作成した場合、最初の分岐に注目するとカテゴリー変数をOR条件で分岐可能、ダミー変数へ変換を必要としないことがわかります。

OR条件で分岐可能なので、Python(scikit-learn)の決定木と比べて、細かく分岐しない点も特徴の一つです。

# どっちが良いの？
PythonとRによる決定木の違いを書きましたが、どっちが良いか？それは、**<font color="Blue">予測精度が良い方</font>**です。同じ決定木ですが、アルゴリズムが少し違います。そういう意味では、決定木とサポートベクターマシーン、ニューラルネットワークのどれが良いか？と同じ問題です。

そして、予測精度を上げるためには、**<font color='Blue'>データ</font>**が重要です。**<font color='Blue'>データ</font>**があってのモデルです。アルゴリズムよりも、分析可能な**<font color='Blue'>きれいなデータ</font>**があるか、**<font color='Blue'>適切に前処理</font>**が出来ているかの方が重要です。

# さいごに
PythonとRの決定木について書きましたが、おそらく決定木を作って終わりという人はいないのではないでしょうか？決定木で分類モデルを作成して予測結果をレポートにまとめる人もいれば、モデルをシステムに組み込むという人もいるでしょう。

個人的な意見ではありますが、**システムに組み込む場合**は**Python**を、**統計的な分析をする場合**は**R**の方が便利かなと思っています。状況に応じて、両方を使いこなせるように精進したいと思います。

以上、
**「決定木、あなたはどっち派？」**のコーナーでした。
さくらVPSにCentOS7をインストールして、公開鍵のSSHで接続するまで

2017/12 現在、さくらVPSのデフォルトのCentOSのバージョンは6系となっています。
これをCentOS７に変更して、公開鍵のSSHで接続できるところまでをまとめました。

`パスワードログインを塞ぐ方法`、`ポートの変更`、`.ssh/config`の設定等は別途記事にしようと思っています。

# CentOS7のインストール
[カスタムOSインストールガイド - CentOS7 / ScientificLinux7 / Fedora 24](https://help.sakura.ad.jp/hc/ja/articles/206055602-%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%A0OS%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%82%AC%E3%82%A4%E3%83%89-CentOS7-ScientificLinux7-Fedora-24)

ポイントは
- ストレージの選択（「 RECLAIM DISK SPACE 」 の画面で、『 Delete　ALL 』 をクリック）
- 一般ユーザーを作成する時に管理者権限をつけるにチェック（最初からsudoが使える状態になります）
- １０分〜２０分かかります
- インストールが終わるとVNCコンソールが自動的に切断状態となります（さくらVPSの管理画面から起動を行ってください）


# 初期設定
## 一般ユーザーの作成
（さくらVPSではインストール時にユーザー追加→管理者に設定にチェックを行えば省略可能）

```
# passwd

# useradd sakura
# passwd sakura

# usermod -G wheel sakura
# visudo
```

## SSHの設定
ここからはローカルPCで作業を行う
さくらVPSの場合、サーバー側では特に設定不要でSSHの接続を行うことが出来ました。
### SSHでのログイン
```
ssh sakura@XXX.XXX.XXX.XXX
```

### 鍵の作成
（セキュリティのためパスフレーズは設定するようにしてください）

```
$ cd ~
$ mkdir .ssh
$ cd .ssh

$ ssh-keygen -t rsa
```

### 公開鍵ファイルの転送
```
ssh-copy-id -i /Users/<ユーザー>/.ssh/id_rsa.pub sakura@XXX.XXX.XXX.XXX
```

### 公開鍵を使用してSSH接続
```
ssh sakura@XXX.XXX.XXX.XXX -i /Users/<ユーザー>/.ssh/id_rsa
```
この時、
・公開鍵のパスフレーズ
・ログイン先のユーザーのパスワード
を順番に尋ねられるので答えてください。


# 補足及びトラブルシューティング

## WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! 
[SSH接続で WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! って言われて接続を拒否られるとき](https://qiita.com/wnoguchi/items/690f3f4651f8f11e4ed3)

（対象PCのOSの再インストールとかして） ローカルPCのknown_hostsにゴミが溜まると
```
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
```
というのが発生してSSHのログインが出来なくなる

//対処法

```
ssh-keygen -R 153.126.173.157

# Host ik1-322-21403.vs.sakura.ne.jp found: line 6
/Users/wb773/.ssh/known_hosts updated.
Original contents retained as /Users/wb773/.ssh/known_hosts.old
```


## 鍵の強度について
[お前らのSSH Keysの作り方は間違っている](https://qiita.com/suthio/items/2760e4cff0e185fe2db9)
この記事では、

```
鍵長が2048以上かつ暗号化方式がRSA、或いはECDSAやEd25519であればOK
```
と書かれている。

`-t` は指定するように書かれているが、`-b`を指定するよう書かれているところはほとんど無かった。
記事に強度の確認の方法が書かれていたので実行

```
ssh-keygen -l -f ~/.ssh/id_rsa.pub
2048 SHA256: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx XXXXXXXX@MacBook-Pro.local (RSA)
```
デフォルトでもキー長が2048あるのでOK
Angular5 + ASP.NET Core2 事始め

この記事は [Silbird Advent Calendar 2017](https://qiita.com/advent-calendar/2017/silbird) の12日目の記事です。

# はじめに
2017/8月にASP.NET Core2がリリースされ、2017/11月には、Angular5がリリースされましたね！今年は、C#とASP.NETにお世話になった年でした。備忘録も兼ねて、環境構築事始め記事を書きたいと思います。ついでに、Chrome60（2017/7月下旬頃）からAuditsにLighthouseが組み込まれましたので、タイトルとは全く関係ないですが試したいので試します！

# ASP.NET + Angular
## Release Note / Change Log
ASP.NET:
https://github.com/aspnet/Home/releases

Angular: 
https://github.com/angular/angular/blob/master/CHANGELOG.md
https://medium.com/angular-japan-user-group/version-5-0-0-of-angular-now-available-9746ef966c7d

## 開発環境
- macOS Sierra 10.12.6
- Visual Studio for Mac
- [node v9.2.1](https://nodejs.org/ja/)
- [dotnet 2.1.2](https://www.microsoft.com/net/download/thank-you/dotnet-sdk-2.1.2-macos-x64-installer)

## 環境構築
1.テンプレートをインストールする
`dotnet new --install Microsoft.AspNetCore.SpaTemplates::*`
![1.jpg](https://qiita-image-store.s3.amazonaws.com/0/221841/cbaf0603-0a47-938d-89d2-998fa8dee550.jpeg)


下記のテンプレートも準備されている模様
- Aurelia
- Knockout.js
- Vue.js
- React.js

2.Angular用のソリューションを生成/必要なパッケージを落としてくる
`dotnet new angular`
`npm install`
`dotnet restore`
![2.jpg](https://qiita-image-store.s3.amazonaws.com/0/221841/f6355198-308d-92f8-4684-d1c51189c771.jpeg)

3.実行
`dotnet run`
VSからデバッグ実行でも同様に起動できます
![move.mov.gif](https://qiita-image-store.s3.amazonaws.com/0/221841/524eb58a-e726-90cf-00c1-59d1c419cbfa.gif)


## ファイル構成
![4.jpg](https://qiita-image-store.s3.amazonaws.com/0/221841/48a6cf75-4909-cc1a-25cc-fc657c069909.jpeg)

ClientApp配下にコンポーネントが設置されてます。
Karma/Jasmineといった単体テストのライブラリもデフォルトで入ってました。

Macの場合、package.jsonを確認すると、Angular4系になっていたので、この状態から、５系にアップデートをする場合は、[こちら](https://angular-update-guide.firebaseapp.com/)を参考に（そもそも、ver指定で落とせる気がするが、、、）。

Windowsの場合は、「ファイル -> 新しいプロジェクト」から、検索をかけるとテンプレートがヒットするので、そちらからインストール出来ます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/221841/e363f76b-1cde-4238-a43a-3b826d63e9b2.png)

# Audits
Chrome60からAuditsに[Lighthouse](https://github.com/GoogleChrome/lighthouse)が組み込まれました。Lighthouseは、Googleが提供しているWebサイトのパフォーマンス計測ツールで、それ以外にもProgressive Web Apps(PWA)への準拠や、アクセシビリティ対応の計測なども出来ます。もともとは、Node.jsで実行可能なツールで、Chromeの拡張機能としてインストールしなければなりませんでした。
<img width="1202" alt="5.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/221841/66eea07e-0f9b-7cbc-4865-6f8434b21a71.jpeg">

画像より、PWA/パフォーマンス/アクセシビリティ/ベストプラクティスの4分類からスコアを表示してくれます。

個人的には、DOMツリーやCSSOMツリーの観点から、クリティカルレンダリングパス（ユーザー操作に関連するコンテンツ表示の優先順位付け）やレンダリング処理（FPS処理軽減やGPUの活用）を意識することが多いので、First Meaningful Paint（ユーザに意味のある表示になるまで）の項目まわりが気になるところでした。

Audits/Lighthouse リファレンス:
https://developers.google.com/web/tools/lighthouse/

### おまけ
![6.jpg](https://qiita-image-store.s3.amazonaws.com/0/221841/d2bdd399-034a-64ee-6448-040862d713c6.jpeg)

# 参考
https://stackoverflow.com/questions/44831899/creating-a-new-angular-project-on-mac-with-visual-studio
http://www.c-sharpcorner.com/article/getting-started-with-angular5-and-asp-net-core/
スマートコントラクトのライフサイクル

オブジェクト指向のプログラミング言語の場合、クラスのインスタンのライフサイクルは実行するマシンのメモリ上に生成され、他のインスタンスとやり取りして、最後消滅されるが、スマートコントラクトの場合、どうなるかをまとめてみます。

## 登録と消滅
- コントラクト登録のトランザクションが実行される時、コントラクトのコンストラクト関数が実行され、実行後の状態をバイト配列としてブロックチェーンに書き込まれる
- コントラクトの処理の中、`selfdestruct(owner)`を呼び出せば、コントラクトが消滅される
    - コントラクトが消滅された後、コントラクトの関数を呼び出すと異常になる

## コントラクト関数の呼び出し
- 作成されたとしても、どのノードのメモリにも存在せず、単に前回の実行後の状態のバイト配列がブロックチェーンに保持される
- 再度呼び出された時（たとえ関数の呼び出しとか）、ブロックチェーンから前回実行後の状態のバイト配列をノード上にあるEVMにロードされ、実行される
- 終わったら新しい実行後の状態のバイト配列がブロックチェーンにほじされる
- コントラクトが消滅されるまで上記の繰り返し

## 全体のライフサイクル
- シーケンス図でまとめました
- 説明
    - クライアント：web3.jsなど
    - ノード：クライアントが接続している、`geth`などイーサリアムのノードアプリケーション
    - ネットワーク：イーサリアム全体のP2Pネットワーク
    - ブロックチェーン：イーサリアムブロックチェーンデータ

```mermaid
sequenceDiagram
participant ci as クライアント
participant nd as ノード
participant nw as ネットワーク
participant bc as ブロックチェーン

opt スマートコントラクト登録
	ci->>ci: スマートコントラクトをビルド
	ci->>nd: デプロイ
	nd->>nd: 初期化関数実行
	nd->>nw: トランザクション発行
  note over nd, nw: 実行結果を含めてスマートコントラクト作成
  nw->>bc: マイニング
	note over bc: スマートコントラクトが作成された
  bc->>nw: 新しいブロック公開
  nw->>nd: 新しいブロックが同期される
  nd->>ci: 結果を通知する
end

opt スマートコントラクト関数の呼び出し
	alt 読み取りの場合
    ci->>nd: 関数を呼び出す
    nd->>nd: ブロックチェーンから結果を取得する
    nd->>ci: 結果を返す
  end
  alt 書き込みの場合
    ci->>nd: 関数を呼び出す
    nd->>nd: 関数を実行しトランザクション作成
    nd->>nw: トランザクション発行
	  note over nd, nw: 実行結果を含めてスマートコントラクト作成
	  nw->>bc: マイニング
    note over bc: スマートコントラクトが更新された
	  bc->>nw: 新しいブロック公開
	  nw->>nd: 新しいブロックが同期される
	  nd->>ci: 結果を通知する
  end
end

opt スマートコントラクトの消滅
  ci->>nd: 関数を呼び出す
  nd->>nd: 関数を実行しトランザクション作成
  nd->>nw: トランザクション発行
  note over nd, nw: 実行結果を含めてスマートコントラクト作成
  nw->>bc: マイニング
  note over bc: スマートコントラクトが消滅された
	bc->>nw: 新しいブロック公開
	nw->>nd: 新しいブロックが同期される
	nd->>ci: 結果を通知する
end
```

## 参考記事
- [『0005』- 以太坊智能合约生命周期（Ethereum smart contracts lifecycle） · 零基础玩转以太坊Solidity智能合约开发到项目实战](https://solidity.liyuechun.org/0005-yi-tai-fang-zhi-neng-he-yue-sheng-ming-zhou-qi-ff08-ethereum-smart-contracts-lifecycle.html)
SQLServerについての個人的まとめ

#この記事について#
自分の備忘録として、SQLServer全般についての自分の考えや調べたことを記載していきます。
ほぼリンク集として使用。
経験が浅いので、間違っていることもあると思いますがご容赦ください。


#小技

| 事項       |       説明|       参照|
|:-----------------|:------------------|:------------------|
|IN句の個数の上限|-|[IN句の個数の上限](http://blog.livedoor.jp/akf0/archives/51402626.html)|
|bcpコマンドの区切り文字指定|-|[bcpコマンドの区切り文字指定](https://docs.microsoft.com/ja-jp/sql/relational-databases/import-export/specify-field-and-row-terminators-sql-server)|
|ワークテーブルの作成|SQLServer ManagementStudio>データベース>対象データベース<br>>指定テーブル>右クリック>テーブルをスクリプト化<br>>CREATE文>新しいクエリウィンドウ|-|

#エラー対応

| 事象       |       説明|       参照|
|:-----------------|:------------------|:------------------|
|エラーコード:0x80004005|対応:不要なテーブルのデータを削除する|-|



#参考#
[bcpユーティリティ](https://docs.microsoft.com/ja-jp/sql/tools/bcp-utility#E)
ドラマ仕立てで見た、Crystal 言語の2017年

#これは[Crystal Advent Calendar 2017](http://qiita.com/advent-calendar/2017/crystal)の投稿です
[Crystal 言語の 2016年を振り返ってみて](https://qiita.com/yahhonob/items/8f497f9c06484c7c0475)の続きです。
記憶に基づいて、慌てて書きますので、誤りはご容赦ください

#今年は、Crysal 言語の開発ストーリーを後で振り返るとしたら、間違いなくドラマチックな年でした。

Ary Borenszweig さん（通称Ary さん）の驚異的な、開発スピードと、修正コミットのレスポンスから、Crystal言語をここまで発展させたといえるわけですが、そのAry さんが4月突然 Git開発上に現れなくなりました。その後、かれは　Crystal言語の開発コミット履歴を、2012年9月初コミット以降のすべてを削除し、まったく姿を消していきました。
どうも　Ary さんは、会社を去っていくか、言語の開発から離れる模様がうかがい知れました。
これに対する憶測が、インターネット上に流れるわけですが、Manas社からしばらく、6月頃まで正式なコメントは出ませんでした。
一方で Crystal 言語は、新たな普及段階を迎え、開発に新たに参加するメンバーが拡大し、Gitter　の議論数は、目に見えて増えていきます。

またプルリクなど、6か月を超える議論が続く例えば Hash 実装の改良やライブラリーの安定、機能向上に関する議論が増えていきます。


日本からは、以前から参加しておられたメンバーに加え、Formatter King of the Yearと呼ばれたMakenowjust さんや　Router 開発とベンチマークを公開し、Awesome-Crystal　のコミッターの一人を引き受けられた Tbrand さん　などが世界レベルで見ても、Crystalの発展に寄与されています

その後、 Ary さんの動向について、Manas社から、Crystal言語の将来に向けたロードマップ公開や、他社協業が発展していることと合わせ、コメントが出て、企業連携の関係で、まだ発表はできないけれど、というニュアンスで　Ary さんが今後も、関係しそうなコメントが公開されました。

一方で、Ary さんは,あいかわらず沈黙しています。　そして彼は7月頃、シリコンバレーに拠点を置くソフトウェア技術志向の企業の、アルゼンチン現地スタッフ（一人）として、ＷＥＢ上に姿を現します。

そして彼は、なんとなくリハビリをしていたのか、8月まず手始めに彼は、Ruby Formatter をGIT 上に公開します。　そして忘れもしない8月15日 彼は、Crystal言語の開発プルリクに再びコメントを始めます。そして現在に至ります。　Crystal言語開発の決定権は、Manas 社にあるという立場で、彼はコメントやプルリク、アドバイスに専念する、という立場を継続しています。　

12月最近　彼は、またちょっと顔を出していないのですが、彼は、誰かから Gitterで呼ばれると、あいかわらずさっと現れ、それは彼がコメントに常に目を通していることがうかがわれ、私は一安心してみています。

8月TIOBE Indexに突然　Crystal言語が３２位にランクインしたのも、ドラマチックでした。７月は６０位といわれTIOBE側で、喫緊の話題度を織り込むよう検索条件を変更したことが、このドラマチックな結果とつながりました。このrustよりも上位にランクする状況は、ちょっと首をかしげる集計ですが、Crystal言語の知名度があがってほしいと願ってきた関係者から見ると、まさに天の助けですね。

さて、今年もあと残すところ1か月を切り、Crystal 言語への　並列化機能実装は入るのか、Roadmap のVer1.0 は出るのか、がクリスマスプレゼントで、楽しみで残っています。

実際この進展では、Ver1.0 は難しいですが、
Windows サポートでは、"Hello World"　プロジェクトが、進展し、GC 実装を残すのみともいわれています。

並列化機能は織り込まれていませんが、プログラムから OS のプロセスを呼び出し、並列化動作させることはすでに可能であり、負荷バランスの自らの調整はできずに OSまかせではありますが、特定ＷＥＢ用途では、例えばTechemPower ベンチマークでは、80 CPUを並列動作させるところで競争していても、Crystal言語は並み居る強豪の中で、トップの５０％パフォーマンスの位置にキープできています。

ガーベージコレクション改良も、平凡なBohem-GCだけではなく、Go 並みの時間ロスのない Immix 実装の話題も、出始めました。

量産へ Crystal 言語を応用する企業も欧米では確実に増え、自らアナウンスする企業も多く、みずからのポリシーを主張する頼もしさが言語周辺で拡大しています。

その意味で、Ver 1.0 が出なくとも期待は持てます。　継続してWatchしていきたいと思います
ここまで、読んでいただき、ありがとうございます。

さて、明日は、続くことやら．．　みなさん　よろしくおねがいします。

この続きは
[Crystal 言語の 2017年を振り返ってみて](https://qiita.com/yahhonob/items/0c6eb2e4724c6821e1db#_reference-be3785a7a4daf6796069)でまとめています。
配列リテラルで最後の要素をハッシュにする場合のTips


## はじめに

この記事は書籍「[プロを目指す人のためのRuby入門](http://gihyo.jp/book/2017/978-4-7741-9397-7)」に掲載できなかったトピックを著者自らが紹介するアドベントカレンダーの12日目です。
本文に出てくる章番号や項番号は書籍の中で使われている番号です。

今回は配列リテラルで最後の要素をハッシュにする場合のTipsを紹介します。

### 必要な前提知識

「プロを目指す人のためのRuby入門」の第5章まで読み終わっていること。

## 配列リテラルで最後の要素をハッシュにする場合のTips

### 配列のおさらい

4.2節でも説明したとおり、Rubyの配列では異なるデータ型を混在させることができます。

```ruby
# 数値と文字列を混在させた配列を作成する
a = [1, 'apple', 2, 'orange', 3, 'melon']
```

なので、配列の要素としてハッシュを混在させることも可能です。

```ruby
# 2番目の要素をハッシュにする
a = [1, {'apple' => 2, 'orange' => 3}, 'melon']
a[1] #=> {"apple"=>2, "orange"=>3}
```

### 最後の要素をハッシュにする場合

ところで、5.6.5項では「メソッドの最後の引数がハッシュであればハッシュリテラルの`{}`を省略できる」というルールを説明しました。

```ruby
# {}付きでメソッドを呼び出す
buy_burger('fish', {'drink' => true, 'potato' => false})

# {}なしでメソッドを呼び出す
buy_burger('fish', 'drink' => true, 'potato' => false)
```

配列リテラルでも同じように、最後の要素がハッシュであればハッシュリテラルの`{}`を省略できます。

```ruby
# {}付きで最後の要素をハッシュにする
a = ['fish', {'drink' => true, 'potato' => false}]
a #=> ["fish", {"drink"=>true, "potato"=>false}]

# {}なしで最後の要素をハッシュにする
b = ['fish', 'drink' => true, 'potato' => false]
b #=> ["fish", {"drink"=>true, "potato"=>false}]
```

さらに、`**`を使えば変数に入れたハッシュも最後の要素のハッシュに含めることができます。

```ruby
options = {salad: true, chicken: false}

# **を使って最後の要素のハッシュにoptionsの内容を含める
c = ['fish', 'drink' => true, 'potato' => false, **options]
c #=> ["fish", {"drink"=>true, "potato"=>false, :salad=>true, :chicken=>false}]

# **がないと構文エラーになる
d = ['fish', 'drink' => true, 'potato' => false, options]
#=> SyntaxError: (irb):47: syntax error, unexpected ']', expecting =>
#   e, 'potato' => false, options]
#                                 ^
```

このあたりの考え方はメソッドの引数の順番によく似ているので、「コラム：メソッド定義時の引数の順番（172ページ）」もあわせて読んでおきましょう。

### 利用例

この構文はそんなに頻繁に使われるものではありませんが、たとえば「[Rails❤️SQLのサンプルコード](https://qiita.com/jnchito/items/625bef4187e360d7f4bc)」の中では次のようなコードが登場します。

```ruby
args = [
  sql,
  date_from: date_from,
  date_to: date_to,
  name: name,
]
query = ApplicationRecord.send(:sanitize_sql_array, args)
ApplicationRecord.connection.execute(query)
```

`args`の中身をよく見ると、`date_from`から`name`までがハッシュになっていることがわかるはずです。

## 次回予告

次回は文字列をfreezeさせるいくつかの方法を紹介します。
micro:bit のカタカナ表示ブロック（パッケージ）

**※追記(2018/08/11) ：スクロールスピードを調整できるブロックを追加しました**

**※追記(2017/12/25) ：お陰様でパッケージの承認がおりました。パッケージ追加の画面で「katakana」で検索すると見つかるようになりました。なお、あくまでも本パッケージは暫定的な物であるベキで、本来は標準の文字列表示ブロックでlocaleが日本語の時にカタカナが扱えるようになるのがスジだと思っています。**

#はじめに

micro:bit（マイクロビット）の [Javascript Blocks editor](https://makecode.microbit.org/)ですが、スイッチサイエンスさんや他の方々の努力のお陰で全てのブロックが日本語化され、2017年夏以降は子供たちと遊ぶのに困らなくなりました。
とは言え、5x5のLEDには英数字しか表示が出来ないため、作った作品の中でメッセージを表示したくても子供にとってはハードルになっていました。

#カタカナ表示ブロック（パッケージ）

カタカナ表示したいなーとボヤいていたら会社のO君が作ってくれました。
~~現在、micro:bitのパッケージ承認申請中なのですが、とりあえずURLを貼り付ければ使える物が出来たので紹介させて頂きます。~~　2017年12月に公認パッケージとして承認されkatakanaで検索が出来るようになりました。初め、なかなか承認されなかったのですが、日本の状況を説明した所、理解し承認してくれました。（micro:bit財団のMarkに感謝！）

## インストール方法

1. [Javascript Blocks editor](https://makecode.microbit.org/)にアクセス
2. 右上の歯車アイコンをクリックし「パッケージを追加する...」をクリック
3. 「検索または、プロジェクトのURLを入力...」に~~https://github.com/mbitfun/pxt-katakana を貼り付ければOK~~ katakana と入力すればOK。
![katakana.jpg](https://qiita-image-store.s3.amazonaws.com/0/44523/2a92dde2-0814-17ea-8441-07c24487a6bf.jpeg)

## 使い方

ブロックのグループに「カタカナ」が登場するので、その中の「文字列を表示」ブロックを使えば、カタカナが表示されます。注意点としては、半角カタカナで入力をしてください。

![demo-katakana.jpg](https://qiita-image-store.s3.amazonaws.com/0/44523/637c927a-bf68-f26c-47b8-c6afcab4c9a1.jpeg)

サンプル：https://makecode.microbit.org/_Wo89MYf6WRLy