OmniAICreator/Qiita-1.07M huggingface dataset:
にわかMarkdownユーザーによるEvernote連携の試行錯誤


（追記，2015/10/07）
Evernote連携に関する新しい記事を投稿しました．こちらも参照ください.
[Evernote Web ClipperでQiita記事をきれいに保存（朗報）](http://qiita.com/TomokIshii/items/897bb865ab608472d2cf)


### 情報記録ツール使い分け

Kobito for WindowsでMarkdownを始めた約1か月の「にわか」Markdownユーザーであるが，同じ情報記録ツールであるEvernoteと連携する作業のやり方について考えてみた．

当初は，次のような安易な使い分けを考えていた．

|  Tool                             |     How to use                |
|--------------------------|--------------------------|
| Evernote                    |  ねた情報収集，画像一時貼り付け，自分用メモ  |
| Kobito for Windows | Qiita投稿用文書作成，投稿した文書の蓄積． |

ところが上記のようにしてしまうと，同じ内容の情報が，Kobito for WindowsとEvernoteの両方に，ドラフト版，公開したもの，と違うレベルで蓄積されることになってしまう．できれば，長年慣れ親しんだEvernoteの方にも，Qiita用に準備した文書を保持したい希望が出てきた．

で，考えたのがこの作業フロー．

1. Evernoteでねた集め．アイディア出し．
1. Kobito for Windows で投稿用文書作成．Qiitaへ投稿．
1. Qiita投稿後，Browserで開いて，Evernote Web Clipper で自分の文書をQiitaからクリップ．

** 図．Evernote Web Clipper のボタン **
![my_capture_en_clipper1.PNG](https://qiita-image-store.s3.amazonaws.com/0/74152/3eeeb9aa-071d-8cae-8ebe-c81d93327aa0.png)

ところがである．Qiita文書からテキスト，画像等, 必要な情報は無事Evernote側に取り込まれているが，Markdownで装飾されているところ，中でもProgram List がプレーン・テキストに変わってしまっている．ご存知の通り，Qiita siteでは（Markdownでは）List背景がグレーで囲まれ，かつ，美しいプログラム言語のシンタックス・ハイライトがつくが，それがクリップ後，失われてしまっていた．

### Markdown Hereなるツール

HTMLやCSS, Qiita APIやEvernote APIに通じているわけでもないので，仕方なくInternetで"Evernote”，”Markdown"で検索すると以下の記事(& 動画）があった．

__ Three ways to use Markdown with Evernote __
[http://www.todohack.com/2014/02/12/three-ways-to-use-markdown-with-evernote/](http://www.todohack.com/2014/02/12/three-ways-to-use-markdown-with-evernote/)

ここで紹介されていた３つの方法のうち"Markdown Here"というWeb Browser Extension （アドオン ソフト）を試してみて，私の目的に対して使えそうな感触を得た．

__ Markdown Here __ 
[http://markdown-here.com/](http://markdown-here.com/)

![my_capture_en_clipper2.PNG](https://qiita-image-store.s3.amazonaws.com/0/74152/31a5bc87-ad46-a8e8-a556-a167993695d8.png)

元々は，Browser上でメールをMarkdownで書くのをサポートする，というツールのようだが，Evernote WebでMarkdownを使えば，そのままEvernote内に文書が保存される．その後，Evernoteクライアントで表示すると図のようになる．

![my_capture3.PNG](https://qiita-image-store.s3.amazonaws.com/0/74152/11e97918-2c9e-8cd0-96b0-66a5bbd17620.png)

テーブル等，他のMarkdown記法も試してみたが，かなりの部分でレンダリングが保持されるようである．Qiita投稿前にこの作業をEvernote Webでやるか，あるいはQiita記事のクリップ後にMarkdownを入れなおせば，美しいProgram ListをEvernote内に残すことができる．

もう完全に「作業効率化」ではなく「作業__非__効率化」の世界であり，Markdown推進者の方からは「お叱り」を受けそうな作業フローであることはよく承知している．（あまり「凝る」のはよくない気がします．）

###要望です．
まとまりのない記事になってしまいました．もっと良いやり方ご存知でしたら，紹介していただけると助かります．やはり，何等かのツールを自作する必要があるのかもしれませんね．
Mavericks の swift プロジェクトで Expected type after 'as' というエラー

# 現象
Mac の Maverick で Swift のあるプロジェクトをコンパイルする際に発生したエラーです。
該当のプロジェクトは CocoaPods で Spring をインストールしていて、Spring のコードで Expected type after 'as' というエラーが発生しているようでした。

# 原因
単純に Xcode のバージョンが古いだけでした。
Swift の as! という記述が使われていて、それは Xcode 6.3 から導入された記法の用で単純に Swift が対応していないということでした。

# 問題
Maverick でインストールできる Xcode が 6.2 までのようです。
なので Maverick でコンパイルができないようです。

# 解決方法
Yosemite にアップデートしましょう。
http://qiita.com/riocampos/items/a0f58b63b82844a24140


# 参考
http://stackoverflow.com/questions/29042042/xcode-6-2-expected-type-after-as
class名、id名

#class名、id名
class名、id名の指定に対して指摘をされました。
確かに意味のない指定の仕方は、見難かったりナンバーを入れると後でclass名を追加する際
ナンバーをずらすことになり混乱を招きます。
自分の為にも、class名、id名について調べてみました。

http://www.tagindex.com/stylesheet/basic/naming.html

http://css-happylife.com/archives/2007/0115_1345.php

HPのサンプルを参考に以下の様に指定してみました。

```lang:HTML
<div class="main">
	<div class="main-top">
		<div class="main-top-text">
		　　　<h2>自然と調和を目指す企業です</h2>
		　　　<p>ホームページサンプルは自然との調和を目指します。</p>
		　　　<p>革新的な技術で世の中を動かす企業を目指します。</p>
		</div>
	</div>
	<div class="main-first">
		<h3>ホームページサンプル株式会社の取り組み</h3>
		<p>ホームページサンプル株式会社では最新技術と自然との調和を目指します。</p>
		<img src="img/sample1.jpg" alt="PC" style="border:solid 3px #ebebeb">
	</div>
	<div class="main-second">
		<h3>ホームページサンプル株式会社の取り組み</h3>
		<img src="img/sample2.jpg" alt="PC" style="border:solid 3px #ebebeb">
					<p>革新的な技術で世の中を動かす企業を目指します。<br>
					ホームページサンプル株式会社では最新技術と自然との調和を目指します。</p>
	</div>
	<div class="company-outline">
		<h3>会社概要</h3>
　　　　　</div>
	<div class="picture-gallery">
		<h3>写真ギャラリー</h3>
		<img src="img/gallery1.jpg" alt="PC" style="border:solid 3px #ebebeb">
	</div>
</div>
```
Webの基本

ネット上で情報を共有するための決めごと
1. 共有する情報を定められた記述言語で作成する(HTML)
2. 1の情報を表示できるプログラムを作成する(ブラウザ)
3. 他のコンピュータから要求があった時に1の情報を自動的に配信するプログラムを作成する(HTTPd)
4. 要求するプログラムと要求されるプログラム間の通信手順を決定する(HTTP)
5. 作成された情報は、相互的に関連付けができ、情報館をシームレスに行き来できる(リンク機能)
ScaffoldとBakeのメリット・デメリット

**Scaffold**と**Bake**はどちらも開発をサポートする機能です。
どちらも「ひとつの画面を用意するのに、モデル作って、ビュー作って、コントローラ作って...と、似たようなコードを何度も書きたくない」というプログラマの希望を叶えてくれるありがたい機能です。ただ、個人的には昔「何が違うのか？」と悩みました。
似て非なるこの2つの機能について、メリット・デメリットを理解して使いどころを分けましょう。

#Scaffoldについて
簡単なコントローラをひとつ用意するだけで、テーブルの一覧・追加・削除・編集画面などを簡単に実装することができるといった機能です。

具体的には以下のようにコントローラを用意すると、shopsテーブルの一覧・追加・編集・削除ができる管理画面を実装されます。

```php:ShopsController.php
class ShopsController extends AppController {
	public $scaffold;
}
```

#Bakeについて
こちらはコマンドからモデルやコントローラ、ビューを自動生成する機能になります。
テーブルの一覧・追加・削除・編集画面なども自動生成されたファイルによって既に出来上がっています。

具体的には以下のようにbakeコマンドを実行すると対話的に次々と入力を求められ、それに答えていくことでファイルが生成されるといった手順です。

```bash
$ app/Console/cake bake

Welcome to CakePHP v2.x Console
---------------------------------------------------------------
App : ***/app/
Path: ***
---------------------------------------------------------------
Interactive Bake Shell
```

何作るの？と聞かれるので、例えばモデルを作りたかったら、「M」を入力

```bash
---------------------------------------------------------------
[D]atabase Configuration
[M]odel
[V]iew
[C]ontroller
[P]roject
[F]ixture
[T]est case
[Q]uit
What would you like to Bake? (D/M/V/C/P/F/T/Q) 
>M
```

どのDB設定（app/Config/database.php参照）を使う？

```bash
---------------------------------------------------------------
Bake Model
Path: ***/app/Model/
---------------------------------------------------------------
Use Database Config: (default/test/release) 
[default] > test
```

上記で選択したDB設定からテーブルを呼び出し候補を羅列し、どのモデルを作るか問いかけられるので作りたいモデルの番号を入力する。

```bash
Possible Models based on your current database:
 1. Shop
 2. Item
 3. Maker
     :
Enter a number from the list above,
type in the name of another model, or 'q' to exit  
[q] > 1
```

このように対話的に生成する内容を設定していきます。選択肢によっては質問も異なってきます。

#ScaffoldとBakeの使いどころ
上述したように、大局的に見ればScaffoldとBakeはどちらも「テーブルの一覧・追加・削除・編集画面などを簡単に実装」できる機能ですがそれぞれにメリット・デメリットがあります。


> - Scaffold
 - **メリット**<br>
 容易に作成でき、テーブル変更へ柔軟な対応が可能
 - **デメリット**<br>
 コントローラ毎に個別のカスタマイズに不向き
- Bake
 - **メリット**<br>
 コントローラなど個別のカスタマイズが容易
 - **デメリット**<br>
 テーブル変更への対応が必要<br>
 類似コントローラすべてに対する共通の変更が不向き



Scaffoldはすごく簡単に管理画面を作れますが、各コントローラ別に画面レイアウトを変更するのが難しいという点があります。
Bakeはそれぞれファイルを書き出すので、個別のカスタマイズが容易になりますが、テーブルの変更やレイアウトの変更などそれぞれ個別に行う必要があります。

開発体制などに併せて考える必要はありますが、こういったメリット・デメリットを踏まえて、以下のように使いどころを意識することで開発はよりスムーズにできる可能性があります。


> - Scaffoldの使いどころ
 - 開発初期（テーブル構造が確定する前段階など）
 - マスタなどのレイアウトに大きな変化が不要なテーブル
- Bakeの使いどころ
 - 開発中〜後期（テーブル構造の確定後など）


なんだかんだと要望が増えてテーブル構造が変わることはよくあります。
開発当初はScaffoldで管理画面を用意して、ある程度テーブルが固まってきたらBakeでファイルを作ると随時テーブル変更に対応する必要がなくなります。
また可能なら、UIに凝る必要がないマスタデータをScaffoldで提供すると工数削減できますね。
Cake2での国際化関数について

#国際化関数についてのメモ


 __(' ')で他言語化したい文字を囲む。

```
<?php echo __('Intermationalization');?>

```

日本語の場合
/Locale/jpn/LC_MESSAGES/default.poを作成し以下を記入

```
#: View/Hoges/index.ctp:1
msgid "Intermationalization"
msgstr "国際化"
```
#以下を参考

CakePHPドキュメント
http://book.cakephp.org/2.0/ja/core-libraries/global-constants-and-functions.html

CakePHPを使って多言語化
http://tagamidaiki.com/cakephp-i18n-multiple-language/
pyspark(SparkのPython)でRDDを圧縮ファイルとして保存する方法

`scala`や`java`から`RDD`を操作するときは下記のように
1. 圧縮コーデッククラスをimportする
2. `saveAsTextFile`の第２引数にコーデッククラスのクラス・インスタンスを指定する
のようにするとRDDを圧縮ファイルとして保存できるのですが、

```scala
import org.apache.hadoop.io.compress.GzipCodec
sc.textFile( "/path/input/file" )
  .saveAsTextFile( "/path/output/file", classOf[GzipCodec] )
```

`python`ではどうするんだろうと思って調べたら下記のようでした。

```py
codec = "org.apache.hadoop.io.compress.GzipCodec"
sc.textFile( "/path/input/file" ) \
  .saveAsTextFile( "/path/output/file", codec )
```

参考: https://spark.apache.org/docs/latest/api/python/pyspark.html
IIS7.5 FTPサイトで仮想ディレクトリを複数登録すると「550 Keyset does not exist」が出てルートからディレクトリ一覧が見れない時の対処


IIS7.5でFTPサイトを立てて、仮想ディレクトリを複数個作成するケースでバグというかおかしな仕様を見つけたのでシェア。

##現象
FTPサイトを作って、
①ルート配下に仮想ディレクトリを1つ作成
→FTPクライアントからルートのディレクトリ一覧で仮想ディレクトリ(virtual1)見える


```サイト構成
aaa.ftp
  |--virtual1(仮想ディレクトリ)
```

②ルート配下に仮想ディレクトリを2つ以上作成
→FTPクライアントから該当サイトに繋ぐと下記エラーが出てディレクトリ一覧をリスト表示出来ない。。(virtual1,2ともに見えず何も表示されない)

```サイト構成
aaa.ftp
  |--virtual1(仮想ディレクトリ)
  |--virtual2(仮想ディレクトリ)
```


```クライアント側のエラー内容
550 Keyset does not exist
```

##解決策

色々調べると下記へのアクセス権がないために、ルートからディレクトリ一覧が表示されないらしい。

```
#このディレクトリ内のファイルに仮想ディレクトリへの接続情報が格納されるらしい
C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys
```

####仮想ディレクトリの接続ユーザに使っているユーザに、下記への読取り権限を与えてあげる事で無事仮想ディレクトリが表示されるようになった。

結構はまったが、まぁ解決！

[参照]
http://serverfault.com/questions/655968/iis-7-5-ftp-and-virtual-directory
タップした点から円が広がるようにして画面遷移するアニメーションを作る

※ すべてのコードを載せると量が多くなってしまうので、ポイントを絞って説明します。
※ すべて見たい方は[GitHub](https://github.com/kitoko552/CircularRevealAnimator)を参照してください。
***

ポイントを簡潔にまとめると以下のようになります。

1. 遷移の始まりと終わりの円のCGPathを取得する
2. 遷移先のUIViewControllerのview.layer.maskにCAShapeLayerを代入する
3. 取得したCGPathを使ってアニメーションを実行する

画面遷移のアニメーションの実装には、UIViewControllerAnimatedTransitioningを使っています。

#遷移の始まりと終わりの円のCGPathを取得する

```swift
// 画面全体を覆う円の半径
let radius = { () -> CGFloat in
	// centerはタップしたCGPoint
	let x = max(self.center.x, containerView.frame.width - self.center.x)
	let y = max(self.center.y, containerView.frame.height - self.center.y)
            
    return sqrt(x * x + y * y)
}()
        
let rectAroundCircle = { (radius: CGFloat) -> CGRect in
    return CGRectInset(CGRect(origin: self.center, size: CGSizeZero), -radius, -radius)
}
        
// アニメーションにおけるはじまりの円と終わりの円のパスを取得
let startPath = CGPathCreateWithEllipseInRect(rectAroundCircle(0), nil)
let endPath = CGPathCreateWithEllipseInRect(rectAroundCircle(radius), nil)
```

`radius`では、タップした点から一番遠い角までの距離が半径が求められます。
つまり、これによって求められるものは、アニメーション終了時の円の半径となります。

`rectAroundCircle`は、タップした点から、指定したradius分余白を縦横両方に加えた矩形（CGRect）を取得できます。
これは、次に出てくる`CGPathCreateWithEllipseInRect `で、円のCGPathを求めるためのCGRectということになります。

`CGPathCreateWithEllipseInRect `は、指定されたCGRectの各辺に接するような楕円のCGPathを得ることができます（参考: [CGPathCreateWithEllipseInRectを使って円形のviewを作る](http://kitoko552.hatenablog.com/entry/2015/06/24/144352)）。
先ほどの`rectAroundCircle `を使って、アニメーションにおけるはじまりの円と終わりの円のCGPathを求めています。

#遷移先のUIViewControllerのview.layer.maskにCAShapeLayerを代入する

```swfit
// targetは、遷移先のUIViewControllerのview
target.layer.mask = { () -> CALayer in
    let mask = CAShapeLayer()
    mask.path = endPath
                
    return mask
}()
```

target.layer.maskにpathを設定できるようにするため、CAShapeLayer（CALayerの子クラス）を代入します。
pathに先ほどの円のCGPathを設定することでアニメーションを実現するからです。

target.layer.maskにpathを設定できるようすればいいだけなので、上のようにendPathを代入しておくことはしなくてもいいのではないかと思うかもしれませんが、設定しておかないとアニメーション終了後にviewが真っ暗になる（pathの値がnilになり、viewに描画されない状態になると思われる）ので、アニメーション前に終了時のpathを設定しておきます。

***
####追記
[naoyashiga](http://qiita.com/naoyashiga)さんより、上の内容についてご指摘いただきました。
CABasicAnimationの`removedOnCompletion`プロパティをfalseにし、`fillMode`プロパティをkCAFillModeForwardsに設定すれば、わざわざあらかじめmask.pathにendPathを指定しておかなくてもアニメーション後の状態を維持することができそうです。
つまり、CABasicAnimationの各プロパティを設定したら、上のコードは単純に以下のようにするだけで大丈夫です。

```swift
target.layer.mask = CAShapeLayer()
```

GitHubも更新してあるので、興味がある方は是非ご覧ください。
***

#取得したCGPathを使ってアニメーションを実行する
```swift
// CABasicAnimationは通常このようなイニシャライザは持っていませんので、
// extensionで自作しています。
// duration, timingFunction, delegateは自分で設定。
let animation = CABasicAnimation(keyPath: "path", fromValue: startPath, toValue: endPath, duration: duration, timingFunction: timingFunction, delegate: delegate)

target.layer.mask.addAnimation(animation, forKey: "circular")
```

`CABasicAnimation`のキー値を"path"として、上で求めたpathをそれぞれfromValue, toValueに設定しています。
そして、target.layer.maskに対してこのアニメーションを実装します。

##デモ

実際に作ったものが以下のようになります。

![Preview](http://f.st-hatena.com/images/fotolife/k/kitoko552/20150624/20150624152856.gif)

このように、[GitHub](https://github.com/kitoko552/CircularRevealAnimator)にあげたものには、今回とは逆の、円が小さくなって遷移するようなアニメーションも実装しています。
formタグ,aタグ,inputタグの組み合わせでリンクが動作しない(IEのみ)

#何をしたかったか
単純にボタンにaタグでリンクを張って、外部に飛ばしたい。
ただしレイアウト諸々の関係上、formタグの中にボタンを置いた。

```html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
        <title>テスト</title>
</head>
<body>
<form action="/hoge" method="POST">
<div>
        <a href="http://www.yahoo.co.jp"><input type="button" name="button" value="外部サイトへ"></a>
        <input type="submit" name="submit" value="送信" >
</div>
</form>
</body>
</html>
```
#何にハマったか
Chrome、FireFoxでは"外部サイト"へボタンを押せば、きちんとリンク先に飛ぶのだが、IE11は無反応だった。

HTML5にしたらどうだろうと思い、DOCTYPEを`<!DOCTYPE html>`に書き換えてみたが変わらず。
そもそもHTML5ではaタグの子要素としてinputタグは許可されていないので、HTML Validateでエラーとなる。
(Chrome、FireFoxでは動くけど)

次にaタグ、inputタグの組み合わせをformの外に出してみた。
これだと3ブラウザいずれも問題なく動作した。

```html
<form action="/hoge" method="POST">
<div>
        <input type="submit" name="submit" value="送信" >
</div>
</form>
<a href="http://www.yahoo.co.jp"><input type="button" name="button" value="外部サイトへ"></a>
```

#結局どうしたか
HTML5のエラーも考慮して、onclickイベントで対応。

```html
<form action="/hoge" method="POST">
<div>
        <input type="button" name="button" value="外部サイトへ" onclick="window.open('http://www.yahoo.co.jp', '_self')"></a>
        <input type="submit" name="submit" value="送信" >
</div>
```

#補足(2016.11.18)
今更ながら最初のHTMLをWindows10のIE11(バージョン:11.672.10586.0)とMicrosoftEdgeで確かめてみた。
結果はどちらも問題なく動作。バグfixされたのかな。
FuelPHP マイグレーションメモ

# 特定のマイグレーションファイルだけ実行したかった

以下の様な状態で

`$ oil r migrate`
Performed migrations for app:default:
0130_create_staff_info_a
0131_create_staff_info_b

`$ oil r migrate:down v=129`
Reverted migrations for app:default:
- 0131_create_staff_info_b
- 0130_create_staff_info_a

131だけ適応したかった。

130のマイグレーションファイルを適当にリネームし

`$ oil r migrate`
Performed migrations for app:default:
0131_create_staff_info_b

131だけ適応できた。

飛ばされた130を適応させたい場合はファイル名を元に戻し

`$ oil r migrate`
Already on the latest migration for app:default.

上記だと130が実行されなかったので以下のようにする。

`$ oil r migrate:current`
Newly installed migrations for app:default:
- 0130_create_staff_info_a

130も適応できた。

ほかにいいやり方あるのかなー
Android2.1でmockwebserverを使う


squareのokhttpのサブプロジェクトmockwebserverは、簡単な記述でローカル環境にモックhttpサーバーを立ち上げられるので、通信モジュールの単体テストには大変便利です。

https://github.com/square/okhttp/tree/master/mockwebserver

ただし、特に記述は見つかりませんでしたが、Android2.1では動作しません。

私が遭遇した主な問題は、次の２点

- webmockserver及び依存モジュールのokioで、初期のAndroidには搭載されていなかったJava1.6系由来のAPIを使用しているため、ランライムの例外に落ちる。
- サーバーソケットクローズにまつわるバグ（https://code.google.com/p/android/issues/detail?id=6144）

これらのAPIを使っている箇所を置き換えたり、バグの回避コードを書いてあげることで、Android2.1でも使うことができそうです。


2015年現在そんな辛い開発をするひとは他にいないとは思いますが、以下対策版の導入手順のメモ書きです。

# mockwebserverのビルド

githubにコミットしておいたのでこちらを使います。

https://github.com/gamako/okhttp

```bash
% git clone git@github.com:gamako/okhttp.git -b android2.1-workaround
```

mvnコマンドでビルドしてjarを作ります。

```bash
% mvn package -pl mockwebserver
```

mockwebserver/targetディレクトリにjarファイルができているはずです。

# okioのビルド

こちらもgithubにコミットしておいたので、こちらを使います。

https://github.com/gamako/okio

```bash
% git clone git@github.com:gamako/okio.git -b android2.1-workaround
```

mvnコマンドでビルドしてjarを作ります。

```bash
% mvn package -pl okio
```

targetディレクトリにjarファイルができているはずです。

# プロジェクトに追加

targetディレクトリにできたjarファイルをlibsに置いて、gradleには依存関係を記述します。
okhttpを必要とするので、こちらはmavenから持ってくるようにします。
また、okhttpはokioを自動で取得してくるため、自前のjarとバッティングします。exclude指定しておきましょう。

```
dependencies {
    compile fileTree(dir: 'libs', include: '*.jar')
    androidTestCompile ('com.squareup.okhttp:okhttp:2.4.0') {
        exclude module: 'okio'
    }
}

```

こちらからは以上です。
TypeScriptでオブジェクトリテラルの型を即時的に定義する

普通に[Specification.pdf](http://www.typescriptlang.org/Content/TypeScript%20Language%20Specification.pdf)に書いてあったけど知らんかった

```ts
function show(params:{name:string, age:number}){
    console.log(params.name)
    console.log(params.age)

    // console.log(params.address)
    // => コンパイルエラー:Property 'address' does not exist on type '{ name: string; age: number; }'.
}
```
[awk] 複数ファイルへの出力

awkで複数のファイルへデータを出力する方法です。

# 入力データ例

```
$ cat test1.txt
1
2
3
4
5
```

# リダイレクト演算子で出力するファイルを指定

データが偶数の場合はtest2.txtに、奇数の場合はtest3.txtに出力されるようにしています。

```
awk '{
    if (($1%2) == 0) print $1 > "test2.txt";
    else print $1 > "test3.txt";
}' test1.txt
```

# 結果の確認

```
$ cat test2.txt
2
4
```

```
$ cat test3.txt
1
3
5
```
[Android] Use custom keystore for debug apk

### Custom build rules

[Stackoverflow Link](http://stackoverflow.com/a/10747511)

```xml
<property name="build.is.signing.debug" value="false"/>
<target name="-do-debug" depends="-set-debug-mode, -debug-obfuscation-check, -package, -post-package">
    <!-- only create apk if *not* a library project -->
    <do-only-if-not-library elseText="Library project: do not create apk..." >
        <sequential>
            <property name="out.unaligned.file" location="${out.absolute.dir}/${ant.project.name}-debug-unaligned.apk" />

            <!-- Signs the APK -->
            <echo>Signing final apk...</echo>
            <signjar
                    jar="${out.packaged.file}"
                    signedjar="${out.unaligned.file}"
                    keystore="${key.store}"
                    storepass="${key.store.password}"
                    alias="${key.alias}"
                    keypass="${key.alias.password}"
                    verbose="${verbose}" />

            <!-- Zip aligns the APK -->
            <zipalign-helper
                    in.package="${out.unaligned.file}"
                    out.package="${out.final.file}" />
            <echo>Debug Package: ${out.final.file}</echo>
        </sequential>
    </do-only-if-not-library>
    <record-build-info />
</target>
<import file="${sdk.dir}/tools/ant/build.xml" />
```

### Check which keystone is using

[Stackoverflow](http://stackoverflow.com/a/11331951)

Unzip the apk file, in the META_INF folder, there is a RSA file. Use the keytool to print the md5 of the apk keystore.

Print the md5 of apk keystore.

```
keytool -printcert -file ANDROID_.RSA
```

Print the keystore md5.

```
keytool -list -keystore my-signing-key.keystore
```

*One more ways*

```
jarsigner -verify -verbose -keystore some.keystore some.apk
```

If all the lines start with `smk`, then ok.
Something like `sm` is not ok.
rbenv アップデート

#rbenv アップデート

Rubyバージョンアップしたときの
自分用のメモです。

```
$ cd ~/.rbenv
$ git pull origin master
$ cd plugins/ruby-build
$ git pull origin matesr
$ rbenv install [新しいバージョン]

```

アプリに適用させたいときは
app_root/.ruby-version
というファイルを用意し、バージョン名のみを記載する

##確認方法

###Rubyの確認
```
$ rbenv version
```

###rbenvの確認
```
$ rbenv --version
```

確認するときに間違えたのでメモ…。

で、最後にgem install bundlerでbundlerをインストール。
(バージョンアップで再インストールしないといけないってことかに)

rbenv：Rubyが複数バージョン入ったときに切り替えてくれる子。
bundler：Gemfileとか使ってやんごとなき感じにしてくれるいい子。
RubyでSSHトンネル経由でサーバにアクセスする

[net-ssh-gateway](https://rubygems.org/gems/net-ssh-gateway/versions/1.2.0)を使うと簡単にできる。

例えば `gateway.host` を経由して `database.host` 上で動くMySQLにアクセスするには以下のように書けばいい。

```rb
require 'rubygems'
require 'net/ssh/gateway'
require 'mysql2'

# gateway.host  : 踏み台サーバ。1111ポートでSSHできるとする
# database.host : データベースサーバ。アクセスするには踏み台を経由する必要がある

gateway = Net::SSH::Gateway.new(
  'gateway.host',
  'username',
  port: 1111,
  keys: ['~/.ssh/ssh-key']
)

gateway.open('database.host', 3306) do |local_port|

  client = Mysql2::Client.new(
    # 127.0.0.1:local_port に
    # gatewa.host:1111->database.host:3306 というトンネルが作られている
    host: '127.0.0.1',
    port: local_port,

    username: 'username',
    password: 'password',
    database: 'database'
  )

  client.query('SHOW TABLES;').each do |row|
    p row
  end
end
```
【メモ】演算子「 ||= 」

``` a ||= 1         # a が偽か未定義ならば1を代入。初期化時のイディオムの一種。 ```
[参考ページ](http://docs.ruby-lang.org/ja/1.9.3/doc/spec=2foperator.html)

```ids = [] if ids.blank? ```
▼
``` ids ||= [] ```
Docker Trusted Registry を EC2(t2.micro)で立ち上げたよ

Docker Trusted Registry
-----------------------

DOCKERCONでDocker Trusted Registryが[発表](https://www.docker.com/docker-news-and-press/06.23.2015_Docker-Announces-General-Availability-of-Comprehensive-Commercial-Solutions)され、30 days Trialライセンスが利用可能な状態になっていたので、試してみました

概要とか解説は誰かがやってくれると思うので、EC2 t2.micro インスタンス上に Docker Private Registry を立ち上げ、ストレージにS3を使ってみる構成です

※AWS marketplaceにAMIがありますが、ap-northeast-1 にはサーブされていない！という悲しい背景が、このエントリーの背景です

準備
----

1. [Docker Hub](https://hub.docker.com/account/signup/)にサインアップ (アカウント持ちはskip)
2. https://hub-beta.docker.com/enterprise/ から Trial の Get Started を選ぶ
3. Agreementやフォームが出るので埋めてください
4. DTR Trial ライセンス をどのアカウントに発行するか選ぶプルダウンが出る場合がありますが、選んでください
5. https://hub-beta.docker.com/account/licenses/ のページから deb または rpm セットアップ用bashスクリプトをダウンロード (右上の deb / rpm ってやつ *1)
6. 同ページから DTR Trial Plan ライセンスファイルをダウンロード (雲マークをクリック *1)

以上で準備は完了です

*1 Chromeでダウンロードしようとすると、ポップアップブロックに阻まれたり、ダウンロードできてもファイル名が「ダウンロード」とかダサい感じですが、リネームしてください

EC2
---

* Ubuntu HVMなAMIを基に、EC2 インスタンスを立ち上げ。試すならt2.microで十分です
* 準備5でダウンロードしたdebセットアップ用bashスクリプトをEC2インスタンスへ scp等で転送 (docker-cs-engine-deb.sh とします)

手順は https://docs.docker.com/docker-hub-enterprise/install/ の通りです
（ドキュメントにはDHEってなってますが、DTRと読み替えてください）

要するに、CS版Dockerをインストール → DTRをインストールします

以下、インスタンスでのsshコンソール

```
$ sudo apt-get update && sudo apt-get -y upgrade
$ sudo apt-get install -y linux-image-extra-virtual
$ sudo reboot
$ sudo docker-cs-engine-deb.sh
$ sudo apt-get install docker-engine-cs
$ sudo service docker start
$ sudo bash -c "$(sudo docker run dockerhubenterprise/manager install)"
```

これで https://ec2-*-*-*-*.ap-northeast-1.compute.amazonaws.com でアクセスできるようになります

ライセンスは管理画面から埋めてください

S3化
----

DTRのイメージ保存先をS3に変えてみます (標準は filesystem:/local)

### 準備 ###

1. DTRを動かすEC2インスタンスに、S3 FullAccessロールを割り当て
2. S3上にBucketを作成 (dtr-bucketとします)


### 作業 ###

Settings内"Storage"タブを開き、YAMLの一部を下記の通り書き換えます

```
...
storage:
  filesystem:
    rootdirectory: /local
...
```

↓↓↓

```
...
storage:
  s3:
    region: ap-northeast-1
    bucket: dtr-bucket
...
```

以上を行って "Save and Restart DTR Server" で完了です

#### S3 アクセスロール ####

EC2インスタンスに S3 FullAccessロールを割り当て無い場合は、追加パラメータで `accesskey` `secretkey` を書く必要があります

```
storage:
  s3:
    accesskey: HOGEHOGE
    secretkey: FUGAFUGA
    region: ap-northeast-1
    bucket: dtr-bucket
```

その他のパラメータは https://github.com/docker/distribution/blob/master/docs/storage-drivers/s3.md をご覧くだされ


docker login
------------

SSLサーバ証明書を適切に割り当て or `--insecure-registry`を指定したら、運用開始です

ユーザを登録してあれば `docker login` でログインも出来ます

```
$ docker login ec2-*-*-*-*.ap-northeast-1.compute.amazonaws.com
```

あとがき
--------

これで 150 USD/month なら安いもんだぜ！ (EC2はのぞく
ffmpeg 動画や音声の時間を取得する

#ffprobeを使う

もっとも簡単な方法は、下記のようにすることです。
````
ffprobe hoge.mp4
````


表示される結果に、下記のような情報が入っています。

````
Duration: 00:00:10.12
````

Copyrightとか、不要な情報を表示させたくない場合、**-hide_banner**オプションを使うとよいでしょう。それでもファイルのinput情報等は表示されてしまいますが。

````
ffprobe -hide_banner hoge.mp4
````

##-show_entries オプションを使う
下記のように使います。

````
ffprobe hoge.mp4  -hide_banner -show_entries format=duration
````

##結果

````
・・・いろいろな情報が表示される・・・
[FORMAT]
duration=10.1245
[/FORMAT]
````

こんなふうに[FORMAT]タグに囲まれて表示されます。
また、こちらのほうがより細かい時間(小数点第3位以下)を取得することができます。
これなら出力結果をちょっと整形すれば、簡単に取得できそうです。


また、下記のようにすると、**-show_entries**で取得できる他の情報を表示できます。

````
ffprobe hoge.mp4 -hide_banner -show_entries format
````

結果

````
[FORMAT]
filename=.\hoge.mp4
nb_streams=1
nb_programs=0
format_name=mov,mp4,m4a,3gp,3g2,mj2
format_long_name=QuickTime / MOV
start_time=0.000000
duration=10.1245
size=7979232
bit_rate=1201329
probe_score=100
TAG:major_brand=isom
TAG:minor_version=512
TAG:compatible_brands=isomiso2avc1mp41
TAG:encoder=Lavf55.0.100
[/FORMAT]
````
atomでキーマクロ

#[atom.io](http://www.atom.io)でキーマクロを設定する方法。

たとえば、

* キーストローク1回でカーソルを3行上げたいとか
* キーストローク1回でカーソルを3行下げたいとか
* キーストローク1回でカーソルを右下に移動させたい
* なんとかかんとか

みたいな時です。

触るべきファイルは**２つ**あります。

* ~/.atom/init.cson
   処理内容を記述します。

* ~/.atom/keymap.cson
  処理とキー入力を結びつけます。   

# 設定例

```coffeescript:~/.atom/init.cson
#このファイルにマクロ関数?を定義します。

# カーソルを3行上に移動
atom.commands.add 'atom-text-editor', 'custom:move-up', ->
  editor = atom.workspace.getActiveTextEditor()
  editor.moveUp(3)

# カーソルを3行下に移動
atom.commands.add 'atom-text-editor', 'custom:move-down', ->
  editor = atom.workspace.getActiveTextEditor()
  editor.moveDown(3)

# カーソルを右下に移動
atom.commands.add 'atom-text-editor', 'custom:move-rightdown', ->
  editor = atom.workspace.getActiveTextEditor()
  editor.moveDown(1)
  editor.moveRight(1)

# なんとかかんとか

```

```coffeescript:~/.atom/keymap.cson
#このファイルでキーストロークとマクロ関数?を結びつけます。

# ctrl+pで3行上に移動。
# ctrl+nで3行下に移動。
# ctrl+kで右下に移動。
'atom-text-editor':
  'ctrl-p': 'custom:move-up'
  'ctrl-n': 'custom:move-down'
  'ctrl-k': 'custom:move-rightdown'

# なんとかかんとか

```

# アンチパターン

やっちゃダメな例です。

```coffeescript:~/.atom/keymap.cson
# この例はダメな例です。

# 同じセクション？は上書きされてしまうので１つにまとめないといけない。

# ctrl+pで3行上に移動。
# ctrl+nで3行下に移動。
'atom-text-editor':
  'ctrl-p': 'custom:move-up'
  'ctrl-n': 'custom:move-down'

# ctrl+kで右下に移動。
'atom-text-editor':
  'ctrl-k': 'custom:move-rightdown'

# この例では、ctrl-k だけが有効になり、 ctrl-p と ctrl-n は無かったことになってしまいます。

# この例はダメな例です。

```

# 参考
https://atom.io/docs
【簡単設定】【初心者向け】git関連でタイポする人に見て欲しいaliasの設定


## メリット
 - git pullやらgit checkoutやらで発生するタイポ数削減(めちゃくちゃタイポするので。。。)

 - git周りの手間を効率化出来る(単純にタイプ数減る)

 - 自動化の設定までは出来ない人でも導入出来る(小さな一歩から始めたい)

 - 特別なシェルを入れる必要なし

## デメリット
 - 慣れるまで大変

## 環境
 - Mac 10.9.5
 - shell bash
 
## 手順
### 1.ターミナルを開いてvi ~/.bash_profileを実行し、開いた「bash_profile」に以下をコピペ


````

# ----------------------
# Git Aliases
# ----------------------
alias ga='git add'
alias gaa='git add .'
alias gaaa='git add -A'
alias gb='git branch'
alias gbd='git branch -d '
alias gc='git commit'
alias gcm='git commit -m'
alias gco='git checkout'
alias gcob='git checkout -b'
alias gcom='git checkout master'
alias gd='git diff'
alias gda='git diff HEAD'
alias gi='git init'
alias gl='git log'
alias glg='git log --graph --oneline --decorate --all'
alias gld='git log --pretty=format:"%h %ad %s" --date=short --all'
alias gm='git merge --no-ff'
alias gp='git pull origin'
alias gpo='git push origin'
alias gss='git status -s'
alias gst='git stash'
alias gstl='git stash list'
alias gstp='git stash pop'
alias gstd='git stash drop'
 
# ----------------------
# Git Function
# ----------------------
# Git log find by commit message
function glf() { git log --all --grep="$1"; }

````

*基本的に外部リポジトリはoriginのためpushやpullは
originを指定。
適宜、変更する必要がある方はorigin部分を外すことをオススメします。

### 2.設定反映のためターミナルを再起動


最近、gitを始めた人向けなので以降は自分流にカスタマイズしていくことでより効率化出来ると思います。
CakePHP3のViewCellの使い方

#CakePHP3のViewCellの使い方

CakePHP3からViewCellというものが追加されています。

http://book.cakephp.org/3.0/en/views/cells.html

まぁ、端的にいえばController付きのElementだと思っておけば大体あってます。

##使い方(準備)
src/View/Cell/HogeCell.php

```php
<?php
namespace App\View\Cell;

use Cake\View\Cell;

class HogeCell extends Cell
{
    public function display($hoge1, $hoge2)
    {
        //ここにロジックを書く
        //Controllerと同じようにViewに渡したい値は$this->setでsetする。
        $hoge = $hoge1 . $hoge2;
        $this->set('hoge', $hoge);
    }
}
```

src/Template/Cell/Hoge/display.ctp

```php
<?php //Cellでsetした値をここでセットする ?>
<?= $this->Html->link($hoge ,['controller' => 'hoges', 'action' => 'fuga']);?>
```

##呼び出し方
任意のTemplate

```php
<?= $this->cell('Hoge', ['hoge1' => 'hoge1', 'hoge2' => 'hoge2')->render();?>
```

##まとめ
requestActionのような使い方ができるので便利！

(まぁ乱用するものじゃないと思いますが・・・)
AngularJS で動的にDOM上に追加したディレクティブをパースさせる方法

以下のようにする。

```javascript:
$compile(el.contents())($scope)
```

利用例

```html:html
<div ng-controller="asyncDirectiveCtrl as ctrl">
    <button ng-click="ctrl.get1()">失敗</button>
    <button ng-click="ctrl.get2()">成功</button>
    <div class="asyncDirectiveResult"></div>
</div>
```

```javascript:javascript
angular.module('demo', []).
    controller('asyncDirectiveCtrl', function($compile, $scope){
        this.get1 = function(){
            return angular.element('.asyncDirectiveResult').html('<hello>Taro</hello>')
        }
        this.get2 = function(){
            var el = this.get1();
            $compile(el.contents())($scope);
        }
    }).
    directive('hello', function($compile){
        return {
            link: function(scope, el, attr){
                el.html('Hello ' + el.text() + ' !')
            }
        }
    })
;
```

非同期で取得したコンテンツ（markupやmarkdown）内にディレクティブの記述があった場合に有効
非推奨になった sizeWithFont:constrainedToSize:lineBreakMode を置き換える


最大行数が指定された UILabel の実際の高さを求めたい時などに `sizeWithFont:constrainedToSize:lineBreakMode` が便利でしたが、非推奨になりました。
置き換え方法を考えていたところ [stackoverflow](sizeWithFont:constrainedToSize:lineBreakMode) にサンプルが示されていたのでメモ


## Before

```
NSString *text = @"あのイーハトーヴォのすきとおった風";
CGSize size = [text sizeWithFont:[UIFont systemFontOfSize:14.0f]
               constrainedToSize:CGSizeMake(200.0f, 36.0f)
                   lineBreakMode:NSLineBreakByTruncatingTail];
```


## After

```
NSString *text = @"あのイーハトーヴォのすきとおった風";
CGSize size = [text boundingRectWithSize:CGSizeMake(200.0f, 36.0f)
                                 options:NSStringDrawingUsesLineFragmentOrigin
                              attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:14.0f]}
                                 context:nil].size;
```

`boundingRectWithSize:options:attributes:context:` で CGRect を求めてから CGSize を抽出すればいいんですね。

# 注意点

`boundingRectWithSize:options:attributes:context:` は iOS7 以上が必要。なのでそれよりも古い環境もサポートするには条件分岐して併記する必要あり。
開発用HTTPプロキシを簡単に立てる裏技


/etc/hosts を書き換えなくても気軽に特定のサーバに通信できるプロキシが欲しいと思ったんですが、意外にちょうど良いのがなかったので自作しました。

<追記>
proxy.pac で十分ではという意見をブコメでいただいたんですが、やりたいのは「本番系リバースプロキシやロードバランサを通さずに特定のサーバだけに**任意のタイミング**でアクセスする手段」を、システムファイル書き換えを伴わずに行う方法なので今回のコンセプトとは少しばかり違うのです・・・。
</追記>

## るびまに Webrick でプロキシサーバの記事がある

http://magazine.rubyist.net/?0002-WEBrickProxy


```
 #!/usr/bin/env ruby

 require 'webrick'
 require 'webrick/httpproxy'

 # プロキシサーバオブジェクトを作る
 s = WEBrick::HTTPProxyServer.new({})

 # SIGINT を捕捉する。
 Signal.trap('INT') do
   # 捕捉した場合、シャットダウンする。
   s.shutdown
 end

 # サーバを起動する。
 s.start
```

こんな風にかけるんだよと。

## とりあえず構造を理解する

https://www.omniref.com/ruby/2.1.5/symbols/WEBrick::HTTPProxyServer?d=268114682&n=56#line=90

service メソッドが本体のようだ。

HTTP通信要求が発生したとき、CONNECTの場合はdo_CONNECTメソッドに、それ以外は proxy_service メソッドに振られる。引数は (req, res) になっている。

do_CONNECT では req.unparsed_uri を元に接続を確立してる。そうでないやつらは req.host を使って http モジュールに委譲しているようだ。

ここまで分かれば大丈夫。

## example.com への通信をすべてAWS(ELB)へ向けるプロキシを作る

まあイメージ的には example.com は本当はどっかでちゃんと動いているんだけど、開発用にAWSに立てたどこぞのロードバランサに向けたいと思いねぇ。

http://d.hatena.ne.jp/miau/20090519/1242745688

これを参考にカスタマイズさせていただいた。

```
require 'webrick'
require 'webrick/httpproxy'

UPSTREAM='fugafuga-example-no-1-1111.ap-northeast-1.elb.amazonaws.com'

def rewrite_url(uri)
  uri.sub!(/^.+example\.com/, UPSTREAM)
end

class ProxyServer < WEBrick::HTTPProxyServer

  # HTTP の場合はここで書き換え
  def proxy_service(req, res)
    print "proxy_service: #{req.host} -> "
    rewrite_url(req.host)
    puts req.host

    super
  end

  # CONNECT の場合はここで書き換え (HTTPSの確立のタイミングなど)
  def do_CONNECT(req, res)
    print "proxy_connect: #{req.unparsed_uri} -> "
    rewrite_url(req.unparsed_uri)
    puts req.unparsed_uri

    # プロキシのメイン処理
    super
  end
end


config = { :BindAddress => '0.0.0.0', :Port => 8080, :Logger => WEBrick::Log::new(nil, WEBrick::Log::WARN), }
s = ProxyServer.new( config )
Signal.trap('INT') do
  s.shutdown
end

s.start
```

でけた。

## Firefoxの FoxyProxy などと併用することでむやみに便利になる

![スクリーンショット 2015-06-24 13.19.09.png](https://qiita-image-store.s3.amazonaws.com/0/17911/7fe35946-ff5a-f21b-85dd-93d3a5a83f6d.png "スクリーンショット 2015-06-24 13.19.09.png")

もちろん、開発機へ繋いでいるのかどうか分からなくなる危険性が常にあります。

## まとめ

接続先を書き換えられるプロキシって意外に手軽なのがないもんですね。

今回はややこしいことはしてないですが、ロギングやパフォーマンスの測定、アクセス制御など簡単に書けます。

標準的な ruby のライブラリで動作するので、必要なときにさっと自分で設置するような使い方ができるので重宝しそうです。
僕が心の中でやっているMV*パターン分類方法

クライアントサイドの設計パターンには、MVCの派生の MVP 、MVVM の名前をよく聞きますね。

いろいろな実装が、どのパターンにあたるか分類することは、意外と微妙で、明確にすることにはあまり意味がなく不毛という話も聞きます。たしかに、々なGUIプログラミング環境を見ていくと、実装上の制限や事情の違いがあり、比較するのは無理があるかもしれません。

個人的な考えでは、MV* な設計パターンは、とくに難しい話ではないと思います。元々は.NET方面で MVC → MVP → MVVM の順に時系列に進化したものだったと思いますが、意外と他の環境でも同じ言葉を当てはめて有用だったからややこしいのかなと思います。

それぞれ、中心とする要素が違っているので、それに注目していくと意義とかが見えてきます。

### MVC

MVCの中心は Model。Model を直接、Viewが監視する。

古典的なMVC は、View が Model の 直接のオブザーバになります。Controller は入力を受けつけるのが役割です。つまり、Controller のコントロールの主語は ユーザなんですね。ユーザ視点での、アプリケーション全体のインターフェイスみたいな意味合いというわけです。テレビとかエアコンでいうところのリモコン

現在では、狭義の意味でのMVCはほぼ見られないと思います。

### MVP

MVPの中心は Presenter。 MとVの間をとりもつ。

Modelが変更されたら自動でViewが変更されるというのは理屈はきれいですが、現実にはViewはたくさんのパーツの集まりだし、ViewとModelのバインディングが複雑だったり、そもそもドメインロジックに非同期処理などが絡んでくると、Modelの変更タイミングとViewの変更タイミングの制御が煩雑になったりりします。

そこで、ModelとViewの間に立つ人を立てたのがMVPです。P はPresenterで、間に立つ人です。
割とふつうです。iOS には 標準でViewControllerというものがありますが、あれはほとんどPresenterだと思います。

### MVVM

MVVMの中心は ViewModel です。

ViewModel は、UIの状態をすべて表現できる構造体です。これを操作することが、MVVMでアプリケーションを書く作業の心臓部です。

なんでそんな構造体を間に介して冗長にならないかというと、データバインディングが前提になっているからです。

MVVMは、データがViewでどう表現されるか宣言的に記述できる方法がないと普通はそう呼ばれません。
だから、js界隈とかで、独自HTMLテンプレにDSLを埋める=MVVM とか呼ばれたりしています。
リアクティブプログラミングとかの仕組みも、宣言的にバインディングが書けるのでMVVMみたいな設計にしやすいです。

そんなかんじです。
Windows + Vagrant + Ubuntu 14.04

Capistrano とか Fabric とかを気軽に試したくて Vagrant を使ってみることにした。

# VirtualBox をインストールする

以下ページから該当ファイルをダウンロードしインストールする。

https://www.virtualbox.org/wiki/Downloads

# Vagrant をインストールする

以下ページからダウンロードしインストールする。

https://www.vagrantup.com/

# 仮想サーバを立ち上げる

## box を追加する

Ubuntu 14.04 の box を追加するには以下のようにする

```
$ vagrant box add ubuntu14.04 https://cloud-images.ubuntu.com/vagrant/trusty/current/trusty-server-cloudimg-amd64-vagrant-disk1.box
```

参考
http://blog.kondoyoshiyuki.com/2014/06/12/windows7-vagrant-ubuntu14-04/

## ディレクトリを作成する

```
$ mkdir -p ~/Vagrant/sample
```

## 設定ファイルのひな形を作成する

```
$ cd ~/Vagrant/sample
$ vagrant init
```

このようにするとディレクトリ内に Vagrantfile というファイルが作成されます。

さきほど追加した Ubuntu を利用するように設定ファイルを編集します。

```
  config.vm.box = "ubuntu14.04"
  config.vm.network "private_network", ip: "192.168.50.12" ←これは断念した
```

※ホストオンリーネットワークを使おうと思ったら管理者権限が必要で断念した。。

## 仮想サーバを立ち上げる

```
# vagrant up
```

でサーバが起動します。すごく簡単。

## 仮想サーバにログインする

```
$ vagrant ssh
```

このコマンドでログインできました。

```
Welcome to Ubuntu 14.04.2 LTS (GNU/Linux 3.13.0-55-generic x86_64)

 * Documentation:  https://help.ubuntu.com/

  System information as of Wed Jun 24 03:37:33 UTC 2015

  System load:  0.92              Processes:           79
  Usage of /:   3.3% of 39.34GB   Users logged in:     0
  Memory usage: 29%               IP address for eth0: 10.0.2.15
  Swap usage:   0%

  Graph this data and manage this system at:
    https://landscape.canonical.com/

  Get cloud support with Ubuntu Advantage Cloud Guest:
    http://www.ubuntu.com/business/services/cloud

0 packages can be updated.
0 updates are security updates.


vagrant@vagrant-ubuntu-trusty-64:~$
```
goでwindowsでmidi再生

## midiを再生したかったんで作った。

## インストール
  go get github.com/ohisama/mci

## サンプルコード

```
package main
import (
	"github.com/ohisama/mci"
	"fmt"
)
func main() {
	var cmd string
	cmd = "open test.mid"
	mci.Send(cmd)
	cmd = "play test.mid notify"
	mci.Send(cmd)
	var input string
	fmt.Scanln(&input)
}
```
Hugoにおける記事要約の仕組み

Hugoでは、１つの記事を「要約」部分と「続き」の部分に分割して、「もっと読む(READ More)」リンクを押すことで続きが読める機能があります。

これは"Summary"機能と呼ばれています。

# デフォルトでは"70 words"で自動分割してくれる (そう、英語ならね..)

Hugoのデフォルトでは単語数70を境に自動分割してくれます。
しかしやってみたところこれは英単語ベースのカウントで、日本語の文章だとダメでした。ぐぬぬ。

# 手動で分割する方法

記事中に`<!--more-->`という文字を入れるとそこが境界になります。

例えばmarkdownファイルでこのように書くと、

```md
むかしむかし、あるところに、おじいさんとおばあさんが住んでいました。

<!--more-->

おじいさんは山へしばかりに、おばあさんは川へせんたくに行きました。 おばあさんが川でせんたくをしていると、ドンブラコ、ドンブラコと、大きな桃が流れてきました。
```

`<!--more-->`より前が要約、後ろが続き、として認識してくれます。




# 出典
http://gohugo.io/content/summaries/
エラー制御演算子@ の正しい認識

これは秀逸！ 

@式を使うと、エラーがあっても問題を認知できないからダメ…ではない。
それはエラーを制御してるから当然で、そういう昨日を前提として正しい使い方をすれば良い


エラー制御演算子が悪くない。正しく理解して使っていないことの問題
http://d.hatena.ne.jp/noopable/20090726/1248589117

一般的なエラー制御演算子の解釈と、注意点
http://sotarok.hatenablog.com/entry/20090721/1248112106
リアルタイムでログを複数条件grepする (tailfを複数grep的な？)

こんにちわ。

皆さん、リアルタイムでログを見てる時、何か条件で結果を絞りたい場合どうしますか？

多分こうすると思います。

```bash
tail -f hoge.log | grep "test"
```

これで `test` で絞ったログがダダダダダーってリアルタイムで見れる事が出来ます。

じゃあ、 `test` で絞りたいんだけど、`png` の画像データへのログは無視したい場合、どうしますか？

```bash
tail -f hoge.log | grep "test" | grep -v ".png"
```

僕はこうしてみました。
が、結果は・・・

暫く経過して表示されました・・・・

**リアルタイムじゃない！！**

#### 原因

これは、grepが勝手に結果をバッファしてしまっている為に、暫く経ってから出力されるのでした。。

#### 結論

ここまで引っ張って・・という感じもありますが、じゃあどうすれば複数の検索結果をリアルタイムで出せるのかという話ですが、、、

結論、grepにバッファさせなければOKです。
grepに `--line-buffered` というオプションがありますのでこれを使います。

正解としては、下記のようにすればリアルタイムで確認刷ることが出来るようになります。
めでたしめでたし。

```bash
tail -f hoge.log | grep --line-buffered "test" | grep -v --line-buffered ".png"
```
AWS LambdaとTwilioで電話をならしてメッセージを流してみる

SNSからLambda経由でtwilioを利用して電話するのを試してみた。
これでSNS通知で電話をかけるということができるようになった。

# 試した環境

以下のようにSNSを実行するとLambdaでTwilioを利用して電話しメッセージを流すようにした。

1. SNS実行
2. Lambda呼び出される
 1. S3にTwilioメッセージ用のSNSメッセージのタイトルを含むXML配置
 2. Twilio APIを呼び出して電話かける

* S3のエラーに関わらず電話をかけているがS3配置に失敗したら定型メッセージとかにした方がよさそう。
* S3使わずに以下の記事にあるように[Twimletsのecho](https://www.twilio.com/labs/twimlets/echo)使う方がインフラ用意しなくていいのでいいかも。
 * [[Twilio]Twilioを簡単に使用するためのツール#11[Twimlets] ｜ Developers.IO](http://dev.classmethod.jp/etc/twim11/)

# やったこと

* twilioモジュールインストール

```bash
$ npm install twilio
```

* index.js作成

```js
// Twilio Credentials 
var accountSid = '[account sid]'; 
var authToken = '[auth token]'; 
 
//require the Twilio module and create a REST client 
var client = require('twilio')(accountSid, authToken); 
var AWS = require('aws-sdk')
var S3Bucket = '[S3 バケット名]'
var XMLKey = 'voice.xml'

exports.handler = function(event, context) {
  var s3 = new AWS.S3({region: '[s3 リージョン]'});
  var params = {
    Bucket: S3Bucket,
    Key: XMLKey,
    ACL: 'public-read',
    ContentType: 'text/xml',
    Body: '<?xml version="1.0" encoding="UTF-8"?>\n' +
          '<Response>\n' +
          '<Say voice="alice" language="ja-JP">' +
          event.Records[0].Sns.Subject +
          '</Say>\n' +
          '</Response>'
  }
  s3.putObject(params, function(err, data) {
    if (err) console.log(err, err.stack);
    else console.log(data);
  });  

  client.calls.create({  
    from: "[twilio電話番号]",   
    to: "[掛け先電話番号]",
    method: "GET", 
    url: "https://s3.amazonaws.com/" + S3Bucket + "/" + XMLKey 
  }, function(err, call) { 
    console.log(call.sid); 
  });  
}   
```

* zipにまとめる

```bash
$ zip -r twilio.zip index.js node_modules/
```

* lambdaにzipを上げる
 * lambdaで利用するロールにはS3バケットの権限をつけておく
* SNSトピックを作成してサブスクリプションにlambdaを指定する
* SNSトピックをPublishしてタイトルを指定しておくと、電話でタイトルの内容を流してくれる

# 参照サイト

* [初めてのJavaScript、初めてのAWS Lambda ｜ Developers.IO](http://dev.classmethod.jp/cloud/aws/1st-javascript-1st-lambda/)
* [アラート発生時に AWS Lambda を使って音声電話をかける - Qiita](http://qiita.com/u-minor/items/3eb01783b818273080c2)
* [TwilioとRubyで電話でメッセージを流してみる - Qiita](http://qiita.com/mechamogera/items/b952912e9859e91dac0a)
bundle installでnokogiriがビルドエラーになったら

```
-----
libxml2 is missing.  Please locate mkmf.log to investigate how it is failing.
-----
```

とlibxml2が無いと怒られる。[stackoverflowの投稿](http://stackoverflow.com/questions/23668684/issue-installing-nokogiri-in-bundle-install)を参考に、以下のようにしてオプションを指定して解決した。(MacPortsの場合)

```
bundle config build.nokogiri '--with-opt-dir=/opt/local'
```
Joomlaでmetaタグを設定する


`JDocument::setMetaData()` を使います。

```php
/**
 * Sets or alters a meta tag.
 *
 * @param   string   $name        Value of name or http-equiv tag
 * @param   string   $content     Value of the content tag
 * @param   boolean  $http_equiv  META type "http-equiv" defaults to null
 *
 * @return  JDocument instance of $this to allow chaining
 *
 * @since   11.1
 */
public function setMetaData($name, $content, $http_equiv = false)
```

使用例

```php
// 5秒後に $url へジャンプ
$doc = JFactory::getDocument();
$doc->setMetaData('refresh', '5;URL=' . $url, true);
```
mfaデバイスの同期をcliでする

GUIだといまいちでCUIだといける説をきいたので備忘録。

くわしくはこちら。
http://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/MFA_Sync.html
http://docs.aws.amazon.com/cli/latest/reference/iam/resync-mfa-device.html

```
aws iam help
aws iam resync-mfa-device help
profile=""
user=""
serial=""
authcode1=""
authcode2=""
aws iam resync-mfa-device --profile ${profile} --user-name ${user} \
 --serial-number ${serial} --authentication-code-1 ${authcode1} \
 --authentication-code-2 ${authcode2} 
```

実際GUIで何回やってもとおらないところをCLIだと一発と。
Postfixで送信メールのログを取得する


# 経緯
送信メールのログを残したいという依頼を受けたので、試行錯誤した結果、Postfixで送信メールを中継することになった。

# 環境
* OS:Ubuntu Server 14.04 LTS
* postfix 2.11

# インストール
以下のコマンドでインストールできる。
ただし、デフォルトでインストールされているexim4が削除されるので、問題ないことを確認すること。
```
sudo apt-get install postfix
```

インストール中にpostfixの設定を行うために、いくつか質問に答えなくてはいけない。
今回は以下のように答えた。
1. サテライトシステム(スマートホスト)
2. hostname.domainname
3. 中継先のSMTPサーバのFQDN:ポート番号

無事にインストールが終了したら、コマンドでメールを送信して、届くことを確認する。
```
echo 'Hello.' | sendmail -f fromuser@example.domain touser@example.domain
```

# 設定
デフォルトではローカルホストしか送信できない。`/etc/postfix/main.cf`を編集して、受信するネットワークのIPアドレスを設定する。

```postfix:main.cf
#inet_interfaces = loopback-only
inet_interfaces = 1.2.3.4, 127.0.0.1
```

また、メールの送信を許可するネットワークアドレスを追加する。

```postfix:main.cf
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128 192.168.X.X/24 
```

設定後、デーモンを再起動する。

```
sudo service postfix restart
```

# 送信テスト
通常使用しているメーラにSMTPサーバを追加する。ポートは変更していないので、25番。認証は不要。

# ログ設定
[Postfixのドキュメント](http://www.postfix.org/documentation.html)を調べてもログフォーマットのカスタマイズ設定ができないようなので、"Built-in Content Inspection"のデバッグ用アクション"INFO"を使用する。
ログに残したい内容に応じて、フィルターを指定する。
[指定できるフィルター](http://www.postfix.org/header_checks.5.html)は以下の通り
* header_checks
* mime_header_checks
* nested_header_checks
* body_checks
* milter_header_checks
* smtp_header_checks
* smtp_mime_header_checks
* smtp_nested_header_checks
* smtp_body_checks

送信メールに関係するものはsmtpで始まるフィルターだけ。
今回は以下の2つを指定した。

```postfix:main.cf
smtp_header_checks = regexp:/etc/postfix/smtp_header_checks
smtp_mime_header_checks = regexp:/etc/postfix/smtp_mime_header_checks
```

右辺の形式は、"テーブルの種類:テーブルファイル"となっている。
今回は、もっとも簡単なregexpにした。
処理速度を考慮すると別の形式がいいらしい。

以下は、それぞれのテーブルファイル。

```postfix:smtp_header_checks
/^To:(.*)/    INFO    $1
```

```postfix:smtp_mime_header_checks
/^Content-Type:(.*)/    INFO    $1
```

ファイルの内容は、各行に正規表現パターン(/正規表現/)と空白文字を挟んでアクション(INFO)、アクションへの引数となっている。
INFOアクションはパターンにマッチした文字列すべてをログに出力すると思ったが、実際には文字列長に制限があるらしい。
正規表現でマッチしたグループをアクション引数に渡すことで、ログに残したいデータを出力することにした。
指定できるアクションについては[header_checks](http://www.postfix.org/header_checks.5.html )参照

また、マルチバイト文字はデコードされたままログに残るので、ログの加工などはFluentdなどで行う予定。
Crystal : initializeのオーバーロード

# <i class="fa fa-check-square-o"></i> メモ

RubyにないCrystalの特徴のひとつであるメソッドのオーバーロード。

当然，`initialize`メソッドもオーバーロード可能。

普通に `initialize` メソッド内で別形式の `initialize` メソッドを呼べば良いっぽい。

```ruby:someclass.cr

class SomeClass

  def initialize(int_value : Int)
    @value = int_value
  end

  def initialize(string_value : String)
    initialize(string_value.to_i)
  end

end

p SomeClass.new(1)
p SomeClass.new("2")

```

```
$ crystal someclass.cr
#<SomeClass:0x100f34fe0 @value=1>
#<SomeClass:0x100f34fd0 @value=2>
```

これくらいの例だったら，引数の型を指定せずにおいて `initialize` 内で `to_i` すれば良い気もするけれど，Rubyの **IPAddr** が `new` にアドレス表記の文字列と数値の両方を受けられるみたいな例だと，1つの `initialize` の中で処理を条件分岐させるより，それぞれ別の `initialize` に処理を分割したほうがソースがスッキリしそう。

# <i class="fa fa-exclamation-triangle"></i> 注意

まかり間違って同じ形式の `initialize` を呼び出してしまうと，実行時に怒られる（buildは通る）ので注意。

```ruby:someclass2.cr

class SomeClass

  def initialize(int_value : Int)
    @value = int_value
  end

  def initialize(string_value : String)
    initialize(string_value) # <- initialize(String)
  end

end

p SomeClass.new(1)
p SomeClass.new("2")

```
```text:インタプリタ実行
$ crystal someclass2.cr
#<SomeClass:0x109fa4fe0 @value=1>
Program terminated abnormally with error code: 11
```
```text:コンパイル実行
$ crystal build someclass2.cr
$ ./someclass2
#<SomeClass:0x10aa99fe0 @value=1>
Segmentation fault: 11
```
Cocos2d-JS でファイルを読み込む

調べてもネット上にはなかったので備忘録
Cocos2d-JS v3.6.1 で確認
json 以外のファイル（CSVなど）を読み込む

cc.loader を使うと良さそう。
CCBoot.js あたりで実装されている。
下記にテキストを配置されているとする

```
res/hoge.txt
```

これをテキストとして読み込むには loader.loadTxt 関数を使う

```js
var filename = "res/hoge.txt"
cc.loader.loadTxt(filename, function(obj, str) {
  cc.log(str)
})
```

とりあえず上手く動かなかったら CCBoot.js を読めば良さそう
Thunderbird_v38.01でのQuicktext_v0.9.11.5の使用について

#概要
※Thunderbird_v38.01、Quicktext_v0.9.11.5の状況下でQuicktextの情報が初期化される問題の回避策になります。
　動作を保障するものではありません。また、バージョンが変更となった場合の動作は保証しません。
※個人用メモです。起動後に、テンプレートがあることは確認できましたが、動作検証等は行っておりません。

#手順
1.現状のQuicktext情報をエクスポートします。
2.エクスポートしたxmlファイルをテキストエディター(メモ帳不可)で開き、名前をつけて保存を実行します。保存時に、[BOM]に有効にします。
3. Thunderbirdで再度Quicktextｆ画面に戻り、先ほどエクスポートを行いBOM設定を付与したxmlファイルのフォルダパス(絶対パス)を[起動時にインポート]に入力する。

たぶんこれでThunderbirdを起動しなおしてもテンプレートが読み込める…はず…
高速かつスムーズなページ遷移を実現する pjax 覚書

# ★2018/04/13投稿 → [Barba.jsを使った実装方法を書きました](https://qiita.com/kokushin/items/a9cca2ef52e6e927115d) 

pjaxをざっと触ってみたので、自分用にメモ。
少々癖はあるが、シームレスなページ遷移の実装や、読み込み速度の向上が可能。
まだまだ使いこなせてないので、マスターしたい（切実）

★pjaxについてはこちら → http://falsandtru.github.io/jquery-pjax/

##準備
```html
<script src="//code.jquery.com/jquery-1.11.3.min.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/jquery.pjax/1.9.6/jquery.pjax.js"></script>
```
htmlの`<head>`部分に記述。基本的にpjax.jsは__一度読み込めば動作し続ける__ので、なんども読み込み直す必要はない。
##JavaScript
```js
$(function(){
    $.pjax({
        area : '#content',
        link : 'a:not([target])'
    });
});
```
`area`に書き換えるエリアの範囲を指定、`link`にpjaxを適用させるリンクを設定。
基本的にはこれだけで動作可能。

上記の場合、__「target="blank"以外のaタグをクリックしたら、pjaxでリンク先の#content内の要素を読み込み、書き換える」__という動作になる。

##よく使うオプション
```js
$(function(){
    $.pjax({
        area : '#content',
        link : 'a:not([target])'
        ajax : { timeout: 2500 }, //Ajaxの設定を記述可能
        wait : 500 //リンクをクリックしてからの待機時間
        load : { script: true } //遷移先のインラインスクリプトを読み込む
    });
});
```
`ajax`では、Ajaxの設定を記述できる。タイムアウト時間の設定、エラー時の処理など。
`wait`は、リンクをクリックしてからの遅延時間を設定できる。

例えば、__「0.5秒のCSSアニメーションを実行後に遷移させたい場合」__などに有効。

`load`に関しては次の項目で詳しく。

##load:scriptに関して
`area`の範囲内にある、インラインスクリプトを読み込むか読み込まないかの設定。初期値は`false`。

これを`true`にしておくと、__ページ遷移した際に個別のページで設定されているJavaScriptを実行することが出来る。(ただしインラインスクリプトに限る)__

ちなみにJavaScriptを外部ファイル化すると、pjaxは一度しか読み込み・実行しないもよう。ページ書き換えの度に繰り返し実行したい場合は、必ずインラインで`<body>`内に記述しよう。

##各種イベントについて
pjaxには、ページの更新処理の時に呼び出されるイベントが用意してあるので、ここで遷移アニメーションなどを設定することが可能。

__【pjaxによるページ遷移が行われる前に発生】__

```js
$(document).bind('pjax:fetch', function() {
  // ここに処理を記述
});
```
__【pjaxによるページ遷移が行われた後に発生】__

```js
$(document).bind('pjax:render', function() {
  // ここに処理を記述
});
```

基本的には上記2つでページ遷移の前、後の処理を設定することが出来る。
`addClass`などでクラスを追加してCSS Transitionでアニメーションさせるといい感じになるぞ。

★その他のイベント → http://falsandtru.github.io/jquery-pjax/api/event/


##動かないとき
勉強中に遭遇したのは、`load: { script: true }`を設定していた時に、pjaxが動作せず普通にページ遷移してしまうという現象。

これは、`<body>`内に余計なスクリプトを含んでいると起こってしまうみたい。

__一回しか読み込まないものは`<head>`へ外部ファイルに、繰り返し読み込むものは`area`範囲内の`<body>`内にインラインで記述するようにする。__

##参考
- [PJAX
0.5 seconds Faster Website (公式ドキュメント)](http://falsandtru.github.io/jquery-pjax/)
- [jQueryプラグイン「pjax」でスムーズにページ遷移するサイトの作り方](http://neganin.com/blog/web/jquery-pjax/)

基本的に公式ドキュメント(日本語)が詳しいので要チェック。
Railsアンチパターン<コントローラー編>⑧respond_toがたくさん

reponse_formatをいちいち書いてると関数がでかくなってきてよくない。

ソリューション:Rails3のrespondersを使う
=
respondersとはコントローラーレベルでresonse形式を指定できる機能。

```.rb
class SongsController < ApplicationController 
  respond_to :html, :xml
 
  def show
    @song = songs.find(params[:id]) 
    respond_with(@song)
  end
```
のように書くと、requestに指定されたformatに従って適切なレスポンスを返してくれる。どういう基準で処理されるかというと、

 > 1) the responder searches for a template at people/index.xml;
   2) if the template is not available, it will invoke <code>#to_xml</code> on the given resource;
   3) if the responder does not <code>respond_to :to_xml</code>, call <code>#to_format</code> on it.
   (http://edgeapi.rubyonrails.org/classes/ActionController/Responder.html より)

とのようだ。

ちなみに、このreponders、割ともてはやされてはいたようだけどRails本来の機能からは外されて今は外部gemになっている([4.2リリースノート](http://railsguides.jp/4_2_release_notes.html#respond-with%E3%81%A8%E3%82%AF%E3%83%A9%E3%82%B9%E3%83%AC%E3%83%99%E3%83%AB%E3%81%AErespond-to%E3%81%AE%E6%89%B1%E3%81%84%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6))。
[responders](https://github.com/plataformatec/responders)

[経緯の説明](http://stackoverflow.com/questions/25998437/why-is-respond-with-being-removed-from-rails-4-2-into-its-own-gem)。別に自分はいいと思うんだけど……

`to_<format>`のメソッドの扱いについては[別の章](http://qiita.com/lastcat_/items/c7c706db1ca20451c247)で触れたので参照ください、

##結論:各種フォーマットに対応したい場合はrespondersを使おう。