OmniAICreator/Qiita-1.07M huggingface dataset:
ツイッターのAPIをOAuth2 Client Credentials Grantで叩く


## TL;DR

twitterアカウント名を指定して、ツイート一覧を取得してきてくれるgemを作りました。

[app_auth_twitter_reader](https://github.com/toshiya/app_auth_twitter_reader)


## 作った経緯

ツイッターAPIのクライアントライブラリは各言語で充実していて、ツイッターのAPIを叩く時はライブラリを使うのが通常だろう。

[Twitter Libraries](https://dev.twitter.com/overview/api/twitter-libraries)


しかし今回自分のユースケースでは、単純にユーザを指定してツイート一覧を取得したいだけだったので、外部のライブラリを利用するのはtoo muchな気がした。と言うことで、ライブラリを使わずapplication only authenticationと呼ばれる認可方式を生で使ってツイッターのAPIを叩いてみたのだがその時のメモ。

## Client Credentials Grant

その前に少し、ツイッターのapplication only authenticationについて説明。これは、OAuth2で言うところのClient Credentials Grantに当たる.

OAuth2では認可方式がいくつかあって、意味合い的には

* ユーザだけの認証 (Implicit grant)
* アプリケーションだけの認証 (Client Credentials Grant)
* ユーザとアプリケーション両方の認証 (Authorization Code Grant)

と言う風に、認可(=~access token)を要求してきた相手が誰であるかをどこまで確認するかによって、access tokenが発行されるまでの流れが違ったり発行されるaccess tokenの権限が違ったりする。

で、APIを叩く側のアプリケーション開発者から見た場合、Client Credentials Grantが手続きとしては最も簡単。これはAPIを叩く時にいわゆるツイッター連携許可をユーザに求める必要がないため。

参考:[RFC6749 Section-4.4](https://tools.ietf.org/html/rfc6749#section-4.4)

# application only authentication

ツイッターのAPIは、Client Credentials Grantによる認可のみOAuth2に対応していて、これのことをapplication only authenticationと呼んでいるようだ。(https://dev.twitter.com/oauth/application-only)

この認可方式だと認可がユーザアカウントに紐付いていないので、ツイートを行うなどいわゆる書き込み系のエンドポイント叩くことはできない。しかし、今回やりたかったツイート一の覧取得などの読み込み系のエンドポイントを叩くことは可能。
# API呼び出しの流れ

1. ツイッター develoer siteでアプリケーションのAPI KeyとAPI Secretをゲット
  * https://apps.twitter.com/

2. 上記のKeyとSecretをAuthorization Headerに仕込んで、ツイッターのtoken endpointを叩き、access tokenを取得.

3. 今度は2. で取得したaccess tokenをAuthorization Headerに仕込んで、叩きたいエンドポイント(今回はuesr_timelineのエンドポイント)を叩く

おしまい。とても簡単。

# やってみた

上記の処理をgemにしてみた。CSVフォーマットでツイートを取得してきてくれる。

[cli-twitter-application-only-authentication](https://github.com/toshiya/app_auth_twitter_reader)

# 実行例

以下の例ではtwitter japanの公式アカウントのツイートを収集している.

```bash

# get access token (only once)
bundle exec app_auth_twitter_reader  --key=`cat ./api_key` --secret=`cat ./api_secret` > ./access_token

# get user timeline using the access token. 
bundle exec app_auth_twitter_reader  --token=`cat ./access_token` --screen_name twitterjp

## output(csv)
created_at,text,favorite_count,retweet_count
Sat May 21 02:51:39 +0000 2016,"RT @B_LEAGUE: 昨日は #BリーグVine DAYでした！
B.LEAGUEクラブによるクリエイティブな6秒動画はVineでチャンネル化されました！Twitterではコチラでご覧ください！
https://t.co/oxnQmOH25x
#Bリーグ https://…",0,10
Fri May 20 08:01:10 +0000 2016,"少しでも誰かのためになることを、という考えで世界各地のTwitterオフィスが定期的な金曜日にボランティア活動を行う #FridayForGood 。日本では5つの活動を行いました。
https://t.co/jMfP2M1r3N https://t.co/soN2g1E8fj",74,53
...

```
Hyper-VでサクサクAndroidエミュレータを使おう

昔からAndroid開発者はエミュレータ(AVD)に泣かされてきました。特にエミュレータの起動や操作がとても遅かったのです。
AndroidStudio2.0からは、かなり高速化されました。

現在のAVDはIntel HAXMという仮想化技術を使って実行されています。実は他の仮想化技術同士とはケンカすることが多く、共存できないものがたくさんあります。特にWindowsでは**Hyper-VとIntel HAXMが共存できないのです。**なのでこれまではHyper-Vをオフにするか、諦めておそ～～～～～～～～～～～～いエミュレータを使うしかありませんでした。

しかし、ついにWindows10 April 2018 UpdateからHyper-Vに対応したAndroidエミュレータが使えるようになりました！これによりIntel HAXMを使わずにサクサクエミュレータを使うことができます！

**2018/07/10 Android公式でHyper-V対応バージョンがリリースされました！**

Android Emulator - AMD Processor & Hyper-V Support
https://android-developers.googleblog.com/2018/07/android-emulator-amd-processor-hyper-v.html

WindowsだけでなくmacOSやLinuxでも各OSが持っている仮想化技術を使うようになっていますね。
ただWindowsに関してはIntel CPUを使っているPCに関してはIntel HAXMのほうがパフォーマンスが良いと書かれていますので、どうしてもHyper-Vで使いたい人向けの設定のようです。

# 手順
## 今回の環境
- Windows10 Pro April 2018 Update(1803)
- Android Studio 3.1.3

Hyper-Vを使うため、Home版のWindowsではできません。また、April Updateからの機能を使うため、最新のWindows10である必要があります。

## Hyper-Vの有効化
コントロールパネル -> プログラムと機能 と進み、左にあるWindowsの機能の有効化または無効化を選択します。
<img width="815" alt="hyper-v0.png" src="https://qiita-image-store.s3.amazonaws.com/0/44992/dbd2b1b6-d29e-9d3e-61bb-eb3cc4442623.png">
Hyper-V **とWindows Hypervisor Platform** にチェックをつけてOKを押します。
<img width="347" alt="ss-1.png" src="https://qiita-image-store.s3.amazonaws.com/0/44992/d5fa86fd-e165-b0bc-e234-ec9e9b6d888a.png">
Windowsを再起動します。

## Hyper-V対応エミュレータのインストール
Android Emulatorのバージョンが**27.3.8**以降になるようアップデートしてください。

## エミュレータの作成
Android Studioから普通にエミュレータを作成します。
以前はHyper-Vが有効になっていると、起動できないから無効にしろふじこふじこと怒られていましたが、もう怒られなくなっています。

## エミュレータの起動
Emulatorのバージョンが最新であればAndroid Studioから直接起動できるようになりました！
<img width="767" alt="Screenshot 2018-07-22 16.27.21.png" src="https://qiita-image-store.s3.amazonaws.com/0/44992/ad825f7a-0363-72a7-651e-f53042440bec.png">


みなさんもサクサクAndroidエミュレータを使ってサクサクな開発ライフを！
SourceTreeのcloneでエラーが出た件

# SourceTreeのcloneで「0 [main] us 0 init_cheap: VirtualAlloc pointer is null, Win32 error 487」というエラー

とりあえず解決したので、メモ書き程度に。

参考にしたのは、以下のページ。
http://tech.guitarrapc.com/entry/2014/01/31/071034
http://stackoverflow.com/questions/18502999/git-extensions-win32-error-487-couldnt-reserve-space-for-cygwins-heap-win32

で、どう解決したかというと、、、
windowsを再起動したら、解決しました。
うーん、よく分からん、、、

ちなみに、cloneはhttpで実施しました。
![clone_error.png](https://qiita-image-store.s3.amazonaws.com/0/126499/89c36c2d-8acc-388d-dde0-4dc8513daaa4.png)
(↑これで、「クローン」を押した後にエラーが出ていたのですが、
　今は解決してしまったので、再現できず、、、)

以上、備忘録でした。
ここまで読んで下さった方、ありがとうございます。orz...
Jenkinsの文字コードを確認・設定する方法

# Jenkinsの文字コード

## Jenkinsの文字コードを確認する方法
* Jenkinsの管理 > システム情報 > システムプロパティ
* 以下の2項目をチェック

	|名前|値|
	|---|---|
	|file.encoding|UTF-8|
	|sun.jnu.encoding|UTF-8|

## Jenkinsの文字コードを設定する方法

* 特に指定を行っていない場合は、OSの文字コード設定に合わせた文字コードが選択される。
    * [CentOSの文字コード設定方法](http://qiita.com/LowSE01/items/711aed71348999ee97fd)

* OSの設定とは異なる文字コードを使用したい場合は、以下の方法で設定する。
    *  /etc/sysconfig/jenkinsへプロパティ「JAVA_ARGS」を設定。
  
        ``` /etc/sysconfig/jenkins
	JAVA_ARGS="-Dfile.encoding=UTF-8 -Dsun.jnu.encoding=UTF-8"
	```
    * Jenkinsを再起動
        * service jenkins restartではなぜか反映されないことがあった。
        * /etc/rc.d/init.d/jenkins stop,startをそれぞれ実行反映された。
        * なぜかはわからん。
メソッドの定義を知りたいだけ ~.source_locationがnilになる場合はよくわからないし、Stringクラスがどこにあるかも分からない~

Railsの勉強をしていて、メソッドがどのクラスで定義されているのか知りたくなったりします。`blank?`とか`empty?`がどのクラスで定義されているのか？という件で。


## .methodを使う

```rb
rails c

# メソッドがどのクラス（or モジュール）で定義されているのか？とか、
# どこでメソッドが定義されているのかをしらべる。

irb(main):073:0* ''.blank?
=> true
irb(main):074:0> ''.method(:blank?).owner
=> String
irb(main):075:0> ''.method(:blank?).source_location
=> ["/home/vagrant/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/activesupport-4.2.3/lib/active_support/core_ext/object/blank.rb", 116]

irb(main):076:0> nil.blank?
=> true
irb(main):077:0> nil.method(:blank?).owner
=> NilClass
irb(main):078:0> nil.method(:blank?).source_location
=> ["/home/vagrant/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/activesupport-4.2.3/lib/active_support/core_ext/object/blank.rb", 54]
```

## 直接コマンド叩いてみる

ちょっと乱暴ですが...`source_location`というメソッドをfindでさがしてみる。（勉強ですから..


```bash
vagrant ssh # vagrantの中で勉強してるので
sudo find / -name '*.rb' -type f | xargs grep 'def source_location' -s
```

`-s`このおかげで、無駄なエラーが表示されなくて幸せです。

（findとgrepでエラーが沢山でるときは`-s`で幸せになれると思う）

## よく分からないこと。

```rb
irb(main):082:0* method(:p).owner
=> Kernel
irb(main):083:0> method(:p).source_location
=> nil
```

source_locationがnilになる。これは、souce_locationの定義を読んでみたのですが、よくわからなかったです。ownerでクラス見つかってるんだから、メソッドの定義箇所も見つかっていいと思うんだけど。。。

## 追記

Stringクラスってどこにあるんだろうと思って下のように検索してみるのですが、

```
sudo find / -name '*.rb' -type f | xargs grep 'class String < ' -s
```

わかりません。


## 追記2

クラスのメソッドをしらべるのは以下のようにできる。

```rb
Class.methods
Class.methods(false)

Class.instance_methods
Class.instance_methods(false) # false をつければ継承したメソッドは除外できる。
```
ファイル行数をソートする方法


```
$ ls *ascii* | xargs wc -l | sort -nk1
      19 summary.asciidoc
      30 index.asciidoc
     154 ch00.asciidoc
     973 ch06.asciidoc
    1098 ch04.asciidoc
    1154 ch09.asciidoc
    1330 ch10.asciidoc
    1433 ch02.asciidoc
    1465 ch07.asciidoc
    1602 ch01.asciidoc
    1786 ch05.asciidoc
    1889 ch08.asciidoc
    1976 ch03.asciidoc
   14909 total
```

`sort -nk1`のオプション：

- `n` : 数値型でソートする（Number）
- `k1`: Key１をソートする
- `r`: 逆順でソートする


なと、区切りは空白ではない場合、`-t`が役に立ちます。
Electron v1.1.0でMenuの実装をするお話


##はじめに
Electron v1.1.0を使ってみたところ
以前のバージョンとの変更点で詰まったのでメモしておきます。

##Electronとは
webの技術+αでOS Xやwindowsのデスクトップアプリが作れる開発プラットフォームです。
最近(2016/5/9に)v1.0.0がリリースされました。

インストールやHello Worldから配布までは

[Electronでアプリケーションを作ってみよう]
http://qiita.com/Quramy/items/a4be32769366cfe55778
などの記事を参考にしました。

##今回作るもの
入力したテキストを形態素解析してcsvでダウンロードできるアプリを作ります。
実際にはkuromoji.jsのデモをほぼまるごと移植したものになります。

[ブラウザで自然言語処理 - JavaScriptの形態素解析器kuromoji.jsを作った]
http://stp-the-wld.blogspot.jp/2015/01/javascriptkuromojijs.html

形態素解析のGUIアプリはwebだと
国立国語研究所のこちらが機能も充実していて使いやすそうでした。
http://chamame.ninjal.ac.jp

サーバに解析対象のテキストを送りたくない！というセンシティブな需要もあるのかなと思い、デスクトップアプリを作ってみました。
(winだとwinchaがありますが、更新が途絶えているためか一部のwin8マシンでは動きませんでした。)
http://chasen.naist.jp/hiki/ChaSen/?%C3%E3%E4%A5%A4%CE%C7%DB%C9%DB

制作物は以下です。
https://github.com/asayamakk/shirakaba

ビルド済みのmac向けアプリはこちらからダウンロードできます。
http://asayamakk.hatenablog.com/entry/2016/05/23/155030

![readme.png](https://qiita-image-store.s3.amazonaws.com/0/80297/9cc28d35-0d50-99f8-82ad-12f330c09bf2.png)


##ハマったところ
基本的な使い方はv.0.37と同じだったため特に問題ありませんでした。
参考にしたサイトは以下です。
\[Electron Documentation] (公式)
http://electron.atom.io/docs/tutorial/quick-start/

[Electronでアプリケーションを作ってみよう]
http://qiita.com/Quramy/items/a4be32769366cfe55778

###Menuの呼び出し方変更
ここがハマりポイントでした。(というかこのために記事を書きました)

electronを使うのは初めてだったのでとりあえず作ったー！と思い
ビルドして起動してみるとキーボードショートカットが動作しませんでした。(Cmd+Cなど)
形態素解析ソフトとしてこれは致命的なので、調べてみるとMenuを追加する必要があるようでした。

[Electronに開発用メニューとショートカットを付ける]
http://qiita.com/okaxaki/items/8b8942b0c4e13ac67739

なるほどと思い、	Menuを実装してみると以下のエラーが発生しました。

```
Uncaught Exception:
Error: Cannot find module 'menu'
```


この変更については

[Electron を試す 7 – Electron v1.0 対応]
http://akabeko.me/blog/2016/05/electron-7/

を参考にコードを修正すると動作しました。
修正後のコードです。

```js:main.js
const {app, BrowserWindow, Menu} = require('electron');

app.on('ready', function() {
  createWindow();
  installMenu();
});

function installMenu() {
  let template;

template = [
  {
    label: 'app-name',
    submenu: [
      {
        label: 'Quit',
        accelerator: 'Command+Q',
        click: function() { app.quit(); }
      },
    ]
  }
];

  const menu = Menu.buildFromTemplate(template)
  Menu.setApplicationMenu(menu);
}

```

説明のためコードの一部を省略しています。


~~他にもappやshellなどの参照も非推奨だったのが削除されているようです。~~
appやshellはelectron下に移動したという表現の方が適切だというアドバイスをもらいました(2016/05/23修正)


##まとめ
他の人が書いたコードはとても参考になるのですが、
実行環境やバージョンに気をつけよう。という初歩的な注意でした。
特に今回はリリースしてから2~3日しか経っていなかったためググっても一つ前の情報しか見つからず苦労しました。



制作物のリンクをもう一度貼っておきます。
https://github.com/asayamakk/shirakaba
Electronを使えばwebの知識があればとっても簡単にデスクトップアプリが作れました。
ElectronもES6も初めて使うので、絶賛ツッコミ待ちです(๑˃̵ᴗ˂̵)و(そのためにも記事を書いたので！)

##2016/05/23追記&Thanks Comment
bowerが不要なので削除したり、app, Menuの宣言部分を修正するプルリクをいただきました。

https://github.com/asayamakk/shirakaba/pull/1
Thanks! uraway :)
インシデントレポートの書き方




# インシデントとは？

>ソフトウェアテストの分野では、テストが期待する動作とは異なる挙動や事象で調査が必要なものをテストインシデントという。原因が究明される前の段階では必ずしも欠陥やバグとは限らない。単体テストの概要を定義したANSI/IEEE Std 1008では「調査が必要な、発生するあらゆるイベント」と定義されている。

[情報マネジメント用語辞典：インシデント（いんしでんと）](http://www.itmedia.co.jp/im/articles/1111/07/news206.html)


# インシデントが発生した場合
## まずは現象がわかるスクリーンショット/ログを保存する
スクリーンショット、ログが必要な理由：
報告された手順通りにもしても、再現できない場合があります。

そうなった場合、本当に報告された現象が発生していたかのか？
環境や手順に報告には表現されていないミスがあり、それが原因で問題が発生していたのではないか？
と開発者に疑われかねません。

確実に報告した現象が起きていた、手順や環境に誤りがなかったというエビデンスを保存しておくこと。

##　報告上げる前に、環境設定、テストの仕方にミスがなかったか確認しよう

報告を上げたがいいが、実は環境設定ミスだったとか、テストの仕方にミスがあったとかだと、かなり恥ずかしいです。
開発者の時間を無駄に使います。

そういう事態が続くと、「どうせコイツの報告は環境設定か、手順ミスだろう」と偏見を持たれて
「まずは環境設定、テスト手順が正しいかを調べて」と調査を後回しにされてしまいます（本当にバグが発生していても）。

まずは落ち着いて、環境設定、テスト手順に誤りがなかったかを確認しましょう。
（【テスト開始前に】環境設定、テスト手順は確認しておいてから作業してください。
　インシデントが発生したとき、開発者に調査する手間が発生します。
　環境不正の状態でテストしても、テスト結果が信用できません。
　テストはやり直しになり、ムダな工数を使います。会社にとっても迷惑です。
　自分のため、周りのため、テスト開始前に環境設定を確認しましょう）


## インシデントレポートの書き方
エンドユーザから「何もしてないのに壊れた」のような曖昧な問い合わせがあり、
「対象製品、バージョンは何ですか？」「そんなエラーメッセージですか？」「どういう操作したのですか？」等と
いちいち全て質問しなければならず、調査に時間がかかる場合があります。

インシデントが発生したら、「調査する開発者がどんな情報を欲しているのか」を推測して、簡潔にレポートするようにしてください。
### 必須項目
・対象ソフトウェア
・対象ソフトウェアのバージョン
・現象
・再現手順（実際に行った手順）
・期待した結果
・実際の結果
・再現率が100%ではない場合は、どの程度の頻度で発生するか？

簡潔に書けるのが望ましいです。
仕様理解不足で簡潔に書けない場合は、
「テスト手順書の？番の手順したらXXXになるはずがYYYになった」
でテスト手順書添付してくれればよいです。

可能な限りエラーが発生していたことが、明確に示せるスクリーンショット/ログも送付してください。

### 推奨項目
■動作環境
動作に影響する関連動作環境：OS、ブラウザ、前提ソフト、バージョン。

仕様書に動作環境として必要なモノが定義してあり、仕様書に合わせて環境構築してからテストするのは当然であるためか、必須項目としていないところもあるようです。
ただ、調査依頼を受けて原因を調べてみると、単なる環境設定でミスという場合も多いです。
「最低限調査依頼する前に、前提の動作環境を確認してから調査依頼出しています」ということを示しめしてもらう意味でも
調査依頼を受ける開発者としては動作環境を記載して欲しいです。

■動作について仕様書・マニュアルの記載、記載箇所
調査依頼した相手に「ちゃんと仕様書読んだのか？テスト手順書の誤りじゃねーか？よく調べろ！」といわれないように
仕様書調べたら、現象に関連する仕様書の記載内容、仕様書の記載箇所を書いておきましょう。

「テスト担当は（設計者など他の人が作った）テスト手順書通りにテストするだけ。仕様を把握・理解してなくても良い。テスト担当は調査に時間つかうな」という文化もあるので、推奨項目としておきます。
ただエンジニアとしてテストしているなら、仕様を理解した上でテストして欲しいです。

### 任意項目
そこまでは求めないけど、記載してあったらうれしい項目。

■ログに関する見解
最終的にエラーになった箇所、エラーのきっかけとなったエラー箇所。
エラーメッセージ、エラーコードからの推定される要因。

■原因切り分けとして行ったこと
エラーコードや現象から、原因を予測して、障害切り分けのために行ったことがあれば記載してください（別バージョンで試してみた、設定ファイルのXXを変えてみた等）。
JSON エコシステム

こんにちは。
JSON エコシステムについて手っ取り早くまとめてみました。列挙が不完全ですが。

## 仕様
- [The JavaScript Object Notation (JSON) Data Interchange Format](https://tools.ietf.org/html/rfc7159) (RFC 7159)

## 処理
- [jq](http://qiita.com/tags/jq) コマンド
 - [jq コマンドで gzip 圧縮 JSON ファイルを引数に取る](http://qiita.com/kkdd/items/2b5342347ed6bd4c3a52)

## 文法チェック
各種のコマンドがあるようです。

- [JSON Lintをつかって文法チェック](http://qiita.com/tt2004d/items/2ea1af8bfd324585dd07)
- demjson (Python), JSON.parse (node.js), json_pp (MacOSX)

### 修正処理
- [json ファイルの不要なカンマを除去](http://qiita.com/kkdd/items/96f21d94db402e98b393) (Ruby)
- [数値を有効桁数で丸めて出力（ワンライナー）](http://qiita.com/kkdd/items/7ae38deee6fd42d83b23)

## 言語処理
- Python
  - [18.2. json — JSON encoder and decoder](https://docs.python.org/2.7/library/json.html) (Python 2.6 or later)
  - simplejson (Python モジュール)
- Ruby
  - [RubyでJSONパース](http://qiita.com/tutu/items/8ba36f41414a254621ef)
- Go
  - [JSON and Go](https://blog.golang.org/json-and-go)
  - [Goで簡単にJSON形式を扱うパッケージ： go-simplejson](http://qiita.com/TalesofFox/items/5c147a19a9ae5c41f41a)
- Swift
  - [Swift 製 JSON パーサは Unbox がイイ！](https://www.gaprot.jp/pickup/tips/swift-unbox)
- Kotlin
  - [kotlinでJSON扱うならJsonToKotlinClassが便利](https://qiita.com/thr3a/items/612ebbfb85e21c8b8f15)
- Javascript
  - [gzip圧縮されたローカルファイル読み込み](http://qiita.com/kkdd/items/0c6a777bcda031ea9f39) (Javascript)
- PHP
  - [JSONをRuby,Python,JavaScript,PHPで扱う方法](https://qiita.com/MahoTakara/items/f79ab8e3c3ed790bca18)

## データベース
- [MongoDB](https://qiita.com/tags/mongodb), [RethinkDB](http://qiita.com/tags/RethinkDB), [ArangoDB](https://qiita.com/tags/arangodb), [Couchbase](https://qiita.com/tags/couchbase), [PouchDB](http://qiita.com/tags/pouchdb), [CloudKit](http://www.moongift.jp/2008/12/cloudkit/), [Azure Cosmos DB](https://en.wikipedia.org/wiki/Cosmos_DB)
- [MySQL](http://qiita.com/tags/MySQL), [PostgreSQL](https://qiita.com/tags/postgresql)

### HTTP Post/Get

- [httpie](http://qiita.com/tags/httpie) コマンド
- [mod_deflate の効果を tcpdump で分析してみた](http://qiita.com/anzai_k/items/381b469b98d256f51e1a) （通信量圧縮）

## 地理情報データ
- [GeoJSON](https://en.wikipedia.org/wiki/GeoJSON) 形式
- [TopoJSON](https://en.wikipedia.org/wiki/GeoJSON#TopoJSON) 形式


## JSON拡張
- [Hjson, a user interface for JSON](https://hjson.org/)

## JSONではないフォーマット
- YAML
- XML
- SION
- CSV

### バイナリ形式のオブジェクト･シリアライズ･フォーマット
- BSON
- MessagePack
- Protocol Buffers
- VelocyPack
vprof - Python用プロファイラ を使ってみた

vprofがtwitterで流れてきたので使い方をメモしていきます。
vprofの[README.md](https://raw.githubusercontent.com/nvdv/vprof/master/README.md) の方がよく書かれているのでそっちを読んだ方が早いかも。

# vprof とは

vprofはプロファイル情報をッチでインタラクティブな可視化を提供するPythonパッケージです。

# インストール

https://pypi.python.org/pypi/vprof

pypiに上がっている現在の最新のバージョンは 0.3 です。 (2016/05/21現在)
とりあえずpipでインストールします。

```
$ pip install vprof
```

[README.md](https://raw.githubusercontent.com/nvdv/vprof/master/README.md) を見ると

```
## Prerequisites
The required dependencies to build ```vprof``` from source code:
 * Python 2.7, Python 3.4 or Python 3.5
 * ```pip```
 * ```npm``` >= 3.3.12
```

とあるので node も必要なようです。


# ベンチマーク用スクリプト

今回はこのスクリプトをベンチマークするようにしました。

```
#! /usr/bin/env python
import sys
import time


def calc():
    num = 0
    for ii in range(100):
        ii += 1
        time.sleep(0.01)
    return num


def alloc_large_memory():
    txt = 'a' * 1024 * 1024 * 100  # 100MB
    return txt


def main():
    calc()
    alloc_large_memory()

if __name__ == '__main__':
    sys.exit(main())
```

# 実行してみる

```
$ vsof -cmh "./benchmark.py"
```

`-n` オプションで表示対象を指定します。

|オプション|表示対象|詳細|
|:-:|:-:|:-:|
|c|framechart|フレームチャート|
|m|memory stats|メモリ使用量|
|h|code heatmap|行ごとのヒートマップ|

## framechart

実行時間やcall回数が可視化されています。

![スクリーンショット 2016-05-21 15.32.02.png](https://qiita-image-store.s3.amazonaws.com/0/36261/c9a84225-64fb-6f13-d49d-7f955a471289.png)

正直cprofileで表示する一覧の方が加工しやすいし見やすいかも。。。

## memory stats

メモリ使用量が可視化されています。

![スクリーンショット 2016-05-21 15.32.11.png](https://qiita-image-store.s3.amazonaws.com/0/36261/5858669e-7ed0-e96a-7414-89199959648c.png)

メモリ使用量を計測した時のファイル名と行数がわかるので結構良い。

## code heatmap

ヒートマップです。

![スクリーンショット 2016-05-21 15.32.28.png](https://qiita-image-store.s3.amazonaws.com/0/36261/3cfa6264-0243-d255-c589-a8317ad311aa.png)

実行回数の多いところが、濃い色で表示されるっぽい。これは良さそう。
importとかしているファイルを表示させる方法がわからなかった...
git diff で Similarity 50% 未満の変更を rename として見るには

## 結論

```
$ man git-diff
```

したら

```
$ git diff -M[パーセンテージ]
```

せよ、とのこと。

## 実験

### 起点となる commit を用意

次のような内容の `samplefile` を用意して commit する
(1 から 10 までの数が 1 行毎に入っている)

```:samplefile
1
2
3
4
5
6
7
8
9
10
```

```console
$ git add samplefile
$ git commit -m 'first-commit'
```

## それに続く commit を用意

次のような内容の `samplefile2` を用意する。
(1 から 4 までの数が 1 行毎に入っている。)

```:samplefile2
1
2
3
4
5
```

```
$ git rm samplefile
$ git add samplefile2
$ git commit -m 'second-commit'
```

## diff を取る

普通に diff を取ると、別々のファイルとして扱われる。

```console
$ git diff HEAD^
```

```diff
diff --git a/samplefile b/samplefile
deleted file mode 100644
index f00c965..0000000
--- a/samplefile
+++ /dev/null
@@ -1,10 +0,0 @@
-1
-2
-3
-4
-5
-6
-7
-8
-9
-10
diff --git a/samplefile2 b/samplefile2
new file mode 100644
index 0000000..8a1218a
--- /dev/null
+++ b/samplefile2
@@ -0,0 +1,5 @@
+1
+2
+3
+4
+5
```

# -C40 を指定

40% の一致まで閾値を下げてみる。

```console
$ git diff -M40 HEAD^
```

```diff
diff --git a/samplefile b/samplefile2
similarity index 47%
rename from samplefile
rename to samplefile2
index f00c965..8a1218a 100644
--- a/samplefile
+++ b/samplefile2
@@ -3,8 +3,3 @@
 3
 4
 5
-6
-7
-8
-9
-10
```

どうやら同一のファイルのリネームとして扱ってくれる。
47% の一致なので、 `git diff -M47` 以下なら同様の結果になる。

# git mv してからファイルを編集しても同じ？

- git mv → ファイルを編集 → git add
- ファイルを編集 → git add → git mv

これらも同じ結果になる。

結局のところ __Git が管理するのはその時点のスナップショット__ であり、 __どのような経緯で差分が発生したかまでを保存するわけではない__ 。

# 実装はどうなっているのか

GitHub で検索してみたところ、このあたりにツボがありそう。

https://github.com/git/git/blob/dc0db2c0b919f8eb5f1760ce0b936c0a66364148/diffcore-rename.c#L446

### オプションまたはデフォルト値で閾値を決める

https://github.com/git/git/blob/dc0db2c0b919f8eb5f1760ce0b936c0a66364148/diffcore-rename.c#L449-L458

### デフォルト値は 50%

https://github.com/git/git/blob/c2c5f6b1e479f2c38e0e01345350620944e3527f/diffcore.h#L19

### 候補をスコア順でソート

https://github.com/git/git/blob/dc0db2c0b919f8eb5f1760ce0b936c0a66364148/diffcore-rename.c#L581

このあたりを追って読み進めればなんとなく見えてくる。

# 余談

Unix-like 限定だけど、この実験をするにあたって、 seq コマンドを覚えておくと便利。

```console
$ seq 3 6
3
4
5
6
```

のように引数を 2 つ指定して実行すると、
 1 つめの引数から 2 つめの引数までの連番を 1 行毎に生成してくれる便利なコマンド。

# -C オプション

ちなみに `-C` オプション (`--find-copies-harder` オプション) というのがあって `-M` と同じような機能を提供している。ただし rename ではなく copy をも検出するようだ。つまり作業ディレクトリの全てを検索対象にする。

(man git-diff から一部抜粋)

> For performance reasons, by default, -C option finds copies only if the original file of the copy was modified in the same changeset. This flag makes the command inspect unmodified files as candidates for the source of copy. This is a very expensive operation for large projects, so use it with caution. Giving more than one -C option has the same effect.

# 個人的な感想というか仮説

`git mv` があるのに `git cp` がない理由もわかった。

rename + modify の検出は delete 予定のファイルのハッシュと diff を取ればいいので、比較する回数は delete 済みファイルの個数に依存するが、 copy + modify の検出は、 copy 元は作業ディレクトリ全ての個数に依存する。これは巨大なプロジェクトでは大きな回数になるので、通常の git diff としては提供したくないからだ。
Kernel Connection Mulitplexor (KCM)

#はじめに

Linux 4.6でマージされたKernel Connection Mulitplexor (KCM)についてまとめます。

#目的

- TCP上にメッセージベースのプロトコルを実装する手助けをする
    - アプリケーションはデータグラム(SOCK_DGRAM)ソケットで通信できる
    - アプリケーションは独自に定義したプロトコルをカーネルに教えて、カーネルはそれを元に効率のよくメッセージを処理する
        - 例えば、ヘッダ解析やメッセージ単位でアプリケーションにデータを渡す等
- メッセージの多重化機能を提供する
    - アプリケーションのソケット(KCMソケット)とTCPソケット間で多対多のメッセージ多重化(multiplexing)する機能を提供する
        - N対1構成も可能
    - カーネル内でうまく負荷分散してくれる
- バッチ処理のメカニズムを提供する
    - sendmsgにMSG_BATCHフラグを渡すと、次のメッセージを待ってから送信してくれる
    - 受信はメッセージが完成してからアプリケーションに通知してくれる
        - N個溜まったら通知、が可能かは不明

なんでカーネルに実装するの？とか、なんでTCP上に実装するの？等のFAQが [このマージコミット](https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=9531ab65f4ec066a6e6617a08a293c60397a161b) に書かれているので、気になる人は読んでみると良いかもです。

#概念図

Documentation/networking/kcm.txtより抜粋。

```
+------------+   +------------+   +------------+   +------------+
| KCM socket |   | KCM socket |   | KCM socket |   | KCM socket |
+------------+   +------------+   +------------+   +------------+
      |                 |               |                |
      +-----------+     |               |     +----------+
                  |     |               |     |
               +----------------------------------+
               |           Multiplexor            |
               +----------------------------------+
                 |   |           |           |  |
       +---------+   |           |           |  ------------+
       |             |           |           |              |
+----------+  +----------+  +----------+  +----------+ +----------+
|  Psock   |  |  Psock   |  |  Psock   |  |  Psock   | |  Psock   |
+----------+  +----------+  +----------+  +----------+ +----------+
      |              |           |            |             |
+----------+  +----------+  +----------+  +----------+ +----------+
| TCP sock |  | TCP sock |  | TCP sock |  | TCP sock | | TCP sock |
+----------+  +----------+  +----------+  +----------+ +----------+

```

#メッセージ解析

Berkeley Packet Filter (BPF)を使っているらしい。どのように使われるか、どうやってBPFを書くのかは別の機会に調べたいです。おそらく [bpf(2)](http://man7.org/linux/man-pages/man2/bpf.2.html) や [Documentation/networking/filter.txt](https://www.kernel.org/doc/Documentation/networking/filter.txt) を読むことになると思います。

#使い方

1. KCM(+KCMソケット)を作る
    - socket(AF_KCM, SOCK_DGRAM or SOCK_SEQPACKET, KCMPROTO_CONNECTED)
2. KCMソケットを増やす
    - ioctl(kcmfd, SIOCKCMCLONE, &info)
3. KCMにトランスポート(TCP)ソケットを繋ぐ(BPFを指定する)
    - info.fd = tcpfd
    - info.bpf_fd = bpf_prog_fd
    - ioctl(kcmfd, SIOCKCMATTACH, &info)

#おわりに

あまりアプリケーションプログラムを書かないので、この機能がどの程度嬉しいのかはわからないですが、BPFで通信最適化ができて楽しそうではあります。

#参考文献

- [1.5 Kernel Connection Multiplexor, a facility for accelerating application layer protocols](http://kernelnewbies.org/Linux_4.6#head-d86a7a8affd7cefef85fff400e39403718bf647a) from kernelnewbies.org
deeplearning4j ver.=0.4 rc3.9 on mac osx のbuild.sbt

回帰のサンプルコード用build.sbt

```build.sbt
name := "dl4j_work"

version := "1.0"

scalaVersion := "2.11.8"

classpathTypes += "maven-plugin"

libraryDependencies ++= Seq()

libraryDependencies += "org.nd4j" % "canova-api" % "0.0.0.15"
libraryDependencies += "org.deeplearning4j" % "deeplearning4j-core" % "0.4-rc3.9"
libraryDependencies += "jfree" % "jfreechart" % "1.0.13"
libraryDependencies += "org.bytedeco" % "javacpp" % "1.2"
libraryDependencies += "org.nd4j" % "nd4j" % "0.4-rc3.9"
libraryDependencies += "org.nd4j" % "nd4j-native" % "0.4-rc3.9" classifier "" classifier "macosx-x86_64"

```
NSURLSessionとAlamofireで、使い方を比較しつつApiを取得するテンプレ覚書


#環境
・Xcode7.3

#目的
・NSURLSessionとalamofireでhttp通信の感覚を掴むために天気apiである[OpenWeatherMap](http://openweathermap.org/)を使って、天気を取得、表示するapiを作ってみることにした

・両方やるのはなにやらものによっては（？）Alamofireで取得できないものがあるらしいので（最もこの例ではPOSTみたいですが........）、その場合にNSURLSessionでやろうと思ったため（[取得できないらしい例](http://qiita.com/y_some/items/8f2cec7a7aac70368202)）

#今回のゴール
・アプリを開いたらapiに自動でアクセスして、情報を引っ張ってきてくれるようにする

・今回のapiはお天気apiのOpenWeatherMapを使用した。

#準備

##info.plistでhttp通信の許可を行う
![代替テキスト](https://dl.dropboxusercontent.com/s/2f27je1o5ownrws/%E7%94%BB%E5%83%8F%EF%BC%91.png?dl=0)
・初めての時にはこのことを知らずに通信できないと嘆いていた。

・普段はiOSではATS(App Transport Security)なるものがかかっていて、http通信を許可してもらえない。

・なのでこの設定（App Transport Security Settingsより下）を手打ちで実装してあげることで、http通信を使うapiでも通信ができるようになる。

##使うライブラリのインストール
・[Alamofire](https://github.com/Alamofire/Alamofire)
・[SwiftyJSON](https://github.com/SwiftyJSON/SwiftyJSON)

##OpenWeatherMapのキー取得
・去年の１０月からapi情報を得るのにキーがいるようになったみたい

・[公式サイト](http://openweathermap.org/faq#error401)へ行って登録すればゲットできる。無料。


・取得するには
東京の場合
`http://api.openweathermap.org/data/2.5/weather?q=Tokyo&appid=[apiキー]`

緯度経度で取得する場合は
`http://api.openweathermap.org/data/2.5/forecast/daily?lat=[緯度]&lon=[経度]&appid=[apiキー]`
で手にはいる

・今回は上の東京の天気を取得するリクエストを出す

#実装
##URLリクエストをする関数を作る①（NSURLSession Ver）
```swift

import UIKit
import SwiftyJSON

//中略

override func viewDidLoad() {
    super.viewDidLoad()

	//関数実行
    getArticle()
}

func getArticle(){

	//URLの材料
    let APIKey: String = "apiキー"
    let urlString: String = "http://api.openweathermap.org/data/2.5/weather?q=Tokyo&appid=\(APIKey)"
    
    //URLをStringからNSURL型に
    let url = NSURL(string: urlString)!
    
    //アクセスするタスクを実行
    let task = NSURLSession.sharedSession().dataTaskWithURL(url){
    
    　	 //渡ってくる変数群。重要なデータは文字通りdataの中に
        (data,response,error) in
        
        //中身が入っているかどうかをフィルタリング
        guard let data = data else{return}
        
        //dataを扱いやすいようにJSON化
        let json = JSON(data: data)

		//output!!
        print(json)
    }
    //タスクを実行
    task.resume()
}
```

##URLリクエストをする関数を作る②（Alamofire Ver）

```swift

import UIKit
import SwiftyJSON
import Alamofire

//中略

override func viewDidLoad() {
    super.viewDidLoad()

	//関数実行
    getArticle()
}

func getArticle(){

    //URLの材料
    let APIKey: String = "apiキー"
    let urlString: String = "http://api.openweathermap.org/data/2.5/weather?q=Tokyo&appid=\(APIKey)"
    
    //alamofire版のリクエスト。
    //こっちはわざわざNSURLにする必要はない
    Alamofire.request(.GET, urlString).responseJSON{
    
    	//こっちは一つの変数だけでいい
        (response) in
        
        //ただしこちらはresponseの中のresultのvalueの中に必要な情報が入ってくる
        guard let object = response.result.value else{return}
        
        //dataを扱いやすいようにJSON化
        let json = JSON(object)
        
        //output!!
        print(json)
    }
    //task.resume()的なものは存在しない........
}
```

#まとめ

・こうしてみると改めてalamofire便利ですね。

・これを使いまわせば基本どちらかでapiとかを引っ張ってこれる........はず（まだ良い方法があれば是非とも！！）

・おしまい
curl と pup と jq を使って、コマンドラインで wikipedia からデータを取り出す

curl で取得した html をコマンドライン上でパースしたいと思って、
[ericchiang/pup: Parsing HTML at the command line](https://github.com/ericchiang/pup) を使ってみた。

以下、2014年のワールドカップの国名を、wikipediaから抽出する例。

```
$ brew install https://raw.githubusercontent.com/EricChiang/pup/master/pup.rb

$ curl -s https://ja.wikipedia.org/wiki/2014_FIFA%E3%83%AF%E3%83%BC%E3%83%AB%E3%83%89%E3%82%AB%E3%83%83%E3%83%97 > tmp.html

$ cat tmp.html | pup '.wikitable td a:nth-child(2) json{}' | jq ". [] .text" 
"ブラジル"
"アルゼンチン"
"コロンビア"
...
```

- mac なら、 brew でインストールできる
- curl `-s` は、サイレント。進捗とかエラーメッセージとかを抑制する。htmlだけが欲しい。
- 試行錯誤が必要なので、tmp.html に置いている。
- `pup '.wikitable td a:nth-child(2)` で、国名のリンクを抽出している。
- `text{}記法: (pup '.hoge text{}')` を使うと、ノードの text を取得してくれるのだが、今回の構造が `a[title='title']name` となっており、name の他に title も取得してしまった。 name のみがほしい。
- よって、json 化して抜き出すことにした。`json{}記法: (pup '.hoge json{}')` でノードをjson 化できる。下記のようになる。

```
$ pup '.wikitable td a:nth-child(2) json{}'
[
 {
  "href": "/wiki/%E3%82%B5%E3%83%83%E3%82%AB%E3%83%BC%E3%83%96%E3%83%A9%E3%82%B8%E3%83%AB%E4%BB%A3%E8%A1%A8",
  "tag": "a",
  "text": "ブラジル",
  "title": "サッカーブラジル代表"
 },
...
``` 

- ここから `jq` を使って、`text` のみ抜き出す。 `jq ". [] .text"`
    - 配列になっているので、`. []` を使って配列を外す。
    - `.text` で、`text`のみ抜き出す。

今までは、ruby で nokogiri をインストールしたりしたけれど、
コマンドラインだけで抜き出せるので、結構楽。

最後に`| pbcopy`とかつなぐと、そのままペーストできてさらに楽。
ESP8266 > Link > microSD使用時のIO接続例 > IO16しか余らない

ESP8266にmicroSDを接続する場合のIO使用例がある。
http://ashiyu.cocolog-nifty.com/blog/2015/09/esp8266-sd-ds32.html

~~I2C接続の~~microSDを接続するとIO16くらいしか余らなくなりそうだ。IO16をステータスLEDなどにすると、もはや空きがない。

外に持ち出して測定するポータブルな装置を作るにしても、保存するためのmicroSDの実装をESP8266でやるか、他のボードで行うかなどは要調査。

AdafruitのFeather M0のようなmicroSDスロットが搭載されているもので、GPIOも余っている、というような都合のいいものはないだろうか。Feathre M0にWiFiが付いたら使い勝手がよさそうだ。
https://www.adafruit.com/products/2796
ESP8266 > Link > RTC > DS3231 / DS1307

ESP8266で使うRTC

http://ashiyu.cocolog-nifty.com/blog/2015/08/esp8266-ds3231-.html

[amazon](http://www.amazon.co.jp/gp/product/B00NU0FMNC/ref=as_li_ss_il?ie=UTF8&camp=247&creative=7399&creativeASIN=B00NU0FMNC&linkCode=as2&tag=ashiyu-22)で300円で購入できそう。到着までは15日程度かかりそうだが。

秋月だと以下のようなものが似たような形状としてある。
http://akizukidenshi.com/catalog/g/gM-09276/

RTCを手軽に使うなら、こういうのがいいだろう。
5年後に同じものが買えるのかは不明である。

長期入手性を考慮する場合は、ICと水晶振動子を購入して、基板実装することになるだろうか。
OS X 上で Google Chrome の旧バージョンが大量に残っていた件 (ディスク残量圧迫)

OS X (El Capitan) 上で Google Chrome がやけに肥大化しているようなので調べたところ、 <strong>自分の環境では 7GB くらいのサイズを占有していた。 </strong>

どうやら、場合によって Google Chrome の自動アップデート後に、古いバージョンが消されないことがあるらしい。
ディスク残量に悩まされているなら、チェックしてみてると良いかも。

問題の環境では 30 個以上の古いバージョンの Google Chrome が残っていた。
その際のスクリーンショットを撮り忘れてしまったので、以下には 2 つのバージョンが表示されているものを撮り直して記載している。

![Screen Shot 2016-05-21 at 1.50.59 PM.png](https://qiita-image-store.s3.amazonaws.com/0/25886/01835476-c749-a619-9474-3330fd6cf481.png)

このように、どうやら Google Chrome はアップデート後に、すぐに古いバージョンを削除するわけではないようだ。
これらは単純にまだ削除されていないか、あるいは何らかの理由で旧いバージョンを自動で削除する処理だけが正常に機能しなかった場合に残っていくのかもしれない。

一方で、同じ現象は所有している別の OS X では起きていなかった。
どうやら、どの環境でも常に発生するような現象ではないようだ。

# 確認方法

Finder から、 Application → Google Chrome → とたどり、右クリックで出るコンテクストメニューの「パッケージの内容を表示」→ 出てきたウインドウでさらに Contents → Versions とたどる。

またはコマンドラインで

```console
$ open /Applications/Google\ Chrome.app/Contents/Versions
```

を実行。
(/Application 以外のパスにインストールしてある場合は、それに応じて適宜↑のパスは変更。)

# 旧いバージョンを消しても大丈夫なのか？

自分で旧いバージョンのみを消して Google Chrome を再起動してみたところ、特に問題はなかった。

## 免責

@kitsuyui はこの操作で生じる不具合・不都合等について何ら保証は(しない|できない)。
Visual Studio Uninstaller でvisual studio 2015 を完全アンインストール

#概要
不具合が起きた際，Visual Studio を完全にアンインストールしたいときがある。
ここで使えるのがVisual Studio Uninstaller
Visual Studio標準のアンインストーラーやプログラムのアンインストールでは削除してくれないものもしっかり削除してくれる。

#対応バージョン
Visual Studio 2013 以降

#リンク
https://github.com/Microsoft/VisualStudioUninstaller/releases

#手順
0. TotalUninstaller.zip をダウンロードして展開
1. command prompt を管理者で実行
2. TotalUninstaller 内のSetup.ForcedUninstall.exe を実行
3. 'Y' を押してアンインストール
BVE5で画面が真っ暗になったときは

# 現象
（おそらく Windows10 特有の問題です。）
BVE5.6 でシナリオを読み込むと、画面が真っ黒になってしまうことがあります。
![ss1.png](https://qiita-image-store.s3.amazonaws.com/0/115416/8864fdc6-caab-3934-c437-97525edaa5fd.png)

不思議なことに、ウィンドウサイズを変えてみると文字情報は表示されますが、Zoom の値が`NaN (非数値)`となってしまいます。
![ss2.png](https://qiita-image-store.s3.amazonaws.com/0/115416/4c130c36-ea31-0480-709d-9ff3173dbbc6.png)

全画面設定で起動しなおした際やビューワーモードの時は正常です。
![ss3.png](https://qiita-image-store.s3.amazonaws.com/0/115416/e54accc0-42f6-7256-601d-57aee1f5b73b.png)

# 対処法
シナリオの読み込み画面を一旦閉じます。
![ss.png](https://qiita-image-store.s3.amazonaws.com/0/115416/7138bb0b-520f-1160-0b58-48926525df2e.png)

すると`Bve trainsim 5`のロゴが表示されていないことが分かります。
![ss5.png](https://qiita-image-store.s3.amazonaws.com/0/115416/bd27cc4d-6829-df04-039f-a818216b05fd.png)

ここでウィンドウのサイズを少しでも変えると、ロゴが表示されるようになります。
![ss6.png](https://qiita-image-store.s3.amazonaws.com/0/115416/0203faba-aa55-96f7-1be1-095b907f6f5d.png)

この状態で再びシナリオを読み込むと、運転台を含めて正しく表示されます。
![ss7.png](https://qiita-image-store.s3.amazonaws.com/0/115416/7fc8277b-38b2-691c-1c59-d37a4754307d.png)

BVE5.6をウィンドウモードで起動するたびにこの操作が必要です。

# 情報元
この対処法はTwitterにて、やましゅーさんよりお教えいただきました。
参考：https://twitter.com/yamashu_LL/status/733871291028013056
CarrierwaveとMiniMagickでユーザー任意の入力値で画像をトリミングする


RailsでWebアプリを作っている際に、ユーザーのアップロード画像をユーザー任意の値でトリミングしたいことってありますよね。フロントエンドはcropper.jsなどを使って、こんな感じで。

![Screen Shot 2016-05-21 at 12.54.28 PM.png](https://qiita-image-store.s3.amazonaws.com/0/60032/a5b55fd3-e87f-229e-dafb-2c7968d618af.png)

[cropper.js](https://fengyuanchen.github.io/cropperjs/)


## モデルの実装
今回は、Itemというモデルにimageという名前でアップローダーをマウントします。
この時、フロントエンドで取得したcrop用の値(X, Y, Width, Height)などは仮想属性で受け取ります。

```ruby:models/item.rb
class Item < ActiveRecord::Base
  mount_uploader :image,  ImageUploader

  # crop用の仮想attribute
  attr_accessor :image_x
  attr_accessor :image_y
  attr_accessor :image_w
  attr_accessor :image_h
end
```
仮想属性とはDBに保存しない値です。
DBに保存しないのでページの遷移などでオブジェクトが消失すると値の中身は消えてしまいます。
[RailsでVirtual Attributes(仮想的な属性)をする - Rails Webook](http://ruby-rails.hatenadiary.com/entry/20141229/1419856433)


## コントローラーの実装
次はコントローラーです。
フロント側の処理(cropper.jsなど)で 先ほど設定した仮想属性と同じ名前(`image_x`など)でcropの値をサーバに送信している前提です。

```ruby:controllers/items_controller.rb
class ItemsController < ApplicationController

  def upload
    @item = Item.new(item_params)
    @item.save!
    # 以下省略(リダイレクトしたりエラー時の処理なんかを書く)
  end

  private

    def item_params
      params.require(:item).permit(
        :image
        :image_x,
        :image_y,
        :image_w,
        :image_h,
      )
    end

end

```

この時、画像の保存処理自体はsaveメソッドが呼ばれてから走るので、一旦newなどで仮想attributeに値を入れてからsaveするようにします。updateの場合も先にオブジェクトに値を反映してから保存処理を走るようにすれば大丈夫です。

## アップローダーの実装
最後にアップローダーの実装です
仮想属性の値が取得できているので、それを元にcropします。

```ruby:uploaders/image_uploader.rb
  # 省略
  version :resized do
    process :crop
    process resize_to_fill: [600, 600]
  end

  private

    def crop
      return if [model.image_x, model.image_y, model.image_w, model.image_h].all?
      manipulate! do |img|
        crop_x = model.image_x.to_i
        crop_y = model.image_y.to_i
        crop_w = model.image_w.to_i
        crop_h = model.image_h.to_i
        img.crop "#{crop_w}x#{crop_h}+#{crop_x}+#{crop_y}"
        img = yield(img) if block_given?
        img
      end
    end
```

MiniMagickを使った画像処理の書き方がイマイチわかりづらいのと、
cropメソッドがえらく煩雑なのでもうすこしスッキリ書きたいなあと思いましたが私にはできませんでした。
**PLEASE FIX ME.**

## 最後に
[ruby on rails - CarrierWaveでCrop処理をする際のversionsについて - スタック・オーバーフロー](http://ja.stackoverflow.com/questions/14546/carrierwave%E3%81%A7crop%E5%87%A6%E7%90%86%E3%82%92%E3%81%99%E3%82%8B%E9%9A%9B%E3%81%AEversions%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6)

StackOverflowにこういう質問があがっていましたが、コントローラーで仮想属性を先にオブジェクトに反映するというのがキモのような気がします。

この記事を書くにあたり、弊社取締役の[にしもん先生](http://qiita.com/d_nishiyama85)とのペアプロにより上記の問題が解決したのでお礼を申し上げたく、謝辞にかえさせていただきます｡
超便利なzapierの使い方


zapierを使ってみたら応用範囲が広かったので、最近会社で試している組み合わせを共有する。

## はじめに
zapierとは、iffttの対応サービスが多い版みたいなもの。
複数サービスを組み合わせたり、JavascriptやPythonの実行結果をあわせられたり、webhookでpostされたことをトリガーにできたり、iffttよりも応用範囲が広い（と感じている）。
※複数サービスの組み合わせは有料版のみ



## 初級編
### 定期的にtrelloのカードを作る
毎月定期的に行っているタスクをtrelloで管理するために使用。
実行サイクルはdaily、weekly、monthyで指定できる。
![1c5c0e32-3641-6a97-ff7e-c3ee2b8bf4f8.png](https://qiita-image-store.s3.amazonaws.com/0/53581/2c3fcdd2-4449-8467-abc8-0e9c8a444710.png "1c5c0e32-3641-6a97-ff7e-c3ee2b8bf4f8.png")




## 中級編
### wufooに投稿があると、trelloにタスク化
wufooで作ったフォームに投稿があると、内容によってはすぐにアクションしなければならないので、特定項目に記入があればtrelloにカード化するように。
カード化するときに、wufooのデータだけでは足りないので、カード化するまえに、jsonでapiを叩いた結果を取得しておく。

![スクリーンショット 2016-05-21 12.32.38.png](https://qiita-image-store.s3.amazonaws.com/0/53581/6b4f9518-f7d9-77ab-824b-5e83acfe0036.png "スクリーンショット 2016-05-21 12.32.38.png")


## 上級編
### Faxの内容（PDF）が添付されたメールをjpgに変換して、電話番号から送信元を探し、送信元名を含むファイル名にリネームしてDropboxに保存する

![56fbd8a5-159f-3e3a-43f7-a23a8ed0a3f4.png](https://qiita-image-store.s3.amazonaws.com/0/53581/e36dc8ca-0b70-9b6b-7019-6ea52c3990d3.png "56fbd8a5-159f-3e3a-43f7-a23a8ed0a3f4.png")

![adb58a67-872c-d808-9e15-4fd73a81e86e.png](https://qiita-image-store.s3.amazonaws.com/0/53581/362214c5-d049-a7ed-a384-e20f34de490b.png "adb58a67-872c-d808-9e15-4fd73a81e86e.png")




具体的には、

1. 複合機がFAXを受信するとzapierのemailパース用のアドレス宛にPDFを添付して送信する
* pdfをcloudconvertのapiを使ってjpg化
* メールの内容に記載されている送信元電話番号をairtableから探して、参照元データを取得
* cloudconvertで変換後のデータをdropboxにリネームして保存

※ その他電話番号が不明の状態で送られてきたりするので、不明用の電話番号としてデフォルトtextを設定したりしてる

## その他
ひとつのパイプラインとして設計されているので、配列のようなデータは扱いにくいようになっているが、javascriptとwebhookを利用すればできたり、応用範囲は広そう。
Pythonでtwitterグラフ化　メモ

#背景・実行環境
このあんちべさんによる[記事](http://antibayesian.hateblo.jp/entry/20110828/1314491180)をみて、
・Python3（3.5.1）
・Windows10(64bits)
・[anaconda](https://www.continuum.io/downloads)でpythonインストール
の環境で同じことをしようとした。
※anacondaはかなりたくさんの科学計算に関連したパッケージがセットになっているので便利ですね。condaとpythonだけの小さなパッケージもあります。
※anacondaをインストールしないと、networkxだとか、python-twitter以外にインストールしないといけないパッケージが複数になるので、けっこう面倒です。

追加で参照：
・http://www.slideshare.net/pika_shi/pythontwittertwitter
・http://d.hatena.ne.jp/hangyo22/20120430/1335786712
・http://blog.kzfmix.com/entry/1206780815
ネットで有益な情報を公開してくれる方々に感謝。

##Python-twitterのバージョン
とりあえず、2016/06/11にグラフを描くところまで行ったときに、使っているバージョンは、3.1です。API制限にひっかかりまくるので、3.1のソースを一部変更して、利用しました。

#ソース（一部）
基本は、あんちべさんのページを参照してください。
以下は、少し変更を加えているところです。

```
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,
	    input_encoding = "utf-8",
        sleep_on_rate_limit=True)
```

#まず、[Python-twitter](https://github.com/bear/python-twitter)をインストール。
anacondaでインストールしているので、condaでやりたかったが、python-twitterの2016/05現在の最新版 3.0rc1（Python v3に対応するよう変更が加えられているらしい）を入れられなかったので、pipを使う。
`pip install python-twitter==3.0rc1`
⇒2016/05/28現在、最新版は、3.1なので、
`pip install python-twitter==3.1`になります。
※パッケージのバージョンなどは、pip searchとか、conda searchとかを利用して確認しています。
※最新のバージョンについては、python-twitterのgithubのページでドキュメント読んだり、`pip install python-twitter==4.0`などと、存在しないことがGithubのドキュメントから事前にわかっているバージョンを入れてみることで表示されるメッセージで確認しています。
※python-twitterのバージョンは、https://python-twitter.readthedocs.io/en/latest/changelog.html
を見るのが早いですね。

`conda list`
でインストールされているパッケージ一覧が表示されるので、python-twitterがインストールされていることを確認。

python-twitterのバージョンが3.0rc1のときには、twitter.Api（）の中で、input_encording='utf-8'があるとエラーになっていたが、バージョンが3.1になって解消された。

##Python-twitterの機能概要（一部）
GetFriendsとかすると、100人といわず、全員の情報を収集する動作のようです。ソースの動作確認などで、あまりたくさんの情報がいらないときは、twitter.Api()の中に、'total_count='で、上限を設定するといい。

あと、`timeout=（デフォルト60秒）`とかの設定もあるので、回線が不安定だと設定を見なおしたほうがいいのかも。※よくわかっていません。

#プログラムの実行
結果としては、グラフ描画まで完了。次はグラフから意味ある結果を導くこと。これはまだ。

twitter.error.TwitterError: [{'message': 'Rate limit exceeded', 'code': 88}]
が出た。その対応として、sleep_on_rate_limit = Trueにしようとするも、`__init__`でエラーだなんだとpython-twitter==3.0rc1では表示されていたが、2016/05/28現在最新の、3.1ではエラーが表示されなくなった。よって解決。

Python-twitterの、_RequestUrl()の中のtime.sleepする秒数の算出のところで、int()で小数点以下切り捨てになっているので、ここに余剰の数値を足して動作確認したが、ここだけの変更ではAPI呼び出し制限にひっかかることを回避できないので、あまり関係なさそう。

API制限を避けるために最終的に実施したのは、python-twitterのソースの一部変更。API残数0にちょうどなったときにsleepしている処理を、API残数 2以下になったらsleepするように変更した。

いまのところグラフ描画できているものの、結果に意味を見いだせないグラフになっている。理由としては、いろんな分野の方をフォローしすぎなのか、ネットワークグラフを描くときのアルゴリズムに一工夫必要なのか、いろいろ考えられるが現時点では不明。継続確認することとする。

##実行結果から得られたAPIリミットの避け方（概要）
・python-twitterのapi.pyを編集する。
　-（これは効果がない可能性あり）time.sleep(int(...)+数秒)
　-APIのremaining==0のときのみ、sleepするところのif文の条件をかえて、例えば2以下でsleepするようにする。

https://github.com/bear/python-twitter/issues/350
ESP8266 > Link > APモード > IPアドレスを設定する > WiFi.softAPConfig()

```txt:使用機材
ESP-WROOM-02 > ユニバーサル基板実装
```

http://qiita.com/7of9/items/b21630802ec8a881cb02#comment-c468b3e0bea64220d317
にてSensorsystemで使うネットワークについて検討している中、以下のコメントをいただいていた。

> ESP-8266をAPとする場合、
Wifi.softAPConfig(IPAddress(<ローカルIP>),IPAddress(<ゲートウェイ>),IPAddress(<サブネット>));
WiFi.softAP(<ｓｓｉｄ>);
とすることで、任意のIPアドレスを設定できるようです。

その使用例は以下にある。
http://qiita.com/yanix/items/8bfc00db7cae75d4c6e6

実際にやってみた。

```eps8266_160521_APwithIpAdr.ino
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>

static const char *kSsid = "esp8266";
static const char *kPassword = "12345678";

ESP8266WebServer myServer(80);

void handleRoot() {
    myServer.send(200, "text/html", "<h1>You are connected</h1>");
}

void setup() {
    pinMode(4,OUTPUT);
    delay(1000);

    Serial.begin(115200);
    Serial.println();
    Serial.print("Configuring access point...");

#if 1 // set my IP
    WiFi.softAPConfig(IPAddress(192, 168, 79, 2), IPAddress(192, 168, 79, 1), IPAddress(255, 255, 255, 0));
#endif

    WiFi.softAP(kSsid, kPassword);
    IPAddress myIP = WiFi.softAPIP();
    Serial.print("AP IP address: ");
    Serial.println(myIP);

    myServer.on("/", handleRoot);
    myServer.begin();
    Serial.println("HTTP server started");
}

void loop() {
    myServer.handleClient();
}
```

```txt:結果
Configuring access point...AP IP address: 192.168.79.2
HTTP server started
```

確かに設定できた。

192.168.4.1という固定でなく、自由なIPアドレスを設定できることで、他の接続機器のIPの指定がフレキシブルになる。
VBA超基本文法メモ

#VBAの超基本文法メモ
VBAとはExcelの処理を自動化できるプログラミング言語。
ここでは簡単な処理をするために最低限必要だと思われる知識をまとめた。

### 基本構文
~~~VBA
Sub プロージャー名()
処理
End Sub
~~~

### セルの値
Cells(列, 行).value

### 数字を文字列に変換
CStr(数字)

### For文
~~~
For i=初期値 To 終了値
   処理
Next
~~~

### If文
~~~
If 条件
   処理
ElseIf
   処理
Else
   処理
End If
~~~

### 範囲指定方法
Range("A1:A2")
Range(Cells(1,1),Cells(2,1))

### ワークシート関数の使用
Application.WorksheetFunction.関数名(範囲指定)
または
Application.関数名(範囲指定)
UIPageViewControllerで現在のページのクラス名を取得する

UIPageViewCOntrollerのデリゲートメソッドですが、スワイプして、ページが止まった瞬間に呼ばれます。
また、finishedはアニメーションが終了したタイミング（遷移しようが遷移しまいが）
completedは遷移が完了したタイミングで呼ばれます。
遷移した場合、順番としてはfinishedが先です。

```swift

func pageViewController(pageViewController: UIPageViewController, didFinishAnimating finished: Bool, previousViewControllers: [UIViewController], transitionCompleted completed: Bool) {
        if completed {
            let currentVC = pageViewController.viewControllers![0]
            print(currentVC.getClassName())
        }
    }

```

getClassNameは拡張しています。
Linux > Link > head / tail > (head; tail) < file.txt > 先頭と最後を同時表示

```txt:動作確認
CentOS 6.5
```

head, tailの組合せに関して検索している中で、以下のリンクを見つけた。
http://stackoverflow.com/questions/8624669/unix-head-and-tail-of-file

ファイルの先頭と最後を同時に見たい、という質問に対しての回答の１つが

```
(head; tail) < file.txt
```

コマンドを順番に実行しているだけだが、ファイル指定は１つでいいということのようだ。

他のコマンドの場合で、使い道があるかは不明。
Pelicanでブログ作成 on Windows

静的サイトジェネレータやらを使ってブログをつくってみることにしました。
今回はPython製のPelicanを使いました。

#環境
- Windows10
- Python 3.4
- virtualenv
- pip

#Pelicanインストール

まず、virtualenv コマンドでpelicanという名前で仮想環境を作成します。
`C:\> virtualenv pelican`

pelicanへ移動
`C:\> cd pelican`

仮想環境へ移動
`C:\pelican> Scripts\activate`

Pelicanをインストール
`(pelican)C:\pelican> pip install pelican`

記事をMarkdown形式で書きたいので、
`(pelican)C:\pelican> pip install Markdown`

これでブログ作成準備が整いました。

#ブログ作成
myblogプロジェクトフォルダ作成、移動
`(pelican)C:\pelican> mkdir myblog`
`(pelican)C:\pelican> cd myblog`

ブログの雛型作成。
`(pelican)C:\pelican\myblog> pelican-quickstart`

このときブログタイトルや著者名など、いろいろ質問されるので答えます。

#記事を書く
Markdown形式で記事をかきます。

```lang:first-post.md
Title: Pelicanでブログ
Date: 2016-05-20 22:40
Category: Pelican
Tags: pelican, python
Slug: first-post
Author: Daiki
Summary: Pelicanでブログ作成

Pelicanでブログを作成します。
```

これを\myblog\content\以下に保存します。

#記事投稿
本来なら`make html`コマンドで簡単に静的ページを生成できるのですが、Windowsでは出来ないのでバッチファイルを使います。
(https://gist.github.com/traeblain/4252511)
ここにあるpmake.cmdをmyblog以下に置き、

```lang:pmake.cmd
set _PELICAN=$pelican
set _PELICANOPTS=$pelicanopts
.
.
cd %_OUTPUTDIR% && python -m SimpleHTTPServer
.
.
```

を

```lang:pmake.cmd
set _PELICAN=pelican
set _PELICANOPTS=
.
.
cd %_OUTPUTDIR% && python -m http.server
.
.
```

にpelicanのパスとpython3.4の場合のサーバー起動コマンド(2.xの場合はそのまま)を編集、

これで`make`の代わりに`pmake`コマンドでコンパイルできるようになります。
`(pelican)C:\pelican\myblog> pmake html`

特にエラーがなければHTML化に成功しました。

localhostサーバー起動
`(pelican)C:\pelican\myblog> pmake serve`

これで`http://localhost:8000`にブラウザでアクセスすると作成記事の確認ができます。

#Githubで公開
公開用のHTMLファイルの生成
`(pelican)C:\pelican\myblog> pmake publish`

公開用URLなどの設定はpelicanconf.pyで変更できます。

outputディレクトリへ移動
`(pelican)C:\pelican\myblog> cd output`

Githubでページを公開 (公開URL:ユーザー名.github.io)
`(pelican)C:\pelican\myblog\output> git init`
`(pelican)C:\pelican\myblog\output> git add --all`
`(pelican)C:\pelican\myblog\output> git commit -m "first post"`
`(pelican)C:\pelican\myblog\output> git push https://github.com/ユーザー名/ユーザー名.github.io.git master:master`

*追記: output以下にgitレポジトリを作ると`pmake html`でエラーがでるのでmyblog以下につくり、pushするときにghp-importを使ってoutputを指定でうまく共存できるみたいです。

*追追記: 他にもpublishconf.pyの`DELETE_OUTPUT_DIRECTORY = False`に変更するとうまくいきました。


参考：(http://docs.getpelican.com/en/3.6.3/tips.html)









参考サイト
- [WordpressやめてPelicanに移行したいんだけど障害を乗り越える元気がない。](https://www.ainoniwa.net/pelican/wp/1072.html)
- [技術ブログを静的ページジェネレータPelicanで始めることにした](http://raimon49.github.io/2014/11/09/start-tech-blog-by-pelican.html)
- [静的サイトジェネレータ Pelican で Blog を書こう](http://blog.tekito.org/2013/12/16/setting-up-a-blog-with-pelican/)
- [Pelican + Markdown + GitHub Pagesで管理するブログの作り方](http://blog.sotm.jp/2014/01/04/Pelican-Markdown-GithubPages-install-guide/#github-pages_1)
- [githubでブログを作ってみる - Pelican編](http://notetau.github.io/20141104-github-pelican.html)
- [Pelicanのインストール・動作確認メモ](http://tima620.hatenablog.com/entry/2014/06/03/034015)
- [Pelican Documentation](http://docs.getpelican.com)
MacでUnityのAndroidビルドのセッティング

# 概要

今後UnityでAndroid・iOSアプリ両方を作っていきたいということがあり、
いざやってみようとしたらUnity以外に必要なものがあったため
メモとして記載する。
なお対象のプロジェクトはデフォルトで用意されているStandardプロジェクトで行う。

# 必要なもの

Unityはインストールされている前提で記載します。
Androidのビルドに必要なものになります。

下記のものがインストールされたらUnityのメニューバーより
「 Unity → Preferences 」 External Tools を選択してパスの設定を行います。

![スクリーンショット 2016-05-21 11.12.19.png](https://qiita-image-store.s3.amazonaws.com/0/89599/cf9d1df6-5854-86c6-7d13-463f6e17b6a6.png)


## Android　SDK

Unityの公式で記載されている内容としては下記になります。
http://docs.unity3d.com/ja/current/Manual/android-sdksetup.html

Android Studioをインストールされていて既にAndroid　SDKが存在するとき
/Users/[ユーザ名]/Library/Android/sdk/
ここにAndroid　SDKが設置されます。


## JDK

既存でjdkがインストールされているときは下記のパスになります。
/Library/Java/JavaVirtualMachines/jdk1.7.X_XX.jdk/Contents/Home

# ビルドの実行

Androidのエミュレータとして[Genymotion](https://www.genymotion.com/)というのがありますがこちらのエミュレータはAndroid SDKからのエミュレータ起動より早いためこちらを事前に起動しておくと良いかもしれません。

https://www.genymotion.com/

Unityのメニューバーより
「 File → Build Settings 」
PlatformからAndroidを選択し、「Build & RUN」を行うとビルドが開始されます。

![スクリーンショット 2016-05-21 11.29.54.png](https://qiita-image-store.s3.amazonaws.com/0/89599/d21217b2-e649-8f38-fcb8-baa235768339.png)

しばらくするとGenymotionで起動したエミュレータ上にアプリケーションが起動されます。

![スクリーンショット 2016-05-21 11.31.39.png](https://qiita-image-store.s3.amazonaws.com/0/89599/1c327b8b-fef4-d31e-4477-aad664b87d03.png)


# 新規のプロジェクトからAndroidアプリを起動しよう

Unityによる画面作成は「canvas」から行います。
Hierarchy ウィンドウから「Create　→ UI」より「canvas」を選択して画面を作成します。

![スクリーンショット 2016-05-21 19.09.47.png](https://qiita-image-store.s3.amazonaws.com/0/89599/ca668440-317f-c9e1-bd91-0250d4bab042.png)

それからそのあと「Command + S」で保存を行い、「Build & RUN」でUnityのロゴが表示されるかと思われます。

次回画面の作りについて記載したいと思います。
CodeIQ「『レッド・アンド・ホワイト』問題」に挑戦しました。

CodeIQ「『レッド・アンド・ホワイト』問題」の問題掲載期間が終了したということで、自分の提出コードを公開したいと思います。なお詳細な内容や解説については[「CodeIQMagazineの記事」](https://codeiq.jp/magazine/2016/05/41263/)および[「Togetterまとめ」](http://togetter.com/li/973639)があるので、リンクしておきます。

```scm
;0以上の整数xを2進数表記にしたときの1の数を返す
(define (G x)
  (let loop ((cnt 0) (i x))
    (if (< i 1)
      cnt
      (loop (if (odd? i) (+ cnt 1) cnt)
            (quotient i 2)))))

;問題文のF(n): n秒後の赤いマスの数を返す
(define (F n)
  (expt 2 (G n)))

;== main ==
(display (F (read)))
```

やっていることは至極単純。自然数nを2進数表記にした時の1の数を$G(n)$とすると、求める答え、すなわち__n秒後の赤いマスの数__は次のようにあらわせます。

```math
2 ^ {G(n)}
```

$G(n)$については、好きなように求めてください(´・ω・`)
ESP8266 > ADC > TOUTに入力がある時のVCC電圧測定への影響の調査 > VCC測定時はTOUTをオープンにするべし

```txt:動作確認
ESP-WROOM-02 + ユニバーサル基板実装
Analog Discovery 2 (以下AD2)
```

http://qiita.com/ryokai/items/5ec7e0d88f4dc08dff69
の記事にある以下について調べてみた。

> かつ、TOUTに信号が入力されると、電源電圧の測定値にぶれが出ると思われます(未検証)


## TOUTへの入力

http://qiita.com/7of9/items/8b24c7634cfdadb67e1c
にあるようにAD2のwave generatorにてランダム値を入力するようにした。

- Type: Noise
- Frequency: 1kHz
- Amplitude: 250mV
- Offset: 750mV

上記の設定により、0.5から1Vの範囲の電圧が出力される。

なお、AD2用のWaveFormsというソフトでその波形出力のON/OFFをできるが、OFFにしたときは「OFFにした時の電圧値(例:0.22V)」が出力され続けるようだ (これは後述の結果と関連する)。

## ESP8266とAD2の接続

http://qiita.com/7of9/items/4bc0ed999ea49f4daa9d

AD2の波形出力をTOUTに取り込んでいる。

## コード

http://qiita.com/ryokai/items/5ec7e0d88f4dc08dff69
のコードを参考に以下とした。

```
ADC_MODE(ADC_VCC);

#define ADC_VCC

extern "C" {
#include "user_interface.h"
}

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

void loop() {
  uint ADvalue;
#ifdef ADC_VCC
  ADvalue = ESP.getVcc(); 
#else  
  ADvalue = system_adc_read();
#endif 

  Serial.println(ADvalue);

  delay(1000); // msec
}
```

## 結果
### AD2の波形出力オフ時

TOUT側の電圧はほぼ一定となっている状態(オフにした時の電圧値のまま)でのVCCのAD値。

```
3037
3036
3034
3038
3033
3037
3034
3037
3036
3038
3038
3035
3038
3041
3036
3036
3039
```

### AD2の波形出力オン時

TOUT側の電圧には0.5-1.0Vのランダム値が入っている。

```
4094
3393
3649
2241
3324
2675
3062
3080
2512
3025
4094
2321
3746
4048
2242
3736
2515
3232
3781
3800
```

## 結論

VCC測定時はTOUTはオープンにしておくこと。

## 免責

なお、上記を試してESP8266が故障などしても責任は負いかねます。