OmniAICreator/Qiita-1.07M huggingface dataset:
upverter / ESP8266 / ESP-WROOM-02 > Parts登録した

switch scienceのESP-WROOM-02ピッチ変換済みモジュール《フル版》
https://www.switch-science.com/catalog/2347/

上記をUpverterのParts登録した。

Add Component画面において「WROOM」で検索すると出てくる「Espressif ESP-WROOM-02 (switch-science Full ver)」というもの。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/d0a3f891-df49-2816-1415-38bc03b7dedf.png)

ピン配置は以下としている。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/36e2b6b9-b4b6-49af-fe1c-917c5fabe954.png)

ESP8266自体は色々なモデルがあるが、自分が今使っているもので登録しておいた。

[補足]
ピンに番号がついているのは、番号をつけないとピンの位置がUpverterでアルファベット順にしてしまうから。
ピン番号の昇順がN型なのかU型なのかは知らないが、配置のためにN型とした。
arduinoでインスツルメント　クラスター

#概要
arduino unoでcanからインスツルメント　クラスターを操作した。
#写真
![MVC-013S.JPG](https://qiita-image-store.s3.amazonaws.com/0/18104/31c28bcf-9819-561a-009d-d413951294cd.jpeg)
#動画
https://www.youtube.com/watch?v=tfVAaIHo0NA
#回路図
![can1.JPG](https://qiita-image-store.s3.amazonaws.com/0/18104/5a74e916-ad83-5b9b-92d1-a438faabf9c1.jpeg)
#サンプルコード
```
#include <SPI.h>
#include "mcp_can.h"

const int SPI_CS_PIN = 10;
MCP_CAN CAN(SPI_CS_PIN);
unsigned char stmp[8] = {
	0,
	0,
	0,
	0,
	0,
	0,
	0,
	0
};
void setup()
{
	Serial.begin(115200);
START_INIT:
	if (CAN_OK == CAN.begin(CAN_500KBPS))
	{
		Serial.println("CAN BUS Shield init ok!");
	}
	else
	{
		Serial.println("CAN BUS Shield init fail");
		Serial.println("Init CAN BUS Shield again");
		delay(100);
		goto START_INIT;
	}
}
void loop()
{
	unsigned int i = 0;
	unsigned int j = 0;
	for (i = 0; i < 129; i++)
	{
		stmp[0] = i;
		stmp[4] = i;
		for (j = 0; j < 10; j++)
		{
			CAN.sendMsgBuf(0x201, 0, 8, stmp);
			delay(100);
		}
	}
}

```
ELB配下のApacheで外部はHTTPSにリダイレクトし、内部のサーバのみHTTPで通信させる

# やりたい事

![server_pptx.png](https://qiita-image-store.s3.amazonaws.com/0/30079/5f34a9c7-b1ae-e746-8e06-281e0a56a86b.png)

* ApacheにELB経由でHTTPでアクセス来たらHTTPSでアクセスするようにクライアントに要求する
* ApacheにELB経由でHTTPSアクセス来たらELBでHTTPのポートのApacheにアクセスする
* 他の内部(10.X.X.X)のEC2からHTTPにアクセスが来た場合はそのまま通す

# 設定

```
<VirtualHost *:80>
  ServerName xxx

  # http -> https rewrite
  RewriteEngine On
  RewriteCond %{HTTP:X-Forwarded-Port} !^443$
  RewriteCond %{HTTP_USER_AGENT} !^ELB-HealthChecker
  RewriteCond %{REQUEST_URI} !=/server-status
  RewriteCond %{HTTP:X-FORWARDED-FOR} !^$
  RewriteRule ^(.*)?$ https://%{HTTP_HOST}$1 [R=301,L]
  # http -> https rewrite [end]

  ...
</VirtualHost>

```

上記でいけます。ELB経由でアクセスされる場合は、 %{HTTP:X-FORWARDED-FOR} のHTTPヘッダにクライアントのGlobal IPがついているので、それがない場合は内部と判定しています。

その他の設定は、ヘルスチェックなどを通すためのものです

# 追記
CloudFrontの場合は以下を参照

* http://qiita.com/kawaz/items/5e96dae9686e3ac402fe
upverter / SNS-MQ135 > Parts登録してみた

空気質センサ SNS-MQ135

関連 http://qiita.com/erukiti/items/1d9658f7c363e79d051b
関連 http://qiita.com/7of9/items/fe7d3bd8d1b164b4f25f

upverterのパーツとしては未登録なので登録しておいた。

Add Component画面において「MQ135」と検索すれば「olimex SNS-MQ135」として一覧に出てくる。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/0cec8733-8deb-034f-477b-82df9301301b.png)

ピンは以下のようにした。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/d8f5a1f5-4658-63cc-07b5-c6fb91019183.png)

Schematicは物差し（ノギスは持ってない）で計測したもので作成。ただの長方形としている。

データシートも登録しておいた。上のAdd Component画面において、青色の書類アイコンを押すとデータシートがダウンロードできる。
技術英語 > [misinterpreting] pressure readings that showed ... / misrepresentation / You mistook me for someone else. / mislead / misuse



http://loe.org/shows/shows.html?programID=12-P13-00046
> Most of the company’s felony charges relate to <font color=red>misinterpreting</font> <font color=blue>pressure readings</font> that showed leaks in the wellhead of the Deepwater Horizon rig. 

...

> based on <font color=red>misrepresentation</font> of the flow rate.

pressure readings の方も気になる。計器類の数値というのは readings をつけていたと思う。

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

> You mistook me for someone else.

「人違いでは」というのに使える

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

[misuse](http://eow.alc.co.jp/search?q=misuse)
[mislead](http://eow.alc.co.jp/search?q=mislead)

<hr>
mistook関連で思い出したもの

ドラマ番のスターゲートにて、マクガイバーの俳優（リチャード・ディーン・アンダーソン）が研究者に会った時に以下のように言っていた。

> I have a hunch that you are professor XXX.

訳は「XXX教授ですね。」とついていたと思う。

[have a hunch that](http://ejje.weblio.jp/content/have+a+hunch)
Travis CI で複数環境でテストしたあとビルドプロセスは特定の環境で行いたい時のTips


複数のバージョンでテストしたあとテストをパスしたら特定の環境でビルドしたいケースがあるかと思いますが、そんな時のTipsです。

例えば、下記のようなパターンで、テストはgolangのversionとBuild osをマトリックスしたパターン。このパターンでは3x3=9つのパターンでテストが実施されます。

```yaml:.travis.yml
language: go
go:
  - 1.4.3
  - 1.5.3
  - tip
env:
  global:
    - BUILD_GOARCH=amd64
  matrix:
    - BUILD_GOOS=linux
    - BUILD_GOOS=darwin
    - BUILD_GOOS=windows
install:
  - go get golang.org/x/tools/cmd/vet
  - go get -v github.com/zquestz/s
script:
  - go build
  - go fmt ./...
  - go vet ./...
  - go test -i -race ./...
  - go test -v -race ./...
```

この後、リリース用にBuildしたいとおもうと、普通は下記のようにafter_script:を書いて、deploy:でリリースするか思います。

```yaml:
after_script:

deploy:
  provider: releases
  api_key: "GITHUB OAUTH TOKEN"
  file: "FILE TO UPLOAD"
  skip_cleanup: true
  on:
    tags: true
```

ただ、これだと9つのマトリックス全てで実行されてしまい、9回deployされてしまいます。これを防ぐには、あまり綺麗とは言えませんが、Travis内の環境変数を取得して、シェルスクリプト内で判断するのが良さそうです。

例えば、go version　1.5.3、BUILD_GOOS=linux　gitのtagありで実行させる場合、下記のように書くとよいです。

```yaml:.travis.yml
after_script:
- if [ "$TRAVIS_GO_VERSION" = "1.5.3" ] && [ "$BUILD_GOOS" = "linux" ] && [ "$TRAVIS_TAG" != "" ]; then go get github.com/inconshreveable/mousetrap; fi
```

TravisCI内で取れる環境変数は、[こちら](https://docs.travis-ci.com/user/environment-variables/)にまとまっています。

## 参考

[zquestz/s](https://github.com/zquestz/s)で[こんな感じ](https://github.com/zquestz/s/blob/9f1075ba75d289f92b060b17e436d5461e6e9c6b/.travis.yml)に使いました。
Array.reduce を使って配列に対する同期処理をよりエレガントにする

* 大量のデータを順番にサーバーに送りたい。
* 大量のデータをブラウザのデータベースに順番に保存したい。

等、配列に収められた一連のデータを、順番に (同期的に) 処理したいけど、非同期処理が含まれてしまうため、タイミング調整するのが難しい、というケースが有ります。

解決法のひとつとして、[Promise を使った同期処理](http://qiita.com/agektmr/items/d19317edf66e8f8b5e85) という記事を以前書いたのですが、`Array.reduce` を使った例が非常にエレガントだったので、分かりやすく？紹介します。

参考資料：[Promise waterfall](https://remysharp.com/2015/12/18/promise-waterfall#now-as-a-waterfall)

`Array.reduce()` は配列の中身を順番に関数に投げ、結果を累積的に処理していくためのものです。例えば

```js
var result = [1, 2, 3, 4].reduce(function(prevResult, currValue, index, array) {
  return prevResult + currValue;
}, 0);
console.log(result);
```

`.reduce` の第一引数となる関数は 4 つの引数を取ります。

* 前回の結果
* 今回検証する配列の値
* 今回検証する配列の番号
* 配列そのもの

`.reduce` の第二引数となる値は、最初の検証時の `前回の結果` を指定することができます。省略すると、インデックス 0 がこれに割り当てられ、実際の検証はインデックス 1 からスタートすることになります。上記の例では

|順番|前回の結果|今回検証する配列の値|今回検証する配列の番号|配列そのもの|
|---|---|---|---|---|
|1回目の検証|0|1|0|[1,2,3,4]|
|2回目の検証|1|2|1|[1,2,3,4]|
|3回目の検証|3|3|2|[1,2,3,4]|
|4回目の検証|6|4|3|[1,2,3,4]|

というわけで、結果は 10 ということになります。

これを応用して毎回 `Promise` を返すことでチェーンさせる例が下記になります。

```js
var wait = function(val) {
  return new Promise(resolve => {
    // 1秒待ちを入れてコンソールに数字を表示する
    // XHR 等の非同期処理でも良い
    setTimeout(() => {
      console.log(val);
      resolve();
    }, 1000);
  });
};

// 配列を順番に処理する
var sequential = function(array) {
  // .reduce で順番に処理。初期値は第二引数の Promise.resolve()
  return array.reduce((promise, val) => {
    // promise が常に前回の戻り値であることを利用して
    // Promise を連鎖させるのがポイント
    return promise.then(res => wait(val));
  }, Promise.resolve());
}

// 実行すると Console に 10 からのカウントダウンが 1 秒置きで表示される
sequential([10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0]);
```

[動くサンプル](http://jsbin.com/jiwile/edit?js,output)
API Gateway + Lambda でQiita::Team のポエムを集約してみました

「ポエム」のタグを付けた投稿を #poem チャンネルに集約するためにAPI Gateway とLambda を使ってみました。

Qiita::Team のWebhook => API Gateway => Lambda => Slack の流れで、Qiita::Team の投稿をSlack に通知する流れです。

細かい設定は公式のドキュメントが丁寧に説明してくれています。また、API Gateway + Lambda の連携は書いてくれている人が多いので説明は割愛。

- [演習: API Gateway と Lambda 関数](https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/getting-started.html)
- [【Python】AWSのAPI GatewayとLambdaを使ってREST APIを書いてみた](http://qiita.com/Hironsan/items/de5dcd42e1c6f6a9b5c7)

## Lambda の設定

API Gateway で適宜Webhook のPOST データを受け取れる様にすると、 `event` 変数にJSON データが受け渡されます。

```
var https = require('https');
exports.handler = function(event, context) {
    console.log('event: ' + JSON.stringify(event, null, 4));
    var payload = event;

    // 不要なアクションはスキップ
    // cf. https://qiita.com/api/webhook/docs
    var nop = true;
    if (payload.action === 'created') { 
        payload.item.tags.some(function(e, index) {
            if (e.name === 'ポエム') {
                nop = false;
                return true;
            }
        });
    }
    if (nop) {
        context.succeed('NOP');
        return;
    }
    
    var options = {
        host: 'hooks.slack.com',
        port: 443,
        path: '/services/xxx/xxxxxx', // NOTE: Slack のIncoming Webhook URL を指定する 
        method: 'POST',
        headers: { 'Content-Type': 'application/json' }
    };
    
    // Slack への投稿フォーマット指定
    // cf. https://api.slack.com/incoming-webhooks
    var response = {
        channel: '#poem', 
        username: 'poemer', 
        text: 'ポエム入荷しました！',
        icon_emoji: ':kissing_cat:',
        attachments: [
            {
                "title": payload.item.title,
                "title_link": payload.item.url,
                "fields": [
                    {
                        "title": "Author",
                        "value": payload.user.url_name,
                        "short": true
                    }
                ]
            }
        ]
    };
    
    // Slack へのPOST
    var req = https.request(options, function(res) {
        var body = '';
        console.log('Status:', res.statusCode);
        console.log('Headers:', JSON.stringify(res.headers));
        res.setEncoding('utf8');
        res.on('data', function(chunk) {
            body += chunk;
        });
        res.on('end', function() {
            console.log('Successfully processed HTTPS response');
            // If we know it's JSON, parse it
            if (res.headers['content-type'] === 'application/json') {
                body = JSON.parse(body);
            }
            context.succeed(body);
        });
    });
    req.on('error', context.fail);
    req.write(JSON.stringify(response));
    req.end();
};
```

Qiita::Team のWebhook 通知のToken はチェックしていないので、セキュリティ的な部分が気になる人はチェックするとよいと思います。

Qiita::Team から飛んでくるデータは[公式ドキュメント](https://qiita.com/api/webhook/docs)を参照してください。

AWS コンソールでポチポチすれば簡単に作れるのでお試しあれ。

# 追記：こんな感じで通知されます

![Screen Shot 2016-02-09 at 13.01.23.png](https://qiita-image-store.s3.amazonaws.com/0/257/c133acb1-17c4-7bc5-0474-9f102d90a6e6.png)
Railsでネームスペース付きのモデルでテーブル名にプレフィックスをつける

タイトルの通りですが、具体的には以下のコマンドでモデルをgenerateしてあげれば、実現できます。
`Admin::User` というモデルで `admin_users` というテーブルを作りたい場合、以下のコマンドで作成できます。

`bundle exec rails g model Admin::User email password flag`

```text:実行結果としてこれらのファイルが生成されます
      invoke  active_record
      create    db/migrate/20160202020202_create_admin_users.rb
      create    app/models/admin/user.rb
      create    app/models/admin.rb
      invoke    rspec
      create      spec/models/admin/user_spec.rb
```

```rb:app/models/admin.rb
module Admin
  def self.table_name_prefix
    'admin_'  #<= DBのtable名にadmin_というプレフィックスがあることが前提
  end
end
```

```rb:app/models/admin/user.rb
class Admin::User < ActiveRecord::Base
end
```

**`app/models/admin.rb` で `table_name_prefix` というクラスメソッドをオーバーライドしています。**

Railsではなぜかネームスペースとなる親のModuleに定義してあげると `table_name_prefix` が有効な状態となります。
ネームスペースとなっているModuleにメソッドを定義するだけで、そのメソッドが実行できるわけではないので気になって詳しく調べてみました。
通常Rubyだと `self.hoge` などで始まる **特異メソッド** は **`extend`** しないとダメです。

* 参考：[moduleのメソッドをクラスメソッドとして追加したい - うなの日記](http://unageanu.hatenablog.com/entry/20080413/1208083475)

以下のActiveRecordのソースにコメントで書かれていました。

* [activerecord/lib/active_record/model_schema.rb#L25-L27](https://github.com/rails/rails/blob/ceb33f84933639d3b61aac62e5e71fd087ab65ed/activerecord/lib/active_record/model_schema.rb#L25-L27)

```ruby:activerecord/lib/active_record/model_schema.rb#L25-L27 
      # If you are organising your models within modules you can add a prefix to the models within
      # a namespace by defining a singleton method in the parent module called table_name_prefix which
      # returns your chosen prefix.
```
意訳すると以下の感じでしょうか。

> まとめたい(organisingしたい)ときはネームスペース(parent)となっている `Admin` のモジュールに定義することで可能。

実装コードは以下。`parents` で親のモジュールに `table_name_prefix` の定義があるかを判定しあれば返すという実装になっていました。

* [activerecord/lib/active_record/model_schema.rb#L151-L153](https://github.com/rails/rails/blob/ceb33f84933639d3b61aac62e5e71fd087ab65ed/activerecord/lib/active_record/model_schema.rb#L151-L153)

```ruby:activerecord/lib/active_record/model_schema.rb#L151-L153
      def full_table_name_prefix #:nodoc:
        (parents.detect{ |p| p.respond_to?(:table_name_prefix) } || self).table_name_prefix
      end
```
php note


# composer

https://getcomposer.org/

```
curl -sS https://getcomposer.org/installer | php
```

How-to
http://tech.basicinc.jp/php/2013/08/18/php_composer/

# predis
```json:composer.json
{
"require": {
  "predis/predis": "*"
}
}

```

`./composer.phar install`

```php:test-redis.php
<?php
require 'vendor/autoload.php';

$client = new Predis\Client();
$client->set('foo', 'bar');
$value = $client->get('foo');
print $value;

```

`php test-redis.php `

## predis & replication

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

$parameters = ['tcp://server-1?alias=master',
               'tcp://server-2?alias=slave-01'];
$options    = ['replication' => true];

$client = new Predis\Client($parameters, $options);
$client->set('foo', 'bar');
print $value;
```

more samples
https://github.com/nrk/predis/tree/v1.0/examples
Preference ウィンドウをドッキング可能な状態で開く

#概要
Preferencesウィンドウをちょこちょこいじる為、Preferencesウィンドウを常に表示しておきたいのですが、
普通に開くとドッキングできないフローティングウィンドウとして開かれるため、常に開いておくと少し邪魔な感じがします。
SceneViewやInspectorのように、ドッキング可能なウィンドウとして開けないかと試してみました。

#Preferencesウィンドウのクラス名は…
EditorWindowであれば、クラス名がわかれば
EditorWindow.GetWindow
を使って、ドッキング可能なウィンドウとして開くことができるのでは、と考えました。

幸い、フォーカスしているウィンドウ、もしくはマウスオーバーしたウィンドウのクラスを調べられるものがEditorWindowにあるため、
これを利用してクラス名を調べました。
EditorWindow.mouseOverWindow
EditorWindow.focusedWindow

調べてみたところ、UnityEditor.PreferencesWindowと言うクラス名のようです。
![001.png](https://qiita-image-store.s3.amazonaws.com/0/43756/d3df8707-2098-96a9-6fb9-7605f5eab6a8.png)

#ドッキング可能ウィンドウとして開く
クラス名がわかったので、早速開こう…と思ったのですが、そのまま

```csharp
EditorWindow.GetWindow(typeof(UnityEditor.PreferencesWindow));
```
としても、PreferencesWindowが見つからずにエラーになります。
仕方がないので、Reflectionを使用してUnityEditor.PreferencesWindowを取得してウィンドウを開きます。

```csharp
using UnityEngine;
using UnityEditor;
using System.Reflection;

public class DockablePreferencesWindow : Editor
{
	[MenuItem("Window/Open Dockable Preferences")]
	static void OpenDockablePreferences()
	{
		var asm = Assembly.Load("UnityEditor");
		var pref_win_type = asm.GetType("UnityEditor.PreferencesWindow");
		EditorWindow.GetWindow(pref_win_type, false, "Preferences");
	}
}
```

これでドッキング可能なウィンドウとしてPreferencesウィンドウを開くことができました。やったね！
![002.png](https://qiita-image-store.s3.amazonaws.com/0/43756/621376c3-c564-d293-fd6e-6c1f7d822591.png)
iOSの各種バックアップとKeychainの復元状況を検証


アプリからKeychainに保存したデータがバックアップされているのか確認したかったので総当たりで検証したメモです。
結果から言うと同一デバイス間か異なるデバイス間かで結果が変わります。

# 環境

## デバイス
- iPhone6+ (8.4.1)
- iPhone5 (8.4.1)

## リセット方法

- すべてのコンテンツと設定を消去

# 同一デバイス間で検証

`iPhone6+` -> `iPhone6+`

|復元方法|Keychain|
|---|---|---|
|新しいiPhoneとして設定|データなし|
|iCloudバックアップから復元|復元されている|
|iTunesバックアップから復元|復元されている|
|暗号化されたiTunesバックアップから復元|復元されている|

# 異なるデバイス間で検証

`iPhone5` -> `iPhone6+`

|復元方法|Keychain|
|---|---|---|
|iCloudバックアップから復元|データなし|
|iTunesバックアップから復元|データなし|
|暗号化されたiTunesバックアップから復元|復元されている|

# まとめ

- 機種変だと異なる端末から復元されるパターンになるので注意した方が良い。例えばデータベースのアクセスキーをKeychainに保存しているアプリでアプリをバックアップに含めていた場合に、アプリ内のデータベースは復元されるけどKeychainに保存していたアクセスキーは復元されないパターンがあるのでそうなるとデータベースにアクセスできない状況が起きます。
- 他に未検証なのはiOS9とiTunesで初期化してから復元がありますが、仮に挙動が変わってもKeychainが復元されない場合を想定していれば大丈夫そう。
Mac用のRackサーバ「pow」が便利

[pow](http://pow.cx/)は手軽に使えるRackサーバです。
Rackアプリ、Railsアプリの開発に便利です。

## インストール

```
$ curl get.pow.cx | sh
$ gem install powder
```

powderは必須ではないけど、あると便利です。
むしろすべてpowderコマンドで操作しています。

## 使い方

アプリのフォルダで、コマンドを叩くだけです。

```
$ cd myapp
$ powder link
```

http://myapp.dev でアクセスできます。
`powder open`でブラウザが開きます。

http://myapp.192.168.0.1.xip.io/ でLAN内で共有できます。
192.168.0.1はLAN IPアドレスです。

## よく使うpowderコマンド

```
powder help    # ヘルプ
powder link    # アプリへのリンクを貼る
powder open    # アプリのブラウザが開く
powder restart # 再起動
powder list    # リンクを貼ってあるアプリのリスト
powder remove  # アプリのリンクを削除
```

## 参考

* http://qiita.com/shikataka/items/63959f93df5d2185b2a9
* http://doruby.kbmj.com/oneafter999_on_rails/20141022/Rails_Rack_Pow_
ネットワーク経由でadb実行する

実機でデバッグする時、毎回USB接続するのが面倒くさいと思っていたら便利なツールがあったので覚え書き程度に。

#事前準備
adbコマンドを使うにあたり、初めはPATHが通っていないはずなので使用することができません。
Android Studioを使用している場合、下記からPATHを確認します。
File > Other Settings > Default Project Structure...

<img width="817" alt="スクリーンショット 2016-02-09 0.46.06.png" src="https://qiita-image-store.s3.amazonaws.com/0/100317/aecd3949-8c53-e5cc-ca8d-ad3f0aca6ea0.png">

確認したら、下記コマンドでPATHを通します。

`$export PATH=$PATH:/Users/hamup/Library/Android/sdk/platform-tools`

これでadbコマンドが使えるようになります。
adbコマンドが使えるようになったところで、早速ネットワーク経由でデバッグするための設定をしていきます。

#adb tcpip ポート番号
まずはじめにTCPモードへ切り替えます。設定できるポートは5555〜5585までらしい(?)

`$adb tcpip 5555`
`#restarting in TCP mode port: 5555`

#adb connect 接続したい端末のIPアドレス:ポート番号

次にネットワーク経由で接続したい実機のIPアドレスと設定したポート番号を指定してあげます。
(実機のIPアドレスについてはDHCPから静的な割当に設定しておくと捗るかもしれません。)

`$adb connect 192.168.11.21:5555`
`#connected to 192.168.11.21:5555`

これで接続完了です。
USBを外した状態でもDevice Chooserに表示されていることを確認できます。

<img width="577" alt="スクリーンショット 2016-02-09 1.15.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/100317/b013e30f-b8c5-5acc-af8a-ea046b3335fe.png">

#adb disconnect
切断用のコマンドです。

`$adb disconnect`

#まとめ
USBを接続したままって意外と面倒くさいので、覚えておくと中々に便利そうです。
ほかにもadbコマンドからログの取得やインストール、アンインストールなど
いろいろなことができるそうなので少しずつ覚えていければと思います。
PythonでExcelのCSVファイルを扱う



Pythonの`csv`パッケージは大変便利です。面倒なエスケープ処理をちゃんと行ってくれます。とりわけ、Excelファイルで送られてきたファイルを処理するのに重宝します。なんといっても、`dialect='excel'`でExcel CSVをちゃんと読めます。

ところが、日本語が絡むと問題は途端に厄介になります。問題の本質は何か。まず、ExcelのTSVの扱いに関して、以下のことが知られています。

- Excelのtsvエクスポートはutf-16（BOM付き）である
- Excelが直接読めるのはBOM付きutf-16のtsvである（カンマ区切りはウィザードが必要）
- csv（カンマ区切り）出力や読み込みも可能だがおすすめできない（後述）

このことからわかるのは、BOM付きutf-16ファイルを扱うのが最善ということです。これを扱う一番の方法は、`io`パッケージを使うことです。

```
with io.open(path, encoding='utf-16') as f:
  ...
```

さらっと書きましたが、`io`パッケージを使うのが実は肝です。utf-16はそこそこに扱いにくいフォーマットです。まず、BOMがいます。さらにこの状態で`cr+lf`されると、バイト単位では間に`\0`が挟まるということです。ですので、普通に`open()`を使うと謎の挙動をします。

さてここで問題が起こります。python2系を使っていると、`csv`パッケージは`unicode`をサポートしていません。従って、上の方法で開くと読めません。ここで、日和って`open`を使うと、上記の理由で読むのに苦労します。以前は私はshift-jisのcsvでエクスポートしていたんですが、Excelは内部的にUnicodeのようで、濁点が別文字になった正規化されてない状態のことがあり、このときshift-jis出力したら濁点が全部消失しました。なのでこの方法もおすすめしません。

実はUnicodeを`csv`で読む方法は、[マニュアルの最後](https://github.com/unnonouno/excelcsv)に書いてあります。正解は、`unicode`のストリームを一旦utf-8にエンコードして、この状態で`csv`パッケージで読ませて、スプリットしたら再度utf-8をデコードすればよいのです。書き込む時も同じで、いったん`unicode`をutf-8にして`StringIO`に書き込んで、ファイルに吐き出す直前で再度`unicode`に変換すればいいのです。圧倒的に2度手間ですが、長年Excelと格闘して最終的に一番安定した出力が得られませいた。ちなみに、Python3では`csv`パッケージが`str`（2で言うところの`unicode`）をサポートしたので、もはや普通に`io`で開いて処理すればいいです。

流石にこれらの処理を毎回書いていると日が暮れるので、ライブラリにしました。

https://github.com/unnonouno/excelcsv

上記の問題を全て回避しています、たぶん。

# やってはいけないこと

以上が全てですが、おさらい的にやってはいけないことと理由を羅列してみましょう。

## 要素ごとにutf-16でencode

`.encode('utf-16')`はBOM付きutf-16文字列を生成します。ここが、その他のエンコードとの決定的な違いです。

```
>>> u'a'.encode('utf-16')
'\xff\xfea\x00'
```

`[x.encode('utf-16') for x in row]`の様なコードを書くと、アチラコチラにBOMが入った謎の文字列が生成されしまいます。このアプローチはダメです。ファイルの先頭にだけBOMが入るようにしないといけません。
これを回避する一番よい方法は、原則的に`unicode`で扱って、ファイル出力の部分で制御することです。これをやってくれるのが`io`パッケージであり、通常の`open`を使って自前でエンコードするべきではありません。
別の回避策として、一旦`StringIO`にutf-8で出力しておいて、ファイルに書き込む前に全体を`unicode`に変換してから、再度utf-16に変換し直すという方法もあります。が、`io`を使ったほうがすっきりします。

## openで開いてパースしてからデコード

utf-16ということは、パースしたい改行文字やタブ文字も2バイトで書かれているということです。1バイト単位で処理するPython2の`csv`パッケージに処理させると、不要な`\0`文字が残ってしまいます。このアプローチが使えるのは、Ascii文字がそのまま残っているutf-8やshift-jisなどだけです。

## shift-jisのcsvでエクスポートしてから読み込み

エクセルは内部的にはUnicodeでデータを持っているようです。最悪なのは、濁点が別文字として保存されていることがあり、この状態でshift-jisでエクスポートすると、濁点が全部消えます。正規化してくれればいいのに。そのため、excelからのエクスポートはutf-16テキスト一択になります。扱いづらいですがしかたありません。
UE4チュートリアル成果物集積所

UMGをやりたかった。１～４をやった。
[![UE4 Test1](http://img.youtube.com/vi/eyKOyZhZboE/0.jpg)](http://www.youtube.com/watch?v=eyKOyZhZboE)

チュートリアル終わってスタートしたらクリックでバシュンバシュンうるさいなと思ったら
ゲーム用のレベル内でタイトル表示してた。

タイトル用のレベルを作ってレベルブループリントを作るって部分がチュートリアルの日本語訳だと抜けてるっぽいので注意。


＜追記（2016/02/10）＞
５もやりました。
[![UE4 Test2](http://img.youtube.com/vi/ghC1wLnFrtE/0.jpg)](http://www.youtube.com/watch?v=ghC1wLnFrtE)
MNISTの学習用画像を見てみよう！（１）

# MNISTファイルの入手
MNISTの手書き画像データは下記のサイトで手に入れることができる。
> [THE MNIST DATABASE of handwritten digits](http://yann.lecun.com/exdb/mnist/)

そこでは４つのgzipファイルを解凍すると下記のファイルを入手することができるらしい…。

- *train-images-idx3-ubyte*
→学習用画像
- *train-labels-idx1-ubyte*
→学習用画像のラベル
- *t10k-images-idx3-ubyte*
→テスト用画像
- *t10k-labels-idx1-ubyte*
→テスト用画像のラベル

## 学習用画像のファイル形式
 TRAINING SET IMAGE FILE (train-images-idx3-ubyte):
[offset] [type]          [value]          [description]
0000     32 bit integer  0x00000803(2051) magic number
0004     32 bit integer  60000            number of images
0008     32 bit integer  28               number of rows
0012     32 bit integer  28               number of columns
0016     unsigned byte   ??               pixel
0017     unsigned byte   ??               pixel
........
xxxx     unsigned byte   ??               pixel

Pixels are organized row-wise. Pixel values are 0 to 255. 0 means background (white), 255 means foreground (black).

### 学習用画像ファイル形式を確認してみる
上記のようなファイル形式になっているらしいので、実際に学習用画像ファイルの16バイト目まで見てみよ～。

```c:look-train-images.c
#include <stdio.h>
#include <stdlib.h>
// 学習用画像ファイルがビッグエンディアンで保存されてるため
// １バイトより大きいサイズのデータは一時格納用配列の中身は
// リトルエンディアンで格納しint型変数にはビッグエンディアン
// で格納する


void get_images_info(FILE *, int*);
// 画像の情報を取得する関数
// 引数：取得したい情報源のファイルポインタ
//       取得したい情報を保持する変数のアドレス
// 戻り値：なし

void get_images_info(FILE *fp, int *info){
	int count; // カウンター
	int status; // fread関数の戻り値 
	// 一時格納用配列(リトルエンディアンで保持)
	char buff[4];
	// １バイトずつ取得
	for(count=0;count<4;count++){
		status=fread( (char *)&buff[count],1,sizeof(char),fp);
		if(status < sizeof(char)){
			printf("Reading Error\n"); // 読み込みエラー
			exit(2);
		}
	}

	//	一時格納用配列の中身(リトルエンディアン)をint型変数(ビッグエンディアン)に格納
	*info = buff[0];
	for(count=1;count<4;count++){
		*info <<= 8;
		*info += buff[count];
	}
}



int main(void){
	FILE *train_images_fp;	//　学習用画像ファイルのポインタ	

	// int型変数(ビッグエンディアンで保持）
	int magic_number;
	int number_of_images;
	int number_of_rows;
	int number_of_columns;
	

	// 学習用画像ファイルを開く
	train_images_fp=fopen("train-images-idx3-ubyte","rb");
	if(train_images_fp == NULL){
		printf("Cannot open the train-images-idx3-ubyte\n"); // オープンエラー
		exit(1);
	}


	// 画像の情報を取得
	get_images_info(train_images_fp, &magic_number);
	get_images_info(train_images_fp, &number_of_images);
	get_images_info(train_images_fp, &number_of_rows);
	get_images_info(train_images_fp, &number_of_columns);


	//	データの表示
	printf("magic_number :0x%x\n",magic_number);
	printf("number_of_images :%d\n",number_of_images);
	printf("number_of_rows :%d\n",number_of_rows);
	printf("number_of_columns :%d\n",number_of_columns);
	
	
	//	ファイルを閉じる
	if(fclose(train_images_fp) != 0){
		printf("Cannot close the rain-images-idx3-ubyte\n");
	}

	return 0;
}

```
#### 結果
***
magic_number :0x803
number_of_images :60000
number_of_rows :28
number_of_columns :28
***
上記で示したファイル形式と同じ値がしっかり出ている!!!

##### 次回
では、次回はGUN **Octave**を使って実際に学習用画像を見てみる。
MacOSX El Capitan で動画ファイル(.mov)をアニメーションGIFに変換するには

## 実現したいこと

MacOSX El Capitan でMOVファイルをアニメーションGIFに変換したい

## 実現方法および解決方法

ffmpegで静止画としてGIFに変換し、作成されたGIFファイルをgifsicleを利用して、コマンドラインでMOVファイルをアニメーションGIFに変換する。

## 実行コマンド

アニメーションGIFの変換に必要なソフトウェアをインストールする

```
brew install ffmpeg gifsicle
```

アニメーションGIFに変換する

```
# フル画質 / メモリ消費警告がでる
ffmpeg -i result_cmd_vim.mov -pix_fmt rgb24 -r 10 -f gif - | gifsicle --delay=3 --optimize=3 > output01.gif
```

```
# 800x600 サイズに固定する場合
$ ffmpeg -i result_cmd_vim.mov -s 800x600 -pix_fmt rgb24 -r 10 -f gif - | gifsicle --delay=3 --optimize=3 > output02.gif
```


## 情報源

http://tnakamura.hatenablog.com/entry/2014/08/04/113000

## 補足

下記は、QuickTimePlayerでデスクトップを録画した MOVファイルをアニメーションGIFに変換したものです。

![output01.gif](https://qiita-image-store.s3.amazonaws.com/0/49795/4f7cb596-13b3-736f-662d-42271e240dd9.gif)
root権限でのスクリプト実行を強制したい

root権限が必要な以下のようなスクリプトを一般ユーザーでそのまま夜間バッチ実行して悲しい思いをしたので、そもそもroot権限なしでスクリプトを実行できなくする。

```bash:hoge.sh
#!/bin/bash

_hoge() { # 一般ユーザでも実行できる時間のかかる処理 }

_need_root_permission() {
  sudo hoge # ここでパスワードを聞かれる -> 止まる -> つらい
}

_main() {
  _hoge
  _need_root_permission  
}

_main
```

以下のようにする。

```bash:実行権限と所有者の変更
$ chmod 700 /path/to/hoge.sh
$ sudo chown root /path/to/hoge.sh
# -> -rwx------ root user  hoge.sh
```

※セキュリティとか環境変数とか余計なコマンドまでrootで実行されて危険とかは別途考慮すること

# 参考
[linux - Can I make a script always execute as root? - Super User](http://superuser.com/questions/440363/can-i-make-a-script-always-execute-as-root)
cloud9でphpMyAdminをインストールして利用する

#前提
workspaceにMySQLがインストールされており、起動中であること。

#手順
1. インストールコマンドを実行する。
```$ phpmyadmin-ctl install```

1. インストールが実行され以下のログが出力されるので、URLとusernameを記録する。 ※usernameはcloud9のアカウントと同じ。

```
Starting installation
Starting MySQL
 * Starting MySQL database server mysqld
   ...done.

Configuring database
Starting apache
 * Restarting web server apache2
   ...done.

PHPMyAdmin Installation complete. You can log in at:
https://xxxx.c9users.io/phpmyadmin with the following username (and blank password):

       Username: hoge
```
cloud9でcakePHP3ベースのプロジェクトを作る

# 事前準備
cloud9でワークスペースを作成する。その際、PHP+Apache+MySQLのテンプレートを選択する。

#cakePHPをComposer経由でセットアップする
1. 以下のコマンドを実行しCoposerのインストールを行う。
```$ curl -sS https://getcomposer.org/installer | php```

1. ワークスペースに作成されたcomposer.pharを以下のコマンドを実行して移動する。
```$ mv composer.phar /usr/local/bin/composer```

1. 以下のコマンドを実行し任意のプロジェクト名でcakePHPベースのプロジェクトを作成する。
```$ composer create-project cakephp/app {$任意のプロジェクト名};```

1. 以下のURLにアクセスし、cakePHPのデフォルトページが表示されるかを確認する。
```https://{$ワークスペース名}-{$c9アカウント名}-1.c9users.io/{$プロジェクト名}/```

# cakePHPのデータベース設定を行う
cakePHPをセットアップした直後は、データベースの接続に失敗したというメッセージが、デフォルトページに表示される。これを解消するために以下の通りファイルを変更する。

1. `/config/app.php`を開く。※cakePHP2以前とはDB設定の記述先が異なる

1. 211行目辺りにDatasourcesという配列があるので、そのなかの特定のキーを変更する。
    1. `'host' => getenv('IP'),` hostの値をIPを引数としたgetenv()で取得する。
    1. `'username' => getenv('C9_USER'),`usernameの値をDB名_USERを引数としたgetenv()で取得する。
    2. `'database' => 'hoge',`databaseの値を接続先のDB名に変更する。

1. ファイルを保存する。
サクラエディタ用スネークケース＆キャメルケース変換マクロ

#はじめに
試しに、テストで投稿してみる。
※2016年4月8日　そもそも動かなかったため、他の対応含めて修正。
 2016年7月27日 またも変な動きしてたのに気づかなかったのでとりあえず修正。。。

スネークケース＆キャメルケースの変換マクロについてです。
※サクラエディタ用のマクロのため、他のエディタでは使用出来ません。

#使い方
1. 範囲外の場合は選択行の文字、範囲選択されていれば範囲の文字を取得する。
2.  `_`があればスネークケースに変換。`_`がなければキャメルケースに変換。→複数行の場合、_があればキャメルケース変換が優先となります。
3. 変換後の値をエディタに返す。(選択されていれば選択範囲に。選択外の場合は選択行に返す。）
4. 複数行ある場合でも対応可能とした。→その際は、改行コードは一律CRLFに変換される。
5. キャメルケースに変換する際、デフォルトを先頭大文字変換とした。
   先頭小文字にしたいときは先頭をタブを入れるかスペース等で可能。
   ただし、Snakeケースに変換掛けた時に先頭にスペースまたはタブが含まれる場合は正しく変換はされないので注意。(先頭タブと文字の間に`_`が入ってしまう。)

#ソース

```lang:SnakeAndCamelChange.js
var ParamStrChange = (function () 
{
    function ParamStrChange() 
    {
        this.resultStr = "";
        if (Editor.IsTextSelected() == 0) {
            this.lineStr = Editor.GetLineStr(0);
        }
        else {
            this.lineStr = Editor.GetSelectedString(0);
        }
        if (this.lineStr.length != 0) 
        {
            if (this.lineStr.indexOf("_") == - 1) {
                this.ChangeCamel();
            }
            else {
                this.ChangeToSnake();
            }
        }
        if (Editor.IsTextSelected() == 0) {
            Editor.SelectLine(0);
            Editor.InsText(this.resultStr);
        }
        else {
            Editor.InsText(this.resultStr);
        }
    }
    ParamStrChange.prototype.ChangeToSnake = function () 
    {
        var splitStr = this.lineStr.split("_");
        var strResult = "";
        for (var i = 0; i < splitStr.length; i++) 
        {
            if (splitStr[i] != "" && splitStr[i] != null && typeof splitStr[i] !== "undefined") 
            {
                var head = splitStr[i].substring(0, 1).toUpperCase();
                var inner = splitStr[i].substring(1, (splitStr[i].length)).toLowerCase();
                strResult += head + inner;
            }
        }
        //複数行の場合
        if(strResult.indexOf("\r\n") > -1){
            var list = strResult.split(/[\r\n]+/);
            for(var i=0;i < list.length;i++){
                this.resultStr += list[i].substring(0, 1).toUpperCase() + list[i].substring(1) + "\r\n";
            }
        }else{
            this.resultStr = strResult;
        }
    };
    ParamStrChange.prototype.ChangeCamel = function () 
    {
        var tmp = this.lineStr.substring(0, 1) + this.lineStr.substring(1).replace(/([A-Z])/g, "_$1");
        
        
       if(tmp.indexOf("\r\n") > -1){
            var list = tmp.split(/[\r\n]+/);
            tmp = "";
            //複数行の場合
            for(var i=0;i < list.length;i++){
                if(i==0 || list[i].indexOf("_") != 0){
                    tmp += list[i] + "\r\n";
                }else{
                    tmp += list[i].substring(1) + "\r\n";
                }
            }
       }
        
        this.resultStr = tmp.toUpperCase();
    };
    return ParamStrChange;
})();
new ParamStrChange();
```

#最後に

サクラエディタでマクロ登録方法はとりあえず割愛します。
サクラエディタ上で、適当なショートカットキーに割り当てれば面倒が減ります。
(3年前に作って今日動かしてみて。若干気に入らない部分がそこそこありますがとりあえず放置。)→2016/4/8 気に入らない部分は修正済。
[Chrome拡張]gulpでpackage.jsonのバージョン番号をminifest.jsonにコピーする


## manifest.json とは

- manifest.json とは、Chrome拡張機能やChromeアプリのメタ情報をChromeや、Chrome Web Storeに伝えるために拡張機能のパッケージに含めておくJSONファイルです
- 拡張機能のバージョン情報を手動で設定するには、manifest.json にバージョン情報を記載します

https://developer.chrome.com/extensions/manifest

## package.json

- Chrome拡張機能は、Webアプリですから、package.jsonも入っているかと思います
- マメな人は、package.jsonの方のバージョン情報も更新しているのではと思います

## 本題

- それぞれのファイルにバージョン情報が入っているなら、一元化してしまえばいいじゃん、というのがきっかけです
   - もちろん、Chrome拡張機能のバージョンと、npmパッケージとしてのバージョンは別々にしたいという場合は、それぞれ管理でいいです

### 手順

package.json にはこれまで通り、バージョン情報を記載します。

```JSON:package.json
  "version": "1.1.5",
```

manifest.json には、以下のように`{{VERSION}}` (何でもいいのですが) というプレイスホルダを記載します。

```JSON:src/manifest.json
   "version": "{{VERSION}}",
```

そして、Gulpでビルド・パッケージングを行う際に、以下のようにパラメータの置換を定義しておけばokです。

```JavaScript:gulpfile.js
var gulp = require('gulp');
var pkg = require('./package.json');

gulp.task('config', function() {
   gulp.src('./src/**/*.json')
      .pipe(replace('{{VERSION}}', pkg.version))
      .pipe(gulp.dest('./dist'));
   console.log('config file copied.');
});
```
Raspberry Pi をMacでセットアップ忘備録 １ - 初期設定

Raspberry PiのiMacを利用したセットアップ忘備録です。

1.  [初期設定](http://qiita.com/PonDad/items/bfb1cc6ddc18ccf08208) <<
2. [無線LANと接続](http://qiita.com/PonDad/items/c0f559962d4108774424) 
3. [SFTPと接続](http://qiita.com/PonDad/items/516e0ef5295f47228a5c) 
4. [USBスピーカーと接続](http://qiita.com/PonDad/items/80fb3abebb5adaa7888d)
5. [USBマイクと接続](http://qiita.com/PonDad/items/565f816dc1ebcbe2467e) 
6. [VNCでリモートデスクトップ](http://qiita.com/PonDad/items/232f1aacbef2c4fcb746) 

## 環境

- iMac Late 2013 （OSX 10.11.3）
- Raspberry Pi2 ModelB （raspbian-wheezy）

Raspberry PiのOSは最新版のraspbian-jessieが`apt-get`した際にエラーが発生したのでraspbian-wheezyを使用。

マイクロSDカードへイメージの書き込みは2~30分ほど。

```bash:ssh
$ sudo dd bs=1m if=/Users/my_mac/Desktop/2015-05-05-wheezy-raspbian.img of=/dev/disk1
```

## iMacをRaspberry Piのルーターにする

iMacの「システム環境設定」>「共有」>「インターネット共有」で「共有する接続経路」を「Wifi」に、相手のコンピューターでのポートを「Ethernet」で選択する。

これでiMacがRaspberry Piのルーターになる。

```bash:ssh
$ cat /var/log/system.log | grep OFFER
```

でiMacが発行したRaspberry PiのIPアドレス（192.168.X.X）が分かる。
（これはあくまでiMacの発行したIPアドレスなので、実際のルーターが発行するものとは異なる）

## SSHでRaspberry Piにログインする

ターミナルを開き以下のコマンドを入力。

```bash:ssh
$ ssh pi@192.168.X.X
```

ユーザー名とパスワードはデフォルトの「pi」「raspberry」でログイン。ラズベリーの「p」の入れ忘れに注意。

```bash:ssh
pi@raspberrypi ~ $
```

の表示が出るのでRaspberry PiにSSHで接続される。

```bash:ssh
$ sudo raspi-config
```

で初期設定をして完了。

## 参考にさせていただきました

[ラズベリーパイ(B+)を購入！Macbookと連携して開封から初期設定までやってみた！](http://masatolan.com/raspberry-pi/raspberry-pi-basic/)

[SSH でログイン（初回篇）](http://support.tetrastyle.net/ssh-login/)
FlashからChatWorkにメッセージを投稿

FlashがChatWork APIを使えるのか試してみました。

#ChatWork APIとは？
[公式サイト](http://developer.chatwork.com/ja/index.html)に詳しいことが書いてあります。

>チャットワークAPIを使えば、メッセージ送信やタスク追加などといった、チャットワークの機能を外部のプログラムから簡単に使用することができるようになります。

利用するには[API発行](http://developer.chatwork.com/ja/authenticate.html)が必要です。
開発用のAPIトークンを手に入れたら、Flashと連携させます。

#FlashからChatWorkにメッセージ投稿

[APIドキュメント](http://developer.chatwork.com/ja/endpoints.html)を見ながら、ChatWork投稿機能を実装しました。

試しに、Testと投稿します。

```lang:
public static const CHATWORK_TOKEN:String = "ここにAPIトークンを記述します。";
public static const ROOM_ID:String = "ここに投稿したいチャットのIDを記述します";
```

```lang:
var url:String = "https://api.chatwork.com/v1/rooms/" + ROOM_ID + "/messages";

var request:URLRequest = new URLRequest(url);
// 必ず一番初めにAPIトークンをセットすること
request.requestHeaders = [new URLRequestHeader("X-ChatWorkToken", CHATWORK_TOKEN)];
request.method = URLRequestMethod.POST;
// 投稿する内容を記載
var urlVariables:URLVariables = new URLVariables("body=Test");
request.data = urlVariables;
			
var urlLoader:URLLoader = new URLLoader();
urlLoader.addEventListener( Event.COMPLETE, httpRequestComplete ); 
urlLoader.addEventListener( IOErrorEvent.IO_ERROR, httpRequestError ); 
// 成功すれば投稿完了
urlLoader.load(request);
```

以下のように表示されれば成功です！
![スクリーンショット 2016-02-08 23.08.27.png](https://qiita-image-store.s3.amazonaws.com/0/104377/487dd65e-11c9-960c-6194-f92139046303.png)

これだけでChatWorkに投稿できます。非常に簡単です。
[Eclipseプラグイン開発] プラグインのエクスポート用Antスクリプト


# 目的

- Eclipse プラグインのエクスポート用のAntスクリプトについてのメモ
- 覚え書き的 tips
- Eclipse 4.4～4.5で確認

# まとめ

- Export時に「Options」タブでAntスクリプトを保存する
- スクリプト名は `build.xml` 以外にする必要がある
- いくつか保存されない項目がある
- JREはワークスペースと同じ環境を使うようにする
- エクスポートは非同期に実行される

# Antスクリプトの作成方法

Eclipseプラグインをプラグイン形式のjarにパッケージする場合、通常はExport機能を使います。

- 「File」メニューから「Export...」、あるいは
- プロジェクトを右クリックして「Export...」

しかし、Antスクリプトを用いてエクスポートすることも可能です。

- まずは通常通りExport機能を実行
- エクスポートの種類として「Deployable plug-ins and fragments」を選ぶ
- 各種、必要な設定をする
- 「Options」タブで「Save as Ant script」にチェックを入れる
- 保存するAntスクリプトファイル名を指定する。このとき、ファイル名が `build.xml` だとエラーが出るので、別の名前にしてください( `build_plugin.xml` とか)。

保存されたスクリプトのファイルパスなどを適当に修正すれば、とりあえずOKです。

# Antスクリプトの実行方法

保存・編集したAntスクリプトを実行する際には、ワークスペース(Eclipse本体)と同じJREを使うようにしてください。

具体的には、Run Configuration で「JRE」タブを開き「Run in the sae JRE as the workspace」を選択してください。

Antスクリプトを実行すると、Antのタスクはすぐに終了しますが、少ししたら Eclipse のエクスポートジョブが起動します。
AntからはEclipseのエクスポートジョブをキックしているだけのようです。

# 保存されない項目

上記方法で、ほとんどの場合問題ないと思います。
しかし、エクスポート時に指定した項目がいくつか（少なくとも１つ）Antスクリプトに保存されないようでした。

具体的にはExport時に「Options」タブで「Allow for binary cycles in target platform」にチェックを入れていても、Antスクリプトに反映されていないようです（他にもあるかもしれませんが）。

プラグイン開発用のプラグイン(PDE)のソースを確認したところ、Antスクリプトは `org.eclipse.pde.ui` プラグインの中の `org.eclipse.pde.internal.ui.wizards.exports.PluginExportWizard` で生成しているようですが、確かに保存していないようです。

実際のエクスポート処理の方を見てみたところ、Antスクリプトの `pde.exportPlugins` 要素に `allowBinaryCycles` 属性とboolean値( `true` )を指定すれば上手くいくようです。

```xml:build_plugin.xml
<?xml version="1.0" encoding="UTF-8"?>
<project default="plugin_export" name="build">
	<!-- プラグインエクスポート用build.xml -->
	<!-- JRE は "Run in the same JRE as the workspace" を選択 -->
	<!-- エクスポート自体は非同期で動作するので注意！ -->
	<target name="plugin_export">
		<pde.exportPlugins
			destination="."
			exportSource="false"
			exportType="directory"
			plugins="com.example.plugin"
			allowBinaryCycles="true"
			useJARFormat="true"/>
	</target>
</project>
```
http proxyが効いていないと思ったら

# 確実に失敗するケースでテストする

``127.0.0.1:9999``等の動かないことがわかっているproxyを設定してみる。それでもスクリプトが動く場合は、そもそもproxyの設定方法が間違っている可能性大。

- htttpになってませんか？
- Proxyのホスト名が間違ってませんか？
- ポート番号はあっていますか？

イントラネットとSTG環境ではネットワークポリシーが違う場合もあるので、ローカルで動いたからといってSTG環境でも動くとは限りません。同じ環境でテストするのが大事。

## 大文字小文字

大文字もしくは、小文字じゃないと認識しない場合があるので、両方設定してみる。

```shell-session
$ export http_proxy=http://example.com:8080
$ export HTTP_PROXY=http://example.com:8080
```

## HTTPS

httpsじゃないと認識しない場合があるので、https_proxyとして設定してみる。

```shell-session
$ export https_proxy=http://example.com:8080
$ export HTTPS_PROXY=http://example.com:8080
```

## NO_PROXY

Proxy対象外のNO_PROXYに、登録されている場合があるので解除してみる。

```shell-session
$ unset NO_PROXY
$ unset no_proxy
```

## Javaの場合

独自のオプションとして渡さないと認識しない場合があるので、JAVA_OPTSとして設定してみる。

```shell-session
$ export JAVA_OPTS="-DproxyHost=example.com -DproxyPort=8080"
```

## その他

"コマンド名 proxy" でググれば、だいたい見つかります。
CSSボタンのグレースケール


メモ

```sass
.btn-hover {
    filter:         grayscale(0%) blur(0px);
    -webkit-filter: grayscale(0%) blur(0px);
    -moz-filter:    grayscale(0%) blur(0px);
    -o-filter:      grayscale(0%) blur(0px);
    -ms-filter:     grayscale(0%) blur(0px);
    transition:         -webkit-filter 0.15s;
    -webkit-transition: -webkit-filter 0.15s;
    -moz-transition:    -webkit-filter 0.15s;
    -o-transition:      -webkit-filter 0.15s;
    -ms-transition:     -webkit-filter 0.15s;

    &:hover {

        filter:         grayscale(100%);
        -webkit-filter: grayscale(100%);
        -moz-filter:    grayscale(100%);
        -o-filter:      grayscale(100%);
        -ms-filter:     grayscale(100%);

    }
}
```



## ついでに ボタンのdisable

```sass

.btn {
    -webkit-filter: brightness(60%);
}


```
「Toro: RecyclerViewのスクロールに対してビデオを自動再生・中止するライブラリ」を作りました

## TL,DR:

ソースコードと仕様がここからアクセスできますから、是非楽しんでください

> [https://github.com/eneim/Toro](https://github.com/eneim/Toro)

## WHY? なぜ？

#### モチベーション

FacebookやTwitterさんがやっているからなんとかやりたいね

#### ライブラリの性能一覧、あるいはやりたいこと（案）

- メインな草案

	- スクロールが止まったら、自動再生をトリガーする。
	- ビデオがスクリーンの中に「綺麗」に見えないと再生しない
		- 「綺麗」という基準がなんとか人間で決められるもの
- 拡張機能
	- 再生時刻のキャッシュや復元
	- 長押しで、なんとかする
	- 簡単なリストだけでなく、グリッドもサポートする（ビデオ数が多いと、配置がさらに複雑な違い）
	- 「再生戦略」というものを使用して、再生しかたを決める
	- 「再生ライフサイクル」を定義し、なんとか使えるようにする
	- 。。。（実装しながら考える）

以上の機能を頭の中に置いて、なんとかします。

## HOW? どう実装すた?

初心者のようなコードでToroを書きました。詳しくは、

> [https://github.com/eneim/Toro](https://github.com/eneim/Toro)

で確認ください

だいたい、Interface design patternっぽい仕組みで、コア部分を定義し、Toroという神様クラスでつなぐ。あとはカスタマイズViewやViewHolderなどを用意しました。

一応RepoのWikiをご覧ください

## WHAT? 作ったものの姿

もう一回、
> [https://github.com/eneim/Toro](https://github.com/eneim/Toro)

の使用やWiki確認ください。

Toro in action が次のようになります。Repo内にサンプルアプリがありますので、確認してみてください

Sample 1: Vertical linear RecyclerView with one Video

> ![Sample 1: Vertical linear RecyclerView with one Video](https://raw.githubusercontent.com/eneim/Toro/master/art/sample_1.gif)

Sample 2: Vertical staggered RecyclerView with items are Videos

> ![Sample 2](https://raw.githubusercontent.com/eneim/Toro/master/art/sample_2.gif)

Sample 3: Vertical staggered RecyclerView with items are Videos - Long press enabled (基本的、横にすると長押しが有効になります)

> ![Sample 3](https://raw.githubusercontent.com/eneim/Toro/master/art/sample_3.gif)

Sample 4: Vertical Grid RecyclerView with multiple type of ViewHolder

> ![Sample 4](https://raw.githubusercontent.com/eneim/Toro/master/art/sample_4.gif)

Sample 5: Overall visual, sample with 2 RecyclerViews, one Horizontal and one Vertical Staggered with a long portrait Video. Long press enabled for Horizontal RecyclerView

> ![Sample 5](https://raw.githubusercontent.com/eneim/Toro/master/art/sample_5.gif)

## まとめ

一応紹介が以上となります。なんとかissueがあれば、ぜひあげてください。利用することになる方もフィードバックをよろしくお願いします。
電子工作 > SNS-MQ135 到着

http://qiita.com/erukiti/items/1d9658f7c363e79d051b
で紹介されていた空気質センサ SNS-MQ135 が到着した。

## 5V電源の用意

上記のリンクの回路図を見るとSNS-MQ135は5VのVccだった。手持ちのもので5Vのものといえば以下のものを持っていた。

- Zynq用に購入した5Vアダプタ
  - 2.1mm DCジャックのコネクタ
- USBポータブルバッテリー
  - microUSBコネクタ

そして、Pi Zeroコンテスト向けにモック作成しようとして、なんとなく買っておいたmicroUSBコネクタがあったので、USBポータブルバッテリーから5Vを取ることにした。

さらに、そこから三端子レギュレータを通して、ESP8266用の3.3Vを作成しようということにした。
http://qiita.com/7of9/items/eebf2bb5a32d1ed4f510
の回路にSNS-MQ135のVcc接続用コネクタを追加した。


## 写真

以下のようになった。

microUSBコネクタへのピンのハンダ付部分は脆弱に思えたため、コネクタ自身を基板にはんだづけした。さらに、リード線の自由度が高いと、ハンダ付け部分が取れるため（実際に一回取れた）、写真のようにビニルテープで固定している（恒久対策ではない）。

![DSC_0063.JPG](https://qiita-image-store.s3.amazonaws.com/0/32870/f63dea66-492e-be64-d169-2fcf5b7c1c67.jpeg)

USBからの電源を取ることの安全性はしっかり理解していないので、連続試験などに使うことは今のところ考えていない。ちょっとした動作確認程度で使おうと思う。

## 回路

とりあえず0-5V出力をデジボルで確認した。

SNS-MQ135は4つの端子があり、写真の左から

1. Vcc : 5V
2. GND 
3. 未接続
4. AD : 22kをGNDへ落として、黄色のジャンパワイヤを出してデジボルに接続

![DSC_0064.JPG](https://qiita-image-store.s3.amazonaws.com/0/32870/9103d597-dea8-f4e1-b7ae-3bcd67aeaf91.jpeg)

抵抗値22kは[Davide Gironi](http://davidegironi.blogspot.fr/2014/01/cheap-co2-meter-using-mq135-sensor-with.html#.VriWArmLRfB)のブログの回路図を参考にした。

デジボルの値は 183mV程度を指示しており、息を吹きかけると270mVくらいになった。
(0-5Vレンジに対して電圧が低い気がするが、気のせいだろうか。)

ESP8266で取り込んでI2Cキャラクタディスプレイでの表示を目指している。


<hr>
(追記 2016/02/09)

## 回路図 @ upverter

upverterに回路図を追加した。

https://upverter.com/eda/#tool=schematic,designId=176ba6a2f9665138


## 電源
(追記 2016/02/09)

USBからの電源供給はデジボルで5.27Vだった。

[SNS-MQ135のデータシート](https://www.olimex.com/Products/Components/Sensors/SNS-MQ135/resources/SNS-MQ135.pdf)では Vc は 5.0±0.1V だった。

定格で使えないので、電源はやはり再検討しないといけない。

(追記 2016/02/13)
>Zynq用に購入した5Vアダプタ

電圧を測ると 5.27 Vだった。
AWS Elastic Beanstalk、Nginx + Passenger (standalone)の環境設定

# 経緯

AWSのElasticBeanstalk（以下EB）を使って、Railsをデプロイする。
Nginxの設定を追加しようと思い、nginx.confファイルを変更してみても全然うまくいかない。どころか、まったく反映されず、エラーも出ない。ハマってしまったので、nginxの設定をする場合の方法をまとめてみた。

# 環境

`$ eb init`で色々と初期設定をしますが、選んだのはNginx + Passengerです。
`Ruby 2.2 (Passenger Standalone)`

すっかり見逃してたのですが、Passengerは__standalone__のものでした。

# 失敗

`/etc/nginx/nginx.conf`を変更して、Nginxをリスタートすれば良いだろうと思っていたのですが、これではうまく行きません。

なぜなら、__standalone__だから…。（これに気付くまで、何度も.ebextentionsにファイルを書いてデプロイして、かなり無駄な時間を費やしました）

# Passenger (Standalone)の設定方法を調べる

standaloneを調べます。

![概念図](https://www.phusionpassenger.com/library/walkthroughs/basics/shared/integration_modes-d91b947d.png)

ソース：https://www.phusionpassenger.com/library/indepth/integration_modes.html

Nginxはリバースプロキシだけなのかと思いきや、Passenger側がコントロールしてる（？）ようです。
__nginxのconfファイルを指定してpassengerを起動__できます。

```
$ passenger start --nginx-config-template nginx.conf.erb
```

https://www.phusionpassenger.com/library/config/standalone/intro.html#nginx-configuration-template

で、このpassenger用のconfig.erbファイルがあるのですが、AWS-EBが使用するのは別のファイルでした。

# AWS-EBのPassenger (standalone)用のnginx_configファイル

調べたところ、このnginx_config_healthd.erb を使用しているようです。

```bash
# etc/init.d/passenger
if [ -d /etc/healthd ]; then
    STARTOPTS="--nginx-version $EB_NGINX_VERSION --nginx-config-template $EB_SUPPORT_DIR/conf/nginx_config_healthd.erb"
else
    STARTOPTS="--nginx-version $EB_NGINX_VERSION --nginx-config-template $EB_SUPPORT_DIR/conf/nginx_config.erb"
fi
```

実際の場所は、`/opt/elasticbeanstalk/support/conf/nginx_config_healthd.erb`にあります。

なので、このファイルを.ebextensionsで変更するようにして上げればうまく行きました。

# .ebextensions の設定例

.ebextensions内に.configファイルを作成してあげます。

```yaml
files:
    "/opt/elasticbeanstalk/hooks/appdeploy/post/99_restart_app_server.sh" :
        mode: "000777"
        owner: root
        group: root
        content: |
            #!/usr/bin/env bash
            service passenger restart
    "/opt/elasticbeanstalk/support/conf/nginx_config_healthd.erb" :
        mode: "000644"
        owner: root
        group: root
        content: |
            （nginxの設定内容を記述）
```

上の方のファイルは、passengerの再起動をさせるファイルです。appdeployのpost（後）に実行されます。
下のファイルがnginxの設定ファイルです。中身は元のnginx_config_healthd.erbを参考にしてください。

これで`$ eb deploy`すれば、うまく行くと思います！
（ほかに良い方法があればコメントもらえると嬉しいです）
Etherpad-liteをWindowsにインストールしてサービス化してみた (メモ帳なんてもういらない)

# 背景
何かと便利なEtherpad-liteですが、ネットが無い状態では使えないのが玉にきずです。そこで、「ネットがなければローカルにサーバ立てればいいじゃない」ということで、Etherpad-liteをWindowsにサービスとしてインストールします。ブラウザのブックマークに`http://localhost:9001`を入れておけば、メモ帳の代わりとして、Etherpad-liteのプラグインも含むいろんな機能が使えます。サービス化にはNSSMを使います。バックエンドのDBはsqlite3を使います。
使用するソフトウェアのバージョンは次の通りです。たぶん他のバージョンでも同じ手順で大丈夫です。
* OS: Windows7(64bit)
* etherpad-lite-win: 1.5.7 (etherpad-lite-win-1.5.7-83597562c1.zip)
* node.js: v0.10.25
* NSSM: 2.24

# 大まかな流れ
* node.jsのインストール
* etherpad-liteのインストール
* sqlite3のインストール＆etherpad-liteの設定
* サービス化

# 具体的な手順
## node.jsのインストール
node.jsのインストーラをダウンロードして起動します。特筆することありません。

## etherpad-liteのインストール
Windows用のzipをダウンロードして展開します。展開先のパス名が長いと、中のファイルがパス名長さの制限に引っ掛かる場合があるので、パス名の長さには注意しましょう。「C:\Program Files (opt)\etherpad-lite-win」くらいなら大丈夫です。

次に、node.jsのインストール先フォルダ(C:\Program Files\nodejs)の内容をetherpad-liteフォルダに上書きします。
具体的には、node.exeをnodejs側からetherpad-lite-win側に上書きコピー。node_modulesフォルダは既にあるので、その中のnpmフォルダをnodejs側からetherpad-lite-win側にコピー。その他のファイル/フォルダもnodejs側からetherpad-lite-win側にコピーとなります。

## sqlite3のインストール＆設定
コマンドプロンプトを開いて、etherpad-liteのインストール先フォルダに行きます。

まず、proxy環境下の場合はnpmのproxy設定を行います。proxy環境下でなければこの手順は不要です。

```cl
npm config set proxy http://proxy.your.domain:8080
```

sqlite3をインストールします。

```cl
npm i sqlite3
```

次にsqlite3を使えるように設定ファイル（settings.json）を変更します。関係あるところだけ抜粋すると下記の通りです。

```json
  //The Type of the database. You can choose between dirty, postgres, sqlite and mysql
  //You shouldn't use "dirty" for for anything else than testing or development
  "dbType" : "sqlite",
  //the database specific settings
  "dbSettings" : {
                   "filename" : "var/etherpad.db"
                 },
```

ここまでできたら、一旦動作確認します。

```cl
start.bat
```

`http://localhost:9001`にアクセスしてひと通り動作すればOKです。コマンドプロンプトで`Ctrl-C`で終了します。

## サービス化
NSSMが無ければインストールします。といっても、実行ファイルを適当な場所に置くだけです。
そして、コマンドプロンプトを管理者として実行して、NSSMを起動します。

```cl
nssm install Etherpad-lite
```

NSSMのGUIが表示されて、Applicationタブが開くので次の通り入力します。
* Pathには(etherpad-lite-winにコピーした先の)node.exeのパスを入力します。（入力欄右側の「...」をクリックするとファイル選択ダイアログが開くので、node.exeを選択します。）
* Startup directoryはnode.exeのあるフォルダが自動的に設定されます。
* Argumentsには「node_modules\ep_etherpad-lite\node\server.js」を指定します。これはstart.batの中に書いてあるパラメータと同じです。

入力が済んだら、「Install service」をクリックしてNSSMを終了します。

サービスの、起動・停止や自動起動の設定はWindowsのサービス管理画面で行います。
サービスを起動し、再度`http://localhost:9001`にアクセスして、Etherpad-liteが動作することを確認しましょう。なんなら、Windows自体も再起動してみて、ちゃんとEtherpad-liteが立ち上がってくるか確認しましょう。
以上でインストールは完了ですが…

# 注意
ローカルで動いているとはいえ、ネットワーク経由で他のコンピュータからアクセスされるとEtherpad-liteが見えてしまいます。他人に見せる必要が無ければ、Windows Firewallでもsettings.jsonでも良いのでアクセスコントロールしましょう。
複数のバージョンが入っている環境でJDKのバージョンを1.8に切り替える


メモです


```
update-alternatives --set java /usr/lib/jvm/jre-1.8.0-openjdk.x86_64/bin/java

alternatives --install /usr/bin/java java /usr/lib/jvm/jre-1.8.0-openjdk.x86_64/bin/java 16024
```
シェルの履歴を手動で保存する(`history -a`)[組み込みLinux用メモ]

普段組み込みLinuxにて開発を行っているが、電源リセット時にshellの履歴が消えていることが多い。(シリアル接続のため？)
なのでshutdown前に履歴を手動で保存しておく。

```bash:履歴を手動で保存
$ history -a
$ sync
```
※syncも一応行っておく

bashであれば基本的に履歴は以下に保存されている。

```bash:履歴の保存先
# bashのデフォルト
$ ~/.bash_history

# 変更されている場合は以下で確認する
$ echo $HISTFILE
```

毎回使用するコマンドは予め `~/.bash_history` に書いておくと履歴検索 `C-r` でほとんど済む。
組み込みLinux開発は環境ごと焼き直しが多いので開発用の `~/.bash_history` は取っておいたほうが良いと思われる。

# 参考
[bash - How to save terminal history manually? - Ask Ubuntu](http://askubuntu.com/questions/261407/how-to-save-terminal-history-manually)

# その他 `history` コマンド に関する参考
[シェルのコマンド履歴から再利用、のいろいろ - 元RX-7乗りの適当な日々](http://d.hatena.ne.jp/rx7/20090225/p1)
[特定のコマンドをシェルの履歴に保存しない « サーバーワークス エンジニアブログ](http://blog.serverworks.co.jp/tech/2013/04/03/zsh-hist-ignore-space/)
[bash - Is it possible to make writing to .bash_history immediate? - Ask Ubuntu](http://askubuntu.com/questions/67283/is-it-possible-to-make-writing-to-bash-history-immediate)
pipに--userをつけた時のインストール先を変える

# PYTHONUSERBASE
pipでinstallするとき`--user`オプションをつけるとユーザーディレクトリにインストールしてくれて権限の都合とかがある時便利なのだが、そのインストール先をデフォルトから変えたくなった。

pipさん曰く[^1]、pythonの`site.USER_BASE`に従っているそうなので`site.USER_BASE`の説明[^2]と`PYTHONUSERBASE`の説明[^3]を見ると、

* デフォルトでは`~/.local`や`~/Library`や`%APPDATA%`になっている
* 環境変数`PYTHONUSERBASE`で設定できる

ようだ。
というわけで、`PYTHONUSERBASE`か`site.USER_BASE`を設定すれば解決。

```zsh
export PYTHONUSERBASE=/home/username/local
```

```py:pip
#!/home/username/local/bin/python

# -*- coding: utf-8 -*-
import re
import sys
import site

from pip import main

if __name__ == '__main__':
    site.USER_BASE = "/home/username/local"

    sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
    sys.exit(main())
```


[^1]: https://pip.pypa.io/en/stable/reference/pip_install/#cmdoption-user
[^2]: http://docs.python.jp/2/library/site.html#site.USER_BASE
[^3]: http://docs.python.jp/2/using/cmdline.html#envvar-PYTHONUSERBASE
iOSでプロジェクトのファイル数をカウントするときに使えるコマンド

# 特定のディレクトリ下のファイル数を数える
Objective-CからSwiftへ移行したいと思った時、書き換えなきゃいけないファイル数はどのくらいになるのかを調べた。

まずはディレクトリまで進む。この時のプロジェクト名は`sampleRecorder`

![image](https://qiita-image-store.s3.amazonaws.com/0/37217/dd41c519-effd-ed33-7b12-3b2701a6ecfc.png)
 
そして以下のコマンドを打つとファイル数が出てくる

`$ find . -name "*.swift" | wc -l`


<a rel="nofollow" href="http://www.amazon.co.jp/gp/product/B01967IKU4/ref=as_li_ss_il?ie=UTF8&camp=247&creative=7399&creativeASIN=B01967IKU4&linkCode=as2&tag=kowalik-22"><img border="0" src="http://ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&ASIN=B01967IKU4&Format=_SL250_&ID=AsinImage&MarketPlace=JP&ServiceVersion=20070822&WS=1&tag=kowalik-22" ></a><img src="http://ir-jp.amazon-adsystem.com/e/ir?t=kowalik-22&l=as2&o=9&a=B01967IKU4" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />