OmniAICreator/Qiita-1.07M huggingface dataset:
autolayout　＋　コード

autolayoutやっと勉強使い始めたけど、コードでViewを変更するときに苦労したからまとめ

#①frameで変更出来ない
`view.frame = CGRectMake(0.0, 0.0, 100.0, 200.0);`
ッて感じでコードしてい変形してた所
数字をどうするかは別途置いといてこうゆう場合は
```objc:sample
view.translatesAutoresizingMaskIntoConstraints = YES;
view.frame = CGRectMake(0.0, 0.0, 100.0, 200.0);
```
って感じで「translatesAutoresizingMaskIntoConstraints」でオートレイアウト状態を解除する必要があります。

#②コードでautolayout変更したい
で次にどーせなんだからコードでオートレイアウトしようとqiitaで調べると
[コードでAutolayout](http://qiita.com/bonegollira/items/5c973206b82f6c4d55ea)
とかあるんですがこれだとやりたかったことには足りなくて
やりたかったこととしては回転による制約の付け替え
ってのがあって、制約は一度つけるそのままaddしても増えない。
かつ調べる内に上のやり方は準非推奨みたいな非推奨だけどまだ線はひかれてない？
[iOS8でコードでのAutoLayoutのやり方が地味に変わっていた件](http://tomoyaonishi.hatenablog.jp/entry/2015/01/11/160740)
[- addConstraints: Reference](https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIView_Class/#//apple_ref/occ/instm/UIView/addConstraints:)
ッて感じで公式みても8.0でなんとかかんとか書いてありますね。
ってことで正解としてはたぶん
```objc:sample
    NSArray *constraints;
    // 制約の解除
    [NSLayoutConstraint deactivateConstraints:constraints];
    // 制約の作成
    constraints = @[
                                  [NSLayoutConstraint constraintWithItem:_greenView
                                                               attribute:NSLayoutAttributeTop
                                                               relatedBy:NSLayoutRelationEqual
                                                                  toItem:_bgView
                                                               attribute:NSLayoutAttributeTop
                                                              multiplier:1.0
                                                                constant:0.0],
                                  [NSLayoutConstraint constraintWithItem:_greenView
                                                               attribute:NSLayoutAttributeLeading
                                                               relatedBy:NSLayoutRelationEqual
                                                                  toItem:_bgView
                                                               attribute:NSLayoutAttributeLeading
                                                              multiplier:1.0
                                                                constant:0.0]
                                  ];
    // 制約の設定
    [NSLayoutConstraint activateConstraints:constraints];
```
ッて感じの流れになる。

###デフォルトの制約は邪魔
後outletで設定してるものをコード制約でやりたい場合は
![スクリーンショット 2015-11-02 1.48.47.png](https://qiita-image-store.s3.amazonaws.com/0/9256/1cc5192f-b79b-93fe-6f7d-d8be29cdec1c.png)
って感じで
「Remove at build time」
を設定する必要がある。
　※すみません、参考にしたサイト忘れました。
制約つけとかないとエラーマークでちゃうからこれなんだろうな〜

☆まとめ
　コードで変更する場合は
　①オートレイアウトを解除してframeで変更
　②オートレイアウトで変更（付けかえ、「Remove at build time」意識）
ッて感じでやる必要があるっぽい。
他にもあるとは思うけど。
【小ネタ】一括置換で一文字変数を書き換えるコツ

#まえがき
ぶっちゃけケース・バイ・ケースです。
手打ち出直したほうが良い場合も多いですし、
#今回はgをguiに置き換える場合を例に説明します。

#バックアップを取る。
失敗したら直すのが大変になる。
必ずとって下る。

#準備
IDE及びテキストエディタに一括置換がない場合はフリーソフト等を用意する

#とりあえず置き換える

gからguiという風に置き換えるとソースコードが崩壊するので、
.g から.gui、
g =からgui =、
と言った具合に置き換える

#手直し
このままだとimgがimguiになっているので
imguiからimgといった具合に元に戻す

#終了
手でやるよりは早い場合が多いと思います。
Node.jsのLTS版ってなに？

久々にNode.jsのバージョンを確認したら一気に5まで上がっていた。
さらにv4.2.1 LTSとなってる。

ん？LTSってなんだ？

**LTS : 長期サポート**
とのこと。
v4を安定バージョンとして長期的にメンテナンスしていくとのことです。
ひとまずv4.2.1を使うと安心ということなのでしょうか？
Swift のコードカバレッジ

Swift2.0 になって、コードカバレッジが測定できるようになった。
C0 カバレッジしかとれないけど、それでも無いよりははるかにマシ。

コードカバレッジがないと、ユニットテストでどこまでカバーできているか分からないし、テストケースを書くモチベーションもなかなか上がらない。

以下は Xcode7.1 で確認した。

## 1. テスト対象

サンプルプロジェクトとして、`SwiftCoverage` を作る。テンプレートはなんでもいいけど、とりあえず iOS - Single View Application ということにしておく。

<img width="733" alt="スクリーンショット 2015-10-28 0.31.20.png" src="https://qiita-image-store.s3.amazonaws.com/0/9549/88be0ff7-2119-f61a-6ead-da81344b458b.png">


これに `User.swift` を追加して、これをテスト対象とする。

```swift:User.swift

import Foundation

class User {
    var lastName: String = ""
    var firstName: String = ""

    init() {
        self.lastName = ""
        self.firstName = ""
    }

    init (lastName: String, firstName: String) {
        self.lastName = lastName
        self.firstName = firstName
    }

    func getFullName() -> String {
        return "\(firstName) \(lastName)"
    }
}
```

## 2. ユニットテストを記述する

SwiftCoverageTests/SwiftCoverageTests.swift がすでに存在するはずで、これを以下のように変更する。

```swift:SwiftCoverageTests.swift
import XCTest
@testable import SwiftCoverage

class SwiftCoverageTests: XCTestCase {
    
    func testGetFullName() {
        let user = User()
        user.lastName = "YAMADA"
        user.firstName = "Taro"
        XCTAssertEqual(user.getFullName(), "Taro YAMADA")
    }
}
```

## 3. カバレッジの有効化
カバレッジを測定するためには、スキームを編集する必要がある。これは次のようにする。

`Product > Scheme > Edit Scheme...` を開き、"Test" を選択する。
そして、`Gather coverage data` を有効にする。

<img width="896" alt="スクリーンショット 2015-11-01 1.06.07.png" src="https://qiita-image-store.s3.amazonaws.com/0/9549/e30eebec-ec68-81e3-ec76-bfd592741488.png">


## 4. テストの実行と測定結果

`Product > Test` もしくは Cmd-U からユニットテストを実行する。
(このサンプルではユニットテストが全て Pass するはず)

右メニューからリポートナビゲータを表示し、「Coverage」タブを選択すると、各ソースコード毎にカバレッジを確認することができる。
<img width="1023" alt="スクリーンショット 2015-11-02 0.51.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/9549/54627520-799a-c9ea-2e25-32eafc4b4f50.png">

さらに `User.swift` をダブルクリックすると該当コードに移動し、行ごとに実行したか or していないかを調べることができる。

<img width="751" alt="スクリーンショット 2015-11-02 1.22.07.png" src="https://qiita-image-store.s3.amazonaws.com/0/9549/c61a96ca-a698-64ad-51ca-d9dbfb5d628d.png">

ここでは convenience init が全くテストされていないことがわかる。

## 5. テストの修正

先ほどの結果から、convenience initのテストケースが不足していることがわかるので、そこで、以下のように `testInit()` を追加する。

```swift:SwiftCoverageTests.swift
import XCTest
@testable import SwiftCoverage

class SwiftCoverageTests: XCTestCase {

    func testInit() {
        let user = User(lastName: "YAMADA", firstName: "Hanako")
        XCTAssertEqual(user.getFullName(), "Hanako YAMADA")
    }

    func testGetFullName() {
        let user = User()
        user.lastName = "YAMADA"
        user.firstName = "Taro"
        XCTAssertEqual(user.getFullName(), "Taro YAMADA")
    }
}
```

そして、もう一度ユニットテストを実行し、カバレッジを確認すると、今度は 100% になっていることがわかる。

<img width="1021" alt="スクリーンショット 2015-11-02 1.08.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/9549/ba77956b-ae06-e16a-2ecc-0320aff047e1.png">
Pythonで組み合わせの問題

Pythonで組み合わせの問題を解いてみたが、いい方法が思いつかない。。。

```
letter = ["A","B","C"]

for i in range(3):
	for j in range(3):
		for k in range(3):
			print letter[i], letter[j], letter[k]
```


これはさすがに幼稚すぎるし、リストの長さが増えると。。。

ということで、調べてみると便利なライブラリがあった。


```
import itertools

letter = ["A","B","C"]
for i in itertools.product(letter, repeat=len(letter)):
	print i
```

これならたったの２、３行で済んだ。
Heroku へのデプロイ手順

# Heroku へのデプロイ手順

Heroku の Introduction ドキュメント「[Push Local Changes]( https://devcenter.heroku.com/articles/getting-started-with-nodejs#push-local-changes)」の抜粋。

```
$ cd path/to/app/dir
$ # some source or setting file modified
$ vi somesource.js

$ # Module install if needs
$ npm install

$ # Check it with local
$ heroku local

$ # git!
$ git add .
$ git commit -m "Some explaining"
$ git push heroku master

$ # check production
$ heroku open
```

(EOF)
React.jsのpropsのバケツリレーに苦労している方は、Fluxを使用してみては

#Fluxの使用
当初は、Backbone.jsとReact.jsを組み合わせてメモアプリを作成しようと考え、作成していたのですが、コンポーネント間のpropsの受け渡しのバケツリレー（特に、子から親へのcallback関数を使用したpropsの受け渡し）が面倒になり、しかも、props受け渡しのためのコードも追加された結果、コードも複雑になり、分かりづらいコードとなってしまった。私のスキル不足かもしれませんが。。。

そこで、他にうまい実装方法がないか、ググっていたところ、Fluxというアプリケーションアーキテクチャがあり、各コンポーネントで管理していたsateを外出しすることで、面倒な子から親へのcallbackを使用したpropsの受け渡しをしなくても、stateを管理するFluxのStoreへの1箇所の更新を実施することで、各コンポーネントが管理していたstateを集中管理出来るようになった。(目からウロコだった。）それにより、propsの受け渡しに使用していたコードがなくなり、コードの見通しも良くなり、わかりやすいコードになったと思う。

Fluxの大体の流れとしては、Storeで管理しているStateの情報をTOPコンポーネントへ渡すことで、下の階層のコンポーネントにStateが伝播し、画面が更新される。で、また、コンポーネントの状態に変更があった場合は、FluxのStoreへ更新を実施し、FluxのStoreの更新が発生したら、TOPコンポーネントにStateの情報を渡すことで画面が更新される流れである。

で、上記では、画面からStoreへの更新と記載したが、Fluxでは、画面からStoreへの更新は、以下の流れとなる。
　①画面にて状態が変化。
　②画面から変化した状態に対応するActionをコールする。
　③Actionは、DispathcerへAction識別子と変化した状態データと共に送付。
　④Dispatcherは、Action識別子を参照して、対応するStoreの受け渡す。
　⑤Storeは、状態を更新し、画面へ更新したデータを受け渡す。
　⑥画面は、Storeから受け取ったデータを取得し、画面を更新する。

っで、Fluxの詳細については、ググるとたくさん説明しているサイトがあるので、探してみてください。でも、WEB+DB pressのNo87の伊藤直也さんがFluxについて記載した記事があったのですが、私的にそれが、一番わかりやすかったです。
php環境構築時に入れ忘れてコケるやーつ…。

# 概要
備忘録としてQiitaに投稿しながらLinuxでのWebサーバー構築を行なってきましたが、
実用段階に入って「あれ、これ動かんやん！なんでや！？」ってなることがあったのでそれについても綴っておこうと思います。

# よく忘れるやつ

- php-mbstring
- php-mysqli

# それぞれについて

## php-mbstring
mb_convert_encodingとか、マルチバイト文字列関連の関数を使うときに必要だよ！

### 1. インストール

`# yum -y install php-mbstring`

### 2. 設定
<font color=orange>※ひょっとしたらこの手順は不要かも</font><br>
設定を有効にするためにphp.iniを編集するよ。
`# vim /etc/php.ini`

`Dynamic Extensions` の欄に `extention=mbstring.so` を追記してね！

```ini:php.ini
;;;;;;;;;;;;;;;;;;;;;;
; Dynamic Extensions ;
;;;;;;;;;;;;;;;;;;;;;;

; If you wish to have an extension loaded automatically, use the following
; syntax:
;
;   extension=modulename.extension
;
; For example, on Windows:
;
;   extension=msql.dll
;
; ... or under UNIX:
;
;   extension=msql.so
;
; ... or with a path:
;
;   extension=/path/to/extension/msql.so
;
; If you only provide the name of the extension, PHP will look for it in its
; default extension directory.

extension=mbstring.so
```
### 3. 有効化
追記が終わったらhttpdを再起動！
`# systemctl restart httpd.service`

これで php-mbstring の導入は完了だよ！

### 参考
- [PHP: マルチバイト文字列 - Manual ](http://php.net/manual/ja/book.mbstring.php)

## php-mysqli

mysqliクラスを利用するときに必要だよ！

(php-mysqliについては[-導入編Final-](http://qiita.com/sango/items/736d98d90203ab4634c6)でも触れているよ。)

### 1. インストール

`# yum -y install php-mysqli`

### 2. 有効化

有効化のためにhttpdを再起動してね！
`# systemctl restart httpd.service`

これで完了！
とっても簡単ね！

### 参考
- [PHP: mysqli - Manual ](http://php.net/manual/ja/class.mysqli.php)
ラズパイ+Webカメラでタイムラプス撮影してみた 環境構築編


学祭展示で，なにか作らないといけないということで，作りました。

いくつか資料にあたってみたのですが

RasPiのカメラモジュールではなくWebカメラを利用したタイムラプスの撮影環境構築の記事が少かったので紹介します。

基本的な方針

+ RasPiを起動するとひたすら特定の間隔で撮影し続けるようする
	+ ネットワークに繋げない，ディスプレイが繋げない環境でも撮影できるようにします
+ 写真から動画の変換はRasPiでは，行わず，他のマシンで行います

## 使ったもの
+ RasberryPi B+
+ Web Camera BSW32KM03BK

## 環境構築

### raspi-config

初期起動時に，raspi-configが実行されるので4項目設定

    Expand Filesystem > Yes
    nternationalisation Options > Change Locale > ja_JP.UTF-8
    nternationalisation Options > Change Timezone > Asia > Tokyo
    nternationalisation Options > Keyboard Layout > Generic 105

### いつもの

```Bash
# apt-get update
# apt-get upgrade
```


### ホストネームの変更

``` Bash
# vi /etc/hostname
# vi /etc/hosts
```

### {$hostname}.localでIPを引けるようにする

```Bash
# apt-get install avahi-daemon // すでに入ってた
```
外から

```
$ssh pi@{$hostname}.local
```
で作業ができるようになるので便利

## タイムラプス向けの設定

撮影用のソフトのインストールし，試しに撮影してみる

```Bash
# apt-get install fswebcam
$ fswebcam a.jpg
--- Opening /dev/video0...
Trying source module v4l2...
/dev/video0 opened.
No input was specified, using the first.
Error selecting input 0
VIDIOC_S_INPUT: Device or resource busy
```

あれ...デバイス占有されてて撮影できない！

なにが専有しているのか調べないと...

## 続く

あとはスクリプトでバリバリ動かせばいいと思ったのですがいくつか問題があり

設定を書き換えたり，したところがあったのでそれは [撮影設定編](http://qiita.com/him0net/items/b8dfda504263ed673a2b) でやっていきたいと思います。
ADBコマンドいろいろ

# はじめに

AndroidのSDKにはADB(Android Debug Bridge)というツールが用意されていますが、
代表的な機能は使うけれど、あまり細かい機能まで調べたことはありませんでした。

ADBはAndroid SDKのplatform-tools に含まれています。
Android側との通信を受け持ってくれて現在利用可能なデバイス・エミュレータの列挙や、シェルコマンドの発行、ファイルの転送、アプリのインストール・アンインストールなどが行えます。

アプリをインストール(アンインストール)したり、接続しているデバイスを調べたりするくらいのことは使っても、
それ以外の機能はあまり使ったことがなかったのでまとめてみました。

# 基本

## ADBのバージョン

```
adb version
```

## 接続している端末の確認

```
adb devices
```

## アプリインストール

```
adb install xxxx.apk
```

## アプリアンインストール

```
adb uninstall パッケージ名
```

### すでに端末に同じ署名のapkがインストールされてる場合

```
adb install -r xxxx.apk
```


# 覚えておくと便利かも

## Wi-Fi環境でADB接続

- 端末をPCと同一のWi-Fi環境に接続させIPアドレスをメモなどで控えておく
- Android 端末と PC を USB ケーブルで接続
- TCPIPモードでホストのadbを再起動(下記コマンドを入力)

```
adb tcpip 5555
```
- adb connect Android端末のIPアドレス(さっきメモしたアドレス):5555

これで完了です。USBを外してもデバッガも使えるし、アプリのインストール・アンインストールもできます。
使用する機会はあまりないかもしれませんが、
別の人にアプリをテストしてもらっているときとか使うときがあるかも！？

[公式ドキュメント](http://developer.android.com/tools/help/adb.html#wireless)

## Textをコマンドで入力(フォームなど)

毎回ID/PASSを入力したりコピペしたりするのが面倒だったりします。
まずは下記コマンドを入力してshellを起動します。

```
adb shell
```

これで準備ができました。
次に入力したいところを選択している状態で下記のように入力していけばいいです。

```
input text hoge
```

終了時には`exit`で終わらます。
一度の入力でも可能。

```
adb shell input text hoge
```

## インストールされているアプリパッケージを取得

イントールされているアプリのパッケージ名を知りたいときなんかもあります。

```
adb shell pm list package
```

## 端末のバージョン

```
adb shell getprop ro.build.version.release
```

## データ削除

```
adb shell pm clear パッケージ名
```

## 強制終了

強制的にアプリを終了させます。

```
adb shell am force-stop パッケージ名
```

## アプリ内のデータベース(sqlite)を確認

新規参画のときなどはDBの中身からテーブル一覧をみたり、
最初にどんなデータが入っているのかを見たほうが仕様書を見るよりわかりやすかったりすることもあります。

まずはデータベースのある場所に移動します。

```
cd data/data/パッケージ名/databases
```

lsコマンドで中を確認したいファイル名を出力してから、下記を実行。

```
slete3 ファイル名
```

あとはsql文を打つだけです。
CoffeeScriptでJQueryを使う時の「this」

CoffeeScriptでJQueryのイベント処理を書く際に注意すること
##例　クリックした要素のテキストを表示する
```lang:html
<ul class="lists">
  <li><a href="#">テキスト1</a></li>
  <li><a href="#">テキスト2</a></li>
  <li><a href="#">テキスト3</a></li>
</ul>
```
```lang:javascript
function Ex() {
  this.setEvent();
}

Ex.prototype.setEvent = function() {
  var _this = this;
  $('.lists li a').on('click', function() {
    var text = $(this).text();
    _this.showText(text);
  });
}
Ex.prototype.showText = function(_text) {
  alert(_text);
}
$(function() {
  var ex = new Ex();
});
```

上記javascriptをCoffeeScriptで書く

```lang:CoffeeScript1
class Ex
  constructor: ()->
    @setEvent()
  
  setEvent: ()=>
    $('.lists li a').on('click', ()=>
      text = $(@).text()
      @showText(text)
    )

  showText: (_text)=>
    alert(_text)
    
window.Ex= Ex

$ ()->
  ex = new Ex()
```

このままだとメソッド「setEvent」の部分で「this」の参照先が違うのでクリックしたエレメントを取得できない。
メソッド「setEvent」の部分を下記のように書き換える。

```lang:CoffeeScript2
class Ex
  constructor: ()->
    @setEvent()
  
  setEvent: ()=>
    #エレメント1つ1つへイベントを設定する
    $('.lists li').each((i, v)=>
      elm = $(v)
      text = elm.find('a').text()
      elm.on('click', ()=>
        @showText(text)
      )
    )

  showText: (_text)=>
    alert(_text)
    
window.Ex= Ex

$ ()->
  ex = new Ex()

```
IFTTTのMakerチャンネルにネストされたjsonは送れるか？

#はじめに
結論から言うと「Yes（できる）」です。
ただし、注意が必要。
ハマったので共有しようと思います。

そもそもMakerチャンネルはvalue1、value2、value3という固定したキー名のjsonを投げる仕様になっており、基本3つ以上の値を渡すことができない。
よって、3つ以上の値を渡そうとするとネストさせるか、配列を使うかの二択となる。

今回はnetatmoで計測した値を送るという目的で調べてみた。
（netatmoのMakerチャンネル対応は後ほど）

#調査内容
まずは手始めに[RequestBin](http://requestb.in/)を使って、jsonの送り方をチェックする。
[RequestBin](http://requestb.in/)はこの手の調査にうってつけのサービス。
IFTTTに投げる前にRequestBinでどのようにPOSTできているかを確認した。

##jsonに改行あり
普通に人が読みやすい形態でjson書くとこん感じだと思う。
RequestBinにPOSTすると予想通りに受け付けてくれる。
が、**IFTTTではNGです。**
これがハマりポイント。

![改行あり.png](https://qiita-image-store.s3.amazonaws.com/0/95484/7f9ed66a-17a0-8ded-af4b-3b1f6acc18b4.png)

##jsonに改行なし
一方、改行なしで一行にわーっと、jsonを書いた例。
すごく・・・見づらいです。
ですが、これなら**IFTTT的にOK！**

![改行なし.png](https://qiita-image-store.s3.amazonaws.com/0/95484/d0fcf48e-6aee-2578-7dc8-3fd0eef2a88a.png)

##成功例
こちらが正常にPOSTできた例。
ネストされたjsonがそのまま展開されていますが、valueに関しては文字列以外の数値もOKなことが明らかに。

![シート.png](https://qiita-image-store.s3.amazonaws.com/0/95484/1537f108-597d-7f2a-6b62-276d578e62ed.png)

#さいごに
試してませんがおそらく配列もOKだと思う。
jsonを採用している段階で当たり前といえば当たり前なんですが、「改行あり」だとNGという点がハマった箇所。
ただ、条件振ったりしている訳ではなくシェルからcurl叩いて送る際に気づいたので、環境依存の可能性も否定できない。
Pythonでのlist, for文関連の便利ワザ

##**listの各要素に同じ操作をする - map**

```py:map.py
def add1(str):         #文字の最後に1の文字を付け加える関数
      return str+'1'
    
list_str = ['a', 'b', 'c']
map(add1, list_str)
```

```py
Out[3]: ['a1', 'b1', 'c1']
```

なお次のように書いても同じことが出来ます。

```py:map.py
map(lambda x : x+'1', list_str)
```

これでも同じ（リスト内包表記）

```py:map.py
[x+'1' for x in list_str]
```

##**条件一致要素だけを抜き出す - filter**
リストの中から文字数が3の要素だけを抜き出します。

```py:filter.py
list_words = ['toy', 'cat', 'dog', 'girl', 'house', 'boy']
filter(lambda x : len(x)==3, list_words)
```

```py
Out[7]: ['toy', 'cat', 'dog', 'boy']
```

これでも同じ（リスト内包表記）

```py:map.py
[x for x in list_words if len(x)==3]
```


##**重複をなくしたリストとその扱い - set**

```py:set.py
list_words2 = ['toy', 'cat', 'dog', 'girl', 'house', 'boy', 'toy', 'toy', 'cat', 'dog']
list_words2_unique = set(list_words2)
```

リスト内の要素の重複をなくしたsetオブジェクトができる

```py
list_words2_unique
Out[8]: set(['boy', 'toy', 'house', 'dog', 'cat', 'girl'])
```



setオブジェクトは"add"というメソッドで要素を追加する事ができるが、
重複する要素を追加しても変化はない
リストにとって新たな要素の場合にのみ変化が起こる

```py:set.py
list_words2_unique.add('dog')
list_words2_unique

Out[16]:
{'boy', 'cat', 'dog', 'girl', 'house', 'toy'}
```


```py:set.py
list_words2_unique.add('sheep')  #リスト内に無い要素を追加する
list_words2_unique

Out[17]:
{'boy', 'cat', 'dog', 'girl', 'house', 'sheep', 'toy'} #追加される
``` 

また、Unionを使うと別のリストとの和集合が取られる

```set.py
list_words2_unique.union(['lion', 'cow', 'dog', 'cat'])

Out[18]:
{'boy', 'cat', 'cow', 'dog', 'girl', 'house', 'lion', 'sheep', 'toy'}
```


##**For文で連番を使いたい- enumerate**

for文で自動で連番をふるための方法

```py:enumerate.py
list_words = ['toy', 'cat', 'dog', 'girl', 'house', 'boy']

for i, word in enumerate(list_words):　#iに連番が入り、wordにリストの要素が入る
    print (i, word)

Out[19]: 
       (0, 'toy')
       (1, 'cat')
       (2, 'dog')
       (3, 'girl')
       (4, 'house')
       (5, 'boy')
```

##**2つの要素でFor文 - zip**


```py:zip.py
list_words = ['toy', 'cat', 'dog', 'girl', 'house', 'boy']
list_number =[21, 3, 12, 5, 6, 19]

#numにlist_numberの要素が、wordにlist_wordsの要素が入る
for num, word in zip(list_number, list_words):  
    print (num, word)

Out[20]: 
    (21, 'toy')
    (3, 'cat')
    (12, 'dog')
    (5, 'girl')
    (6, 'house')
    (19, 'boy')
```


上記のenumerateをzipで（無理やり）書くとすると下記のようになりますね。

```py
length = len(list_words)

for i, word in zip(range(length), list_words):
        print (i, word)
```
helm-swoop.el 変更点 2015年11月

# helm内蔵になったmigemoへの切り替え

helm自体がhelm-migemo.elなしにmigemoを扱えるようになりました。日本人ではない方がメンテされているので不安は残りますが、その方向に合わせました。

`(helm-migemo-mode 1)`

migemo/cmigemoコマンドは入っているものとして、
Emacs側の設定はこれだけです。

# Fuzzy match (曖昧検索) への対応

海外のユーザーはfuzzy matchingが好きなようで要望が多く来ていました。
自動補完に関しては私もFuzzy無しには耐えられないほど慣れてしまっています。
しかし、これをバッファ内容に適用すると微妙でして、さらにデフォルトでONにしていたため無用に混乱を招く結果となりました。

現在はデフォルトでOFFです。試してみたい方は以下の設定で有効にできます。

`(setq helm-swoop-use-fuzzy-match t)`



# anything-swoop.el

上記のような機能はありませんが、変更の多い`helm.el`に比べて安定した`anything.el`でも使えるようにしたものが`anything-swoop.el`です。

:link: https://github.com/ShingoFukuyama/anything-swoop

ほぼ関数名を置き換えただけで動作確認をあまりしていないため、現在GitHubに置いてあるだけです。


# swoop.el

`helm`にも`anything`にも依存しないものも一応はあります。

:link: https://github.com/ShingoFukuyama/emacs-swoop

使い勝手やパフォーマンスが異なるのであまりオススメしていません。
duコマンドについて

今まで `du` コマンドの出力が理解できていなかった。
適当に検索すると以下のような説明が散見できる。

>ディレクトリ内のファイル容量を表示する

間違っていないのかもしれないが、このおかげで長らく使い方が分からなかった。
なぜなら単純に `du` コマンドを叩くとよくわからない数値が出てくる。

```
[root@host test]# ls -al
合計 12
drwxrwxr-x.  2 root root 4096 11月  1 23:55 2015 .
drwx------. 11 root root 4096 11月  1 23:54 2015 ..
-rw-rw-r--.  1 root root    2 11月  1 23:55 2015 file
[root@host test]# du
8       .
[root@host test]#
```

この 8 は、4096byte のブロックを 2 つ占有しているということだそうだ。
4098 (byte)とかが出て来るという先入観があった。

ちなみにブロックを無視して 4098byte を出力させるには `-b` オプションを使用する。

```
[root@host test]# du -b
4098    .
[root@host test]#
```
コンテナ技術＠WindowsServer2016

# 概要
[第28回 PaaS勉強会](http://paas.connpass.com/event/19231/)でWindowsServer2016のコンテナ技術に関する発表を伺ったのでメモをまとめた。
またWindowsServer2016 TechPreview3を触った所感もまとめた。

（注意）この記事は2015/09/11時点の内容です。最新情報はMicrosoft公式を参照下さい。

# WindowsServer2016が扱うコンテナの種類

WindowsServer2016では2種類のコンテナを扱う。

## kernerl空間を共有するタイプ
Docker等と同じタイプのコンテナ。
ホスト（WindowsServer）とkernel空間を共有しているため、当然Linux用のコンテナは動かない。

## kernel空間を共有しないタイプ
実態はHyper-Vによる仮想環境。
なぜkernel空間を共有しないのかというと、エンタープライズ系の人は「1つのkernel上で複数のアプリケーションを動かすと、kernelが死んだ時のリスクが怖すぎる」らしく、これに対応するためとのこと。

中身はHyper-Vだが操作コマンドはkernel空間を共有するタイプと同じ。
つまりユーザはコンテナ技術の実装方法（kernel空間を共有するタイプか、それともHyper-Vによる共有しないタイプか）を（あまり）気にしなくて良い。多分…

# NanoServer

普通のWindowsServerはコンテナのイメージとして使うにはサイズが大きすぎる。
そこで登場するのがNanoServer。これはフットプリントの小さいWindowsServerらしい。

# WindowsServer2016TechPreview3 を触ってみる
[WindowsServer2016TechPreview3](https://technet.microsoft.com/ja-jp/evalcenter/dn781243.aspx)を実際にインストールして触ってみた。

## 環境
- ホストOS：CentOS 6.6
- 仮想環境：VMware Palyer 6.0.4

## インストール
インストールウィザードに従って進めれば良い。
途中、CUIかGUIか選択を求められる。今回はCUIを選択した。
キーボードレイアウトが上手く認識されず記号が正しく入力できないが、それ以外は問題なく動作した。

## コンテナ周りの検証

kernelを共有するタイプのコンテナのみ検証した。

![WindowsServer2016.png](https://qiita-image-store.s3.amazonaws.com/0/61641/1470c39b-72ff-2090-9637-d7bcb1c5e01a.png)

### できたこと
- `docker build` コマンドの実行
- `docker run` コマンドの実行
- `docker run` する際のport mappingの指定

### できなかったこと
- `docker run` する際のlink, volumeの指定

### 補足
- コンテナを操作するコマンドはDockerコマンド系とPowerShellコマンド系の2種類があった。できることは多分一緒だと思う。
- ベースとなるイメージが9.4Gとでかい。つまりNanoServerは有用？
- 検証はMSBlogの通りにやったら簡単に出来た。
- wgetやunzip的なことがコマンドから出来るようになっており、思ったよりはDockerfileをちゃんと書けそうだった。

## その他の所感（コンテナと関係ない内容）
PowerShellが便利になっていた（コマンドのシンタックスハイライトが使える、Ctrl+Rでコマンド履歴の検索が出来る等）。
Go1.5でHTTP2サーバーとクライアント

これはGo1.5までで使う場合の方法です

Go1.6からは標準に組み込まれるのでこの方法を利用する必要はなくなるはずです。

# 環境
- MacOSX
- Go 1.5

# サーバー

go getで`golang.org/x/net/http2`をインストールしておく

```
$ go get -u golang.org/x/net/http2
```

オレオレ証明書を作成
作成するときパスワードは空のまま作成しておく

```
$ openssl genrsa 2048 > server.key
$ openssl req -new -key server.key > server.csr
$ openssl x509 -days 3650 -req -signkey server.key < server.csr > server.crt
```

そしてHelloWorldを出すだけの　http2の恩恵があんまりないコード

```go

package main

import (
	"fmt"
	"log"
	"net/http"

	"golang.org/x/net/http2"
)

func main() {
	var s http.Server
	http2.VerboseLogs = true
	s.Addr = ":8080"

	http2.ConfigureServer(&s, nil)

	http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
		w.Header().Set("Content-Type", "text/plain")
		fmt.Fprintf(w, "Hello World")
	})

	log.Fatal(s.ListenAndServeTLS("server.crt", "server.key"))
}
```

# クライアント

クライアントを使う場合はすごく簡単
Transportのところをhttp2にするだけ
今回はオレオレ証明書を使ってるので`InsecureSkipVerify`をtrueにしている

```go
package main

import (
	"crypto/tls"
	"fmt"
	"io/ioutil"
	"log"
	"net/http"

	"golang.org/x/net/http2"
)

func main() {
	hc := &http.Client{
		Transport: &http2.Transport{
			TLSClientConfig: &tls.Config{
				InsecureSkipVerify: true,
			},
		},
	}

	resp, err := hc.Get("https://localhost:8080")
	if err != nil {
		log.Fatal(err)
	}

	body, _ := ioutil.ReadAll(resp.Body)
	resp.Body.Close()
	fmt.Printf("%s", body)

}

```

ちゃんと調べてないけどhttp.Clientを使い回せばコネクションはつながってるので再接続せずにメッセージをやりとりできます。

ちなみに普段`http.Get`とかを使ってる人はDefaultTransportを書き換えるといいです

```go

func main() {

	http.DefaultTransport = &http2.Transport{
		TLSClientConfig: &tls.Config{
			InsecureSkipVerify: true,
		},
	}

	resp, err := http.Get("https://localhost:8080")
}

```
Xcodeの検索用ショートカットキー

| キー①                | キー②       | キー③ | 結果                     |
|----------------------|-------------|-------|--------------------------|
| [任意の文字列を選択] | [command:⌘] | [E]   | 検索対象をセット         |
| [command:⌘]          | [G]         |       | 次を検索                 |
| [command:⌘]          | [F]         |       | ファイル内から検索       |
| [command:⌘]          | [Shift:⇧]   | [F]   | プロジェクト全体から検索 |
sass書いてる時に、プロパティをソートしたい

css書いていると、どんどんスパゲッティになっていくんですが、
少しでも機械的に整理しようということで
プロパティをソートさせます。

```sass:style.sass
.class 
  text-align: center
  margin-top: 10px
  padding: 5px
```

```sass:style.sass
.class 
  margin-top: 10px
  padding: 5px
  text-align: center
```

単純なcssならcsscombというのがあるんですが、sassの独特の書式でソートしてくれるのは
なかなかありませんでしたが、
https://www.npmjs.com/package/sort-sass
npmのsort-sassを利用すると、簡単にできました。

```shell-session
npm install -g sort-sass
```

```shell-session
sortsass style.sass
```
を実行すると、ソートされた結果が同一ファイル名で保存されます。
上書きされたくないなら

```shell-session
cp -a style.sass temp.sass && sortsass temp.sass
```
で結果を見てみたらいいと思います。

結果に満足であれば、
gruntなり、emacsのbefore-save-hookなりに仕込めばいいと思います。
pythonでbottleで暗号化パスワード(.htpasswd)でのBasic認証


ユーザ名とパスワードは「.htpasswd」に格納し、パスワードはに暗号化済みとする。
今回は、管理画面「http://hogehoge/manage」にアクセスした場合に、Basic認証が使用されるようにする。
「@auth_basic(check)」の記載はhttp://qiita.com/yubessy/items/33789eccb35b659b0b4e を参照させて頂きました。新しいのはSAH1による暗号化のところとなります。

以下、フォルダ構成

```
/
├── app
│   └── app.py
├── config
│   └─── .htpasswd
└── views
    └── manage.j2
```

あらかじめ、パスワードを生成し、.htpasswdへ格納する。
htpasswdのオプションは、c:ファイル新規作成、s:sha1(暗号化形式)である。
ユーザ名とパスワードが上記の形式(ユーザ名+":"+"暗号化形式"+暗号化済パスワード)で保存されている。

```
$ htpasswd -csb .htpasswd user password
$ cat .htpasswd 
user:{SHA}H9WJLeNwKEfNwYPyPeiv9nuZoxk=

```

python内では、ファイルから上記を読みだして、ユーザが入力した値と比較を行うので、ユーザの入力値を上記の形式で文字列を組み立てる必要がある。

ファイルから読み込んだ情報は改行コードがあるのか、そのままの比較では一致しなかったため、strip()によりトリム処理を行っている。

```
from bottle import route, run, request, auth_basic
import hashlib
import base64
from bottle imp

#templateパスの追加
TEMPLATE_PATH.append("../views")
ROOT_PATH = os.path.dirname(os.path.abspath(__file__)) #このスクリプトがあるフォルダの絶対パス

def check(username, password):
    #サーバ側設定値の読み取り
    f = open(ROOT_PATH + '/../config/.htpasswd', 'r')
    auth_check_word = f.readline() # ファイル1行データを返す
    f.close()
    #ログイン情報の読み込み
    hs= hashlib.sha1()
    hs.update(password.encode("utf-8"))
    login_word = username + ":{SHA}" + str(base64.b64encode(hs.digest()).decode("utf-8"))
    return auth_check_word.strip() ==login_word.strip() 


@route("/manage")
@auth_basic(check)
def manage():
    return template('manage.j2')
```

正直、ユーザ認証まわりのベストプラクティスな所は調べずにやってます。今回は管理者が使用する管理画面が１つ必要なだけでしたので、上記にて対応しました。
ほかの方はどの様に実装してるのでしょうか？ActiveDirectoryなど立てているのでしょうか？
自宅ネットワークの再構築(HWD14,MZK-MF300N,WR8165N,LS-WX)


プログラミング関連ではないのだけれど、いままで放置していた自宅LANを整理したので、備忘録としてまとめる。
自宅LANを放置した背景に、wimax(HWD14)の購入がある。普段 MacBookAirを使用していることもあり、引っ越した時に、有線LANから乗り換えた。その時、深く考えなかったのだが、wimax(HWD14)には有線LAN(Ethernet)をつなぐ方法がない（クレードもなし)ため、これまでNASを放置していた。最近ちょっと時間ができたので、コンバータ(中継機)を買ってきて、自宅LANの整理をした。この時、HWD14(wimax)側の設定は一切いじらない事が前提条件。（別の人が、wimaxを利用しているため、wimax側をコンバータモードで使用することは不可）
(あぁ、なぜHWD14を買ってしまったのか。。。思いつきで買い物をするとろくなことがない。)

#ASIS:現状の姿

HWD14(wimax)  ->  私のPC(win,mac)、他人のPC(win,mac)

-------------

NAS(LS-WX):放置状態

#TOBE:在るべき姿

HWD14(wimax)  ->  MZK-MF300N(中継機) -> WR8165N(LAN側ルータ) ->　私のPC(win,mac),NAS(LS-WX)

----

HWD14(wimax)  ->  他人のPC(win,mac)

#上記構成を実現するための各機器設定
## HWD14(wimax) 
変更なし
## WR8165N(LAN側ルータ)
1. 本体の電源をいれる。
2. PCのwifiから、ルータ本体に書かれているSSIDをみつけ、接続(パスワードも本体に記載)。
3. PCのブラウザから http://aterm.me/ へアクセできるか確認する。
4. ルータ本体の有線LANポート(LAN側)にLANケーブルを挿し、NAS(LS-WX)へつなげる。
5. PCにインストール済みの「NAS navigator2」からNAS(LS-WX)が見えるか確認する。

## MZK-MF300N
コンバータ(中継機)として使用
1. 本体の横にあるスイッチを(converter)にする。
2. 電源を入れる。
3. 本体の有線LANポート(LAN側)にLANケーブルを挿し、PCにつなげる。
4. PCのブラウザからhttp://192.168.1.249 へアクセスする。
5. 設定画面の「簡単セットアップ」をクリックする。
6. DHCPのモードは「無効」にする。　:point_left: ポイント
7. 次へに従い、再起動する。
8. 再起動後、MZK-MF300NのLANポートとWR8165N(LAN側ルータ)のWANポートを、有線LANでつなげる。
9. PCからネットにつながり、かつNAS(LS-WX)も見えることを確認する。

## NAS(LS-WX)
1. macのtime machineを利用するために、新しく共有フォルダを作成する。
2. 詳細は割愛。
CentOS7からの変更点まとめ

# ■CentOS7からの変更点について

CentOS7は、CentOS5や6で使えていた数々のコマンドや、設定ファイルがガラっと様変わりしてしまって、新しいLinuxディストリビューションを覚えるレベルの違いがあります。
まだ両方のOSの構築作業が混ざっているので混乱してしまいますが、７で変わった重要なところをメモ。

# ■ネットワーク設定

## ●基本設定

nmtuiコマンドによって、コンソール上でもGUIの様な画面が出てきて、視覚的に設定できるようになりました。
ただ、NetworkManagerサービスを使用しているので、当該サービスが起動している必要があります。

NMを停止して、従来通りの設定を行う事も可能です。

## ●IP設定確認

追加パッケージを入れないと、ifconfigコマンドは使えなくなりました。

ifconfigの代わりに
`ip l`
ifconfig -aの代わりに
`ip a`
になりました。

## ●IPエイリアス設定

こちらもnmtuiを使用すれば、視覚的にIPを追加して簡単にエイリアスを増やせる様になりました。

従来通りにifcfg-eth0:0ファイルを追加してエイリアスを増やす事もまだ可能です。

## ●ホスト名設定

設定を書くファイルが変わりました。

/etc/hostname

そのまんまの名前の設定ファイルになりました。
ここにホスト名だけを記載すればOKです。

# ■サービス設定

## ●基本設定

まだserviceコマンドを使う事もできますが、systemctlコマンドにリダイレクトされて実行されます。

新しいsystemctlコマンドでhttpdを開始する場合は以下です。

`systemctl start httpd`

サービス名と実行内容を書く順番が逆になったので、間違い易いです。
start、stop、status等のよく使うコマンドはそのままです。

## ●サービス自動起動設定

httpdサービスを有効にする場合は以下です。

`systemctl enable httpd.service`

今まではchkconfigにonやoffの引数でしたが、enable、disableに変わりました。
加えてまた実行内容を書く順番が逆になったので混乱します。

## ●サービス自動起動設定確認

chkconfigではもう見れなくなりました。
これもsystemctlコマンドの引数を与える以下の形に変わっています。

`systemctl list-unit-files | grep httpd` 

# ■ファイルシステム関連

## 基本設定

デフォルトのファイルシステムがext4ではなくなりました。
xfsに変わっているので、mkfsコマンドを使う時は以下になります。

`mkfs -t xfs /dev/sda5`

## リサイズ用コマンド

ディスク容量を変更するなどして、リサイズするときのコマンドが変わりました。

resize2fsはもう使えないので、以下を使用します。

`xfs_growfs`

# ■セキュリティ関連

## 秘密鍵作成

ssh-keygenコマンドで作成した鍵が、AES形式になってしまいます。
これで何が困るかというと、Windowsに持ってきてputtyなどでインポートしたくても認識してくれません。

puttyではDESじゃないと認識しないので、以下のコマンドで変換してあげる必要があります。

`mv id_rsa id_rsa2
cat id_rsa2 | openssl rsa | openssl rsa -des3 > id_rsa`

# ■最後に

他にも色々と変わっていますが、よく使うコマンドで変わって困っているのは、このくらいです。
今後も増えるかもしれないので、その時は追記していきたいと思います。
bashコーディング規約参考

# bashコーディング規約参考サイト

* [bashコーディング規約](http://qiita.com/mashumashu/items/f5b5ff62fef8af0859c5)
* [UNIX & Linux コマンド・シェルスクリプト リファレンス](http://shellscript.sunone.me/tips.html)
* [Shell Style Guide](https://google.github.io/styleguide/shell.xml)
* [Advanced Bash-Scripting Guide: Chapter 35. Scripting With Style](http://www.tldp.org/LDP/abs/html/unofficialst.html)
* [[pdf注意] Bash Style Guide and Coding Standard](https://lug.fh-swf.de/vim/vim-bash/StyleGuideShell.en.pdf)

# 基本方針
上記を参考に、開発環境および開発者のスキルにあわせてカスタマイズする。
なるべく早くtimeoutする

何十秒もかかる重いタスクがあり、それをブラウザ上のJavaScriptでなるべく早く完了させたいとします。でも同期的に一気にやろうとすると、たまには制御返せってブラウザに怒られるし、ページが固まってしまうので困ります。

たとえば、どうしても[コラッツの問題](https://ja.wikipedia.org/wiki/%E3%82%B3%E3%83%A9%E3%83%83%E3%83%84%E3%81%AE%E5%95%8F%E9%A1%8C)を自分で確かめたくなっちゃったとします。`n`に操作を繰り返して1に到達するまでの回数を`collatz(n)`として、たとえば次のように一気にfor文で調べようとするとページ全体が固まってしまい、ユーザの操作で途中で止めることもできないのでよろしくありません。

```js
for(var n = 1; n <= 10000000; n++){
    console.log(n + "は" + collatz(n) + "回の操作で1に到達します");
}
```

ベストなのはWebWorkersを使って別スレッドで処理することですが、Workerスレッド上ではDOMに触れないとかいろいろ制限があります。タスクの内容によってはWorkerの上ではできない、もしくは面倒くさいこともあるでしょう。

そのようなときには、タスクを分割して`setTimeout`や`setInterval`で非同期に処理する方法があります。コラッツの問題ならただの数値計算なのでWeb Workers上でやればいいですが、仮にこの問題がメインスレッド上でないとやりにくいタスクだったとします。具体的には次のような関数`sleep`を用意すると現代的でちょっとおしゃれかもしれません。

```js
function sleep(){
    return new Promise(resolve => setTimeout(resolve, 0));
}
```

呼び出す側ではジェネレータ関数の中で

```js
for(var n = 1; n <= 10000000; n++){
    console.log(n + "は" + collatz(n) + "回の操作で1に到達します");
    yield sleep();
}
```

とループごとに一休みするだけで、ページ全体をブロックすることなく処理を行えます。ただし`setTimeout`を使うと、`setTimeout(f, 0)`として`delay`を0ミリ秒と指定しても最低でも数ミリ秒程度の遅延が生じます。とにかく早く終わらせたいときにはこの遅延が邪魔になるのですが、`postMessage`でメッセージを投げる → `onmessage`で即座にイベントを受け取ってタスクをこなす、というトリックを使うことで高速に非同期処理が繰り返せます。

[こちら](http://dbaron.org/log/20100309-faster-timeouts)の実装のコードを借りると、次の`setZeroTimeout`関数はほとんど瞬時に、でもあくまで非同期にコールバックしてくれます。

```js
// Only add setZeroTimeout to the window object, and hide everything
// else in a closure.
(function () {
    var timeouts = [];
    var messageName = "zero-timeout-message";

    // Like setTimeout, but only takes a function argument.  There's
    // no time argument (always zero) and no arguments (you have to
    // use a closure).
    function setZeroTimeout(fn) {
        timeouts.push(fn);
        window.postMessage(messageName, "*");
    }

    function handleMessage(event) {
        if (event.source == window && event.data == messageName) {
            event.stopPropagation();
            if (timeouts.length > 0) {
                var fn = timeouts.shift();
                fn();
            }
        }
    }

    window.addEventListener("message", handleMessage, true);

    // Add the one thing we want added to the window object.
    window.setZeroTimeout = setZeroTimeout;
})();
```
この`setZetoTimeout`を`setTimeout`の代わりに使うだけでずっと早く処理が終わります。`collatz(n)`のリアルタイム人気投票をすると[こんな感じ](https://jsfiddle.net/3ftgfusg/1/)になります。ただし、`setTimeout`にはタブが裏に回るなどでページが非表示になると自動的に頻度を落として無用な処理を減らしてくれるという機能もあります。`setZeroTimeout`のほうはページが非表示だろうがお構いなしに全力疾走してしまいますが、それが迷惑な場面もあるでしょうから注意が必要です。使い道があるようなないような……。

# 参考

* http://dbaron.org/log/20100309-faster-timeouts
* https://developer.mozilla.org/ja/docs/Web/API/Window/setTimeout
カスタムディレクティブのテンプレートで"root element"なんたらのエラーが出た場合

```
Error: [$compile:tplrt] Template for directive 'hoge' must have exactly one root element.
```

こんなエラーが出て、しばらく原因が分からず時間を無駄にしたのでメモ。

## エラー発生条件（たぶん）
1. カスタムディレクティブ
2. restrict: E
3. template または templateUrl に記述しているDOM要素が複数あり、かつインライン要素から始まっている

つまり、ブロックレベル要素で全体を囲むようtemplateのHTMLを修正したらエラーが解消しました。

## いくつか試してみた結果

**OKパターンの要素**
- div
- form
- ul li

**NGパターンの要素**
- p
- span

Pタグみたいに、厳密には「ブロック要素＝OK」というわけではないのですが、おそらくPタグ以外のブロック要素なら大丈夫じゃないかと思う（調べてはいない）

これについて、書籍や公式ドキュメントで何か言及されていないか少しだけ調べたのだけど、私のググりスキルでは見付けられなかったので、どなかた知っていたら教えてください。。。
LinuxのRCUのコードを読んでみる (rcu_read_{lock,unlock}編)

#はじめに

いまさらですが、Linuxの排他制御機構Read-copy Update (RCU)のコードを読んでみたいと思います。コードベースはLinux 4.3-rc7です。

RCUとはどういうものかについては説明しません。RCUの作者であるPaul E. McKenneyさんがたくさんドキュメントを書いてくれているので、そちらを読む方が正確で確実です。

#RCU
##rcu_read_lock, rcu_read_unlock

RCUのread側のためのAPIで、普通のロックと同じように、クリティカルセクションの最初でlockを、最後でunlockを実行します。lockと書いてありますが、ロックを取るわけではありません。

###rcu_read_lock
`rcu_read_lock`の実際のコードは以下のようになります。

```c:include/linux/rcupdate.h
static inline void rcu_read_lock(void)
{
        __rcu_read_lock();
        __acquire(RCU);
        rcu_lock_acquire(&rcu_lock_map);
        RCU_LOCKDEP_WARN(!rcu_is_watching(),
                         "rcu_read_lock() used illegally while idle");
}
```

この中でRCUとして意味のあることをやっているのは`__rcu_read_lock`のみであとはデバッグ用のコードです。

`__rcu_read_lock`は`CONFIG_PREEMPT_RCU`が有効か否かで動作が変わります。手元の環境では無効だったので、その前提で読んでいきます。

`__rcu_read_lock`は`preempt_disable`を呼ぶだけです。`preempt_disable`は名前の通り、コンテキスト切り替えを無効にします。これは無印RCUの制約である、read側のクリティカルセクションではコンテキスト切り替えが起きてはいけない、を満たすためのものだと思います[^preempt]。クリティカルセクション内で自発的にスリープやブロックしないようにするのはプログラマの責任です。

[^preempt]: CONFIG_PREEMPTなカーネルだとCPUが横取り可能性があり、横取りされるのは良いらしいです。一方で、自発的にスリープやブロックはしてはいけないみたいです。(`rcu_read_lock`のコメントより)

###rcu_read_lockのデバッグコード
せっかくなので、他のデバッグ用コードも読んでいきます。

`__acquire(RCU)`はマクロで、デフォルトでは何もしません。`__CHECKER__`が定義されている場合は、`__context__(RCU,1)`に展開されます。

`__CHECKER__`はどうやら[Sparse](https://en.wikipedia.org/wiki/Sparse)という静的解析ツールを使うときに定義されるようです[^sparse]。詳しい説明は省きますが、取っていないロックをアンロックしようとしたり、ロックをとったままコンテキスト切り替えをしようとするようなバグを検出できるようです。

`rcu_lock_acquire(&rcu_lock_map)`は`CONFIG_DEBUG_LOCK_ALLOC`と`CONFIG_LOCKDEP`が有効のときに、ロックのデバッグ機能(lockdep)のための処理を行ないます。詳しい説明は省きますが、lockdepは複雑なロックの依存関係のバグ(デッドロック等)を検出するためのものです。

最後の`RCU_LOCKDEP_WARN`はdynticks絡みのassertionのようですが、[複雑な事情](http://www.rdrop.com/users/paulmck/RCU/RCUdynticks.2012.02.15b.pdf) [pdf]があるようで、正確なところはわかりません。時間があれば掘り下げるかもしれません。

[^sparse]: Sparseの作者はLinusらしい

###rcu_read_unlock

```c:include/linux/rcupdate.h
static inline void rcu_read_unlock(void)
{
        RCU_LOCKDEP_WARN(!rcu_is_watching(),
                         "rcu_read_unlock() used illegally while idle");
        __release(RCU);
        __rcu_read_unlock();
        rcu_lock_release(&rcu_lock_map); /* Keep acq info for rls diags. */
}
```

`rcu_read_unlock`は基本的に`rcu_read_lock`の逆操作をしているだけのようです。`__rcu_read_unlock`も`preempt_enable`しているだけです。

#おわりに

次は、`synchronize_rcu`あたりを読みたいと思います。
WindowsでAndroid+cocos2dxのインストール        


# 概要
Windows環境でAndroid+cocos2dxをインストールし、サンプルプログラムを動作させることを目的とします。

# 環境
Windows7 64ビット
Android Studio

Android 5.1.1(API 22)
ant 1.9.6
cocos2dx 3.8.1

# 手順
1. Android Studioのインストール
2. Pythonのインストール
3. antのインストール
4. cocos2dxのインストール
5. プロジェクト作成
6. cocos2dxでビルド
7. Android Studioにインポート

以下、やったこと

## 1. Android Studioのインストール

https://developer.android.com/intl/ja/sdk/index.html
よりインストール
JDK/NDKあたりもインストールされていなければご一緒に

## 2. Pythonのインストール

https://www.python.org/downloads/
2系(2.x.x)をインストール

## 3. antのインストール

http://ant.apache.org/bindownload.cgi
よりダウンロードし、適当なパスに解凍

## 4. cocos2dxのインストール

http://jp.cocos.com/products/download/
よりダウンロードし、適当なパスに解凍
cocos2d-x-x.x.x配下に移動し、setup.pyを実行

```shell-session:setup cocos2dx
python setup.py
```
環境変数NDK_ROOT、ANDROID_SDK_ROOT、ANT_ROOTを
聞かれるので、それぞれ指定
* NDK_ROOT：NDKのインストールディレクトリ。User\AppData\Local\Android\sdk\ndk-bundle 等
* ANDROID_SDK_ROOT：ANDROIDSDKのインストールディレクトリ。User\AppData\Local\Android\sdk 等
* ANT_ROOT：ANTの実行ファイルがある場所
(ANTインストールディレクトリ)\bin

## 5. プロジェクト作成
プロジェクトの作成はcocos側で行います。

```shell-session:make project
cocos new プロジェクト名 -p パッケージ名 -l cpp -d インストール先
```
ちょっと待ってれば終わるはず

## 6. cocos2dxのコンパイル
このままAndroid Studioにインポートすると、ファイル不足してんぜって言われるので、コンパイルします。

```shell-session:make project
cocos compile -s プロジェクト名 -p android --android-studio  --app-abi x86
```
インストールよりは時間かかるはず

## 7. Android Studioにインポート

5.で作成したディレクトリ配下に、` proj.android-studio`があるので、これをインポート
Run／Debugで動きました。

# 参考
インストール中に踏んだリンクたち
http://gihyo.jp/dev/serial/01/android_studio/0001
http://studio.cretia.net/blog/462
http://akai0ringo.blog.shinobi.jp/cocos2d-x/cocos2d-x%203.2%20android%E5%8C%96
http://discuss.cocos2d-x.org/t/how-to-use-v3-7-pro-android-studio/22792


以上です。お読みいただきありがとうございました。
逆変換をするより最適化であわせこむ

　プログラムは、何か実現したいこと（あるいは実現したいと要請されていること）があって書くものだ。だから、実現したい内容についての理解を増やすことが大切だ。開発言語が何であれ、その実現したい内容についてツールが充実しているものについて知っておいて損はない。
　最近、データ解析でパラメータをあわせ込むためにPythonのSciPyライブラリを用いた。
[Optimization (scipy.optimize)](http://docs.scipy.org/doc/scipy/reference/tutorial/optimize.html)

　Simplex法による合わせこみを利用すれば、計算式の逆変換を求める必要もないし、数値に誤差を含んでいるときの扱いも楽だ。(もちろん誤差の影響を減らすには、未知数の自由度より、実験データの数の方が多いことが必要だ。)
　逆変換の計算式を求めるには、手計算での導出が面倒だし、パラメータの値によっては、分母が０に近くなって計算の精度がでないこともある。未知数よりも、実験データの数の方が多くても、それらの全てを利用することができないという欠点がある。

　Simplex法は、多数のパラメータを持つ関数の最小化を行うアルゴリズムの一つだ。その昔は、[「Numerical Recipes in C」の日本語版の書籍](http://www.amazon.co.jp/%E3%83%8B%E3%83%A5%E3%83%BC%E3%83%A1%E3%83%AA%E3%82%AB%E3%83%AB%E3%83%AC%E3%82%B7%E3%83%94%E3%83%BB%E3%82%A4%E3%83%B3%E3%83%BB%E3%82%B7%E3%83%BC-%E6%97%A5%E6%9C%AC%E8%AA%9E%E7%89%88%E2%80%95C%E8%A8%80%E8%AA%9E%E3%81%AB%E3%82%88%E3%82%8B%E6%95%B0%E5%80%A4%E8%A8%88%E7%AE%97%E3%81%AE%E3%83%AC%E3%82%B7%E3%83%94-William-H-Press/dp/4874085601)を参考にそのアルゴリズムを別言語に移植して使った覚えがある。
　関数の最小化をするアルゴリズムは、MATLABの場合だと[Optimization Toolbox](http://jp.mathworks.com/products/optimization/)に充実している。MATLABを業務で使ってきたとき、インタプリタでの数値解析の便利さを実感した。（Spyder([解説ブログの1例](http://hennohito.cocolog-nifty.com/blog/2014/03/pythonspyder-bf.html))に代表されるPythonの環境が充実している今となっては、ライセンスが高いMATLABを利用して書く意味はない。もちろんMATLABがお好きな方は、[home ライセンス](https://jp.mathworks.com/products/matlab-home/)）で安く使えるようになっているので、自宅で使うのもありとなっています。(モデル ベース　デザインの分野では、ある種の業界ではSimulinkが事実上の標準となっていて、それがもたらしている利点も知っています。）

　Pythonを使って動作の検証を行えば、アルゴリズムの検証がしやすい。Pythonはツールが使いやすいし、MATLAB並みのグラフライブラリ[matplotlib](http://matplotlib.org/)が使えるので、結果をチェックしやすい。
　そのほかにもPythonでは十分に使った上で、関数の引数がどうあるべきかをすばやく書いて試してみることができるので、単独の関数で実装すべきか、クラスのメソッドとして実装すべきかを、使いながら検証できます。その結果をふまえてからC++で実装すれば、C++での設計に間違えることが格段に減ります。
　C++で書かれた別バージョンのライブラリを、開発中のプログラムに移植することの方がむしろ厄介に感じています。
　
やはりPythonは楽しい
Erisプラットフォームのコンポーネント



Eris Industriesのeris:platform
ドキュメントそのままだけど、メモ用。


## コンポーネント

* eris:cli – The command line interface to the eris platform

* eris:db – A permissionable smart contracts machine with an enterprise grade API server

* eris:pm – A smart contracts package manager

* eris:legal – Eris’ implementation of Legal Markdown document assembly mechanism



## 以下のコンセプトに利用できる

* Services – processes or tools which a smart contract backed application needs to have running on a given node in order to properly conduct its business. Services can be public blockchains, distributed file storage systems, middleware components, key servers, or any other process which is Docker compatible and needed for a given application.
* Chains – permissioned smart contract networks which a smart contract backed application needs to have running on a given node in order to properly conduct its business. Chains utilize the flexible and stable eris:db container to reduce the complexity of working with permissioned smart contract networks.
* Contracts – smart contract packages are, by definition, needed for a smart contract backed application; this portion of the eris platform reduces the complexity of testing and deploying smart contract packages needed for the application.
* Files – smart contract applications often are paired with a distributed file storage system. Eris provides harmonized, reduced complexity access to the IPFS protocol for distributed file storage system.
* Actions – flexible step-by-step processes needed for the application.


## 参考元

* [Eris Industries | eris:platform](https://erisindustries.com/components/)
Ansible の when と default

Ansible の中で GitHub への ssh キーへのパスが設定されていたらファイルをコピーって設定するときにフィルタの使い方でちょっと躓いたのでメモ

## コード
```yaml
---
vars:
  github_ssh_key: "{{ lookup('env', 'GITHUB_SSH_KEY') }}"
tasks:
  - name: Install git
    sudo: yes
    apt:
      name: git
  - name: Copy ssh key if exists
    when: github_ssh_key | default("") != ""
    copy:
      src: "{{ github_ssh_key }}"
      dest: ~/.ssh/id_rsa
      owner: "{{ ansible_user_id }}"
      mode: 0600
```

## 注目ポイント
`when: github_ssh_key | default("") != ""`
このデフォルト値の設定、左側の変数が定義されていない場合に動くもので、中身が空だったとしても変数が定義されていると default フィルタは適用されない。

以前自分は

```yaml
---
vars:
  github_ssh_key: "{{ lookup('env', 'GITHUB_SSH_KEY') }}"
tasks:
  - name: Install git
    sudo: yes
    apt:
      name: git
  - name: Copy ssh key if exists
    when: github_ssh_key | default(None) != None
    copy:
      src: "{{ github_ssh_key }}"
      dest: ~/.ssh/id_rsa
      owner: "{{ ansible_user_id }}"
      mode: 0600
```
としていたのだけど、`github_ssh_key` は定義はされているので `"" != None"` となって常に実行されるようになってしまっていた。

こういったデフォルト値を設定する系は

- 定義済の変数
- 定義済みだけど値が空の定数
- 未定義の変数

のどういう時に適応されるのかをきちんと検証してから使うようにしないと危ないので注意が必要。
爆速ナンバーリンクソルバー（1）〜ナンバーリンクと充足可能性問題

先ほど、ブラウザで動くナンバーリンクソルバー（[http://jkr2255.github.io/js_puzzle_solvers/numberlink.html](http://jkr2255.github.io/js_puzzle_solvers/numberlink.html)）を公開しました。それについてまとめようと思ったのですが、1本の記事に書くには長すぎるので、少しずつ分けて書いていこうと考えています。

まずは、問題そのものである「ナンバーリンク」と、それの解法に使った「充足可能性問題」について解説します。

# まず、「ナンバーリンク」って？
ナンバーリンクは、数独やクロスワードといった、（もともとは）紙と鉛筆で楽しむ「ペンシルパズル」の一種です。ルールは[ニコリ社のサイト](http://www.nikoli.com/ja/puzzles/numberlink/rule.html)にもありますが、

* 盤面に入っている同じ数字を結ぶ
* 線は交差・分岐・合流などをせず、1マスに1本だけ通る
* 線は縦横に連続したマスにしか引けず、盤面の外にも出ない

というような感じです。

ふつう、数独に代表されるようにペンシルパズルは「ここにはこれが入らないから別のが入る」というように細かな条件を論理的に積み上げていくケースが多いですが、ナンバーリンクにはそのやり方が通用せず、ニコリにも「理詰めよりひらめきが重要」と書かれています。そういうわけで、コンピューターとの相性は決して良くなく、Windows用のソルバーでも15×15を完全に解ききるのに1時間ほどかかるような状況でした。

## 関西解
ナンバーリンクの用語として「関西解」というものがあります。「線が全部のマスを通らない別解」のことですが、関西の人からの投稿した問題から発見されたとか、関西の人からの指摘で発見されたとかということが多発したためにそう呼ばれるようになったとのことです。ニコリへの投稿では、**作者側への**ルールとして「すべてのマスを線が通る」というものがかけられています。

もし関西解を無視するなら、「全部のマスに線が通る」ということになり、理詰めで進む部分も増えます。ソルバーでも、関西解を無視した場合にはずっと速く動くものがありました。とはいえ、関西解がないかのチェックもソルバーに求められる役割なので、それは放棄したくないところです。

# 「充足可能性問題」とは？
今回、ナンバーリンクを解く方法としては、ナンバーリンクの条件を充足可能性問題に変換して、それを解く、という手法を取りました。

充足可能性問題、あまり聞きなれない人も多いとは思いますが、ざっくり説明すればこんな感じです。

> trueかfalseを取る大量の変数と、それをAND、OR、NOTで結んだ1本の論理式があって、この論理式全体をtrueにできるような変数の組が存在するか判定する問題

これだけだと使い道がピンとこないと思いますので、数独に当てはめてみましょう。「このマスが1になる」「このマスが2になる」…といった感じで、9×9×9=729個の論理変数を用意します。そして、これらが数独としての条件を満たす（同じ行や列、ブロックに同じ数字が入らない）ように論理式を並べていって、あとは充足可能性問題のソルバーに解かせれば、数独の解が出てくる、という寸法です。

なお、英語名称の**SAT**isfiability Problemsから、略して「SAT」と呼ばれています（本稿でもこの略称を適宜使います）。

また、SATは[NP完全性](http://qiita.com/jkr_2255/items/e02362568ff1294fa0cd)が初めて証明された問題であり、また多くの問題のNP完全性がSATを経由して証明されているという側面もあって、理論上も重要な問題です。

## SATとして解くメリット・デメリット
ナンバーリンクを直接解かず、このようにいったんSATとして解くことには、いくつかのメリット・デメリットがあります。

まず、いちばんのメリットとしては、SATソルバーは世界中の研究者がしのぎを削って最速を競いあうような分野なので、そのプラットフォームに乗せてしまえば、何もしなくてもSATソルバーを入れ替えるだけでどんどん速くなる、ということがあります。もちろん、ナンバーリンク専用にプログラムを書けば、理論上はもっと速いものを作れるはずですが、一般のプログラマーにはとうてい無理な芸当なので、プログラミングの手間を考えればSATソルバーを使った解法がじゅうぶんな最適解だと思います。

逆にデメリットとしては、SATソルバーは条件を満たす場合、値を「1組」返して終わってしまうので、別解がないかのチェックが必要となります。とはいえ、「この解を除外する」という条件1つを付け加えてもう一度SATソルバーを回せば、別解があるかどうか判定できますし、それをしてもなお高速です。

## CNF形式
SATソルバーは論理式を処理すると上述しましたが、実はその中でも[連言標準形](https://ja.wikipedia.org/wiki/%E9%80%A3%E8%A8%80%E6%A8%99%E6%BA%96%E5%BD%A2)（英語の**C**onjunctive **N**ormal **F**ormを略してCNFともいう）という形の論理式しか受け付けないものがほとんどです。CNFは、以下のいずれかのものをAND（$\wedge$）でつないだ形式です。あるいは、以下の3つの形の式を与えて、それらすべてを満たす、と言い換えても本質的に同じです。

* 1つの変数（$A$）
* 1つの変数の否定（$\neg A$）
* 上の2つの形のものをOR（$\vee$）でつないだもの（$\neg A \vee B \vee C \vee \neg D$）

つまり、$\neg(A\vee B)$や$A \vee (B \wedge C)$といったものは入らない、ということになります。もちろん、これらもうまく変形すればCNFにすることができます。ただし、ナンバーリンクを論理式化するに当たって、CNFの枠内ですべてを書けたので、その変換方法については触れません。

# 関連リンク
* [ruby-minisat とパズルのソルバ](http://d.hatena.ne.jp/ku-ma-me/20080106/p3)

# シリーズ記事の一覧
*  爆速ナンバーリンクソルバー（1）〜ナンバーリンクと充足可能性問題 
* [爆速ナンバーリンクソルバー（2）〜ナンバーリンクのSAT化](http://qiita.com/jkr_2255/items/0980d8e2e410d92338e8)

（続く）
linux コマンド　学習メモ

Qiitaをはじめとして様々な参考ページを見てもコマンドの意味で引っかかるので、備忘録として。

## **% a | b** 　aの出力結果をbの入力として渡す 

例：curlで取得したsetuptoolsのファイルをpython2.7に渡す

```bash:example.sh
% curl http://peak.telecommunity.com/dist/ez_setup.py | python2.7
```

## **Ctrl + z**  ジョブの一時停止

なお一時停止したコマンドは、「fg」コマンドによって、再実行させる事が出来る。

- fg %[ジョブ番号]　・・・コマンドの再実行
- bg %[ジョブ番号]　・・・コマンドをバックグラウンドジョブとして実行

また、バックグラウンドジョブとして実行されているコマンドを、強制終了するには「kill」コマンドを実行。

kill %[ジョブ番号]

## **Ctrl + c**  ジョブの強制終了

上記のジョブ一時停止からkillまでを一気に行うにはこれ。
Mithrilとwebpack


## やること

Mithrilでファイル分割したいので、webpackを使って実現してみる。

## 実践

※ Mithrilでアプリケーション自体は作ってある前提

### ディレクトリ構成

今作っているのがNode.jsでexpress利用で静的ファイルの配信も受け持っているので、publicディレクトリに最終的に呼び出しファイルが来るようにします。
元になるファイルはsrcディレクトリに置きます。以下のような形。


> project/
		├ public - javascripts
		|
		└ src - javascripts

        

### webpackを導入

```console:webpackをインストール
$ npm install webpack -g
```


### webpackを試してみる

まずはファイルを分割しない状態でwebpackの導入だけ試します。

```console:1st
[user project]$ webpack src/javascripts/main.js public/javascripts/bundle.js
Hash: acaf5f4df70bc797c7de
Version: webpack 1.12.2
Time: 73ms
    Asset     Size  Chunks             Chunk Names
bundle.js  9.75 kB       0  [emitted]  main
   [0] ./src/javascripts/main.js 8.07 kB {0} [built]
```

projectディレクトリで上記のように実行すると public/javascripts にbundle.jsが出来ます。
bundle.jsという名前はwebpackの公式チュートリアルに倣っただけなので好みで変えて大丈夫です。

上記で作ったファイルを呼び出すように呼び出し側も変更します。
expressでjadeを使っているので、下記のようになっています。

```jade:index.jade
extends layout

block content
  div(id="main")
  script(type='text/javascript' src='javascripts/bundle.js')

```

これでブラウザで確認します。
bundle.jsが呼ばれて、今までと動きが変わってなければOKです。

### ファイル分割してみる

webpackの導入自体は出来たので、今度は実際にファイル分割をしていってみます。
srcディレクトリの中の構成を変更して、Model部分を別ファイルに分割します。
今回はProductというModelを作っているのでそれを分離してみます。

> src/javascripts/
		├ main.js
		|
		└ models - product.js

元々のmain.jsでのProductの定義が以下の通りです。
								
```javascript:main.js
var Product = function(data) {
  this.title = m.prop(data.title);
  this.img   = m.prop(data.img);
};

Product.read = function() {
  return m.request({method: "GET", url: "/api/products", type:Product});
};

Product.judge = function(title, isFavorite) {
  return m.request({
    method: "POST",
    url: "/api/product",
    data: {
      title: title,
      fav: isFavorite
    }
  });
};

```

これをmodels/product.jsを新規で作って、移します。

```javascript:models/product.js

var Product = function(data) {
  this.title = m.prop(data.title);
  this.img   = m.prop(data.img);
};

Product.read = function() {
  console.log("changed");
  return m.request({method: "GET", url: "/api/products", type:Product});
};

Product.judge = function(title, isFavorite) {
  return m.request({
    method: "POST",
    url: "/api/product",
    data: {
      title: title,
      fav: isFavorite
    }
  });
};

module.exports = Product;

```

元のものとの違いは最終行のexportsだけです。
Node.jsで外部ファイル化する時と同じです。
ということで同じようにmain.jsでもNode.jsと同じようにrequireでの呼び出しに変更します。

```javascript:main.js
var Product = require("./models/product.js");
```

これで変更は終わりです。再びwebpackを動かします。

```console:webpack
[user project]$ webpack src/javascripts/main.js public/javascripts/bundle.js
Hash: 2646d6006063576cbf62
Version: webpack 1.12.2
Time: 78ms
    Asset     Size  Chunks             Chunk Names
bundle.js  10.4 kB       0  [emitted]  main
   [0] ./src/javascripts/main.js 8.18 kB {0} [built]
   [1] ./src/javascripts/models/product.js 438 bytes {0} [built]
```

実行結果の対象ファイルが増えているのがわかります。
これでまたブラウザで確認してみます。
問題なく動作していればOKです。これでModelの外部化が出来ました。
基本的にこの手順でファイルを分離して開発出来るようになります。

## 構成について

外部化を試しただけなので今回はこういう構成にしましたが、
実際に使う際は各コンポーネントを大元(今回であればmain.js)からrequireするようにして、
各コンポーネント内で必要なModelやコンポーネントをrequireする形になると思います。