OmniAICreator/Qiita-1.07M huggingface dataset:
初級: dictionaryを使ってランチャーを作った

```bash:
curl http://localhost/a/b
```

のようなコマンドを発行支援するpythonスクリプト例。


# ランチャー

```python:launcher.py
#!/usr/bin/env python 
import sys
import subprocess

d = {}
d['url1'] = {'ip': '192.168.1.1', 'path': '/'}
d['url2'] = {'ip': '192.168.2.2', 'path': '/path2'}
d['url3'] = {'ip': '192.168.3.3', 'path': '/path/file'}
d['url4'] = {'ip': '192.168.4.4', 'path': '/a/b'}
d['url5'] = {'ip': 'localhost', 'path': '/a/b'}

def _help():
    print "[err] args need."
    print sorted(d)
    sys.exit(1)

def _cmd(key):
    cmd = "curl.sh "+d[key]['ip']+" "+d[key]['path']
    subprocess.call(cmd, shell=True)

if __name__ == '__main__' :
    if len(sys.argv) == 1 : _help()
    elif len(sys.argv) != 2 : _help("args wrong.")
    _cmd(sys.argv[1])
```

# シェル

```bash:curl.sh
#!/bin/sh
set -eu

ARG_IP=$1
ARG_PATH=$2
curl "http://${ARG_IP}${ARG_PATH}"
```
sensor > Link > MPU-9250 > ArduinoMotionSensorExample

9軸の傾斜計でDMPを使えば安定した傾斜の値を取れそうだというのは分かった。

9軸の傾斜計としてはMPU-9250（かピン配置の異なるMPU-9150)あたりなどが使えそう。
https://strawberry-linux.com/catalog/items?code=12250

MPU-9250に対してDMPを有効にした傾斜データ取得のコードを以下に見つけた。
https://github.com/rpicopter/ArduinoMotionSensorExample
sensor > Link > InvenSense のジャイロ・加速度センサ MPU-6050 を使う > DMP (Digital Motion Processor)

傾斜計を調べていると、どうも６軸（もしくは９軸）のセンサに関して、センサフュージョンにより補正した傾きを取るのがいいようだ。
その際につかうものとしてはDMP (Digital Motion Processor) があるようだ。

MPU-6050というもので6軸のセンサに対してはライブラリがあるようだ。
http://n.mtng.org/ele/arduino/tutorial024.html
Arduinoで文字列を数値に変換

# 1桁の数字の場合

`Serial.read()`で取得した数字を数値（整数）に変換するにはどうすれば良いでしょうか。
とりあえず1桁の数字であれば、下記のようなプログラムで数値に変換できます。
ただし、**1桁の数字だけではなく、2桁以上の数字も1行のコードで数値に変換する方法があります。**
次に紹介します。

```c++
void setup() {
  Serial.begin(9600);
}

void loop() {
  if(Serial.available()){
    // Serial.read()の戻り値はint型
    int var = Serial.read();
    int val = var - 0x30;
    if (val >= 0 && val < 9) {
      Serial.println(val);
    }
  }
}
```

# toInt()を使う

[toInt()](https://www.arduino.cc/reference/en/language/variables/data-types/string/functions/toint/)を使うと、1行のコードで2桁以上の数字を数値に変換できます。
下記は、シリアルモニタから送信した数字をArduinoで受信し、その数字を2倍にしてシリアルモニタに送信するプログラムです。

```c++
/**
 * @file        qiita_02ba1b3214c9dcfc443d.ino
 * @brief       String to Int Function
 * @author      Keitetsu
 * @date        2021/02/13
 * @copyright   Copyright (c) 2021 Keitetsu
 * @par         License
 *              This software is released under the MIT License.
 */

/**
 * @brief       セットアップ関数
 */
void setup()
{
    Serial.begin(9600);
}

/**
 * @brief       ループ関数
 */
void loop()
{
    String line;   // 受信文字列
    int line_len;  // 受信文字列の長さ
    long num;      // 受信整数

    // シリアル通信で1行（改行コードまで）読み込む
    line = Serial.readStringUntil('\n');
    // 文字列の長さを取得する
    line_len = line.length();
    // 文字列の長さが1文字以上の場合
    if (line_len > 0) {
        // 文字列を整数に変換する
        num = line.toInt();
        // 整数を2倍にする
        num *= 2;
        // シリアル通信で2倍にした整数を送信する
        Serial.println(num);
    }
}
```

# 謝辞
本記事について、`toInt()`を扱う方法を@KeitetsuWorksさんにご教示いただきました。
本項目でお礼させてください
２つの文字列を比較し、足りない文字数を数える

<注意点・備考>
- 備忘録として記載。
- コード参考、流用時は自己責任でお願いします。
#【要件】
２つの文字列(TRUE文字列、FALSE文字列)を比較し、
TRUE文字列内に含まれる文字が、FALSE文字列内では何個不足しているかを数える。

例1.
TRUE文字列 = "abcdef"
FALSE文字列 = "abcdeg" 
不足文字数：1つ('f'が1つ足りない)
例2.
TRUE文字列 = "abcdff"
FALSE文字列 = "abcfef" 
不足文字数：2つ('d'と'f'が1つずつ足りない)
例3.
TRUE文字列 = "abcdef"
FALSE文字列 = "abc" 
不足文字数：0つ('d'と'e'と'f'が1つずつ足りない)
例4.
TRUE文字列 = "abc"
FALSE文字列 = "abcdef" 
不足文字数：0つ(TRUE文字列内の文字はFALSE文字列内にすべて含まれている)

# 入出力
コマンドライン上で入出力を行う。
##　入力
TRUE文字列
FALSE文字列
##　出力
足りない文字数
# 設計
1.TRUR文字列内の文字と、その文字が出現する回数を管理するDictionary(以下、TRUE文字列用辞書と呼称)を作成
2.TRUE文字列の文字列の先頭から1文字ずつ取り出し、
　TRUE文字列用辞書に取り出した文字列が格納済みでないかチェックする。
3.格納されていなかったら、取り出した文字が、TRUE文字列の文字列内に何回出現するか確認する。
4,取り出した文字と出現回数を検索セット2次元配列に格納する。
5.TRUE文字列用辞書の1番目から、文字とその出現回数を取り出す。
6.取り出した文字列の、FALSE文字列での出現回数をチェックする。
7.取り出した文字列の、TRUE文字列での出現回数 - FALSE文字列での出現回数を行う。
8.7.の値が0より大きければ、足りない文字の個数に加算していく。

#ソースコード

```
using System;
using System.Collections.Generic;
using System.Linq;

    class Program
    {
        static void Main(string[] args)
        {
            //FALSE文字列
            string falseString = System.Console.ReadLine();
            //TRUE文字列
            string trueString = System.Console.ReadLine();

            Dictionary<char, int> serchSet = new Dictionary<char, int>();
            int diffCount = 0 ;

            foreach(char c in trueString )
            {
                int cCountTrue = 0;
                if(!serchSet.Keys.Contains(c))
                {
　　　　　　　　　　　//文字列中における特定文字の出現回数をカウント
                    cCountTrue= trueString .Length - trueString .Replace(c.ToString(),"").Length;
                    serchSet.Add(c, cCountTrue);
                }

            }

            //Dictionaryの取り出し
            foreach(KeyValuePair<char, int>pair in serchSet)
            {
                int cCountFalse = 0;
                int diff = 0;
                cCountFalse= falseString .Length - falseString .Replace(pair.Key.ToString(), "").Length;
                diff = pair.Value - cCountFalse;
                if(diff >0 )
                {
                    diffCount += diff;
                }

            }
            Console.WriteLine(diffCount);
       }
    }
```

# 参考ページ
・文字列中における特定文字の出現回数をカウント
http://www.atmarkit.co.jp/fdotnet/dotnettips/911countchar/countchar.html
AWS関連

**秘密鍵のパーミッションを変更**
所有者のみ読み込み可能(下記コマンドを実行後、SSHでEC2にログインできるようになった。)
chmod 400 hoge-key.pem

**ローカルからEC2へのログインは.sshディレクトリに移動してから行う**
vagrant@vagrant-ubuntu-trusty:~$ cd .ssh
vagrant@vagrant-ubuntu-trusty:~/.ssh$ ssh -i hoge_key.pem ec2-user@12.345.67.890

**vagrantユーザは、ec2-userと同じく、sudoを実行できる**
vagrant@vagrant-ubuntu-trusty:/var$ mkdir -p www/test_app
mkdir: cannot create directory ‘www’: Permission denied
vagrant@vagrant-ubuntu-trusty:/var$ sudo mkdir -p www/test_app

vagrant@vagrant-ubuntu-trusty:/var/www/test_app$ git clone git@github.com:hogehoge/fugafuga_service.git
fatal: could not create work tree dir 'fugafuga_service'.: Permission denied
vagrant@vagrant-ubuntu-trusty:/var/www/test_app$ sudo git clone git@github.com:hogehoge/fugafuga_service.git

**ローカルでのアプリの作成**
「cd /var/www」では、「rails new -d hoge_app -d postgresql」、は実行できない。「rails -v」コマンドを実行してもRailsのバージョンは表示されない。

vagrant@vagrant-ubuntu-trusty:~$ pwd　※ここで、「rails -v」を実行すると、Railsのバージョンは表示される。
/home/vagrant
vagrant@vagrant-ubuntu-trusty:~$ rails new -d hoge_app -d postgresql ← で、行う！！
vagrant@vagrant-ubuntu-trusty:~$ ls
archive  hoge_app

**vagrant(Ubuntu)にログインしたらまず行うこと**
sudo apt-get update
sudo apt-get upgrade
参考サイト
http://qiita.com/kazoo04/items/289c4f6a8501df3a7359
http://webkaru.net/linux/apt-get-command/
CDH5をUbuntuにインストール　その2(YARN SingleNode 編)　ついでにSPARKも

#1. CDH5（YARN）をインストール

以前試した
http://qiita.com/yuki_saito_/items/c435ec6832da60df9e27

CDH5をUbuntuにインストール　その2(MRv1 SingleNode 編)
のパラレルワールド

#2.手順

##2.1 CDH5のインストール
以下に沿ってインスト➖ル
http://www.cloudera.com/documentation/cdh/5-0-x/CDH5-Quick-Start/cdh5qs_yarn_pseudo.html

手順通りに簡単に構築できた。
ただ、メモリをめちゃめちゃ使うのでVMのメモリを２Gから６Gに変更した。

##2.2 SAPRKのインストール

sudo apt-get install spark-core spark-master spark-worker spark-history-server spark-python 

そして、.profileに
export SPARK_HOME=/usr/lib/spark
を追加して、sourceコマンドを実行

$SPARK_HOME/bin/spark-shell
で実行できる。

メチャメチャ簡単やん。
[メモ] らずぱいカメラ VLCでストリーミング

- (2024/4/25更新) 現在のRaspberry Pi OS(bookworm)ではカメラの扱いがだいぶ変わりました。(元記事は2016年)<p>RTSPでカメライメージを送る方法は、今は公式ページに、`rpicam-vid`コマンドでUDP、TCP、RTSPの例があります。
https://raspberrypi.com/documentation/computers/camera_software.html
ラズパイ4B-8GB + Bookworm-64bit-desktop 2024-03-15 + CameraModule2で、RTSPを試して、WindowsのVLCで画像が見れました。うちの環境では、だいぶカクカクしてましたが...。


---
## 概要
- [VLC](http://www.videolan.org/vlc/)を使って、らずぱいカメラをストリーミング。
- わざわざテレビつなげたくない。
- プレビューで、まぁまぁ、いいフレームレートでみたい。
- 画質は気にしない。
- Windows 10 64bit 上のVLCで再生する
![RPi_VLC1.png](https://qiita-image-store.s3.amazonaws.com/0/75594/9b089dad-d64e-ddb2-4261-6a398e008195.png)

## 環境
- Raspberry Pi 2/3
- `2016-05-27-raspbian-jessie.img`
- らずぱいカメラモジュール v2 (Sony IMX219 8MP)
- Windows 10 64bit (VLCをいれておく)

## 手順
### らずぱい側
1. `sudo apt-get install vlc`<br>-> `vlc`インストール
2. `raspivid -t -0 -w 1280 -h 720 -fps 30 -b 500000 -o - | cvlc -vvv stream:///dev/stdin --sout '#rtp{sdp=rtsp://:8554/}' :demux=h264`
<br>-> ストリーミング開始
<br> `-t タイムアウト(0だとタイムアウトなし)`
<br>`-w 幅 -h 高さ -fps フレームレート -b ビットレート`

### 再生側VLC 
1. メニュー: メディア(M) => ネットワークストリームを開く(N) 
2. \[ネットワーク\]タブ
3. ネットワークURL: rtsp://<らずぱいのIPアドレス>:8554/
4. \[再生\]
 ![RPi_VLC2.png](https://qiita-image-store.s3.amazonaws.com/0/75594/2b9e1bf7-38bb-a92d-8aff-847012523c59.png)



### その他
1. カメラのレンズの上のシールはがして、撮影しよう。おわったら、戻そう(?)
2. 時間をキャプチャしたところ、３秒くらいの遅延の模様
3. `RaspberryPi`タグ、1111個目記事
![RPi_VLC4.png](https://qiita-image-store.s3.amazonaws.com/0/75594/24b659f1-1574-f06e-b1b7-0ee11dbd4795.png)

<font ![RPi_VLC3.png](https://qiita-image-store.s3.amazonaws.com/0/75594/2619582d-4bd7-226e-1243-0b6dcac4bfa7.png)>
[メモ] Raspberry Pi - カメラ撮影コマンド(raspistill/raspivid)のビルド


## 環境
- Raspberry Pi 2/3
- `2016-05-27-raspbian-jessie.img`
- (テスト用)らずぱいカメラモジュール 
    - v1 (OmniVision OV5647 5MP)
    - v2 (Sony IMX219 8MP)

## 手順
```
cd
sudo apt-get install git build-essential cmake
git clone https://github.com/raspberrypi/userland.git
cd userland
mkdir build
cd build
cmake -DCMAKE_BUILD_TYPE=Release ..
make
#
# 生成物はここ
ls -l ./bin
#
# インストール先: /opt/vc 
sudo make install
```

- git: `https://github.com/raspberrypi/userland`
- カメラ周りのソースコード: [`userland/host_applications/linux/apps/raspicam`](https://github.com/raspberrypi/userland/tree/master/host_applications/linux/apps/raspicam)

## 今後の予定(遠い将来)
- WinのVisual Studioからデバッグ環境
- [mmal(Multi Media Abstraction Layer)](https://github.com/raspberrypi/userland/tree/master/interface/mmal)周り
Rails Active Record

![rubyrails.png](https://qiita-image-store.s3.amazonaws.com/0/20635/e5519673-8bb2-d23a-0725-89bee77fd01a.png)


## Active Recordとは？
RailsのORMフレームワーク(正確にはRailsのライブラリの一部)
ちなみに、Rubyではライブラリのことを**Gem**（英:磨いたりカットを施したりした)宝石、宝玉、宝石のように美しいもの、至宝、珠玉）と呼ぶ。
[Gemの種類](https://rubygems.org/)

## ORMフレームワークとは？
・データベースとオブジェクト指向プログラミング言語の間の非互換なデータを変換するプログラミング技法。
・オブジェクト関係マッピング（英:Object-relational mapping、O/RM、ORM、O/Rマッパー）と呼び名が多い。
・関係データベースにアクセスするプログラムを書く際の煩雑な処理を軽減させ、SQLを意識することなくプログラムを書ける。
>
・[オブジェクト指向](https://ja.wikipedia.org/wiki/%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E6%8C%87%E5%90%91)と[関係データベース](https://ja.wikipedia.org/wiki/%E9%96%A2%E4%BF%82%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9)の考え方を上手く変換して**繋いでくれるもの**
 
## 参考資料
・[第１回：O/Rマッピングとは？](https://thinkit.co.jp/free/article/0606/13/1/)
・[O/Rマッピングの役割とメリット](http://www.atmarkit.co.jp/ait/articles/0404/13/news075.html)
・[Active Record の基礎](http://railsguides.jp/active_record_basics.html)
Windows と Mac の違い私的まとめ[2016]

# Windows と Mac の違い私的まとめ

## 目的:

* あくまで私的メモ、あくまで
* ですが、購入を迷ってるひとの参考になれば…

## 対象:

* ITエンジニアの個人利用
* Windows しか使ったことなくて Mac をよく知らない方

## 注意:

* 当方、
    * プライベートでは今は Mac メイン
    * おしごとでは Win を使ってます
    * Win は 20 年くらい使ってます
    * Mac は途中ブランクがあったので 10年 くらいでしょうか
* 作業端末、クライアントPC視点です
  * サーバーには Unix Server か Windows Server を使おう

## 比較表:

| | Windows | Mac |
| :-: | :-----: | :-: |
| Shell | PowerShell, cmd | **bash** |
| 文字コード | CP932(SJIS) | **Unicode** |
| バックアップ | NTバックアップ, File History | **TimeMachine** |
| OSアップグレード | 無料(期間限定) | **無料** |
| ソフトウェア資産 | Windows用SW | **Unix SW, Mac用SW** |
| ソフトウェア配布 | Vector, 窓の杜, etc | ***github, homebrew, unix source code, etc***|
| パス区切り文字 | \ (バックスラッシュ) | / (スラッシュ) **Unix と同じ**|
| ハードウェア | **安いものからある**(質は相応) | 10万円~**(質は高い)** |
| タブレットOS | **デスクトップと共通, フルスペックOS** | iOS |
| メディアプレーヤー | Win Media Player(?), 3rd party | **iTunes** |
| メディア購入 | Win Store(?), tsutaya(?) | **iTunes Store** |
| モバイル | Windows Phone | **iPhone** |
| ゲーム | **(~~エロからFPSまで~~)なんでもある** | ブラウザゲー(やらないのでよく知らない)

## まとめ:

* Mac をおすすめしたい…したい
  * Windows は必要なときだけ仮想マシン上で使えばいい
  * ゲームがしたい方は別にゲーム用マシンを買いましょう

## Mac の良い点

### 1. TimeMachine バックアップ秀逸

* 1時間毎の差分バックアップ
* フルバックアップからの復元 (ユーザープロファイル、アプリ すべて復元)
* ファイル単位での復元
* バックアップがあるといつ壊れても安心

### 2. Unicode

* WEB, プログラミング は Unicode が標準、SJIS はマイナー

### 3. Unix

* Linux などをおしごとで使うかたなどは日常でも Unix(=Shell) を利用することで勉強が捗る
* あまたの Unix 資産が利用できる

## Mac の悪い点

### 1. ベンダーロックイン

* 良くも悪くも Apple に依存する
  * 依存を受け入れてしまえばコンピュータを利用することに集中できるので楽 (信者化)
* お金がかかることであっても受け入れざるを得ない

### 2. 情報が少ないと言われている(?)

* Unix 由来の英語の情報なら困ることはないくらいに大量にあるのでOK

### 3. (フリー)ソフトウェアが少ないと言われている(?)

* Unix 由来のソフトウェアは大量にある
  * 英語版しかないかもしれないが気にしない

### 

## Windows の良い点

### 1. サードパーティがいる

* 選択肢が多く、ベンダーロックインが発生しにくい
 * もちろん弱小 3rd Party が潰れるというリスクもある 

### 2. ハードが安い

* 質を気にしなければ安く入手でき初期コストを抑えられる

### 3. Surface Pro

* タブレットでフルスペックOSが使えるのは良い

### 4. 日本語の情報が多い(?)

* ITエンジニアなら英語でOK

### 5. 日本語化されたソフトウェアが多い(?)

* これもITエンジニアなら(ry

## Windows の悪い点

* PCハードの安かろう悪かろう感
* SJIS
* CLI環境(PowerShell, cmd)
* バックアップ貧弱
  * Disk入れ替え後のOS再インストールとアプリの再インストールなどは面倒
* Windows固有のソフトに依存してUnix(Mac, Linux)への移行が妨げられる
PythonからMySQLへ接続する

# はじめに
pythonからmysqlにmysql-connectorを利用して接続を試みます。

## 環境
* windows7
* MySQL5.7
* python3.5

## mysql-connectorをインストール

`pip`でインストールできるらしいので、`pip install mysql-connector-python`を実行
![SnapCrab_NoName_2016-6-18_17-51-26_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/129708/633b368b-d4ac-a1c6-6320-d778562ba9e3.png)

はい、エラー。
よくわからなかったので別のやり方で。


まずはconnectorを[こちら](https://pypi.python.org/pypi/mysql-connector-python/2.0.4)からダウンロード
![SnapCrab_NoName_2016-6-19_11-39-6_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/129708/5d84ea2b-3442-a5cf-7833-14c29688d2c8.png)
<Font color="red">※Programming LanguageにPython3.5の記述がないので対象外なのかと思いましたが、接続は成功しました。</font>

解凍したディレクトリで、`python setup.py install` を実行すればインストールされます。

確認は`pip list`で。
![SnapCrab_NoName_2016-6-18_18-12-45_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/129708/0b2904d1-d7b2-6c00-9a04-85b3a915586e.png)

無事にインストールできた様子。

## データベース、テーブル、データの準備

今回は以下のように作成します。

```
# データベース
create database test;

# テーブル
create table user (id char(10), name char(20));

# データ登録
insert into user values ('01', 'hoge');
```

では、さっそく。

![SnapCrab_NoName_2016-6-18_18-15-51_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/129708/c09b1f84-56d4-e561-40e7-3c31d4c03998.png)

こんな感じでさくっとできました。
問題なさそうですね。


## pythonからmysqlにアクセスして情報を取得する
ついにこの時がやってきました。
涙が出そうですが、まだ早いです。
コードはこんな感じ。

```db_access.py
# -*- coding: utf-8 -*-

import mysql.connector

conn = mysql.connector.connect(user='root', password='root', host='localhost', database='test')
cur = conn.cursor()

cur.execute("select * from user;")

for row in cur.fetchall():
    print(row[0],row[1])

cur.close
conn.close

```

みじかっ。
こんなに簡単にDBアクセスして情報の取得ができるんですね。

実行した結果はこちら。
![SnapCrab_NoName_2016-6-18_18-18-44_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/129708/25ff275c-ada7-4317-e749-2a9178454b1b.png)

問題なく`01`と`hoge`が取得できていますね。

## 最後に
`connector`、`cursor`については全く理解できてません。。。
別の機会に調べてまとめたいと思います。
Rails callback関数 

![rubyrails.png](https://qiita-image-store.s3.amazonaws.com/0/20635/e5519673-8bb2-d23a-0725-89bee77fd01a.png)


1. 〜とは？
2. 使用用途
3. 使い方

## callback関数
1.[「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典](http://wa3.i-3-i.info/word12295.html)がとても分かりやすかった。
2.[バリデーション](http://www.sophia-it.com/content/%E3%83%90%E3%83%AA%E3%83%87%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3)の実行やデータベースへの保存などのタイミングで処理を行うための機能
3.あるタイミングで必ず実行する必要がある処理をコールバックに指定することで、モデルの一貫性を保つことができる。

## callback種類
・[Active Record コールバック
](http://www.techscore.com/blog/2012/12/25/rails%E3%81%AE%E3%82%B3%E3%83%BC%E3%83%AB%E3%83%90%E3%83%83%E3%82%AF%E3%81%BE%E3%81%A8%E3%82%81/)・[Railsのコールバックまとめ](http://railsguides.jp/active_record_callbacks.html)
Rails renderとredirect_toの違い

![rubyrails.png](https://qiita-image-store.s3.amazonaws.com/0/20635/e5519673-8bb2-d23a-0725-89bee77fd01a.png)


1. 〜とは？
2. 使用用途
3. 使い方

## render 
1.[レタリング](https://ja.wikipedia.org/wiki/%E3%83%AC%E3%83%B3%E3%83%80%E3%83%AA%E3%83%B3%E3%82%B0_(%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF))するテンプレートを指定する。
2.エラーメッセージ表示のために、元の画面に差し戻す際などに利用する。
3. `render オプション`

## redirect_to
1.指定されたページに[リダイレクト](http://e-words.jp/w/%E3%83%AA%E3%83%80%E3%82%A4%E3%83%AC%E3%82%AF%E3%83%88.html)
2.クライアントにリダイレクト先URLを返却し、クライアントは再度そのURLにリクエストを上げることになる
3.`redirect_to(リダイレクト先のURL [, :status => ステイタスコード, オプション])`

## 違い？
・renderがviewファイル（RHTML）を出力して表示するだけ（変数などの値はそのまま）
　　・画面遷移+表示

・redirect_toは再度ページにアクセスする（処理が新たに始まる）
　　・画面遷移+表示+処理の委譲を実行
RyuでOFスイッチのIPアドレスを知るには

## 結論

`datapath.address[0]`で取れる。

## 動機

Ryuを使っていて、OpenFlowスイッチのIPアドレスが取りたくなった。

## 環境

- Ryu 4.3
- スイッチはOpen vSwitch 2.5.0を使用
- OpenFlow1.3で接続

## まずはリファレンスを

入っているとしたらdatapathオブジェクトかなーと思ったので、まずは[Datapathクラスのリファレンス](http://ryu.readthedocs.io/en/latest/ryu_app_api.html#ryu-controller-controller-datapath)を読む。

…ない(´・ω・｀)

## ググる

同じこと考えてる人いないかな、と思って色々ググって探すと、[NCLC様のブログ記事](http://www.nclc.co.jp/blog/sdn_develop/2014/03/)を発見。

> そこで以下の情報もついでに取得します。
［スイッチ全体］
 ・ 動作OpenFlowバージョン
 ・ IPアドレス
 ・ 保持しているポートの数

取れてる！

早速ソースを読むと、どうやら`datapath.address[0]`で取れているっぽい。

再度[リファレンス](http://ryu.readthedocs.io/en/latest/ryu_app_api.html#ryu-controller-controller-datapath)を確認…やっぱり載ってない(´・ω・｀)

## 試す

早速試してみる。Ryuのサンプルコード[simple_switch_13.py](https://github.com/osrg/ryu/blob/v4.2/ryu/app/simple_switch_13.py)のswitch_features_handlerに、以下の行を足す。

```
# print IP address of the switch
self.logger.info(datapath.address[0])
```

立ち上げてローカルホストのスイッチから繋ぎに行くと…

```
$ ryu run simple_switch_13.py
loading app simple_switch_13.py
loading app ryu.controller.ofp_handler
instantiating app simple_switch_13.py of SimpleSwitch13
instantiating app ryu.controller.ofp_handler of OFPHandler
127.0.0.1
```

取れた！！

ちなみに、[0]を外して出力してみると、`('127.0.0.1', 35148)`とかになる。IPアドレスとポート番号のタプル。

## コードを追っかけよう

取れた…はいいけど、リファレンスに載ってないAPIを使うのはちょっと怖いので、コードを追っかけてみる。

[Dapapathクラスの定義](https://github.com/osrg/ryu/blob/v4.2/ryu/controller/controller.py#L134)を見ると、確かにaddress属性は格納されており、この変数の受け渡しを遡っていくと、[ここ](https://github.com/osrg/ryu/blob/v4.2/ryu/lib/hub.py#L129)に行きつく。

```
sock, addr = self.server.accept()
```

self.serverは[eventlet.listen](https://github.com/eventlet/eventlet/blob/v0.19.0/eventlet/convenience.py#L40)の戻り値でありsocketである。[socket.accept](http://docs.python.jp/2.7/library/socket.html#socket.socket.accept)の戻り値なので、addrには`(host, port)`が入るのでした。
Groongaを使ったゆるい検索


表記揺れや間違ったキーワードでも検索にヒットさせたい、というニーズを実現するためのアプローチ方法について学びました。

# アプローチの分類
1. 間違っていてもヒットさせてあげる
	1. データで頑張る
	2. 検索時に頑張る
2. そもそも間違わないようにしてあげる

# 間違っていてもヒットさせてあげる

## データで頑張る編
間違うであろう内容を先回りして登録していく手法

1. 検索ログから間違いの傾向を検出して登録していくとか。
	- typoとかに対応しやすい
	- Groongaのログから検出するツールがある。
2. 某pediaのredirectページを集めて登録するとか。
	- 略称や別名は対応しやすい
3. 元データを登録時に形態素解析してありうる読みを全部登録していくとか。
	- 読み間違えとかに対応しやすい

## 検索時に頑張る編
検索時にGroongaの力でヒットさせる手法

1. 数文字の間違いは誤差として検索できる(fuzzy_search機能)
	- fuzzy_search機能を使うと、数文字の誤差を無視してヒットさせる事ができる。
	- mroongaでの使い方
		- MATCH AGAINST句のクエリを`*SS`で始めるとgroongaのコマンドを書ける。そこでfuzzy_searchコマンドを使えるようになる。
			- SSはScript Syntaxの略。[参考](http://mroonga.org/ja/docs/reference/full_text_search/boolean_mode.html#ss)
2. 類似した文章を検索できる(類似文書検索)
	- 類似文書検索をすると、完全に一致していなくてもヒットさせる事ができる。
	- mroonga
		- MATCH AGAINST句を `IN BOOLEAN MODE`ではなく `IN NATURAL LANGUAGE MODE`にすると類似文書検索になる。
			- 実はデフォルト値なので、 `IN BOOLEAN MODE`を削除するだけでもOK。
	- 固有名詞を検索させたい場合は、MecabトークンよりBigramを使うといいかも(要検証)
		- 類似検索は一部のトークンが一致してればOKという機能なので、小さいトークンにすると一致する確率があがる。
			- ノイズが多くなるけど。

## そもそも間違わないようにしてあげる
- 時間切れにつき、またの機会に。



# まとめ
- 「間違っていてもヒットさせてあげる」においては、検索時よりはデータ収集に力を入れたほうが効果が高そう。
- 「そもそも間違わないようにしてあげる」に力を入れるのがお勧めという説があったので、要勉強。
第7回大阪Jenkins勉強会に参加しました

#感想
・参加者が多くて、キャンセル待ちだったけど当日朝10時にキャンセルが出て参加できることになりました。ラッキー！
・Jenkinsの作者って、日本人だったんだ！いつも助かってますと、感謝を伝えられました。
・新UI楽しみ！
・Jenkinsステッカー頂きました！
・新しいパイプラインの仕組み(jenkinsfile)便利そう！

ビアバッシュのLTでアラーム君の紹介をさせていただきました。
・LTは難しい！リハ、テスト大事笑
・XFD作っている方と知り合いになれました！
・情報発信大事！

内容は、以下のページがまとまってます！(丸投げ)

### 第7回大阪Jenkins勉強会　connpassイベントページ
Jenkins2.0 リリース記念
http://connpass.com/event/31573/

### #jenkinsstudy 第7回大阪Jenkins勉強会は、Jenkins入門から始まり、彼女を作ってぬくもりが足りず、Blue Oceanのハックで終わった1日であったよ！
http://bufferings.hatenablog.com/entry/2016/06/19/103341

###2016.06.18 第7回大阪Jenkins勉強会 に参加してきた
http://blog.naichilab.com/entry/2016/06/18/165743
memo

#リポジトリの初期設定

```
echo "# README" >> README.md
git init
git add README.md
git commit -m "first commit"
git remote add origin https://github.com/ユーザー名/リポジトリ名.git
git push -u origin master
```

#commitとpush
例)READMEに追加してcommit&push

```
echo "spam" >> README.md
git add README.md
git commit -m README.md
git push
```
initd-foreverでnodeプロセスを自動起動する



## 環境
* EC2(Amazon Linux)

## インストール

* initd-foreverインストール
 
```
# npm install -g forever initd-forever 
# npm install -g log
```

* 起動スクリプトの生成（nodeのエントリーポイントがあるディレクトリで、起動スクリプトの雛形を作成）

```
# initd-forever -n hoge（サービス名）
Script daemon file saved to hoge
# chmod +x hoge
# mv hoge /etc/init.d
```

* エントリーポイントになるスクリプトの指定

```bash:/etc/init.d/hoge
nodeApp="/home/hoge/"
↓
nodeApp="/home/hoge/server.js"
```

* サービスの有効化

```
# chkconfig hoge --add
# chkconfig hoge on
# chkconfig hoge --list
# service hoge start
```

* サーバーを再起動して、自動起動されるかを確認する




## Tips
### foreverコマンド
* プロセス一覧確認

```
# forever list
```

* ログ確認

```
# forever log
```
GAEを静的ファイル置き場にしてみた


意外とGoogle Appengineを静的ファイルだけで構成する情報がなかったのでその備忘録
##環境構築
Google App Engine SDKが必要なので以下を参考に
[Download the Google App Engine SDK](https://cloud.google.com/appengine/downloads "SDK")

##構成
とりあえず、runtimeはpython
ディレクトリはシンプルなこんな感じで

```
static_sample
├── app.yaml
├── sample.html
└── style
    └── style.css
```
##ソース
みんな大好きHELLO WORLD

```sample.html
<!doctype html>
<html>
	<head>
		<meta charset="UTF-8">
		<link rel="stylesheet" type="text/css" href="/style/style.css">
	</head>
	<body>
		<h1>HELLO WORLD!!</h1>
	</body>
</html>
```
とりあえず文字色を変更するだけ

```style.css
h1 {
	color: red;
}
```
deployに必要な設定
「application」と書いてあるけど、設定値はproject IDなので注意
あと、uploadに「.sample.html」と書いてもローカルサーバでは動いちゃうけどdeployしたら動かないので注意
(そもそもそんな記述しないか…)

```app.yaml
application: {project ID}
module: staticsample1
version: 1
runtime: python27
api_version: 1
threadsafe: true

handlers:
- url: /
  static_files: sample.html
  upload: sample.html

- url: /style
  static_dir: style
```

##さあ動かそう!!!
ローカルサーバで確認

```
cd static_sample
dev_appserver.py .
```

`http:localhost:8080`でアクセスで確認

いよいよdeploy

```
cd satic_sample
appcfg.py update .
```

Developers ConsoleのApp Engineでdeployされてるか確認
以下のアドレスで確認
`https://staticsample1-dot-{project ID}.appspot.com/`
※「staticsample1」はmodule名

##その他
cssファイルだけのサンプルだけどjsファイル、画像ファイルも同じ感じで動く
アップロードするファイルを正規表現で指定もできるけどそれはまた今度
Atomを使う際のメモ書き


普段はSublimeを使用しておりますが、人（初心者）にエディタを進める際、「とりあえず$70払ってね」とは言いづらいのでAtomを勧めたいが、自分自身が使い方がよくわからないのでメモ。環境はMacです。

##まずは基本的な設定から。

Sublimeと違い、多くの設定をGUIから行うことができます。[Preferences]を開き、まずはSettingsにて基本的な項目をいじります。
> なお、昔インストールしていて~/.atomが残ってたりすると変な設定が引き継がれたりしてるので、インストール前に消して置くほうがよい。

### Font Size

14から13にします。まあ、お好みで。

### Show Indent Guide

チェックを入れます。tabに縦線が入ります。

### Show Invisibles

チェックします。スペースや改行などが表示されます。

### Tab Length

2から4に変更します。

## Sublimeに近づける

とりあえずSublime Textでよく使っていた機能で、Atomに標準でないものをPackageを追加することにより補います。
設定画面の[Install]にて、必要なパッケージを検索、インストールします。

> 私の場合、標準のpythonを3にバージョンアップしていたので、パッケージのインストールがこけました。pythonをデフォルトのバージョンに戻したら問題ありませんでした。

###Sublime-Style-Column-Selection

いわゆる矩形選択機能を追加できるパッケージです。

###hightlight-selected

文字を選択すると、同じ文字が選択される機能です。

###tag

HTMLのタグを自動的に閉じてくれるやつ。autoclose-htmlというのもメジャーのようですが、Sublimeの仕様と違うため、合わせるならこちらを選択（autoclose-htmlは\>でcloseする。が、こちらのほうが無駄がない・・・）。

###project-manager

プロジェクト管理できるやつ。プロジェクト登録はPackages->ProjectMangerから。
呼び出しはCtr + Command + Pで。削除は、メニューからEditを選んで設定ファイルを編集。

###file-icons

拡張子毎にアイコンを変えてくれるやつ。

## Sublimeを超える？

###terminal-plus

Atomの画面でterminalを呼べるやつ。最初term3というのを入れてみましたが、こっちのほうがアイコンで操作できるなど、便利そう。

##Tips

###コマンドラインで起動

インストール後、atomと打てば起動します。フォルダに移動し、atom .とすれば、そのディレクトリを開いてくれます。

###検索

ファイルはCommand + Tで探せばいいでしょう。文字検索は、ファイル内であればCommand + F、指定フォルダ全体であればCommand + Shift + Fで行います。

###MarkDownエディタ機能を使う

Ctr + Shift + Mでプレビュー表示/非表示。プレビュー画面を右クリックするとHTMLで保存できる。

###画面分割

画面分割はCommand + kの後に（押しながらではなく）、→キーを押します。必要に応じて、左右、上下を選択します。
分割したペイン間の移動はCommand + kの後にCommand + →などとします。

###プラグイン開発

SublimeではPythonでプラグインを書いていたが、AtomではCoffeeScriptで書く。雛形は作ってくれるみたい。暇になったらSublime用に書いたプラグインを移植してみたい。

###その他、雑感など。

Sublimeに比べれば確かに「もっさり」してるけど、小さなファイルくらいなら気にならない。が、Frameworkのフォルダ読み込んだりすると起動が遅い。
ruby null object pattern

http://stackoverflow.com/questions/6063347/best-practice-try-vs-rescue

https://www.youtube.com/watch?v=29MAL8pJImQ

https://gorails.com/episodes/refactoring-with-the-null-object-pattern

https://github.com/gorails-screencasts/gorails-episode-52/commits/master

http://api.rubyonrails.org/classes/ActiveRecord/QueryMethods.html#method-i-none

https://allenan.com/refactoring-rails-views/

http://blog.abushady.com/2015/05/09/using_null_objects_pattern.html
leJOSのTimerクラス、TimerListnenerインタフェースの使い方サンプル

1秒ずづ数えるカウンター

```SecondCounter.java
import lejos.utility.Timer;
import lejos.utility.TimerListener;

public class SecondCounter {
	private int second;
	
	// 1000ミリ秒ごとに割り込みを発生させる
	private Timer timer = new Timer(1000, new CountTimer());

	public void reset() {
		second = 0;
	}
	
	public int getSecond() {
		return second;
	}
	
	public void start() {
		timer.start();
	}
	
	public void stop() {
		timer.stop();
	}
	
	class CountTimer implements TimerListener {
		// 1000ミリ秒ごとにtimedOut()メソッドが、Timerから呼ばれる
		public void timedOut() {
			second++;
		}
	}
}
```

```SecondCounterSample.java
import lejos.hardware.Button;
import lejos.utility.Delay;

public class SecondCounterSample {

	public static void main(String[] args) {
		SecondCounter counter = new SecondCounter();
		
		counter.start(); // カウントを始める
		
		for (int i = 0; i < 30; i++) {
			System.out.print(counter.getSecond() + " ");
			
			if (i == 10) {
				System.out.print("reset ");
				counter.reset(); // 時間をリセットする
			} else if (i == 15) {
				System.out.print("pause ");
				counter.stop(); // カウントするをを止める
			} else if (i == 25) {
				System.out.print("restart ");
				counter.start(); // カウントを始める (時間は前の続き)
			}
			
			Delay.msDelay(400); // 0.4秒ループを待つ
		}
		
		counter.stop(); // カウントするのを止める

		System.out.println();
		System.out.println("push any button");
		Button.waitForAnyPress();	// 何かボタンが押されるまで待つ
	}

}
```
Rails4メモ：フラッシュ表示



### コントローラでセットされたフラッシュを表示

```app/view/application.htnl.erb

    <div class="container">
      <!-- flash message -->
      <% flash.each do |message_type, message| %>
        <div class="alert alert-<%= message_type %>"><%= message %></div>
      <% end %>
      <!-- end flash message -->
      <%= yield %>
    </div>

```

```xxx_controller.rb

    def update
      flash[:success] = "profile update!"
      redirect_to @user
    end

```
leJOSのStopwatchクラスの使い方サンプル

``` StopwatchSample.java
import lejos.hardware.Button;
import lejos.hardware.Sound;
import lejos.utility.Delay;
import lejos.utility.Stopwatch;

public class StopwatchSample {

	public static void main(String[] args) {
		Stopwatch stopwatch = new Stopwatch();		// インスタンスを作ると時間の計測が始まる

		System.out.println(stopwatch.elapsed());	// 経過時間を取得
		Delay.msDelay(3000);						// 3000ミリ秒待つ
		System.out.println(stopwatch.elapsed());	// 待っている間も時間の計測をしている

		stopwatch.reset();  						// 経過時間をリセット
		System.out.println(stopwatch.elapsed());
		while (true) {
			Delay.msDelay(1000);						
			System.out.println(stopwatch.elapsed());

			if (stopwatch.elapsed() % (5 * 1000) < 1000) {
				// 5秒毎に音を鳴らす
				Sound.beep();
			}
			if (stopwatch.elapsed() > 30 * 1000) {
				// 30秒経過したらループを抜ける
				break;
			}
		}
		
		System.out.println("push any button");
		Button.waitForAnyPress();	// 何かボタンが押されるまで待つ
	}

}

```
Arduino > Time > ラッパー関数用ライブラリ実装 > esp8266_160619_timeLib.ino

```txt:動作確認
ESP-WROOM-02
```

参考 http://qiita.com/exabugs/items/fe46ec45ff2ffd6c5777

https://github.com/PaulStoffregen/Time
のTimeライブラリ使用

上記のライブラリを使う上で自分が使いたい形に処理をするためのラッパー関数が必要となる。
当面目指しているのはUDPLoggerに対してUDPコマンドから時計合わせを行うこと。これでUDPLoggerが時刻を持ってくれる。


## timeLib > esp8266_160619_timeLib.ino

以下のラッパー関数を実装した。

- void TimeLib_Set_yyyymmddhhnnss(char *srcPtr, int size);
  - yyyymmddhhnnss 形式でのsetTime()実行
- void TimeLib_SerialTxDateTime(void);
  - 日時のシリアル出力

```c:esp8266_160619_timeLib.ino
#include <TimeLib.h>
#include <stdarg.h> // for va_XXX()

/*
 * using time library by
 * https://github.com/PaulStoffregen/Time
 */

/*
 * v0.1 19 Jun. 2016
 *   - add TimeLib_SerialTxDateTime()
 *   - add myPrintf()
 *   - add Test_TimeLib_Set_yyyymmddhhnnss()
 *   - add TimeLib_Set_yyyymmddhhnnss()
 */

void TimeLib_Set_yyyymmddhhnnss(char *srcPtr, int size)
{
  //         01234567890123
  // srcPtr: yyyymmddhhnnss

  if (size < 14) {
    return; // error
  }
  char szbuf[20];
  int hh, nn, ss, dd, mm, yyyy;

  strcpy(szbuf, srcPtr);
  ss = atoi(&szbuf[12]);
  szbuf[12] = 0x00;
  nn = atoi(&szbuf[10]);
  szbuf[10] = 0x00;
  hh = atoi(&szbuf[8]);
  szbuf[8] = 0x00;
  dd = atoi(&szbuf[6]);
  szbuf[6] = 0x00;
  mm = atoi(&szbuf[4]);
  szbuf[4] = 0x00;
  yyyy = atoi(&szbuf[0]);

  setTime(hh, nn, ss, dd, mm, yyyy);
}

void Test_TimeLib_Set_yyyymmddhhnnss(void)
{
  char settim[] = "20160619101200"; // yyyymmddhhnnss
  TimeLib_Set_yyyymmddhhnnss(settim, sizeof(settim));  
}

void myPrintf(char *fmt, ...) 
{
  char buf[128];
  va_list args;
  va_start(args, fmt);
  vsnprintf(buf, 128, fmt, args);
  va_end(args);
  Serial.print(buf);  
}

void TimeLib_SerialTxDateTime(void)
{
  myPrintf("%02d:%02d:%02d", hour(), minute(), second() );
  myPrintf(",%02d/%02d/%04d", day(), month(), year() );
  Serial.println();
}
```

例として、上記のコードを以下のプログラムで使う。
同じスケッチ内のタブで定義。

```c:esp8266_160619_testTimeLib.ino
void setup() 
{
  char settim[] = "20160619103200"; // yyyymmddhhnnss
  TimeLib_Set_yyyymmddhhnnss( settim, sizeof(settim) );
     
  Serial.begin(115200);
}

void loop() {
  TimeLib_SerialTxDateTime();
  delay(3000);
}
```

```txt:結果
10:32:03,19/06/2016
10:32:06,19/06/2016
10:32:09,19/06/2016
10:32:12,19/06/2016
10:32:15,19/06/2016
10:32:18,19/06/2016
10:32:21,19/06/2016
```
UnityのRendering Modeの違いメモ

#Opaque
デフォルトの設定。"不透明"のマテリアル。
<img width="661" alt="Screenshot 2016-06-19 10.16.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/69390/df4460ed-9739-a2bd-05c3-21759bc63b49.png">

#Cutout
"抜き"のマテリアル。アルファテストによりアルファが「Alpha Cutoff」の値より小さい場所が完全に描画されなくなる。
そのような仕組みなので、カメラがオブジェクトに寄った時に抜かれているエッジのジャギが目立つことになる。
葉っぱとか大量に描画するものなどに使われることが多い。

<img width="663" alt="Screenshot 2016-06-19 10.16.58.png" src="https://qiita-image-store.s3.amazonaws.com/0/69390/8ec3a77f-a53f-13a7-4492-67427d70c9ed.png">

#Fade
Transparentに近いけど、こちらはハイライトや反射も消える。
"抜き"にしたいけど、エッジのジャギが気になる時などは、これを使うと良い。
(ちょっとサンプルの画像だと分かりにくいけど...)
Cutoutと違ってアルファテストで描画が刈られないのでフィルを食ってしまう。

<img width="662" alt="Screenshot 2016-06-19 10.17.17.png" src="https://qiita-image-store.s3.amazonaws.com/0/69390/be98eb83-39a3-cd4c-7a84-9edff85fb3a7.png">


#Transparent
"半透明"のマテリアル。透明な物質なので拡散反射はほとんどしないけど、ハイライトや反射などは残る。
プラスチックやガラスなどを表現するときに使うと吉。

<img width="663" alt="Screenshot 2016-06-19 10.17.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/69390/497598e2-5a89-caa9-ca26-e56896973b3a.png">
PHPで特定のHTMLタグのみを除去

#特定のタグを除去する機能

       function removeHtmlTags($html, $tag){
           $reg = '/<' .$tag .'.*?>|<\/' .$tag .'>/mis';
           $escape = preg_replace($reg, '', $html);
           return $escape;
       }

(*´﹃｀*)
Arduino > Time > 日時設定 > setTime(hh, nn, ss, dd, mm, yyyy);

```txt:動作確認
ESP-WROOM-02
```

参考 http://qiita.com/exabugs/items/fe46ec45ff2ffd6c5777

https://github.com/PaulStoffregen/Time
のTimeライブラリ使用

上記のライブラリを使用してESP8266の日時設定をする。
setTime()という関数があるようだ。

> Functions for managing the timer services are:  
setTime(t);             // set the system time to the give time t
setTime(hr,min,sec,day,mnth,yr); // alternative to above, yr is 2 or 4 digit yr (2010 or 10 sets year to 2010)

```c:eps8266_160619_timeLib.ino
#include <TimeLib.h>
#include <stdarg.h>

void setup() {

#if 1
  setTime(9, 43, 0, 19, 6, 2016);
#else
  setTime(86400); 
#endif  
   
  Serial.begin(115200);
}

void myPrintf(char *fmt, ...) 
{
  char buf[128];
  va_list args;
  va_start(args, fmt);
  vsnprintf(buf, 128, fmt, args);
  va_end(args);
  Serial.print(buf);  
}

void loop() {
  myPrintf("%02d:%02d:%02d", hour(), minute(), second() );
  myPrintf(",%02d/%02d/%04d", day(), month(), year() );
  Serial.println(); 

  delay(3000);
}
```

```txt:結果
09:43:03,19/06/2016
09:43:06,19/06/2016
09:43:09,19/06/2016
09:43:12,19/06/2016
09:43:15,19/06/2016
09:43:18,19/06/2016
09:43:21,19/06/2016
09:43:24,19/06/2016
```
Arduino > Link > myprintf() > printf()の書式指定子を使用 > +TimeLibで時刻表示

```txt:動作確認
ESP-WROOM-02
```


時計情報を0パディングで表示したい。

参考 http://playground.arduino.cc/Main/Printf
を見ていると独自関数の実装例がある (Creating a printf() wrapperの節)

```
#include <stdarg.h>
void p(char *fmt, ... ){
        char buf[128]; // resulting string limited to 128 chars
        va_list args;
        va_start (args, fmt );
        vsnprintf(buf, 128, fmt, args);
        va_end (args);
        Serial.print(buf);
}
```

va_XXX()という関数は可変引数を扱うようだ。初めて見た。

以下のように実装した。
http://qiita.com/exabugs/items/fe46ec45ff2ffd6c5777
を参考にTimeライブラリをインポート済。

```c:esp8266_160619_timeLib.ino
#include <TimeLib.h>
#include <stdarg.h>

void setup() {
  Serial.begin(115200);
}

void myPrintf(char *fmt, ...) 
{
  char buf[128];
  va_list args;
  va_start(args, fmt);
  vsnprintf(buf, 128, fmt, args);
  va_end(args);
  Serial.print(buf);  
}

void loop() {
  myPrintf("%02d:%02d:%02d", hour(), minute(), second() );
  myPrintf(",%02d/%02d/%04d", day(), month(), year() );
  Serial.println(); 

  delay(3000);
}
```

```txt:結果
00:01:58,01/01/1970
00:02:01,01/01/1970
00:02:04,01/01/1970
00:02:07,01/01/1970
00:02:10,01/01/1970
00:02:13,01/01/1970
00:02:16,01/01/1970
00:02:19,01/01/1970
00:02:22,01/01/1970
00:02:25,01/01/1970
00:02:28,01/01/1970
00:02:31,01/01/1970
00:02:34,01/01/1970
00:02:37,01/01/1970
00:02:40,01/01/1970

```

時刻表示ができるようになった。
Arduino > printf()関数 > 奥が深い > F()マクロ: コンパイルエラー

```txt:動作確認
ESP-WROOM-02
```

Timeライブラリを使って時計情報を表示しようとしている。
hour, minute, secondは0パディングで表示したいのだが、それをSerial.println()で行う場合、自作関数で実装している例が見つかる。

ビルトイン関数はないものか。

printf()に関して以下のリンクを見つけた。
http://playground.arduino.cc/Main/Printf

試しにFマクロを使う以下の方法を試してみた。

>It can also transparently support using the F() macro to put the printf() formatting strings into flash.

```
Serial.printf(F("Hello World\n"));
Serial.printf(F("Value is:%3d\n"), value);
```

```c:esp8266_160619_timeLib.ino
#include <TimeLib.h>

void setup() {
  Serial.begin(115200);
}

void loop() {
  Serial.printf( F("%02d:%02d:%02d"), hour(), minute(), second() );
  Serial.printf( F(",%02d/%02d/%04d"), day(), month(), year() );
  Serial.println(); 

  delay(3000);
}
```

以下のエラーが出た

```
exit status 1
no matching function for call to 'HardwareSerial::printf(const __FlashStringHelper*, int, int, int)'
```

0パディングは自作関数にするのが楽かもしれない。
Restyaboard を Ubuntu 14.04 にインストールしてみる（適当な問題解決をしたという記事）

あまり良くわかっていないけど、[オフラインでもChatOpsしたい！Dockerで解決しよう！](http://qiita.com/tsuruchika/items/8379fab837c17d98e781)の記事に触発されてインストールしようとした。

ところが、インストールスクリプトの実行中にエラーが出まくってちゃんとインストールできていないっぽかった。

根本原因は postgresql の apt を入れたところで公開鍵署名が見つけられずにエラーになっている・・・ことと、その関係で依存関係が壊れちゃうことっぽい感じ。

公開鍵署名については `sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 7FCC7D46ACCC4CF8 7638D0442B90D010 7638D0442B90D010 9D6D8F6BC857C906` したら直ったっぽい。

依存関係が壊れたのは、apt-get コマンドの代わりに aptitude コマンドを使って何かインストールしてみると良いっぽい。

インストールしても nginx を80ポートで動かそうとするので、apacheとぶつかっててどうしようもないので、何とかする。

これでやっと、設定したポートで動いた・・・
けど、日本語訳がぼろぼろだなぁ。使ってみて気に入ったら翻訳がんばるかな。

・・・LDAPがOpenLDAPのスキーマにぜーんぜん対応できていない。
samaccountnameとかがソースにベタ書きしてあるからどうしようもないな、これ。
CentOS7.2のvagrant boxを作る

# vagrantのboxに変更を加えて別のboxとして追加したい

CentOS7.2のboxがUPされていなかった。(2016/6/19時点)
http://www.vagrantbox.es

ここではCentOS7.1のboxを使ってCentOS7.2のboxを作成してvagrant boxとして追加したい。

現在あるboxを確認。(CentOS7.1のboxは既に追加されている前提)
<pre>
$ vagrant box list
cent7      (virtualbox, 0)
</pre>
cent7のboxで起動したホストにsshしてOSバージョンを確認。
<pre>
$ vagrant ssh
Last login: Sun Jun 19 00:23:23 2016 from 192.168.33.1
[vagrant@localhost ~]$ cat /etc/redhat-release 
CentOS Linux release 7.1.1503 (Core) 
</pre>
CentOS7.2にupdateする。
<pre>
[vagrant@localhost ~]$ yum update -y
[vagrant@localhost ~]$ cat /etc/redhat-release 
CentOS Linux release 7.2.1511 (Core)
</pre>
変更を加えたホストからexitしてから*halt*する。
<pre>
$ vagrant halt
</pre>
*vagrant package*してからカレントディレクトリに*package.box*があることを確認する。
<pre>
$ vagrant package
==> default: Clearing any previously set forwarded ports...
==> default: Exporting VM...
==> default: Compressing package to: /Users/hoge/vagrant/cent72/package.box
$ ls
Vagrantfile	package.box
</pre>
保存されたpackage.boxをcent72としてbox名を付ける。
<pre>
$ vagrant box add cent72 package.box 
==> box: Box file was not detected as metadata. Adding it directly...
==> box: Adding box 'cent72' (v0) for provider: 
    box: Unpacking necessary files from: file:///Users/hoge/vagrant/cent72/package.box
==> box: Successfully added box 'cent72' (v0) for 'virtualbox'!
</pre>
cent72のboxが追加された。
<pre>
$ vagrant box list
cent7      (virtualbox, 0)
cent72     (virtualbox, 0)
</pre>

以上
ssh-add で Could not open a connection to your authentication agent が出るときの対処法

一発でうまくいかなかったので備忘録。

# $eval 'ssh-agent' ではなく、 $eval '$(ssh-agent)'
ここを参考にして実行したらうまくいった。
http://tech.clickyourstyle.com/articles/105
windowsの Git Bash にて

- 成功例   

```shell-session
$ eval "$(ssh-agent)"
Agent pid 9236
$ ssh-add ~/.ssh/id_rsa
Enter passphrase for /c/Users/user/.ssh/id_rsa:
Identity added: /c/Users/user/.ssh/id_rsa (/c/Users/user/.ssh/id_rsa)
```

- 失敗例   

```shell-session
$ ssh-agent
SSH_AUTH_SOCK=/tmp/ssh-ah8DHOFKYZ7I/agent.9328; export SSH_AUTH_SOCK;
SSH_AGENT_PID=10348; export SSH_AGENT_PID;
echo Agent pid 10348;
$ eval "ssh-agent"
SSH_AUTH_SOCK=/tmp/ssh-5cOTHuFsw33d/agent.8056; export SSH_AUTH_SOCK;
SSH_AGENT_PID=10544; export SSH_AGENT_PID;
echo Agent pid 10544;
$ ssh-add ~/.ssh/id_rsa
Could not open a connection to your authentication agent.
```

そのうち違いを調べる。
NSThreadでスレッドを止めると、通信も止まります


NSThreadを使うとメインのスレッド処理を止めてしまいます。

なので、以下のサイトを参考にして、Swiftでのスレッドの止め方を書こうかと思います。

http://qiita.com/moc-yuto/items/9cc1debb9dd812a714b8


```
 while self.waitFlag == false{
      NSRunLoop.currentRunLoop().runUntilDate(NSDate(timeIntervalSinceNow: 5))
 }

```

僕の場合はこれでうまくいきました。
めざせNode.jsライブラリマスター （16）find

#【ライブラリ説明】
　ファイル名やフォルダ名の取得

#【プログラム】
```js
var find = require('find');

//現在のディレクトリのファイルを全て取得
find.file(__dirname, function(files) {
  console.log(files);
})

// 現在のディレクトリ下のディレクトリをすべて取得
find.dir(__dirname, function(dirs) {
  console.log(dirs)
})
```
eachfileやeachdirといった関数もある。

#【参考サイト】
　[npm](https://www.npmjs.com/package/find#eachdirpattern-root-action)
　[github](https://github.com/yuanchuan/find)
技術英語 > Scientific [lines of evidence] are converging on ... / a street lined with trees / We were flooded with orders.

@ LOE > June 6, 2003
http://loe.org/shows/shows.html?programID=03-P13-00023
> Scientific <font color=red>lines of evidence</font> are converging on ...

十分な証拠があるということなのだろう。

<hr>
関連して思い出したのは

> a street lined with trees

http://ejje.weblio.jp/content/lined+with+trees

like a road without landscapeはスタインベックの怒りの葡萄の一節だったろうか。「そっけない」という意味で使われていた。

<hr>
関連して思い出したのは

> We were flooded with orders.

http://ejje.weblio.jp/content/flooded+with
> 注文が続々きた.

floodedはVoyagerにてシータ放射が船内に充満している時に使われていた。flooded with the theta radiation
Scalaで一番よく使うローンパターン

[追記] Scala 2.13.0 で標準ライブラリに `scala.util.Using` が追加されました〜。
https://www.scala-lang.org/api/2.13.0/scala/util/Using$.html

---

Scalaでローンパターンを使いたくなるたび、「[Scala using(Hishidama's Scala loan-pattern Memo)](http://www.ne.jp/asahi/hishidama/home/tech/scala/sample/using.html)」を見ながら実装して、だいたい以下の形に落ちつくので、今更ながらメモ。

```scala
import java.io.Writer

import scala.io.Source

object Using {
  def apply[A, B](resource: A)(process: A => B)(implicit closer: Closer[A]): B =
    try {
      process(resource)
    } finally {
      closer.close(resource)
    }
}

case class Closer[-A](close: A => Unit)

object Closer {
  implicit val sourceCloser: Closer[Source] = Closer(_.close())
  implicit val writerCloser: Closer[Writer] = Closer(_.close())
}
```

自分がこうしている理由は、

- なるべく短く実装したい。
- 構造的部分型はリフレクションなので使いたくない。
- for文で使えるようにしたいけど、モナドにするのは面倒そうなので、ネスト辛くなったら考える。
rails try

```rb
2.2.3 :001 > nil.try(:upcase)
 => nil 
2.2.3 :002 > nil.try(:upcase) || 12
 => 12 
```

```rb
vagrant@precise64:~/data/gemstaurant$ pry
[1] pry(main)> 1/0
ZeroDivisionError: divided by 0
from (pry):1:in `/'
[2] pry(main)> 1/0 rescue 13
=> 13
```
AWS SDK for PHP 3.xでAmazon KinesisのPUT/GETを試す小さなサンプル

#前提
- リージョン：東京
- AWS SDK for PHP 3.xがインストール済であること
- credencialまたはIAMロールが登録済であること
- ストリーム(test)が作成済みであること

#サンプル

```php:put.php
<?php
require './vendor/autoload.php';

$client = new Aws\Kinesis\KinesisClient([
        'version' => 'latest',
        'region' => 'ap-northeast-1'
]);

$result = $client->putRecords([
        'Records' => [
                [
                        'Data' => 'hogehoge',
                        'PartitionKey' => 'hoge',
                ],
        ],
        'StreamName' => 'test',
]);
var_dump($result);
```

```php:get.php
<?php
require './vendor/autoload.php';

$client = new Aws\Kinesis\KinesisClient([
        'version' => 'latest',
        'region' => 'ap-northeast-1'
]);

$sharedIDResult = $client->getShardIterator([
        'ShardId' => 'shardId-000000000000',
      'ShardIteratorType' => 'TRIM_HORIZON',
//        'ShardIteratorType' => 'AFTER_SEQUENCE_NUMBER',
        'StreamName' => 'test',
//        'StartingSequenceNumber' => 'xxxx'
]);

$ite = $sharedIDResult['ShardIterator'];

$result = $client->getRecords([
       'ShardIterator' => $ite,
]);
var_dump($result);

```
省略可能な引数でnilが渡されたのかデフォルト値が使われたのか区別するやり方

省略可能な引数のデフォルト値に`nil`を使うと、引数に`nil`を渡したのかデフォルト値の`nil`が使われたのか分かりません。
例えば以下のような問題がおきます

```rb
class OkinawaSobaRestaurant
  def 沖縄そば(フーチバー: nil)
    if フーチバー
      puts "沖縄そば、フーチーバーは#{フーチバー}"
    else
      puts "沖縄そば、フーチーバーはサービス"
    end
  end
end

すばやー = OkinawaSobaRestaurant.new

# フーチバーの気分じゃないとき、なしにしてほしいのにサービスされてしまう
すばやー.沖縄そば(フーチバー: nil)
# 沖縄そば、フーチーバーはサービス
```

こういうときはデフォルト値に`nil`のような一般的な値を使わず、デフォルト値の役割に応じた名前で定数を宣言すると便利です。

```rb
class OkinawaSobaRestaurant
  # nilと区別できるよう、デフォルト値用の値を用意しておく
  # 引数で渡される値と被らないようにオブジェクトのインスタンスを作り定数として保持する
  GIVE_FUCHIBA = Object.new
  # だが、このメソッド以外からは使われてほしくないので、privateな定数に変更する
  private_constant :GIVE_FUCHIBA

  # デフォルトではフーチバーをサービスする
  def 沖縄そば(フーチバー: GIVE_FUCHIBA)
    case フーチバー
    when GIVE_FUCHIBA
      puts "沖縄そば、フーチーバーはサービス"
    when nil
      puts "沖縄そば、フーチーバーはなし"
    else
      puts "沖縄そば、フーチーバーは#{フーチバー}"
    end
  end
end

すばやー = OkinawaSobaRestaurant.new

# フーチバーの気分じゃないとき
puts すばやー.沖縄そば(フーチバー: nil)
# 沖縄そば、フーチーバーはなし

# とにかくそばが食べたいとき
puts すばやー.沖縄そば
# 沖縄そば、フーチーバーはサービス

# フーチバー食べるためにそば食べたいとき
puts すばやー.沖縄そば(フーチバー: :山盛り)
# 沖縄そば、フーチーバーは山盛り
```

デフォルト値と`nil`を区別できるようになったので、ふーちばーどうでもいい(デフォルト値)、ふーちばーが食べたくない(`nil`)、ふーちばー食べたいを表現出来るようになりました。べんりですね。

## 参考
https://github.com/rails/rails/pull/24519/
拝啓 本当は Qiita を書きたいのに、まだ迷っているあなたへ。

Qiita歴1年の @YumaInaura です。

僕も最初は、Qiitaに記事を書くのはやや抵抗がありましたが。
だけど1年書いてみたら、良いことしかありませんでした。

なので今迷ってるなら「とりあえず書いちゃおうぜ」ってことをお伝えします。

# こわかったこと

僕が Qiita に記事を書く前に悩んでいたこと。抵抗を感じていたことは次の通り。

## 1. リアクション

記事を書いてもまったく反響がなかったらどうしよう。すごく虚しくなりそうだ。

## 2. クオリティ

ネットでよく話題になっている記事のような「ちゃんとしたまとめ」を書かなければいけないんじゃないだろうか。
ほんのちょっとした記事をかくのは恥ずかしいことなんじゃないだろうか。

それを考えると、ひとつ記事を書くにも労力がかかりそうで気が重い。

## 3. ミス

もし間違った情報を発信してしまったらどうしよう。
迷惑をかけるんじゃないだろうか。

## 4. ビギナー

ひとつの分野に対して、初心者丸出しの記事を書いたら笑われるんじゃないだろうか。
「最近なんだかみんなが僕を笑ってる気がする」。

だから、ちゃんと技術的に熟達してから記事を書いた方が良いんじゃないだろうか。

# でも、こわくないよ

## 1. 役立たなくっていいじゃないか、にんげんだもの。

- いいねされる記事、されない記事は書いてみないと分からない。これはほんとに。
- 自分では予想しなかった、意外な記事が反響を集めたりする。「これは役立たないだろうな」と思って書かないのはもったいない。
- 「記事が役立つか、役立たないか」の判断は捨ててしまおう。とりあえず自分にだけ役立てば良い。たとえ仮に他の誰にも役立たなくても、自分自身にはまず役立つから。
- 僕の場合、1年も記事を書いていると、塵も積もれば山で。数百個のいいねをいただいた。(最近アカウントを変えたので、いったんゼロになったけど)

ちなみに、いいねがゼロの記事もたくさんあるけど気にしない。

![image](https://qiita-image-store.s3.amazonaws.com/0/89618/7aa76fdb-a80f-7c6e-ed48-fb09a11dda5d.png)

## 2. 小ネタで十分。

- 時には。記事を書くのに10分もかけなくて良い。
- 記事の長さと情報量は必ずしも比例しない。
- 小さなネタでも、まとめることはできる。むしろ小さいからこそまとまりやすい。

ちなみに僕がいままで一番「労力」に対して「いいね」の比率が高かったのは。5分で書いたこの記事。

![image](https://qiita-image-store.s3.amazonaws.com/0/89618/a4382d2f-275e-a34f-e177-bd0f43a46841.png)


## 3. Qiitaの国のセーフティーネット。

間違った情報を書いてしまっても、他の人がコメントでツッコミをくれたり、編集リクエストをくれたりする。
むしろ「間違い」から有用なディスカッションが起こることさえある。

もちろんなるべく間違わないように下調べは必要だけど、もし間違ってもそんなに怖がることはない。

ちなみに僕はコメント欄で指摘を受けたら、元の記事は「間違ったままの状態」でおいておくこともある。
なぜなら「どんな間違いが起きて、どう訂正されたか」が重要な場合も多いからだ。

## 4. ビギナーにしか絶対に書けない記事がそこにはある。

「熟練してから記事を書こう」と思っても、その頃には記事を書く必要性を感じなくなっていたりする。
むしろ「初心者のつまづき」こそ大事で。これは熟練してしまうと、逆に思い出せなくなる部分だ。

「初心者のうちに書いておいた方が良いこと」もたくさんある。

この世界では、多くの分野において「初心者」の割合のほうが、はるかに大きいのだから。
多くの人の目を引くのは、むしろ「初心者向けの記事」だったりする。

# あわせて読みたい？

- [エンジニアは全員技術記事を書くことを習慣化した方がいいぞ - Qiita](https://qiita.com/HiromuMasuda0228/items/a71dea7ef4d77a30b118)
- [Qiitaに記事を書くエンジニアが一番成長する説 (ラーニングピラミッド) - Qiita](https://qiita.com/YumaInaura/items/da7f442226f0c048ae2f)
- [Qiitaの記事には絶対コメントを付けてはいけない - Qiita](https://qiita.com/YumaInaura/items/5532cb4eea013b2f4a4b)






















<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Font Awesome not found in bundle. を解決する。


FontAwesomeIconFactory pod　を使用している最中に、下記のようなエラーに遭遇したので、解決方法とその経緯を備忘録的にメモ。

```
2016-06-19 01:09:16.717 -----[26768:1084213] *** Assertion failure in -[NIKFontAwesomePathFactory font], /Users/colorbox222/develop/ios/Ideamixier/Pods/FontAwesomeIconFactory/NIKFontAwesomePathFactory.m:40
2016-06-19 01:09:16.724 -----[26768:1084213] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Font Awesome not found in bundle.'
```

上記エラーは、プロジェクトにおけるライブラリの参照方法を変更した際に発生した。
これまで、swift側にObjective-Cのライブラリを認識させるためにbridge-headerにimport文を書いていたが、各ViewController内で個別にimportさせるように変更した。

具体的な原因は不明だが、ライブラリのインポート処理を変更したことで、Pod内のリソースファイルを参照できなくなってしまったらしい。

インポートの変更に関しては下記を参考にした。
http://stackoverflow.com/questions/31642385/why-am-i-getting-an-undeclared-type-pubnub-compiler-error-with-swift-cocoa-app

上記を踏まえると解決方法は簡単で、リソースファイルをプロジェクト側から見えるようにしてやれば良い。
ライブラリは異なるが、下記の通りにプロジェクトに修正を加えると、FontAwesomeを参照していた箇所で正常に動作するようになった。
https://github.com/PrideChung/FontAwesomeKit/issues/26#issuecomment-84531713
Rails 特定のcoffeescriptファイルを読み込む

# 結論
javascriptと同じ

### やり方
appication.jsから以下を削除

```js
//= require_tree .
```

読み込みたい箇所で以下を指定（hogehoge.js.coffeeの場合）　

```haml
= javascript_include_tag 'hogehoge'
```

※slimの書き方になっているので、よしなに解釈して。
【Eclipse】PHPの開発環境を整える

## 開発環境を整えるまでの流れ

1. [Eclipseをダウンロード](https://eclipse.org/downloads/eclipse-packages/)&圧縮ファイル解凍
2. [XAMPPをダウンロード](https://www.apachefriends.org/jp/index.html)&インストール
3. php.iniを書き換えて、XDebugを使えるようにする。
4. Apache起動
5. Eclipse起動
6. PHP Development Toolsのインストール
7. デバッグ実行時にXDebugを使うように設定する。

## php.iniの設定

EclipseとXAMPPのダウンロードは上記リンクから行える。XAMPPのインストールは、ひたすら［Next］ボタンを押す。デフォルトの設定だと、php.iniはC:\xampp\phpにある。テキストエディタで開いて、以下の文字列を追加する。

```ini:php.ini
[XDebug]
zend_extension=C:\xampp\php\ext\php_xdebug.dll
xdebug.remote_enable=On
```

上記の設定が終わったあと、XAMPP Control PanelでApacheを起動する。エラーログは、デフォルトの設定ではC:\xampp\apache\logs\error.logに追加される。もしphp_debug.dllが存在しない場合は、以下のようなログが出力される。

_Failed loading C:\xampp\php\ext\php_xdebug.dll 8672:tid 524] AH01909: www.example.com:443:0 server certificate does NOT include an ID which matches the server name_

何もエラーが出力されていないことを確認したあと、Eclipseを起動する。

## PHP Development Toolsのインストール

Eclipseの上部メニューで、Help > Install New Software... を選択する。Work with:リストボックスから __XXX - http://download.eclipse.org/releases/xxx__ を選択する（XXXにはバージョンの名前（4.5：Mars、4.3：Kepler）が、xxxにはその小文字が入る）。そしてフィルター入力欄に__PDT__(PHP Development Tools)と入力し、Programming LanguagesのPDTのチェックボックスをONにして[Next]ボタンを押す。あとはひたすら[Next]ボタンと[Finish]ボタンを押す。Eclipseの再起動を要求されるので再起動する。これで下準備は整った。

## Debug Configurationsの設定

適当にPHPファイルを作成してF11を押す。何やらエラーが出るので、上部メニューの Run > Debug Configurations... を選択すると、PHP Web Applicationあたりに何やらバッテンがついている。どうやらDebuggerが設定されていないようだ。というわけで、DebuggerにXDebugを設定する。設定が終わったら再度F11を押すと、無事デバッガが走り出す。

## 感想

MarsなのにKeplerのPDTをインストールしてしまったせいで、ステップ実行時にマーカーが進まないというバグに遭遇した。次からは気を付ける。
Monaca Localkitをインストール・起動・プロジェクト作成するまで


# 概要
タイトル通りMonaca Localkitをインストールし、起動するまでの手順をメモ程度に。

# Monacaとは
Android,iOSに対応したハイブリットアプリを開発するツール

Monaca Localkit
https://ja.monaca.io/localkit.html

# 環境
Windows 10

# 手順
以下からwindows版をダウンロード
https://ja.monaca.io/localkit.html

## インストール
![image](https://qiita-image-store.s3.amazonaws.com/0/70299/57df0aa7-9857-915b-7a4e-9982f40917db.png)
![image](https://qiita-image-store.s3.amazonaws.com/0/70299/0a4b97c0-75ff-cef7-c3e3-96fc841f7a43.png)
![image](https://qiita-image-store.s3.amazonaws.com/0/70299/f6edb213-1f1a-b0cc-9965-4b4a4302c2ee.png)
![image](https://qiita-image-store.s3.amazonaws.com/0/70299/d741a652-b9af-eec3-b7ef-b71097faad0a.png)

## 起動
![image](https://qiita-image-store.s3.amazonaws.com/0/70299/29c7b33d-d86e-a2f1-def1-c2b5c38c7fd3.png)

## プロジェクト作成
+ボタンから作成
![image](https://qiita-image-store.s3.amazonaws.com/0/70299/203b9026-911c-ef81-cc18-0abd2ce8ad19.png)
項目を入力してプロジェクトを作成
![image](https://qiita-image-store.s3.amazonaws.com/0/70299/e6dd57ac-9c15-6178-730f-cf2bf7314e76.png)
作成完了
![image](https://qiita-image-store.s3.amazonaws.com/0/70299/a3f1d2c3-9238-8ca2-4702-8bca63b3d5b7.png)