OmniAICreator/Qiita-1.07M huggingface dataset:
RealmListをデータバインディングで使うときにハマった

## まえおき

自分用のメモです。

-------

```java:models/
// Article.java
public class Article extends RealmObject {
  @PrimaryKey public long id;
  public String title;
  public String body;
  public long published_at;
  public User author;
  public RealmList<Like> likes;
}

// Like.java
public class Like extends RealmObject {
  @PrimaryKey public long id;
  public User user;  
}
```

みたいなモデルで、

![Slice.png](https://qiita-image-store.s3.amazonaws.com/0/74571/a308e327-2330-5589-d0d0-09d0e95c755a.png)

こんな感じのカードUIを作ろうとしました。

細かい説明は省略しますが、ざっくり

 `android:text="@{article.likes.size()}いいね！"`

みたいな感じでいいねの表示をしようとしました。

## コンパイルエラー：XXXXXXXXBindingが見つかりません

データバインディングのXMLがなんか間違ってるときに出るエラーですね。

コマンドラインでビルドしてみると、

```
エラー: cannot generate view binders com.sun.tools.javac.code.Symbol$CompletionFailure: io.reactivex.Flowableのクラス・ファイルが見つかりません
エラー5個
```

みたいなエラーが出ていました。たぶんこれが根本原因でしょう。

## io.reactivex.Flowableのクラス・ファイルが見つかりません???

realm-javaは、RxJavaが使える環境であれば `Realm#asFlowable()` とか `RealmResults#asFlowable()` とか使えるようになっています。

Javaでコンパイルするときには、realmのプロセッサがRxJavaのクラスの存在確認をしたりしつつクラス生成するので、うまいことコンパイルエラーにはならないようになっていますが、データバインディングのプリプロセッサだとそこまで考慮してくれてないのでしょう、たぶん...。

## 回避するには...

```groovy
  compileOnly 'io.reactivex.rxjava2:rxjava:2.1.7'
```

を `app/build.gradle` に追記しましょう。
Haml 学習コース 初級編


次のスライドから本題です

※ 以下のURLから見た方が画質はいいと思います
[Haml 学習コース 初級編（Google スライド）](https://docs.google.com/presentation/d/e/2PACX-1vS9DPD6IoADVu2RS5VNAtdkjFLo3uQu_olJNYPFQZkaCWHkjL1lvGq7zStczYdIl0am2yjf553oUXMM/pub?start=false&loop=false&delayms=3000)


---
![Haml 学習コース 初級編.png](https://qiita-image-store.s3.amazonaws.com/0/81183/c65c6cbe-a95a-3104-fc11-452656935c99.png)

---
![Haml 学習コース 初級編 (1).png](https://qiita-image-store.s3.amazonaws.com/0/81183/943ddc9f-ec15-d744-c4de-ed0e69a61526.png)

---
![Haml 学習コース 初級編 (3).png](https://qiita-image-store.s3.amazonaws.com/0/81183/d9bb01ca-a96a-01ff-406b-6fd86b73b605.png)

---
![Haml 学習コース 初級編 (4).png](https://qiita-image-store.s3.amazonaws.com/0/81183/8b5a21b8-51e8-a9e6-88d3-286d026496ad.png)

---
![Haml 学習コース 初級編 (5).png](https://qiita-image-store.s3.amazonaws.com/0/81183/90cb6d5c-8537-60c0-d49b-c2b3db58ac53.png)

---
![Haml 学習コース 初級編 (6).png](https://qiita-image-store.s3.amazonaws.com/0/81183/000b777c-902a-fd04-e495-111928d5bef4.png)

---
![Haml 学習コース 初級編 (7).png](https://qiita-image-store.s3.amazonaws.com/0/81183/0fa62c00-2cf3-7130-e644-26fb558e30d6.png)

---
![Haml 学習コース 初級編 (8).png](https://qiita-image-store.s3.amazonaws.com/0/81183/56f8a54f-ab39-5942-75cf-b7d8744b220f.png)

---
![Haml 学習コース 初級編 (9).png](https://qiita-image-store.s3.amazonaws.com/0/81183/571491f3-3036-e205-15a5-e453faefdaae.png)

---
![Haml 学習コース 初級編.png](https://qiita-image-store.s3.amazonaws.com/0/81183/dee6a98a-02da-153b-b575-77a96633640e.png)

---
![Haml 学習コース 初級編 (1).png](https://qiita-image-store.s3.amazonaws.com/0/81183/2c10532a-d474-96fc-5bc5-2c944b25b37b.png)

---
![Haml 学習コース 初級編 (17).png](https://qiita-image-store.s3.amazonaws.com/0/81183/355fb563-84d0-98e1-dad5-5a639ce638c6.png)


---
![Haml 学習コース 初級編 (3).png](https://qiita-image-store.s3.amazonaws.com/0/81183/3fad332b-ceac-c1a2-bba2-9f53b94b84f7.png)

---
![Haml 学習コース 初級編 (4).png](https://qiita-image-store.s3.amazonaws.com/0/81183/4650ebbe-128c-3197-33d8-285523119272.png)

---
![Haml 学習コース 初級編 (5).png](https://qiita-image-store.s3.amazonaws.com/0/81183/f56bc31c-7d42-9195-8389-56cfbb21e454.png)

---
![Haml 学習コース 初級編 (6).png](https://qiita-image-store.s3.amazonaws.com/0/81183/9fe094fb-9335-1129-f6b9-f2c2d56261e0.png)

---
![Haml 学習コース 初級編 (13).png](https://qiita-image-store.s3.amazonaws.com/0/81183/08f9b516-0bff-784c-1362-dc3a88bfb35a.png)

---
![Haml 学習コース 初級編 (14).png](https://qiita-image-store.s3.amazonaws.com/0/81183/e19f7460-6796-1a73-ed6a-96608bfbde70.png)


---
![Haml 学習コース 初級編 (9).png](https://qiita-image-store.s3.amazonaws.com/0/81183/3278c18c-ed6b-e1c0-947d-3d38da3e17ed.png)

---
![Haml 学習コース 初級編 (15).png](https://qiita-image-store.s3.amazonaws.com/0/81183/98e413db-55f7-6159-ac5e-59ab2ac93e54.png)


---
![Haml 学習コース 初級編 (16).png](https://qiita-image-store.s3.amazonaws.com/0/81183/51a14b15-cf39-9cb7-d31b-6ae797256291.png)


---
![Haml 学習コース 初級編 (12).png](https://qiita-image-store.s3.amazonaws.com/0/81183/884b05a7-13f9-c72c-ac75-54af14455ea4.png)
ASP.NET WebAPI GET通信でJSONを受け取る方法(WebAPI側で)

######シリアライズしてUrlエンコしてクエリパラメーターに渡しているだけです。
######もっといい方法がありそうですが、一応できたのでメモします。

##クライアント側の実装

#####Jsonで送信するデータを定義
```C#
public class Person
{
　　public string Name {get;set;}
　　public int age {get;set;}
　　public List<Car> Cars {get;set;}
}

public class Car
{
　　public string Name {get;set;}
　　public string Maker {get;set;}
　　public string Money {get;set;}
}
```

#####JSONをシリアライズ→Urlエンコ→クエリに設定→APIにリクエスト
```C#
/*送信するデータを生成*/
var person = new Person(){
	Name = "山田太郎",
	age = 20,
	Cars = new List<Car>()
	{
		new Car()
		{
			Name = "テストA車",
			Maker = "A社",
			Money = 1000000
		},
		new Car()
		{
			Name = "テストB車",
			Maker = "B社",
			Money = 500000
		}
	}
}

/*送信するデータをシリアライズ ※JSON.NETを使用*/
var json = JsonConvert.SerializeObject(person);

/*Urlエンコード*/
var QueryEnc = HttpUtility.UrlEncode(json);

/*クエリパラメーターにJSONを設定してAPIにリクエスト*/
var url = "http://localhost:xxxxx/api/values"
using(var httpClient = new HttpClient()){
　　await httpClient.GetAsync(url + "?json=" + QueryEnc);
}

```

##WebApi側の実装
#####Jsonで受け取るデータを定義 ※クライアント側で実装したものと同じ
```C#

public class Person
{
　　public string Name {get;set;}
　　public int age {get;set;}
　　public List<Car>Cars {get;set;}
}

public class Car
{
　　public string Name {get;set;}
　　public string Maker {get;set;}
　　public string Money {get;set;}
}
```

#####JSONでデータを受け取る
```C#
public string Get(string json)
{
　　/*Urlデコード*/
    var jsonDcode = HttpUtility.UrlDecode(json);
   
    /*デシリアライズ*/
　　var person = JsonConvert.DeserializeObject<Person>(jsonDecode);
}
　　
　　return "成功";
```
これでJSONを受け取ることが一応できました。
docker[-compose]を複数IP環境で構築する

80番ポートで複数台接続したく
複数IPもらってサーバ構築して苦労したので残しておきます。
社内の開発サーバで複数人でdockerを使う場合にお役に立てば

#目指したもの(全て同一サーバ)
Ubutnu16.04にて
192.168.1.**1**:80(hostのeth **0**)
 → docker **0**[172.18.0.**2** :80]へ接続される

192.168.1.**2**:80(hostのeth **0.1**)
 → docker **1**[172.19.0.**2** :80]へ接続される

--net=hostで簡単にできると思ってました

#なぜリバースプロキシを選ばなかったのか
jwilder/nginx-proxyを使えば簡単に実装できるが
ホスト名を各クライアントPCで登録するとか
野良DNSを構築したくなかった

#isuueと日本語マニュアルにありました
ブリッジ・ドライバのオプション

|オプション|同等|説明|
|---|---|---|
|com.docker.network.bridge.host_binding_ipv4|--ip|コンテナのポートをバインドする時の、デフォルト IP アドレスを指定|

docker-composeは2つファイルを用意しないといけないのかな。
networksを2つ同じファイルに書いて制御できる？

実行コマンド

```
docker network create\
 --driver=bridge\
 --subnet=172.18.0.0/16\
 --gateway=172.18.0.1\
 -o "com.docker.network.bridge.host_binding_ipv4"="192.168.1.1"
 -o "com.docker.network.bridge.name="docker1"\
 docker1

docker network create\
 --driver=bridge\
 --subnet=172.19.0.0/16\
 -o "com.docker.network.bridge.host_binding_ipv4"="192.168.1.2"
 -o "com.docker.network.bridge.name="docker2"\
 docker2
```

compose-file1

```
services:
  web1:
    ports:
      - "80:80"
networks:
  default:
    external:
      name: docker1
```

compose-file2

```
services:
  web2:
    ports:
      - "80:80"
networks:
  default:
    external:
      name: docker2
```

#試したこと(結論は上です）
  ports:
    - "172.17.0.1:80:80"だけでは動作しない
dockerで同じNWをブリッジで作成し、NICにbrctlで紐付け→外部と繋がらない
dockerで同じNWをブリッジを作成し、NICに紐付けたbr0にbrctlで紐付け→brctlでエラー
docker network createで全部にgatewayを指定していたらエラーでできず
Raspberry Pi のカメラモジュールで撮影

Raspberry Pi Advent Calendar に書こうと思ったら、枠が埋まってしまったので、こちらに書くことにしました。

この記事は、Raspberry Pi Advent Calendar 2017 11日目の記事、@take-iwiwさんによる「[Raspberry PiとLinux的方法によるデジタルカメラの作成](https://qiita.com/take-iwiw/items/d6645880c5bb91ce8a85)」に感銘を受けて書きました。

Raspberry Piのカメラモジュールで写真を撮影します。

OpenCVを利用してカメラ画像の取り込みを行うプログラムは、かつて私の個人ウェブサイトで[記事](http://blog.soramimi.jp/?p=470)にしました。OpenCVを使わず、Video for Linuxだけで画像を取り込みたかったのですが、Video for Linuxの資料が極めて少なく、サンプルプログラムも皆無という状況だったため、諦めていました。

そんなところ、上記記事でVideo for Linuxで画像を取り込む方法がわかったので、私もやってみることにしました。上記記事では、X Windowを使わず、液晶画面の制御まで自前で行うという、かなりすごい記事なのでご一読をおすすめします。

私がやったのは、Video for Linuxからキャプチャするコードを~~パクっ~~拝借して、Qtのスレッドで連続キャプチャする処理と、Qtのウィジェット内に描画するくらいなので、実はたいしたことはやっていません。

![camera.jpg](https://qiita-image-store.s3.amazonaws.com/0/61222/1c19d396-a4a3-29d6-f4b9-895497b7a807.jpeg)

OSはraspbianを使用します。あらかじめ`raspi-config`でカメラのサポートを有効にしておいてください。

Video for Linux をインストールします。

```
$ sudo apt-get install libv4l-dev
```

この中に、`bcm2835-v4l2`というモジュールが入っていますので、`modprobe`コマンドで読み込むか、`/etc/modules`に記述して再起動しておきます。`lsmod`コマンドを実行して、`bcm2835_v4l2`と、`videobuf2_*`がいくつか読み込まれていればOKです。

アプリの開発は、私の記事「[Raspberry Pi でGUIアプリ開発、初めての手引き](https://qiita.com/soramimi_jp/items/b2b238d1537dbb99abea)」を参考に構築してください。

ソースコードはGitHubに置いてあります。Qt Creatorから`QtRaspberryPiCameraCapture.pro`を開いて、ビルド、実行してください。

https://github.com/soramimi/QtRaspberryPiCameraCapture

![captureapp.jpg](https://qiita-image-store.s3.amazonaws.com/0/61222/508acb5a-2250-beee-8744-4a3f05ac8422.jpeg)
処理の途中経過を保持して外部に隔離する

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

# はじめに

[現行のDarkmatterについてはこちらをご覧ください．](https://github.com/tamamu/darkmatter)
開発版のDarkmatter Core/Notebookについては最低限の動作が出来たら追記します．


現在開発中のDarkmatter Core/Notebookには，コード実行の途中経過を手動で保存する機能があります．
そのため実行を中断しても途中の結果が見れたり，実行時エラーで死んだりしても途中経過を残しておけば確認が可能です．
さらにリアルタイムな可視化にも利用されるため，機械学習の実験などに有用です．
途中経過を保存する領域は単なるhash-tableなので，通常の変数と同様に扱うことが出来ます．

トリッキーな実装なので誰得かは分かりませんが，記録として残しておきます．

# 実装概要

* コードの実行はthreadを立ち上げて行う
* threadと途中経過を保存する領域(context)を紐付けるtask構造体を作る
* threadで実行するコードを，contextを受け取る1変数関数(lambda)に変換する
* thread立ち上げ前にcontextを作成し，作成した1変数関数に適用して実行を開始

(ここに図を入れたかった...)

# 最低限の実装

```lisp
(require :bordeaux-threads)

(defstruct task
  (thread nil)
  (context nil))

(defun create-task (fun &optional (context nil))
  (make-task
    :thread (bt:make-thread fun)
    :context context))

(defun %read-from-string-with-context (str)
  (read-from-string
    (format nil "(lambda (%context%) (declare (ignorable %context%)) ~A)" str)))

(defun spawn (code)
  (let ((source (%read-from-string-with-context code))
        (context (make-hash-table)))
    (create-task
      (lambda () (funcall (eval source) context))
      context)))

(let ((task (spawn "(loop for i from 0 to 100 do (setf (gethash :count %context%) i) (sleep 1))")))
  (sleep 1)
  (format t "~A~%" (gethash :count (task-context task)))
  (sleep 5)
  (format t "~A~%" (gethash :count (task-context task)))
  task)
```

実行結果は以下のようになります．

```
0
5
#S(TASK
   :THREAD #<SB-THREAD:THREAD "Anonymous thread" RUNNING {1002CF6143}>
   :CONTEXT #<HASH-TABLE :TEST EQL :COUNT 1 {1002CF6023}>)
```

Darkmatter Coreではtaskの実行結果とcontextをクライアントからのリクエストに応じて送信するようにしています．
実際のコードは下のURLにあります．

* <https://github.com/project-darkmatter/core/blob/master/src/domains/task.lisp#L31>
* <https://github.com/project-darkmatter/core/blob/master/src/usecases/eval.lisp#L29>

# まとめ

実際にDarkmatter Coreで使われているテクニック(?)を紹介しました．
contextをグローバル変数として持っていても悪くは無いのですが，暗黙の一時変数のように使いたかったのでこのようなやり方になりました．

Darkmatter Core/NotebookはDarkmatterをコード実行サーバとWebアプリケーションに分割し，コードベースを捨て去って一から書き直しているものです．
これはリファクタリングと少しの修正を含んでいて，基本的にDarkmatterとの互換性はありません．
Darkmatterで利用していた形式のノートブックファイルの引き継ぎ措置は用意するつもりなので，今はDarkmatterの方を使うようにしてください．
メッセージ送信

仕事でメッセージをローカルネットワーク内の他端末へ送る必要があった。

それもメッセンジャーのような双方向ではなくある一方から指示用に送るだけ
ツールまでの必要はなくともバッチを作ることとなった。

windows7の端末でmsgコマンドを実行して指定の端末へ一斉送信するだけの簡単なものだったけど
セキュリティ関係の絡みもあり、詰まったのでメモ。

※ハッキリしてないので間違いもあるかも

どうやらwindows7ではwindows10とは少し制限が異なるらしく
単純に
msg * /server:IPアドレス メッセージ文
だけでは送れなかった。

色々調べて、受信端末で
レジストリの変更
リモートデスクトップの許可
起動サービスの確認
ファイアウォールの開放などやってみたけどだめだった

ドメインの関係もあったかもだけど、
成功したのは、
①送信元の端末と送信先の端末で同じユーザでログインしていた場合
②両端末にドメインに参加しているadmin権限のユーザが作成されており、そのユーザでmsgコマンドを実行した場合(送信先はadmin権限のユーザでログインする必要なし)
の2パターン

しかし、ユーザは端末ごとに別でログインしたい、送信元はadmin権限のユーザにしたくない(adminユーザのパスワードも教えたくない)
という状態で手詰まり

どうにかこの問題を解消できないか、模索中。。。セキュリティ厳しいっす。
Raspberry Pi 3 にROS kinetic をインストールしてみました。

RaspberryPi3にROSを入れて動かしてみたかったのでやってみました。
基本的には[Installing ROS Kinetic on the Raspberry Pi](http://wiki.ros.org/ROSberryPi/Installing%20ROS%20Kinetic%20on%20the%20Raspberry%20Pi) の通りです。

#環境
RaspberryPi3 Model BにRaspbianを入れた状態です。(秋葉原の千石電商さんで購入したスターターセットです)
microSDは16GBのものを使ってます。
今回の内容は基本的に[この記事](https://qiita.com/utahkaA/items/126f93c3d73c4f5269e2)を参考にさせていただきました。

#準備
###0 はじめに
まずはRaspberryPi3を起動してWifiの接続をしておきます。
この部分についてはより詳しい説明がネットにごろごろ転がっていると思うので割愛させてもらいますね。

###1 CLIの有効化
RaspberryPi3の起動をCLIにしておきます。CLIというのはCommand Line Interface のことです。
これにしておくとRaspberry Pi を起動したときにデスクトップではなく、 CLIが起動してすぐにコマンドを打ち込むことができます。
設定>RaspberryPiの設定>システム で
BootをデスクトップではなくCLIに変更しましょう。

###2 localの変更
またlocalの設定も変えておきます。
設定>RaspberryPiの設定>ローカライゼーション>ロケールの設定 から
言語をen(English)、国をUS(USA)、文字セットをUTF-8
に変更します。

###3 dirmngrのインストール
最後にdirmngrのインストールを行っておきます。
私がROS kineticのインストールを行う際にdirmngrがないと言われたので、インストールしました。
(ここについては私もよくはわかっていないのでコメント等で教えていただけると嬉しいです)

```bash:terminal
$ sudo apt-get install dirmngr --install-recommends
```

###4 再起動
先ほど最後にと言っていましたが、ここでupdateとupgradeも行っておきましょう。
またインストールのために再起動もしておきます。

```bash:terminal
$ sudo apt-get update
$ sudo apt-get upgrade
$ sudo reboot
```

これでインストールの準備は終了です。


#ROS kinetic のインストール
それではROS kineticのインストールをやっていきます。
[Installing ROS Kinetic on the Raspberry Pi](http://wiki.ros.org/ROSberryPi/Installing%20ROS%20Kinetic%20on%20the%20Raspberry%20Pi) 通りに行えば大丈夫だと思います。
再起動した後のCLIで次のように打ち込んでいきましょう。

###1 ROSレポジトリのセットアップ

```
$ sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'
$ sudo apt-key adv --keyserver hkp://ha.pool.sks-keyservers.net:80 --recv-key 421C365BD9FF1F717815A3895523BAEEB01FA116
```
###2 Debianのパッケージを最新のものに

```
$ sudo apt-get update
$ sudo apt-get upgrade
```
###3 Bootstrap Dependenciesのインストール

```
$ sudo apt-get install -y python-rosdep python-rosinstall-generator python-wstool python-rosinstall build-essential cmake
```
###4 rosdepの初期化

```
$ sudo rosdep init
$ rosdep update
```
###5 ワークスペースの作成

```
$ mkdir -p ~/ros_catkin_ws
$ cd ~/ros_catkin_ws
```
###6 ROS_Comm
ROS_CommはGUIツールのないものとなってます。
rqtやrvizなどのものはRaspberryPiでは使わないと思うのでDesktopのほうは行ってません。

```
$ rosinstall_generator ros_comm --rosdistro kinetic --deps --wet-only --tar > kinetic-ros_comm-wet.rosinstall
$ wstool init src kinetic-ros_comm-wet.rosinstall
```
###7 依存関係にあるファイルのインストール

```
$ cd ~/ros_catkin_ws
$ rosdep install -y --from-paths src --ignore-src --rosdistro kinetic -r --os=debian:jessie
```
###8 ワークスペースのビルド

```
$ sudo ./src/catkin/bin/catkin_make_isolated --install -DCMAKE_BUILD_TYPE=Release --install-space /opt/ros/kinetic -j2
```
###9 最後に
.bashrcにsetup.bashを読み込むように書きます。
これでこれからはターミナルを立ち上げたら、rosが使えるようになります。

```
$ source /opt/ros/kinetic/setup.bash
$ echo "source /opt/ros/kinetic/setup.bash" >> ~/.bashrc
```

ここまで長かったかと思いますが、これでインストールは完了です。
最後に確認のためにターミナルで ``` roscore```と打ってみましょう。
問題なく動いていれば大丈夫です。

#終わりに
これでROS kinetic のインストールはできたはずなので、いろいろと作って遊んでみましょう。かくいう私はこれからハードのほうを作っていく予定です。それについても何か記事を書ければと思ってます。

何か間違いなどありましたらコメントお願いします。

最後までご覧いただきありがとうございます。
AnsibleでGCP のVMインスタンスを操作する


# やりたいこと

Ansibleを利用してGCPのインスタンスを操作するさいに、Dynamic Inventoryの機能でインスタンス名を動的に取得する

* Dynamic Inventoryの機能を使わないとインスタンスのIPアドレスをhostsに登録しておかないといけないです。
* Cloud上のサーバを扱うためには一般的な方法（Cloud上のサーバはすぐアドレスが変わる）
* AnsibleのContrib/inventoryに様々な接続先のスクリプトが用意されている
* `ansible-playbook -i AAAA` としてスクリプトを指定する使い方が一般的


# 準備

## 必要なファイルの導入

この環境は Cloud Shellを利用しています
* https://qiita.com/tokida/items/5fd4e50f6d983b9c52f6


```shell
pip install apache-libcloud
pip install pycrypto
```

## Inventoryファイルのダウンロード

```shell
cd /tmp
git clone https://github.com/ansible/ansible.git
cp -p ansible/contrib/inventory/* ~/ansible/inventory/
chmod +x ~/ansible/inventory/gce.py
```

ここではスクリプトを全部コピーしておきます。実際には今回は `gce.ini` と `gce.py` の2つだけです。

## Inventoryの設定

* http://docs.ansible.com/ansible/latest/guide_gce.html

### GCP上でのサービスアカウントの追加

コンソールのメニューから「サービスアカウント」を選択します。

![Kobito.WI59U6.png](https://qiita-image-store.s3.amazonaws.com/0/11540/eafa3d3c-e309-9e73-7ad8-5138e1de4b22.png "Kobito.WI59U6.png")

新規のサービスアカウントを追加します。
* 役割はもっと制限していてもよいのかと思います。
* キータイプはp12形式でダウンロードします。

![Kobito.dQKU7b.png](https://qiita-image-store.s3.amazonaws.com/0/11540/ad1c6c09-caea-c79c-3a14-d730d96339a8.png "Kobito.dQKU7b.png")


ダウンロードしたファイルはp12形式 (`My\ First\ Project-3354799cb138.p12P`) なのでlibcloudで読み込めるpem形式へ変換します。ここでは `~/ansible/credentials/` ディレクトリを作成しその中にpkey.pemを保管します。
 
   
```shell
openssl pkcs12 -in My\ First\ Project-3354799cb138.p12 -passin pass:notasecret -nodes -nocerts | openssl rsa -out ~/ansible/credentials/pkey.pem
```

libcloudで利用する認証情報ファイル `~/credentials/secrets.py` を作成します。


```python
GCE_PARAMS = ('ansible@focused-code-188506.iam.gserviceaccount.com', '~/ansible/credentials/pkey.pem')
GCE_KEYWORD_PARAMS = {'project': 'focused-code-188506', 'datacenter': ''}
```

* project idは、サービスアカウントIDの @からiamの間の文字列です。

# 使用してみる

## Inventory 情報の取得

```
./ansible/inventory/gce.py --list  | jq .
```

この結果を見ると、GCE上のネットワークタグが利用できることがわかります。


```json
  ],
  "tag_web": [
    "wp02"
  ],
  "tag_https-server": [
    "wp02"
  ],
  "f1-micro": [
    "wp02"
  ],
  "status_running": [
    "wp02"
  ],
  "tag_http-server": [
    "wp02"
  ],
```

このように `tag_` が付いた状態で見えます。これは ansible でグループとして指定することが出来ます。

## 実行

今回はInstanceが2台あるとします。

```
$ gcloud compute instances list
NAME  ZONE               MACHINE_TYPE  PREEMPTIBLE  INTERNAL_IP  EXTERNAL_IP    STATUS
wp01  asia-northeast1-a  f1-micro                   10.146.0.2   35.200.11.2xx  RUNNING
wp02  us-east1-b         f1-micro                   10.142.0.2   35.227.19.2xx  RUNNING
```

この状態でどちらにもネットワークタグ`web`がついているとします。


```shell
$ ansible -i inventory/gce.py tag_web --private-key=~/.ssh/google_compute_engine  -m ping
wp01 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}
wp02 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}
```

* 実行する際に ssh_keyを指定

# まとめ

* inventoryを利用することでgceのinstance名を利用して ansibleが利用することが出来ます。
Ancient C探訪記：キーワード編

**おことわり**： この記事では「1975年頃のC言語」仕様を解説します。2017年現在のC言語仕様とは異なるため、あなたのC言語ライフには役立たないことを予めご承知おきください。

（本投稿は [Ancient C探訪記](https://qiita.com/yohhoy/items/6631443736ab779d3fbb) シリーズの一部です。）

手始めに、違いが一番分かりやすい「キーワード(keyword)」から見ていきましょう。

# Ancient Cのキーワード
"[C Reference Manual][cman]" §2.3 Keywords より一覧を引用します。今日でもお馴染みのキーワードが並んでいるかと思います：

> The following identifiers are reserved for use as keywords, and may not be used otherwise:
>
> ```
> int         break
> char        continue
> float       if
> double      else
> struct      for
> auto        do
> extern      while
> register    switch
> static      case
> goto        default
> return      entry
> sizeof
> ```


## 幻の`entry`キーワード
リストをよく見ると、一つだけ **`entry`** という見慣れないキーワードが混じっています。

> The `entry` keyword is not currently implemented by any compiler but is reserved for future use.

Ancient C時点でも実装は存在せず “将来のために予約” となっていました。[StackOverflowでの回答](https://stackoverflow.com/q/254395/684921)によると、`entry`は “関数に対して複数のエントリポイントを定義可能とする” ためのキーワードだったようです。
> Q: What was the entry keyword mentioned in K&R1?
> A: It was reserved to allow functions with multiple, differently-named entry points, but it has been withdrawn. 

少々意味を取りづらいですが、`return`文を用いて関数からの出口を複数記述できるように、ある関数への複数の入り口(entry point)を記述できるようにしたかったのでしょう。SUGEE。

同キーワードはANSI C以降の標準規格には存在しませんから、結局そのままお蔵入りしたようです。当時のCコンパイラでも未実装に終わった様子ですし、構造化プログラミングという観点からもさすがに柔軟性が高すぎると判断されたのでしょう。


## 標準規格との差分
次は Ancient C 時点では定義されておらず、標準規格（ANSI C、C90）に存在するキーワードを列挙します：

- `unsigned`
- `signed`
- `short`
- `long`
- `void`
- `const`
- `volatile`
- `typedef`
- `enum`
- `union`

いかがでしょう。感想は人それぞれだとは思いますが、意外なキーワードがリストにあるかもしれませんね。

適当に明日以降につづきます。

[cman]: https://www.bell-labs.com/usr/dmr/www/cman.pdf
[Laravel]チャット作成記(未完成)：Fakerを使ってSeeder

こんにちは。チャットアプリを作ってます。

前回はテーブルを作りました。今回はそのテーブルにレコードを挿れる事が出来るかどうかを調べる為にseederを使って確かめていきます。

##Seederを使いましょう

まずターミナルかなにかで、以下のコマンドを打ちましょう。

```
php artisan make:seeder PeopleTableSeeder
```
database/seed/
のなかにPeopleTableSeederが生成されたと思います。
ではPeopleTableSeederに偽レコードを挿れていきましょう。
手順としては
①変数$paramに配列を挿れて
②DB::table('people')->insert($param);でtableに一つずつ挿れていきます。

``````php:PeopleTableSeeder.php
<?php
use Illuminate\Support\Facades\DB;
use Illuminate\Database\Seeder;
class PeopleTableSeeder extends Seeder
{
    public function run()
    {
        $param = [
          'name' => 'taro',
          'mail' => 'aaa@aaa.jp'
          'age' => 12,
        ];
        DB::table('people')->insert($param);
        $param = [
          'name' => 'ziro',
          'mail' => 'iii@iii.jp'
          'age' => 14,
        ];
        DB::table('people')->insert($param);
        $param = [
          'name' => 'saburo',
          'mail' => 'uuu@uuu.jp'
          'age' => 15,
        ];
        DB::table('people')->insert($param);
        
    }
}
```

あとは同じdatabase/seedsの中にあるDatabaseSeeder.phpにseederの呼び出しを設定しなければなりません。下記のように書けば、呼び出せるようになります。

``````php:DatabaseSeeder.php
<?php
use Illuminate\Support\Facades\DB;
use Illuminate\Database\Seeder;
class DatabaseSeeder extends Seeder
{
    public function run()
    {
        $this->call(PeopleTableSeeder::class);
    }

`````

あとは

```
php artisan db:seed
```
を打てば先程の$paramの中身がテーブルに保存出来ると思います。簡単ですね。

##Faker
上記の$paramに一つずつ挿れていく方法ですが、テーブルに挿れたい数が100や1,000となった場合はとてつもない労力が必要になってしまいます。そこでFaker&Factoryを使って楽にテーブルに偽レコードを挿れていきます。
下記ではfakerを使って、偽レコードを10個 artisanコマンドを打つ度に生成しています。


``````php:PeopleTableSeeder.php

<?php

use Illuminate\Database\Seeder;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\DB;
use Faker\Factory as Faker;
use Carbon\Carbon;
use App\Person;

class PeopleTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */

    public function run()
    {
        DB::table('people')->delete();
        $faker = Faker::create('ja_JP');
        for($i=0; $i < 10; $i++)
        {
          DB::table('people')->insert([
              'name' => $faker->unique()->userName(),
              'email' => $faker->unique()->email(),
              'password' => bcrypt('1234'),
              'created_at' => Carbon::today(),
          ]);
        }
    }
}

``````
そして最初のDB::table('people')->delete();でコマンドを打つ度にテーブルを初期化しています。
後はartisanコマンドを打てば偽レコードがテーブルに挿入されると思います。これで楽に何個も偽レコードを作れるようになりました。

##参考URL
https://qiita.com/yu_eguchi/items/9af6eed45e14505f6ecc
http://www.dn-web64.com/archives/web/factory_faker/
https://github.com/fzaninotto/Faker
Python 2.7でGeoIP を使う

# GeoIP
IPアドレスから国，市区町村，緯度経度などを調べることができる．

# 手順
## GeoIPのデータベースをダウンロード
* 好きなディレクトリで

```
wget http://geolite.maxmind.com/download/geoip/database/GeoLite2-Country.mmdb.gz
gunzip GeoLite2-Country.mmdb.gz
wget http://geolite.maxmind.com/download/geoip/database/GeoLite2-City.mmdb.gz
gunzip GeoLite2-City.mmdb.gz
```

## コード
* GeoIPのデータベースをダウンロードした場所で
    * 自分はとりあえず同じ階層に置いた

```python
# -*- coding: utf-8 -*-
import geoip2.database

ip = raw_input()

reader = geoip2.database.Reader('./GeoLite2-City.mmdb')
data = reader.city(ip)

print ("IP Address: ", ip)
print ("Country:", data.country.name)
print ("Subdivisions: ", data.subdivisions.most_specific.name)
print ("City: ", data.city.name)
print ("Latitude: ", data.location.latitude)
print ("Longitude: ", data.location.longitude)
```

## 使い道
* 正直，使ってはみたものの普通にwhoisコマンドで検索したほうが早いです．
* 自分はハニーポットの運営をしていたので，IPアドレスを列挙したログに対してGeoIPを使ってました．
ファイルの文字コードを推定するコマンド(Mac)

#概要
ファイルの文字コードを推定するコマンドを調べた。

#環境
os: maxOS Sierra Version 10.12.6
terminal: iTerm2 Build 3.1.5

#内容
```bash:ターミナル
$ file --mime tmp.txt
tmp.txt: text/plain; charset=utf-8
```
tmp.txtのcharsetが`utf-8`であることが推定された。

#詳細
##文字コードを推定するためのファイルを作る
```bash:ターミナル
$ cat <<EOF > tmp.txt
heredoc> こんにちは
heredoc> 世界
heredoc> EOF
$ cat tmp.txt
こんにちは
世界
```
tmp.txtというファイルを作成した。

##文字コードを推定する
```bash:ターミナル
$ file --mime tmp.txt
tmp.txt: text/plain; charset=utf-8
```
**tmp.txtのcharsetは、utf-8となっていると推定された。**
（charsetとは、character setのことで、コンピューターの文字コード系のことらしい？[2]）

##fileコマンドの--mimeオプションの確認
```bash:ターミナル
$ file --help
Usage: file [OPTION...] [FILE...]
Determine type of FILEs.
（中略）
  -I, --mime                 output MIME type strings (--mime-type and
                               --mime-encoding)
（以下略）
```
`--mime`は、MIMEタイプの文字列を出力するためのオプションらしいと分かった。
（今回は、`--mime-type`が`text/plain`で、`--mime-encoding`が`utf-8`のようだ）
>マイム【MIME】［multipurpose Internet mail extensions］
電子メールで、文字のほか、画像や音声、動画などさまざまなデータを転送するための規格。[3]

#意義
文字コードを推定の仕方が分かった。

#おまけ
同じ環境で、半角英数字のみでファイルを構成すると、`us-ascii`と推定される。

```bash:ターミナル
$ cat <<EOF >tmp.txt
heredoc> hello
heredoc> 123
heredoc> EOF
$ file --mime tmp.txt
tmp.txt: text/plain; charset=us-ascii
```
これは、utf-8が半角英数字ではus-asciiと同じエンコーディングを採用しているからではないかと思っています。（関連：[4]）

#参考文献
[1]http://fukuyama.co/file-i-mime
[2]https://eow.alc.co.jp/search?q=character+set&ref=wl
[3]https://kotobank.jp/word/MIME-8967
[4]https://ja.wikipedia.org/wiki/UTF-8
Validationクラスを使って、簡単に予約フォームをチェック


## やりたいこと
シンプルな予約フォームを作りたいです。ルールは
1.利用開始日は登録当日よりですので、過去日付を指定できません。
2.利用可能なのは利用開始日より15日間です。

## バリデータの生成
```php

public function store(Request $request)
{
    $rule = [
        'start_at'  => 'required|after_or_equal:today',
        'finish_at' => ['required', 'after:start_at'],
    ];

    // 利用開始日
    $strat_at = $request->get('start_at');
    $start_at = Carbon::parse($strat_at);

    // 利用終了日
    $finish_at = $start_at->addDay(15)->format('Y-m-d');
    $rule['finish_at'][] = "before:{$finish_at}";

    $validator = Validator::make($request->all(), $rule);

    if ($validator->fails()) {
        return redirect('post/create')
            ->withErrors($validator)
            ->withInput();
    }

    // 保存処理…
}
```

## ポイント
1.`after`は指定した日付より後のことです。（指定した日含まない）
2.`after_or_equa`は指定した日付以降のことです。（指定した日含む）
3.`before`は指定された日付より前のことです。（指定した日含まない）
4.`$start_at->addDay(15)`は15日後のことです。

## 最後に
意外と簡単にできました。
上記の方法以外にいい方法があったら教えてください。
swiftでfirebaseの追加、更新、削除


## 前提

```swift
class ViewController: UIViewController {

    // インスタンス変数
    var DBRef:FIRDatabaseReference!

    override func viewDidLoad() {
        super.viewDidLoad()

        //インスタンスを作成
        DBRef = FIRDatabase.database().reference()
    }
}
```

## データ追加
指定先と同じ階層のは消える。つまり、sampleの他に同じ階層にデータがあったら更新されて削除される。

```swift
let data = ["sample": "add_data"]
DBRef.child("hoge/foo").setValue(data)
```
<img width="329" alt="スクリーンショット 2017-12-11 22.37.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/195882/35a3c9de-4bb7-de95-6416-e9c7f86bf50f.png">

## 更新
`setValue`だと同じ階層のものが消えてしまうので、`updateChildValues`を使用

```swift
let data = ["update": "updata_data"]
DBRef.child("hoge/foo").updateChildValues(data)
```
<img width="387" alt="スクリーンショット 2017-12-11 22.47.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/195882/16b25934-73c9-d4c2-7cfe-50757a59816e.png">

## 削除

```swift
DBRef.child("hoge/foo/update").removeValue()
```

## データ取得

```swift
let defaultPlace = DBRef.child("hoge/foo/sample")
defaultPlace.observe(.value) { (snap: DataSnapshot) in 
    //処理したい内容
　　print((snap.value! as AnyObject).description)}
```
[PHP] ScrapboxAPIを使って最新の投稿を取得する

## Scrapboxについて
Scrapboxは情報を記録するためのサービスです。
技術的な知識やデザインの知識をはじめ、近くのカフェの情報などなんでも記録できます。
Evernoteとは違い、テキスト中にソースコードを綺麗に表示できる機能などもあったりします。
自分は今後、Scrapboxを技術メモとして使う(使っていく予定)です。
<img src="https://qiita-image-store.s3.amazonaws.com/0/134076/8c3d24ba-2175-2700-c306-06286f901584.png" width=70%>

## APIを簡単に試す
まずはcurlコマンドを使って試してみます。
ページリストの取得には、以下にリクエストを送ればOKです。
`https://scrapbox.io/api/pages/:projectname`
認証などは必要なくとても簡単です。
他のAPIなどは[こちら](https://scrapbox.io/help-jp/API)をチェック！
実際に実行してみた結果を以下にようになります。[^1]

```
$ curl https://scrapbox.io/api/pages/yoneda
{
    "count": 4,
    "limit": 100,
    "pages": [
        {
            "accessed": 1512993738,
            "commitId": "5a2e6b50369e800014366dcd",
            "created": 1512985147,
            "descriptions": [],
            "id": "5a2e522e369e8000143662f0",
            "image": null,
            "linked": 0,
            "pin": 0,
            "point": 19,
            "title": "AWSEC2\u3067\u30c7\u30a3\u30b9\u30af\u5bb9\u91cf\u306e\u4f7f\u7528\u7387\u3092\u898b\u308b",
            "updated": 1512991568,
            "user": "5a0b16bc5fccc70014d542be",
            "views": 18
        },...
```

## APIで最新の投稿を取得
phpで最近投稿されたノートのタイトルを表示します。
cURLモジュールを利用しています。

```scrapbox.php
<?php
// cURLモジュールを使ってAPIにリクエストを送る
$url = "https://scrapbox.io/api/pages/yoneda/?limit=3";
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url); // urlを設定
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "GET"); // GETリクエストにする
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);  // 変数に情報を返す(これがfalseだとコンソールに値が出力されてしまう)
$results = curl_exec($curl);
curl_close($curl);

// タイトルを表示
$decodedResults = json_decode($results);
$pages = $decodedResults->pages;
for($i=0; $i<count($pages); $i++){
  $title = $pages[$i]->title;
  print($title."\n");
}
?>
```

```
$ php scrapbox.php
AWSEC2でディスク容量の使用率を見る
コマンドラインでjsonを整形する方法
powerpointのスライドのサイズ
```

[^1]: 2017年12月時点での取得結果です。
LINEスタンプをAnimateCCで作った話

アニメーション付きのLINEスタンプを[Adobe AnimateCC](http://www.adobe.com/jp/products/animate.html)で作りました。
その利点や作り方、作ってみての反省などを書きました。


## つくったスタンプ
『スーパー悲しい 1.0』
https://store.line.me/stickershop/product/1783630

![alt](http://78.media.tumblr.com/2de99bcc67d5baa24939ba4d3c0fbace/tumblr_ozz18mRLtW1t1xi2oo1_400.gif)

**ソースファイル**
https://github.com/kitasenjudesign/linesticker_supersad


## なぜこれをつくったか
見慣れた絵文字をいろいろな動かし方をしたら面白いのではないか、というアイデアからでした。一番使われているといわれていて、みんな知ってるであろうこの絵文字→:joy:に様々な変な動きをつけたら、面白いのではないか、と考えたんです。

しかし、何度か挑戦したんですが、既存の絵文字を使ったスタンプはリジェクトされてしまいました。なので結局自分で描きました。（だから元ネタはまったくわからなくなってしまった・・:joy:）

スタンプは8個から申請可能です。権利が微妙そうなやつは、8個でやってみて申請が通ったらフルバージョンを別で作り直す、という方法が良いと思います。

## なぜアニメーションを付けるのか
私は画力はまったくないのですが、絵はイマイチても、アニメーションを付けることで個性が出たり、完成度を高めることができることがあると思います。
画力と別のベクトルで勝負できるようになります。

## なぜAnimateCCなのか
AfterEffectsやPhotoshopにくらべて、

* 使い方が簡単。
* プレビューが軽く、トライアンドエラーしやすい。
* フレーム単位の調整や、部品の位置調整が容易。
* トゥイーンという機能で、全コマ、コマアニメを描かなくても部品だけ動かせばそれなりにアニメーションができるため、コマアニメよりコスパがいいし、簡単。

以上の理由より、爆速で作ることが可能です。

欠点は、エフェクトや画像処理に弱いとか、3Dは扱えないことだと思いますが、LINEスタンプにおいてはそんなに気にならないと思います。


## 作り方

ICSさんの記事を超参考にしました。これを見ればわかります。ありがとうございます！
https://ics.media/entry/12268

#### AnimateCC ファイル
細かな作り方はここでは書きませんが、今回24個のスタンプを作りました。私は１つの.flaファイルの中に24個ムービークリップを作り、１つずつ書き出していきました。

![](https://i.gyazo.com/2b2a838025558b8501fe60f20e5b3fc7.gif)

このように24個をルートのタイムライン上において、ステージ部分に書き出したいムービークリップを移動し、書き出す、ということを繰り返しpng連番を書き出しました。

**ソースファイル**
https://github.com/kitasenjudesign/FlashLineStickerSuperSad

#### APNG化
最終的にはPNG連番をAPNGというファイル形式に変換します。これもICSさんの記事で紹介されている[アニメ画像に変換する君](https://ics.media/entry/12746)がとても使いやすかったです。

プログラマーならffmpegを使う方もいるかもしれませんが、このツールを使うとプレビューしならがらFPSとループ具合を確認出来て、試行錯誤がしやすいところが良いところだと思いました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17747/a9ce96dc-5e0e-c4e8-cda6-f616025eb340.png)


## アニメーションスタンプの欠点
アニメーションスタンプは楽しいんですが、販売の最低価格が240円～です。静止画のスタンプは120円～なので、購入のハードルがちょっと高いかもしれません。


## スタンプの反省点
面白い動きを付けたつもりなのですが、売れてるものはもっと異常というかインパクトのあるような動きな気がします。ちょっとパンチが弱いかもなーって思いました。

まあ、その前に知名度もフォロワーもまったくいない自分が、どうやって告知するか。というのが難しい気がしますが。良し悪しではなく知られもしないので。

![alt](http://78.media.tumblr.com/2de99bcc67d5baa24939ba4d3c0fbace/tumblr_ozz18mRLtW1t1xi2oo1_400.gif)
https://store.line.me/stickershop/product/1783630

もし気に入ったら買ってください:joy:
日付をプルダウンで表示する。(javascript)

![スクリーンショット 2017-12-11 22.56.57.png](https://qiita-image-store.s3.amazonaws.com/0/185846/12968ddb-96a1-c443-00f6-ef375cc373c3.png)

忘れっぽいので、メモとして残しておく。

###HTML
```date.html
<html>
<head>
<meta charset="utf-8" />
<script src="getDate.js"></script>
</head>
<body>
<b>今日の日付</b><br />
<a id="year"></a><a id="month"></a><a id="day"></a>
</body>
</html>
```

###Javascript
```getDate.js
window.onload = function getDate(){
	var yyyy, mm, dd, today
	today = new Date();
	yyyy = today.getFullYear();
	mm = today.getMonth() + 1;
	dd = today.getDate();
	
	//年
	$Year = "<select>";
	for( var i=2000; i<=2030; i++ ){
		if( i == yyyy){
			$Year += "<option value=\"" + i + "\" selected >" + i + "</option>";
		}else{
			$Year += "<option value=\"" + i + "\" >" + i + "</option>";
		}
	}
	$Year += "</select>";
	document.getElementById("year").innerHTML = $Year + "年";
	
	//月
	$Month = "<select>";
	for( var i=1; i<=12; i++ ){
		if( i == mm){
			$Month+= "<option value=\"" + i + "\" selected >" + i + "</option>";
		}else{
			$Month+= "<option value=\"" + i + "\" >" + i + "</option>";
		}
	}
	$Month += "</select>";
	document.getElementById("month").innerHTML = $Month + "月";
	
	//日付
	$Day = "<select>";
	for( var i=1; i<=31; i++ ){
		if( i == dd){
			$Day+= "<option value=\"" + i + "\" selected >" + i + "</option>";
		}else{
			$Day+= "<option value=\"" + i + "\" >" + i + "</option>";
		}
	}
	$Day += "</select>";
	document.getElementById("day").innerHTML = $Day + "日";
}
```
UNIXコマンド入門 3/3

●管理者ユーザになってみる

ケース：システムのログを見たい時
cat /var/log/messages

方法１：
su    substitute user というコマンドで任意のユーザに変更可能。単にユーザーを切り替えるだけで、現在のディレクトリの位置や、もろもろの環境変数をそのまま引き継ぐことになります。
su -l とすると、root ユーザーとしてログインし直してくれる。
※l は省略できるので su - で使うのが一般的

パスワードはローカル環境の場合はvagrantでok

*ただルートユーザの影響力が強いので、
マンド単位で「このコマンドは管理者ユーザーとして実行してね」という方法がよく使われる。

方法２
vagrantユーザから、コマンドの前に
sudo をつければok。

sudo を使えるようにするには特殊な設定が必要だが、
*ローカル開発環境のレッスン通りセットアップしていれば 
vagrant ユーザーにはすでにそうした設定がされている。
sudo cat /var/log/messages

●chownを使ってみよう
例えば、ログファイルの解析で編集したいとき
コピーして編集したいが、権限がないのでうまく行かない。

このときも
sudo cp /var/log/messages
でいい。

ただ、編集するにはどうするか。
いちいちsudoをつけてもいいが、
ファイルの所有者を変えることができる。
chown コマンド（change owner）
sudo chown vagrant: vagrant messages  messagesのユーザとグループ名をそれぞれvagrantにしてくれる。

●wc､head､tail､grepを使ってみよう
テキストを操作するためのコマンドを学ぶ
-wc(word count)...行数や単語数を教えてくれる
wc messages
-->1753  20332 144503 messages (行数、単語数、バイト数、ファイル名の順)
wc -l messages...で行数のみの表示も可能

-head と tailファイルの先頭や末尾の何行かだけを見たい、という時に使える。
head messages
最初の３行だけであれば
head -n 3 messages　or head -3
（tailも同様の使い方）

-grep...ファイルの中身から特定の単語を検索するためのコマンド
grep 'etc' messages...etcを含む行を見つけることができる。

●リダイレクション・パイプを使おう
リダイレクション”＞”・・・あるコマンドの結果をファイルに保存したり、ファイルの内容を他のコマンドに
渡すことができる。
echo "date" > cmd.txt
-->date が cmd.text　に書き込まれる
*>では上書き、>>では末尾に追記してくれる。

＜を使うとファイルの内容をコマンドに渡すこともできる。

*dateもBashコマンドなので、bash に今回渡して実行してみる、
bash < cmd.txt とすると、date の出力結果が表示される。

またこの結果を別のファイルに保存することもできる。

bash < cmd.txt　>result.txt
*result.txtに出力結果が保存される。

パイプ・・・コマンドの結果をファイルではなく別のコマンドに渡す
ls -l /etc | grep "php"
*ls -l/etc の結果の中からphpの含まれる行を抜き出す。

またパイプは複数組み合わせることもでき、
ls -l /etc | grep "php"　｜ wc -l
とすると結果の行数を返してくれる。

リダイレクション、パイプにより複雑なことも１行でかけるのがポイント

●ワイルドカードを使おう
特定の条件をつけて操作をする場合に有効

例； ls /l/etc*.conf
*etcフォルダの中でも.confのものだけ引っ張ってきてくれる。

また、上記の＊マークは何文字でも、という意味だが、なんでもいいから一文字だけ、
という場合は？マークを使う、

例； ls /etc/c？？.*
*cの後に二文字続き、その後に.があって任意の拡張子になる結果だけ表示される。

●find , xargs を使おう
ケース；/etc フォルダからhttp に関する設定ファイルを探したい時
find /etc -name "http*"
*ファイル名で指定したい時はname を使う。
許可がない時はsudoを使うことは忘れない。

find にはたくさんのオプションが用意されており、
ディレクトリを除いてファイルだけを検索したい場合は、
find /etc -name "http*"　-type f でおk。

さらにそのファイルに対して別のコマンドを実行したい場合は、

find /etc -name "http*"　-type f -exec wc -l {} +

{}のなかに検索結果を入れて実行してくれる。
この場合、行数がカウントされる。

xargs；findの検索結果に限らず、複数の結果をコマンドに流し込める、

上と同じ処理をしたい場合、pipeを使って以下のような書き方もできる。
find /etc -name "http*" -type f | xargs wc -l 


●ブレース展開を使おう
bashのブレース{}展開

bashでは、{}のなかにカンマ区切りで値を入れると、それを展開してくれる。
例えば echo {a,b,c} とすると、 a b c が展開される。
連番も表現できて echo {1..10} とすると　1 2 3 .....
アルファベットを組み合わせたい時は、
echo {1..10}{a..g} とすると　1a 1b 1c....と展開してくれる。

＊2つのコマンドを連続して実行したい時、
一つのコマンド　＆＆　もう一つのコマンドで一気に二つを実行してくれる。

例：
mkdir app {1..5} app の１から５までが作られる
touch app{1..5}/test{1..3}{.txt,.jpeg,.gif}　　でappfileのなかにtest1 から３でそれぞれの拡張子がついたファイルができる。

このできたファイルの中でjpeg　とgifだけ削除したい。　そんな時もプレース展開が使える。
 rm app{1..5}/test{1..3}{.jpeg,.gif}
最小限のコード変更でchainerの学習曲線を監視する

## はじめに

*皆さんはDLをまわしているときどうしていますか？* 論文を読む、酒を飲む、寝る、など色々とあると思いますが、自分は我慢ができない質なので損失曲線をちらちら眺めるのが好きです。ただ、chainerには残念ながらデフォルトの可視化ツールがついていません。[^1] そこで、本記事では最小限のコード変更でchainerの学習曲線を監視する方法を紹介します。

本記事は、[Chainer Advent Calendar 2017](https://qiita.com/advent-calendar/2017/chainer)の12日目です．

## やること

PyPIから私謹製のライブラリをインストールします。

```shell:shell
pip install chainerboard
```

そして、trainerに`LogReport`を追加します。

```python:python
trainer.extend(extensions.LogReport(log_name='my_log_data')))
```

そして、

```shell:shell
chainerboard path/to/output/my_log_name
```

としたうえ、http://localhost:6006/ を開くと下記のような学習曲線を見ることができます。

![screenshot1.gif](https://qiita-image-store.s3.amazonaws.com/0/152362/b4b392ce-61b6-ebef-68a1-0887c8f34d96.gif)

ウェブアプリベースなのでリモートサーバで立ち上げて、それをみることもできます。[^2]
またPlotlyベースなので、拡大やら、画像へのエキスパートなどが簡単にできます。

### ヒストグラムも監視する

学習がうまくいかないときなど、データの分布をみることで、重みが大きくなりすぎて不安定になっているだとかを見ることができます。
これも、最小限のコード変更でできて、

```python:python
trainer.extend(extensions.ParameterStatistics(model))
```

を1行足すだけです。

![screenshot2.png](https://qiita-image-store.s3.amazonaws.com/0/152362/45d55f7e-2005-1ee9-870f-8fcb75425b19.png)

ただし、[バグ](https://github.com/chainer/chainer/issues/3027)によって現在GPUを使っているとこの機能は使えません。

## Related Works

この記事を書いていて知ったのですが、Tensorboardをchainerで使えるようにする[tensorboard-chainer](https://github.com/lanpa/tensorboard-pytorch)なるプロジェクトもあるようです。比較をしてみると、

|| [chainerboard](http://chainerboard.readthedocs.io/en/latest/) | [tensorboard-chainer](https://github.com/lanpa/tensorboard-pytorch) |
|----|----|----|
| 任意の数値の監視 | ○ | ○ |
| ヒストグラム | ○ | ○ |
| 計算グラフの可視化 | × | ○ |
| 画像、音声など | × | ○ |
| コード修正の必要 | 小 | 中 |

とまあ、機能的にはtensorboard-chainerのほうが勝っていますが、モデル自体にコードを書き足す必要があるtensorboard-chainerとは一応のすみ分けはできているのかな、と。

### 2017/12/22追記

[Advent Calender 20日目](https://qiita.com/colspan/items/7e9ba3d56c8ffaccdc70)にて公式のChainer UIが公開されました。まさかの痛恨の更新とのネタかぶり笑

## まとめ

~~いつもどおり切羽詰まってしまったせいで~~ chainerboardの使い方が簡単なので随分短い記事になってしまいました。ほとんど変更なしで使えるので、もし可視化が必要な方がいれば使ってみてください。もちろん、[プルリク](https://github.com/koreyou/chainerboard)ウェルカムです。

[^1]: `PlotReport`とかありますが、リアルタイムに監視はできない。
[^2]: 認証とかついていないし、私はウェブプログラム素人なので、セキュリティは自分で担保してください。
初心者向け：コマンドメモ

# はじめに

黒い画面初心者向けに、ちょくちょく使うコマンド集めました。
（ほぼ自分用のメモです）

## ファイルを消去したいとき
このファイルは不要だった、消去したい！そんなときに使うコマンド

```
rm 削除したいファイル名
```

## 強制的にoriginにpushしたいとき
前回pushした履歴がじゃまでpushできない！そんなときに使うコマンド

```
git push -f origin プッシュしたいブランチ名
```

## 文字を一括置換
該当する文字を検索して、一括で置換したい！そんなときに使うコマンド

```
find ./ -name "*" | xargs grep -sl "変更前" | xargs sed -i -e 's/変更前/変更後/g'
```

## 過去に打ったコマンドを探したい
過去に一度打ったけど、コマンドを忘れてしまった…そんなときは過去の履歴を探しましょう。
コマンドの一部を覚えておけば、検索できます。

```
ctrl+r キーワード
```

## コンフリクトの直し方（ファイルごと編）
コンフリクトしてしまった…ファイルごと変更したい場合は、下記のやり方で対応できます。

### 自分の作業内容で完全に上書きする場合
```
git checkout --ours ファイル名
```

### 相手の作業内容を優先する場合
```
git checkout --theirs ファイル名
```

# おわりに
一旦自分用のメモとして記載しました。
更新・修正あれば、随時行っていきます。
AndroidThings & Raspberry Pi3 で猫用扇風機を作る（1）

2017年7月22日に実施された「[東北Tech道場 郡山道場 第4回](https://medium.com/@koriyamadojo/%E6%9D%B1%E5%8C%97tech%E9%81%93%E5%A0%B4-%E9%83%A1%E5%B1%B1%E9%81%93%E5%A0%B4-%E7%AC%AC%EF%BC%93%E6%9C%9F-%E7%AC%AC%EF%BC%94%E5%9B%9E%E9%96%8B%E5%82%AC-7b1ccae09b44)」の作業内容をまとめます。

今回からグループに分かれてAndroidThings & Raspberry Pi3で動作するアプリの開発に取り組むことになりました。私たちのグループでは、「猫用扇風機」を作ることにしました。
簡単に説明すれば、「一定の温度と湿度を超えたら猫に風を当てる扇風機」です。以下の仕様で取り組むことになりました。

- 一定間隔でカメラで室内を撮影する。
- 画像をAIで判別し、猫が写っていて、設定温度と湿度を超えていれば扇風機のモータを回す。このとき、距離センサで猫との距離を測り、離れすぎている場合には扇風機は回さない。
- 猫の画像はクラウド上のストレージに保存し、スマホで確認できるようにする。
- スマホから、温度、湿度、距離は設定できるようにする。
- 扇風機は市販品を改造して作る。

この仕様を元に調べた結果、クラウド上のストレージには「FireBase」を使うことにしました。画像判別AIはこの時点では「ワトソン」を使うつもりでした。（後日、Google Cloud Vision API に変更しました。）

以下、この日に作成したシステム概要図です。

![26.png](https://qiita-image-store.s3.amazonaws.com/0/222292/8c7f5f83-b1a5-9f3f-9ada-bb12fcd0b1b8.png)

第5回に続きます。
ボタンが押されたときに凹んだようにみせるCSS

初歩中の初歩ですが、HTMLとCSSだけで、ボタンがマウスで押下されたときに,凹んだようにみえるように編集してみた。

# 必要なもの

- ボタン本体のHTML
- 何もアクションがない時のボタンのCSS
- ボタンにマウスカーソルが置かれた時のCSS
- ボタンが押下された時のCSS

## HTML
buttonタグを使用します。

```html
<button type="submit" name="submit_button" class="contact_button">送信</button>
```

##CSS

何もアクションがない時のボタンのデザイン

```css
.contact_button{
  display: block;
  background: #aacf53; /* 緑色 */
  color: #fff;
  border: solid 4px #aacf53; /* 緑色 */
  font-size: 1.4em;
  border-radius: 5px;
}
```

ボタンにマウスカーソルが置かれた時のデザイン

```css
.contact_button:hover{
  background: #82ae46; /* 少し濃い緑色 */
  border: solid 4px #82ae46; /* 少し濃い緑色 */
}
```

ボタンが押下された時のでデザイン

```css
.contact_button:active{
  background: #69821b; /* 濃い緑色 */
}
```

## まとめ
ボタンにマウスカーソルが置かれたときのデザインを:hover、ボタンが押下された時のデザインを:activeの擬似クラスを使用することで実現することができる。
凹んだときのボタンの色を設定するポイントは、backgroundよりborderの色を明るい色に設定すること。
C-CEX APIを使ってみた

# C-CEX
* bitzenyを購入するために使われる取引所の一つ．
* 正直，エラーが多すぎて送金とか怖い．

# とりあえず使ってみた
* coincheckみたいにC-CEXもAPIがあるので一応使ってみた．

# 恥ずかしいレベルのコーディング
* めっちゃ適当．
* まあ，自分のメモ書きということで，このレベルでも言いかなということで公開
* Python 3.5.2を使った
    * Python2 使っている人文字コードを合わせる必要あり

# コード
```python3

import os
import requests
import json

url = 'https://c-cex.com/t/prices.json'
url_ex = 'https://www.gaitameonline.com/rateaj/getrate'


def urll():

        response = requests.get(url)
        if response.status_code != 200:
                raise Exception('return status code is {}'.format(response.status_code))
        response_ex = requests.get(url_ex)
        if response_ex.status_code != 200:
                raise Exception('return status code is {}'.format(response_ex.status_code))
        
        price = json.loads(response.text)
        price_ex = json.loads(response_ex.text)

        return price,price_ex
        
if __name__ == '__main__':

        price,price_ex=urll()
        
        
        exchange = float(price_ex["quotes"][20]["ask"])
        price_zny_usd = price['zny-usd']['buy']
        
        print("1znyの値段",'%03.8f' % price_zny_usd,"$")
        zny_price = price_zny_usd * exchange
        print("1znyの値段",'%.2f' % zny_price,"円")
```

# 一応説明
* C-CEXでは日本円では表示されないので，為替情報を取得するAPIを使った．
* APIで使った情報は買値のみ
    * ほかのも表示しようかと思ったけど，今回はとりあえずAPIを使ってみようという感じだったからやめた．(printの型とか超適当)
* まあAPIを使ったことない人には，参考になるかも！
    * API使ったことない人はとりあえずJSONの勉強しよう
コマンドが完了したらGoogle Homeが教えてくれるコマンドを作ってみた

# はじめに
久しぶりにRaspberryPiの環境構築をしていたら、セットアップコマンドの待ち時間がとても長かったので作ってみました。

# セットアップ
野良コマンドなのでこんなかんじで

```
$ git clone https://github.com/siwasu17/gone.git
$ cd gone
$ npm link
```
[google-home-notifier](https://www.npmjs.com/package/google-home-notifier) と [argv](https://www.npmjs.com/package/argv) モジュールが必要になります。
※ 本筋と逸れますが、RaspberryPiでgoogle-home-notifierを利用するときはちょっと手がかかるので[README](https://github.com/noelportugal/google-home-notifier/blob/master/README.md)をご参照ください。

# 使い方
```
$ <command> ; gone
```
と打つと、
コマンド完了後にGoogleHomeがとても流暢な英語で
**Command complete!**
と言ってくれます。
また、完了したコマンド名を引数で伝えてあげることもできます。

```
$ <command> ; gone -c <command name alias>
```

例えば以下だと、sleep command complete! と言ってくれます。

```
$ sleep 10; gone -c "sleep"
```



# 中身
google-home-notifierを叩くだけです、作ったというのもおこがましいレベルｗ

```Javascript:gone.js
#!/usr/bin/env node
const argv = require('argv');
const googlehome = require('google-home-notifier')
const language = 'en';
 
argv.option({
        name: 'command',
        short: 'c',
        type : 'string',
        description :'Additional text to notify',
        example: "'script --command=value' or 'script -c value'"
});

const args = argv.run();
let commandName = args.options.command ? args.options.command : '';
googlehome.device('Google-Home', language); 
googlehome.notify(commandName +  ' command complete!', function(res) {
        console.log(res);
});
```

コマンドラインツール化したいので、package.jsonに少し手を加えています。
作り方は[npm でコマンドラインツール開発事始め](https://qiita.com/takayukioda/items/a149bc2907ef77121229)を参考にさせていただきました。

```json:package.json
{
  "name": "gone",
  "version": "1.0.0",
  "description": "Notify google home of command complete.",
  "bin": {
    "gone": "gone.js"
  },
  "dependencies": {
    "google-home-notifier": "^1.2.0"
  },
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "repository": {
    "type": "git",
    "url": "git+https://github.com/siwasu17/gone.git"
  },
  "author": "siwasu17",
  "license": "MIT",
  "bugs": {
    "url": "https://github.com/siwasu17/gone/issues"
  },
  "homepage": "https://github.com/siwasu17/gone#readme"
}
```

# 作ってみて
GoogleHome先生の英語が流暢すぎて長いコマンドが聞き取れない...orz
Google Apps Scriptのプロジェクトのトリガーの取り扱い

Google Apps Scriptの現在のプロジェクトのトリガーは、分/時/日/週/月タイマー、及び特定の日時が指定できる。

曖昧な時間に実行可能なものはタイマー指定で問題はないが、厳密に実行時間を指定したい場合は特定の日時を指定することになる。
とは言え、トリガーに登録可能な数は最大で20個までである。

例えば、1時間に1回、厳密な時間に実行する処理が必要な場合、24個のトリガーが必要になり、最大20個の制約上、登録ができない。
しかも、トリガーは実行後に削除されず残り続ける。
なので、以下のようにトリガーの削除と登録を行うことで最大20個の制約を回避する。

``` 
// 全登録トリガーを削除
function DeleteAllTrigger() {
  var triggers = ScriptApp.getProjectTriggers();
  for(var i = 0; i < triggers.length; i++) {
    ScriptApp.deleteTrigger(triggers[i]);
  }
}
```

```
// トリガーを登録（12:34に特定の日時で）
var triggerDay = new Date();
triggerDay.setHours(12);
triggerDay.setMinutes(34);
trigger = ScriptApp.newTrigger("TriggerName").timeBased().at(triggerDay).create();
```
HTMLファイル内でPHPを動作させる(さくらサーバ)


#さくらサーバに置いたHTMLファイル内でphpを動作させる方法

さくらサーバだけ他のレンタルサーバと勝手が違ったのメモ

- .htaccessファイルを作成
 - 以下の内容を記載してhtmlファイルがある階層に配置
 - パーミッションは705に設定

　　`Action myphp-script /php.cgi`
　　`AddHandler myphp-script .php .html`

- php.cgiファイルを作成
 - 以下の内容を記載してhtmlファイルがある階層に配置
 
　　`#!/bin/sh`
　　`exec /usr/local/bin/php-cgi`

これで無事HTMLファイル内に記載してあるphpが動作しました。
iOSアプリ内課金でのレシート検証をサーバサイド対応させる


こちらの記事は [iOS2 Advent Calendar 2017](https://qiita.com/advent-calendar/2017/ios2) 11日の記事です。

## はじめに

アプリ内課金(以下、IAP)を実装することがあるかと思います。
その中で、レシートの検証をすることも少なくはないかと思います。
しかし、非サーバサイド経験だとサーバサイドの実装を待たないと検証できないから作業が止まったとかある中でサンプルを紹介できればと思います。(URLRequestでローカル検証したらええやんっていうのはナシで)

## 環境

- Xcode8.3.3
- iOS10.2 Later
- Python3.6.2

## サーバサイド部分開発

サーバサイドのフレームワークは軽い実装なので `bottle` を使用しました。
`pyinapp` というライブラリがあったのですが、定期購読型の対応がされていなかったのでForkして修正したものを今回を取り入れます。(PR出しているのですがマージされる見込みがないので指定でインストールできるようにします。)

```bash
$ pip install bottle
$ pip install git+https://github.com/nnsnodnb/pyinapp
```

```python:app.py
from bottle import default_app, run, route, request, response
from pyinapp import AppStoreValidator, InAppValidationError


# iOSアプリ側からPOSTリクエストを送信する
@route('/receipt', method='POST')
def receipt_validation():
    if 'receipt-data' not in request.json:
        return response(body='Bad Request"', status=400)
    
    bundle_id = 'アプリのBundle ID'
    validator = AppStoreValidator(bundle_id) # bundleはnonnull
    # validator = AppStoreValidator(bundle_id, sandbox=True) # sandboxはdefaultがFalse
    # validator = AppStoreValidator(bundle_id, password='hogehogehgoe') # passwordは定期購読型等で取得するパスワードになります
    
    try:
        purchases = validator.validate(request.json['receipt-data'])
        _process(purchases)
        
        return 'Success'
    except InAppValidationError as e:
        print(e)


def _process(purchases):
    for p in purchases:
        print(p)


app = default_app()


if __name__ == '__main__':
    run(host='0.0.0.0', port=8080, debug=True, reloader=True)
```

```python
def _process(purchases):
    for p in purchases:
        print(p)
```

アクセスURLは上記の場合は `http://<IP_ADRESS>:8080/receipt` となりPOST以外は受け付けません

ここで `print` するときにプロパティは以下がアクセスできます。

- p.transaction_id
- p.product_id
- p.quantity
- p.purchased_at
- p.response

ただし、 `p.response` 以下に関しては辞書型なので適宜対応が必要です。  
`p/response/status` を確認したい場合は `p.reponse['status']` でアクセスします。

レシートの検証が完了したら、とりあえずなんですが、サーバ側から `Success` と返ってきて `StatusCode: 200` とか成功のレスポンスがあるはずなのでそれで以降のiOS側の対応はいけるかと思います。

## 最後に

宣言になってしまうのですが、 DjangoというPythonのフレームワークで使用できる `p.response.status` のように簡単にアクセスできるようになるライブラリプラグインを作成中です。

投稿遅くなってすみません:bow: