OmniAICreator/Qiita-1.07M huggingface dataset:
iOSのお手軽な通信デバッグライブラリnetfoxを使って見る

![image](https://qiita-image-store.s3.amazonaws.com/0/50827/70888fd7-45eb-c6b7-c2ad-9dbf4ddf5e89.png)

少し前の[iOS Dev Weekly](https://iosdevweekly.com/)で紹介されていた`netfox`というiOS軽量ネットワークデバッグライブラリが少し気になっていたのでイジってみました

https://github.com/kasketis/netfox

# iOS開発における定番のネットワークキャプチャリングツール

## Charles

https://www.charlesproxy.com/

- Mac本体をプロキシサーバとして経由してキャプチャする
- 設定が手間（iPhoneのプロキシの設定を戻すのを忘れるってあるある？）
- コードを書く必要はない
- よって他社サービスの通信もキャプチャできる

## WireShark

https://www.wireshark.org/

- `RemoteVirtualInterface(RVI)`を用いてキャプチャする
- 設定が手間
- コードを書く必要はない
- よって他社サービスの通信もキャプチャできる

## PonyDebugger

https://github.com/square/PonyDebugger

- ローカルにゲートウェイとなるwebサーバをたててそこでキャプチャする
- 設定が多少手間
- 表示が`Chrome`の`DevTool`なのでそれに慣れてる人には見やすい
- コードに書く必要あり
- よって他社サービスの通信はキャプチャできない

上記３つの比較で気になるところ、また他のキャプチャリングツールで「これ忘れちゃダメでしょ」というのがあればコメントいただけると幸いです

# netfoxとは

さきほどの`Charles`などと比較すると、以下のような特徴が挙げられると思います

- アプリケーション内でnetfox専用のモーダルを表示して、そこでキャプチャリングの情報を確認する
- よって設定は楽（なにかを経由してとかではないので）
- コードに書く必要あり
- よって他社サービスの通信はキャプチャできない

ということなので用途としては限られているかもしれませんが、「実機で（特に屋外で）動作検証・ドッグフーディングを行っているとき」に、

- アプリケーション側の表示が正しくないので、レスポンスをみてみて問題を切り分ける
- レスポンスタイムが気になったので、実際にかかっている時間をみてみる

などがあるかなと個人的には考えています。
（ログを転送する機能も提供されているのですが、手段としてはメールのみになります）

# インストール（CocoaPods）

```Podfile
pod 'netfox'
```

で

```
pod install
```

（`Carthage`でのインストール方法はここでは省略します）

# 使い方

```swift:AppDelegate.swift
import netfox

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {

  NFX.sharedInstance().start()

}
```

これだけでOKです。あとはアプリケーションを起動して「シェイク」ジェスチャをすると、以下のようなビューが表示されます

<img width="414" alt="写真 2015-12-22 22 21 39.png" src="https://qiita-image-store.s3.amazonaws.com/0/50827/0681179a-7145-be27-d937-35338060527a.png">

他にも、

<img width="414" alt="写真 2015-12-22 22 22 04.png" src="https://qiita-image-store.s3.amazonaws.com/0/50827/d6c0b839-59d6-37f9-159a-28d72c56aeb4.png">

<img width="414" alt="写真 2015-12-22 22 22 15.png" src="https://qiita-image-store.s3.amazonaws.com/0/50827/1c8c188e-e771-cf5d-d86f-6bd53ea82aa5.png">

など、`README.md`の[overview](https://github.com/kasketis/netfox#overview)をみたほうがわかりやすいかもしれませんが、

- 通信リスト
- 通信詳細（`Info`, `Request`, `Response`）
- 設定
- アプリ自体の情報
- 通信の総スタッツ

といった内容を確認することができます

# シェイクなんて使いたくない

「シェイクジェスチャでデバッグビューが表示されるってなんかイケてないなぁ」という人もいるかと思います。
そこは一応カスタマイズできて、

```
NFX.sharedInstance().start()
NFX.sharedInstance().setGesture(.custom)
```

としておいて、あとは任意のタイミングで以下の処理を実行すると、デバッグビューが表示されます

```
NFX.sharedInstance().show()
```

ただしデバッグビューからの戻り方がわからず（なにか使い方勘違いしているのかも？）、[質問](https://github.com/kasketis/netfox/pull/41)しているところです

# 他

まだつくられて日の浅いライブラリなので今後どのようになっていくかは気になるところですが、

https://github.com/kasketis/netfox/issues/28

のissueで次バージョンの要望など受け付けているようです。気になった方は是非!

# 参考

http://qiita.com/usagimaru/items/d340e87da98e62f99b60
http://wonderpla.net/blog/engineer/Wireshark_iPhone/
http://qiita.com/susieyy/items/5419068c52f4f4e21b8b

# 最後に

よいクリスマスを :santa:
【解決】realm.writeでの謎挙動

writeは全然関係なくて、filterの使い方が悪かった。

# 環境

- RealmSwift 0.97.0
- Realm 0.97.0
- Xcode 7.2
- iOS 8.1のシミュレータ
- iOS 9.2の実機(iPhone 6s)

# ダメなコード

```swift
import Foundation
import RealmSwift

final class Record: Object {
  dynamic var id = ""
  dynamic var updatedAt: Double = 0.0
  
  override static func primaryKey() -> String? {
    return "id"
  }
}

func test() {
  guard let realm = try? Realm() else { return }

  let items = Array(0..<100).map { "\($0)" }
  
  try! realm.write {
    let timestamp = NSDate().timeIntervalSince1970
    
    items.forEach { item in
      let record = Record()
      record.id = item
      record.updatedAt = timestamp
      
      realm.add(record, update: true)
    }
    
    realm.refresh()
    
    let results = realm.objects(Record).filter("updatedAt < \(timestamp)")
    print("==========")
    print("\(results.first?.updatedAt < timestamp)") // trueのはず
    print(results.count) // 0以外にはならないはず
  }
}
```

という感じのコードで、`test()`を何度か実行してみたところ

```
==========
false
100
==========
false
100
==========
false
100
==========
true
0
==========
false
100
==========
false
100
==========
true
0
==========
true
0
==========
false
100
==========
true
0
```

こんな感じでちぐはぐな感じに…。

うーん。なんだろう。

# forの中でwriteしてみてもダメだった

```swift
final class Record: Object {
  dynamic var id = ""
  dynamic var updatedAt: Double = 0.0
  
  override static func primaryKey() -> String? {
    return "id"
  }
}

func test() {
  guard let realm = try? Realm() else { return }

  let items = Array(0..<100).map { "\($0)" }
  
  let timestamp = NSDate().timeIntervalSince1970
  items.forEach { item in
    try! realm.write {
      let record = Record()
      record.id = item
      record.updatedAt = timestamp

      realm.add(record, update: true)
    }
  }
  
  realm.refresh()
  
  let results = realm.objects(Record).filter("updatedAt < \(timestamp)")
  print("==========")
  print("\(results.first?.updatedAt < timestamp)") // trueのはず
  print(results.count) // 0以外にはならないはず
}
```

```
==========
true
0
==========
true
0
==========
false
100
==========
true
0
==========
true
0
==========
false
100
==========
true
0
==========
true
0
==========
true
0
==========
false
100
```

# 動いたコード

```swift
func doSomething() {
  guard let realm = try? Realm() else { return }
  
  let items = Array(0..<100).map { "\($0)" }
  
  let timestamp = NSDate().timeIntervalSince1970
  items.forEach { item in
    try! realm.write {
      let record = Record()
      record.id = item
      record.updatedAt = timestamp
      
      realm.add(record, update: true)
    }
  }
  
  realm.refresh()
  
  let results = realm.objects(Record).filter("updatedAt < %lf", timestamp)
  print("==========")
  print("\(results.first?.updatedAt < timestamp)") // trueのはず
  print(results.count) // 0以外にはならないはず
}
```

という感じで、文字列に埋め込むのを辞めたらうまくいった。
brew cask list ＋バージョン表示（Ruby版）

こんにちは。
「[brew cask list ＋バージョン表示 ](http://qiita.com/kkdd/items/a4e75e95d0445499e3c6)」について、今度は Ruby で書き、未インストールの最新バージョンがあれば出力を付加しました[^1]。

```console
$ ./brew_cask_list.rb
gimp               2.8.14 (< 2.8.16-x86_64)
mactex             20150613
```

```brew_cask_list.rb
#!/usr/bin/ruby
cask_list = `brew cask list 2>&1`
ls_caskroom = "ls -C /opt/homebrew-cask/Caskroom/"
cask_list.each_line do |x|
    print_out = [].push(x.strip.ljust(18, " "), " ", `#{ls_caskroom + x}`.split.
join(" "))
    cask_info = `brew cask info #{x}`.split("\n")
    if cask_info.grep(/Not installed/) != [] && cask_info[0] !~ /:\slatest\z/ th
en
        print_out.push(" (< ", cask_info[0].split[1], ")")
    end
    puts print_out.join
end
```

------------
なお、ある cask をアップグレードしたい場合には、新規インストールと同じコマンドで行うので、上記の```gimp```の例で未インストールだった```2.8.16-x86_64```へのアップグレードは：

```console
$ brew cask install gimp
```

* その後、古いバージョンの```2.8.14```をアンインストールするには：

```console
$ rm -r /opt/homebrew-cask/Caskroom/gimp/2.8.14
```

* もし、```gimp```の全バージョンをアンインストールするには：

```
$ brew cask uninstall --force gimp
```
------------
[^1]: ただしバージョン番号を```latest```として扱っているcaskに対しては、本物の最新バージョン情報を得られません。
Json形式の文字列を自作クラスのListにする方法

もっと単純な方法があるかもしれないけどとりあえずこんな感じです↓
※要「Newtonsoft.Json」参照

```csharp
/// <summary>
/// 自作クラス
/// </summary>
public class MyClass
{
    public MyClass()
    { 
    }
    public MyClass(string name, string sex, string bType)
    {
        this.Name = name;
        this.Sex = sex;
        this.BloodType = bType;
    }
 
    public string Name { get; set; }
    public string Sex { get; set; }
    public string BloodType { get; set; }
}
 
/// <summary>
/// てすと
/// </summary>
public void test()
{
    List<MyClass> li = new List<MyClass>();
    li.Add(new MyClass("太郎", "M", "B"));
    li.Add(new MyClass("花小", "F", "A"));
    li.Add(new MyClass("あんぱん男", "M", "A"));
    li.Add(new MyClass("華麗犯男", "M", "B"));
    li.Add(new MyClass("努筋女", "F", "O"));
 
    // Json形式の文字列にする
    string json = JsonConvert.SerializeObject(li);
 
        List<MyClass> liD = new List<MyClass>();
 
    // Json形式の文字列をList型のコレクションに格納する
    liD = JsonConvert.DeserializeObject<List<MyClass>>(json);
}
```

Deserializeする際のクラスのメンバ名とJsonのメンバのプロパティ名が
一致していなければこの方法は使えないです。

逆に言うと一致させておけばこんな簡単にListにすることができるという感じです。
React.jsのメソッドが呼ばれる順番



```Javascript:
var Temp = React.createClass({

  getDefaultProps: function() {
    // コンポーネント１つにつき一度だけ呼ばれる
    console.log("getDefaultProps");
  },

  getInitialState: function() {
    // インスタンス作成のたびに呼ばれる
    console.log("getInitialState");
    return {temp: "EMPTY"};
  },

  componentWillMount: function() {
    // 描画が行われる直前に呼ばれる
    console.log("componentWillMount");
  },

  render: function() {
    // このメソッドにより仮想DOMが作成される
    console.log("render");
    return(
      <p className="temp">{this.props.temp}</p>
      );
  },

  componentDidMount: function() {
    // 描画が成功して、DOMにアクセス可能になる
    console.log("componentDidMount");
  },

  componentWillReceiveProps: function() {
    // プロパティ(props)が変更された時
    console.log("componentWillReceiveProps");
  },

  shouldComponentUpdate: function() {
    // propsが変更されてもコンポーネントに変更がない時はここでfalseを返すことで、あとの処理を飛ばすことができる
    console.log("shouldComponentUpdate");
    return true;
  },

  componentWillUpdate: function() {
    // 描画が行われる直前に呼ばれる
    console.log("componentWillUpdate");
  },

  componentDidUpdate: function() {
    // 描画が成功して、DOMにアクセス可能になる
    console.log("componentDidUpdate");
  },

  componentDidUnmount: function() {
    // コンポーネントが破棄される時に呼び出される
    console.log("componentDidUnmount");
  }

});

React.render(
  <Temp temp="メソッドの練習" />,
  document.getElementById('content')
  );

```
Running Swagger-editor behind a corporate proxy


## 経緯
swagger editorを社内サーバで起動しようとしたら、社内Proxyのせいで bower installが失敗。

## エラーログ
```bash
$ cd ~/swagger-editor
$ npm start
...省略...
bower ECONNRESET    Request to https://bower.herokuapp.com/packages/search/jquery failed: tunneling socket could not be established, cause=Parse Error
```

## ~/swagger-editor/.bowerrcを修正
修正前

```json
{
    "directory": "app/bower_components"
}
```

修正後

```json
{
    "directory": "app/bower_components",
    "registry": "http://bower.herokuapp.com",
    "proxy":"http://username:password@host:port",
    "https-proxy":"http://username:password@host:port"
}
```

## npm startを再実行
```bash
$ cd ~/swagger-editor
$ npm start
...省略...
Running "connect:dist:keepalive" (connect) task
Waiting forever...
Started connect web server on http://localhost:8080
```
Paperclipの脆弱性（CVE-2015-2963）

この記事は[脆弱性"&'<<>\ Advent Calendar 2015](http://www.adventar.org/calendars/811) 22日目の記事です。

ここでクイズです。下記の中身と拡張子が一致したファイルの中で画像なのはどれでしょう。ただし、判定がめんどいのでconvertコマンドでpngに変換できるファイルを画像とみなします。

1. data.bmp
2. data.svg
3. data.txt
4. data.html

答え : 全部画像。
convertコマンドの対応しているファイルフォーマットは[公式サイト](http://www.imagemagick.org/script/formats.php)に書かれていますが無駄に多く、avi,txt,htmlなども変換可能です。ただし、aviはffmpegが必要、htmlだとhtml2psが必要です。

さて、本題に移ってPaperclipの脆弱性（[CVE-2015-2963](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2015-2963)）について話をします。[Paperclip](https://github.com/thoughtbot/paperclip)とはRailsで画像アップローダーを簡単に作るためのライブラリで、今回の脆弱性を報告する前に実装されていたセキュリティ機構は主に下記の3つでした。

1. リクエストのパラメータが指定されたContentType（または拡張子）である事をチェック
2. fileコマンドで拡張子が偽装されてない事をチェック
3. サムネ用の画像などconvertコマンドで生成し、元ファイルと一緒に保存しDBに画像情報を書き込む

一見問題なさそうに見えますが、HTTPリクエストを直接生成してtxtファイルのContentTypeをimage/jpegにしてアップロードするとどうなるでしょう。1はContentType偽装ですり抜け、2は拡張子と中身が一致するのですり抜けます。3の変換で失敗するとロールバックされるため画像以外アップロード出来ないように見えますが、最初に書いたようにtxtファイルはconvertコマンドにとっては画像なのですり抜けます。
つまりチェックを全てすり抜けアップロードが成功し、オリジナルのtxtファイルをサーバに置くことができます。あまり無さそうですが、サーバにhtml2psが入っているとhtmlもアップロード可能で、元ファイルの拡張子がそのまま残るのでXSSも可能です。
修正後は2の所でファイル自体のContentTypeの検証も行うようになってました。

という訳で外部のシステムに頼る場合は、ドキュメントなどを読んで挙動を確認するか、自前でバリデーションを掛けておいた方が無難という話でした。
Vimメモ 複数行の一括編集

vim を使っていて、複数の行を一括で書き換えたいケースが出てきます。
たとえば、

```
1: DATA_1="aaa"
2: DATA_1="BBB"
3: DATA_2="CCC
4: VALUE_3="DDD"
5: VALUE_4="EEE"
```
というファイルがあったとします。
(先頭の 1: や 2: は行番号です)

2行目と3行目の先頭の DATA を VALUE に書き換えたい場合、

```
:2,3s/^DATA/VALUE/
```

とか書けばできますが、書き換えのエリアが広くなると、いちいち行番号をメモしておくのも面倒です。

そこで Vim のマーク機能を使うと便利です。

まず、変更を開始したい行へカーソルを移動し、`m[a-zA-Z]` と打ちます。
たとえば、a という名前のマークをつけるのであれば `ma` と打ちます。
これは表示されません。

次に変更を終了したい行へカーソルを移動し、

```
:'a,.s/^DATA/VALUE/
```

と入力すると、a とマークされた行 ('a) ～ ここ (.) までの行を変更することができます。

書き換えだけでなく削除 (d) やコピー (yank) などでも利用できます。
CrystalによるWebスクレイピング

この記事は[Crystal Advent Calendar 2015](http://www.adventar.org/calendars/800) 22日目の記事です。
当初は[@pine613](http://qiita.com/pine613)さんが書く場所だったのですが、
譲っていただきました。 ありがとうございます。

***

というわけで今回はCrystalを使ってWebスクレイピングしたいと思います。
RubyでWebスクレイピングをする際は[Nokogiri](http://www.nokogiri.org/)という非常に使いやすいライブラリを使用するのですが
CrystalにはまだNokogiriのようなすぐれたライブラリが存在しない(と思っている)ので
今回はxpathを使用します。

コードとしてはそれほど難しいことはしていません。
[Crystal Advent Calendar 2015](http://www.adventar.org/calendars/800)に接続して
日付、ブログ記載者、ブログタイトルそしてブログのURLを取得するというプログラムです。

```ruby:test.cr
require "xml"
require "http/client"

res = HTTP::Client.get "http://www.adventar.org/calendars/800"
xml = XML.parse_html(res.body)
# 毎日のカレンダーの情報のノードを取得
nodes = xml.xpath_nodes "//th[@class=\"mod-entryList-date\"]/parent::node()"

nodes.each{|node|
  puts "------------------"
  x = XML.parse_html(node.to_xml)
  puts x.xpath_node("//th").text # 日付
  puts x.xpath_node("//td[@class=\"mod-entryList-user\"]/a/span").text # 記者
  puts x.xpath_node("//div[@class=\"mod-entryList-title\"]").text # タイトル
  puts x.xpath_node("//div[@class=\"mod-entryList-url\"]/a")["href"] #URL
  puts "------------------"
}

```
ここで注意が必要なのは(当然なのだが)Crystalでxmlライブラリを使用する際は
コンパイルの際に幾つかのライブラリが必要となります。
ですので、ライブラリが存在しない場合は入れておく必要があります。

```
libssl
libxml2
libevent
librt
libpcl
libgc
libpthread
libdl
```

## コンパイルするとエラーになる
上記ライブラリが存在しないとコンパイルするときにエラーになります。
エラー内容は下記のような感じ。

```
Error: execution of command failed with code: 1: `cc -o "/home/.../crystal-run-test.tmp" "${@}"  -rdynamic  -lssl -lxml2 -levent -lrt -lpcl -lpcre -lgc -lpthread -ldl`
```

libgc.aはCrystalのライブラリディレクトリ(crystal/embedded/lib)に
存在するのですが、なぜか私の環境ではパスが通っていなかったため
コンパイルエラーになっていました。
なので必要に応じてパスを通します。

## CSSセレクタがほしい

やってみてわかったことですが、RubyのNokogiriはやはりかなり優れたライブラリです。
本当はCrystalでNokogiriのようなCSSセレクタを作成して
Webスクレイピングしたという記事を書きたかったのですが
今の段階でCSSセレクタを作るのが難しいので断念してしまいました。

というのも、Rubyでは標準として[Racc](https://github.com/tenderlove/racc)というLALRのパーサージェネレータが存在し、
Nokogiriでもそれを使用しています。
CrystalにはLALRパーサーがない(はずな)のでまずはそっちからかなと思っています。

## 冬休みの宿題

なので今年の冬休みの宿題は

* RaccのようなLALR(1)パースジェネレータを作成する
* NokogiriのようなCSSセレクタを作成する

***

では明日の[Crystal Advent Calendar 2015](http://www.adventar.org/calendars/800)は kmizu さんです。
よろしくお願いします。
iOSアプリのディレクトリに保存したファイルへのアクセス

# はじめに
はじめまして!!
今までiOS開発未経験でしたが、11月にアプリ開発をする企業に転職してきました。転職後1ヶ月半ほどObjective-Cの研修をした中で私がミスしたことを書いてみます。
iOS開発を始めたばかりの方が同じ問題にぶつかった際に参考になれば幸いです。

#本題はこっち
まず、私がやろうとしたことは次の1,2,3です。

---

1.URLからzipファイルを取得してアプリ内のディレクトリに保存
2.保存したzipファイルを解凍して、同じディレクトリに保存
3.解凍したファイルの中にあるxmlファイルをNSURLで指定して、NSXMLParserでparseする

---
1と2に関してはすぐに実装できました(^ω^)/
ですが、3の処理ができない(T^T)。。。

ということで、
**アプリ内のファイルをNSURLでpath指定してアクセスする**部分を書いていきます!!
（1と2に関しては今回は触れませんが、今度備忘録的なモノを残そうかなーと思っております。）

まずは、**しくじったコード**から。

```lang:FileAccess.m

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);

//アプリ内のDocumentsディレクトリのpath
NSString *documentDirectory = paths[0]; 

//Documentsディレクトリ内のhoge.xmlのpath
NSString* xmlFilePath = [documentDirectory stringByAppendingPathComponent:@"hoge.xml"];

NSURL* url = [NSURL URLWithString:documentDirectory];

NSXMLParser* parser = [[NSXMLParser alloc] initWithContentsOfURL:url];

```

はい、失敗です(-o-)
parseできませんでした。

間違っていた部分はここです↓↓

`NSURL* url = [NSURL URLWithString:documentDirectory];`

まさかこいつのせいだとは思いませんでした。
正しくは、こちら↓↓

`NSURL* url = [NSURL fileURLWithPath:xmlFilePath];`

うん、ちゃんと**fileURLWithPath:**って書いてあるやん(^^;)
NSURL Class Referenceさらっと読んでみましたが、詳細な内容やら補足が必要な場合はまた今度追記します。

#まとめ

ファイルにアクセスしたいときは

```
NSString* path = @"ファイルのパス";
NSURL* url = [NSURL URLWithString:path];

```

ではなく、

```

NSString* path = @"ファイルのパス";
NSURL* url = [NSURL fileURLWithPath:path];

```

でファイルのpathを指定してNSURLを生成する
ということでした(^ω^)

#最後に
今回、初めてQiiraに投稿しました。
iOS開発に関してまだまだ基礎の勉強中なので、誤りがありましたら、ご指摘下さい。
また、こうした方が良いよ。などアドバイス頂けたらとても嬉しいです。

ご覧いただきありがとうございました!!
use re '/flags'


@5.14 以降

PBP で正規表現には必ず、 `/msx` を付けましょう[^1]。などと言われてる訳だが、それを実現するプラグマの利用方法。
[^1]: 発売した頃には、このオプションは無かった訳で、、、


## 方法
```
use re '/msx' ;
```

これで終り。以降、全ての正規表現で `msx` 修飾子が有効になってる。

## 利用出来る修飾子

多分以下の修飾子

```
$ perldoc -m re | grep -A 12 '^my %reflags'  
my %reflags = (
    m => 1 << ($PMMOD_SHIFT + 0),
    s => 1 << ($PMMOD_SHIFT + 1),
    i => 1 << ($PMMOD_SHIFT + 2),
    x => 1 << ($PMMOD_SHIFT + 3),
    p => 1 << ($PMMOD_SHIFT + 4),
# special cases:
    d => 0,
    l => 1,
    u => 2,
    a => 3,
    aa => 4,
);
```


## 対象

態々書くまでもない事だけど、正規表現のみが対象。

例えば、置換 `s{}{}` の左辺 `s{}` では有効だけど、右辺 `{}` では無効だし、
`tr///` は元々対象外。

逆に、`split` では、本人が正規表現を与えてるつもりが無い時[^2]でも

[^2]: つか無知による行動だとしても

```
$ perl -Mre=/i -le 'print Dumper [ split "A", "yamadatarou" ]' -MData::Dumper
$VAR1 = [
          'y',
          'm',
          'd',
          't',
          'rou'
        ];
```

こんな風に効いてしまう。


- 正規表現修飾子風な、`s///e` の `e` とか、 `r` とかは使用出来ない。
また、正規表現の修飾子だとしても正規表現使用方法のフラグである、 `g` とかも使用出来ない。
- 当たり前だけど、`split /^/` による自動の複数行修飾子動作[^3]は、今回の flags による制御下には無い。

[^3]:  `/^/m`
PERL5OPT -M vs. コマンドラインスイッチ -M


\# PERL5OPT を設定してない人には無関係な話

>PERL5OPT
コマンドラインオプション(スイッチ)です。 この変数のスイッチは全ての Perl コマンドラインで指定されたかのように 扱われます。
[[引用元](http://perldoc.jp/docs/perl/5.20.1/perlrun.pod#ENVIRONMENT)]

>-mmodule はプログラムの実行前に use module (); を 実行します。
>
-Mmodule はプログラムの実行前に use module ; を実行します。 モジュール名の後ろに追加のコードを加えるためにクォートを使うこともできます; つまり '-MMODULE qw(foo bar)' などです。
[[引用元](http://perldoc.jp/docs/perl/5.20.1/perlrun.pod#Command32Switches)]


## 躓き

ことの始めは、自分の環境によって、

```
$ perl -Mwarnings -le 'sub h{ 1 } ; sub h { 2 }  ' -M-warnings=redefine 
```

の `no warnings qw(redefine) ` が効いたり効かなかったりした事より[^1]。

[^1]: この事自体は、 `PERL5OPT` をクリアしてたりしなかったりして、作業してたのが原因。


## 挙動

### PERL5OPT ON

```
$ PERL5OPT=-Mwarnings perl -Mwarnings -le 'sub h{ 1 } ; sub h { 2 }' -M-warnings=redefine           
Subroutine h redefined at -e line 1.                                                                                                                     
```

`no warnings qw(redefine)` が効かない。

### PERL5OPT OFF

```                                                              
$ PERL5OPT='' perl -Mwarnings -le 'sub h{ 1 } ; sub h { 2 }' -M-warnings=redefine 
```
`no warnings qw(redefine) ` が効く。



## 以下ぐだぐだ書いたのを全部消して

B::Deparse が（実質） no 出来ないのと、複数回与えれば、複数回 Deparse する事を利用して[^2]。

[^2]: なんで `PERL5OPT='-MO=Deparse -Mwarnings' perl -Mwarnings -le 'sub h{ 1 } ; sub h{ 2 }' -M-warnings=redefine` みたいなコードで検討してないかは、実行してみれば分る。

```
$ PERL5OPT=-M-O=Deparse perl -le 1 -MO=Deparse -MO=Deparse
BEGIN { $/ = "\n"; $\ = "\n"; }
use O (split(/,/, 'Deparse', 0));
no O (split(/,/, 'Deparse', 0));
'???';
（中略）
-e syntax OK
```

なるほど、`PERL5OPT` は、コマンドラインの後に呼ばれる事が明白。

## 結論

- `PERL5OPT` でなんらかのモジュールセットしてる人は、コマンドラインからフラグなどセットし直しても効きません。
- コマンドライン > `PERL5OPT` > スクリプト内の順に呼ばれてる模様。


### 後になって、先人の情報に気付く。

- [PERL5OPT -M processes after command line -M?](http://grokbase.com/t/perl/perl5-porters/08637sbzg6/perl5opt-m-processed-after-command-line-m)
エンジニアに優しいSketchの作り方


[Sketch 3 Advent Calendar 2015 - Qiita](http://qiita.com/advent-calendar/2015/sketch3)の22日目の記事です！

最近、アプリのデザインと言えばSketchを使っている方が多いんじゃないでしょうか。便利ですよね、Sketch。

自分は普段、主にAndroidのコードを書いているのですが、Sketchを使ってデザインすることもたまにあります。そんな自分が、開発するときはこんなSketchだとやりやすいな、と思ったことをまとめてみました！

※いつもAndroidばっかり書いているので、Android基準でお送りします！iPhone版、誰か！ｗ

# 見えないタップ範囲も明示的に作ろう

ボタンなどタップ範囲が明確なものはいいとして、文字だけで境目が不明瞭なものは、頭では分かっていても1枚画面のカンプや指示書を作るときに見落としがちなポイント。

例えば下のようなデザインのとき、このままレイアウトを作ろうとすると、タップ範囲がどれくらいか、さらには余白はどう取るべきか、が全然分かりません。

![stickersheet_general.png](https://qiita-image-store.s3.amazonaws.com/0/54/7d8f8a15-64d8-86ec-5283-e38591380a76.png "stickersheet_general.png")


あんまり考えずにレイアウトを作るとタップ範囲がすごく小さくなってしまったりします。
それを防ぐためには、Sketchで作る時、見えないタップ範囲を明示的に作っておきましょう。

![stickersheet_general.png](https://qiita-image-store.s3.amazonaws.com/0/54/bf4f6746-e368-4111-f32a-84f6fea61329.png "stickersheet_general.png")


こうすることで、指示書を作るにしても、レイアウトを実装するにしても、迷わず作業に入ることができます。

# 文字の折り返しや省略を意識しよう

ユーザーから送信されたテキストが入るような場所の場合、その場所に入るテキストは一定の長さにはならないのは当然のこと。

でも、画面デザインをするときは仮のテキストを入れるので、デザイン的に都合の良い長さで設定してしまいがちです。そうすると、いざ実装して本物のデータが入るとひどい時にはおもいっきりデザインが崩れてしまうこともしばしば。

![stickersheet_general.png](https://qiita-image-store.s3.amazonaws.com/0/54/a66cd314-c13e-fed2-ad2d-43569834b795.png "stickersheet_general.png")


そうならないために、Sketchでデザインを作る時に、そのテキストは改行するのか？省略するのか？しっかり意識して作りましょう。できれば仮のテキストを短いパターンと長いパターンの両方を用意してカンプを作るのがいいですね。

![stickersheet_general.png](https://qiita-image-store.s3.amazonaws.com/0/54/4350ed10-aaf3-c3ff-689a-19209bbfd6b7.png "stickersheet_general.png")


デザインがこうなってれば、エンジニアもレイアウトを実装する時に、隣り合う要素の余白や省略の処理を入れ忘れることがグッと減ります。

# 実装されるレイアウトを意識しよう

上の2つとも似たような話ではありますが、実装されるレイアウトを意識してSketchが作ってあると、エンジニアが考えなきゃいきないことをグッと減らすことができます。

百聞は一見に如かず。まずはこれを見てください。

![stickersheet_general.png](https://qiita-image-store.s3.amazonaws.com/0/54/b15871b3-52d8-ed98-9f35-36b0a0a64970.png "stickersheet_general.png")


さてこれを見て、テキストが長くなった時、隣のボタンとの余白をどうすれば良いでしょうか。デザインルールがあって、特に指示する必要がない状態でなければ、悩みどころです。

![stickersheet_general.png](https://qiita-image-store.s3.amazonaws.com/0/54/f7265df3-6d9d-e903-b34d-44b9cbf6bd75.png "stickersheet_general.png")


でもデザインがこのように作ってあれば一目瞭然。
レイアウトの実装を自分でしなくとも、レイアウトの仕組みを勉強して理解してデザインに臨むことで、エンジニアとのコミュニケーションもスマートになること間違いなしです。

# 番外編: Zepplinを使って楽しよう

さて、ここまでエンジニアに優しいSketchの作り方を紹介しましたが、作ったSketchはZepplinに上げてエンジニアに共有すれば、もっと優しくなれます！

Sketchで作った全てのオブジェクト間の余白サイズや色、フォントなど実装に必要な全ての情報はZepplinが提示してくれるので、デザイナーも楽、エンジニアも楽、な超便利サービスです。

![Zeplin.png](https://qiita-image-store.s3.amazonaws.com/0/54/ea89a52e-928f-d7a0-bfcb-71b0bdf2970c.png "Zeplin.png")
こんな感じ。素敵。

Sketchからのアップロードもプラグインで一発ですしね！まだ使ってない方は、是非使ってみることをおすすめします。1プロジェクトなら無料ですし！ステマじゃないよ！

![Zeplin.png](https://qiita-image-store.s3.amazonaws.com/0/54/bfb27135-6fbb-a5b0-0e78-c6a303359839.png "Zeplin.png")
[Zeplin](https://zeplin.io/)

それでは！
この年末p5.jsで書いたスケッチ何本か

# 勉強会
THE GUILD インタラクティブ・コーディング勉強会というのがあって、年末に2回ほどお邪魔してきました。会としてはProcessingを中心にやっている感じですが、自称Web系な私はp5.jsを使ってスケッチしてみました。

ちなみにfacebookに勉強会の[コミュニティ](https://www.facebook.com/groups/1478118689119745/)があります。

Qiitaの性質上、スケッチはGIFで貼ってありますが、クリックすればCodePen上で実際に動くものが見れます。

# スケッチ
## グリッド編
はじめて参加した回がグリッドがテーマでした。

### 3次元モノ
なんとなく3次元がやりたくて、3次元グリッドのドットを脈動させつつ、RGBそれぞれの光源をボックス内で直進・反射移動させています。

[![g07.gif](https://qiita-image-store.s3.amazonaws.com/0/12843/19be067a-9106-e5d0-a6c0-7702cbabf86b.gif)](http://codepen.io/toyoshim/pen/KdOvjb)

### 木漏れ日的なタイル
教科書的なスケッチ。各グリッドではQuadを描画してるだけですが、各頂点がマウスの位置に応じた乱雑度でずれて描画されます。薄い緑で加算合成する事で木漏れ日っぽい色合いを出しました。

[![g10.gif](https://qiita-image-store.s3.amazonaws.com/0/12843/54cb1d1c-ac02-195e-5a2e-289b106439e4.gif)](http://codepen.io/toyoshim/pen/ZbgrPO)

### PDP1時代からあったアレ
Snowflakeみたいなやつ。(x, y) = (At mod r) * (cos(Bt), sin(Bt))みたいな計算で次の頂点を決めつつ、残像を残しながらlineで繋いで描画してるだけです。AとBがマウスの位置に応じて変化する事で無限のバリエーションが楽しめます。適当にマウス動かして眺めているだけでも結構楽しい。

[![g11.gif](https://qiita-image-store.s3.amazonaws.com/0/12843/f234ac93-f692-452b-1028-2177b6235b0b.gif)](http://codepen.io/toyoshim/pen/adozYr)

## タイポ編
### GLSLでよくやるアレ
あまりネタが思い浮かばなかったのでグリッドと組み合わせて考えてみました。GLSLでよくやるサイン波でウネウネパタン。グリッドだとフラグメントシェーダと同じような考え方で絵が描けるので。

最初に文字コード0-255までの文字について描画して白/黒のドット比を求めて、それを元に文字の濃度から文字コードを求めるテーブルを作っています。あまり綺麗に分散しないので、同じ濃度の文字が多い部分にあたるとパーリンノイズを使って文字を選んでいます。パラメータ的にはグリッド座標+時間を引数にしているため、空間的、時間的に流されるようにパラパラと文字がかわります。

[![t03.gif](https://qiita-image-store.s3.amazonaws.com/0/12843/dbfdf2fc-555c-0bbb-23ef-0c26eea59498.gif)](http://codepen.io/toyoshim/pen/mVVrOx)

# おまけ
## CodePen Collection
今回紹介した物も含めて、勉強会で作った物をCodePen上で[Collection](http://codepen.io/collection/AKpOgv/)にしてみました。

## p5.jsについて気になった点
最近になって3Dもサポートしてきたのですが、まだ色々と変。例えばperspective計算とかあからさまに変で、nearとfarの判定が指定した値と一致していません。Processingのコードをそのまま持ってきて何も表示されなかったら、nearとfarを疑ってみるのが良いかも。

3Dモードだと動作しない機能も結構あります。例えばsaveCanvas()で正しく描画内容を取得できません。WebGLのコンテキストを作る際に{ preserveDrawingBuffer: false }を指定しているために描画結果を取得するのが難しいんですよね。GIF生成もライブラリ挟んでJavaScriptから直接生成しちゃおうかと思ったんですが、うまくいかなくて諦めました。良いアイデアあったら教えて下さい。

## CodePenについて気になった点
書いたコードがそのまま埋め込まれるのかと思っていたら、そうでもない模様。無限ループ防止対策がなされていて、重そうなforループにはチェックポイントコードが挿入されます。でまぁ、そこまでは良いのですが、このチェックポイントが場合によってはv8の最適化を妨害するようで。JIT最適化が走っては脱最適化して、またJITが……みたいな感じで、ちょっとしたコード変更で最内ループが突然糞コードに化けることがあります。自分がハマったケースだとMath.random(a)をMath.random(a+b)に変えた途端にframe rateが1/10になりました。自分のケースではMath.random()を使わずに事前に生成した乱数テーブルを引くようにしたら解決しました。もちろんaやbがローカルスコープにある、などJITを意識したJavaScriptコードにはなっていました。もう少し詳しく追っても良かったのですが、趣味でそっちを深追いしたくないので諦めました。
grapeバリデーションのエラーハンドリングの仕方


grapeでは、以下のように、パラメーターとして受け取る値に`type`を指定して、
あらかじめバリデーションをかけることができる。

```rb
params :sample_params do
   optional :locale, type: String, desc: 'locale'
   requires :auth_token, type: String, desc: 'auth_token'
   requires :age, type: Integer, desc: 'age'
   requires :data, type: Array[String], desc: 'data'
end
```

しかし、このバリデーションには意外な欠点があって、
例えば値が空な時に発火するよう自作した俺俺エラーがあったとしても、
それが`raise`する前にgrape validationのエラーが`raise`してしまう。
その為、grapeが発火させるエラーをいい感じで整形してレスポンスを返したい。

そんな時は、`resque_from`を使ってあげよう。

```rb
module API
  class ApiBase < Grape::API

    rescue_from Grape::Exceptions::ValidationErrors do |e|
      case JSON.parse(e.to_json)[0]["params"][0]
          when "auth_token"
            error!({
                  errors: [
                    {
                      message: I18n.t('errors.messages.invalid_auth_token'),
                      code: ErrorCodes::INVALID_TOKEN
                    }
                  ]
                },400)
          when "serial_number"
            error!({
                  errors: [
                    {
                      message: I18n.t('errors.messages.invalid_serial_number'),
                      code: ErrorCodes::SERIAL_PARAMS
                    }
                  ]
                },400)
      end
    end

    # 中略
   
   mount V2::Hoge
  end
end

```

エラーフォーマッターをうまく使えば解決できるのかもしれ無いけれど、
上記の方法で簡単に実装できたので良しとした。
ActionListenerでJavascriptをパラメータを指定して実行


# JSF+PrimefacesでActionListenerが終了後actionの前にJavascriptを実行するさらにサーバからパラメータをJavascriptに渡す方法


## はじめに
Primefacesを使わなくてもできるのですが、結構優れたUIを簡単に実装できるPrimefacesってのがあるので使っています。
（実際使うと諸問題あるんですけどね…しかも結構ドはまりする系の諸問題…まあそれ以上に便利なので使っています今のところ）

JSFは基本的にActionListener実行後にActionが実行されて画面遷移等出来るのですが、ListenerとActionの間にひと手間Javascriptを実行したいという時があります。
さらにその際にサーバからパラメータなんかも渡したかったり、というのがPrimefaces使ってると比較的楽ちんに実現出来ます。

例えば、ListenerでDBを更新し正常に終了したらダイアログを出したい　とか

## サンプルの構成
+ JSF+Primefaces
+ 画面側はxhtml（JavaScriptが記述）


## ざっくりやること
サーバ側のAxctionListenerで返却したフラグによって、ダイアログ（オブジェクト）を出したり隠したりする。


+ １．xhtmlにPrimefacesのcommandButtonを配置し、oncomplete属性にサーバから呼び出したいJavascriptを記述
+ ２．ActionListenerにJavascriptに渡すパラメータを記述

## やること詳細版

**xhtmlにcommandButtonを配置**

```html
<p:commandButton actionListener="#{sample.test1}"
							oncomplete="handleRequest(xhr, status, args);" 
                            action="#{sample.test2}"
                            />
```

**cncompleteで実行されるJavascriptを作成**

```javascript
function handleRequest(xhr, status, args) {

  if(args == null){return;}

  if(args.dialogShowFlag) {
      dlg.show();
    } else {
      dlg.hide();
    }
};
```
args.dialogShowFlagがtrueだったらdlg（dlgと名前つけたダイアログっぽいdivタグ）を表示する。falseだったら逆
後は、サーバからdialogShowFlagに値を返したい。


**サーバ側（ActionListener）でJavascriptにcallbackする**

```java
public class Sample {
    public void test1(ActionEvent actionEvent){
        RequestContext context = RequestContext.getCurrentInstance();
        boolean flag = true;
        context.addCallbackParam("dialogShowFlag", flag);
    }
```

こうすると、test1実行後に、JavascriptのhandleRequestが実行されargsにサーバで設定した値が格納されています。
argsは複数の値も指定できるので柔軟にJavascriptをかけます。


### 最後にPrimefacesを使用していなくても上記は出来るそうです。（実績ないけど）
http://kikutaro777.hatenablog.com/entry/2013/08/28/204743
php7 de phalconをいじり倒したかった


まずは、[公式ページ](http://phalcon-docs-ja.readthedocs.org/ja/latest/reference/install.html#linux-solaris)を見つつインストール

```
# dnf -y install --enablerepo=remi-php70 php php-devel pcre-devel gcc make
# cd /usr/local/src
# git clone --depth=1 git://github.com/phalcon/cphalcon.git
# cd cphalcon/build
# ./install.sh
```

インストールがうま・・・く行かない。

```
In file included from /usr/local/src/cphalcon/build/64bits/phalcon.zep.c:175:0:
/usr/local/src/cphalcon/build/64bits/phalcon.zep.h:433:8: エラー: 不明な型名 ‘zend_object_value’ です
 static zend_object_value zephir_init_properties_Phalcon_Mvc_Mode
```
調べてみたら↓

https://github.com/phalcon/cphalcon/issues/11203

```
Phalcon still don't support PHP7 so many compilation issues will appear...
```

phpのバージョン下げて頑張りまっす。
とりあえずBootstrap,Gulp,Sass,Jadeの設定をする

進化の早いフロントエンド。webpack,babel,ブラウゼリファイ・・・なんじゃそりゃ・・いつまでたっても終わらないググる作業 :innocent: 

とりあえず最新の環境じゃなくて良いので、Bootstrap、Sassを動かせて、自動でビルドする環境を構築したい。そう思って環境構築をしたときのメモ。フロントエンドの進化に取り残された筆者が書いているので、ベストな方法ではないと思います :poop: 

#Bower
```
bower init
bower install bootstrap-sass-official --save  
bower install fontawesome --save
bower install jquery --save
bower install jade-bootstrap --save
```

[jade-bootstrap](http://rajasegar.github.io/JADE-Bootstrap/index.html)

#npm
```
npm install gulp gulp-ruby-sass gulp-notify gulp-bower gulp-jade gulp-webserver gulp-load-plugins --save-dev
```

#ファイル構成
```
|-bower_components
|-node_modules
|-public
   |---css
   |---fonts
|-resources
   |---jade
   |---sass
|-bower.json
|-gulpfile.js
|-package.json
```

#Gulpfile,index.jade
Bootstrap + Gulp + Jade Setting
https://gist.github.com/naoyashiga/8a1f796ac5b936de1bef

#起動
```
gulp
```

・参考
http://ericlbarnes.com/setting-gulp-bower-bootstrap-sass-fontawesome/
atom(GitHubエディタ)が起動できない時の復旧方法

## 概要
あるとき急にatomが起動しなくなりました。cacheファイル的なものを削除したら直ったのでメモします。

## 環境
ZORIN OS 9 (ubuntu 14ベース)
 
## 復旧方法詳細
以下の場所に前回の設定値(ウィンドウの大きさや開いていたファイル名)が保存されています。ハッシュ値らしきものがファイル名に使用されていますが、なぜかファイルが2つ保存されていました。

```bash
$ cd ~/.atom/storage/
$ ls
application.json
editor-008e0408f8590b8f0dbaeeaa23a727ed80e45a2b
editor-20d503a8ac9d632781907148ee7cf96e1508326d
```
※ ファイル名はダミーです。

面倒なので `rm editor-*` で全て削除したら復旧しました。

## 反省点
片方だけ消せば復旧したような気がするのですが、慎重にやればよかったです。すいません。。。
ま、とりあえず治ったということで。。。
Gulp導入

# インストール
- node, npmがインストールされていることが前提

```bash:
sudo npm install gulp -g
```

# package.jsonの作成
作業ディレクトリに移動して、package.jsonを作成する

```bash:
npm init
```

# gulpのインストール
作業ディレクトリにて下記を実行(--save-devをつけるとpackage.jsonに追加してくれます)

```bash:
npm i gulp --save-dev
```

# タスクを実行してみる
gupfile.jsというファイルが実行ファイルになるので、作業ディレクトリに作成します

```javascript:gulpfile.js
var gulp = require('gulp');

gulp.task('hello', function() {
  console.log('hello gulp');
});
```

実行

```bash:
gulp hello
```

結果

```bash:
[18:47:14] Using gulpfile ~/practice/node_practice/gulp_01/gulpfile.js
[18:47:14] Starting 'hello'...
hello gulp
[18:47:14] Finished 'hello' after 89 μs
```

## デフォルトタスクを設定する
以下をgulpfile.jsに追記します

```javascript:gulpfile.js
gulp.task('default', ['hello']);
```

実行

```bash:
gulp
```

結果

```bash:
[18:47:57] Using gulpfile ~/practice/node_practice/gulp_01/gulpfile.js
[18:47:57] Starting 'hello'...
hello gulp
[18:47:57] Finished 'hello' after 80 μs
[18:47:57] Starting 'default'...
[18:47:57] Finished 'default' after 7.21 μs
```

# gulp.src(), gulp.dest()
単純にファイルをコピーするタスクを作ってみます

```javascript:gulpfile.js
gulp.task('copy', function() {
  // src/test.html を dist/ へコピーします
  gulp.src('./src/test.html')
    .pipe(gulp.dest('./dist'));
});
```

# タスクの順番を指定する
copyタスクの後にmessageタスクを実行したい場合は以下のように指定します

```javascript:gulpfile.js
var gulp = require('gulp');

gulp.task('copy', function() {
  return gulp.src('./src/test.html')
    .pipe(gulp.dest('./dist'));
});

// messageの前に実行したいcopyを第2引数に入れる
gulp.task('message', ['copy'], function() {
  console.log('copy done');
});

gulp.task('default', ['message']);
```
CakePHP2からCakePHP3になって変わったCallBack関数

# CakePHP2からCakePHP3になって変わったCallBack関数

CakePHP2から習慣になっているようにCallBack関数の中で **parent::関数名** を書いてみてエラーを起こして
皆様にはそういった不具合が起こらないようにこの記事を書きます。

## エラーが起こったコード
```
public function beforeFind()
{
    parent::beforeFind();
}
```

ええーなんぞやこれ！と思って原因を探してみたところ。

## CakePHP2の時には
```
//Cake/Model/Model.php
public function beforeFind($query)
{
	return true;
}
```
上記のように
Model.phpにCallBack関数が書いていたため**parent**が呼べる

## CakePHP3には
```
//src/ORM/Table.php

public function implementedEvents()
{
    $eventMap = [
        'Model.beforeMarshal' => 'beforeMarshal',
        'Model.beforeFind' => 'beforeFind',
        'Model.beforeSave' => 'beforeSave',
        'Model.afterSave' => 'afterSave',
        'Model.afterSaveCommit' => 'afterSaveCommit',
        'Model.beforeDelete' => 'beforeDelete',
        'Model.afterDelete' => 'afterDelete',
        'Model.afterDeleteCommit' => 'afterDeleteCommit',
        'Model.beforeRules' => 'beforeRules',
        'Model.afterRules' => 'afterRules',
    ];
    $events = [];

    foreach ($eventMap as $event => $method) {
        if (!method_exists($this, $method)) {
            continue;
        }
        $events[$event] = $method;
    }
    return $events;
}
```
上記のように
今のObjectにあるCallBack関数を探して$eventsに入れてreturnしています。
CakePHP2のように定義されていないので,

```
public function beforeFind()
{
}
```
普通に書いたら動く。

##ちなみに
CallBack関数全部がそういうわけではない。

```
//Cake/Controller/Controller.php

public function implementedEvents()
{
    return [
        'Controller.initialize' => 'beforeFilter',
        'Controller.beforeRender' => 'beforeRender',
        'Controller.beforeRedirect' => 'beforeRedirect',
        'Controller.shutdown' => 'afterFilter',
    ];
}

public function beforeFilter(Event $event)
{
    return null;
}
```

Controller.phpにはこのようにCallBack関数が定義されているので,
**parent::**で呼べる。

```
use Cake\Event\Event;

public function beforeFilter(Event $event )
{
    parent::beforeFilter($event);
}
```

## 結論
CakePHP3では
TableのCallBackは**parent::**が使えない。
しかし、ControllerのCallBackには**parent::callback名($event)**が使える。
以上です。
privateなmethodをUIButtonのactionやNSTimerのselectorとして呼ぶ方法

## エラーが出る書き方
以下のように、`private func`で定義されたmethodは呼ぼうとした時クラッシュします

### 実装例

```swift:MyViewController.swift
// 略

override func viewDidLoad() {
    super.viewDidLoad()

    self.button.addTarget(self, action: "buttonAction", forControlEvents: .TouchUpInside)
}

private func buttonAction() {
    print("Hello.")
}

// 略
```

### Errorの内容

```
Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[TestProject.MyViewController buttonAction]: unrecognized selector sent to instance 0x12f1ca000'
```

いわゆる「methodが見つかりません」というやつです
もちろん`private`を外すと問題ありません

## エラーが出ない書き方
```swift:MyViewController.swift
// 略

dynamic private func buttonAction() {
    print("Hello.")
}

// もしくは

@objc private func buttonAction() {
    print("Hello.")
}

// 略
```

個人的にはSwiftコードの中に突然`@`が出てくるのが嫌なので`dynamic`修飾子を付けています
`@objc`を付けるという意味では、自動で`@objc`がつくタイプのもの（`@IBOutlet`, `@IBAction`, or `@NSManaged`）を使っても一応解決できると思います

`@objc`と`dynamic`の違いや、エラーが出なくなる細かい理由については、`objc_msgSend`がどーのこーのということになるのですが、詳しくはAppleのドキュメントを参照してください
BPMを手軽に使う方法

今まで、BPMはBPMSのようなツールを使ってやるのかと思っていたら、
Redmineでもやろうという発想があったことにはびっくりした。

【参考】
RedmineをBPMツールとして使うアイデア(http://forza.cocolog-nifty.com/blog/2015/07/redminebpm-377c.html)
16進数文字列(NSString)をNSDataに変換する


#はじめに
　需要があるかどうかは分かりませんが、16進数文字列をNSData化するコードを参考URLを~~ほぼ丸パクリ~~参考にし、Swift対応にしました。

#環境
- Xcode 7.01
- Swift

#使い方(一例
```swift
let hexStr : NSString = "48656c6c6f20576f726c64"
let moji =  NSString.init(data: hexStr.dataFromHexString()!, encoding: NSUTF8StringEncoding)
print(moji)
//-> Hello World
```

#コード
何故かNSStringのextensionになっておりますが、適宜変更する方がよろしいかと思います。

```swift:NSStringEX.swift
import Foundation

extension NSString
{
    func dataFromHexString() -> NSData?
    {
        var str = self.stringByReplacingOccurrencesOfString("<", withString: "")
        str = str.stringByReplacingOccurrencesOfString(">", withString: "")
        str = str.stringByReplacingOccurrencesOfString(" ", withString: "")
        
        let nsstr = str as NSString
        
        let chars = nsstr.UTF8String
        var i = 0
        let len = nsstr.length;
        
        let data = NSMutableData(capacity: len/2)
        var byteChars:[CChar] = [0,0]

            var wholeByte :CUnsignedLong
            while (i < len)
            {
                byteChars[0] = chars[i++];
                byteChars[1] = chars[i++];
                wholeByte = strtoul(byteChars, nil, 16);
                data?.appendBytes(&wholeByte, length: 1)
            }
        
        return data;
    }

}
```


#参考URL
stack over flow -NSString (hex) to bytes-
http://stackoverflow.com/questions/2501033/nsstring-hex-to-bytes
Python Flask-WTFを動かしてみた

# 環境
Python3.4

# Flask-WTFとは
FlaskとWTFormsをいい感じに統合してくれるプラグイン

# 動かしてみた．
Flaskでフォームを使う必要があったので，
https://flask-wtf.readthedocs.org/en/latest/quickstart.html
ここのとおりに動かしてみたところ，動かず．

```python:view.py
# 公式のサンプル
@app.route('/submit', methods=('GET', 'POST'))
def submit():
    form = MyForm()
    if form.validate_on_submit():
        return redirect('/success')
    return render_template('submit.html', form=form)
```

> https://flask-wtf.readthedocs.io/en/latest/quickstart.html

Python-WTFのほうのDocumentを見たところ

```python:view.py
form = MyForm(csrf_enabled=False)
```

動きました．
vimのカラースキーム (colorscheme) を "molokai" に設定する

## はじめに
```
標準の vim のカラースキームだと見づらいので、
お美しいカラースキーム "molokai" に設定する手順です
特殊なことは何も書いておらず、毎回忘れてしまうのでボケ防止でございます
```

githubからファイルを取得して指定のフォルダへ保存します

```
$ mkdir ~/.vim
$ cd ~/.vim
$ mkdir colors

$ git clone https://github.com/tomasr/molokai
$ mv molokai/colors/molokai.vim ~/.vim/colors/
```

colorschemeに "molokai" を指定します

```
$ vim ~/.vimrc
```

```
colorscheme molokai
```

確認のため ".vimrc" を開き直してみましょう

```
$ vim ~/.vimrc
```

あら、お美しい :kissing_heart: 
<img width="478" alt="スクリーンショット 2015-12-22 18.17.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/38342/e38e34e6-af23-1166-f575-3706d9c81a71.png">
さよなら again ～ Pharoに受け継がれなかったApple Smalltalk由来のマジカルなテキスト編集機能の記録 ～

Squeak は、アップルがゼロックスからライセンスを受けて同社の Lisa および Mac 向けに開発した Apple Smalltalk-80 をベースにして作られた Smalltalk 環境です。開発陣は、古い MC68000向けの仮想マシンを PowerPC向けに焼き直す際、デバッグを楽にするために新しい仮想マシンを Smalltalk のサブセットで記述しました。Smalltalk 環境内で動作を確認してからそれを C に変換してビルドするというこの開発方式により、他のプラットフォームへの移植も容易になり、その後、Mac だけでなく様々な OS やデバイスで動作するようになりました。

- [What's "Squeak"? - Squeak Introduction Page!](http://www.mars.dti.ne.jp/~umejava/smalltalk/squeak/)

Apple Smalltalk-80 の処理系本体は、ゼロックス製の本家 Smalltalk-80 の v1（製品化された v2 の前のバージョン）に相当する仮想イメージ（処理系を構成する Smalltalk オブジェクト群を納めたファイル）が提供され使用されました。Apple の開発者は、この仮想イメージが動作する仮想マシンを構築する作業と同時に、独自の機能を環境それ自体にも追加しています。そうした Apple Smalltalk 独自拡張の中のひとつに again の in-place 検索機能があります。

again 自体もたいへん面白く便利な機能なのですが、残念ながらあまり知られていません。これはカット＆ペーストなどのように Mac や Win に継承され、世に広められなかったためだと思われます。そんなこともあってか、現状では、本家 Smalltalk-80 v2 の流れをくむ VisualWorks でも、Squeak から派生した Pharo からも again はすっかりメニュー項目から排除されてオーソドックスな Find/Replace 機能に置き換えられてしまっています。

again は、直前の編集操作（文字の置き換えやテキストスタイルの変更）を、次の現われる同じ内容のテキストに in-place でダイアログなどを介さずに適用する機能です。ワープロなど備わっている検索・置換というと、検索キーを設定したり、置換後のテキストを指定したり、その他、細かな設定をダイアログボックスを使って事前に行なう手続きが現在主流ですが、この again ではダイアログボックスの介在なしに作業を進められるというメリットがあります。

▼置換（クリックで再生）
[![Smalltalk again #02 - find and replace](http://img.youtube.com/vi/tUZI1iUAPu0/0.jpg)](http://www.youtube.com/watch?v=tUZI1iUAPu0)

▼直前の属性変更の繰り返し適用（クリックで再生）
[![Smalltalk again #03 - find then change text size and style](http://img.youtube.com/vi/d_tgb_Arls8/0.jpg)](http://www.youtube.com/watch?v=d_tgb_Arls8)

</br>
Apple Smalltalk では、この again にちょっと手が加えられて、検索キーすら特別なダイアログボックスを介さずに指定できる工夫がなされています。

もちろん任意の検索キーを使った検索である以上、検索キーの入力は必須なわけですが、again の in-place 検索では思いついたら検索キーをどこでも適当な場所にキャレットを置いて挿入する、という大胆な方法をとります。その後、黄ボタンメニュー（今でいうコンテキストメニュー、右クリックメニュー）から again を選択する（Squeak では alt/cmd + j をタイプする）とそこから下流にあるテキストから検索キーに一致した部分が選択されます（なければ画面フラッシュ）。

直前に検索キーとして文中に挿入したテキストは検索のキーに設定されると同時に自動的に消されるので、編集中のテキストは汚されないというカラクリです。

言葉で説明すると面倒そうですが、次の動画見てもらえると動きがわかりやすいと思います。この動画では文頭に挿入していますが、場所は文章のどこでも OK です。

▼in-place 検索（クリックで再生）
[![Smalltalk again #01 - in place find](http://img.youtube.com/vi/-jKdn_9dKeQ/0.jpg)](http://www.youtube.com/watch?v=-jKdn_9dKeQ)

個人的には、again の真骨頂と思える大好きでいつも使うこの again  の in-place 検索の機能なのですが、残念ながら Squeak の次のバージョンでは again の刷新にともなって、どうやら again の機能ではなくなってしまうみたいです。Apple Smalltalk-80 からひっそりと受け継がれてきたこの機能が消えてしまうのは、なんだか寂しいものがありますね。

なお今後 in-place 検索の振る舞いは、again とは別の find next (alt/cmd + g) に引き継がれる予定です。
Rubyにパッチが取り込まれた話、あるいは正規表現について少し。



Backlogが不調で作業が出来ないので手持ち無沙汰にめずらしくQiitaにでも。

ruby 2.3 preview2 に私が書いたパッチが(間接的に)取り込まれた。[こちら](https://github.com/ruby/ruby/blob/v2_3_0_preview2/ChangeLog#L801)のコミットになる。

パッチ自体はRubyではなく[Onigmoに投げたもの](https://github.com/k-takata/Onigmo/pull/52)で、Onigmoの方で塩漬になっていたらRubyが直接取り込んだ。

このパッチはOnigmoの高速化に関わるもので、以前blogに解説を書いた CF [Onigmoを最大49%高速化した話 | κeenのHappy Hacκing Blog](http://keens.github.io/blog/2015/05/26/onigmowosaidai49_kousokukashitahanashi/)。

49%だったらすごい改善になってるようだが、これには罠がある。ブログから改善率の高い正規表現を抜き出すと、

* `a[^x]{20}b` (31%)
* `[a-zA-Z]+ing` (49%)
* `[a-zA-Z]+ing$` (49%)
* `"[^"]{0,30}[?!\.]"` (24%)

になる。これらには共通点があって、スタックマシンを使ってNFAをシュミレートするOnigmoには苦手なパターンが含まれている。具体的には、

* `[^x]{20}b`
* `[a-zA-Z]+i`
* `[a-zA-Z]+i`
* `[^"]{0,30}[?!\.]`

の部分だ。「文字(集合)の繰り返し」+「繰り返しの文字集合に含まれる文字」のパターンが苦手になる。`[^x]{20}b`なら、`[^x]`に`b`が含まれるし、`[^"]{0,30}[?!\.]`なら`[^"]`に`[?!\.]`のうち1つ(この場合は全部だが)が含まれる。こういう場合にVM型の正規表現エンジンだとどこまでを繰り返しに含めてどこまでをsuffixにするか簡単には判断出来ず、可能なパターンを総当りすることになる。
その時にVMをヘビーに回すことになる。そして今回のパッチはまさにVMをヘビーに回すのを高速化するパッッチだった。

結局何が言いたかったかというとRuby2.3で一部の正規表現が速くなるが、速くなる対象はそもそも正規表現が苦手な場合なので先に正規表現自体を見直した方がいい。


追記
後で修正されるだろうと`USE_DIRECT_THREADED_VM`というすごい雑な名前のフラグが有効な時にだけこのパッチが有効になるようにして投げたのだが、どうやらそのまま取り込まれたらしい。
https://github.com/ruby/ruby/blob/v2_3_0_preview2/regexec.c#L1434

なのでRubyデフォルトでは有効になっていない。自分でRubyをソースからビルドし、`make CFLAGS=-DUSE_DIRECT_THREADED_VM`とでもしないといけない。
誰かrubyコミッタの人どうにかしてくれないかな。
PHPUnitでprivateでstaticなメソッドとプロパティを呼び出すUtility関数

こんなのをTestsディレクトリ以下において呼び出せばいい。

```php

<?php
class Test_Utils_Util
{
    /**
     * privateなstaticメソッドを呼び出します
     */
    public static function invoke_private_static_method($class_name, $method_name, $args_arr) 
    {
        $test_class = new ReflectionClass($class_name);
        $method = $test_class->getMethod($method_name);
        $method->setAccessible(true);
        $method->invokeArgs(null, $args);
    }
    
    /**
     * privateなstaticプロパティを呼び出します
     */
    public static function get_private_static_prop($class_name, $prop_name) {
        $test_class = new ReflectionClass($class_name);
        $prop = $test_class->getProperty($prop_name);
        $prop->setAccessible(true);
        return $prop->getValue();
    }
}
```
今すぐ阪大生が京都に移住するべき101の理由

この記事は[OUCC Advent Calendar 2015](http://www.adventar.org/calendars/730) 21日目の記事です。遅刻しましたごめんなさい...
昨日は寝間着さんの「[beatmaniaIIDXやめろ．サノバウィッチをやれ．](http://anonemaki.hatenablog.com/entry/2015/12/20/223658)」でした。部費はもう払いました。
明日はas_muchさんの「[くりすます](http://as-much.blogspot.jp/2015/12/oucc.html)」です。
# ご挨拶
初めましての方は初めまして、くるた([@klta6154](twitter.com/klta6154))と申します。
阪大生だったはずがいつのまにやら京都の学生となってしまいました。
いつぞやのLT会では阪大を散々にこき下ろしてしまったので、今回はもうちょっとポジティブに「京都のいいところ」を列挙していくことにして、諸兄の京都移住の参考になればと考えております。
## TL; DR
京都は(特に阪大のある吹田とか石橋と比べて)明らかに飯がうまいし景色がいいし学生がまともなのでみなさんおいで
# 飯の話
学生の皆さんは、一度はお昼を食べる場所に困ったことがあるでしょう。
わざわざ混んでる大学食堂に(しかもさして美味しくない！)特攻して食べる辛さは筆舌に尽くしがたいものがあります。
しかし時間の都合上、他に行くところが無いのも事実。
結局我慢して大学食堂を利用することになってしまいます。
...はい、そうです。京都に来るとかなりの割合でこの問題が解決します。
学生街が大学のすぐ近くにあるので、好きな飯屋、カフェでお昼を頂けます。
キャンパスと店舗の距離が近く、歩いて一分以内に吉野家、CoCo壱、Subwayといったチェーンからおしゃれなカフェ、洋食屋、さらには次郎インスパイアに至るまで様々な昼飯スポットがひしめいています。
また、京大、府立大、同志社などが比較的狭い範囲にあるせいで学生街が互いに融合して発達しているため学生が分散しているのも、各店舗の混雑緩和に一役買っていると思われます。
![DSC_0371.JPG](https://qiita-image-store.s3.amazonaws.com/0/5367/d6a9be83-90cc-66d6-f410-acf68f58f378.jpeg) 神宮丸太町、十両のブリ刺身定食1300円。多少値段は張りますが...
# 景色の話
京都には景観法という法律の適用地域となっており、景観を損なう建物の建築は非常に困難になっています。[^1]
そのため、京都のどの地点から見渡しても素晴らしい景色が確保されています。
この特徴は自転車で散歩したりしたときに顕著に感じることができます。
昔ながらの木造の町並みと広い空を堪能してください。
# 学生の話
学生ひしめく大学の中で生活してると、周囲の人にイラッとすることがあるとおもいます。
授業中に大声でしゃべっている、傘おいて食堂に入ると出るときにはなくなっている、単純に話が通じないetc...
たくさんの人が集まっている大学という場所の性質から、これらの問題はある程度は避け得ません。
ですが、京都に来てからこれらに遭遇する確率が明らかに下がっていると感じます。[^2]
何が原因か、と言われると正直偏差値しか思い浮かびませんが...
ともかく、授業の快適さは間違いなく阪大よりも上です。
# まとめ
こんな感じで京都は超面白いです。
うまく伝わったかは正直疑問ですが[^3]、ちょっとでも京都移住欲を刺激できたら幸いです。
# 最後に
[OUCC](http://oucc.org)は阪大生じゃなくても所属できます！
皆さんぜひ遊びにきてください。[お待ちしています](http://oucc.org/joinus.html)
***
[^1]: できないとは言っていない
[^2]: ぶっちゃけサンプル数少ないから何とも言えない感も
[^3]: もっとご飯の画像と時間を確保しておくべきでした...
API Gatewayを使ってkintoneへのAPIリクエストを減らしてみた

# 前回やった事

「[外部サイトから直接kintone APIを実行したい](http://qiita.com/ha_ru_ma_ki/items/ccb7c535d8ef1b255365)」で、S3にホストしたHTMLからAPI Gatewayを経由してkintoneへのアクセスを実現してみた。

この時はconsole.log（console.table）に出力したが、テーブルで出力するとこんな感じになる。
![html.png](https://qiita-image-store.s3.amazonaws.com/0/30557/e334f273-b2a6-4fa4-96e0-699024c24ebc.png)

# kintoneとしての課題

この仕組みを使うと、99.999999999%の耐久性を持つS3上にkintoneのデータを簡単に外部公開できるのだけど、kintoneには1日あたり10,000 リクエスト/アプリという制限が存在するため、大量アクセスを避ける必要がある。
![price.png](https://qiita-image-store.s3.amazonaws.com/0/30557/ee04508a-8339-460e-fe88-963d028142a3.png)

ちなみに、10,000 リクエストを超過しても、いきなりサービスが止まったりする事は無い。
[APIリクエスト数を超過した場合、直ちに使えなくなりますか](http://faq.cybozu.info/alphascope/cybozu/web/kintone/Detail.aspx?id=e765954707a6b74563965442b794576683356386e4e5276474f6b5939764547534944366d4d72616f437a6f3d&kindId=-7&category=9&categoryNot=0&word=&listNo=0&cntPerPage=10&page=7&totalCount=73&type=1&search=7&sort=99&order=2&attributeSearch=)

# APIキャッシュを使ってリクエスト数を減らす

API GatewayにはAPIキャッシュという便利機能があるので、kintoneのAPIリクエストを減らす事ができないか試してみた。
APIキャッシュの概要、設定手順については、[クラメソさんのブログ](http://dev.classmethod.jp/cloud/api-gateway-performance/#toc-api)が分かりやすい。

## APIキャッシュを使う前

kintoneは、アプリ管理画面でAPIリクエスト数を確認できるようになっている。
今回、テストで利用している販売実績アプリの場合、この時点のAPIリクエスト数は68である事が分かる。
（もちろん、S3上のHTMLをリロードするごとにリクエスト数は増えていく）
![処理済～apicount.jpg](https://qiita-image-store.s3.amazonaws.com/0/30557/70744139-a8b9-46b3-b018-bb5508d4fb6f.jpeg)

## APIキャッシュを有効にする

APIキャッシュを有効にした状態。（AVAILABLEになるまで5分ぐらいかかった）
AWS側でもキャッシュの状況を確認したいため、Enable CloudWatch Metricsを有効にした。
![apigateway.png](https://qiita-image-store.s3.amazonaws.com/0/30557/bd9f2842-fcbe-5d91-5098-d940fbd9a3c1.png)

## アクセスしてみる

APIキャッシュが有効になった状態でアクセスした時の挙動は以下の通り。

* 初回アクセス時はキャッシュされていないため、リクエスト数は増える。（68→69）
![apicount.png](https://qiita-image-store.s3.amazonaws.com/0/30557/6846b074-bd34-56b5-6e10-dcd55ea2e2e6.png)
* 2回目以降のアクセスはAPIキャッシュが効いているため、リクエスト数は変わらない。
* 試しにkintone側にレコードを追加して、アクセスしてもキャッシュが返されるため、追加したレコードは表示されない。
* TTLに設定された時間（デフォルト300秒）を過ぎるとキャッシュがクリアされ、次にアクセスした際に最新の情報が取得される。

CloudWatchを確認すると、CacheMissCountは1（同じリクエストURLしか使っていないため）、それ以外のアクセスはCecheHitCountとなっていた。
![cloudwatch.png](https://qiita-image-store.s3.amazonaws.com/0/30557/b7b0c2a9-41f6-08cb-4454-bd60fc2c7c79.png)

# まとめ

* API Gatewayを使う事で、kintoneのAPIリクエストを減らす事はできる。

# 分からない点

* キャッシュがクリアされる条件はサイズ、TTLとなっているので、明示的にクリアしたい運用があった場合はどうするべき？（キャッシュ機能を一無的に無効にする？）
Rails | 数字をバイト数に変換する

こんなのあったんだ。

## バイト

```rb
10.bytes

# => 10
```

## キロバイト

```rb
10.kilobytes

=> 10240
```

## メガバイト

```rb
10.megabytes

=> 10485760
```

## ギガバイト

```rb
10.gigabytes

=> 10737418240
```

## テラバイト

```rb
10.terabytes 

=> 10995116277760
```

## ペタバイト

```rb
10.petabytes 

=> 11258999068426240
```

## エクサバイト

```rb
10.exabytes

=> 11529215046068469760
```

# 環境

- Rails 4.0.13



<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# メンター受付


https://menta.work/user/5694

<!-- Update From Qiita API -->
qiita.coをqiita.comにリダイレクトするようにしてみた


```.htaccess
RewriteEngine On
RewriteBase /
RewriteRule ^(.*)$ http://qiita.com/$1  [R=301,L]
```

[qiita.co](http://qiita.co)

[http://qiita.co/him0net/items/0f68509100fe84a3a02a](http://qiita.co/him0net/items/0f68509100fe84a3a02a)

--
2016/12/13はこれでリダイレクトされます

Incrementsさーん，どうですかー
Java enum 列挙型 SimpleIceCreamProject


▪️IceCreamFlavor.java

```java
enum IceCreamFlavor {
	HAZELNUT("ヘーゼルナッツ", 300), WHIPPEDCREAM("生クリーム", 270), ALMOND("アーモンド", 370), OREOCOOKIECRUMBLES("オレオクッキー",
			500), MARSHMALLOWS("マシュマロ", 420);

	private String name;
	private int price;

	private IceCreamFlavor(String name, int price) {
		this.name = name;
		this.price = price;
	}

	public String getName() {
		return name;
	}

	public int getPrice() {
		return price;
	}

	public static void main(String[] args) {
		System.out.println(HAZELNUT.getName() + "アイスの値段は" + HAZELNUT.getPrice() + "円です");
	}

}
```

▪️IceCreamFlavor 実行結果
ヘーゼルナッツアイスの値段は300円です

<追記>
enum に複数形の名前はつけるのやめたほうがいい
[参考ページ](http://stackoverflow.com/questions/15755955/naming-of-enums-in-java...)
PayPal Developer Blogについて

日本ではあまり知られていませんが、PayPalのDeveloper Blogというものがあります。
https://devblog.paypal.com/

英語ですが、決済そのものだけでなく、APIの設計やセキュリティの記事も多くて参考になるので、購読することをお勧めします。

わかりにくいですけど、デベロッパーサイトのフッターに小さくリンクがあります。
https://developer.paypal.com/

個人的には、最近[Open API Initiative](https://openapis.org/)に加わったこともあり、Swaggerの記事は興味深いです。
https://devblog.paypal.com/swagger-part-of-paypals-future/

ちなみに、上記フッターの他のリンク（でもサイトやAPI Playgroud）も面白いので見てみてください。