OmniAICreator/Qiita-1.07M huggingface dataset:
Macのメモ(Notes)からEvernoteにエクスポートするAppleScript



* AppleScriptではメモの中で添付ファイルの位置を取得できない
	* Evernoteではノート末尾にまとめている
* 他の環境では添付ファイルを取得できないかもしれない
	* <del>エラーになる場合は次の2行を削除</del>
		* <del>`set mediaFolder to alias ((path to ...`</del>
		* <del>`set end of attachmentFiles to file 1 of ...`</del>
	* 添付ファイルが保存されているフォルダの存在をチェックするように変更


```applescript:Notes_to_Evernote.scpt
use scripting additions
use framework "Foundation"

--エクスポートするメモを選択
set chooseList to {}
tell application "Notes"
	repeat with i from 1 to count notes
		set end of chooseList to name of note i & return & i
	end repeat
	activate
	set chooseResult to choose from list my sortList(chooseList) with title "Notes to Evernote" with multiple selections allowed
end tell
if chooseResult = false then
	error number -128
end if

--添付ファイルフォルダを取得
try
	set mediaFolder to alias ((path to library folder from user domain as text) & "Group Containers:group.com.apple.notes:Media:")
	set existsMediaFolder to true
on error number -43
	set existsMediaFolder to false
end try

--メモをエクスポート
set exportedNotes to {}
repeat with aResult in chooseResult
	
	--メモ情報を取得
	tell application "Notes"
		set {body:noteHTML, name:noteTitle, creation date:creationDate, attachment:attachmentsOfNote} to note (paragraph 2 of aResult as integer)
	end tell
	
	--添付ファイルを取得
	set attachmentFiles to {}
	if existsMediaFolder then
		repeat with anAttachment in attachmentsOfNote
			tell application "Finder"
				set end of attachmentFiles to file 1 of (folder 1 of mediaFolder whose name of file 1 = name of anAttachment) as alias
			end tell
		end repeat
	end if
	
	--Evernoteにノート作成
	tell application "Evernote"
		set end of exportedNotes to create note with html noteHTML title noteTitle created creationDate attachments attachmentFiles
	end tell
end repeat
return exportedNotes

on sortList(aList as list)
	--require framework: Foundation
	set array to current application's NSArray's arrayWithArray:aList
	set comparator to my appropriateComparatorToSort(array's firstObject())
	return (array's sortedArrayUsingSelector:comparator) as list
end sortList

on appropriateComparatorToSort(anObject)
	--require framework: Foundation
	if anObject ≠ missing value and (anObject's respondsToSelector:"localizedCaseInsensitiveCompare:") then
		return "localizedCaseInsensitiveCompare:"
	else
		return "compare:"
	end if
end appropriateComparatorToSort
```

## 更新履歴

* 2016-01-15: 作成
* 2016-01-15: 添付ファイルが保存されているフォルダの存在をチェックするように変更
* 2016-01-15: エラー回避のためノート選択機能廃止
* 2016-01-16: ノート選択方法を改善
* 2016-02-20: `sortList`ハンドラ更新
OpenGL ES 2.0 & WebGL 超入門 (1)


# はじめに

OpenGLを全く使ったことがない人を対象に、全体的なイメージを掴んで、基本的な描画ができるようになることを目標にします。

WebGLもOpenGL ES 2.0をベースにしていますので、同じように理解できるはずです。文中でOpenGLと書いた場合、OpenGL ES 2.0を指すと思ってください[^1]

[^1]: OpenGL一般に言えることもあるかもしれませんが。

まずはコードを動かすことよりも、感覚的にイメージを掴んでもらうことを目指します。全体像が掴めないと、コードを見ても何をやっているのか？どういう仕組みで動いているのか？理解しづらいためです。

# GPUの概要

CPUの並列処理とGPUの並列処理は大きく異なっています。マルチコアCPUでは、各CPUは別のプログラムを並列実行できます。一方GPUの各演算ユニットは__全く同じプログラムを異なるデータに対して並列実行__します。

![図1.png](https://qiita-image-store.s3.amazonaws.com/0/53805/1a7e2f50-f974-95f3-60c8-b3cdb8ca7e20.png)

これはGPUの仕組みを簡略化して図示したものです。入力データは各演算ユニットにバラバラに渡されます。プログラムと共通設定値（GPU機能の設定やプログラムで使われる共通値）は全ての演算ユニットで同じものが利用されます。各演算ユニットが並列で動作し、出力値を得ます。

GPUの演算ユニットは単純な処理を高速実行するように設計されていて、条件分岐が非常に苦手です。実行できるプログラムにはCPUと違ってかなりの制約があります。

実際のGPUの仕組みはもっと複雑ですが、とりあえずOpenGL入門としてはこの程度の理解で十分です。

# OpenGL ES 2.0 の概要

## 処理全体の流れ

![図2.png](https://qiita-image-store.s3.amazonaws.com/0/53805/7ae4a66f-aa4a-bd11-6af5-452cb6fec73a.png)

OpenGLの処理全体の流れを図示しました。

セットアップが完了したら、画面更新の度にレンダリング処理を行います。レンダリング処理の先頭で準備を行い、各図形の描画を行い、最後に結果を画面に表示します。

## 各図形のレンダリングの流れ

![図3.png](https://qiita-image-store.s3.amazonaws.com/0/53805/d038b1aa-9e5b-2317-541d-74bd73c57715.png)

各図形のレンダリングの流れをものすごく簡略化して図示してみました。

入力値として頂点データを渡します。頂点データは各頂点ごとの情報の集まりで、各頂点の情報には座標はもちろんそれ以外の情報（色やテクスチャ位置など）も含みます。

頂点データは__頂点シェーダ(Vertex Shader)__というプログラムに渡され、各頂点ごとに別々の演算ユニットで並列実行されます。ここで画面上のどの位置に各頂点が描画されるのか、図形の画面上での形状が決定します。また次の断片シェーダに渡す値の計算も行います。

ラスタライズ処理で図形が実際の画面のピクセルに対応付けられます。

次に__断片シェーダ(Fragment Shader)__というプログラムが各ピクセルごとに別々の演算ユニットで並列実行され、各ピクセルの色が決定されます。

これを繰り返して図形を描画していきます。単純に実行順で重ね合わせることもできますが、各ピクセルごとの深さ値(depth)で何が手前にくるか決定させることもできます。3D描画では視点からの距離を深さ値にすることで、手前にあるもので奥にあるものが隠れるように描画させられるわけです。

頂点データに何を含めるかや、頂点シェーダから断片シェーダに何を渡すかは、プログラムで何を行うかで決めることになります[^2]。

[^2]: 数やサイズにプラットフォームごとの制限はあります。

もう少し具体的に各処理で何が行われるのかを図にしてみました。三角形を一個描画しています。

![図4.png](https://qiita-image-store.s3.amazonaws.com/0/53805/16212a4d-6153-ef4a-151b-d9879d7fd3e1.png)

頂点データに含まれる頂点座標は、プログラマが自由に決めた座標空間内の座標で構いません。これを頂点シェーダに渡して、OpenGL座標空間内の座標に変換します。そして各ピクセルごとに断片シェーダが実行されて色が決まります。

OpenGL座標空間は次のように考えてください。x座標の-1.0が画面左端、1.0が画面右端、y座標の1.0が画面上部、-1.0が画面下部、z座標が深さ値に対応します。画面にはz座標で手前にある物が上に描かれるように重ね合わされます（深さテストをONにしている場合）。

![図5.png](https://qiita-image-store.s3.amazonaws.com/0/53805/fefd4e73-c285-6f9d-d541-03c0204d3cbc.png)

## 頂点シェーダから断片シェーダへ渡す値

まずはこの描画結果を見てください。三角形の３つの頂点に座標と色を与えて描画したものです。色はそれぞれ青、赤、緑を指定しています。

![gradation_triangle.png](https://qiita-image-store.s3.amazonaws.com/0/53805/9b845d30-6f3c-8568-f814-044cd473f8cc.png)

見事にグラデーションしていますね。以下は今回の処理を図にしたものです。

![gradation_triangle_process.png](https://qiita-image-store.s3.amazonaws.com/0/53805/4f30bfad-fb7e-fe58-7ae6-0af74eb4b5b5.png)

頂点データのデータ構造は行いたい処理に合わせてプログラマが自由に設計します。ここでは座標と色を渡しています。頂点シェーダから断片シェーダへ渡す値も自由に決められます[^2]。ここでは色をそのまま渡しています。断片シェーダでは渡された色をそのままピクセルの色として採用します。

今回の描画では頂点は３つですがピクセルはもっと沢山あります。頂点と同じ位置のピクセルの色は渡した色そのものでしょうけど、他のピクセルはどうなるのでしょうか？グラデーションしているのを見ればわかると思いますが、__頂点シェーダから断片シェーダに渡される値は線形補完されます__。

三角形は頂点が３つしかありませんので頂点シェーダでは３つの演算が行われるだけです。一方断片シェーダはピクセルの数だけ実行されます[^3]。断片シェーダで重い処理を行うとパフォーマンスが劣化しやすいので注意してください。

[^3]: GPUによっては、上に不透明で重なるものがあって隠れてしまうピクセルは計算しないものもあります。
Storyboard で UITableView の didSelectRowAtIndex が呼ばれた時、どうやって prepareForSegue から destinationViewController にパラメータを伝えるのか？

##問題点の整理
Storyboard で UITableView を使う時、Interface Builder から Prototype Cell を配置し、その種のセルから Segue で次の ViewController につないであげると、実行時にそのセルをタップすると、次のViewController に遷移します。

![Screen-Shot-2016-01-15-at-2.06.13-PM.png](https://qiita-image-store.s3.amazonaws.com/0/65634/e368bb99-9da7-9595-9c78-a3c2c1bf1439.png)

せっかく TableView からセルを選んだのですから、多くの場合は 次の ViewController で選んだセルに相当する情報を、次の ViewController に伝えたい筈です。問題はそれをどのように実現するかです。

セルをタップすると、UITableView の delegate の `tableView:didSelectRowAtIndexPath:` が呼ばれます。が、この時点では 次の ViewController の尻尾は掴めないので、パラメータを伝える事は出来ません。

```.swift
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
	// where is the next view controller!? how can I get it?
}
```
`prepareForSegue:sender:` が呼ばれた時は、「それってどのセル」でしたっけ？となります。


```.swift
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
	// which cell was that!?
}
```

## Stack Overflow
**Use didSelectRowAtIndexPath or prepareForSegue method for UITableView?**
http://stackoverflow.com/questions/8130600/use-didselectrowatindexpath-or-prepareforsegue-method-for-uitableview

Stack Overflow にもいくつか方法が挙げられています。セルの tag に rowIndex を仕込んだり苦労されているみたいです。

## UITableView の indexPathForCell を使えば…
しかし、prepareForSegue の sender はタップした cell が送られてくるのであれば、`self.tableView.indexPathForCell(sender as! UITableViewCell)` を使って indexPath がわかります。そこで indexPath に相当するパラメータを次の ViewController へパラメータとして渡してあげれば目的達成です。


```.swift
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
	if let cell = sender as? UITableViewCell {
		let indexPath = self.tableView.indexPathForCell(cell)!
		assert(segue.destinationViewController.isKindOfClass(DetailViewController))
		let detailViewController = segue.destinationViewController as! DetailViewController
		detailViewController.item = self.items[indexPath.row]
	}
}
```
プロセス毎のメモリ使用量を調べる

いつもどおり各所から拾ってきたりしたやつ

だいたいkbyte

#トップ10
```
# ps alx | awk '{printf ("%d\t%s\n", $8,$13)}' | sort -nr | head -10
```

# top -a

RES
項を参照(単位はmbyte)



#指定プロセス
```
# ps aux | grep "プロセス名"
```

#プロセス毎合計
```
# ps aux | grep "プロセス名" | awk '{sum += $6}END{print sum}'
```

#プロセスID指定 その１
```
# pmap -x "プロセスID"
```

#プロセスID指定 その２
```
# cat /proc/"プロセスID"/smaps
```
OpenSSH クライアントの脆弱性（CVE-2016-0777 / CVE-2016-0778）

OpenSSH クライアントに秘密鍵の情報の漏洩やバッファオーバーフローが発生する脆弱性が見つかりました。

・JVNVU#95595627 OpenSSH のクライアントに複数の脆弱性
http://jvn.jp/vu/JVNVU95595627/

対策版（7.1p2）がインストール可能であれば、インストールして下さい。
そうでない場合は、下記サイトの手順にて、UseRoaming 機能を無効にすれば回避可能です。

・OpenSSH Client Bug CVE-2016-0777 and CVE-2016-0778
https://www.digitalocean.com/community/questions/openssh-client-bug-cve-2016-0777-and-cve-2016-0778
JAVA MacでのJREバージョン確認方法

Mac OS XでのJREバージョンのコマンド行
ターミナル・ウィンドウで次を入力します。
/Library/Internet\ Plug-Ins/JavaAppletPlugin.plugin/Contents/Home/bin/java -version

![スクリーンショット 2016-01-15 15.37.58.png](https://qiita-image-store.s3.amazonaws.com/0/95187/e18e17ac-aaeb-cee3-1a0d-22eaec346328.png)
jQueryのAjaxでリアルタイム検索のやつ


ありがちなやつです。
備忘録的な感じで書いてます。


```html:index.html
<!DOCTYPE HTML>
<html>
<head>
<meta charset="UTF-8">
<title>Welcome!</title>
</head>
<body>

<h1>Search our Phone Directory</h1>
<form id="searchform" method="post">
<div>
	<label for="search_term">Search name/phone</label>
  	<input type="text" name="search_term" id="search_term" />
  	<input type="submit" value="search" id="search_button" />
    </div>
</form>
<div id="search_results"></div>

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.0/jquery.min.js"></script>
<script type='text/javascript'>
$(document).ready(function(){
$("#search_results").slideUp();
    $("#search_button").click(function(e){
        e.preventDefault();
        ajax_search();
    });
    $("#search_term").keyup(function(e){
            e.preventDefault();
            ajax_search();
        });

});
function ajax_search(){
  $("#search_results").show();
  var search_val=$("#search_term").val();
  $.post("./find.php", {search_term : search_val}, function(data){
   if (data.length>0){
     $("#search_results").html(data);
   }
  })
}
</script>
</body>
</html>
```

```php:find.php
<?php
define(HOST, "xxx");
define(USER, "xxx");
define(PW, "xxxx");
define(DB, "xxx");

$connect = mysqli_connect(HOST,USER,PW) or die('Could not connect to mysql server.' );
mysqli_select_db($connect,DB) or die('Could not select database.');
mysqli_set_charset($connect, "utf8");

$term = strip_tags(substr($_POST['search_term'],0, 100));
$term = mysqli_real_escape_string($connect,$term);

$sql = "SELECT member_name,member_phone FROM members where member_name like '%$term%' or member_phone like '%$term%' order by member_name asc";
$result = mysqli_query($connect,$sql);

$string = '';

if(mysqli_num_rows($result) > 0){
  while($row = mysqli_fetch_assoc($result)){
    $string .= $row['member_name']." - ";
    $string .= $row['member_phone'];
    $string .= "<br/>\n";
  }

}else{
  $string = "No matches!";
} 

echo $string;
```

簡単ではありますが、こんなもんで勘弁して下さい。
Retrofit 2でリクエスト毎にリクエストヘッダの値を変更する

リクエスト毎にリクエストヘッダの値を変更する必要があったので作ってみた。

Volleyからの載せ替えなのでVolleyちっくで一般的かはわかりませんが。

```java:RestClient.java
public class RestClient {
    private static Retrofit sClient;
    private static HashMap<String, String> sHeaders;

    public static void build(String baseUrl) {
        OkHttpClient okClient = new OkHttpClient();
        okClient.interceptors().add(new Interceptor() {
            @Override
            public Response intercept(Chain chain) throws IOException {
                Request request = chain.request();

                Request.Builder builder = request.newBuilder();
                for(HashMap.Entry<String, String> entry : sHeaders.entrySet()){
                    builder.addHeader(entry.getKey(), entry.getValue());
                }

                return chain.proceed(builder.build());
            }
        });

        sClient = new Retrofit.Builder()
                .baseUrl(baseUrl)
                .client(okClient)
                .addConverterFactory(GsonConverterFactory.create())
                .build();
    }

    public static Retrofit getInstance() {
        return getInstance(new HashMap<String, String>());
    }

    public static Retrofit getInstance(HashMap<String, String> headers) {
        sHeaders = headers;
        return sClient;
    }
}
```

使うときはこんな感じ

```java
// ここは一度だけ
RestClient.build("http://api.example.com/");

// ここから下はリクエスト毎に
HashMap<String, String> headers = new HashMap<String, String>();
headers.put("Hoge", "hogehoge");
headers.put("User-Agent", "Mozilla");

GitHubService service =　RestClient.getInstance(headers).create(GitHubService.class);
```

サーバ側

```
HTTP_HOGE:hogehoge
HTTP_USER_AGENT:Mozilla
```

※勘違いしている部分があったため、再度書き直しました。

参考

http://square.github.io/retrofit/
http://stackoverflow.com/questions/32605711/adding-header-to-all-request-with-retrofit-2
BOOLやintをランダムで取得する


BOOLを割合を決めてランダムで取得する
-

Objective-cの場合

```objc:.m
    BOOL randomBoolWithYesPercent(int percent) {
        return arc4random_uniform(100) < percent;
    }
```

Swiftの場合

```swift:.swift
    func randomBoolWithYesPercent(percent: UInt32) -> Bool {
        return arc4random_uniform(100) < percent
    }
```


intを最大値を決めてランダムで取得する
-


Objective-cの場合

```objc:.m
    int randomIntWithMax(int max) {
        return arc4random_uniform(max + 1);
    }
```


Swiftの場合

```swift:.swift
    func randomIntWithMax(max: UInt32) -> UInt32 {
        return arc4random_uniform(max + 1)
    }
```

Swiftの書き方がまだよくわかっていないので
間違ってたらごめんなさい
複数imgタグの".svg"を".png"に書き換えるJavaScript

#Opera Mini ではsvgファイルの日本語が文字化けした

サイト制作でベクター画像を多用しています。
最近のブラウザの多くで対応されているようなので、趣味のサイトであれば問題ないだろうと。

ただ、svgで作ったイラスト内に日本語を入れたところ、Opera Miniで文字化け。
その対処法として、Opera Miniで読み込まれた場合にはsvgファイルではなく、pngファイルを読み込むようなJavaScriptを書いてみました。

なるべくコード量は減らしたいので、各imgタグ内の".svg"の部分だけを".png"に書き換えるコードにしたいと思います。

##".svg"を".png"に書き換えるための流れとコード
以下の流れにそって作成しました。

* 書き換えたいimgタグにクラスsvgを付加
* svgクラスを持つ要素をすべて取得
* 各要素ごとに".svg"を".png"に書き換え
* userAgentを設定して、Opera Mini(Presto)で開いた場合に書き換え

```Presto.html

<!--関係ないコードは省略 -->

<img class="svg" src="images/sample1.svg">
<img class="svg" src="images/sample2.svg">

<!--関係ないコードは省略 -->

<script type="text/javascript">
	if (navigator.userAgent.indexOf("Presto") != -1) {
		var svg = document.getElementsByClassName("svg");
		for(var i=svg.length;i--;){
			svg[i].src = svg[i].src.replace(".svg",".png");
		};
	}
</script>
```

これで無事、Opera Miniではpngファイルが読み込まれるようになりました。

# 追記
## if文の条件式をより簡略化できます。
window.operaminiだけで判定できてしまうのですね。
Opera miniのサイトにも掲載されている内容です。ぜひ御覧ください。
https://dev.opera.com/articles/opera-mini-and-javascript/#detectingmini

@chitoku さん、アドバイスありがとうございました。
コード内容は以下のとおりです。

``` presto2.html
<!--関係ないコードは省略 -->

<img class="svg" src="images/sample1.svg">
<img class="svg" src="images/sample2.svg">

<!--関係ないコードは省略 -->

<script type="text/javascript">
	if (window.operamini) {
		var svg = document.getElementsByClassName("svg");
		for(var i=svg.length;i--;){
			svg[i].src = svg[i].src.replace(".svg",".png");
		};
	}
</script>
RLoginでポートフォワーディング

複数のサーバを経由しないとアクセスできないサーバに対して、踏み台サーバでSSHコマンドを打つことなく、自PCのRLoginから直接ログインしているように操作できるようにする。

## 踏み台サーバの設定
### 踏み台サーバの接続情報設定
[サーバー]＞[通信共通]にて、
Server Address：踏み台サーバのアドレス
User Name：踏み台サーバのユーザ名
Password：踏み台サーバのパスワード
を設定。

### ポートフォワーディングの設定
[サーバー]＞[プロトコル]にて、
ポートフォワードを押下して、

- Local Socksを選択
- Host Nameに「localhost」、Portに「10022」(任意のポート)を設定

また、踏み台サーバを操作する必要がなければ、
「ポートフォワードだけ行う」にチェックを入れる。

## 接続先サーバの設定
### 接続先サーバの接続情報設定
[サーバー]＞[通信共通]にて、
Server Address：接続先サーバのアドレス
User Name：接続先サーバのユーザ名
Password：接続先サーバのパスワード
前接続先（タブ/前接続先グループの下段テキストボックス）：踏み台サーバのエントリーを選択

さらにProxy Serverを押下して、

* SOCKS5を選択
* Proxy Server Addressに「localhost」、Socket Portに「10022」(ポートフォワードで設定した任意のポート)を設定

## 接続確認
接続先サーバの設定で接続を開始すると、踏み台サーバと接続先サーバの2つのタブが立ち上がり、接続先サーバタブにて接続ができている事が確認できる。

## 踏み台サーバ経由で内部のWebサーバへアクセスする場合
上記の踏み台サーバの設定だけ作成し、ブラウザのプロキシ設定でSOCKSプロキシに踏み台のポートフォワード先を設定する。
RLoginで接続して踏み台サーバへのポートフォワーディングが行われている状態であれば、webブラウザからアクセスできるようになる。

IEやChromeはOSの設定が用いられるために他のブラウジングに影響が出てしまうので、ソフトのみのプロキシ設定が可能なFirefoxを使用するか、自動設定スクリプトを作成して切り分けると便利。
Mongodb 最短入門(3)数百万件でも速くしてみた

Mongodb 最短入門(1)EC2にインストール&起動&いきなり数万件入れてみた　の続き
Mongodb 最短入門(2)数万件いれて探してみた　の続き

APIができましたので、次はもっともっと大量にしてみます。
さすがにt2.microは無理なのでm3.mediumに。
三輪車→自転車になりました。

やっぱりたくさんいれると遅いので、indexを貼ってみます。

ここまではお気軽DBとしても、最低限かな。ファイルを検索するのだってインデックス構築しますから。

もう一度。
開発段階で便利なことを。

## 全部いれなおすとき。

> sudo service mongod stop

止まりましたか?
MysqlのinnoDBみたいですが、どんどんジャーナリングファイルが大きくなる性質らしく。データ消しても/var/lib/mongo 以下でなんかが大きくなるらしいです。
けっこうビッグデータいれちゃってるので、開発時は毎回クリーンな状態がいいですよね。
**サクッ、ッターン!**でやりなおしますよ。
(よいこは真似しちゃいけません)

> sudo rm -rf /var/lib/mongo/*

/var/lib/mongo/ 以下のファイルを消します。ディレクトリは置いておきます。

おもむろに起動
> sudo service mongod start

空だった　/var/lib/mongo/　は初期化されている。

## コレクション単位で消す(よいこはこちら)

> db.honyarara.remove({});

さいなら。


## 本題。mongo たんには　index がある。
https://docs.mongodb.org/manual/indexes/

(もう一度データをいれる、もしくは消していない前提)

## 全部にはる。探さないものはないとき。

> db.honyarara.createIndex( { "$**": "text" } )


## テキスト型と数字くらいはわけれるとき。

- 普通のindex
> db.honyarara.createIndex( { "カラム名": 1 } )
値は
`1`　昇順　`-1` 降順

- テキスト型(言語であるとき)
> db.honyarara.createIndex( { "カラム名": "text" ,"カラム名2": "text" ,.... } )

全部にはることもできれば、指定したものにはることもできる

テキストインデックスについてはこちらです↓
https://docs.mongodb.org/manual/core/index-text/#create-text-index

さあ、大体の場合は速くなったはず。時間はかかるけど、はっといたほうがいいです。

## まだ遅い時

これ以上の複雑なクエリやチューニングがいる場合は、もはやmongodbを使わないことをおすすめする。


## やっぱりやめるとき。

1. 上記手順ではじめからやり直す
2. indexだけ削除する(よいこはこちら)

### 現在のindexと名前を確認

> db.honyarara.getIndexes()

### "name" の欄を確認したら、指定して削除

> db.tracks.dropIndex( インデックス名 )
AWS Nodejs

インスタンスにnode.jsをセットアップ

sshで対象のインスタンスにログインし、下記コマンドを順番に実行していきます。

yumのアップデート

```
$ sudo yum update
```

必要なパッケージをyumからインストール

```
$ sudo yum install git gcc-c++ make openssl-devel
```

nvmをgitリポジトリからclone

```
$ git clone git://github.com/creationix/nvm.git .nvm
```

~/.bash_profileに以下の設定を追加
viは入力モードとコマンドモードを切り替えて操作します。

```
$ vi ~/.bash_profile
```

初期状態はコマンドモードでテキスト入力はできませんが、iを押す事で入力モードに切り替わり入力可能になります。矢印キーなどでファイルの末尾に移動してからiを押して、以下を追記してください。

```sh
if [[ -s ~/.nvm/nvm.sh ]];
 then source ~/.nvm/nvm.sh
fi
```

インストール可能なnode.jsのバージョンの一覧を確認
(今回はnode.js v4.2.2のインストールを例にします。)

```
$ nvm ls-remote
```

nvmからnode.jsをインストール

```
$ nvm install v4.2.2
```

念のためバージョンが正しいか確認

```
$ node -v
```

nvmのデフォルトバージョンを定義

```
$ nvm alias default v4.2.2
```
symfonyでSSI

symfonyの当たっていない静的なhtmlにログイン情報を表示しているヘッダー部など動的に切り替わる部分だけsymfony経由で出力したいってことありませんか？
SSIを利用してヘッダー部をsymfonyで出力すればできます。

その簡単？なやり方を紹介します。
下記のような構成のSymfonyアプリがあるとします。

<pre>
- symfony_root/
 - web/
  - index.php ← ※１
 - apps/
  - frontend/
   - modules/
    - ssi/ ← SSI用のモジュール
     - actions/
      - actions.class.php ← executeHeader()が宣言されている
</pre>

※１をコピペしてSSI用のphpファイルを作成し、修正します。

<pre>
- htdocs/
 - ssi/
  - header.php
</pre>

```php:header.php
<?php
$_SERVER['REQUEST_URI'] = 'ssi/header';  //指定したモジュールおよびアクションを呼ばせるため
require_once(dirname(__FILE__).'/../../symfony_root/config/ProjectConfiguration.class.php'); //パスを調整
$configuration = ProjectConfiguration::getApplicationConfiguration('frontend', 'prod', false);
sfContext::createInstance($configuration)->dispatch();
```

## .htaccessかhttpd.confにSSI設定

```text:htdocs/.htaccess
    AddType text/html .shtml
    AddOutputFilter INCLUDES .shtml
```

## SSIを使ったhtmlの例

```html:htdocs/index.shtml
<html>
<head>
  <title>SSIサンプル</title>
</head>
<body>
<!--#include virtual="/ssi/header.php" -->

  これはSSIサンプルです。

</body>
<html>
```
フィボナッチで各種言語をベンチマーク

## 参考

* [フィボナッチで各種言語をベンチマーク - satosystemsの日記](http://d.hatena.ne.jp/satosystems/20121228/1356655565)
* [[テクニカルブログ]WEB開発言語の比較と選定｜第2弾 – geechs（ギークス）](http://geechs.com/20140402/)

## 計測

* Ubuntu 16.06で確認
* CPU: Core i3-4130T@2.90GHz

```bash:計測
sh -c "TIME=%U time コマンド"
```

## 結果

| lang | time(s) |
|------|------|
| C (gcc 5.3.1) -O3 | 0.46 |
| C (gcc 5.3.1) -O2 | 0.48 |
| C (gcc 5.3.1) | 0.78 | |
| go 1.5.1(build) | 0.78 |
| go 1.5.1 | 1.09 |
| crystal 0.10.2(build) | 1.36 |
| crystal 0.10.2| 1.46 |
| Node.js 4.2.4 | 1.69 |

超えられない壁

| lang | time(s) |
|------|------|
| php 7.0.2 | 15.14 |
| ruby 2.2.3 | 16.07 |
| python 2.7 | 32.89 |
| python 3.5 | 35.52 |
| php 5.6.16 | 39.70 |
| gawk 4.1.3 | 43.64 |

RaspberryPi2のpython2.7だと`6m26.196s`かかりました。

----

# ソース

## C

```c:fib.c
#include <stdio.h>
int fib(int n)
{
    if (n <= 1) {
        return n;
    }
    return fib(n-1) + fib(n-2);
}

int main()
{
    printf("%d\n", fib(40));
    return 0;
}
```

## Go

```go:fib.go
fib.go 
package main

import "fmt"

func fib(n uint) uint {
    if n <= 1 {
        return n
    }
    return fib(n-1) + fib(n-2)
}

func main() {
    fmt.Println(fib(40))
}
```

## Ruby, Crystal

```rb:fib.rb
def fib(n)
  return n if n <= 1
  fib(n - 1) + fib(n - 2)
end

puts fib(40)
```

## Python2,3

```py:fib.py
def fib(n):
    if n <= 1:
        return n
    return fib(n - 1) + fib(n - 2)

print(fib(40))
```

## php

```php:fib.php
<?php
function fib($n) {
  if ($n <= 1) {
     return $n;
  }
  return fib($n - 1) + fib($n - 2);
}

print fib(40);
```

## awk

```awk:fib.awk
BEGIN {
    printf "%d\n", fib(40)
}

function fib(n) {
    if (n <= 1) return n
    return fib(n - 1) + fib(n - 2)
}
```
Request Object の Validation の Redirectメモ


Laravel5.1 の話。5.2でもおそらく同等。

よく忘れる。RequestObject にValidationRule とかを書くのですが、その失敗時のリダイレクト先を入力フォームとは別にしたい時の設定。

プロパティ `redirect`, `redirectRoute`及び`redirectAction`のいずれかに、適切なリダイレクト先を入れたら行く。

| Property | Description |
| :--- | :--- |
| redirect | リダイレクト先の URL を記述する。|
| redirectRoute | `routes.php` で名前を付けているパスに転送する。 |
| redirectAction | `Controller@action` を指定することで、そこに転送する |

優先順位は`redirectAction`, `redirectRoute`,`redirect` となるけど実装が変わったら変わると思う。３つ全部入れることは無いと思うけど。

```TestRedirect.php
<?php

namespace App\Http\Requests;

use App\Http\Requests\Request;

/**
 * Class PasswordResetRequest
 * @package App\Http\Requests
 *
 * リダイレクトのメモ
 */
class TestRedirect extends Request
{
    public $redirect = "/";
    public $redirectRoute = "toppage";
    public $redirectAction = "TopPageController@index";

    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        return false;
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        return [
            'email' => 'required|email'
        ];
    }
}

```
Docker　備忘録

#未来の自分へ

停止している全コンテナを削除

```lang
$ sudo docker rm $(sudo docker ps -a -q)
```

全イメージを一気に削除

```lang
$ sudo docker rmi $(sudo docker images -q)
```


不要イメージを一気に削除

```lang
$ sudo docker rmi $(sudo docker images | awk '/^<none>/ { print $3 }')

$ sudo docker rmi $(docker images -f dangling=true -q)
```

コンテナ起動

```lang
$ sudo docker run --name イメージ名 -i -t タグ名

$ sudo docker run -i -t イメージ名:タグ名
```


コミットして新イメージを作成

```lang
$ sudo docker commit コンテナID イメージ名:タグ名
```
MySQL　速度検証　All(*)でなくカラムを指定するとどれだけ早くなるのか

テーブル名：members
カラムは１０個ほど用意

まずはすべてのカラム情報を抜き出す（LIMIT 1で１列だけ抜き出す）

SELECT * FROM members WHERE member_id = 1 limit 1 

上記指令は0.0006seconds


今度は１列から２つだけ抜き出す（カラム1.2を指定）
SELECT col_name1, col_name2 FROM members WHERE member_id = 1 limit 1 上記指令は0.0005 seconds

同じく１列から最初のカラム情報と最後のカラム情報を抜き出す
SELECT col_name1, col_name10 FROM members WHERE member_id = 1 limit 1
上記指令は0.0004 seconds

ん？
ばらけたほうが遅くなるかと思いきや
こちらのほうが早い。
なんでだろう
ちなみにcol_name2よりcol_name10のほうが
サンプルでいれておいた文字数が多い(col_name2:４文字→col_name10:１０文字)

ためしにもう一つ
SELECT col_name3,col_name7 FROM members WHERE member_id = 1 limit 1
上記指令は0.0004 seconds

ここで順番を入れ替えて
SELECT col_name7,col_name3 FROM members WHERE member_id = 1 limit 1
上記指令は0.0005 seconds
若干遅くなる（誤差かも）

カラムは順に指定したほうがよさそう。
指定カラムによる速度変化はどういうルールなのか
よくわからないが最初の２つが指定されたからといって
早くなるわけではないらしい。

以上検証でした。

もし、もっと細かい情報お持ちでしたら
ぜひともコメントください。
iOS/Android開発で別のチームから引き継ぐ際に確認すべきポイント

# 概要

　別の開発チームからアプリや案件を引き継ぐ際のチェックリストを作成しました。

# 確認ポイント

## 開発

* 開発中のソースはあるか
* 開発フローはどうしていたか

## リポジトリ

* GooglePlay/iTunesにアップロードされているアプリとリポジトリのソースが一致しているか前任者と認識合わせ
* リポジトリ移行すべきか http://qiita.com/tanacasino/items/901723e3463bac38f40e
* Gitflowなどのリポジトリ運用のルールはあるか
* コミットルールはあるか

## ドキュメント

* Cacooなどは利用してたか
* エクセルやパワポなどの資料はどこにあるか

## 課題管理

* RedmineやBacklogやJiraなどはあるか

## チャットツール

* SkypeやSlackなどを利用していたか。
* 過去ログは管理されているか

## ビルド

### CIツール

* CIツールはあるか
* 開発ビルド、リリースビルドのフロー

### iPhone

* AdHoc/AppStoreの秘密鍵やプロビジョニングの情報
* AppDeveloper情報
* ビルドTargetはどう管理していたか
* 検証用向けipa作成やAppStore向けipa作成はどうやっていたか(コマンドラインの情報など）

### Android

* jksファイルのパス等の情報
* BuildFlavorはどうかんりしていたか

## Push通知

### バックエンド

* AWS SNSなどを利用していたか

### iPhone

* APNsの設定
* 開発用Pushの設定
* 本番用Pushの設定

### Android

* GCMの設定
* 開発用GCM（SenderID）の情報
* 本番用GCM（SenderID）の情報

## 外部サービス

* Crashlytics(Fabric)を利用していたか
* GoogleAnalyticsを利用していたか
* その他サービスを利用していたか

## アプリ配布

* Deploygateを利用していたか
* GooglePlayのα機能やβ機能を利用していたか
* Testflightを利用していたか

## リリース

### iPhone

* AppleDeveloperアカウントはもらえるのか。また権限はAdminかMemberか。
* iTunesConnectアカウントはもらえるのか。また権限は何か　[AppleのiTunesConnectアカウントの説明サイト](https://developer.apple.com/library/mac/documentation/LanguagesUtilities/Conceptual/iTunesConnect_Guide_Jpn/Chapters/SettingUpUserAccounts.html)

### Android

* GoogleDeveloperConsole(Push通知など)
* Google Play デベロッパー コンソール


# まとめ

　引き継ぎ期間が短期間だと効率よくチームのノウハウを吸収する必要があります。もしコレも追加スべき！という情報があれば追記して頂ければと思います。
c++ builder > TEdit >パスワード入力 > PasswordCharを設定する

```txt:動作確認
C++ Builder XE4
```

http://qiita.com/7of9/items/15f5e964759d874e5f96
にてパスワード入力を検討したが、標準機能としてあったようだ。

http://stackoverflow.com/questions/10863300/how-to-use-a-tedit-box-to-enter-password-without-showing-the-characters-that-is
>  "Use the PasswordChar property to create an edit control that displays a special character in place of any entered text."

プロパティの`PasswordChar`に`*`を設定すれば入力中の文字が表示されなくなった。
また、Ctrl+Cにて入力文字をコピーしようとすると「不許可 パスワード入力フィールドからは文字はコピーできません」となるのでコピーされることはない。
watchOS2のリファレンス本


appleWatchの開発で困るのは、リファレンスの少なさ。
watchOS2に関するリファレンスとなると、さらに少ない。
そんな中で、watchOS2の仕様が日本語で体系的にまとめられている書籍を発見した。

おそらく、2016年1月15日の段階で、
**watchOS2に対応した書籍で日本語で書かれた本はこれが唯一(※)**だと思う。
(※)個人的に調べた範囲内

[watchOS1からwatchOS2へのApple Watchアプリ開発 サラッと読んでおきたい基礎技術](http://www.amazon.co.jp/dp/B015OKY5TM)

kindle版のみで440円という超安価だが、内容は素晴らしく、とてもよくまとまっていると思う。

おわり
UILabelの文字を英字と日本語でフォントを変えて、英字と日本語の間にはカーニングを入れる。

完全にタイトルの通りです

基本は
http://qiita.com/appwatcher/items/fdc831ca82fc6041a4f4
の通りです。

```swift 

extension UILabel {
  func setUpdate(){
    let jpFontName = "HiraKakuProN-W3"
    let enFontName = "HelveticaNeue"
    let kerning = 3.0
    guard let text = self.text else {return}
    guard let jpFont = UIFont(name: jpFontName, size: font.pointSize - 1.0) else {return}
    guard let enFont = UIFont(name:enFontName , size: font.pointSize) else {return}
    
    let paragrapStyle = NSMutableParagraphStyle()
    paragrapStyle.alignment = textAlignment
    paragrapStyle.lineBreakMode = lineBreakMode
    
    let attr = [NSStrokeColorAttributeName: textColor,
      NSFontAttributeName:jpFont,
      NSParagraphStyleAttributeName:paragrapStyle]
    let attrStr = NSMutableAttributedString(string: text, attributes: attr)
    
    let regexp = try! NSRegularExpression(pattern: "([a-zA-Z0-9]+)", options: .CaseInsensitive)
    let textRange  = NSRange(location: 0,length: attrStr.length)
    let matches = regexp.matchesInString(attrStr.string, options: .ReportProgress, range: textRange)
    for match in matches {
      let range = match.rangeAtIndex(1)
      attrStr.addAttribute(NSFontAttributeName, value: enFont, range: match.rangeAtIndex(1))
      let lastRange = NSRange(location: range.location + range.length - 1, length: 1)
      attrStr.addAttribute(NSKernAttributeName, value: kerning, range: lastRange)
    }
    attributedText = attrStr
  }
}

```

setUpdate()を呼ぶことでフォントの情報が書き換わります。

<img width="622" alt="スクリーンショット 2016-01-15 13.38.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/24979/bd675380-6d6a-a514-f548-5efbff882e06.png">
Vagrant 1.8.1を利用した時に VirtualBox 5.0.12より前のバージョンを使ってると共有フォルダ内のシンボリックリンクが作れない

Vagrant 1.8.1を利用した時に VirtualBox 5.0.12より前のバージョンを使ってると共有フォルダ内のシンボリックリンクが作れない。

それだけ。

VirtualBox も最新にする必要がある。
古い VitrualBox を使い続ける必要があるなら、Vagrant 1.7.4 を利用しよう。

健忘録として記述。

https://github.com/mitchellh/vagrant/issues/6732

一応こんな issue をあげた。
【Monaca】Push通知についての知見１(iOS_前準備編)

# Monacaにおける個別Push通知送信機能の紹介

[個別Push通知機能の紹介](http://blog.asial.co.jp/1254 "Asial") として、開発元のアシアル株式会社の方が紹介してくださっています。
※ ただし、この利用には、マネジメントAPIを作成・使用する事を元としているため、MonacaのGold会員以上が必要です。

また、上記記事にもありますが、端末IDの取得方法は、Qiitaにも以前まとめた事があるので、紹介させていただきますね。
記事： [【Monaca】端末IDの取得方法](http://qiita.com/ikkitang/items/96614732e4767b54c5cd "Qiita")

さて、今回、Monacaのアプリを作成し、公開、また、端末IDを指定して、Push通知の送信をする事となりましたので、それに関しての知見を簡単にまとめたいと思います。

# 1 Push送信の前準備

大前提として、Monacaバックエンドが作成してあり、マネジメントAPIが有効になっている状態とします。

上記の記事にて、この辺りは、紹介されていますので、さらーっと流していきますね。

## 1.1 バックエンド利用
まずは、Monacaのプロジェクト画面にて、雲のマーク(下記画像の[1]) を選択し、バックエンドを利用するを選択します。

![image](https://qiita-image-store.s3.amazonaws.com/0/66498/5243a290-fc3a-261c-c1b0-18772ad91364.png)

そうしますと、どのバックエンドを使うかを聞かれます。
今回は、初めて利用する前提としますので、何か名前を下記画像の赤枠に書き込んでください。既に、バックエンドがある場合は、**既存のMonacaバックエンドを使用する**を選択して、使用するバックエンドを選んで頂ければ、問題ないかと。

![image](https://qiita-image-store.s3.amazonaws.com/0/66498/d1609a49-cfb6-9dc9-b95f-3f1fd2a48033.png)

処理が終わると、「バックエンドが作成されました」などの文字がでます。

## 1.2 Push通知の証明書作成

次に、下記画像１の歯車を押し、バックエンドの設定をします。
![image](https://qiita-image-store.s3.amazonaws.com/0/66498/997c9a0c-5bd8-a141-b401-8c5a9ea9ab15.png)

まずは、プッシュ通知を選択し、諸々の設定をします。iOSの証明書等の設定は他の所で調べてください。
また、送信時に必要なので、プッシュ通知プロジェクトIDを控えておいてください。

![image](https://qiita-image-store.s3.amazonaws.com/0/66498/83bb051a-bf53-59a2-8a71-c90305914c7f.png)

## 1.3 マネジメントAPIの有効化

次にマネジメントAPIを有効化します。
![image](https://qiita-image-store.s3.amazonaws.com/0/66498/cc87a8b3-ae11-d57e-0afc-c62432c8b362.png)

有効化後、マネジメントAPIキーを作りましょう。プッシュ通知は、マネジメントAPIというAPIを外部のサーバーより、呼び出して、通知を行います。その際のセキュリティ鍵のようなものですかね。

IPアドレスは、今回、テストなので、入力しません。運用時は、他のサーバーから動かされる事を避けるため、自社サーバーのIPのみを入力するなどにしておいた方がよいです。

![image](https://qiita-image-store.s3.amazonaws.com/0/66498/0601a138-f84a-54ab-8257-2f935cb8070e.png)

入力すると、以下画像の2番が作成されます。
送信時に使用するため、エンドポイントURLとマネジメントAPIキーを控えておいてください。

![image](https://qiita-image-store.s3.amazonaws.com/0/66498/5a1607a2-ae84-cf75-aa71-0845e18ecd52.png)

## 1.4 まとめ
**プッシュ送信に必要なため、控えておくもの**
　・ プッシュ通知プロジェクトID
　・ マネジメントAPIのエンドポイントURL
　・ マネジメントAPIキー

**やっておくべき事**
　・ バックエンド利用設定
　・ iOSプッシュ通知証明書の作成
　・ マネジメントAPIの有効化

# 2 プッシュ通知実装方法

長くなりましたので、続きは次回。

前回リンク: 無し。
次回リンク: そのうち・・。
Adwords ScriptでGoogleスプレッドシートにデータを保存する方法


# Adwords Scriptを使ってGoogleスプレッドシートにデータを保存する方法

Adwords Scriptを使ってGoogleスプレッドシートにデータを保存するときに使ったものを公開します。
これで当日から3ヶ月前までの情報を一覧で取得します。

取得したデータをスプレッドシートで各種調整することで必要なレポートを作ることが可能となります。

自分用なので利用したい人は各種調整して使って頂ければと思います。

スケジュール実行も可能ですので自動的にレポートを出したりすることも可能です。


```js
function main() {
 var today = new Date();
 var d = Utilities.formatDate(today, AdWordsApp.currentAccount().getTimeZone(), "yyyyMMdd");
 Logger.log(d);

  var befyear = parseInt(d.substring(0, 4));
  var befmonth = parseInt(d.substring(4, 6));
  var befday = parseInt(d.substring(6, 8));

  if ( befmonth < 4 ) {
    befmonth = befmonth + 12;
    befyear = befyear - 1;
  }
  befmonth = befmonth - 3;

  // 連結
  result = befyear.toString() + befmonth.toString() + befday.toString();

  var UCTDate = new Date(result.substring(0,4) + "/" + result.substring(4,6) + "/" + result.substring(6,8));
  result = UCTDate.getTime();
  var tDate = new Date();
  tDate.setTime(result);

  // それぞれ取得
  var tmpyear = tDate.getFullYear();
  var tmpmonth = tDate.getMonth() + 1;
  var tmpdate = /*tDate.getDate()*/"01";

  // yyyymmddのフォーマットへ

  if (tmpmonth.toString().length == 1) {
    tmpmonth = "0" + tmpmonth;
  }

  if (tmpdate.toString().length == 1) {
    tmpdate = "0" + tmpdate;
  }

  // 連結
  result = tmpyear + "" + tmpmonth + "" + tmpdate;

  Logger.log(result);

  var spreadsheet = SpreadsheetApp.openByUrl("https://docs.google.com/spreadsheets/d/xxxxxxxxxxxxxxxxxxxxxxx/edit#gid=0") //スプレッドシートのURL
  var report = AdWordsApp.report("SELECT Date, Labels, CampaignName, CampaignStatus, Cost, Impressions, Clicks, Conversions, ViewThroughConversions  FROM CAMPAIGN_PERFORMANCE_REPORT DURING "+ result +","+ d +"");
  report.exportToSheet(spreadsheet.getActiveSheet());
}
```
iPhone画面横幅とscaleメモ (6plus,6,5)

ただのメモです。

UIScreen.mainScreen().bounds.size.width: 414.0
UIScreen.mainScreen().scale: 3.0


UIScreen.mainScreen().bounds.size.width: 375.0
UIScreen.mainScreen().scale: 2.0

UIScreen.mainScreen().bounds.size.width: 320.0
UIScreen.mainScreen().scale: 2.0
メモリ関係の悩み事


# kworker関係
ubuntuの構成がダメなのかもしれないですが、どうにも気になるので一応調べてみる。

- [ubuntuでkworkerのcpu使用率がやたら高い](http://qiita.com/gooos/items/a97ae795f993c1adadb9)

# メモリの解放
C言語のプログラムを書いてて、確保したメモリを解放し忘れたり、したつもりでされてなくて、貯まりに貯まって落ちる事があります。少し前まで、再起動して解放していたが、コマンドラインでできるらしいので、やりかたを記録する。

## やり方

``` shell
$ free
...
$ sync
$ echo 3 > /proc/sys/vm/drop_caches
$ free
....
```
空コミットを作ってPRを出す（WIPのために）

## 参考
[空コミット便利！git commit --allow-emptyでgitを使った開発フローを改善 - fukajun - 僕はvimで行きます -](http://fukajun.org/25)

## 自分は下記のコメントにでもしようかな

`git commit --allow-empty -m "empty commit for make pull request"`

最終的にこのコミットは消してマージするし。
[Rails][Twilio]バリデーションリクエストを使う

## Twilioからのバリデーションリクエスト
要するに以下の様なときに使うやつです。

> （サーバが）受け取るHTTPリクエストが確かにTwilioからのものであり、不審な第三者からのものではないことを確実にしたい

詳細は[Twilioドキュメント](https://jp.twilio.com/docs/api/security#validating-requests)を御覧ください。

## やり方

### routes.rb を設定する

twilioからのリクエストを受けるルートは、何か適当なnamespaceをつけるのをオススメします。

```ruby:config/routes.rb
Rails.application.routes.draw do
  namespace :phone do
    post 'incoming', to: 'incoming#new', format: true
  end
end
```

### configを設定する

configにtwilioのAPIを使うためのキーを設定します。
（実際はソース上に直に書いたりはしないと思います）

```ruby:config/initializers/twilio.rb
Twilio.configure do |config|
  config.account_sid = 'account_sid'
  config.auth_token  = 'auth_token'
end
```

### application_controller.rb を書く

Twilio用のapplication_controller.rbを作成します。ここでvalidationをします。

```ruby:app/controllers/phone/application_controller.rb
class Phone::ApplicationController < ApplicationController
  protect_from_forgery with: :null_session
  before_action :validate_incoming_requests, if: -> { !(Rails.env.test? || Rails.env.development?) }

  RequestValidationError = Class.new(StandardError)
  rescue_from RequestValidationError, with: :handle_401

  private

  def validate_incoming_requests
    return unless request.post?
    validator = Twilio::Util::RequestValidator.new
    signature = request.headers['X-Twilio-Signature']
    fail RequestValidationError unless validator.validate(request.url, request.request_parameters, signature)
  end

  def handle_401
    render xml: reject_twiml, status: 401
  end

  def reject_twiml
    Twilio::TwiML::Response.new do |r|
      r.Reject reason: :busy
    end.text
  end
end
```

### Controller.rb を書く

ここではvalidationを意識する必要は有りません。
Twilio用のapplication_controller.rbを継承するのをお忘れなく。

```ruby:app/controllers/phone/incoming_controller.rb
class Phone::IncomingController < Phone::ApplicationController
  def new
　　# 本当はpostらしい処理を書く
    render xml: say_twiml
  end

  private

  def say_twiml
    Twilio::TwiML::Response.new do |r|
      r.Say 'It is fine today.'
    end.text
  end
end
```

### 注意点

#### namespaceに"twilio"を使わない

その名前はtwilio-rubyジェムで使われています。問題ないとは思いますが、避けるに越したことは有りません。また、大抵の場合はもっとアプリケーションに適した名前があります。

#### バリデーションの際にrequest.paramsを使わない

`request.params`を使うとvalidationが失敗します。`request.params`にはrailsで追加した`controller`や`action`などが含まれているからです。
なので、上記のソースでは`request.request_parameters`を使用しています。これはrailsで追加した値は含みません。

## 参考
[Railsのparamsからcontrollerとかpathに関係するパラメータを除きたい](http://qiita.com/sue738/items/7b3cccac9a2a02637e4f)
[Validate Incoming Requests - twilio-ruby](http://twilio-ruby.readthedocs.org/en/latest/usage/validation.html)
VivadoをGUIを使わずに実行するためのTclスクリプト達


#はじめに

Xilinx 社のFPGA開発環境の Vivado、いちいち GUI でマウスボタンをポチポチするのは面倒です。
Vivado は Tcl スクリプトでバッチ処理が出来るので、決まり切った仕事なら Tcl スクリプトを書いて処理させたほうが楽です。
この記事では、Vivado をGUIを使わずに実行するためのTclスクリプト達を紹介します。

#環境

 - Xilinx Vivado 2015.4
 - Xilinx Vivado 2016.4
 - Xilinx Vivado 2017.1
 - Xilinx Vivado 2017.2
 - Xilinx Vivado 2018.3
 - Xilinx Vivado 2019.1
 - Xilinx Vivado 2019.2 (Vitis)

#記事

- [「Vivado でプロジェクトを作る Tcl スクリプト」@Qiita](http://qiita.com/ikwzm/items/666dcf3b90c36d16a0ed)
- [「Vivado で論理合成と配置配線を実行するTclスクリプト」@Qiita](http://qiita.com/ikwzm/items/36e5911c155c8303b705)
- [「Vivado でハードウェア情報をエクスポートするTclスクリプト」@Qiita](http://qiita.com/ikwzm/items/057d67d4a9e0828663cf)
- [「Vivado でシミュレーションする Tcl スクリプト」@Qiita](https://qiita.com/ikwzm/items/d84e30e17214e8c888d8)
- [「Vivado SDK でZynq FSBL(First Stage Boot Loader)をビルドするTclスクリプト」@Qiita](http://qiita.com/ikwzm/items/e64f11844dd23bc6b90b)
- [「Vivado SDK でZynq FSBL(First Stage Boot Loader)をビルドするTclスクリプト(hsi編)」@Qiita](https://qiita.com/ikwzm/items/e09fab6b17986471cbda)
- [「Vivado(Vitis) で Zynq FSBL(First Stage Boot Loader) をビルドするTclスクリプト」@Qiita](https://qiita.com/ikwzm/items/165481921c3e984a9e70)
RstudioでRパッケージを作ってみる 3 ～パッケージ配布～

# 目次
1. [RstudioでRパッケージを作ってみる 1 ～自作関数を実行～ - Qiita](http://goo.gl/HKMem0)
2. [RstudioでRパッケージを作ってみる 2 ～マニュアル作成～ - Qiita](http://goo.gl/vCyszM)
3. RstudioでRパッケージを作ってみる 3 ～パッケージ配布～ - Qiita

# はじめに
前回まではRパッケージの自作関数とマニュアルを作成しました。
今回はそれを世の中に公開してみましょう。

流れとしては、

1. GitHubにソースコードをpush
2. Rstudioで、devtoolsパッケージのinstall_githubメソッドを使い自作パッケージをインストール
3. requireメソッドで自作パッケージを読み込み

となります。

# 1. GitHubにソースコードをpush

1. gitをあらかじめインストールしておきます。
2. あらかじめGitHubのアカウントを作成しておきます。 
3. GitHubで新しいレポジトリを作成します。名前はhelloworld10timesとします。
 ![11.png](https://qiita-image-store.s3.amazonaws.com/0/89145/df5db848-58fd-98ab-1507-5df65aa16195.png)
 1. ＋ボタンを押します。
 2. New repositoryを押します。
 3. 新規作成画面が開くので、Repository nameにhelloworld10timesと記入します。
 4. Create repositoryを押します。
1. 新しく作成したレポジトリに移動します。
2. レポジトリのurlを以下の手順で控えておきます。
 ![12.png](https://qiita-image-store.s3.amazonaws.com/0/89145/33faf108-f49a-8298-9785-893e50077f2e.png)
 1. HTTPSを押します。
 2. Copy to clipboardを押し、urlをクリップボードに控えておきます。
2. (ホームディレクトリ)/Helloworld/でGit bashを開きます。
3. 以下のコマンドをbashで入力します。

```git
git init 
git add .
git commit -m "first commit"
git remote add origin (さっき控えたレポジトリのurl)
git push -u origin master
```

レポジトリのページに移動し、ファイルがpushされているのが確認できたら成功です。

# 2. Rstudioで、devtoolsパッケージのinstall_githubメソッドを使い自作パッケージをインストール

Rstudioに戻りましょう。devtoolsというGitHubから直接パッケージをインストールできる超絶便利ツールを使って、自作パッケージを入れていきます。

```r
install.packages("devtools")
require(devtools)
install_github("(GitHubのユーザー名)/helloworld10times")
```

私のGitHubアカウントで試したい場合は、以下を入力してください。

```r
install.packages("devtools")
require(devtools)
install_github("Dixhom/helloworld10times")
```

# 3. requireメソッドで自作パッケージを読み込み

```r
> require(HelloWorld)
> hello()
[1] "Hello, world!"
[1] "Hello, world!"
[1] "Hello, world!"
[1] "Hello, world!"
[1] "Hello, world!"
[1] "Hello, world!"
[1] "Hello, world!"
[1] "Hello, world!"
[1] "Hello, world!"
[1] "Hello, world!"
```

これで無事GitHubからパッケージをインストールできました。既に全世界のユーザーがあなたのパッケージをダウンロードし使用できる状態です。

# おわりに
いかがでしたでしょうか？この記事をベースにして、皆さまが素晴らしいパッケージを開発して世の中に公開していければ幸いです。
ncでお手軽tcpプロキシ

# tl;dr

## 起動

```
# 8080に来たリクエストを192.168.59.103:8080に流す
# リクエスト保存先: outgoing.log
# レスポンス保存先: incoming.log
while :; do [[ -p fifo ]] || mkfifo fifo && nc -l 8080 < fifo | tee outgoing.log | nc 192.168.59.103 8080 | tee fifo > incoming.log; done
# ^Cで終了
```

# ユースケース
## Boot2Dockerでnginxを起動して手元のスマホからアクセス

```
# nginx起動してブラウザで確認
docker run -d --name nginx -p 8080:80 -v $DIR_PATH_DOCUMENT_ROOT:/usr/share/nginx/html:ro nginx

# プロキシ開始
while :; do [[ -p fifo ]] || mkfifo fifo && nc -l 8080 < fifo | tee outgoing.log | nc `boot2docker ip` 8080 | tee fifo > incoming.log; done

#### 別のシェルを開く
# ローカルホストでLISTENしていることを確認
netstat -anf inet | grep LISTEN | grep 8080

# ローカルホストのIPを確認
LOCAL_IP=`ifconfig en0 | grep "inet[^6]" | cut -d" " -f2`

# アクセス先アドレスを表示
echo http://$LOCAL_IP/
```
PCとスマホが同じLANに接続している必要があります。
PCのChromeで開けば、スマホのChromeの履歴から、PCで開いたアドレスを開くことが出来ます。

# 参考URL
http://notes.tweakblogs.net/blog/7955/using-netcat-to-build-a-simple-tcp-proxy-in-linux.html
バルスのタイミングを予測し、ゆっくり映画を楽しもうじゃないか

バルス祭りに参加すると、バルスをつぶやかなければならないという意味の分からない任務感から映画をゆっくり楽しめない。これは困ったものだ。なんとかならないか。

というわけで以前作ったスクリプトを流用してみよう。

バルスのタイミングは本編開始から１時間５５分５秒後であることが多い様子。
秒に変換すると6955秒だ。

commandを打つ時間的誤差など、どこからを本編とするかなど不確定要素は多いが思い切って本編が始まると同時に起動してみてはいかがだろうか。

```python:balstimer.py

#!/user/bin/env python
# -*- coding: utf-8 -*-
from requests_oauthlib import OAuth1Session
import sys, codecs
import threading

C_KEY = "***************************"
C_SECRET = "***************************"
A_KEY = "***************************"
A_SECRET = "***************************"


def Post_msg():
	url = "https://api.twitter.com/1.1/statuses/update.json"
	params = {
		"status": u"バルス！",
		"lang": "ja"
			}
	tw = OAuth1Session(C_KEY,C_SECRET,A_KEY,A_SECRET)
	req = tw.post(url, params = params)
	if req.status_code == 200:
		print u"目がぁあああ目がぁあああああああ"
	else:
		print req.status_code
	return Post_msg

t=threading.Timer(6955,Post_msg)
t.start()

```

＊尚このスクリプトを使ってバルスのタイミングがずれたとしても私は何の責任も負いません。

では、諸君らの健闘を祈る。
Re: Javascriptでデザインパターン (その7: Chain of Responsibility)

[Javascriptでデザインパターン (その7: Chain of Responsibility) - まめージェント](http://mame0112.hatenablog.com/entry/2015/08/05/025102)読んだ。委譲先での処理に非同期処理を含まないパターンなら、単純にユーザーインターフェース（client）に登録した処理器を順番に実行していったほうがシンプルだと思うし、

```js
var client = new Client(
    new TyepCheck
  , new MinLengthCheck(min_length)
  , new MaxLengthCheck(max_length)
  , new MainHandler
)

client.request(foo)
```

のような書き方の方が（自分には）わかりやすいかなと。

```js:client.js
function Client () {
    this.validators = [].slice.apply(arguments).filter(flt)
}
function flt (validator) {
    return 'function' === typeof (validator || {}).request
}

Client.prototype.request = function (input) {
    for (var i = 0; i < this.validators.length; i++) {
        this.validators[i].request(input)
    }
}
```

```js:type-check.js
function TypeCheck () {}

TypeCheck.prototype.request = function (input) {
    if ('string' !== typeof input)
        throw new TypeError('"input" must be "string"')
    return !0
}
```
```js:min-length-check.js
function MinLengthCheck (min_length) {
    this.min_length = min_length
}

MinLengthCheck.prototype.request = function (input) {
    if (this.min_length < input)
        throw new Error('too short')
    return !0
}
```
```js:max-length-check.js
function MaxLengthCheck (max_length) {
    this.max_length = max_length
}

MinLengthCheck.prototype.request = function (input) {
    if (this.max_length > input)
        throw new Error('too long')
    return !0
}
```
```js:main-handler.js
function MainHandler () {}
MainHandler.prototype.request = function (input) {
    console.log('validate ok - "%s"', input)
    return !0
}
```

実際に使ってみる

```js:main.js
var client = new Client(
    new TypeCheck
  , new MinLengthCheck(4)
  , new MaxLengthCheck(6)
  , new MainHandler
)

test()
test('lg')
test('looooog!!')
test('log')

function test (input) {
    try {
        client.request(input)
    } catch (err) {
        console.error(err)
    }
}
```
macにdocker+ubuntu16.04+scala+play環境を構築〜activator newするまで【メモ】

macに入れてたdocker+ubuntu環境にscala+play環境を作ろうと思ったら案外ハマったのでメモ。

# docker-machine createするところ注意

そのままdocker-machine createするとLinuxカーネルの問題でopenjdkが

```
Settingup ca-certificates java
```

と言って止まってしまうので注意が必要。

--engine-storage-driver overlay

を追加してやる。

```bash
$ docker-machine create --driver virtualbox --engine-storage-driver overlay development
```

# あとは普通にubuntuのdockerイメージ落としてきて構築する

## ubuntuのdockerイメージ落としてコンテナ起動

```bash
$ docker pull ubuntu:16.04

$ docker run -i -t ubuntu:16.04 /bin/bash
```

## 準備

apt-get updateしたり必要なパッケージ等入れたり

```bash
$ apt-get update

$ apt-get upgrade

$ apt-get install -y wget unzip
```

## openjdkインストール

せっかくなので最新の9を入れ てみる

```bash
$ apt-get install -y openjdk-9-jdk
```

## activatorインストール

activatorをダウンロードしてくる

ダウンロード先のURLはtypesafeの公式サイトを参照

https://www.typesafe.com/activator/download

```bash
$ cd ~

$ wget https://downloads.typesafe.com/typesafe-activator/1.3.7/typesafe-activator-1.3.7.zip?_ga=1.163036156.1734275637.1451899105

$ unzip typesafe-activator-1.3.7.zip?_ga=1.163036156.1734275637.1451899105
```

解凍したディレクトリを適当な場所に移動
※公式ページに、activator実行時にディレクトリに書き込むので、/optとか/usr/localの下はやめてねって書いてあるので別の場所に

```bash
$ mkdir ~/bin

$ mv activator-dis-1.3.7 ~/bin/
```

パス通す

```bash
$ echo "export PATH=\$PATH:~/bin/activator-dis-1.3.7" >> ~/.bashrc

$ source ~/.bashrc
```

activatorが動くか確認

```bash
$ activator --help
Getting com.typesafe.activator activator-launcher 1.3.7 ...
downloading file:/root/bin/activator-dist-1.3.7/repository/com.typesafe.activator/activator-launcher/1.3.7/jars/activator-launcher.jar ...
	[SUCCESSFUL ] com.typesafe.activator#activator-launcher;1.3.7!activator-launcher.jar (36ms)

〜略〜

Unable to open the docs in your web browser.  To open them manually navigate to:
file:/root/bin/activator-dist-1.3.7/README.html
 Did not detect an activator project in this directory.
 - activator
 Load an existing project (has to be executed from the project directory)
 or print this help message if no project is found

 Sub-commands
 - activator ui
 Open the project in the UI if executed from an existing project
 directory, otherwise open a project-creation UI.

 - activator new [project-name] [template-name]
 Create a new project, prompting for project-name if missing and helping you
 find a template if template-name is not provided.

 - activator list-templates
 Fetch the latest template list and print it to the console.
```

なにやらダウンロードが始まったけど、動いてはいるっぽい。

これでplayを使う準備終了。

引き続き、適当にアプリを作ってみる。

## PlayのScalaアプリを作る

とりあえずホームディレクトリの下に作ってみることにする。

```bash
$ cd ~

$ activator new tutorial play-scala

$ ls -ltr
total 8
drwxr-xr-x 3 root root 4096 Jan 15 02:48 bin
drwxr-xr-x 7 root root 4096 Jan 15 02:58 tutorial
```

作成完了**\\(^o^)/**
c++ builder > TProgressBar > 色を変えるのは難しいようだ

```txt:動作確認
C++ Builder XE4
```

関連 http://qiita.com/7of9/items/29af7af3c7b4bd47e909

TProgressBar のバーの色を変えようとして関連コードを実装してみたが変えれなかった。

http://stackoverflow.com/questions/8865606/how-to-change-the-colors-of-tprogressbar-background-progressbar-itself-to-a-c
によると
> but the Progress Bar color stays the default green (from the theme I assume). If you disable the themes for the app you can actually set BarColor/BackgroundColor

...
> PBM_SETBARCOLOR message: Remarks: When visual styles are enabled, this message has no effect.
開発している時困ったこと＋資料が少ないもののWatchKitTips

開発している時困ったこと＋資料が少ないものをピックアップして書いていきます。

#アニメーションなしの画面遷移を実装する

applewatchでの画面遷移はmodalとpresentの２つしかありません。なので、アニメーションなしの画面遷移ができません。
アニメーションなし画面遷移を行いたい場合は同一シーンに２つのシーンのアイテムを入れ込み表示・非表示させる方法を取る必要があります。私はそれぞれのシーンごとにグループを作り、そのグループにそのシーンに必要なものを入れ込みました。ただ、この方法であまり多くのシーンを詰め込むとプログラムが長くなるので注意が必要です。

#移動前のインターフェイスの関数を実行する方法

いわゆるシーンやビューと言われるものはAppleWatchではインターフェイスと呼びます。
別のインターフェイスに移動する時は

```swift
self.presentControllerWithName("ModalInterface", context: self)
```
で移動します。contextにはselfを入れて遷移先のインターフェイスに渡します。
受け取った方は

```swift
class ModalInterfaceController: WKInterfaceController
{
    var delegate: InterfaceController?
 
    override func awakeWithContext(context: AnyObject?)
    {
        super.awakeWithContext(context)
        self.delegate = context as? InterfaceController
        self.delegate?.tergetfunction()
    }
  
    @IBAction func test1Button()
    {  
        self.delegate?.tergetfunction()
        self.dismissController()
    }   
}
```

にします。これで、前のインターフェイスの関数が実行できます。

#インターフェイスのIDを調べる

どこかインターフェイスでエラーが起こっていてもインターフェイスのIDで書かれていて一体どのインターフェイスでエラーが起こっているか特定できません。
そういった時、以下のコードをどかに挿入すればインターフェイスのIDを確認できます。

```swift
if let vcID = self.valueForKey("_viewControllerID") as? NSString
{
        print("Page ID : \(vcID)")
}
```

また、インターフェイスと紐付けされたクラス名がわかると便利なので

```swift
if let vcID = self.valueForKey("_viewControllerID") as? NSString
{
        print("Class : \(NSStringFromClass(self.dynamicType))\nPage ID : \(vcID)")
}
```

とすれば調査しやすくなる。

#使用しているwatchが38mmか42mmか確認する

AppleWatchは画面サイズが38mmと42mmの２種類あるので画面によって文字サイズ等を変えたい時は不便です。画面サイズは確認できるのでそのサイズによってwatchのサイズを判定します。

```swift
let currentDevice = WKInterfaceDevice.currentDevice()
let bounds = currentDevice.screenBounds
// 38mm: (0.0, 0.0, 136.0, 170.0)
// 42mm: (0.0, 0.0, 156.0, 195.0)
 
if bounds.width > 136.0 {
     print("This is the big watch")
} else {
     print("This is the small watch")
}
```
SymfonyのFormでValidatorにmax_length(またはmin_length)を指定した場合、テキストエリアだと改行を2文字と判断されて困ってる人へ

## はじめに
どのWebシステムでもでしょうけど、テキストエリアに文字数制限をしている場合、入力した改行が2文字と判断されて、困ったことありませんか？
Windowsなどで改行を入力した場合、文字コードが￥ｒ￥ｎのためのようです。
バリデートクラスを修正すれば美しいのでしょうけど、sfValidatorStringで長さ判定しているから、それを継承しているバリデートクラスすべて直さなくちゃいけなくて面倒ですよね。。
そこで手っ取り早く実装する方法を紹介します。

## ソース
```php
class SampleForm extends sfFormSymfony
{
	public function configure()
	{
		//ウィジェット
		$this->setWidgets(array(
			'textarea1'	=> new sfWidgetFormInput(),
		));
		// バリデート
		$this->setValidators(array(
			'textarea1'	=> new sfValidatorString(array('required' => true,'max_length' =>100), array('required' => 'テキストエリア１を入力してください。','max_length' => 'テキストエリア１は100文字以内で入力してください。')),
		));
	}
	/**
	 * (non-PHPdoc)
	 * @see sfForm::bind()
	 * バリデート時にテキストフィールドの改行が長さ２と判定されるのを防ぐため、
	 * bindをオーバーライド
	 */
	public function bind($taintedValues = NULL,$taintedFiles = NULL){
		
		foreach(array_keys($taintedValues) as $key){
			if(!empty($taintedValues[$key])){
				$taintedValues[$key] = preg_replace('/\r\n/',"\n", $taintedValues[$key]);
			}
		}
		parent::bind($taintedValues,$taintedFiles);
	}
}
```
マルチスクリーン＋フルスクリーンでのドラッグアンドドロップを簡単にする

フルスクリーンにしていたXcodeにファイルをドラッグアンドドロップしていたのが、マルチスクリーン環境では出来なくなる。
方法としては、画面上部に何度かドラッグしているアイテムをコツコツぶつけるとMissionControlが出てくるのだが、とにかく時間がかかる。
解決方法としては、設定＞MissionControl＞ホットコーナー
から適当な角にMissionControlを指定すれば良い。
ホットコーナーにファイルをドラッグすればMissionControlが開くのでXcodeを選んでドロップすればいい。





…


**それでも面倒なんだけどね。**