OmniAICreator/Qiita-1.07M huggingface dataset:
【まとめ】raspberry piにインストールしておくと便利なツール

今回はraspberry piの環境をより使いやすく&便利にしてくれるオススメのツールを紹介していきます。
方針として、raspberry piのGUIを使って操作するアプリとかはあまり入ってません。
ラズパイをサーバーとして立てた時に必要だよね。便利だよね。って感じの方向性です。

 

#ファイル共有

##netatalk

mac向けのファイル共有サーバー。インストールが簡単。
raspberrypiにファイル（コード）を共有したい時などネットワーク経由でできてとても便利です。

```
$ sudo apt-get update
$ sudo apt-get install netatalk
 ```

 

##samba

どちらかというとwindows向け（？）macでも使えるみたい。

[RaspberryPi3にsambaを設定する方法 : 三流SEの雑記帳](http://ko-log.net/tech-log/archives/4122065.html)

 

 

#リモートデスクトップ

##tightvncserver

入れておくと便利なリモートデスクトップ。

raspberrypiの初期設定ではモニターに接続して立ち上げを行いますが、tightvncserverを入れておけば２回目以降からリモートデスクトップでアクセスできるので、モニターに接続する手間がなくなり便利です。

基本はsshだと思いますが、guiでちょっと確認したい時に便利です。



```:インストール
$ sudo apt-get update
$ sudo apt-get install tightvncserver
```

```:起動
$ tightvncserver
```
tightvncserverの初回起動時にはパスワード設定が求められます

 

 

#エディター

##vim　

raspberry piに初期で入っているエディターはviとnanoです。

個人的にはやっぱりvimが使いやすい。 

```:インストール
$ sudo apt-get update
$ sudo apt-get install vim
 ```

#git

今やこちらも必須ですね。

```:インストール
$ sudo apt-get install git-core
```

 

#node.js

これなしではやっていけません。
バージョン管理はnもしくはnvmですかね。

##n:バージョン管理

[Ubuntuに最新のNode.jsを難なくインストールする - Qiita](http://qiita.com/seibe/items/36cef7df85fe2cefa3ea)

##nvm:バージョン管理

[Raspberry PiでNode.jsを動かす - Qiita](http://qiita.com/tomo_watanabe/items/3f1810bf7e721cf9dfd2)


##npm:パッケージ管理

これもないと始まらない

```:インストール
$ sudo apt-get install npm
```


#node-module

##forever

nodeでデーモンご希望の方はforever。
再起動後のプロセス立ち上げはご自身で設定必要です。

 
```:インストール
$ npm install forever -g
```

 
##node-cron

node.jsで特定のプロセスをcronさせるならnode-cron。
hubotとの相性抜群です。

```:インストール
$ npm install node-cron -g
```

 

##node-mouse

物理ボタンをマウスで代用する時便利です。

```:インストール
$ npm install node-mouse -g
node-mouse
```

##hubot

ボットの金字塔
https://hubot.github.com/

※hubotはraspberrypiに直接インストールするより、開発環境の方でyoemanから雛形をインストールして,アプリ構築後にラズパイに乗せるのが良いと思います。

 
##phantom.js&casper.js

スクレイピングするなら入れといてもいいかも。
インストールが重いらしいので気をつけて。
[Raspberry Pi 3へスクレイピングソフト「CasperJS」のインストール | TomoSoft](http://tomosoft.jp/design/?p=7453)


#AirPlay対応

##shairport-sync 
shairport-syncを入れておけばワイヤレスで音楽を聞ける。
自宅作業が捗ります。
[AirPlay×raspberry piで快適なワイヤレスサウンド環境を構築](http://www.seo-wp.net/entry/airplay_20170304)

 

#アプリケーション

##Blynk

RaspberryPiやArduinoを遠隔操作できるアプリです。
便利かもー

[Raspberry Piを自在に遠隔操作できるスマホアプリ「Blynk」を実際に使ってみた！ | シェアしたくなる最新のWebサービス・ITニュース情報をチェック！ APPGIGA!!（アプギガ）](http://plus.appgiga.jp/masatolan/2015/05/22/56025/)

 

##IFTTT

使い方はあなた次第 。IoT時代（笑）の開発を加速してくれます。
私はSlack × hubot × IFTTTの組み合わせで使ってます。IFTTTでiosロケーションをトリガーにSlack&hubotにコマンド投げてつけてraspberrypiで処理するみたいな感じです。
[raspberry piを使って家のIoT化](http://www.seo-wp.net/entry/raspberry_iot_20170115)

　
　
　
まだまだ駆け出しの身ですので,これ便利だよー情報お待ちしてます。
pythonでシングルトンが欲しくなったらモジュールをシングルトンと思えば良い

と、思います。

自分自身への参照が欲しくなったら、モジュール内に

```
import sys
self = sys.modules[__name__]
```

などと書いておくと便利です。
python3系を使っているのであれば

```
import importlib
self = importlib.import_module(__name__)
```

でも良いです。

なぜ唐突にこういうことを言いたくなったかというと、昔書いたこういうコードを眺めていて本当に黒歴史だったなと思ったからです。普通にhogefactory.pyというモジュールにcreate関数を定義するだけで良い。

``` python:somemodule.py
class HogeFactory:
    @staticmethod
    def create(params):
        """ Hogeオブジェクトを生成して返すメソッド """
        # 色々と複雑な処理
        # ...
        return Hoge(some_args, some_kwargs)
```

余談ですが、pythonのstaticmethodってどういう時に使えば良いのでしょうか？最近書いた覚えがありません。
nano (テキストエディター) について

nano (テキストエディター) についての備忘。
nano 起動時の画面下部に表示される「^X」などの「^」は[Ctrl] キーを表している。
また、「M-R」などの「M-」は Meta キーを表している。

## Meta キー
日本語キーボードにおいては、[Alt] キーを指す。
Tera Term などの端末エミュレーター経由で Meta キーを使用するには、
端末エミュレーターのキーボード設定にて Meta キーを有効にする必要がある。

## ショートカットキー
| ショートカット<br>キー | 代替キー | 説明 |
|:--------:|:--------:|:----------------|
| Ctrl + G | -        | ヘルプを表示           |
| Ctrl + W | -        | 文字列/正規表現を指定して検索 |
|  Alt + W | -        | 直近に実行した検索を再実行 |
| Ctrl + C | -        | カーソルの位置情報を表示           |
|  Alt + \ |  Alt + &#124; | ファイルの先頭行へカーソルを移動 |
|  Alt + / |  Alt + ? | ファイルの末尾行へカーソルを移動 |
|  Alt + ^ |  Alt + 6 | カーソル行の文字列をコピー (バッファー領域に保持) |
| Ctrl + K | -        | カーソル行の文字列を切り取り (バッファー領域に保持) |
| Ctrl + U | -        | バッファー領域の文字列をカーソル位置に貼り付け |
| Ctrl + O | -        | ファイルを保存           |
| Ctrl + X | -        | nano を終了<br>(ヘルプ表示中は) ヘルプを終了 |

## 参考
[Wikipedia での説明](https://ja.wikipedia.org/wiki/Nano_(%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%82%A8%E3%83%87%E3%82%A3%E3%82%BF))
[Linux Mintのメモ -> 端末で使うテキストエディタ nano]
(https://sites.google.com/site/linuxnomemo/mint-use/nano)
先週 (2017-05-22) の振り返りと今週 (2017-05-29) の動きについて

# 先週 (2017-05-22) の振り返り
## TODO(計画)
 * 時間
   * 業務後
     * 平均 2 × 平日5日 + 休日 8h = 18時間→これが100%なので、これを基準にする。
   * 電車内
     * 1.5 × 平日5日 = 7.5時間
 * RailsTutorial
   * 先週5章ほどだったので、12(5章分)を目標に
   * 重点的にやるところは下記二点
     * 自分があまり理解を深められていないところ
     * 取捨選択をしてもらったところ

 * 読み物
   * リーダブルコード
     * すべて(ガッツリは読まない)
       * 残りp140 / 5 = p28
   * webを支える技術
     * p100/300 を目標に
       * 12facを読みながらのリーダブルを基準においた。(p70)
       * 土日に100を読みたい。

## 結果
 * 時間
   * 業務後
     * 平均 3 × 平日5日 + 休日 9h × 2 = 33時間
   * 電車内(乗り換え含め)
     * 1.5 × 平日5日 = 7.5時間

 * RailsTutorial
   * 10章まで完了
   * 基本的にフロント周りは後回しで、基本的にリーダブル+αくらいの理解で進められるように

 * 読み物
   * リーダブルコード
     * 読了 (+140ほど見終わる)
   * WEBを支える技術
     * 50ページほど
       
## まとめ
 * 時間
    * K: 先週よりは時間が取れたように思う。
    * P: 時間をとることを優先してしまい3時頃に寝ることが多くなってしまった。(業務に支障が出そうだった)
    * T: ゆったりする時間をもっと削る
    * T: 業務に早めに切りをつける
 * RailsTutorial
    * K: 予測しながら読む癖がついた。
    * K: あとで復習用にCommitに対して章番号をつけることにした。
    * P: 予想以上にインプットが多く、また文字をちゃんと呼んでいたため、予定5章に対して3章しか進まなかった。
    * T: 時間を増やし多分ごリ押す
    * T: 一旦すべて理解しようとする姿勢を捨てる
 * 読み物
    * リーダブルコードは目標達成。
    * P: 先週と変わらず読める時間は読んだはずが、文字を読んでいたら時間がかかった。
    * T: 文字を読みすぎないように調整。

# 今週 (2017-05-29から2017-05-31) の計画
Keyword:もうちょっと無理する

* 業務後
  * 平均 3 × 平日3日 = 9時間
* 電車内
  * 1.5 × 平日3日 = 4.5時間 (これは限界)

* RailsTutorial
  * 一旦終わらせることを目標に。14章まで1章あたり3時間程度を想定。
  * 重点的にやるところは下記二点
    * 自分があまり理解を深められていないところ
    * 取捨選択をしてもらったところ(フロント周り以外)

* 読み物
  * webを支える技術
     * p100/300 を一旦目標に
     * 上記をベースにしてどんどん読み込む
     * 場合によってはRailsTutorialを優先する。

## 先週の計画はこちら
* http://qiita.com/makua/items/a68ec4de679f4a63ff61
Raspberry Pi 3で7inch HDMIディスプレイを使う (静電容量式タッチ、USB接続)

Raspberry Pi用として売られている7インチのディスプレイには色々なものがありますが、ここでは1024x600pxでUSB接続のタッチスクリーンのものの設定方法を説明します。

あ、英語が理解できるなら[WaveShareのWIki](https://www.waveshare.com/wiki/7inch_HDMI_LCD_(C))を見た方が正確で手っ取り早いです。。。

## 購入
今回は下記の製品を購入しました。
<a href="http://amzn.to/2qoJ900">Elecrow７インチHDMI液晶ディスプレイ1024X600高解像度 Raspberry Pi B+/2B/3/Pcduino Banana Pi対応</a>
<a href="https://www.amazon.co.jp/gp/product/B01GDMDFZA/ref=as_li_ss_il?ie=UTF8&psc=1&linkCode=li2&tag=studiorassoc-22&linkId=082119841fe8549136d5b7c5cd0fa8d1" target="_blank"><img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&ASIN=B01GDMDFZA&Format=_SL160_&ID=AsinImage&MarketPlace=JP&ServiceVersion=20070822&WS=1&tag=studiorassoc-22" ></a><img src="https://ir-jp.amazon-adsystem.com/e/ir?t=studiorassoc-22&l=li2&o=9&a=B01GDMDFZA" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />
この製品は<a href="http://www.waveshare.com/product/modules/oleds-lcds/raspberry-pi-lcd/7inch-hdmi-lcd-c.htm">WaveShare 7inch HDMI LCD (C)</a>のコピー品(?)のようです。そちらも同じ設定で動くかもしれません。←動きました。

## イメージの作成
<a href="https://www.raspberrypi.org/downloads/raspbian/">Raspbianの公式サイト</a>から"RASPBIAN JESSIE WITH PIXEL"というイメージファイルをダウンロードして、microSDに書き込みます。~~Macなら<a href="https://www.tweaking4all.com/software/macosx-software/macosx-apple-pi-baker/">ApplePi Baker</a>というアプリを使うのが便利。~~公式からRaspberry Pi Imagerが出てるのでそれを使うのが便利。イメージを焼いたら、ルートディレクトリにsshという名前の空ファイルを置いておきます。こうしないとsshでログインできません。

## config.txtの設定
このディスプレイを使うにはconfig.txtに解像度の設定を記述しておく必要があります。microSDカードをMacでマウントして、ルートディレクトリにあるconfig.txtを開き、下記の行を追加します。

```
# Force use HDMI
hdmi_force_hotplug=1
# force a specific HDMI mode
hdmi_group=2
hdmi_mode=87

# custom display resolution (480x320 looks good , and 720x480 is not too bad too,3rd res is: 810x540 )
#          /----------------- Width: 480px ( or 720px /or 810px)
#          |   /------------- Height: 320px ( or 480px /or 540px)
#          |   |   /--------- Refresh: 60Hz
#          |   |   | /------- Aspect ratio: 6=15:9 (1=4:3, 2=14:9, 3=16:9, 4=5:4, 5=16:10)
#          |   |   | | /----- Margins: 0=disabled (1=enabled)
#          |   |   | | | /--- Interlace: 0=progressive (1=interlaced)
#          |   |   | | | | /- Reduced blanking: 0=normal (1=reduced)
#          |   |   | | | | |
hdmi_cvt 1024 600 60 3 0 0 0

# uncomment to force a HDMI mode rather than DVI. This can make audio work in
# DMT (computer monitor) modes
hdmi_drive=2
```
## タッチの設定
何もする必要はありません。そのままでタッチ機能は動作します。ただしキャリブレーションは必要かもしれません。
Swift 3.0 コードベースで、UIViewControllerを使って画面遷移

swift3で、コードベースの画面遷移サンプル作りました。
storyboardを使った画面遷移サンプルは、多いいけど、コードベースの、画面遷移サンプルは、少ないかもです。

ご参考までに、どうぞです。
https://github.com/yasuohasegawa/SceneManageSample
デザインパターン学習メモ：「Template Method」

## 目的
GoF本より引用する。

> 1つのオペレーションにアルゴリズムのスケルトンを定義しておき、その中のいくつかのステップについては、サブクラスでの定義に任せることにする。Template Methodパターンでは、アルゴリズムの構造を変えずに、アルゴリズム中のあるステップをサブクラスで再定義する。(P.347)

共通処理は親クラス（抽象クラス）で実装しておく。サブクラスによって異なる処理は、それぞれ実装する。
コードの重複がなくなり、保守性が向上する。

## 実装例

execute()を利用者に使ってもらいたい想定。このメソッドの中で３つのメソッドを呼び出している。

メインの処理となるdoJob()は、サブクラスで実装してもらう。
setUp()とcleanUp()は、基本的にはデフォルト実装を使ってもらうが、もし違うものを使いたいならばサブクラスでオーバーライドする。

```java:Application.java
// AbstractClass役
public abstract class Application {
	protected void setUp() {
		System.out.println("Initializing...");
	}

	protected abstract void doJob();

	protected void cleanUp() {
		System.out.println("Clean up...");
	}

	public void execute() {
		setUp();
		doJob();
		cleanUp();
	}
}
```

```java:MyApplication.java
// Concrete Class役
public class MyApplication extends Application {

	@Override
	protected void doJob() {
		System.out.println("doing job in my way...");
	}
}
```

### 実行例

```java:Main.java
public class Main {

	public static void main(String[] args) {
		Application application = new MyApplication();
		application.execute();
	}
}
```

```text:結果
Initializing...
doing job in my way...
Clean up...
```

## 参考文献
 * エリック ガンマ、ラルフ ジョンソン、リチャード ヘルム、ジョン プリシディース（1999）『オブジェクト指向における再利用のためのデザインパターン　改訂版』本位田　真一、吉田　和樹 監訳、SBクリエイティブ
MacのiTunesライブラリをAWS S3にバックアップする

## あらまし
長いこと使っている MBA(Late 2013, SSD128GB) のiTunesのライブラリ*を、どこかしらにバックアップしようと考えた。けれど、

+ 手元に空いた外付けディスクがない
+ iTunesライブラリが60GBぐらいあるので、ディスク容量が足りず圧縮できない
    + →DropboxとかGoogle Driveとか、オンラインストレージにzipファイルを投げるのはアウト
    + そもそも定期的にzip作ってアップロードして、って面倒すぎない？
![スクリーンショット 2017-05-28 20.48.18.png](https://qiita-image-store.s3.amazonaws.com/0/55305/d9984e30-93bf-9048-a35c-f68ab08b73b7.png)

などなどの状態で困っていたけれど、最終的に「S3でいいんじゃない？」ってとこに辿り着いた。
実際にやってみたので、その手順をメモしておく。

*本記事では ```/Users/${username}/Music/iTunes``` 以下を想定しています。それ以外にバックアップしておくべき箇所があるなら教えてほしい。

## 手順
1. ターミナルでAWS CLIが利用できるようにする
2. CLI経由でS3にアクセスできるIAMロールを作成する
3. 2.のIAMロールをCLI側で設定する
4. ターミナルで```aws sync```コマンドを実行する

## 1. AWS CLIコマンドのインストール

ターミナルから```pip```でインストールする。

```
$ pip install --upgrade --user awscli
```
ダウンロードできたら ```aws --version``` を叩いてみる。
こんな感じで返ってきたらOK。

```
$ aws --version
aws-cli/1.11.93 Python/2.7.10 Darwin/16.6.0 botocore/1.5.56
```

```command not found``` な場合は、パスを通してから再度実行する。

```
$ export PATH=$PATH:/Users/${username}/Library/Python/2.7/bin
```
## 2. IAMユーザーの作成
S3にアクセスするためのIAMユーザーを作成する。

メニュー > IAM > [ユーザーを追加]
#### 1. 詳細
ユーザー名: ex.) ```s3-uploader```
アクセスの種類: ```プログラムによるアクセス``` を選択

#### 2. アクセス権限
ユーザーをグループに追加 > グループの作成
グループ名: ex.) ```s3-uploader``` 
ポリシー: ```AmazonS3FullAccess```を選択

以降、3.確認 > 4.完了と進み、```credentials.csv``` をダウンロードしておく。

## 3. IAMユーザーのID・PWを設定する
2.で作成したIAMユーザーでAWS CLIコマンドを実行するための設定をする。

```
$ aws configure
```

ダウンロードした```credentials.csv```の情報を入力する。

AWS Access Key ID: (記載されているAccess Key ID)
AWS Secret Access Key: (記載されているSecret Access Key)
Default region name: ```us-east-1```
Default format: ```json```
![スクリーンショット 2017-05-26 21.48.54.png](https://qiita-image-store.s3.amazonaws.com/0/55305/3ea4dac4-062a-bfcf-5ec9-f62c951208cc.png)

## 4. AWS CLIコマンド実行
初回の場合は以下の通り。

```
$ aws s3 sync /Users/${username}/Music/iTunes s3://${s3bucketname}/iTunes
```

```sync``` で、指定したディレクトリ以下を再帰的に同期してくれる。
また、 ```--dry-run``` をつけて実行すれば、同期されるファイルの一覧を確認できる。


2回目以降は

```
$ aws s3 sync /Users/${username}/Music/iTunes s3://${s3bucketname}/iTunes --delete
```

と```--delete```オプションを指定すれば、ローカルで削除したファイルもs3から削除してくれる。
(@monamu さんよりコメントいただきました。ありがとうございます！)

----
結構時間がかかった。(諸事情で出先でやっていたので、だいたい7~8時間)
が、GUIで操作して……だと何百年経っても終わらないだろうことを考えると、目覚ましい。便利です。



# 参考
http://www.task-notes.com/entry/20150904/1441335600
https://aws.amazon.com/jp/getting-started/tutorials/backup-to-s3-cli/
http://docs.aws.amazon.com/cli/latest/userguide/installing.html#install-bundle-other-os
macでffmpegを導入してmovファイルをgifファイルへ変換するところまで

[ここを参考にした](https://off.tokyo/blog/ffmpeg%e3%81%a7mov%e3%82%92gif%e7%94%bb%e5%83%8f%e3%81%b8%e5%a4%89%e6%8f%9b-mac/)
プロキシ環境下でConcourseをDockerで運用する


ブログでプロキシ環境下の設定を書くといっていたので、忘れないうちに公開します。

http://irony9901.hatenablog.com/entry/2017/05/07/205726

---

ベースは公式のdocker-composeです。

https://concourse.ci/docker-repository.html

導入時のバージョン `2.7.3` を前提にしています。
webの公開ポートを `8084` に変更しています。
あと、Volumeは大体docker-compose.ymlファイルと並列に置くのが好きなので、そのようにしています。

本題のプロキシ設定は、Workerだけに設定しておけばOKです。

```yaml:docker-compse.yml
oncourse-db:
  image: postgres:9.6
  restart: always
  environment:
    POSTGRES_DB: concourse
    POSTGRES_USER: concourse
    POSTGRES_PASSWORD: changeme
    PGDATA: /database
  volumes:
    - /home/concourse/db/database:/database

concourse-web:
  image: concourse/concourse:2.7.3
  restart: always
  links: [concourse-db]
  command: web
  ports: ["8084:8080"]
  volumes: ["./keys/web:/concourse-keys"]
  environment:
    CONCOURSE_BASIC_AUTH_USERNAME: concourse
    CONCOURSE_BASIC_AUTH_PASSWORD: changeme
    CONCOURSE_EXTERNAL_URL: "http://concoursehost:8084"
    CONCOURSE_POSTGRES_DATA_SOURCE: |-
      postgres://concourse:changeme@concourse-db:5432/concourse?sslmode=disable

concourse-worker:
  image: concourse/concourse:2.7.3
  restart: always
  privileged: true
  links: [concourse-web]
  command: worker
  volumes: ["./keys/worker:/concourse-keys"]
  environment:
    CONCOURSE_TSA_HOST: concourse-web
    http_proxy: http://username:password@host_or_ipaddress:port
    https_proxy: http://username:password@host_or_ipaddress:port
    no_proxy: internalhost
```

# おまけ：パイプライン内のタスクでプロキシサーバを指定するときは？

パイプライン作成時にプロパティファイルを渡すようにすることで、パイプラインのファイルとプライベートな設定値を分離できます。

https://concourse.ci/fly-set-pipeline.html

リポジトリにサンプルファイルみたいなものだけおいておけば、簡単に展開できます。

- プロパティのサンプルファイル
https://github.com/kojisaiki/BotGateway/blob/master/ci/concourse/properties.example.yml


- プロパティを使用しているパイプラインファイル
https://github.com/kojisaiki/BotGateway/blob/master/ci/concourse/pipelines/bot-gateway.yml
三項演算子を使った実装例

# やりたいこと
三項演算子を学んだので、
簡易的なチャットアプリの中で三項演算子を使ってみます。
今回はメッセージの送信機能で使います。
## どのように使うか
1. 画像を添付したときは画像付きでメッセージを送信する。
2. 画像がない場合はメッセージのみを送信する。

この二つを三項演算子を使って表現してみます。

## 前提として・・・
フレームワークはRails
message controllerから値を受け取ってmessage.jsで処理を行う。
message.jsはjQueryで記述
メッセージ送信はajaxを使った非同期通信で行う。
jbuilderによりmessage.imageとすることでimegeのurlを取り出せる。
呼び出した関数の中でテンプレートリテラル記法を使う。

# 三項演算子の使い方。

```javascript
真偽を返す条件式A ? 真の時に実行される値B : 偽の時に実行される値C                
```
A が 真 なら Bの値が読み込まれる。
A が 偽 なら Cの値が読み込まれる。
といった風になっています。
これを今回の実装例で、言葉で表現すると、

```js

画像の有無を確かめる式 ? 画像付きで表示する値 : 画像なしの値
```
といった風になります。

#今回の実装手順
- ①messageコントローラから送られてきた値を元にHTMLを作成。
- ②三項演算子で処理を分ける。
- ③作成されたHTMLを用意しておいたclassに追加

# ①messageコントローラから送られてきた値を元にHTMLを作成。

```message.js
$(function() {

  function buildHTML(message) {  
  // ここでHTMLを作成。三項演算子で画像の有無を区別する処理をする。
  }

  $('.type-message--send').on('click', function(e) {
    中略 // sendボタンが押されると発火し、messageコントローラにdataを渡す。
    });

    .done(function(data) {
      var html = buildHTML(data);  // buildHTMLで送られてきた値を元にclassに追加するためのHTMLを作成する。
      $(".chat__content-message").append(html);
    });
});
```

# ②三項演算子で処理を分ける。
```js

$(function() {
  function buildHTML(message) {
    var addImage = (message.image !== null) ? `<img class = "image_size", src="${message.image}">` : ''  // 詳しくは下で解説
    
　　var html = `
      <p class = "posted-user-name">
        ${message.name}
      </p>
        <p class = "created-at">
      ${message.created_at}
        </p>
      <p class = "user-message">
        ${message.text}
      </p>
      <p class = "user-image">
        ${addImage}
      </p>`

      return html
  }

  $('.type-message--send').on('click', function(e) {
    中略 //　sendボタンが押されると発火し、messageコントローラにdataを渡す。
   });

    .done(function(data) {
      var html = buildHTML(data); // buildHTMLで送られてきたdataを元にclassに追加するためのHTMLを作成。
      $(".chat__content-message").append(html);
    });
});
```

```js

    var addImage = (message.image !== null) ? `<img class = "image_size", src="${message.image}">` : ''

```

今回のテーマとなる三項演算子をここで使いました。
(message.image !== null)の部分で真偽を判定しています。

今回はmessage.imageとすることでメッセージの中に入っているimageのurlを取り出せるので、

imageのurlが*空っぽじゃない*ことがtrueの時はvar addImageに`<img class = "image_size", src="${message.image}">`を代入します。

逆にfalseのときは""として空っぽを渡すようにしています。

これで画像を表示させるかどうかを記述できました。

あとはメッセージを送信するHTML内でvar addImageを、${addImage}として呼び出せば、ほぼ完成です。

```js
    var addImage = (message.image !== null) ? `<img class = "image_size", src="${message.image}">` : ''
    
    var html = `
      <p class = "posted-user-name">
        ${message.name}
      </p>
        <p class = "created-at">
      ${message.created_at}
        </p>
      <p class = "user-message">
        ${message.text}
      </p>
      <p class = "user-image">
        ${addImage}
// ここで呼び出し。
      </p>`

      return html
```

# ③作成されたvar htmlを用意しておいたclassに追加。

あとは今回buildHTMLで作成されたvar htmlを

chat__content-messageにappendしてあげれば、

メッセージが送信されるたびにvar htmlが追加されるようになりました。

#おわりに

実際に使ってみたのはいいのですが、色々と調べていると、

三項演算子は好まれない場合も多いみたいだそうで・・・

この辺りも調べたら面白そうだったので、また機会があれば書きたいと思います！

まだまだプログラミングの世界に足を踏み入れたばかりなので、

もし不備、不適切な表現などがありましたらご指摘お願いします。
プロキシ環境下でMattermostをDockerで運用する


ブログでプロキシ環境下の設定を書くといっていたので、忘れないうちに公開します。

http://irony9901.hatenablog.com/entry/2017/05/07/205726

---

ベースとしてこちらをローカルに内容コピーして別途作成しました。
https://github.com/jasl8r/docker-mattermost

下記ファイル以外は、すべて上記リポジトリのものをいただきました。

- アプリノードのDockerfile

```Dockerfile:Dockerfile
FROM alpine:3.4

ENV MATTERMOST_VERSION=3.8.2 \
    MATTERMOST_HOME="/opt/mattermost"

ENV MATTERMOST_DATA_DIR="${MATTERMOST_HOME}/data" \
    MATTERMOST_BUILD_DIR="${MATTERMOST_HOME}/build" \
    MATTERMOST_RUNTIME_DIR="${MATTERMOST_HOME}/runtime" \
    MATTERMOST_INSTALL_DIR="${MATTERMOST_HOME}/mattermost" \
    MATTERMOST_CONF_DIR="${MATTERMOST_HOME}/config" \
    MATTERMOST_LOG_DIR="/var/log/mattermost"

ENV HTTP_PROXY="http://username:password@proxyhost:port/" \
    HTTPS_PROXY="http://username:password@proxyhost:port/"

RUN apk --no-cache add bash gettext \
    mysql-client postgresql-client \
    ca-certificates

COPY assets/build/ ${MATTERMOST_BUILD_DIR}/
RUN bash ${MATTERMOST_BUILD_DIR}/install.sh

COPY assets/runtime/ ${MATTERMOST_RUNTIME_DIR}/
COPY entrypoint.sh /sbin/entrypoint.sh
RUN chmod 755 /sbin/entrypoint.sh

EXPOSE 80/tcp

VOLUME ["${MATTERMOST_DATA_DIR}", "${MATTERMOST_LOG_DIR}"]
WORKDIR ${MATTERMOST_INSTALL_DIR}
ENTRYPOINT ["/sbin/entrypoint.sh"]
CMD ["app:start"]
```


- DB含む全体のdocker-compose.yml

```yaml:docker-compose.yml
mysql:
  restart: always
  image: mysql:latest
  environment:
    - MYSQL_USER=username
    - MYSQL_PASSWORD=password
    - MYSQL_DATABASE=mattermost
    - MYSQL_ROOT_PASSWORD=password
  volumes:
    - ./db/mysql:/var/lib/mysql

mattermost:
  restart: always
  build: app
  links:
    - mysql:mysql
  ports:
    - "8082:80"
  environment:
    - SMTP_HOST=host
    - SMTP_PORT=25
    - SMTP_USER=user
    - SMTP_PASS=pass
    - SMTP_SECURITY=
    - MATTERMOST_SITE_URL=http://mattermosthostname:8082
    - MATTERMOST_SECRET_KEY=raaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaandomtext
    - MATTERMOST_LINK_SALT=raaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaandomtext
    - MATTERMOST_RESET_SALT=raaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaandomtext
    - MATTERMOST_INVITE_SALT=raaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaandomtext
    - MATTERMOST_ENABLE_SLASH_COMMANDS=true
    - MATTERMOST_ENABLE_INCOMING_WEBHOOKS=true
    - MATTERMOST_ENABLE_OUTGOING_WEBHOOKS=true
    - MATTERMOST_WEBHOOK_OVERRIDE_USERNAME=true
    - MATTERMOST_WEBHOOK_OVERRIDE_ICON=true
    - NO_PROXY=mattermosthost
  volumes:
    - ./app/mattermost:/opt/mattermost/data
```

以前Mattermostをv3.5.1からv3.7.3にアップした際、entrypoint.sh内の次のコマンドでこけました。

```bash
./bin/platform -config ${MATTERMOST_CONF_DIR}/config.json
```

どうやらv3.6からCLIのシンタックスが変わっていたようです。
https://docs.mattermost.com/administration/command-line-tools.html#platform
オプションのハイフンが1つ多く必要です。

```bash
./bin/platform --config ${MATTERMOST_CONF_DIR}/config.json
```

バージョンアップ時にこういう細かい変更に気づきづらいのは、自分でDockerfileから作ってない弊害ですね・・・
他人のDockerfileを使う際は、ざっと中身を読んでおいたほうが良いと思います。

# おまけ：hubotのプロキシ対応について

どうやらできるプラグインもあるらしいですが、不安定なようですね・・・

http://qiita.com/hironot/items/7c151d462bc61554353f

うちの場合はpug meとかの機能は要らないと思っていて、さらに社内・社外のAPIとのやり取りも作り込む必要があるので、ゲートウェイ代わりのJVMアプリを作成して落ち着かせようと思っています。

https://github.com/kojisaiki/BotGateway
Tensorflow導入(Win/Anaconda環境)

# 今回の目標
* Tensorflow用の環境構築
* Tensorflowのインストール
* チュートリアル

# Tensorflow用Python環境構築

まずはTensorflow用(Python3.5)の環境を構築する。
Condaにて仮想環境に構築していく。
コマンドプロンプトにて下記コマンドを実行する


```bat
conda create -n tensorflow python=3.5
```



![1.png](https://qiita-image-store.s3.amazonaws.com/0/177957/08380061-0f80-b7b9-84f3-01e60ef2ea0f.png)



必要なパッケージインストールをするか聞かれるのでY選択
しばらくたつとインストール完了する。
インストール完了したら環境を切り替える。

```bat
activate tensorflow
```

![2.png](https://qiita-image-store.s3.amazonaws.com/0/177957/e3afdbc7-de2c-5a61-6299-85ce4bff2b55.png)


# Tensorflowのインストール
ここからはpipを利用してTensorflowをインストールする。
pipはpythonのPythonのパッケージ管理システム、よくつかう。



下記コマンドの実行をする。

```bat
pip install tensorflow
.
.
.
Successfully built protobuf
Installing collected packages: six, protobuf, numpy, werkzeug, tensorflow
Successfully installed numpy-1.12.1 protobuf-3.3.0 six-1.10.0 tensorflow-1.1.0 werkzeug-0.12.2
```

Successfully built protobufって表示されればおｋ


# チュートリアル
Tensorflowの公式にサンプルがあるので動かしてみる。
https://www.tensorflow.org/get_started/get_started


```py3
import numpy as np
import tensorflow as tf
# Model parameters
W = tf.Variable([.3], tf.float32)
b = tf.Variable([-.3], tf.float32)
# Model input and output
x = tf.placeholder(tf.float32)
linear_model = W * x + b
y = tf.placeholder(tf.float32)
# loss
loss = tf.reduce_sum(tf.square(linear_model - y)) # sum of the squares
# optimizer
optimizer = tf.train.GradientDescentOptimizer(0.01)
train = optimizer.minimize(loss)
# training data
x_train = [1,2,3,4]
y_train = [0,-1,-2,-3]
# training loop
init = tf.global_variables_initializer()
sess = tf.Session()
sess.run(init) # reset values to wrong
for i in range(1000):
  sess.run(train, {x:x_train, y:y_train})

# evaluate training accuracy
curr_W, curr_b, curr_loss  = sess.run([W, b, loss], {x:x_train, y:y_train})
print("W: %s b: %s loss: %s"%(curr_W, curr_b, curr_loss))
```

pythonで実行

```bat
(tensorflow) C:\work>python tutorial.py
W: [-0.9999969] b: [ 0.99999082] loss: 5.69997e-11
```

実行結果だけだとなにがなんだかわからないがざっくりと説明すると

XとYの関係性を線形回帰によって求めている
(要は直線(Y=WX + ｂ)の傾き(W)とb(切片))


![image](https://qiita-image-store.s3.amazonaws.com/0/177957/850ff831-5a18-0607-f385-bdb3d223631a.png)


# 次回までに調べておくこと

* TensorflowでのPythonプログラミング
* TensorBoardの使い方
pecoなどでbundleしてるgemのディレクトリにcdする

zshのスクリプトで

`bundle path [gem]`
gemのパスを表示
`bundle cd [gem]`
gemのパスに移動

を作りました

# 必要なもの

- anyframe
  - https://github.com/mollifier/anyframe
  - pecoとかpercolとかをよしなにしてくれるやつ
  - anyframeないけど、pecoとかは入ってるって場合は、 `anyframe-selector-auto`の部分を`peco`とかに置き換えてください
- pecoとかpercolとか

# bundle path [gem]

[![asciicast](https://asciinema.org/a/4hks5c1h6gaep8jwm5l5xko6t.png)](https://asciinema.org/a/4hks5c1h6gaep8jwm5l5xko6t)

# bundle cd [gem]

[![asciicast](https://asciinema.org/a/dhzvemqavubvvn8r5yesvsye8.png)](https://asciinema.org/a/dhzvemqavubvvn8r5yesvsye8)

# source

```sh:~/.zshrc
_orig_bundle=$(which bundle)

# like: bundle list | anyframe-selector-auto
function bundle_path() {
    local gem
    if [ "$1" ]; then
        gem=$1
    else
        gem=$($_orig_bundle list | sed -e '1d' | cut -d'*' -f2 | cut -d' ' -f2- | anyframe-selector-auto)
        gem=$(echo $gem | cut -d' ' -f1)
    fi
    $_orig_bundle show $gem
}

# like: cd $(bundle list | anyframe-selector-auto)
function bundle_cd() {
    cd $(bundle_path "$@")
}

# bundle cd [gem]
# bundle path [gem]
function bundle() {
    if [ "$1" = "cd" ]; then
        shift
        bundle_cd "$@"
    elif [ "$1" = "path" ]; then
        shift
        bundle_path "$@"
    else
        $_orig_bundle $*
    fi
}
```

# こういう実装にした理由

`cd $(bundle show --paths | peco)`にキーバインド当てるのが一番シンプルな実装ですが、

* `bundle show --paths` はフルパスがでてpecoなどでの絞り込みの際に見づらい
* キーバインド覚えるの面倒くさい

という理由で今回の実装にしました。

あと、ghq + gem_srcの実装も方向も検討しましたが
http://qiita.com/yuku_t/items/78107016af9eb78d5804
この記事見てgem_srcはやめました

# 参考にした記事

http://qiita.com/yuku_t/items/78107016af9eb78d5804
http://qiita.com/hoshino/items/d2f7fe223d0b37214408
UnityでVOICEROID+の出力に合わせて口パク

すごい雑ですが、UnityとVOICEROID+でMMDモデルの口パクをするサンプルです。

口パクの元音はNETDUETTOを使ってます。(最初にログ見て手書きで選びます。)
定数は私の環境下での調整値です。

```csharp
using UnityEngine;


public class Mouth : MonoBehaviour
{
    void Start()
    {
        foreach (string device in Microphone.devices)
        {
            Debug.Log("Microphone.devices = " + device);
        }

        AudioSource audio = GetComponent<AudioSource>();
        audio.clip = Microphone.Start(Microphone.devices[1], true, 10, 44100);
    }

    void Update()
    {
        AudioSource audio = GetComponent<AudioSource>();
        float[] samples = new float[audio.clip.samples * audio.clip.channels];
        audio.clip.GetData(samples, 0);
        float vol = 0;
        for(int i = 0; i < samples.Length; i++)
        {
            vol += Mathf.Abs(samples[i]);
            samples[i] = samples[i] * 0.5F;
        }
        audio.clip.SetData(samples, 0);

        MMD4MecanimModel model = GetComponent<MMD4MecanimModel>();
        MMD4MecanimModelImpl.Morph morph = model.GetMorph("\u3042");
        morph.weight = Mathf.Min(1, vol / 50);
        
        print("vol = " + vol / 50);
    }
}
```

Microphone.devicesは日本語が読めないみたいなので、録音デバイスの名前から日本語を消してます。(私は空にした。)
これをしないと挙動がおかしかったり色々あるのでハマる可能性高いかもしれません。あと、要再起動です。
※不確かな話なのでご注意ください。



参考
http://www.jonki.net/entry/20130607/1370622815
http://tips.hecomi.com/entry/2014/11/11/021147
※もっと他にも色々見て回った気がするんですが、ごちゃごちゃで思い出せません……。みなさんありがとう。
ブラウザテストの異常系パターンまとめ

"異常系"と呼んでいいのか分かりませんが、「そんなん考慮しとらんよ…」だが実行可能な動作たちを私の過去の痛みからまとめました。

ダブルクリック
------------------------------
「そんなとこダブルクリックして何がしたいの？」と思うかもしれません。
でも実行可能なら、実行した時の挙動が許容可能なものか確認しなければいけないのです。
リクエストが二回飛んで予期せぬバグを産んだりするかもしれません。

"戻る" → "進む" を高速に繰り返す
------------------------------
「どうしたの？頭大丈夫？」と思うかもしれません。
でも実行可能なry)

機能によりますが、何らかの非同期処理を行っている場合、適切にキャンセルしたりしないと予期せぬバグが発現するかも。

テキストフィールドに変な文字を入力する
------------------------------
絵文字とか謎の言語とか変な文字を入力してみましょう！

フォームのテキストフィールドに空白文字だけ入れて実行する
------------------------------
文字数判定する時、ちゃんと前後の空白を取り除いていますか？

見た目がDisabledなボタンを押す
------------------------------
見た目に騙されてはいけません。実行可能な可能性があります。
こんなポカ私しかやらない気もしますが、見た目のCSSを変えるところと、クリックで処理が実行可能かどうかを判定する部分を別に書いてしまい、
見た目押せない感じなのに、実は押せちゃうボタンを作ったことがあります☆


他にも発見したら追加していきます。
「Unity」UnityをアップデートしてProjectビューの中身をreimportしたらプロジェクトが開けなくなったりテクスチャが表示されなくなったりした場合

<h2>OS</h2>
mac OS

<h2>起こったこと</h2>
数ヶ月前の話だが、Unityをアップデートしていつも通り開こうとしたら、「作ってた時と現在のバージョンが違いますよ」的なのが表示されたので、対処法ググったら「reimportしたらそれが消える」っぽいのでやったら、プロジェクトが開けなくなったお話。
えらい読み込みに時間かかるし、読み込み終わったと思ったら開けてないしっていう問題が起きた。

2時間ほどこの問題解決に時間を使ってしまった。

<h2>対処法</h2>
[1]と[2]の2種類の方法を紹介
[1]
右クリックからプロジェクトを圧縮する
すると、、、
<img width="396" alt="スクリーンショット 2017-05-28 19.28.53.png" src="https://qiita-image-store.s3.amazonaws.com/0/179803/d487b7bd-de89-d9e4-e135-963a0e407413.png">

こんなふうに、アクセス権がないゾと言われるので、chmodコマンドでもいいけどとりあえず。
１.アクセス権がないと言われたテクスチャを探して、右クリック。
2.情報を見る
3.右下の鍵マークをクリック
4.パスワード聞かれると思うので、入力
5.下の方に、「読み/書き」や「アクセス不可」などになってるところをクリックして、上から順に「読み/書き」、「読み/書き」、「読み取り専用」に設定する。
6.もう一回プロジェクトのフォルダを圧縮してみてさっきの画像みたいにアクセス権のない画像を教えてもらう。(一個しか問題のファイルがなかった場合、圧縮が始まってしまうので下の[2]の方法がオススメ)

[2]
<img width="192" alt="スクリーンショット 2017-05-28 19.34.07.png" src="https://qiita-image-store.s3.amazonaws.com/0/179803/f2a4bee6-b82d-1723-018b-1384cd587f91.png">

のようなアイコンになってしまっているテクスチャをさっきの1〜5の手順でアクセス権をなんとかする。


問題のあるテクスチャ全て終わったら以前のようにプロジェクトが開けるようになった。
Windowsでもプロパティからセキュリティ設定で同じように改善できるのでは。。。(確かめたとは言っていない)
Laravel5.4を入れて最初にやりたいこと

私がLaravelを入れて最初に行うことを２つ挙げます。

- 日本語のバリデーションファイルを用意する
- FormHelperを入れる

以上２つの手順を記載します。

#日本語のバリデーションファイルを用意する
デフォルトだと英語設定になっているので、これを何とかします。

##configの設定
まずはlaravel/config/app.phpを編集します。

```
'timezone' => 'UTC',
を
'timezone' => 'Asia/Tokyo',
にします。
```

```
'locale' => 'en',
を
'locale' => 'ja',
にします。
```

```
'fallback_locale' => 'en',
を
'fallback_locale' => 'ja',
にします。
```

##バリデーションファイル追加
validation.phpが日本語化されているので、利用させて頂きます。
[https://gist.github.com/yukimunet/7d65e2272c70b804f73a4dc68cb5f1c0]
(https://gist.github.com/yukimunet/7d65e2272c70b804f73a4dc68cb5f1c0)

これをlaravel/resources/lang/ja/validation.phpに置きます。
※他にもauth.phpやpagination.php、password.phpがありますが、量が少ないため割愛します。

#FormHelperを入れる
Viewでinputタグやformを作ってくれる便利なクラスです。
laravelcollective/htmlをcomposerで入れます。
```# composer require laravelcollective/html```

続いてlaravel/config/app.phpを編集します。
2箇所追加します。

```
    'providers' => [

        ...
        Collective\Html\HtmlServiceProvider::class,
    ],

    'aliases' => [

        ...
        'Form' => Collective\Html\FormFacade::class,
        'Html' => Collective\Html\HtmlFacade::class,
    ],
```

これでviewに以下を追加してテキストボックスが表示されれば成功です！
※Form::openをすると自動的に_tokenも付けてくれます。

```
{{ Form::open(['url' => url('hoge'), 'class' => 'form-horizontal']) }}
{{ Form::text('hoge', old('hoge', 'hoge'), [ 'class' => 'form-control']) }}
{{ Form::close() }}
```

以上です。
Microsoft Bot Framework 公式ドキュメント”ボットの設計”について書いてみた①

Microsoft Bot Framework の[公式ドキュメント](https://docs.microsoft.com/en-us/Bot-Framework/index)にある、[**How to** > **Design**](https://docs.microsoft.com/en-us/bot-framework/bot-design-principles)（Botの設計）に関するドキュメントが面白かった＆すごく参考になったので、Google翻訳を交えながら自分なりに脳内理解するために書いてみた。

※英語とかよく分からないんで、言い回しとか何となくやってるので察してくださいw

まずは、**「ボット設計の原則」**について。

>
# Designing a bot
If you are building a bot, it is safe to assume that you are expecting users to use it. It is also safe to assume that you are hoping that users will prefer the bot experience over alternative experiences like apps, websites, phone calls, and other means of addressing their particular needs. In other words, your bot is competing for users' time against things like apps and websites. So, how can you maximize the odds that your bot will achieve its ultimate goal of attracting and keeping users? It's simply a matter of prioritizing the right factors when designing your bot.
（[Designing a bot](https://docs.microsoft.com/en-us/bot-framework/bot-design-principles)より引用）

あなたがボットを構築したら、「**ユーザーは使ってくれるだろう**」って想像します。

アプリやウェブサイトや電話とかよりも、**ボットとの対話体験を好むことを期待**してますよね？

ただ言い換えると、あなたが作ったボットは、ユーザからすると**既存のアプリやウェブサイトで出来ることと競合**してますよね？

だから、あなたのボットがユーザーを引きつけ維持するという最終的な目標を達成する可能性を最大限に高めるにはどうすればいいですか？

ボットを設計する際には、適切な要素に優先順位を付けるだけです。

# ボットを成功に導く保証ではない要因
## 賢いボット
ほとんどの場合、あなたのボットをより賢くすることは、ユーザーにとって幸せなプラットフォームを保証することはまずありません。

実際には、多くのロボットは高度な機械学習や自然言語能力をほとんど持っていません。
もちろん、問題に対処する必要がある場合は、ボットにその機能が含まれている可能性がありますが、ボットの知能とボットのユーザーとの間には何の相関も想定しないでください。

## ボットがサポートする自然言語の量
あなたのボットは会話で素晴らしいことができます。それは数々の言葉を持ち、素晴らしいジョークを言うことも出来ます。
しかし、ユーザーが解決しなければならない問題に対処しない限り、これらの機能はボットを成功させるのにはほとんど貢献しません。
実際、ボットの中には会話能力が全くないものがあります。そして、多くの場合、**それは完璧**です。

## 音声
音声で対話できるボットを作ることは、素晴らしいユーザーエクスペリエンスにつながるかというと、必ずしもそうではありません。
多くの場合、ユーザーに音声を使用させると、**ユーザーは不満を感じる**ことがあります。
ボットを設計する際には、常に、**音声が適切なチャネルであるかどうか**を検討してください。

# ボットの成功に影響する要因
成功したほとんどのアプリやウェブサイトには、少なくとも1つの共通点があります。
優れたユーザーエクスペリエンスです。ボットはその点で違いはありません。したがって、ボットを設計する際には、優れたユーザーエクスペリエンスを確保することが最優先事項になります。
いくつかの重要な考慮事項を挙げると、

- ボットは最小限のステップでユーザーの問題を簡単に解決しますか？
- ボットは、ユーザーエクスペリエンスを他のどのエクスペリエンスよりも優れ、簡単で高速に解決できますか？
- ボットは、ユーザーが触るデバイスやプラットフォームで動作しますか？
- ボットは発見可能ですか？ユーザーは、ボットと対話時に自然に何をすべきかを知っていますか？ 


これらの質問のどれも、

- ボットがどのくらい賢いか、
- 自然言語能力がどれくらいあるか、
- 機械学習を使用するか、
- どのプログラミング言語を使って作成されたか

などの要因には直接関係しません。
ボットが問題を解決して優れたユーザーエクスペリエンスを提供する必要がある場合、**ユーザーはこれらのことのいずれかを気にすることはまずありません。**
ボットのユーザーエクスペリエンスが優れていると、ユーザーは、無駄に入力したり、無駄に対話したり、何度も繰り返したりなど、ボットが自動的に知るべきことをユーザが説明する必要はありません。

ボットを設計するプロセスは、**アプリやウェブサイトを設計するプロセス**と似ています。
何十年もUIを構築し、アプリやウェブサイトのUXを提供してきたことから学んだ教訓は、ボットの設計に関して適用されます。
あなたのボットが正しい設計にアプローチ出来ているか不確かな場合は、一歩前に戻って、次の質問をしてください。

**アプリケーションやウェブサイトでどのように問題を解決しますか？**

同じ答えがボットのデザインに適用される可能性があります。

# まとめ
たったこれだけの内容だけど一貫して伝わってくるものとして、

**あなたが提供しようとしている（解決したい）ことに、ボットを採用するのはユーザにとって最善ですか？
採用したからには、他のUI/UXよりもユーザにとって優れたものとなっていますか？**

ということ。

こんな感じで、タイトルにも「①」とあるようにシリーズ的に書いてみたいと思います。

第２回、書きました。
[Microsoft Bot Framework 公式ドキュメント”ボットの設計”について書いてみた②](http://qiita.com/kataday/items/50b505d620161d488180)
python の Psycopg を用いて、COPYコマンドを実行する

#目的
pythonでPostgreSQLにCOPYコマンドを実行します。
psycopgにcopy_from関数があり、非常に簡単に分かりやすく処理することが出来ます。

### この記事の作成時の環境
- python:2.7.10 
- postgresql 9.4
- PC: MacBook Pro (Retina, 13-inch, Mid 2014)

### 必要なライブラリ
- Psycopg http://initd.org/psycopg/

　  インストールはPIPコマンドでも可能です。
　詳しくは http://initd.org/psycopg/docs/install.html

#サンプルソースコード
TSV形式のpythonが実行されているマシン上に配置されているファイルを、PostgreSQLに対して投入します。

```python:copy_from.py
import psycopg2

try:
    # PostgreSQLへ接続
    conn = psycopg2.connect("dbname='データベース名' user='ログインユーザ名' host='ホスト名' password='****'")
    cur = conn.cursor()
    conn.set_isolation_level(0)

    #データベースに投入するファイルの読み込み
    f = open('/ファイルパス/ファイル名' mode='r' encoding='utf-8') #文字コードを明示するとCOPY時のエラーが抑制出来ます。

    #COPYの実行
    cur.copy_from( f , 'テーブル名', sep='\t', null='\\N',columns=('カラム名１','カラム名2'))
      # sep='デリミッタ文字種：例ではTAB記号'
      # null='ヌル文字種：例ではNULL'
      #　　columns=('') 入力対象のカラム名を順番に列挙、全カラムに投入を可能な場合は省略可能

    conn.commit() #忘れずに！！
    f.close()
    print( "OK" )

except psycopg2.Error as e:
   print( "NG Copy error! ")
   print(  e.pgerror )
```
#ポイント
##Psycopgのcopy_from関数の使い方

copy_from関数のポイントは、第１引数です。
> file – file-like object to read data from. It must have both read() and readline() methods.

ファイル又は、ファイルのようなオブジェクトで、read()とreadline()の両方が存在していなければ成らないようです。
サンプルコードでは、TSVファイルをopen（）関数で読み込んだ戻り値をわたしています。

また、colums では、入力対象のカラム名を指定できるため、serial型のカラムがあるテーブルにも有効です。
Delphi の unit friend

# Unit Friend

## Delphi の可視性

Object Pascal は、他の言語同様にクラスメンバに対する可視性を制御できます。
一般的な可視性は下記の通りです。

| 指令      | アクセス範囲                    |
|-----------|---------------------------------|
| private   | 宣言されたクラス                |
| protected | 宣言されたクラス, 継承先のクラス |
| public    | 誰でも                          |
| published | 誰でも（RTTI が生成される）     |

※一般的では無い可視性として automated があります

## 本当に？

本当のことを言うとちょっと違います。
実は private と protected は更に「同一 Unit 内」からもアクセスできるのです。
Embarcadero Developer Network の記事「[Delphi 7以降の言語およびコンパイラの新機能](https://edn.embarcadero.com/jp/article/34409)」には

> privateキーワードは実際には同一ユニット内のクラス間に「フレンド」な関係を作成します

とあります。

例えば

```delphi
type
  TFoo = class
  private
    FBar: String;
  public
    constructor Create; reintroduce;
  end;

  TBar = class
  public
    constructor Create(const iFoo: TFoo); reintroduce;
  end;

{ TFoo }

constructor TFoo.Create;
begin
  FBar := 'I am TFoo.'
end;

{ TBar }

constructor TBar.Create(const iFoo: TFoo);
begin
  // TFoo.FBar は private なのにアクセスできる
  iFoo.FBar := 'You are TBar';
end;
```

上記のようにアクセスできます。

この機能を勝手に **Unit Friend** と呼んでいます。

## strict 指令

Unit friend は親子関係があったり関係性の深いクラスを作るときに利用されるテクニックですが、それをさせたくない場合があります。

それを制御するために [strict 指令](http://docwiki.embarcadero.com/RADStudio/Berlin/ja/%E3%82%AF%E3%83%A9%E3%82%B9%E3%81%A8%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%EF%BC%88Delphi%EF%BC%89#strict_.E5.8F.AF.E8.A6.96.E6.80.A7.E6.8C.87.E5.AE.9A.E5.AD.90)というものがあります。

| 指令             | アクセス範囲                    |
|------------------|---------------------------------|
| strict private   | 宣言されたクラス                |
| strict protected | 宣言されたクラス 継承先のクラス |

このように strict を付けると、Unit friend の機能は無くなり、厳密にアクセス範囲が決定されます。

# まとめ
可視性についてまとめると


| 指令             | アクセス範囲                                   |
|------------------|------------------------------------------------|
| strict private   | 宣言されたクラス                               |
| private          | 宣言されたクラスと同一ユニット                 |
| strict protected | 宣言されたクラスと継承先のクラス               |
| protected        | 宣言されたクラスと継承先のクラスと同一ユニット |
| public           | 誰でも                                         |
| published        | 誰でも（RTTI が生成される）                    |

となります。

[続く！](http://qiita.com/pik/items/72fd5ab68a2cd40f2d39)
ubuntuでApache + PHP


# 導入
そうだPHPやろうと思いましたが、何やらApacheなるものが必要だそうです。
今日はUbuntuを使います。具体的に言うとUbuntu 15.04 64 ビットです。

# 更新

```
$ sudo apt-get update
```
すべてのapt-getはupdateに始まり、updateに終わるので、これを実行します。内部のアプリケーションの更新とかやってくれます。

# Apache 
HTTPサーバーに使われてるド定番ソフトウェアです。PHPはこいつの上で動作するので先に入れておきましょう。

```
$ sudo apt-get install apache2
```
このApacheはNginxなどで代用できます。

# PHP
そろそろPHPを入れます。コマンドは同じです。最終バージョンは7ですが、無視して5を入れちゃいます。

```
$ sudo apt-get install php5
```
コマンド実行前にApacheが入っていると、モジュールなどがなんやかんやでいい感じにしてくれるそうです。

# ページの作成
ブラウザでhttp://localhost/ にアクセスすると、Ubuntuマークに「It works!」と褒められると思います。おめでとうございますApacheは正常に動いているようです。
続いて、PHPを駆使しHello Worldめいた、あのページを作成しましょう。

早速PHPファイルを作成します。
viコマンドでファイルを作成します。テキストエディターはお好みで構いませんが、ディレクトリの位置からして、コマンドの実行には管理者権限を付与させたほうがいいでしょう。

```
$ sudo vi /var/www/html/pageinfo.php
```

中身は以下のように

```php:pageinfo.php
<?php
    phpinfo();
?>
```
テキストを保存し、http://localhost/pageinfo.php にアクセスすると、現在使用しているPHPの詳細情報が閲覧できます。

あとはお手持ちのPHP入門書に従うだけです。

# 結論
こんなに設定が簡単なのに、私はこの方法を見つけ出すのに一日使いました。
Rails5.1からlimit付きのfind_eachが使えるようになってた


バッチ処理とかで大量データを効率的に処理したい時に使うfind_eachがあるんだけど、
Rails5.1.0より前まではlimitを付けてもレコードの数を制限することが出来なかった。

だけどRails5.1.0からはfind_eachにlimitを付けるとレコードの数を制限できるようになってた。

下記は例

```ruby
# Userには200人登録されてるとする。
User.limit(100).find_each { |user| puts user }

# 5.1より前：200人分出力
# 5.1から　：100人分出力
```

find_in_batches、in_batchesも同様にlimitで制限が掛けれるようになってる。


修正元はこちら
https://github.com/rails/rails/commit/451437c6f57e66cc7586ec966e530493927098c7
Pythonでlistをlistという変数名で定義してしまった

### この記事を書いた人について
- 仕事ではPython以外を使っている
- Pythonは趣味で使い始めたばかり

### ハマったこと
Pythonでrangeからlistを構築する方法を確認したかったので以下のようなコードをコンソールから実行した

```py3:sample1.py
>>> list = list(range(5)) # 0から4までのリストを構築
>>> list
[0, 1, 2, 3, 4]
>>> list = list((range(10))) # 0から9までのリストを構築(できない)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'list' object is not callable
```

なぜか1回目のrangeからlist構築は成功し、同じことを2回行おうとしたらエラーが出た

### 原因
1回目で定義したリストの変数名が"list"だったため、2回目に組込型のlistのコンストラクタを呼び出す部分で1回目で定義した変数が呼び出され、型エラーが発生していた

### 対策
1. 組込型と同じ変数名を使用しない  
そもそも変数名としてよくない
2. コンソールを再起動する  
それほど複雑なことをしていなければ、変数が初期化されるのでやりなおすのもあり
3. delで変数を削除する  
以下、この方法について紹介

```py3:sample2.py
>>> list = list(range(5)) # 0から4までのリストを構築
>>> list
[0, 1, 2, 3, 4]
>>> del list # 変数"list"を削除
>>> list # "list"が組込型のlistとして扱われている
<class 'list'>
>>> list = list((range(10))) # 0から9までのリストを構築(エラーにならない)
>>> list
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
```

2回目のリストの構築がエラーにならず成功していることがわかる

### 参考資料
https://docs.python.jp/3/library/stdtypes.html?highlight=list#list
React Native 困った時エラーの見方備忘録（Android編）

# はじめに

最近React Nativeアプリリリースのお手伝いをしてました。
でも、やはり色々発生して、困ったことになりがちで、少しでもググりやすくするために本質的な問題を知る方法を備忘録で記載していきます。

# Android編

## ビルドするとおちる……

```
react-native run-android
```

した時に出てくる

```
* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.
```

こいつの見方です。

```
cd android
./gradlew installDebug --stacktrace
```

これをすることによってエラーの詳細を見ることができます。
まるで

```
react-native run-android --stacktrace
```

できそうな雰囲気があるのでよくこれやって、ああもう・・・ってなります。

ネィティブ側で問題が起こってるときに起きやすいです。直近では、gradleで入れようとしてるパッケージ被ってるよとかでこれでした。。
あとは、apkのパスおかしくない？とかも出てきます。

## apkにすると落ちる……

実機にインストールするとなぜか落ちるあれです。
大概の場合、サイニングに失敗しているか、ビルドプロセスでnode_modulesがおかしなことになっているとなります。
直近だと、一部のモジュールにsymlinkはっててこれが発生しました。実体じゃないとだめだったので、実態にして事なきを得ました。

これは、実機に接続して、

```
react-native run-android --configuration=release
```

古いバージョン（0.41以前）だと

```
react-native run-android --variant=release
```

こちらで見ることができます。
このコマンド実行するとapkを作成して、実機にインストールすることができます。がその時のログを見ることができます。

apkつくって実機でインストールするより効率的です。

## 実機で落ちる……

実機と接続したまま、

```
react-native run-android
```

して実機を動かします。apkにした場合のみ問題が発生する場合は、

```
react-native run-android --variant=release
```

こっちをやります。

その後AndroidStudioを立ち上げで、画面左下のAndroid monitorをクリック。
<img width="308" alt="スクリーンショット 2017-04-30 0.13.42.png" src="https://qiita-image-store.s3.amazonaws.com/0/121851/c113a943-f248-6acb-6aa6-4c13c6192cb0.png">

たちが上がったAndroid monitorで自分のデバイスを選択することでログを見ることができます。
<img width="605" alt="スクリーンショット 2017-04-30 0.13.49.png" src="https://qiita-image-store.s3.amazonaws.com/0/121851/a795f5c9-2f3f-d576-c422-0d8dbcb8e9bd.png">

これを使うとアプリが落ちた要因が、わかります。
直近だと、アプリを立ち上げていじると落ちるってことがありました。そして、その原因はメモリリークで、画面に表示されてないけど、回り続けているローディングアニメーションだったので、ローディングアニメーションは表示されるとき以外はアンマウントするという方法で回避しました。

## よくわからないけど、実機でうまく動かない……
これは結構あります。

実機接続して動かして

```
react-native log-android
```

で仕込んでいたログを見ることができます。
また、実機を振ると開発者メニューがでるので、そこで、

## 終わりに

iOSから基本的につくるからかAndroidでは不思議と色々問題が発生します。


## おまけ

```
cd android
./gradlew clean
```
ビルドしたネイティブファイルをクリーン。
Google スプレッドシートで セル参照にR1C1 形式を利用する

Google スプレッドシートのセル参照に、R1C1形式を利用したい。
しかし、そのままセルに ``` =R1C1 ``` と入力するとエラーになってしまいます。
indirect関数を利用し``` =indirect("R1C1",false) ``` と入力すると。エラーにならず期待通りの動作をします。

``` =indirect("R1C1", false) ```　1行1列目を参照(A1)
``` =indirect("R1C1:R3C3", false) ``` 1行1列目から3行3列目を参照(A1:C3)

もちろん、相対参照も利用可能です。

``` =indirect("R[-1]C", false) ``` 1行上のセルを参照
``` =indirect("RC[-2]", false) ``` 2列左のセルを参照
``` =indirect("R[3]C[3]",false) ``` 3行下3列右のセルを参照

他シートの参照もいけます。

``` =indirect("sheet!R1C1", false) ``` sheetの1行1列目を参照
Sambaの脆弱性『CVE-2017-7494』を検証してみました

　
2017年5月24日(米国時間)に公表されたSambaの脆弱性『CVE-2017-7494』について、検証してみました。

#■ CVE-2017-7494 とは

悪意のある第三者により、リモートから任意のコードを実行できる脆弱性が、Sambaに見つかりました。
https://www.samba.org/samba/security/CVE-2017-7494.html


#■ 検証環境
####◆攻撃元ホスト
　・Debian系
　・192.168.56.101

####◆標的ホスト(攻撃先)
　・CentOS 7.3　
　・192.168.56.201

　【Samba バージョン】
　・samba.x86_64　4.4.4-12.el7_3　※脆弱性あり
　・samba.x86_64　4.4.4-14.el7_3　※脆弱性対応済み

#■ 攻撃結果
####◆脆弱性ありの場合 (4.4.4-12.el7_3)

```
★攻撃コードの実行結果
[*] Command shell session 1 opened (192.168.56.101:4444 -> 192.168.56.201:50650) at 2017-05-28 15:31:30 +0900
⇒ 攻撃元ホストから標的ホストへの接続成功

★任意のコードが実行可能になります
cat /etc/redhat-release
CentOS Linux release 7.3.1611 (Core) 

/sbin/ifconfig
～ 省略 ～
192.168.56.201  netmask 255.255.255.0  broadcast 192.168.56.255
～ 省略 ～
```

####◆脆弱性対応済みの場合 (4.4.4-14.el7_3)

```
★攻撃コードの実行結果
[*] Exploit completed, but no session was created.
⇒ 攻撃元ホストから標的ホストへの接続失敗
```

#■ ワークアラウンド
/etc/samba/smb.conf に「nt pipe support = no」を追加することにより、攻撃を緩和することができます。
但し、Windowsクライアントから接続できなくなる場合があるようです。
(検証で使用したWindows10から接続できなくなりました。)

```
★/etc/samba/smb.conf に追記
# cat /etc/samba/smb.conf
～ 省略 ～
nt pipe support = no
～ 省略 ～

★攻撃コードの実行結果
[*] Exploit completed, but no session was created.
⇒ 攻撃元ホストから標的ホストへの接続失敗
```

#■ まとめ
既に攻撃コードは公開されているので、早急な対応が必要です。
● 修正パッチを適用する。
● 修正パッチを適用できない場合、ワークアラウンドを実行する。
● インターネットからSambaに接続する必要がない場合、445番ポートを閉じる。
　
また、Sambaを搭載しているNASなどのアプライアンス製品の場合、自分でパッチを適用することができない為、ベンダーの開示情報に従って下さい。
(2017年5月28日時点、主要なベンダーからの開示情報は無さそう。）
Tweepyで自分のツイートを大量に取得する

ここでは Python のライブラリである Tweepy を使って大量に自分のツイートを集める方法を記していきます。

前提
---
- Python3系を使います(Python2系の人は頑張ってね)
- Tweepyはインストール済みである前提で話します。
- TwitterAPI登録は既に登録済みである


コード
---
```python3:Tweet_data.py
# -*- coding: utf-8 -*-

import tweepy

# Tweepyの設定
CONSUMER_KEY = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
CONSUMER_SECRET = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET)
ACCESS_TOKEN = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
ACCESS_SECRET = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
auth.set_access_token(ACCESS_TOKEN, ACCESS_SECRET)
api = tweepy.API(auth)

i = 1
with open("Tweet_data.txt", "a+") as tf:
    for status in tweepy.Cursor(api.user_timeline).items():
        try:
            status = str(status.text).replace("\n","")    # ツイート内の改行を削除
            if "RT" in status:  # RTは書き込まない
                pass
            elif "https" in status: # 画像つきとURL付きツイートを書き込まない
                pass
            elif "@" in status: # リプの場合はIDを取り除いて書き込む
                status = status[status.find(" ")+1:len(status)] # "@"から" "インデックスを取得してそれ以降の部分のみ取得
                tf.write(status+"\n")
                print("Step%d: "%(i) +status)   # txtファイルに書き込まれたツイートを表示
                i += 1
            else:
                tf.write(status+"\n")
                print("Step%d: "%(i) +status)   # txtファイルに書き込まれたツイートを表示
                i += 1
        except UnicodeEncodeError: # 実行していると突然UnicodeEncodeErrorが出るが続ける
            pass

```
このコードを実行すると最初のツイートまで永遠に　txtファイルに書き込み続けるのでツイートが十分に集まったら ctrl+c で適当に中断してもらえれば　txtファイルに保存されています。

作られたtxtファイル
---
```
自分のツイートを大量に確保することに成功した
言語モデルネットワークを知りたい
えろ
所詮はマスゴミ
どれくらいツイートデータ集めようかな
多分これでUnicodeError出てもいける
お大事にね…何か違和感あったら病院行って見てもらい
買うべき
洗ったなら多少はマシか
ソースは俺のばあちゃん
まぁ多分腫れてしばらく痛いだけで済むけど割りときつい
これが野良犬なら死んでた
消毒しないと死ぬはないけど腫れますよ…
え…！？！？！？消毒してないん！？！？！？！？
なら良かったです
大丈夫ですか…
UnicodeEncodeError: 'cp932' codec can't encode character '\U0001f4a2' in position 28: illegal multibyte sequence
めっっっっっちゃ心配…
大丈夫と言われても心配なものは心配
ほんと心配
心配
ほんまに大丈夫か
いやいややばいやん
変数.find[x:y]でいけそう
空白文字以降だけを取り出したい
たとえば＠JUN_NETWORKS これリプなっていうのがあった際にこれをこれリプなみたいな感じでID部分だけ消して本文だけ取り出したいんよ
@から空白文字までだけを文字列から削除する方法ないかな
かなり上手いこといったけどこんどはリプのIDが付いてきたからそれ消さないと
全然大丈夫じゃなさそう
大丈夫…？
北れ犬に噛まれすぎやろ…
```
とまぁこんな感じのファイルが出来ます。

わからないことがあればコメント、もしくは私の[Twitter](https://twitter.com/JUN_NETWORKS)にリプを送ってもらえれば答えます。
[Elixir] ある特定の名前を持つAgentが存在するか判定する


↓のような感じである名前を持ったAgentが存在しているか判定し、
存在していかったらAgentを開始させてあげたい

```ex
defmodule MyAgent do

  def get(agent_name) do
    unless Agent.exists?(agent_name) do #Agent.exists? はない
      Agent.start_link(fn -> 1 end, name: agent_name)
    end
    Agent.get(agent_name, fn state -> state end)
  end
end
```

Elixirではプロセスに名前を登録することができる。
ある名前をもったプロセスが存在するかどうかは以下の関数で判定できそう

`Process.whereis/1`

```
iex(1)> Process.whereis(:hoge)
nil
iex(2)> Agent.start_link(fn -> 1 end, name: :hoge)
{:ok, #PID<0.83.0>}
iex(3)> Process.whereis(:hoge)
#PID<0.83.0>
```


なので冒頭のコードは以下のように書けばいけそう

```ex
defmodule MyAgent do

  def get(agent_name) do
    unless Process.whereis(agent_name) do
      Agent.start_link(fn -> 1 end, name: agent_name)
    end
    Agent.get(agent_name, fn state -> state end)
  end
end
```
Waffleで始める、初めてのIoT＋初めてのAndroidアプリ（Arduinoアプリ編）

いよいよ、Waffleで動作するアプリにチャレンジしていきます。
[こちら](https://dotstud.io/docs/waffle/)のdotstudio様のドキュメントを参考に書いていきます。

# 開発環境のインストール
WaffleはArduino（Arduino Duemilanove）ベースであるため、Arduinoアプリと同じ方法で作成ことが出来ます。
そこで、まずはArduino IDEをインストールします。

## ダウンロード
まずはArduino IDEのダウンロードを行います。
[https://www.arduino.cc/en/main/software](https://www.arduino.cc/en/main/software)をブラウザで開き、自分の環境に合ったインストーラをダウンロードします。
今回はWindows用のインストーラをダウンロードします。
![image1.png](https://qiita-image-store.s3.amazonaws.com/0/130771/764e2cc3-85bf-dc71-030e-ea6297ded951.png)
![image2.png](https://qiita-image-store.s3.amazonaws.com/0/130771/d9a0fc6c-fecf-19f6-f04b-9beb62e46c73.png)

## インストール
ダウンロードしたインストーラを実行し、Arduino IDEをインストールします。

まず、「I Agree」を選択します。
![image3.png](https://qiita-image-store.s3.amazonaws.com/0/130771/dd0602fd-6dd6-3752-87b6-c1f0b52e7605.png)

次に「Next」を選択します。
![image4.png](https://qiita-image-store.s3.amazonaws.com/0/130771/4d9094cf-0924-dbfc-077c-441dde54703a.png)

最後に「Install」を選択します。
![image5.png](https://qiita-image-store.s3.amazonaws.com/0/130771/e14866fc-2ba3-7912-68b6-d259b76328bb.png)

すると、Arduino IDEのインストールが開始されます。
![image6.png](https://qiita-image-store.s3.amazonaws.com/0/130771/78b97981-d4af-f331-f151-e3743986cfe4.png)

いくつかドライバのインストールの可否を聞いてきますので、全て「インストール」を選択します。
![image7.png](https://qiita-image-store.s3.amazonaws.com/0/130771/c47f1416-47e9-8f10-c0b3-606d926e9364.png)

インストールが終了したら「Close」を選択し、インストーラを終了させます。
![image8.png](https://qiita-image-store.s3.amazonaws.com/0/130771/97869d27-4f88-9bf8-c73c-be7a92383636.png)

# Arduino IDEの設定
早速、Arduino IDEを実行してみます。
と、その前に、WaffleをPCをにつなぐことを忘れないでください。
![image10.png](https://qiita-image-store.s3.amazonaws.com/0/130771/73b99ee1-f22a-e2e9-7cb1-8b9d1436444b.png)


起動すると、テンプレートのソースが表示された画面になります。
![image9.png](https://qiita-image-store.s3.amazonaws.com/0/130771/3de81575-5153-6180-e211-67da3bbce1ff.png)

とりあえず、Waffleボードの設定を行います。
メニューの「ツール」－「ボード」から「Arduino Duemilanove or Diecimila」を選択します。
![image11.png](https://qiita-image-store.s3.amazonaws.com/0/130771/5aedf88b-3a4c-86ef-7c8b-5a00617afa00.png)

また、シリアルポートは、WaffleがつながっているCOMポートを指定します。
![image12.png](https://qiita-image-store.s3.amazonaws.com/0/130771/4daa5aba-40b6-f260-9c33-0b2eadb9147e.png)

※COMポートに表示されない場合は[前回の記事](http://qiita.com/mine820/items/131a313dab0fd92a9f9b)を参考にしてください。

# サンプルプログラム
サンプルとして用意されているアプリのソースコードがGitHubで公開されているので、[こちら](https://github.com/hamatani63/Waffle)を取得しておきます。
（クローンしてもダウンロードしても良いです）
![image13.png](https://qiita-image-store.s3.amazonaws.com/0/130771/ad351e92-c9d7-01da-0bd7-8cff10a1fa97.png)

※この中には、Arduino用のアプリとともに、Android用のアプリのソースも含まれています。

Arduino IDEからサンプルのソースを開きます。
![image14.png](https://qiita-image-store.s3.amazonaws.com/0/130771/e468f78c-545d-c28b-f740-60bf1805d571.png)

言語はC言語のようです。
このソースを理解・修正しながら、お勉強していくのが良いのではないかと思います。