OmniAICreator/Qiita-1.07M huggingface dataset:
表形式 csvやexcelをMarkdown/LaTex/Text/MediaWiki形式で表出力してくれる便利サイト <TablesGenerator> + excelからcsv作成

ブログなどで表を表現したいときに、Excelに書いてそれを絵として貼る方法があるのですが、利用するときに不便です。
やはり単純なテキストとして貼りたい。でもMarkdown記法はお世辞にも書きやすいとは言えません。表が複雑になると尚更です。

そんな悩みを解決してくれるサイトがありました。

**TablesGenerator**
[http://www.tablesgenerator.com/]

csvインポートもできるので、かなり便利です。

ちなみに、Excel->csvは少しコツが入ります。
Excelの「名前でつけて保存」または「エクスポート」で「csv形式」もありなのですが、**あまりうまく出力してくれません。**
※下記は、Excel2013です。
![Image.png](https://qiita-image-store.s3.amazonaws.com/0/12790/8baa21d1-24e3-c541-6efd-ce1cb3d032a6.png)




Sakuraエディタなどの正規表現が使えるエディタで、以下のようにやるとダブルクォーテーション付きのCSVが割りと簡単に出力できます。

1.エクセルで、CSVにしたいセルの範囲を選択し、コピーします。
![Image.png](https://qiita-image-store.s3.amazonaws.com/0/12790/27c542a3-5c43-f09c-8e78-057e7310c35c.png)


2.Sakuraエディタにペーストします。
セル間はタブになって出力されます。（この辺りはエディタの設定によって変わるかも知れません）

![Image.png](https://qiita-image-store.s3.amazonaws.com/0/12790/b5769483-51b3-d783-da07-0083bbb883ac.png)


3.タブを選択しつつ、置換ウィンドウを表示(Ctrl+R)し、タブを "," に置換します。

![Image.png](https://qiita-image-store.s3.amazonaws.com/0/12790/3f90ec32-b8c4-954f-a7e5-c8f1a0cdcbe8.png)


4.行の先頭と最後のダブルクォーテーションが入っていないので、再度置換ウィンドウを表示(Ctrl+R)し、 $|^ を "に置換します。

![Image.png](https://qiita-image-store.s3.amazonaws.com/0/12790/cf116b3a-94b4-f759-b677-a2da50fcb2b0.png)

そうするとダブルクォーテーション付きのCSVが出来上がりです。
これをTables Generatorの File、Import CSV file... で食わせます。

![Image.png](https://qiita-image-store.s3.amazonaws.com/0/12790/17e58a39-8b0a-4426-ab16-4fc802251e5e.png)

以下のように、Markdown形式のテキストを出力してくれます。
![Image.png](https://qiita-image-store.s3.amazonaws.com/0/12790/e60877b2-7e87-908b-8843-b025cd2f2658.png)


これは便利ですね！！
キレイに出せました。↓↓↓

| 用途分類1 | 用途分類2        | クラス名          | 備考                                                    |
|-----------|------------------|-------------------|---------------------------------------------------------|
| 数値      | 範囲指定         | Range             |                                                         |
| 文字数    | 最小のみ         | MinLength         |                                                         |
|           | 最大のみ         | MaxLength         |                                                         |
|           | 範囲指定         | StringLength      | コンストラクタにMaxを入れる。（わかりづらい・・・）     |
| 必須      |                  | Required          |                                                         |
| 文字形式  | 電話             | Phone             | フォーマット設定はできなそう。                          |
|           | Email            | EmailAddress      | フォーマット設定はできなそう。                          |
|           | Url              | Url               | フォーマット設定はできなそう。                          |
|           | ファイル拡張子   | FileExtensions    | Extensionsにカンマ区切りで文字列指定。                  |
| 正規表現  | なんでもあり     | RegularExpression |                                                         |
|           | マルチバイトのみ | RegularExpression |                                                         |
| 日時      | 日付のみ         | Range             | Rangeにて、取りうる日付の範囲を決めてやれば流用できる。 |
|           | 日付+時間        | Range             | Rangeにて、取りうる日時の範囲を決めてやれば流用できる。 |
WPF/MVVM/C#/Prism5.0 エラー通知の少し便利な仕組み② -ValidationAttribute-

#ValidationAttribute

Prismとは直接関係がないのですが、PrismのErrorsContainerを利用すると少しだけ簡単にエラー通知の実装ができることをご紹介しました。
[WPF/MVVM/C#/Prism5.0 エラー通知の少し便利な仕組み -ErrorsContainer-](http://qiita.com/Koki-Shimizu/items/ae00c525728b81f302b8)

その中で、ViewModelのプロパティの属性に付けられるValidationAttributeに様々な種類があることがわかりました。
MSDNでは以下のURLになります。
https://msdn.microsoft.com/ja-jp/library/system.componentmodel.dataannotations(v=vs.110).aspx

#ValidationAttributeの種類と用途

簡単ですが、少し整理してみました。


| 用途分類1 | 用途分類2 | クラス名 | 属性の指定の仕方(エラーメッセージ部分は適当です） | 備考  |
|-----------|------------------|-------------------|----------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------|----------------------------------------------------------------|------------------------------------------------------------|----------------------------------------|
| 数値 | 範囲指定 | Range | [Range(0, 1000, ErrorMessage = Value for {0} must be between {1} and {2}.")]"  |  |
| 文字数 | 最小のみ | MinLength | [MinLength(5, ErrorMessage = Value for {0} must be bigger {1}.")]"  |  |
|  | 最大のみ | MaxLength | [MaxLength(5, ErrorMessage = Value for {0} must be smaller {1}.")]"  |  |
|  | 範囲指定 | StringLength | [StringLength(10, MinimumLength = 5, ErrorMessage = Value for {0} must be between {1} and {2}.")]" | コンストラクタにMaxを入れる。（わかりづらい・・・）  |
| 必須 |  | Required | [Required(ErrorMessage = {0} is required.")]"  |  |
| 文字形式 | 電話 | Phone | [Phone(ErrorMessage = Invalid Phone format.")]" | フォーマット設定はできなそう。  |
|  | Email | EmailAddress | [EmailAddress(ErrorMessage = Invalid Email Address")]" | フォーマット設定はできなそう。  |
|  | Url | Url | [Url(ErrorMessage = Invalid Url")]" | フォーマット設定はできなそう。  |
|  | ファイル拡張子 | FileExtensions | [FileExtensions( Extensions=".jpg,.xml,.xlsx", ErrorMessage = "Please specify a valid image file ({1})"]" | Extensionsにカンマ区切りで文字列指定。 |
| 正規表現 | なんでもあり | RegularExpression | [RegularExpression(@ここに正規表現記載", ErrorMessage = "Value for {0} must be XYZ.")]"  |
|  | マルチバイトのみ | RegularExpression | [RegularExpression(@[^\x01-\x7E]+", ErrorMessage = "Value for {0} must be multi-byte-char or half-width kana.")]"  |
| 日時 | 日付のみ | Range | [Range(typeof(DateTime), "2011/1/1","2016/1/1", ErrorMessage = "Value for {0} must be between {1} and {2}.")]" | Rangeにて、取りうる日付の範囲を決めてやれば流用できる。 |  
|  | 日付+時間 | Range | [Range(typeof(DateTime), "2011/1/1 12:00:00","2016/1/1 03:00:00", ErrorMessage = "Value for {0} must be between {1} and {2}.")]" | Rangeにて、取りうる日時の範囲を決めてやれば流用できる。 |  

数値かどうか、はRangeを利用したほうが良さそうですね。
他にも様々ありましたが、基本はRegularExpressionとRangeの応用でほとんどのチェックは出来そうです。

サンプルコードをGitHubに挙げてあります。
[https://github.com/Koki-Shimizu/NValidationSample]
Pythonで名前空間付きのXMLを操作する(ElementTree)

#初めに

xml.etree.ElementTree 
http://docs.python.jp/2/library/xml.etree.elementtree.html
を使って、名前空間付きのxmlを解析します。

本文ではkml（Google Earthなどに使われてるフォーマット）
http://ja.wikipedia.org/wiki/KML
をターゲットにしているが、実態はXMLなので同様に扱うとする。

#対象データ

```xml:対象のKML
<?xml version='1.0' encoding='UTF-8'?>
<kml xmlns="http://earth.google.com/kml/2.0">
<Document>
<name>Hoge</name>
 <Style id="Mapit">
 <IconStyle>
 <color>FFFFFFFF</color>
 <scale>1.0</scale>
 </IconStyle>
 </Style>
 <Style id="kml">
 <LineStyle>
 <color>FF0080FF</color>
 <width>1</width>
 </LineStyle>
 <PolyStyle>
 <color>AADDDDDD</color>
 </PolyStyle>
 </Style>
・・・
 </Document>
</kml>
```

一部省略しているが、とりあえずこんな形をしているKMLを対象とする。
PolyStyle->color
の値が**AADDDDDD**になっていますが、これを変えたいとします。

#プログラムコード

```py:XML書き換えプログラム
# -*- coding: utf-8 -*-

from xml.etree import ElementTree

#KMLファイルを読み込み
tree = ElementTree.parse("in.kml")
#namespaceを付加する
#これをしないと再書き出しの際に、全てのタグにns0:PolyStyleみたいになる
ElementTree.register_namespace('', 'http://earth.google.com/kml/2.0')

# //PolyStyle/colorを探す
for node in tree.findall(".//{http://earth.google.com/kml/2.0}PolyStyle/{http://earth.google.com/kml/2.0}color"):
	# 内容書き換え
	node.text="AA001122"

#書き出し
#3つ目の引数はtrueなら<?xml ・・?>を付加する。
tree.write("out.kml","UTF-8",True)
```

PolyStyle->color
の値が**AA001122**となって書き出されます。


#解説


xml.etree.ElementTree.findallは、頭に"."がいる。
(FutureWarningとか言われる）

XPathのサブセットが扱えるらしい。
http://docs.python.jp/3/library/xml.etree.elementtree.html
(Python2に関する記事は、見つけられてない）

ここで問題なのが名前空間である。

```xml:名前空間
<kml xmlns="http://earth.google.com/kml/2.0">
```

がルートにあるため、それ以下は全て名前空間がかかる。

なのでパスを指定するときは、{}内で名前空間を付加し、タグを指定しなけばならない。


しかもPolyStyle->colorなので２回書かないといけない。

```text:xpath
//{http://earth.google.com/kml/2.0}PolyStyle/{http://earth.google.com/kml/2.0}color"
```

（なにかいい方法が有りましたら教えて下さい。。。）

次に、register_namespace　をする意味は、
writeで書きだしたXMLが

```xml:register_namespaceをしない出力
<ns0:PolyStyle>
 <ns0:color>AADDDDDD</ns0:color>
</ns0:PolyStyle>
```
みたいになるのを回避します。

#ゆるぼ
register_namespaceしてるのでXPath指定がもっとスマート
（名前空間URIを何度も書かなくていいとか）に記述できないかなぁ。。。


#参考

XPathで指定したテキストがある次の要素を取得する方法
http://qiita.com/yuki2006/items/1f96450fc744769872c5

[Python]ElementTreeのnamespaceをゴニョゴニョする
http://d.hatena.ne.jp/nullpobug/20110420/1303293319
もしかしてと思って試したらうまくいったマックのフォルダの拡張子の小技

Eclipseはeclipseフォルダ内のeclipse.appがアプリケーション本体で、使用されるデータがeclipse.appの外側、つまりeclipseフォルダ直下に置かれるため、eclipse.appを単品でApplicationsフォルダに置くと起動できない。当たり前である。

そこでeclipseフォルダ自体をeclipse.appに名前変更したところ、通常通りダブルクリックで内包しているeclipse.appを起動できてしまった。

ついでにアイコンも本体の.appのものを外側の.appにコピペすればなんかいい感じ。
きっと他のアプリでも可能だと思う。

VMWare Fusionで一つの仮装OSのために必要なファイル類がごちゃごちゃはいったフォルダも拡張子を.vmwarevmに変えたらアイコンが終了時の画面のサムネイルになってもちろんダブルクリックで起動できるようになった。

以上、フォルダの拡張子に関する小技でした。

# 追記
アプリ本体.appと外側の.appフォルダは同じ名前でなければこの技は使えないようです。
それからランチャーへの反映は追加時も削除時も本体が直接Applicationsフォルダ直下から他フォルダやゴミ箱などへ移動しないと検知されないようです。
多分　infoファイルに記述されるバンドルIdなどで管理しているからだと思われます。
ちなみにXamarinStudioとMonoDevelopやIntellij IDEAとMPSみたいに、たまに同じIdを使用しているものがあり、Idが重複するとランチャー上でアプリが上書きされます。
Applicationsフォルダから直接起動すれば問題はありません。
GoogleChromeExtension の Postman が便利



最近 API を叩いて返り値を見るのが趣味になっています。ただ、API_A を叩いて、API_Bを叩いて、またAPI_A を叩く。なんてことをやっているとだんだんと面倒くさくなりますよね？そんな時の為の便利な Extension を見つけたので紹介します。

Postman
--

Postman はシンプル & 便利な Rest Clientです。
GoogleChromeExtension なので、Firefox とか Opera を使ってる人はごめんなさい。

ダウンロード & インストール は[webstore](
https://chrome.google.com/webstore/detail/postman-rest-client/fdmmgilgnpjigdojojpjoooidkmcomcm)から出来ます。

使い方
--

![Postman (2).png](https://qiita-image-store.s3.amazonaws.com/0/42939/733ddd85-52af-3769-1a0c-fc2175890c65.png "Postman (2).png")

[chrome-extension://fdmmgilgnpjigdojojpjoooidkmcomcm/index.html](chrome-extension://fdmmgilgnpjigdojojpjoooidkmcomcm/index.html)にアクセスすることで、上記のPostman 用のページを表示することが出来ます。ブックマークしておきましょう。

見ると大体解ると思いますが、大体は下記の点を設定して **Send** ボタンをクリックすると結果が表示されます。必要であれば、Basic 認証や Digest 認証の設定も行えます。

- API のエンドポイント
- リクエストメソッド
- パラメーター

便利な機能達
--

いよいよ便利な機能達の紹介です！

- ショートカット一覧表示

Postman 用のページを開いている状態で ? を入力すると、下記のショートカット一覧を表示出来ます。
沢山の API を叩く場合は、初めに確認しておくと捗るかもしれません。

![Postman.png](https://qiita-image-store.s3.amazonaws.com/0/42939/d70750c4-9d62-3a69-a913-ea980723de30.png "Postman.png")

- 履歴機能

過去に叩いた API のエンドポイントを、実行時のパラメーター付きで 100 個まで保存しているので、「ちょっと前に叩いたあのAPIを、あの時のパラメーターで実行したい。」と思ったときでもすぐに実行することが出来ます。また、画面の右上のスパナのアイコン(Setting)をクリックすることで、履歴の保持数を増やすことも出来ます。

![Postman (1).png](https://qiita-image-store.s3.amazonaws.com/0/42939/af319e41-7041-6b71-49dd-d7e876734575.png "Postman (1).png")


- コレクション機能

さらに、叩いた API に名前をつけてコレクションをすることが出来ます。こちらも、実行時に使用したパラメーターが保存されているので、自分はよく叩くAPIをコレクションとして保存しています。

おわりに
--

Postman についての紹介はこれで終わりです。webstore には便利な Extension が転がっているので、また何か面倒くさいことがあったら漁ってみようと思います。
[Intellij IDEAヘルプ 日本語訳] プロファイルのカスタマイズ

元ページ: [Customizing Profiles](https://www.jetbrains.com/idea/help/customizing-profiles.html)

# プロファイルのカスタマイズ

インスペクションプロファイルは見つけるべき問題のタイプを定義する、つまり、どのコードインスペクションを[有効または無効](https://www.jetbrains.com/idea/help/disabling-and-enabling-inspections.html)にするかとこれらのインスペクションの[重要度](https://www.jetbrains.com/idea/help/configuring-inspection-severities.html)である。

現在のインスペクションプロファイル（これはエディタ上でまさに今適応されているもの）を設定するには、単に[インスペクション](https://www.jetbrains.com/idea/help/inspections.html)設定ページでそれを選択して変更を適応すればいい。
あなたが[コード分析を実行するとき](https://www.jetbrains.com/idea/help/running-inspections.html)もしくは[単独でインスペクションを実行するとき](https://www.jetbrains.com/idea/help/running-inspection-by-name.html)、あなたはそれぞれの実行でどのプロファイルを使用するか指定することができる。

IntelliJ IDEAではあなたにすでに存在しているインスペクションプロファイル（デフォルトプロファイルを含む）をカスタマイズすることや新しいインスペクションプロファイルを作ることができる。
あなたはまたインスペクションプロファイルを共有・インポート・エクスポートすることができる。

## プロファイルをカスタマイズするためには

1. [インスペクション設定](https://www.jetbrains.com/idea/help/accessing-inspection-settings.html)で、変更したいプロファイルを選択する。デフォルトプロファイルもまた変更可能であることに注意すること。
2. 必要に応じて、あなたは**Share profile**チェックボックスでこのプロファイル(=IDEの現在のプロジェクト)の適応可能性(applicability)を変更することができる(選択状態は今のプロジェクトを意味する)。
3. 必要なインスペクションをカスタマイズする: [それの有効化・無効化](https://www.jetbrains.com/idea/help/disabling-and-enabling-inspections.html)、[重要度の変更](https://www.jetbrains.com/idea/help/configuring-inspection-severities.html)そして他のさまざまなインスペクションのための異なるオプションである。重要度とスコープの選択肢、そして追加の選択肢(もしあれば)はそのインスペクションが有効である場合のみ設定可能であることに注意すること。
4. あるインスペクションを限定されたファイルの集合に適応したい場合、[それらを対応するスコープに紐づける](https://www.jetbrains.com/idea/help/configuring-inspection-for-different-scopes.html)。デフォルトでは、すべてのインスペクションは現在のプロジェクトのすべてのソースに適応される。
5. 変更を適応する。

## 新しいプロファイルの作成

1. [インスペクション設定](https://www.jetbrains.com/idea/help/accessing-inspection-settings.html)で**Add**をクリックする。
2. 開いたダイアログボックス内で、新しいプロファイルの名前を入力する。
3. 変更を適応する。この新しいプロファイルはDefaultプロファイルのコピーとして作られる。

## 存在するプロファイルコピーの作成

1. [インスペクション設定](https://www.jetbrains.com/idea/help/accessing-inspection-settings.html)でコピーしたいプロファイルを選択
2. **Copy**をクリック。
3. 開いたダイアログボックス内で、新しいプロファイルの名前を入力する。
4. 変更を適応する。この新しいプロファイルは選択したプロファイルのコピーとして作られる。

## プロファイルの削除

1. [インスペクション設定](https://www.jetbrains.com/idea/help/accessing-inspection-settings.html)で削除したいプロファイルを選択
2. **Delete**をクリック。
3. 変更を適応。

## プロファイルのインポート

1. [インスペクション設定](https://www.jetbrains.com/idea/help/accessing-inspection-settings.html)で**Import**をクリック
2. [Select Path](https://www.jetbrains.com/idea/help/select-path-dialog.html)ダイアログボックスで、対象の**xml**ファイルを指定して**OK**をクリック
3. 変更を適応。

## プロファイルのエクスポート

1. [インスペクション設定](https://www.jetbrains.com/idea/help/accessing-inspection-settings.html)でエクスポートしたいプロファイルを選択
2. **Export**をクリック。
3. [Select Path](https://www.jetbrains.com/idea/help/select-path-dialog.html)ダイアログボックスで、現在のインスペクションプロファイルの**xml**ファイルが保存されるディレクトリを指定して、**OK**をクリック。
4. 変更を適応。

# 関連翻訳

* [IntelliJヘルプ翻訳に関する投稿 - Qiita](http://qiita.com/tags/intellij%e3%83%98%e3%83%ab%e3%83%97%e7%bf%bb%e8%a8%b3)
swiftでサーバーにテキストをPOSTする

[Question-Board](https://question-board.herokuapp.com)に投稿できるアプリを作ろうと思っています。

テキストの投稿には成功したのでメモを書きます


```ViewController.swift

import UIKit

class ViewController: UIViewController, UITextFieldDelegate, NSURLSessionTaskDelegate{
    var json:NSData!
    override func viewDidLoad() {
        super.viewDidLoad()
        
        // UITextFieldを作成する.
        let myTextField: UITextField = UITextField(frame: CGRectMake(0,0,200,30))
        
        // 表示する文字を代入する.
        myTextField.text = ""
        
        // Delegateを設定する.
        myTextField.delegate = self
        
        // 枠を表示する.
        myTextField.borderStyle = UITextBorderStyle.RoundedRect
        
        // UITextFieldの表示する位置を設定する.
        myTextField.layer.position = CGPoint(x:self.view.bounds.width/2,y:100);
        
        // Viewに追加する.
        self.view.addSubview(myTextField)
        
        
    }
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
    
    /*
    UITextFieldが編集された直後に呼ばれる.
    */
    func textFieldDidBeginEditing(textField: UITextField){
        println("textFieldDidBeginEditing:" + textField.text)
    }
    
    /*
    UITextFieldが編集終了する直前に呼ばれる.
    */
    func textFieldShouldEndEditing(textField: UITextField) -> Bool {
        println("textFieldShouldEndEditing:" + textField.text)
        
        // まずPOSTで送信したい情報をセット。
        let str = "text=\(textField.text)"
        let strData = str.dataUsingEncoding(NSUTF8StringEncoding)
        
        let url: NSURL = NSURL(string: "送信したいサイトのPOST URL")!
        
        var request = NSMutableURLRequest(URL: url)
        
        // この下二行を見つけるのに、少々てこずりました。
        request.HTTPMethod = "POST"
        request.HTTPBody = strData
        
        var data = NSURLConnection.sendSynchronousRequest(request, returningResponse: nil, error: nil)
        var dic = NSJSONSerialization.JSONObjectWithData(data!, options:nil, error: nil) as NSDictionary
        
        return true
    }
    
    /*
    改行ボタンが押された際に呼ばれる.
    */
    func textFieldShouldReturn(textField: UITextField) -> Bool {
        textField.resignFirstResponder()
        
        return true
    }
    
}
```

ただし以下のようなエラーが出る。実機でない場合に出るらしいが，詳しいことはわからない。

![スクリーンショット 2015-03-17 03.24.57.png](https://qiita-image-store.s3.amazonaws.com/0/67439/2cbfe008-920b-a571-68be-7a0551583bd1.png)

fatal error: unexpectedly found nil while unwrapping an Optional value
(lldb)

＜エラーがなくなったので追加します　3/17＞

```
var dic = NSJSONSerialization.JSONObjectWithData(data!, options:nil, error: nil) as NSDictionary
```
を以下に変更すればエラーがなくなった

```
var dic = NSJSONSerialization.JSONObjectWithData(data!, options:nil, error: nil) as? NSDictionary

```

swiftはvarの使い方を学べば理由もわかりそう
＜＞



次は画像投稿の方法を探る。

#参考
テキスト投稿
http://qiita.com/mochizukikotaro/items/e2da2d3186ec24e291a6

テキストフィールド生成
https://sites.google.com/a/gclue.jp/swift-docs/ni-yinki100-ios/uikit/004-uitextviewde-wen-ziwo-ru-li

エラーの対処
http://blogios.stack3.net/swift/swift-dictionary
EmacsでC-hでmini buffer内でもbackspaceする

# 結論
init.elに以下を追加

```el
(define-key key-translation-map (kbd "C-h") (kbd "<DEL>"))
```

# あとがき
EmacsでC-hでbackspaceする、となったらよく以下の行をinit.elに追加する、というのが紹介される

```el
(define-key global-map "\C-h" 'delete-backward-char)
```

ただ、これだとmini buffer内でC-hしてもbackspaceしてくれない。ので、今までEmacsの中からではなく、[Karabiner](https://pqrs.org/osx/karabiner/index.html.ja)を使ってOSでグローバルにC-hをdelete keyに割り当てていた。

ただ最近iTermのシェル上でdelete keyが効かなくなった。で、このiTermのシェル上でbackspaceするのはどうすればいいのかぐぐると、delete keyにC-hを割り当てる的なエントリが出てくる。これだと本末転倒だ。

で、iTermのシェル上でdelete keyを使うのは諦めて、大人しくC-hを使うことにしたんだけど、そうするとEmacsでC-hでbackspaceするにはどうすればいいのか、というのが問題になった。

前述のとおり`(define-key global-map "\C-h" 'delete-backward-char)`はmini bufferできかないのでつらい。で、ぐぐるとinit.elに以下を追加するとmini bufferでもC-hでbackspace出来るよー、というのが出てきた。

```el
(keyboard-translate ?\C-h ?\C-?)
```

ただ、自分の環境だとinit.elを読み込んだ時に上記命令が上手く実行されないようだった（`C-x C-e`で`eval-last-sexp`したらちゃんと動いた）。

ちょっとこれの原因が分からなくて、[EmacsのMLでバグっぽい空気は感じた](https://lists.gnu.org/archive/html/bug-gnu-emacs/2014-02/msg00088.html)けど結局解決方法は分からず。

で、もうちょっと調べたところ一番最初の`(define-key key-translation-map (kbd "C-h") (kbd "<DEL>"))`すればいいよ、というのを見つけてやってみたらビンゴだった。

# 参考

- http://emacs.stackexchange.com/questions/3787/html-mode-and-custom-backspace-keybinding
- http://stackoverflow.com/questions/18252930/how-do-i-rebind-a-key-in-emacs-globally
オブジェクト同士のメッセージングにはEventDispatcher (EventListenerCustom) を

Cocos2d-xで、オブジェクトAが違うオブジェクトBに指令を送ってBのメソッドを実行する方法(v3系)です。


それにはEventDispatcherクラスのEventListenerCustomを使います。
UnityのSendMessage的な機能と言っていいと思います。

**v3から頻繁に使うようになったEventDispatcherは単にOntouchBeganとかだけに使うと思ってましたが、それどころかもっと便利で深いもののようです。**（v2からの移行時に面倒だなと思っていましたが今では汎用性があって良いなと思うようになりました。）

私はC++に造詣が深くないので、これをメッセージングと呼んでよいのか、純粋オブジェクト志向的には変かもしれないといった疑念がありますが、便利なことは確かですね。


###イメージ
**発信者のオブジェクト(Node , Layer , Spriteなど)**
から
**受信者のオブジェクト(Node , Layer , Spriteなど)**
へ
**あらかじめイベントを登録しておく（=リスナーを付与しておく）**イメージです。


###送信側コード
「voice」は送信者の声、「myEventName」は待ち受けチャンネルのチューニング（ラジオの周波数的な）だと思ってみました。

```cpp:MyLayer.cpp
//イベント発信側
auto event = EventCustom("myEventName");
auto voice = Value("聞こえますかー？");
event.setUserData(&voice);
getEventDispatcher()->dispatchEvent(&event);
```

###受信側コード
リスナーなので、チューニングを合わせて「voice」を聞くイメージ、と思ってみました。

```cpp:HelloWorld.cpp
//イベント受信側
auto reciever = EventListenerCustom::create("myEventName",[this](EventCustom* event)
{
  auto voice = (Value*)event->getUserData();
  log("「%s」", voice->asString().c_str());
});
getEventDispatcher()->addEventListenerWithFixedPriority(reciever, 1);
```

###発揮されるCocos2d-x、v3系の良さ
リスナーと、ラムダ式。これだけでもv3系の良さを享受できましたね。

##※※つかわなくなったリスナーは外そう※※
このような形でつかわなくなったカスタムリスナーは必ずはずしましょう。
同じ名前でイベントがかぶっている時のエラーがなかなか気づかないので凶悪です。（体験談）

```
Director::getInstance()->getEventDispatcher()->removeCustomEventListeners("someEvent");
```
tomcatの平均レスポンスタイムを集計するワンライナー

個人的メモ

```bash
grep hegehoge/upload /var/log/tomcat/access_log.20150316 | cut -d'"' -f7 | sort -nr | head -n 1000 | awk '{m+=$1} END{print m/NR;}'
```

Tomcatのログ出力は下記Valveを前提。

```
<Valve className="org.apache.catalina.valves.AccessLogValve"
    directory="/var/log/tomcat"
    fileDateFormat="yyyyMMdd"
    prefix="access_log."
    suffix=""
    pattern='%h %l %u %t "%r" %s %b "%{Referer}i" "%{User-Agent}i" %D'
/>
````
Golangで、ファイル一覧取得（最新順出力）

```go
package main

import (
        "flag"
        "fmt"
        "io/ioutil"
        "os"
        "path"
        "sort"
)

type FileInfos []os.FileInfo
type ByName struct{ FileInfos }

func (fi ByName) Len() int {
        return len(fi.FileInfos)
}
func (fi ByName) Swap(i, j int) {
        fi.FileInfos[i], fi.FileInfos[j] = fi.FileInfos[j], fi.FileInfos[i]
}
func (fi ByName) Less(i, j int) bool {
        return fi.FileInfos[j].ModTime().Unix() < fi.FileInfos[i].ModTime().Unix()
}

// 指定されたファイル名がディレクトリかどうか調べる
func IsDirectory(name string) (isDir bool, err error) {
        fInfo, err := os.Stat(name) // FileInfo型が返る。
        if err != nil {
                return false, err // もしエラーならエラー情報を返す
        }
        // ディレクトリかどうかチェック
        return fInfo.IsDir(), nil
}

func main() {
        var arg string

        // -fオプション flag.Arg(0)だとファイル名が展開されてしまうようなので
        flag.StringVar(&arg, "f", "", "SearchPattern")
        // コマンドライン引数を解析
        flag.Parse()

        // カレントディレクトリの取得
        var curDir, _ = os.Getwd()
        curDir += "/"

        // 引数が取得できなければ、カレントディレクトリを使用
        if arg == "" {
                arg = curDir
        }

        // ディレクトリとファイル名に分割して格納
        var dirName, filePattern = path.Split(arg)

        // ディレクトリが無いならばカレントディレクトリを使用
        if dirName == "" {
                dirName = curDir
        }

        // 取得しようとしているパスがディレクトリかチェック
        var isDir, _ = IsDirectory(dirName + filePattern)

        // ディレクトリならば、そのディレクトリ配下のファイルを調べる。
        if isDir == true {
                dirName = dirName + filePattern
                filePattern = ""
        }

        // ディレクトリ内のファイル情報の読み込み[] *os.FileInfoが返る。
        fileInfos, err := ioutil.ReadDir(dirName)

        // ディレクトリの読み込みに失敗したらエラーで終了
        if err != nil {
                fmt.Errorf("Directory cannot read %s\n", err)
                os.Exit(1)
        }

        // ファイル情報を一つずつ表示する
        sort.Sort(ByName{fileInfos})
        for _, fileInfo := range fileInfos {
                // *FileInfo型
                var findName = (fileInfo).Name()
                var matched = true
                // lsのようなワイルドカード検索を行うため、path.Matchを呼び出す
                if filePattern != "" {
                        matched, _ = path.Match(filePattern, findName)
                }
                // path.Matchでマッチした場合、ファイル名を表示
                if matched == true {
                        fmt.Printf("%s\n", findName)
                }
        }
}
```

次回は説明を交えて、綺麗に分割していきます。
覚えておきたいLinuxコマンドやオプション

## 概要
頻繁には使わなそうだけ使えそうなコマンドやオプションのまとめです。

### renice
優先度を変更することができる。
ナイス値は-20～19で値が小さいほうが優先度が高い

```bash
### pid 3425のnice値を5に変更
$ renice 5 -p 3425
```

### expand
タブをスペースに変換する

```bash
$ cat -A tab.txt
hoge^I^Ifuga haga$

$ expand tab.txt | cat -A
hoge            fuga haga$
```

### aliasを無効化して実行

```bash
### aliasの設定
alias ls="ls -lF"

### 通常実行
$ ls
total 4
-rw-rw-r-- 1 vagrant vagrant 16 Mar 16 14:42 tab.txt

### aliasを無効化して実行
$ \ls
tab.txt
```

### chattr, lsattr
ext系のファイルシステムで利用できる拡張属性を設定。

```bash
### 拡張属性の確認
$ lsattr hoge
-------------e- hoge

### 通常の権限確認
$ ls -lh hoge
-rw-rw-r-- 1 vagrant vagrant 0 Mar 16 16:00 hoge

### 削除不可の属性を設定
$ sudo chattr +i hoge

### 通常の権限は変化無し
$ ls -lh hoge
-rw-rw-r-- 1 vagrant vagrant 0 Mar 16 16:00 hoge

### 拡張属性でiが付与されている
$ lsattr hoge
----i--------e- hoge

### ファイルが削除できない
$ rm hoge
rm: remove write-protected regular empty file `hoge'? yes
rm: cannot remove `hoge': Operation not permitted

### 削除不可の属性を削除
$ sudo chattr -i hoge

### 削除不可の属性が消えている
$ lsattr hoge
-------------e- hoge

### ファイルを削除可能
$ rm hoge
```

### ユーザのグループ変更(vipw)
vipwは/etc/passwdを編集するコマンド。
以下はvagrantグループのidを500(vagrant)から100(users)に変更する例

```bash
### vagrantはvagrantグループに属している
$ id vagrant
uid=500(vagrant) gid=500(vagrant) groups=500(vagrant),10(wheel)

### groupを500から100に変更
$ sudo vipr
vagrant:x:500:100::/home/vagrant:/bin/bash

### usersグループに変更された
$ id vagrant
uid=500(vagrant) gid=100(users) groups=100(users),10(wheel)
```

### nl
行数を表示する

```bash
### 以下のファイルの行数を表示する
$ cat -A list
a$
$     # 空行
b$
   $  # スペースがある行
c$
^I$   # タブがある行
d$

### cat -nは全部の行数を数える
$ cat -n list
     1	a
     2
     3	b
     4
     5	c
     6
     7	d

### nlは空行は数えない
$ nl list
     1	a

     2	b
     3
     4	c
     5
     6	d
```

### paste
ファイルを水平に連結

```bash
$ cat a
1
2
3

$ cat b
a
b
c

### pasteで水平に結合
$ paste a b
1	a
2	b
3	c
```
### whereis
コマンドのパスとマニュアルの場所を表示する

```bash
$ whereis ls
ls: /bin/ls /usr/share/man/man1/ls.1.gz
```
テンプレートの読み込み

```JScript
var templateFolder="C:\\Users\\Nao\\Documents\\個人フォルダ\\90.テンプレート\\";

function readTemplate(fileName) {
	var fs = new ActiveXObject("Scripting.FileSystemObject");
	var fileName = templateFolder + fileName;
	var ts = fs.openTextFile(fileName);
	var template_text = ts.ReadAll();
	ts.close();
	return template_text;
}

function textReplace(text, word1, word2) {
	word1 = word1.replace(/[\r|\n]/g, "");
	word2 = word2.replace(/[\r|\n]/g, "");
	var text = text.replace(new RegExp(word1, "g"), word2);
	return text;
}

SelectAll();
var text = GetSelectedString(0);

var lines = text.split("\n");
for (var cnt = 0 in lines) {
	if (cnt == 0) {
		// １行目はテンプレートファイル名とする
		template_file_name = lines[cnt];
		template_file_name = template_file_name.replace(/[\r|\n]/ig, "");
		template_file_name += ".tpl";
		template_text = readTemplate(template_file_name);
	} else {
		if (lines[cnt].match(/^(%.*%)=(.*)$/)) {
			r = lines[cnt].match(/^(%.*%)=(.*)$/);
			template_text = textReplace(template_text, r[1], r[2]);
		}
	}
}

ClipboardEmpty();
SetClipboardByFormat(template_text, 'CF_TEXT', 0, -1);
```

一行目がテンプレートのファイル名になるように改造。
出力はクリップボードに出力するようにした。
C言語の基礎 (メモリ構造) NO.3 備忘録


今までの勉強で、メモリにはデータが保存でき、そのデータの保存場所にはアドレスが付いていることがわかった。

#1つのアドレスにどれだけのデータが保存できる？
1byte(8ビット)のデータが格納できる。

つまり、1byteごとにアドレスが振られていることになる。

char型のデータは1アドレスにデータが格納されている。
int型のデータは4アドレスぶち抜きで格納されている。


```c++:test.cpp
  char       a;
  short      b;
  int        c;
  long       d;
  long long  e;
  float      f;
  double     g;
  
  CCLOG("char型      :%p",&a);
  CCLOG("short型     :%p",&b);
  CCLOG("int型       :%p",&c);
  CCLOG("long型      :%p",&d);
  CCLOG("long long型 :%p",&e);
  CCLOG("float型     :%p",&f);
  CCLOG("double型    :%p",&g);
```

実行結果
cocos2d: char型     :0x16fd4922f
cocos2d: short型    :0x16fd4922c
cocos2d: int型      :0x16fd49228
cocos2d: long型     :0x16fd49220
cocos2d: long long型:0x16fd49218
cocos2d: float型    :0x16fd49214
cocos2d: double型   :0x16fd49208

このようにアドレスは16進数で表す。
0→1→2→3→4→5→6→7→8→9→A→B→C→D→E→F

#なぜアドレスを16進数で表現するか
16進数では2桁でちょうど1byteの数値を表現できるから。


cocos2d: char型     :0x16fd4922f
cocos2d: short型    :0x16fd4922c
ここに注目してみる。
short型
0x16fd4922c
0x16fd4922d
の２byteを使用していることがわかる。

次のchar型
0x16fd4922f

となっており、ちょうど1byte分(0x16fd4922e)が未使用になっていることがわかる。


これは、__メモリ・アライメント(位置合わせ)__という。

#メモリアライメント
64ビットのPCを使用している場合、64ビットのCPUは一度に64ビット、つまり8バイトのデータのやり取りができる。
そのときに、アクセスするデータがアクセスしやすいアドレスに入っていると効率良くアクセスできる。

メモリの未使用領域ができても、利用効率をあげるために、非連続的に確保している。
FlowtypeでReact.propTypesを型チェックする


flowtype v0.6を使用

基本的には [最近のFlowtype事情とReact+Flowtype連携](https://gist.github.com/teppeis/a48558a71a98d6bee6c9 "最近のFlowtype事情とReact+Flowtype連携") を参考にした


```js
/* @flow */
var React = require('react');
var T = React.PropTypes;

var Component = React.createClass({
  propTypes: {
    message: T.string.isRequired
  },
  render: function(){
    var m: number = this.props.message;
    return <div key='foo'>{m}</div>;
  }
});
```

結果

```
$ flow

/Users/mizchi/playground/babel-flow/src/index.js:7:14,21: string
This type is incompatible with
  /Users/mizchi/playground/babel-flow/src/index.js:10:12,17: number

Found 1 error
```

呼び出し側は型チェックされてない?

```js
React.render(<Component message={1}/>, document.body)
```

No Errors


ReactComponentだけflowtypeで書くのアリかもなぁという気がした
python で "python -m antigravity" と実行してみましょう

python で "python -m antigravity" と実行してみましょう

```bash
$ python -m antigravity
```
importしても良いです。

```py
import antigravity
```

## 何が起きるの?
hai

```py
# antigravity.py

import webbrowser
import hashlib

webbrowser.open("http://xkcd.com/353/")

def geohash(latitude, longitude, datedow):
    '''Compute geohash() using the Munroe algorithm.

    >>> geohash(37.421542, -122.085589, b'2005-05-26-10458.68')
    37.857713 -122.544543

    '''
    # http://xkcd.com/426/
    h = hashlib.md5(datedow).hexdigest()
    p, q = [('%f' % float.fromhex('0.' + x)) for x in (h[:16], h[16:32])]
    print('%d%s %d%s' % (latitude, p[1:], longitude, q[1:]))
```
PlayFramework 2.2 系を 2.3 系に移行する際に変更した箇所

PlayFramework 2.2 系を 2.3 系に移行する作業をしたのですが、その際に変更した点についてまとめます。

だいたい [Play 2.3 Migration Guide](https://playframework.com/documentation/ja/2.3.x/Migration23) に書いてある内容だと思いますので、それを補完する資料としてお読みください。

# Controller クラスの implicit def 関数名の変更

Play 2.2 までは、レスポンスとともにセッションに値を設定したい場合は以下のように書けました。

```scala
def hoge = Action { implicit request =>
  Ok(views.html.index()).withSession {
    session + ("key" -> "value")
  }
}
```

`session` はどこから来たのかというと、以下のとおり定義されている implicit def 関数名です。

```scala
implicit def session(implicit request: RequestHeader)
```

Play 2.3 からは、上記関数名が `request2session` と変更されているため、そのままではコンパイルエラーとなります。
implicit def から取得するのはそこまで分かりやすくもないため、 `request` から取得するように変更しましょう。

```scala
def hoge = Action { implicit request =>
  Ok(views.html.index()).withSession {
    request.session + ("key" -> "value")
  }
}
```

他にも `request2hoge` のように変更されている関数名がありますので、コンパイルが通らなくなった際には関数名を確認してみるといいでしょう。


# SimpleResult -> Result への変更

リクエストの結果を表す型が、 `SimpleResult` から `Result` へと変更されています。
こちらはDeplecateが指定されているため、コンパイルエラーとはなりませんが変更しておきましょう。

基本的には何も考えずに置換して問題ないと思います。（詳しくない）


# WS 関連

WS を利用する際の変更点として、`play.api.Play.current` のインポートが必要となりました。

これについても import を追加するだけでOKです。

# まとめ

PlayFramework 2.2 から 2.3 に移行した際に変更した箇所についてまとめてみました。
使用している機能によってはもっと修正が必要な箇所が多いと思いますが、似たような問題が発生した方の参考になれば幸いです。
Capybaraで全てのリンク先のページに対して処理する

# 概要

Capybaraで全てのリンク先のページに対して処理をしようとして、ハマったので作りました。
リンク先のページに対して処理する4つのサンプルコードを置いておきます。

# 実装

全てのaタグに対して処理をします。

```html:処理対象のHTMLサンプル
<a href="./1.html">1</a>
<a href="./2.html">2</a>
<a href="./3.html">3</a>
```

## ページを遷移して処理するタイプ
全てのリンク先へページ遷移して処理します。

```rb:画面遷移するタイプ
for i in 0..(all('a').length-1)
  all('a')[i].click
  # 遷移後のページでの処理
  go_back
end
```

## 新しいウインドウを開いて処理するタイプ
全てのリンク先を新しいウインドウで開いて処理します。

```rb:新しいウインドウを開くタイプ
all('a').each do |link|
  url = link[:href]
  parent_window = current_window
  switch_to_window(open_new_window)
  visit(url)
  # 遷移後のページでの処理
  current_window.close
  switch_to_window(parent_window)
end
```

## リンク先のページでの処理をブロックで渡す関数
全てのリンク先のHTMLを標準出力します。

```rb:ecec_all_link
def exec_all_link
  for i in 0..(all('a').length-1)
    all('a')[i].click
    yield
    go_back
  end
end
```

```rb
ecec_all_link { puts title }
#=> Page1 Title
#   Page2 Title
#   Page3 Title
```

## リンク先のページでの処理をブロックで渡して返り値をとる関数


```rb:collect_all_link
def collect_all_link
  result = []
  for i in 0..(all('a').length-1)
    all('a')[i].click
    result.push yield
    go_back
  end
  result
end
```

```
p collect_all_link { title } #=> ["Page1 Title", "Page2 Title", "Page3 Title"]
```

# 失敗例
## ハマったパターン1
別のリンクを踏むと戻っても元居たページの情報が取れない

```rb
all('a').each do |link|
  link.click
  go_back
end
```

## ハマったパターン2
ページが移動しているのでループ内でも要素が取れない

```rb
all('a').each do |link|
  parent_window = current_window
  switch_to_window(open_new_window)
  # この位置でlink[:href]が取得できない
  visit(link[:href])
  current_window.close
  switch_to_window(parent_window)
end
```

# まとめ

Capybaraなどブラウザを使うと、スコープがコード上正しくてもブラウザの挙動に依存するのがわかっていい勉強になりました。
Seleniumを使って動作確認していて、他のパターンは試してないです。
ご指摘などありましたら、よろしくお願いします。

# ライセンス

こちらのコードはMITライセンスです。
【CentOS, PHP】CentOSへのPHP5.6, MySQL5.6環境の構築



## リポジトリの追加

### epelリポジトリの登録

	# rpm -ivh http://ftp.riken.jp/Linux/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm

### remiリポジトリの登録

	# rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm

### mysql-communityの登録

	# yum install -y http://repo.mysql.com/mysql-community-release-el6-5.noarch.rpm


## MySQLのインストール

### MySQLのインストール
下記コマンドでは、5.6系のバージョンがインストールされる。

	# yum install -y mysql mysql-server mysql-devel 
	
### PHPMyAdminのインストール
(必要であればPHPMyAdminを下記コマンドでインストールできます）

	# yum install -y --enablerepo=remi,remi-php55 phpMyAdmin


## PHP5.6のインストール

### 依存関係のあるパッケージのインストール

	# yum install -y --enablerepo=epel libmcrypt libtidy

### PHP5.6のインストール

	# yum install -y --enablerepo=remi,remi-php56 php php-devel php-pear php-mbstring php-xml php-mcrypt php-gd php-pecl-xdebug php-opcache php-pecl-apcu php-fpm php-phpunit-PHPUnit php-mysqlnd
	

## Apacheのインストール

	# yum install -y httpd httpd-devel
	

## まとめ

とりあえず現状でPHP×MySQLで開発するのに必要十分な環境の構築が完了です。
できればNginxにしたいという話はありつつですが、とりあえずはApacheでの環境構築とします。
Vim に惚れるシーン（QuickFix リストを編集＆再読込する）

# シーン 6

Vim には、コンパイルエラーの一覧や grep による検索結果一覧などを保持する QuickFix リストというものがあります。QuickFix リストでは、ファイル名／行番号／桁番号 などを管理していて、簡単に該当箇所にジャンプすることができるので、とても便利です。

`:vimgrep` などで複数のファイルに対して、ある文字列を検索した時、想定していない余分な箇所までマッチしてしまったことはありませんか？ この場合、検索条件を見なおしてから再検索することになると思いますが、検索条件を見なおすのも、それを再入力するのも、またこれらの手順を何度か繰り返すことになるのも、全く効率的ではありません。

# どうしたい？

最初に検索した結果（QuickFix リスト）の中の余分なマッチ行を直接削除できるとどうでしょうか？QuickFix リストを編集することができれば、目的の検索を行うための複雑な正規表現を何度も考える必要もなく、もっと効率的・段階的・直感的にマッチ箇所を絞り込んでいくことができます。

# どうする？

複数ファイルの検索から、QuickFix リストの変更、QuickFix リストの再読み込みの手順は、下記のようになります。

  1. まず `:vimgrep` で検索した結果を QuickFix リストに表示します。
  2. QuickFix リストを変更可能にします。
  3. QuickFix リストを編集します。（不要行の削除）
  4. 正常にジャンプできるように、QuickFix リストを再読み込みさせます。

QuickFix リストの基本的な操作（QuickFix リストを開いたり、QuickFix リストの該当行にジャンプしたり）は、本稿では説明しません。

## QuickFix リストを変更可能にするには？

QuickFix リストは、通常は変更できない状態で表示されます。まず最初に QuickFix リストを変更可能な状態にします。（QuickFix リストのバッファをアクティブにした状態で、下記のコマンドを実行してください）

```
:set modifiable
```

これで、QuickFix リストは変更可能になりました。余分なマッチ行などを `:g/re/d`  などで削除していきましょう。勿論、1行ずつ削除しても問題ありません。

## QuickFix リストを再読み込みするには？

QuickFix リストの内容を変更しただけでは、ジャンプ先の情報までは更新されないので、表示上のマッチ箇所と実際のジャンプ先との整合性が崩れてしまいます。
変更した QuickFix リストの内容を再読込させて、ジャンプ先の情報を正しく更新してやる必要があります。

QuickFix を再読み込みするには、`:cbuffer` を使用しますが、Vim 標準で設定されている `errorformat` では、vimgrep の検索結果を正しくパースしてくれないので注意が必要です。vimgrep の検索結果は…

```
sample1.txt|45 col 11| 該当行の文字列
sample2.txt|33 col 32| 該当行の文字列
    :
```

のようになっているので、この形式を正しくパースできるように、事前に `errorformat` を次のように設定しておきましょう。

```
:set errorformat=%f\|%l\ col\ %c\|\ %m
```

ファイル名 `%f` 、行番号 `%l` 、列番号 `%c` 、検索行 `%m` を設定しています。`|` や 空白文字 は、`\` でエスケープしています。

正しく、errorformat が設定できたので、いよいよ QuickFix リストのバッファを再読み込みさせてみましょう。（QuickFix リストのバッファをアクティブにした状態で、下記のコマンドを実行してください）

```
:cbuffer
```

バッファが再読み込みされたので、実際にマッチ行へのジャンプを試してみてください。


# まとめ

Vim では、QuickFix リストもバッファの一種なので、通常のバッファと同様に編集することができます。`errorformat` を適切に設定することで、編集後のバッファを QuickFix リストとして再読込させることができました。

QuickFix リストのマッチ行に対して、一括マクロを実行するような場合に、ちょっとした修正ができると嬉しいこともあるのではないでしょうか？
Watchifyでbrowserifyを差分ビルド


https://github.com/maxogden/wzrd はアクセスする度に変更を吐き出すのだが、watchify は差分を管理してくれる。

reactとか無駄に巨大なんで、require('react') しただけで1.2秒ぐらい待たないといけなくなって辛かった。そういう問題を解決できる。


## 簡単な使い方

`npm install -g watchify`

```
$ watchify lib/index.js -o public/bundle.js -v
```

これだけ。-v で verboseみないと動いてるのかよくわからなかったので付けたほうがよさそう。

某アプリのビルドが3.8秒から0.3秒になって最高

![](http://i.gyazo.com/d0f750c4f60f7c01ab816d5c62189abf.png)


## 自分の使い方

一旦すべてをjsにして吐き出す。

- gulpで `src/**/*` -> `lib/**/*.js`
- lib/index.js を基準にbrowserify する

gulp-watchify を使った。

https://github.com/marcello3d/gulp-watchify

arda-starter-project では毎度のビルドの遅さが問題になっていたので、watchifyを採用して高速になった。最高。


![](http://i.gyazo.com/0f90b124a0ef0832e319e03edfe312bd.png)



examplesが参考になる

https://github.com/marcello3d/gulp-watchify/blob/master/examples/simple/gulpfile.js


## gulpfile.coffee

以下arda-starter-projectのgulpfile.coffeeです。


```coffee
gulp   = require 'gulp'
shell  = require 'gulp-shell'
coffee = require 'gulp-coffee'
sass   = require 'gulp-sass'
jade   = require 'gulp-react-jade'
watchify = require 'gulp-watchify'

gulp.task 'default', ['build']
gulp.task 'build', [
  'build:ts'
  'build:coffee'
  'build:jade'
  'build:css'
]

gulp.task 'build:ts', shell.task [
  '$(npm bin)/tsc -d -m commonjs  --preserveConstEnums -t es5 --sourceMap --outDir lib src/entry.ts'
]

gulp.task 'build:coffee', ->
  gulp.src('src/**/*.coffee')
    .pipe(coffee())
    .pipe(gulp.dest('lib'))

gulp.task 'build:jade', ->
  gulp.src('src/**/*.jade')
    .pipe jade()
    .pipe(gulp.dest('lib'))

gulp.task 'build:css', ->
  gulp
    .src('src/styles/style.scss')
    .pipe(sass())
    .pipe(gulp.dest('public'))

gulp.task 'build:web', shell.task [
  '$(npm bin)/browserify -o public/bundle.js lib/index.js'
]

watching = false
gulp.task 'enable-watch-mode', -> watching = true
gulp.task 'browserify', watchify (watchify) ->
  gulp.src 'lib/index.js'
    .pipe watchify
      watch: watching
    .pipe gulp.dest 'public/js/bundle.js'

gulp.task 'watchify', ['enable-watch-mode', 'browserify']
gulp.task 'watch', ['build', 'enable-watch-mode', 'watchify'], ->
  gulp.watch 'src/**/*.coffee', ['build:coffee']
  gulp.watch 'src/**/*.ts', ['build:ts']
  gulp.watch 'src/**/*.jade', ['build:jade']
  gulp.watch 'src/styles/**/*.scss', ['build:css']
```
UIBarButtonItemに自作画像を設定すると、青く塗りつぶされてしまう問題

# 今日の結論
UIImageは
`imageWithRenderingMode(UIImageRenderingMode.AlwaysOriginal)`
から画像を生成する

 ↓↓↓ 例 ↓↓↓

```swift
let button = UIBarButtonItem()
button.image = UIImage(named: "xxxxx.png")?.imageWithRenderingMode(UIImageRenderingMode.AlwaysOriginal)
button.style = UIBarButtonItemStyle.Plain
button.action = "hogehogehoge:"
button.target = self
self.navigationItem.rightBarButtonItem = addButton
```

# 背景
## 問題
UIBarButtonItemに、自作した.pngファイルを設定したが、
下図のように**青く塗りつぶされたボタン**が表示されてしまった。

![スクリーンショット 2015-03-16 23.49.38.png](https://qiita-image-store.s3.amazonaws.com/0/61953/ed686232-3c10-2347-5c14-7173c55d0075.png)


## 理由
iOS7以降、デフォルトでtintColorに設定された色に塗りつぶされるらしいです。
http://program.station.ez-net.jp/special/handbook/objective-c/xcode5/button.asp
SwiftでNSURLをStringに変換

## absoluteString

NSURL型をString型に変えたいとき。
`absoluteString`を使う。

## 例

    // Pageがすべて読み込み終わった時呼ばれる
    func webViewDidFinishLoad(webView: UIWebView!) {
        if let currentUrl = webView.request?.URL.absoluteString {
            if currentUrl == "https://mobile.twitter.com/" {
                println("true")
            }else{
                println("false")
            }
        }
    }


## 参考

* [ios - Convert an NSURL to an NSString - Stack Overflow](http://stackoverflow.com/questions/8082719/convert-an-nsurl-to-an-nsstring)
RailsでtasksなどからController#actionのレスポンスを取得する


**参考**
+ [Using a headless Rails for tasks and tests - The Pug Automatic](http://thepugautomatic.com/2014/06/headless-rails-for-tasks-and-tests/)
+ [coderwall.com   establishing geek cred since 1305712800](https://coderwall.com/p/vn81ha/rake-task-to-call-a-rails-controller-method)


```rb
app = ActionDispatch::Integration::Session.new(Rails.application)

path = app.items_path

if app.get(path) == 200
  app.response.body
end
```


ActionDispatchってはじめて知った。
Scala事始め

Scalaには興味を持ちつつも、変態的な文法に苦戦していたが、最近もう一度挑戦してみた。
まずは、基本的な覚え書きから。

メインクラスであるHello.scalaでは、'def main (args: Array[String])' がエントリになるようだ。
これを実行クラスにするには、`object`とするようだ。

```Hello.scala
object Hello{
  def main (args: Array[String]) {
    var dog = new Animal()
    println(dog.say())

    var cat = new Animal("タマ", 3)
    println(cat.say())
  }
}
```

クラス定義でのポイントは、デフォルトコンストラクタはそのままクラス定義の部分が実行されるようだ。
そして補助コンストラクタでは、先頭で`this()`を呼び出す必要があるようだ。

```Animal.scala
class Animal {
  var name : String = "NO-NAME"
  var age : Int = 0

  //コンストラクタ
  def this(name : String, age: Int)={
    //デフォルトコンストラクタ
    this()
    this.name = name
    this.age = age
  }

  def say(): String ={
    return "My name is " + name + "."
  }
}
```

今日は風邪気味なので、まずはここまで。
参考にならないほどシンプルな掲示板

```php
<?php
session_id('FIXED');
session_start();
if (($msg = (string)filter_input(INPUT_POST, 'msg')) !== '') {
  $_SESSION['log'][] = $msg;
  $_SESSION['log'] = array_slice($_SESSION['log'], -100);
  header('Location: ?');
  exit;
}
?><html>
<head><meta charset="utf-8" /></head>
<body>
<form action="?" method="post">
<input type="text" name="msg" />
<input type="submit" value="投稿" />
</form>
<?php foreach ((array)$_SESSION['log'] as $msg): ?>
<?php echo htmlspecialchars($msg, ENT_QUOTES);?><hr />
<?php endforeach;?>
</body>
</html>
```

※参考にしないでください
【cocos2d-x】zipファイルを操作する

[元ブログ　【cocos2d-x】zipファイルを操作する - 技術は熱いうちに打て！](http://blog.dalt.me/1127)

cocos2d-xではunzipと言うファイルが存在します。
これを使えば比較的簡単にzipファイルを操ることが出来ます。

## サンプルプログラム
 
```cpp
string filepath = FileUtils::getInstance()->getWritablePath() + "temp.zip";
unzFile zippedFile = unzOpen(filepath.c_str());

unz_global_info global_info;
if (unzGetGlobalInfo(zippedFile, &amp;global_info) != UNZ_OK)
{
    unzClose(zippedFile);    
    return;
}

unzGoToFirstFile(zippedFile);
for (int i = 0; i &lt; global_info.number_entry; i++)
{
    char filename[100];
    if (unzGetCurrentFileInfo64(zippedFile, NULL, filename, 100, NULL, 0, NULL, 0) != UNZ_OK)
    {
        unzClose(zippedFile);
        break;
    }
    
    string fileName(filename);
    CCLOG("%s", fileName.c_str());
    unzGoToNextFile(zippedFile);
}
unzClose(zippedFile);
``` 

## 解説

それでは解説を入れていきましょう。

### L.1, L.2
パスを指定し、unzFile型の変数へと格納していきます。
これはunzipされた結果のハンドルオブジェクトです。
以後はこの変数を用いてunzipされた結果を見ていきます。
もし、失敗していればNULLが返却されます。

その場合はunzip.cppのL.626〜L.738辺りにブレークポイントを置いてしらべてみましょう。

### L.5
得られたzipの情報を取得します。
unz_global_infoは以下の様な構造体です。

```cpp
typedef struct unz_global_info_s
{
    uLong number_entry;
    uLong size_comment;
} unz_global_info;
```
### L.12
zip内のファイルの最初のファイルにカーソルを合わせます。

### L.13
for文で、zip内に含まれるファイル数分回す様にしています。

### L.15
filinameはファイル名を保持するためのchar型の配列です。ここでは100と決め打っていますがファイル名を確保出来るように十分な大きさを入れておいてください。

### L.16
ファイル名を取得しています。
そして、それをstringに変更し、出力すると言った流れです。

### L.24
次のファイルにカーソルを合わせます。

### L.26
zip内のファイル操作が終わったら必ずunzCloseメソッドを呼びます。

## 一つ困った事が...

多分zipファイルを操るときってどっかにリソースがあって、それをダウンロードして来た後だと思うんです。
unzipのインターフェースを見るとconst char* pathばかりが並びローカルに保存してあるzipファイルしか扱いませんと言わんばかり。
**HTTPResponseのgetResponseData()で取得出来るstd::vector\<char\>*型の変数から直接unzip出来る方はないのか**なぁと思ったりしています。

誰かのお役に立てば。
Dropwizard 0.8.0 への移行でおそらく最初につまづく点

Dropwizard 0.8.0 から ViewBundle のコンストラクタが変更になっている。
そのため 0.7.x からそのまま移行しようとした際にまずはつまづくことになる。
（別エントリのシンプルチャットサーバーではビューを使っていないため問題が顕在化していない）

##### 2015/06/25 0.8.1の件を追記

Dropwizard 0.9.x系の開発が進む中、自分のアプリケーションを0.8.0から0.8.1ベースに置き換えようとして引っかかった点。

* bundleの関連づけの記述が0.7.x系と同じスタイルに戻っている

要は下の記述のうち、旧版として書いているスタイルのままでよいと言うこと。
最初から同じにしておいてほしかった気もするが…


対象はアプリケーションメインクラスの initialize メソッド内の記述。
旧版では

```java
@Override
public void initialize(Bootstrap<ExampleAppConfiguration> bootstrap) {
	bootstrap.addBundle(new ViewBundle());
	bootstrap.addBundle(new AssetsBundle());
}
```
としていた箇所が0.8.0では次のようになる。（下の事例はテンプレートエンジンに freemarker を使っているので拡張子に ftl を指定している）

```java
@Override
public void initialize(Bootstrap<ExampleAppConfiguration> bootstrap) {
	bootstrap.addBundle(new ViewBundle<ExampleAppConfiguration>() {
		@Override
		public ImmutableMap<String, ImmutableMap<String, String>> getViewConfiguration(ExampleAppConfiguration config) {
			ImmutableMap.Builder<String, ImmutableMap<String, String>> builder = ImmutableMap.builder();
			builder.put(".ftl", ImmutableMap.<String, String> of());
			return builder.build();
		}
	});
	bootstrap.addBundle(new AssetsBundle());
}
```

他には以下のような対応が必要になるはず。

* commons-lang3 へ更新されていることによる必要な対応
 * import 文の書き換え
 * escapeJavaScript(String) を escapeEcmaScript(String) へ書き換え
 * RandomUtils が使えなくなるので別の手段へ切り替え
* bson4jackson 2.4 を使っている場合の対応
 * bson4jackson が参照する jackson は2.4 系なので dependency ブロック内で「jackson-core」「jackson-annotations」「jackson-databind」を exclude する
* jersey-media-multipart を ver1 系統から ver2 系へ更新 ~~~すると引数の受け方を変える必要がある~~~
 * アプリケーションクラスの run メソッド内へ「environment.jersey().register(MultiPartFeature.class);」を追記

##### 2015/0318
jersey-media-multipartを使用するときの対応を盛大に勘違いしていた。修正。

参考リンク
* [dw 0.8.0 viewbundle](https://groups.google.com/forum/#!topic/dropwizard-user/si_OUM8Yffk "")
* [@FormDataParam support](https://github.com/dropwizard/dropwizard/issues/732 "")
エラー'オプション機能は実装されていません。'

.NET フレームワークから ODBC 経由で Oracle にクエリを発行する際に以下のようなエラーが発生する。

### エラー

```
ERROR [HYC00] [Oracle][ODBC][Ora]オプション機能は実装されていません。
```

```
Error [HYC00] SQL call failed. Optional feature not implemented.
```

###発生する状況

例えば「TIMESTAMP (6) WITH LOCAL TIME ZONE DEFAULT localtimestamp」のような型のカラムを含むテーブルに対して ...

```sql
SELECT * FROM theTable
```

...のようなクエリを投げると発生する場合がある。
面倒でも ...

```sql
SELECT TO_CHAR(theColumn, 'yyyy/mm/dd hh24:mi:ss.ff3') AS theTsColumn FROM theTable
```

...と、文字列変換などをすること。

SELECT 文だけでなく、また Oracle に限らず、.NET が「どの型を使えば良いか」が見つけられない場合に発生する可能性がある。テーブル定義を確認し、ややこしそうな型が無いかどうかを確認すること。


---

エラーメッセージでググってもイマイチ明確な答えが見つからなかったので、かなりハマってしまった。同じような目に遇う人（未来の自分を含む）の一助になりますように。
Java自作Webフレームワーク

# 自作フレームワーク
このフレームワークは私が学生時代に作ったWebフレームワークに少し手を入れようと思っているものです
元々は学校の課題としてチーム開発を行った際、デフォルトのサーブレット実装では記述が冗長になりすぎるため、より簡潔に記述するためのフレームワークが欲しい、ということで実装したものでした

## 概観
ざっとしたクラス図は以下のようなものです
敢えて省略しているものや記述漏れ等あるかもしれません
![クラス図0.jpg](https://qiita-image-store.s3.amazonaws.com/0/72322/1dbbf3a7-b890-699d-3439-7a6f0a0c4b54.jpeg)


## 特徴
### サーブレットの延長線上を意識したAPI
私のいたチームでは個々の経験がばらばらだったため、全員がある程度触った経験があるサーブレットからの乖離を少なくしよう、という方針を立てていました
### 記述量を極力減らす
特にリクエストパラメータの扱いやレスポンスの扱いについて言えることですが、サーブレットAPIではただただ煩雑で冗長な記述が多いです。ここをいかに簡略化するかが大きな課題でした

## サンプルコード
### リクエストパラメータの処理
#### まずは普通のサーブレットコード
サーブレットのエクササイズでよくあるコードとして、以下のようなものがありがちだと思います
```
Book newBook = new Book();
newBook.setTitle(request.getParameter("title"));
newBook.setAuthor(request.getParameter("author"));
newBook.setPrice(Integer.valueOf(request.getParameter("price")));
newBook.setPublisher(request.getParameter("publisher"));
// 以下ひたすら退屈で冗長なコード
```
これを書いてる時間がどうしようもなく無駄に思えますよね

#### 私たちの出した一つの答え
これを改善すべく案を出し合った結果、採用されたのは以下のような機能でした
```
// このrequestはRequestというHttpServletRequestをラップする自作クラス
Book newBook = request.getParamsTo(Book.class);
```
察しの良い方は想像がついたかと思いますが、JavaのリフレクションAPIを使い、パラメータ名と一致する名前を持つフィールドに、その値を紐づけています
しかしHTML上のフィールド名とJavaのフィールド名が必ずしも一致させられない場合があるので、以下のような機能も用意しました
```
@Param(name = "book_name")
private String name;
```
アノテーションでHTML上のフィールド名を明示することで、名前が違っても紐づけられるようにしているわけです

また、逆に同一名のフィールドが存在するが、値をセットしたくない場合は
```
@Ignore
private Integer id;
```
のようにして無視させることもできます

### レスポンスの処理
レスポンスの処理も全て自前で実装するとかなり面倒な処理だと思います
#### サーブレットの場合
```
RequestDispatcher dispacher = request.getRequestDispatcher(url);
dispatcher.forward(request, response);
```
さらにこれに加えてtry~catch文を強制されるので、地味に煩雑な記述になりがちです

#### 解決策
```
return new Forward(url);
```
非常に簡潔になったと思います
このフレームワークではコントローラ内でレスポンスの処理記述を書くのではなく、レスポンスを処理する責務を負ったResponseインタフェースの実装がレスポンスを処理します
コントローラはそのResponseのインスタンスを返すだけで、後の処理はフレームワークから呼ばれるResponseが行ってくれます
（当時のプロジェクトではクラス図に示したいくつかの組み込み実装だけで十分間に合ったため、アプリケーション側でResponseを新たに実装する必要はありませんでした）
また、エラーハンドリングはフレームワークが行うためtry~catchを強制されることもなくなりました

## 結びに
ルーティングや設定ファイルの記述については大して面白い話もないので省略しました
ソースコードについては手元にあるものの状態が古かったり整合性が取れてないため、追々手直ししつつGitHubなりで公開していけたらと思います


## おまけ：検索機能の実装例
ビューから本の検索条件としてフィールドの値を受け取り、その値を持った本を検索してJSON形式で返す、という機能について

```
public BookController {
  public Response search(Request request) {
    // まずはビューから送られてきた検索パラメータをBookに投入
    Book searchCondition = request.getParamsTo(Book.class);
    // 次に、同じ値を持つBookのリストを取得
 　 List<Book> books = new FasterDAO().find(searchCondition);
  　// 検索結果をJSON形式で返す
    return new Json(books);
  }
}
```

FasterDAOはクラス図に書いてありませんが、JPAをラップしてより簡単に使えるようにしたクラスです
このように冗長でありながら実際には値しか変わらないような処理をとことん汎用的なクラス、メソッド化することで作業の効率化を狙いました
C言語の整数リテラルの謎


```num_literal.c
#include <stdio.h>
#include <limits.h>

int main(void)
{
	int a;
	int b;
	int c;
	a = INT_MIN;
	b = -2147483648;
	c = -0x80000000;
	printf("(a == b): %d\n", (a == b));
	printf("(b == c): %d\n", (b == c));
	printf("(c == a): %d\n", (c == a));
	printf("(INT_MIN == -2147483648): %d\n",
			(INT_MIN == -2147483648));
	printf("(-2147483648 == -0x80000000): %d\n",
			(-2147483648 == -0x80000000));
	printf("(-0x80000000 == INT_MIN): %d\n",
			(-0x80000000 == INT_MIN));
	printf("sizeof(a): %zd\n", sizeof(a));
	printf("sizeof(b): %zd\n", sizeof(b));
	printf("sizeof(c): %zd\n", sizeof(c));
	printf("sizeof(INT_MIN): %zd\n", sizeof(INT_MIN));
	printf("sizeof(-2147483648): %zd\n", sizeof(-2147483648));
	printf("sizeof(-0x80000000): %zd\n", sizeof(-0x80000000));
	return 0;
}
```

```terminal
$ clang -Wall -std=c11 num_literal.c -o num_literal && ./num_literal
(a == b): 1
(b == c): 1
(c == a): 1
(INT_MIN == -2147483648): 1
(-2147483648 == -0x80000000): 0
(-0x80000000 == INT_MIN): 1
sizeof(a): 4
sizeof(b): 4
sizeof(c): 4
sizeof(INT_MIN): 4
sizeof(-2147483648): 8
sizeof(-0x80000000): 4
```

`(-2147483648 == -0x80000000)`だけなんで1じゃないんだ、どう計算しても同じだろう。それに`-2147483648`だけがサイズ8って仲間はずれでかわいそうじゃないか。

って、突っ込みたいところですが、C言語マスターの皆さんはどうしてこうなるかはもうおわかりですよね。解説なんていらないっしょ？言っておきますけど、Clangのバグじゃないですよ。GCCでも結果は同じです。

[解説編](http://qiita.com/raccy/items/e793f67f7e0ab98ef0d9)へ続く。