OmniAICreator/Qiita-1.07M huggingface dataset:
CircleCIからPull Request にコメントする



## Summary
CircleCIの環境変数とGithubのAPIを使って、PRのIDをわりだし、そのPRのスレッドにコメントするためのPythonのコード

## Motivation
GithubのPR内で完結させるためにCircle CIでテストから、PRのスレッドにコメントを書き込みたい。



## How to use

```python
github = Github()

github.issue_comment('comment that you post in PR thread')

```

## Code

```python
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import os
import json
import pprint

import requests

__all__ = ['Github']

BASE_URL = "https://api.github.com"
TOKEN = 'YOUR TOKEN'
ORG = "YOUR ORG or USERNAME"
REPO = "YOUR REPOSITORY NAME"
GET_PULLURL_TMP = "{base_url}/repos/{org}/{repo}/pulls"
CACHE_FILE = '/tmp/github_pull_info'
branch = os.environ['CIRCLE_BRANCH']


class Github(object):
    def __init__(self):
        self._pull_info = None
        self._headers = {'Content-Type': 'application/json',
                         'Authorization': 'token ' + TOKEN}
        if os.path.isfile(CACHE_FILE):
            self._read_cache()
        else:
            self._get_pull_info()
            self._write_cache()

    def _generate_pulls_url(self):
        """
        Generate pull url
        HOST/repos/:owner/:repo/pulls
        """
        return GET_PULLURL_TMP.format(base_url=BASE_URL, org=ORG, repo=REPO)

    def _get_pull_info(self):
        """
        Get pull infor using pull API
        There is an assumption that one branch is used for one PR
        """
        url = self._generate_pulls_url()
        params = {'head': ORG + ":" + branch}
        r = requests.get(url, headers=self._headers, params=params)
        if r.status_code == 200:
            self._pull_info = json.loads(r.text)

    def _generate_comment_url(self):
        """
        Generate comment url
        HOST/repos/:owner/:repo/issues/:num/comments
        """
        return self._pull_info[0]['issue_url'] + '/comments'

    def _write_cache(self):
        with open(CACHE_FILE, 'w') as f:
            f.write(json.dumps(self._pull_info))
            f.flush()

    def _read_cache(self):
        l = None
        with open(CACHE_FILE, 'r') as f:
            l = f.readlines()[0]
        if l and self._pull_info == None:
            self._pull_info = json.loads(l)

    def issue_comment(self, comment):
        """ Post issue comment for this PR """
        url = self._generate_comment_url()
        data = json.dumps({'body': comment})
        r = requests.post(url, headers=self._headers, data=data)
        pprint.pprint(json.loads(r.text))


if __name__ == "__main__":
    github = Github()
    comment = 'test'
    github.issue_comment(comment)
```


## Some assumeptions
* 一つのブランチから、一つのPRしか作成されない。
* パラレルで複数実行されない #PRの情報をAPIとってキャッシュして、APIを叩く回数を減らしているため。
* 細かいエラーハンドリングはしていない。
Rails4 checkboxで複数のチェックを配列で受け取る

Rails4使ってて、checkboxで複数のチェックをArrayで受け取る方法

HTML側 (1行目と5行目は関係ない)

```html
<input type="number" name="num">個数
<input type="checkbox" name="gadgets[]" value="iPhone">アイフォン
<input type="checkbox" name="gadgets[]" value="Android">アンドロイド
<input type="checkbox" name="gadgets[]" value="WindowsPhone">ウィンドウズフォン
<input type="text" name="hoge">ほげ
```

Controller側

```rb
gadget_params = params.permit(:num, {:gadgets => []}, :hoge)
```

これでgadget_paramsは`{"name"=>"2", "gadgets"=>["iPhone", "Android"], "hoge"=>"fuga"}`みたいになる。

ポイントは
1. HTML側でチェックボックスのnameに`[]`をつける。こうするとRailsが配列として扱ってくれる
2. StrongParametersのpermitで配列であることを明示する。
構造体を定義するメモ


#定義の仕方をいつも忘れてしまうのでメモ
typedefを使って、クラスの外に定義する。

```hx:typedef.hx
typedef Point = { x : Int, y : Int }

class Path {
    var start : Point;
    var target : Point;
    var current : Point;
}
```

#参考
もっと詳しく書いてある
http://old.haxe.org/manual/struct?version=17720
Go で Iterator を書く



golangでのイテレーターの実装方法を
ググって見つけたのがこちらの記事
http://ewencp.org/blog/golang-iterators/
こちらにある4種類の方法が主な方法かと思いますが、
気に入ったのは、
チャンネルを使ったパターンとコールバックを使ったパターンの2つ。


チャンネルパターン
===============

コードの書き方としては、
このパターンが一番しっくりくるのですが、、

```go:チャンネルパターン
func IntChannelIterator() <-chan int {
    ch := make(chan int)
    go func() {
        for _, val := range int_data {
            ch <- val
        }
        close(ch) // Remember to close or the loop never ends!
    }()
    return ch
}
```

```go:チャンネルパターン使用例
var sum int = 0
for val := range IntChannelIterator() {
    sum += val
}
```

他のパターンと比べると致命的に遅いのが欠点です。
以下は、上記ページにあったコードをgo ver1.4.1を使って
MacBook Pro (Retina, Mid 2012) で実測結果です。

```bash:
$ go version
go version go1.4.1 darwin/amd64
$ go test -bench .
testing: warning: no tests to run
PASS
BenchmarkIntsCallbackIterator	     500	   2733180 ns/op
BenchmarkDataCallbackIterator	     500	   3142514 ns/op
BenchmarkIntsChannelIterator	       5	 269527633 ns/op
BenchmarkDataChannelIterator	       5	 266374326 ns/op
BenchmarkIntsBufferedChannelIterator	      20	  94554939 ns/op
BenchmarkDataBufferedChannelIterator	      20	  93447309 ns/op
BenchmarkIntsClosureIterator	     300	   5030297 ns/op
BenchmarkDataClosureIterator	     300	   4855251 ns/op
BenchmarkIntStatefulIterator	    1000	   2333693 ns/op
BenchmarkDataStatefulIterator	     500	   2490458 ns/op
BenchmarkIntStatefulIteratorInterface	     200	   6054515 ns/op
BenchmarkDataStatefulIteratorInterface	     200	   6797890 ns/op
ok  	github.com/masahide/golang-iterators-benchmark	26.820s

```

ここまで速度差が出てしまうと、繰り返し処理としては致命的かもしれません。。
チャンネルバッファを使ってもまだまだ・・・。


コールバックパターン
================

そこで、速さと、コードの書きやすさを両立したコールバックパターンです。

```go:コールバックパターン
func IntCallbackIterator(cb func(int)) {
    for _, val := range int_data {
        cb(val)
    }
}
```

```go:コールバックパターンの使用例
var sum int = 0
IntCallbackIterator(func(val int) {
    sum += val
})
```


その他のパターン
======

なんというか中途半端感があって興味が出ません。。
スピードにこだわるならStatefulパターンですね。でもコールバックとそれほど違わないので、うーん。
Ubuntu 12.04にagをインストールする

嵌ったのでメモ。

環境
====
```shell-session
$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=12.04
DISTRIB_CODENAME=precise
DISTRIB_DESCRIPTION="Ubuntu 12.04 LTS"
```

### インストール
```shell-session
$ git clone https://github.com/ggreer/the_silver_searcher
$ cd the_silver_searcher && ./build.sh
```

### エラー
``` shell-session
./build.sh: line 16: aclocal: command not found
```

### 対応
``` shell-session
$ sudo apt-get install automake
```

### インストール再開
```shell-session
$ ./build.sh
```

### エラー
``` shell-session
No package 'libpcre' found
```

### 対応
``` shell-session
$ sudo apt-get install libpcre3-dev
```

### インストール再開
```shell-session
$ ./build.sh
```

### エラー
``` shell-session
No package 'liblzma' found
```

### 対応
``` shell-session
$  sudo apt-get install liblzma-dev
```

### インストール再開
```shell-session
$ ./build.sh
$ sudo make install
```
HomebrewでインストールしたappをAlfredが見つけてくれない件

[Alfred](http://www.alfredapp.com/)はMacOSX上で使える便利なランチャーですが、Homebrewでインストールした*.appを見つけてくれないという問題点があります。たとえばEmacs.appなどがそうです。

```
$ ls -la /Applications/Emacs.app
lrwxr-xr-x 1 hnw admin 30  2 15 13:47 /Applications/Emacs.app -> /usr/local/opt/emacs/Emacs.app
```

このようにシンボリックリンクで/Applications以下にインストールされている場合、Alfredは起動アプリの候補として提案してくれません。これは次のように公式サポートページにも書かれているので、どうやらAlfredの仕様のようです。

- [Finding Symlinked Applications - Alfred v2 Support](http://support.alfredapp.com/kb:symlinked-apps)

なので、上のページに書いてある通り、設定の「Features」「Default Results」「Search Scope」にappの実体が置かれているディレクトリを指定すると良いでしょう。僕は次のディレクトリを設定しました。

```
/usr/local/Cellar/emacs
```
GoでAWS APIを叩く。 aws-sdk-go の エラー時再試行でエクスポネンシャルバックオフ(exponential backoff)

引き続き aws-sdk-go ネタです。

AWS APIのエラー時の再試行には、[exponential backoff しなさい](http://docs.aws.amazon.com/ja_jp/general/latest/gr/api-retries.html)と書かれてまして、
goで exponential backoffしてみます。

exponential backoff とは？
=========================

再試行時のwait間隔を徐々に（指数関数的に）伸ばす処理のことです。

[exponential backoff](http://yoshidashingo.hatenablog.com/entry/2014/08/17/135017) についてはこちらにわかりやすい説明があります。


goでexponential backoff するパッケージ
====================================

https://github.com/cenkalti/backoff
これを使います。

[s3.PutObjectのサンプル](http://qiita.com/yamasaki-masahide/items/1a11545e1c5984ab7481#putのサンプル)の PutObjectを exponential backoff化すると以下のような感じ

```go
    var res *s3.PutObjectOutput

    err = backoff.Retry(func() error {
        res, err = S3.PutObject(&req)
        return err
    }, backoff.NewExponentialBackOff())
    if err != nil {
        log.Printf("err:%s", res, err)
    }

    log.Printf("res:%s", res)
```

エラーの種類を問わず再試行を繰り返してしまうようなかなりの手抜きですが、
こんな感じで簡単に使えます。

ちなみに、aws-sdk-go のdevelopブランチでは、[標準でretry機能](https://github.com/awslabs/aws-sdk-go/commit/2a6ecb44b037ee9479d43c62fb4cb463fee6d9de)が実装されているっぽいです。
iTunes音楽再生時のBGM制御 cocos2d-x 3.x


# やりたいこと

- アプリ起動時にiTunes等で音楽再生状態であれば音楽を優先して再生し続ける
- アプリ起動時には音楽再生をしていないが、タスク切り替えで音楽再生後にアプリがアクティブになったときにも音楽を再生し続ける

音楽を聞きながらゲームアプリで遊びたいといった要件です。

# やること

- AudioSessionのCategoryを「AVAudioSessionCategoryAmbient」にする
- otherAudioPlayingプロパティで判別する
- ボリュームを0にする

ボリュームを0にすることに関しては、iTunesなどの音楽が止まったあとにBGMをリジューム再生したかったため、stop/playではなくボリュームを制御することで無音再生で対応するためです。

# ポイント

- AppController.mmのdidFinishLaunchingWithOptionsでは設定せず、AppDelegate.cppのdidFinishLaunchingWithOptionsで設定する

AppController.mmで実装してしまうと、アプリ起動時に他で曲が再生されていない場合Ambientにカテゴリ設定してもSoloAmbientになってしまうようでした。

曲の再生中にアプリを起動した場合にはAmbientに設定されるのですが、設定する場所が適切では無いんでしょうね（didFinishLaunchingWithOptionsで設定します的なことは書かれてないから）。

このところよくわかってません。

# 実装概要

1. Objective-CとC++のブリッジとなる（例）GameUtil.h, GameUtil.mm（Objective-C++）を作成する
2. GameUtilに以下の（例）メソッドを作成する
	- Ambientカテゴリを設定するsetCategoryAmbientメソッド
	- otherAudioPlayingプロパティを取得するisOtherAudioPlayingメソッド
3. AppDelegate.cppのdidFinishLaunchingWithOptionsでsetCategoryAmbient()を実行する
4. Foregroundデリゲートや各SceneなどでisOtherAudioPlaying()により判別しBGM制御を適宜実装する

# 実装サンプル
```Objective-C++:GameUtil.h
class GameUtil
{
	public:
		static bool setCategoryAmbient();
		static bool isOtherAudioPlaying();
};
```

```Objective-C++:GameUtil.mm
#import <AVFoundation/AVFoundation.h>

bool GameUtil::setCategoryAmbient()
{
	NSError* error = nil;
	AVAudioSession* audioSession = [AVAudioSession sharedInstance];
	[audioSession setCategory:AVAudioSessionCategoryAmbient error:&error];
	if (error) {
		return false;
	} else {
		return true;
	}
}

bool GameUtil::isOtherAudioPlaying()
{
	AVAudioSession* audioSession = [AVAudioSession sharedInstance];
	return [audioSession isOtherAudioPlaying];
}
```

# 参考

[Audio Session プログラミングガイド](https://developer.apple.com/jp/documentation/AudioSessionProgrammingGuide.pdf)
[AVAudioSession Class Reference](https://developer.apple.com/library/prerelease/ios/documentation/AVFoundation/Reference/AVAudioSession_ClassReference/index.html)
Raspberry Pi 2 セットアップメモ


## 初期設定
Raspbianの起動処理が終わると、初回起動時は、「Raspi-config」という画面が表示される。

#### Expand Filesystem
SD カードの空き領域をハードディスク（ルートファイルシステム）として使う (NOOBSを使用している場合、デフォルトで設定済み)。

#### Change User Password
パスワードは変更する。

#### Enable Boot to Desktop/Scratch
Console。

#### Internationalisation Options
* Change Locale: en_US.UTF-8 と ja_JP.UTF-8 を選択し、デフォルトは en_US.UTF-8に設定
* Change Timezone: GMT+9
* Change Keyboard Layout: Generic 105-key(Intl) PC > Japanese – Japanese(OADG 109A) > その他は全てデフォルト
	* 文字化けしていてわからなかったので[ここ](http://s2jp.com/2013/12/raspbian-first-settings/)を参照した

#### Advanced Options
* Hostname: ホスト名
* SSH: Enable
* SPI: Enable
wp core updateでエラー

```
xxx-> wp core update
Updating to version 4.1 (ja)...
Using cached file '/Users/xxx/.wp-cli/cache/core/ja-4.1.tar.gz'...
更新を展開しています…
Error: パッケージをインストールできませんでした。 PCLZIP_ERR_BAD_FORMAT (-10) : Unable to find End of Central Dir Record signature
```

こんな感じのエラーになった場合、`~/.wp-cli/cache/core`のファイルを削除して`wp core update`すればうまくいくかもね。
IAM - AWSのアカウント管理でのつまづきポイント

# はじめに
AWSのアカウントを作成したので、まずは「[AWSアカウント作ったらこれだけはやっとけ！IAMユーザーとAuthyを使ったMFAで2段階認証](http://qiita.com/yoshidashingo/items/cd206daca0596659b440)」に従ってIAMアカウントを作れば、基本的にはスムーズにIAMの設定が終わります。

しかし、**「コレ、選択肢がいっぱいあるけど、どれ選べば良いんだ？」**と、途中で気になって仕方なくなってしまう人向けに書いた記事です。

以降、見出しは「元記事の見出し → 疑問」といった感じで構成して、元記事と対応を取ってます。


# 1.Authyのセットアップ → Googleの認証システムを既に使ってるんだけど？

いわゆる2段階認証というやつをアプリで解決しちゃうのが[Authy](https://www.authy.com/)なのですが、同じことをGoogleアカウントへのログイン時に使えるようにしている人もいますよね？
もちろん、同じように利用できます。設定方法もAuthyの場合と特に変わらないので、置き換えて読めば問題ありません。

また、なんとなくGoogleのアプリの方が良いなという人も、そちらを使ってあげて下さい。
[Android版アプリ](https://play.google.com/store/apps/details?id=com.google.android.apps.authenticator2&hl=ja)と[iOS版アプリ](https://itunes.apple.com/jp/app/google-authenticator/id388497605?mt=8)のそれぞれあるのでインストールしちゃいましょう。

# 3-2. ポリシーの適用（IAMユーザーへ） → 必須？
**NO!**
ポリシーはグループ単位とユーザー単位で設定でき、両方設定されたユーザーは両方の権限を合わせ持つことになります。
例外的なユーザーを除いてグループ別管理の方が管理が楽になるかと思いますので、ユーザーにはポリシーを設定せず、**グループにポリシーを設定し、各グループにユーザーを所属させる**方法をオススメします。
グループにポリシーを設定する方法は下記を参照。

## Groupの作成とアサイン
1. [IAM Console](https://console.aws.amazon.com/iam/home?#home) に移動 
2. 左メニューの**Groups**を選択
3. **Create New Group**を選択
4. 後は流れに沿ってグループを作成
5. 左メニューの**Users**を選択
6. グループにアサインするユーザーを選択
7. **Add User to Groups**を選択して、グループに所属させる


# 3-2. ポリシーの適用（IAMユーザーへ） → ポリシーがいっぱい。どうしよう！？
「3-2-2.で「Administrator Access」を選んでるんだけど、これってどうなん？」と思った方へ
良く使いそうなポリシーを幾つかピックアップしておきました。
ポリシーは後から変更もできます。また、自分でオリジナルのポリシーも作れます。

* AdministratorAccess: 基本的に全部できる。ルートアカウントの代わりに使うアカウントに設定しておくと便利。
* PowerUserAccess: 上記からIAMの操作権を取り除いたポリシー
* ReadOnlyAccess: 参照権限のみのポリシー
* ○○FullAccess
    * ○○の所にサービス名が入り、それぞれのサービスに限定して全権限を設定できるポリシー
    * 例： AmazonEC2FullAccess、AmazonS3FullAccess
* ○○ReadOnlyAccess
    * ○○の所にサービス名が入り、それぞれのサービスに限定して参照権限を設定できるポリシー
    * 例： AmazonEC2ReadOnlyAccess、AmazonS3ReadOnlyAccess



# 5.Password Policyの設定 → で、どれをチェックすれば良いんだい？
上4つは迷わずチェックしてしまいましょう。
5.〜8.は運用ルールと相談して設定して下さい。
セキュリティよりも運用の楽さを優先するのであれば、追加で5つ目を設定しておくと良いです。

1. Require at least one uppercase letter  
  パスワードに必ず**大文字**を含める
2. Require at least one lowercase letter  
  パスワードに必ず**小文字**を含める
3. Require at least one number  
  パスワードに必ず**数字**を含める
4. Require at least one non-alphanumeric character  
  パスワードに必ず**記号**を含める
5. Allow users to change their own password  
  発行したIAMアカウントに、パスワードの変更を許可する
6. Enable password expiration & Password expiration period (in days):  
  パスワードに**期限**を設ける。期限は入力した日にちに設定する。
7. Prevent password reuse & Number of passwords to remember:  
  同一パスワードの再使用を許可しない。記録しておくパスワードの個数を指定する。
8. Password expiration requires administrator reset  
  パスワードの期限が切れた場合、ユーザーは管理者にコンタクトを取る必要がある
情弱だがGoで画像付きツイートしたい


もはやGoでやる理由がよく分かりませんが、やってしまったのでメモ。

追記：この記事を最初に書いたときは画像投稿がサポートされていませんでしたが、できるようになったので不要そうな部分を削りました。

## GoでTwitterAPI使うならanaconda

とりいそぎ私はNICKI MINAJのお尻を想起しましたね。

`golang twitter`でググったら

https://github.com/ChimeraCoder/anaconda

これが出てきました。
スターの数もそれなりにあるのでポピュラーっぽい。
なので、今回はこれを使います。

anacondaで画像付きツイートできるんです。

## やり方

`go get github.com/ChimeraCoder/anaconda`でインストール


```go:awful.go
// あらかじめ画像をbase64エンコードしておき、base64Stringに格納しておく
// で、画像をアップロードする
// apiはanacondaから生成したTwitterAPI叩く用のクライアント(?)です
media, _ := api.UploadMedia(base64String)

// 画像のidを付加してツイートする
v := url.Values{}
v.Add("media_ids", media.MediaIDString)
tweet, _ := api.PostTweet("hello anaconda", v)
```

# 雑談

本家githubのExamplesに書いてることだけど、メモ

## インストール

`go get github.com/ChimeraCoder/anaconda`

## とりあえず文字だけのツイートしてみる

※Twitterアプリの作成やコンシューマキーやアクセストークンなどの準備は事前にしてある前提です。

まずはAPIを叩くためのクライアントのインスタンスを生成します。
githubのExampleにのってるヤツをパクっただけです。

```go:初期化
anaconda.SetConsumerKey("your-consumer-key")
anaconda.SetConsumerSecret("your-consumer-secret")
api := anaconda.NewTwitterApi("your-access-token", "your-access-token-secret")
```

これでTwitterAPIが叩けるようになりました。

で、投稿は下記のとおり

```go:ツイート
tweet, err := api.PostTweet("hello anaconda", nil)
```

これだけ笑
簡単ですねー

画像の投稿は冒頭に書いてるヤツでできるはず。

# 勉強になった。シェアさせてください！
fuelPHPのお勉強


# メモしたいことをメモする

ORMの意義とかまだわかってないなと感じつつ、設計思想とともにお勉強が進んでおります。おもしろい。

## 他コントローラーの呼び出しについて

モデリング的にはNGかもだけど、、とりあえずのメモ。

最初に試した。

```php
$variation = Request::forge('hoge/create')->execute(array('param_hmvc'=>$param_hmvc))->response();
```

これだとaction以外もいけるな。beforeでインスタンス化しとく。
インスタンス化したときにbeforeは実行されていないオブジェクトなので注意。

```php
$this -> Controller_Hoge = new Controller_Hoge($this -> request);
$variation = $this -> Controller_Hoge -> create($param_hmvc);

```

## 関連

$_has_one　→　1対1
$_has_many　→　1対多
$_belongs_to　→　多対1、1対1（$_has_one、$_has_manyの反対側）
$_many_many　→　多対多

http://blog.lunarians.net/pc_it/1180.htm
belongs_toがわかりやすい

http://runble1.com/fuelphp-orm-hasmany/
関連のデータの扱い方がわかりやすい

http://piyopiyocs.blog115.fc2.com/blog-entry-574.html
発行SQLまで書き下しているのでわかりやすい

## model_softについて

#### うまくいかない

どうも、allとかfirstなどの指定が使えないような気がする。
1.7あたりはバグを含んでるみたい。findがうまく機能しないでエラーになるのでたぶんそれだな。
http://stackoverflow.com/questions/21018263/fuelphp-permanently-deleting-with-model-soft
1.8はまだdevelopになってる。
ひとまずはsoftはつかわずにいくか。一時的に使うとかできればいいけどな。

http://qiita.com/moroya/items/80f1746909aaf2fc6867
softで喜んでる例

#### その後できたっぽい

・デフォルトのままの、deleted_atのカラムにした。（多分これは要因ではない）
・deleted_atにnullを許可した
・cascade_save,cascade_deleteまわりを少し理解して設定した

モデルの変更例は下記を参考
http://d.hatena.ne.jp/kaitoh07/20130115/1358219271

公式は下記
http://fuelphp.jp/docs/1.8/packages/orm/model/soft.html

このcascadeはfalseで、親のcascadeをtrueにする方向で。
http://madroom-project.blogspot.jp/2011/11/ormmodel.html

```php
            'cascade_save' => true, // true/falseどちらで有るべきか、要調査。とりあえずはドキュメント通り。
            'cascade_delete' => true, // falseにすると、削除時にtwitter_userが削除されなかった。

```

```php
            'cascade_save' => false, // trueにすると一切の変更がない場合のsave()でエラーとなる。
            'cascade_delete' => false, // trueにすると削除時に親も消してしまう。注意。

```

## cascade_save, cascade_delete

http://unoss.game-ss.com/programming/fuelphp%E3%81%AEorm%E8%A6%9A%E3%81%88%E6%9B%B8%E3%81%8D

cascade_saveするときって、createのときのバリデーションをどうすればいいのだろう。
ひとまずトランザクションで囲んでtrycatchでエラー制御してるので、これについては未確認。

## updateについて

stashしてmargeするらしい。
http://runble1.com/fuelphp-update-git/
Web Components周辺の日本語情報一覧

日本語情報のキュレートされた一覧があってもいいかなと思って作った。BrickとかBosonicはどうしようかなと悩みながら一覧に入れていない。観測していない記事もいっぱいあると思うので、情報ください。

## Web Components

- [なぜ Web Components はウェブ開発に革命を起こすのか](https://blog.agektmr.com/2014/05/web-components.html) - Tender Surrender
- [2017年のWeb Components：新春特別企画｜gihyo.jp … 技術評論社](http://gihyo.jp/dev/column/newyear/2017/web-components-prospect) - gihyo.jp
- [Web Components 周辺の仕様とかブラウザ互換性 2017年秋](https://1000ch.net/posts/2017/webcomponents-specs.html) - EagleLand
- [Web Components Updates at html_modules_study](https://1000ch.github.io/slide/webcomponents-2017/)
- [2018年のWeb標準](http://gihyo.jp/design/column/newyear/2018/web-standards-prospect) - gihyo.jp

### Custom Elements

- [カスタム要素 v1: 再利用可能なウェブ コンポーネント](https://developers.google.com/web/fundamentals/getting-started/primers/customelements?hl=ja) - Web Fundamentals

### Shadow DOM

- [Shadow DOM v1: 自己完結型ウェブ コンポーネント](https://developers.google.com/web/fundamentals/getting-started/primers/shadowdom?hl=ja) - Web Fundamentals

## 読み物

- [Polymer と Web Components](http://steps.dodgson.org/b/2013/05/19/polymer-and-web-components/) - steps to phantasien
- [Web Componentsについて、いま思うこと](http://sadah.hatenablog.com/entry/2014/07/29/232721) - console.blog(self);
- [祝: Atom の Web Components 導入、ついでに Atom Shell の話。](http://steps.dodgson.org/b/2014/12/21/atom-from-the-shell-side/) - steps to phantasien
- [デザイナはWeb Componentsに夢を見るのか](http://qiita.com/cognitom/items/c5f17fd9b1c53c420232) - Qiita

## 動画

- [Web をまともにしたいので Shadow DOM と Web Components をつくってます - HTML5 Conference 2013](https://www.youtube.com/watch?v=GCw4fJEEVe8) - YouTube
- [Polymer で作る次世代ウェブサイト - HTML5 Conference 2015](https://www.youtube.com/watch?v=qzh56Ja1eaw&feature=youtu.be&t=3h20m16s) - YouTube
- [DevBytes: Web Components - Overview](https://www.youtube.com/watch?v=T5y_lmLngAk) - YouTube 日本語字幕付き
- [DevBytes: Web Components - Custom Elements](https://www.youtube.com/watch?v=iVJA-lGkEFw) - YouTube 日本語字幕付き
- [DevBytes: Web Components - Template](https://www.youtube.com/watch?v=qC5xK6H0GlQ) - YouTube 日本語字幕付き
- [DevBytes: Web Components - Shadow Dom](https://www.youtube.com/watch?v=Is4FZxKGqqk) - YouTube 日本語字幕付き
- [DevBytes: Web Components - HTML Imports](https://www.youtube.com/watch?v=JhpOw8mq1jo) - YouTube 日本語字幕付き
カレント以下にあるgitリポジトリのユーザがそれぞれどうなっているかを確認するbashワンライナー


会社用と個人用でユーザが違う時にちゃんと設定されてるのか確認したいと思った。
既に誰かがあげてそうだな。。

findで.ディレクトリをうまくつかむ手段がなくsed..

```bash
$ find . -type d -name .git | sed "s+$+/config+g" | xargs grep name

```
grep の出力をバッファさせない

grep コマンドは、何もしないと出力をバッファする（一旦溜め込む）ようになっています。

あるファイル全体とか固定のデータに対して grep する場合は特に気にならないでしょう。
しかしストリーミングデータを扱う場合、例えば何らかのログファイルを `tail -f` したものに対して grep すると、複数行がまとめて遅延して出力されてしまいます。
ここは元のログが出力されると（ほぼ）同時に、リアルタイムに grep 結果も出力してほしいところです。

## 解決策: `--line-buffered` オプション

grep に `--line-buffered` オプションをつけると、出力がバッファされることなくリアルタイムに表示されるようになります！

```bash
$ tail -f /var/log/access.log | grep -E '\.png$' --line-buffered
```

`--line-buffered` は、「1行単位で出力させる」というオプションです。BSD grep と GNU grep ともに用意されているので、Mac ユーザも Linux ユーザも安心です。

man 見てみましょう。

```text:BSD-grep
# grep (BSD grep) 2.5.1-FreeBSD

--line-buffered
    Force output to be line buffered.  By default, output is line buffered when standard output is a terminal and block buffered otherwise.
```

```text:GNU-grep
# grep (GNU grep) 2.14

--line-buffered
    Use line buffering on output.  This can cause a performance penalty.
```

パフォーマンスが悪くなるかも、と書いてあります。状況によって使い分けましょう。
CPUとメモリの進化についてホットトピックをまとめてみた



PC watchで連載されている「後藤弘茂の海外ウイークリーニュース」は、CPU、メモリ周りの業界動向をチェックする上で非常に面白い。Intel、AMD、Apple、Sumsungといった半導体ベンダの製品発表・ロードマップについて、深く考察されている良記事が多い。

ちょっと思い立って2014年の記事を眺め直してみた。

[後藤弘茂の海外ウイークリーニュース 2014年記事一覧](
http://pc.watch.impress.co.jp/docs/column/kaigai/index2014.html)


ムーアの法則が減速していると言われて久しいが、CPUもメモリもまだまだ進化を続けていることが伺える。

以下、CPUとメモリについて一つずつ気になった記事についてまとめた。


# ウェアラブル・デバイス向けのCPU

記事URL
http://pc.watch.impress.co.jp/docs/column/kaigai/20141022_672381.html

![www_arm_com_files_event_B2_Building_Ultra-Low_Power_Wearable_SoCs__Using_High_Efficiency_Processors_pdf.png](https://qiita-image-store.s3.amazonaws.com/0/52689/6d30c649-bd01-e7cc-83b2-d1ce2dc96a6e.png "www_arm_com_files_event_B2_Building_Ultra-Low_Power_Wearable_SoCs__Using_High_Efficiency_Processors_pdf.png")
(ARM. http://www.arm.com/files/event/B2_Building_Ultra-Low_Power_Wearable_SoCs__Using_High_Efficiency_Processors.pdf よりスライドを抜粋.)

昨年、Apple Watchの発表で一気に注目度が上がった、ウェアラブル・デバイス。
ウェアラブル・デバイスが流行るかかどうかは、バッテリーの持ちがどれくらい長くなるか、といった話は良く聞かれるが、ARMがこの問題に対してどう取り組んでいるか、という話だ。

面白いのと思ったのは、実は現状のARMのCPU製品の中に、ウェアラブル・デバイスで想定されている消費電力のレンジと機能を実現するのに最適化されたCPUは、今のところ存在していない、という指摘だ。言い換えると、半導体設計、CPUアーキテクチャ設計の観点から言えば、ウェアラブル・デバイス向けのSoCの電力効率はまだまだ改善の余地が大きい、と見ることもできるわけだ。

例えば、2007年に発売されたiPhoneの性能は(ベンチマークにもよるが)7年間で数十倍に伸びた。ちなみに、同じ時期にデスクトップPCの性能はほとんど伸びていない。

当時は、デスクトップPC向けに最適化されたCPUが主流であり、その設計は電力を(発熱が許す限り)いくらでも使えることを前提に最適化されていた。このため、バッテリー駆動のスマートフォン上で動作することを想定し最適化されたCPUは存在していなかった。しかしスマートフォンの普及に伴い、電力制約の厳しいモバイル端末向けのCPU設計の最適化に多額の研究開発費をかけることが可能になると一気にスマートフォンの性能は向上していったわけだ。

この状況は、見方によっては、現在のウェアラブル・デバイス向けのCPUを取り巻く状況に似ていなくもないと思う。

スマートウォッチが一定数売れ、ウェアラブル・デバイス向けのSoCの開発に多額の研究開発費用がかけられるようになるとすれば、ウェアラブル・デバイスのバッテリー寿命や機能に関しても大きなブレークスルーが起きうるのかもしれない。


# High Bandwidth Memory (HBM)

記事URL
[秒読み段階に入った広帯域メモリ「HBM」](
http://pc.watch.impress.co.jp/docs/column/kaigai/20141215_680069.html)


![https___hpcuserforum_com_presentations_seattle2014_IDC_AMD_EmergingTech_Panel_pdf.png](https://qiita-image-store.s3.amazonaws.com/0/52689/9f7bcd50-9bdb-d524-5ce7-47f35ba2b844.png "https___hpcuserforum_com_presentations_seattle2014_IDC_AMD_EmergingTech_Panel_pdf.png")



(AMD Research, https://hpcuserforum.com/presentations/seattle2014/IDC_AMD_EmergingTech_Panel.pdf より図を抜粋.)


ざっくり言うと、CPU <-> メモリ間の帯域性能が大幅が向上にしますよ。という話。

例えば、数年前にスパコン性能で世界一になった神戸の京コンピュータの１CPUあたりのメモリ帯域は64GB/secだが、これが次世代のHBMでは最大で1TB/secまで高性能化する。スペック的には、10倍以上の性能向上である。


HBMを実現する技術の原理は直感的に分かりやすく、半導体チップに対して垂直方向に電気信号を送るビアを突き刺し、これを使ったデータへの並列アクセスを実現する(AMD Researchの図が分かりやすかったので載せています)。つまり、チップの辺からだけでなく面全体で、データ転送が可能になるので、メモリ帯域性能が大幅に向上するわけだ。これはThrough Silicon Via(TSV)と呼ばれる技術で、2000年代後半から世界的な研究開発競争が繰り広げられてきたもので、ついに実用・普及段階に入る、ということもあり注目度は非常に高い。


まずは、HPCアプリケーション(気象シミュレーションやFFTなどのメモリ帯域で性能が決まるアプリケーション)がターゲットとなり、コストが下がればGPU向けのメモリとしてもコンシューマー向けに展開されると思うが、これがどの程度商業的に成功するかは2015年〜16年のホットトピックだろう。
Railsの正規表現での^と$


Rails4での正規表現を使ってModelのVaildatesを実装するときに始めて知ったので、メモ。

# 例

## 郵便番号を正規表現でチェックする

### エラーが出た実装

```ruby:user.rb
class User < ActiveRecord::Base
  validates :zip_code, format: { with: /^\d{3}\-?\d{4}$/ }
end
```

これでアプリケーションを実行すると以下のエラーが出ました。

![Screen Shot 2015-02-15 at 4.45.20 PM.png](https://qiita-image-store.s3.amazonaws.com/0/31059/3ef59117-6657-185e-e015-6ba1fdba7f39.png "Screen Shot 2015-02-15 at 4.45.20 PM.png")

```
The provided regular expression is using multiline anchors (^ or $), which may present a security risk. Did you mean to use \A and \z, or forgot to add the :multiline => true option?
```

セキュリティリスクがあるので

- 行頭の ```^``` は ```\A``` 
- 行末の ```$``` は ```\z``` 

を使え、と言われた。

### 修正した実装

```ruby:user.rb
class User < ActiveRecord::Base
  validates :zip_code, format: { with: /\A\d{3}\-?\d{4}\z/ }
end
```

これでエラーは出なくなりました。

Rails4から正規表現のルールが厳しくなって、 ```multiline: true``` が設定されていない場合は ```^```, ```$``` はエラーになるそうです。なるほどなるほど :smiley:

---

# 参考

- http://stackoverflow.com/questions/17759735/regular-expressions-with-validations-in-ror-4
- http://blog.tokumaru.org/2014/03/z.html
【Swift】iOSでViewControllerに隠しコマンドを埋め込む方法

by [@SzkAtmosphere](https://twitter.com/SzkAtmosphere)

## はじめに
レトロゲームと呼ばれるようになったファミコンやスーファミのゲームには、ゲーム内の隠し要素を出現させるためのコマンドが存在するものが度々見受けられました。その中でも広く知られているのが、グラディウスに仕込まれている通称"コナミコマンド"だと思います。
隠しコマンドを使っていつもとは違う裏要素を見るというのも、ゲームを楽しむ上での一つの要素だったりもするのではないでしょうか。
そういった隠しモードをアプリでも実現したら面白いのではないとか考え、スワイプジェスチャーとABボタンでコマンドを入力できる[SASecretCommandViewController](https://github.com/szk-atmosphere/SASecretCommandViewController)を作ってみました。
[こちら](https://www.youtube.com/watch?v=P4fON48g6iA)からYoutubeにアップロードしてあるデモ動画が視聴できます。
![aaa.jpg](https://qiita-image-store.s3.amazonaws.com/0/60325/a3b72934-620b-70df-47cd-4964d503c2a5.jpeg)

## インストール方法
* Cocoapods

[SASecretCommandViewController](https://github.com/szk-atmosphere/SASecretCommandViewController)はSwiftで書かれているため、Cocoapodsでインストールするには0.36 beta以上の環境が必要になります。また、Development TargetはiOS8以上にしてください。下記の内容のPodfileを作成し、`pod install`を実行してください。

    platform :ios, "8.0"
    pod 'SASecretCommandViewController'

* マニュアル

[SASecretCommandViewController](https://github.com/szk-atmosphere/SASecretCommandViewController)をcloneまたはダウンロードし、[SASecretCommandViewController/SASecretCommandViewController](https://github.com/szk-atmosphere/SASecretCommandViewController/tree/master/SASecretCommandViewController)ディレクトリのswiftファイルをProjectに全てコピーしてください。マニュアルインストールの場合はiOS7.0以上で使用可能です。

##使い方
Cocoapodsからインストール場合は、使用するswiftファイル内で`import SASecretCommandViewController`をしてください。

導入自体はいたって簡単で
1. `SASecretCommandViewController`を継承したViewControllerを生成
2. `viewDidLoad()`でコマンドを登録
3. `secretCommandPassed()`をオーバーライドし、コマンドが通った際の処理を記述
の3点になります。

```
class ViewController: SASecretCommandViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

        // SASecretCommandTypeの配列を用意し、コマンドを登録します
        let commandList: [SASecretCommandType] = [
            .Up,
            .Up,
            .Down,
            .Down,
            .Left,
            .Right,
            .Left,
            .Right,
            .B,
            .A
        ]
        self.registerSecretCommand(commandList)

        // 入力したコマンドを表示します
        self.showInputCommand = true
    }

    override func secretCommandPassed() {
        super.secretCommandPassed()
        // ここにコマンドが通った際の処理を記述します
    }
}
```
`SASecretCommandType`には
・Up
・Down
・Left
・Right
・A
・B
があるので、それらを自由に組み合わせて隠しコマンドを登録することができます。
`showInputCommand`を`false`にすることで、入力したコマンドを非表示にすることができます

## 最後に
大概のアプリには"アプリについて"というバージョン情報やライセンス系を表示するViewがあると思うのですが、そういったViewなどに隠しコマンドを埋め込んだりしたら面白いかもしれませんね。
Fedora21でcockpitを触ろう

## インストール

* Fedora 21をインストール済みであること
  * [Fedora 21をEFIインストール時のkickstart - Qiita](http://qiita.com/tukiyo3/items/430829237e95cb47d8c9)とか

```bash:
yum install -y cockpit docker-io
systemctl start cockpit
systemctl start docker
```

* https://server-ip:9090/ にアクセスするとcockpitの画面が表示される。
* リソースモニター代わりやwebからのコンソール操作にいいかも？


## スクリーンショット

![1login.png](https://qiita-image-store.s3.amazonaws.com/0/25728/a88763ac-4496-869f-02d7-3aa3fdcdd5e5.png)

rootアカウントのパスワードでログイン

![2servers.png](https://qiita-image-store.s3.amazonaws.com/0/25728/c6803ab0-37b6-1ba9-1f8c-925011b32685.png)

ホストを追加できるのであろう。

![terminal.png](https://qiita-image-store.s3.amazonaws.com/0/25728/bb42ca8d-ff82-293b-1c64-8f7f711829c1.png)

terminalがwebから操作できるのは便利

![3info.png](https://qiita-image-store.s3.amazonaws.com/0/25728/a06cf937-1ab7-d345-c62a-155a0c13a444.png)

docker起動がwebから出来る様子。

![4disk.png](https://qiita-image-store.s3.amazonaws.com/0/25728/ea3dd97e-d476-6848-cdcb-0a4fe0f8e97f.png)

docker pull

![5docker.png](https://qiita-image-store.s3.amazonaws.com/0/25728/49751160-91c2-c837-b78f-440feffb15c0.png)

![6containers.png](https://qiita-image-store.s3.amazonaws.com/0/25728/8763e20b-5def-8ed5-b214-873f82694df3.png)

![7dockersearch.png](https://qiita-image-store.s3.amazonaws.com/0/25728/9f7bcfa6-7191-50e7-9d88-2cd1c71afd7a.png)

![8dockerpull.png](https://qiita-image-store.s3.amazonaws.com/0/25728/5d7c8d16-f4d9-78c3-eef2-e11be60dc51b.png)

![9dockerrun.png](https://qiita-image-store.s3.amazonaws.com/0/25728/1cc31887-ac73-38c7-b291-9b73375e3d94.png)

![10dockerrun_info.png](https://qiita-image-store.s3.amazonaws.com/0/25728/ce576068-e5d1-0a63-6be5-9660cae07df4.png)

ポートフォワーディングやネットワーク設定など細かいオプションはwebからだと指定出来ない。

![11.png](https://qiita-image-store.s3.amazonaws.com/0/25728/dc8d649b-ac99-f92f-c8b8-e1c2d8d8368a.png)

![12.png](https://qiita-image-store.s3.amazonaws.com/0/25728/4906fdff-3cdc-61be-2071-0d4c312731cc.png)

webからcommitもできる。コマンドが長くて覚えられなかったので便利
LaTeXでforeachマクロを使う

LaTeXでforeachを使いたい時に便利．

```LaTeX:foreachをつかう
\documentclass{jsarticle}

\usepackage{pgffor} % including foreach                                         

\def\myloop#1{%                                                                 
  \foreach \x in {#1}{ これは{\x}です．\\ }
}

\begin{document}

\myloop{10, cat, 猫, the dog}

\end{document}
```

![スクリーンショット 2015-02-15 16.32.06.png](https://qiita-image-store.s3.amazonaws.com/0/44835/bb954e59-4858-6038-2f48-7c6b9654f449.png)
LaTeXマクロでfor/whileループ


LaTeXでfor/whileループが書ければ便利な時があります．
そんなときのマクロの書き方．どっちも同じです．

```latex:whileループ
\documentclass{jsarticle}

\newcount\K % int K                                                                             
\def\mywhile#1{%                                                                                
  \K=0 % K=0                                                                                    
  \loop\ifnum\K<10 % while(K<10)                                                                
    これがループ \number\K 回目です．% この行を実行                                               
  \advance\K by1% K++                                                                           
  \repeat % end while                                                                             
  }

\begin{document}

\mywhile{10} % ループ実行                                                                       

\end{document}
```

```latex:forループ
\documentclass{jsarticle}

\newcount\K % int K                                                                             
\def\myfor#1{%                                                                                  
  \K=0 \loop\ifnum\K<10 % for(K=0;K<10;K++)                                                     
  これがループ \number\K 回目です．% この行を実行                                               
  \advance\K by1\repeat % end for                                                               
  }

\begin{document}

\myfor{10} % ループ実行                                                                         

\end{document}
```

![スクリーンショット 2015-02-15 16.33.53.png](https://qiita-image-store.s3.amazonaws.com/0/44835/450a9b4a-d4f0-3929-fc0b-7715e6ee9028.png)
MacOSX Mavericks + Emacs 24.3環境が妙に重い

MacOSX 10.9+Emacs24.3の環境でdistnotedがメモリを食いまくる状況になっていました。このEmacsはHomebrewからinlineパッチつきでインストールしたものです。

去年の1月頃から話題になっていたようですが、下記2つの記事で当てているパッチが異なっているように見えます。複数の問題が存在したのかもしれません。


- [distnotedプロセスの暴走に対応するためhomebrewのemacsにパッチをあてる (OS X Mavericks‎) - 寺子屋未満 - 別邸(2014-01-14)](http://tdiary.omuc.org/?date=20140114#p01)
- [Emacs on OS X Mavericks 10.9 で distnoted プロセスが暴走する問題の解決方法 | Carpe Diem](http://www.sssg.org/blogs/naoya/archives/2589)


僕は単にHomebrewでEmacs24.4をインストールして解決しました。

- [HomebrewでEmacs 24.4+インラインパッチをインストールする | たったのセブンクレジット](http://www.sevencredit.com/2014/11/07/669/)
NAO の 3Dモデルを Unity で使う


## はじめに

* Aldebaran のサイトで 3D モデルが配布されていますが、Unity でグリグリ動かしたら面白いことができるのではないかと。
* さらに JavaScript なんかで連動させちゃったら、もっと面白いんじゃないかと。
* Pepper のモデルも作ってください。

## ダウンロード

* [https://community.aldebaran-robotics.com/resources/download/](https://community.aldebaran-robotics.com/resources/download/)

Solidworks と Blender 用が置いてあります。Solidworks はよくわかりませんが、Blender 用は直接 Unity で読み込めるかな。

## モデルのインポート

Unity のプロジェクトビューの **Assets** のコンテキストメニューから **Import New Asset...** を選択

![2015021501.png](https://qiita-image-store.s3.amazonaws.com/0/20418/43bd2c47-8fe6-30f1-e708-c9a3cd12ac85.png "2015021501.png")

ファイル選択ダイアログが開きますので、ダウンロードしたモデルを選択して、 **Import** ボタンを押下

![2015021502.png](https://qiita-image-store.s3.amazonaws.com/0/20418/bbb6ca8e-91f3-cc50-0c13-0eaaff35be8b.png "2015021502.png")

## インポートしたモデルをシーンに追加

怖いw

![2015021503.png](https://qiita-image-store.s3.amazonaws.com/0/20418/8f27ebd3-8ffa-6ac1-721a-4e64e86ae6a6.png "2015021503.png")

## 感想

* 本当にモデリングのみのデータみたいですね。
* あまりよく知らないですが、Unity か Blender かで関節とか骨？の設定とかないと、動かすの大変なんじゃないですか？
* 後で調べて、余裕があればもう少しやってみます。
* それから Pepper のモデルも作ってください。
C言語でのポインタ変数宣言時の *（アスタリスク）の位置

Cライクな言語でポインタ変数を宣言する際のアスタリスクの位置でどこの土壌でコーディングしてたかがちょっとわかりますよね。

書き方は大体３種類に分かれると思ってて

```c
int *foo;   // (1)
int* foo;   // (2)
int * foo;  // (3)
```

です。

まず、結論から言うと人それぞれでいいと思います。バグらなければ。

もちろんコーディングスタイルで決まっているならそれに沿うべきですが、(2)で記述した人が間違った解釈さえしなければどっちでもいい。バグらなければ。


## (2) `int* foo;` の副作用

副作用、ってほど大事ではないのですが、アスタリスクを型にくっつける人は`int`と`int*`を別として、それぞれが確立された型と認識していることがあります。

そうなるとどうなるか、下記のような勘違いを起こす可能性があります。

```c
int *foo, *bar;  // 両方ともポインタ変数
int* foo, bar;   // fooだけポインタ変数、barは普通のint
```

これされるとバグの温床になる得る。

```c
int* foo;
int* bar;
```

こうすればおk。


## ちなみに

僕は (1) の `int *foo;` 派です。

また、Objective-Cの流儀は(1)です。（たしか


## もしかしたら

コンパイラによって解釈違うのかもしれないですね。
（というより、昔なにかで見た気がするのですが、勘違いですかね？）


## おまけ

https://gist.github.com/kaneshin/67e3e20ebe98cecc6fb5
Windows環境ではLaravel Installerよりcreate-project

# 手短に言うと

Windows環境でLaravel Installerを使うと`vender/bin/phpunit.bat`とかが無くて困ります。

# 詳細

Laravelのインストール方法としてLaravel Installerを使う方法とcomposer create-projectを使う方法があります。

Laravel/installerは内部では単に http://cabinet.laravel.com/latest.zip をダウンロードして解凍しているようです。そしてこのzipファイルはおそらくですが、laravel/installerに同梱されている[zipper.sh](https://github.com/laravel/installer/blob/master/zipper.sh)で作成されています。やっていることとしては、githubからlaravel/laravelのmaster.zipをダウンロードして解凍し、composer installで依存しているパッケージを取得し、再度zipを作成しています。

しかしこのZipはUnix上で作成されているため、これをWindows上で展開すると少々問題があります。

composerは、phpunitのような実行ファイルを含むパッケージのcomposer installを行うときに、`vender/bin/`に何を作るかを環境に応じて決めています( https://github.com/composer/composer/blob/master/src/Composer/Installer/LibraryInstaller.php )。

例えばcomposer create-project laravel/laravelをWindows上で行うと、`vendor/bin`以下には

* classpreloader.php
* classpreloader.php.bat
* phpspec
* phpspec.bat
* phpunit
* phpunit.bat
* psysh
* psysh.bat

が作成されますが、Unix環境では

* classpreloader.php
* phpspec
* phpunit
* psysh

しか作成されません。そして、Laravel InstallerをWindows上で実行した場合も（Unix上でcomposer installしたzipを展開しているだけなので）同様に.batファイルは生成されません。
luminusテンプレ作成後cljfmtのエラーが出た場合

こんなエラー

```
clojure.lang.Compiler$CompilerException: java.io.FileNotFoundException: Could not locate rewrite_clj/node__init.class or rewrite_clj/node.clj on classpath: , compiling:(cljfmt/core.clj:1:1)
```

解決
https://github.com/clojure-emacs/cider-nrepl/issues/146
lein-ancientっていうライブラリがコンフリクトを起こしているらしいので、

```clj:project.clj
:plugins
  [[lein-ring "0.9.0"] [lein-environ "1.0.0"] [lein-ancient "0.5.5"]]
```
0.5.5->0.6.2に修正して解決。
ディスクIO+ネットワークを使ったソフトの負荷計測を調べる時に便利なLinuxコマンド体制

#Linuxでの負荷モニタリング体制

ConoHaのオブジェクトストレージ(OpenStack Swift)通信用にrubyクライアントを作っていた時にネットワークとIOの負荷計測をモニタリングしたかったのでモニタリング体制を整えた時のメモ。

![ljljl.png](https://qiita-image-store.s3.amazonaws.com/0/36931/e4d8c652-d6aa-6246-e577-db066139835b.png)


ターミナルクライアントは[RLogin](http://nanno.dip.jp/softlib/man/rlogin/)である(Windows GUIソフト)。
ターミナルクライアントソフト側でウィンドウを分割してくれるためWindowsでは重宝する。
どうしてもteratermが使いたいんだ！という人はlinux側で[tmux](http://tmux.sourceforge.net/)を使いましょう。
Macなら[iTerm2](http://iterm2.com/)がウィンドウ分割が使えます。

各ウィンドウで動かしているのは以下である

![ljljl2.png](https://qiita-image-store.s3.amazonaws.com/0/36931/adc95f4f-5b68-0079-e93a-4ba944dd2eb8.png)


## (右上) 作業ウィンドウ
![work.png](https://qiita-image-store.s3.amazonaws.com/0/36931/8b642a26-c6c2-4317-b06c-2dcf32f808c4.png)

ここで負荷計測対象のコマンドを実行する。
ディスクIOの場合はファイル作成とか圧縮コマンドとかファイル分割とか暗号化とかそういうものを実行する。
ネットワーク負荷を調べたいときはダウンロードソフトとかアップロードソフトを実行する。


## (左上) TOPコマンド
![top.png](https://qiita-image-store.s3.amazonaws.com/0/36931/30388d5d-04ca-24e8-ad58-222eb5f9e540.png)

ここはお馴染みのtopコマンド
主にCPU負荷や負荷が高いプロセスを確認する。
作業ウィンドウで実行しているプロセスが一番上に来た場合は要注意である


## (左下) iftopコマンド ・・　ネットワーク負荷計測

![iftop.pn.png](https://qiita-image-store.s3.amazonaws.com/0/36931/0fd1a465-bca2-7aaa-b229-7af4149478e7.png)

iftopコマンドでネットワークの負荷計測、帯域の限界値をモニタリングする。
``iftop -i eth0``でデバイスを指定できる
iftopは割と負荷が高いのでiftop自体の負荷が高くそれが問題になる場合は別のモニタリングを検討する。
参考) http://orebibou.com/2014/09/linux%E3%81%A7%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E3%81%AE%E7%9B%A3%E8%A6%96%E3%82%92%E8%A1%8C%E3%81%88%E3%82%8B%E3%83%A2%E3%83%8B%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0%E3%82%B3/


## (右下)　iostat ・・・　ディスクio負荷計測
![iostat.png](https://qiita-image-store.s3.amazonaws.com/0/36931/a554711a-448e-3f2e-9b1c-cbb66920bb5d.png)

iostatでディスク負荷のモニタリングをする
``iostat 1`` は秒数を指定するとその間隔（1秒）でモニタリングを更新する
Fedora 21をEFIインストール時のkickstart

ESCを押してから以下追記

```bash:
inst.ks=http://192.168.100.2/ks/fc21macmini.cfg ip=192.168.100.9 netmask=255.255.255.0 gateway=192.168.100.1 nameserver=8.8.8.8
```

* [CentOS • View topic - Editing grub.cfg for EFI install options](https://www.centos.org/forums/viewtopic.php?f=47&t=48639)

## fc21macmini.cfg

```bash:
#version=DEVEL
# System authorization information
auth --enableshadow --passalgo=sha512

# Use CDROM installation media
#text
graphical
# Run the Setup Agent on first boot
firstboot --enable
ignoredisk --only-use=sda,sdb
# Keyboard layouts
keyboard --vckeymap=jp --xlayouts='jp'
# System language
lang ja_JP.UTF-8
# custom
firewall --disabled
selinux --disabled

# Network information
network  --bootproto=dhcp --device=enp3s0f0 --ipv6=auto --activate
network  --hostname=localhost.localdomain
# Root password
# (略)

# System timezone
timezone Asia/Tokyo --isUtc

# user追加
# (略)

# System bootloader configuration
bootloader --location=mbr --boot-drive=sda
# Partition clearing information
clearpart --all --initlabel --drives=sda,sdb
# 
part /boot/efi --fstype=efi --grow --size=200 --ondisk=sda
part /boot --fstype=ext3 --size=300 --ondisk=sda
part /mnt/hdd --fstype=ext4 --size=1 --grow --ondisk=sda
part swap --size=4000 --ondisk=sda
#
part / --fstype=xfs --size=1 --grow --ondisk=sdb

reboot

%packages
@core
%end

%addon com_redhat_kdump --disable --reserve-mb='128'
%end

%post --log=/root/ks-post-anaconda.log
set -x
yum update -y
yum clean all
%end
```
Swiftで #define (マクロ)を使う


Objective-Cでは使えていた #define がSwiftになって使えなくなったように見えるのですが、Swiftベースのプロジェクトでも使うことは可能なようです。

Xcodeでプロジェクトを作成する際にLanguage:Swiftを選択すると .pchファイル 自体が作られないないですし、Swiftのみでは #define を使うことはできません。

ですが、Objective-Cと共存可能という特性を利用すれば、Swiftから #define 定義されたマクロを使えるようになりました。

以下試した手順です。

---

##1: Swiftベースのプロジェクトに.pchファイルを追加
![.pchファイルの作成](https://qiita-image-store.s3.amazonaws.com/0/15905/0845f565-3f38-f10f-f50c-ce6e0a747c61.png "01.png")


##2: Bridging-Header.hファイルをプロジェクトに追加
![Bridging-Header.hファイルの追加](https://qiita-image-store.s3.amazonaws.com/0/15905/ca6b4ca7-4f03-e51e-0bee-3a0c68d170e3.png "02.png")

※今回はとりあえずObjective-Cのファイルを作成しています。


##3: Bridging-Header.hファイルで.pchファイルをimport

```SwiftMacroSample-Bridging-Header.h
#import "PrefixHeader.pch"
```

![Bridging-Header.hファイルでimport](https://qiita-image-store.s3.amazonaws.com/0/15905/da33de5d-fe96-6593-8e1b-24c0567eceaf.png "03.png")


##4: .pchファイルにて #define を定義

```PrefixHeader.pch
#define MESSAGE  @"HELLO!"
```

![#defineを定義](https://qiita-image-store.s3.amazonaws.com/0/15905/700ea099-9868-e920-ead0-a7a89fc24ff3.png "04.png")


##5: Swiftから呼び出し（実行結果）

```ViewController.swift
println(MESSAGE)
```

![実行結果](https://qiita-image-store.s3.amazonaws.com/0/15905/7baacf6e-778a-e7ea-4e89-c91152ae4a85.png "05.png")


```
HELLO!
```

####以上で.swiftファイル内でマクロ名が使えるようになりました。
初心者にネットワークを教えるとき

##ネットワークを教えるのは難しい
* 自分でネットワーク(TCP/IP)を教えるときに工夫したことをシェアする。
* 自分は文系出身で、研修でTCP/IPを学んだとき、とても苦労した。
* とりあえず、OSI参照モデルがわからない。。。
* ちょっと変わったやり方なので、あくまで参考までに

##導入：ネットワークがつながるとはどういうことか。
####OSI参照モデルを最初に教えない
* OSI参照モデルは概念的であり、かつ、TCP/IPの考え方とも齟齬があるので、最初には教えない。新人レベルでは知識として知っておくだけでよい。

####クライアントアプリケーションとサービスアプリケーション(デーモン)の役割を最初に教える。
* 最初にIPとは、イーサネットとは、と言われてもゴールが見えない。WebサーバとWebブラウザの簡単な役割を伝える。

> クライアント：リクエストを送信して、レスポンスを受け取って受け取ったデータを処理する。
サービス：コンピュータ上に常駐し、リクエストを受け取って、レスポンスをクライアントに返す。

* 目で確認できること、操作して動作検証できることで仕組みを体感させる。

> 個人のローカルにWebサーバを用意して、HTMLファイルを閲覧できるようにする。URLを指定してアクセスさせる。「http://192.168.x.xx/sample.html」など。
> アクセス先のパソコンにsample.htmlが存在し、ファイルが変更されれば、表示が変更されること、アドレスを変更すれば、別のパソコンにアクセスしたりする。

ある程度遊んでもらったら、適宜説明を入れる。
伝えるポイントは
* クライアントアプリとサービスの役割
* コンピュータの住所を示すIPアドレスの存在と設定方法
* コンピュータ上でアプリケーションの宛先を示すポート番号の存在（80と指定したら、消え、9999と指定したら消えずにアクセスできなくなることで体感的に説明できる。）
* あと、強調しておくべきは、物理的配線

大事なことは、クライアントアプリからOSを経由してパケットが送信され、サーバアプリに到達し、サーバからパケットが返却される、「キャッチボールのイメージ」を持ってもらうこと。
普通の初心者は通信をキャッチボールではなく、「そこに行って見に行く、取りに行く」イメージを持っている。

ここらで、「ping」を教えてもいい。IPの細かいところは不要。

####ネットワークが「つながるとき」と「つながらないとき」を体感的に理解させる。
設定やパラメータを操作して、つながらなくなること、つながらない原因とそのエラーメッセージをみせる。

* IPアドレスを変更、または存在しないIPを指定(コンピュータまで到達できない。)
* ポート番号を変更させる。(コンピュータまで到達。OSがアプリを探せない。)
* Webサーバを停止させる。(コンピュータまで到達。OSがアプリを探せない。)
* 存在しないHTMLファイルを指定する。（サーバAPまで到達。APがファイルを探せない。）
* ケーブルを抜く。スイッチの電源を切る

それぞれ、「パケットがどこまで到達できたか」、を「絵」で書かせる。個人で書かせて、小グループで共有させるといい。
時間次第だが、トラブルシューティングの演習をやってもいい。文章でトラブルの状況を説明し、グループで調査方法、解決方法をディスカッションさせる。
また、思考の方向を逆にして、「このように設定したら、どうなるか」という問いかけをしてもいい。

※ちなみに、自分はWindowsのTCP/IPプロトコルスタックを無効にする、ってのもやる。OSレベルで果たしている役割も認識してもらう。OSの機能の復習にもなる。

此処で、応用問題として、別のネットワークアプリケーション(自分はTELNETを使ってやっていた)を利用させる演習をやってもいい。かえって混乱させる危険もあるが、クライアントとサービス、IPアドレスの復習になる。

また、ファイアウォールの説明と演習をやってもいい。ポート番号が理解できていれば、すんなり理解できる。TCP/UDPは簡単な説明でよい。時間によっては、本よんどけ、でよい。

重要なことは理論的な理解を実際の操作、画面上の値、メッセージと連動させること。ネットワークの難しさの源泉は、目に見えないこと。自分の理解の正しさを目に見える形で検証できないこと。

ここまでの内容で大体１日〜２日（演習の量による）。
一応OSI参照モデルを説明したい場合は、個人的には最後に、知識として知っておいてね、って感じでやる程度。新人の最初はこれでいいと思う。

##IPの仕組みについて教えるとき
教える内容
*  IPの構造(IPアドレス、サブネットマスク)
*  ルータ(L3スイッチ)の役割とルーティングテーブル
*  DHCP

##OSI第２層及びイーサネットについて教えるとき
教える内容
* MACアドレスとCSMA/CD
* ARP
* スイッチの役割
VB.netでFizzBuzz

#おさらい
[Wikipedia](http://ja.wikipedia.org/wiki/Fizz_Buzz)
#1 : IF

```vb
For i As Integer = 1 To 100
    If i mod 15 = 0 Then
        Console.WriteLine("FizzBuzz")
    Else If i mod 5 = 0 Then
        Console.WriteLine("Buzz")
    Else If i mod 3 = 0 Then
        Console.WriteLine("Fizz")
    Else
        Console.WriteLine(i)
    End If
Next
```

よくあるパターン

#2 : Select

```vb
For i As Integer = 1 To 100
    Select Case 0
        Case i mod 15
             Console.WriteLine("FizzBuzz")
        Case i mod 5
             Console.WriteLine("Buzz")
        Case i mod 3
             Console.WriteLine("Fizz")
        Case Else
             Console.WriteLine(i)
    End Select
Next
```

C#ではできない書き方です

#3 : IIF関数(C#における三項演算子)

```vb
For i As Integer = 1 To 100
    Console.WriteLine(IIF(i mod 15 = 0, "FizzBuzz", IIF(i mod 5 = 0, "Buzz", IIF(i mod 3 = 0, "Fizz", i.ToString())))) 
Next
```
読みにくい

#4 : Switch関数(F#におけるパターンマッチ(ちょっと大変))

```vb
For i As Integer = 1 To 100
    Console.WriteLine(Microsoft.VisualBasic.Switch(i mod 15 = 0, "FizzBuzz", i mod 5 = 0, "Buzz", i mod 3 = 0, "Fizz", True, i.ToString()))
Next
```

System.Diagnostics.Switchと名前が衝突している…

#5 : LINQ使って(@ishi さん)
クラスまで定義してやるのがいい．

```vb
Module Module1
    Private Class BS
        Private _b As Boolean
        Private _s As String

        Public ReadOnly Property B As Boolean
            Get
                Return _b
            End Get
        End Property

        Public ReadOnly Property S As String
            Get
                Return _s
            End Get
        End Property

        Public Sub New(ByVal b As Boolean, ByVal s As String)
            _b = b
            _s = s
        End Sub

    End Class

    Sub Main()
        Dim l As New List(Of BS)

        For i As Integer = 1 To 100
            l.Add(New BS(i Mod 15 = 0, "FizzBuzz"))
            l.Add(New BS(i Mod 5 = 0, "Buzz"))
            l.Add(New BS(i Mod 3 = 0, "Fizz"))
            l.Add(New BS(True, i.ToString()))
            Console.WriteLine(l.Find(Function(s) s.B).S)
            REM Console.WriteLine(l.First(Funtion(s) s.B).S)でも
            l.Clear()
        Next

        l = Nothing
    End Sub

End Module
```

#6 : フェルマーの小定理を用いたコードゴルフ風（@fujitanozomu さん）

```vb
For i As Byte=1To 100
    Dim f=i^2Mod 3,b=i^4Mod 5
    Console.WriteLine("{0:;;Fizz}{1:;;Buzz}{2:#}",f,b,f*b*i)
Next
```

フェルマーの小定理（pとnは互いに素）

```math
n^{p-1} \equiv 1 \ \ \left(mod\ \ p\right)
```

を用いています．（`f`は`p=3`, `b`は`p=5`）
`Console.WriteLine`の行は，";" section separator, "#" digit place holderを用いています．[^1]
書式指定子に，"A;B;C"とすると，正の数の時にA，負の数の時にB，ゼロでCが表示されます．
";;C"としているので，ゼロの時とき，Cが表示されます．
そして，"#"とすると，ゼロの時は表示されません．
f*b*iはどれでも割り切れるときは0に，どちらも割り切れないとiになり，望む結果になるわけですね．


###あとがき
もっと変態(?)なコードがあったらコメントで教えて下さい。

[^1]: https://docs.microsoft.com/ja-jp/dotnet/standard/base-types/custom-numeric-format-strings
Raspberry Pi 2 で pi_piper が動かない→そんなことはなかった

なんとなく興味が出てきたので、Raspberry Pi 2 を購入しました。

プログラミングでいう Hello world である LED チカチカに挑戦中です。

シェルスクリプト、Ruby でファイルアクセスによる GPIO 制御がなんとなくわかったきたので gem を使いたいなと思い検索。

pi_piper というものがあるそうなのでそれを以下に従ってやってみた
http://kingyo-bachi.blogspot.jp/2013/07/raspberry-pirubyled.html

でもエラーが出ないのにうまくいかない。

もしかして Raspberry Pi 2 には対応してないんだろうか？
多分自分が悪いとは思うんですが、何が悪いかわからない。。。

```rb
require 'pi_piper'
 
pin = PiPiper::Pin.new(:pin => 22, :direction => :out)
 
10.times do
  pin.on
  sleep 0.5
  pin.off
  sleep 0.5
end
 
uexp = open("/sys/class/gpio/unexport", "w")
uexp.write(22)
uexp.close
```

実行時には sudo つけて実行しています。

（追記）  
シェルスクリプトやRubyでファイル書き込みによるLEDチカチカは成功しています  
どなたかアドバイスをいただけないでしょうか？

（追記）
やはり自分が悪かった。
> please note, in the above context "pin" refers to the GPIO number of the Raspberry Pi.  
(https://github.com/jwhitehorn/pi_piper)  

つまりピン番号じゃなくてGPIO番号を入れろってこと。
GPIO番号入れたら動きました。
ドキュメントはよく読みましょうね。。。

消したいけど同じ間違いをする人が生まれないように残しておきます汗
GoでAWS APIを叩く。 aws-sdk-go の 認証には aws.DetectCreds() が便利

> このaws-sdk-goは古いバージョンを対象にしているため、現在のauth周りは全く異なります！


aws-sdk-goのauthですが、
ついつい以下のようにAccessKeyを直接書いてしまいがちですが、

```go
var (
    accessKey = "AWSaccesskey"
    secretKey = "AWSsecretKey"
    region    = "ap-northeast-1"
)
func main() {

    httpClient := &http.Client{Timeout: time.Duration(30) * time.Second}

    creds := aws.Creds(accessKey, secretKey, "")
    S3 := s3.New(creds, region, httpClient)
```

aws.DetectCreds()
==================

aws.DetectCreds() を使うと、
1. 環境変数
2. /.aws/credentials 
3. EC2に設定しているIAM Role
[の順](https://github.com/awslabs/aws-sdk-go/blob/edd1c6e934b6603a3d20e9d373909b291679f27a/aws/auth.go#L64)で勝手に認証情報を探して使ってくれてます。
便利です。とりあえずの実装ならこれを使うべき。

使い方は簡単です。 空の文字列を3つ渡すだけ。

```go
    S3 := s3.New(aws.DetectCreds("", "", ""), region, httpClient)
```



putのサンプル
============


ついでに、
ファイルをputする簡単なサンプルを載せておきます。


```go
package main

import (
        "log"
        "net/http"
        "os"
        "time"

        "github.com/awslabs/aws-sdk-go/aws"
        "github.com/awslabs/aws-sdk-go/gen/s3"
)

var (
        region    = "ap-northeast-1"
        bucket    = "buket_name"
        filename  = "hoge.txt"
        acl       = "private"
        mimeType  = "text/plain"
)

func main() {
        var (
                err  error
                file *os.File
                info os.FileInfo
        )

        httpClient := &http.Client{Timeout: time.Duration(30) * time.Second}

        S3 := s3.New(aws.DetectCreds("", "", ""), region, httpClient)

        if file, err = os.Open(filename); err != nil {
                log.Println(err)
        }
        defer file.Close()

        if info, err = file.Stat(); err != nil {
                log.Println(err)
        }

        req := s3.PutObjectRequest{
                Body:          file,
                Bucket:        &bucket,
                Key:           &filename,
                ACL:           &acl,
                ContentType:   &mimeType,
                ContentLength: aws.Long(info.Size()),
        }

        res, err := S3.PutObject(&req)
        log.Printf("res:%s, err:%s", res, err)

}
```

ちなみに、
aws-sdk-goのdevelopブランチでは、初期化回りが変わっているので注意です。
https://github.com/awslabs/aws-sdk-go/blob/develop/service/s3/service.go#L19