OmniAICreator/Qiita-1.07M huggingface dataset:
ActiveRecord の serializable_hash の使い方

## 動機
* ロジックの分離、疎結合化を進めたかった。
  * 切り出し先ではデータベースアクセスを一切させない！
  * すべてのデータを引数渡し！
  * ステートレス！
  * テストしやすく！
  * 独立性を確保！
* そのため、次の流れで進めることにした。
  1. 呼び出し元ですべてのデータ取得を事前に行う。
  2. 必要な全データをシリアライズして、切り出し先に引数で渡す。
  3. 受け取ったデータに対して必要な処理を行う。（データベースアクセスなし）
* `serializable_hash` や `as_json` の日本語情報があまりなく、備忘録として本記事を執筆しようと思った。

## serializable_hash の使い方

### 特定の属性だけ、含めたいとき

`self` は `ActiveRecord` オブジェクトであることが前提。

```rb
  self.serializable_hash(
    only: %w(name gender age)
  )
```

### 特定の属性を除きたいとき

```rb
  self.serializable_hash(
    except: %w(id created_at updated_at)
  )
```

### 特定のメソッドの実行結果を serialize 結果に含めたいとき

```rb
  def price_with_currency
    "%5.2f 円" % self.price
  end

  def serialize_for_discount_logic
    self.serializable_hash(
      except: %w(id created_at updated_at),
      methods: %w(price_with_currency)
    )
  end
```

### Association 先を含めたいとき

```rb
class Order < ActiveRecord::Base
  belongs_to :customer

  def serialize_with_the_buyer_full
    self.serializable_hash(
      include: customer
    )
  end
end
```

### Association 先でもシリアライズする属性を指定したいとき。

```rb
class Order < ActiveRecord::Base
  belongs_to :customer

  def serialize_with_the_buyer_partial
    self.serializable_hash(
      include: {
        customer: {
          except: %w(id created_at updated_at)
        }
      }
    )
  end
end
```

### 属性取得方法をカスタマイズしたいとき

`read_attribute_for_serialization` をオーバーライドすると、属性の取得方法をカスタマイズできる。
デフォルトは `Object#send`。 `attr_accessor` を使っている場合など、通常の利用では、このオーバーライドは不要。

逆に getter を定義しない場合とかに便利。

```rb:person.rb
class Person
  include ActiveModel::Model
  include ActiveModel::Serialization

  def initialize(data = {})
    @data = data
  end

  def age= age
    @data["age"] = age
  end

  def read_attribute_for_serialization(key)
    @data[key]
  end

  def attributes
    @data.dup
  end
end

person = Person.new
person.age = 20

person.serializable_hash()
```

### as_json の話

`as_json` メソンドは実は `serializable_hash` のうすいラッパーなので、上記で書いているのは、 `as_json` でもあてはまります。
React.jsで「...you called setState() on an unmounted component」のWarningがでないようにする

# 問題

unmounted状態のcomponenentでsetStateを呼び出すと、以下のようなWarningが表示されてしまいます。

~~~
Warning: setState(...): Can only update a mounted or mounting component. This usually means you called setState() on an unmounted component. This is a no-op.
~~~

# 解決方法

setState(...)を呼び出す前に、unmountedかどうかチェックするようにします

~~~
# sample.coffee

if @isMounted()
  @setState(...)
~~~
Kinect v2開発環境の準備

以下の環境で説明する．

* Windows 8.1
* Visual Studio Community 2013
* OpenCV 3.0

# SDKのインストール

以下のウェブページからSDKをダウンロードする．
https://www.microsoft.com/en-us/kinectforwindows/develop/
登録を勧めるダイアログが表示されるが，いずれでもよい．

![kinect-download-01.png](https://qiita-image-store.s3.amazonaws.com/0/53034/5b3b95bb-5540-2c57-8ab5-25e867c34208.png)
![kinect-download-02.png](https://qiita-image-store.s3.amazonaws.com/0/53034/963258bf-799d-dafe-88d4-b5c4a6fd2013.png)
![kinect-download-03.png](https://qiita-image-store.s3.amazonaws.com/0/53034/db8fe49b-ab85-7758-4c7c-fb2d80fb4901.png)

2015/08/02時点では，KinectSDK-v2.0_1409-Setup.exe が最新バージョンである．
インストーラを実行する前に，Kinectは外しておく．
インストールに関しては，他には特段の解説は必要ないと思われる．順次行えばよい．
インストールが終了したら，Kinectを接続すると，各種ドライバがインストールされる．やや時間がかかるときもあるが気長に待つ．

サンプルなどは以下のフォルダに格納されるので大いに参照するべき．
`C:\Program Files\Microsoft SDKs\Kinect\v2.0_1409`

# 実行テスト

まず，自作のプログラムを作成する前に，Kinect Studio v2.0 を起動してデータが取得できることを確認する．
Win+Q で kinect を検索するなどして，Kinect Studio v2.0 を起動する．
ウィンドウの左上のアイコンをクリックすると，KinectとPCが接続されて距離画像が表示される．
![kinect-setting-01.png](https://qiita-image-store.s3.amazonaws.com/0/53034/db902eba-80f3-99f1-532d-eccae46a933c.png)

# Visual Studio の準備

Visual Studio を用いて C++ のプログラムを開発する場合，各種パスの設定が必要である．
Visual Studio 共通の環境として設定しておく．OpenCVの設定事例に倣い，プロパティシート Microsoft.Cpp.Win32.user あるいは Microsoft.Cpp.x64.user を設定する．プロパティシートの一般的な取り扱いについては，以下を参照されたい．
[Visual StudioでOpenCV3.0開発環境を準備する#Visual Studio 2013 の設定](http://qiita.com/imura/items/d5fadbbcf1830019adce#visual-studio-2013-%E3%81%AE%E8%A8%AD%E5%AE%9A)

Kinect v2 SDK をインストールすると，環境変数 KINECTSDK20_DIR が `C:\Program Files\Microsoft SDKs\Kinect\v2.0_1409\` と設定されているので，Visual Studio の設定でもこの環境変数を参照する．$(KINECTSDK20_DIR) と記述すれば参照できる．

追加のインクルードディレクトリには `$(KINECTSDK20_DIR)\inc` を，追加のライブラリディレクトリには 32ビットバイナリ(Microsoft.Cpp.Win32.user)の場合は `$(KINECTSDK20_DIR)\Lib\x86` を，64ビットバイナリ(Microsoft.Cpp.x64.user)の場合は `$(KINECTSDK20_DIR)\Lib\x64` を指定する．

また，DLLが見つけられるようにするため，環境変数 Path の末尾にセミコロンで区切って，`%KINECTSDK20_DIR%\bin` を追加しておく．

`kinect20.lib` をリンクする必要がある．プロジェクトのプロパティから 構成プロパティ > リンカー > 入力 > 追加の依存ファイル をたどり，`kinect20.lib` を追加する．
インスタンスでDataAdapter,DataTableを保持せずにDataAdapterでデータベースの値を更新する

そういう要求があって調べる機会があったので、こういうこともできるという備忘録的に

```vb.net:Form1.vb
Imports System.Data.SqlClient
Imports System.Text

Public Class Form1
    Private connectionString As String = "適当な接続文字列"

    'dataGridViewにデータ格納
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

        Dim sql As New StringBuilder

        sql.AppendLine("SELECT")
        sql.AppendLine("    P_Key,")
        sql.AppendLine("    value1,")
        sql.AppendLine("    value2")
        sql.AppendLine("FROM")
        sql.AppendLine("    Test")

        Dim con As New SqlConnection(connectionString)
        Dim cmd As New SqlCommand(sql.ToString, con)
        Dim da As New SqlDataAdapter(cmd)

        Dim dt As New DataTable

        con.Open()

        da.Fill(dt)

        DataGridView1.DataSource = dt

        con.Close()

    End Sub

    'dataGridViewの変更をSQLServerに反映
    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click

        Dim sql As New StringBuilder

        sql.AppendLine("SELECT")
        sql.AppendLine("    P_Key,")
        sql.AppendLine("    value1,")
        sql.AppendLine("    value2")
        sql.AppendLine("FROM")
        sql.AppendLine("    Test")

        Dim con As New SqlConnection(connectionString)
        Dim cmd As New SqlCommand(Sql.ToString, con)
        Dim da As New SqlDataAdapter(cmd)

        Dim dt As DataTable = New DataTable

        con.Open()

        da.Fill(dt)

        dt.Merge(CType(DataGridView1.DataSource, DataTable))

        da.Update(dt)

        con.Close()

    End Sub

End Class
```

まぁ普通は素直にインスタンスでDataAdapterとConnection保持しろって話になるんですが。
データベースへの接続用のクラスがSELECT終わる度にConnectionをDisposeするような実装になってたりする場合は選択肢に入るかもしれない。

~~そもそもDataAdapterによる更新を使う機会が多くないってのは無し~~
IPFSをソースからインストールする方法




## バイナリからインストール

* バイナリはこちらからダウンロード&インストール
 * [ipfs.io/docs/install/](http://ipfs.io/docs/install/)


## 依存

* Go 1.4  のインストール (コンパイルするには 1.4であることを確認)
* Git のインストール (依存のダウンロード)
* オプションで FUSE のインストール (マウント用 / 上級者向け)


## Goの準備


GOPATHを通す。例えば、以下のように

```
export GOPATH=$HOME/.go
```

bin/ にPATHを通す

## ソースからのインストール


以下を実行

```
go get -u github.com/ipfs/go-ipfs/cmd/ipfs
```


## 動作チェック

```
% ipfs version
ipfs version 0.3.7
```

## アップデート方法?

```
go get -u all
```
foreach($array as $key => $array) 時の動作

`foreach($array as $key => $array)`
`$array` が繰り返す配列かつ要素の値の場合です。

Githubのどこかで見つけて、IDEがエラーでなく警告判定していたのでへーと思いました。

でもどんな動きになるのかわからないので動かしてみた。

# 結論

繰り返し中、繰り返し後に元々の配列'$array'を使用しないならば問題なし。(`$array[]`や`$array[$key]`は危ない)
逆に使っているならば結果がおかしいとすぐに分かると思う。

# :one: foreach($array as $key => $array)

```php:foreach1,php

$array = array('A' => 'a', 'B' => 100, 'C' => true);

foreach ($array as $key => $array) {
    echo "key: " . $key . " array: " . $array . "\n";
    echo "array[key]: " . $array[$key] . "\n";
    var_dump($array);
}

var_dump($array);

```

```
key: A array: a
array[key]: a
string(1) "a"
key: B array: 100
array[key]:
int(100)
key: C array: 1 # true は出力で1
array[key]:
bool(true)
bool(true)

```

* `foreach`は回る
* `$key`での参照はエラー自体は無し。(aは`string`の添字参照で出たと思う)
* `$array`は`foreach`内ですでに要素の値に置き換わっており、ループを抜けても最後の要素のまま

# :two: foreach($array as $array)

```php:foreach2,php

$array = array('A' => 'a', 'B' => 100, 'C' => true);

foreach ($array as $array) {
    echo "array: " . $array . "\n";
    var_dump($array);
}

var_dump($array);


```

```
array: a
string(1) "a"
array: 100
int(100)
array: 1
bool(true)
bool(true)

```

こちらも元々の`$array`が壊れる以外は問題無し。
やる意味は特になかったか。

# :three: foreach($array as $key => $array) かつ数値配列

普通の配列の場合(まだ全部連想配列なんですが)


```php:foreach3.php

$array = array('a', 100, true);

foreach ($array as $key => $array) {
    echo "key: " . $key . " array: " . $array . "\n";
    echo "array[key]: " . $array[$key] . "\n";
    var_dump($array);
}

var_dump($array);

```

```
key: 0 array: a
array[key]: a
string(1) "a"
key: 1 array: 100
array[key]:
int(100)
key: 2 array: 1
array[key]:
bool(true)
bool(true)

```

まぁ問題なし。


# :four: foreach($array as $key => $array) かつ数値配列で値がstring

:one: の時点で`string`の添字参照は危なそうと思った。

```php:foreach4.php

$array = array('a', 'b', 'c');

foreach ($array as $key => $array) {
    echo "key: " . $key . " array: " . $array . "\n";
    echo "array[key]: " . $array[$key] . "\n";
    var_dump($array);
}

var_dump($array);

```

```

key: 0 array: a
array[key]: a
string(1) "a"
key: 1 array: b
PHP Notice:  Uninitialized string offset: 1 in /tmp/foreach4.php on line 47
array[key]:
string(1) "b"
key: 2 array: c
PHP Notice:  Uninitialized string offset: 2 in /tmp/foreach4.php on line 47
array[key]:
string(1) "c"
string(1) "c"

```

やったぜ。
「添字 + 1 > 要素の文字数」 の場合はoffsetでエラーになりそう。
AngularJSのFactoryとServiceをCoffeeScriptのclassを使って書く

AngularJSのFactoryとServiceをCoffeeScriptのclassを使うとこう書ける。

```coffeescript
# factory
angular.module('myApp').factory 'HogeFactory', [
  '$injection'
  ($injection) ->
    class HogeFactory
      constructor: ->
    
    {
      create: -> new HogeFactory
    }
]
```

```coffeescript
# service
angular.module('myApp').service 'FugaService', [
  '$injection'
  class FugaService
    constructor: ($injection) ->
]
```

- Factory: インスタンスを生産する機能を持ったオブジェクト
- Service: インスタンス

というかんじでFactoryとServiceの違いを理解しやすくなる気がしている。
仮想環境にMongoDBを入れる


# 開発環境
- 仮想環境
CentOS6.6 (Virtual box, Vagrant)
- ホストOS
 Windows8.1
- 仮想環境のIPアドレス
 192.168.33.10

# 仮想環境にMongoDBのインスコ
仮想環境にて準備。

```shell-session:shell
$ sudo vi /etc/yum.repos.d/10gen.repo
```

```vim:/etc/yum.repos.d/10gen.repo
[10gen]
name=10gen Repository
baseurl=http://downloads-distro.mongodb.org/repo/redhat/os/x86_64
gpgcheck=0
enabled=1
```

```shell-session:shell
$ sudo yum repolist
$ sudo yum install mongo-10gen mongo-10gen-server
```

# ホストPCから仮想環境のMongoDBをGUIで操作する

## ポートを開ける

```shell-session:shell
$ sudo vi /etc/sysconfig/iptables
```

```vim:/etc/sysconfig/iptables
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
# 下記一行を追加
-A INPUT -p tcp -m state --state NEW -m tcp --dport 27017 -j ACCEPT
```

```shell-session:shell
$ sudo service iptables restart
```

## MongoDBに使用するIPを指定する。

```shell-session:/etc/mongod.conf
# Listen to local interface only. Comment out to listen on all interfaces.
# bind_ip=127.0.0.1
bind_ip=127.0.0.1,192.168.33.10
```
※2015/08/25 内部から接続できなくなる事象が発生したのでbind_ipに`127.0.0.1,`を追記しました。

## 起動

```shell-session:shell
$ sudo service mongod start
```

※ これで起動できない場合、下記のコマンドでも起動できます。
　 ただし、そのシェルは立ち上げっぱなしにしないといけないです。

```shell-session:shell
$ mongod                                         
```

## Mongo ExpressのDL

### ダウンロード
Cドライブ直下に`mongodb`というディレクトリを作成し、そこにツールをDLします。

```shell-session:shell
$ cd C:\mongodb
$ npm install https://github.com/andzdroid/mongo-express/tarball/master
$ cd node_modules/mongo-express
$ cp config.default.js config.js
```

### 設定ファイルの修正
```js:config.js
  // 仮想環境のIPアドレスを指定
//   server: 'localhost',
   server: '192.168.33.10',

～～中略～～

  // Basic認証を外しておく
//  useBasicAuth: true,
  useBasicAuth: false,
```

### ツール立ち上げ
```shell-session:shell(node_modules/mongo-expressのディレクトリ内)
$ node app
Mongo Express server listening on port 8081
Database connected!
Admin Database connected
```

### ホストPCのブラウザからツールにアクセス
http://127.0.0.1:8081/


# Tips

## サービスの停止
```shell-session:shell
$ sudo service mongod stop
```

## シェルの立ち上げ
```shell-session:shell
$ mongo
MongoDB shell version: 2.6.10
connecting to: test
> 
```

## 「service mongod start」が失敗する

1\. .lockファイルを探して削除。

```shell-session:shell
$ find / -name mongod.lock -type f
$ rm -f /var/lib/mongo/mongod.lock /usr/local/var/mongod/mongod.lock
```

2\.  DBの修復

```shell-session:shell
$ mongod --repair --dbpath=/data/db/
```

3\. 権限の確認

私はここが原因でした・・・。mongodbで使用するファイル全ての権限を調査していると
一部rootユーザーになっているものが・・・・。

権限を変更して・・・

```shell-session:shell
$ chown mongod:mongod /var/log/mongodb/mongod.log
```

起動成功！

```shell-session:shell
$ service mongod start
$ ～略～     [  OK  ]
```

[Stackoverflowにて助けていただきました。](http://ja.stackoverflow.com/questions/13047/mongodbのサービスを常駐できない)

## 「mongod」のサービスは起動しているのに「mongo」シェルが使用できない！

mongoコマンドをシェルで打つと、bind_ipで指定していないローカルのipが・・・
⇒指定した方がいいらしい！

```shell-session:shell
$ vim /etc/mongod.conf

~略~
bind_ip=127.0.0.1,192.168.33.10
~略~
```

保存してサービスを再起動したら「mongo」シェル使用できました！
font-weight:boldにするとChromeで絵文字が表示されない

font-weight:bold;を指定するとChromeだと絵文字が表示されないというメモ

例えばこんな絵文字列

```
絵文字：🚥✋⏩
```

## イタリックはOK
*絵文字：🚥✋⏩*
ちゃんと斜めになる

## 太文字はNG
**絵文字：🚥✋⏩**
表示されない

たしかに絵文字の太文字ってどう表現するんだろうって感じですが、
Firefoxだと絵文字に影がついた感じで表示される

## chromiumのissueに上がっていました
[https://code.google.com/p/chromium/issues/detail?id=441946](https://code.google.com/p/chromium/issues/detail?id=441946)
QRP CWトランシーバ


マイコン制御のやつは組み立てだけ自分でできてもなあという感じなので、マイコンなしのキットか、マイコン載ってるやつはファームウェアがオープンソースのものを中心にピックアップ。

# FOXX3

http://www.kanga-products.co.uk/index.php?page=shop.browse&category_id=8&option=com_virtuemart&Itemid=58

* キット
* 6000円くらいで買える、安い
* 液晶なし

#  KEM-TRX-2B-CW

http://www.kida-elec.com/kem-trx-2B-CW.html

* キット
* 液晶あり
* 不自由ソフトウェア

# 506 Rebel

http://www.rkrdesignsllc.com/products/transceivers-receivers/506-rebel-open-source-qrp-transceiver/

* Arduinoベース
* 筐体内部にArduinoのシールドが載せられるっぽくてCWトランシーバ付きArduinoといった感じ

# openQRP

http://openqrp.org/

* Arduinoベース
ESP8266(ESP-WROOM-02)のチョイはまり回避のためのTips集

ArduinoIDEを使ってESP8266をプログラムする上でハマったことを、随時更新していく予定です。
ストックしてもらえれば、更新時に適宜通知させてもらいます。

# WDTの発動調整
2015.08.17追記
SDKでの対応が行われたようで、ArduinoIDE向けのStaging versionには、8/10リリース分で正式な対応が行われました。`ESP.wdtFeed()`　が使える様になっています。（バージョンとしては、1.6.5-1044-g170995aになります。）


2015.08.05記載の旧版（WDTについての記載として古いです）
`setup()`や、`loop()`内で、`while(true)`などやると、1秒ぐらいでWDTが更新できずに、強制リセットがかかります。
`while(true)`内に、`delay(1)`を入れておけば、WDTがリセットされるらしく問題になりません。
本来は`ESP.wdtFeed()`が使えれば良いのですが、ソースを確認したところ中身がまだ空っぽで役に立たなかったので、取りあえずの回避策として`delay(1)`を使っています。

# 電源の確保
2015.08.07記載
Deep-Sleepモードで消費電力が少ないとか書いていますが、無線LANの稼働中は大きな電力を消費します。他の方のブログを読んでも皆さん同じ所でハマっていたりするので、まとめの意味も込めてココに書いておきます。
例えば、こんな使い方だと上手く動かないことがほとんどです。

* ArduinoUNOから3.3V電源を取り出した。
* USBシリアル変換ユニットから3.3Vを取り出した。
* たくさんのIOを同時に動かした。IOピンの電流を大きく流してしまった。（LED駆動のための電流制限抵抗が小さい、など）

そんなときは、3.3Vの電源ラインに電解コンデンサを追加して足りない電力を補えるようにしましょう。
私は、手元に転がっていた、一番大きな1000μFの電解コンデンサを繋いで動かしています。
470μFでも動かせます。一番正しいのは、ちゃんと大きな電源を用意して動かす事だと思いますが、取りあえず大きい電解コンデンサを追加して済ましています。

2016.04.18記載
http://takehikoshimojima.tumblr.com/post/138379135064/esp8266%E3%81%AE%E6%B6%88%E8%B2%BB%E9%9B%BB%E6%B5%81%E3%82%92%E8%AA%BF%E3%81%B9%E3%82%8B
上の投稿によると、起動時にはWiFiにつながなくとも300mAぐらい電流が流れるとのこと。皆様注意しましょう。
wordpressのインストールってたびたびエラー起こるな。（ログインできない時）wondaの備忘録

wordpress4.2.3を使用

wordpressは何度かブログ作成に使ったことがあるのだが
なんだかんだ毎回1.2回インストールに失敗するので
「失敗しないインストール方法」を残します。

確認事項
・MySQLのrootのパスワード設定は絶対
・phpMyAdminを使用する場合、wordpress用に作成したデータベースに入り
　特権から「ユーザーを追加」を選択

・ブラウザからのインストール設定時、パスワードは「弱い」以上を選択
:key: POINT 「非常に弱い」でもインストールを開始するのだが
ログイン時になってみると認証できないエラーが発生。
もし「非常に弱い」でパスワード設定してログインが出来ないようでしたら
パスワードの文字数を増やしてみてください。

以上、簡単ですがインストール時に押さえておくべきポイントを
羅列しておきました。
ハッシュリンクで画面切り替えElm

追記2016/09/06
この記事は古くなっています。
公式からブラウザルーティングのライブラリが出ているので、こちらを検討してみてください。
[elm-lang/navigation: Routing for SPAs, the Elm way](https://github.com/elm-lang/navigation)

## Elmでブラウザルーティングっぽいデモをつくる。

*  アドレスの後ろにハッシュ(#)が付いたリンクは、アドレスの特定の部分(同id名)にリンクするハッシュリンクになる。
*  history apiという、ブラウザの戻る進むを操作するapiがある。

ブラウザルーティングとは上記のような技術とかいろいろ組み合わせて、ルーティングっぽいインターフェイスで、リンクごとにページをモジュールのように使えるようにしたもの。
Elmにもそういった機能と見た目を提供するライブラリ（elm-history,elm-router）があるので簡単に作ってみる。


![tab.gif](https://qiita-image-store.s3.amazonaws.com/0/32808/4a59bcb9-5bc7-00c7-d585-3494810899b1.gif)

ブラウザデモhttp://giisyu.github.io/elmHistoryTest/
ソース　https://github.com/giisyu/elmHistoryTest

## elm-historyライブラリ
history api のラップライブラリ。
`setPath : String -> Task error ()`
ブラウザにパスをセット、履歴も変わる。今回使わない。
`path : Signal String` 
リロードなどすると、現在のパス（ルートなら"/"）をSignalする。しかし"#hoge"みたいなハッシュリンクをsetPathしても反応無いので今回は使わない。
`hash : Signal String`
`setPath`にリンクをセットした時、ハッシュリンクをクリックした時にSignalする。setPathに`"#"`のみをセットした時や現在パスがルートの時は、`""`を返す。

## 流れ

上記のような挙動（chrome）なので以下のようになりました。

ナビゲーションボタンはハッシュ付きリンクを叩くようにする。

```
navbar : Html
navbar = 
  navbarDefault' "" 
            [ containerFluid_ 
              [ navbarHeader_ [] 
              , div [class "collapse navbar-collapse"] 
                    [ ul [ class "nav navbar-nav" ] 
                         [ li [] [ a [href "#" ] [text "page-1" ] ] 
                         , li [] [ a [href "#/page2" ] [text "page-2" ] ] 
                         , li [] [ a [href "#/page3" ] [text "page-3" ] ] 
                         ]
                    ]
              ]
            ]
```


タブが押されアドレスが変わると、hashからハッシュ付きアドレスがSignalされる。

```
main = view <~ (Debug.log "hash" <~ hash)

```
その値を使って、画面を切り替える。

ちなRouterは、`Route a = String -> a`というStringから処理を振り分ける関数型Routerを作って文字列を渡す、とパースして振り分けてくれる。振り分けるときにヒット時の文字列を除いた残りも振り分け先に渡すので、入れ子で複雑なパスのルーティングも可能です。ルーティングっぽい見た目。



```

mainRoute : Route Html
mainRoute = 
    match
      [ "#/page2"    :-> page2
      , "#/page3"    :-> page3
      ] page1

view address = 
        div [] [ navbar
               , mainRoute address]

```

話を戻して、以上でできました。

hashを使って、冒頭のgifのようなリロードも出来る切り替え画面が作れます。SEOとかについてはよくわからない。

ソース全文になります。github : https://github.com/giisyu/elmHistoryTest
（bowerでbootstarapを入れて使ってます。app.elmはapp.jsにコンパイルします。）

すごく簡単にルーティングっぽい見た目と画面の切り替えを実装できました。
ElmおもしろいよElm。
あと補足として、elm-historyライブラリはすべてのブラウザ環境とかを考慮しない簡単なデモ用のライブラリです。Elmが世のフレームワークのような規模、網羅性を持つようになるのはいつだろうかと思いつつ以上です。
Basic認証のあるページにユーザ名とパスワードを書いたURLでブラウザからアクセスしました。

Basic認証は、ページに毎回パスワードを入れるのが面倒です。

# Basic認証ページにパスワード入力なしでアクセス

```bash:basic認証のURLへアクセス
http://ユーザ名:パスワード@example.com
```
上記のようにユーザ名とパスワードを書いたURLにアクセスすれば、Basic認証のパスワード入力を求められません。

以下は`pugiemonn.com/hoge`にBasic認証がかかっている場合、ユーザ名が`pugi`、パスワードが`password`の例です。

```bash:basic認証のURLへアクセス
http://pugi:password@pugiemonn.com/hoge
```

このようにアクセスするとパスワード入力を求められず、Basic認証の入力なしにページを表示できました＼(^o^)／

curlなどでプログラムからBasic認証があるページにアクセスするときも使えます。
unity > ntpアクセス > エラー > System.Net.sockets.SocketException has been thrown / Access denied

```
Unity 5.1.1f on MacOS X
```

非同期通信によるntp接続のサンプルが以下に紹介されている。
http://ftvoid.com/blog/post/847

試しに実行してみたところ、以下のsock = new UdpClient(ipAny);のところでエラーがでた。

```
	private void Request() {
		// ソケットを開く
		ipAny = new IPEndPoint(IPAddress.Any, 123);
		sock = new UdpClient(ipAny);
```

エラーメッセージは以下。

```
System.Net.Sockets.SocketException has been thrown
Access denied
```

検索してみたが、解決法は見つからなかった。

ダメ元で以下の変更をするとエラーがでなくなった。

```txt:変更元
sock = new UpcClient(ipAny);
```

```txt:変更先
sock = new UpdClient();
```

これだとポートの指定などなくなるので、違和感がある。
技術英語 > some point in time

どこかでふと聞いたフレーズ
some point in time (過去のある時点)

<hr>
https://github.com/arn-e/misc-utility-scripts
> Collection of miscellaneous utility scripts written <font color=red>at some point in time</font> or another...

<hr>
https://github.com/ketema/shellscripts_N_oneliners
> Collection of NIX based shell scripts and one-liners that I have used <font color=red>at some point in time</font> ...

<hr>
http://www.loe.org/shows/shows.html?programID=03-P13-00035
> And so <font color=red>at some point in time</font>, a family is going to move into this apartment,
OS X Mountain Lion で Postfix がエラーになる


超絶参考
http://blog.sarabande.jp/post/29081891413

### 問題
```
sendmail: fatal: chdir /Library/Server/Mail/Data/spool: No such file or directory
```

### 解決方法
```
sudo mkdir -p /Library/Server/Mail/Data/spool
sudo /usr/sbin/postfix set-permissions
sudo /usr/sbin/postfix start
```

### ただしこんなエラーが出たよ
```
chown: /usr/share/man/man1/postalias.1.gz: No such file or directory
```

### これで直るって言う話がある（うちは直らず）
```
sudo chmod g-w /Library/Server/Mail/Data/mta
```

### とりあえず起動と停止
```
sudo /usr/sbin/postfix start
sudo /usr/sbin/postfix stop
```

おしまう
iOSでパーセントエンコード(Swift)


URLのクエリパラメータや、x-form-urlencodedのbodyで使うためのエスケープ関数を作りたい。

こういうやつ。

```swift
"q=" + uriEncode("a")   // => "q=a"
"q=" + uriEncode("a b") // => "q=a%20b"
"q=" + uriEncode("あ")  // => "q=%E3%81%82"
```

## `stringByAddingPercentEscapesUsingEncoding`

最初に見つけたやつがこれ。

```swift
func uriEncode(str: String) -> String {
  return str.stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding)!
}
```

上の仕様だけなら実はこれで成り立つ。しかし、いくつか問題になりそうなやつがある。

```swift
"q=" + uriEncode("=") // => "q=="
"q=" + uriEncode("&") // => "q=&"
```

ツライ。

## `CFURLCreateStringByAddingPercentEscapes`

これじゃ駄目だよということでよく見かけるやつが、 `CFURLCreateStringByAddingPercentEscapes` を使う方法。

- http://blog.daisukeyamashita.com/post/1686.html

しかし、iOS7からは別の便利なAPIが提供されたそうなので、Swiftだったらそっちを使ったほうが良さそう。

- http://qiita.com/jtemplej/items/42e50ae30214ffcd80ae

## `stringByAddingPercentEncodingWithAllowedCharacters`

iOS7からのAPIがこれ。

```swift
func uriEncode(str: String) -> String {
  return str.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.alphanumericCharacterSet())!
}
```

よさそう。

```swift
"q=" + uriEncode("=") // => "q=%3D"
"q=" + uriEncode("&") // => "q=%26"
```

しかし、`alphanumericCharacterSet` だと上のブログ記事にもあるように、RFC3986的にはエスケープしなくても良いハイフンとかアンダースコアまでエスケープしてしまう。

```swift
"q=" + uriEncode("-") // => "q=%2D"
"q=" + uriEncode("_") // => "q=%5F"
```

これはこれでウェブサーバーは正しく扱ってくれるような気がするけどね。

### `URLQueryAllowedCharacterSet`

`NSCharacterSet.URLQueryAllowedCharacterSet` というのがあって、一見使えそうに見えるがこれは全然駄目。

```swift
// これは駄目なコード
func uriEncode(str: String) -> String {
  return str.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLQueryAllowedCharacterSet())!
}
```

```swift
uriEncode("!*'();:@&=+$,/?%#[]-._~ ") // => "!*'();:@&=+$,/?%25%23%5B%5D-._~%20"
```

特にイコールやアンパサンドがエスケープされていない。

## RFC3986準拠

ハイフン、アンダースコア、チルダ、ピリオドをきちんと除外してRFC3986で規定されているような形にするには、たぶん今のところはこうやるしかないのかなと思う。

```swift
func uriEncode(str: String) -> String {
  var allowedCharacterSet = NSMutableCharacterSet.alphanumericCharacterSet()
  allowedCharacterSet.addCharactersInString("-._~")
  return str.stringByAddingPercentEncodingWithAllowedCharacters(allowedCharacterSet)!
}
```

```swift
uriEncode("!*'();:@&=+$,/?%#[]-._~ ") // => "%21%2A%27%28%29%3B%3A%40%26%3D%2B%24%2C%2F%3F%25%23%5B%5D-._~%20"
```

## まとめ

Swift (iOS7以上)で使うならこれでたぶん十分。

```swift
func uriEncode(str: String) -> String {
  return str.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.alphanumericCharacterSet())!
}
```

RFC3986に従いたい人はこうする。

```swift
func uriEncode(str: String) -> String {
  var allowedCharacterSet = NSMutableCharacterSet.alphanumericCharacterSet()
  allowedCharacterSet.addCharactersInString("-._~")
  return str.stringByAddingPercentEncodingWithAllowedCharacters(allowedCharacterSet)!
}
```
AtomでSublimeTextみたいに保存しないで終了しても再開できるやつ

「Atom SublimeText 中断」とか「Atom SublimeText 保存しなくていい」とかでググって、
今まで全然見つからなくて辛かったのですがやっと出会えました！！

# save-sessionを使う
- [save-session](https://atom.io/packages/save-session)

これを入れればSublimeTextみたいに、保存する前に突然Cmd+Q押したくなっても編集データが助かる！！
僕はUntitledのままテキスト書き連ねることが多いので、この機能があればSublimeTextから引っ越せるかもしれません。

-----

名前を知ってしまえばググれるけど、名前を知るまではググれないの難しいですね。
浮動小数点型で繰り返し二乗法を行いたい


## 背景
繰り返し二乗法を行う場合、たとえ結果が32bit整数に収まるとしても、一度64bit整数を介さなければ、オーバーフローのため正しく計算できなくなる。
しかし、言語によっては64bit整数が提供されていない場合がある。32bitを越えると自動的に浮動小数点型に変換される場合が多い。
剰余にもよるが、大抵は誤差が発生してしまうだろう。

## 方法
繰り返し二乗法の基本的な **擬似** コードを示す。

```pow.js
var mod=123456789;
var n=1234567;
var p=2345678;
var r=1;
for(;p;p>>=1){
	if(p&1)r=r*n%mod;
	n=n*n%mod;
}
console.log(r);
```

JavaScriptの文法を用いて書いている。すなわち、このコードは誤差のため **正しくない** 。
これをなんとかするには、このrとnに桁区切りを設ける。
`$ factor 123456789 #=> 123456789: 3 3 3607 3803`なので、10821と11409を使う。
r=10821a+b, n=11409c+dと書くとすると、r*nは`123456789ac+10821ad+11409bc+bd`と表せる。
欲しいのは **123456789で割った余り** なのだから、1項目はまるまる不要ということになる。
bをくくりだすと、計算すればよいのは`b*n + a*d*10821`ということになる。
これを用いて正しいコードを記述することができる。

```pow_correct.js
var mod=123456789;
var F1=10821;
var F2=mod/F1; //11409
var n=1234567;
var p=2345678;
var r=1;
for(;p;p>>=1){
	if(p&1)r=(r%F1*n + (r/F1^0)*(n%F2)*F1)%mod;
	n=(n%F1*n + (n/F1^0)*(n%F2)*F1)%mod;
}
console.log(r);
```

### 条件
`b*n + a*d*10821`という式において、aとdは11409未満、bは10821未満である。
つまりこの式は`mod * (10821+11409)`未満ということになる。double型の仮数部は52bitなので、「modの因数があるとき(Fとする)、`mod * (F+mod/F)`が1<<52未満」なら条件を満たせることになる。
そのため、実は上のコードで`F1=9`としても問題なく動作する。

## まとめ
本記事では剰余がある程度大きい因数を持つならば、浮動小数点型を用いて繰り返し二乗法を適用できることを示した。

## 150811追記
このテクニックは場合によりC等に応用できうる。
[HackerRank ProjectEuler+ 97](https://www.hackerrank.com/contests/projecteuler/challenges/euler097)。この問題では剰余が`10**12`である。よって、C言語で普通に解くとしても64bit整数に収まらない。
ところが、この手法を使うと見事`10**12 * 2*10**6`は1<<63未満になるので、問題なく解くことができる。
尤もJavaScript/AWKでこの問題が解けるのかはわかりませんが…。

(HackerRankはPythonは実行時間5倍のgraceがあるのでpow()使えば普通に突破できるのは不問で。Rubyでは解けませんでしたので。)
AWS Lambda JavaでJRuby

#コード
コード一式は https://github.com/c9katayama/aws-lambda-jruby にあります。

#使い方
githubからclone後、src/main/resources/main.rb にrubyコードを書きます。同ディレクトリ内のファイルは全てLambdaにデプロイされるため、必要なファイルはこのディレクトリに置きます。
stdlibは、JRubyに付属の標準ライブラリが入っています。このディレクトリはaddLibPathでパスが通っているので、ここに入っているrbファイルは

```rb
require 'yaml'
```

とするとmain.rbから使用することができます。

##開発
rubyファイル作成時にローカルでテストしたい場合は、 src/test/java/AWSLambdaJRubyTestMain を実行します。
AWSLambdaJRubyは、Lambdaで受け取ったパラメータをJSONにし、Rubyのグローバル変数$lambda_argにセットを行います。rubyファイル内でLambdaのパラメータを取りたい場合は、$lambda_argから取り出します。
（サンプルのmain.rbはLambdaのパラメータをyaml化するコードになっています）

##ビルド/デプロイ

```
./gradlew build 
```

でビルドを行います。build/distributionsフォルダにaws-lambda-jruby.zipが出来ていると思うので、AWS上でLambdaファンクションを作成後、zipをAWS Lambdaへアップロードします。
この際、Handlerの設定がありますが、AWSLambdaMain::handler を設定します。
やはり俺のgolangがCPUを一つしか使わないのはまちがっている。

複数のCPUを使うマルチスレッドプログラムが簡単に
書けるのがgolangの特徴の一つなのでやってみたが、1CPUしか100%にならない。

# 1つのCPUしか使われない

```go:calc.go
package main

import (
  "fmt"
  "sync"
  "time"
)

func main() {
  fmt.Println("start")
  var wg sync.WaitGroup
  for _, a := range []string{"1", "2"} {
    wg.Add(1)
    go func(str string) {
      i := 0
      fmt.Println("I'm " + str)
      time.Sleep(1) // 時分割なので2番目が開始するまで待つ
      for {
          i++;
      }
      wg.Done()
    }(a)
  }
  wg.Wait()
  fmt.Println("end")
}
```

```bash
$ go run calc.go &
start
I'm 1
I'm 2

$ mpstat -P ALL 2
平均値:   CPU    %usr  %idle
平均値:     0  100.00   0.00
平均値:     1    0.25  99.50
```

# 原因

GOMAXPROCSは初期値1なので、そのままだと1コアを時分割して動作する（並行処理）ので複数のCPUを使う（並列処理）にはGOMAXPROCSにCPU数を入れる。

```go:calc2.go
package main

import (
  "fmt"
  "sync"
  "time"
  "runtime"
)

func main() {
  fmt.Println("start")
  fmt.Printf("NumCPU=%d\n", runtime.NumCPU())
  runtime.GOMAXPROCS(runtime.NumCPU())

  var wg sync.WaitGroup
  for _, a := range []string{"1", "2"} {
    wg.Add(1)
    go func(str string) {
      i := 0
      fmt.Println("I'm " + str)
      time.Sleep(1)
      for {
          i++;
      }
      wg.Done()
    }(a)
  }
  wg.Wait()
  fmt.Println("end")
}
```

```bash
$ go run calc2.go
NumCPU=2
I'm 1
I'm 2
$ mpstat -P ALL 2
平均値:   CPU    %usr   %idle
平均値:     0  100.00   0.00
平均値:     1  100.00   0.00
```

# 並行処理と並列処理

calc.goは並行処理、calc2.goは並列処理である。

ドラゴンボールで例えると
並行処理とは孫悟空の多重残像拳で悟空が超高速でそれぞれを切り替えて動いているので一見複数人に見えるが実際は一人。
並列処理とは天津飯の四身の拳で天津飯が実際に４人になっている。

並行処理では1CPUを時分割して動作するので2番目のCPUは使われないため、ずっとidleだったというわけである。

# 参考

Go - ゴルーチンと並行性パターン - Qiita
http://qiita.com/hayajo/items/4cd75f87e35e60ae11a9#%E4%B8%A6%E8%A1%8C%E6%80%A7%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3

Go言語でCPU数に応じて並列処理数を制限する | SOTA
http://deeeet.com/writing/2014/07/30/golang-parallel-by-cpu/

FAQ - golang.jp
http://golang.jp/go_faq#Why_no_multi_CPU

Go - sync.WaitGroupの正しい使い方 - Qiita
http://qiita.com/ruiu/items/dba58f7b03a9a2ffad65

動的言語だけやってた僕が、38日間Go言語を書いて学んだこと - Qiita
http://qiita.com/suin/items/22662f43b6a6e8728798

go - Parallel processing in golang - Stack Overflow
http://stackoverflow.com/questions/25106526/parallel-processing-in-golang

build-web-application-with-golang/02.7.md at master · astaxie/build-web-application-with-golang
https://github.com/astaxie/build-web-application-with-golang/blob/master/ja/02.7.md

並行と並列について-並行コンピューティング技法-を読んで - M-Tea
http://www.m-tea.info/2011/03/concurrent-parallel-01.html
[Xcode] StoryboardでView間の距離を知る（アニメGIFつき）


@snow_richisland さんが既に記事にしてくださっていたのですが、
私も最近まで知らなくて結構感動したのでGIF動画にしてみました。

StoryBoard上のパーツ同士の距離を簡単に知る方法
http://qiita.com/snow_richisland/items/efe6ac4d56c5629a919f

1. Viewを選択
2. Optionキーを押しながらカーソルを移動
3. View間の距離が表示される

![Untitled.gif](https://qiita-image-store.s3.amazonaws.com/0/29653/72930fe1-8899-3cd2-6599-bed9c75101bd.gif "Untitled.gif")
混ぜるな危険! Eigenとauto

C++で行列演算を手軽に行うためによく使われれる（と思う）[Eigen](http://eigen.tuxfamily.org/index.php?title=Main_Page)というライブラリがあります。純粋にヘッダファイルだけから構成されていて、C++コンパイラさえあればプラットフォームを選びませんし、それなりに高速性も考慮されていますし、縦横サイズも自由ですし、複素数の行列も扱えます。Eigenと名前が付いてるだけあって固有値、固有ベクトルの計算もほぼメソッド一発の楽ちんさんです。
ただ、これを使っていて変数宣言の型指定に`auto`(型推論)を使ったら数日ハマったことがあったのでメモを残しておきます。検証用コードは以下のとおりです。手元のcygwin g++ 4.9.2とMac OS Xのg++ (g++ 4.2.1 / LLVM 6.1.0)でおかしな事になるのを確認しています。

```cpp:eigen_test.cpp
#include <iostream>
#include <complex>
#include "Eigen/Core"
#include "Eigen/LU"
#include <typeinfo>

using namespace std;
using namespace Eigen;

int main(void) {
  MatrixXd m0(2, 2);
  m0 << 1, 2, 3, 4;

  const auto m1 = m0 * m0.inverse() * m0;
  cout << "m1:\n" << m1 << endl;

  const MatrixXd m2 = m0 * m0.inverse() * m0;
  cout << "m2:\n" << m2 << endl;
}
```

処理内容としては何のこたぁない、2×2行列

```math
m_0=\begin{pmatrix}1 & 2\\ 3 & 4\end{pmatrix}
```

に対して、$m_1, m_2$として$m_0\cdot m_0^{-1} \cdot m_0$を計算しようとしているだけで、coutによる出力としては両方とも$m_0$そのものが出力される事を期待します。が、cygwinとMac OS Xのg++では、$m_1$の値が実行する度に異なり、当然ながら期待した値になりません。一方で$m_2$の値は$m_0$と一致します。当たり前の期待値です。
$m_1$と$m_2$の違いはと言えば変数宣言時に型を型推論に任せている($m_1$)か、明示的に行列型をしている($m_2$)のみです。
・・・何が起きてるんでしょう? 公式ドキュメントやコンパイル結果、実行結果などから推察できるのは以下のようなことです。
Eigenでは行列計算時に[遅延評価](http://eigen.tuxfamily.org/dox/TopicLazyEvaluation.html)を用いています。そして行列(`MatrixXd`)同士の積演算の戻り値は行列(`MatrixXd`)型として定義されておらず、中間形式である`GeneralProduct`型として定義されています。
本来ならEigenでの演算結果は$m_2$のように型を明示して宣言された変数への値格納が期待されています。$m_2$のように計算の結果を明示的に行列型変数に格納する場合には、暗黙の型変換により中間形式型から行列型へ値が変換され、その過程で値が評価・確定されます。
中間形式は演算の結果最終的に行列型の変数に格納されることが期待されており、$m_1$のように行列型変数格納前に該当行が終了してしまうと値を保持しているメモリが開放されてしまうようです。これが$m_1$の値が実行する度に変化してしまう理由でしょう。
どうしても`auto`を使いたい場合でも、

```cpp
 const auto m1 = (m0 * m0.inverse() * m0).eval();
```

のように`eval()`を用いるなど、複数の回避手段はあります。ただ、Eigenの思想に従うとするとEigenの行列を格納する変数を`auto`で宣言するのは避けるべきなのかな〜と思います。
わかってしまえばそういう思想のライブラリもあるよなとは思うのですが、「C++11以降はとにかく`auto`使おうぜ」ってあまり考えずに使っちゃうとはまりますのでご注意を。
PHPでさくっとQiita:Teamのミラーを作る

# たいしたやつじゃないんですが

Qiita:Teamがおちたらドキュメントみれなくなるのが怖いという人向け
社内（もしくは手元で）さくっとミラーして見るやつを作った。

半年前くらいに一晩でつくったやつだし今となっては誰もつかってないのだけど、
それがネックで導入できない人とかいたら使ってください。

デザインとか適当ですすいません。
なんかあったら治す気持ちもないことはないのでお声がけください。

https://github.com/cocoiti/qiita-mirror
ansibleを使ってh2oをインストールする

@yosuke_furukawaさんの[投稿](http://qiita.com/yosuke_furukawa/items/ecc8c5d35406fcb5a821)をベースに、h2oをインストールする
ansible-playbookを作成したので、内容をここに記載する。

#ansible-playbook
作成したplaybookはgithubにあります。
https://github.com/kazu20/ansible-h2o

#前提条件
この手順は以下の環境で動作確認しています。

クライアント
 
 - MacOS 10.10
 - ansible 1.8.1

サーバ

 - CentOS6.6 64bit

iptablesとSELinuxは切っておくこと。

#使い方
clone後にplaybook.ymlとhostsを以下のように作成する。
以下の例はh2oをインストールするサーバのIPアドレスが
192.168.0.2である前提で記載している。

```yaml:playbook.yml
---
- hosts: server
  roles:
   - h2o
```

```code:hosts
[server]
192.168.0.2
```

ディレクトリ構成は以下のようにすること。

playbook.yml
hosts
-role/
--h2o/

あとは、ansible-playbookコマンドを実行すれば、
h2oがインストールされる。

```
  $ ansible-playbook -i hosts playbook.yml
```


-----
2015年８月５日追記
ConoHaVPSのCentOS6.5に対して実行したら、libyaml関係のエラーが出た。
[ここ](http://qiita.com/tarr1124/items/cacb3ca6e1fcf98c4ce2)に記載があるけど、以下のコマンドをサーバで実行すればlibyaml-develのインストールができるようになる。

    # yum downgrade libyaml
    # yum install libyaml-devel
args4j でサブコマンドを使う

git みたいなコマンドライン引数の体系にしたい場合、結構簡単に args4j で書ける。

```java:サブコマンド
/**
 * args4j でサブコマンドを使う
 */
public class SubCommandSample {

	/**
	 * 引数によって実行するオブジェクトを切り替える
	 */
	@Argument(handler = SubCommandHandler.class)
	@SubCommands({
		@SubCommand(name = "hello", impl = HelloCommand.class),
		@SubCommand(name = "goodbye", impl = GoodbyeCommand.class)
	})
	private Command command;

	public static void main(String[] args) throws CmdLineException {
		SubCommandSample subcommand = new SubCommandSample();
		new CmdLineParser(subcommand).parseArgument(args);
		subcommand.command.execute();
	}

	/**
	 * コマンド
	 */
	public static interface Command {
		public void execute();
	}

	/**
	 * こんにちは
	 */
	public static class HelloCommand implements Command {
		@Override
		public void execute() {
			System.out.println("Hello");
		}
	}

	/**
	 * さようなら
	 */
	public static class GoodbyeCommand implements Command {
		@Override
		public void execute() {
			System.out.println("Goodbye");
		}
	}
}
```

```java:実行
public class SubCommandSampleTest {

	@Test
	public void main() throws CmdLineException {
		SubCommandSample.main(new String[] { "hello" }); // Hello
		SubCommandSample.main(new String[] { "goodbye" }); // Goodbye
		SubCommandSample.main(new String[] { "aaa" }); // エラー
	}
}
```

引数に渡された文字列で if 文分岐するよりは、これを使うと、自然とコマンドパターンになるので、見やすいし、書きやすいと思う。
プロパティについてまとめてみた件



##プロパティは単に値の参照だけでなく、関数化したりもできる##



プロパティはインスタンスとしてを使うことや、変数としてクラスや構造体、プロトコルで定義した使ったりもします。型を持ち、値を代入したりメソッドを呼んだりというのもプロパティで行うため、**Swiftではあらゆるものをオブジェクト化するということが分かります。**



```swift


import Foundation

 class Test {
    var hello: String

    init(hello: String) {
        self.hello = hello
    }
}

let a = Test(hello:"こんにちは")

print(a.hello)  //こんにちは
```

このTestクラスにはString型で"こんにちは"という文字列が与えられた変数が定義されているだけですが、aとしてインスタンス化して``.``でメソッドのように呼ぶことができます。

クラスで定義したプロパティは初期値を与えるかinitメソッドでの初期化が必要となります。

上記の例はインスタンスプロパティとして値を取得しているだけですが、計算をしてその結果を返すプロパティを定義することもできます。

```swift
import Foundation

class Charactor {
    var name: String
    var power: Int
    
    var training: Int {
        get {
            return training / 10
        }
        set(weight){
            power = weight * 10
        }
    }
    
    init(name: String, power: Int){
        self.name = name
        self.power = power
    }
}

var fighter = Charactor(name: "ケン", power: 100)

print("名前:\(fighter.name), 強さ:\(fighter.power)")  //"名前:ケン, 強さ:100"

```

Swiftでコードを書く上でプロパティの理解が何より大事だと思いました。
【Unity C# 初心者】ゲーム内のアイテム管理　インベントリ

#**アイテム管理どうするの？**
Unityに関わらずRPGやFPSなどのゲームを制作する時の悩み所、**アイテム管理**。
ここで悩むのは自分のプログラム力が低いだけだと思いますが。
インベントリや装備、アイテムドロップなどですべてがアクセスするデータベースなどの作り方を[ここ](https://www.youtube.com/watch?v=D5WEwG4L5HQ)を参考にした奴を紹介していきます。

**アイテムの基本構成**
アイテムネーム
アイテムのID
アイテムの説明文
ゲーム内で表示されるアイテムアイコン
攻撃力
防御力
アタックスピード
特殊効果
属性のタイプ
アイテムのタイプ 



細かく考えるときりがないのでこんな感じでしょうか。



##**アイテムの要素を丸ごとリスト化**



```lang:Item.cs
using UnityEngine;
using System.Collections;


[System.Serializable]//この属性を使ってインスペクター上で表示
public class Item 
{
    public string itemName;        //名前
    public int itemID;             //アイテムID
    public string itemDesc;        //アイテムの説明文
    public Texture2D itemIcon;     //アイコン
    public int itemPower;          //攻撃力
    public int itemDefense;        //防御力
    public int itemAttackSpeed;    //攻撃速度
    public int itemLifeSteal;      //ライフスティール（特殊効果）
    public ElementType elemenType; //属性
    public ItemType itemType;      //アイテムの種類

//属性はまた別にenumにて切り替えれるようにします
    public enum ElementType      
    {
        Non,
        Fire,
        Ice,
        Lightning,
    }
//アイテムタイプも同じくenum      
    public enum ItemType
    {
        Weapon,
        Consumable,
        Quest
    }
//ここでリスト化時に渡す引数をあてがいます   
public Item(string name, int id, string desc, int power,int def, int speed,int ls, ElementType etype, ItemType type)
    {
        itemName = name;
        itemID = id;
//アイコンはnameとイコールにするのでアイコンがあるパス＋nameで取ってきます    
        itemIcon = Resources.Load<Texture2D>("Item Icons/" + name);
        itemDesc = desc;
        itemPower = power;
        itemDefense = def;
        itemAttackSpeed = speed;
        itemLifeSteal = ls;
        elemenType = etype;
        itemType = type;
    }

}
```
次にこのアイテムの基礎を渡すアイテムデータベースを作ります。

###**アイテムの基本構成を受け取るアイテムデータベース**

```lang:ItemDataBase.cs
using UnityEngine;
using System.Collections;
using System.Collections.Generic;

public class ItemDataBase : MonoBehaviour
{
//リスト化をして下のvoid Start内でリストに値を追加、値は適当です  
public List<Item> items = new List<Item>();

   void Start()
    {
        items.Add(new Item("Hogehoge",0,"hogehogehogehoge",2,1,0,0,Item.ElementType.Non,Item.ItemType.Weapon));

    }
}

```
ヒエラルキーに空のオブジェクトを追加し、名前を
ItemDataBaseにします。
そのオブジェクトにItemDataBase.csをアタッチします。
![qwerasd.PNG](https://qiita-image-store.s3.amazonaws.com/0/85037/f999addc-c93e-f288-be8a-0d4b7e2c1bed.png)
ItemsのSizeはゲームがスタートしないと
追加されないので初期値は0です。
スタートボタンを押すとこんな感じになります
![sdfgcxvb.PNG](https://qiita-image-store.s3.amazonaws.com/0/85037/e7cff4b7-205e-bcf7-385d-206d096d6ba8.png)


こんな感じでアイテムを追加していき
別のスクリプトで
private ItemDataBase database;
参照して
![dvfggggg.png](https://qiita-image-store.s3.amazonaws.com/0/85037/3ac9eb8d-6ee4-85d4-711b-7b361d8ce286.png)
こんな感じで値をとってくる。

**かなりざっくりしていて見にくいと思いますが**、色々初心者なので
時間がある時にきれいにまとめていきたいと思います。

冒頭で紹介したインベントリの作る動画ではこれを基礎にインベントリでの
アイテムをオンマウスで情報のポップアップなど色々と勉強出来てお勧めです。
JUnitで依存関係のあるテストメソッドを順序通りに実行させる方法

```java:TestClass.java

class TestClass {
    @Test
    public void test1(){
        // do something
    }

    @Test
    public void test2(){
        // do something
    }
}
```

上記のようなテストクラスを実行すると、(テストメソッドを1つずつ実行する訳ではない)
`test1→test2` 、`test2→test1` のように毎回実行順序が担保されない。
JUnit4.11からは`@FixMethodOrder`アノテーションをつければ担保されるが、それよりも
バージョンが低い場合、どのようにすれば良いのかというと、

```java:TestClass.java

class TestClass {
    public void test1(){
        // do something
    }

    public void test2(){
        // do something
    }

    @Test
    public void test1Totest2(){
        test1();
        test2();
    }
}
```

のように書けば、`test1 → test2`の順序を担保できる。 そもそもテスト同士の依存関係を
作ってしまうこと自体よろしくないのだが、暫定対応としてこのように対処できる。

# 参考
How to run test methods in specific order in JUnit4?
http://stackoverflow.com/questions/3693626/how-to-run-test-methods-in-specific-order-in-junit4
SpriteKitにおける衝突判定について

SpriteKitでは、SKNodeオブジェクトにphysicsBodyプロパティを設定することで物理効果を実現できる。
以下に例を示す。

```:swift
let node = SKNode(imageNamed: "node")
node.physicsBody = SKPhysicsBody(texture: SKTexture(imageNamed:"node.png"), size: node.size)
```
※node.png画像からSKNodeのオブジェクトを生成してphysicsBodyプロパティの設定を行う例。

衝突判定は、physicsBodyプロパティが持っているcontactTestBitMaskを設定することで可能になる。ノード間の衝突が発生するとSKPhysicsContactDelegateで定義されているdidBeginContact(contact: SKPhysicsContact) が呼ばれる。
ただし、衝突判定をさせるノード同士のcontactTestBitMaskとcategoryBitMaskの論理積(AND operation)が0以外の値になった場合にdelegateメソッド（didBeginContact）が呼ばれる。

contactTestBitMaskはデフォルトでは、0x00000000が設定されていて、categoryBitMaskはデフォルトでは、0xFFFFFFFFが設定されている。
つまり、デフォルのままでは論理積は必ず0になるため、BitMaskの値を置き換えないと衝突判定のdelegateが呼ばれないので注意。
例えば、contactTestBitMaskに0x00000001などを設定すれば論理積は、0x00000001になるためdelegateが呼ばれる。

```:swift
node.physicsBody?.contactTestBitMask = 0x00000001
```
の様に設定する。

参考）
https://developer.apple.com/library/prerelease/ios/documentation/SpriteKit/Reference/SKPhysicsBody_Ref/index.html#//apple_ref/occ/cl/SKPhysicsBody
言語処理100本ノック　06~09

#*06. 集合*
"paraparaparadise"と"paragraph"に含まれる文字bi-gramの集合を，それぞれ, XとYとして求め，XとYの和集合，積集合，差集合を求めよ．さらに，'se'というbi-gramがXおよびYに含まれるかどうかを調べよ．

```nlp06.py
#!usr/bin/env python
#coding:UTF-8
def char_ngram(n,seq):
    li = []
    for i in range(len(seq)):
        li.append(seq[i:i+n])
    return li
                        
seq1 = "paraparaparadise"
seq2 = "paragraph"

X = char_ngram(2,seq1)
Y = char_ngram(2,seq2)
Z = ['se']

logical_sum = set(X).union(Y)
logical_product = set(X).intersection(Y)
logical_difference = set(X).symmetric_difference(Y)
print "和集合:",
print logical_sum
print "積集合:",
print logical_product
print "差集合:",
print logical_difference
print "seというbi-gramはXに含まれるか",
print('se' in X)
print "seというbi-gramはYに含まれるか",
print('se' in Y)
```

実行結果
和集合: set(['e', 'ad', 'ag', 'di', 'h', 'is', 'ap', 'pa', 'ra', 'ph', 'ar', 'se', 'gr'])
積集合: set(['ap', 'pa', 'ar', 'ra'])
差集合: set(['e', 'gr', 'ag', 'di', 'h', 'is', 'ph', 'se', 'ad'])
seというbi-gramはXに含まれるか True
seというbi-gramはYに含まれるか False

##*07. テンプレートによる文生成*
引数x, y, zを受け取り「x時のyはz」という文字列を返す関数を実装せよ．さらに，x=12, y="気温", z=22.4として，実行結果を確認せよ．

```nlp07.py
def combine(x,y,z):
    s1 = "時の"
    s2 = "は"
    seq = str(x)+s1+str(y)+s2+str(z)
    return seq
x = 12
y = "気温"
z = 22.4
print combine(x,y,z)
```
実行結果
12時の気温は22.4

###*08. 暗号文*
与えられた文字列の各文字を，以下の仕様で変換する関数cipherを実装せよ．
英小文字ならば(219 - 文字コード)の文字に置換
その他の文字はそのまま出力
この関数を用い，英語のメッセージを暗号化・復号化せよ．

```nlp08.py
#!usr/bin/env python
#coding:UTF-8
def cipher(str):
    enc = ""
    for char in str:
        if 97 <= ord(char)<= 123:
            enc +=chr(219-ord(char))
        else:
            enc +=char
    return enc
str = "Machine Learning"
print cipher(str)#暗号化
print cipher(cipher(str))#複合化
```
実行結果
Mzxsrmv Lvzimrmt
Machine Learning

####*09. Typoglycemia*
スペースで区切られた単語列に対して，各単語の先頭と末尾の文字は残し，それ以外の文字の順序をランダムに並び替えるプログラムを作成せよ．ただし，長さが４以下の単語は並び替えないこととする．適当な英語の文（例えば"I couldn't believe that I could actually understand what I was reading : the phenomenal power of the human mind ."）を与え，その実行結果を確認せよ．

```nlp09.py
#!usr/bin/env python
#coding:UTF-8
#Typoglycemia
import random
def Typo(word): 
    if len(word)>4:
        wordli = list(word[1:-1])
        random.shuffle(wordli)
        neword = word[0] + ''.join(wordli)+ word[-1]
        return neword
    else:
        return word
   
str="I couldn't believe that I could actually understand what I was reading : the phenomenal power of the human mind."

typostr=""
for word in str.replace("."," .").split():
    typostr +=" "+Typo(word)
print(typostr)
```
実行結果
 I clundo't bivelee that I colud allctuay uedtnasrnd what I was riednag : the phnoneeaml peowr of the hmaun mind .

`typostr +=" "+Typo(word)`の部分がもっといい書き方があるはず、、
carthage updateに失敗する現象がSource Controlとプラグインを無効にしたら直った話

ここのところ`carthage update`に失敗して困っていました。
入れたいのは[ReactiveCocoa 3.0 RC1](https://github.com/ReactiveCocoa/ReactiveCocoa)。

```ruby:Cartfile
github "ReactiveCocoa/ReactiveCocoa" "v3.0-RC.1"
```

Xcode 6.4で`carthage update`すると、依存ライブラリの[antitypical/Result](https://github.com/antitypical/Result)をビルドするところでエラーになっていました。

```bash
*** Building scheme "Result-iOS" in Result.xcworkspace
2015-08-02 17:52:34.830 xcodebuild[13710:1074790] [MT] DVTAssertions: Warning in /SourceCache/IDEFrameworks/IDEFrameworks-7720/IDEFoundation/SourceControl/Model/IDESourceControlManager.m:423
Details:  Error Domain=com.apple.dt.IDESourceControlErrorDomain Code=-1 "Missing extension: public.vcs.subversion" UserInfo=0x7ffdcb369060 {NSLocalizedDescription=Missing extension: public.vcs.subversion}
Object:   <IDESourceControlManager: 0x7ffdc8dc53c0>
Method:   -loadRepositories
Thread:   <NSThread: 0x7ffdc8e1ecb0>{number = 1, name = main}
Please file a bug at http://bugreport.apple.com with this warning message and any useful information you can provide.
```

svnのプラグインがないということらしいですが、よくわからず。

ググってみると以下のIssueが出てきました
https://github.com/Carthage/Carthage/issues/541

> Disabling version control in xcode preferences should get rid of it.

なるほど。では早速

![スクリーンショット 2015-08-02 18.39.36.png](https://qiita-image-store.s3.amazonaws.com/0/62550/82baf842-2161-c27a-9ad5-5869f0d3de6e.png)

直りませんでした。

あと原因として思いつくのは[Alcatraz](http://alcatraz.io)で入れたプラグイン。

![スクリーンショット 2015-08-02 18.48.59.png](https://qiita-image-store.s3.amazonaws.com/0/62550/9f7b99d8-396d-e374-1e64-7aa88b79f658.png)

ダメ元でこいつらを無効にしてみると、直りました。

これで無事に`carthage update`でResultがインストールできるようになりました。

なおバージョン管理を再び有効にしたり、プラグインを再インストールしたりしてみましたが、現象は再現しませんでした
【俺メモ】LinuxmintでSublimeText3インストール＋α

うちがつこうてるメインの環境はLinuxmint 17.1 xfceやで

# SublimeText3　インストール

まずはアプリケーションのダウンロードや。

公式ページ：http://www.sublimetext.com/3 より
Ubuntuの64ビット(もしくは32ビット)のリンクよりパケージファイルをダウンロード。

そのあと、パッケージインストーラからインストールしてや。

# PackageControlをインストール

まぁ、この辺はおきまりやね。

１．SublimeText3を起動
２．Ctrl + Shift + `　でコマンド入力窓を表示
３．https://packagecontrol.io/installation よりST3用のコマンドをコピー
４．コマンド入力窓にペーストしてEnterキーをッターン！とする

# 日本語入力環境を設定

１．ターミナルからMozcとemacs-mozcをインストール
   $ apt-get install Mozc emacs-mozc
２．Ctrl+Shift+Pでパレットを開いて"Add Repository"を選択
３．入力窓で "https://github.com/yasuyuky/SublimeMozcInput" を入力
４．パッケージコントロールから"SublimeMozcInput"を選択しインストール
５．Ctrl + \ で日本語入力切換が可能になる

# プログラミング用フォント設定
(Ricty Diminished)
１．[こちら](https://github.com/yascentur/RictyDiminished)からフォント一式をインストール
２．展開したファイルをダブルクリックしてフォントマネージャからインストール
(Source Han Code JP)
１．[こっち](http://qiita.com/nullpointer_t/items/45aabe140301b0183cbf)を参考にしてや。
# Settingファイルメモ
```
{
	"color_scheme": "Packages/Color Scheme - Default/Dawn.tmTheme",
	"draw_white_space": "all",
	"font_face": "Ricty Diminished",
	"font_size": 12,
	"ignored_packages":
	[
		"Vintage"
	],
	"line_padding_top": 2
}
```

# その他便利パッケージのインストール

とりあえず、俺メモ（HTML,Javascript,CSS,Node.js野郎用）
http://qiita.com/nullpointer_t/items/74ae5828c465624f88cb
WindowsでPython3, numpy, pandas, matplotlibなどインストール


WindowsでPythonを動かすマゾ需要が高いらしいので更新しました
http://qiita.com/mojaie/items/995661f7467ffdb40331

最近僕はPython3を使っているので3前提で書いてますが、おそらく2でも同様の方法で環境構築できると思います。

Pythonのインストール
-------------------

32bitの最新版をダウンロードしてインストールします。執筆時点でバージョン3.4.3です。インストールする場所ですが、なんとなくC://Program Files(x86)/Python34にしてます。
https://www.python.org/downloads/

Windowsのコントロールパネルからシステム→環境変数
システム環境変数のPATHの末尾にPythonのインストールフォルダを追記します。

```C:ほげほげ;C:ふがふが;C:¥Program Files (x86)¥Python34
```

コマンドプロンプトを開いて環境変数の追記が反映されていることを確認します。これでPythonがコマンドラインから実行できるようになっています。終了するときは`exit()`です。

```
> echo %PATH%
C:ほげほげ;C:ふがふが;C:¥Program Files (x86)¥Python34
> python
>>> print("Hello, world.")
Hello, world.
>>> exit()
>
```

pipで必要なものをインストール
-------------------------

コマンドプロンプトを**管理者権限**で開きます(コマンドプロンプトのアイコンを右クリックすると出るメニューに管理者権限で実行というのがあります)。

numpyをインストールします。
```> python -m pip install numpy
```
が、いろいろ怒られてインストールが失敗します。VC++を入れろなどと言われますが、無視してnumpyの公式サイトからWindows用のダウンロードしてインストールします。win32-superpackみたいな名前のやつです。

http://sourceforge.net/projects/numpy/

SciPyも同様で、公式サイトからsuperpackをダウンロードしてください。僕はSciPyは使わないので省略します。

他に必要な物は適当にpipでインストールします。

```
> python -m pip install pandas
> python -m pip install matplotlib
> python -m pip install networkx
> python -m pip install pyyaml
> python -m pip install xlsxwriter
> python -m pip install pyside
> python -m pip install tornado
```

pipでインストールされたものを確認します。

```
> python -m pip list

decorator (4.0.2)
matplotlib (1.4.3)
numpy (1.9.2)
pandas (0.16.2)
pip (7.1.0)
pyparsing (2.0.3)
PySide (1.2.2)
python-dateutil (2.4.2)
pytz (2015.4)
PyYAML (3.11)
setuptools (12.0.5)
six (1.9.0)
tornado (4.2.1)
XlsxWriter (0.7.3)
```

networkxはインストール中に怒られますが一応インストールできているようです。pysideはコマンドプロンプトに管理者権限がないとエラーが出ます。Cライブラリを含むようなパッケージはpipではダメなことも多々あるので、インストーラが提供されているものについてはそちらのほうが楽な場合もあるかと思います。SpyderとかCondaのほうが楽かもしれません。あなたにはWindowsを捨ててMacを買うという選択肢があることを常に心の片隅に置いてください。


Pythonを使う
-------------------------

自分のPythonのプロジェクトフォルダにPYTHONPATHを通します。

Windowsのコントロールパネルからシステム→環境変数
システム環境変数にPYTHONPATHを新たに作成し、自分のプロジェクトのフォルダの場所を記入します。
パスが通っているか確認しましょう。

```
> echo %PYTHONPATH%
C:¥自分のプロジェクトフォルダ
```

これで自分のプロジェクトフォルダにあるモジュールをインポートできます。

```
> python
>>> import myproject
>>>
```

スクリプトを実行したい場合はcd %PYTHONPATH%でプロジェクトフォルダに移動しましょう。

```
> cd %PYTHONPATH%
> python myscript.py
実行結果
```
iOSにおけるSingletonとDelegate/Observer

デザインパターンのことを深く書きたいわけではありません。すいません。

* **Singletonを使いたい**
* **delegateプロパティも便利なのでSingletonクラスに実装したい**

というような状況でのちょっとしたTipsです。（もっとも最近はdelegateプロパティよりもBlock関数を使う方がお気に入りです。）

Delegateを実装したい場合、iOSでは下記のように記述するのが一般的と思いますが、

```lang:objective-c
@property(nonatomic, weak) id <MyClassDelegate> delegate;
```

これでは、delegate変数の実体は一つだけなので、シングルトンオブジェクトのように複数のオブジェクトから処理を委譲されるクラスでは、このプロパティを使うことはできません。もちろんsetDelegateを書けば問題ないのですが、その中身は以下のようになるかと思います。

作戦は簡単で、delegateを沢山もつ、すなわちNSMutableArrayに放り込むということです。
これによって複数のオブジェクトから扱うできます。
（※このような実装をするとデザインパターン的にはobserverパターンであるとのご指摘をいただきました。）
委譲したオブジェクトは、自分がdeallocされるときに必ず
removeDelegateを忘れないようにしましょう。


まずdelegateを格納するNSMutableArrayを宣言します。このインターフェイス記述はヘッダー用ではなくてMyClass.mの方に記述します。（細かいことですが外部にプライベートな変数を公開しないで済むObjective-Cは素晴らしいと思います）

```lang:objective-c
@interface MyClass ()
{
	NSMutableArray * mDelegates;
}
@end
```

実装部では、add/remove/doの３つのメソッドを書くだけです。

```lang:objective-c


/**
 *  複数のdelegateを保持する
 */
- (void)addDelegate:(id <MyClassDelegate> )delegate
{
	if(mDelegates == nil)
	{
		mDelegates = [[NSMutableArray alloc] init];
	}

	[mDelegates addObject:delegate];
}

/**
 *  保持したデリゲートを削除する
 */
- (void)removeDelegate:(id <MyClassDelegate> )delegate
{
	[mDelegates removeObject:delegate];
}

/**
 *  デリゲートを実行する。
 */

- (void)doDelegate:(NSInteger)completeType
{
	dispatch_async(dispatch_get_main_queue(), ^{
		[mDelegates enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL * stop) {
			 id delegate = obj;

			 if((delegate != nil) &&
				[delegate respondsToSelector:@selector(MyClass:updateCompleted:)])
			 {
				 [delegate MyClass:self updateCompleted:completeType];
			 }
		 }];
	});
}

```

要するに

```lang:objective-c
[[NSNotificationCenter defaultCenter] addObserver:self
```

これと同様の実装しましょう、ということになると思います。
メソッド名もaddObserverに変えたほうが良いかも・・・