OmniAICreator/Qiita-1.07M huggingface dataset:
C# LINQ Aggregate のオーバーロードの挙動を知る

##そもそもAggregateとはなんぞや
ある集合(IEnumerable&lt;TSource&gt;)に対して処理を通して1つの結果(TSource または TAccumulate)を受け取る集合系メソッドです。
要するに T[] があった時に T 一つひとつに何らかの処理を通して集計した結果を返す的なイメージでOK。
Haskellでいうfoldみたいな。

で、これを使う時3つほどオーバーロードがあるんですが、それぞれの挙動がちょっとだけ気になったので調べてみた。

###オーバーロードについて

```csharp
public static TSource Aggregate<TSource>(
        this IEnumerable<TSource> source,
        Func<TSource, TSource, TSource> func) { return /* hogemoge */ }

public static TAccumulate Aggregate<TSource, TAccumulate>(
        this IEnumerable<TSource> source,
        TAccumulate seed,
        Func<TAccumulate, TSource, TAccumulate> func) { return /* hogemoge */ }

public static TResult Aggregate<TSource, TAccumulate, TResult>(
        this IEnumerable<TSource> source,
        TAccumulate seed,
        Func<TAccumulate, TSource, TAccumulate> func,
        Func<TAccumulate, TResult> resultSelector) { return /* hogemoge */ }
```

と、3種類あります。
内容は見てわかるので割愛。気が向いた時に中身の解説するかもめ。

で、今回注目したいのは、Seedを渡す時と渡さない時の動作の違い。
ちょっと考えれば当たり前なんだけど忘れがちなので。

###まずSeedを与えない場合。

```csharp
// 要素ゼロでもLINQなら。そんなふうに考えていた時期が俺にもありました。
Enumerable.Empty<int>().Select(i => i.ToString())
          .Aggregate((acc, succ) => acc + succ); //=> InvalidOperationException

// string.Join みたいなことする
Enumerable.Range(1, 10).Select(i => i.ToString())
	  .Aggregate((acc, succ) => acc + "," + succ); //=> "1,2,3,4,5,6,7,8,9,10"
```

###次にSeedを与える場合。

```csharp
// エラー出さない
Enumerable.Empty<int>().Select(i => i.ToString())
	  .Aggregate("", (acc, succ) => acc + "," + succ); //=> ""

// string.Join みたいなことしたい人生だった
Enumerable.Range(1, 10).Select(i => i.ToString())
	  .Aggregate("", (acc, succ) => acc + "," + succ); //=> ",1,2,3,4,5,6,7,8,9,10"
```

はい、エラーが出なくなりますし頭に "," がつきます。

##何が違うのか
seedを与えない場合、IEnumerableから取得できる1つ目の要素がseedとして使用されるため、
1つ目の要素が存在しない場合にエラーになります。

次にseedを与えた場合、それがseedとして使用されるため、最初の1ループ目に空文字と1つ目の要素がつながって
カンマが付与されるので先頭にカンマがつきます。

すごく単純だけど忘れがちなのでご注意ください。

----
おまけ。C#のSyntax Highlightがカラーパターンガン無視であまりにもひどくていらいらなどした。

#こうでしょ！こう！
![color1.png](https://qiita-image-store.s3.amazonaws.com/0/2472/ca9722b0-8fd8-e057-7f45-a3333c675c33.png)
![color2.png](https://qiita-image-store.s3.amazonaws.com/0/2472/4428d672-8b4f-0e4f-e79f-a7271b178be2.png)
量子コンピュータと量子通信 I 演習 3.6 解

Qiita で数式が書けると聞いて書いてみた。でもこの演習問題あんま数式出てこなかった。

# 演習3.6（確率的停止問題）
確率的 Turing 機械を演習 3.2 と同じ方法で番号付けし、確率的停止関数 $h_p(x)$ を次のように定義する。つまり入力 $x$ があると少なくとも確率 $1/2$ で機械 $x$ が停止するならば $h_p(x)$ は $1$, 入力 $x$ に対して確率 $1/2$ 以下で機械 $x$ が停止するならば $0$ に等しい。すべての $x$ に対して厳密に確率が $1/2$ 以上の正確さで、出力 $h_p(x)$ を与える確率的 Turing 機械は存在しないことを示せ。

# 解
そのような確率的 Turing 機械があるとしてこれを `HALT_P(x)` とする。これを使って、別の確率的 Turing 機械 `TURING_P(x)` を次のように定義する

```
01 TURING_P(x)
02   y = HALT_P(x)
03   r = RAND()
04   if y = 0 then
05     halt
06   else
07     loop forever
08   end if
```

ここで、各行の頭の数字は行番号である。 この確率的 Turing 機械に対応する番号を $t$ とし、$h_p(t)$ を考える。

- $h_p(t) = 1$ と仮定する。
    - つまり、機械 t（`TURING_P(x)`）は入力 t に対して少なくとも 確率 $1/2$ で停止する。
    - 確率的 Turing 機械 `HALT_P(x)` は、確率 $1/2$ 以上の正確さで 出力 $h_p(x)$ を与える。
    - 今、仮に 確率 $p \ge 1/2$ で `HALT_P(t) = 1` とする。
    - 従って、第 04 行の `if` 文は、確率 $(1-p) \le 1/2$ で `then` 句へ行き、動作を停止する。
    - つまり、この `TURING_P(x)` に自身の番号である $t$ を渡すと、$1/2$ 以下の確率で動作を停止する。
    - これは、はじめの仮定 $h_p(t) = 1 $ に矛盾する。
- $h_p(t) = 0$ と仮定する。
    - 同様の推論により、`TURING_P(x)` は確率 $p \ge 1/2$ で動作を停止することになり、やはり矛盾する。
- 以上により、すべての $x$ に対して厳密に確率が 1/2 以上の正確さで、出力 $h_p(x)$ を与える確率的 Turing 機械は存在しない
PSM1.x系とUnityを無理やり同居させていた環境でUnity for PSMを導入してハマる流れ

Unity for PSMを導入するときに、ちょっとハマったのでメモとして残します。

PSMのmonoとUnityのmonoが衝突する為、gtk-sharp-2.12.20.msiをインストールして対策している人が対象です。
同じハマり方をする人がいるかはわからないのですが、悩んだので参考になれば。


Unity for PSMに同梱されているMono Developerがスプラッシュ画面以後にクラッシュして起動しないということが発生している場合、gtk#が原因でクラッシュしています。

gtk#をアンインストールすることで、無事起動することができるようになります。
SwiftでCLIコードを書く


Xcode6 beta3 が一般開発者向けにリリースされ、ダウンロードできるようになりました。
ダウンロードするには開発者アカウント(無償)が必要になります。

Xcode - Downloads - Apple Developer
https://developer.apple.com/xcode/downloads/

Xcode6 beta3を使用してSwift言語でのCLIプログラミングができます。

Xcode6 beta3をインストール後、使用するXcodeを変更

    $ sudo xcode-select -switch /Applications/Xcode6-Beta3.app/Contents/Developer

Swift言語でスクリプトの作成

Hello Worldを標準出力するサンプル

    $ touch hello.swift
    $ chmod +x hello.swift

```swift:hello.swift
#!/usr/bin/env xcrun swift -i

var str = "Hello World"

// 標準出力
println(str)
```

ソースコードを実行

    $ ./hello.swift


Macのアラートを表示させるサンプル

    $ touch alert.swift
    $ chmod +x alert.swift

```swift:alert.swift
#!/usr/bin/env xcrun swift -i

import Cocoa

class Alert {
  func put(str :String) {
    // アラートメッセージを出力
    var alert = NSAlert()
    alert.messageText = str
    alert.runModal()
  }
}

let message = "Hello Swift"

var alert = Alert()
alert.put(message)
```

ソースコードを実行

    $ ./alert.swift

HTTP通信の結果表示させるサンプル

    $ touch http_request.swift
    $ chmod +x http_request.swift


```swift:http_request.swift
#!/usr/bin/env xcrun swift -i

import Cocoa

class HttpRequest {

  /**
   * HTTP通信をして取得結果のBodyを返す
   */
  func get(urlStr :String) -> String {
    var url = NSURL.URLWithString(urlStr)
    var request = NSURLRequest(URL: url)
    var response:AutoreleasingUnsafePointer<NSURLResponse?> = nil;
    var error: AutoreleasingUnsafePointer<NSErrorPointer?> = nil;

    var responseData = NSURLConnection.sendSynchronousRequest(request,returningResponse: response, error:nil) as NSData

    if error != nil {
       // HTTPエラー時の処理を書く

       return ""
    } else {
       // HTTP通信成功処理を書く
       var responseStr:NSString = NSString(data:responseData, encoding:NSUTF8StringEncoding)

       // 取得結果を返す
       return responseStr
    }
  }
}

var urlStr = "http://www.yahoo.co.jp"

var http_request = HttpRequest()
var response = http_request.get(urlStr)

// 結果を標準出力
println(response)
```
ソースコードを実行

    $ ./http_request.swift
RuboCop | Style/RaiseArgs

# RuboCop | Style/RaiseArgs

## 概要

RuboCopの「Style/RaiseArgs」警告について。

raise使用時に、下記のうちのどちらを使用しているかチェックする。

~~~ruby
raise Exception.new(msg)
~~~

~~~ruby
raise Exception, msg
~~~

デフォルトは後者。

### 設定値一覧

|設定対象|対象|内容|デフォルト|
|:-----|:--|:---|:---:|
|RaiseArgs|compact|raise Exception.new(msg)形式を有効とする|--|
|RaiseArgs|exploded|raise Exception, msg形式を有効とする|○|

## RaiseArgs

各設定値での検証結果をまとめます。

### 検証プログラム

~~~ruby:raise_args
def fail_method
  fail StandardError, 'fail'
end

def raise_method_exploded
  fail_method
rescue
  raise StandardError, 'raise'
end

def raise_method_compact
  fail_method
rescue
  raise StandardError.new('raise')
end

begin
  raise_method_exploded
rescue => e
  puts e
end

begin
  raise_method_compact
rescue => e
  puts e
end
~~~

### 実行結果 デフォルト の場合

~~~yaml:.rubocop.yml
RaiseArgs:
  EnforcedStyle: exploded
~~~

~~~bash
$rubocop raise_args.rb
Inspecting 1 file
C

Offenses:

raise_args.rb:14:3: C: Provide an exception class and message as arguments to raise.
  raise StandardError.new('raise')
  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

1 file inspected, 1 offense detected
~~~

### 実行結果 compact を設定にします

~~~yaml:.rubocop.yml
RaiseArgs:
  EnforcedStyle: compact
~~~

~~~bash
$rubocop raise_args.rb
Inspecting 1 file
C

Offenses:

raise_args.rb:2:3: C: Provide an exception object as an argument to fail.
  fail StandardError, 'fail'
  ^^^^^^^^^^^^^^^^^^^^^^^^^^
raise_args.rb:8:3: C: Provide an exception object as an argument to raise.
  raise StandardError, 'raise'
  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^

1 file inspected, 2 offenses detected
~~~

## RuboCopまとめ記事
http://qiita.com/tbpgr/items/edbfecb6a6789dd54f47
Knockout + TypeScript で Hello World デモ

[Knockout.js 日本語ドキュメント　Hello World デモ](http://kojs.sukobuto.com/tips/helloWorld)
[Knockout ES5 でより自然な書き方へ](http://kojs.sukobuto.com/tips/knockout-es5)
上記サイトを参考にHello World デモをknockout + knockout-es5 + TypeScript で書いてみた。

```html:index.html
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title></title>
</head>
<body>
    <p>ファーストネーム: <input data-bind="value: firstName" /></p>
    <p>ラストネーム: <input data-bind="value: lastName" /></p>
    <h2>Hello, <span data-bind="text: getFullName()"> </span>!</h2>

    <script src="../Scripts/knockout-3.1.0.js"></script>
    <script src="../Scripts/knockout-es5.js"></script>
    <script src="app.js"></script>
</body>
</html>
```

```ts:app.ts
/// <reference path="../Scripts/typings/knockout/knockout.d.ts" />
/// <reference path="../Scripts/typings/knockout.es5/knockout.es5.d.ts" /> 
"use strict";
class ViewModel {
    firstName: string;
    lastName: string;

    constructor(first, last) {
        this.firstName = first;
        this.lastName = last;

        ko.track(this);
    }

    getFullName(): string {
        return this.firstName + this.lastName;
    }
}

ko.applyBindings(new ViewModel("Planet", "Earth"));
```
Windowsでコマンド実行可能なこと

Windows ロゴ キー + R で「ファイル名を指定して実行」から、直接実行した方が早いコマンドが意外とある。

## 参考

[commandlist: 3 exe](http://commandlist1.blogspot.jp/2013/10/3-exe.html "commandlist: 3 exe")
[commandlist: ALL](http://commandlist1.blogspot.jp/2013/10/all.html "commandlist: ALL")

## よく使うの

|内容|コマンド|
|:--|:--|
|詳細設定|SystemPropertiesAdvanced.exe|
|タスクスケジューラー|control schedtasks <br/> taskschd.msc /s|
|「システム構成」全般|msconfig.exe|
|システムのプロパティ|(control.exe )sysdm.cpl <br/> Windows logo key + Pause/Break|
|コンピュータの管理|compmgmt.msc /s <br/>CompMgmtLauncher.exe|
|ハードウェア|SystemPropertiesHardware.exe|
BlenderをPythonから使えるようになるための第一歩

# 背景

BlenderはPythonから動かせるそうなので、色々試している最中。

# Blenderのスクリプト用モードにするには

Blenderのデフォルトの状態でPython用の表示モードが用意されていた。

囲みのコンボボックスをクリック

![BlenderMainWin.png](https://qiita-image-store.s3.amazonaws.com/0/3458/c344b62d-88a7-8fa7-53bc-7ee96f73349c.png)

コンボボックスから「Scripting」を選択すればOK

![BlenderScripting.png](https://qiita-image-store.s3.amazonaws.com/0/3458/45c3b9f5-ec53-1cfd-fd83-82cbe588f51d.png)

以下のようにPythonを書ける領域が下側に表示される。

![BlenderScriptMode.png](https://qiita-image-store.s3.amazonaws.com/0/3458/205dc8ba-74e0-8797-febf-051edcf6f16c.png)

# 関連投稿

- [Blenderの中のPythonでカレントディレクトリを知るには - Qiita](https://qiita.com/kjunichi/items/39462dd724acb3eb2b71)
- [直前に生成したプリミティブ等の名称を取得するには - Qiita](https://qiita.com/kjunichi/items/f4e836630613631d3a67)

- [PythonやBlenderでmrubyを動かす - Qiita](https://qiita.com/kjunichi/items/51127edd684cc646e5ec)
- [OSXのBlenderでOpenCVを使う - Qiita](https://qiita.com/kjunichi/items/814993f194d7c07b78bb)

# 関連記事

- [Blenderで初めてのアドオンを作るまで ～その2～](https://abrakatabura.hatenablog.com/entry/2017/04/28/062856)
- [Blenderで初めてのアドオンを作るまで ～その１～](https://abrakatabura.hatenablog.com/entry/2017/04/11/061849)
- [BlenderでPython使って最速降下曲線を描いてみる](https://abrakatabura.hatenablog.com/entry/2016/05/26/070858)
- [BlenderでエクスポートしたJSONがThree.jsで変な色になる問題が解決](https://abrakatabura.hatenablog.com/entry/2015/12/21/071507)
- [OSXのBlenderでctypesを試した](http://abrakatabura.hatenablog.com/entry/2015/01/31/091848)
- [blenderでgRPC(クライアント＆サーバ)を動かした](https://abrakatabura.hatenablog.com/entry/2019/03/18/212258)
Scalaのパターンマッチ


#Scalaのパターンマッチ

+ usage
+ patterns
+ pattern guard
+ tuple
+ regular expression
+ Option
+ unapply
+ case class

#usage

```usage.scala
val (x, y) = (1, 2)  //分解して代入 x = 1, y = 2

(x, y) match {
  case (1, 2) => "one, two"  //パターンで分岐
  case _ => "what?"
}
```

#patterns
```patterns.scala
any match {
  case 1             => //定数パターン
  case _: Int        => //型付きパターン
  case (_, _)        => //タプルパターン
  case List(_, _, _) => //固定長シーケンスパターン
  case List(_, _*)   => //_*で任意長シーケンスパターン
  case Some(x)       => //コンストラクタパターン
  case x             => //変数パターン
  case x @ (_, _)    => //変数束縛パターン
  case _             => //ワイルドカードパターン
}
```

それぞれのパターンを入れ子にすることも可能

```nest.scala
nest match {
  case (1, x: Int, xs @ List(_*), _) => "match!!"
  case _ => "I dont know"
```

#pattern guard
ifで条件を付けることもできる。

```guard.scala
val piyo = "piyopiyo"

piyo match {
  case p if p.length < 5 => "short piyo"
  case p if p.length >= 5 => "long piyo" //ここにマッチ
}
```

#tuple
```tuple.scala
val p = "piyo"
val h = "hoge"

(p, h) match {
  case ("piyo", "fuga") => "piyo, fuga"
  case ("piyo", _)      => "piyo, something" //ここにマッチする
  case (_, "hoge")      => "something, hoge"
  case (_, _)           => "something, something"
}
```

複数のものを一つのタプルにまとめて、条件分岐させることができる。
「片方だけが○○の時は～、両方□□の時は～」のように分岐できる。

#regular expression
括弧の数でパターンが変わる。
unanchoredで部分にマッチする(束縛するのは一番最初にマッチしたもの)
入れ子も可。

```regex.scala
val re1 = "piyo\d+".r
"piyo123" match {
  case re1() => "match"
  case _ => "mismatch"
//case re1(num)はエラー
}

val re2 = "piyo(\d+)hoge(\d+)".r
"piyo123hoge456" match {
  case re2(p, h) => p + h // "123456"
  case _ => "mismatch"
//case re2() はエラー
}

val re3 = "piyo(\d+)".r.unanchored
"hogepiyo123hoge" match {
  case re3(num) => num // "123"
  case _ => "mismatch"
}
```

#Option
後述のcase classの一つがOption。

```option.scala
val piyo: Option[String] = Some("piyo") // Option[String]で型を指定しないとSome[String]になってしまって、Noneがtype errorになる。関数の返り値の推論はOptionになるので普段は不要
piyo match {
  case Some(p) => p // "piyo"
  case None => "none"
}
```

#unapply
オブジェクトにunapplyが定義されていれば、パターンマッチができる(extractor:抽出子)
BooleanかOptionを返すようにする。
コンストラクタやapplyと違う形にできる。

```unapply.scala
class Piyo(val piyo: String, val hoge: String)
object Piyo {
  def unapply(p: Piyo) = Some(p.piyo)
}

val piyo = new Piyo("piyopiyo", "hogehoge")
piyo match {
  case Piyo(p) => p // "piyopiyo"
  case _ => "not piyo..."
}
```

#case class
case classには自動的にunapplyが定義される。
コンストラクタと同じ形のパターンになる。

```caseclass.scala
case class Piyo(p: String, h: String)

val piyo = Piyo("piyo", "hoge") //applyも定義されるのでnew不要

piyo match {
  case Piyo(p, h) => p + h // "piyohoge"
  case _ => "mismatch"
}

//代入もできる
val Piyo(p, h) = piyo //p = "piyo", h = "hoge"
```
SECCON 2014 オンライン予選

一人で参加して結果は1000点で61位でした。
一人でやるのはきついので次回があったらチームで参加したいです。

###このパケットを解析せよ
Wiresharkで開いたらそれっぽい文字列があったのでBase64でデコードした。

###ソーシャルハック
どうせ罠付きのサイトを用意してそっから情報たどるんだろうと思ったけど、ルート権限とGIPが振られている鯖持ってなかったし、時間もなかった。

###decode me
適当にデータを取得した後に読める文字でぐぐったらrot13らしいのでコードを書いて試すがうまくいかない。もう一回rot13/47でぐぐったらnkfでできると書いてあったのでやった。

###839,394bytes
vim -b、:%!xxdで開いて839,394のHexで検索したらそれっぽい数値があったので送った。最初ミスって全部小文字にしてたら通らなかったので無駄に時間食った。

###x86アセンブラを読もう
単純なループだったので割りとあっさり読めた。

###重ねてみよう
アニメーションgifをbmpに切り出して、プログラムを書いて合成した。OpenCVを使うまでの手順が一番楽そうなのがPythonだったのでPython使った。
https://gist.github.com/cos65535/94442d2d82b686a33dd9

###あみだくじ
あみだくじが毎回同じのが出力されていたいので、perlで1～8まで全て試すコードを書いたけど遅すぎて数時間たっても終わらなかった。しょうがないのでC++でpipe使いながらコードを書きなおして通した。
https://gist.github.com/cos65535/741dd8f43c2b4aa70d71

###箱庭XSSリターンズ
2問目は1問目で使った文字列や関数が使えなくなる。めんどくさいので全部記号で書けばいいのではと思って、http://www.jsfuck.com/ とかやってみたけどバージョン違いとか文字列長すぎとかで通らんかった。

###詰将棋
ソルバー書いたらバグりまくった。最終的に明らかに無駄な手をしていたけど1手目を決め打ちしたら通った。そもそも11手で解けるっぽいしIRCでもミスがあったと言っていたので微妙だった。
https://gist.github.com/cos65535/3dff48795dc56ce69fa0
kernel勉強

kernelの勉強のために以下の本を買った
・<a href="http://www.amazon.co.jp/Linux%E3%82%AB%E3%83%BC%E3%83%8D%E3%83%AB2-6%E8%A7%A3%E8%AA%AD%E5%AE%A4-%E9%AB%98%E6%A9%8B%E6%B5%A9%E5%92%8C/dp/4797338261">Linuxカーネル解読室</a>
・<a href="http://www.amazon.co.jp/Linux%E3%82%AB%E3%83%BC%E3%83%8D%E3%83%AB%E8%A7%A3%E6%9E%90%E5%85%A5%E9%96%80-I%E3%83%BBO-BOOKS-%E5%B9%B3%E7%94%B0-%E8%B1%8A/dp/4777516156">Linuxカーネル解析入門</a>
・<a href="http://www.amazon.co.jp/%E8%A9%B3%E8%A7%A3-Linux%E3%82%AB%E3%83%BC%E3%83%8D%E3%83%AB-%E7%AC%AC3%E7%89%88-Daniel-Bovet/dp/487311313X">詳解LINUXカーネル</a>
また、勉強方法については、以下のページを参考に勉強しています。
"<a href="http://image.gihyo.co.jp/assets/files/event/2008/24svr/report/2-24svr-TechMTG-ito.pdf">Linuxカーネルの読み方</a>"

次回は、kernelを読む方法についてまとめようと思う
直前に生成したプリミティブ等の名称を取得するには  

# はじめに

最近Blenderを使えると色々おもしろいことが出来そうなので、Pythonであれこれ出来ないか調査中。

今回は、BlenderをPythonから操る場合、追加したプリミティブなどを指定する際に名称を指定して後続の処理を行うことが多いように思えたので、この名称の取得方法を調べてみた。

プリミティブ追加時に名称を指定する方法が分からなかったので、調べたら、今回の方法に辿り着いた。

# 直前に生成したプリミティブの名称を取得するには

```py3
bpy.context.object.name
```

# 使い方

```py3
bpy.ops.mesh.primitive_uv_sphere_add(location=(0, 0, 0.5))
# ↑で追加したプリミティブ名は
bpy.context.object.name
```

# 関連投稿

- [BlenderをPythonから使えるようになるための第一歩 - Qiita](http://qiita.com/kjunichi/items/96b0effb9ef8e99b09bf)
- [Blenderの中のPythonでカレントディレクトリを知るには - Qiita](http://qiita.com/kjunichi/items/39462dd724acb3eb2b71)

- [PythonやBlenderでmrubyを動かす - Qiita](http://qiita.com/kjunichi/items/51127edd684cc646e5ec)
- [OSXのBlenderでOpenCVを使う - Qiita](http://qiita.com/kjunichi/items/814993f194d7c07b78bb)

# 関連記事

- [Blenderで初めてのアドオンを作るまで ～その2～](https://abrakatabura.hatenablog.com/entry/2017/04/28/062856)
- [Blenderで初めてのアドオンを作るまで ～その１～](https://abrakatabura.hatenablog.com/entry/2017/04/11/061849)
- [BlenderでPython使って最速降下曲線を描いてみる](https://abrakatabura.hatenablog.com/entry/2016/05/26/070858)
- [BlenderでエクスポートしたJSONがThree.jsで変な色になる問題が解決](https://abrakatabura.hatenablog.com/entry/2015/12/21/071507)
- [OSXのBlenderでctypesを試した](http://abrakatabura.hatenablog.com/entry/2015/01/31/091848)
- [blenderでgRPC(クライアント＆サーバ)を動かした](https://abrakatabura.hatenablog.com/entry/2019/03/18/212258)
Laravel 界隈で、今すぐフォローすべきツイッターアカウント


只今、作成中です。

##[Taylor Otwell (`@taylorotwell`)](https://twitter.com/taylorotwell)
Laravel の作者です。

##[Laravel (`@laravelphp`)](https://twitter.com/laravelphp)
Laravel 公式のアカウントです。中の人は Taylor Otwell らしいです。

##[Dayle Rees (`@daylerees`)](https://twitter.com/daylerees)
Laravel の教科書的な本『Code Happy』と『Code Bright』の作者です。

##[ShawnMcCool (`@ShawnMcCool`)](https://twitter.com/ShawnMcCool)
『Code Starter』の著者です。

##[Jeffrey Way (`@jeffrey_way`)](https://twitter.com/jeffrey_way)
『Laravel Testing Decoded』の作者です。

##[Jeff Madsen (`@codebyjeff`)](https://twitter.com/codebyjeff)
PHP カンファレンス関西 2014 の「フレームワーク4本勝負」でLaravel を担当された方です。

##[Phil Sturgeon (`@philsturgeon`)](https://twitter.com/philsturgeon)
Laravel 界隈で活躍している人です。PyroCMS の作者でもあります。

##[Jason Lewis (`@jasonclewis`)](https://twitter.com/jasonclewis)

http://jasonlewis.me/laravel-tutorials
自身のブログで Laravel の記事を多く書いています。

##[Ian Landsman (`@ianlandsman`)](https://twitter.com/ianlandsman)

UserScape の創設者です。
Laravel の作者 Taylor Otwell が働いている会社のオーナーです。

##[Eric L. Barnes (`@ericlbarnes`)](https://twitter.com/ericlbarnes)

UserScape のエンジニアです。

##[October (`@octobercms`)](https://twitter.com/octobercms)
Laravel 製の CMS のアカウントです。

##[Laracon EU (`@laraconeu`)](https://twitter.com/laraconeu)
Laravel EU ヨーロッパのイベントのアカウントです。

##[laravel.jp (`@laraveljp`)](https://twitter.com/laraveljp)
Laravel の日本語情報アカウントです。

##[Hirohisa Kawase (`@HiroKws`)](//twitter.com/HiroKws)
Laravel の本を日本語に翻訳されている方です。

##[Masashi Shinbara (`@shin1x1`)](//twitter.com/shin1x1)
Laravel のブログを書かれています。関西でPHP勉強会を開催されています。

##[MATSUO Masaru (`@localdisk`)](//twitter.com/localdisk/)
Laravel の事を質問すれば答えてくれる Laravel答えるマンです。

#参考サイト
[Laravel界の人々](http://kore1server.com/136/Laravel%E7%95%8C%E3%81%AE%E4%BA%BA%E3%80%85)
iOSメモ - コードで画面遷移と値渡し

頭の中の消しゴムの威力が強すぎる...

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

### MainStoryboardのViewControllerにidentifierをつけよう

まず、値を渡したい側のViewControllerに、以下のようなidentifierをつける。
![スクリーンショット 2014-07-19 21.23.42.png](https://qiita-image-store.s3.amazonaws.com/0/14262/79c039d4-7336-1ede-6e65-1e9432133d71.png)

### 以下のようなコードを書く

```objc:FirstViewController.m
- (IBAction)nextButton{
    SecondViewController *secondVC =  [self.storyboard instantiateViewControllerWithIdentifier:@"SecondViewController"];
    
    secondVC.secondNum = self.firstNum;
    [self presentViewController:secondVC animated:YES completion:nil];//YESならModal,Noなら何もなし

}
```
```objc:FirstViewController.h
#import "SecondViewController.h"
(略)
@property int firstNum;
```

#### Swift3 or 4

```Swift:ViewController.swift
func nextButton() {
  let secondVC = storyboard?.instantiateViewController(withIdentifier: "SecondViewController")
  secondVC.secondNum = self.firstNum // FirstVCのpropertyであるfirstNumから、SecondVCのsecondNumに代入する
  present(secondVC, animated: true, completion: nil)
}
```


### 俺はpushで画面遷移したいんだ...

```Swift:ViewController.h
//push
[self.navigationController pushViewController:secondVC animated:YES];
```

//push 2回閉じるとか
[push による画面遷移から「戻る」方法３つ](http://kawairi.jp/weblog/vita/201204265997)

https://github.com/omatty198/pushTest

### その他

```Swift:ViewController.h
//modal 2回閉じる
[self.presentingViewController.presentingViewController dismissViewControllerAnimated:YES completion:NULL];
```
set nocompatibleはもういらない

##半ばおまじないと化したset nocompatible

`.vimrc`を書くときに、僕達初心者は色々なサイトを巡って「これが良さそうだな」とか「これはみんな書いてるから書いとこう」とか考えて、設定をちまちま書いていく。
そのなかで、この設定を書く人も多いだろう。

```vim:.vimrc
set nocompatible
```

このコマンドは、vi互換の動作を無効にするコマンドである。

##vim-jp/issuesの中での言及
さて、この設定について、こんなissueがあった。
[compatible について解説したほうが良いか? #471](https://github.com/vim-jp/issues/issues/471)
それに関連する形で、このURLが張られている。(issue内URLはリンク切れのため同等記事掲載)
[vim-jp » Hack #179: ‘cpoptions’, ‘compatible’について知る](http://vim-jp.org/vim-users-jp/2010/10/28/Hack-179.html)

また、vim-jpによる日本語マニュアルには、こう書いてある。
>*'compatible'* *'cp'* *'nocompatible'* *'nocp'*
>'compatible' 'cp'       切替    (既定では オン、ファイル|vimrc|または|gvimrc|が発見されたらオフ)
>                        グローバル
>                        {Vi にはない}
>VimをなるべくVi互換にするか、便利な機能を使えるようにするかを決定する。
> これは、特別な種類のオプションである。このオプションの値が変更されると、それに伴って他のオプションも変更されるからだ。
>＊注意: このオプションを変更すると、予期しない効果が数多く現れる。キーマップの解釈は変わり、アンドゥも違った方法で行われる、等々。このオプションをファイル vimrc 内で設定するなら、一番先頭に置くこと。
>既定ではオンなので、その他のオプションにはViの既定値が使われる。この既定値は、VimをViと全く同じように使うことを望み、オプション 'compatible'について知りもしない、または知りたいとも思わない人たちのためのものである。
>Vimが立ち上がる間にファイル |vimrc| または |gvimrc| が見つかると、このオプションはオフにされ、その他のオプションで変更されていないものは、みなVimの既定値に設定される。要するに、Vimはファイル |vimrc| または|gvimrc| が存在するならVimの既定値を、存在しないならViの既定値を使うのだ ( Note: システム全体用のファイルvimrc や引数|-u|で指定されるファイルは関係ないことに注意)。|compatible-default| と |posix-compliance| も参照。

[http://vim-jp.org/vimdoc-ja/options.html#'compatible'](http://vim-jp.org/vimdoc-ja/options.html#'compatible')より

どうやら、.vimrcが存在するする時点でnocompatibleが成されているのと同じらしい。
ならば、自前の`.vimrc`があるのなら、わざわざ先頭で`set nocompatible`する必要はないということだ。

## NeoVimではどうなのか？
では、NeoVimではどうなのだろう。

調べてみると、そもそも `compatible` コマンドが消えており、かわりに `cpoptions` にて挙動を指定するようになっている。

https://neovim.io/doc/user/options.html#'cpoptions'

> *'cpoptions'* *'cpo'* *cpo*
> 'cpoptions' 'cpo'	string	(Vim default: "aABceFs",
> 				 Vi default: all flags)
>			global
>	A sequence of single character flags.  When a character is present
>	this indicates Vi-compatible behavior.  This is used for things where
>	not being Vi-compatible is mostly or sometimes preferred.
>	'cpoptions' stands for "compatible-options".
>	Commas can be added for readability.
>	To avoid problems with flags that are added in the future, use the
>	"+=" and "-=" feature of ":set" |add-option-flags|.

(「かわりに」とは書いたものの、このオプションはVimにも存在している)

また、以下のissueにおいて、「`set nocompatible` を導入することでAPIの互換性を維持していくことは難しい」と述べられている。

https://github.com/neovim/neovim/issues/503#issuecomment-41591214

確証はないが、NeoVimにおいては `~/.vimrc` があろうが無かろうが、Vimにおける `set nocompatible`が効いた状態になっているのだろう。

##元記事
[.vimrcのset nocompatibleのお話とごめんなさいな話](https://blog.unasuke.com/2014/set-nocompatible-in-vimrc/)
Ruby Nokogiri で.jspページの情報が取得できない

最近Rubyの勉強を初め、nokogiriを使ってスクレイピングを行おうとしたものの『.jsp』の使われているページ情報を取得することができません。
どなたかご教授願います。

```nokogir.rb

require 'open-uri'
require 'nokogiri'

url = 'http://plus.timescar.jp/view/station/detail.jsp?scd=U001'

charset = nil
html = open(url) do |f|
	charset = f.charset
	f.read
end

doc = Nokogiri::HTML(open(url), nil, "utf-8")
p doc.title
```
zsh で特定のオプションを関数の中だけで有効にする

zsh では普通はオプションを指定したらそのシェルが終了するまでずっと有効なんだけど、そうじゃなくて関数内だけで有効にする方法があるので紹介する。

zsh には `local_options` というオプションがある。これを有効にすると、関数を出た時に関数を呼び出した時点でのオプション設定が復元される。つまり、関数の中で設定したオプションをその関数内だけで有効にする、という動作になる。

例を紹介する。

## glob\_dots を関数の中だけで有効にする例

`glob_dots` は、`*` でワイルドカード指定したときにドットで始まるファイル名にもマッチするようになるオプション。

デフォルトでは無効になってるんだけど、シェルスクリプトとかzshrcの中に関数を書いている時とかでたまに有効にしたくなることがある。でも適当に有効にすると影響範囲が大きくなりすぎて困る。そういうときに `local_options` を使うと関数の中だけで有効に出来て、安心して使えるようになる。

```zsh
# まず前提として以下の3つのファイルがあるとする
ls -a .
# => .hidden1  .hidden2  text1.txt

function glob_dots_function()
{
  setopt local_options # local_options を有効にする
  setopt glob_dots
  echo *
}

# 関数を呼び出す前は glob_dots は無効
echo *
# => text1.txt

# 関数の中では glob_dots は有効
glob_dots_function
#=> .hidden1  .hidden2  text1.txt

# 関数から戻ってくるとまた無効に戻る
echo *
# => text1.txt
```

役に立つことがあると思うので参考にしてみてください!

## 参考
[man zshoptions(1)](http://zsh.sourceforge.net/Doc/Release/Options.html#Scripts-and-Functions) の LOCAL_OPTIONS
Sortしたらtupleが消える！？

### 最近こんなことが…

lists:ukeysort/2を使ったらtupleが消えることがある。
それはkeyが *同じ* 場合だ。
例えば次のような場合である。

```erl:shell1
1> lists:ukeysort(1, [{same_key, value1}, {same_key, value2}]).
[{same_key, value1}]
2>
```

ただ、これには注意すべき点がある。
次のような場合だ。

```erl:shell2
1> lists:ukeysort(1, [{1, value1}, {1.0, value2}]).
[{1, value1}]
2>
```

！？
`[{1, value1}, {1.0, value2}]` じゃないの！？と。

これは `lists:ukeysort/2` の *同じ(comparing equal)* が次の大小に従っているためだと考えられる。

> The arguments may be of different data types. The following order is defined:
>
> ```
> number < atom < reference < fun < port < pid < tuple < list < bit string
> ```

参考URL: [Erlang -- Expressions # 8.11  Term Comparisons](http://erlang.org/doc/reference_manual/expressions.html#id78646)

### ちなみに…

`proplists` のドキュメントには次のような記述があった。

> Two keys are considered equal if they match (=:=). In other words, numbers are compared literally rather than by value, so that, for instance, 1 and 1.0 are different keys.

`proplists` では `integer()` と `float()` が区別されていることが明示されている。

なので`proplists`を比較するとき等に`lists:ukeysort/2`をそのまま使うことはできない。
FuelPHP で PDOによるPostgreSQL接続の罠

## 設定
FuelPHP でDBへの接続設定は、
APPPATH/config/db.php
APPPATH/config/production/db.php
APPPATH/config/development/db.php
にて行います。


[FuelPHPのドキュメント](http://fuelphp.jp/docs/1.6/classes/database/introduction.html) によれば、

```
// PDO ドライバで PostgreSQL を使う設定
'production' => array(
    'type'           => 'pdo',
    'connection'     => array(
        'dsn'            => 'pgsql:host=localhost;dbname=fuel_db',
        'username'       => 'your_username',
        'password'       => 'y0uR_p@ssW0rd',
        'persistent'     => false,
        'compress'       => false,
    ),
    'identifier'   => '"',
    'table_prefix'   => '',
    'charset'        => 'utf8',
    'enable_cache'   => true,
    'profiling'      => false,
),
```

このように設定するとありますが、charset の指定があると、

```
Fuel\Core\Database_Exception [ 7 ]:
SQLSTATE[08006] [7] invalid connection option "charset"
```

とエラーになる。
そこで、上記の配列から charset の指定を削除しても、依然としてエラーに。

これは、
COREPATH/config/db.php
にもcharsetの設定があるため。

COREPATH 以下のファイルを編集するのは得策ではないので、
APPPATH 以下の設定ファイルで、

```
'charset' => NULL,
```

と上書きして、万事解決。

DSNに options='--client_encoding=UTF8' を渡しておくと、安心かもしれない。
jshintで 'describe' is not defined 的なエラーが出るやつ。

# 何の話？？

定義されてませんよ系のエラーが出た場合の対処法の話です。
変数が外部ファイルで宣言されていた場合なんかに発生します。

mochaだと、こういうのとか。

```
'describe' is not defined. 
'it' is not defined. 
'before' is not defined.
```

### 対処方法１

.jshintrcにこんな感じで記述(必要に合わせて追加)

```
"globals": {
  "describe"   : false,
  "it"         : false,
  "before"     : false
},
```

### 対処方法２

ファイル単位で設定する方法。対象のファイルにこんな感じでコメントを追加。

```
/*global describe, it, before */
```

### 対処方法３

ブロック単位で指定する方法。コメントで囲った範囲内に対して、jshint自体を効かないようにする。
他のエラーも無視してしまうので、定義されてませんよ。の対処法としては微妙。。。

```
/* jshint ignore:start */
describe('foo', function () {
  it('bar', function () {
    expect(john).to.be.a(doe);
  });
});
/* jshint ignore:end */
```

### 対処方法４

行単位で指定する方法。上と同じく、記述した行に対してjshintを効かないようにする。
同じ理由で対処法としては微妙。

```
describe('foo', function () {      // jshint ignore:line
  it('bar', function () {          // jshint ignore:line
    expect(john).to.be.a(doe);
  });
});
```

その他設定項目に関しては[公式のドキュメント](http://www.jshint.com/docs/options/)で。

(｀･ω･´)ゞ
GrowthForecast をCentOS6.5（Vagrant）に導入してみた、その１

# GrowthForecast って？
fluentd(td-agent) + Elasticsearch というぐらいグラフ化するのによく使われる組み合わせの [GrowthForecast](http://kazeburo.github.io/GrowthForecast/) 。ロングテールグラフを作るとき「簡単、REST、API 」って三拍子揃っているのでどこかの牛丼屋さんみたいな感じでお手軽にグラフが作成できます。

> [GrowthForecast 公式サイト](http://kazeburo.github.io/GrowthForecast/)
> [GrowthForecast を CentOS 6.3 にインストールして Supervisor で管理してみた](http://blog.inouetakuya.info/entry/20130211/1360570283)
> [Docker で Growthforecast をインストールする方法](http://blog.64p.org/entry/2013/08/14/185519)

# システム構成
perlbrew という Perl の sandbox的なあれで動作させつつ GrowthForecast を起動するっていうのが流行りらしいのでそれにのって（そって）みます。というか個人的には cpan + Perl の構成で解析ツール系を作るのが普通な感じと思っていたら最近は、あまり人気ないっぽいですね。Perl は、いい意味で枯れた技術なので好きなのですがxmlとか色々やろうと思うと確かに辛い・・・ｗ

> [growthforecast入れてみる](http://tweeeety.hateblo.jp/entry/20140114/1389666922)
> []()

# 必須パッケージの導入
依存パッケージとfontのインストール

```
# yum groupinstall "Development Tools"
# yum install pkgconfig glib2-devel gettext libxml2-devel pango-devel cairo-devel
# yum install ipa-gothic-fonts ipa-mincho-fonts ipa-pgothic-fonts ipa-pmincho-fonts
```

# インストールユーザ作成
growthforecast は、古い Perl だと動作しないらしいのと、capn でモジュールをインストールすると何気に汚れるので growthforecast を動作するための環境とユーザを作成します。以降、$ ← は、growthforecast で操作してますんでよろしく。

```
# useradd growthforecast
# passwd growthforecast
```

# perlbrewインストール

```
# su - growthforecast
$ curl -kL http://install.perlbrew.pl | bash
$ echo "source ~/perl5/perlbrew/etc/bashrc" >> ~/.bashrc
$ source ~/.bashrc
$ source ~/perl5/perlbrew/etc/bashrc
```

# stable な最新 Perl のインスコ
奇数のバージョンは、β版なので偶数バージョンをインストール。最新版は、人柱の匂いがするので１つ手前のバージョンを導入します。ちなみに install はコンパイルからするので20～30分かかります。インストールが終わったら switch で 5.20.0 環境にします（ここ重要）。

``` 
$ perlbrew available
$ perlbrew install perl-5.20.0
$ perlbrew switch perl-5.20.0
```

# GrowthForecast のインストール 結構時間がかかる
cpanm で GrowthForecast をインストール。こちら「も」20～30分かかります。気長に待ちます。

```
$ cpanm -n GrowthForecast
```

# ログディレクトリを作成
こっちは root で作成します。GrowthForecast のインスコ方法をググると ```/var/run``` を指定してるのが多いんだけどシステム再起動したら消えてしまうよと注意したい。

```
# mkdir -p /var/log/growthforecast/data
# mkdir -p /var/log/growthforecast/log
# chmod -R 777 /var/log/growthforecast
```

# 起動してみる
とりあえず demon 化とかそこらへんはおいといて起動してみる。growthforecast 直に起動すればいいです。apache, nginx とかいりませんｗ

```
$ growthforecast.pl --port=5125 --data-dir=/var/log/growthforecast/data > /var/log/growthforecast/log/growthforecast.log 2> /var/log/growthforecast/log/growthforecast.err
```

```http://localhost:5125/``` でアクセスしてみます。下記の画面が見れない（立ち上がらないとき）場合は、```/var/log/growthforecast/log/growthforecast.err``` を見てみる。

![growthforecase.png](https://qiita-image-store.s3.amazonaws.com/0/44540/ff77a611-6f42-0820-d09f-56ff6c2d6a56.png)

# API の叩き方
こんな感じ

```
curl -F number=500 http://localhost:5125/api/view_graph/fx/hage/AUD
```

あとは公式サイトを参考にするよろし。

> [GrowthForecast](http://kazeburo.github.io/GrowthForecast/)

# その２
[GrowthForecast をCentOS6.5（Vagrant）に導入 Supervisor してみた、その２](http://qiita.com/murachi1208/items/6b36d6c94563f0ad8004)

# 応用編

> [fluent と growthforecast を連携させてさくさくグラフを描くAdd Star](http://pgsqldeepdive.blogspot.jp/2012/12/growthforecast.html)
> [CloudWatchをGrowthForecastでロングスパングラフ化する](http://dev.classmethod.jp/cloud/aws/cloudwatch-to-growthforecast/)
Noto Sans Japaneseと源ノ角ゴシック (Source Han Sans JP)の違い

- フォント名
- ウェイト名及びデフォルトのウェイト(NotoがRegular、源ノがNormal)

それ以外は同じ？

## 比較
- ヒラギノ角ゴ
- [源ノ角ゴシック (Source Han Sans JP)](http://sourceforge.net/projects/source-han-sans.adobe/files/)
- [Noto Sans Japanese](http://www.google.com/get/noto/#/family/noto-sans-jpan)
- [Noto Sans](http://www.google.com/get/noto/#/family/noto-sans)

をMacで表示した。下はNoto/源ノのウェイト比較。

![noto_source.png](https://qiita-image-store.s3.amazonaws.com/0/26124/fef1177b-2e4e-f48f-0ee8-264dc72dd075.png)

### 欧文書体
欧文書体が違うという話だったが同じだった。違うのはNoto Sansの欧文(画像4行目)であって、Noto Sans Japaneseに含まれる欧文は源ノと同じっぽい。

### ウェイト
ウェイト名が一部異なる。デフォルトのウェイトはNotoがRegular、源ノがNormalとなっており、源ノの方が若干細くなる。

|      |     Noto      |      源ノ      | ウェイト |
|:----:|---------------|----------------|----------|
| 細い | **Thin**      | **ExtraLight** | 100      |
|  ↑  | Light         | Light          | 300      |
|  │  | **DemiLight** | **Normal***    | 350      |
|  │  | Regular*      | Regular        | 400      |
|  │  | Medium        | Medium         | 500      |
|  ↓  | Bold          | Bold           | 700      |
| 太い | **Black**     | **Heavy**      | 900      |

## どちらを使う？
フォントそのものはほぼ同じなので、提供元(Adobe・Google)による配布形態の違いなどの部分で選んでしまえばいいはず。

### 源ノ角ゴシック (Source Han Sans JP)
- デフォルトのウェイトは細め
- ウェイト名のNormalとRegularがわかりにくい
- [日中韓国語をまとめた多言語OTFやOTC](http://tama-san.com/?p=4402)が用意されている
- [Adobe Typekit](https://typekit.com/fonts/source-han-sans-japanese)からのダウンロードが可能
- フォント名がつよそう

### Noto Sans Japanese
- デフォルトのウェイトは太め(というか普通)
- ウェイト名がわかりやすい
- 配布形態は単言語OTFのみ
- Googleの[Notoフォントファミリー](http://www.google.com/get/noto/)の一部である
    - 日本語含む全Notoフォントを一気にダウンロードできる
    - 「日本語フォントはNoto使ってくれよ！」とか、外国人に通じやすいことが期待できる
- フォント名がかわいい
GitHubとMercurial（雑な覚書）

書きなぐり

1. [紹介マニアどらふと版: Mercurial(hg) を使って GitHub に Pull Request する手順](http://www.sakito.com/2012/10/mercurialhg-github-pull-request.html)
1. [GitHubをMercurialで使う - Qiita](http://qiita.com/g_maeda/items/8be8a36edb58d77f78dd)

clone するときは git+ssh://git@github.com:user/repository.git
1. では git+ssh://github.com/user/repository.git と書いているけど、これだと駄目。
1. の開発用ブランチを作って、さらにfeatureブランチを作っているのはなんでだろ？
CoffeeScript で 二分木構造 と fmap

```coffeescript
tree = (l, r) ->
  node = (l, r) ->
    fmap: (f, g) ->
      f l.fmap(f, g), r.fmap(f, g)
  leaf = (a) ->
    fmap: (f, g) -> g a
  if l?.fmap and r?.fmap
    return node l, r
  return leaf l

showTree = (t) ->
  f = (l, r) -> "(#{l}, #{r})"
  g = (a) -> "#{a}"
  return t.fmap f, g
```

```coffeescript
a = tree 1
b = tree 2
c = tree a, b
d = tree 3
e = tree c, d
console.log showTree e
```

```
# 出力
((1, 2), 3)
```
Cocos2d-X Android/iOS 書き出しメモ

バージョンにはあまり依存しないとは思いますが、ここではv3.2を使っています。


## Eclipse 設定
1. ADTの環境設定->Preferences
	- Android -> NDK --- Android NDKのルートフォルダを設定する。
	- Workspace -> Linked Resources -> Add
		- Name: COCOS2DX
		- Value: cocos2d-xのルートフォルダ
	- C/C++ Build -> Environment -> Add
		- Variable: NDK_ROOT
		- Value: NDKのルートのパス
2. プロジェクト -> 右クリック -> Properties


## XCode

1. プロジェクトのBuild Settings -> All
	- Architectures --- Standard architectures (armv7, armv7s, arm64)

2. アプリ表示名(Bundle name)の変更
	- Targetの名前を変更する
iTerm2 2.0の新機能: tmuxの統合


今週、iTerm2のメジャーアップデートがあった。ちょっとややこしいのだが、これまでは"iTerm2"のv1.0.xだったのがv2.0になった。

http://www.iterm2.com/news.html に変更点が書かれているが、一つ目の

- Deep tmux integration. iTerm2 can speak directly to tmux and display its virtual windows as native windows or tabs, making tmux much easier to navigate.

が気になる。これまでも当然iTerm2の上でtmuxは使えたはずだが何が違うのか。

ここに書いてあることをちょっと試してみた。
https://code.google.com/p/iterm2/wiki/TmuxIntegration

まずはいつものようにsshでリモートにログイン。

```
$ ssh remote_host
```

そしてtmuxコマンドを叩くのだが、-CCオプションを付けると良いらしい。

```
$ tmux -CC
```

すると新しいWindowがおもむろに立ち上がる。Shellは当然remote先のShell。ほほう。

ここで ⌘t とかして新しいWindowを作ってみると、これもremote先。なるほど。tmuxのコマンドで仮想Windowを作って一つのWindowの中で切り替えて使うのがこれまでだったが、このiTerm2 2.0からはiTermのタブ切り替えでそれができるということか。

元のWindowを見てみると

```
* tmux mode started **

Command Menu
----------------------------
esc    Detach cleanly.
  X    Force-quit tmux mode.
  L    Toggle logging.
  C    Run tmux command.
```

となっている。ここでescを押すと、

```
Detaching...
Detached
```

と出て、さっき出来たWindowがバツっと消えてなくなる。が、detachされただけであれば再attach可能なはず。

```
$ tmux -CC attach
```

とると、期待通り、先ほどのWindowが開いたタブそのままに復活する。ふむふむ。

上の紹介ページを読むと「tmuxのコマンド覚えるのも大変だし、キーが重なったりして無理ゲー。だからiTerm2のタブやウインドウがtmuxの仮想ウインドウになるようにしたさ―(かなり意訳)」ということらしい。

確かに使えそうな気がするのだが、私の場合はiTerm2のキーバインドよりもtmuxのキーバインドの方が身についているので微妙かなぁ。別Windowにしたい時に新たににSSHセッション作らなくて良いのは嬉しいかも。
Titanium CLI 事始め

バージョンは3.2.3

```bash
~ ❯❯❯  titanium -v
3.2.3
```

## だいたいここにのってる
https://github.com/appcelerator/titanium

## インストール

```bash
npm install -g titanium alloy
ndenv rehash && rehash
```

## セットアップ
### Titanium SDKをインストールする

- 特にオプションがなければ最新版をインストールする
- `--default`でデフォルトのSDKにする

```bash
titanium sdk install --default
```

### 初期セットアップ

```bash
titanium setup
```

qでQuick Setupに入って適当に設定する

`titanium config`で設定項目の確認、`titanium info`で環境情報を表示

## プロジェクト作成

```bash
titanium create
```

質問に答えていく。`Titanium`という名前を含むプロジェクトを作るとビルドエラーになってハマるので注意。

## ビルド
-pオプション無しだとどのプラットフォームで起動するか聞かれる

```bash
titanium build -p ios
```

iosはデフォルトだと3.5inch iPhoneでシミュレータが起動するので、4inchにするには以下。

```bash
titanium build -p ios --retina --tall --sim-64bit
```

`--retina`でRetinaディスプレイ、`--tall`で4inchディスプレイ、`--sim-64bit`で64bit環境で起動する。

## Alloyフレームワーク
`alloy new`でプロジェクトにAlloyフレームワークを適用する
２回以上同じコードが呼ばれてしまう時の対処法

WebViewなどでディバイスの戻るボタンを押すとコードで指定していないのにもかかわらずgoBack()が何回も呼ばれてしまうことがありました。この時は一回目が呼ばれてから二回目が呼び出されるまでの間の時間を指定してあげると二回目からは呼ばれなくなります。

人間が使っていれば0.00数秒以内に何回も同じところが呼び出されることはまずないので、500ミリセカンド(適度に短い時間)以内に再び呼ばれたコードは読み込まないように指定してあげると解決しそうです。

<pre>static long FirstClick;
WebView webview;


@Override
    public void onBackPressed(){
    	if(FirstClick + 500 > System.currentTimeMillis()){
    		//500ミリセカンド以内に二回呼ばれている
    	}else{
                //一回目もしくは時間を開けてもう一度押されている
    		webview.goBack();
    		FirstClick = System.currentTimeMillis();
    		return;
    	}
    	super.onBackPressed();
    }
</pre>

FirstClickはelse節の最後で指定されるまでは初期値の０なので、一度目に呼ばれた時のif(FirstClick + 500 > System.currentTimeMillis())内は必ずfalseになります。二回目は(500(millisecond)>10:00:00:01-10:00:00:00)といったような形で計算されるのでもし間隔が十分になかった場合は何も起動しません。
クラス間での値の受け渡し時に気をつけることgetExtra(), putExtra()

他クラスに値を渡すときはputExtra()やgetIntent().getExtra()を使いますが、putされていない状態でgetした場合はgetExtra()の中身はnullになります。

ネット上で調べていると
<pre>if(getIntent().getStringExtra(“example").isEmpty()){
ーーーーーー
}else{　　
ーーーーーー
}</pre>
と書かれたコードを何個か見かけましたが、このコードが出てくる以前にputExtra(“example”)が呼ばれてない時の値は0ではなくnullになるはずですのでこれだとクラッシュします。

よって

<pre>
String home = getIntent().getStringExtra("home");
if (home != null) {// 定義されている
		ーーーーー
		} else {//まだ定義されていない
		ーーーーー
		}
</pre>
とすれば定義されていないStringをif内で扱う時もクラッシュしません。
現在開いているタブボタンを押した時にアクションを起こす方法

現在押しているタブをもう一度押すとWebViewにgoBack()が働くというものを簡単に作ってみます。

まずタブとTouchListenerをonCreate内で作ります。
<pre>TabHost tabHost = getTabHost();
TabSpec firstTab = tabHost.newTabSpec("First")
　　　　　　　　　　　　　　.setIndicator(chatTab1)
　　　　　　　　　　　　　　.setContent(R.id.first_content);
tabHost.addTab(firstTab);</pre>


<pre>
View v1 = getTabWidget().getChildAt(0);
		v1.setOnTouchListener(this);
</pre>

getChildAt()を活用して作成したタブのViewを作り、setOnTouchListener(this)でタブを押した時に起こす動作を指定します。

しかしこのままだと他のタブから移ってきた最初のタッチでも呼ばれてしまうので、onTouch内で詳細を指定してあげる必要があります。

ここでは、すでにgoback()したいwebviewが開かれているか、そしてそのwebviewがgoBack()可能かどうかで振り分けをしています。

<pre>
WebView webview;
@Override
	public boolean onTouch(View v, MotionEvent event) {
if (webview.isShown() && webview.canGoBack()) {
				view.goBack();
			}
        return false;
}</pre>

タブが何個もある場合はgetChildAt(1)のViewを同様に作成し、if節の終わりに
<pre>else if(webview2.isShown&&webview2.canGoBack())</pre>
と付け足してあげると同じアクションを簡単に他のタブにも活用できます。
Titanium StudioでInvalid Passwordと言われてアップデートできないときの対処法

## エラー内容
Titanium Studioの起動時、アップデートしろと言われたのでインストールしようとしたところ、正しいパスワードを入れてもInvalid Passwordと言われてアップデートできない。
3回やるとエラーは出ずインストールできたように見えるが、実際はできていないので、再起動した時にまたアップデートしろと言われることになる。

## 解決策
Homebrewをインストールしnode.jsを入れてあげれば解決する。Macで開発しているならHomebrewはだいたい入っているから、インストールされていない環境では意外と盲点。

## 手順
ターミナルアプリから、

```bash
ruby -e "$(curl -fsSL https://raw.github.com/Homebrew/homebrew/go/install)"
```

と入力し、指示に従ってパスワードを入れて[Homebrew](http://brew.sh/index_ja.html)をインストールする。

その後、

```bash
brew update && brew install node
```

と入力して[node.js](http://nodejs.org/)をインストールする。

Titanium Studioを起動してアップデートした後もう一度アップデートを確認し、アップデートがなければインストール完了。

直らなければさらに、

```bash
npm install -g titanium alloy
```

と入力して、必要なものを手動でインストールする。

## 参考
- [[Mac OS X] Can't install Titanium CLI & Alloy - Invalid Password » Community Questions & Answers » Appcelerator Developer Center](https://developer.appcelerator.com/question/145775/mac-os-x-cant-install-titanium-cli--alloy---invalid-password)
アプリのスクリーン固定が出来ない時の対処法

<pre>
android:screenOrientation=“portrait”
</pre>
をAndroid ManifestのActivityに入れておけば、開いているアプリのスクリーン縦固定が出来るようなのですが、なぜか効かずに、傾けたら横向きになってしま時は、その下にもう一ライン

<pre>
 android:configChanges=“orientation"
</pre>
と入れてあげると縦向き固定されます。



またAndroid Manifestのapplication内で上記のコードを書いてもアプリ全体を通してスクリーン固定が有効になるわけではないので、一つ一つのActivityで指定してあげる必要がありそうです。
新しいプロジェクトを作る時に気をつけること

Eclipseで新しいプロジェクトの名前を決めると、パッケージネームは自然にcom.exampleの後にプロジェクト名をつけたものになります。しかしアプリをGoogle Marketに公開する時に”com.example”で始まるアプリはリジェクトされてしまうので、リリースする可能性のあるアプリは”example”の部分を消して名"com.ProjectName"と設定してから始めたほうがいいです。


プロジェクトを作る一番最初の一歩で三秒かけておけば、リリース前に三十分かけて名前を修正する必要がなくなるので効率的です。
erlangで三項演算子を使いたい

# erlangで三項演算子を使いたい
## 三項演算子
```c:test.c
printf("%s\n", age == 20 ? "二十歳だよ" : "二十歳じゃないよ");    
```
言わずと知れたFlagの条件によって代入する値を変えたい場合に使える便利な奴。

## erlangで三項演算子を再現する
erlangで同様の事をしようとすると、

```erlang
Hoge = case Flag of 
              true -> TValue;
              false -> FValue
       end.
```
と書けば良い訳だが、頻出すると縦に長くなって見づらい。case文を横長に書くと今度は見づらい。

ということで、三項演算子を代替できる物を作りたい、というのが本題。

### guard/caseを使う
```erlang:cond.erl
-module(cond).
-compile(export_all).

cond_guard(true, Value, _) -> Value;
cond_guard(false, _, Value) -> Value.

cond_case(Flag, TValue, FValue) ->
    case Flag of
          true -> TValue;
          false-> FValue
    end.
```
と書けば良いように思うが、これでは問題が発生する。

```erl
1> c(cond).
{ok, cond}
2> cond:cond_guard(true, true, error(false)).
** exception error: false
3> cond:cond_case(true, true, error(false)).
** exception error: false
```
つまり、先に引数に入れた関数が評価されてしまう為、三項演算子を再現することができない……orz
（引数に関数入れなければいいのですが）

## 結論：マクロを使おう
```erlang:cond.hrl
-define(COND(Flag, TValue, FValue),
        case Flag of true -> TValue; false -> FValue end).
```

```erlang:hoge.erl
-include("cond.hrl").

hoge(X) -> ?COND(X, true, error(false)).
```

```erl
1> c(hoge).
{ok, hoge}
2> hoge:hoge(true).
true
3> hoge:hoge(false).
** exception error: false
```

まぁ、結局のところマクロを使うとそれはそれで不便な事もあるので難しいが、マクロと関数の使い分けの良い例が見つかったと言うことで。。。
Sass3.3のためのアルファ版Compass導入でつまづいたけど解決


Sass3.3の新機能を使うためにはアルファ版のCompassが必要のよう。

```
$ gem install sass
$ gem install compass --pre
```

しかしCompassインストールでエラー……。

```
ERROR:  Error installing compass:
	ERROR: Failed to build gem native extension.

    /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/ruby extconf.rb
mkmf.rb can't find header files for ruby at /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/include/ruby.h

extconf failed, exit code 1
```

下記を参考にしたら行けました。
ありがとうございます。

[MavericksでC拡張を含むgemをインストールできない場合の対処法](http://qiita.com/yuku_t/items/30015dba2b6497b80074)

```
$ gem install compass --pre
```


バージョンは以下です。

```
$ sass -v
Sass 3.3.10 (Maptastic Maple)

$ compass -v
Compass 1.0.0.alpha.21
Copyright (c) 2008-2014 Chris Eppstein
Released under the MIT License.
Compass is charityware.
Please make a tax deductable donation for a worthy cause: http://umdf.org/compass
```

BEM記法で便利な `&` は、RC版ではインターポレーションが必要でしたが、現在のバージョンでは

```Sass
.block {

  &__element {
    font-size: 10px;

    &_key-value {
      font-size: 12px;
    }
  }
}
```

これで

```css
.block__element {
  font-size: 10px;
}
.block__element_key-value {
  font-size: 12px;
}
```

こういけます。
**Source Map** なんかも便利ですね。
Furlでファイルを進捗ダウンロードする

なんか適当に転がってたソースから拾ってしたので
どっかのサイトの丸パクリだったら…

![AA.jpg](https://qiita-image-store.s3.amazonaws.com/0/33674/827b93cf-8e83-18f0-ba5e-f0175555b3e2.jpeg)

timeoutはデフォルトで10秒なのである程度伸ばしてやる必要があります。

```pl
#!/usr/bin/perl
use strict;
use warnings;
use Furl;
use File::Basename;

my $url  = "http://ftp.riken.jp/Linux/centos/7/isos/x86_64/CentOS-7.0-1406-x86_64-NetInstall.iso";
my $file = basename $url;

open my $wfh, ">:raw", $file;
my $f = Furl->new( timeout => 3600 );
my %special_headers = ('content-length' => undef);
my $res = $f->request(
  method => 'GET',
  url    => $url,
  special_headers => \%special_headers,
  write_code => sub {
    my($status, $message, $headers, $chunk) = @_;
    print $wfh $chunk;
    my $size = tell $wfh;
    if(my $total = $special_headers{'content-length'}) {
      printf "%d/%d %d\n", $size, $total, $size*100/$total;
    }
  }
);

close $wfh;
my $s = $res->status_line;
print "$s\n";
print "end!\n";

__END__
379564800/379584512 99
379575040/379584512 99
379579072/379584512 99
379584512/379584512 100
200 OK
end!
```

# 参考
* [Furl - 軽量で速い URL fetcher - perldoc.jp](http://perldoc.jp/docs/modules/Furl-3.00/lib/Furl.pod#FAQ)
* [Furl::HTTP - Furlの低レベルのインターフェース - perldoc.jp](http://perldoc.jp/docs/modules/Furl-3.00/lib/Furl/HTTP.pod)
jQueryで設定されたクリックイベントなどを定義している場所を調べる方法

Chromeなどのモダンブラウザであれば、デベロッパーツールがあってJavaScriptのデバッグなどもそこで容易にできる。例えば、なんかのボタンにJavaScriptでクリックイベントを設定している場合、なにが設定されているかの確認もサクッとできる。

## デベロッパーツールで、イベントの中身を確認

```html
<div id="click1">click1</div>

<script>
var click1 = document.getElementById('click1');

click1.addEventListener('click', function() {
    console.log('click1');
});
</script>
```


- <kbd>Command</kbd> + <kbd>Option</kbd> + <kbd>i</kbd> のショートカットで起動
- 調べたい要素を選択し、右側のパネル「Event Listeners」を選択する
- 右端のフィルタっぽいアイコンを選択してSelected Node Onlyを選択すると、邪魔な要素がなくなって楽

![chrome1.png](https://qiita-image-store.s3.amazonaws.com/0/2152/d175f82e-611b-2170-145b-08d165c61356.png "chrome1.png")

- clickイベントの中をドリルダウンしていくと、handlerの中に関数が確認できる

![chrome2.png](https://qiita-image-store.s3.amazonaws.com/0/2152/3f3f241b-3a41-f5bd-2a7a-30394d7cd196.png "chrome2.png")

ほうほう、`console.log('b')`ね…と。

## jQueryの場合…見られない

jQueryを使わないイベントの場合は、これで簡単に中身が確認できるが、jQueryはそう簡単には行かない。イベントリスナーを内部で処理しているため、DOMのイベントリスナーには入ってこない。

```html
<div id="click1">click1</div>

<script>
jQuery('#click1').click(function() {
    console.log('click1');
});
</script>
```

![chrome3.png](https://qiita-image-store.s3.amazonaws.com/0/2152/30308b14-bd3f-f99a-b05a-5a63ad2a6596.png "chrome3.png")

確かに、なんかのイベントがある…しかしjQueryだ…。

### コンソールから、中身を確認する

Consoleタブを選択して、コンソールを表示、下記コードを入力。

```js
$._data($("#click1").get(0), "events");
```

![chrome4.png](https://qiita-image-store.s3.amazonaws.com/0/2152/4b91b3b6-cc1a-ee28-9b8e-1e3b33437441.png "chrome4.png")

すると、先ほどのEvent Listenersに表示されていたような感じに。設定されているイベントの数だけでてくるので、その中の hander: function()...の部分を右クリックして Show Function Definition を選択すると、該当のコードまでジャンプできる。

![chrome5.png](https://qiita-image-store.s3.amazonaws.com/0/2152/caed00c4-0e67-1aa0-0ee9-adca4f2a9fe2.png "chrome5.png")

これで幸せになれる。
随筆: 純粋さによって俺たちが失ふもの

[関数型プログラミングとオブジェクト指向の抜き差しならない関係について整理して考える](http://qiita.com/kenokabe/items/13ea8d2da6adce1b3b9a)を眺めてゐて思ったことをつらつらと。常体と敬体が混ざってるやうな酷い駄文ですよ。

あ、題名に「失ふもの」とか書いたけどそもそも本質的に失ふものなんてないです (我ながら酷い釣りだ)。どうせどの言語もチューリング完全である限り出来ることは変はらない。言語によって違ふのは、同じ問題を解くためのプログラムの書きやすさだけ。でも、その書きやすさが「現実的にプログラムとして書けるかどうか」という問題に繋がるから、みんな言語設計やパラダイムについて語るんですよね。

# 副作用と IO モナドの話

純粋関数型言語マンセーの人はその純粋さ (参照透過性が保証され、副作用のある演算ができないこと) こそが利点であるとことさら強調します。それは、全てのものを抽象的概念としてモデル化する数学・論理学の問題を解くには確かに適してゐませう。しかし、純粋さがどんな問題に対しても利点として働くとは私には思はれないのです。

例へば Haskell でファイルの読み書きをしようと思ったら IO モナドとかいふ不思議な型が出てきます。命令型プログラミング言語しかやってこなかった人は大概一度は「なんやこれ」となります。で、IO モナドを理解している人が必死に「副作用を持つ操作を IO モナドといふ値に隠蔽することで純粋さが保たれるのだ」などと説明してくれるわけです。といっても一回説明されただけで理解できる人は少なく、多くの人は同じ様な説明を何度も聞いたり IO モナドを扱ふプログラムを曲がりなりにも書いてみたりしながらゆっくりと IO モナドの意義を理解してゆく。

でも命令型言語だったらファイルの読み書きなんてもっと簡単に書けるのです。C 言語だったら fopen 関数でファイルを開いて fwrite 関数で書き込んで fclose 関数で閉ぢるだけ。ただそれだけ。

何で Haskell で IO モナドをいふものをいちいち捏ね繰り回さないといけないのかといふと、それが純粋な関数型言語だから、つまり副作用を捨ててしまったから。ところが、ファイルの読み書きといふのはそれ自体が定義により副作用を持つ操作なのです。副作用が書けない言語なのに、副作用のある操作を書かなくちゃいけない。だから仕方なく副作用を IO モナドといふものにモデル化して副作用をプログラムできたことにしてゐるわけ。

# オブザーバーパターンの話

オブザーバーパターンみたいなのも純粋関数型言語でそのままやらうとすると死にさうになりますよ。「監視されるオブジェクトが持ってゐるデータが変化する」とか「監視者 (オブザーバー) を登録したり削除したりする」とか副作用だらけですからね。例の記事だとこれに代はるものとして functional reactive programming (FRP) の話が出てきますけど、あれは副作用を持つ部分をライブラリや言語処理系に押し付けて隠蔽してゐるだけ。自分が書く部分のコードには副作用は無いけど、水面下ではバリバリ副作用が発生してゐるのです。

ぢゃあそのライブラリや処理系をどの言語で書くのかって話ですよね。別に同じ言語で書いてもいいだらうけど、純粋関数型言語だったら純粋さがアダになりさう。副作用を扱ふ部分はそれに長けた言語で書きたい。

# マルチパラダイム言語の意義

最近「マルチパラダイム言語」ってのが流行ってるらしいぢゃないですか。ああいふのって、かういふライブラリを書く際に便利さうですよね。

別の言語でライブラリを書くと、プログラムを結合させるのが面倒なんで。C と C++ くらゐなら楽だけど、C と Java とか JNI でくっつけるの面倒だし、そもそも JavaScript みたいに別の言語と全然混ぜられない言語もあるし。なるべくライブラリも同じ言語で書きたい。

で、ライブラリ部分は副作用をバリバリ使ふコードを書き、その上で FRP するときは副作用を使はずに純粋関数型言語として書きたい。一つの言語が、「副作用を許す命令型パラダイム」と「クロージャを第一級オブジェクトとして使へる関数型パラダイム」の両方を備へてゐれば、それができる。

って考へると、副作用を許さない純粋関数型言語って微妙だなと思ったのでした。

でも、これが上手く行くには、どの部分でどのパラダイムを使ふかをプログラマがきちんと整理できないといけなさうですね。そこら辺が課題になってくるのかなぁ。
Ubuntu14.04をMacBookPro11.1に入れる

#はじめに
ubuntu14.04をMacBookPro 11.1に入れた

今のところ、サスペンドは動作する。
モニタの明るさ調整やら、キーボードの機能も機能する。
wifiに関しては、サスペンドから復旧した後、二回に一度機能しなくなる。
解像度に関しては2560*1600までサポートしているが、画面が小さすぎて辛いので少し下げている。
スピーカーも動作している。
タッチパッドはさすがになめらかには動かないけど十分動く。

不満はないです
#各手順

基本的には
https://help.ubuntu.com/community/MacBookPro11-1/Saucy
を参考にしたけど、Wifi関係は検索かけて適当にした。

インストールに必要なのは、MacBookPro本体と、USB。
USBには事前に、ubuntu14.04 mac64bit版のLiveUSBを作成しておく。

それから、Wifiの項で説明している

```
bcmwl-kernel-source
dkms
libc6-dev
linux-libc-dev
```

をUSBに入れておいたほうがいい。

##Install 

とりあえずUbuntu側でUbuntuのLiveUSBを作成する。
isoはubuntu14.04 mac64bit版。

作成したUSBを使ってmacbook proにまるごとubuntuをinstallする。
USBを挿した状態で、ALT押しながら起動、その後USBを選択すればいい。

デュアルブートとかはやってないので、各自調べてください。

で、特に問題なくインストールできる。

## Wifi

はじめ、wifiのドライバが動作しない/存在しない場合がある。
その場合、ちと面倒だが外部から、必要なファイルをUSB経由で持ってくるか、
有線LANを接続する必要がある。

USB経由の場合は以下の手順でOK

以下のURLで必要な.debファイルを寄せ集める
http://packages.ubuntu.com/

検索して、それぞれの.debを取ってくる

    bcmwl-kernel-source
    dkms
    libc6-dev
    linux-libc-dev

それぞれを任意のディレクトリにまとめて実行

```{bash}
sudo dpkg -i *.deb
```

## SSD
止まっちゃったりするらしいのでそれ修正

```{bash}
sudo vi /etc/default/grub

#libata.force=noncqを追加
GRUB_CMDLINE_LINUX="libata.force=noncq"

sudo update-grub
```

##fnキー

Fnキーを押さないとF1-12が動かないので
Function無しで押せるよう変更する

```{bash}
sudo vi /etc/modprobe.d/hid-apple.conf

#追記する
options hid-apple fnmode=2
```

---

これでだいたい動くと思うんで。
というかwifi繋がった時点でもうまともに動いてるんで、
特に困ることもないと思います。