OmniAICreator/Qiita-1.07M huggingface dataset:
部分適用された関数とカリー化された関数は何が違うのか？

## はじめに

この記事では部分適用された関数とカリー化された関数の違いを考えてみたいと思います。詳細については後述の参照 URL を参考にしていただければと思います。

動作確認した`Scala`のバージョンは2.9.2です。

## 部分適用された関数とは？

部分適用された関数を考えるために、次のような２つのパラメータを持つ関数を考えます。

``` scala
def add(x: Int, y: Int): Int = x + y
```

これは２つのパラメータを持つ関数の定義ですね。

### プレースホルダー構文

`Scala`にはプレースホルダー構文という構文があり、パラメータのプレースホルダーとして、アンダースコアを使うことができます。このプレースホルダー構文を使うことによって、一旦、関数のパラメータに値を指定することを保留することができます。

#### 部分適用された関数１

例えば、パラメータ`x`には値を指定できるけれど、パラメータ`y`には値を指定できない場合、次のようになります。

``` scala
add(137, _: Int)
```

これは関数の呼び出しですね。

通常の関数の呼び出しと違うところは、アンダースコアを使ってパラメータに値を指定することを保留しているところです。そして、この関数の呼び出しは新しい関数を返します。この新しい関数が部分適用された関数ですね。

#### 部分適用された関数２

繰り返しになりますが、パラメータ`y`には値を指定できるけれど、パラメータ`x`には値を指定できない場合、次のようになります。

``` scala
add(_: Int, 139)
```

#### 部分適用された関数３

プレースホルダー構文のアンダースコアはパラメータに値を指定することを保留すること以外に、パラメータリスト全体を保留することもできます。つまり、パラメータ`x`とパラメータ`y`に値を指定できない場合、次のようになります。

``` scala
add _
```

ポイントは`add(_)`ではないということだと思います。これだと、１つパラメータを持つ関数で、そのパラメータに値を指定することを保留するということになりますね。

## カリー化された関数とは？

カリー化された関数を考えるために、冒頭で定義した関数と同じように２つのパラメータを持つカリー化された関数を考えます。

``` scala
def add(x: Int)(y: Int): Int = x + 2 * y
```

一見、このカリー化された関数は冒頭で定義した関数と同じように見えます。しかし、パラメータリストを１つ持つ関数ではなく、パラメータリストを２つ持つ関数であるところが違っています。

このカリー化された関数の呼び出しはいくつか考えられます。

``` scala
add(1)(2)
add(1) // コンパイルエラー
add(1)_
add(1)(_) // コンパイルエラー
add _
add(_) // コンパイルエラー
val addY = add(1)_ // パラメータxに値を指定
addY(2) // パラメータyに値を指定
```

個人的には、これがカリー化された関数なのかどうか少し疑問ですが、そういうものなのだと思います。疑問があるところは、`add(1)`がコンパイルエラーになるところです。

例えば、関数リテラルを用いて定義されたカリー化された関数は`add(1)`のような関数の呼び出しでコンパイルエラーになりません。

``` scala
def add(x: Int) = (y: Int) => x + 2 * y
```

この右辺は、`x`が自由変数ですから、開いた項ですね。そして、開いた項をパラメータ`x`で閉じた項にしていますね。

``` scala
add(1)
val addY = add(1)
addY(2)
```

こちらのほうがカリー化された関数という感じがしますね。

## 何が違うのか？

あまり、理解できていないかもしれませんが、ここまでの話をまとめておきたいと思います。

まず、部分適用というのは、関数の呼び出しの話ですね。だから、カリー化された関数でもパラメータを部分適用することはできます。

そして、カリー化された関数というのは、関数の定義の話ですね。つまり、１つのパラメータリストを持つ関数ではなく、２つのパラメータリストを持つ関数のことですね。もしくは、複数のパラメータリストを持つ関数のことですね。

この記事では扱いませんでしたが、カリー化された関数は引数として関数をとる関数として利用されることが多いみたいです。

## 参照 URL

[第19章：Scalaでカリー化と部分適用 - Qiita](http://qiita.com/f81@github/items/e8bfab96b4be9e404840)
[カリー化と部分適用（JavaScriptとHaskell） - Qiita](http://qiita.com/7shi/items/a0143daac77a205e7962)
rvest で声優の男女データをスクレイピング #rstatsj

こういう話がある。

- [声優のプロフィール - 驚異のアニヲタ社会復帰への道](http://d.hatena.ne.jp/MikuHatsune/20150517/1431857742)

しかし、この記事でスクレイピングしている声優のプロフィールページには男女のデータが載っていないようだ。

<blockquote class="twitter-tweet" lang="ja"><p lang="ja" dir="ltr">なんかもういろいろめんどくさいので声優の男女のアノテーションデータ持ってる人いないですか</p>&mdash; YF (@Med_KU) <a href="https://twitter.com/Med_KU/status/599910040678477824">2015, 5月 17</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

ただし、同じサイトの声優一覧ページを見るとアイコンの色により男女が判定できる。

- [声優一覧（あ行） - 声優データベース](http://lain.gr.jp/voicedb/profile/list/cid/1)

こいつをスクレイピングして男女データを作ってみよう。

```r:R
library(rvest)
library(pforeach)

npforeach(i=1:10, .c=rbind)({
  cat(i, "\n")
  url <- sprintf("http://lain.gr.jp/voicedb/profile/list/cid/%d", i)
  
  Sys.sleep(10)
  html <- html(url)
  
  li_nodes <- html %>% html_nodes(xpath = '/html/body/div/div/div[2]/ul/li')
  
  url <- li_nodes %>% html_nodes(xpath = "a") %>% html_attr("href")
  name <- li_nodes %>% html_nodes(xpath = "a") %>% html_text %>% iconv("utf8", "cp932")
  sex <- li_nodes %>% html_nodes(xpath = "img") %>% html_attr("title") %>% iconv("utf8", "cp932")
  
  data.frame(url=url[-(1:4)], name=name[-(1:4)], sex)
}) -> result

write.csv(result, file="voice_actors2.csv", row.names=FALSE)
```

結果はこちら。

- [voice_actors2.csv](https://dl.dropboxusercontent.com/u/432512/20150517_voice_actor/voice_actors2.csv)

|url           |name |sex |
|:---------------------|:------------|:---|
|/voicedb/profile/1040 |ALLANSCHINTU |男性  |
|/voicedb/profile/3116 |会一太郎         |男性  |
|/voicedb/profile/2193 |相上和音         |女性  |
|/voicedb/profile/3215 |相生千恵子        |女性  |
|/voicedb/profile/1003 |愛川欽也         |男性  |

Enjoy!

## 関連

- [rvest すげえ。](http://qiita.com/hoxo_m/items/264b45684fcb657cf285)
- [ggplot2 に依存しているパッケージ一覧を rvest で取得する](http://qiita.com/hoxo_m/items/c53b6cfbd5ada5fe1642)
- [rvest でログインしてスクレイピング](http://qiita.com/hoxo_m/items/59bedbf7e4c7c99cbf5a)
gitWatch > commit message > [repurpose] legacy v:servername > 用途の変更

https://github.com/neovim/neovim/commit/f4423c96973c1c35945c5be9b22331550be92ce8

v:servernameの元々の用途とは別の用途に変更時にrepurposeというコミットメッセージをつけているのを見つけた。

change the purpose ofよりは短くコメントできていい。
Sublime text 3でサイドバーの文字の大きさを変える

使っていてサイドバーの文字の大きさ（画像の矢印部分）がちょっとデカイなと思ってたので小さくすることに。

![スクリーンショット 2015-05-17 21.16.45.png](https://qiita-image-store.s3.amazonaws.com/0/50216/4e0f3dcc-7bbf-e70c-dfdd-a0e5b45112ad.png)

Setting - Userで設定すれば簡単に行けるかとおもいきや、意外とめんどくさかったのでメモ。

導入～環境設定周りは前の記事を参照。
[Sublime text 3でエディタ環境を整えてみる](http://qiita.com/yoruno/items/1645bcd7b5924f079307)


***

~~1. 上部メニューのPreferences -> Browse Packagesでパッケージフォルダを開く。
2. Theme - 現在使っているテーマ名のフォルダを開く（外部のテーマを使っていない人はTheme - Defaultフォルダ）
3. ~sublime-themeといったファイルがあるのでエディタで編集~~

追記：仕様が変わったようでsublime-themeを編集するには別の方法が必要とのことです。
↓のブログが詳しいので、ご参考ください。
http://webmem.hatenablog.com/entry/sublime-text-tmTheme


4  "class": "sidebar_label"という項目が途中にあるのでそこに"font.size"を付け足す
（いくつかsidebar_labelがあると思うけど、一番上のものに付け足して大丈夫のはず）
自分が使っているFlatlandというテーマだと以下のような感じ。


```
    {
        "class": "sidebar_label",
        "color": [212, 212, 213],
        "shadow_offset": [0, 0],　// カンマを打つ
        "font.size" : 10　// 項目を追加
    },
```

そのまま保存すれば即座に反映されるはず。
2pxほどフォントサイズを下げてみました。

![スクリーンショット 2015-05-17 21.36.03.png](https://qiita-image-store.s3.amazonaws.com/0/50216/add14d68-f9b8-7c57-efa8-f2263bc4ba88.png)


同じ要領で"class": "tab_label"のところにやってあげれば、上部タブ（現在開いているファイル名が表示されるところ）のフォントサイズも変えられます。



###あんまり関係ないけど追加で今発生している問題
***

日本語のファイル名を開くと、サイドバーとタブに正しく表示されない。

![スクリーンショット 2015-05-17 21.44.35.png](https://qiita-image-store.s3.amazonaws.com/0/50216/335b4731-101b-f348-a0ed-1cbdb3c22eee.png)

ConvertToUTF8を入れているのでファイルの内容に日本語があっても問題ないが、ファイル名が日本語だとなぜか日本語部分が□でしか表示されない。
windowのタイトル部分では正しくパスが表示されるので（C:\Myproject\あいうえおかきくけこ.txt）、Sublime自体が日本語に対応していないということではないと思うが…

Sublime Text 2ではこの問題が起きていなかったと記憶しているので、3が本リリースされたら修正されるのだろうか。

ぐぐっても解決法がみつけられなかったし、上の~sublime-themeをいじっても上手く行かなかったしで（そもそもフォントサイズとかと同じように、サイドバーやタブの表示エンコードを指定できるかは怪しいけれど）、現在未解決。

どなたか解決法を知っている方がいらっしゃったら、ご享受いただきたいです。。
ZABBIXのエージェントでMySQLを監視する時

Debian上のMySQLを監視したいが、agentインストールだけじゃ駄目っていう時の話で、基本は[これ](http://d.hatena.ne.jp/nekoruri/20130322/zabbixmysql)で大丈夫だけど素直に従うとagentが起動しなくなる。

下記のファイルが作成されてて、ガイドに従って追加するとuserparameterがダブってエラーになる(agentの起動すらしなくなる)ので注意が必要
/etc/zabbix/zabbix_agentd.d/userparameter_mysql.conf
Objective-cからSwiftを呼び出す方法

# SwiftからObjective-cを呼び出す方法
この方法は「Bridging-Header.h」にSwiftで呼び出すObjective-cのヘッダーファイルを書けば良いです。
この方法は多くのブログに書かれてます。

Build Settings -> Swift Compiler – Code Generationの中の

```
Install Objective-C Compatibility Header -> Yes
Objective-C Bridging Header -> 上記のヘッダーファイル（Bridging-Header.h）
```

が指定されていればその中にimport文を書くだけです。

ex)

```lang:Bridging-Header.h
...前略

// AdMob
@import GoogleMobileAds;

// google analytics
#import "GAI.h"
#import "GAIDictionaryBuilder.h"
#import "GAIFields.h"

// Nend
#import "NADView.h"
```

# Objective-cからSwiftを呼び出す方法
こちらはしっかりした文献が少なかったので、書いておきます。

```lang:Swiftを呼び出したいファイル.m
#import "プロジェクト名-Swift.h"
```

このように記載すれば呼び出せます。
呼び出す際の注意点として、コンパイルするまでSwiftの呼び出し行が赤くなっている場合があります。

```
Ctrl + B
```

などをしてビルドを行えば解決されます。

と定義すれば呼び出せます。
これは上記と同じXCodeの

Build Settings -> Swift Compiler – Code Generationの中に

```
Objective-c Generated Interface Header Name -> プロジェクト名-Swift.h
```

と定義されています。

基本的にはObjective-cからSwiftを呼び出すような事は無いと思いますが、僕のようにCocos2dを使っている人などには需要があるかと思ってCocos2dの連載記事の内容を別記事として書いておきました。
C# 匿名メソッド

古いソースコードによっては、ラムダ式で書かれておらず、まだC#2.0のデリゲートや匿名メソッドで記述されている事があるので、覚書の意味も込めて記載

```csharp:samle
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication4
{
    // デリゲートの宣言（C#2.0）
    delegate void SampleDeligate(string value);

    class Sample
    {
        public void Hello(string value)
        {
            Console.WriteLine(value);
        }
    }

    class Program
    {

        static void Main(string[] args)
        {
            Sample sample = new Sample();
            Console.WriteLine("挨拶文を入力して下さい。");
            string hello = Console.ReadLine();

            // C#2.0でのデリゲート利用
            SampleDeligate sampleDeligate = new SampleDeligate(sample.Hello);
            sampleDeligate(hello);

            // 匿名メソッド
            SampleDeligate sampleDeligate2 = delegate(string value)
            {
                Console.WriteLine(value);
            };
            sampleDeligate2(hello);

        }
    }
}
```

匿名メソッドを利用することで、デリゲートで使用していたHelloメソッドが不要になる！
Sublime text 3でエディタ環境を整えてみる

今更ですが自分用メモも兼ねて。

今回はSublime Text 3のBuild 3083をインストールします。
OSはMac OS Xです。

#Package Controllの導入
数多くのプラグインを自分で導入して好きにカスタマイズ出来るのが、このエディタの最大の特徴ですが、何はともあれPackage Controllを導入しましょう。
これを入れることでプラグイン名を検索してEnterするだけで簡単に他のプラグイン達がインストールできます。

~~1. 「Ctrl + `」でコマンドライン表示します。~~
~~2. https://packagecontrol.io/installation からSUBLIME TEXT 3と書かれているタブの内容（以下のコマンド）をコピペして実行。~~

~~> import urllib.request,os,hashlib; h = 'eb2297e1a458f27d836c04bb0cbaf282' + 'd0e7a3098092775ccb37ca9d6b2e4b7d'; pf = 'Package Control.sublime-package'; ipp = sublime.installed_packages_path(); urllib.request.install_opener( urllib.request.build_opener( urllib.request.ProxyHandler()) ); by = urllib.request.urlopen( 'http://packagecontrol.io/' + pf.replace(' ', '%20')).read(); dh = hashlib.sha256(by).hexdigest(); print('Error validating download (got %s instead of %s), please try manual install' % (dh, h)) if dh != h else open(os.path.join( ipp, pf), 'wb' ).write(by)~~

**2017/10/18更新
今は直接installl package controlと入力することででPackage Controllができるようです。**

3.「Ctrl + Shift + P」でコマンドパレットを表示。
4.「install」と入力して、「Package Control: Install Package」を選択。
5.Package Control用の検索画面が出るので好きなプラグインを選んでインストール。

#インストールしたプラグインメモ
詳細は割愛。

* BracketHighlighter
* ConvertToUTF8
* Emmet
* IMESupport
* Japanize
* SFTP
* SideBarEnhancements
* SublimeLinter
* SublimeLinter-csslint
* SublimeLinter-jshint
* TrailingSpaces ({ "trailing_spaces_regexp": "　|[  ]+" }をパッケージの設定に追加)

#テーマの変更
個人的に使いやすいと思ったFlatlandを導入。
https://github.com/thinkpixellab/flatland

Package Controllerからもインストールできます。
Color SchemeはMonokaiを使用。

#ユーザー設定の変更
上部メニューのPreferences -> Settings-Userに書くことでユーザーが自由に設定を上書きできる。

自分用設定メモ。

```json
{
	"color_scheme": "Packages/User/SublimeLinter/Monokai (SL).tmTheme",
	"default_encoding": "UTF-8",
	"detect_slow_plugins": false,
	"draw_minimap_border": true,
	"fallback_encoding": "UTF-8",
	"font_face": "Monaka",
	"font_size": 13.0,
	"highlight_line": true,
	"ignored_packages":
	[
		"Vintage"
	],
	"line_padding_top": 1,
	"margin": 0,
	"match_brackets_angle": true,
	"scroll_past_end": true,
    "show_encoding": true,
	"tab_size": 2,
	"theme": "Flatland Dark.sublime-theme",
	"translate_tabs_to_spaces": true,
	"trim_trailing_white_space_on_save": true,
	"word_wrap": true
}
```
Rails4.2でのrequest_uriの挙動

request.original_fullpath

* プロトコル名（http://）を含めたフル URL + パラメータも込み


request.fullpath

* プロトコル名（http://）を含めたフル URL + パラメータも込み?
* 1との違い要調査
* original_fullpath ||= (env["ORIGINAL_FULLPATH"] || fullpath)


request.original_url

*  base_url + original_fullpath(ホスト名以降+上記original_fullpath)

#### 参照
* [This method is deprecated or moved on the latest stable version. The last existing version (v2.3.8) is shown here.](http://apidock.com/rails/ActionController/Request/request_uri)
【Unity】特定dir以下のファイルを一括で紐付けるレシピ【Editor拡張】

# UnityでObjectを紐付けるのが面倒
Unity上で画像やprefabを特定のObjectから使う場合、
Resources.LoadやAssetBundleなど色々な方法がありますが、
色んな都合で"まだ"使えないんだよなぁ…なんて場合もあります。
(将来的にAssetBundleにするし…とか？）
とりあえずササッと動くように…なんてpublicにしておいたら、

[クリエイティブ] : 画像追加しました。
[システム] : はーい
[システム] : (さてと…紐付け更新するか…)

![スクリーンショット 2015-05-17 19.21.40.png](https://qiita-image-store.s3.amazonaws.com/0/26453/af8cb7f4-b843-f185-2909-739c2046b66f.png)

なんて事になったり。

# そんな時にはコレ！
ボタンを押下したら一括で入れちゃえばいいじゃない！

[Inspector上にボタンを作る](http://baba-s.hatenablog.com/entry/2014/07/30/152826)
(Unity Inspector上にボタンを作るにはこれを参考にどうぞ）

```GameImgHolder.cs
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
#if UNITY_EDITOR
using UnityEditor;
using System.Linq;
#endif

public class GameImgHolder : MonoBehaviour {

	public List<Sprite> imgList;

#if UNITY_EDITOR
	[Button("SetupImg" , "Setup Image")]
	public int SetupImgButton;

	void SetupImg(){

		// path , imgdir
		string prefabPath = "Assets/Prefab/GameManager.prefab";
		string imgDir = "Assets/Images/Test";

		GameManager gm = AssetDatabase.LoadAssetAtPath(prefabPath , typeof(GameManager)) as GameManager;
		GameImgHolder imgHolder = gm.GetComponent<GameImgHolder>();

		// 各ファイルパス GUIDからを重複しないように取得
		var guids = AssetDatabase.FindAssets("" , new string[]{imgDir});
		var pathList = guids.ToList().Select(guid => AssetDatabase.GUIDToAssetPath(guid)).Distinct();

		// sprite load
		var sprites = pathList.Select(path => AssetDatabase.LoadAssetAtPath(path , typeof(Sprite)) as Sprite);
		imgHolder.imgList = sprites.ToList();

		// 変更があったことをUnityに知らせる必要があり、
		// そのため、このオブジェクトのダーティフラグをセットする
		EditorUtility.SetDirty(gm);
		AssetDatabase.SaveAssets();

		// // Hierarchy上に配置されているオブジェクトにも反映
		PrefabUtility.RevertPrefabInstance(GameManager.Instance.gameObject); 

#endif
}

```

# こんな感じで使えます。
![qiita_unity_ediror_button.mov.gif](https://qiita-image-store.s3.amazonaws.com/0/26453/b523fdae-bacf-6028-5096-5743178997ed.gif)

この例ではSpriteでやりましたが、
TextAssetでもPrefab(GameObject)でもなんでも出来るので便利です。
自分で押してもいいですし、クリエイティブ側に押させてもいいですね。
（コリジョンには注意！）
你怎麼重構？用設計模式重構


> 你怎麼重構

最近被問到這個問題，但是真的不知道該怎麼回答

# 原本的回答

當下回答了像下面的答案

> 就看不順眼， class 太肥，把一些東西抽出來

或是

> 覺得架構不對，想要把它變漂亮一點，所以把 code 抽出來成為另外一個 class 來專責處理

又更好聽（或是更模糊，因為根本不知道在講什麼）

> 想要把程式碼變乾淨

這些話好像有講跟沒講一樣

# 我覺得應該可以接受的回答

> 用設計模式重構

這是我從《Test-Driven iOS Development》這一本書整理出來的說法

由於設計模式是一種可以用於各種不同場合、可以依循的範例。在討論之間似乎也比較有辦法繼續下去，也不會這麼空洞。

接著或許可以根據設計模式來發展 iOS 中所碰到的實例是什麼，再繼續討論下去

這是現階段的想法，之後應該也會有對這個問題有不一樣的看法

# 參考書籍
- Test-Driven iOS Development - [Amazon](http://www.amazon.com/dp/0321774183)
- Cocoa Design Pattern - [Amazon](http://www.amazon.com/dp/0321535022)
AtCoder Regular Contest 039 A -  A - B problem


# 前提

* Mac
* JavaまたはC++を使用
* 開発環境として、JavaはEclipse, C++はXcodeを使用
* 問題は http://arc039.contest.atcoder.jp/tasks/arc039_a


# 問題について整理してみる

* C++で解いた
* ソースコード http://arc039.contest.atcoder.jp/submissions/405660
* 以下のどれかで A - B が最大になる
	* Aのどこかを9に書き換える
	* Bの一番上の桁を1に書き換える
	* Bの一番上の桁以外の桁を0に書き換える



# 実装の概要

上のソースコードはテンプレやライブラリ部分が長いので整理

```cpp
int main(int argc, const char * argv[]){
	// 入力はstringで受ける
    string a_str, b_str;
    cin >> a_str >> b_str;
    int a = stoi(a_str);
    int b = stoi(b_str);
    int ans = a - b;
    
    for(int i = 0; i < a_str.length(); i++){
        char c = a_str[i];
        // Aを一箇所9に書き換える
        a_str[i] = '9';
        // intに変えて引き算してmax
        int m = stoi(a_str) - stoi(b_str);
        ans = max(ans, m);
        // 元に戻す
        a_str[i] = c;
    }
    
    for(int i = 0; i < b_str.length(); i++){
        char c = b_str[i];
        
        // 一桁目の場合は1, それ以外は0に書き換える
        char cc = i ? '0' : '1';
        b_str[i] = cc;
        int m = stoi(a_str) - stoi(b_str);
        ans = max(ans, m);
        b_str[i] = c;
    }
    
    cout << ans << endl;
}
```

# まとめ

* stoiはC++11の機能なのでC++でSubmitしたらCEした
![スクリーンショット 2015-05-17 17.07.42.png](https://qiita-image-store.s3.amazonaws.com/0/29024/7cd10e28-150f-c099-7df5-92a38ea14aa9.png "スクリーンショット 2015-05-17 17.07.42.png")
* i桁目を取り出すとか、i桁目を書き換えるとかはライブラリ化してもいいかもしれない
* 競プロ久々にやったらendl忘れそうになったりとかしていろいろやばかったので定期的にやろうと思う
fluent-plugin-prometheusをリリースしました

ソースコード: https://github.com/kazegusuri/fluent-plugin-prometheus
Gem: https://rubygems.org/gems/fluent-plugin-prometheus

[Prometheus](http://prometheus.io/)は最近できたOSSのモニタリングシステムです。発表当時は少し触っている人がいましたが今はあまり聞かなくなりました。開発自体は順調に進んでいるようです。日本語ではこのあたりで紹介されています。

- [Prometheus: Go言語で書かれたモニタリングシステム](http://wazanova.jp/items/1672)
- [データ可視化アプリの新星、PrometheusをCentOSにインストールする方法](http://y-ken.hatenablog.com/entry/how-to-install-prometheus)

PrometheusはGraphiteと同様にメトリクスを収集してグラフ化やアラートなどができるものです。
今回作った[fluent-plugin-prometheus](https://github.com/kazegusuri/fluent-plugin-prometheus)はFluentdでメトリクスを収集してPrometheusと連携するものです。少し異なるのはFluentdからPrometheusに送信するのではなく、PrometheusからFluentdにメトリクスを取得しにいくという違いがあります。

余談ですがなぜPrometheusを使っているかというと、Kubernetesがシステム内部のメトリクス収集にPrometheusを使っているからです。まだPrometheus自体微妙なところもありますが、これから盛り上がるかもしれません。

### 使い方

fluent-plugin-prometheusは4つのプラグインを内蔵しているのでそれぞれを説明します。

#### `prometheus` input plugin

プラグインで収集したメトリクスをPrometheusに渡すためのエンドポイントを設定するプラグインです。必ず設定しておく必要があります。

```
<source>
  type prometheus
</source>
```

これでポート23231でLISTENされるのでPrometheusからメトリクスが取得できるようになります。

### `prometheus_monitor` input plugin

Fluentd本体に組み込みで入っている[monitor_agent](http://docs.fluentd.org/articles/monitoring#monitoring-agent)プラグインの情報を自動的に取得してPrometheusに渡すプラグインです。

現在取得できるものはBufferedOutputプラグインの以下の情報です。

- キューの長さ
- 全データサイズ
- 現在のリトライ数

### `prometheus` output/filter plugin

メインとなるメトリクスを収集するためのプラグインです。OutputとFilterの両方をサポートしています。使い勝手はほぼ同じです。ここではFilterでの使い方を説明します。

```
<filter message>
  type prometheus

  ## レコード中のfooの値をcounterメトリクスとして収集
  <metric>
    name message_foo_counter                 ## Prometheusのmetric名
    type counter                             ## Prometheusのmetric type
    desc The total number of foo in message. ## Prometheusのmetricの説明文
    key foo                                  ## どのkeyの値を収集するか
    <labels>                                 ## 付与するラベル
      key foo                                ## key=foo でラベルを追加
      data_type ${type}                      ## レコード中のtypeの値をラベルの値として利用
    </labels>
  </metric>

  ## レコード中のbarの値をcounterメトリクスとして収集
  <metric>
    name message_bar_counter
    type counter
    desc The total number of bar in message.
    key bar
    <labels>
      key foo
    </labels>
  </metric>

  ## 2つのメトリクスの共通のラベル
  <labels>
    host ${hostname}
    tag ${tag}
  </labels>
</filter>

<match message>
  type stdout
</match>
```

上記のようにメトリクスを収集したいレコードに処理を挟むようにFilterを追加するだけです。Filterプラグインですが元のレコードの値を変更することはありません。

この状態で`message`というタグ名でfooやbarを含むレコードを送信すると`message_foo_counter`と`message_bar_counter`というメトリクスが生成され、Prometheusから収集されるようになります。

Prometheusで重要な概念であるラベルも自由に設定できるようにしてあります。レコードの中から値を設定できるので、例えばHTTPのレスポンスコードをラベルの値として追加してレスポンスコード毎の比率をグラフ化なども可能です。

### チュートリアル

データを用意したり、Prometheusのセットアップが面倒という場合はチュートリアルも用意してあるので試してみて下さい。

https://github.com/kazegusuri/fluent-plugin-prometheus#try-plugin-with-nginx

![prom.png](https://qiita-image-store.s3.amazonaws.com/0/63736/ff3d37e2-ebd0-7735-67ed-292702b5165f.png)
Laravelインストール手順メモ

### 実施環境

* CentOS6.4 x86_64

### Composerインストール

```
# curl -sS https://getcomposer.org/installer | php
# mv composer.phar /usr/local/bin/composer
```
### Laravelインストール

```
# composer global require "laravel/installer=~1.1"
# PATH=$PATH:~/.composer/vendor/bin/
# vim ~/.bashrc  上記のパス追加を行う
```

### インストールバージョン確認、プロジェクト作成
```
# laravel new sample
# cd sample; php artisan --version
```
# 
```
ディレクトリ/ファイルを監視してsupervisorで再起動(自動化

コードを修正して再起動ってよくあるじゃないですか。
開発時だと尚更多いのでsh書いた。

```bash:auto_restart.sh
#!/bin/sh
if [[ $# -ne 3 ]] ; then
    echo argument is invalid.
    exit
fi

while :
do
    after=`ls -l $1`
    if [[ $after != $before && $before != "" ]] ; then
		supervisorctl restart $2 > /dev/null
    fi
    before=$after
    sleep $3
done
```

使うときは
`$ sh auto_restart.sh target app_name 10 &`
とか。
第1引数が監視対象パス、第2引数が再起動するアプリ名、第3引数が監視間隔。
あとは最後に`&`つけてバックグラウンドにして使ってます。

監視対象はディレクトリでもファイルでも行けるので、プロジェクト全体のディレクトリを指定するのが良いかも。
Parse Cloudで管理画面(Data Browser)からの値の変更かを判定する方法

Parse Cloudの機能を使うと値の変更前後に独自の処理を入れることができます。  

Validationで使うことが多いと思いますが、Parseが提供している管理画面(Data Browser)から値を変更したときにもこの処理を通ってしまうので、自由に値を変更させてテストしたい場合に困りました。

Parse自体は判定用の関数を提供していないようなので、全権限(master key)を持っているアクセスが来た場合は管理画面からと判断することにしました。

```js

Parse.Cloud.beforeSave(Parse.User, function(request, response) {

    var masterKey = request.master;

    if (masterKey) {
        //masterKeyでのアクセスの場合は管理画面からだと判断する
        response.success();
    }
   
   //Validation処理を入れる
});

```
KIFのメモ

ひょんなことから，Squareが開発しているテストフレームワークKIFについて調べたのでまとめておく．Qiitaやその他WEBに，KIF Ver.1系の話とVer.2系以降の話が混じっていてややこしい．

## 概要
- Square が開発しているiOS向け Integration Testing Framework OSS
	- https://github.com/kif-framework/KIF

## 推奨利用者
- UI ObjectにAccessibility Labelが設定されていて，開発者自身がテストをする際には，有用と思われる．
	- データ駆動やBDDが容易だがテストコードではあるため，非開発者が利用する際には変換処理系の開発が必要

----

## 詳細情報
- iOS向け Integration Testing Framework OSS
	- https://github.com/kif-framework/KIF
	- 2015/06/28時点で，Ver. 3.2.3
		- Ver.1系と Ver.2系でAPIや動作が大きく変化している
			- WEBで検索されるものはVer.1系が交じるので注意が必要
- 開発元
	- 決済サービスを開発している Square が主として開発している
- ライセンス
	- Apache License Ver 2.0

## 特徴(開発元ページより)
- Minimizes Indirection
- Easy Configuration
- Wide OS coverage
- Test Like a User
- Automatic Integration with Xcode 5 Testing Tools

## Minimizes Indirection
All of the tests for KIF are written in Objective C. This allows for maximum integration with your code while minimizing the number of layers you have to build.

- テスト記述言語
	- Objective-C もしくは Swift
		- Swiftの場合は若干細工が必要だが，細工の方法は公式ページで記載されている

## Easy Configuration
KIF integrates directly into your Xcode project, so there's no need to run an additional web server or install any additional packages.

- インストール方法
	- CocoaPods もしくは GitHubからダウンロード
	- testing target 作成推奨
		- 理由は注意点参照
		- (既存でtesting bundle targetがある場合は，修正)

## Wide OS coverage
KIF's test suite has been run against iOS 5.1 and above (including iOS 8), though lower versions will likely work.

## Test Like a User
KIF attempts to imitate actual user input. Automation is done using tap events wherever possible.

- テスト記述方式
	- KIF は **"Actor"** と **"その操作"** を手続きとして記述していく
	- 操作はデフォルトでだいぶ用意されているが，自分でも定義できる
		- 開発者によるBDDが実現可能
	- ソースコード例("Tap"というラベルが付けられたオブジェクトをタップする)
		- [tester tapViewWithAccessibilityLabel:@"Tap" ];

## Automatic Integration with Xcode 5 Testing Tools
Xcode 5 introduces [new testing and continuous integration tools](https://developer.apple.com/technologies/tools/whats-new.html) built on the same testing platform as KIF.  You can easily run a single KIF test with the Test Navigator or kick off nightly acceptance tests with Bots.

- ツール構成
	- KIFのテストケースはXCTestを拡張する形で動作し，アプリ操作の部分を容易化している．
		- 実行はXCTestとUI Automationを用い，評価はXCTestを用いる．
			- 一応XCTestのAssertメソッドを再定義する形でAssertメソッドは存在するが，現時点では独自のものは存在しない
		- KIF記述によるテストケース-KIFフレームワーク-[XCTest, UI Automation]-Test Target App.
- 実行
	- 基本的には，XCodeのtesting targetでの実行
	- シミュレーターでも実機でも実行可能
		- XCodeの実行先として選択


## 注意点
- 操作するUI Objectのaccessibility Labelが設定されていないと操作できない
	- 画面のある座標のタップやスクリーンショットは除く．
	- OSによるオブジェクトの任意のテキストをLabelとみなす機能により，Labelが明に設定されてなくても動作することはある．
- Apple非認証のAPIを利用しているので，テストを含む形でアップロードはできない．
- (原因不明) ターゲットアプリがインストールされている状態で，実行するとXCodeが落ちることがある．

## その他
- 操作のレコーディングや操作しているUI Objectの情報などを取得するツールは存在しない．
Python でタイ文字やアラビア文字の個数をうまく数える

# Unicode 難しい

Unicode の扱いには色々と難しいところがある。
私は最近になって、いろいろと勉強している。
なので、以下の内容には Unicode 初心者によるひどい間違いがあるかもしれない。

自分は Unicode の正規化の違い (NFC, NFD, NFKC, NFKD) でややこしい点については知っていたのだけど、
それとは別のレイヤの話で、タイ文字・アラビア文字・デーヴァナーガリー文字などを視覚的に文字数を数える時は Grapheme というさらに上の層での数え方が必要らしい。

参考: [文字数をカウントする7つの方法](http://developers.linecorp.com/blog/ja/?p=3474) 

# Grapheme

つまり

- プログラミング言語で普通に文字数を数えると Code point の数になる。
- 実際には視覚的に 1 つの文字が、複数の Code point によって構成されている場合がある。
- 視覚的に正しい 1 文字の単位が Grapheme cluster

らしい。

# では Python では？

では Python では Grapheme cluster を数えるのにどんなツールがあるか ?
Python の標準ライブラリである unicodedata には含まれていないようだった。

# 答え

[uniseg](https://pypi.python.org/pypi/uniseg/) というパッケージがあるらしい。

なお、この記事では主に Python 3 での例を示す。
(Python 2 と Python 3 での unicode, str, bytes の扱い方の違いについては触れない。触れると横道に大きくそれる。)

# インストール方法

```
$ pip install uniseg
```

# 使用例

```pycon
>>> import uniseg.graphemecluster
>>> graphme_split = lambda w: tuple(uniseg.graphemecluster.grapheme_clusters(w))
>>>
>>> phrase = 'กินข้าวเย็น'  # タイ語で夕食を食べる、という意味のフレーズらしい
>>> len(phrase.encode('UTF-8'))  # UTF-8 での bytes
33
>>> len(phrase)  # Code Points
11
>>> len(graphme_split(phrase))  # Graphme clusters
8
```

という具合。

# 他にも

uniseg は word や sentence 単位での分かち書きを備えているらしい。
さすがに space で切るらしいので膠着語である日本語の分かち書きまではできないようだ。
CakePHP CodeSniffer で Variable "xxx" is not in valid camel caps format って言われたとき

CakePHPを使いつつもスネークケースと心中したいときのphpcsの設定。
CakePHPは2系、CakePHP CodeSnifferは1系。

cd CodeSniffer/Standards
mkdir CakePHP_Custom
vi CakePHP_Custom/ruleset.xml

```
<?xml version="1.0"?>
<ruleset name="CakePHP_Custom">
 <description>CakePHP coding standard Custom</description>

 <rule ref="CakePHP">
  <exclude name="CakePHP.NamingConventions.ValidVariableName" />
 </rule>
</ruleset>
```

phpcs --standard=CakePHP_Custom target_file.php

とかで使う。
SendGrid+PHP(SwiftMailer)+JIS(ISO-2022-JP)でメールを送信する

クラウドメールサービス[SendGrid](https://sendgrid.kke.co.jp)を使ってPHP(SwiftMailer)からメールを送ってみます。
SendGridを使ってメールを送る方法はいくつかあります。詳しくは[公式ブログ](https://sendgrid.kke.co.jp/blog/?p=1300)を参照してください。

- SMTP
- Web API
- マーケティングメール機能

今回はSMTPとX-SMTPAPIを組み合わせて宛先毎に内容の異なるメールを送ってみます。

# SMTP
SMTPはWeb APIに比べて細かいメール送信パラメータを指定できるのがメリットですが、それが面倒な場合、デメリットにもなります。今回はJIS(ISO-2022-JP)でメールを送ります。

# X-SMTPAPI
名前がSMTPっぽくて紛らわしいですが、[X-SMTPAPI](https://sendgrid.kke.co.jp/blog/?p=1300)はSendGrid独自の拡張ヘッダです。これを利用するとメール送信時にSendGridの様々な機能を使うことができます。今回は、To、Substitution、Sectionを利用してメールの件名や本文内の特定のキー文字列を宛先毎に異なる値に置換してメールを送ってみます。

# とりあえず送ってみる
サンプルコードの実行手順は[こちら](https://github.com/SendGridJP/sendgrid-smtp-swiftmailer-example)。
PHPは5.5.14で動作確認していますが、SwiftMailerが動く程度の適度に古い環境であればたぶん動くと思います。

# コード

```php
<?php
require_once 'vendor/autoload.php';

Dotenv::load(__DIR__);
$sendgrid_username = $_ENV['SENDGRID_USERNAME'];
$sendgrid_password = $_ENV['SENDGRID_PASSWORD'];
$tos               = explode(',', $_ENV['TOS']);
$names             = explode(',', $_ENV['NAMES']);
$from              = $_ENV['FROM'];

// Specivy encoding
Swift::init(function() {
  Swift_DependencyContainer::getInstance()
    ->register('mime.qpheaderencoder')
    ->asAliasOf('mime.base64headerencoder');
  Swift_Preferences::getInstance()->setCharset('iso-2022-jp');
});

// create a transport
$transport = Swift_SmtpTransport::newInstance('smtp.sendgrid.net', 587, 'tls')
  ->setUsername($sendgrid_username)
  ->setPassword($sendgrid_password);
$mailer = Swift_Mailer::newInstance($transport);

// create a message
$message = Swift_Message::newInstance()
  ->setSubject('こんにちはSendGrid')
  ->setTo($from)
  ->setFrom($from)
  ->setBody(
    "こんにちは、nameさん\r\nようこそ〜テキストメールの世界へ！",
    'text/plain'
  )
  ->addPart(
    "<html>".
    "<body bgcolor=\"#d9edf7\" style=\"background-color: #d9edf7;\">".
    "こんにちは、nameさん<br>ようこそ〜HTMLメールの世界へ！<br>".
    "</body></html>",
    'text/html'
  )
  ->attach(Swift_Attachment::fromPath('./logo.gif'));

// x-smtpapi header
$smtpapi = new Smtpapi\Header();
$smtpapi->setTos($tos);
$smtpapi->addSubstitution('name', $names);
$smtpapi->addCategory('Category1');
$headers = $message->getHeaders();
$headers->addTextHeader(
  'x-smtpapi', $smtpapi->jsonString(JSON_UNESCAPED_UNICODE)
);

// send the message
echo $message->toString();
echo $mailer->send($message);
```
PHP書きの僕が最低限やっているAtomの設定

何も設定しないと使い物にならないという噂のAtomにPHP書きの僕が最低限やっている設定。

## Settings > Editor Settings

font family : Windowsなら consolas, Meiryo。Macなら空のまま。
Show Invisibles : ✓
Soft Tabs : 規約に揃える
Soft Wrap : ✓
Tab Length : 気分によるけどだいたい4

タブの設定はEditorConfigを利用しているのであれば**editorconfig**パッケージを入れることによって設定が不要になる。

## Packages > Core Packages

**Whitespace**
勝手に空白や改行が削除されたりしちゃう！というときに設定を確認。
Ignore White Space On Current Lineは不要なタブの入ったコードが残りがちなので気分によっては切る。

**metrics**
Google Analyticsに利用統計データを送信するパッケージ。
気になるならDisableに。

## 入れておくと便利なPackages

**auto-update-packages**
packageの自動更新

**open-recent**
最近開いたファイル

**file-icons**
無味乾燥なファイルアイコンを色とりどりにしてくれる。

**Sublime-Style-Column-Selection**
矩形選択ができるようになる。

**language-apache**
.htaccessに色がつく

**linter**
**linter-php**
**linter-phpcs**
**linter-phpmd**
Linter系。すでにコードが汚い場合は**atom-beautify**などで自動フォーマットもできる。

**minimap**
**minimap-git-diff**
Sublime Textとかにあるminimapのパッケージ。
幅広なディスプレイ使っていると右方向が寂しいときに入れる。
minimap-git-diffは名前通りminimapでgitの差分がわかりやすくなる。

**docblockr**
phpDocなどの半自動生成

**split-diff**
二つのファイルのdiffが見られる。

**pigments**
CSS上のカラーコードの色が文字の背景色として表示される。

**color-picker**
CSSとか書いてるときにカラーピッカーからカラーコードを引っ張ってこられる便利パッケージ。

## Settings > Core Settings

Allow Pending Pane Items : オフ

Atom 1.6あたりからファイルをシングルクリックしたときには現在のタブでプレビューがされるようになった。
挙動がわかりづらく、個人的にエディタのファイルは新しいタブで開いてほしいのでオフにする。

## Ctrl + Tab の挙動の変更

Atom1.7からCtrl + Tabの挙動がMRU (Most Recently Used)になっているが、ブラウザとかと同じ右左に移動してほしいので設定ファイルを少し修正する。

Atom 1.7からタブ切り替えが使いづらくてイライラするので従来式に戻す
http://qiita.com/takuchan9104/items/237dd39bf5987879b106

または**disable-mru-tabbing**パッケージの導入でも同様の修正が可能。

## おわりに

以上で挙げたパッケージの他にも便利なパッケージはたくさんあります。
Atomを使い慣れてきて「こんな機能はないのかな？」と思ったらググってみてください。
また何から設定を改善したら良いのかわからなければ「Atom PHP」でググればたくさんの推奨設定が見つかるので参考にしてみると良いでしょう。
Re: TypedCoffeeScript


というのを昔作ってたんだけど、最近また作り始めた。

[mizchi/tcs](https://github.com/mizchi/tcs "mizchi/tcs")

npmにはまだ登録してない。npm install -g mizchi/tcs で入る。typescriptのtscと紛らわしいので、たぶんそのうち名前変える。

今動いてるコード。

```coffeescript
# this is comment

# expr

1
a.b
(a()).b
1 > 2
{}
{a: 1, b: 2}
{
  c: 1
  d: 2
}

# assignment with type annotation
var x1 = 3
var x2: number = 3

# Can declare let and const but flowtype can't parse them yet
let y = 2

# function
myFunc(a: number, b: number): number
  # return last expression
  a + b

() => 1

setTimeout(() =>
  myFunc(1, 2)
, 1000)

# class
class X<T>
  n: number
  _x: T
  static staticFunc() {}

  foo<U>()
    a

  get prop() {this._x}

  set prop(_x:number)
    @._x = x

class Y extends X<number>
  constructor()
    super()

var y = new Y()

# interface
interface Point
  x: number
  y: number

interface Point3d extends Point
  z: number

# if
if true
  a
else if false
  b
else if false
  c
else
  d

# switch
switch e
  when 1
    a
  when 2
    a
  else
    a

# for
for var i in items
  print(i)
# for of is same with es6, not coffee
for i of items
  print(i)

# module
import x from './x'
export default {}
```

ES2015時代のcoffeescript、というコンセプトで設計した。

## 使い方

https://github.com/mizchi/tcs/tree/master/examples/hello　参照

```
$ tcs -s src -o _tcs -t flow
$ flow init
$ flow
$ tcs -s src -o lib  -t es5
```

flowのコード、もしくはes5へコンパイルできる。

## TypedCoffeeScript v1の反省

昔作った版でやっていたこと

- 既存のCoffeeScriptコンパイラへの大規模な介入
- 型システムの自作

要約: 頑張りすぎた。勉強にはなったが、設計ミスに気づき作業量を見積もった段階で、個人で手を付けられるものではなくなり、放置してしまった。


その反省を活かして、今回は次のようになっている

- flowtypeのコードを生成する(型システムを実装しない)
- パーサのみの実装(直接flowtypeのASTを構築し、複雑な後処理をしない)

## 設計

- pegjs/pegcoffee
- recast
- babel

recastはreact-toolsの中で使われているパーサで、flowtypeの型アノテーション付きコードを生成できる唯一の実装。ParserAPI + 型アノテーションの独自ASTで、これをターゲットにしてpegjsでパースしながらASTを直接組み立てる。

ここは仕様化されてないので、今後パーサを書き直すことも想定している。

## で、この言語使えるの？

es5がターゲットのcoffeescript風言語として扱うだけならとくに問題ない。とはいえエラーメッセージが不親切だったり、分割代入や、自分があんまり使わないwhileの実装が実は抜けてたりする。これは単純に完成度の問題なので、時間をかければどうとでもなる。


というのと別に、flowtypeの型チェック機能、ファイル単体なら使えるんだけど、複数ファイルに分割した時のimport/export の挙動がかなり怪しい。これはfacebook/flowに実装依存になるので、なんとも言いがたい。とりあえずコード生成まではできる。

この言語が使えない、というよりは、flowtypeの挙動がよくわからんってのがある。nuclidの公開のタイミングでアップデートしてくると思うので、そのタイミングでまた考える。

## CoffeeScriptからの変更点

- そもそもスーパーセットを目指さない(頑張り過ぎない)
- CoffeeScript主要な機能はES2015に取り込まれたので、できるだけES2015に近づける
- 議論が多い変数の自動宣言は削除。letやconstを使いたいのもある。

## reiny への適用

reinyっていうテンプレートエンジンを作っていたのだけど、テンプレートエンジン上で、テンプレートエンジン内のロジックとして `if 2 > 1` みたいなコードを書けるようにしようとしたとき、ここで 2 > 1 をパース出来るexpressionノードのパーサが必要になる。これを実装するとなるとほぼプログラミング言語に近くなる。

だたら先に前々から作りたかったtyped coffee script v2 実装して、その後バックポートすりゃいいじゃん、と作り始めた。実はそんなに時間はかけてなくて、およそ3日分ぐらいの作業量。


## 今後

隙をみてちゃんと作っていく。頑張り過ぎず長期的に開発するのが目標。実装は単なるpegjs(pegcoffee) のパーサジェネレータがあるだけなので、興味ある人は読んでみるといいと思います。

ちょっとコード汚いけど… https://github.com/mizchi/tcs/tree/master/grammars

flowtypeのコード生成についてはflowの成り行きを見届ける感じで。
serializeしたカラムのfixtureの書き方

```ruby:app/model/item.rb
class Item < ActiveRecord::Base
  serialize :config, OpenStruct
end
```

```yaml:test/fixtures/items.yml
one_item:
  config: <%= OpenStruct.new(type: 'foo', size: 7) %>
```

fixtureをerbとして書けるが、erbで出力した文字列(yaml)を評価しているのではなくて、中間コード(ruby script)を評価しているのだろうか。
Ant + Ivyやってみた

## 成果

https://github.com/eiryu/ant-ivy-study


## なぜやるのか

まともにやり出したのがMavenからなので、正直Antはよく知らなかった。雰囲気で書けるけど。
レガシーモジュールだとAntとかたまに見るので触っておく。
あと、Gradleやsbtも内部でIvyを使っているとのことなので、手を動かしておく。


## こんなことやります

- Antでコンパイル、テスト
- ディレクトリ構造はMaven2に準拠する
- 依存性管理はIvyで行う。jarはlibに配備


## やってみた感想

- ソースディレクトリ定義とかを全て自分で行わなければならないのでとても面倒。ここはデフォルトが提供されているMavenが楽。正直distとか良く見るディレクトリはデフォルトかと思っていた。。

```xml
    <property name="source" value="1.8"/>
    <property name="target" value="1.8"/>
    <property name="srcDir" value="src/main/java"/>
    <property name="testSrcDir" value="src/test/java"/>
    <property name="libDir" value="lib"/>
    <property name="buildDir" value="target"/>
    <property name="srcCompileDir" value="${buildDir}/classes"/>
    <property name="testSrcCompileDir" value="${buildDir}/test-classes"/>
```

- Ivyについては、Maven、Gradleを使ったことがあるならすんなり使えると思った。どうでもいいんだけど「organisation」が気持ち悪かった。organizationじゃないのか。。イギリス英語？
- 実行時はIvyのjarをAntが読める場所に置くか、`-lib`で場所を指定する必要があるらしい

```
ant -lib /usr/local/Cellar/ivy/2.4.0/libexec/ivy-2.4.0.jar clean test
```


## 参考

- http://d.hatena.ne.jp/ryoasai/20110101/1293904479
- http://ant.apache.org/manual/index.html
- http://www.techscore.com/tech/Java/ApacheJakarta/Ant/index/
- http://symfoware.blog68.fc2.com/blog-entry-993.html
- http://stackoverflow.com/questions/12378892/how-to-configure-ivy-for-ant-build
- http://www63.tok2.com/home2/jd4/antSuperBasic2.html
- http://www.jajakarta.org/ant/ant-1.5/docs/ant-1.5/j/docs/manual/using.html
tmuxチートシート

##コマンドライン指定
    # 新規セッション開始
    tmux
    
    # 名前をつけて新規セッション開始
    tmux new -s <セッション名>
    
    # セッションの一覧表示
    tmux ls
    
    # 接続クライアントの一覧表示
    tmux lsc
    
    # セッションを再開 ※-t <対象セッション名>でセッション名の指定も可能
    tmux a
    
    # セッションを終了 ※-t <対象セッション名>でセッション名の指定も可能
    tmux kill-session
    
    # tmux全体を終了
    tmux kill-server
    
    # その他コマンドを実行
    tmux [command [flags]]

##キー操作
プレフィックスキー入力後に入力するキー、プレフィックスキーのデフォルトは Ctrl + b

基本

    ?      キーバインド一覧
    :      コマンドプロンプト
            show-options -g や show-window-options -g 入力で設定一覧を表示
            -gはグローバル指定(デフォルト)の意、個別に設定された値は-g無しで確認する


セッション操作

    s      セッションの一覧選択
    d      セッションから離脱(デタッチ)
    $      セッションの名前変更
    ctrl+Z tmuxを一時中断 ※fgで復帰

ウインドウ操作

    c      新規ウインドウ作成
    w      ウインドウの一覧選択
    0-9    指定番号のウインドウへ移動
    &      ウインドウの破棄
    n      次のウインドウへ移動
    p      前のウインドウへ移動
    l      以前のウインドウへ移動
    '      入力番号のウインドウへ移動
    .      入力番号にウインドウ番号を変更
    ,      ウインドウの名前変更
    f      ウインドウの検索

ペイン操作

    %            左右にペイン分割
    "            上下にペイン分割
    q            ペイン番号を表示
    カーソル      指定方向のペインへ移動 ※連続押しでプレフィックス継続
    Ctrl-カーソル ペインのサイズを変更 ※連続押しでプレフィックス継続
    !            ペインを解除してウインドウ化
    x            ペインの破棄
    o            ペインを順に移動
    ;            以前のペインへ移動
    z            現在のペインを最大化/復帰
    スペース      レイアウトを変更
    Alt-1-5      レイウトを変更
    {            ペインの入れ替え(前方向)
    }            ペインの入れ替え(後方向)
    ctrl+o       ペインの入れ替え(全体)
    t            ペインに時計を表示

コピーモード

    [       コピーモードの開始（カーソルキーで自由に移動）
    スペース コピー開始位置決定（viモード）
    エンター コピー終了位置決定（viモード）
    ]       コピーした内容を貼り付け
    
    ※viモードで無い場合は、設定ファイルに set-window-option -g mode-keys vi を追加

# 設定エトセトラ

基本
tmuxの設定は ~/.tmux.conf か /etc/tmux.conf に記述する
set-option, set-window-option, bind-key コマンドを使って設定
set, setw, bind 等は上記コマンドの省略形

マウス操作を有効にする

    #マウス操作を有効にする
    set-option -g mouse on
    
    # スクロールアップするとコピーモードに入る
    bind-key -n WheelUpPane if-shell -F -t = "#{mouse_any_flag}" "send-keys -M" "if -Ft= '#{pane_in_mode}' 'send-keys -M' 'select-pane -t=; copy-mode -e; send-keys -M'"
    
    # 最後までスクロールダウンするとコピーモードを抜ける
    bind-key -n WheelDownPane select-pane -t= \; send-keys -M

最初はこれだけ設定しておけば、マウスクリックでペイン選択、ペイン境界線ドラッグでサイズ調整、ホイール操作でバックスクロールが可能
また minttyの場合はShift押下中に左クリック範囲選択でコピー、右クリックでペースト(Options｜Mouseで変更)、Altも同時押下で矩形選択が出来る

プレフィックスキーを Ctrl + b から Ctrl + g に変更

    set-option -g prefix C-g
    unbind-key C-b
    bind-key C-g send-prefix

ターミナル起動時にtmuxを自動実行

```bash:~/.bash_profile
# 初回シェル時のみ tmux実行
if [ $SHLVL = 1 ]; then
  tmux
fi
```

# 参考情報
- [tmuxを使い始めたので基本的な機能の使い方とかを整理してみた](http://kanjuku-tomato.blogspot.jp/2014/02/tmux.html)
- [tmuxの基本的な使い方とコマンドのまとめ](http://www.task-notes.com/entry/20150711/1436583600)
- [tmux 2.1からmouse系のオプションが変更になった。](http://shinespark.hatenablog.com/entry/2015/10/31/155420)
- [tmuxのコピーモードを使わずに任意の範囲選択をする](http://qiita.com/mogulla3/items/ca5bfa585ef19ed1eb9b)
- [tmuxの外観をカスタムして、運用と開発を加速させる](http://blog.glidenote.com/blog/2011/12/16/custom-tmux-visual/)
- [tmuxでXmonadライクで直感的なキーバインドを設定する](http://qiita.com/ssh0/items/b423d65f723eecb81527)
- [達人に学ぶ.tmux.confの基本設定](http://qiita.com/succi0303/items/cb396704493476373edf)
Ansibleでシェル芸をいつもより多く回してみる

#下準備
適宜パッケージマネージャで ansible パッケージをインストール

```
cygwin環境の場合は gcc-core, openssh, python, python-setuptools を
インストールした上で easy_install pip; pip install ansible を実行

~/.bashrc に export ANSIBLE_SSH_ARGS="-o ControlMaster=no" を追記し反映
```

sshの接続先設定は ~/.ssh/config に以下のように記述しておく

```~/.ssh/config
Host server1
 HostName nnn.nnn.nnn.nnn
 IdentityFile ~/.ssh/keys/server1.pem
 User user1
```

ansibleの設定は ~/.ansible.cfg を作成すると自動で読み込まれるので
下記の様に対象ホスト、ホストグループの設定ファイルパスなどを設定しておく

```~/.ansible.cfg
[defaults]
hostfile = ~/.ansible_hosts
```

~/.ansible_hosts に記述した対象ホスト、ホストグループが操作可能になる

```~/.ansible_hosts
#対象ホスト記述
server1

#ホストグループ記述
[group1]
server1
server2
server3

#対象ホスト記述には sshの接続パラメータなども指定可能
server1 ansible_ssh_user=xxx ansible_ssh_pass=xxx ansible_ssh_port=nnnn
```

#やってみる
ホストグループ group1 全ホストで uname -a を実行し結果を取得```
% ansible -a "uname -a" group1
```

デフォルトのcommandモジュールだと、パイプリダイレクトが使えないので shellモジュールを使用```
% ansible -m shell -a "uname -a | cut -d' ' -f 3" group1
```※エイリアス定義しておくと良いかもしれない

-oオプションで、出力結果をホストごとに 1行にして出力```
% ansible -m shell -a "uname -a | cut -d' ' -f 3" group1 -o
```

-tオプションで、ディレクトリを作成し、ホスト名のファイルに出力```
% ansible -m shell -a "uname -a | cut -d' ' -f 3" group1 -t dir
```※JSONフォーマットなので jqコマンドなどを使って、好きに料理する

他にユーザ指定や並列度のオプションなどがあるが、必要なら[ここを参照](http://linux.die.net/man/1/ansible)


[対象ホスト指定](http://docs.ansible.com/ansible/intro_patterns.html)にはワイルドカードや :で区切っての複数条件指定が行える```
% ansible --list-hosts server*
% ansible --list-hosts group1:group2
% ansible --list-hosts group1:!excluded:&required
```※ --list-hostsオプションで処理を実行せず、対象ホストの一覧のみ出力している


モジュールは上記以外にも[多数用意](http://docs.ansible.com/modules_by_category.html)されていて、[使いこなせば](http://docs.ansible.com/ansible/modules.html)システム管理作業などが捗る```
% ansible -m ping group1
% ansible -m copy -a "src=~/hoge.conf dest=/etc/httpd/conf.d/hoge.conf" group1
% ansible -m service -a "name=httpd state=restarted" group1
```
#おまけ
コマンドラインからホスト、パラメータを指定して実行する playbookテンプレート

```yml:hoge.yml
--- # usage: ansible-playbook hoge.yml -e "hosts=server1 param1=aaa"
- hosts: "{{ hosts }}"
  tasks:
    - action: "hoge param1={{ param1 }}"
```
も少し高度な条件判断や処理の構造化をしたい場合は [playbookの構文](http://docs.ansible.com/ansible/playbooks_intro.html)を覚えると良い
YOLP：Yahoo!ジオコーダAPIで緯度経度を抜き出す。

Yahoo!ジオコーダAPIで任意の住所の緯度経度情報だけを抜き出す。

```python:geo.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import requests
import json
import sys, codecs
 
def get_Coordinates(location_name):
    payload = {
    	"appid": "******************************", 
    	"output":"json"
    		}
    payload["query"] = location_name
    url = "http://geo.search.olp.yahooapis.jp/OpenLocalPlatform/V1/geoCoder"
    r = requests.get(url, params=payload)
    
    res = r.json()
    
    for i in res["Feature"]:
    	print i["Geometry"]["Coordinates"]
    	

    
if __name__ == "__main__":
	get_Coordinates(u"東京都港区芝公園4‐2‐8")

```

jsonで返るデータの選択を

```
    for i in res["Feature"]:
    	print i["Geometry"]["Coordinates"]
```

で指定している。例えばこれに["Feature"]に含まれるデータを読みたい場合は

```
    for i in res["Feature"]:
    	print i["Geometry"]["Coordinates"]
    	print i["Property"]["Address"]
```

こんな感じで書き足せばいい。
どこかで使用する場合はYahooコピーライト表記を忘れずに。
WordPress｜single.phpにループは必要？

<h1>WordPress｜single.phpにループは必要？</h1>
　<a href="http://wpdocs.osdn.jp/%E3%83%AB%E3%83%BC%E3%83%97">WordPressループ</a>といえば、ページごとのコンテンツを呼び出すときに活躍してくれますね。しかし、ループというのはプログラミングでは本来「繰り返し」を意味し、一つ記事出力するのに必要なのかということが考えられます。

　ここで、ループ処理の中を見ていきます。

<?php 
　if ( have_posts() ) {　　・・・①
　　while ( have_posts() ) {　　　・・・②
　　　the_post(); 　　・・・③
　　　　　// 投稿がここに表示される　　　・・・④
　　　}  end while　　　・・・⑤
　}  end if　　　・・・⑥
?>

①投稿が存在する場合
②投稿数の文繰り返す
③現在の投稿をセット（準備、読み込み）
④処理を書いていく
※ここにそのページの情報をひっぱてきます。タイトル、コンテンツだとか。
⑤ループの終了
⑥投稿の有無のif文の終了

　ここで、実は、記事ページ等の場合、③だけでページの情報を持ってくることができます。しかし、公式サイトには推奨されていないため、不安な方はループでとりあえず回しておきましょう。
AWS S3 の VPC エンドポイント

# S3 の VPC エンドポイントとは？
VPC のプライベートサブネット内から、NATインスタンスを介さずにS3にアクセスできるようになる仕組み。VPC内にエンドポイントを作成すると、サブネットから S3 へのアクセスはそのエンドポイントに転送されるようルーティングテーブルに設定され、そのエンドポイントを介してS3にアクセスできる。
なお、EC2インスタンスと同一リージョンのS3のみにアクセス可能であることに注意。

# 使ってみた
以下は、AWS コンソールからの設定。

## Endpoint の作成
VPC の画面の「Endpoint」メニューから作成する。その際に、エンドポイントと紐付けるプライベートサブネットを指定する。すると、ルーティングテーブルに次のようなエントリが追加される。
![01-route-table.PNG](https://qiita-image-store.s3.amazonaws.com/0/79316/9dcd3233-d546-110e-d036-aaa1c3001f69.png)
最低限必要な設定はこれだけ。

## プライベートサブネットからS3へのアクセス
パブリックサブネットにある踏み台インスタンスを経由して、プライベートサブネットのインスタンスにログイン。
ローカルのPCがWindowsなので、やり方はこのあたりを参照:
[外部から踏み台サーバ経由の多段SSH接続をWindowsクライアントから行う](http://dev.classmethod.jp/cloud/aws/bastion-ssh-on-windows/)

すると、aws cli を使って S3 にアクセスできるようになっている。

```bash
# バケットの一覧取得
$ aws s3 ls
2015-03-09 23:49:02 <MyBucket1>
2015-05-16 23:45:14 <MyBucket2>
...

# ファイル(適当なテキスト)をアップロード
$ vi test.txt
$ aws s3 cp test.txt s3://<MyBucket1>
upload: ./test.txt to s3://<MyBucket1>/test.txt
```

# エンドポイントの今後
現時点ではS3のエンドポイントしか作成できないが、今後は他のサービス用のエンドポイントも作成できるようになるとのこと。
[Amazon S3のVPCエンドポイント](http://aws.typepad.com/aws_japan/2015/05/vpcendpointfors3.html)
> 将来的には他のAWSサービスのVPCエンドポイントも作成できるようになります。
CasperJS で Reactjs のサイトをテスト


## 問題
- PhantomJS1.x系だと ReactJS を使った箇所が表示されなかった
  - PhantomJS2系だと表示される模様
- CasperJS1.1-beta3 で PhantomJS2 は使えない
  - CasperJS のmaster だと暫定で PhantomJS2 が使える

## 検証1（phantomjs1.x + casperjs1.1-beta3）

### 下準備

capture.js

```javascript
var casper = require('casper').create({});
var url = "http://todomvc.com/examples/react/#/";

casper.userAgent('Mozilla/5.0 (iPhone; CPU iPhone OS 8_1 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Version/8.0 Mobile/12B411 Safari/600.1.4');

casper.start(url, function() {
    this.echo('access ' + url);
});

casper.wait(3000);

casper.then(function() {
    this.capture('reactjs-site.png');
});

casper.run();

```


package.json

```json
{
  "devDependencies": {
    "casperjs": "^1.1.0-beta3",
    "phantomjs": "^1.9.16"
  },
  "scripts": {
    "capture": "casperjs capture.js"
  }
}
```

### ライブラリをインストール


```
$ npm install
```

### キャプチャ撮る(PhantomJS1.x + CasperJS1.1-beta3)

```
$ npm run capture
```

表示されない

![reactjs-site-for-phantomjs1.png](https://qiita-image-store.s3.amazonaws.com/0/41656/04094def-6cb4-ca7f-1446-0e95c2b67895.png "reactjs-site-for-phantomjs1.png")

## 検証2 phantomjs2 + casperjs#master

phantomjs と casperjs をアンインストールして、casperjs の master と phantomjs2 をインストールする


```
$ npm uninstall -D phantomjs casperjs

$ npm install -D n1k0/casperjs.git#master
$ npm install -D phantomjs2
```

package.json

```json
{
  "devDependencies": {
    "casperjs": "git://github.com/n1k0/casperjs.git#master",
    "phantomjs2": "^2.0.0"
  },
  "scripts": {
    "capture": "casperjs capture.js"
  }
}
```

### キャプチャ撮る(PhantomJS2 + CasperJS#master)


```
$ npm run capture
```

表示された

![reactjs-site-for-phantomjs2.png.png](https://qiita-image-store.s3.amazonaws.com/0/41656/183c9db5-06b0-b766-c107-a7a286e7cf9a.png "reactjs-site-for-phantomjs2.png.png")


## 参考

- https://github.com/n1k0/casperjs/issues/987
RTX1100 をもらったので初期化した

https://twitter.com/j3tm0t0/status/538214053664260096

というわけで RTX1100 が我が家に再びやってきました。わーい、ありがとー。ちなみに RTX1000 が現役でした。何度やってもその度に忘れてググるので、自分の為に残しておこう。

# 初期化

背面に INIT と書いてあって、その下に穴が開いている。穴に何かつっこむとボタンになってるので押しながら起動する。

# IP address の設定

デフォルトでは IP address は振られていないので、RS-232C で繋げばいいはずなんだけど RS-232C が見つからない。引越しの度の大掃除で存在は確認してるはずなのだが。`rarpd` で設定することに。底面に lan1,2,3 の MAC Address が書いてある。

```text:/etc/ethers
00:A0:DE:XX:XX:XX 192.168.1.1
```

のようにして手元のマシンと lan1 を繋ぐ。

```text
# rarpd -dvae
```

のようにして RTX1100 を起動したら IP address を受けとってくれた。Arch Linux の場合 `rarpd` は iputils という package に入っていました。

# 設定の流しこみ

`telnet` で繋いでコピペで終了でした

# firmware の update

良く見たら firmware が最新じゃない!! download は http://www.rtpro.yamaha.co.jp/RT/firmware/ から。一応 hash を確認。

```
$ cat rtx1100.md5 
0f90f27a7e1eafd8bbd1da3c5dd1a131 *rtx1100.bin
$ md5sum rtx1100.bin
0f90f27a7e1eafd8bbd1da3c5dd1a131  rtx1100.bin
```

大丈夫そう。

```text:RTX1100上
# tftp host 192.168.1.2
```

とすると `192.168.1.2` からの TFTP 接続を受けてくれるので

```text
$ tftp
(to) 192.168.1.1
tftp> mode binary
tftp> put rtx1100.bin exec
```

で update される。

# RTX1000 と 1100 の違い

モジュラジャックの上下が違う
パンくずリスト｜ヘンゼルとグレーテル

<h1>パンくずリスト｜ヘンゼルとグレーテル</h1>

<h2>余談</h2>
よくWEBサイトで、パンくずと呼ばれる現ページの階層ナビがありますね。これの名前の由来は、へんぜるとグレーテルの童話から来ています。


「ヘンゼルとグレーテルは、ある森のなかへ入りました。その道中迷わないように持ってたパンのクズを落としながら進んだ。」
ということです。

また、ヘンゼルとグレーテルの話のパンくずは、鳥に食べられて無くなってしまいました・・。

パンくずのリンク落ちには注意しましょう笑
Hugoではテーマを指定しないとindex.htmlのサイズがゼロで作成される

ものすごく基礎的なことだけどちょっとハマったのでメモ。
結論として、テーマをダウンロードして、指定しないとダメですよという話。

## 対象のVersion

    kakkyz@docker:/tmp/hugo$ hugo version
    Hugo Static Site Generator v0.14-DEV BuildDate: 2015-05-12T21:40:11+09:00

## とりあえずサイトを作って、記事を作成

hugo new site
hugo new


    kakkyz@docker:/tmp$ hugo new site /tmp/hugo
    kakkyz@docker:/tmp$
    kakkyz@docker:/tmp/hugo$ hugo new hoge.md
    /tmp/hugo/content/hoge.md created
    kakkyz@docker:/tmp/hugo$


vim content/hoge.md

    +++
    date = "2015-05-17T11:25:14+09:00"
    draft = true
    title = "hoge"

    +++
    # my first HUGO

    HUGOテスト



## テーマを指定せずにファイル作成

-Dオプションは、ドラフトも含めて作成するためのもの

    kakkyz@docker:/tmp/hugo$ hugo -D
    1 of 1 draft rendered
    0 future content
    1 pages created
    0 paginator pages created
    0 categories created
    0 tags created
    in 117 ms
    kakkyz@docker:/tmp/hugo$ ls -lFR public/
    public/:
    合計 12
    -rw-r--r-- 1 kakkyz dev    0  5月 17 11:26 404.html
    drwxr-xr-x 2 kakkyz dev 4096  5月 17 11:26 hoge/
    -rw-r--r-- 1 kakkyz dev    0  5月 17 11:26 index.html
    -rw-r--r-- 1 kakkyz dev  999  5月 17 11:26 index.xml
    -rw-r--r-- 1 kakkyz dev  420  5月 17 11:26 sitemap.xml

    public/hoge:
    合計 0
    -rw-r--r-- 1 kakkyz dev 0  5月 17 11:26 index.html
    kakkyz@docker:/tmp/hugo$

index.xmlは中身ありだが、index.htmlはサイズが0で中身なしで悪い

## テーマのダウンロード

    kakkyz@docker:/tmp/hugo$ git clone --recursive https://github.com/spf13/hugoThemes themes
    Cloning into 'themes'...
    remote: Counting objects: 283, done.
    remote: Total 283 (delta 0), reused 0 (delta 0), pack-reused 283
    Receiving objects: 100% (283/283), 507.40 KiB | 254.00 KiB/s, done.
    Resolving deltas: 100% (136/136), done.
    Checking connectivity... done.


## テーマを指定してファイル作成

    kakkyz@docker:/tmp/hugo$ hugo --theme=greyshade -D
    ERROR: 2015/05/17 Site's .BaseUrl is deprecated and will be removed in Hugo 0.15. Use .BaseURL instead.
    1 of 1 draft rendered
    0 future content
    1 pages created
    0 paginator pages created
    0 categories created
    0 tags created
    in 104 ms
    kakkyz@docker:/tmp/hugo$ ls -lFR public/
    public/:
    合計 44
    -rw-r--r-- 1 kakkyz dev    0  5月 17 11:39 404.html
    -rw-r--r-- 1 kakkyz dev  804  5月 17 11:28 config.rb
    drwxr-xr-x 2 kakkyz dev 4096  5月 17 11:28 css/
    drwxr-xr-x 2 kakkyz dev 4096  5月 17 11:28 font/
    drwxr-xr-x 2 kakkyz dev 4096  5月 17 11:26 hoge/
    drwxr-xr-x 4 kakkyz dev 4096  5月 17 11:28 images/
    -rw-r--r-- 1 kakkyz dev 2375  5月 17 11:39 index.html
    -rw-r--r-- 1 kakkyz dev  412  5月 17 11:39 index.xml
    drwxr-xr-x 2 kakkyz dev 4096  5月 17 11:28 js/
    drwxr-xr-x 3 kakkyz dev 4096  5月 17 11:39 page/
    drwxr-xr-x 6 kakkyz dev 4096  5月 17 11:28 sass/
    -rw-r--r-- 1 kakkyz dev  420  5月 17 11:39 sitemap.xml

無事作成されて良い
sshで公開鍵認証ができない

特定状態の環境で公開鍵認証ができなくてパスワード認証になっていて
すごく非効率だったんですかようやく謎が解けました。

公開鍵認証でアクセスするには/home/内にあるユーザーフォルダに他のアカウントがアクセスできるようにするとだめなんですねぇ。
自分がいじる前から歴史的な経緯でパーミッション 775だったものを755にすると公開鍵認証できるようになりました。