OmniAICreator/Qiita-1.07M huggingface dataset:
[Ansible][apt] Ansibleでのapt設定方法

Ansibleでaptの設定をする場合の指定方法メモ

# 設定例

```yaml:単体指定する場合例
  tasks:
    - name: install language-pack-ja
      apt: name=language-pack-ja update_cache=yes cache_valid_time=3600
```

```yaml:複数指定する場合例
  tasks:
    - name: install zabbix and dependencies
      apt: name={{ item }} update_cache=yes cache_valid_time=3600
      with_items:
        - zabbix-server-pgsql
        - zabbix-frontend-php
        - php7.0-bcmath
        - php7.0-xml
        - php7.0-mbstring
```

+ `update_cache=yes` で `apt-get update` を事前に行うようにする
+ cacheの更新を毎回行うのは遅いため、 `cache_valid_time` でcacheの有効時間を指定するようにする

# リポジトリを追加する
リポジトリを追加したい場合は `apt_repository` を使用します。
[apt_repository - Add and remove APT repositories — Ansible Documentation](http://docs.ansible.com/ansible/apt_repository_module.html)

# 関連
[[Ansible] Ansible使用方法まとめ - Qiita](http://qiita.com/koara-local/items/b52d6d84bc58acb8a56a)

# 参考
[apt - Manages apt-packages — Ansible Documentation](http://docs.ansible.com/ansible/apt_module.html)
[Ansibleでapt-getのパッケージリストを更新してからインストールする - Qiita](http://qiita.com/taisho6339/items/b6e19b8906b8d2a092e7)
[Ansibleでのaptキャッシュの更新 - Qiita](http://qiita.com/c0tt0n-candy/items/51fae8a211d8b0e4af07#_reference-fa10a72b56c8ecd8e52e)
docker-composeでGitBucket(with PostgreSQL)とJenkinsを一発で立てる

※ 7/31 GitBucketを自作イメージに変更しました。

ツイートで`GitBucketとJenkinsを一発で立ち上げたいけどやる気が起きない...`というのを見かけたので、Docker猛勉強中の私が頑張ってやってみました。ちなみにDockerfileをAnsible+Packerで置き換えられないかと挑戦していますが厳しいです。素直にDockerfileやります...

もともとGitBucketが好きでScala勉強していますがまだまだ貢献できそうにないので、少しでもお役に立てれば幸いです。

ソースは[Github](https://github.com/shomatan/gitbucket-jenkins-docker-compose)にあります。

## 環境
- macOS Sierra 10.12.6
- Docker 17.06.0-ce, build 02c1d87
- docker-compose 1.14.0, build c7bdf9e

## 構成
以下の3コンテナで運用します。ベースは全てAlpine Linuxです。

- GitBucket本体 (Version 4.14.1)
- GitBucket用DB (PostgreSQL 9.5)
- Jenkins （Version 2.60.2）

## 検討したこと
### どのイメージを使うか
GitBucketは起動時にDBへ接続できないとエラーで終了してしまうので、[自作](https://github.com/shomatan/docker-gitbucket)しました。  
現在はPostgreSQLとMySQLをサポートし、DBが起動するまで待機するスクリプトを配置しています。
PostgreSQLとJenkinsは公式を使っています。

### データ置き場
データ専用コンテナを用意するか迷いましたが、`docker-compose rm`で消してしまうかもしれないので、ホストディレクトリにマウントしています。
docker-compose.ymlと同階層にvolumesディレクトリを作り、各コンテナの重要データは全てそこに置くようにしました。

### Nginxリバースプロキシ
GitBucketとJenkinsが共に8080ポートを使用するため、Jenkinsを8081に変更しています。
下記コンテナと使うと簡単に常時SSL化ができたのでオススメです。

- [nginx-proxy](https://hub.docker.com/r/jwilder/nginx-proxy/)
- [letsencrypt-nginx](https://hub.docker.com/r/jrcs/letsencrypt-nginx-proxy-companion/)

## 使い方
まずソースを取ってきます。

    git clone https://github.com/shomatan/gitbucket-jenkins-docker-compose

あとは

    docker-compose up -d
するだけです。

数分すると各URLにアクセスできます。

- GitBucket http://localhost:8080
- Jenkins http://localhost:8081

GitBucketは ID:`root` PW:`root`で、
Jenkinsはコンテナのログに初期ログイン用のパスワードが紛れてますので入力します。

```
2017-06-01T06:28:34.970840638Z 
*************************************************************
*************************************************************
*************************************************************
2017-06-01T06:28:34.970851647Z 
Jenkins initial setup is required. An admin user has been created and a password generated.
Please use the following password to proceed to installation:
2017-06-01T06:28:34.970888248Z 
e88e0932068b43438151e06a65ff4e5c       <-  ////////// これ！ //////////
2017-06-01T06:28:34.970893099Z 
This may also be found at: /var/jenkins_home/secrets/initialAdminPassword
2017-06-01T06:28:34.970899129Z 
*************************************************************
*************************************************************
*************************************************************
```

## やり残したこと
- Jenkins起動時にGitBucket用のプラグインをインストール
- docker-compose.ymlでネットワークを定義してみる

## 終わりに
既にあるDockerイメージで簡単に構築できました:100:
「Linker command failed with exit code 1」の解消の仕方

**Xcode**で**Cocos2d-x**開発を行っている際、
"Linker command failed with exit code1"
というエラーに悩まされました。ググってもなかなか解決方法が見つからなかったのですが、解消方法が判明したのでメモ代わりに書いておきます。

コンソールから該当プロジェクトフォルダに行って、下記のコマンドを打つ。
```command:
find . -type f -name '*.png' -exec xattr -c {} \;
```
その後、クリーンビルド。
使っているリソースが、pngでない場合、該当リソースの拡張子で実行すると解消します。

解消はするのですが、最近はResourcesにpngを追加するたびに発生します。
そのたびにクリーンビルドするのは辛い。引き続き解消法を調べます・・・
Scala祭り「twitterのサービスの作り方」レポート

スカラ祭りお疲れ様でした！っていつの話だよですが、、、今回は niwさんが発表された「twitterのサービスの作り方」のレポートをします。貴重な大規模サービスの知見を外に出してくれてniwさんには感謝！です。

https://speakerdeck.com/niw/lessons-learned

前いた会社（別に隠すこともないのでニコニコの会社）もめっちゃでかくてマイクロサービスでありサービスオリエンテッドアーキテクチャであり、でかいシステムについては一家言ももやもやするところもあったのですべてがそうだよな〜と感心する発表でした。あと finagle (twitterの作ったScalaの分散ライブラリ）を追いかけているのでtwitterでfinagleを使っている人のお話が聞けるのは大変貴重でした。懇親会ではここぞとばかりに質問しまくりましたｗ

以下感想です。発表内容と懇親会で聞いたことと自分の感想が混ざってます。

## MonoRepo
リポジトリを１個にするってのがこれはみんな（誰？）おお〜って思ったらしい。
FBやGoogleもやってるらしい。有名らしいが知らなかった
ただファイル数多いとgitが遅くなるので、そのためにgit に手を入れてるわけでそんじゃそこらのパワーないとできんよねと思った。あとただ歴史的経緯？によりAndroidとiPhone Appは別とのこと。他に例えば [Vine](https://vine.co)  や [Periscope](https://www.periscope.tv) とかはどうなってるんだろうとあとで思って聞きそびれた。

## Mesos について。
今で言うコンテナだしいまさらよくねとのこと。EC2 とか GCPとか確かに。twitterやそれのもととなったgoogleのインフラ（borg?) ってAWSといったクラウドが登場する以前に開発されたものであって今となっては自前でMesosを持つみたいなのはナンセンスなのかも、そこまで自社で持つことにこだわるのは…。

## サービスの単位
発表では finagle を使って map や flatMap でサービスを組み合わせますという話でした。で、ではサービスの単位は？という質問をして、チームですというそのままな回答をいただきました。マイクロサービスって責任範囲をわけるためであって、サービスの単位は結局チームになる。まあ１チームで複数サービス持つこともあるだろうが。
逆に、明らかにチームが分かれてるのなら絶対にサービスをわけたほうがいいみたいな。
つまり会社が小さかったり、人数も少ないんならモノリシックで全然いいんよね。ってずっと思ってて、前の会社ではマイクロに作ってあったものを一枚岩アプリに作り直すというのはやったことがあってこれはこれでよかった。

## インフラ
仮想化されたインフラがあって、オレオレtwitterがシュシュっと建てれてプロトタイピングとかできるという。まあーーーーこういうの必須よな。データについてはリードだけなら本番のデータを使うんじゃないかと予想。この辺の話はniwさんの発表の後半に詳しいです。
finagleの機能であるdtabもこれと関連するんでしょうがよくわかっていません。

## データストア
無限のKey Value Storeみたいなのがあるとのこと。これもやっぱりかーーーーって思ったポイントです。てかこういう無限KVSのって何をつかうんでしょう？？Hbase？
以前仕事でフィールド増やすのにMySQLの制約で1カラムに収まらなくなって調整するみたいなのをやっててなんか2016年なのに…って思ってたのでそうだよね…って納得した。

## 監視
twitter-server はいろんなmetricsがとれるがどうしてるんだろうという疑問。これはマシンごとに毎秒とか集計サーバに送っているとのこと（送る方法は確かバッチかな？）。
みんなやると思うけど、 zabbixで同じ仕組み作ってた。ただzabbixはもう触りたくない。

## zipkin
いる？とのことｗこれは笑った。まあちゃんと動き出したらいらんよね、、、俺もそう思う。まあもうちょっとsystemsよりのひと(systems software engineer、日本だと基盤エンジニアというのかなインフラかもしれない)だったらいるのかもしれない。

## feature flag や シャドーデプロイ
 [finagle-toggle](https://github.com/twitter/finagle/tree/master/finagle-toggle )  （feature flagとか [feature toggle](https://martinfowler.com/articles/feature-toggles.html) っていうかっこいい概念。シャドーデプロイも関連）も使ってます？と聞いたらなにそれとのこと。シャドーデプロイとかバリバリ使ってて〜ってイメージだったんですがsystemsの人しか使ってないっぽい。イメージだが、例えば内部で使ってるライブラリのバージョンアップする場合（それをオンにするフラグを用意して）systemsの人がtoggleを使ってちょっとフラグをオンにしていくのでは？？？でもこれはすごいいと思うし正しいインフラエンジニアとアプリエンジニアの分業に思える。

## thrift
困ってない？例えばフィールドが増えるときとか？その場合はバージョン上げていくとのことだが基本的に破壊的変更をしないようにしているので困ってないとのこと（thrift 詳しくないので曖昧。。）。

## finagle vs finatra
どっちがいい？って懇親会で質問してまあどっちでもいいんじゃないって回答してもらったんだけど、個人的には finatra 一択かなという気が。理由はDIで、finagleにはDIがないけど finatra にはあるので。今時はDIは必須な気がする。

## おまけ
今回聞けなかったことも gitter にいる twitterの開発者たち
https://gitter.im/twitter/finagle に聞いたら普通に教えてくれると思う。
（例えば、 monorepo  https://gitter.im/twitter/finagle?at=5914a8ce8a05641b1171d73d の説明をしてくれてる場面）だから今回懇親会で聞いたようなことも gitter で聞けるような気もしなくもない。
Rails + deviseで会員登録APIを自前で構築する時の肝

```ruby:controller/api/user_controller.rb
def create
  user = where(email: user_params[:email]).first
    if user
      if user.confirmed?
        fail "already exists"
      else
        user.password = user_params[:password]
        user.send(:generate_confirmation_token!) # protectedメソッドなのでsendを使っている
      end
    else
      user = User.new(
        email: user_params[:email],
        password: user_params[:password]
      )
      user.skip_confirmation_notification!
      user.save!
    end
  confirmation_token = user.instance_variable_get('@raw_confirmation_token')
  confirmation_url = api_user_confirmation_url(user, confirmation_token: confirmation_token)
  UserAppMailer.confirmation_instruction(user, confirmation_url).deliver
  render :success
end

def user_params
  params.require(:user).permit(:email, :password)
end
```

1. 新しく作成したUserモデルのインスタンスからconfirmation_tokenを取り出します
2. userインスタンスと上で取り出したconfirmation_tokenを使ってconfirmationアクションへのurlを作ります
3. userにconfirmationアクションへのurlをメールで送信します
4. 成功した旨のJSONレスポンスを返します

これでいけた^ ^
Azure の Data Science Virtual Machine で CNTK を試す

## 発端
- [de:code 2017 Hackdays](https://blogs.msdn.microsoft.com/decode/2017/03/30/decode-2017%e3%80%8chack-days%e3%80%8dday3-4%e9%96%8b%e5%82%ac%e6%b1%ba%e5%ae%9a%ef%bc%81/) に参加
  - ありがとうございました:)
- [CNTK (Cognitive Toolkit)](https://docs.microsoft.com/en-us/cognitive-toolkit/) を触ろう
- 環境構築が難しそう
- 適当なPCを持っていない

---

## Azure に VM を立てよう
- [Data Science Virtual Machine for Windows](https://docs.microsoft.com/ja-jp/azure/machine-learning/machine-learning-data-science-virtual-machine-overview)
- 今回のサイズは DS3_V2
  - 推奨構成の中で最小

---

## 料金 (1)
- MSDN サブスクリプションに付属している Azure のクレジットで支払いたい
- *Data Science Virtual Machine の代金の支払いにサブスクリプションは使えないよ* みたいなことが書いてある
- *DSVM の代金は 0.0000 JPY/時間* とも書いてあるので、信じて __購入__ を押す
- なお Standard DS2 v2 仮想マシンは有料で、サブスクリプション クレジットで支払える

---

## 起動

- 仮想マシンのデプロイは数分で完了
- コマンドラインから jupyter notebook を起動

```
> jupyter notebook
```

- ブラウザで `localhost:9999`
- あるいは、デスクトップのショートカットを叩く

---

## パスワード？？？

- jupyter notebook にパスワードの入力を要求される
- パスワードなんて設定した覚えがない...

---

### パスワードを再設定
- デスクトップのショートカット *Jupyter Set Password & Start* を実行
  - *jupyter_notebook_config.py* (後述) の末尾に新しいパスワードが追記される
- jupyter notebook を起動して、ブラウザで開く
- 新しいパスワードを入力してログイン

---

### あるいは、パスワード無しに
- *C:\ProgramData\jupyter* の *jupyter_notebook_config.py* を編集
- `c.NotebookApp.password` の行を削除かコメントアウト
- jupyter notebook を起動すると、トークンが発行される
- トークンをコピペしてログイン
- あるいは、トークン付 URL をアドレスバーにコピペして入る

---

## CNTK のインストール

- 初期状態では CNTK が無いというエラー
- CNTK はインストールが必要
- [ドキュメント](https://docs.microsoft.com/en-us/cognitive-toolkit/Setup-Windows-Python)に従ってインストールする
- 今回は python = 2.7, Flavor = CPU-Only を `pip install`
- CNTK インポート

```python
import cntk
cntk.__version__
```

```
'2.0rc3'
```

- サンプルを実行

---

## GPU vs CPU

- GPU 版をインストールしておけば、先に GPU を探し、無ければ CPU を使うので大丈夫とのこと
- GPU は超速い :o

---

## モデルの保存

- 学習させたモデルは `save` で書き出せるとのこと

```python
pred.save("filename")
```

---

## 【誤】~~料金 (2)~~

- ~~VM を停止しても料金がかかる~~
  - ~~停止しても *'Stopped (still incurring compute charges)'* と表示される~~
- ~~料金の発生を止めるには VM を削除するしかない (たぶん)~~
  - ~~ストレージ アカウント~~
  - ~~パブリック IP アドレス~~
  - ~~...~~
  - ~~__リソース グループ__ でまとめて消すのがよい~~

---

## 【正】料金 (2)

- Azure ポータルから __停止__ すると課金が止まる
    - *'Deallocating'* と表示されている状態
- OS をシャットダウンしただけでは課金は止まらない
  - *'Stopped (still incurring compute charges)'* と表示されている状態
- VMを停止してもかかる料金はある
    - ストレージ アカウント
    - パブリック IP アドレス

---
Microsoft Office 365 筆記


- [Microsoft Office 365 Home 下載](http://office.com)


## Outlook 2016

**Outlook 2016 設定離開不要刪除垃圾桶**

有時候我們希望離開 Outlook 2016 時候, 可以保留垃圾桶的信件不要自動刪除, 這時候可以取消自動刪除的功能

![ScreenClip.png](https://qiita-image-store.s3.amazonaws.com/0/183820/528292fb-764a-6690-7f16-06157b517d1f.png)

**Gmail 同步信件將 1,000 封 調整為 10,000 封，搜尋資料量才夠用**

如果我們使用 IMAP 方式同步 Gmail 郵件, 有時候預設是 1,000 封信, 這時候對我們想要使用搜尋郵件就極為不方便, 畢竟 1k 的信件內容實在可以涵蓋的範圍太有限了, 建議可以調整為 10k 的數量, 這樣比較方便搜尋

> 如果勾選 **不要限制 IMAP 資料夾的郵件數量(預設)** 可能導致太多的信件把您的行動裝置記憶體內容塞爆

![screenshot.png](https://qiita-image-store.s3.amazonaws.com/0/183820/cb4e5c10-0591-6913-3d53-e7f78f49280c.png)
iOS開発経験1年未満のエンジニアがWantedly 技術見学会 〜iOS編〜 に参加して学べたこと#WT技術見学会

Wantedly 技術見学会 〜iOS編〜の内容が良くわかるブログ↓
http://dev.classmethod.jp/smartphone/iphone/event-report-wantedly-technical-tour-ios/

Qiita記事でもよくお見かけする、
技術力の高いエンジニアが多く在籍されるwantedly, Incの勉強会に
iOS & android開発経験10ヶ月ほどのエンジニアが参加して学べたことを書いておきます。

各発表の内容は上記リンクのブログにて
しっかりとまとめられているので、この記事は筆者の学びのみです。


## 「Wantedly People ViewModel with Rx」
https://speakerdeck.com/susieyy/wantedly-people-viewmodel-and-rx


* RxSwiftがわからないので、実装のコードは全然読めませんでした。。。
* MVVMは以下のような場面で使ってる<br>
    （**↓こういうことをやりたくなったら思い出してスライドを見よう！**）
    * 入力フォームにリアルタイムでバリデーションかけてユーザーに警告のラベルを表示
    * 通信エラーをハンドリングして、アラートを表示させ、再接続を試みる
* 本来、MVVMではViewModelからViewを操作しない。一度ViewControllerを介する
    * ただしコードの可読性が悪くなるなどあり、<br>WireFrameを通してViewを操作（label出したり）できるっちゃできる
* Viewバインド、**relamのNotification使うと結構解決するよ**、とのこと
    * 参考： https://speakerdeck.com/susieyy/realm-centered-design


##「Wantedly Peopleのスキャン画面の裏側」
https://speakerdeck.com/_shingt/wantedly-people-scanning-screen

* 画像処理の内容は難しいので「すごい！」としか。。。
* 複雑な処理のデバッグ方法の問題と解決策
    * 問題
        * リアルタイム画像処理のような複数な処理で、<br>
      **実行結果がおかしかった時、どの処理が問題なのかの特定が難しい**
    * 解決策
        * デバッグ版では、最終結果以外の<br>**各演算処理の結果を常に表示させるようにしておく**
* 本題ではないけれど、pod 'tensorFlow-experimental’面白そう


## 「Wantedly Peopleの連絡先一覧について」
https://speakerdeck.com/yuta24/wantedly-peoplefalselian-luo-xian-lan-nituite

* 時間がかかっていた処理の問題と解決策
    * 問題
        * 連絡先一覧画面を表示するのにめっちゃ時間が掛かっていた
    * 解決策
        * 独自型のプロパティをたくさんもつ、UserModelをrealmObjectから<br>structのオブジェクトに変換するのに時間がかかっていた
        * 一覧画面用にプロパティを絞ったUserDisplayModelを作成し、そちらを使うよう変更した
    * 結果
        * 速度が1/10以下になった 
* Modelもclassじゃなくてstructなんですね〜。それがswiftなんですね〜…
    * いつも特に理由なくclassにしていました…
    * structとclassの違い：http://blogios.stack3.net/archives/2718


## 「限られたリソースで進める段階的なSwift移行」

https://speakerdeck.com/hedjirog/xian-raretarisosudejin-meruduan-jie-de-naswityi-xing


* 工夫まとめ
    * 移行は一気に全部やらずに、段階的に進める。
    * 新規機能や新規画面で試す
    * 既存実装の置き換えを意識して懸念点を潰しておく
* 感想：筆者は今、swift2→3のバージョン移行をやっているのですが、こっちも段階的にやりたいです…

### おわりに

全体を通して、MVVMやRxSwiftが前提の内容であり、
こんな自分が参加してもいいのかな？と思っていたのですが、
個人的には参加させて頂けてよかったと思っています。
Android N 以降のネットワーク接続状態の監視方法

単にネットワークの接続状態を監視したかったのですが、Android 7 Nougat以降では方法が異なり十数分ほど無駄にしたのでメモしておきます。Nougatでの変更点としてまとめられている記事はいくつかありますがこの点が他の情報に埋もれているように思いました。


```xml
<manifest ...>

    <application ...>

        <receiver android:name=".NetworkWatcher">
            <intent-filter>
                <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
            </intent-filter>
        </receiver>

    </application>

</manifest>
```

Nougatをターゲットにしているプロジェクトでは、上記のように`AndroidManifest.xml`に記述すると次のようなWarningが出ます。

> Declaring a broadcastreceiver for android.net.conn.CONNECTIVITY_CHANGE is deprecated for apps targeting N and higher. In general, apps should not rely on this broadcast and instead use JobScheduler or GCMNetworkManager.

Nougat以降では`AndroidManifest.xml`に`android.net.conn.CONNECTIVITY_CHANGE`を設定しても無視されます。


> Monitor for Changes in Connectivity
> Apps targeting Android 7.0 (API level 24) and higher do not receive CONNECTIVITY_ACTION broadcasts if they declare the broadcast receiver in their manifest. Apps will still receive CONNECTIVITY_ACTION broadcasts if they register their BroadcastReceiver with Context.registerReceiver() and that context is still valid.
> :link: [Determining and Monitoring the Connectivity Status](https://developer.android.com/training/monitoring-device-state/connectivity-monitoring.html)

しかし、公式ページに書かれているようにコードで指定するとOKということです。
上記`AndroidManifest.xml`の記述とともに`Application`サブクラスにNougat以降を指定した処理を記述することで動作を確認できました。

```kotlin:MainApplication.kt
class MainApplication : Application() {
    override fun onCreate() {
        super.onCreate()

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            registerReceiver(NetworkWatcher(), IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION))
        }

    }
}
// MainApplicationはAndroidManifest.xmlで登録済み
// <manifest ...>
//     <application android:name=".MainApplication">
//         ...
//     </application>
// </manifest>
```

```kotlin:NetworkWatcher.kt
class NetworkWatcher : BroadcastReceiver() {

    override fun onReceive(context: Context?, intent: Intent?) {
        if (intent == null || context == null) return
        val action = intent.action
        if (action != ConnectivityManager.CONNECTIVITY_ACTION) return

        // do something
        
    }

}
```

Nougatより前のバージョンではアプリを終了しても`BroadcastReceiver`が実行されますが、Nougat以降では実行されません。バッテリー節約のためこのような仕様変更を行ったそうです。
Kotlinで任意の回数ループさせる


Kotlinで回数を指定してループするには,Range表記を使って以下のように記述すればよい。

```Kotlin
for (i in 1..4) {
  print(i)
}
```

インクリメントするだけでなく、デクリメントや一定の数値スキップしながらなど柔軟な指定が可能である。
より詳細な情報は[公式ドキュメントのRanges](https://kotlinlang.org/docs/reference/ranges.html)を参照。
jupyter notebookで決定木の可視化を行う

jupyter notebook で決定木の可視化を行う

```
import numpy as np
import pydotplus
from sklearn.feature_extraction.text import TfidfVectorizer
from IPython import display
from sklearn import tree
from io import StringIO
from operator import itemgetter
%matplotlib inline
%load_ext autoreload
%autoreload 2



input_text=np.array([
    '物理 数学 国語　　', #　ドキュメント1
    'パン ライス 　チョコ', #ドキュメント2
    'ビル アパート　マンション　', #ドキュメント3
    '北海道 福岡　神奈川' #ドキュメント4
])

#ドキュメント1は1
#ドキュメント2は2
#ドキュメント3は3
#ドキュメント4は4

target_data = np.array([
    1,2,3,4
    ])

#文書をtf-idfのベクトルへ変換
vectorizer=TfidfVectorizer()

input_data=vectorizer.fit_transform(input_text)

np.set_printoptions(precision=2) # 有効表示桁数を2桁へ変更
print(input_data.toarray())

#決定木モデルを生成
model = tree.DecisionTreeClassifier(max_depth=5)
model = model.fit(input_data, target_data)

model.predict(input_data)

feature_names = list(map(itemgetter(0),
sorted(vectorizer.vocabulary_.items(), key=itemgetter(1))))

data = StringIO()
tree.export_graphviz(model, out_file=data, feature_names=feature_names)
graph = pydotplus.graph_from_dot_data(data.getvalue())

display.display(display.Image(graph.create_png()))

```
こんな感じで見える。
ジニ計数も見えていい感じ！

<img width="681" alt="スクリーンショット 2017-06-02 14.19.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/65850/d0b2bf5c-f80e-0c46-dfae-8c9b8abafcb3.png">
【WebSphere Liberty Hints & Tips】静的コンテンツを返す方法


## はじめに
通常、静的コンテンツはHTTPサーバーのドキュメント・ルートで指定するディレクトリに配置することが多いと思います。何らかの事情でHTTPサーバーが前段になく、アプリケーション・サーバーから静的コンテンツも返したい時、WebSphere Libertyでの方法を記します。ここではブラウザからアクセスして、ファイルのダウンロードができるところまでを確認します。

## 方法
1. 提供したい静的コンテンツ（例：html、pdf、xlsxファイルなど）をwarファイルにパッケージングします。
![Kobito.zbvRhI.png](https://qiita-image-store.s3.amazonaws.com/0/129662/29868fce-854a-1ab8-e703-05a7c3409a9b.png "Kobito.zbvRhI.png")

2. Libertyの/dropinsフォルダに上記warファイルを配置します。ここに配置すると動的にアプリを検知し起動してくれます。
![Kobito.ZCF5Cs.png](https://qiita-image-store.s3.amazonaws.com/0/129662/31a6bc2e-e178-a789-b5c7-5959fc4aed49.png "Kobito.ZCF5Cs.png")


3. 動的に検知し、アプリとして起動してきます。サーバーの再起動は不要です。
![Kobito.vjJ73y.png](https://qiita-image-store.s3.amazonaws.com/0/129662/ed49a3ae-9c00-b01c-cb50-2083add96b44.png "Kobito.vjJ73y.png")
![Kobito.Tzud0U.png](https://qiita-image-store.s3.amazonaws.com/0/129662/33e7d446-0f89-6622-003a-c5a7e6bbe87c.png "Kobito.Tzud0U.png")

4. 以下のようにアクセスします。warに入れていたExcelファイルがダウンロードができることがわかります。
http://hostname:port/war-name/file-name
![Kobito.m9BuMC.png](https://qiita-image-store.s3.amazonaws.com/0/129662/be98cbae-de6c-ee20-b31d-9d599f1b00d2.png "Kobito.m9BuMC.png")

## war名を使いたくない場合

以下のように、Libertyのルートディレクトリにwar名をつけずにファイルを置きたい場合には、サーバー構成への登録が必要になります。
http://hostname:port/file-name
ファイルはdropinsディレクトリの下ではなくappsディレクトリにおきます。その上で構成ファイルserver.xmlに以下の内容を追記します。

```xml:server.xml
<webApplication location="mytestapp.war" contextRoot="/" />
```

## まとめ
以上で簡易的に静的コンテンツをWebSphere Libertyサーバーから返す方法を記しました。

## 参考
https://www.ibm.com/support/knowledgecenter/ja/SSEQTP_8.5.5/com.ibm.websphere.wlp.doc/ae/twlp_dep_war.html
https://stackoverflow.com/questions/27305207/how-do-i-display-an-html-file-using-websphere-liberty
デジタルサイネージを作ったので学んだことを晒してみる Part.1


今回、初めてデジタルサイネージを作る、という案件に携わりました。
もともと普通のWebサイトを作る、というようなことしかしてこなかったので、サイネージに関する知識は皆無。
かなりいい勉強になったので、今回はそれを書いてみようと思います。
（付け焼き刃な知識も非常に多いので、間違いや改善点などあればコメントください！）

# 要件

- ショッピングモール内にある小型店の店頭に置く、タッチパネル式のサイネージ
- 派手なアニメーションや広告は配置せず、見せるコンテンツをいくつか並べたい
- 店頭に設置してるポスターの代わりになるようなものにする

もともとの要件はこれだけ。
ここからモニターからPC、使用技術までの全てを選定しました。

## 使用技術

1店舗に設置するものということもあり、普通にHTMLで作成してサーバーにアップして、それをブラウザで表示させよう、ということになりました。


## モニターとPC

ディスプレイとPCは下記に決定。

- ELO（タッチパネルシステムズ）46型タッチモニター
- インテル Compute Stick（Windows 10）

本来であればタッチモニター自体に組み込めるPCモジュールもあったのですが、予算の都合もありスティックPCになりました。

# PCの設定

まず気になったのがPCの設定。
普通にブラウザ（Google Chrome）を立ち上げて全画面表示にしたところで、アドレスバーとかいろんなものが操作次第で出てしまうのでNG。
調べていたら、操作を制限する **キオスクモード**で立ち上げれば良い、ということがわかりました。

キオスクモードで立ち上げるにはいくつかの方法があるようですが、今回は手っ取り早くショートカットで立ち上げる方法を採用しました。

## Google Chromeをショートカットでキオスクモードにする（Win）

+ まずはGoogle Chromeのショートカットを用意します
+ ショートカットのプロパティを開きます
+ リンク先を下記に書き換えます  
```"C:\Program Files\Google\Chrome\Application\chrome.exe" —kiosk —disable–background–mode "http://（開きたいURL）"```

これでショートカットを開くと、Google Chromeがキオスクモードで立ち上がるようになります。
しかし、それでも下記の問題が残りました。

- 画面の端からスワイプ（エッジスワイプ）でアクションセンターなどが表示されてしまう
- 画面上で左右スワイプで戻る・進むが発生する
- タッチ長押しでテキストが選択できてしまう
- ピンチイン・ピンチアウトが効いてしまう

## 画面端からのスワイプ（エッジスワイプ）機能を無効化する

これは[Skip Metro Suite](http://winaero.com/comment.php?comment.news.103)とかっていうフリーウェアでなんとかなりました。
ダウンロードして立ち上げて、「Enable Skip Metro Suite」と他全てのチェックボックスにチェックして「Save Setting」します。
ただ、これだけだとまだダメで、 **完全シャットダウン**を行なってから再度起動し、1、2分待てば反映されます。

※「完全シャットダウン」は普通のシャットダウンではなく、「高速スタートアップを有効にする（推奨）」のチェックを外してシャットダウンします。

## 左右スワイプの戻る・進むを無効化する

これはGoogle Chromeの機能を無効にするだけでした。
`chrome://flags/` から「オーバースクロール時の履歴表示」を無効化するだけでした。

## タッチ長押しとピンチイン・ピンチアウトの無効化

今回はタッチのみでスワイプなどの機能は必要なかったので、CSSに下記を設定するだけでした。

```CSS
body {
  -webkit-touch-callout: none;
  -webkit-user-select: none;
  touch-action: none;
}
```

- `-webkit-touch-callout` ：長押しで表示されるポップアップメニューの制御
- `-webkit-user-select` ：テキスト選択の制御
- `touch-action` ：タッチによるスクロールやズームなどの制御


この辺り、ハイブリッドアプリなどを作成する場合には割と常識みたいですが、全然知りませんでした。

とはいえ、これでデフォルトの機能などは制限され、ネイティブっぽくなりました。

さて、あとは表示させるコンテンツをコーディングするだけ！
なのですが、そこは気力と体力が残っていればまた後日書こうと思います。
インスタンスレベルで作成時のコールバックをスキップしたいときのメモ

## 概要

モデルに定義されたコールバックをスキップしたい場合`Model.skip_callback`が公開APIとして提供されている。しかしこのメソッドはクラスメソッドとして提供されているため、影響が全てのインスタンスに及んでしまう。

特定のインスタンスでだけコールバックをスキップする方法がないか調べたのでメモする。

## 結論

インスタンスレベルでコールバックをスキップする公開APIは用意されていないが、内部APIを利用して無理やりスキップすることができるようだった。

## やり方

以下のように呼び出すことで、作成時のコールバックをスキップできる

`ActiveRecord::Persistence.instance_method(:_create_record).bind(User.new).call`

Rails 5.1.1 で検証
以下のようなモデルがある

```
# == Schema Information
#
# Table name: users
#
#  id         :integer          not null, primary key
#  token      :string(255)      not null
#  secret     :string(255)      not null
#  name       :string(255)
#  created_at :datetime         not null
#  updated_at :datetime         not null
#

class User < ActiveRecord::Base
  before_save do
    self.token  = 'foo'
    self.secret = 'bar'
  end
end
```

コールバックが呼び出されレコードが作成される

```
pry(main)> User.new.save!
  INSERT INTO `users` (`token`, `secret`, `created_at`, `updated_at`) VALUES ('foo', 'bar', '2017-06-01 04:54:17', '2017-06-01 04:54:17')
=> true
```

コールバックが呼び出されないため、`NotNullViolation`例外が発生する

```
pry(main)> ActiveRecord::Persistence.instance_method(:_create_record).bind(User.new).call
  INSERT INTO `users` (`token`, `secret`, `name`, `created_at`, `updated_at`) VALUES (NULL, NULL, NULL, NULL, NULL)
  => ActiveRecord::NotNullViolation: Mysql2::Error: Column 'token' cannot be null
```
【MySQL Workbench】MySQLやMySQL Workbenchのメモ


自分用のメモ書き。随時更新予定

## 【MySQL Workbench】DELETEできない
[MySQLワークベンチでupdate文を実行すると1175のエラーが発生](http://yoneyore.hatenablog.com/entry/2016/01/05/200047)

大量データの更新を制限しているので設定を変更する。

![Kobito.wdkC8n.png](https://qiita-image-store.s3.amazonaws.com/0/176986/f83eb32d-341b-671f-2990-e0ddea5fc9d1.png "Kobito.wdkC8n.png")

スクロールをしないと、隠れていて見えなかった・・・。

※ 注意：本番環境を扱う場合は、誤って削除しないように、以下のコマンドで対応する

```
SET SQL_SAFE_UPDATES = 0;
```

## 【SQL】日付のデフォルト設定
レコードの作成時、更新時に作成日時、更新日時を自動設定する

```
create table sample (
  id         int,
  val        varchar(16),
  created_at timestamp not null default current_timestamp,
  updated_at timestamp not null default current_timestamp on update current_timestamp,
  primary key(id)
);
```

## 【MySQL Workbench】ER作成のダイアログを広げる

メニューの「Model > Diagram Properties and Size...」から変更が可能

![MySQLWorkbenchDiagramProperties.gif](https://qiita-image-store.s3.amazonaws.com/0/176986/d34e396d-764b-9f40-012c-efc27af008a7.gif "MySQLWorkbenchDiagramProperties.gif")
システムの不備(インシデントとアクシデント)

### システムの不備

- ある所から報告書の提出に関するメールが届く
   - メールの中ごろに「提出先はこちら」という記載がある
   - メールの返信先はメーリングリストになってしまっている
      - 提出先とは違う
- 数名がそのメールに返信する
   - 報告書がメーリングリストの全員に届く
      - 情報が漏えいする。

### 対策

ある所から配信するメールの「返信先メールアドレス」に本来の正しい提出先メールアドレスを指定して、報告書の提出に関するメールを配信する。

上記のようなミスをどう予防するかは、システム設計・開発・運用における大切な検討事項であると思う。

最初のミスが起きた時点で運用側で予防措置をすればいいが、それがないことでミスが繰り返される。
GLSLをHLSLに書き換える

GLSLをUnityのシェーダーに書き換える時よく使うやつをメモっていく。
一番下の参考ページを見たほうが早いかもしれません。

# ◆ 変数

### 名前が違うやつ

| GLSL | HLSL | 説明
|:-----------|:------------|:------------
| vec4, vec3, vec2     |      float4, float3, float2 | ベクトル
| mat3, mat4, mat3x4    |      	float3x3, float4x4, float3x4 | マトリクス

### 名前が同じやつ

| GLSL, HLSL | 説明
|:-----------|:-----------
| sampler2D    | テクスチャ
| float    |  フロート



# ◆ 関数
### 名前が違うやつ

| GLSL | HLSL | 説明
|:-----------|:------------|:------------
| fract(x)     |      	frac(x)     |  x の小数部を返します。
| mod(x,y)     |      	fmod(x, y)     | x/y の浮動小数点の剰余を返します。
| atan(x,y)     |      	atan2(x, y)     | 2 つの値 (x,y) のアークタンジェントを返します。
| mix(x,y,a)     |      	lerp(x,y,a)     | xとyの間の線形補間。
| texture2D(img,texcoord)     |      	tex2D(img,texcoord)     | 色取得


### 名前が同じやつ

| GLSL, HLSL | 説明
|:-----------|:-----------
| pow(x,y)    |   xをy乗する
| abs(x)    |  絶対値
| step(edge,x)    |  x < edge ? 0.0 : 1.0
| smoothstep( x,y,a )   |  x,y間をスムーズに補間
| clamp( x, min, max )   |  xがmin以下ならmin, max以上ならmax
| discard   |  フラグメントシェーダーでピクセルの結果を出力しない
| length(v)   |  ベクトルVの長さ（絶対値）を返す
| floor(x)   |  少数きりすて
| sign(x) | x の符号を計算
| normalize(v) | 正規化

### GLSLにないやつ

| GLSL | HLSL | 説明
|:-----------|:------------|:------------
| matrix * matrix     |      	mul(matrix,matrix)     | マトリックスどうしや、ベクターとマトリックス掛け算。HLSLは関数を使う
| clamp( x, 0.0, 1.0 ) | saturate( x ) | [0,1]でcalmpするsaturate。GLSLにはない。clampで代用。
| if(x<0) discard; | clip( x ) | xが負ならdiscardするclip関数。glslならif文で書くのかな？？


# 参考ページ

GLSL/HLSL/Metal 命令対応表
http://dench.flatlib.jp/opengl/glsl_hlsl

組み込み関数 (DirectX HLSL)
https://msdn.microsoft.com/ja-jp/library/bb509611(v=vs.85).aspx

Shader(HLSL), 手続き的にテクスチャ生成など行うとき使用頻度の高い関数
http://qiita.com/oishihiroaki/items/9d899cdcb9bee682531a
fish まとめ

# vim ライクな操作有効化
```bash
# ~/.config/fish/config.fish
set fish_vi_key_bindings
````

# 補完強化
```bash
> fish_update_completions
```

# pip 補完
```bash
> pip completion --fish > ~/.config/fish/completions/pip.fish
```

# conda activate/deactivate 有効化
```bash
# ~/.config/fish/config.fish
source /home/hogehoge/.pyenv/versions/anaconda3-4.3.1/etc/fish/conf.d/conda.fish`
```
- 参照 : [conda.fish](https://github.com/conda/conda/blob/ba75a87a71eb433f63e7297c8de1949fabafe4ce/shell/etc/fish/conf.d/conda.fish)

# cmder 設定

- [Setup -> Startup -> Tasks]
- `-icon "%USERPROFILE%\AppData\Local\lxss\bash.ico"`
- `C:\Windows\System32\bash.exe ~ -c  fish -cur_console:p`

# 便利なプラグイン
- z
- fzf
- balias
- omf/theme-bobthefish
- pyenv

# 課題
- cmder で bobthefish のテーマを適用すると以下のようなバグが発生
    - 位置文字入力する毎に改行
![bug.png](https://qiita-image-store.s3.amazonaws.com/0/78079/655e8e7b-ce04-66f3-efd0-15951b2e3f26.png)
undefined method `strftime' for nil:NilClassのエラー解決法

###環境
```ruby:環境
rails 5.0
```

###状況説明
undefined method `strftime' for nil:NilClassエラーが出た。

reservationモデルで予約機能を作っている。new.html.erbで、日付を記入して、index.html.erbでエラーがでた。



```ruby:new.html.erb
<%= form_for @reservation do |f| %>
  <%= f.text_field :start_date, :class => 'datepicker form-control' %>
       
<%= f.text_field :end_date, :class => 'datepicker form-control' %>

<%= f.submit "この日程で予約する", class: "btn btn-danger btn-wide" %>   

<% end %>
      

```

```ruby:index.html.erb
  <td><%= reservation.start_date.strftime('%Y年%m月%d日') %></td>
       <td><%= reservation.end_date.strftime('%Y年%m月%d日') %></td>

```

###原因

日付を空白で登録したとき、出るエラーだった。

### 解決法

　空欄で登録できないようにする。

```ruby:reservation.rb
 validates :start_date, presence: true
  validates :end_date, presence: true
```

 モデルで上のようにするといい
Djangoのユーザをシェルで確認する方法


```py3
python manage.py createsuperuser
```

でユーザを作成すると思います．その時に作成したユーザ一覧を取得する方法についてです．

```py3
# シェルに入る．
python manage.py shell

from django.contrib.auth.models import User
print(User.objects.all())

# 出力
<QuerySet [<User: admin>, <User: tanakatarou>, <User: tanakajiro>]>
```

のようなリストで帰ってくるかと思います．

参照:
https://stackoverflow.com/questions/23139657/django-get-all-users
PCI Expressの速度一覧表

<dl>
  <dt>PCIe 1.1</dt>
  <dd>x1・・・500[MBps]</dd>
  <dd>x2・・・1[GBps]</dd>
  <dd>x4・・・2[GBps]</dd>
  <dd>x8・・・4[GBps]</dd>
  <dd>x12・・・6[GBps]</dd>
  <dd>x16・・・8[GBps]</dd>
  <dd>x32・・・16[GBps]</dd>
  
  <dt>PCIe 2.1</dt>
  <dd>x1・・・1[GBps]</dd>
  <dd>x2・・・2[GBps]</dd>
  <dd>x4・・・4[GBps]</dd>
  <dd>x8・・・8[GBps]</dd>
  <dd>x12・・・12[GBps]</dd>
  <dd>x16・・・16[GBps]</dd>
  <dd>x32・・・32[GBps]</dd>

  <dt>PCIe 3.1</dt>
  <dd>x1・・・2[GBps]</dd>
  <dd>x2・・・4[GBps]</dd>
  <dd>x4・・・8[GBps]</dd>
  <dd>x8・・・16[GBps]</dd>
  <dd>x12・・・24[GBps]</dd>
  <dd>x16・・・32[GBps]</dd>
  <dd>x32・・・64[GBps]</dd>
</dl>

参考文献
PCI EXPRESS 3.1 JITTER REQUIREMENTS
https://www.silabs.com/documents/public/application-notes/AN562.pdf
Vue.jsを使って簡単なToDoリストを作成してみた

MVVMの中でもシンプルで学習障壁が低いと言われている「Vue.js」を使って、ToDoリストを作成してみました。（追加と削除のみの機能しかもたない簡単なToDOリストです。）

学習した内容の整理も兼ねて、記述したコードを紹介したいと思います。

※今回はVue.js v2.3.3を使用しています。

##ViewModel

scriptの記述は下記の通り▼

``` javaScript

new Vue({
el: '#js-todoList',
data: {
  newItem: "",
  todos: []
},
methods: {
  addItem: function(event) {
    event.preventDefault();
    if (this.newItem == "") return;
    this.todos.push({
      item: this.newItem
    });
    this.newItem = "";
  },
  deleteItem: function(todo) {
    var index = this.todos.indexOf(todo);
    this.todos.splice(index, 1)
  }
}
})

```

まずはインプットしたデータを取得するnewItemとデータを格納する配列を定義。
さらにmethodsで下記の2つのfunctionを作成。

 - 入力したデータを配列に格納する**addTodo**
 - 削除ボタンを押されたItemを配列から消す**deleteTodo**


##View（HTML）
htmlはこちら▼

``` html
<div id="js-todoList">
  <form>
    <input type="text" v-model="newItem">
    <button v-on:click="addItem">追加</button>
  </form>
  <ul>
    <li v-for="todo in todos">
      {{todo.item}}
      <button v-on:click="deleteItem(todo)">削除</button>
    </li>
  </ul>
</div>
```

Vue.jsにはディレクティブと呼ばれるhtmlに組み込む機能があります。これはHTMLに独自の属性を付与することで、DOM操作を行う機能です。
今回は下記3つのディレクティブを使用しています。

**v-model**
inputされた値をバインディングして取得する機能

**v-on**
DOM イベントの購読、イベント発火時のJavaScriptの実行をハンドリングする機能。ここではaddItem、deleteItemの2つのfunctionを制御しています。

**v-for**
配列に格納されたデータを描写する機能


##まとめ
今回は簡単なToDOリストを作成してみました。まだまだ知らない機能がたくさんあるので、様々な制作物を通してvue.jsの理解を深めていきたいと思います。
zshの起動が重くなったので改善する

久しぶりにzshの環境をいじったら起動が重くなったので改善したメモ。

これらの対策+なんでもzcompileでtime zsh -i -c exitが0.7秒から0.17秒になりなんとか許容できるぐらいになった。

# brew file wrapper

マニュアルには.zshrcに

```zsh
if [ -f $(brew --prefix)/etc/brew-wrap ];then
  source $(brew --prefix)/etc/brew-wrap
fi
```

と書けとあるんでそのままコピペしたけど、実はbrew --prefixは結構時間がかかる。そんなに変わるものでもないので/usr/local決め打ちに書き直した。

# zplug

プロファイラーで調べて簡単に直せそうなところからいじってみた。

## compinit

compinitが結構時間かかるんだけど、よく調べたら.zplug/base/core/core.zshと.zplug/base/core/load.zshの2回呼ばれていて(他にgoogle cloud sdkでもさらに1回ともともと自分の.zshrcの中にあったもう1回の計4回)、~~なんとなく無駄っぽいから後に呼ばれるload.zshの方のはコメントアウトして見た。何か理由があるのかもしれないけど自分については特に補完がおかしくなるわけでもないのでOKということにしておく。~~ $fpathの設定を行うプラグインがあることを考慮すると`core.zsh`の方はタイミングが早すぎると思われるのでコメントアウトして様子見。

## __zplug::job::handle::flock

flockして混ざらないようにファイルに書く関数があって、ログを書くたびに呼ばれているのだけど、flockがサブシェルを使う書き方になっていた。プロセス終了でロックが自動的に解放されるから解放忘れを気にしなくていい便利な書き方なんだけど、何回も呼ばれるとプロセス生成のオーバーヘッドが積み重なってそれなりの量になる。

```zsh:.zplug/base/job/handle.zsh
    (
    until zsystem flock -t 3 "$file"
    do
        # 略
    done

    # 略
    )
```

以下のようにサブシェルを使わないように書き換え。

```zsh:.zplug/base/job/handle.zsh
    until zsystem flock -t 3 -f fd "$file"
    do
        # 略
    done

    # 略
    zsystem flock -u $fd
```

## __zplug::log::capture::error

プラグインを読み込むところでエラー出力をログに書くために以下のようなことをしています。

```zsh:.zplug/base/core/sources.zsh
        {
            # Directory '/base/sources' needs to be included in FPATH
            autoload -Uz "$val.zsh"
            eval "$val.zsh"
            unfunction "$val.zsh"
        } \
            2> >(__zplug::log::capture::error) >/dev/null
```

パイプを使っているのでプロセス生成のオーバーヘッドがあります。ちゃんとした修正方法は思いついてないのですが、これが必要になるのは不具合があったときで普段は何も出力されない筈なので、自分は起動速度を取ってログ出力部分は削除しました。

## __zplug::"io"::file::rm_touch

rm_touchというのが結構上位に来ていて中を見たらこんな感じだった。

```zsh:.zplug/base/io/file.zsh
__zplug::io::file::rm_touch()
{
    local filepath="${argv:?}"

    # For shorten the calculation time
    if [[ ! -d ${filepath:h} ]]; then
        mkdir -p "${filepath:h}"
    fi

    rm -f "$filepath"
    touch "$filepath"
}
```

rmとtouchは外部コマンドで毎回呼ばれるので時間がかかっていると思われる。しかし、これは結局"$filepath"という空のファイルができればいいだけのような気がするので、以下のように書き換え。

```zsh:.zplug/base/io/file.zsh
__zplug::io::file::rm_touch()
{
    local filepath="${argv:?}"

    # For shorten the calculation time
    if [[ ! -d ${filepath:h} ]]; then
        mkdir -p "${filepath:h}"
    fi

    : > "$filepath"
}
```

## zplug check 

マニュアルには.zshrcに以下のように記述して未インストールのプラグインがあるときはインストールするか聞くようにするといいとあるのだけれど、zplug checkも結構時間がかかります。

```zsh:.zshrc
    if ! zplug check --verbose; then
        printf "Install? [y/N]: "
        if read -q; then
            echo; zplug install
        fi
    fi
```

読み込むべきプラグインが増えるのは.zshrcに変化があったときと考えていいと思うので、チェック時刻を保存して.zshrcが新しくなっているときだけこれをするようにしました。

```zsh:.zshrc
if [ ! ~/.zplug/last_zshrc_check_time -nt ~/.zshrc ]; then
    touch ~/.zplug/last_zshrc_check_time
    if ! zplug check --verbose; then
        printf "Install? [y/N]: "
        if read -q; then
            echo; zplug install
        fi
    fi
fi
```

# google-cloud-sdkのcompletion.zsh.inc

zplugのとこでも軽く触れたけどこいつの中でもcompinitしていて無駄だからコメントアウト。
印刷用CSSをエミュレートする

LiveReload系を使いながら `@media print {...}` をゴリゴリと書く時に便利。

Chrome Developer Tools > Elements > More tools > Rendering
![スクリーンショット_2017-06-01_13_03_43.png](https://qiita-image-store.s3.amazonaws.com/0/24510/77b79419-01a5-c56b-d57f-377bde87da10.png)

Renderingの中のEmulate CSS Mediaにチェックしprintを選択
![スクリーンショット_2017-06-01_13_04_12.png](https://qiita-image-store.s3.amazonaws.com/0/24510/7459c217-56ef-f717-c520-46cf0152006c.png)
Flask-WTFでCSRF対策をしたTodoリストをFlaskで作る

備忘録です。べた書きです。
Flask-WTFの使い方はテンプレート内にhiddenでインプットに入れとかないと動かないんですね・・・。

#コード

```todo.py
import os
import sqlite3
import datetime
from flask import Flask, render_template, request, redirect, url_for, send_from_directory, session
from flask_wtf.csrf import CSRFProtect
app = Flask(__name__)
app.config['SECRET_KEY'] = os.urandom(24)
csrf = CSRFProtect(app)


@app.route('/')
def show_entries():
    con = sqlite3.connect('todo.db')
    c = con.cursor()
    c.execute('''CREATE TABLE IF NOT EXISTS message(data_id,msg,date_time)''')
    result = con.execute('''select * from message order by data_id desc''')

    return render_template('index.html', result=result)


@app.route('/add', methods=['GET', 'POST'])
def send():
    if request.method == 'POST':
        msg = request.form['msg']
        if not msg:
            con = sqlite3.connect('todo.db')
            c = con.cursor()
            alert = '入力してください'
            return render_template('index.html', alert=alert)
        else:
            date_time = datetime.datetime.today()
            data_id = date_time.strftime("%Y%m%d%H%M%S")
            con = sqlite3.connect('todo.db')
            c = con.cursor()
            c.execute('INSERT INTO message VALUES (?,?,?)',(data_id,msg,date_time))
            con.commit()
            result = con.execute('''select * from message order by data_id desc''')

    return render_template('index.html', result=result)

@app.route('/delete_data', methods=['GET', 'POST'])
def delete_data():
    if request.method == 'POST':
        data_ids= request.form['action']
        con = sqlite3.connect('todo.db')
        c = con.cursor()
        query = "DELETE FROM message WHERE data_id=?"
        c.execute(query,(data_ids,))
        con.commit()
        result = con.execute('''select * from message order by data_id desc''')
    return render_template('index.html', result=result)


if __name__ == '__main__':
    app.debug = True
    app.run()
```

```index.html
{% extends "base.html" %}
{% block content %}
<form action="{{ url_for('send') }}" method="post">
  <input type="hidden" name="csrf_token" value="{{ csrf_token() }}"/>
  <input type="text" name="msg" value="">
  <input type="submit" value="送信">
</form>

{% if alert %}
<p>{{ alert}}</p>
{% endif %}

<form action="{{ url_for('delete_data') }}" method="post" enctype="multipart/form-data">
  <ul>
    {% for entry in result %}
      <li>
        <input type="hidden" name="csrf_token" value="{{ csrf_token() }}"/>
        <input type="checkbox" name="action" value="{{ entry[0] }}">{{ entry[1] }}:{{ entry[2] }}
      </li>
    {% endfor %}
  </ul>
  <input type="submit" value="削除">
</form>
{% endblock %}
```

```base.html
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <link rel="stylesheet" href="/static/css/style.css">
    <link rel="stylesheet" href="/static/css/bootstrap.min.css">
    <title>File</title>
</head>
<body>
  <div class="container">
    <div class="row">
        {% block content %}
        {% endblock %}
    </div>
  </div>
</body>
</html>
```
[フロントエンドエンジニア]HTMLで使用するSELECTタグやinputタグなどで使用するplaceholderの話

#placeholderの話
今回は、htmlでinputタグ、SELECTタグ、textareaタグなどでplaceholderを設定したい時に
どうやるのかっていうのを共有させていただきます。

##SELECTタグの場合
SELECTタグにはいくつかやり方があるのですが、まずは一般的なよく見る書き方から紹介します。
###パターン1
```
<select>
<option value=''>選択してください</option>
<option>テスト１</option>
<option>テスト2</option>
<option>テスト3</option>
</select>
```
こうすると以下の画像のようになります。(見やすいように2つ作りました)
<img width="311" alt="スクリーンショット 2017-06-01 11.46.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/163415/d059f846-8c4d-0527-ebb5-528214d778f8.png">
こうすれば一応問題はないのですが
一つよくないことがあります。(場合によるかも)
この実装だと"選択してください"をまた押せることになるのでできれば避けた方が良さそうです。
では、どうすればいいか。次のパターン2で紹介します。

###パターン2
"選択してください"を最初の時にだけ表示させ、選ぶと"選択してください"を選択できないようにしたいと思います。

```
<select style="">
  <option value="" style="display: none;">選択してください</option>
  <option value="">テスト1</option>
  <option value="">テスト2</option>
  <option value="">テスト3</option>
</select>
```
selectタグ内のoptionタグの一番最初にstyle属性でdisplay:none;を指定してあげると以下の画像のようにできます。
<img width="294" alt="スクリーンショット 2017-06-01 11.51.43.png" src="https://qiita-image-store.s3.amazonaws.com/0/163415/4308517d-bf63-ffc1-65e3-df574bb51d13.png">

今回はoptionタグにstyle属性を設定したのですがcssの方でstyleを当てた方がいいかもしれません。

##inputタグ、textareaタグ
次はinputタグ、textareaタグのplaceholderです。
こちらのplaceholderはそれぞれのタグにplaceholder属性を指定するだけですので簡潔にできます。

```
<input placeholder='これはテストです'>
<textarea placeholder='これはテストです'></textarea>
```
これだけで大丈夫です。
そうすると以下の画像のようになります。
<img width="236" alt="スクリーンショット 2017-06-01 12.20.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/163415/6fe7f062-2b38-e63f-a223-6b8d2f88994a.png">


以上になります。
Visual Studio/マークアップ拡張機能 | マークアップ拡張構文

http://www.atmarkit.co.jp/ait/articles/0905/19/news145_2.html

> マークアップ拡張機能
...
> さらに、このような動作のサポートのほかに、マークアップ拡張が持っている機能がもう1つ存在する。それは、冗長になりがちなプロパティ要素構文を改善するための「マークアップ拡張構文」だ。

- マークアップ拡張機能
- マークアップ拡張構文

「機能」と「構文」というキーワードで混乱する。

> マークアップ拡張が持っている機能がもう1つ存在する。

の「マークアップ拡張」は機能なのかそのほかの何なのか。

https://msdn.microsoft.com/ja-jp/library/ms747254(v=vs.110).aspx

機能を実現するためにXAMLに書く形式のことを「構文」と言っているような気がする。

### 英訳時の用語追加

https://msdn.microsoft.com/en-us//library/ms747254(v=vs.110).aspx
と
https://msdn.microsoft.com/ja-jp/library/ms747254(v=vs.110).aspx
を比較すると

- Markup Extensions and WPF XAML
    - 日本語: マークアップ拡張機能と WPF XAML
- Basic Markup Extension Syntax
    - 日本語: 基本的なマークアップ拡張構文
 
英訳時に「機能」という言葉が追加されている。
「構文」はSyntaxから来ているので、妥当に思う。
ElasticSearch(rails)で階層化されたドキュメントの複数フィールドをまとめてAND検索する方法

elasticsearch-rails を導入して単純な検索までは簡単に実装できたのですが、階層化されたドキュメントのAND検索をする方法がなかなかでてこなかったのでメモ。

```ruby
class Article
  include Elasticsearch::Model

  belongs_to :genre

  # こんな感じで階層化されたドキュメントが登録されるようにする
  def as_indexed_json(options = {})
    as_json(
      only: [:title, :content],
      include: {
        genre: {only: :name}
    })
  end

  # 各フィールドをまたいでAND検索
  def multi_field_search
    query = {query:
               {
                 multi_match: {
                   query: query,
                   type: 'cross_fields',
                   fields: %w[title content genre.name],
                   operator: 'and'
                 }
               }
    }
    Article.search(query).records
  end
end
```

ポイントは以下の２つ

- `multi_match`を使う
- `type` に 'cross_fields' を指定する

multi_matchでfieldsに複数のフィールドを指定することができるようになります。fieldsパラメータでは`genre.name`のようにドット区切りにして下層のフィールドを指定できます。

これだけですと、AND検索が単一フィールド内でしか行われないため、複数のワードが別々のフィールドに格納されているとマッチしません。そこで`type`に`cross_fields`を設定すると、フィールドをまたいでAND検索できるようになります。
新卒で自分なりにTCP/IPについて纏めてみた

TCP/IPは、IPで通信したりする際の取り決め(プロトコル)の総称です。他にも、TCP/IPプロトコルスタックやインターネットプロトコルスイートとも呼ばれます。


#1.	TCP/IPを用いた通信の流れ

TCP/IPによる通信ではデータの先頭にヘッダと呼ばれる情報を付けられます。ヘッダは各階層で付けられ、その階層で必要な情報が組み込まれています。送信側では上位の階層から順にデータが処理され、それぞれのプロトコルに応じたヘッダが付けられます。また、データリンク層ではヘッダに加えて、フレームが壊れていないかチェックするFCS(Frame Check Sequence)が付けられます。そして、ヘッダが付けられたパケットはデータリンクを通して受信側へ届けられます。受信側では、そのパケットのヘッダを順に処理し、データをアプリケーションが読み取り、受信側は情報を得ることができます。

![通信の流れ.png](https://qiita-image-store.s3.amazonaws.com/0/184217/80545bff-5d32-e005-38a6-5c01a98ca1e0.png)



##1.1	プロトコルとは

プロトコルとはコンピュータ同士が通信するために決めた取り決めです。メーカーやCPU、OSが違うコンピュータ同士でもプロトコルが一緒であれば通信することが出来ます。
TCP/IPはIETF(Internet Engineering Task Force)という団体によって標準化されています。標準化しようとするプロトコルは全てRFCというドキュメントとしてインターネット上に公開されています。RFCにはプロトコルの仕様書だけでなくプロトコルの実装や運用に関すること、プロトコルの実験に関する情報が含まれています。


##1.2	TCP/IPの階層モデル

TCP/IPは機能ごとに分けて考えられており階層化されています。階層化をすることで、各階層を独立なものとして扱うことが出来ます。これによりある階層を変更しても、それがシステム全体へ影響を与えないため、拡張性や柔軟性を持ったシステムの構築を行うことが出来ます。また、各階層での役割を明確にすることで、その役割に特化したプロトコルの定義が出来ます。これによりプロトコルの実現や実装が容易となります。
各階層はそれぞれネットワークインタフェース層、インターネット層、トランスポート層、アプリケーション層と呼ばれます。


**ネットワークインタフェース層(データリンク層)**
⇒データリンクを利用して通信をするためのインタフェースとなる層です。
NICを動かすためのデバイスドライバとして考えることが出来ます。

**インターネット層**
⇒パケットを転送する機能が実装される層です。
TCP/IPの階層モデルでは、インターネット層とトランスポート層がホストのOSに組み込まれることを想定しています。
(IP、ICMP、ARP、etc.)

**トランスポート層**
⇒通信の実現を担い、両ノード間のデータ転送の管理を行う層です。
通信を行う両端のノードでだけ処理され、通信する際に通る途中にあるルータなどのネットワーク機器などでは処理されないです。
(TCP、UDP、etc.)

**アプリケーション層**
⇒アプリケーションの動作を実現する層です。
TCPおよびUDPを用いたアプリケーションに相当します。
(HTTP、HTML、SMTP、POP、etc.)

#2.	IP(Internet Protocol)

IPはインターネット層に含まれるプロトコルで、エンドツーエンドの通信を実現する役割を担います。機能の簡略化および高速化のために、IPはコネクションレス型の通信方式を採用しています。
主な機能は以下となります。

**アドレッシング**
⇒送信元のホストと宛先のホストはIPアドレスによって判別されます。

**ルーティング**
⇒宛先IPアドレスから経路を決定します。

**フォワーディング**
⇒決定した経路においての次のホストへデータを転送します。

**フラグメンテーション**
⇒パケットのサイズが大きいために次のホストへ転送できない場合、送信側はパケットを小さいフラグメントに分割します。そして、受信側はこれを元のパケットへ戻します。

##2.1	IPアドレス
IPによる通信では、NICごとにIPアドレスと呼ばれる識別子が割り当てられます。IPアドレスは言わば住所のようなものです。この住所を全世界で割り当てて、設定、管理、運用を行うことで、IPによる通信を実現します。

IPアドレスは32ビットで表すことが出来ます。一般的には8ビットずつに区切られた４つの10進数で表記します。

IPアドレスは、ネットワーク部(ネットワークアドレス)とホスト部(ホストアドレス)に分けることが出来ます。ネットワーク部はセグメントごとに割り振られています。そのため、接続されているセグメント同士では重複しないです。ホスト部は、セグメント内にあるホストを識別するために割り振られます。ホスト部も同様にセグメント内では重複しないです。さらに、ホスト部がすべて0のものをネットワークアドレス、すべて1のものをブロードキャストアドレスと呼びます。

ネットワーク部とホスト部を区別するために使用するものがサブネットマスクです。サブネットマスクを考えるときには2進数で考えます。上位ビットからネットワーク部を表す部分を1、それ以下のホスト部を表す部分を0として表現します。これをIPアドレスと同じく8ビットずつに区切られた4つの10進数で表記します。

![IPアドレス.png](https://qiita-image-store.s3.amazonaws.com/0/184217/a6972fca-bbff-32a2-f000-24992ba1aebe.png)

#3.	TCP(Transmission Control Protocol)
TCPはトランスポート層に含まれるプロトコルで、コネクション型プロトコルです。そのため、エンドツーエンドで信頼性の高い通信を実現することが出来ます。TCPは、チェックサムやシーケンス番号、確認応答、コネクション管理、再送制御、<ruby>輻輳<rp>（</rp><rt>ふくそう</rt><rp>）</rp></ruby>制御などの仕組みを持ちます。

**チェックサム**
⇒データが壊れていないかを確認する方法です。

**シーケンス番号**
⇒届いたパケットが何バイト目のデータなのかを示す番号です。

**確認応答**
⇒データが届いた際に、受信側が送信側へデータを受け取ったことを送信します。

**再送制御**
⇒受信側から送信側へ確認応答が届かなかった際に、送信側がもう一度データを送信する制御です。

**輻輳制御**
⇒受信側でネットワークが混雑している際に、送信側でデータの送る量を調整する制御です。
pythonでbottleを使ってtodoアプリを作ってみた

利用しているpythonバージョンは3.6です
自分の備忘録的なものですがアドバイス等もらえるとうれしいです。
##ソースコード
```todo.py
#coding:utf-8
from bottle import run,route,template,redirect,request,post
import sqlite3

@route("/")
def index():
    todo_list = get_todo()
    return template("index",todo_list=todo_list)

@route("/enter",method=["POST"])
def enter():
    todo=request.POST.getunicode("todo_list")
    #データベースにtodo_listを書き込む
    save_todo(todo)
    #return todo
    return redirect("/")

@route("/delete",method=["POST"])
def delete():

    conn=sqlite3.connect("todo.db")
    c=conn.cursor()

    delete="delete from todo_list where todo='{0}'".format(request.POST.getunicode("finished"))
    c.execute(delete)
    conn.commit()
    return redirect("/")

#データベースにtodo_listを保存
def save_todo(todo):
    conn= sqlite3.connect('todo.db')
    c= conn.cursor()
    insert="insert into todo_list(todo) values('{0}')".format(todo)
    c.execute(insert)
    conn.commit()

#データベースのtodo_listを読み込む
def get_todo():
    conn= sqlite3.connect('todo.db')
    c= conn.cursor()
    select="select * from todo_list"
    c.execute(select)
    row = c.fetchall()
    return row
run(host="localhost",port=8000,debug=True,reloader=True)

```
```index.html
<!DOCTYPE html>
<html lang="jp">
<head>
    <meta charset="UTF-8">
    <title>To Do App</title>
</head>
<body>
    <h1>Welcome to ToDo list</h1>

    <form name="todo" method="POST" action="/enter">
        <input type="text" name="todo_list"  required /><br/>
        <input type="submit" value="追加" />
    </form>


    <form method="POST" action="/delete">
      % for todo in todo_list:
      <input type="checkbox" name="finished"value="{{todo[0]}}">{{todo[0]}}<br>
      % end
      <input type="submit" value="チェックしたリストを消去">
    </form>


</body>
</html>

```
##感想
初めてのwebアプリ制作だったのでかなり苦労しました。
また、まだまだ完成度は低いので改良を重ねていこうと思っています。
特に、デザインをなにもやっていないので見た目だけでもカッコよくできたらいいと思っています。
[Linux][Ansible] timezoneの設定

AnsibleでLinuxのtimezoneを設定する方法メモ

# 使用方法

以下のタスクをplaybookに追加します。

```yaml:timezoneを設定するplaybook設定
- name: set timezone to Asia/Tokyo
  timezone:
    name: Asia/Tokyo
```

注意点として、`timezone:` 後の `name:` はインデントを１つ下げる必要があります。
（下げないと別タスクとして扱われてエラーになります）

# 関連
[[Ubuntu16.04] timezoneの確認と設定 - Qiita](http://qiita.com/koara-local/items/32b004c0bf80fd70777c)

# 参考
[timezone - Configure timezone setting — Ansible Documentation](https://docs.ansible.com/ansible/timezone_module.html)
port番号変更

#php artisan serve

```
php artisan serve --help
```

```
php artisan serve --port [番号を指定する]
```
例えば、
```--port 9000
```とすると、指定したportでブラウザ表示になる

```
Laravel development server started: <http://127.0.0.1:9000>
[Thu Jun  1 11:25:41 2017] 127.0.0.1:57719 [200]: /favicon.ico
.........

```
pythonで大文字から始まる単語のみカウントするワードカウント

自然言語処理をpythonで書く中で大文字のみのカウンターを書く場面があったので忘れないようにメモ
・大文字から始まる単語のカウント
・単語の先頭のみが大文字の場合のみ
・先頭大文字+数字なども対象

※jupyter notebookで書いているため言語指定などは行っていません。。。

```
import re
from collections import Counter

org_text = """
Of course a writer can write from the viewpoint of Southern slave owners who of course would be racist and 
view black people with, at best, benevolent paternalism, without her characters' 
attitudes necessarily being her own. But it's very apparent that Mitchell was wholly and uncritically sympathetic to her antebellum ancestors. 
The Old South was a graceful, chivalrous land where slavery was not a horrible and oppressive institution creating generations of misery and oppression, 
but a divinely-ordained means of preserving racial harmony. And for all that Mitchell, 
like her characters, probably considered herself to be kind and affectionate to all the African-Americans she knew personally, 
there isn't a single black character in the book who isn't an ignorant, semi-human ape -- which is literally how they are described. 
Even beloved Mammy is repeatedly compared to a monkey.
"""

#文字列を区切って配列へ
words= re.split(r'\s|\,|\.|\(|\)',org_text)

#大文字から始まる単語のみ抽出
r = re.compile("^[A-Z]$|^[A-Z][a-z0-9]+$")
dict_word=[x for x in words if r.match(x)]

counter=Counter(dict_word)

for word,count in counter.most_common():
    print("%s,%d" % (word,count))


```
NetworkManagerの操作コマンド集

# NetworkManager 基本コマンド

　CentOSでWifiやLanの接続、切断などの操作をCUIにて行う基本コマンド集です。



|  コマンド       |   　　　　　　意　　味　　　　　 |
|:-----------------|:---------------------------|
| nmcli device        |ネットワーク機器リスト表示　 |    
|nmcli radio wifi on |wifi ネットワークへ接続        |
|nmcli radio wifi off |wifi ネットワークから切断    |
|nmcli networking on |全てのネットワークを接続    |
|nmcli networking off|全てのネットワークを切断      |
|nmcli device connect [デバイス名]| ネットワークデバイスを有効化
|nmcli device disconnect [デバイス名]| ネットワークデバイスの無効化
|nmcli connection show | メモリ・ディスク上のプロファイル表示|
|nmcli device status | デバイスの接続状況|
|nmcli device show [デバイス名]| デバイスの詳細表示|
|nmcli device wifi |接続可能な無線アクセスポイント表示 |
|nmcli networking connectivity| 接続状態(下のテーブル参照)|

|  状　態     |   　　　　　　意　　味　　　　　 |
|:-----------------|:---------------------------|
|none|the host is not connected to any network.|
|portal|the host is behind a captive portal and cannot reach the full Internet.|
|limited|the host is connected to a network, but it has no access to the Internet.|
|full|the host is connected to a network and has full access to the Internet.|
|unknown|the connectivity status cannot be found out.|