OmniAICreator/Qiita-1.07M huggingface dataset:
How to integrate rails-api gem ( Example )

# Introduction
This note tells you how to use rails-api especially for how to integrate rails-api for existing Rails4 App.

# How to
## Install Gem
```rb
# Gemfile
gem 'rails-api'
gem 'active_model_serializers', github: 'rails-api/active_model_serializers'
```
then,

```bash
bundle install
```
## Make Base Controller for API
```rb
# app/controller/api_controller.rb
class ApiController < ActionController::API
end
```

## Make RESTful API controllers
```rb
class TestController < ApiController
  # Some CRUD methods here
end
```

## Add Config
```rb
# config/application.rb
module App
  class Application < Rails::Application
    config.api_only = false # or true
  end
end
```

## Make Data Serialize
```rb
# app/serializers/test_serializer.rb
class TestSerializer < ActiveModel::Serializer
  attributes :id, :something
end
```

## Check
```bash
curl -H "Content-Type:application/json; charset=utf-8" \
  -X GET \
  -d '{"someAttribute": "Value"}' \
  http://localhost:3000/test
```
MyBatisのConfigurationでBeanCurrentlyInCreationExceptionが発生しないようにする


# 現象

Spring Boot + MyBatis-Spring を使用している時に BeanCurrentlyInCreationException が発生することがあります。

https://github.com/mybatis/spring/issues/58 でも報告されていて、なにやら修正もされているっぽいのですが、mybatis-spring の 1.2.3 では、まだ取り込まれていない([1.2.3の当該箇所](https://github.com/mybatis/spring/blob/mybatis-spring-1.2.3/src/main/java/org/mybatis/spring/mapper/ClassPathMapperScanner.java#L187))ようです。1.2.4-SNAPSHOT や 1.3.0-SNAPSHOT には取り込まれているようです。

# 調査

何パターンかためしたところ`@MapperScan`や`MapperScannerConfigurer`で使用する SqlSessionFactory を指定した場合に発生するようです。
どうやら[MapperFactoryBeanのAutowired設定](https://github.com/mybatis/spring/blob/mybatis-spring-1.2.3/src/main/java/org/mybatis/spring/mapper/ClassPathMapperScanner.java#L215-L220)の有無によって、なぜか DataSource の準備前に Mapper を作ろうとしてしまうようです。

# 回避策

SqlSessionFactory の生成時に確実に DataSource が作られているようにすることで、上記の問題を回避しました。
具体的には、以下のように SqlSessionFactory とおなじ Configuration 内で DataSource の生成メソッドも用意して、Autowired は使用せずに SqlSessionFactory に設定します。

```java
@Configuration
@MapperScan(value = "xxxx.repository", 
            sqlSessionFactoryRef="sqlSessionFactory")
public class MyBatisConfiguraiton {
    @Bean
    public SqlSessionFactory sqlSessionFactory() {
        SqlSessionFactoryBean factory = new SqlSessionFactoryBean();
        factory.setDataSource(dataSource());
        ...
        return factory.getObject();
    }
    
    @Bean
    @ConfigurationProperties(prefix = DataSourceProperties.PREFIX)
    public DataSource dataSource() {
        return DataSourceBuilder.create().build();
    }
}
```

# その他

接続先の DataSource が1つしか無い場合は SqlSessionFactory を明示的に指定する必要は無いので警告がでることも無いかと思います。以下のように設定すれば十分かと思います。

```java
@Configuration
@MapperScan(value = "xxxx.repository")
public class MyBatisConfiguraiton {
    @Autowired
    private DataSource dataSource;
    
    @Bean
    public SqlSessionFactory sqlSessionFactory() {
        SqlSessionFactoryBean factory = new SqlSessionFactoryBean();
        factory.setDataSource(dataSource);
        ...
        return factory.getObject();
    }
}
```
Windows版のEmacsでmagit・Trampが使えるようにする

#magit編

[Windows版のGit](https://git-for-windows.github.io/)をインストールしてから、設定ファイルに次の1行を加えます。

```el
(setq magit-git-executable "C:/Program Files/Git/bin/git.exe")
```

また、コマンドプロンプトでGitの実行ファイルのあるディレクトリにパスを通しておらず、Emacsの起動時にGitが見つからないと言われる場合は、次の1行も加えます。

```el
(add-to-list 'exec-path "C:/Program Files/Git/bin")
```

#Tramp編

SSHクライアントである[PuTTY](http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html)をインストーラでインストールしてから、設定ファイルに次の2行を加えます。

```el
(setenv "PATH" (concat "C:/Program Files (x86)/PuTTY" ";" (getenv "PATH")))
(setq tramp-default-method "psftp")
```

これでファイルを開く時に`/(PuTTYで設定したエイリアス):(ファイルへのパス)`を指定するとリモートのファイルが開けます。PuTTYで設定したエイリアスの前に「`(プロトコル):`」を付ける場合はUnix系と異なりますので、以下の表で読み替えてください。

| Unix系 | Windows |
|:--------|:--------|
|ssh|plink|
|scp|pscp|
|sftp|psftp|
|rsync|(非対応)|

例えば、SCPを使用する場合は次のような名前で開きます。

```
/pscp:myuniversity:path/to/the/file
```

`myuniversity`はPuTTYで設定したセッション名が使用できます。PuTTYのセッション名を使用しない場合には`xxx@yyy.zz`のような形式を使用します。(要パスワード)

#注意事項
文字コードは原則UTF-8を使用しますが、バッファの文字コードに十分注意してください。たまにShift-JISに設定されて文字化けします。文字化けした場合はUTF-8に直すとうまくいきます。(C-x RET r utf-8)
また、magit・Trampの他の設定はUnix版と同様に行ってください。ここでは解説しません。
ツイートを全て消すスクリプト

# ツイートを自動で全て消すスクリプト

Twitter のツイートを全て削除するスクリプトです。例えば「黒歴史は消したいけど、友人と DM できるようにアカウントは残しておきたい」ときに使えます。

## 前提

次の二つはあると仮定します。

* Python がインストールされたコンピュータ
* Twitter の API トークン

Twitter の API トークンの取得についてはオフィシャルの記事を参照してください。

* [Tokens from dev.twitter.com | Twitter Developers](https://dev.twitter.com/oauth/overview/application-owner-access-tokens)

## 必要なライブラリのインストール

`python-twitter` の最新版だけインストールされていれば動きます。`pip` を使ってインストールしましょう。

```
pip install python-twitter
```

私は 3.0rc1 で動かしました。

## ツイート削除スクリプト

次の内容で Python スクリプトを作成します。大文字で書かれている文字列は、それぞれの環境に応じて書き換える必要があります。

```python
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import twitter

api = twitter.Api(
    consumer_key='YOUR_CONSUMER_KEY',
    consumer_secret='YOUR_CONSUMER_SECRET',
    access_token_key='YOUR_ACCESS_TOKEN_KEY',
    access_token_secret='YOUR_ACCESS_TOKEN_SECRET'
)
screen_name = 'YOUR_TWITTER_ID'

while True:
    statuses = api.GetUserTimeline(screen_name=screen_name)
    for s in statuses:
        print(s.text, s.created_at)
        api.DestroyStatus(s.id)
```

後はスクリプトを保存して実行するだけです。

## 追記

@mpyw さんからのコメントで知ったのですが、この方法だと最新から 3200 件目までのツイートしか削除できないようです。

次の URL から Twitter のアーカイブデータを取得し、そこに含まれる `tweets.csv` から tweet ID を取得するようにすれば、全てのツイートを消すことができます。

* https://twitter.com/settings/account

![twitter-archive.png](https://qiita-image-store.s3.amazonaws.com/0/61495/8ac88c51-5b73-2d7e-31b3-f5a47caa9d82.png)

`tweets.csv` が保存されているディレクトリで、次のスクリプトを実行すると全てのツイートを削除できます。

```python
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import twitter
import csv

api = twitter.Api(
    consumer_key='YOUR_CONSUMER_KEY',
    consumer_secret='YOUR_CONSUMER_SECRET',
    access_token_key='YOUR_ACCESS_TOKEN_KEY',
    access_token_secret='YOUR_ACCESS_TOKEN_SECRET'
)

csvReader = csv.reader(open('tweets.csv', 'r'))
next(csvReader)

for row in csvReader:
    print(row[3], row[5])  # Time stamp and actual tweet
    api.DestroyStatus(row[0])
```
MacのWi-Fiネットワーク名(SSID)をコマンドラインで調べる


なにやら深いところにいるairportというコマンドで情報が取得できる

```Bash
$ /System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport -I
     agrCtlRSSI: xxx
     agrExtRSSI: xxx
    agrCtlNoise: xxx
    agrExtNoise: xxx
          state: xxx
        op mode: xxx
     lastTxRate: xxx
        maxRate: xxx
lastAssocStatus: xxx
    802.11 auth: xxx
      link auth: xxx
          BSSID: xxx
           SSID: HERE!!!
            MCS: xxx
        channel: xxx
```

てきとーに欲しいところだけ引っこ抜く

Shellだとこんな

```Bash
$ /System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport -I | grep " SSID" | tr -d " " | cut -c6-
HERE!!!
```

Pythonだとこんな

```Python
import commands

airport = "/System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport -I"

print [line for line in commands.getoutput(airport).split('\n') if " SSID" in line][0].split(':')[1].strip()

# HERE!!!
```

例えば家でも会社でも使うコマンドラインツールを作ったけど、会社ではプロキシ設定しないといけないとか、そんな時用。
簡単なRuby on Railsの始め方等

#簡単なアプリケーションの作成まで
Railsアプリケーションの作成

	rails new app_name

作成したアプリケーションに移動後，Gemfileに記述してあるプラグインの追加

	bundle install

scaffoldを使って，「モデル」「ビュー」「コントローラ」を作成．

		
	rails generate scaffold Model_name name:string
	
完了後，サーバを起動すると簡単な[CRUD](http://e-words.jp/w/CRUD.html) Webアプリケーションの完成

	rails server
	
___
#railsのgenerateコマンド

##コントローラとビューの作成

	rails generate controller controller_name action_name

##モデルとマイグレーションの作成
			
	rails generate model Model_name name:string

##マイグレーションの実行

	rake de:migrate
Unity5.0からInstantiateメソッドにジェネリックなオーバーロードが加わった

Unity5.0からプレファブからゲームオブジェクトを作成する、UnityEngine.Object.Instantiateメソッドに、ジェネリックなオーバーロードが加わりました。

次のコードは、HpBarクラスのプレファブからHpBarクラスのゲームオブジェクトを作成するコードです。

Unity4.X系では次のようにHpBarクラスにasで変換する(もしくはキャストする)必要がありました。

```csharp:Unity4.X系でプレファブからゲームオブジェクトを作る
public class CharacterBehaviour : MonoBehaviour
{
    [SerializeField] HpBar hpBarPrefab;

    HpBar hpBar;

    void Awake()
    {
        hpBar = Instantiate(hpBarPrefab) as HpBar;
    }
}
```

Unity5.0からジェネリックなオーバーロードのInstantiateメソッドが加わったので、Unity5.x系ではas演算子やキャストが不要になりました。

```csharp:Unity5.X系でプレファブからゲームオブジェクトを作る
public class CharacterBehaviour : MonoBehaviour
{
    [SerializeField] HpBar hpBarPrefab;

    HpBar hpBar;

    void Awake()
    {
        // 以下のようにも記述できるが、型パラメータは冗長
        // hpBar = Instantiat<HpBar>(hpBarPrefab);

        // 短く簡潔！！！
        hpBar = Instantiate(hpBarPrefab);
    }
}
```

毎度プレファブからゲームオブジェクトを作成した際の面倒だったasやキャストがUnity5.0からは不要になりましたね！

Unity4.x系の開発に慣れていて、最近5.x系に移行した方は見落としそうなこのメソッド、しっかりと使っていきたいですね。

* [Instantiateメソッドのリファレンス](http://docs.unity3d.com/ScriptReference/Object.Instantiate.html)
* [Unity5.0のリリースノート](https://unity3d.com/jp/unity/whats-new/unity-5.0)
Rails: Polymorphicな中間テーブルがある場合のアソシエーションの仕方

自分用にメモ

User, Taggings, Tagというモデルがる。

UserはTaggingsをthrougして沢山のtagを持っている。

has_many :taggings, as: :taggable, dependent: :destroy
  has_many :tags, through: :taggings

class Tagging < ActiveRecord::Base
  belongs_to :tag
  belongs_to :taggable, polymorphic: true
end

class Tag < ActiveRecord::Base
  has_many :taggings, dependent: :destroy
  has_many :users, through: :taggings, source: :taggable, source_type: 'User'

  validates :name, presence: true
end
AWS EC2 上で Hubot を動かす


以前ご紹介した [簡単!QiitaでストックされたのをSlackに通知するようにする](http://qiita.com/tearoom6/items/1028b05ce049e6fb8e24) は、Hubot を Heroku 上で動かしたものでしたが、今回はこれを AWS EC2 上で動かせるようにしてみました。
もともと EC2 サーバを動かしている人は、こちらの方がいいかもしれません！

## 前提

- EC2 インスタンスを起動して、ssh 接続するところまで実施済みとします。

## 手順

- 環境変数を簡単に設定できるように、[direnv](https://github.com/direnv/direnv) をインストールします

```Bash
$ git clone https://github.com/direnv/direnv
$ cd direnv
$ sudo make install
$ eval "$(direnv hook bash)"
```

- [nvm](https://github.com/creationix/nvm) を使って、Node.js をインストールします

```Bash
$ git clone https://github.com/creationix/nvm.git ~/.nvm && cd ~/.nvm && git checkout `git describe --abbrev=0 --tags`
$ . ~/.nvm/nvm.sh
$ nvm install v5.6.0
$ nvm use v5.6.0
```

- Redis をインストールして、バックグラウンドで起動します

```Bash
$ wget http://download.redis.io/releases/redis-3.0.7.tar.gz
$ tar xzf redis-3.0.7.tar.gz
$ rm redis-3.0.7.tar.gz
$ cd redis-3.0.7
$ make
$ sudo make install
$ redis-server &
```

- [Qiitan](https://github.com/tearoom6/qiitan) のソースコードをダウンロードします
- 以下の2つのファイルを作成して、秘密の設定値を記載します
   - .hubot_slack_token : SlackのHubot連携のトークンを記載
   - .qiita_access_token : Qiitaのパーソナルアクセストークンを記載
- 詳しくは、[以前の記事](http://qiita.com/tearoom6/items/1028b05ce049e6fb8e24)を参照してください

```Bash
$ git clone https://github.com/tearoom6/qiitan.git
$ cd qiitan/
$ vi .hubot_slack_token
$ vi .qiita_access_token
```

- Hubot を起動します
- Node のプロセスをデーモンとして動かすには、[forever](https://github.com/foreverjs/forever) というツールを使うと便利らしいので、それをインストールして以下のように起動します

```Bash
$ npm install forever -g
$ forever start -c bash bin/hubot -a slack
```

- プロセスがちゃんと起動していること、ログが出ていることを確認します

```Bash
$ forever list
$ forever logs 0
```

以上です。
Githubのメモ


___

#Gitの操作(ローカル管理)

ユーザ名とメールアドレスの登録

	git config --global user.name "Name"
	git config --global user.mail "test@.com"
	

リポジトリの作成

	git init	

ファイルをステージへ追加(オプションですべてのファイル指定)

	git add .
	#以下でもOK
	git add -A

変更点をコミット(-mオプションでコミット名指定)

	git commit -m "Initialize repository"

___

#Gitリポジトリへのプッシュ

Gitのプッシュ先の設定
GitHubにする場合

	git remote add origin git@github.com:YusukeHarada/test.git

Bitbucketを利用する場合

	git remote add origin git@bitbucket.org:YusukeHarada/test.git

Gitのプッシュ

	git push origin master
	# 以下に省略可能
	git push
Qiitaに初投稿してみる

### リストの中身が全て同じか調べる（バグまみれ）
`reduce`を使ってみる。

```Python
reduce(lambda x, y: x == y, items)
```

あ、空リストだと怒られるから初期値設定しないとだめか...

```Python
print reduce(lambda x, y: x == y, [])
# TypeError: reduce() of empty sequence with no initial value

print reduce(lambda x, y: x == y, [], True)
```

...`is`が関数だったらもっとスッキリするんだけどなー

追記
ちょっとの間に指摘をいただけました。
というかちょっと考えたらこれ色々だめじゃん...orz

試しに投稿してみよーっと思ったら初っぱなから間違えたー
戒めとしてとっておこう...

追記
全く閲覧されないと思っていたらばしばし指摘をいただいてしまいました、Qiitaすげぇ...
あまりにもタイトルと内容が乖離してしまっているので、この記事のタイトルは変更して[新たな記事](http://qiita.com/suzuki-hoge/items/03d86c45532d3d674076)を作成しました。
Ethereum のGhostプロトコルまとめ



Ethereum の GHOST(Greedy Heaviest Observed Subtree) プロトコルのまとめ
いつの間にかホワイトペーパーの説明が変更されていたので、アップデート(2017/03/21)


## 前提知識

* Bitcoin (Proof of Work, orphan block, コインベース, メインチェーンの選択方法)
* Ethereumの基礎知識 (Uncle)


## まとめ

* Ghostプロトコルは、元々2013年に発表された論文が起源
* Ethereumで利用されているのは、上記論文を修正した機能限定版Ghostプロトコル
* Bitcoinは、一番長いチェーンがメインチェーン。Ethereumは、一番重い(heaviest)チェーン。
* 基礎知識: 早いブロック時間は、より多くのオーファンブロックを作成する(より無駄なコストが発生する)
* オーファン(Uncle)ブロックにも報酬を与える (マイナーが、unclesを含めるインセンティブができる)
* 2つの問題を解決している
 * 一つ目の問題: 高いステイル率(早い承認)だとセキュリティが下がる問題
	 * 解決方法: ステイルブロックをどのチェーンが長いかの計算に含める(Uncleも)
 * ２つ目の問題: マイニングの中央化
	 * 解決方法: ブロック報酬をステイルブロックにも与える


## ホワイトペーパーからの翻訳

* ブロックは、親を指定し、0かそれ以上のuncleを指定しなければならない
* ブロックBに取り込まれたuncleは、以下のプロパティを持たなければならない
 * 2 <= k <= 7となるBのk世代の祖先の直接の子でなければならない
 * Bの祖先であってはならない
 * Uncleは、有効なブロックヘッダーでないといけないが、以前に検証か、有効とされる必要はない
 * uncleは、前のブロックに取り込まれた全てのuncleや、同じブロックに含まれた全てのuncle(non-double-inclusion)とは、別でないといけない
* ブロックBに含まれた全てのuncle Uは、Bのマイナーが追加の3.125%の報酬をそのコインベース報酬に追加し、そして、Uのマイナーは、標準コインベース報酬の93.75%を得る。


翻訳元: [White Paper · ethereum/wiki Wiki](https://github.com/ethereum/wiki/wiki/White-Paper#modified-ghost-implementation)


## おすすめ記事

* [What is the GHOST protocol for Ethereum? | CryptoCompare.com](https://www.cryptocompare.com/coins/guides/what-is-the-ghost-protocol-for-ethereum/)
* [Uncle Mining in Ethereum - ETHNews.com](https://www.ethnews.com/uncle-mining-in-ethereum)


## Ghostの論文

Yonatan Sompolinsky氏とAviv Zohar氏に2013年に発表された論文

Accelerating Bitcoin’s Transaction Processing
Fast Money Grows on Trees, Not Chains
http://www.cs.huji.ac.il/~avivz/pubs/13/btc_scalability_full.pdf


## Uncleのインセンティブにのデザインについて

[Design Rationale · ethereum/wiki Wiki](https://github.com/ethereum/wiki/wiki/Design-Rationale#uncle-incentivization)

## 参考

* [Slasher Ghost, and Other Developments in Proof of Stake - Ethereum Blog](https://blog.ethereum.org/2014/10/03/slasher-ghost-developments-proof-stake/)
* [Introducing Casper "the Friendly Ghost" - Ethereum Blog](https://blog.ethereum.org/2015/08/01/introducing-casper-friendly-ghost/)
* [anyone who thinks GHOST is a good idea, has not understood Bitcoin at all. the w... | Hacker News](https://news.ycombinator.com/item?id=7553418)



## 用語

* Ethereum、イーサリアム、エセリウム
* PoW, Proof of Work
* Ghost protocol, ゴースト・プロトコル
* Stale block, ステイル・ブロック
* Uncle, アンクル
* ommer
複数人でのWebサービス開発で便利だったもの

遊びに使えるWebサービスを友人と一緒に作成中。
仕事じゃなかなか使えないようなツールやサービスを無料の範囲内で使ってみてるんですが、かなり便利。
忘れないようにまとめてみます。
なおJavaとJavaScriptを使ってるので、それに関する内容が多いかも。

なお、次のような感じで開発進めてます。

* 週に1回集まってミーティング兼もくもく会
* 集まらない日は各自のペースで作業
* 機能などを作ったらプルリクエスト出して承認もらって取り込む
* サーバー側がJavaでクライアント側がJavaScript

## Webサービス

### BitBucket

https://bitbucket.org/

Gitリポジトリをホスティングしてくれるサービス。
他にも類似サービスはいろいろあったけど、非公開リポジトリを無料で作れるってのが決め手。
基本的にソースコードはここで一括管理して、各自が作った機能とかは必ずプルリクエストを出す運用で活用中。
ReadmeとかWikiも便利で、ここに情報まとめとくと情報共有しやすい。
課題管理機能もあってタスクの優先順位とか担当者を設定して便利に使ってますが、期限設定ができないのがちょっと残念。
複数人で開発するなら、こういうホスティングサービスは必須だと思う。

### Heroku

https://www.heroku.com/

アプリケーションをホスティングしてくれるサービス。
自前でサーバー立てなくてもWebサービスとして無料で公開可能。
ちょっとお試しで作ったものを皆に見てもらいたい時とか皆で使おうって時に便利。
無料プランの範囲だと定期的にスリープ（？）するようなので、本番用には有料プランか別の環境の準備をしたほうがいいと思う。

### Shippable

https://app.shippable.com/

無料で使えるCIサービス。
類似サービスはたくさんあったけど、BitBucketのプライベートリポジトリと手軽に連携できるっていうのが決め手。
BitBucketのmasterにマージするだけでHerokuに最新版のソースコードが反映されるよう設定中。
リリースってどうするんだっけ？っていうのがなくなって、複数人での開発でもリリースがスムーズ。

### ATLAS

https://www.hashicorp.com/atlas.html

仮想マシンの基であるBoxをホスティングしてくれるサービス。
ここにBoxをアップロードしておけば、開発環境構築はVagrantのコマンド実行だけというお手軽さ。
Boxの保存場所として活用中ですが、他にもいろいろな機能がありそう。
開発環境の共有を行いたい場合は、Vagrantと合わせて使ってみるといいかもしれない。

### Trello

https://trello.com/

カンバンみたいにタスクを管理できるWebサービス。
BitBucketの課題管理機能がエクセルの表で課題を管理してる感じなのに対して、Trelloは付箋を壁に貼って課題を管理してるイメージ。
直感的に使えて見やすく、スマホでも見れてすごい便利。
友人との開発ではBitBucketの方を使うことになったけど、Trelloメインでも十分に課題管理できると思う。

### Slack

https://slack.com/

いろんなサービスと連携できるチャットサービス。
BitBucketの更新やShippableでのテスト結果などをSlackに通知したりと何かと便利。
Botを導入してサービス監視してみたり、いろんなことに応用できそう。
今は個人的な通知用としてしか使ってないので、今後いろいろ試してみたい。

## ソフトウェア

### Git

https://git-scm.com/

ソースコードなどの履歴管理などを行うためのソフトウェア。
いわゆるバージョン管理ソフト。
これなしで開発するのは避けたいくらいに必要なもの。

### Gradle

http://gradle.org/

ビルドに関連する作業を一括で行ってくれるJava向けビルドツール。
ビルドに必要なライブラリやGradle自身のダウンロードまでも行ってくれるんで、JDKさえ入れれば開発始められるようになって便利。
主に次のような用途で活用中。

* 必要ライブラリのダウンロード
* コンパイル
* 自動テストの実行
* 静的解析ツールの実行
* Gulp(後述)の実行
* アプリケーション起動

### Gulp

http://gulpjs.com/

JavaScript向けビルドツール。
Gradle経由でダウンロードと呼び出しを行ってます。
主にJavaScriptの静的解析に使用中。

### VirtualBox

https://www.virtualbox.org/

仮想マシンを動かすためのソフトウェア。
お試し環境を作ってみたい時などに便利。
自分のPCにたくさんの開発ツールを入れたくないというときは、仮想マシン上で開発するという方法もあり。

### Vagrant

https://www.vagrantup.com/

仮想マシンの作成・起動・破棄などを行ってくれるソフトウェア。
環境作成用のスクリプトを作っておけば、目的に応じた仮想環境を手軽に作れて便利。
新規メンバーが入ってきた時の開発環境構築に役立ちそうだけど、まだ試せてないです。

## ライブラリ

### SpringBoot

http://projects.spring.io/spring-boot/

JavaのWebアプリ向けフレームワークのSpringを、手軽に使えるようにしてくれるライブラリ。
たくさんの設定ファイルを作らなくてもよく、ビルドしたらWebサーバーも組み込んでくれるのでWebサーバー構築っていう手間が省けて楽。

# 使ったけどちょっと不便さを感じたもの

試してみたけれどちょっと不便だなと思うものもありました。
あくまでも仲間内での開発でそう感じただけなので、開発体制によっては不便さを感じないかもしれません。

## LINE

http://line.me/ja/

説明不要の有名なスマホのチャットアプリ。
PCでも使えるので、意外と開発作業中でも手軽に会話できたりします。
でも、サービス連携ができないので各種通知をLINEに流せないのが辛い。
会話だけならLINE便利だけど、開発ならいろいろ連携しやすいSlackの方が使い勝手よさそう。


# まとめ

リストアップしてみると予想以上にたくさんあった。
こういう便利なものをどんどん活用して、開発スピードを上げていきたいです。

・・・でもこういうのばかりじゃなくて、定期的に集まって話しあったり、もくもく会するのが一番開発が進む気がします :sweat_smile:

※ 2016/02/14 開発体制と不便さを感じたものについて追記しました。
"Warning (el-get): Your Emacs doesn't support HTTPS (TLS)."



for Mac OS X


## Error Message 

>Warning (el-get): Your Emacs doesn't support HTTPS (TLS).


## How to Fix in short


>brew install emacs --with-cocoa --with-gnutls



## How to re-install emacs


Uninstall emacs first

```
brew uninstall emacs
```

For Emacs 24

```
$ brew update
$ brew install emacs --with-cocoa --with-gnutls
$ brew linkapps emacs
```


```
$ sudo rm /usr/bin/emacs
$ sudo rm -rf /usr/share/emacs
```

```
$ alias emacs="/usr/local/Cellar/emacs/24.x/Emacs.app/Contents/MacOS/Emacs -nw"
```


### Ref.

* [Installing Emacs on OS X - WikEmacs](http://wikemacs.org/wiki/Installing_Emacs_on_OS_X)
* [MacでEmacsに入門する#1 インストール編 - Qiita](http://qiita.com/shimoju/items/daf0714c3a53c9400400)
バレンタインにOperator Monoを贈ろう


まずは何も言わず、この記事の映像を見てください。

- [Introducing Operator](http://www.typography.com/blog/introducing-operator) - A monospace typeface and a short film about type design

数日前に、大御所[Hoefler & Co.](http://www.typography.com/)が、等幅であることをウリに出した新しいフォントです。カッコよくないですか? ヤバいです。等幅なのにポスターのコピーで使えるクオリティ。記事中でもフォント紹介なのに、Atomのスクリーンショットが出てくるありえない事態になっています。(ぐっとこらえてOperatorについての薀蓄は書かないので元記事をどうぞ)

# Operator Mono

![operator_waterfall.png](https://qiita-image-store.s3.amazonaws.com/0/1858/d198c5e8-7709-e9fc-f5e1-80f0f5eaddd2.png "operator_waterfall.png")

シビれすぎて、有料(しかも結構いいお値段)にもかかわらず手を出してしまいました。Atomに入れてみたスクリーンショットがこちら。等幅斜体がいい感じ。ちなみに、大画面で16ptとかで使うなら素のままでも良いんですが、ノートPCで12ptなので一部を太字にしてメリハリをつけています。


![Operator SSm.png](https://qiita-image-store.s3.amazonaws.com/0/1858/4e9fa467-8359-67bb-44af-61e34d471dd7.png "Operator SSm.png")

実は、Operator Monoには2種類あります。

- 画面表示に最適化された[ScreenSmart版](http://www.typography.com/fonts/operator/styles/screensmart/) - $179
- 印刷でも使える[通常版](http://www.typography.com/fonts/operator/styles/operatormono) - $199

前者は小さいフォントサイズでもピクセルに最適化されてキレイに見えます (9ptまで対応)。一方、通常版はプログラミングには向かないので要注意です。参考まで、通常版だと次のスクリーンショットのように滲んでしまってイマイチ...。なので、必ずScreenSmart版をどうぞ。

![Operator.png](https://qiita-image-store.s3.amazonaws.com/0/1858/478d3ca7-0698-4fd6-43c4-3355885ca199.png "Operator.png")


# ちょっと待って w

## 普通のMenlo

![Menlo.png](https://qiita-image-store.s3.amazonaws.com/0/1858/5940dc20-11b3-3fdb-2b90-b91e011a0ff9.png "Menlo.png")

いつも使っているのはオーソドックスにMenloだったんですが、Operatorと比べるとちょっと寂しい感じがしなくもありません。ただ、ピクセル最適化され直線と円を基本とするデザインはさすが。しかし、ここでハッと気付きます。斜体と太字を使えばだいぶ違うんじゃなかろうか!?

## Menlo + 太字

やってみたのが、こちら。かなり見やすいですね。人によってはこちらの方が好きってケースも多いかも。こっちで良かったんじゃないか...、というのは気がつかなかったことにします。

![Menlo Bold.png](https://qiita-image-store.s3.amazonaws.com/0/1858/ff6e5739-407a-bc66-acf1-bdd7a9b8991d.png "Menlo Bold.png")


# まとめ

鳴り物入りで登場したOperatorフォント。おすすめな使い方は、プログラマーな彼氏/彼女へのプレゼントですね。来るバレンタインデーにぜひ! (笑)

ただし、2点ほど注意事項が。

1. もし万が一購入する場合は、必ず画面表示に最適化された[ScreenSmart版](http://www.typography.com/fonts/operator/styles/operatormonoscreensmart)の方をどぞ。
2. かならずRetinaディスプレイで使いましょう。

この3年ほどRetinaディスプレイが浸透してきて、プログラミング環境にも「オシャレ」が忍び寄っていますね。今回も、単に視認性の点でもシンタックスカラーリングに斜体や太字を組み合わせるのは有効だなと、気づかされた次第です。Operator関係ないけど。

さて、自分のエディターに最適なフォントを探している人は、ぜひ、こちらのサイトも試してみてください。40以上のフリーフォントを試せます。それでは、皆さんも幸せなフォントライフを!

- Programming Fonts Tester - http://app.programmingfonts.org/

# おまけ

エディタのフォント設定は実は沼なので深入りしない方がいいですが、こだわり派にはFira Codeもオススメです。`!=`を`≠`とかに勝手に置き換えてくれてハッピー。

https://github.com/tonsky/FiraCode

![Fira Code](https://github.com/tonsky/FiraCode/raw/master/showcases/all_ligatures.png)
mySqlサーバを止められなくなったとき

# 事象
* mysqlサーバを停止しようとした際、以下のようなエラーが発生する。
* 起動もできなくなる


```
$mysql.server stop
 ERROR! MySQL server PID file could not be found!
```

# 環境
os mac
バージョン:mysql  Ver 14.14 Distrib 5.7.11

# 手順
プロセス停止後、ロックだけが残っていることで発生する

1. mysqlのプロセスを確認

```
ps ax | grep mysql
```

```
42711   ??  S      0:00.03 /bin/sh /usr/local/Cellar/mysql/5.7.11/bin/mysqld_safe --datadir=/usr/local/var/mysql --pid-file=/usr/local/var/mysql/kato-no-MacBook-Air.local.pid
42801   ??  S      0:01.39 /usr/local/Cellar/mysql/5.7.11/bin/mysqld --basedir=/usr/local/Cellar/mysql/5.7.11 --datadir=/usr/local/var/mysql --plugin-dir=/usr/local/Cellar/mysql/5.7.11/lib/plugin --log-error=/usr/local/var/mysql/kato-no-MacBook-Air.local.err --pid-file=/usr/local/var/mysql/kato-no-MacBook-Air.local.pid
```

1. 停止する   
いろいろ出てくる場合
このプロセスIDを停止する

```
$ sudo kill -TERM 42711
$ sudo kill -TERM 42801
```

1. 確認   
grep自身のプロセス以外が削除されたことを確認

```
s ax | grep mysql
43118 s000  S+     0:00.01 grep mysql
```

以上にて、正常にmysqlの停止、起動ができるようになる。


# 参考
http://astail.net/?p=101
ATコマンドを打っても何も返ってこないときの解決方法for Mac【ESP8266】


私はWi-FiモジュールESP8266を購入し、早速IoTデビュー！というときに、Cerevoの[技術Blogの記事](https://tech-blog.cerevo.com/archives/859/)や、これ以外にも様々なブログやQiita記事を見ました。
どんな記事にも大体 <font color="DEEPPINK" size="4">**ATコマンド入力**</font> という手順が出てきて、シリアルモニタに <font color="DEEPPINK" size="4">*AT*</font> と入力し、送信ボタンを押すと <font color="DEEPPINK" size="4">*OK*</font> と返ってくるということが書いてありました。

早速MacにインストールしたArduino IDEで記事を何度も確認しながらやってみると...

__<font color="DEEPPINK" size="6">何も返ってこない。。。</font>__

エラーも何も表示されない。
結構最初のほうにATコマンドの部分が出てくるので、「こんなところで壁にぶつかるなんて！」と、とても絶望しました。

この記事は組み立てが終わり、いよいよこれからというところでOKが返ってこなくてショックを受けている人のために書きます。

## <font color="HOTPINK">解決方法</font>

- Arduino IDEをインストールする。
- 部品を組み立る。
- 組み立てたモジュールをPCと接続する。
- Arduino　IDEのツール→ポートからUSBデバイス名を確認する。
- [GitHub esptool](https://github.com/themadinventor/esptool) のDownload ZIPボタンからダウンロードする。
- ターミナルを開いて以下を実行する。

```
$ cd
$ cd Downloads/esptool-master
$ sudo python setup.py install
```
- [ここ](http://bbs.espressif.com/viewtopic.php?f=46&t=919&p=3092#p3092)からファームウェアを入手する。(esp_iot_sdk_v1.3.0_15_08_08.zipをダウンロードする)
- ターミナルを開いて以下を実行する

```
$ cd
$ cd Downloads/esptool-master
$ sudo python setup.py install
```
- 先程ダウンロードしたesp_iot_sdk_v1.3.0_15_08_08.zipを解凍して、esp_iot_sdk_v1.3.0_15_08_08　→　esp_iot_sdk_v1.3.0　→ bin の中に、GitHubからダウンロードした、esptool-masterの中のesptool.pyをコピーする。
- ターミナルを開いて以下を実行する。

```
$ cd
$ cd Downloads/esp_iot_sdk_v1.3.0_15_08_08/esp_iot_sdk_v1.3.0/bin
$ ./esptool.py -p /dev/cu.usbserial-★ここにUSBデバイス名入れる★ write_flash -ff 26m -fm qio -fs 32m 0x00000 boot_v1.4\(b1\).bin 0x01000 at/user1.1024.new.2.bin 0x7e000 blank.bin 0xfe000 blank.bin
```
## 実行結果
[![https://gyazo.com/7853246ed63f629a8692ab298480b246](https://i.gyazo.com/7853246ed63f629a8692ab298480b246.jpg)](https://gyazo.com/7853246ed63f629a8692ab298480b246)

## これでATコマンドを入力するとOKと返ってくるようになります！

[![https://gyazo.com/9b13b9b5284fd03ed1d79f183c2fb0d8](https://i.gyazo.com/9b13b9b5284fd03ed1d79f183c2fb0d8.jpg)](https://gyazo.com/9b13b9b5284fd03ed1d79f183c2fb0d8)
## <font color="HOTPINK">引っ掛かりポイント</font>
__<font color="DEEPPINK" size="4">`boot_v1.4(b1).bin`ではなく、`boot_v1.4\(b1\).bin`です！</font>__

色々な記事に`boot_v1.4(b1).bin`書いてあるし、binディレクトリでlsコマンドを実行してもboot_v1.4(b1).binと出てきますが、そのまましてしまうと、` zsh: no matches found: boot_v1.4(b1).bin `と出てきてしまいました。
Swift2で静的なDIを実現する謎のソースコード

　とりあえず書いたら動いたけど、なんだかよくわかっていないのでコードだけ貼っておきます。元ネタは[ここ](http://acqui-hire.me/dependency-injection-with-the-cake-pattern-in-swift/)。元ネタではAppContextで頑張って配線しているけど、めんどうくさいのでどうにかならんのか、と思っていろいろいじってたらこうなった。

　いろいろ分かったらまとめて記事を書きます。XcodeのPlaygroundで動いたので、貼っていじってみるとよいのではないですかね。

```swift
// A & AComponent
public protocol A {
    func getA() -> String
}

private class AImpl: A {
    private func getA() -> String {
        return "a"
    }
}

public protocol AComponent {
    static var a: A { get }
}

public protocol DefaultAComponent: AComponent {}
extension DefaultAComponent {
    public static var a: A {
        return AImpl()
    }
}

// AB & ABComponent
public protocol AB {
    func getAB() -> String
}

private class ABUsingA: AB {
    private let a: A
    private init(a: A) {
        self.a = a
    }
    private func getAB() -> String {
        return a.getA() + "b"
    }
}
private class SimpleAB: AB {
    private func getAB() -> String {
        return "AB"
    }
}

public protocol ABComponent {
    static var ab: AB { get }
}
public protocol DefaultABComponent: ABComponent {}
extension DefaultABComponent where Self: AComponent {
    public static var ab: AB {
        return ABUsingA(a: a)
    }
}
public protocol SimpleABComponent: ABComponent {
    static var ab: AB { get }
}
extension SimpleABComponent {
    public static var ab: AB {
        return SimpleAB()
    }
}

// Components
public typealias Components = protocol<AComponent, ABComponent>

public enum DefaultComponents: DefaultAComponent, DefaultABComponent {}
let defaultComponents: Components.Type =  DefaultComponents.self
defaultComponents.a.getA()   //=> "a"
defaultComponents.ab.getAB() //=> "ab"

public enum SimpleComponents: DefaultAComponent, SimpleABComponent {}
let simpleComponents: Components.Type =  SimpleComponents.self
simpleComponents.a.getA()    //=> "a"
simpleComponents.ab.getAB()  //=> "AB"
```
開発したiOSキーボードの名前を変える


1. キーボードのターゲットを作成した時に作られたグループ配下にある Info.plist の Bundle display name を変更する
	- キーボード名は変わったけどこれだけだとアプリ名が変わらない
	- キーボード選択では ```{キーボード名} - {アプリ名}``` という表記になる
2. プロジェクトを選択して Targets の中にあるアプリを選択して ```Product name``` を変更
	- プロジェクトのトップの ```Product name``` を変更しても変わらない
	- キーボード名と一致していればキーボード選択でキーボード名だけが表示されるようになる
MySQLのDBバックアップの自動化をやってみたのでメモ

# ●やりたい事と条件

- ローカルサーバのDBのバックアップを自動でクラウド上のバックアップサーバにアップロードしたい

- DBの中にあるデータベースは複数あるが、いちいち名前を指定したくない

- 無料でやりたい（クラウド代は別）

- 毎晩勝手にやってほしい

# ●事前準備

1. バックアップ元サーバとバックアップ先サーバをCentOS6系で構築し、グローバルIPアドレスと
FQDNをDNSサーバに登録して名前で引けるようにしておく。
2. バックアップ元サーバとバックアップ先サーバに同じ名前のバックアップ用ユーザを作成

`sudo adduser backupuser`
上記を両方のサーバで実行
3. バックアップ用ユーザにパスワード無しの公開鍵を作成する

`su - backupuser`
`ssh-keygen`
鍵は全てエンター押下のみで作成することによりパスワード無しになる
作成はどちらかのサーバだけで行えば良い、ここではバックアップ元で作成
4. バックアップ元からバックアップ先にバックアップ用ユーザの公開鍵を使用してパスワード無しでログインできるようにする
`cd .ssh`
`cat id_rsa.pub`
表示された公開鍵をコピペしておく
バックアップ先にbackupuserでログインして以下を実行
`mkdir .ssh`
`chmod 700 .ssh`
`cd .ssh`
`vi authorized_keys`
コピペしておいた公開鍵の内容を貼り付けて保存
(コピペミスして頭一文字切れるだけでログインできなくなるので注意）
5. バックアップ元で以下のコマンドを実行して何も聞かれずにログインできたら成功
`ssh バックアップ先サーバ名`
6. SSHのポートをデフォルト22から変更する
`vi /etc/ssh/sshd_config`
以下のコメントになっている行の数字をウェルノウンポート以外に変更して有効にします
`#Port 22`

# ●バックアップ用シェルスクリプト作成

スクリプトを全部は載せられないので、一部の要点のみ記載します。

## ■mysqldumpのオプション設定
`--quote-names --skip-lock-tables --single-transaction --skip-dump-date`
順番に意味を説明すると以下です。

- 識別子をバックティックで囲む
- テーブルロックを防ぐ
- ダンプを1トランザクション内で行うことで、テーブルをロックせずに整合性を保つ
- 出力日時だけ出力しない

## ■rsyncのオプション設定
`-acvzu`
オプションは定番中の定番なので、意味は割愛します。

## ■rsyncが使用するデフォルトSSHポートの指定
`export RSYNC_RSH='ssh -p xxxx'`
上記をスクリプトの中で定義しておくと変更したポートを使用してくれます。

## ■全データベース名の取得

` find /var/lib/mysql/ -maxdepth 1 -type d -print | sed -e s"#/var/lib/mysql/##"g | tr '\012' ' '`

上記コマンドは、ディレクトリのフルパス一覧をまず表示させて、sedでフルパスを消してディレクトリ名だけにして、trで改行コードをホワイトスペースに一括変換しています。
これをデータベースのリストとして、for文などで回して使用します。

## ■スクリプト全体の流れ

スクリプトの全体の動きとしては、取得したDB名全てに対してmysqldumpコマンドでダンプを出力して圧縮し、それを順次バックアップサーバにrsyncコマンドで同期していき、終わったら元の圧縮ファイルとダンプファイルは消します。
スクリプトは実行時にログファイルを日々バックアップ元サーバに残しておいて、それがあれば今日は終わっていると判断して何もしない処理を入れます。
またバックアップ先サーバに実行中はフラグとなるファイルを作成し、終わったら消します。
バックアップ元サーバが複数ある場合を考えて、そのフラグファイルがあったら、実行をスキップしてスクリプト終了します。

# ●自動実行の設定

自動実行にはcrontabを利用します。

`su - backupuser`
`crontab -e`
以下を記載して保存
`* 3-4 * * * /home/backupuser/mysql_backup.sh >/dev/null 2>&1`

上記のcrontabの説明は以下です。
毎日3時から4時の間1分おきにスクリプトを実行してその時の標準出力と標準エラー出力は/dev/nullに捨てる。

3時から4時にしているのは、台数が増えた時に他と実行が被っていたら、スキップするので、リトライさせる為です。

# ●おわりに

mysqlのデータを毎晩自動でバックアップできる仕組みを今回作ってみましたが、バックアップサーバの容量は無限ではないので、古いものは順次消していくような仕組みも必要だなぁと思いました。

バックアップを作成していないまま、業務に使うWEBアプリケーションを使い続けるのは非常に不安だったのですが、これで万が一の保険となってよかったです。
PostgreSQLアンチパターン：目的なしの分割テーブル


# 目的なしの分割テーブル

TABLE が数千万行のサイズになると、運用時間の制約が厳しくなってきます。

- デフォールト値ありのカラム追加
- インデックス追加・削除
- TABLE単位のdump

設計段階で大きくなることがわかっていると、PostgreSQLのパーティショニング機能を使って、扱い易いサイズにしようとなります。
[Let'sPostgresの記事](http://lets.postgresql.jp/documents/technical/partitioning/1) に性能上100分割まで、と書いてあるから、mod(id, 100) で分別しようか？　と安易にやると、パーティショニングのデメリットが強く出てきて、割に合いません。

## デメリット

- ちょっとしたクエリでも性能が劣化する
 - クエリでいつも id が一つずつならいいのですが、範囲指定や、IN での複数指定だと、SQLも最大100個生成されて、最大100個テーブルが検索対象になります。全体計算量が変わらず、分割したオーバーヘッドの分だけ遅くなります。
- 性能バグの温床になる
 - id一つ指定のクエリ、id=12345についてのクエリは `WHERE mod(id,100)=mod(12345,100) AND id=12345 AND ...` を含むように作る必要があります。 `mod(id,100)=mod(12345,100)` を忘れると、分割テーブルレベルの絞込が効かず、SELECTが100個生成され、99個が空振りして、結果だけは正しいものが返るという見つけにくい性能バグになります。
- DAU：daily active user がそれなりにあると検索の局所化効果が出ない
 - 分割テーブルの一部だけが検索対象になっていれば、メモリにすいっと載ってくれて、検索スループットが上がるというのが局所化効果です。でも DAU が十分あるサービスだと、mod(id, 100)分割しても結局全部が検索対象になって、載りきらないとswap発生です。局所化での性能チューニングは、直近の情報だけにアクセス頻度が偏るとか利用状況が予想できるときに、それに合わせた時分割戦略をとるという具合にしないといけません。
- Planning timeが長くなる
 - テーブルレベルの絞込がちゃんと効く場合でもペナルティがあります。引数でidの値を与えている以上、実行計画作成のオーバーヘッドがのります。詳しくはfujii_masaoさんの  http://qiita.com/fujii_masao/items/bca5067eade0872fe80b を。
 - CASE WHEN ～とかにして長いSQLを使っていると、副問い合わせ数 x Planning ペナルティになります。たとえ実際には実行されない部分の副問い合わせでも。

## IO性能で有利じゃないの？

- Long long ago, メモリが絶望的に高価で実装量が乏しくて、DBシステムの性能がHDDのIO性能で決まっていた頃、 TABLESPACE を複数HDDにそれぞれ作って、分割テーブルを各TABLESPACEに分散させて、IO性能を稼ぐチューニングがありました。
- 今は AWS から IO性能は「量り売り」で要件に必要なだけ購入する時代です。  
[Provisioned IOPS (SSD) ボリューム](http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/EBSVolumeTypes.html#EBSVolumeTypes_piops)  
AWSからみて1ドライブにしておけば、AWS EBS の snapshot 機能で、無停止無負荷高速backcupできるので、こちらのメリットが圧倒的に大きいです。  
[一つ前の記事](http://qiita.com/masudakz/items/df4de728072f8434da4b) でも言及しました。   

## 分散DBでスケールアウト

大規模分散DBを目指すなら、TABLE ではなく SCHEMA単位で分割しましょう。Instagram が PostgreSQL のスケールアウトでは先行成功例です。
  
- [Sharding and IDs at Instagram](http://instagram-engineering.tumblr.com/post/10853187575/sharding-ids-at-instagram)

## もっと分散

もっと要件が厳しい（面白い）なら、 Googleの [Spanner/F1](http://research.google.com/pubs/pub38125.html) あたりを真似て作らないといけないかな。

- Scale: 10s of TB, replicated to 1000s of machines
Android エミュレーターでのユニットテスト（画面サイズとAPIレベルのマトリクス）


## エミュレーター紹介
* [AVD Android Emulator](http://developer.android.com/intl/ja/tools/help/avd-manager.html)
 * 起動が遅い
 * Intel x86 Emulator Accelerator (HAXM)を使った高速化の方法が出回っているが、少し面倒 
* [Genymotion](https://www.genymotion.com)
 * Android ADVよりも起動が早い
 * インストール時に一手間（VirtualBoxをインストールしなければいけない）
 * 有料版があるが、ネットワークを多用しなければ問題なし
* [BlueStacks](http://www.bluestacks.com/ja/index.html)
 * 開発者向けのエミュレータというよりは、GooglePlayからゲームをダウンロードしてきて、遊ぶため

## 画面サイズとAPIレベル
 * Genymotionでのエミュレータリストから、効率よくテストができるような組み合わせをリストアップ
 * いわゆるスマホ画面用（タブレットは除外）

| Ver(API Level)	 | 4.1(16) | 4.2(17) | 4.3(18) | 4.4(19) | 5.0(21) | 5.1(22) | 6.0(23) |
|:-----------|:-----------:|:-----------:|:-----------:|:-----------:|:-----------:|:-----------:|:-----------:|
| 480 * 800 | ◎ |  |  |  |  |  |  |
| 720 * 1280 | ○ | ◎ | ◎ |  |  |  |  |
| 768 * 1280 |  |  |  | ◎ |  |  |  |
| 800 * 1280 |  |  |  | ○ |  |  |  |
| 1080 * 1920 |  |  |  |  | ○ |  |  |
| 1200 * 1920 |  |  |  |  | ○ |  |  |
| 1200 * 1920 |  |  |  |  |  | ○ | ○ |


## Android ユニットテストに関するその他の記事
 * [Android ユニットテストとUIテストの自動化プラクティス](http://qiita.com/m1takahashi/items/abfd86f37e25dc6122a8)
 * [Android エミュレーターでのユニットテスト 画面サイズとAPIレベルのマトリクス](http://qiita.com/m1takahashi/items/218b49b76e588dcbda27)
 * Android ユニットテストとUIテスト
mruby-cliで特定のプラットフォームのみmrbgemを指定するには

MRuby::CrossBuild.newの中にconf.gemを追加する

以下のような感じ。

この場合、Dockerイメージに/root/src/配下にmrbgemをすでに
配置してあることが前提。

```rb
MRuby::CrossBuild.new('i686-w64-mingw32') do |conf|
  toolchain :gcc

  [conf.cc, conf.linker].each do |cc|
    cc.command = 'i686-w64-mingw32-gcc'
  end
  conf.cxx.command      = 'i686-w64-mingw32-g++'
  conf.archiver.command = 'i686-w64-mingw32-gcc-ar'
  conf.exts.executable  = ".exe"

  conf.build_target     = 'i686-pc-linux-gnu'
  conf.host_target      = 'i686-w64-mingw32'

  conf.gem '/root/src/mruby-webcam'
  gem_config(conf)
end
```

# 関連投稿

- [mruby-cliでOpenCVに依存したmruby-webcamを使ってマルチプラットフォームでワンバイナリを作る - Qiita](https://qiita.com/kjunichi/items/22693c6a768b67ea02b4)

# 関連記事

- [外部のライブラリに依存するmrbgemを使ってもmruby-cliでワンバイナリを作成できるようにした](http://abrakatabura.hatenablog.com/entry/2016/02/14/144922)
DiagrammeR入門 画像ファイルなどへの出力

## export diagram
### 前振りと参考資料
以下の記事の続きです:
- [DiagrammeR入門　NDFとEDF](http://qiita.com/kazutan/items/ec47a2403df9eb817ce0)
- [DiagrammeR入門 nodeの属性まとめ](http://qiita.com/kazutan/items/ec47a2403df9eb817ce0)

DiagrammeRで作成したダイアグラムはRStudioのViewerに表示されたり、またR Markdownにそのまま埋め込むことができます。しかし時には画像ファイル等で出力したいと思うこともあるでしょう。今回はその方法を説明します。

### 前準備
今回は以下の例で説明します。また、**方法その2は執筆時現在で開発版のみでの対応**のようですので、開発版を持ってきてインストールしておきます。

```r
devtools::install_github("rich-iannone/DiagrammeR")
library(DiagrammeR)

g <-create_graph(
  nodes_df = data.frame(nodes = c("kosaki", "chitoge","tsugumi"))
)
```

### 方法その1: RStudioのViewerからエクスポート
一旦RStudioのViewerに出力して、その後にRStudioの機能でExportする方法です。まずはレンダリングします:

```r
render_graph(g)
```

これでRStudioのViewerに表示されるので、ViewerにあるExportボタンをクリックします

![DgmR_expt1.png](https://qiita-image-store.s3.amazonaws.com/0/35118/93b7d428-bd36-a197-8a2e-40534d5547cf.png)

**「Save as Image...」でいけそうですが環境によってはうまくいかない場合がある**ようです。なので「Copy to Clipboard...」を選択し、画像編集ソフトなどに貼り付けて適宜編集・保存してください。

また、「Save as Web Page...」を使うと、このダイアグラム単独が表示されるhtmlファイル(要はウィジェット)が出力されます。そのままWebページに埋め込みたい場合は、この方法も検討してみてください。

一つだけ出力するならこれでもいいのですが、複数実行する場合は正直面倒です。あまりおすすめしません。

### 方法その2: `export_graph()`の利用
現時点で一番おすすめです。png形式やsvg形式、pdf形式とps形式に対応しています。

この関数を利用するためには`DiagrammeRsvg`パッケージが必要です。またUbuntu環境の場合は、Ubuntuのリポジトリからrsvgライブラリを事前にインストールする必要があります。  
ではまず必要な物を準備します:

```r
devtools::install_github("rich-iannone/DiagrammeRsvg")
library(DiagrammeRsvg)
```

これで準備はできたので、以下のようにコマンドを実行します:

```r
export_graph(g, file_name = "g.png")
```
![g.png](https://qiita-image-store.s3.amazonaws.com/0/35118/27ad7557-d698-5659-8883-b78f2fb0d769.png)

第一引数に`DiagrammeR::create_graph()`で作成したグラフオブジェクトを指定し、`file_name=`で出力するファイル名を**拡張子付き**で指定してください。ファイル形式はこの拡張子で自動判別してくれます。

この方法であればコードで出力できますので制御しやすく、ログも残ります。そして何よりも速いです。ただしまだ開発版にしか組み込まれていない(はず)なので、その最新版を取得して実行してください。

Enjoy!
Windowsでも一発でRictyフォントを生成できるコマンド　※

ただし[Docker](https://www.docker.com/)が必要。

Dockerを使っていない人には要らんソフトが入りまくるので、ぶっちゃけ大人しく[Ricty Diminished](https://github.com/yascentur/RictyDiminished)を使う（M+フォントに収録されていないような漢字を含むソースコードなんてそうそう無いですし）か、どうしても本家が良かったら他の方が紹介されている非公式fontforge-cygwinを使う方法[^1]の方が良いと思います。が、既にDockerをインストールされている方は多分これが一番早いと思います。

[^1]: ただしざっと見た感じ大抵情報が一部古いようです。特に最新（v4.0.1）のRictyはotfのInconsolataではなく[Google Fontsのttf版](https://www.google.com/fonts/specimen/Inconsolata)を使うようになっています。


# 使い方

1. Dockerがインストールしてある
1. Docker Quickstart Terminalを起動する
1. 適当なディレクトリに移動して`docker run --rm bakudankun/ricty-generator --zipball > Ricty.zip`または`--tarball > Ricty.tar.gz`
1. コマンドが返ってくるまで３分待つ
1. 生成されたRicty.zipまたは.tar.gzを解凍する
1. 完成!!!!


# オプション

<dl>
<dt>--tarball</dt>
<dd>生成したフォントの .tar.gz アーカイブを標準出力に吐く</dd>
<dt>--zipball</dt>
<dd>生成したフォントの .zip アーカイブを標準出力に吐く</dd>
<dt>--generator-opts=opts</dt>
<dd>ricty_generator.sh に渡すオプション（RictyのREADMEを参照）</dd>
<dt>--discord-opts=opts</dt>
<dd>ricty_discord_converter.pe に渡すオプション（RictyのREADMEを参照）</dd>
<dt>-o, --oblique</dt>
<dd>斜体も生成する</dd>
<dt>--no-os2</dt>
<dd>os2version_reviser.sh を利用しない</dd>
<dt>-h, --help</dt>
<dd>ヘルプを表示する</dd>
</dl>


# 関連リポジトリ

* [Dockerイメージ](https://hub.docker.com/r/bakudankun/ricty-generator/)
* [それを作るDockerfile](https://github.com/Bakudankun/docker-ricty-generator)


# 補足

## ボリュームをマウントする方式

一応`--zipball`や`--tarball`を指定せずに`-v /path/to/outdir:/out`オプションでoutdirに生成する方法もありますが、Windowsの場合`/path/to/outdir`はUsersフォルダ以下のパスをフルパスで、しかも何故か最初はスラッシュを二つ重ねて`//c/Users/...`のように書かないと駄目らしい(Docker v1.9.1現在)ので、`--zipball`を使う方が楽です。


## ライセンスについて

ライセンスに関してはよくわからないので問題があるかないか分かる方がいらしたらお教えください。一応Dockerイメージに生成済みRictyフォントは含まれていませんし、生成するフォントと一緒に関連フォントのライセンスもコピーするので大丈夫だと思いますが……。


# 更新履歴

## 2016/2/22

* ricty_generatorやricty_discord_converterにオプションを渡せるようにしました。
* 斜体を生成できるようにしました。
* os2version_reviser.shを利用しないオプションを追加しました。


# 今後の目標

* [powerlineパッチ](https://github.com/powerline/fontpatcher)適用  
↑パッチしたフォントが全角幅になってしまってうまく行かないし成功したとしてもWindowsだとそれほど見栄え良くないし諦め気味
* フォルダを`/in`にマウントして別のフォントを合成できるようにしたい
PHP導入メモ

Javaを一年ほど勉強してきたのですが、PHPを勉強する機会がやってきたので導入してみました。
以下簡単な環境構築のメモ。

#必要なもの

[XAMPP](https://www.apachefriends.org/download.html)
PHPの実行に必要なApacheというHTTPサーバーアプリケーションが入っています。

[サクラエディタ](http://sakura-editor.sourceforge.net/)
エディタ。普段はAndroidStudioばかり触っているのでIntelliJのエディタでもいいかと考えましたが導入入門ということでシンプルなサクラエディタを導入しました。

#セットアップ

まずはXAMPPから。
[ダウンロード](https://www.apachefriends.org/download.html)できるバージョンが３つあると思いますが、

![xamppdown.PNG](https://qiita-image-store.s3.amazonaws.com/0/109506/00aaf43c-9c03-c06a-ab66-df6555fe839d.png)

軽く調べてみたところ7.0.2が最新バージョンということだったので、7.0.2版を選択。ダウンロード。そのままインストールを始めます。


![xamppsetup1.PNG](https://qiita-image-store.s3.amazonaws.com/0/109506/8eea9fcd-fe0d-289a-c3c2-faecd156e231.png)

解説サイトを参考にしているので全部にチェックを入れています。
PHPのみが目的の場合はApacheとPHPのみにチェックを入れるだけでも大丈夫かと思います。

![xampsetup2.PNG](https://qiita-image-store.s3.amazonaws.com/0/109506/21963e2b-9b63-8412-ba0b-b5c6f11d2dff.png)

インストール先もデフォルトのまま```C:\xampp```に。

![xamppsetup3.PNG](https://qiita-image-store.s3.amazonaws.com/0/109506/5cb54332-6311-e6cb-87f3-7cb46d5cf700.png)

Bitnamiをインストールするかどうかを聞かれます。
Bitnami自体も便利なローカルサーバーアプリケーションとのことでしたが導入・学習段階なので今回は入れませんでした。
Nextを押してインストール完了。

#PHPの設定

PHPは文字コードなどを正しく設定しておかないと日本語文字列を入力した際に正しく表示されないことがあります。
詳細は[このサイト](http://tsuttayo.jpn.org/php/char_trn/)がわかりやすかったです。

```C:\xampp\php``` にある ```php.ini```を編集します。
自分はUTF-8に設定したかったので

```output_buffering = Off
magic_quotes_gpc = Off
default_charset = UTF-8
extension_dir = C:/php/extensions
extension=php_mbstring.dll
mbstring.language = Japanese
mbstring.internal_encoding = UTF-8
mbstring.http_input  = auto
mbstring.http_output = UTF-8
mbstring.encoding_translation = On
mbstring.detect_order = auto
mbstring.substitute_character = none```

としました。
また、サクラエディタがそのままだとShift-JISの設定になっているので、

設定→タイプ別設定→ウィンドウと開いて
![sakura.PNG](https://qiita-image-store.s3.amazonaws.com/0/109506/3a539fae-3024-d3eb-9da3-d37d39e0ed70.png)

の文字コードの項目をUTF-8に設定します。

これでセットアップは完了です。

#PHPプログラムの実行

まずはXAMPPを起動します。
そのままではApacheがインストールされていないので、赤丸でかこった部分をクリックします。
![xamppstart1.PNG](https://qiita-image-store.s3.amazonaws.com/0/109506/26d6eec4-8497-4d48-a74d-b9fdb2e3a01f.png)

そうするとApacheがインストールされるので、Startを押します。

![xamppstart2.PNG](https://qiita-image-store.s3.amazonaws.com/0/109506/98a76175-602a-a14e-421c-dae231d71d84.png)

このような感じになったら準備完了です。

それではエディタを立ち上げて、```C:\xampp\htdocs\php```にファイルを保存していきます。
まずは簡単にHello Java!から。

C:\xampp\htdocs\php\hello.php

```
<?php
  echo "Hello Java!";
 ?>
```
保存ができたら、[http://localhost/php/](http://localhost/php/)を開きます。
保存したhello.phpがあると思うので開きます。

![hello.PNG](https://qiita-image-store.s3.amazonaws.com/0/109506/05d4065b-f065-703e-f7af-7e6a116b6a77.png)

このようになったら成功です。
Mac OS XでAWS EC2のLinuxインスタンスにssh接続する

# 前提
- AWSのアカウント作成済み
- EC2でLinuxインスタンスを作成・起動済み
- SSH クライアントがインストールされている（されてるはず）

# 普通にSSH接続する場合
## セキュリティグループを設定
- [EC2 Managerを開く](https://console.aws.amazon.com/ec2/v2/home)
- 作成したインスタンスのセキュリティグループを確認
- セキュリティグループのインバウンドルールにSSH（送信元：0.0.0.0/0）が設定されているか確認
- 設定されてなければインバウンドルールを追加する

## キーペアの作成
- [EC2 Managerを開く](https://console.aws.amazon.com/ec2/v2/home)
- ネットワーク & セキュリティ > キーペアを選択
- キーペアを作成、秘密鍵（キー名.pem）をダウンロード
- キー名.pemを「~/.ssh」以下に置く
- キー名.pemへのアクセス権限を400に変更
    - `$ sudo chmod 400 ~/.ssh`
- SSH接続する
    - `$ ssh -i "/User/username/.ssh/キー名.pem" ec2-user@ec2-XX-XXX-XXX-XX.compute-1.amazonaws.com`
        - DNSはインスタンス情報の「パブリックDNS」を参照
        - ユーザ名はAmazon Linuxインスタンスはデフォルトでec2-user
        - **※重要なのは鍵の指定を絶対パスですること。相対パスや「~/.ssh/」などで指定するとErrorになる**


以上
UIAlertにUIPickerViewを表示する（Swift2.1）

UIAlertにUIPickerViewを表示させるメモ
<img width="432" alt="スクリーンショット 2016-02-13 10.56.21.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/40894/92dbf5fa-f518-b4c7-2f29-8ff3c47a15f4.jpeg">

```swift
import UIKit

class ViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource {
    
    let pv = UIPickerView()
    let items = [
        ["アイカツ", "プリパラ", "アイマス"],
        ["いちご", "ゆりか", "みずき", "あかり", "らぁら", "みれぃ", "そふぃ", "あんず"]
    ]
    var anime = ""
    var chara = ""

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        
    }
    
    override func viewDidAppear(animated: Bool) {
        super.viewDidAppear(true)
        // Alert
        let title = "トップアイドル"
        let message = "好きなアイドルを選択してください.\n\n\n\n\n\n\n\n" //改行入れないとOKCancelがかぶる
        let alert = UIAlertController(title: title, message: message, preferredStyle: .Alert)
        let okAction = UIAlertAction(title: "OK", style: UIAlertActionStyle.Default, handler:{
            (action: UIAlertAction!) -> Void in
            print("あなたの好きなアイドルは、\(self.anime)の\(self.chara)です.")
        })
        let cancelAction = UIAlertAction(title: "Cancel", style: .Cancel) { action in
        }
        
        // PickerView
        pv.selectRow(0, inComponent: 0, animated: true) // 初期値
        pv.frame = CGRectMake(0, 50, view.bounds.width * 0.85, 150) // 配置、サイズ
        pv.dataSource = self
        pv.delegate = self
        alert.view.addSubview(pv)
        
        alert.addAction(okAction)
        alert.addAction(cancelAction)
        presentViewController(alert, animated: true, completion: nil)
    }
    
    // PickerViewの列数
    func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int {
        return items.count
    }
    
    // PickerViewの行数
    func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
        return items[component].count
    }
    
    // PickerViewの項目
    func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
        return items[component][row]
    }
    
    // PickerViewの項目選択時
    func pickerView(pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
        if component == 0 {
            anime = items[0][row]
        } else {
            chara = items[1][row]
        }
        print("\(items[component][row])")
    }


    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}


```
Mac OS X EI Capitanにmongodbを入れてみる

# Homebrewのインストール
> 参考：http://qiita.com/is0me/items/475fdbc4d770534f9ef1

```
# Download & Install
$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

# PATHを通す（.bash_profileに記述）
$ export PATH=/usr/local:$PATH
```

# /data/db を作成
```
$ mkdir /data
$ mkdir /data/db
```

# mongod
```
$ mongod
```
```
# こんなメッセージが出たら成功
2016-02-13T10:34:55.559+0900 I NETWORK  [initandlisten] connection accepted from 127.0.0.1:49232 #1 (1 connection now open)
```


# mongo
```
# Terminalでmongodとは別のタブを開いて実行
$ mongo
>
```

以上
電子工作 > Link > トランジスタ 2SC1815

http://blogs.yahoo.co.jp/gomisai/25240358.html
にて使用されているバイポーラトランジスタ 2SC1815

http://akizukidenshi.com/download/2sc1815-gr.pdf
> VCEO = 50V (最少), IC = 150mA (最大)
> hFE = 100(標準) (VCE = 6V, IC = 150mA)

NPN型だ。

http://akizukidenshi.com/catalog/g/gI-00881/

手持ちの 2SC 2720 は
http://www.bonton-nagoya.com/index.php?main_page=product_info&products_id=1126

> Type: NPN
> Vceo: 40V
> iC: 500mA
> hFE: 50-300

同じように使えそうだが、残り３つ。再入手性も考えると、店で購入できるものを使うほうがよさそう。
Pythonの文字列フォーマット

# Pythonの文字列フォーマット

もういちいちドキュメント見るのが面倒なので必要なところだけメモ。

## 整列

* 左詰め - `{:<数字}`
* 右詰め - `{:>数字}`
* 中央揃え - `{:^数字}`
* 中央揃え with 詰め文字 - `{:詰め文字^数字}`

```py
>>> '{:<30}'.format('left aligned')
'left aligned                  '
>>> '{:>30}'.format('right aligned')
'                 right aligned'
>>> '{:^30}'.format('centered')
'           centered           '
>>> '{:*^30}'.format('centered')
'***********centered***********'
```

## 進数

* 十進数 - `{:d}`
* 十六進数 - `{:x}` or `{:#x}`
* 二進数 - `{:b}` or `{:#b}`

```py
>>> "int: {0:d};  hex: {0:x};  oct: {0:o};  bin: {0:b}".format(42)
'int: 42;  hex: 2a;  oct: 52;  bin: 101010'
>>> "int: {0:d};  hex: {0:#x};  oct: {0:#o};  bin: {0:#b}".format(42)
'int: 42;  hex: 0x2a;  oct: 0o52;  bin: 0b101010'
```

## 整数三桁セパレート

```py
>>> "{:,}".format(1000000)
'1,000,000'
```

## 辞書オブジェクトの属性

```py
>>> urldata = {"scheme":"http","netloc":"qiita.com","path":"/drafts"}
>>> url = "{scheme}://{netloc}{path}".format(urldata)
```

## クラスの属性

**`0.`**が重要。

```py
>>> url = "{0.scheme}://{0.netloc}{0.path}".format(urldata)
```


## 特殊な書式

```py
>>> import datetime
>>> d = datetime.datetime(2010, 7, 4, 12, 15, 58)
>>> '{:%Y-%m-%d %H:%M:%S}'.format(d)
'2010-07-04 12:15:58'
```
電子工作 > Link > UART 5V-3.3V 通信 > 1kbps / clock:100kHz

http://qiita.com/7of9/items/7adbdb53f913e939a055

5Vと3.3VのuC間でUART通信をする方法。
Raspberry Pi ZeroとESP8266を想定。

FXMA108などのICを使う方法もあるが、ダイオードと抵抗で分圧している例もある。

## 1kbps

http://www.ele-lab.com/tips_uart2.html
> 一番簡単な回路の一つは以下のような抵抗とダイオードだけの回路で通信速度が低速（～１ｋｂｐｓ）そして電源電圧が５Vと３．３V間の変換によく使用されます。（Ｄ１とＲ１は使用しない場合あり）

Raspberry Piの方は以前ラインモニタ作成時に調べた通信速度として、50bpsからいける。1kbps程度であれば600, 1200bpsあたりが選択肢となる。
http://qiita.com/7of9/items/1c677b696bc5f9fb1ab0


## clock 100kHz

http://blogs.yahoo.co.jp/gomisai/25240358.html

> 入力クロックは100kHzで、緑が3.3V入力、青が5V出力です。

100kHzということは

- データビット: 8
- start bit + stop bit: 2

のような場合は、 100kHz * 8 / (8 + 2) = 80kHz
57600 bpsには対応できるのだろうか。

参考　http://www.ele-lab.com/tips_uart.html
herokuでhubot立ててみたらカンタンだった


heroku-hubot-slackの組み合わせでやってみました。

# まずはローカルでhubotを動かしてみる (Windows)
あらかじめ[node.js](https://nodejs.org/)をインストールしておきます。では、hubotをインストール。

```shell-session
npm install -g hubot coffee-script
npm install -g yo generator-hubot
```

yeomanジェネレータでhubotを作ります。

```shell-session
mkdir [your-bot-dir]
cd [your-bot-dir]
yo hubot
```

では試しに起動してみましょう。

```shell-session
bin\hubot
@[your-bot-name] ping
PONG
```

# slackの設定
Slackから
> [Browse Apps](https://pyonteam.slack.com/apps) > Hubot > Configurations on [your-team] > Edit configuration

を開き、API TOKENを取得します。

# herokuの準備 (Windows)
herokuのアカウントを作っておきます。[heroku toolbelt](https://toolbelt.heroku.com/)をインストールし、ローカル環境のコマンドラインで設定します。

add-onを使うので、無料でも事前にクレジットカードの設定をお忘れなく。

```shell-session
heroku login
heroku create [your-bot-name]
heroku addons:create redistogo:nano
heroku config:set HUBOT_SLACK_TOKEN=[your-slack-token] --app [your-bot-name]
heroku config:set HUBOT_SLACK_TEAM=[your-slack-team] --app [your-bot-name]
heroku config:set HUBOT_SLACK_BOTNAME=[your-bot-name] --app [your-bot-name]
heroku config:set HUBOT_URL=https://[your-bot-name].herokuapp.com/ --app [your-bot-name]
heroku config:add TZ=Asia/Tokyo
```

# herokuへデプロイ

heroku-gitを使います。heroku Webサイト上で設定しておきます。gitへpushすると、デプロイが開始されます。

```shell-session
heroku git:remote -a [your-app-name]
git init
git add -all
git commit -m "first commit"
git push heroku master
```

# 定期的に起こす

herokuは30分アクセスがないとスリープに入ってしまうので、これを防ぐために[hubot-heroku-keepalive](https://github.com/hubot-scripts/hubot-heroku-keepalive/tree/v1.0.0)を使います。`yo hubot`で同時にインストールされているので、設定だけ行います。

```shell-session
heroku config:set HUBOT_HEROKU_KEEPALIVE_URL=[your-app-url]
heroku config:add HUBOT_HEROKU_WAKEUP_TIME=9:00 -a [your-app-name]
heroku config:add HUBOT_HEROKU_SLEEP_TIME=01:00 -a [your-app-name]
```

heroku free dynoでは強制的に6時間のスリープに入ってしまいます。そこで、既定の時間になったら再開するよう、add-onとしてHeroku Schedulerを使います。

```shell-session
heroku addons:create scheduler:standard -a [your-app-name
heroku addons:open scheduler
```

Heroku Schedulerの設定はWeb画面で行います。時間はUTCなので、9時間マイナスしてください。

```
curl ${HUBOT_HEROKU_KEEPALIVE_URL}heroku/keepalive
```

![HerokuScheduler.png](https://qiita-image-store.s3.amazonaws.com/0/113146/e6c2a4d3-b839-72b2-7112-8c4b0fc9b02e.png)
電子工作 > Link > ８ビット双方向ロジックレベル変換モジュール

UART5VのPi Zeroと UARV3.3VのESP8266間で通信を行う場合、レベル変換が必要だと気づいた。

以下を見つけた。
http://akizukidenshi.com/catalog/g/gM-04522

> ＦＸＭＡ１０８とパスコン（0.1μＦｘ２個）が実装済み

250円

あるいは、RS-232Cレベルに一度変換して、RS-232CからUARTに変換する方法もある。
この場合、作成したラインモニタで通信モニタができる。デバッグが早いかも。