OmniAICreator/Qiita-1.07M huggingface dataset:
NSWindowをProgramaticallyに生成する

##NSWindowをProgramaticallyに生成する

タイトル通り、別ウィンドウをInterface Builder(以下IB)を使用せずに、コードで生成する方法を紹介します。また、生成したウィンドウの表示、閉じ、破棄の仕方も簡単に紹介します。

#メインのウィンドウをIBで作る


![Screen Shot 2015-06-05 at 10.29.58 PM.png](https://qiita-image-store.s3.amazonaws.com/0/46509/356fc6ee-afc4-0e59-9653-8eee9dda4f29.png "Screen Shot 2015-06-05 at 10.29.58 PM.png")

単純にCreateとCloseボタンを作ります。
Createボタンを押すことでNSWindow生成を、さらに生成後に押す場合は生成したNSWindowを表示する機能をつけます。

Closeボタンは生成されたNSWindowを破棄せずに、閉じる機能をつけます。

#修正 2015.Nov
Swift 2.0 以降、NSWindowの生成方法の、最後の引数deferについて、''で囲む必要があります。

```C:main.c
self.window = NSWindow(contentRect: NSMakeRect(0, 0, 640,480),
                styleMask: NSTitledWindowMask|NSResizableWindowMask|NSMiniaturizableWindowMask|NSClosableWindowMask,
                backing: NSBackingStoreType.Buffered,
                `defer`: false)
```

#コード

```C:main.c
import Cocoa
import Foundation

class ViewController: NSViewController {
    
    //生成するwindow
    var windowA:NSWindow?
	//生成完了後はtrue
    var windowAFlag:Bool = false
	//windowAをコントロールするクラス
    var windowAControl: NSWindowController?

	//CreateボタンのAction
    @IBAction func OpenWindow(sender: AnyObject) {
        
		 //windowが未生成の場合は生成する
        if(!self.windowAFlag){
            
            self.windowA = NSWindow(contentRect: NSMakeRect(0, 0, 640,480), styleMask: NSTitledWindowMask|NSResizableWindowMask|NSMiniaturizableWindowMask|NSClosableWindowMask, backing: NSBackingStoreType.Buffered, defer: false)
            
            self.windowA!.title = "New Window"
            self.windowA!.opaque = false
            self.windowA!.center()
            self.windowA!.movableByWindowBackground = true
            self.windowA!.backgroundColor = NSColor(calibratedHue: 0, saturation: 1.0, brightness: 0.5, alpha: 0.7)
            self.windowA!.makeKeyAndOrderFront(nil)

            self.windowAControl = NSWindowController(window:self.windowA)
            
            self.windowAFlag = true

        }else{//windowがすでに生成されている場合はNSWindowControllerを使用してwindowを表示
            self.windowAControl!.showWindow(nil)
        }
    }
    
    //Closeボタン用のAction
    @IBAction func CloseWindow(sender: AnyObject) {
        
	//NSWindowクラスのclose()は、生成したwindowを破棄する
        //self.windowA!.close()
	//単純に閉じたい場合はNSWindowControllerのclose()を使う
        self.windowAControl!.close()
    }
    

    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
    }

    override var representedObject: AnyObject? {
        didSet {
        // Update the view, if already loaded.
        }
    }
}
```

 #結果
![Screen Shot 2015-06-05 at 10.47.13 PM.png](https://qiita-image-store.s3.amazonaws.com/0/46509/67053db9-5c1a-354d-d7f4-90c85446a93c.png "Screen Shot 2015-06-05 at 10.47.13 PM.png")

#参考
http://stackoverflow.com/questions/28031732/create-programmatically-nswindow-in-swift
Ethereumテストネットを立ち上げてetherを掘るまで


# Ethereum Frontier Guideより　
参照URL
http://ethereum.gitbooks.io/frontier-guide/content/

* Welcome to the Frontier!!

1. Go-ethereumクライアント(geth)インストール

　	省略。cpp-ethereumでも可ですが、以下はgeth前提でやります。
　	
2. コンソールを起動　&　テストネット起動

（注意）初期設定でやると、すでにあるブロックチェーンとの同期にすごく時間がかかる。

　　練習でやる場合、プライベートのtestnetを立ち上げたほうが良いと思います。（マイニングもし放題なので、すぐ貯まります。もちろんみんなが参加している本番ネットワークでは使用できません。）

consoleとオプションをつけると対話的にコマンド入力できますので便利です。


```terminal
* 通常
geth console

* テストネットの場合(例）
geth -natspec -networkid "10" --datadir="/tmp/eth/60/01" -logfile /tmp/eth/60/01.log -nat "none" console 
```

　datadirやlogfileはブロックチェーン保管用なので新しく自分で作りました。
　

3.アカウント取得

起動したらコンソールを使えるのでそちらで操作しましょう

 [コンソールで使えるコマンド一覧]
https://github.com/ethereum/go-ethereum/wiki/JavaScript-Console#admincontractinforegister

```console
> admin.newAccount() //新規アカウント作成
> *アカウント用パスワードを２回入力

> eth.accounts
[〜〜〜〜〜] //[]内は新しく作ったアカウント（アドレスとして使える）

例
> eth.accounts
['0x407d73d8a49eeb85d32cf465507dd71d507100c1']

* 残高確認
>eth.getBalance(eth.coinbase)
または
> eth.getBalance(eth.accounts[0])


output
> '0'

まだ何もないので0が出力されるはず
```

4.遊ぶためのEtherを掘りましょう!!

ether(イーサー）は、Ethereumを動かすための通貨兼燃料です。燃料(Gas)というのは、コントラクトを動かすのに絶対必要なものです。

```console
>admin.miner.start()
```

Generating DAG というのがしばらく行われたあと、マイニングが開始されます。

```
Mined block #93 (2511dc43)
```

トンカチマークとともに"Mined Block"が表示されたら掘れてますので、残高確認すると増えています。

```console
> eth.getBalance(eth.coinbase)
'196359375000000000000'
```
やったね！

単位はetherではなくWeiですので注意を。
1ether=10^18 wei
Wei !!!


止めるときは


```console
>admin.miner.stop()
```

以上でコントラクトを動かす準備はできました。


続く（？）
Linux CentOS7にKafkaをインストールする

各種バージョンは現在最新の物だが時間がたつと変更されるので公式サイトを参照のこと

#Kafka ダウンロード
``curl -O http://ftp.yz.yamagata-u.ac.jp/pub/network/apache/kafka/0.8.2.1/kafka_2.10-0.8.2.1.tgz``
`` tar -xzvf kafka_2.10-0.8.2.1.tgz ``

#Scala ダウンロード (Kafkaがscalaで出来ているので必要)
``curl -O http://downloads.typesafe.com/scala/2.10.5/scala-2.10.5.rpm``
``rpm -ivh scala-2.10.5.rpm``

#Zookeeperダウンロード (Kafkaの起動に必要）
``curl -O http://ftp.jaist.ac.jp/pub/apache/zookeeper/zookeeper-3.4.6/zookeeper-3.4.6.tar.gz``
``tar -xzvf zookeeper-3.4.6.tar.gz``

# Zookeeper起動

``bin/zkServer.sh start conf/zoo_sample.cfg``

この方法で起動しないとkafkaの起動に失敗する


# Kafka起動

``bin/kafka-server-start.sh config/server.properties``



tmuxでセッション作ってターミナルを管理すると便利です
【Unity/JsonFx】UnityでJSONの読み書き

#はじめに
みなさんUnityのレベルデータはどんな感じで扱っていますか？
最近、ちょっとした挑戦でUnity上でレベルデータを読み書きし、そのレベルデータを見やすくするために、エディター拡張したりGoogle Sheetsに保存したりしています。
この辺もっといい方法があればいいですね。
今日はJsonFxを利用してUnity上でJSONの読み書きについて書いてみます。
ちょっと複雑なJSONデータの扱いを例と共に書きます！
眠いのでちょっと適当なところがあるかも(?)あったら指摘してください!

#環境構成
Unity5.0.2f1(試してないが、Unity4もおそらく動くと思う)
Mac 10.10.3(試してないが、Windowsもおそらく動くと思う)

#DTO(Data Transfer Object)
DTOはシリアライズする際にデフォルトコンストラクタがないとシリアライズできませんと怒られるので必ず入れてください！

Levelデータ全体DTO

```csharp:LevelDataList.cs
using System.Collections.Generic;

public class LevelDataList
{
	public List<BlockDto> BlockData { get; set; }

	public List<PowerUpItemDto> PowerUpItemData { get; set; }
}
```

基底オブジェクトDTO(これを継承してアイテムとかブロックとかのDTOを作る)

```csharp:ObjectBaseDto.cs
public class ObjectBaseDto
{
	public ObjectBaseDto ()
	{
	}

	public ObjectBaseDto (PositionDto _Position, float _SpawnTime)
	{
		Position = _Position;
		SpawnTime = _SpawnTime;
	}

	public PositionDto Position { get; set; }

	public float SpawnTime { get; set; }
}
```

オブジェクトの位置情報DTO

```csharp:PositionDto.cs
public class PositionDto
{
  public PositionDto ()
  {
  }

  public PositionDto (float _X, float _Y)
  {
    X = _X;
    Y = _Y;
  }

  public float X { get; set; }

  public float Y { get; set; }
}
```

ブロックDTO(ObjectBaseDtoを継承)

```csharp:BlockDto.cs
public class BlockDto : ObjectBaseDto
{
  public BlockDto ()
  {
  }

  public BlockDto (PositionDto _Position, float _SpawnTime, int _Type) : base (_Position, _SpawnTime)
  {
    Type = _Type;
  }

  public int Type { get; set; }
}
```
 
パワーアップアイアテムDTO(ObjectBaseDtoを継承)

```csharp:PowerUpItemDto.cs
public class PowerUpItemDto : ObjectBaseDto
{
  public PowerUpItemDto ()
  {
  }

  public PowerUpItemDto (PositionDto _Position, float _SpawnTime, int _Type) : base (_Position, _SpawnTime)
  {
    Type = _Type;
  }

  public int Type { get; set; }
}
```

#JSONの読み込み
LEVEL.jsonを読み込む(拡張子がないことに注意)
パスは[プロジェクトホーム]/Assets/Resources/Jsonです。

```csharp
var levelData = (Resources.Load ("Json/LEVEL") as TextAsset).text;
		Debug.Log ("levelData : " + levelData);

_levelDataList = JsonFx.Json.JsonReader.Deserialize<LevelDataList> (levelData);
```

#JSONの書き込み

```csharp
// 上のレベル全体データからブロックデータのみ抽出
List<Transform> _blockList = levelDataList.BlockData;

// レベルデータ全体DTO
LevelDataList _levelDataList = new LevelDataList ();

// ブロックデータDTO
List<BlockDto> _blockDataList = new List<BlockDto> ();

// ループしながらデータを代入
for (int i=0; i<10; i++)
{
  PositionDto p = new PositionDto (blockTran.position.x, blockTran.position.y);
  float s = Random.Range (1.0f, 3.0f);
  int t = Random.Range (1, 2);

  BlockDto b = new BlockDto (p, s, t);
  _blockDataList.Add (b);
}

_levelDataList.BlockData = _blockDataList;

// レベルをJSON化する
var levelDataListJson = JsonFx.Json.JsonWriter.Serialize (_levelDataList);
Debug.Log ("levelDataListJson : " + levelDataListJson);

// レベルデータ(JSON)を永久保存
File.WriteAllText (Application.dataPath + "/Resources/Json/levelDataTest.json", levelDataListJson);
```
Sublime text3でD言語開発環境構築したメモ

つい最近D言語erとなったnamachan10777です。
D言語の開発環境としてはIDEやエディタのプラグインなどという形でいくつかありますが、ここではsublime text3での開発環境構築について書きたいと思います。
#Sublime text3のインストール
[Sublime Text 3](http://www.sublimetext.com/3)
ここのページで自分の環境にあったものをダウンロードしてインストールします。

次にPackage Controlをインストールします。D言語開発環境を構築する上で必須ではないのですが、とりあえずインストールしたら入れるもののようなので入れます。
ちょうど真ん中の方にあるコードをコピーします。
view->Show Consoleで表示したコンソールの入力欄にペーストしてEnterキーを叩きます

#言語ファルを最新のものにする
Sublime textではD言語が公式でサポートされているのですが、文法がD1の物なので、新しいキーワードを追加します。とりあえずassertがハイライトされないのに気づいたので、Windowsなら`C:\Program Files\Sublime Text 3\Packages\D.sublime-package`の拡張子をzipに書き換えて解凍、Linuxなら/opt/sublime_text_3/Packages/D.sublime-package`をunzipで解凍し、中のD.sublime-syntaxファイルの160行目のキーワードの列に追加します。
前はtmLanguageと言う拡張子を使っており、有志の書いたtmLanguageファイルと交換すればよかったのですが、どうやらsublime-syntaxと言うファイルに変更されたようです(なのにassertが無い)

#スニペットの追加
throwのスニペットが無かったので作りました。

```xml:sublime-sunippet
<snippet>
	<content><![CDATA[throw new Exception"${1:exception}";]]></content>
	<tabTrigger>throw</tabTrigger>
	<scope>source.d</scope>
	<description>throw new Exception"…";</description>
</snippet>
```
これをthrow.sublime-snippetと言う名前で解凍したD.sublime-package内のSnippetディレクトリにコピーして再びzipで圧縮し、D.sublime-packageに名前を変更して元の場所に上書きコピーします。
#DKitのインストール
ここからが大変でした。
僕はDKitというプラグインを使っています。
このDkitを使うにはDCDというものを使う必要があるようなのですがこれに結構苦労しました
windowsはinstallerがあるようなのですが僕のWindows８dでは正体不明のファイルとして扱われているので自力でソースからビルドしましました。

windowsの場合手順としては
クローン
build.batを実行

簡単。
ただこれクローンではなくDownload zipですると大変なことになります
次にDKitをクローンして、フォルダごと
C:\Users\(ユーザ名)\AppData\Roaming\Sublime Text 3\Packages
にコピーします
(Windowsのインストール版の場合。それ以外でも探せばSublime text 3/Packageはどこかにあると思います(適当))
するとあら不思議Package SettingにDKitが追加されています
そこでDKit.sublime-setting_Defaultを開き 

```json:DKit.sublime-setting_Default
{
  "dcd_path": "(dcdのバイナリがあるパス)",
  "dcd_port": (ここは変えない),
  "include_paths": [
    "(phobosのソースのパス)"
  ]
}
```

という風に書き換えます(みたら分かると思いますが)
これで適当に.dが拡張子のファイルを編集してエラーが起きなかったら成功です。
#buildSystemを自作する
dmdを使う分にはデフォルトで構いませんが、デフォルトではdubが使えません
(dubってなんぞ?という方は[こっち](http://qiita.com/yasei_no_otoko/items/2724eebab10f5cd0a02f))
Preferences->BrowsePackagesでエクスプローラを開き、Userディレクトリに移動します
このフォルダの中に

```json:test.sublime-build
{
    "cmd" : ["dub" , "run"],
    "working_dir":
}
```
というファイルを作って保存します
拡張子がsublime-buildなら名前は何でもいいです
tool->build System
を選択するとさっき書いたビルドシステムがあるのでそれを選択してCtrl+Bを押します。
これでビルド->実行となったら成功です
#最後に
まだD言語初めて数週間の初心者なので、間違った点がありましたら教えてください。
何かありましたらTwitterで
@namachan10777 までお願いします
Goでマクロを使うなんちゃって実装

Goでプリプロセッサ的なことをマクロをつかってできないのかなあ、みたいな試み。

# その１

```go
package main

/*
#define myint_def 12345
*/
import "C" 
import "fmt"

func main() {
  fmt.Println(C.myint_def)
}
```
[GitHubのGolangリポジトリから発掘した](https://github.com/golang/go/blob/439b32936367c3efd0dadab48dd51202e1a510f1/misc/cgo/test/issue6612.go)
それなんか違くない？　って言われたら反論できません。

# その２

```go:hoge.go.p
package main

import "fmt"

#define myval 12345

func main(){
  fmt.Println(myval)
#ifdef DEBUG
  fmt.Println("this is debuguuuuuuuuuu!!")
#endif
}
```

```console:実行
$ cpp -P -o a.go hoge.go.p | go run a.go
12345
$ cpp -D DEBUG -P -o b.go hoge.go.p | go run b.go
12345
this is debuguuuuuuuuuu!!
```

[go macroとかでググったら見つけた方法](http://nirbhay.in/2013/06/preprocessing-go-programs/)
お、おう。って感じ。
`go fmt`できなくなるのも残念。

# 普通にconst使いましょう

[こんな感じでそろえて](http://d.hatena.ne.jp/taknb2nch/20140414/1397459204)

```go:env/debug.go
// +build debug

package env
const DEBUG = true
```
```go:env/no_debug.go
// +build !debug

package env
const DEBUG = false
```
```hoge.go
package main

import (
  "fmt"
  "./env"
)

const myval = 123456789

func main() {
  fmt.Println(myval)

  if env.DEBUG {
     fmt.Println("debugggggggggg")
  }
}
```

```console
$ go build -o a.out 
$ go build -tags=debug -o b.out
$ ls -l
-rwxr-xr-x 1 umanoda umanoda 1944936  6月  6 00:26 a.out
-rwxr-xr-x 1 umanoda umanoda 1944944  6月  6 00:26 b.out
$ ./a.out
123456789
$ ./b.out
123456789
debugggggggggg
```

デバッグメッセージを表示するほうは、if内の処理が残るため、ファイルサイズが大きくなっているようです。
なお`// +build tag` のあとは一行開けないとビルドエラーが出ます。Goは改行を入れたり入れなかったりで、エラーになったりならなかったりがあるから、たまにハマる。
Rails Tutorial 第３章 備忘録

第3章でハマったところ。随時更新。

####1.

```bash
$ bundle exec rspec spec/requests/static_pages_spec.rb
```
をやると、

```bash

/home/ubuntu/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/activesupport-4.0.2/lib/active_support/dependencies.rb:229:in `require': cannot load such file -- test/unit/assertions (LoadError) 
#以下略
```

こんなエラーが…

Gemfileに
```
gem 'test-unit'
```

と追記で解決。
ComposerでSymfonyに同梱されたDoctrineのバージョンを2.4→2.5に上げる

# 最初にやったこと（失敗例）

composer.jsonのdoctrine/ormのバージョンを `~2.5` に指定して

```bash
$ composer update doctrine/orm
```

エラー。

```
- Can only install one of: doctrine/common[v2.5.0, v2.4.2].
- doctrine/orm v2.5.0 requires doctrine/common >=2.5-dev,<2.6-dev -> satisfiable by doctrine/common[v2.5.0]
- Installation request for doctrine/common == 2.4.2.0 -> satisfiable by doctrine/common[v2.4.2]
```

doctrine/commonは2.4を入れないといけないから2.5は入らないよ的なメッセージ。正直どこを直したらいいか途方に暮れる。
~~composerのエラーメッセージが不親切なのなんとかならないですかね？？~~

# うまくいった方法

## doctrine/data-fixturesを更新

doctrine/commonの2.4.2.0というバージョンが選ばれてしまうのは、 [doctrine/data-fixturesの1.0.0が `<2.5-dev` を指定してる](https://github.com/doctrine/data-fixtures/blob/v1.0.0/composer.json#L16) から。更に [symfony/symfonyのcomposer.jsonでは、doctrine/data-fixturesが1.0.*で指定されている](https://github.com/symfony/symfony/blob/2.8/composer.json#L72) ため、まずdoctrine/data-fixturesを~1.1に（厳密には1.0.1以上で充分）上げる必要がある。

```bash
$ composer update doctrine/data-fixture
```

1.1になった。

## doctrine/doctrine-bundleを更新

doctrine/doctrine-bundleも同様に、 [v1.2までは `<2.5-dev` つきだった。](https://github.com/doctrine/DoctrineBundle/blob/v1.2.0/composer.json#L30)
よって1.3以上に更新する。

```bash
$ composer update doctrine/doctrine-bundle
```

1.5になった。

## doctrine/common doctrine/dbalを更新

```bash
$ composer update doctrine/common doctrine/dbal
```
doctrine/common, doctrine/dbalが2.4→2.5になった。

## doctrine/ormを更新

```bash
$ vi composer.json # doctrine/ormのバージョン指定を~2.5に変更
$ composer update doctrine/orm
```

doctrine/ormも無事2.5になった。

# 急いでいる人向け

最初から更新すべきパッケージがわかってたら、一度に全部更新できちゃう。

```bash
$ composer update doctrine/data-fixtures doctrine/doctrine-bundle doctrine/common doctrine/dbal doctrine/orm
```

Doctrine2.5の新機能（Embeddableとか）を使いたい人は、今後も確実に2.5以上が入ってくるようにcomposer.jsonのバージョン指定も `~2.5`　に変更しておくのがオススメ。変更した後は

```bash
$ composer update --lock
```
を忘れずに。

# 参考リンク

- [[初心者向け] composerのバージョン指定方法 ](http://tech.quartetcom.co.jp/2015/01/19/composer-practices/)
勉強会会場の探し方5つのコツ+α

「勉強会の会場ってどうやって借りればいいの？」という声をたまに聞くので、企業が提供しているスペースを借りるコツをまとめました。（※あくまで個人的感想ですので参考まで）

# 1. まずは下見

「あの会場いいかも」と思う会場があったらそこで直近開催される勉強会に申し込みましょう。

勉強会当日は早めに入場して設備チェックしましょう。入場手続きが煩雑か。Wi-Fiや電源は使えるか。トイレや自動販売機へ自由に移動できるか。などなど。

# 2. 担当者さんに挨拶

下見した時点でいい感じなら会場担当者さんらしき人をチェックしておいて、終了後に挨拶してどんな勉強会をやる予定で会場をお借りしたいという旨を手短に伝えましょう。

相手は締めの会場片付けを前にまだまだ運営真っ最中なのを忘れずくれぐれも手短に。

# 3. ルールには従う

担当者さんと話したとしても、公式なルートで所定の項目について提示した上で申し込みが必要な場合があります。

「ゆるい勉強会をゆるっとやりたいだけなのになぁ」と思っても、相手のルールには従いましょう。

# 4. 概要はまとめておく

前項や似たケースで、勉強会の「タイトル」「概要」「代表者」「連絡先」など主なポイントは聞かれることが多いので、事前にまとめていつでも答えられるようにしておきましょう。

# 5. 紹介してもらう

タイミングが合わなくてお目当ての会場で開催される勉強会に行けなかったり、会場提供の頻度が低くてなかなか下見に行けない会場の場合は、直近で開催した勉強会の主催者に連絡してみましょう。特に後ろめたいことがなければ会場担当者の方か問い合わせ先を教えてくれるはずです。

# +α.　実績を作っておく

初めて会う人に会場を貸すのは担当者さんも不安なはずです。

まずは小人数でもいいし、会場がコワーキングスペースで有料でもいいし、とにかく第1回を開催して実績を作りましょう。

一度開催した上で第2回を開催するのと、いきなり初めましての第1回ですでは印象が格段に違います。
zshでvimのtext-objectライクな操作をする

今までzshのvicmdモードでは`dw`、`cw`のような単純なtext-object操作は実現されていましたが、
以下のコミットで新しい動作を実現するウィジェットが追加されたようなので使ってみました。
https://github.com/zsh-users/zsh/commit/d257f0143e69c3724466c4c92f59538d2f3fffd1

zshrcの設定はzshのコード内に書いてあったものをそのまま使っています。
# select-bracketed
`()`、`[]`、`{}`、`<>`の中の文字列をテキストオブジェクトとして扱う

```zsh:zshrc
autoload -U select-bracketed
zle -N select-bracketed
for m in visual viopp; do
  for c in {a,i}${(s..)^:-'()[]{}<>bB'}; do
    bindkey -M $m $c select-bracketed
  done
done
```

```zsh:コマンドライン
> (hoge)
# vicmdモードになった状態で(hoge)上にカーソルを置きdi(
> ()
```
# select-quoted
`'`、`"`、`` ` ``の中の文字列をテキストオブジェクトとして扱う

```zsh:zshrc
autoload -U select-quoted
zle -N select-quoted
for m in visual viopp; do
  for c in {a,i}{\',\",\`}; do
    bindkey -M $m $c select-quoted
  done
done
```

```zsh:コマンドライン
> "hoge"
# vicmdモードになった状態で"hoge"上にカーソルを置きdi"
> ""
```
# surround
vim-surroundプラグインライクなテキストオブジェクト操作を実現する

```zsh:zshrc
autoload -Uz surround
zle -N delete-surround surround
zle -N change-surround surround
zle -N add-surround surround
bindkey -a cs change-surround
bindkey -a ds delete-surround
bindkey -a ys add-surround
bindkey -M visual S add-surround
```

```zsh:コマンドライン
# delete-surround
> "hoge"
# vicmdモードになった状態でds"
> hoge
```

```zsh:コマンドライン
# change-surround
> (hoge)
# vicmdモードになった状態でcs("
> "hoge"
```

```zsh:コマンドライン
# add-surround
> hoge
# vicmdモードになった状態でysw(
> ( hoge )
```

この機能はzsh 5.0.8から使えるようになっています。
自分は普段vimを使っているので、こういったウィジェットが追加されるのはうれしい限りです。
iPhoneのSafariでAudioを扱う際の注意


iPhoneのSafariでは、audioタグを扱う上で様々な制約がある。
まず、ユーザのクリックをトリガーとしてしか、音を鳴らすことができない。
つまり、サイトを訪れた際に即時音を鳴らすことが不可能で、
ユーザに対して

「このサイトは音が出ますがよろしいですか？」

などの注意を促し、それに対してクリックをさせた上でそれをトリガーとして音を鳴らす必要がある。

さらに、このクリックのタイミングで音を読み込んだ場合でも、
setTimeout等で遅れて音を鳴らそうとしても鳴ってくれない。
しかし、これにはうまく潜り抜ける方法がある。
それは、クリックトリガーのタイミングで一度playメソッドを叩き、そのあとすぐにpauseメソッドを叩くことだ。
つまり、audioをpauseの状態にしておくと、あとからでも任意のタイミングで音を鳴らすことができる。
webplatform.org docs で英日翻訳しませんか?

# webplatform.org docs で英日翻訳しませんか?

## webplatform.orgとは?
全世界の非営利・営利団体が「協力して」、Webの標準化についての情報を集約するサイトです。
2012年に設立され、W3C、Microsoft、Google、Adobe、Facebook、HP、Nokia、Mozilla、Operaが参加しています。
さらに詳しく知りたい方は、下記の設立当初の紹介記事を見てください。
http://jp.techcrunch.com/2012/10/09/20121008google-microsoft-facebook-and-others-launch-web-platform-docs-a-web-standards-documentation-site/
http://www.itmedia.co.jp/news/articles/1210/09/news030.html

とても素晴らしい試みだと思います。

## 募集した理由は?
素晴らしいサイトであるにも関わらず、残念なことに、現状はほとんど翻訳が進んでいません。

そこで一人で翻訳をつい最近(2015.4)開始しました。今7つ目を翻訳中です。
できれば翻訳する方が数名でも増え、お互いの翻訳物を相互でチェックできればいいな、と思いました。

なお、このお誘いをするに当たって、webplatform.org本家のメーリングリスト(public-webplatform@w3.org)で募集の許可は得ています。
本家側は、翻訳の重要性を認識しているものの、リソースが全然足りていない状況なので、少ない人数でも進めて欲しいとのことでした。

## 参加資格は?
ありません。そもそも私自身何も資格を持っていません。

## 翻訳することのメリットは?
「webplatform.orgに貢献する」ということ以上に、個人的なメリットがとても大きいと思います。

* 優れた知識を持った人と直接やりとりできる(実績を上げれば、それだけ意見を尊重してもらえるようになります)
* コミュニケーション能力UP(対等な立場で議論できます。議論の仕方もリアルに経験できます)
* 技術能力UP(技術自体の勉強にもなりますし、翻訳技術の勉強にもなります)
* 海外での実績を上げていくことで、国内での活動機会も広がります(色々ありますが、ここでは書きません)

## 何を翻訳するのか?
webplatform.orgで公開されているWeb関連の技術文書(英文)です。
https://docs.webplatform.org/wiki/Main_Page

MediaWikiというしくみで記載されていますが、原文のマークアップにしたがっていけばよいので、すぐに慣れると思います。

## どうやって翻訳/チェックする?
webplatform.org上のしくみだけを使っていきます。日本側で別の仕組み(GitHubのような)を使うことは、考えていません。

基本的な流れは、下記のように考えています。
ほとんどの工程は各個人で行いますが、翻訳物の査読(チェック)は相互に行います。

* webplatform.orgでアカウントをとる(誰でもとれます)

* 翻訳したい文書を選ぶ
* webplatform.orgで予約する(チェックアウトする)
* 予約した旨を皆に通知(public-webplatform-jp@w3.orgを使う)
* 個人で翻訳作業開始→完了
* webplatform.orgにチェックイン
* 完了した旨を皆に通知
* 他者が翻訳を査読(チェック)し、webplatform.org上で修正。必要があれば何回か繰り返す
* 完了したら、webplatform.org上で翻訳物を公開レベルに設定

※なお、現状は質を高めるよりも、まず量を増やす方に重点を置こうと思います。もちろんこちらも要相談です。

## 分からないことは?
内容について調査しても分からない点は、本家のML(public-webplatform@w3.org)に遠慮なく相談しましょう。
皆さんが教えてくれます。

英文に自信がなくても、どんどん本家の皆さんとコミュニケーションをとっていくことが、お互いを知るという意味でも大事だと思います。
そういう私も、つたない英文で投稿していますが、丁寧な返事を毎回いただいています。

私自身も新米ですが、分かることは何でもお教えします。
でも、手とり足とりな事はしませんので、ご了承を!

## はじめたいと思われたら
webplatjpboshu「アッと」gmail「ピリおど」com
まで、連絡をください。

## 募集期間
随時募集しますので、ご連絡ください。
rpmのオプションはロングオプションで覚えておくのが激しくオススメです

`rpm -ql`とか`rpm -qf`とかだと意味がわからないしすぐ忘れるので、ロングオプションの方を覚えておくとよいでしょう。

# rpm --query --file

```
$ rpm --query --file /bin/ls
coreutils-8.22-11.el7.x86_64
```

# rpm --query --list coreutils

```
$ rpm --query --list coreutils | head
/etc/DIR_COLORS
/etc/DIR_COLORS.256color
/etc/DIR_COLORS.lightbgcolor
/etc/profile.d/colorls.csh
/etc/profile.d/colorls.sh
/usr/bin/[
/usr/bin/arch
/usr/bin/base64
/usr/bin/basename
/usr/bin/cat
```

# /bin/ls と `coreutils`でときどき復習しておくとよい

このコマンドはたまにしか使わないのですぐ忘れます。
忘却防止のために、`/bin/ls`と`coreutils`を対象にしてときどきこのコマンドを叩くとよいでしょう。
Wikipediaを元にした単語辞書に頒布義務はあるのか？　キュレーションサービスを巡る法的論争。

#結論
頒布義務があるようです。形態素解析用の単語辞書をご提供いただき、ありがとうございました。

#考察
キュレーションサービス（ニュースアプリ。Webコンテンツを集めてユーザーにオススメするサービス）は、Webコンテンツを分類する為に内部で辞書を持っています。その辞書をもとにコンテンツの文章を単語に分け、その単語群からそのコンテンツの特徴を把握します。この辞書はキュレーションサービスにとって、ビジネスの要であると言えます。なぜならば、正確に単語を分ける事ができるのならば、後は定番の機械学習アルゴリズム（ex.Complement Naive Bayes）にかけるだけである程度の精度の分類は行えるからです。先の辞書は秘伝のタレに比喩される事も多いです。

さて、その辞書ですが、世の中で最も多く使われているのはWikipediaのデータセットを元にしたものです。Wikipediaの記事のタイトルは[ダウンロードページ](http://dumps.wikimedia.org/jawiki/latest/)から一括ダウンロードできるので、その内容を元に辞書を生成する事はもはや定番手法と言えます。

しかし、先のWikipediaのデータセットは扱いに難しいライセンスが適用されます。それは、[CC BY-SA](https://creativecommons.org/licenses/by-sa/3.0/deed.ja)と言われるものです。CC BY-SAは、そのライセンスが適用された一次創作物とそのN次創作物に対して「クレジットを提示する事（BY）」とともに「同じライセンスで頒布する事（SA）」を制約にかし、逆にそれ以外の制約をかけない事を明記するものです。GPL汚染を思い浮かべた方は、かなり良いところを行っています。

[WikipediaにあるCC BY-SAの記事](http://ja.wikipedia.org/wiki/Wikipedia:%E3%82%AF%E3%83%AA%E3%82%A8%E3%82%A4%E3%83%86%E3%82%A3%E3%83%96%E3%83%BB%E3%82%B3%E3%83%A2%E3%83%B3%E3%82%BA_%E8%A1%A8%E7%A4%BA-%E7%B6%99%E6%89%BF_3.0_%E9%9D%9E%E7%A7%BB%E6%A4%8D)を私なりに解釈した所、Wikipediaを元にした単語辞書を使うには次のルールを守らなくてはいけません。
「Wikipediaを元にした単語辞書の内容を一部であっても公に閲覧できる状態にしたならば、その単語辞書はCC BY-SAのライセンスで頒布しなくてはならない」
なお、その私なりの解釈とは次のものです。
「Wikipediaの記事タイトルのセットは、データベースの著作物にあたる。その為、著作権が発生する。著作権がある以上はWikipediaが提示するCC BY-SAのライセンスを守らなくてはならない。CC BY-SAは編集物に適用されないと書いてあるが、編集物の定義を見ると著作物全体が"改変なく"含まれる事が条件になっている。その為、単語辞書は編集物と認められない。ただし、ライセンスの中に"著作物を公にした場合"の記述がある事から、公にしない場合は頒布義務がないと考えられる。しかし、逆に一部でも公にした場合は頒布義務が発生する」

この案件は、世のキュレーションサービスにとって大きな影響を与える可能性があります。キュレーションサービスではWebコンテンツのタグやオススメされたWebコンテンツの構成といった形で、先の辞書の内容が公になっている事があります。もしもその辞書にWikipediaのデータが使われているのならば、キュレーションサービスの運営の方は先の辞書を頒布した方が良いでしょう。ただでさえマスメディアと喧嘩した事がある業界なのですから、ライセンス違反の指摘は無視できません。

私は上記の解釈を使って問合せを行う事により、実際に某キュレーションサービスの運営の方から欲しかった辞書を頂く事ができました。頒布ページも作って頂ける予定です。私は知り合いもいるのでもう行う気はありませんが、もしも同様のアプローチで他のキュレーションサービスにアタックをかけたら、素敵なオープンデータ祭りになるかもしれません。「データのレバレッジによる、より良い未来の実現」の理念を実現できるやもしれません。
標準出力をパイプで gnuplot に流し込む


普段 gnuplot で

```bash
$ cat input.txt | awk '{print $2, $4}' > tmp.dat
$ gnuplot
> plot 'tmp.dat'
```

みたいなことをやるのが面倒で、これがパイプで直接つなげたら良いなあと思った。

```bash
$ cat input.txt | awk '{print $2, $4}' | gnuplot # 実際は動かない
```

が、調べてもそれっぽいオプションが見つからない。ぐぬぬ。
というわけで、まず標準出力を一時ファイルとして保存し、それを gnuplot のヒアドキュメントで開くシェルスクリプトを作ってみた。実行ファイル名は適当に gnunuplot (ぐぬぬぷろっと) とする。

```bash:gnunuplot
#!/bin/bash -e

# ランダムな一時ファイル名を生成
filename=`cat /dev/urandom | LC_CTYPE=C tr -dc 'a-z0-9' | head -c 30`

# 標準入力を一時ファイルに保存
cat > $filename

# 引数がなければウィンドウにプロット
if [ $# -eq 0 ]
then

gnuplot -p <<EOF
set nokey
plot '$filename' with line
EOF

# 引数があれば png に出力
else

gnuplot <<EOF
set nokey
set terminal png
set output '$1'
plot '$filename' with line
EOF

fi

rm $filename
```

これを適当な PATH の通ったフォルダに置いておく。あとは

```
cat input.dat | awk '{print $1,$4}' | gnunuplot
```

とすればウィンドウにグラフが出るし、

```
cat input.dat | awk '{print $1,$4}' | gnunuplot output.png
```
とすれば png 画像が出力される。
Amazon Elastic File System (Amazon EFS)で名前解決できずにマウントできないときの対処方法

プレビューですがAmazon Elastic File System (Amazon EFS)が触れるようになりました。
複数台のサーバでデータを共有したいときには必須のサービスになりそうですね。
正式リリース&東京リージョンでのサービス開始が待ち遠しいです。

![スクリーンショット 2015-06-05 15.42.49.png](https://qiita-image-store.s3.amazonaws.com/0/52904/47622dde-9346-9e56-aac1-c54ed1f797af.png)


チュートリアルは高速/安定のクラメソさんで。
http://dev.classmethod.jp/cloud/efs-ataglance/

私も早速File systemを作成して、ec2から接続してみました！

```
mount -t nfs4 $(curl -s http://169.254.169.254/latest/meta-data/placement/availability-zone).fs-xxxxxxxx.efs.us-west-2.amazonaws.com:/ efs
-----------
mount.nfs4: Failed to resolve server us-west-2a.fs-xxxxxxxx.efs.us-west-2.amazonaws.com: Name or service not known
-----------
```

あれ...

```
host us-west-2a.fs-xxxxxxxx.efs.us-west-2.amazonaws.com
-----------
Host us-west-2a.fs-xxxxxxxx.efs.us-west-2.amazonaws.com not found: 3(NXDOMAIN)
-----------
```

あ...

マニュアルにも書いていますが、VPCのDNSが無効になっている場合に、
VPC内のEFSの接続先の名前解決に失敗してしまいます。

![スクリーンショット 2015-06-05 21.42.18.png](https://qiita-image-store.s3.amazonaws.com/0/52904/f1dfedfd-188c-ff0c-f9da-ab706c790f3d.png)


VPCへ移動して、該当のVPCの設定を確認します。

![スクリーンショット 2015-06-05 21.29.42.png](https://qiita-image-store.s3.amazonaws.com/0/52904/8de2ecf6-81a1-2104-0cdb-901be5783484.png)


やはり、無効になっていました。

![スクリーンショット 2015-06-05 21.29.52.png](https://qiita-image-store.s3.amazonaws.com/0/52904/4820aad1-7c1f-3b0a-ece8-7c4e2fda6f2b.png)


有効にしましょう。

![スクリーンショット 2015-06-05 21.30.00.png](https://qiita-image-store.s3.amazonaws.com/0/52904/19d0659e-c93f-8b5a-f45a-1de2cfd6cf71.png)


設定反映後、ec2へ戻り、

```
host us-west-2a.fs-xxxxxxxx.efs.us-west-2.amazonaws.com
-----------
us-west-2a.fs-xxxxxxxx.efs.us-west-2.amazonaws.com has address 172.30.0.12
-----------
```

名前解決OK！！！

```
mount -t nfs4 $(curl -s http://169.254.169.254/latest/meta-data/placement/availability-zone).fs-xxxxxxxx.efs.us-west-2.amazonaws.com:/ efs

df -h
-----------
Filesystem                                            Size  Used Avail Use% Mounted on
/dev/xvda1                                            7.8G  1.1G  6.6G  15% /
devtmpfs                                              490M   56K  490M   1% /dev
tmpfs                                                 499M     0  499M   0% /dev/shm
us-west-2a.fs-xxxxxxxx.efs.us-west-2.amazonaws.com:/  8.0E     0  8.0E   0% /root/efs
-----------
```

無事マウントできました！！！！
【初心者向け】binding.pryを用いたデバックのやりかた


プログラムが動かない！エラーがでた！
とってきたいものが、とってこれない！
というときには、「デバックをする。」らしい。
でもどうやってデバックすればいいの??


#### (1)Viewファイルのデバック

View(表示)部分でうまく表示できない・・・というときに確かめるときに使う
railsは基本的に上からコードを読んでいく、、

とってきたいデータが書いてあるhtmlファイルの途中に
```<% binding.pry %>```
を入れ込んでみる
もしそこのviewがよみこまれていたら、ブラウザをリロードしたときにストップする
![スクリーンショット 2015-06-05 21.18.24.png](https://qiita-image-store.s3.amazonaws.com/0/41987/ba27554b-8c06-1043-b182-84c6c9b5352e.png)

ターミナルをみてみると、こんな感じで、入れ込んだ【 =>】で読み込みがストップするので
この下の```[5] pry(#<#<Class:0x007fb504f4d100>>)>```にとってきたい変数だったりを
いれてみる
ここで、思ってきたような形でとれているか？が確認できる！



#### (2)Controllerのデバック

こちらも(1)と同様！ちがうところは、ファイルに
```
binding.pry
```
と書くところのみ・・かな

![スクリーンショット 2015-06-05 21.17.22.png](https://qiita-image-store.s3.amazonaws.com/0/41987/fc82b904-a88d-5c3d-c42c-40ea65b0577c.png)

・・・Modelはあまり使わないような印象です。


これらをでるときは、```exit```
を使うとストップしていた状態からぬけられます。

MVCの役割はこちら
http://qiita.com/yuku_t/items/961194a5443b618a4cac



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


他にもたくさんやり方はあると思うのですが、
よく試行錯誤するときに、使うものでした
railsでflashメッセージにリンクを入れる

railsのバージョンは3.2で行っております。

今回はポップアップに表示されている文字に対して各々リンクとメーラーに飛ばす操作をやらなければならない状況になりました...orz
ググったところなかなか検索に引っかからなかったので今回はここにちょこっとまとめてみようと思います。

#flashについて
モジュール的なもので出そうかなと既存コードを追っていたところ、
```flash.now[:notice] = i18n_field(:hello)```
というコードを発見しました。「ん？flashで出しているのか、だったら簡単だなー」と思い```i18n_field(:hello)```を調べたところymlというものらしい。
いろいろググったところ要するに「データを記述するためのマークアップ言語」ってことらしいです。
まあとりあえずlocaleでhelloとなっているところを検索。発見したのでとりあえずやりたいことをHTML形式でぶちこんだ。
結果・・・リンクにならないし、メーラーにもなっていない、おまけに改行もしていない。。。

```

hello: |
      ああああああああ。
　　　 あああああああ。

```

と記述すると改行込みで出力されるという記事があったが改行されず。。
んー、よくわかんね。ymlにそもそもそういうことするもんじゃないのは調べてわかっていたので作戦変更。直接```flash.now[:notice] = "ああああああああ"```って感じでぶちこむことにした。がここでも問題発生。リンクとかどうやって指定すんだ？？
とりあえずリンクは入れることができるのか調べたらみつけた。どうやら変数にしていれるとできるらしい。

```
 link = "<a href=\"#{url_for(:controller => 'users', 
                             :action => 'show')}\">#{@hoge.name}</a>"
  if @hoge.save
    flash[:success] = "ああああああああ。#{link}".html_safe
    redirect_to dashboard_path
  end


```

でーきた。あとはここにメーラーを入れれば良いので似たようにmailtoであとは上記のように変数に入れればいいんじゃねーかと思っていれみた。

```
 link_01 = "<a href=\"#{url_for(:controller => 'users', 
                             :action => 'show')}\">#{@hoge.name}</a>"

 link_02 = "<a href=\"#{mailto:info@example.com}\">#{@sample.name}</a>"

  if @hoge.save
    flash[:success] = "ああああああああ。#{link_01}".html_safe
                      @ああああああああ。#{link_02}.html_safe"
    redirect_to dashboard_path
  end
```

できない。。。

どうやらリンクのみで使用できメーラーでは使用できないみたいだ。ここで手詰まりになりました。考えても解決策は思い浮かばず。。。結局そもそもの仕様を変更し対処することになりました。

なにか解決策あればよろしくお願いします。。
MySQLのINSERTの効率化

DBエンジンは、扱うデータ量が多いという性質上、適切な性能を出すには工夫が必要となることが多々あります。今回は、少しの工夫でMySQLの`INSERT`が速くなった、という話です。

# INSERTはデータ量に連れて
データベースにデータを入れるには`INSERT`を使いますが、データが多くなればそれだけ手間が増えてきます。しかも、1命令あたりで極端に重くなっているわけではないので、スロークエリにもなかなか現れず、追いかけるだけでも意外と面倒かもしれません。

# 一気に入れることでの効率化
もちろん、ある行数だけ入れる場合にそれだけの書き込み処理が内部で動くことは避けようがないですが、SQL文を投げた際に、内部では

* DBサーバと通信を行う
* SQL文をパースして処理内容を把握する
* 実際の書き込み処理
* インデックスの構築

などなど、いろんな処理が走ります。一気に入れることができれば、これらの処理は一度に済ますことができますし、記憶域の確保もまとめて行えるなど、高速化できるようになります。

# 実際の構文

```mysql:1行の挿入
INSERT INTO table_name (col_1, col_2, col_3) VALUES (1, 2, 3);
```
1行を挿入する場合はこのように書きますが、複数行の挿入の場合も、文法はそこまで変わらず

```mysql:複数行の挿入
INSERT INTO table_name (col_1, col_2, col_3) VALUES (1, 2, 3), (4, 5, 6), (7, 8, 9);
```
というように、`VALUES`のあとにかっこを連ねるだけです。

# `ON DUPLICATE KEY UPDATE`
MySQLには、`ON DUPLICATE KEY UPDATE`といって、主キーやUNIQUEが重複するデータがすでに入っていた場合には、その行の更新を行う、という機能がありますが、これも複数列に対応させることができます。重複時の`UPDATE`内容を生成する上で、もともと`INSERT`しようとしていた内容が必要なら、`VALUES(col)`という形で取得できます。

# 長さの制限
`INSERT`自体に個数制限はありませんが、MySQLに投げられるSQL文の長さの最大値は、`max_allowed_packet`という変数で決まっています。MySQLサーバに、`show variables like 'max_allowed_packet';`と投げることで設定を確認することができます。動的に増やしたり、`my.cnf`で設定することもできます（[参考](http://blog.syuhari.jp/archives/1307)）。

なお、この設定自体の最大値は1GBだそうなので、設定を上げすぎてパンクするということは、そうそうないとは思います。
【CakePHP】バリデーション

#バリデーションの設定

##ルールのみの設定

```php
public $validate = [
  'customer_id'=>'notEmpty'
];
```

##オプションの設定

```php
public $validate = [
  'customer_id'=>[
    'rule'=>'notEmpty',
    'message'=>'必須項目です。'
  ]
];
```

##一つのカラムに複数の設定

```php
public $validate = [
  'customer_name'=>[
    [
       'rule'=>'notEmpty',
       'message'=>'必須項目です。'
    ],
    [
       'rule'=>'isUnique',
       'message'=>'既に使用されています。'
    ],
  ]
];

```

#エラーのハンドリング

save()では保存に成功すれば保存した配列を返す。
保存に失敗すれば、falseを返す。

\$this->モデル->validationErrorsでエラーメッセージを取得する。

```php
if($this->モデル->save()){
  //成功

}else{
  //失敗
  $err_info = $this->モデル->validationErrors;
}

```
<Rails> 中間テーブルのカラム名がモデル名と違う場合

##構成
**Memberテーブル**
**Registrantテーブル**

この二つを繋げるための、
中間テーブル **Recruitmentテーブル**

---
Recruitmentテーブルのカラム
recruiter_id(モデル名と違う<member>)
registrant_id(モデル名と同じ<registrant>)

`app/model/member.rb`

```ruby
class Member < ActiveRecord::Base
  has_many :recruitments, class_name: "Recruitment", foreign_key: "recruiter_id"
  has_many :registrants, through: :recruitments
end
```

`app/model/registrant.rb`

```ruby
class Registrant < ActiveRecord::Base
  has_many :recruitments
  has_many :recruiters, through: :recruitments
end
```

`app/model/recruitment.rb`

```ruby
class Recruitment < ActiveRecord::Base
  belongs_to :recruiter, class_name: "Member", foreign_key: "recruiter_id"
  belongs_to :registrant
end
```


migration

```ruby
  t.references :recruiter, null: false
  t.references :registrant, null: false

add_index :recruitments, [ :recruiter_id, :registrant_id ], unique: true
add_foreign_key :recruitments, :members, column: "recruiter_id"
add_foreign_key :recruitments, :registrants
```
react-routerのRouteを自動的に設定する

# はじめに・・・
browserify + reactify + react-router の構成を想定しての説明ですが、
クライアントサイドで「ディレクトリ配下のファイルを自動的にrequireして〜したい」という他のケースでも参考になると思います。

# 問題
下のような構成で

```
components/hoge.jsx
           fuga.jsx
           piyo.jsx
```

〜.jsxが増える度に↓のようにRouteを追加するのが辛い。

```js
var Hoge = require('./components/hoge');
var Fuga = require('./components/fuga');
var Piyo = require('./components/piyo');

var routes = (
  <Route handler={App} path="/">
    <Route name="hoge" handler={Hoge} />
    <Route name="fuga" handler={Fuga} />
    <Route name="piyo" handler={Piyo} />
  </Route>
);
```

# 解決策
https://github.com/substack/bulkify を使う。

```npm install --save bulkify```したあと、package.jsonの ```"browserify"``` の箇所にbulkifyを足します。

```json
{
  "browserify": {
    "extension": [
      "jsx",
      "es6"
    ],
    "transform": [
      [
        "reactify",
        {
          "es6": true
        }
      ],
      "bulkify"
    ]
}
```

すると

```js
var _ = require('lodash');
var bulk = require('bulk-require');
var modules = bulk(__dirname, './components/*');

var routes = (
  <Route handler={App} path='/'>
    {_.map(modules.components, function(component, name) {
        return <Route key={name} name={name} handler={component} />;
    })}
  </Route>
);
// component は requireしたモジュール 例：require('./components/hoge')
// name は ファイル名の拡張子を除いたもの 例：'hoge'
```

な感じで、自動的にディレクトリ配下のファイルをrequireしてRouteに設定することができます。
mod_dosdetectorで早くBAN解除される場合があるので調べてみた

#概要
意図せず早くBANが解除されたので原因を探るためソースを読んでわかったことを記載する。

$T_{period}$秒間に$X$回のアクセスがあった場合$T_{ban}$秒間アクセスを弾くという仕様でmod_dosdetectorを動作させるためには下記のような事項に留意し値を設定する必要がある。

※文中で「Soft判定」という表現がありますが、これはDoSThresholdで判定された際のことを指しています。

#留意事項
1. DoSThresholdには許容できるアクセスを記載する（＝threshold+1から判定される）
2. DoSBanPeriod中弾くという仕様を満たすにはSoft判定を使う（初回Soft判定からDoSBanPeriod時間の間Soft判定を継続するため）
3. DoSBanPeriod中にリストを追い出されないようにする必要がある（DoSTableSizeを広げる）

3番目については少なくともDoSBanPeriod中にアクセスがあるユニークなIPアドレスパターンの最大値を指定する必要があります。
但し、最大値は65535で、増加させる際は注意が必要だと思われます（メモリは微々たるものだと思いますがリストは線形探索のため負荷が増加する可能性があります）

#あとがき
はじめHard判定を使っていたのですが、なぜかHard判定されてからBanPeriod以内に正常アクセスできる場合があったので調べてみたところこのような仕様になっており驚きました。
個人的にはSoft判定群、Hard判定群のようにリストが分かれていて、エージングされることで解放されるのかなと思っていました
Go言語でのString・Int間の変換速度について

※ 追記 `reflect`の使い方が間違っていたので訂正しました。切腹...m(__)m

いくつか書き方があるようなので、簡単な比較をしてみました。

ベンチに使ったコードは下記にあります

https://gist.github.com/evalphobia/caee1602969a640a4530


## 文字列から数値（String to Int）

### 文字列から数値に変換する方法

```go
strconv.Atoi(string) int, error

// 引数は 変換対称の文字列, 基数, ビット数
strconv.ParseInt(string, int, int) int64, error
```

### ベンチマーク結果

```go
// 小さな数値文字列で計測 (n = 35)
BenchmarkAtoi                   50000000           28.6 ns/op         0 B/op           0 allocs/op
BenchmarkAtoiParseInt           50000000           27.0 ns/op         0 B/op           0 allocs/op

// とても大きな数値文字列で計測 (n = 999,999,999,999)
BenchmarkAtoiBig                20000000           57.2 ns/op         0 B/op           0 allocs/op
BenchmarkAtoiParseIntBig        30000000           54.6 ns/op         0 B/op           0 allocs/op
```

### 結論

どちらもそこまで変わらないので、10進数であれば簡単な `strconv.Atoi(string)` を使う感じでしょうか？

- 戻り値の型が`int` で欲しい場合は `strconv.Atoi(string)` 
- 戻り値の型が`int64` で欲しい場合は `strconv.ParseInt(string, 10, 64)` 

を使えば良さそう。

## 数値から文字列（Int to String）

### 数値から文字列に変換する方法

```go

strconv.Itoa(int) string

// 引数は 変換対称の数値, 基数
strconv.FormatInt(int64, int) string

fmt.Sprint(int) string
fmt.Sprintf("%d", int) string
```

### ベンチマーク結果

```go
// 小さな数値で計測 (n = 35)
BenchmarkItoa                           30000000           52.6 ns/op         2 B/op           1 allocs/op
BenchmarkItoaFormatInt                  30000000           52.5 ns/op         2 B/op           1 allocs/op
BenchmarkItoaSprint                     5000000            254 ns/op          16 B/op          2 allocs/op
BenchmarkItoaSprintf                    5000000            299 ns/op          16 B/op          2 allocs/op

// とても大きな数値で計測 (n = 999,999,999,999)
BenchmarkItoaBig                        10000000           140 ns/op          16 B/op          1 allocs/op
BenchmarkItoaFormatIntBig               10000000           118 ns/op          16 B/op          1 allocs/op
BenchmarkItoaSprintBig                  5000000            326 ns/op          24 B/op          2 allocs/op
BenchmarkItoaSprintfBig                 5000000            363 ns/op          24 B/op          2 allocs/op
```

### 結論

- 型がわかっている場合は　`strconv.Itoa(int)` か `strconv.FormatInt(int64, 10)` 
- `fmt.Sprint()` は型が分からないときに使うと良さそう


といった感じなんでしょうか。
【情報収集や話題作りに便利】IT関連ニュースサイトまとめ

#はじめに
日々の情報収集に役立つサイトをまとめてみました。

#まとめ
##SmartNewsのチャンネルに追加できるニュースサイト
私がSmartNewsのチャンネルに追加しているニュースサイト一覧です。

・[TechCrunch Japan](http://jp.techcrunch.com/)
>スタートアップ企業の紹介や
インターネットの新しいプロダクトのレビュー、業界のニュースを配信

・[ギズモード](http://jp.techcrunch.com/)
>最新テクノロジーやデジタル社会に関連するニュースを扱うテクノロジーメディアサイト

・[Engadget](http://japanese.engadget.com/)
>電化製品やガジェットの話題を扱うテクノロジーブログ

・[GIGAZINE](http://gigazine.net/)
>国外サイトの記事の翻訳や新製品のレビュー、アプリ紹介、アニメ、
ジャンクフードなどの記事を掲載

・[ライフハッカー](http://www.lifehacker.jp/)
>扱う情報は、仕事術や生活術といったライフハックに関するものをメインに、
ウェブサービス、ガジェット、スタートアップ、メンタルコントロール、
健康、趣味、教育、インタビュー、イベントレポートなど多岐にわたっている。

・[Impress Watch](http://www.watch.impress.co.jp/)
>IT系総合ニュースサイト

・[ITmediaガジェット](http://www.itmedia.co.jp/mobile/)
>情報提供範囲は、IT関連のニュースだけでなく、
エンタープライズ・パソコン・モバイル・ブロードバンド・デジタル家電・ゲームなど
様々な分野を広範囲をサポート

・[ねとらぼ](http://nlab.itmedia.co.jp/)
>今気になる・人に話したい旬のネタをお届けするネットニュースのサイト

・[TABILABO](http://tabi-labo.com/)
>テクノロジー以外の記事もおすすめ
ビューティーやライフスタイルなどためになる記事多数

・[nikkanCare.ism (ニッカンケアイズム)](http://nikkancareism.jp/)
>働く男を応援するライフスタイルマガジン

・[CNET Japan](http://japan.cnet.com/)
>ITビジネスの最新情報を毎日配信

・[ロケットニュース24](http://rocketnews24.com/)
>あまり新しくないことを早く伝えたい、
という気持ちだけは負けていないネットメディア。
くだらなくて、おもしろい出来事などを、8割くらいの力でお届けする。

・[roomie (ルーミー)](http://www.roomie.jp/)
>気分がちょっとあがるモノ・コトを紹介するメディア。
おいしい食事や快適な住まいの作り方、
好奇心を刺激するアートや映画やミュージック、
カルチャーなどのトピックスを毎日お届け

・[はてな](http://www.hatena.ne.jp/)
>人気ブログやトレンドを配信

・[RBB TODAY](http://www.rbbtoday.com/category/enterprise/)
>IT、モバイル端末からエンタメまで、
気になるニュースを毎日提供

・[ウィズニュース](http://withnews.jp/)
>世の中の気になる話題やニュースを深堀りして、
より身近な形でお伝えするニュースサイト

・[ZDNet](http://japan.zdnet.com/)
>企業のIT担当者がテクノロジでビジネスを優位に進めるために必要な
日本発、海外発のニュースや特集、インタビュー記事をお届け

・[PRESIDENT Online](http://president.jp/)
>プレジデント社が提供するビジネスパーソンのための総合情報サイト

・読書
>世の中で話題になっている本の情報をまとめてお届けする

・[RETRIP (リトリップ)](https://retrip.jp/)
>「あなたを旅に連れていく」をコンセプトに、
旅行・観光・おでかけに関するあらゆる情報を、
写真や動画を使い、 まとめて、保存、共有、発信することができるサービス

・[週刊アスキー](http://weekly.ascii.jp/)
>iPhone、Android、デジタルガジェット、最新テクノロジー、
ネットのおもしろい話題などを配信

##その他
SmartNewsに対応していないニュースサイトです。

・[techable (テッカブル)](http://techable.jp/)
>国内外のスタートアップ／ネットベンチャーの
新サービスを中心に紹介するテック系ニュースサイト

・[@IT](http://www.atmarkit.co.jp/)
>新人エンジニアが日々の業務で悩んだりつまずいたりする問題を
技術的なTipsや仕事術の紹介で解決するブログメディア

・[Hacker News](https://news.ycombinator.com/newest)
>ユーザ投稿型のニュースサイト
英語で書かれています。

・[POSTD](http://postd.cc/)
>海外で話題になっているプログラミング関連のブログ記事やニュースを翻訳し、
日本のエンジニアに向けて配信するメディア
Hacker Newsの内容が日本語翻訳された感じです。
おすすめです。

#おわりに
他にもおすすめなサイトがあれば教えてほしいです。
Slimの書き方を練習する方法

`slim/erb_converter` を require して `Slim::ERBConverter.new.call` を使うと見やすい形に変換して返してくれます。

```ruby
require "slim"
require "slim/erb_converter"

Slim::ERBConverter.new.call("x")          # => "<x>\n</x>"
Slim::ERBConverter.new.call("#x")         # => "<div id=\"x\">\n</div>"
Slim::ERBConverter.new.call("doctype 5")  # => "<!DOCTYPE html>\n"
Slim::ERBConverter.new.call("x>")         # => "<x>\n</x> "
Slim::ERBConverter.new.call("x<")         # => " <x>\n</x>"
Slim::ERBConverter.new.call("x<>")        # => " <x>\n</x> "
```
BacklogをSlackと連携する際に、通知したい人にSlackのメンションを飛ばす簡単な方法


Backlogでwebhookが使えるようになり、Slackに通知できるようになった。

実装方法は下記の二つがとても、とても参考になる。herokuで動かす方法も書いてあるのでほぼこれを真似すれば良い

* [webhookとHubotを使ってBacklogをslack対応させる](http://d.hatena.ne.jp/itog/20150226/1424939686)

* [BacklogでWebhookが追加されたよ!!!Hubot経由でSlackに連携してみた](http://qiita.com/mayukojpn/items/a9a9408c21a761adb7d0)


ただ一つだけ上記リンクのScriptを使うと問題がある

### そのままスクリプトをコピペすると発生した課題
Backlogのユーザ名と、Slackのユーザ名が同じだとチケットを作った人にメンションが飛んでしまう。
俗にいうメンション地獄に陥ってしまい、Slackの通知を見なくなってしまい本末転倒なのだ

#### 問題のキャプチャ
![a](http://i.gyazo.com/bb4dab0ec19b41ddf4ce1b9564ca191a.png)
黄色で強調されているところでメンションが効いている

### 課題の解決策

API連携してSlackに表示される文字列にSlackユーザ名があると自動的にメンションがつく特性を活かして、
チケットの更新を通知したい人にメンションが飛ぶようにする

Webhook連携できるBacklogのAPIは[最近の更新の取得](http://developer.nulab-inc.com/ja/docs/backlog/api/2/get-activities)するもので、リンク先のようなJSONをHubotが受け取るのだ

この上記リンクを確認しAPIの仕様を見るとnotificationsにいるユーザを通知したい人にすれば良さそうだ。

Backlogのチケット更新の通知欄にメンションを送りたいユーザを指定し、チケットを更新すると、JSONのnotificationsに通知対象のユーザが入ってくる

#### Backlogのチケット更新箇所における通知ユーザ設定箇所
![a](http://i.gyazo.com/050be6ec41dd5eab8d802d3e26ff1872.png)

後述するスクリプトをデプロイして、チケットの通知欄にユーザ名を指定すると下の画像のように連絡したい人にSlack上にメンションが飛ぶようになるのだ

#### 通知したい人にメンション飛んでるキャプチャ
![a](http://i.gyazo.com/bdc92c0e048e7b5013367eae55021729.png)


#### 対象のHubot スクリプト
基本は冒頭のリンクにあるスクリプトと同じだが、notificationsを取得し送信するように書き換えてある


```coffee
# Description:
#   Backlog to Slack

module.exports = (robot) ->
  robot.router.post "/room/:room", (req, res) ->
    room = req.params.room
    body = req.body

    console.log 'body type = ' + body.type
    console.log 'room = ' + room

    try
      switch body.type
          when 1
              label = '課題の追加'
          when 2, 3
              # 「更新」と「コメント」は実際は一緒に使うので、一緒に。
              label = '課題の更新'
          else
              # 課題関連以外はスルー
              return

      # 投稿メッセージを整形
      url = "#{process.env.BACKLOG_URL}/view/#{body.project.projectKey}-#{body.content.key_id}"
      if body.content.comment?.id?
          url += "#comment-#{body.content.comment.id}"

      message = "*Backlog #{label}*\n"
      message += "[#{body.project.projectKey}-#{body.content.key_id}] - "
      
      # ここでチケットを作った作成者のユーザ名がbyの後ろについてしまい、知らせたい人じゃない人にメンションが飛んでしまいがち
      # message += "#{body.content.summary} _by #{body.createdUser.name}_\n>>> "
      message += "#{body.content.summary}"

      # notificatonに通知したい人がいればその名前をメンションしてくれる
      if body.notifications.length > 0
        message += "_to "
        for a in body.notifications
          console.log a.user.name
          message += "#{a.user.name} "

      if body.content.comment?.content?
          message += "#{body.content.comment.content}\n"
      message += "#{url}"

      console.log 'message = ' + message
      # Slack に投稿
      if message?
        robot.messageRoom room, message
        # robot.messageRoom room, message
        res.end "OK"
      else
          robot.messageRoom room, "Backlog integration error."
          res.end "Error"
    catch error
      console.log error
      robot.send

```
いちいちbundle execしたくない 決定版


# はじめに
Gemfileを使ってgemを管理してるプロジェクトで、日常的にbundle exec 何々ってやってて、alias be='bundle exec'とかしてるけど、beすら打つのが面倒、って状況よくありますよね。

# 結論から
2013/12/26にリリースされたRubyGems 2.2.0以降であれば、環境変数で```RUBYGEMS_GEMDEPS=-```とすることでbundle execを使わなくてもGemfileを読んでくれる。

# 少し追記
RUBYGEMS_GEMDEPSは"gem dependency file"へのパスを指定する機能。```RUBYGEMS_GEMDEPS=MyGemfile```であればカレントディレクトリからMyGemfileを読むことになる。カレントディレクトリからの相対パス、絶対パスともに使用可能。存在しないファイルを指定してもエラーは出ないので注意。

"-"だけが特別な指定方法でこれの場合、カレントディレクトリからgem.deps.rb,Gemfile,Isolateのいずれかを探し、見つからなければ親ディレクトリからこの3つを、まだなければ親の親から、と祖先のディレクトリをたどって探す。

またbundlerのGemfileで使えていたすべての記法が使えるわけではない？みたいなのでそこもご注意。

# 以下蛇足

rvm環境を作り直してて、bundle exec省く設定どうするんだっけとググると、
.rvm/hooks/after_cd_bundlerとbundle install --binstubsを組み合わせる方法が出てくる。
ところがこれやってると、bundlerからhttps://github.com/mpapis/rubygems-bundler 使えって言われた。

早速見に行くと一番上に、
> Generally, this gem is not needed on RubyGems >= 2.2.0. Simply set the RUBYGEMS_GEMDEPS environment variable to either the path of your Gemfile or - to auto-discover in parent directories.

とあった。

RUBYGEMS_GEMDEPSをググる。

> RubyGems can check for gem dependencies files (gem.deps.rb or Gemfile) when rubygems executables are started and uses the found dependencies. This means rake will work similar to bundle exec rake. To enable this set the RUBYGEMS_GEMDEPS environment variable to the location of your dependencies file.

http://blog.rubygems.org/2013/12/26/2.2.0-released.html

> If you set it to be RUBYGEMS_GEMDEPS=- (minus sign), it will look for a gemfile in the current directory (and deeper directories too, I think).

http://www.reddit.com/r/ruby/comments/1trfxf/rubygems_220_released/

2013/12/26あたりに導入された機能らしい。日本語情報はびっくりするほどなかった。

早速試してみる。

```
gem -v
echo "puts 'hello gemfile.'" > Gemfile
ruby -e '' # なんもでない
RUBYGEMS_GEMDEPS=- ruby -e '' # hello gemfile.てでるから読まれてる
mkdir a
cd a
RUBYGEMS_GEMDEPS=- ruby -e '' # rakeみたいに親からも読まれるのでhello gemfile.がでる
```

ということで、どうやら読まれているらしいという結論に至る。RubyGemsの機能なのでrvmとかrbenvに依存しない、と思う。
[FuelPHP] validationクラスに独自のチェックを追加する

Fuel PHPにvalidationクラスに独自のチェックを追加する方法を記載


1.独自バリデーションクラスを作成して/fuel/app/classes/配下に設置します。

```lang:validation.php
class Model_util_validation
{
    /**
     * 半角数値とドットのバリデーション
     * @param $val
     * @return bool
     */
    public static function _validation_numberdot($val, $options=null) {
        mb_regex_encoding("UTF-8");
        return preg_match('/^\d+(?:\.\d+)?$/', $val) === 1;
    }

}
```

2.作成したバリデーションのエラーメッセージを追加
/fuel/app/lang/ja/validation.phpを開いて、以下のように追加します。バリデーション名毎に設定します。
```
return array(
	'required'        => '必須項目を入力してください',
	'numberdot'       => '半角数字とドットのみで入力してください',
);

```


3.バリデーションインスタンスに追加して、実行

```
 $val = Validation::forge('my_validate');

//カナチェック用のクラスを追加
$val->add_callable('Model_util_validation');
$val->add('shop_name', '店舗名')->add_rule('required')->add_rule('max_length', 80);
```

以上
MariaDB：起動しないメモ

###### [現象]
GarelaClusterで2ノード目以降が起動しなかった。
「ERROR」と表示されるまでが早すぎるので事前確認的なところのチェックでエラーされていると予想

###### [原因]
* ログディレクトリを作ってませんでした(；・∀・)
* 1台目だけログディレクトリ作っており、2,3台目はログディレクトリ作り忘れていた
* 2,3台目だけ起動しないのでクラスタ特有の現象と勘違いしてました

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

一台目起動！

```
[root@db-01 ~]# /etc/init.d/mysql start --wsrep-new-cluster
Starting MySQL.. SUCCESS!
```

二台目起動！

```
[root@db-02 ~]# /etc/init.d/mysql start
Starting MySQL. ERROR!
```

なんでやー

こんなときは先ずログを確認っと、、、ってあれログディレクトリ作ってない．．．。

```
[root@db-02 ~]# mkdir /var/lib/mysql/log
[root@db-02 ~]# chown -R mysql. /var/lib/mysql/log
[root@db-02 ~]# ln -s /var/lib/mysql/log /var/log/mysql
```

気を取り直して

```
[root@db-02 ~]# service mysql start
Starting MySQL....SST in progress, setting sleep higher. SUCCESS!
```

```
[root@db-02 ~]# ll /var/lib/mysql/log
合計 60
-rw-rw---- 1 mysql mysql   351  6月  5 18:03 2015 mysql-bin.000008
-rw-rw---- 1 mysql mysql   312  6月  5 18:03 2015 mysql-bin.000009
-rw-rw---- 1 mysql mysql    72  6月  5 18:03 2015 mysql-bin.index
-rw-r----- 1 mysql root  41958  6月  5 18:03 2015 mysql-error.log
-rw-rw---- 1 mysql mysql  1536  6月  5 18:03 2015 mysql-slow.log
```

ε-(´∀｀*)ﾎｯ
[FuelPHP] validationクラスのエラーメッセージを設定する

FUel PHPでvalidationクラスのエラーメッセージを設定する方法を記載。

1./fuel/app/lang/ja/validation.phpを開く

2.該当する処理のエラーメッセージを修正する。

```lang:validation.php
<?php

return array(
	'required'        => '必須項目を入力してください',
	'min_length'      => '最小文字数を超えています',
	'max_length'      => '最大文字数を超えています',
	'exact_length'    => 'The field :label must contain exactly :param:1 characters.',
	'match_value'     => 'The field :label must contain the value :param:1.'
);
```

以上
GithubとBitbucketのストレージ周りのお話


#Bitbucket
Bitbucketには、性能観点からストレージ制限が導入されています。

* ソフト制限：リポジトリが合計1GB以上になるとメール通知されます
* ハード制限：2GB以上はプッシュできないようになっています

##参考
* [What kind of limits do you have on repository/file/upload size?](https://confluence.atlassian.com/pages/viewpage.action?pageId=273877699)


# Github
Githubにも、性能観点から一部制限事項と推奨事項が導入されています。

* 1ファイル50MB以上のファイルをプッシュしようとすると警告します。
* 1ファイル100MB以上のファイルはプッシュできません。
* Githubは、ディスク制限を設けてはいません。しかし、1GB以下にすることを推奨しています。

##Git Large File Storageのすすめ
Git用のオープンソースの拡張機能であるGit Lage File Storageで、テキストファイルと同じように大きなファイルを扱うことができます。


##参考
* [Working with large files](https://help.github.com/articles/working-with-large-files/)
* [What is my disk quota?](https://help.github.com/articles/what-is-my-disk-quota/)
* [Git LFS](https://git-lfs.github.com)

#Gitの挙動
[Githubによる](https://help.github.com/articles/working-with-large-files/)と、Gitは、すべてのリポジトリと同じだけの空き領域をハードディスク上に必要とします。たとえば、リポジトリが1GBだったら、Gitは1GBの空き領域が必要です。
composerで入れたパッケージがautoloadで見つからなくてエラーになっちゃう場合の対処法

composerでHTTP_Request2を入れてみます

```json:composer.json
{
    "require": {
        "pear/http_request2": "2.2.1"
    }
}
```
```bash
$ php composer.phar update
```

HTTP_Request2を使ってみます

```php:test.php
<?php

require 'vendor/autoload.php';

$request = new HTTP_Request2();
print_r($request);
```

```bash
$ php test.php
php test.php 
PHP Warning:  require_once(Net/URL2.php): failed to open stream: No such file or directory in /Users/tsukui/Desktop/foo/vendor/pear/http_request2/HTTP/Request2.php on line 24
PHP Fatal error:  require_once(): Failed opening required 'Net/URL2.php' (include_path='/Users/tsukui/Desktop/foo/vendor/pear/pear_exception:.:/usr/lib/php/pear') in /Users/tsukui/Desktop/foo/vendor/pear/http_request2/HTTP/Request2.php on line 2
```

Net_URL2が入っているのに、includeできてないからエラーになっていますね

composer.jsonをこのようにします

```json:composer.json
{
    "require": {
        "pear/http_request2": "2.2.1"
    },
    "include-path": [
        "vendor/pear/net_url2",
        "vendor/pear/http_request2"
    ]
}
```
```bash
$ php composer.phar update
```

再実行

```bash
$ php test.php 
HTTP_Request2 Object
(
    [observers:protected] => Array
        (
        )
中略
    [adapter:protected] => 
    [cookieJar:protected] => 
)
```

実行できるようになりました