OmniAICreator/Qiita-1.07M huggingface dataset:
Amazon Dash Button をHackして「社内ビール制度」を活性化したい

こんにちは、Enigmo 新卒エンジニアの[@sean0628_i](https://twitter.com/sean0628_i)です。
[**Enigmo Advent Calendar 2018**](https://qiita.com/advent-calendar/2018/enigmo) 8日目の記事です。

ちなみに、[**Enigmo**](http://www.enigmo.co.jp/) は、海外通販サイト [**BUYMA**](https://www.buyma.com/) や、世界中のトレンドをお届けするファッションメディア [**STYLE HAUS**](https://stylehaus.jp/) を運営する会社です。

Enigmo では、[ **「社内ビール制度」**](https://www.wantedly.com/companies/enigmo/post_articles/54907)が存在し、定時の18:30以降 **:beers: ビール :beers: が飲み放題** です。

毎晩定時後は宴会が繰り広げられて、、、ということはなく、日によっては金曜日ですらも人が疎ら、なんていうこともあります。。。

さてはEnigmo 社員はビールが嫌いなのか？とも思いましたが、実際に話を聞いてみると当然そんなことはありませんでした（安心 :relaxed:

**実際の声**
> みんなで楽しくビール飲みたいけど、みんな忙しそうだし。。。
> 声を掛けるのは気が引ける。。。
> 社員Tさん

さらに時々こんな声も、
> 呑んでたなら教えてよ。。。言ってくれれば参加したのに。。。
> 社員Yさん

ニーズはあるのに、多数障壁があるようです :thinking:
これは、[**「社内ビール制度」**](https://www.wantedly.com/companies/enigmo/post_articles/54907)始まって以来の危機だと思い、新卒エンジニアは立ち上がりました。

そうだ、**Amazon Dash Button** を使ってこの危機を乗り越えよう :bulb:

## 内容
- Amazon Dash Button（以下、Button）とは？
- Buttonの仕組み
  - \#DHCP
  - \#ARP request/responce
  - \#MAC address
- Hackの流れ
- 気づき・学び
- 今後の展望

## Amazon Dash Button とは？
> Amazonダッシュボタンは、注文商品を簡単かつ迅速に作成できるように設計された小型の電子デバイスである。
出典: [Wikipedia - Amazon Dash](https://ja.wikipedia.org/wiki/Amazon_Dash)

### 一般的な利用方法
1. Amazon 公式アプリにWi-FI&Bluetooth 経由で連動させる
2. アプリ上でButton に登録したい商品を選択
3. Step2 で設定した商品がほしくなったらButton を押す
4. 数日後、商品が手元に届く

### Button の仕組み
1. Buttonの押下により、電源オン
2. アプリで設定しておいた、Wi-Fiに接続
3. DHCPでIPを取得
4. 商品注文リクエスト

とここで文系新卒の私は **DHCP** とはなんぞやと思ったわけです。。。:sob:
で、調べました。

## 利用技術
### DHCP とは？
- コンピューターにIPアドレスを自動割り当てする仕組み
- IPアドレスは、いわゆる住所のようなもの (IPは `8.8.8.8` こんな感じの数字のやつ)

と、DHCP はなんとなく理解したものの、次なる敵が現れました。:scream:

**MAC address** 、 **ARP** です。。。

もう横文字嫌だー、と思いながらも開発に必要なため背に腹は代えられず調べました。

### MAC address とは？
- 識別に利用される原則一意の物理アドレス

### ARP とは？
- IP からMAC を調べる仕組み

のことらしい。。。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/234165/6ce81a02-e353-05cd-7b02-fe671e7d2a05.png)
出典: [What is ARP and ARP spoofing?](https://www.quora.com/What-is-ARP-and-ARP-spoofing)

## Hack の流れ
1. ARPを利用し、ButtonのMACアドレスを取得\*
2. ButtonのMACアドレスを監視
3. ButtonからのARP Requestをキャッチ
4. 任意の処理をする（今回はSlackにmessageを投下）

\*: 初回のみ。実際Buttonが押されてからの流れは2~3

### 実際の実装
長くなるので割愛します。
ソースコード(Sean0628/dash_button): https://github.com/Sean0628/dash_button

### テスト運用
↓こんな感じ :tada: 
<img width="799" alt="Screen Shot 2018-12-08 at 12.43.03.png" src="https://qiita-image-store.s3.amazonaws.com/0/234165/27f9f746-8ac5-d253-adcb-7a0edc1da91b.png">
\*: **リゾート** とは、Enigmo 社員の憩いの場所 :palm_tree:

## 気づき・学び
普段業務では主にRuby を使っていて、node を初めて使いました。
しかし、やってみると意外に簡単。メンタルブロックをいかに外すかが大切なのだと感じました。

業務では関わることのできないネットワークの分野も面白いなぁと思いました。
機会があれば深掘りしてみたいなぁと。

## 今後の展望
勉強も兼ねて不要なPCにCentOS を入れて、CentOS をサーバにしてButton を活用したいと思っています。

まだ、本格的なリリースまでは行けてないので、早く始動させてみんなで楽しく:beers: ビール:beers: を飲みたいと思います。


**最後まで読んでいただきありがとうございます。**

---

参考: [Dash Buttonの設定を管理する](https://www.amazon.co.jp/gp/help/customer/display.html?nodeId=201730790)
参考: [Enabling Interactions with Bots](https://api.slack.com/bot-users)
【Handsontable】全選択/全解除チェックと行削除

# はじめに
これは、[Handsontable Advent Calendar 2018](https://qiita.com/advent-calendar/2018/handsontable)の8日目の記事となります。

前回「[【Handsontable】データの読み込みと行追加](https://qiita.com/yaju/items/3d7f598867556077dac5)」ではデータの読み取りと行追加を行いました、今回は全選択/全解除チェックと行削除を実装していきます。

# 全選択/全解除チェック
画面上部に全選択/全解除チェックボックスがあり、全行の先頭列チェックボックスを全選択/全解除チェックボックスの値を同じにします。

```javascript
// 全選択／全削除チェック処理
function allCheck(checkbox) {
    for (var i = 0; i < hot.countRows() ; i++) {
        hot.setDataAtCell(i, 0, checkbox.checked)
    }
}
```

素直にこのように書いたところ、IE11では40件データで15秒程かかったが、Chromeでは問題ない速度であった。
たぶんイベントなど余分な制御が入るために遅くなると思われる。BeginEdit/EndEditのような余分な制御を停止する機能はないようである。

## 高速化
調査した結果、populateFromArrayで高速化できることが分かった。

```javascript
// 全選択／全削除チェック処理
function allCheck(checkbox) {
    var col = hot.propToCol(COL_SELECTConst.Select);
    hot.populateFromArray(0, col, [[checkbox.checked]], hot.countRows() - 1, col, null, null, 'down');
}
```

![全選択.png](https://qiita-image-store.s3.amazonaws.com/0/14053/c9fe452d-9c46-af2a-fb8c-2e4481c04b5b.png)


# 行削除
対象行を指定する。

```javascript
hot.alter('remove_row', row);
```

## 行削除ボタンの実装
ループ処理で行を削除する場合は、下から上に向かって行うのが鉄則です。
全行無くなったら1行追加するのと、全選択チェックを解除しています。

※本来は確認メッセージと完了メッセージを実装するのですが、今回は省略

```javascript
// 行削除ボタン処理
function delRow() {
    // 画面反映
    var col = hot.propToCol(COL_SELECT);
    for (var i = hot.countRows() - 1; i >= 0; i--)
        if (hot.getDataAtCell(i, col) === true)
            hot.alter('remove_row', i);

    // 全行無くなったら1行追加
    if (hot.countRows() === 0) {
        addRow();
    }

    // 全選択/全削除を解除
    $('#allCheck').prop("checked", false);
}
```

![全削除.png](https://qiita-image-store.s3.amazonaws.com/0/14053/677f6ac6-02f8-6fb0-43e3-562367b5d55b.png)

## 選択位置の行を削除
コンテキストメニューには「行を削除:Remove Row」がデフォルトで用意されている。

```javascript
contextMenu: {
    items: {
        remove_row: { name: '行を削除' }
    }
}
```
S3をtempディレクトリとして使う

# はじめに
プロジェクトを進めて行くと、何かしらの理由で画像などをS3に一時的にAPIを通して、ユーザーに見せるなんて機能が必要になるときがあるのではないでしょうか。
でも、アプリケーションサーバーにtempディレクトリを使うと、クーロンなどが何かしらの理由で削除できなかったり・スケーリングの面からも少し不安になりませんか？
その時にS3を一時的にtemp的な使い方をすることができるようになります。

## 設定をしていく
今回設定となる肝は **ライフサイクルルール** という機能です。
![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/106063/3893fe4a-d485-d886-fcc2-aca0762e926e.png)

この機能はなにかというと、設定した時間がたったら削除をするなどができる機能です。
例えば
icon/temp/
にアップロードをしたとして、tempの下を削除するのであれば、
プレフィックス/タグフィルターを追加する
の部分に該当のディレクトリ名を入れる。
アップロードする際にタグを付ける場合はここにタグ名を入れるだけで設定完了です。

## アプリケーションの動きも少し変更する
ファイルのアップロードの処理も少し変更します。

```
ファイルのアップロード
↓
S3にアップロード
```

を

```
ファイルのアップロード
↓
S3（tempディレクトリ or タグをつけて）アップロード
↓
（完了ボタンなどが押される？）
↓
該当のファイル（配置したい場所移動 or タグを削除する）を行う
```

このような処理をすれば、tempディレクトリを簡単に作れ・いちいちsshしてビクビク監視する必要もありません。
またtempディレクトリだけではなく、この設定を使えばLogファイル・バックアップファイルなども自動で削除し、容量を節約することもできます。
ライフサイクルルール、どんどん使っていきたい・３・
オブジェクト指向でなぜつくるのか 第4章 ~補足~

## はじめに

![image.png](https://qiita-image-store.s3.amazonaws.com/0/186009/7bf8dcaf-d077-9b43-805e-7f6bcad83dc9.png)

Amazon: https://www.amazon.co.jp/dp/4822284654

「オブジェクト指向でなぜつくるのか-第2版-」の第4章に書かれているオブジェクト指向プログラミングの三大要素をまとめました。今回は、さらに進化した最近のオブジェクト指向プログラミングの仕組みを補足としてまとめます。

記事: [オブジェクト指向でなぜつくるのか 第4章](https://qiita.com/tamago3keran/items/bbe92baebf72c89d11a5)

## クラスも型として利用する

プログラム言語によっては、変数を定義するときに型を指定することがあります。これは、プログラマが楽をするための仕組みです。

変数に指定した型以外の値がセットしたり、整数と文字の掛け算など意味的におかしいロジックが書かれたりすると、コンパイル時や実行時に明示的なエラーにすることができます。エラーに気づける仕組みがあることで、プログラマが楽になります。

こうした型宣言・チェックの仕組みは、高級言語や構造化言語のときからありましたが、オブジェクト指向プログラミングでは、さらにクラスまでも型として宣言することができるようになりました。

Javaだと下記のようなサンプルになります。

```java:例 
CharacterCounter counter; // 変数counterはCharacterCounter型であることを宣言
counter = 100; // <- コンパイルエラー
counter = new CharacterCounter(); // <- コンパイルOK
```

自分で作成したクラスまでも変数の型として宣言できるようになったことで、エラーの検出がさらに向上し、プログラマが楽できるようになりました。

## パッケージ

パッケージとは「まとめる」仕組みです。しかし、クラスと違ってメソッドやインスタンス変数を定義することはできません。

ファイルディレクトリの構造と同じように、コードを階層構造でまとめることができます。

![oop-ページ9.png](https://qiita-image-store.s3.amazonaws.com/0/186009/9a27f457-7403-9b3c-cfc2-42152e2573f6.png)

クラスと同様にコード全体の見通しをよくして、コードを管理しやすくしています。

## 例外

ここで定義されている例外は、「戻り値とは違う形式で、メソッドから特別なエラーを返す仕組み」のことです。

```text:特別なエラーの例
ネットワークの通信障害、データベースのデッドロックなど
```

従来のサブルーチンの仕組みでは、エラーコードを使った方法が一般的でした。（1なら通信障害、2ならデッドロックなど）

![oop-例外-従来- (2).png](https://qiita-image-store.s3.amazonaws.com/0/186009/4c196b28-5651-3e79-a725-e083a4504d6f.png)


しかし、エラーコード方式だと以下2つの課題がありました。

- **課題①**: エラーコードの判定処理を確実に行う必要がある
    - エラーコードの判定処理を忘れたり、間違えたりすると、障害原因の特定が困難になる
- **課題②**: エラーコード判定の同じようなロジックが複数のサブルーチンで連鎖する
    - エラーコードを呼び出し側に返すだけでも、同じような判定ロジックを書かなければならない

そういった課題を解決するために作られたのが、例外という仕組みです。

![oop-例外-改善-.png](https://qiita-image-store.s3.amazonaws.com/0/186009/bbf42702-218b-cdff-6538-c5c0706a1836.png)

例外の仕組みでは、特別なエラーを返す可能性があることをメソッドで宣言し、そういったメソッドを呼び出す側では例外を処理するロジックが書かれていないとエラーになります。（ **課題①** の解決）

また発生した例外を上位のメソッドに渡すだけのときは、例外を宣言するだけでエラー処理を書かなくてよくなります。（ **課題②** の解決）

つまり、例外には **無駄なコードをなくすという効果** と、 **処理の書き忘れを防止するという効果** があります。

## ガベージコレクション

C言語やC++などの以前のプログラミング言語では、不要になったメモリ領域を削除する処理を明示的に書かなければなりませんでした。

オブジェクト指向プログラミングでは、インスタンスを大量に作成できるがゆえに、不要になったインスタンスを削除してメモリ領域を確保しないと、 **メモリリーク** が発生してしまいます。

こうした課題を解決するために作られたのが、 **ガーベジコレクション** という仕組みです。カベージコレクションは、不要になったインスタンスを自動的に削除します。

![oop-ガベージコレクション.png](https://qiita-image-store.s3.amazonaws.com/0/186009/ccea3a31-cae0-e8ae-ec6b-05cff310a00e.png)

不要となったインスタンスを削除するというコードを、プログラマが明示的に書かなくてよくなりました。
Golang を導入してツールの配布が楽になった


## ◆レビュータイトル

## ◆お使いのツール名*
[go](https://golang.org)

## ◆この製品の良いポイントは何でしょうか？
なんといってもシングルバイナリを生成できるところでしょう。

rubyやpythonでツールを作成し、配布しようとすると、どうしても各ユーザに依存関係を解決してもらう必要があり、非エンジニアを含め利用してもらうツールを配布するには若干厳しいところがありました。

しかしGolangとgoならなんと、go build とするだけでバイナリが生成され、そのバイナリだけを配布すればよくなるのです、とても画期的！

## ◆改善してほしいポイントは何でしょうか？
Cのプログラムをバインドする必要が出てくるとどうしてもシングルバイナリで済まなくなる点でしょうか。バインドせず、Goで書き直せば良いと言われてばそれまでですが、既存の資産をうまく利用したいところではあります。

## ◆どのようなビジネス課題を解決できましたか？あるいは、どのようなメリットが得られましたか？
良いポイントでおおむね述べてしまっていますが、バイナリ1つを配布すれば済むところ、各自がそれぞれビルドする必要がなく、環境を整えるのに要する時間が短くなったことです。

新しく人が入ってきても、ファイルをダウンロードしてもらうだけで済むのはとても楽です。
本番運用するアプリでモデルの自動マイグレーションを使ってはいけない

これは「[Vapor Advent Calendar 2018](https://qiita.com/advent-calendar/2018/vapor)」8日目の投稿です。

## はじめに

ご存知の通り、Fluent にはデータベーススキーマのマイグレーション機能があります。例えば `title` などをプロパティに持つ `Article` というモデルがあったとして、

```Article.swift
...

final class Article: MySQLModel {
    var id: Int?
    static let entity = "article"  // テーブル名

    var article_id: Int?
    var pub_date: Date?
    var title: String?
    var article_url: String?
    var site_id: Int?
}

extension Article: Migration {}

...
```

のようにモデルを `Migration` プロトコルに適合させておいて、

```configure.swift
...

var migrations = MigrationConfig()
migrations.add(model: Article.self, database: .mysql)
services.register(migrations)

...
```

と設定しておくと勝手にモデルのプロパティに合わせて自動でスキーマを決定しマイグレーションしてくれるというやつですね。

_※ちなみにサンプルコードには [ VaporとMySQLを接続する。その2 ](https://qiita.com/takoikatakotako/items/0dcc25748a099c768f37) のものを参考に使わせていただきました。ありがとうございます！_

この自動マイグレーション機能はとてもお手軽です。なので、世の中の Vapor 入門記事や入門書でもこのマイグレーションの実装が書かれていることがほとんどで、Vapor の Fluent でのマイグレーションはこの形だと思っている方も多いかもしれません。

それはもちろん間違いではありません。しかし、実際に本番運用させるアプリケーションでは自動マイグレーションは基本的に利用しない方がよいです。

理由は主に2つあると考えています。

- データベースの変更結果の予測が難しいこと
- テーブルの変更ができないこと

## データベースの変更結果の予測が難しいこと

マイグレーションの仕組みを使うときには、データベースへの変更をトラッキングして明示的に管理したいという気持ちがあると思います。

冪等性というと語弊がありそうですが、ある特定のマイグレーションを実行したときに何が起こるかはある程度は定まったものになっていて欲しいですよね。

しかし、モデルの自動マイグレーションはモデルのプロパティの設計に依存し、その内容もプロダクトコード上に明示されるものではないため、実行するタイミングによってどのような結果になるかが予測できません。

これは本番運用していく上では正直微妙です。

## テーブルの変更ができないこと

モデルの自動マイグレーションはテーブルの変更はしてくれません。つまりモデルのプロパティを変更しても `ALTER TABLE` されないということです。

これ、地味にハマる人がいると思うのですが (自分も最初あれ？と思った) 、モデルを更新して何十回 Vapor を起動してもテーブルの変更をするマイグレーションは行われません。

自動マイグレーションの実装はごくナイーブなものになっていて、単純にテーブルを `CREATE` / `DROP` するだけなんですね。そして、一度実行されたマイグレーションは (revert されない限りは) 2度と実行されません。

_※`fluent` テーブルの中を見るとマイグレーションの履歴があり、そこにクラス名が入っているのがわかると思います。マイグレーションが実行されたかどうかはそのキーに依存しています。_

## じゃあどうすればいいの？

Vapor におけるマイグレーションのベストプラクティスというのが明確に示されているわけではありません。

が、[Fluent Migrations](https://docs.vapor.codes/3.0/fluent/migrations/) のドキュメントには、モデルの自動マイグレーションに言及した部分で以下のように書かれています。

> This method is especially useful for quick prototyping and simple setups. For most other situations you should consider creating a normal, custom migration.

自動マイグレーションはプロトタイピングや単純な構成には向いているが、それ以外のケースでは「通常のカスタムマイグレーション」を使うべきだ、とあります。

ということで、次回は自動マイグレーションではなくカスタムマイグレーションを実装する方法を紹介したいと思います。
PythonでLINE Bot APIを使ってプッシュ通知を実装する


[Renttleのあれこれ ~はじめて0からサービスを開発~ Advent Calendar 2018](https://qiita.com/advent-calendar/2018/renttle)でLINE Bot APIについて、何回か書きましたが、今回もLINE Bot APIについて、書きました。

LINEは、日本でもっとも日常的に使われるアプリの一つであることは間違いないでしょう。このLINEのプラットフォームをうまく使いこなせれば、自分が作りたいサービスや発信したい情報を広めることができるでしょう。

今回は、「LINE Bot API」を使って、「プッシュ通知機能」を実装します。

LINE Developerの登録などの基本設定は、「[LINEの「Messaging API」でテンプレートメッセージを実装してみた](https://qiita.com/kotamatsuoka/items/c4e651f1cb6c4490f4b8)」の記事を参考にしてください。

実装中のLINE Botです。ぜひ、使って遊んでみてください٩(•౪• ٩)
<a href="https://lin.ee/BbNwMMp"><img src="https://scdn.line-apps.com/n/line_add_friends/btn/ja.png" alt="友だち追加" height="36" border="0"></a>
(記事なキャプチャと違い「メジロ」というサービス名になっています。)


## 目次
- プッシュ通知を実装
- push_messageメソッドを観察
- 気をつけること
- おまけ

## 対象
- LINEのMessaging APIを使ってみたい人
- LINEでプッシュ通知を送りたい人

## プッシュ通知を実装
では、早速、実装していきましょう。
(冒頭にも書きましたが、LINE Developerの初期設定などは、[こちら](https://qiita.com/kotamatsuoka/items/c4e651f1cb6c4490f4b8)を参照ください。)

### ライブラリの準備

```
$ pip install flask
$ pip install line-bot-sdk
```

### push_message()を使ってプッシュ通知機能を実装
とても短く書けます。

```python:push_message_sender.py
from linebot import LineBotApi
from linebot.models import TextSendMessage

# リモートリポジトリに"ご自身のチャネルのアクセストークン"をpushするのは、避けてください。
# 理由は、そのアクセストークンがあれば、あなたになりすまして、プッシュ通知を送れてしまうからです。
LINE_CHANNEL_ACCESS_TOKEN = "ご自身のチャネルのアクセストークン"

line_bot_api = LineBotApi(LINE_CHANNEL_ACCESS_TOKEN)


def main():
    user_id = "プッシュ通知を送りたLINEユーザーのuser_id"

    messages = TextSendMessage(text=f"こんにちは😁\n\n"
                                    f"最近はいかがお過ごしでしょうか?")
    line_bot_api.push_message(user_id, messages=messages)


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

このファイルを実行すれば、指定したidのLINEにメッセージが送られます。

```
$ python push_message_sender.py
```

### LINEのuser_idはどうやって取得するのか
「ちょっと!!LINEのuser_idなんて知らないよ!!」って思った人がいるかも知れません。

でも、大丈夫です。
[LINE Bot APIを使ってLINEユーザー情報を取得する](https://qiita.com/kotamatsuoka/items/472b455e5f9a6315d499)を読めば、user_idの取得方法が書いてあります。
これで取得したuser_idをDBなどに保存しておいて、そのuser_idたちを使えば、プッシュ通知を送ることができます。


## push_messageメソッドを観察
[Renttleのあれこれ ~はじめて0からサービスを開発~ Advent Calendar 2018 の7日目](https://qiita.com/kotamatsuoka/items/472b455e5f9a6315d499)の記事と同様に、今回使うメソッドの中を観察してみましょう。（観察力も上がってきた( ͡° ͜ʖ ͡°)﻿）


```python:linebot/api.py
    def push_message(self, to, messages, timeout=None):
        if not isinstance(messages, (list, tuple)):
            messages = [messages]

        data = {
            'to': to,
            'messages': [message.as_json_dict() for message in messages]
        }

        self._post(
            '/v2/bot/message/push', data=json.dumps(data), timeout=timeout
        )
```

ふむふむ。
第一引数にLINEの`user_id`を渡して、第二引数にTemplateSendMessageクラスなどで定義した`messages`を渡さえば、正常に動いてくれそうですね。
それを加工して、LINEのWeb APIに投げているだけですね。超シンプル!

## 気をつけること
「**プッシュ通知を実装**」内のコードのコメントアウトでも書きましたが、**ご自身のチャネルのアクセストークンをリモートリポジトリにpushするのは避けてください。**

理由は、そのアクセストークンさえあれば、プッシュ通知を送れてしまうからです。

誰があなたのリポジトリを見ているかわかりません。世の中はいい人ばかりではありませんよ。

## おまけ
最後までお付き合いいただき、ありがとうございました。
少しでもお役に立てたのであれば、嬉しいです。

実装中のLINE Botです。ぜひ、使って遊んでみてくださいヾ(・ω・ ) ﾅﾃﾞﾅﾃ
<a href="https://lin.ee/BbNwMMp"><img src="https://scdn.line-apps.com/n/line_add_friends/btn/ja.png" alt="友だち追加" height="36" border="0"></a>
(記事なキャプチャと違い「メジロ」というサービス名になっています。)
プログラムにおける起承転結

物語の構成として「起承転結」を意識するのが良いとされていますが、プログラムにもそういう構成の“お約束”があるのではないか？　そんなお話です。

## プログラム 上から書くか 横から書くか

今回のターゲットは「関数の中」です。
皆さん、関数の内部処理を書くとき、どんな順序で書きますか？
他の開発者とそういう話をしたことはありませんが、何となく「処理の順を追って上から書く」方が多いんじゃないかな？という気がします。

### 例題

与えられた会員情報 member から年齢 age を取得する get_age 関数を例に考えてみます。
memberにはnilが渡される可能性があり、その場合はnilを返すものとします。

```ruby
def get_age(member)
  # どう書く？
end

p get_age({:name=>"Bob", :age=>15}) # => 15
p get_age(nil) # => nil
```

### 回答例1.上から書く

やるべきことを頭から一気に書いていくと、例えばこのようなコードになります。

```ruby
def get_age(member)
  if member
    return member[:age]
  end
end
```

この書き方は、小説で言えば1ページ目から出来事を順に書いていくやり方と言えるでしょう。

### 回答例2.結論から書く

私なら、結論から書きます。ちなみに「横から書くか」という言い回しはもちろんネタなので、横から書く方法は分かりません(そもそも横って何だ)。

```ruby
def get_age(member)
  age = nil
  return age
end
```

まず、get_ageなのですから、最後にageをreturnします。
メソッドでやるべきことは基本的に一つであり、やるべきことがメソッド名になっているべきです。これは、コードの書き方に関する本等で表現に違いはあれどよく言われていることかと思います。

そして次にメソッドのコメントを書きます。
開発環境/エディタによっては"@param"等を補完してくれるのでこのタイミングで書いています。

```ruby
# 年齢を取得する
# @param [Hash] member 会員情報
# @return [Integer|nil]
def get_age(member)
  age = nil
  return age
end
```

そしてやっと、処理のメインを書きます。

```ruby
# 年齢を取得する（以下略
def get_age(member)
  age = member[:age]
  return age
end
```

今回は１行で完結する単純なロジックなので`age = nil`の部分を書き直す形になりましたが、複数行を費やすようならこんな感じで残したりします。

```ruby
  # 関数内部のみ
  age = nil
  birthday = Date.parse(member[:birthday])
  age = MyUtil.diff_year(Date.today, birthday)
  return age
```

そして、入力値のチェックは後から追加します。

```ruby
# 年齢を取得する（以下略
def get_age(member)
  if member.nil?
    return nil
  end
  age = member[:age]
  return age
end
```

結果、関数内1〜3行目は「入力値チェック」、4行目は「メイン処理」、5行目はそもそもRubyだと書く必要がありませんが、返り値を明確にするためあえて記述するのが個人的には好みです。

それはさておき、こんな感じで関数の内部に明らかな構造が生じました。
起承転結ではありませんが、だいたいどの言語で書いてもこのような構成にならないでしょうか？

ちなみに、入力値チェックは処理の先頭でなくてもよいと考えています。
私の場合、「内部処理を最後まで進むのが正常系であり、異常系は随時途中でハネる」というポリシーで書いています。
その恩恵を説明するために「上記コードをリリース後、member[:age]に文字列が入ってくるケースがあることが分かった」と仮定しましょう。

コードで表現すると、こんな感じです。対応としてはnilを返すものとします。

```ruby
p get_age({:name=>"Bob", :age=>"-"}) # => nil
```

### 入力値チェックを追加する

では修正しましょう。

### 回答例1からの修正

```ruby
def get_age(member)
  if member
    if member[:age] 
      if member[:age].is_a? Integer
        return member[:age]
      end
    end
  end
end
```

ネストがかなり深くなりました。
書き方を工夫すれば多少は改善します。

```ruby
def get_age(member)
  if member
    if member[:age] and member[:age].is_a? Integer
      return member[:age]
    end
  end
end
```

簡単な例だからまだ分かりますが、長くなったり条件分岐が増えてくると、正常な時にどんな値が返ってくるのか？　さらに修正を加えることになったらどこに加えるべきか？　判断するのが加速度的に難しくなっていきませんか？

### 回答例2からの修正

```ruby
# 年齢を取得する（以下略
def get_age(member)
  if member.nil? or member[:age].nil?
    return nil
  end
  if not member[:age].is_a? Integer
    return nil
  end

  age = member[:age]
  return age
end
```

ポイントは「異常系は随時途中でハネる」ため、`if member[:age].is_a? Integer`ではなく、`if not member[:age].is_a? Integer`としているところです。
これを徹底すると、ネストが深くならずに済みます。

```ruby
  if not member[:age].is_a? Integer
    #return nil
    raise('Invalid type: age')
  end
```

内容によってはこんな感じで、例外でハネるのもいいでしょう。

全体としてコードは長めになりますが、何がNGでその時に何が起きて、本来どういう処理が行われてというのが分かりやすく、修正時もアタリがつけやすいのではないでしょうか？

## まとめ

このように、『やることを順番に書く』のではなく『「宣言(今回の例ではありませんでしたが)」「入力値チェック」「メイン処理」等の構造を意識して書く』とコードが読みやすく、メンテしやすくなってオススメです。

今回はRubyで書きましたが、基本的な考え方は他の言語にも適用できるかと思います。
遠隔お酌とisaax

こんにちは、いとう＠遠隔お酌です、
このお話は、[isaax勉強会#21](https://isaaxug.connpass.com/event/109196/)でLTした内容です。
我々の「遠隔お酌」プロダクトがisaaxを採用した理由を紹介します。

# 遠隔お酌とは
インターネットに接続したお酌装置です、
[【居酒屋 x IoT】業界初！？ 養老乃瀧ハッカソン！](https://yorohack.connpass.com/event/52842/)で生まれました。
ハッカソンの様子はこちら（https://dotstud.io/blog/yoro-hack-ukkz-report/)

このハッカソン、開始と同時にビールで乾杯なのです。飲みながらチームビルディングを行うのですが、気が付いたら松原さんしか残っていませんでした、なので２人でやろうとなりました。

アイデアは、松原さんが元々考えてました、
離れて暮らしている方々に、お酌を通して繋がりを感じていただくことがコンセプトです。

幸運なことに、最優秀賞で、賞金１０万円頂きました:smiley:
![image.png](https://qiita-image-store.s3.amazonaws.com/0/136795/f3cb415e-b1fe-f87a-cbd1-01b5a510f3dd.png)

さらに、実証実験もやらせていただけるとのことなので、ちゃんと動くものを作りました。
ハッカソンの時は、おもちゃの哺乳瓶を傾ける装置だったのですが、試行錯誤の結果、今の形になりました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/136795/159be21f-067a-b435-4c15-d625d574b0ce.png)

実証実験は、敬老の日におこないました、いなかのお爺ちゃんに、お孫さんがお酌をして楽しんでいただきました。
その時の動画です。
https://youtu.be/SpkNJvoP58w

勉強会やアイデアソンなどイベントに持ち込んで、皆さん楽しんでもらってます、先日新聞にも載せていただいています。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/136795/3964ac3a-20fc-7a3a-fa7a-ce3f9ad505eb.png)
どうせなら市販したいとも思っているのですが...


# isaaxとは
詳細は、 https://isaax.io/ を見てもらったほうがいいのですが、簡単にいうと

- 多数の端末のソフトを一発でアップデートできる
- ネットに繋がっていれば、手元になくもOK
- gitを使っているのでバージョン管理もできる

というサービスです。

# 遠隔お酌とisaax

### ソフトウエアの改修が多い
仕事で行っているわけではないので、ちゃんと調査検討設計ができていないので、プログラムをいろいろ修正しています

- バグ対策
 - エラー対策
- 機能アップ
 - 通信プロトコル変更
 - デモモード
 - 起動処理時間の改善
などなど

また、相方は、ソフトウエアエンジニアでないので、git pullやviなどの操作は、無理があります。

### 装置が多数
- 二人で１組（２台）で４台＋α
- 会社が違うので、そんなに会えない、装置持ち運ぶのも大変
- 養老乃瀧に、納品することが決定

という状態になりました、計６台ですが、ちょっと心配になります。

### isaax 超便利
そんな時に、isaaxを知りました、ちょうど勉強会があったので参加しました。

- git pushするだけで全デバイスがバージョンアップできる！
- ログがリアルタイムでみれる！
- プログラムの再起動も可能！
- git branch切って、isaaxクラスターで分ければ、カナリヤテスト（ABテスト）できる！
- pre-updateスクリプトでnpm installやpip installにも対応！

### isaax 最高！！
- ソフトのバージョン管理（旧バージョン対応）は大変ですよね
- 旧APIやI/Fをいつまでサポートするのか？も良く問題になります
- Isaaxなら端末の起動時に最新バージョンに更新されるので、古いAPIやI/Fを捨てられます
- Isaaxコンソール見れば、各端末のバージョンが一目瞭然
- 
どうですか？使ってみたくなったでしょ？？

### isaax へ要望
とても便利なのですが、使いづらいこともあります

###### ログのでかた
 - LINEみたいにおしゃれだけど、デバッグには…
![image.png](https://qiita-image-store.s3.amazonaws.com/0/136795/43a126d4-40da-21ec-428d-a11838ee704e.png)

普通のコンソール画面みたいにしてほしいです

###### １台に１つのプログラムしか管理できない
もともと、遠隔お酌は下記３つのプログラムで動いていました

- ＢＬＥ受信、データ送信
- データ受信
- サーボを動かす

ところが、isaaxは、１つのプログラムしか管理できないので、下記のようにプログラムは２つにまとめました、サーボのプログラムは改修は多分ないので、isaaxでは管理しないことにしました。

- ＢＬＥ受信、データ送受信
- サーボを動かす

### isaax 簡単です
リモートにラズパイ置くなら必須といっても過言ではありません。
また、（台数制限がありますが）無料で簡単に使えるので、みなさんも使ってみてください
Goodbye, EdgeHTML (日本語訳)

Microsoft Edge が Chromium を採用することになった件について、The Mozilla Blog に掲載された Mozilla の ["Goodbye, EdgeHTML"](https://blog.mozilla.org/blog/2018/12/06/goodbye-edge/) を訳してみた。英語力がアレなせいでアレな和訳になっているのは許してほしい。

# Goodbye, EdgeHTML
*Chris Beard December 6, 2018*

Microsoft は、独立した共有プラットフォームをインターネットに提供することを正式に諦めた。Microsoft が Chromium を採用することで、オンライン上の生活のより多くの部分に対するコントロールを Google に譲り渡すことになる。

これはメロドラマのように聞こえるかもしれない。だが、そうではない。「ブラウザエンジン」 ー Google 製の Chromium と Mozilla 製の Gecko Quantum ー は、私たち一人ひとりがオンライン上で何をできるかの大部分を実際に決める、ソフトウェアの「内輪ネタ」の部分である。私たちが消費者としてどのコンテンツを見ることができるか、私たちがコンテンツを閲覧するときどの程度までセキュアであるか、そして Web サイトやサービスが行えることに対してどの程度私たちがコントロールできるか。「ブラウザエンジン」はそうしたコアとなる機能を決定づける。Microsoft の決定によって、Google は、私たち一人ひとりにどんな可能性を提供するか、より一層単独で決めることができるようになる。

ビジネスの観点から言えば、Microsoft の決定は理解できる。Google は私たちのオンライン上の生活のインフラをほぼ完全にコントロールしつつあり、それと戦い続けるのは儲けにならないだろう。インターネットがかつて私たちに提供していた自由や幅広い選択肢を諦めることで、Microsoft の株主たちは利益を得ることができるだろう。Google は才能豊かな従業員とユニークな資源を独占的に保持している強力なライバルだ。検索、広告、スマートフォンそしてデータ収集に及んでいる Google の支配は、私たちにとって不利な非常に偏った場を作り出している。

社会的、市民的、個人的エンパワーメントの観点から言えば、基礎的なオンライン・インフラのコントロールを 1 社に委ねてしまうことは恐ろしいことだ。これこそ [Mozilla が存在している理由](https://www.mozilla.org/en-US/about/manifesto/) （[日本語訳](https://www.mozilla.org/ja/about/manifesto/)）である。それが良いビジネスの機会になるからという理由で私たちは Google と競争しているわけではない。インターネットとオンライン上の生活の健全性は競争と選択に懸かっていると考えるから、私たちは Google と競争しているのだ。競争と幅広い選択肢が存在することで、消費者はどんなものをより良いと欲するかを決め、行動に移すことができる。

Microsoft の決定は Firefox が発展するのを難しくするだろうか？ そうかもしれない。Google をより強くすることは多くの面で危険だ。そして、それに対する回答の大部分は、サービスや Web サイトを作る Web 開発者や企業がどうするかに懸かっている。もし Chromium のような 1 つの製品が十分なマーケット・シェアを持っていれば、Web 開発者や企業たちは自分たちのサービスやサイトが Chromium 以外でも動作するかはもう気にしないと決定しやすくなるだろう。それは Firefox がリリースされる前の 2000 年代初頭、Microsoft がブラウザ業界を独占的に支配していたときに起きたことだ。そして再び同じことが起こるかもしれない。

もしあなたが今日オンライン上の生活に起きていることを心配するならば、もう一度 Firefox に目を向けてほしい。Firefox は 18 ヶ月前よりも急速に良くなっている ー スピードとパフォーマンスに関して言えば Firefox は再び引けを取らないものになった。Firefox をデフォルトのブラウザとして 1 週間 [使ってみて](https://www.mozilla.org/en-US/firefox/fights-for-you/) （[日本語版](https://www.mozilla.org/ja/firefox/new/)）、それから決めてほしい。Firefox をより強くすることはオンライン上の生活に関する問題の全てを解決するわけではないだろう ー ブラウザは方程式の一部分に過ぎない。だが、もしあなたにとって Firefox が良い製品であるならば、あなたが使うことで Firefox はより強くなる。あなたが Firefox を使うことで、Web 開発者と企業は Chrome にとらわれずに考えることができるようになる。そして、このことによって、Firefox と Mozilla がインターネット上の生活全体をより良いものにすることを手助けすることになる ー すなわち、選択肢の幅が広がり、セキュリティのオプションが増え、競争が盛んになる。
ERC20 準拠のトークンの作り方

# ERC20 準拠のトークンの作り方

# そもそも Ethereum とは

Ethereum は分散型アプリケーションのプラットフォームのこと。
https://www.ethereum.org/

# ERC20 とは

ERC20とは、Ethereum上のトークンを標準化する仕様のこと。
ERC(Ethereum Request for Comments)はトークンの規格を示したもの。
20とは20番目の仕様なので20と書いてある。

最終的に決められたERC20の仕様は以下の通り。
(最低限いくつかのMethodとEventを定義する必要がある)
https://github.com/ethereum/EIPs/blob/master/EIPS/eip-20.md
※EIPs(Ethereum Improvement Proposals)とは、Ethereumに対する改善提案書。
( https://eips.ethereum.org/ )

流れとして、EIPsで提案されたものが、実際のERCとして規格が決められることになる。

上記でも触れられているが、OpenZeppelin はERC20の実装を含んでいるので、OpenZeppelin を使うとERC20準拠のトークンを作成することが出来る。

なので、OpenZeppelinを使ってトークンを作成しましょう。

その前に、
## Truffle

Truffle とは、Ethereumのスマートコントラクト開発フレームワークのこと。
まず、Truffleでプロジェクトを作成する。

```
$ mkdir erc20_token
$ cd erc20_token
$ truffle init
Downloading...
Unpacking...
Setting up...
Unbox successful. Sweet!

Commands:

  Compile:        truffle compile
  Migrate:        truffle migrate
  Test contracts: truffle test
```
truffle init するときは、ディレクトリ内は空でなければならない。

## OpenZeppelin

まず、OpenZeppelinをインストールする。

```
$ npm init -y
$ npm i --save-exact openzeppelin-solidity@1.12.0
```

OpenZeppelin 1.12.0を利用する。
現在は2.0.0が最新

# コントラクトの作成

contracts/E20Token.sol の作成

```
pragma solidity ^0.4.23;
import "../node_modules/openzeppelin-solidity/contracts/token/ERC20/StandardToken.sol";

contract E20Token is StandardToken {
    string public name = "E20Token";  //Token name
    string public symbol = "E20T";  //Token unit
    uint public decimals = 18;  //18 is the most common number of decimal places

    constructor(uint initialSupply) public {
        totalSupply_ = initialSupply;
        balances[msg.sender] = initialSupply;
    }
}
```

# Migrationファイルの作成

migrations/2_deploy_erc20_token.js の作成

```
var E20Token = artifacts.require("./E20Token.sol")

module.exports = function(deployer) {
    var initialSupply = 100000;
    deployer.deploy(E20Token, initialSupply);
}
```

# テストの作成

test/E20Token.js

```
var ERC20Token = artifacts.require("E20Token.sol");

contract('E20Token', function(accounts) {
    it("account[0] own 100000 E20Token.", function() {
        return ERC20Token.deployed().then(function(instance) {
            return instance.balanceOf.call(accounts[0]);
        }).then(function(balance) {
            assert.equal(balance.valueOf(), 100000, "account[0] don't own 100000");
        });
    });
});
```

```
$ truffle develop
truffle(develop)> test
Compiling ./contracts/E20Token.sol...
Compiling ./contracts/Migrations.sol...
Compiling ./node_modules/openzeppelin-solidity/contracts/math/SafeMath.sol...
Compiling ./node_modules/openzeppelin-solidity/contracts/token/ERC20/BasicToken.sol...
Compiling ./node_modules/openzeppelin-solidity/contracts/token/ERC20/ERC20.sol...
Compiling ./node_modules/openzeppelin-solidity/contracts/token/ERC20/ERC20Basic.sol...
Compiling ./node_modules/openzeppelin-solidity/contracts/token/ERC20/StandardToken.sol...


  Contract: E20Token
    ✓ account[0] own 100000 E20Token.


  1 passing (40ms)

```

※Openzeppelinは2.0.0が最新なので最新に対応したい。
Rubyのelsifとガード節どちらを使うか

コードレビューで、「elsifは条件が対称な場合にだけ使った方がよい」という指摘を受けた。

## elsifeを使うのに適しているものの例

```ruby
if number.odd?
  # 奇数の倍数の場合の処理
elsif
  # 偶数の場合の処理
else
 # それ以外（小数など）
end
```

このように分岐の条件に対称性がある場合はif elseを使う。 
そうでない場合は、ガード説を使って早期リターンしたほうが意図が伝わりやすいという指摘だった。

## 比較

家賃の表示例で考えてみる。


- 管理費なしの場合： 金額は表示しない
- 修繕積立金なしの場合: 管理費のみ表示
- 管理費と修繕積立金がある場合： 両方足した金額を表示

***


```ruby:elsifを使った場合
def rent_fee
  if kanrihi.blank?
    '- 円'
  elsif shuzen_tsumitakin.blank?
    "#{kanrihi'円'}"
  else
    "#{kanrihi+shuzen_tsumitakin'円'}"
  end
end
```

ガード節で書き直す。

```ruby:ガード節を使った場合
def rent_fee
  return '- 円' if kanrihi.blank?
  return "#{kanrihi'円'}" if shuzen_tsumitakin.blank?
  "#{kanrihi+shuzen_tsumitakin'円'}"
end
```

ネストが減ること、対称的な条件でないことが明らかになることから、確かに読みやすく理解しやすい。
Windows環境のPhpStormでログファイルをリアルタイム表示する

Windows上のPhpStormでプログラム開発中に、ログファイルを別アプリで立ち上げて確認するのがめんどくさいので、Linuxのtailfのようなことをやってみました。
（ちゃんと探せばそういう機能とかプラグインとかあるような気がする）

## 手順

1. ターミナルをPowerShellに変更する
2. ログ表示

## 1. ターミナルをPowerShellに変更する

PhpStormの設定→ターミナル→シェル・パスを ```powershell.exe``` に変更します。

![setting.PNG](https://qiita-image-store.s3.amazonaws.com/0/14769/0eeb2de1-fc77-5e60-b168-faba1ba53a51.png)

PowerShellでは```ls```など一部のリナックスコマンドも使えます

## 2. ログ表示

PowerShellのGet-Contentコマンドで```-Tail```オプションを指定します

書式

```Get-Content -Path [Path] -Wait -Tail [表示行数] -Encoding [エンコード]```

例

```Get-Content -Path laravel-2018-12-08.log  -Wait -Tail 100 -Encoding UTF8```

※```UTF-8```ではなく```UTF8```

できました！

![windowstail.PNG](https://qiita-image-store.s3.amazonaws.com/0/14769/9b5f543e-7d05-9d15-c3b9-76cb288331d5.png)
DOMについて

#はじめに
エンジニア1年生です。
日々の学びのメモとしてコツコツと記事を書こうと思っています。
今回はDOMについて書いていきます。

##DOMとは？？
「Document Object Model」の略
>HTML や XML 文書のためのプログラミングインターフェイス
>引用：https://developer.mozilla.org/ja/docs/Web/API/Document_Object_Model/Introduction

スクリプト言語を使用してHTMLやXMLを操作する仕組みのことです。

##DOMツリーとは？？
DOMではHTMLやXMLをツリー状の階層構造として扱います。
この階層構造がDOMツリーと呼ばれます。
例えば以下のようなHTMLの場合

```HTML
<body>
<div>
    <p id="cat">ねこ<p>
    <p>いぬ</p>
</div>
<div>
    <p>コアラ<p>
    <p>カンガルー</p>
</div>
</body>
```

DOMツリーは以下のように表せます。

<img src="https://qiita-image-store.s3.amazonaws.com/0/272935/251725cf-ec0f-28b0-89b4-fa44b253513f.png" width=50%>


##Nodeとは？？
DOMツリーの各要素がNodeという。
先程書いたDOMツリー構造のdiv、ｐなどの各要素のひとつひとつがNodeです。

divタグを基準に見てみるとbodyが親ノード、ｐが子ノードになります。

##javascriptによるDOMの操作例
```HTML
<script>
  var animal = document.getElementById("cat");
  animal.textContent = "ぱんだ";
  console.log(animal);
</script>
```
先ほど記述したHTMLからid="cat"のp要素を取得し、
内容をねこからぱんだに書き換えコンソールにも表示しました。

簡単ですが以上がｐノードを取得し、内容を書き換えたDOMの操作例です。

##まとめ
最初に勉強したときはDOMの考え方がよく理解出来ませんでしたが、
改めて見てみると普段からDOMを操作していることに気付かされました。

今後も曖昧にしている言葉の定義をひとつずつ明確にしなければ思いました。
Rails + PostgreSQLで表形式に集計する

# 表形式大好き日本人

２５年くらい前から、表形式での集計に悩まされてきた。例えばこんなソースがあったとする。

|name|question|answer|
|:--|:--|:--|
|mike|好きな食べ物|魚|
|john|好きな食べ物|肉|
|mike|好きな国|日本|
|john|好きな国|ギリシャ|

(この形式をSTIというのだそうで、最近知った)。
これをこう表形式に集計しろというニーズがしょっこらしょっちゅうある。

|name|好きな食べ物|好きな国|
|:--|:--|:--|
|mike|魚|日本|
|john|肉|ギリシャ|

個人的にはSTIのままのほうが様々な集計がしやすいのになぜわざわざ集計しづらい２次元の表形式にしようとするのかは甚だ謎であるし、設問が多くなると横方向に果てしなくスクロールしないといけないし、３次元とか４次元とかになってしまったらもはや視覚化が不可能になってしまうじゃん！と思うので集計しやすい最初の形式のままいろいろしたほうがいいと思う。

## でも客がそうせえというのだから仕方ない

「プログラマの三代美徳は怠惰・傲慢・短気」を信条としている私としては、上記の設問に対する回答はここ２５年くらい、「Excelのピボットテーブルを使え」だった。だが、「システム開発」という仕事をしているとこれが通じないことがわかった。何もせずに済むなら何もしない、というのを美徳としてきたのだが、システムを開発してなんぼの仕事なので、無駄とわかっていてもシステムを作らない訳にはいかない。

## Excelでは25年も前からできることなのに・・・？

Rubyに限らず、３年ほど前の派遣先でも性懲りもなく同じようなニーズがあった。このときはJavaだったが、Javaでシコシコ処理した。しかし今回の派遣先で、Railsで会社の人の作ったコードは、ActiveRecordを大量に作成してしまいメモリリークを起こしてしまっていた。Excelは1995年くらいに、メモリ128MBとかで普通にできていたことが、2018年現在、4GBメモリがあっても不足しメモリリークを起こしてしまう。なんじゃこりゃ。

## ActiveRecordに仕事をさせてはいけない

どうやらこれが超絶原則のようなのだが、ActiveRecordはDBへのアクセスを抽象化してあたかもただオブジェクトを触っているだけかのような感覚でDB操作が行えてしまうすぐれものなのだが、欠点がある。複雑なテーブルの処理が苦手（メモリを派手に使ってしまう）のである。

また、ActiveRecordはテーブルのカラムをModelのMethodとして表現するため、カラムが可変長というのも原則苦手である。

## そして私はこうした

```pivottable.rb
Table.select('name, jsonb_object_agg(question, answer) as ans')
     .group('name, question').map { |row| [row.name, row.ans] }.to_h
```

`jsonb_object_agg`はPostgreSQL9.4?あたりから使えるJSON関数の一つで、複数レコードを一つのJSON形式のフィールドに集約してくれるという機能を持つ。SQLでは昔から`sum`や`count`といった集計関数が利用できるが、それのstring版と考えるといい。
この集計関数のおかげで、普通に```Table.all```とすると４個作成されるActiveRecordオブジェクト数が2数に減っていることに注目してほしい。設問数が100個、ユーザーが100人だともとのSTIを読み込むと10,000個のActiveRecordオブジェクトが生成されるが、上記の集計関数を用いると設問数の影響を受けず100個しかActiveRecordオブジェクトが作られない。`O（n＊m）`計算量→`O(n)`計算量に減ったのだ。

更に、1個のJSONを返すようなクエリを書くことも原理的には可能だが、流石にやりすぎかと思って今のところやっていない。

なお、他のRDBMSにも似たような関数があるようだが、上記のクエリ式はPostgreSQL以外では利用できない。
これで、以下のような結果が得られる。

```pivottable.json
{
  "mike": {
    "好きな食べ物": "魚",
    "好きな国": "日本"
  },
  "john": {
    "好きな食べ物": "肉",
    "好きな国": "ギリシャ"
  }
}
```
上記ではJSONで表記しているが実際にはRubyのHashとして得られる。
あとは煮るなり焼くなり、という形になっている。個人的には、このJSONをそのままフロントに渡してJavaScriptで処理してくれたらいいと思ったりしているが、あくまでRailsでCSVを作るそうだ、そうですか・・・。

まあHashなのでActiveRecordをコネコネするよりは１０倍速いはずだ・・・。

## 結論

* STI表をそのままExcelに渡してピボットテーブルで修家してもらおう！
* なんならExcelはODBC経由でDBから直接データも取れるぞ(JOINとかも使えるぞ)
* 俺ならS3 static website hostingにhtml表を作ってExcelでWebクエリとかやるな・・・
* 最近（結構前？）ならPowerQueryというのもあるぞ
partialではインスタンス変数を参照しない方がいい

## なぜ?
partialは呼び出し元のテンプレートとだけ紐づけておくようにしたほうがいい。

インスタンス変数を使うと、コントローラとも結びついてしまい、結果としてpartialとして切り出したのに再利用性が低くなる。

```ruby:index.html.erb
<%= render partial: 'shared/form' %>
```

```ruby:_form.html.erb
# これはよくない
<%= form_for @item %>
```

具体的には、

- controller側でインスタンス変数の名前や挙動を変更したとき、partial側も変更しなければならなくなる。
- 特定のモデルのデータと関連づけられてしまうので、フレキシブルに使うことができない。


## 対処法
代わりに locals を使うとよい。

```ruby:index.html.erb
# locals を使う
<%= render partial: 'shared/form', locals: item: @item %> 

```

```ruby:_form.html.erb
# こっちがよい
<%= form_for item %>
```

localsを使うことで、partial内ではインスタンス変数ではなく、ローカル変数として扱える。

***

初心者のときに書いたコードでpartialにインスタンス変数を使っていた。

後になってcontrollerを修正するときに、案の定どのcontrollerと結びついているのがわからなくなり、自分が書いたコードなのにハマった。

## 参考
https://qiita.com/hmuronaka/items/daf2904e3f703448f506
https://code.i-harness.com/en/q/26349e

ちなみに、 `partial:`を省略して書くときは `locals:`も省略しないといけない。

```ruby:index.html.erb
# locals を使う
<%= render 'shared/form', item: @item %> 

```
https://qiita.com/mm36/items/2d89aa3b77e740e671c2
ROS講座86 rosrunのオプションまとめ

# 環境
この記事は以下の環境で動いています。

| 項目 | 値 |
|:-:|:-:|
| CPU | Core i5-8250U |
| Ubuntu | 16.04 |
| ROS | Kinetic |

インストールについては[ROS講座02 インストール](https://qiita.com/srs/items/e0e0a9dc3f94c2d3348e)を参照してください。
またこの記事のプログラムはgithubにアップロードされています。[ROS講座11 gitリポジトリ](https://qiita.com/srs/items/25a56a6abda41dcf396e)を参照してください。

# 概要
roslaunchでは様々なオプションを付けてnodeを立ち上げられます。rosrunコマンドでこれと同じことをする方法を説明します。

# 実行方法

## 基本の方法
基本的に以下のようにrosrunします。

```shell:例
rosrun adv_lecture adv_time
```

## nameの指定
ノード名を変更するには`__name:=hogehoge`のようにします。

```shell:凡例
rosrun adv_lecture adv_time __name:=alt_name
```

## topicのremap
トピック名を変えるには`original_topic:=alter_name`のようにします。

```shell:凡例
rosrun adv_lecture adv_time time_tick:=alt_tick
```

## rosparamの設定
rosparamを設定するには`_param_name:=hogehoge`とします。

```shell:凡例
rosrun adv_lecture adv_time _time_param:=hogehoge
```

# roslaunchとの対応
以下のlanchと同じことがしたい場合はコマンドラインで以下のように打ちます。

```xml
<launch>
  <node name="time_tick" pkg="adv_lecture" type="adv_time">
    <remap from="time_tick" to="alt_tick"/>
    <param name="time_param" value="hogehoge"/>
  </node>
</launch>
```

```shell
rosrun adv_lecture adv_time __name:=time_tick time_tick:=alt_tick _time_param:=hogehoge
```

# 参考
[ROSwiki](http://wiki.ros.org/rosbash)
# 目次ページへのリンク
[ROS講座の目次へのリンク](https://qiita.com/srs/items/5f44440afea0eb616b4a)
メモ：circleci上でdocker imageへansibleをinstallするときのエラー

- circleciで、docker imageにansibleインストールした時にエラーが出る。
- イメージは`circleci/python:3.7.1`。Dockerfileを見るとbaseはubuntu。
- 公式ドキュメントでは以下のようになっていたので、それを参考ししたが、    

```
sudo apt-get update
sudo apt-get install software-properties-common
sudo apt-add-repository ppa:ansible/ansible
sudo apt-get update
sudo apt-get install ansible
```

- `sudo apt-add-repository ppa:ansible/ansible`でエラーが出る。    

```
gpg: keybox '/tmp/tmp6ah87frz/pubring.gpg' created
gpg: /tmp/tmp6ah87frz/trustdb.gpg: trustdb created
gpg: key *******: public key "Launchpad PPA for Ansible, Inc." imported
gpg: Total number processed: 1
gpg:               imported: 1
gpg: no valid OpenPGP data found.
Exception in thread Thread-1:
Traceback (most recent call last):
  File "/usr/lib/python3.5/threading.py", line 914, in _bootstrap_inner
    self.run()
  File "/usr/lib/python3.5/threading.py", line 862, in run
    self._target(*self._args, **self._kwargs)
  File "/usr/lib/python3/dist-packages/softwareproperties/SoftwareProperties.py", line 688, in addkey_func
    func(**kwargs)
  File "/usr/lib/python3/dist-packages/softwareproperties/ppa.py", line 386, in add_key
    return apsk.add_ppa_signing_key()
  File "/usr/lib/python3/dist-packages/softwareproperties/ppa.py", line 273, in add_ppa_signing_key
    cleanup(tmp_keyring_dir)
  File "/usr/lib/python3/dist-packages/softwareproperties/ppa.py", line 234, in cleanup
    shutil.rmtree(tmp_keyring_dir)
  File "/usr/lib/python3.5/shutil.py", line 480, in rmtree
    _rmtree_safe_fd(fd, path, onerror)
  File "/usr/lib/python3.5/shutil.py", line 438, in _rmtree_safe_fd
    onerror(os.unlink, fullname, sys.exc_info())
  File "/usr/lib/python3.5/shutil.py", line 436, in _rmtree_safe_fd
    os.unlink(name, dir_fd=topfd)
FileNotFoundError: [Errno 2] No such file or directory: 'S.gpg-agent.ssh'
```

- gpgの何かがインストールができない模様。
- 原因はわからないが、このイメージだと最後の`install ansible`だけでもインストールはできるので、直でansibleのinstallだけをすることにした。

```:.circleci/config.ymlの一部
executors:
  ansible:
    docker:
      - image: circleci/python:3.7.1
    working_directory: /home/circleci
version: 2.1
jobs:
  install_ansible:
    executor: ansible
    steps:
      - run:
          name: Install ansible
          command: |
            sudo apt-get update
            sudo apt-get install -y ansible
```

- 上は本来のcircleciのconfig.ymlの抜粋なのでお気をつけあれ。
mac > asp.net のカレントバージョン変更



## .NET Core のバージョンの選択

.NET Core のバージョンの選択は基本的に非推奨
理由は以下に記載

[.NET Core のバージョンの選択 | Microsoft Docs](https://docs.microsoft.com/ja-jp/dotnet/core/versions/selection)



>まれに、以前のバージョンの SDK を使用する必要がある場合があります。 そのバージョンは global.json ファイルで指定します。 "最新版を使用する" というポリシーは、インストールされている最新版より以前のバージョンの .NET Core SDK を指定するには global.json を使用することを意味します。



## それでも変更したい

まずは変更可能なPCインストール済みのバージョンの確認


### 現バージョンの確認

```
> dotnet --version

3.0.100-preview-009812
```



### 変更可能なバージョンの確認


```
> dotnet --list-sdks

2.1.4 [/usr/local/share/dotnet/sdk]
2.1.300 [/usr/local/share/dotnet/sdk]
2.1.301 [/usr/local/share/dotnet/sdk]
2.1.302 [/usr/local/share/dotnet/sdk]
2.1.401 [/usr/local/share/dotnet/sdk]
2.1.500 [/usr/local/share/dotnet/sdk]
2.2.100 [/usr/local/share/dotnet/sdk]
3.0.100-preview-009765 [/usr/local/share/dotnet/sdk]
3.0.100-preview-009812 [/usr/local/share/dotnet/sdk]

```



### 設定ファイル　global.json

カレントフォルダにglobal.jsonを作成

```
touch global.json

```


中身をいかにする。

```
{
  "sdk": {
    "version": "2.2.100"
  }
}
```


### バージョンの確認

```
> dotnet --version

2.2.100
```



以上
ASP.NET Core 2.2 の新機能 （書き込み中）



# 初めに

[ASP.NET Core 2.2がリリース](https://blogs.msdn.microsoft.com/webdev/2018/12/04/asp-net-core-2-2-available-today/)されました。(2018/12/4)





## SDK Download & install

[.NET Core 2.2 downloads for Linux, macOS, and Windows](https://dotnet.microsoft.com/download/dotnet-core/2.2)




2.1→2.2 Migrate は以下

https://docs.microsoft.com/en-us/aspnet/core/migration/21-to-22?view=aspnetcore-2.2&tabs=visual-studio




[.NET Core コマンドライン インターフェイス (CLI) ツール | Microsoft Docs](https://docs.microsoft.com/ja-jp/dotnet/core/tools/index?tabs=netcore2x)


## 新しいアプリを作成

[ASP.NET Core で React プロジェクト テンプレートを使用する | Microsoft Docs](https://docs.microsoft.com/ja-jp/aspnet/core/client-side/spa/react?view=aspnetcore-2.2&tabs=visual-studio)


```
dotnet new react -o my-new-app
cd my-new-app
```

[dotnet new コマンド - .NET Core CLI | Microsoft Docs](https://docs.microsoft.com/ja-jp/dotnet/core/tools/dotnet-new?tabs=netcore21)
スクラム導入時の6つのコツ


### はじめに
今年チームにスクラムを導入し、今ではチーム全員がスクラムマスターとしてファシリテートできるくらいになりました。
実は、スクラムの導入は初めてでなく、昔やった時は導入に失敗しました。勉強会でも、導入に失敗したという話を聞くことがあります。
そこで、今回の経験や、過去の失敗を元に、「これが導入のコツなんじゃなかろうか？」というものを紹介したいと思います。
導入に失敗した方や、これから導入したいという方に、少しでも参考になればと思います。

経験がベースなので、論理的に違うとか、セオリーと異なる部分もありますが、ご容赦ください。

### 6つのコツ一覧
- 価値を明確にする。そのスクラムをやる意味は？
- やりたいという気持ちが強い「ファン」を作る
- 1スプリントは1週間で始める
- 「出来ない部分」を決める
- メンバーは「のっかればいい状態」にする
- 「今までと違う！」を肌で感じられるようにする

### ■価値を明確にする。そのスクラムをやる意味は？
なぜスクラムをやるか、価値を明確にしておくと良いです
頭の中でわかってるというのではなく、実際に言語化して残しておくのをおすすめします
言語化の際に改めて気づきがあった、ということもあります

私が所属するチームの場合、以下のような目的がありました
- 工数、仕事の見える化
- メンバーのモチベーション向上（新しいもの好きが多かったので）
- 開発速度の向上

#### おすすめな理由
- 新しいことを導入するにはエネルギーが必要です。スクラムの価値を自分が信じていなければ、簡単に心が折れてしまいます
- 周りを巻き込む際に「なぜやるのか」が説明出来ないと、ついてきてくれません
- 価値が明確でないと、そもそもその導入が成功したのか、失敗したのかわかりません。導入後、価値もないのに惰性で続いている仕組みが生まれることを避けましょう。工数だけを奪うことになってしまいます

### ■ファン（アーリーアダプター）を作る
導入を開始する前に、スクラムをやってみたい！という気持ちを共有するメンバーを作りましょう
新しいもの好きな人や、周りに影響が強い人が特におすすめです

私の場合、影響力が高いメンバー二人をまきこみ、フローの整理や、レビューなど、色々な形で協力していただきました。
おそらく二人がいなかったらここまで上手く導入できなかったと思います。本当に助かりました。

#### おすすめな理由
- 一人だと、どうしても視野が狭くなりがちです。意見を交換したりするファンがいると、アイデアが広がります
- そもそもファンを作る段階で、その導入が上手くいきそうかどうかがわかります。この際にファンを作れないアイデアを皆に広めるのは難しいです
- サポートしてくれるファンは積極的に新しい仕組みをキャッチアップしてくれます。メンバーにとって、リーダーの説明を実行するよりも、周りのメンバーのやり方を真似する方がハードルが低い場合があります。そこで、積極的に新しい仕組みをキャッチアップしてくれるファンがいることで、周りのメンバーは「リーダーに言われたことをやる」ではなく「他のメンバーを真似する」ことが出来るようになります。

### ■1スプリントは1週間で始める
スクラムの1スプリントは、1週間から1月くらいが多いです。（私の感覚だと、2週間が一番多い気がします）
1スプリントは、開発アイテムの傾向や、プロダクトの特性によって変更すべきですが、一番最初にあえて1週間にすることはメリットがあると考えています

#### おすすめな理由
- 1スプリントを早く回すことで、新しい仕組みに慣れやすい。（1週間1スプリントだと、1月に4スプリントも経験できる）
- 1スプリントを大きくすると、開発アイテムを無理やりその形に合わせてしまいやすい。1週間だと、想像がしやすく、工数を無理やり丸めたりしづらい

### ■「出来ない部分」を決める
スクラムを教科書通りにやろうとした場合、「こうすべき」というルールが非常に多いです。
事業部、営業部との関係性、プロダクトの特性上など、周辺環境が理由で「どうしてもここはやりづらい！」という部分は少なからずあると思います。
出来なそうな部分に関しては「やってみてから考えよう」と伸ばし伸ばしにしがちですが、いっそ「ここは諦める！」と決めた方が良いこともあります。

私が所属するチームの例をあげると、1スプリントで「機能が出来上がる」ということをあえて捨てています。
基本的には、スプリントの最後で目に見える発表物を作らなければいけないのですが、プロダクトの特性上、開発アイテムが大きい、目に見えづらい改善が多いといった課題があったため、ここを明確に出来ない部分と決めています。

#### おすすめな理由
- 明確に「やらない」と決めることで、精神的負担を減らせる
- やらないことによるデメリットを、あらかじめ想定できるため、デメリット影響を出来る限り減らしやすい
- やることを減らすことで、導入に対するハードルが下がることがある（「これは譲れない」という部分で導入中止を防ぐ）

### ■メンバーは「のっかればいい状態」にする
メンバーに対して、説明会を一度開いて、やり方のドキュメントをおしまい。このやりかたは危険です
新しい仕組みは多くの場合、新しいタスクが発生します。そのタスクをやってもらうために、出来る限りサポートしましょう
メンバーが非常に積極的な場合をのぞいて、新しい仕組みの導入は「余分な追加コスト」と感じてしまうこともあるはずです

なので、「メンバーが積極的に取り組まないと回らない」ではなく「メンバーは、言われたことをやってればよい。リマインドや、やり方を教えてくれる人がいる」という状態を作ることが重要です

一つの例として、進捗管理の話をあげます。
私が所属するチームではベロシティで工数の見える化をするために、毎日工数やタスクの進捗の入力をお願いしています。
これは個人で任せるのではなく、朝会の際に数分時間をとって、皆で一斉に更新してもらうことで、更新漏れを防いでいます。

#### おすすめな理由
- メンバーに丸投げした場合、導入が進まない
- 新しい仕組みに対応出来ているメンバーと、対応出来ていないメンバーがいた場合、対応出来ているメンバーまで「やらなくていいか」という状態になりかねない

### ■「今までと違う！」を肌で感じられるようにする
新しい仕組みを入れた後に「これって意味があったんだろうか？」という疑問が出ないように、ちゃんと結果、効果を伝えましょう
「リーダーだけが良くなったことを知っている」といったことは避け、良かったのか悪かったのか、できれば定量的に伝えられるとベストです

私が所属するチームでは、毎週ベロシティがどれくらい出せたか、どれだけ不測のタスクが入ったか、お互いのヘルプをどれくらい出来たかといったことをグラフ化し、毎週みんなで確認しています。

#### おすすめな理由
- 結果、効果を知ることで、新しい仕組みの価値が伝わる
- 逆に、それを知らないと「やって意味あったんだろうか」という疑問に繋がってしまう

  
  
<br><br>
以上6つのコツでした。
読んでいただきありがとうございます。少しでも参考になることがあれば嬉しいです。
macOS マシンの CPU 温度変化を監視＆通知する gem を作った

# これは何？
[macOS マシン の CPU 温度変化を監視＆通知する gem](https://rubygems.org/gems/hotcorg/) を作ったので、その紹介をします。gem の名前は Hotcorg です。

# Hotcorg
https://rubygems.org/gems/hotcorg/
Hotcorg は CUI ツールです。以下、インストール方法と使い方を書きます。

## インストール

```
$ gem install hotcorg
```

## 使い方

以下のコマンドを実行するとプロセスが起動して CPU 温度変化の監視が始まります (Ctrl+C で停止)。

```
$ hotcorg go
```

デフォルトでは、Hotcorg プロセスは5秒に1回のペースで CPU 温度を確認します。温度が１°Cでも上昇していた場合は、通知センターにて知らせます。また、50、60、70、80、90°C をそれぞれオーバした時点でも通知します。

![notify_hotcorg.png](https://qiita-image-store.s3.amazonaws.com/0/95847/d9ef1ce3-dca2-53b0-c1a0-c22333e8f6bc.png)

下記のオプションで温度確認の頻度や通知条件を指定することもできます。

```
  -g, [--granularity=N]            # Granularity for change in CPU temperature at which hotcorg should react [°C]
                                   # Default: 1
  -t, [--threthold=one two three]  
                                   # Default: [50, 60, 70, 80, 90]
  -i, [--interval=N]               # Interval when hotcorg checks CPU temperature change [Sec.]
                                   # Default: 5
  -c, [--command=COMMAND]          # Command to be executed each time hotcorg detects CPU temperature change
  -n, [--notify], [--no-notify]    # Whether hotcorg notifies CPU temperature change (supported only with macOS)
                                   # Default: true
```

また、'-c' オプションを使えば通知のタイミングで指定のコマンドを実行することも可能です。例えば下記のようにします。

```
$ hotcorg go -g 10 -t 70 80 90 -i 60 -c "echo 'hello'"
```

上記コマンドでは「CPU温度が10°C上昇した」または「７０、80、90°Cをオーバーした」時点でHotcorgにより通知されます。また、通知のたびに`echo 'hello'`コマンドを実行します。

# なぜこれを作ったの？
私は MacBookAir(13-inch, Mid 2012) を愛用しているのですが、重い処理をしてマシンが熱くなるとキーボードを叩く指にも熱が伝わります。長時間そのまま作業した結果、指先に軽い火傷を負ってしまいました。また、高熱はマシンの故障にもつながります。もちろんそういうときはファンが音を立てて回転してくれますが、作業に集中していると耳から入る情報をスルーしがちです。温度の変化を視覚的に通知してくれるツールがあれば、指先の火傷やマシンの故障を避けられるかも……と考えて Hotcorg を公開しました。この gem であなたの指先と愛用のマシンの健康を守る手助けができれば幸いです。
Charlesでスマホアプリデバッグ

スマホアプリを作るとき、サーバーから返ってくるデータを表示することありますよね？

---

でも、サーバサイドでデータを作るのが大変だったり、返すのが難しい異常系とかありますよね？

---

また、通信されている内容を確認したいことありますよね？

---

## そこでCharlesです。

https://www.charlesproxy.com/

---

Charlesを自由に使うには、$50支払う必要があります。

ただし、いくつかの制限事項に目をつぶれば、機能的にはフルで利用し続けることができます。
（試用して良ければ、お金を払いましょう）

---

ただ、おそらく、エンジニア的にはmitmproxyの方が使いやすいです。
https://mitmproxy.org/

（私は、最初に使ったのがCharlesだったので、そのままですが。。。）

---

Charlesは比較的情報が見やすく、
GUIで設定できたり、
非エンジニアでも比較的とっつきやすいと思います。
（社内でも、ディレクターやテスターに使ってもらってます）

---

## 端末・アプリの設定

Proxyの設定が必要です。

---

また、いまどきは全通信が https だと思うので、端末・アプリ側の設定が必要です。
https://www.charlesproxy.com/documentation/using-charles/ssl-certificates/

---

## Charlesの動作イメージ

通常 : 端末 <-> サーバー


Charlesを利用した場合のイメージ :
端末 <- Wi-Fi -> PC上のCharles <-> サーバー

---

## 便利なケースを挙げていきます

---

知らないアプリのバグ修正をすることになった。

:arrow_down_small: :arrow_down_small: :arrow_down_small:

対象の画面を開いてみて、通信されているAPIを特定できます。そのパスから、対象のコードをある程度特定できます。

---

APIからエラーが返ってくるけど、API側の問題か、アプリ側の問題かわからない。

:arrow_down_small: :arrow_down_small: :arrow_down_small:

アプリ外でRecordingすることで、送受信している情報を第三者的に確認できます。

---

リクエストとレスポンスのRAWデータ全文を送れば、サーバ側も問題が特定しやすい。はず。

---

アプリでのAPI実行を、何度も繰り返したい。
（投稿APIを大量に叩いてデータを作成したり）

:arrow_down_small: :arrow_down_small: :arrow_down_small:

Recordingしたリクエストをcurl形式にすることができる。

---

ログイン画面で、id/passを毎回入力するのが面倒。

:arrow_down_small: :arrow_down_small: :arrow_down_small:

Map remoteで、リクエストを改ざんして、特定のパスへのアクセス時に、任意のリクエストボディを設定できます。

---

レスポンスとして長い文字列を返したい。

:arrow_down_small: :arrow_down_small: :arrow_down_small:

Map remoteで、レスポンス内の特定の文字列を書き換えられます。

---

異常系のテストをしたい。500エラーなど。

:arrow_down_small: :arrow_down_small: :arrow_down_small:

Map remoteで、レスポンスステータス・ボディを書き換えられます。

---

異常系のテストをしたい。タイムアウトなど。

:arrow_down_small: :arrow_down_small: :arrow_down_small:

Breakpointを設定して、通信を止めることができます。

---

サーバがまだ実装されていないので、ローカルのJSONを返したい。

:arrow_down_small: :arrow_down_small: :arrow_down_small:

Map localでパスごとに返却するJSONを指定できます。

---

通信環境が悪いと問題が発生するらしい。
（並列処理がうまくいっていなかったり）

:arrow_down_small: :arrow_down_small: :arrow_down_small:

throttleをかけることができます。

---

## こんな感じで、通信周りをいろいろ改ざんして、実装確認をすすめることができます。

---

ただし、いろいろやりすぎると、改ざんしていることを忘れてテストしてしまったりします。。 :sweat:

実際のレスポンスに切り替えたら、うまく動かなかったり :sweat::sweat:

---

## 適切に使い、自分のペースで開発/テストしていきましょう。
Haskellで食べていけるよ！!

#お題:最近のHaskell事情
##Haskell のお仕事って言うても少ないよ。どこにあるの？

Haskellのお仕事がなんで少ないねん問題

1.Haskellできる人がすくないよ
2.学習コスト(お勉強する時間と労力、本等)が高いよ
3.アルゴリズムや自然言語処理、数学をある程度知らないとできないよ
4.ライブラリーが偏ってるから手薄な分野ではつかわれにくいよ
5.Haskellじゃなくても他の言語で出来ちゃうよ
6.なかなかHaskellに入り込めないよ...

以上が今までのHaskellのお仕事が少ないんやんって問題でした。

#ところが....
AI案件あるいはセキュリティの深い所まで知るために
Haskell案件が急上昇してきているのです。


#例えば
1.Scalaとの融合でビックデータをよりよく把握しシステムに反映したい
2.関数型プログラミングで堅牢かつ安全なSPAを作りたい
3.仮想通貨の波により関数型言語の知識及び以下のような知識が必要になった
・コンパイラ、インタプリタの開発経験 
・プロトコルの設計 / 開発経験 
・セキュリティ / 暗号処理の知識 
・論文執筆等の経験
4.iOSアプリのインフラ・データベース周辺の担当
5.ブロックチェーン

##**大きく変わった点は、Haskell勉強会を開催する企業が増えている事です**

#海外案件も同じようにScalaとの融合や独自言語開発が増えています。
@fumieval さんには、Haskellが合ってる案件を狙っていけば良いと以前アドバイスを頂きました。

これまでHaskellを知っている熟知している方、勉強中の方、これから勉強する方にとっても会社で勉強会があるのはとても良いことだと思います。

#Haskell-jpに入り、質問してみよう。

[Haskell-jp](https://haskell.jp/)に、入ると
優しいお兄さんたちが手取り足取り教えてくれます。ボランティアにしては素晴らしいサイトです。みなさんHaskellが心からお好きなのでしょう。
@igrep さんがオーナーになってくださっており、時には秒で返答してくれます。
***
以上、最近のHaskell案件について調査させて頂きました。
ご一読ありがとうございました。
何かコメントがあればどんどん記述してくださると大変助かります。
よろしくお願いいたします。
32GB eMMCマシンをWindowsマシンとして使うために必要な設定まとめ

# はじめに
[人権剥奪PCをRDP端末として利用して一年後のレポート](https://qiita.com/taruhachi/items/e6a4d65336da4d78af30#_reference-48196a1c24cc3315d109)の続き

世間には**人権剥奪PC**と呼ばれるPCが存在します。
人権剥奪PCとは、マシンスペックが不足することで開発効率が下がったり、開発者にストレスを与えてしまうPCのことという理解なのですが、それ以上に問題なのは、**システムの更新ができない**レベルの低スペックPCでしょう。

具体的はストレージが**32GB eMMC**のWindowsマシンのことになります。
理由は明らか。初期状態で15GB程度のメモリを利用、Windows Updateファイル類が累積で10GB以上貯まる、インストール時には更に空き容量が必要という状況のため、PCに何のアプリやデータの保存を指定ない状態であってもそのうちWindows UpdateがPCを自殺に追い込むためです。

そこで、Windows UpdateファイルをMicro SDカードにダウンロードさせるようにしましょう。
手順は以下の通りです。

* Micro SDカードを挿してVHD(仮想ハードドライブ化)する
* 上記ドライブを自動マウントさせるようにする
* Windows Update領域を上記のドライブに移動する

こちらの手順を実施したマシンを放置、何度か再起動させることで全てのWindowsUpdateをあてることに成功しました。

# Windows UpdateファイルをMicro SDカードにダウンロードさせる方法

## Micro SDカードを挿してVHD(仮想ハードドライブ化)する
こちらのページが非常によくまとまっているので、記事のリンクを

[Windows 10 タブレットのストレージ容量が少なくてアプリがインストールできない！SDカード × VHDで解決！【前編】](http://pcfan.121ware.com/notice/3089/)
[Windows 10 タブレットのストレージ容量が少なくてアプリがインストールできない！SDカード × VHDで解決！【後編】](http://pcfan.121ware.com/notice/3092/)

## 上記ドライブを自動マウントさせるようにする
この状態では、Windowsの再起動を実施する度に仮想ドライブが外されてしまいますので、自動でマウントするように設定します。
ただし、このマウントには管理者権限を必要としますので、スタートアップへの登録はできず、Windowsスケジューラーを使う必要があります。

こちらのページが詳しいです。
[Windows 10でVHDファイルをドライブとしてマウントする](http://www.atmarkit.co.jp/ait/articles/1702/03/news153.html)

## Windows Update領域を上記のドライブに移動する
ただし、これだけでは仮想ドライブが追加されただけで、容量の大きなファイルを自分で移動して空き容量を増やさなければなりませんし、そもそもほぼ初期状態のWindows + Windows Updateファイルだけで全体を圧迫しているケースでは対応できません。

手順は以下の通りです。
* Windows Updateを停止する
* `C:\Windows\SoftwareDistribution`　を新ドライブにコピーする (例：E:\SoftwareDistribution)
* `C:\Windows\SoftwareDistribution`　を `C:\Windows\SoftwareDistribution_bak` 等にリネームしてバックアップ
* `C:\Windows\SoftwareDistribution` から移行先へのシンボリックリンクを貼る

参考 [Windows10でシンボリックリンクを設定する方法](http://www.wannko.net/windows10/etc/sinlink.html)
ただし、 `mklink` は内部コマンドなので、以下の形で実施しなければなりません。

`cmd /c mklink /D c:\Windows\SoftwareDistribution e:\SoftwareDistribution`

しばらく運用して問題ないようでしたら、バックアップの`C:\Windows\SoftwareDistribution_bak`は消してしまって大丈夫です。

# 参考
注意事項: この手順で作成したVHDは内臓のeMMCと比較して非常に低速ですので、ストレージがもったいないからと言って/temp 領域を移動させないように。。。私は後でもとに戻しました。

内部 eMMCのベンチ結果
![image.png](https://qiita-image-store.s3.amazonaws.com/0/38018/adede262-6dfd-37af-5c49-146e31797914.png)

VHDのベンチ結果
![image.png](https://qiita-image-store.s3.amazonaws.com/0/38018/967b5e35-f48b-2076-8424-4f36df18c07d.png)

# 追記
タスクマネージャーを除いたら、 `wsappx` というプロセスがCPUを専有していましたので、調査したところストアアプリの自動更新プロセスのようです。使わない場合止めてしまいましょう。

[Windows10が起動時にとても重たくなる、Windowsの『ストアアプリ』が原因](https://awnet.org/archives/124)
[CreateJS] マウスオーバー時のイベントがうまく動かない時は

```javascript
var stage = new createjs.Stage("myCanvas");

// マウスオーバーを有効にする
stage.enableMouseOver();
```

これを忘れていないか確認しましょう。

```javascript
object.addEventListener("mouseover", handleMouseOver);
object.addEventListener("mouseout", handleMouseOut);

// マウスオーバー
function handleMouseOver(event) {

}

// マウスアウト
function handleMouseOut(event) {

}
```

マウスオーバー／マウスアウトを使う時は要注意。