OmniAICreator/Qiita-1.07M huggingface dataset:
LocalStorageをもっとデータベースライクに使う方法


LocalStorageの基本に関しては[こちら](http://qiita.com/masamitsu-konya/items/c69515604570150d3ab9)

#LocalStorageとデータベースの違い
LocalStorageはキー＆バリューで保存しなくてはいけない。

|key|value|
|:--|:--|
|悟空|サイヤ人|
|クリリン|地球人|
|ピッコロ|ナメック星人|

データベースはカラムを作れるので、キー＆バリューよりは使い勝手が良い。

|name|category|strength|
|:--|:--|:--|
|悟空|サイヤ人|メチャクチャ強い|
|クリリン|地球人|地球人としては強い|
|ピッコロ|ナメック星人|それなりに強い|

LocalStorageもデータベースみたいに使えないかな？
ということでやってみます。

#入力用のフォームサンプルを作ってみた
以下にLocalStorageに入力する用のフォームを作ったのでコピペして使ってください。

```html
<!doctype html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>WebStrage API</title>
  <script type="text/javascript">
    function init() {
      //ここにコードを書いていきます
    }
  </script>
</head>
<body onload="init()">
  <form id="form">
    <label for="name"> 
      名前
      <input type="text" name="name" id="name">
    </label>
    <label for="name"> 
      人種
      <input type="text" name="category" id="category">
    </label>
    <label for="name"> 
      強さ
      <input type="text" name="strength" id="strength">
    </label>
    <div id="result"></div>
  </form>
</html>
```

すごく簡単ですが、以下の様なフォームになります。
![スクリーンショット 2014-04-22 13.34.01.png](https://qiita-image-store.s3.amazonaws.com/0/7942/34527732-4234-e891-1dd3-1f59ff980cd7.png "スクリーンショット 2014-04-22 13.34.01.png")



#フォームに入力した時にデータに保存する
ではさっそくフォームに入力した時にデータが保存されるコードを書きます。

```js
function init() {
document.querySelector("#form").addEventListener("input",
    function() {
      var data = {
        name:document.querySelector("#name").value,
        category:document.querySelector("#category").value,
        strength:document.querySelector("#strength").value
      };
      localStorage.setItem("goku", JSON.stringify(data));
    }, false
  );
}
```

`#name` と `#category` と `#strength` のテキストフィールドが変更された時に
キーが `goku` 、バリューが `JSON` 形式に変換された `data` の配列？が保存されます。

本当に保存されてるかわからないので、次にデータを取り出して表示させてみましょう。

#データを抽出し表示する

```js
      ・・・・・
      localStorage.setItem("goku", JSON.stringify(data));

      var nowData = localStorage.getItem("goku");
      var realData = JSON.parse(nowData);
      val = realData.name + " " + realData.category + " " + realData.strength;
      document.querySelector("#result").innerHTML = val;
      ・・・・・
```

まず、 `getItem` でデータを取り出し、 `JSON` でパースします。
パースしたら `.name` のように、ドットの後に名前を繋げることでデータが利用できます。

フォームで試してみると↓こんな感じ。
![スクリーンショット 2014-04-22 13.45.48.png](https://qiita-image-store.s3.amazonaws.com/0/7942/8b5643ce-2085-a131-a4d8-1cf4db112c28.png "スクリーンショット 2014-04-22 13.45.48.png")

#データがあるかどうかを確認して、ある場合は既存のデータを適用する
ブラウザを閉じて、再訪した時にデータをフォームに入力しておきたい。
って場合に、データの有無を確認してある場合は既存のデータをフォームに入れておくようにする。

```js
function init() {
  var oldData = localStorage.getItem("goku");
  if(oldData) {
    var realData = JSON.parse(oldData);
    document.querySelector("#name").value = realData.name;
    document.querySelector("#category").value = realData.category;
    document.querySelector("#strength").value = realData.strength;
  }

  document.querySelector("#form").addEventListener("input",
  ・・・・・
```

`getItem` で取得し、`JSON` でパースする。
あとはそれぞれのフォームに値を入力する。

結論、まあ基本はキー＆バリューなんで、
データベースほど使いやすくもないけど、
工夫すれば面白い使い方ができるかも。
Cygwinで削除出来ないファイルが。

Cygwinを真っさらにして入れ直そうと思い、先ずは既存の物を削除しようとしたところ
「無効な MS-DOS ファンクションです。」
と怒られた。
よくよく調べると、

D:\cygwin\dev\nul

という謎ファイルが。
コマンドプロンプトにて以下の様に対応。

\>del \\\\.\D:\cygwin\dev\nul
Android NativeでWebRTCを実装する：リアルタイムコミュニケーション♪

**TODO あとで詳しく書く**

# みんなリアルタイムコミュニケーションが好きだから Android ネイティブでWebRTCを実装する

## ぜんてい

- リアルタイムコミュニケーションしたい
- XMPP とかじゃなくて WebRTC を使いたい
- とりあえずメッセージングチャットをつくってボイチャつくって・・・
- エロ目的では使わない

## じっそう

## さんこう
Windows 7や8(64bit)で emacs キーバインドにする方法



## 結論

* keyhac をインストール
* emacs用のconfig.py に置き換える

## keyhac


Pythonで制御するキーアサインの制御ソフト

## 公式ページ

ダウンロードもこちらから

[keyhac - craftware](https://sites.google.com/site/craftware/keyhac "keyhac - craftware")


## emacsキーバインドな config.py

* 常駐してるkeyhacを右クリックして、「設定の編集」から、編集。
* 以下の設定をコピペして、「設定のリロード」

[NTEmacs @ ウィキ - Windows の操作を emacs のキーバインドで行うための設定 （keyhac版）](http://www49.atwiki.jp/ntemacs/pages/25.html "NTEmacs @ ウィキ - Windows の操作を emacs のキーバインドで行うための設定 （keyhac版）")


これで、幸せになれます。

## 参考ページ

[OS のキーバインドを Emacs 風にするツールまとめ - Qiita](http://qiita.com/senda-akiha/items/7dd828241423d473c576 "OS のキーバインドを Emacs 風にするツールまとめ - Qiita")


## 検索用語

key, keybind, キー, キーバインド, emacs, windows, xkeymacs, AutoHotkey,
分割ダウンロードで高速化する方法

**TODO 後で書く**

# みんな高速化が好きだから、マルチスレッド＋分割ダウンロードで高速化する

## ぜんてい

- Androidアプリでつくる
- 大きめのファイルをダウンロードする
- ユーザーはアプリが高速に動作しないと憤慨して★1つのレビューをする層を想定
- マルチスレッドでもちゃんと実装できる人が開発する
- サーバー側がちゃんと作られている（Rangeリクエストしても全部返してくることもあるんです）

## Http Range Request について

HTTP1.1 の仕様で Range Get ができるようになりました。ダウンロードの続きをしたいとき（レジューム）とかに使えます。それを利用して、並列で分割ダウンロードしようという話です。

## じっそう

1. HEAD リクエストでファイルのサイズ取得
2. 適当に計算していくつかのタスクに分割
3. ThreadPoolExecutor に処理させるとかそういう感じ

## さんこう

## あとがき

- とりあえずグロースハッカーはいなくなってほしい
serverspecでMySQLの設定を検査する抹茶ー

さくっとマッチャー書いた。
数行なので、プルリクしたもんかどうか迷う...。
failure messageを少し頑張った。

```rb:mysql_conf_matcher.rb
RSpec::Matchers.define :have_mysql_entry do |entry|
  match do |subject|
    if subject.class.name == 'Serverspec::Type::File'
      @content = subject.content
      if @value
        !! @content.lines.find {|line| line =~ /^\s*#{entry}\s*=\s*#{@value}\s*$/ }
      else
        !! @content.lines.find {|line| line =~ /^\s*#{entry}\s?=/ }
      end
    else
      raise "have_mysql_entry matcher should target to file resource"
    end
  end

  chain :with_value do |value|
    @value = value
  end

  failure_message_for_should do |actual|
    if @value
      m = "expected #{actual.to_s} to have mysql entry #{entry.inspect} with value #{@value.inspect}"
      if match = @content.match(/^(\s*#{entry}\s?=.*)/)
        m << "\n    entry #{match[1].inspect} exists, but value not matched."
      end
    else
      m = "expected #{actual.to_s} to have mysql entry #{entry.inspect}"
    end
    m
  end
end
```

こう使う。

```rb:sample_spec.rb
describe file('/etc/my.cnf') do
  it { should be_file }
  it { should have_mysql_entry('default-character-set').with_value('utf8') }
end
```
Eclipceで証明書APKエクスポートする時に、強制終了してしまう時の対策


なった時に、いつもしている対策方法です。
他にもあると思いますが、私の場合はこれでうまくいきますので、メモ程度に記載しておきます。

+ genフォルダの __中身をパッケージごと__ 削除します。
+ binフォルダの __中身のフォルダとファイル__ を削除します。
+ メニューバーのプロジェクト → クリーンを選択して、対象のプロジェクトにチェックマークを入れてクリーンを実行します。

以上の３つをやってから、再度、証明書APKをエクスポートすると、うまくいくと思います。

※ 私の開発環境
MacBook Pro Retina

OS			: OSX 10.9.2
プロセッサ	: 2.6 GHz Intel Core i5
メモリ		: 8 GB

Eclipce		: Kepler Service Release 2

Android ADK	: 22.6.2
Android SDK	: 22.6.2
PHPでクロージャーを使う

PHP再勉強中です。

PHP5.3で導入された無名関数はクロージャーとして使用することができるとのこと。

参考：[Wikipedia : クロージャー](http://ja.wikipedia.org/wiki/%E3%82%AF%E3%83%AD%E3%83%BC%E3%82%B8%E3%83%A3)

ただしPHPの場合、親のスコープから引き継ぐ変数は`use`を利用して明示的に引き渡す必要があります。


##  クロージャーのサンプル

クロージャーを用いた単純なカウンターのコードは以下のようになります。

```php
<?php
function create_counter()
{
    $count = 0;
    return function() use (&$count) {
        return ++$count;
    };
}

$counter = create_counter();
echo $counter() . PHP_EOL;    # => 1
echo $counter() . PHP_EOL;    # => 2
echo $counter() . PHP_EOL;    # => 3
```

`create_counter()`関数内で宣言されたローカル変数`$count`は、本来`create_counter()`関数を抜けた時点で消滅する筈ですが、`create_counter()`関数の戻り値として生成された無名関数に`use`で引き渡されているために、`create_counter()`関数を抜けた後も存続することになります。
この時、無名関数内でカウンターとして`$count`をインクリメントするため、`use`には参照として渡す必要があります。（ここらへんちょっとめんどくさい）

このサンプルのような単純なケースの場合、静的変数を利用しても同様な処理は記述できますが、クロージャーを利用することでカウンターを保持する変数を関数内に閉じ込めることででき、また以下のように複数のカウンターを生成することも容易です。

```php
$counter1 = create_counter();
$counter2 = create_counter();

echo $counter1() . PHP_EOL;    # => 1
echo $counter2() . PHP_EOL;    # => 1
echo $counter1() . PHP_EOL;    # => 2
echo $counter2() . PHP_EOL;    # => 2
```

## クロージャーを返すメソッド

関数だけでなく、オブジェクトのメソッドもクロージャーを返すことができます。

```php
<?php
class MyClass
{
	private $foo = "Foo";
	
	public function getFoo()
	{
		return function() { return $this->foo; };
	}
}

$obj = new MyClass();
$foo = $obj->getFoo();
echo $foo() . PHP_EOL;   # => "Foo"
```

PHP5.4以上であれば、メソッド内で生成された無名関数には暗黙的に`$this`が引き渡されているので、無名関数内で使用することが可能です。
PHP5.3の場合、`$this`を一度ほかの変数に代入後、その変数を無名関数に`use`で明示的に引き渡す必要があります(筈）。

```php
<?php
class MyClass
{
    private $foo = "Foo";	
    public function getFoo()
    {
        # $this を変数に代入して無名関数に引き渡す。
        $self = $this;
        return function() use (&$self) { return $self->foo; };
    }
}
```
GoogleChartAPIのQRコード生成のURLを発行するphpスクリプトを組んでみた

* GoogleChartAPIを使うと簡単にQRコードが発行できて便利なんだけど都度URLエンコードなどがめんどくさいのでphpで画面を作ってみた
 * GoogleChartAPIについて http://ameblo.jp/kosado/entry-11432951365.html
 * 実はこれが初php

----
```php
<!DOCTYPE HTML>
<html lang="ja">
  <head>
    <meta charset="utf-8">
    <title>QR code generator</title>
  </head>

  <body>
    <div>
      <form method="get">
        <table border="0">
          <tr>
            <td align="right"><b>Size</b></td>
            <?php $val = empty($_REQUEST["qr_size"]) ? "300" : $_REQUEST["qr_size"] ?>
            <td><input type="text" name="qr_size" size="3" maxlength="3" value="<?php echo $val ?>"></td>
          </tr>
          <tr>
            <td align="right"><b>URL</b></td>
            <?php $val = empty($_REQUEST["qr_url"]) ? "http://" : $_REQUEST["qr_url"] ?>
            <td><input type="text" name="qr_url" size="128" value="<?php echo $val ?>"></td>
          </tr>
          <tr>
            <td></td>
            <td>
              <input type="reset">
              <input type="submit">
            </td>
          </tr>
        </table>
      </form>
    </div>

    <hr width="50%" align="left">

    <?php if (!empty($_REQUEST["qr_size"])): ?>
      <div>
        <?php
          $url = urlencode($_REQUEST["qr_url"]);
          $qr_code_url = "https://chart.googleapis.com/chart?cht=qr&chs={$_REQUEST["qr_size"]}&chi={$url}";
        ?>
        <div><a href="<?php echo $qr_code_url ?>"><?php echo $qr_code_url ?></a></div>
        <div><img src="<?php echo $qr_code_url ?>"></div>
      </div>
    <?php endif ?>
  </body>
</html>
```

* こんな画面になります
 * ![スクリーンショット 2014-04-22 13.01.33.png](https://qiita-image-store.s3.amazonaws.com/0/22341/aa560295-d562-6ad7-8283-eff9df211c9b.png)
c# HttpClient で認証付きのプロキシーを利用する

HttpClient のコンストラクタに、プロキシーの情報をセットしたHttpClientHandler
のインスタンスを渡す。

```csharp
class Program
{
    private static readonly string proxyUrl = "http://proxy.foo.com:8080";
    private static readonly string proxyAccount = "account";
    private static readonly string proxyPassword = "password";
    private static readonly string targetUrl = "http://www.bar.com";

    static void Main(string[] args)
    {
        // HttpClientHandlerにProxy情報を設定する
        HttpClientHandler ch = new HttpClientHandler();
        ch.Proxy = new WebProxy(proxyUrl);
        ch.Proxy.Credentials = new NetworkCredential(proxyAccount, proxyPassword);
        ch.UseProxy = true;

        // HttpClientHandlerを用いてHttpClientを生成
        HttpClient client = new HttpClient(ch);
        try
        {
            // GETでレスポンスを取得
            var task = client.GetStringAsync(targetUrl);
            task.Wait();
            Console.WriteLine(task.Result);
        }
        catch (Exception e)
        {
            Exception e2 = e.GetBaseException();
            System.Console.WriteLine(e2.Message);
        }
    }
}
```
sqlplusでSQLを定期実行

1秒単位とかで、定期的にSQLを実行したいときのやり方。

```sesw.sh
#!/bin/sh

cd `dirname $0`

LOCKFILE=.lock_sesw_`date "+%m%d%H%M%S"`
rm -f .lock_sesw_*
touch $LOCKFILE
trap "echo terminated; rm -f $LOCKFILE; exit 0" INT

sesw()
{
  echo "connect / as sysdba"
  echo "set pages 9999"
  echo "set lines 200"
  echo "set feedback off"
  while [ -f $LOCKFILE ]
  do
    cat << EOF
col TIME      for a10
col SID       for 9999
col MACHINE   for a15 trunc
col PROGRAM   for a15 trunc
col MODULE    for a15 trunc
col SQL_ID    for a15
col COMMAND   for 999
col EVENT     for a30 trunc
col SIW       for 999

SELECT to_char(sysdate, 'mmddhh24miss') TIME
     , sid
     , machine
     , program
     , module
     , sql_id
     , command
     , event
     , seconds_in_wait SIW
  FROM v\$session
 WHERE wait_class != 'Idle'
 ORDER BY event, p1;
EOF
    sleep 1
  done
}

sesw | sqlplus -s /nolog
```

上の例だと、DBインスタンスのアクティブセッション情報を定期的に出力しますが、どのSQLに置き換えてもよいかと思います。v\$ビューの場合、「\$」のエスケープだけは忘れずに。

このあたりにも幾つか上げています。
https://github.com/yasushiyy/orashell/blob/master/sesw.sh
https://github.com/yasushiyy/orashell/blob/master/seswsmall.sh
https://github.com/yasushiyy/orashell/blob/master/sesw9i.sh
MySQLの文字化け


Node.jsからMySQLを呼び出そうとしたときに文字化け発生したので対処したときのメモ。


```
#MySQL設定ファイル変更
$ sudo vi /etc/my.cnf
[mysqld]
・
・
・
character-set-server=utf8
default-storage-engine=InnoDB
default-character-set=utf8
skip-character-set-client-handshake
```

```
#MySQL再起動
$ sudo service mysqld restart
```

文字コードをutf-8に指定することで文字化けが解消されました。

/etc/my.cnfのどの部分が有効だったのかイマイチ分かってないですが，とりあえずMySQL側の設定で直りました。
attr_encryptedでハマった話

[attr_encrypted](https://github.com/attr-encrypted/attr_encrypted)という暗号化をしてくれるgemでちょっとハマりました。

## 現象
```abstract_user.rb
class AbstractUser < ActiveRecord::Base
  self.abstract_class = true

  attr_accessible :name, :password
  attr_encrypted :password, key: 'secretkey'
end
```

```user.rb
class User < AbstractUser
end
```

```irb
irb> user = User.new(name: 'hoge', password: 'fuga')
irb> user.encrypted_password   # => 暗号化されたパスワード
irb> user.password             # => 'fuga'
irb> user[:encrypted_password] # => nil !?
irb> user.save                 # => encrypted_passwordはNULLで保存される(NOT NULL制約があるならエラー)
```

## 原因

`#encrypted_password`と`[:encrypted_password]`(`read_attribute(:encrypted_password)`)の返す値が違うんだと思って定義元を調べてみたら、以下のコードを発見。

```attr_encrypted.rb
131: attr_reader encrypted_attribute_name unless instance_methods_as_symbols.include?(encrypted_attribute_name)
132: attr_writer encrypted_attribute_name unless instance_methods_as_symbols.include?(:"#{encrypted_attribute_name}=")
```
https://github.com/attr-encrypted/attr_encrypted/blob/master/lib/attr_encrypted.rb#L132

こういう時pryの`$ method`は便利ですね。
つまり、`#encrypted_password`, `#encrypted_password=`はActiveRecordとは切り離された、プレーンなアクセサになっていました。
abstractな親クラスで`attr_encrypted`していたため、`AbstractUser.instance_methods`が`encrypted_password`を含まず、`attr_encrypted`が独自のアクセサを定義してしまったようです。
attr_encryptedはActiveRecordに限らず、すべてのオブジェクトで使えるように設計されている(Objectをextendしている)ので、こういう実装になっているんでしょうね。

ActiveRecordの実装までは追っていませんが、カラム名のメソッドはおそらく`method_missing`などで実装されていて、`instance_methods`も具象クラスならカラム名のメソッドをすべて含むようにオーバーライドされているんでしょう。
アクセサが定義されたことにより、ActiveRecordの実装が無効化されてしまったという事だろうと思っています。
GoogleMapAPIの商用利用

# ざっくりと無償版と有償版の説明
## 無償版
無償版でも利用規約に反しない範囲で商用利用は可能です。
参考：[Google Maps APIとGoogle Maps API Premier(有償版)の違いについて](http://googleenterprise-ja.blogspot.jp/2010/03/google-maps-apigoogle-maps-api-premier.html)

> 1.いつでも、誰でも、どこからでも、同じコンテンツが利用できるようになっていること

> 2.Google Maps API(無償版)を利用して直接的な収益をあげるような商用利用は行わないこと
>
>具体的には
>　×社内でのみ利用する場合
>　×有償会員サイトで利用する場合
>　○無償会員制サイト
>　×ある製品、サービスを購入しないと利用できない場合
>　（もしくは製品サービスを購入しないと利用勝手が異なる）
>　○広告収入で収益をえているサイト
>　×販売するソフトウェアへの組み込み
>　×商用SaaS/ASPサービス

また、無償版には使用制限があります。（後述）
[90日連続で使用制限を超えた場合、課金されます。（1000回あたり0.5ドル）](https://developers.google.com/maps/faq?hl=ja#usage_pricing)
~~あと、HTTPSアクセスもできないようです。~~

## 有償版
有償版のサービス名は「Google Maps for Busines(旧Google Maps API Premier)」です。
ライセンスは4つのプランがあります。
[Google Maps API for Business の価格体系｜株式会社ゼンリンデータコム](https://www.zenrin-datacom.net/business/gmapsapi/price/flow.html)

- 完全公開サイトプラン：一般公開されているサイトでのご利用
- 非公開サイトプラン：非公開サイト・社内イントラシステムでのご利用
- トラッキングサイトプラン：移動体を管理するシステムでのご利用（GPSと連動）
- デベロッパーキット：開発・検証時のご利用

価格はオープンになっていない模様。

## 無償版と有償版の比較表
公式のキャプチャです。[Google Maps API のライセンス - Google Maps API — Google Developers](https://developers.google.com/maps/licensing?hl=ja)を直接見たほうが見やすいです。

![キャプチャ1.PNG](https://qiita-image-store.s3.amazonaws.com/0/38582/b13ce210-444c-0ad8-a4c9-9e358921f0d4.png)
![キャプチャ2.PNG](https://qiita-image-store.s3.amazonaws.com/0/38582/5d1a4343-edc2-3155-3c6b-c7f39335bcec.png)
![キャプチャ3.PNG](https://qiita-image-store.s3.amazonaws.com/0/38582/3670e418-5dd7-fcaf-636e-8e7638c86757.png)


# 国内の販売代理店

[Google エンタープライズ　販売 / ソリューションパートナー情報](https://www.google.co.jp/intl/ja/enterprise/partner.html)から抜粋。

- Google Maps API Premier 販売代理店：応用技術株式会社、株式会社ゴーガ、国際航業株式会社、ゼンリンデータコム

- Google Enterprise Partner Google Maps API Premier ソリューションパートナー：CTC、オージス総研、応用技術株式会社、株式会社ゴーガ、国際航業株式会社、ゼンリンデータコム等

# 用語調べ

* Static Maps API：地図を画像として取得
* Geocoding API：住所から緯度・経度の地理座標を取得する（逆に座標から住所も取得可能）
* Directions API： 2 地点間のルート計算（交通機関、運転、徒歩、自転車といったいくつかの交通手段について検索）
* Distance Matrix API：出発地と目的地の行列から、移動距離とその所要時間を計算
* Elevation API：地球上のすべての場所の高度データと、海底までの水深データ（マイナス値）を提供。

# 参考URL
[Google Maps API のライセンス - Google Maps API — Google Developers](https://developers.google.com/maps/licensing?hl=ja)
[Google Maps API](https://developers.google.com/maps/documentation/webservices/?hl=ja)
[Google Maps for Business](http://www.google.com/enterprise/mapsearth/)
[Google Maps API for Business｜株式会社ゼンリンデータコム](http://www.zenrin-datacom.net/business/gmapsapi/index.html)
OSX ローカル開発環境の整え方[編集中]

#目標
- xamppをもう使わない、osxの環境はhomebrewで構築したいし。
- vagrant+virtual boxで完全に独立した環境をつくる
- VCCWをつかって、boxの中にLAMP環境＋wordpress環境一度に構築する
    - VCCWとは → http://vccw.cc/
- 構築したboxとheroku、githubを接続し、コード管理と本番環境へのデプロイ環境も整える。

##VCCW環境構築手順
- 1.vagrantとvirtual boxをインストールする
    - virtual box:https://www.virtualbox.org/
    - vagrant:https://www.vagrantup.com/

```bash:
vagrant -v 
#コマンド動くか確認

```

- 2.vagrant-hostsupdaterをインストール

```bash:
vagrant plugin install vagrant-hostsupdater
```

- 3.vccw用のbox(仮想マシンのテンプレート)を構築するには以下のURLにあるboxを使う。通常は、様々なlinux osのboxが用意されているので、そちらのURLを指定する。
OSのインストールなので結構時間かかる…

```bash:
vagrant box add miya0001/vccw
```
 
- 4.LAMP+wordpressの環境がつまったVCCWをGithubからダウンロード(git clone)。Vagrantfileも含まれてます。

```bash:
git clone https://github.com/vccw-team/vccw.git ディレクトリ名
#ディレクトリ名指定しないとvccwになる
```

- 5.vccw.gitをcloneしたディレクトリに移動します。直下にVagrantfileがあるので

```bash:
cd ディレクトリ名
```

- 6.VCCWのwordpress、phpenv他の設定確認
    - default.ymlをコピってsite.ymlというファイルを作り、設定編集すれば、phpのバージョンなどを変えることが可能
    - 指定できるphpのバージョンはhttps://github.com/php-build/php-build/tree/master/share/php-build/definitions
    - wordpressの言語設定もできる
    - デフォルトのログインIDとかも全部設定されてるので、変更されたほうがいいです。

```bash:
#カレントディレクトリがvccwあるいは自分でつけたディレクトリ名で、
cp provision/default.yml provision/site.yml
vi provision/site.yml
#以下適当に編集
```

- 7.手順3でつくったboxにVCCWを展開・プロビジョニング（環境構築）

```bash:
pwd
/Users/ユーザー名/vccwあるいは自分でつけたディレクトリ名
#vagrantfileがある場所で
vagrant up
#これだけでOK、設定ファイル側でbox名とか全部指定してるので
#途中パスワード聞かれたらmacのアカウントのパスワード入力してね
#sshの22番ポートが塞がれているNTではアプリのインストールに失敗します、開いてるNTでやりましょう。
```

###vagrantのコマンド
- GUIでコントロールしてもいいけど、コマンドも用意されてます。

```bash:
#vagrant upした仮想環境にssh接続
vagrant ssh
#終了
vagrant halt
#再起動
vagrant reload
#boxの削除、環境構築失敗しちゃったら…
vagrant destroy
```
- sshログインすると！

![スクリーンショット 2015-12-03 22.14.25.png](https://qiita-image-store.s3.amazonaws.com/0/5508/c57fa17b-b2af-4a9e-80c8-016d7dcc70a8.png)


###Wordpressの画面確認
- http://192.168.33.10/
    - こちらがWordpressのブログ画面になってます。
- http://192.168.33.10/wp-login.php 
    - こちらが管理画面、ID/PASSはsite.ymlで設定したものになります。

##Vagrant仮想環境のソースとGithubをつなげる手順
###まずはGitのバージョンを上げる
- デフォルトで入ってる奴のバージョンが1.7.0とかだと、Herokuに繋げられないので、2.4.xにバージョンアップする
- まずは入ってるGitを削除
- 最新版のGitを落としてきてインストールする

##Vagrant仮想環境とherokuの環境を接続する手順
あしたまとめます…
[Objective-C] NSURLConnectionで非同期通信（デリゲート）


デリゲートの使い方や細かい処理方法を忘れるのでメモとして書きとどめておきます。

##NSURLConnection

NSURLConnectionには同期処理と非同期処理があります。
同期的な処理については[以前書いた記事](http://qiita.com/edo_m18/items/5c0778d55dee57f35e8f)内で使っている（`sendSynchronousRequest:returningResponse:error:`メソッド）のでそちらを見ていただくとして、今回はデリゲートを使った非同期処理についてのメモです。

##NSURLConnectionDataDelegateに準拠する

非同期処理の場合は、`NSURLConnectionDataDelegate`プロトコロに準拠して、適切にメソッドを実装します。
実装すべきメソッドは以下のもの。

###実装するデリゲートメソッド

| メソッド | 説明 |
|---------|-----|
| - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response | リクエストしたレスポンスを取得する。（データ本体ではない）※1 |
| - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data | データを受信する度に呼び出される。受信データは完全な形ではなく断片で届くため、このメソッド内で適切にデータを保持し結合する必要がある |
| - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error | エラー時に呼び出される |
| - (void)connectionDidFinishLoading:(NSURLConnection *)connection | データの受信が完全に終わった際に呼び出される |

※1 ... 受け取るレスポンス内容

```log
{
    URL: http://example.com/
    status code: 200
    headers {
        "Accept-Ranges" = bytes;
        Connection = "Keep-Alive";
        "Content-Length" = 38939;
        "Content-Type" = "text/html";
        Date = "Tue, 22 Apr 2014 00:44:54 GMT";
        Etag = "\"dce3e36-981b-4ef2ed2eb1b40\"";
        "Keep-Alive" = "timeout=5, max=20";
        "Last-Modified" = "Sun, 05 Jan 2014 01:11:33 GMT";
        Server = "Apache/2.2.25";
    }
}
```

##簡単な実装例

```objc
// AnyWrapperClass.h
@interface AnyWrapperClass : NSObject <NSURLConnectionDataDelegate>

@end
```

```objc
// AnyWrapperClass.m
@interface AnyWrapperClass ()

@property (strong, nonatomic) NSMutableData *receivedData;

@end

//////////////////////////////////////////////////////////////

@implementation AnyWrapperClass

- (void)connection:(NSURLConnection *)connection
didReceiveResponse:(NSURLResponse *)response
{
	// データの長さを0で初期化
	[self.receivedData setLength:0];
}

- (void)connection:(NSURLConnection *)connection
    didReceiveData:(NSData *)data
{
	// 受信したデータを追加していく
	[self.receivedData appendData:data];
}

- (void)connection:(NSURLConnection *)connection
  didFailWithError:(NSError *)error
{
	NSLog(@"Error!");
}

- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
	NSLog(@"Did finish loading!");
	
	NSLog(@"data: \n%@", [[NSString alloc] initWithData:self.receivedData encoding:NSUTF8StringEncoding]);
}

@end
```
non-AppleなPythonでLeapMotionを動かす方法


参考: https://forums.leapmotion.com/forum/support/community-support/os-x/3169-python-pythreadstate-get-no-current-thread

homebrewで導入した、あるいは自前ビルドしたPythonでLeapMotionを動かそうとした場合

```bash:
Fatal Python error: PyThreadState_Get: no current thread
```

というようなエラーが出てきてうまくいかないのではないかと思います。

これはLeapのインターフェースとPythonの橋渡しを提供してるオブジェクト`LeapPython.so`の依存関係が、MacにバンドルされているPython用のものになっているからです。

これを解決してやります。
`otool`と`install_name_tool`というコマンドが必要になります。確かこれはX-codeのcommand line toolsが必要だった気がするので、コマンドが見当たらない方はそちらを先に導入してください。

　　

まずotoolで調査です。

```bash
 $ otool -L LeapPython.so
    LeapPython.so:
        @loader_path/LeapPython.so (compatibility version 0.0.0, current version 0.0.0)
        /Library/Frameworks/Python.framework/Versions/2.7/Python (compatibility version 2.7.0, current version 2.7.0)
        @loader_path/libLeap.dylib (compatibility version 0.7.0, current version 1.0.9)
        /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 169.3.0)
        /usr/lib/libstdc++.6.dylib (compatibility version 7.0.0, current version 56.0.0)

```

`/Library/Frameworks/Python.framework/Versions/2.7/Python (compatibility version 2.7.0, current version 2.7.0)`の部分が問題の箇所です。
これを書き換えます。

`install_name_tool [-change old_path new_path]`という感じです。
僕の環境だと以下のようになります。new_pathの部分は各人の環境に合わせて適当に変更してください。

```bash

$ install_name_tool -change /Library/Frameworks/Python.framework/Versions/2.7/Python /usr/local/Cellar/python/2.7.6_1/Frameworks/Python.framework/Versions/Current/lib/libpython2.7.dylib LeapPython.so
```

macportsや自前ビルドでも同じようにアレすれば動くようになるかと思われます。
もう一つ注意としては、tmuxごしに動作させている場合はon_frameイベントが発動しないことです。
Rubyを学ぶ(教材編)

##戯言（前置き）
自分のような三十をとうに超えてしまっているエンジニアの中には、新しい案件に対して、既に持っている技術で解決してしまう傾向があると思うが、自分が当にそうである。
自分は典型的なPHPerだけど、仕事には別に困らなかったし、他にも注意しないといけない技術は沢山あった。(スマフォアプリも今や鉄板だし)


しかし！
Java,C,PHPの自分には、Ruby,Pythonのコードがパッと見、未だにスッとこないので、どちらか覚えようと思ったら、やっぱ日本人ならRubyなのかなと。(perlも昔かじった程度で、今読むと多分しんどい)
加えて、国内のRubyを広めようという勢いはすごいし、最近の案件もPHPとRuby半々ぐらいと言ってもいい按配。
実は、前にRubyを勉強しようと思ったとき、Railsの自動生成が気持ち悪くて辞めた覚えがある。（PHPフレームワークでも自動生成機能は使わない）

という前置きをおいた上で、改めてRubyを学ぼうとした時、今はほんとに便利になったんだなと思ったので、それを紹介します。

##ミニツク（Minituku）
http://www.minituku.net
とりあえずネットでRuby学習と言ったらこれ
実際にコード打って学習するものではないけど、各フェーズで行なうドリル、演習で、頭を使うので、機械的に模写する学習と違って、ちゃんと身につく教材だと思う。

##codeprep
http://codeprep.jp/
現状、Rubyなどのサーバーサイド開発というより、HTML,CSS,javascriptなどのフロントサイドでの学習がメイン。
しかし、コードを打ち込む時の効果音が結構気持ち良い。
自分は、CSSの復習で使ってみた。今のところ全無料。
Rubyの基本構文をサクッとやる分にはよい。

##ドットインストール
http://dotinstall.com/
多分、国内では一番有名な学習サイト。扱うコードが多くておそらくプログラム学習サイトとしては鉄板。
ただ、プレミアム会員じゃないとできないことが多いのと、あんまり動画を見ながら～っていうんだったら、さっさと手を動かしたい人間なので、お勧めはしない。

##他のRubyが学習できるサイト
Codecademy
http://www.codecademy.com/
Treehouse
http://teamtreehouse.com/
codeschool
https://www.codeschool.com/
これらの学習サイトは実際に使った訳ではないので、ちゃんとした情報源としてはこちらを参照してほしい
http://techacademy.jp/magazine/36

次回は初心者に一番厄介な勉強する上での開発環境を紹介したい・・・多分
vmstatとかiostatを見やすくtailしたい

トラブル時に忘れるのでメモ。

vmstatは横に長いです。特に複数サーバのvmstatを一括で見たいときには邪魔なので、以下のようなワンライナーを使っています。

```lang:vmstat.sh
$ vmstat 1 | egrep --line-buffered "^ +[0-9]" | awk '{OFS=""; print "r=",$1," us=",$13," sy=",$14; fflush()}'

r=2 us=0 sy=0
r=0 us=1 sy=0
r=0 us=1 sy=1
r=0 us=1 sy=0
```

いっそそのままCSVにしちゃってもよいでしょう。

```lang:vmstatcsv.sh
$ echo "r,us,sy"; vmstat 1 | egrep --line-buffered "^ +[0-9]" | awk '{OFS=","; print $1,$13,$14; fflush()}'

r,us,sy
2,0,0
0,1,0
0,1,1
```

iostatは縦にも横にも長いです。特定デバイスのr/s, w/sだけ見たいときには、以下のようにやっています。

```lang:iostat.sh
$ iostat -xd 1 | egrep --line-buffered "Device|xvda[0-9]" | awk '{OFS=""; ORS=""; if ($1=="Device:") print "\n"; else print $1,"=",$4,"|",$5," "; fflush()}'

xvda1=0.00|0.00 xvda2=0.00|0.00 xvda3=0.36|14.02
xvda1=0.00|0.00 xvda2=0.00|0.00 xvda3=0.00|0.00
xvda1=0.00|0.00 xvda2=0.00|0.00 xvda3=0.00|20.00
xvda1=0.00|0.00 xvda2=0.00|0.00 xvda3=0.00|0.00
xvda1=0.00|0.00 xvda2=0.00|0.00 xvda3=0.00|0.00
```
confirmでOKした時だけ発動させる


```haml
= form_tag user_path, id: 'register', data: { confirm: 'よろしいですか？' } do |f|
  %button.submit
    %i.icon-ok
    &nbsp;登録する
  = image_tag 'spinner.gif', class: 'hide spinner'
```

```coffeescript
$('#register').on 'confirm:complete', (e, answer) ->
  if answer
    $('button.submit').attr('disabled', 'disabled')
    $('.spinner').show()
```

`answer`にはtrue/falseが入ってくる.

[定義箇所@rails.js](https://github.com/rails/jquery-ujs/blob/master/src/rails.js#L232-L252)

```javascript
    allowAction: function(element) {
      var message = element.data('confirm'),
          answer = false, callback;
      if (!message) { return true; }

      if (rails.fire(element, 'confirm')) {
        answer = rails.confirm(message);
        callback = rails.fire(element, 'confirm:complete', [answer]);
      }
      return answer && callback;
    },
```
SQLServerの有効桁数

SQL Server の有効桁数に関して気が向いたので理解を深めてみました。

例えばですが、`decimal(10,0)` で格納されている金額フィールド(単位は円)を
クエリ上で単位を千円に変える場合

```sql:Kingaku.sql
SELECT
    Kingaku / 1000    AS KingakuInThousands  
```

みたいな感じになるかと思いますが、この `KingakuInThousands` の有効桁数はいくつで、小数桁数はいくつでしょう？

これは計算式が決まっていて、下記のリンクに有る表にしたがって決定されます。

[MSDN:有効桁数、小数点以下桁数、および長さ (Transact-SQL)](http://msdn.microsoft.com/ja-jp/library/ms190476.aspx)

今回は除算ですので 「$e1 / e2$」 の行を見ます。

なお、今回の式の場合は
$e1$ … `Kingaku`
$e2$ … 1000

$p1$ … `Kingaku` の有効桁数 ： 10 (`deciaml(10, 0)` なので)
$p2$ … 1000 の有効桁数 ：4 

$s1$ … `Kingaku` の小数桁数 ： 0 (`deciaml(10, 0)` なので)
$s2$ … 1000 (`int`) の小数桁数 ： 0

有効桁数は $p1 - s1 + s2 + \max(6, s1 + p2 + 1)$ の式より、

```math
\begin{aligned}
  & 10 - 0 + 0 + \max(6, 0 + 4 + 1)\\
= & 10 + \max(6,\ 5)\\
= & 10 + 6\\
= & 16
\end{aligned}
```

小数桁数は $\max(6, s1 + p2 + 1)$ の式より

```math
\begin{aligned}
  & \max(6,\ 0 + 4 + 1)\\
= & \max(6,\ 5)\\
= & 6
\end{aligned}
```

となるので、`KingakuInThousands` は 有効桁数 16、小数桁数 6 となります。
つまり、`decimal(16, 6)` になっている…(ハズ…)

`int` による割り算を挟むと小数桁数が 6 桁になっちゃうのは、このせいなのですねー
なお、割る数の `int` を 6 桁 (`100000`) にすると、上記の式より、小数桁数が 7 桁になりました。

理屈がわかると色々と納得できたりしますね。
Charsetごとのコードポイントマッピングの違いを調べる

cp943CのCharsetで、全角ダッシュが1バイト文字判定されてしまうんだけど… という話を聞きました。

「あ、波ダッシュ問題で見たやつだ！」

と思うのですが、Charsetをms932に変えると、どういう影響があるんだ！ということを知りたいということだったので調べてみました。

文字の一覧を、cp943cとms932の両方でgetBytesして、違いを比較すればよいわけです。文字の一覧はコードポイントからStringに変換すればOKです。


https://gist.github.com/kawasima/11162616

```clj
(defn to-hex-str [bs]
  (let [sb (StringBuilder. 8)]
    (doseq [b bs]
      (.append sb (Integer/toHexString (bit-and (bit-shift-right b 4) 0xF)))
      (.append sb (Integer/toHexString (bit-and b 0xF))))
    (.toString sb)))
 
(doseq [i (range 32 65536)]
  (let [ch (String. (into-array Integer/TYPE [i]) 0 1)
        ch-ms932  (vec (.getBytes ch "ms932"))
        ch-cp943c (vec (.getBytes ch "cp943c"))]
    (if (not= ch-ms932 ch-cp943c)
      (println ch (format "%x" i) (to-hex-str ch-ms932) (to-hex-str ch-cp943c)))))
```

実行してみると、こうなります。

```
文字 コードポイント ms932 cp943c

¢ a2 8191 3f
£ a3 8192 3f
¦ a6 3f fa55
« ab 81e1 3f
¬ ac 81ca 3f
¯ af 8150 3f
µ b5 83ca 3f
· b7 8145 3f
¸ b8 8143 3f
» bb 81e2 3f
— 2014 3f 815c
― 2015 815c 3f
‖ 2016 3f 8161
№ 2116 8782 fa59
℡ 2121 8784 fa5a
Ⅰ 2160 8754 fa4a
Ⅱ 2161 8755 fa4b
Ⅲ 2162 8756 fa4c
Ⅳ 2163 8757 fa4d
Ⅴ 2164 8758 fa4e
Ⅵ 2165 8759 fa4f
Ⅶ 2166 875a fa50
Ⅷ 2167 875b fa51
Ⅸ 2168 875c fa52
Ⅹ 2169 875d fa53
− 2212 3f 817c
∥ 2225 8161 3f
〜 301c 3f 8160
ゔ 3094 8394 3f
㈱ 3231 878a fa58
－ ff0d 817c 3f
～ ff5e 8160 3f
￤ ffe4 fa55 3f
```

3fになっているところが、そのCharsetでは対応する文字がない、ということを示しています。
波ダッシュ問題も一目瞭然ですね。つまり、今回の話はコードポイント0x2015の全角ダッシュが入力されて、cp943CでgetBytesされたものと想定されます。

cp943Cは微妙に代替文字が無いのが気になります…
WebStorage API(LocalStorage)を使ってみた


#WebStorage APIってなに？
ユーザのローカル（ブラウザ？）にデータを保存するための仕組み。
ローカルで扱えるデータベースを思っていただければ良いかなと。
データの保存・上書き・削除・全クリアなどの操作は、JavaScriptで行う。

#クッキーとの違いは？
- 有効期限なく永続的に利用できる
- 5MBまで利用できる（クッキーは4KBまで）
- 必要時に利用できる（クッキーはサーバーアクセス時に自動送信）


#基礎知識
- 基本は `key` `value` のペアで保存
- ドメイン&ブラウザごとに格納される
- モバイルでも使える
- 値は必ず `文字列` で保存される

#サンプル用のファイルを作ってみた

まあ使って見る前に簡単にサンプル用のソース書いたので、コピペして使ってください。

```index.html
<!doctype html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>WebStrage API</title>
<script type="text/javascript">
  function init() {
  }
</script>
</head>
<body onload="init()">
  <div id="result"></div>
</body>
</html>
```

以下から、上記の `function init() {}` 内にwebStrageの操作のためのソースを書いていきます。

#データを追加してみる setItem(key, value)
`Artistic` という値を持った `Hashikawa` を追加してみましょう。

```js
function init() {
  localStorage.Hashikawa = "Artistic";
  localStorage["Hashikawa"] = "Artistic";
  localStorage.setItem("Hashikawa", "Artistic");
  //上記３行、どの書き方でも同じ
}
```

`index.html` を読み込むとデータが追加される。はず。
って、データを追加したのはいいけど、確認のしようがないねorz

#データを抽出＆表示してみる getItem(key)
上記で追加したデータを抽出してみよう。

```js
function init() {
  ・・・・・
  var val = localStorage.Hashikawa;
  var val = localStorage["Hashikawa"];
  var val = localStorage.getItem("Hashikawa");
  // 上記３行、どの書き方でも同じ
  document.querySelector("#result").innerHTML = val;
}
```

`Artistic` という値が表示される。


#データを削除してみる removeItem(key)
削除は `localStorage.removeItem(key)` でできる。
上記で書いた ` var val = localStorage.Hashikawa;` の上に、以下を追記してみよう。

```js
function init() {
  ・・・・・
  localStorage.removeItem("Hashikawa");  

  var val = localStorage.Hashikawa;
　・・・・・
}
```

ページをリロードすると、先ほど表示された `Artistic` が今度は表示されなくなるか、`undefined` を返します。

#全てのデータを削除する clear()
localStorageに保存されているすべてのデータを削除するには `clear()` を使う。

まずはいくつかデータを追加してみよう。

```js
function init() {
  localStorage.setItem("A", "Aだよ");  
  localStorage.setItem("B", "Bだよ");  
  localStorage.setItem("C", "Cだよ");  
  localStorage.setItem("D", "Dだよ");  
  localStorage.setItem("E", "Eだよ");  

  var val = localStorage.getItem("A") + " " +
            localStorage.getItem("B") + " " +
            localStorage.getItem("C") + " " +
            localStorage.getItem("D") + " " +
            localStorage.getItem("E");

  document.querySelector("#result").innerHTML = val;
}
```

これを実行すると、
`Aだよ Bだよ Cだよ Dだよ Eだよ`
こう表示されますね。

では、ひとまず、`removeItem()` で一個だけ削除してみましょう。

```js
function init() {
  ・・・・・  
  localStorage.setItem("E", "Eだよ");  

  localStorage.removeItem("B");
  ・・・・・
}
```

これを実行すると、
`Aだよ null Cだよ Dだよ Eだよ`
こうなります。
Bがないので、 `null` を返されました。

次に、 `clear()` を使って、全部削除してみましょう。

```js
function init() {
  ・・・・・  
  localStorage.setItem("E", "Eだよ");  

  localStorage.clear();
  ・・・・・
}
```

すると、
`null null null null null`
全部 `null` になっちゃった！

ということで、全部削除できました。

これがWebStrage APIです。

#SessionStorageっていうのもある
`localStrage` の他に、 `sessionStorage` というAPIもあります。
使い方は `localStrage` と一緒。

名前からもわかる通り、
`sessionStorage` = 同セッションのみで使用できる
`localStorage` = セッションが切れても保持し続ける

と言った違いがあります。

#もっとデータベースライクに使いたい人はこちら
キー、バリューじゃ物足りないよ！
という人は、JSON使ってもっとデータベースライクに使えます。

以下の記事参照
[LocalStorageをもっとデータベースライクに使う方法](http://qiita.com/masamitsu-konya/items/ce7f6469434076448238)
System.Windows.Forms.Timerの間隔

タイマーを繰り返す処理を行ってみたところ、
回数が増えるに従ってハンドラーが呼ばれる間隔が長くなっていく現象に遭遇。
単にタイマーを呼び出すだけでを同じ現象が発生するのか確認してみました。
（タイマー間隔は500msec）
結果は、そうなるみたいです。

![タイマー間隔調査結果.png](https://qiita-image-store.s3.amazonaws.com/0/41649/29613c34-3391-c1e1-a16f-31a4cf64f6ec.png)

`code`
        DateTime last;
        TimeSpan ts;
        int cnt;
        void timer_Tick(object sender, EventArgs e)
        {
            if (cnt > 0)
            {
                ts += DateTime.Now - last;
            }
            cnt++;
            last = DateTime.Now;

            if ((cnt % 50) == 0)
            {
                this.labelTimer.Text += string.Format("avg = {0}msec, cnt={1}", ts.TotalMilliseconds / cnt, cnt) + "\n";
                this.labelTimer.Update();
            }
        }
VMware player NATで起動したゲストOSにssh接続する



### ホストOS上の設定ファイルの編集
notepad等のエディターを管理者権限で起動し、以下の2つのファイルを編集

#### C:\ProgramData\VMware\vmnetdhcp.confに以下を追加
```
host VMnet8 {
        # ubuntu
        hardware ethernet 00:0c:11:bb:cc:dd;
        fixed-address 192.168.21.127;
}
#End
```

* hardware ethernet ゲストosのMACアドレス;
* fixed-address ゲストOSに割り当てたいIPアドレス;



#### C:\ProgramData\VMware\vmnetnat.conf に以下を追加

```
[incomingtcp]

8022 = 192.168.21.127:22
```

* ホストOSのポート = ゲストOSのIP:ゲストOSのポート番号


### Serviceの再起動

コンピューターの管理のサービス一覧から、
* VMware NAT Service
* VMware DHCP Service
を再起動する

### ゲストOSのNETWORKを再接続する

```bash:
sudo ifdown eth0
sudo ifup eth0
```
固定IPが振られるはず

### ホストOS上のport Listenを確認

```cmd:
netstat -an|findstr 8022
  TCP    0.0.0.0:8022           0.0.0.0:0              LISTENING
```
(ポート番号が8022の場合)

以上で準備完了

### ssh 接続する際は-pでポート番号を指定

```bash:
ssh ホストOSのIP -p 8022
```
で等で接続してみる
Arduinoとブレッドボードで始める電子工作


## Arduinoプログラミング 基本のおやくそく

### プログラミング記述時のおやくそく

* 基本、半角で入力する
* 半角カナは使わない
* 大文字、小文字は区別して書く
* 文の終わりには「 ; 」をつける
* コメントは「 // 」の後に書く。
* コメント欄以外、日本語は使えません。

### プログラミングの基本文法

* 変数 >> 値を入れる箱。```int hako``` ```char hako```のように書きます。
* 型 >> 変数を入れる箱の大きさ ```char```だと1バイト、```int```だと2バイトの大きさになります。
* 関数 >> 手続きをひとまとめにしたもの。例えば以下のように書きます。

```c:kansuu.c
void setup() {
	something();
}
```

### Arduinoでよく使う関数
* ```void setup()``` 初期化関数。最初に一度だけ呼ばれます。
* ```void loop()``` 初期化関数が呼ばれたあと、この関数が呼ばれます。その後、この関数の中に書かれていることが繰り返し実行されます。
* ```Serial.begin(9600)``` 1秒間に9600bitの速度でパソコンと通信を始めます。
* ```Serial.println("something")``` Arduinoからパソコンに文字列を送信します。
* ```analogRead(hako)``` hakoに入っている変数の値を読みます。
* ```analogWrite(LED,S)``` 変数Sに入っている値をLEDがつながっているピンに送ります。
* ```pinMode(pin, INPUT or OUTPUT)``` ピンを入力、もしくは出力にセットします。
* ```digitalWrite(pin, HIGH or LOW)``` ピンの状態をHIGH(1)、もしくはLOW(0)にセットする。


### 参考ドキュメント

* Arduino日本語リファレンス http://www.musashinodenpa.com/arduino/ref/
* Arduinoサンプルページ(英語) http://arduino.cc/en/Tutorial/HomePage


### 電子部品
左から
* タクトスイッチ (ボタン)
* LED (足が長い方がプラス、短いものがマイナス)
* 光センサー (極性なし)
* 抵抗 1KΩ (極性なし)
![eleParts.jpg](https://qiita-image-store.s3.amazonaws.com/0/41825/f46de07e-48cf-dd43-ac81-a0f6c3e86a6a.jpeg "eleParts.jpg")


### ブレッドボードの見方
ブレッドボードは両端の穴が縦につながっており、中央付近に分布している穴は中心にあるくぼみを境にして、横につながっている。
![breadboard.png](https://qiita-image-store.s3.amazonaws.com/0/41825/f71c1197-8875-27bf-f6cc-6d21f8596174.png "breadboard.png")


### ArduinoIDE画面の見方
![arduino画面.png](https://qiita-image-store.s3.amazonaws.com/0/41825/56198b24-d9a1-bea9-dbf4-74845b2de038.png "arduino画面.png")


## サンプルプログラム


### 01 可変抵抗(ボリューム)でLEDをコントロール

**サンプルコード**
![01_02_codes.png](https://qiita-image-store.s3.amazonaws.com/0/41825/39b32819-3487-cbed-cc48-48d74aa244e1.png "01_02_codes.png")

**配線図**
![01_pot_sensor_image.png](https://qiita-image-store.s3.amazonaws.com/0/41825/85288137-ab29-52ba-550c-2f894d5d8c25.png "01_pot_sensor_image.png")


### 02 光センサーでLEDをコントロール
**サンプルコードは01と同じです。**
![02_light_sensor_image.png](https://qiita-image-store.s3.amazonaws.com/0/41825/90d136fb-91e3-669b-6456-d64a56e04f86.png "02_light_sensor_image.png")


### 03 ボタンでLEDをON, OFF

**サンプルコード**
![03_button_code.png](https://qiita-image-store.s3.amazonaws.com/0/41825/84350767-6629-e7de-fa6c-05dca1260070.png "03_button_code.png")

**配線図**
![03_button_sensor_image.png](https://qiita-image-store.s3.amazonaws.com/0/41825/3568632b-bf47-113f-6c6b-30458f6d7047.png "03_button_sensor_image.png")



## 挑戦してみよう

### LEDBar

**サンプルコード**
![try01.png](https://qiita-image-store.s3.amazonaws.com/0/41825/aefc601f-f140-802d-da34-b26eb9e78e7f.png "try01.png")

![try02.png](https://qiita-image-store.s3.amazonaws.com/0/41825/e07f636a-95b0-6b36-7df3-b8f690bdc626.png "try02.png")

**配線図**
![try_ledBar.png](https://qiita-image-store.s3.amazonaws.com/0/41825/db553132-9876-2118-3e9e-3a501abe7276.png "try_ledBar.png")
PowerVR Shellの使い方

======================

PowerVRシェルはすべてのOS依存の初期化コードを扱い、可搬性のあるアプリケーションを書くの非常に便利です。また、いくつかの組み込みコマンドラインフィーチャーがあり、バックバッファやサイズ、垂直同期、アンチエイリアスモードなどの指定ができます。
コードはPVRShellスーパークラスの上に構築されます。アプリでこれを継承するクラスを定義し、次の５つのメソッドを実装しなければなりません。(実行時に基本的に順番に呼び出されます。)

1. InitApplication
このメソッドはすべてのAPIが初期化される前に呼び出されます。ですから、APIを使用しないアプリケーションのデータの設定に使うことができます。例えば、オブジェクトの位置や頂点データの配列をアップロードする前に設定できます。

2. InitView
このメソッドはAPIが初期化された後に呼び出され、APIを使う残っている初期化に使うことができます。

3. RenderScene
このメソッドはジオメトリを描画するために繰り返し呼び出されます。この関数がfalseを返すとアプリは終了処理に入ります。

4. ReleaseView
このメソッドはAPIが解放される前に呼び出され、APIのリソースの解放に使われます。

5. QuitApplication
このメソッドは最後にAPIが解放された後に、ユーザが確保したメモリの解放に使うことができます。
SQLServerで読み取り一貫性

SQLServerで排他ロックにブロックされずにデータを参照するには、
READ COMMITTED SNAPSHOTを設定すると楽であります。
以下、設定方法。

1.現在の設定を確認

```sql:
dbcc useroptions;
```
以下のようになってるかと思います。

![名称未設定-3.gif](https://qiita-image-store.s3.amazonaws.com/0/29940/fba2b90f-e062-ef2e-7d5a-fc8a1cc7e347.gif)

2.READ_COMMITTED_SNAPSHOT をONにする

```sql:
ALTER DATABASE 'DB名'
SET READ_COMMITTED_SNAPSHOT ON;

'強制的に実行する時以下のオプションを付ける'
WITH ROLLBACK IMMEDIATE;
```

3.再度設定を確認

```sql:
dbcc useroptions;
```

以下のようになればOKです。

![名称未設定-4.gif](https://qiita-image-store.s3.amazonaws.com/0/29940/1ba19d92-9e3c-4aad-b048-25142e74b2a2.gif)

参考及び詳細: [SQL Server 2005 Tips and Tips](http://technet.microsoft.com/ja-jp/sqlserver/gg639075.aspx)
JScriptでXXXまとめ

何を投稿したんだか、自分でも把握しづらくなってきたので、リンク集

## リンク集

#### [JScriptでODBCのドライバ一覧を表示](http://qiita.com/tnakagawa/items/0941a0e02d2cb17dc9a4)

#### [JScriptからODBC ドライバ経由でのデータベース接続 その１](http://qiita.com/tnakagawa/items/6478cb75b37a67a134b9)

#### [JScriptからODBC ドライバ経由でのデータベース接続 その２](http://qiita.com/tnakagawa/items/ea9c23891f0c297cdf64)

#### [JScriptでのScripting.FileSystemObjectオブジェクト TIPS](http://qiita.com/tnakagawa/items/c9802f4a54239b703336)

#### [JScriptでHTTPアクセス](http://qiita.com/tnakagawa/items/3bce99d49b1aa3fc9a72)

#### [JScriptでHTTPSアクセス](http://qiita.com/tnakagawa/items/8d9d093b83cab48ae6c7)

#### [JScriptでZIP圧縮＆解凍（MS非推奨）](http://qiita.com/tnakagawa/items/9cddf95a49ab6f552884)

#### [JScriptでHash取得](http://qiita.com/tnakagawa/items/9bcc26b501f5b995d896)

#### [JScriptでBase64](http://qiita.com/tnakagawa/items/beaec98fd64b20894245)

#### [JScriptでメール送信](http://qiita.com/tnakagawa/items/f57509a1fff6238123ff)

#### [JScriptで暗号化、復号化](http://qiita.com/tnakagawa/items/bba972e71cdc4f0f29f5)

#### [JScriptでExcel操作（その１）](http://qiita.com/tnakagawa/items/bcbadf8ee96e79526014)

#### [JScriptでExcel操作（その２）](http://qiita.com/tnakagawa/items/6c468ee355eb9f7c0664)

#### [JScriptでWMI（その１）](http://qiita.com/tnakagawa/items/ae579f19d74dd86e40c6)

#### [JScriptでWMI（その２）](http://qiita.com/tnakagawa/items/89917ca9fbde1c2f47a9)

#### [JScriptでWMI（その３）](http://qiita.com/tnakagawa/items/d157185ddbf39d8c3d48)

#### [JScriptでWMI（その４）](http://qiita.com/tnakagawa/items/adf20356b7081a4c8f53)

#### [JScriptでOfficeドキュメントをPDFに](http://qiita.com/tnakagawa/items/5e566974b5c0caee608e)
#### []()
#### []()
#### []()
#### []()
#### []()
複数の画像を選択する便利なライブラリ Laevatein を Android Studio に導入するための設定 Gradle まわり

Android Studio 及び Gradle は良くわからないので、間違っていたら教えてください。m(__)m

# Gradle まわりの設定がメインです

## github から取得する

自分のプロジェクトの中に modules/laevatein というフォルダをつくってそこに git clone

```
hoge/modules/laevatein > git clone git@github.com:akiramuramatsu/Laevatein.git
```

## プロジェクトの gradle まわりの設定

ルートにある settings.gradle に以下を追記

```settings.gradle
include ':modules:laevatein:laevatein'
```

ルートにある build.gradle に以下を追記

```build.gradle
allprojects {
    repositories {
        mavenCentral()
        maven { url 'https://raw.github.com/nohana/Amalgam/master/amalgam/repository/' }
        maven { url 'https://raw.github.com/KeithYokoma/CompoundContainers/master/repository/' }
        maven { url 'https://raw.github.com/mixi-inc/Android-Device-Compatibility/master/repository/' }
    }
}

project(':modules:laevatein:laevatein') {
    buildscript {
        repositories {
            mavenCentral()
        }
        dependencies {
            classpath 'com.android.tools.build:gradle:0.9.+'
        }
    }
}
```

app 以下の build.gradle に以下を追記

```build.gradle
dependencies {
    compile project(':modules:laevatein:laevatein')
}
```

## Laevaten とは？

以下参照

- https://github.com/nohana/Laevatein
- Android - 超ラクチンに端末の画像を複数選択するためのライブラリを作った話 - Qiita - http://goo.gl/2fvyFG
Sqale体験記

#前置き
なんか作りたい！
人はたびたびこの衝動に駆られます。
そうだ！Railsでウェブアプリを作ってみよう！

ネットなり本なりをみればRailsの情報はたくさんあります．そういうのをみながら，Rails自体の使い方をそこで勉強して，ローカルでいろいろいじっては`rails s`と唱えて楽しむ．将来どこかのレンタルサーバーにでも置かしてもらって・・・と夢見たり．

そうな夢を見ているだけなら楽しいのですが，ふと気がついてしまったのです． __あれ？どこのサーバーに置けばいいの？__

自分の環境はwindows7でrubyは2.0.0p451，railsは4.1.0．いろいろgemがインストールできなかったりして，サーバー側にこれしかいけませんといわれると困ってしまいます．それに，サーバーの使い方の勉強がしたいわけでもありません．ローカルで作ったものをポイっとするだけで大体のことがすんでほしいのです．

で，Sqaleに流れ着きました．gitがよく分からないとか，日本語で安心とか，お試し期間があるとか，そういったこともあり・・・

#Sqale
SqaleはRubyをに対応したPaaSです．レンタルサーバーのようですが，はじめからRubyの環境が用意されています．

使い方に困ったら，ひとまず[サポート](https://sqale.jp/support)をみればよいのですが，読んでも分からないことや自分の都合にあわない部分があるので，自分が詰まったところを書いていきます．

#本編
まず，アカウントを取って試しにテスト用アプリを作ってみるのがよいでしょう．いきなり，ほぼ本番のつもりで作り始めると，お試し期間がもったいないと後悔しました．

gitがわからないので，SFTPを選択し，Cyberduckでやりとり．[マニュアル](https://sqale.jp/support/manual/sftp-win)に詳しく書いてあるので，それを見るのがよいでしょう．

次に[鍵の設定](https://sqale.jp/support/manual/public-keys-win)．いきなり，
>RailsInstallerをインストールしたときにコマンドプロンプトに表示される公開鍵をコピーします。

と書かれていますが，そんなものはしりません．ダッシュボードの公開鍵の設定から __新規公開鍵の作成__ を使います．するとなにかよくわからないファイルがダウンロードされると思います．大切に保管しましょう．後で使います．

そろそろ何か動かしたくなってきます．とおもって，[Getting Started](https://sqale.jp/support/manual/getting-started-win)をみるのですが，Step4から読めばよいでしょう．
>"Command Prompt with Ruby and Rails"から下記のコマンドを実行します。

いきなりよく分からんものがあらわれました．つまるところ，サーバーに命令を送るためのものを起動せよとのことです．いろいろあって，結局，teratermを使うことにしました．

terapermを起動したら，新しい接続を聞かれるので，ホストとポートを編集し，SSH2を選んでOK．すると，SSH認証が聞かれます． __ユーザー名はsqaleのまま，パスフレーズは空白でよく__ ，RSA/DSA/ECDSA鍵を使うを選択し，「秘密鍵」をクリック．先ほどダウンロードした鍵のファイルを選択して「OK」．

`ls`でそのディレクトリの中のものの一覧がでるので，それと`cd`を使って操作します．

手元のフォルダをえい！っとアップロードして済ませようとする場合の話をします．なにはともあれ，すでに作っているもの・雑に作ったテストのものをアップロードしましょう．Sqaleのデフォルトのバージョンでしている場合はこれでもう動くかもしれません．

上手く行かない場合はSqale方の設定が必要ということです．Sqaleのrubyのバージョンが1.9.3なので，rbenvを用いてバージョンを自分のものに合わせます．railsはそれと一緒にバージョンが変わります．

またgemがインストールされないので， __サーバーに`bundle install`させましょう．__ これをしないと，エラーがいつまでも出ます．手元のフォルダをえい！っとアップロードして済ませようとする人はよく注意してください．

mysqlは使うのなら設定がいりますが，Railsデフォルトのsqlite3を用いるときは何もいりません．

大体できたと思ったら再起動や`rake db:migrate`をしましょう，アプリケーションの操作からするのもよいのですが，進行状況がわかりにくいので，teratermから命令を送るのが良いと思います．

分かってしまえば，かなり簡単に使えるんじゃないでしょうか？
Android + Google API で ConnectionResult{statusCode=INTERNAL_ERROR, resolution=null} が出たときのデバッグ方法

# INTERNAL_ERROR だけでは何が悪いのかわかりません

## けつろん

- 詳細なトレースを出そう
- Google API Console をよく見直そう
- だいたいSHA1フィンガープリントが間違っていることが多い
- 原因不明だが再登録して直ることもある

## まずやること

以下の対応をしてトレースに出る内容を増やす。HTTP のリクエスト、レスポンスの詳細がわかるようになる。INVALID_CLIENT_ID とか教えてくれます。

```java
Logger.getLogger(HttpTransport.class.getName()).setLevel(Level.CONFIG);
```

```
% adb shell setprop log.tag.httptransport debug
```

## Google API Console に登録した SHA1 のフィンガープリントとパッケージ名を見直す

SHA1の確認

```
% keytool -exportcert -alias youraliasname -keystore yourkeystore.keystore -list -v
```

## 念のためアプリ自身からSHA1を出力

違うkeystoreが使用されいている可能性もあるので、以下のコードで確認してみる。※リリース時には消そう

```java
    private String getCertificateSHA1Fingerprint() throws java.security.cert.CertificateException {
        PackageManager pm = this.getPackageManager();
        String packageName = this.getPackageName();
        int flags = PackageManager.GET_SIGNATURES;
        PackageInfo packageInfo = null;
        try {
            packageInfo = pm.getPackageInfo(packageName, flags);
        } catch (PackageManager.NameNotFoundException e) {
            e.printStackTrace();
        }
        Signature[] signatures = packageInfo.signatures;
        byte[] cert = signatures[0].toByteArray();
        InputStream input = new ByteArrayInputStream(cert);
        CertificateFactory cf = null;
        try {
            cf = CertificateFactory.getInstance("X509");
        } catch (CertificateException e) {
            e.printStackTrace();
        }
        X509Certificate c = null;
        try {
            c = (X509Certificate) cf.generateCertificate(input);
        } catch (CertificateException e) {
            e.printStackTrace();
        }
        String hexString = null;
        try {
            MessageDigest md = MessageDigest.getInstance("SHA1");
            byte[] publicKey = md.digest(c.getEncoded());
            hexString = byte2HexFormatted(publicKey);
        } catch (NoSuchAlgorithmException e1) {
            e1.printStackTrace();
        } catch (CertificateEncodingException e) {
            e.printStackTrace();
        }
        return hexString;
    }

    public static String byte2HexFormatted(byte[] arr) {
        StringBuilder str = new StringBuilder(arr.length * 2);
        for (int i = 0; i < arr.length; i++) {
            String h = Integer.toHexString(arr[i]);
            int l = h.length();
            if (l == 1) h = "0" + h;
            if (l > 2) h = h.substring(l - 2, l);
            str.append(h.toUpperCase());
            if (i < (arr.length - 1)) str.append(':');
        }
        return str.toString();
    }
```

## さんこう
- android - Error : ConnectionResult{statusCode=INTERNAL_ERROR, resolution=null} - Stack Overflow - http://goo.gl/rF1n2S
- google api - G+ signin on android throws INVALID_CLIENT_ID - Stack Overflow - http://goo.gl/IhsBVs
Android でGoogleAPIを使うときの注意点

# 混乱のもとは Google Play Service 経由で使えるものと使えないものがあること

日々、アップデートが続く Google Play Service 、でも **Googleが公開しているAPIすべてを使えるわけじゃない**。

## けつろん

- ややこしい
- google-api-client-android が橋渡しする

## google-api-java-client の存在

JavaでGoogleAPIを使用するための google-api-java-client というライブラリがある。Google Play Service ではできなくて、google-api-java-client ではできるものもある。

OAuth 認証面倒だよね？Android は Google アカウント連携してるから、誰かその辺うまくやってくれない？

## google-api-client-android の存在

その辺の橋渡しをするのが google-api-client-android 。以下のような実装があり、Android の Context を渡すことで、OAuth2 認証をうまくつなぐのりの役割を果たす。

```GoogleAccountCredential.java
  public static GoogleAccountCredential usingOAuth2(Context context, Collection<String> scopes) {
    Preconditions.checkArgument(scopes != null && scopes.iterator().hasNext());
    String scopesStr = "oauth2: " + Joiner.on(' ').join(scopes);
    return new GoogleAccountCredential(context, scopesStr);
  }
```

## さんこう

https://code.google.com/p/google-api-java-client/wiki/Setup#Maven

## Maven

```xml
     <dependency>
      <groupId>com.google.api-client</groupId>
      <artifactId>google-api-client</artifactId>
      <version>1.18.0-rc</version>
      <exclusions>
        <exclusion>
          <artifactId>xpp3</artifactId>
          <groupId>xpp3</groupId>
        </exclusion>
        <exclusion>
          <artifactId>httpclient</artifactId>
          <groupId>org.apache.httpcomponents</groupId>
        </exclusion>
        <exclusion>
          <artifactId>junit</artifactId>
          <groupId>junit</groupId>
        </exclusion>
        <exclusion>
          <artifactId>android</artifactId>
          <groupId>com.google.android</groupId>
        </exclusion>
      </exclusions>
    </dependency>
```