OmniAICreator/Qiita-1.07M huggingface dataset:
ipython notebook(jupyter)をリモートから使う

#環境
Ubuntu 14.04 LTS
anaconda 3.19.0
python 2.7.X
#ipython notebookとjupyterとの関係
http://blog.jupyter.org/2015/08/12/first-release-of-jupyter/
今後、ipython notebookはjupyterになるということですかね。
今まで出ていたコマンドも置き換えるように推奨されてます。

#実行手順
1.profileの生成
profileは不要になったようです
2. notebook_config.pyファイルの生成
``jupyter notebook --generate-config``
でconfigファイル(~/.jupyter/jupyter_notebook_config.py)を作成。
3. ipythonを実行、下記のコマンドでパスワードのハッシュ値を生成
``    In [1]: from IPython.lib import passwd ``
``    In [2]: passwd() ``
ここでパスワードを打ち込むとハッシュ値が生成(sha1:XXXXXXX)されるので、
そちらをコピーして、テキストファイルなどに保存。
4. ~/.jupyter/jupyter_notebook_config.pyの末尾に下記を記載
``
    c.IPKernelApp.pylab = 'inline'
    c.NotebookApp.ip = '0.0.0.0'
    c.NotebookApp.open_browser = False
    c.NotebookApp.port = 9999
    c.NotebookApp.password = u'sha1:XXXXXXX（#先ほど保存したハッシュ値を記載）'
``
5. 実行
`` jupyter notebook & ``

これで、リモートクライアントのブラウザから
``http://<jupyter実行ホストのIP Address>:9999``
と打ち込むとipythonにアクセスできるようになります。
アクセス元を絞りたい時には,``c.NotebookApp.ip = ''``の部分を修正してください

##追記

Jupyter>5.7から

```
c.NotebookApp.ip = '*'
ではなく
c.NotebookApp.ip = '0.0.0.0'
にする必要があるそうです。
```

https://stackoverflow.com/questions/52706238/jupyter-throwing-error-socket-gaierror-errno-2-name-or-service-not-known
Javaのプログラムに機能を追加したいです。

Javaのプログラムに機能を追加したいです。
ヒントやアドバイスを頂けませんか！
import java.io.File;
import java.io.FileReader;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.util.Scanner;

class {
public static void main(String args[]){


String fileNeme=args[0];

try{    
String str;
File file=new File(fileNeme);


if(file.exists()){
System.out.println("ファイルは存在します。");
}else{
System.out.println("ファイルは存在しません。");
}

try{
while(true){

BufferedReader in = new BufferedReader(new FileReader(fileNeme));

while((str = in.readLine())!=null){
System.out.println(str);
}

try{
Thread.sleep(60000);
}catch(InterruptedException e){
;
}

in.close();
}
}catch(FileNotFoundException e){
System.out.println("ファイルは存在しません。");    
}
}catch(Exception e){
;
}
}
}
表示内容の更新タイミングを1分固定ではなく可変にする機能を追加したいです。
質問に対しての沢山の的確な回答をお待ちしております。宜しくお願いします
Zybo > out of context > 他のデザインと関係のないもの

```txt:動作環境
Vivado 2015.4 on Windows 8.1 pro(64bit)
```

Vivadoを使っていて出てきた"out of context"について調べた。
出現したのは Generate Output ProductsダイアログのSynthesis Optionsの項目。

[ug905 pdf](http://www.xilinx.com/support/documentation/sw_manuals_j/xilinx2012_4/ug905-vivado-hierarchical-design.pdf)

p7
> 残 り のデザ イ ン と関係のない孤立 <font color=red>(out of context)</font> ブ ロ ッ ク を合成 ま たは イ ン プ リ メ ン ト す る には、 ツ ールがout-of-context モー ド で実行される必要があ り ます。
社員情報のプログラム (JAVA)

社員情報のプログラム (JAVA)
プログラの機能 としては
(1)社員情報の追加 入力項目としては、社員番号、氏名(性、名)、生年月日(年、月、日) (3)で読み込んだ情報を追加する。 
(2)社員情報の表示( 
個別、一覧) 個別の場合は、社員番号をしていして1件表示 一覧の場合は、全ての情報を一覧で表示 表示例 社員番号 1 氏名 １ 生年月日 1年1月1日 
(3)社員情報の保存 追加された社員情報はファイルに保存する。 
※例外処理や重複処理などをする。

質問に対しての沢山のヒントやアドバイスや回答をお待ちしております。
宜しくお願いします
Zybo > [調査中] Remote IP > TODO:定義している資料を調べる

```txt:動作環境
Vivado 2015.4 on Windows 8.1 pro (64bit)
```

Vivadoを使っていて、古いバージョンのファイルからのUpgrade時に以下のメッセージが表示される。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/249e2127-76dc-9024-0cb0-da76da232482.png)

このメッセージにおいて「remote IP」という記載がある。

IP自体はわかっているつもりだが、remote IPの定義をしている資料にたどり着いていない。
CentOS 6 で C++11 に対応した g++ を使う

`npm install` したら、C++11 に対応している C++ コンパイラーでないとコンパイルが通らないモジュールがあったので、Software Collection から新しめの `g++` をインストールする。

```bash
$ sudo yum install centos-release-scl && \
  sudo yum install devtoolset-3-gcc-c++ && \
  scl enable devtoolset-3 bash
```

`which` で `g++` の場所を確認してみると、`/usr/bin/g++` ではなく、`/opt/...` 以下にあることが確認できる。
 
```bash
$ which g++
/opt/rh/devtoolset-3/root/usr/bin/g++
```

参考: [CentOS Announce ML へのポスト](https://lists.centos.org/pipermail/centos-announce/2015-December/021582.html)より
HTML5 Canvas 深度操作で注意すること

# まえがき
Flashプラットフォームによるhtml5 canvasでインスタンスの深度の入れ替えをする時に注意すること
# 現象
scriptで生成したインスタンスの深度の入れ替えとステージに配置したインスタンスの深度の入れ替えがうまくいかない場合がある。
## サンプル
勉強のために作成している「high and low」で検証
## 原因
インスタンスを格納する親要素にズレが生じているために、深度のパラメタにアクセスできずに入れ替えが出来ない。displayObject.parentで検証してみると違いがわかる。

※displayObject.parentに関しては以下にてご確認下さい
http://definitelytyped.org/docs/easeljs--easeljs/classes/createjs.container.html#parent

## 違い
stageに配置すると以下のようにインスタンスを生成してくれる。
以下は、勝った数をカウントしてくれるチップのインスタンスの配置部分。
<pre>
	this.MC_chip00 = new lib.MC_chip();
	this.MC_chip00.setTransform(113,364,1,1,0,0,0,20,20);
	this.MC_chip00.alpha = 0;
</pre>

以下はフレーム内にライブラリからインスタンスを生成する場合の配置部分。
- container[iii]になってるのはfor文でインスタンスを生成しているから。
- トランプの生成部分です。
<pre>
for (var iii = 0; iii < 52; iii++) {
	var objName = "";
		
		if (ii <= 9) {
			objName =  "container0" + iii;
			container[iii] = "container0" + iii;
		} else {
			objName =  "container" + iii;
			container[iii] = "container" + iii;
		}

	container[iii] = new lib.container();
	container[iii].name = objName;
	stage.addChild(container[iii]);
}
</pre>

現在の自分のソースは上記のようになっています。
それぞれのインスタンスをdisplayObject.parentで確認してみると、
- ステージに配置したチップのインスタンスは親要素はMovieClip
- スクリプトで配置したカードのインスタンスはstage

親要素が違うためにステージに配置したインスタンスとスクリプトで配置したインスタンスでは深度の操作ができません。なぜならば、深度操作するsetChildIndex()のメゾットには親要素をドットシンタックスで指定するからです。要するに親要素以下での操作になるので、親が同じでないと深度は操作しにくいということです。

# まとめ
今回の検証を通してスクリプトで深度を操作するインスタンスがある場合は最初からステージに配置するのではなく、ライブラリからの生成にまとめるのが良いように思いました。
なぜならば、検証した通り深度の操作がやりにくくなるからです。

ライブラリからインスタンスを生成する場合のコードスニペットのソースの生成は以下のように記述されます。
<pre>
var fl_MyInstance = new lib.LibrarySymbol();
this.addChild(fl_MyInstance);
</pre>
もちろん、このままでも使えるのですが、displayObject.parentで確認したスクリーンショットの通り親要素が違うことや、今回作っているコンテンツでは深度を操作するのにこのまま使うではうまく操作できなかったので、親要素の指定を「stage」に変えて使いました。

また、flashがコンパイルするjavascriptソースはフレーム毎にfunctionで切り分けられているので、htmlのStageをnewしている部分の変数を確認して確実に親要素を指定するのが、確実にパラメーターにアクセスしやすくなると思います。

createJSはstageをnewする時に空間をcreateJSとして区切っているので他のライブラリの関数とは干渉しないので、安心して操作できると思います。
バックアップシェルスクリプトver.1

#バックアップシェルスクリプト
rsyncコマンドを並べただけのバックアップシェルスクリプトサンプルです。
Cygwinなどで実行します。

```lang:backup01.sh
#!/bin/sh
echo "This program take backup..."
echo "bk01:WorkDrive to FileServer,and to BackUp_HDD_k"
echo "bk02:ShareData in fileServer to BackUp_HDD_Q"

#bk01:WorkDriveのファイルサーバーへのバックアップ
rsync -a -delete -v /cygdrive/w/ //192.168.01.01/share/\ 部署A_bk/w_drive

#bk01:WorkDriveのバックアップ（ToHDD:K）
rsync -a -delete -v /cygdrive/w/ /cygdrive/k/w_drive/

#bk02:ファイルサーバ内のShareDataのバックアップ
rsync -a -delete -v //192.168.01.01/share/ShareData/ /cygdrive/Q/ShareData_bk/
```

##やりたいこと
- "my_PC"(Cygwin環境)とLAN内にある"FileServer"の間で、バックアップをとりつとられつ。
- LAN内の通信量を減らすため差分バックアップを行いたい。
- コマンドラインでサクッと毎回実行したい

###ファイル構成
< my_PC(cygwin) >
w:WorkDrive
│workfiles...
└
k:BackUpDrive1(外付けHDDです)
│w_drive
└
q:BackUpDrive2(外付けHDDです)
│ShareData_bk
└

< FileServer >(アドレス192.168.01.01)
|share
    |部署A
        |w_drive

```language:シェルの指定
#!/bin/sh
```
バックアップのコードとは関係ないですが、動かすシェルプログラムを指定します。
例えばCygwinだと

```language:シェルの場所を調べる
$ echo $SHELL
/bin/bash
```

という風にシェルの場所が分かります。


```language:実行時のメッセージ
echo "This program take backup..."
echo "bk01:WorkDrive to FileServer,and to BackUp_HDD_k"
echo "bk02:ShareData in fileServer to BackUp_HDD_Q"
```

このスクリプトを起動したときにシェルにメッセージを表示させてみました。プログラムの動作が分かるように。


```language:バックアップコマンド
#bk01:WorkDriveのファイルサーバーへのバックアップ
rsync -a -delete -v /cygdrive/w/ //192.168.01.01/share/10\ 部署A_bk/w_drive
```

rsyncを利用して、差分バックアップを行っています。
rsyncのオプションは以下の通り
-a:フォルダのコピーを行い、リンクを相対的につくりなおし、ファイルのタイムスタンプ・編集権限は保ってコピーを行う。
-delete:2回目以降のバックアップの際、バックアップもとで削除されたファイルはバックアップ先でも削除する。
-v:rsyncが行う操作を表示させながら動かす。現在どのファイルをコピーしているのかという情報。

rsyncの文法

```
rsync [-オプション] [バックアップ元ディレクトリ/] [バックアップ先ディレクトリ/]
```

また、上記サンプルでバックアップ先に「\ 」（バックスラッシュ+スペース）はwindowsにおけるディレクトリ名に半角スペースを表しています。（共有フォルダ内はちゃんとシェルから指定しやすいフォルダ名にしてほしい！（まさかの☆とか★とかつけるのやめてほしい！！！orz））

Cygwinでネットワークドライブにアクセスするときは「//」をつけてアクセスします。

以上のシェルスクリプトをPC使わない時間に実行してます。

###課題など
- 1世代しかバックアップ取れてない
- 実際のところ、バックアップファイルの権限がオリジナルファイルと変わっている。winだといちいちファイルの権限を編集してから使用しないといけない。
Android Studioの電子メールアイコン除去

## 概要
![04b84fdf5aefadfe1d260daf8ee20bb2.jpg](https://qiita-image-store.s3.amazonaws.com/0/100141/0a7ba78e-682d-79b8-a438-c0f59a52f6d5.jpeg)  
「New project」作成後に「Add an activity」で「Blank Activity」を選択するとデフォルトで配置される画像右下の電子メールアイコンを除去します。  
筆者のAndroid Studioは1.4なので1.5や2.0は該当するか不明です。　　

## 手順1  
activity_main.xmlにあるFloatingActionButton要素をコメントアウトする。  
[![https://gyazo.com/950bd9d56f2f9a0c357cc26c73411ef8](https://i.gyazo.com/950bd9d56f2f9a0c357cc26c73411ef8.png)](https://gyazo.com/950bd9d56f2f9a0c357cc26c73411ef8)  
[![https://gyazo.com/5b9c66b02aa2670dac4df2fee445fd8a](https://i.gyazo.com/5b9c66b02aa2670dac4df2fee445fd8a.png)](https://gyazo.com/5b9c66b02aa2670dac4df2fee445fd8a)  

## 手順2  
MainActivity.javaの変更  
[![https://gyazo.com/00effc328c2457e35856c21171e6db86](https://i.gyazo.com/00effc328c2457e35856c21171e6db86.png)](https://gyazo.com/00effc328c2457e35856c21171e6db86)  
この箇所を削除してください。  

## 結果  
除去、完了。  
[![https://gyazo.com/dd68d83899a83aff4edfe2336e8ad74a](https://i.gyazo.com/dd68d83899a83aff4edfe2336e8ad74a.jpg)](https://gyazo.com/dd68d83899a83aff4edfe2336e8ad74a)
ofFBOのアンチエイリアス方法2つ


## 問題
### FBO内にofEnableSmooting()を記述しても以下の様にアンチエイリアスが効かない
![20151103170727.png](https://qiita-image-store.s3.amazonaws.com/0/104234/9ff40442-8625-a566-5cb4-9b76216159b3.png "20151103170727.png")




## 解決策

### 1.fbo.allocate()の第4引数を指定
　第4引数は、サンプル数らしい。大きくすればするほど綺麗になる。


```cpp
fbo.allocate(ofGetWidth(), ofGetHeight(), GL_RGB, 4);
```

結果
![20151103180107.png](https://qiita-image-store.s3.amazonaws.com/0/104234/e12ea367-73e0-a393-47c4-c30a7f4bf496.png "20151103180107.png")






### 2.加算合成を駆使
　描画したいコードの直前で、ofEnableBlendMode(OF_BRENDMODE_ADD)。描画が終わったらEnableAlphaBlendong()とofEnableSmoothing()。
<b>※oFでは、加算合成とスムージングは同時に効かない。その為、加算合成の前にofDisableSmoothing()を記述。</b>

```cpp
void ofApp::draw(){
      fbo.begin();
           ofDisableSmoothing();
           ofEnableBlendMode(OF_BLENDMODE_ADD);
           /*描画したいコード*/
           ofEnableAlphaBlending();
           ofEnableSmoothing();
      fbo.end();
}
```

結果
![20151103175137.png](https://qiita-image-store.s3.amazonaws.com/0/104234/c849faa3-23e7-6ae0-58b3-d61ed95bbde1.png "20151103175137.png")




コードを書く手間を考えたら、1の方が良さげ。

## 参考
[Anti-aliasing in OSX not working](https://forum.openframeworks.cc/t/anti-aliasing-in-osx-not-working/15901)
Qiita > 検索 > 要望 > コメントありの記事だけの絞込み機能が欲しい

Qiitaの過去の自分の記事で、コメントに参考となる情報をいただくことがある。

ソフト開発をしていく中で、ふと「あのコメントが参考になる」と思い出すことがあり、そのときにそのコメントをまた見たくなる。

例として
http://qiita.com/7of9/items/e03083db57cb5cb77ef8
にて @muro さんにいただいたコメントをふと思い出した。

その記事を探すのに要した時間はだいたい1分で以下の流れで見つけた。

1. 「たしかc#の記事だった」と思い出す
2. 「user:7of9 tag:c#」で検索
3. 一覧の中からコメント付きの記事を順番に確認

ソフト開発で色々な機能を実装していく中で、こういう参考情報の検索は繰り返し行う。そこでの検索時間を極力減らしたい。(今回の1分はまだ早いほうであるが)。

要望としては以下。

- 「検索オプション」に`commented:>0`としてコメントが1以上あるものを絞り込める機能

または

- コメントの有り・無しだけの追加オプションでも望ましい
PHP7で追加された戻り値の型指定とnull合体演算子の処理速度を簡単に計測してみた

php7で追加された以下の機能を処理速度の観点でざっくり計測してみました。

## 戻り値の型指定あり vs なし

以下のコードで実行してみました。
内容的には、固定の配列をただ返すだけの処理を用意して、
それを1,000,000回繰り返す感じです。

```php:test.php
<?php

function returnValueTest(): array
{
    return ['a' => 1, 'b' => 2];
}

function returnValueTest2()
{
    return ['a' => 1, 'b' => 2];
}

$time_start = microtime(true);

for ($i = 0; $i < 1000000; $i++) {
    returnValueTest2();
}

echo "型指定なし: " . (microtime(true) - $time_start) . PHP_EOL;

$time_start = microtime(true);

for ($i = 0; $i < 1000000; $i++) {
    returnValueTest();
}

echo "型指定あり: " . (microtime(true) - $time_start) . PHP_EOL;
```

一応外部要因を避けるため、3回実行することにしました。
結果は以下のとおり。

```bash
$ php test.php
型指定なし: 0.037658929824829
型指定あり: 0.046530961990356

$ php test.php
型指定なし: 0.038704872131348
型指定あり: 0.046653985977173

$ php test.php
型指定なし: 0.036046028137207
型指定あり: 0.046509981155396
```

誤差はあるものの、3回とも型指定なしの方が早かったです。
ちょっとした差ではありますが。

## null合体演算子 vs 三項演算子

こちらは、変数がnullの場合とnullじゃない場合で比較してみます。
 
```php:test2.php
<?php

$time_start = microtime(true);

$a['a'] = null;

for ($i = 0; $i < 1000000; $i++) {
   $test = $a['a'] ?? 'bbb';
}

echo "null合体演算子（変数がnull）: " . (microtime(true) - $time_start) . PHP_EOL;

$time_start = microtime(true);

for ($i = 0; $i < 1000000; $i++) {
    $test = isset($a['a']) ? $a['a'] : 'bbb';
}

echo "三項演算子（変数がnull）: " . (microtime(true) - $time_start) . PHP_EOL;

$a['a'] = 'aaa';

for ($i = 0; $i < 1000000; $i++) {
   $test = $a['a'] ?? 'bbb';
}

echo "null合体演算子（変数がnullじゃない）: " . (microtime(true) - $time_start) . PHP_EOL;

$time_start = microtime(true);

for ($i = 0; $i < 1000000; $i++) {
    $test = isset($a['a']) ? $a['a'] : 'bbb';
}

echo "三項演算子（変数がnullじゃない）: " . (microtime(true) - $time_start) . PHP_EOL;
```

同じように3回実行。

```bash
$ php test2.php
null合体演算子（変数がnull）: 0.02905797958374
三項演算子（変数がnull）: 0.025825023651123
null合体演算子（変数がnullじゃない）: 0.056265115737915
三項演算子（変数がnullじゃない）: 0.037871122360229

$ php test2.php
null合体演算子（変数がnull）: 0.029461860656738
三項演算子（変数がnull）: 0.026993036270142
null合体演算子（変数がnullじゃない）: 0.058942079544067
三項演算子（変数がnullじゃない）: 0.035118103027344

$ php test2.php
null合体演算子（変数がnull）: 0.031913995742798
三項演算子（変数がnull）: 0.025876045227051
null合体演算子（変数がnullじゃない）: 0.058606147766113
三項演算子（変数がnullじゃない）: 0.036854028701782
```

こちらはどちらにしても三項演算子がやや早いようです。
特に変数がnullでない場合に差がつきました。

##　結論
どちらにしても大きな差ではないようなので、よほどのことがない限り、処理速度を気にして使う、使わないを判断する必要はなさそうです。
vagrantのコマンドをバッチファイル化＋Windowsのシャットダウン時に自動でvagrant halt

vagrant upとか毎回打つのが面倒なので、バッチファイルにしました。

#環境
Windows 7 Professional
VirtualBox 5.0.10
Vagrant 1.7.4

##vagrantのコマンドをバッチファイル化

```:vagrant_up.bat
cd /d %~dp0
vagrant up
exit
```

一行目のコマンドで、バッチファイルが存在するディレクトリにcdします。
立ち上げが終わったら、exitを最後に書いているので、ウィンドウを閉じます。

このファイルをVagrantfileと同じ階層に置いておけば、バッチファイルをダブルクリックでvagrant upです。

```:vagrant_halt.bat
cd /d %~dp0
vagrant halt
exit
```

このファイルも、Vagrantfileと同じ階層に置いておきます。

##Windowsのシャットダウン時に自動でvagrant halt

vagrantがupしたまま、うっかり再起動とかしてしまわないように、Windowsのシャットダウン時に上記のvagrant_halt.batが実行されるようにします。

1. スタートメニューの「ファイル名を指定して実行」に**gpedit.msc**と入力してOKでグループポリシーが起動する。
2. コンピューターの構成→Windowsの設定→スクリプト（スタートアップ/シャットダウン）と開いてシャットダウンをダブルクリック。
3. 追加ボタンを押してスクリプトのところに以下を設定。

`C:\vagrant\[ファイルのパス]\vagrant_halt.bat`

これでちょっと幸せ。

（追記：2016-01-26）
上記の形では、Windowsのシャットダウン時のvagrant haltはうまく行えませんでした。
VirtualBoxが先に終了してしまい、vagrant haltが実行できない模様。
別案にて問題なく動作することが確認できましたので、別途記事にまとめます。
phantomjs/casperjsによるキャプチャー自動化

PhantomJs/CasperJsによるキャプチャー自動化を行います。
スマートフォン端末やタブレット端末など多様化するデバイスに対して、上手くキャプチャーが取れない、大量のページをキャプチャーするのに膨大な労力がかかるといった問題を解決できます。
間違った認識、より効率的な記述等あればご指摘頂ければ幸いです。

#環境構築（インストール）
####***macの場合***
1.パッケージ管理ツール[homebrew](http://brew.sh/index_ja.html)をインストール。ターミナルで下記のコマンドを叩きます。
`ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"`

2.phantomjs/casperjsをインストールします。
`brew install phantomjs
brew install casperjs --devel`
※「--devel」がない場合casperバージョンによりphantomjsがサポートされておらず、実行してもエラーになることがあります。

3.正常にインストールされているかバージョンを確認。バージョンが表示されればOK
`phantomjs -v
casperjs --version`

#キャプチャースクリプト作成
今回作成するスクリプトは配列からキャプチャーするURLと保存名を読み込むシンプルな構成で作成します。
ファイル名は「listcap.js」として下記のjsファイルを作成しました。

```
// ----- URLと保存名を指定 ----- 
var links = [
	["http://sample.com","sample.jpg"],
	["http://sample.com/hoge/","sample_hoge.jpg"],
	["http://sample.com/hoge/fuga/","sample_hoge_fuga.jpg"],
	["http://sample.com/hoge/fuga/foo.html","sample_hoge_fuga_foo.jpg"]
];

// ----- キャプチャー遅延 ----- 
var waitTime = 2000;

// ----- ベーシック認証 ----- 
var basicId = "";
var basicPass = "";


// ----- デバイスの切り替え（コメントアウトで切り替え） ----- 
// ----- iPhone -----
// var width = 320;
// var height = 568;
// var ua = "Mozilla/5.0 (iPhone; CPU iPhone OS 8_0_2 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Version/8.0 Mobile/12A405 Safari/600.1.4";

// ----- iPad -----
//var width = 768;
//var height = 1024;
//var ua = "Mozilla/5.0 (iPad; CPU OS 8_0_2 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Version/8.0 Mobile/12A405 Safari/600.1.4";

// ----- safari,crhome -----
 var width = 1280;
 var height = 900;
 var ua = "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.63 Safari/537.36";



// ----- スクレイピング実行 ----- 
var casper = require('casper').create();
casper.start();
casper.userAgent(ua);
casper.viewport(width, height);
casper.setHttpAuth(basicId, basicPass);

casper.each(
	links,
	function(self,link){
		var url =link[0];
		var file =link[1];
		self.thenOpen(url, function () {
			this.echo("captur page title:"+this.getTitle());
		});

		self.wait(waitTime,function(){
			self.capture(file);
		});
	});

casper.run();
```

#ファイルの実行
ターミナル（コマンドプロント）で作成したlistcap.jsのディレクトに移動し下記コマンドを実行。
`casperjs listcap.js`
キャプチャーされた画像が同ディレクトリに生成されます。
##注意点
phantomjsではキャプチャーされる際、透過で生成するようになっているため、bodyにbackground-colorが指定されていないサイトは背景が黒くなってキャプチャーされてしまいます。
修正するにはphantomjs側での追記`page.evaluate(function() {document.body.bgColor = 'white';});`が必要なためcasper側での調整は難しそうです。
[参照：公式サイト](http://phantomjs.org/faq.html)

上記の背景が黒でキャプチャーされる事象につきまして[【続】phantomjs/casperjsによるキャプチャー自動化](http://qiita.com/hika09/items/57df95ab831be245ec43#_reference-d83f6b043db353e1727f)でjqueryを使用し修正する方法を掲載いたしました。
よければこちらもご覧ください。
bowerさんinstall時にroot権限だと怒られる。

その通りです。
rootでやんじゃねーよ。ってそのとおりなんです。

でも全く環境設定をしていないので、
今だけ許して、いまだけ。。。
（´・ω...:.;::..（´・;::: .:.;: ｻﾗｻﾗ.

ということで以下のようなエラーが出ました。

```bash
# bundle exec bower install
bower ESUDO Cannot be run with sudo
```

本番運用だったら切れられてもおかしくないことですが、
まあそんなことは置いといて、

```bash
# cd $RAILS_ROOT  ### railsを使用しているため、プロジェクトパスへ移動しているとします。
# cat .bowerrc
{ "allow_root": true }
```

cf: https://groups.google.com/forum/#!topic/kurento/jL22zeJ1XmI


いざゆかん！

```bash
# bundle exec bower install
[snip]
eventemitter2#0.4.14 bower_components/eventemitter2

d3#3.5.0 bower_components/d3
```

行けたっぽい。

ユーザ設計はしっかりやりましょう。
という基本的な話は置いといて、とりあえず出来ました。
node centos6.7 えらる

以下のコマンドを実行した所、エラッタ。

```bash
$ npm install .

make: *** [Release/obj.target/validation/src/validation.o] エラー 1
make: ディレクトリ `/usr/lib/node_modules/node-inspector/node_modules/ws/node_modules/utf-8-validate/build' から出ます
gyp ERR! build error
gyp ERR! stack Error: `make` failed with exit code: 2
gyp ERR! stack     at ChildProcess.onExit (/usr/lib/node_modules/node-gyp/lib/build.js:267:23)
gyp ERR! stack     at ChildProcess.emit (events.js:98:17)
gyp ERR! stack     at Process.ChildProcess._handle.onexit (child_process.js:820:12)
gyp ERR! System Linux 2.6.32-573.12.1.el6.x86_64
gyp ERR! command "node" "/usr/lib/node_modules/npm/node_modules/node-gyp/bin/node-gyp.js" "rebuild"
gyp ERR! cwd /usr/lib/node_modules/node-inspector/node_modules/ws/node_modules/utf-8-validate
gyp ERR! node -v v0.10.36
gyp ERR! node-gyp -v v0.10.6
gyp ERR! not ok
```

ココらへんを参照すると
https://github.com/nodejs/nan/issues/414#issuecomment-131756213

```bash
$ npm -g install npm
```
を入れろとのこと。

```bash
$ npm install .
```

よしよし入った。
npmは詳しく無いけど、
システムに入れなきゃいけないのかーという感想でした。
今年に入ってから地味にエラーをひくな。。。
IntelliJ IDEA の Spring サポート - Autowired 補完

IntelliJ 使っていたら、今まで使ってなかった便利な機能に気がついたのでメモ。

# 環境

- Mac OS X Yosemite 10.10.3
- IntelliJ IDEA 15.0.2
- Spring Boot 1.3.1.RELEASE

# 操作

オートワイアリング可能なコード上で、`Command + N` を入力する。
[Generate] メニューが表示されるので、`@Autowired Dependency..` を選択する。
<img width="211" alt="スクリーンショット 2016-01-19 19.41.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/47993/0fe34eea-4952-c816-7140-afcaebed6409.png">

すると、このようにオートワイアリング可能なオブジェクトの一覧が表示されるのである。
<img width="732" alt="スクリーンショット 2016-01-19 19.42.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/47993/6a682c80-1d13-cd1a-ffc7-9a1ffac9eea9.png">

オブジェクトを選択して [OK] すると、フィールドインジェクションにより、オートワイアリングをおこなうコードが自動生成される。

これでいろんなファイルを行ったりきたりしなくても、依存解決ができる！
openFrameworks-コンソール表示する

　以下が2つがopenFrameworksでのコンソールの表示方法。oFというかC++ですね。

+ printf
+ cout

<b>printf</b>は変数の型など配慮する点が多く、ゆるく使える<b>cout（読み：シーアウト）</b>を使った方がいいかもしれない。
## 1.printf出力
変数の型を考慮する必要がある。
改行は\n

```cpp
//入力
    int num = 10;
    float fnum = 20.0;
    string username = "John";
    char str[255] = "Hello World";
    
    printf("[1] %i \n", num);
    printf("[2] %f \n", fnum);
    //c_str()は、string型からchar型に戻すときに使う関数です。
    printf("[3] %sは%i歳です。\n", username.c_str(), num);
    printf("[4] %s", str);
```

```cpp
//出力
[1]10
[2]20.000000
[3]Johnは10歳です
[4]Hello World
```








## 2.cout出力
型を考慮しないで出力できるのでprintfより楽
coutでは、endlで改行を行う。

```cpp
//入力
    int num = 10;
    float f_num = 20.333333333;
    string username = "John";
    char str[255] = "Hello World";
    
    cout<<"[1]"<<num<<endl;
    cout<<"[2]"<<f_num<<endl;
    cout<<"[3]"<<username<<"は"<<num<<"歳です"<<endl;
    cout<<"[4]"<<str<<endl;
```

```cpp
//出力
[1]10
[2]20.3333
[3]Johnは10歳です
[4]Hello World
```



coutいいよね。
sqlalchemy 複雑な範囲指定を動的にfilterする


## 概要

* 複雑な範囲指定のクエリをsqlalchemyで発行するメモ


## やりたいこと

```py3
age = (10, 20, 30, 50, 60, )
```

みたいなリクエストが来た時に

```sql
SELECT *FROM hoge WHERE age >= 0 AND age < 10 or age >= 30 AND age < 40;
```

こういう AND とか OR が複雑になってる感じのやつを発行したい。

```py3
from sqlalchemy import or_, and_
query   = session.query(Models())
filters = []
for a in age:
    filters.append(and_(Models.age >= a, Models.age < a + 10))

query.filter(or_(*filters)).all()
```

よく考えればわかるんだけどメモ
Xcodeのプロジェクト全体(ソースコード)を検索し、置換する方法

#Xcodeのプロジェクト全体(ソースコード)を検索し、置換する方法

自分は知らなかったので書き記します



まずプロジェクト全体で検索する画面を表示し、**Find** をクリック
![スクリーンショット 2016-01-19 17.47.52.png](https://qiita-image-store.s3.amazonaws.com/0/88925/2d69aff0-2e8a-5e23-477c-91b250d93ad9.png)

**Replace**→**Text**→**Containig**（ここで自分の条件に合う設定を選択）
![スクリーンショット 2016-01-19 17.45.15.png](https://qiita-image-store.s3.amazonaws.com/0/88925/afa714f2-8b54-4d6a-673f-49f9f0da8d65.png)


検索文字のテキストボックスと置換文字のテキストボックスが表示される
検索文字と置換文字を入力する
![スクリーンショット 2016-01-19 17.46.00.png](https://qiita-image-store.s3.amazonaws.com/0/88925/c3ea47df-db34-0750-6ed0-a87ba2d4c2d7.png)

**Replace All**をクリックで全て置換
**Preview**をクリックで置換する項目の設定し
**Replace**クリックで設定した項目が置換されます
![スクリーンショット 2016-01-19 17.46.40.png](https://qiita-image-store.s3.amazonaws.com/0/88925/8edb57bb-3e84-f077-1a25-d32fec229d05.png)
WinAppDev > 不正なフォルダ名 > フォルダ名変更時に"/"入力すると(ファイル名に対する)不正文字を表示することができる

サブフォルダを設定できるソフトを作っているとき、実際にどうゆうフォルダが不正か気になった。

### 知っている例
自分が知っている例として

- フォルダ名の途中に空白を入れる
  - そのフォルダのテキストをOutlook 2013でメール送信すると、メール受信者がそのリンク先をダブルクリックで開こうとしても、情報が空白部分までしか認識されずエラーとなる

### Stackoverflowの投稿

[SO](http://stackoverflow.com/questions/1976007/what-characters-are-forbidden-in-windows-and-linux-directory-names)

> The easy way to get Windows to tell you the answer is to attempt to rename a file via Explorer and type in / for the new name. 
...

エクスプローラにてフォルダ名変更として"/"を入力したら以下のようなメッセージが表示されるとのこと。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/564b29ea-b38a-a0e8-0097-79fa6bad5275.png)

上は「フォルダ名」でなく「ファイル名」での注意だが、フォルダの場合は上記に合わせてドット(.)も禁止しておくのがよさそうだ。

<hr>
(追記 2017/06/13)

@muroさんの[コメント](http://qiita.com/7of9/items/9aa82ce970c2898da5d0/#comment-004ed69186ec10634924)にて禁止文字についえ教えていただきました。

情報感謝です。

### 検索用キーワード
(2019-01-29追記)

- 無効文字
gitでブランチ間の差分ファイルを抽出

##はじめに

ソースコードの管理にgitを導入していても、案件によっては本番化とは連携しておらず、差分ファイルだけ必要になる事がよくあります。

コミットを指定して差分を抽出する方法は利用していたのですが、そもそも細かくコミット間の差分を抽出する必要性があまりなかったので、ターミナルから簡単にブランチの差分ファイルだけまとめてzipで抽出する方法をまとめてみました。

なお、今回紹介するやりかたは、選択中の作業ブランチとmasterブランチ間になります。

##基本のコマンド

とりあえず使いたい時はこれ。

```bash
git archive --format=zip --prefix=_diff/ HEAD `git diff master --diff-filter=ACMR --name-only` -o _diff.zip
```

良記事をよく見かけるので、`git archive`の細かい説明は省きますが、これで現在のブランチとmasterブランチを比較して、差分を`_diff.zip`に纏める事ができました。

###削除ファイルがあったときのエラー対策

削除したファイルがあるとエラーになってしまうので、`--diff-filter`オプションで抽出ファイルを絞ることで削除ファイルを除外しています。
とりあえず以下で事足りていますが、場合によっては修正が必要かも。

**A** : 追加
**C** : コピー
**M** :修正
**R** :リネーム

なお、削除ファイルは、**D**なので、必要であれば削除ファイルだけのリストも取得できます。

```bash
git diff master --diff-filter=D --name-only
```

##functionにして使うと楽

毎回オプション付きのコマンドを打つのが面倒くさいので、実際は、`.bash_profile`（ここで良いのかな）にfunctionを追加して利用しています。
ローカルリポジトリのルートのディレクトリで実行する必要があります。
こちらでは解凍時に扱いやすくするため、zip内に格納されるディレクトリ名を`_diff`ではなく、ローカルリポジトリのディレクトリ名で格納するようにしました。

bashで動作確認済み。
（daそれはdiff archiveの略）

```bash
function gitda() {
BASENAME=$(basename `pwd`)
git archive --format=zip --prefix=${BASENAME}/ HEAD `git diff master --diff-filter=ACMR --name-only` -o _diff.zip
}
```



## 使い方まとめ

1. `.bash_profile`等にfunctionを追加。
2. ターミナルでdiffを取りたいディレクトリへ移動し、masterとの差分を取りたいブランチになる。
3. `gitda`を実行。
4. 実行したディレクトリに`_diff.zip`が出来上がっていれば完了。

ちなみに、functionの中身だけ.shファイル化してSouceTreeのカスタムアクションに登録しても使えました。お好みでご利用頂ければ幸いです。
babel, babelify, browserify でブラウザアプリで環境変数を process.env から使うには

babel v5.8.23, babelify v7.1.0, browserify v11.2.0 で、ブラウザアプリで環境変数を process.env から使うのに、[babel-plugin-transform-node-env-inline](https://github.com/babel/babel/tree/master/packages/babel-plugin-transform-node-env-inline) v6.3.13 を導入しました。


gulp タスクのサンプルです。

```.javascript
  var bundler = browserify({
    // required watchify args
    cache: {}, packageCache: {},
    // Browserify options
    entries: [HOGE],
    debug: true
  })
  .transform(babelify, {plugins: "transform-node-env-inline", presets: ["es2015", "react", "stage-2"]})
  .transform(browserifyShim);
```

### URL

- https://github.com/babel/babel/tree/master/packages/babel-plugin-transform-node-env-inline
emacs設定メモ（随時追加していく）

;;; *.~ とかのバックアップファイルを作らない
(setq make-backup-files nil)
;;; .#* とかのバックアップファイルを作らない
(setq auto-save-default nil)
;;; インデントを半角スペース4つに
(setq-default tab-width 4 indent-tabs-mode nil)
;;; カーソルを点滅
(blink-cursor-mode t)
;;; menu-bar を非表示
(menu-bar-mode 0)
;;; 拡張子 .ctp も php-mode で開く
(add-to-list 'auto-mode-alist '("\\.ctp$" . php-mode))
;;; モードラインに行番号と列番号を表示
(line-number-mode t)
(column-number-mode t)
文字化けを起こしたファイルのリネーム方法

#概要
文字化けしているファイルはファイル名を指定できないのでinode番号でファイルを特定する必要がある

##inode番号を確認する
### ls

| オプション   | 説明                  |
|:---------   |:----------------------|
| -l          |ファイルの詳細を表示する |
| -i / -inode | inode番号を表示する    |

```
ls -li
合計 89096
539049 -rw-r--r--. 1 root root 78038486 1月 17 18:14 2016 ?X?b?L??????Java???????H??.zip
656486 drwxrwxr-x. 2 normaluser normaluser 4096 1月 17 18:17 2016 ?X?b?L????????Java?????+?H??
```

##findコマンドのコマンド実行オプションを使ってファイル名変更
###find
| オプション    | 説明                  |
|:-------------|:----------------------|
| -ok cmd \;   |検索結果に対してコマンドcmdを実行する(実行前にユーザーに問い合わせする)
| -exec cmd \; |検索結果に対してコマンドcmdを実行する(実行前にユーザーに問い合わせしない)
| {}　　　　    |コマンド結果を挿入する位置を指定する

```
find . -inum 539049 -ok mv '{}' zissen.zip \;
find . -inum 656486 -ok mv '{}' zissen \;
```

##実行結果

```
ls -l
合計 89096
drwxrwxr-x. 2 normaluser normaluser     4096  1月 17 18:17 2016 zissen
-rw-r--r--. 1 root root 78038486  1月 17 18:14 2016 zissen.zip
```
error messageの例 > The folder name is invalid. Please enter a valid target folder.

サブフォルダ名を入力するコンポーネントにおいて`.`のような不正なものを入力されたときにエラーとしたい。

以下の例を見つけた。

https://msdn.microsoft.com/ja-jp/aa245007
> The folder name is invalid. Please enter a valid target folder.
...
> The path supplied for the deployment target is not standard.

> <font color=red>Confirm that there are no parentheses, wildcards, or other non-standard characters in the deployment target path</font>. The path needs to be a full path, conforming to DOS path standards.
pass_persist用のシェルスクリプト


net-snmpのpass_persistのサンプル。

```bash:/root/a.sh
#!/bin/sh

function func_get () {
    if [ "$1" = '.1.3.6.1.4.1.99999.0.1' ]; then
        echo $1
        echo 'integer'
        echo '1'
    elif [ "$1" = '.1.3.6.1.4.1.99999.0.2' ]; then
        echo $1
        echo 'integer'
        echo '2'
    elif [ "$1" = '.1.3.6.1.4.1.99999.0.3' ]; then
        echo $1
        echo 'integer'
        echo '3'
    elif [ "$1" = '.1.3.6.1.4.1.99999.0.4' ]; then
        echo $1
        echo 'integer'
        echo '4'
    else
        echo 'NONE'
    fi
}

function func_getnext () {
    if [ "$1" = '.1.3.6.1.4.1.99999' -o "$1" = '.1.3.6.1.4.1.99999.0' ]; then
        echo '.1.3.6.1.4.1.99999.0.1'
        echo 'integer'
        echo '1'
    elif [ "$1" = '.1.3.6.1.4.1.99999.0.1' ]; then
        echo '.1.3.6.1.4.1.99999.0.2'
        echo 'integer'
        echo '2'
    elif [ "$1" = '.1.3.6.1.4.1.99999.0.2' ]; then
        echo '.1.3.6.1.4.1.99999.0.3'
        echo 'integer'
        echo '3'
    elif [ "$1" = '.1.3.6.1.4.1.99999.0.3' ]; then
        echo '.1.3.6.1.4.1.99999.0.4'
        echo 'integer'
        echo '4'
    else
        echo 'NONE'
    fi
}

while [ 1 ]
do
    read line || exit 1
    if [ "$line" = 'PING' ]; then
        echo 'PONG'
    elif [ "$line" = 'get' ]; then
        read oid || exit 1
        func_get $oid
    elif [ "$line" = 'getnext' ]; then
        read oid || exit 1
        func_getnext $oid
    else
        echo "NONE"
        exit 1
    fi
done

```

snmpd.confに
pass_persist .1.3.6.1.4.1.99999 /root/a.sh
を記述し、snmpdを再起動。

<pre>
[root@localhost ~]# /etc/init.d/snmpd restart
Stopping snmpd:                                            [  OK  ]
Starting snmpd:                                            [  OK  ]
[root@localhost ~]# snmpget -v 1 -c public localhost .1.3.6.1.4.1.99999.0.1
SNMPv2-SMI::enterprises.99999.0.1 = INTEGER: 42
[root@localhost ~]# snmpwalk -v 1 -c public localhost .1.3.6.1.4.1.99999.0.1
SNMPv2-SMI::enterprises.99999.0.1 = INTEGER: 42
[root@localhost ~]#
</pre>
Docker Registry 2.0


いつの間にか [registry 2.0] になっていましたので [過去の記事] を2.0で書き直し。


## 環境

* Amazon Linux (ami-383c1956)
* Docker version 1.9.1, build a34a1d5/1.9.1
* ``su``, ``sudo`` は省略してます


## registryを起動する

registry自体がdocker imageで提供されています。
↓はregistryにpushしたデータを ``-v `pwd`/data:/var/lib/registry`` optionでホスト側にマウントしてます。

```
$ docker run -d -p 5000:5000 --name registry \
      -v `pwd`/data:/var/lib/registry \
      registry:2
```


## 使い方

基本は [Docker Hub] と同じ。イメージ名の前にURLとPORT ``<your.server.address>:<port>/`` を付けます。

取得 (pull):

```
$ docker pull <your.server.address>:<port>/namespace/yourimage:tag
```

保存 (push):

```
$ docker tag namespace/yourimage:tag <your.server.address>:<port>/namespace/yourimage:tag
$ docker push <your.server.address>:<port>/namespace/yourimage:tag
```


## 実際に試してみる

[Docker Hub] から ``centos`` imageをpullしてregistryにpushしてみます。

> 簡単の為、registryもdockerホストもlocalhostで動かします

```
$ docker pull centos
```

registryに ``centos`` imageをpushする。 (tag付けが必要)

```
$ docker tag centos localhost:5000/centos
$ docker push localhost:5000/centos
```

registryからpullしてみる。

```
$ docker pull localhost:5000/centos
```


## HTTP (insecure) で通信する

dockerはregistryに対し標準でSSL通信をするので、SSLの設定をしていない場合エラーになります。

```
Using default tag: latest
Error response from daemon: unable to ping registry endpoint https://<your.server.address>:<port>/v0/
v2 ping attempt failed with error: Get https://<your.server.address>:<port>/v2/: tls: oversized record received with length 20527
 v1 ping attempt failed with error: Get https://<your.server.address>:<port>/v1/_ping: tls: oversized record received with length 20527
```

docker起動時のOPTIONに ``--insecure-registry <your.server.address>:<port>`` を追加して、HTTPで通信させます。

```/etc/sysconfig/docker
# Additional startup options for the Docker daemon, for example:
# OPTIONS="--ip-forward=true --iptables=true"
# By default we limit the number of open files per container

OPTIONS="--default-ulimit nofile=1024:4096 --insecure-registry <your.server.address>:<port>"
```

dockerを再起動する。

```
$ service docker restart
```


[Yusuke Kawatsu]:https://bitbucket.org/megmogmog1965
[registry 2.0]:https://docs.docker.com/registry/
[Docker Hub]:https://docs.docker.com/userguide/dockerrepos/
[過去の記事]:http://qiita.com/megmogmog1965/items/0c9a95bcf7f054f5c065
はじめてのGo言語 - revel導入編 - 　

[はじめてのGo言語 -インストール〜nginx導入まで-](http://qiita.com/maruo327/items/59c9c1252739d47d9dd4)の続きです。
今回は、フレームワークを導入したいと思います。
色々とフレームワークはあるみたいですが、初心者には[revel](https://revel.github.io/)が良いのかなーと（記事がいっぱいあるのでｗ）

# revelの導入
パッケージ管理ができる`go get`を使って取り込みます。

## GOPATHの指定
go getのパスを通していない場合は通して下さい。

```
export GOPATH=$HOME/go
```

## revelをインストール

```
go get github.com/revel/revel
go get github.com/revel/cmd/revel
```

## revelコマンドでアプリケーション作成
 - revelコマンドが使えるようにパスを設定します。

```
export PATH="$PATH:$GOPATH/bin"
```

```
$ revel help
~
~ revel! http://revel.github.io
~
usage: revel command [arguments]

The commands are:

    new         create a skeleton Revel application
    run         run a Revel application
    build       build a Revel application (e.g. for deployment)
    package     package a Revel application (e.g. for deployment)
    clean       clean a Revel application's temp files
    test        run all tests from the command-line

Use "revel help [command]" for more information.
```
- アプリケーション作成

```
$ revel new test
```

# nginxにて作ったアプリケーションを動かしてみる
nginxの設定を変更します。

```xxxx.conf
server {
    listen       80;
    server_name  example.com;

    location / {
        # プロキシ
        proxy_pass      http://127.0.0.1:9000;
    }
}
```
保存したら再読み込み

```
$ /etc/init.d/nginx reload
```

revelコマンドでrunする

```
$ revel run test
```

ページを読み込むと表示されました。

# HTMLやらCSSを配置して表示させてみる。
会社のHPの素材を置いてみる。
 - viewsフォルダの中のIndex.htmlを上書き
 - publicフォルダ配下にcss,js,imgを配置

![スクリーンショット 2016-01-17 18.47.57.png](https://qiita-image-store.s3.amazonaws.com/0/45949/7037516b-5bb0-3a2d-4d9b-025329a13558.png)
↑こんな感じで表示されました。（注：ページの一部です）

# 次回は...
やっとこさ、このHPにある「問い合わせ」機能の実装をしたいと思います。
（いつになるかな・・・）
FuelPHP 1.7.3 でTwitterのOpauth ログインする方法

GitHubのfuel-opauth (https://github.com/andreoav/fuel-opauth )には、
> Repository outdated and no longer supported.

と記載されているので、使わない方向で実装する方法。

-----

- FuelPHPのドキュメント http://fuelphp.jp/docs/1.7/packages/auth/opauth/intro.html
- opauthのドキュメント https://packagist.org/packages/opauth/opauth
- Twitterストラテジーのドキュメント https://packagist.org/packages/opauth/twitter

基本的には上記URLのドキュメントに従えばOK.


------

あらかじめ Twitter Appsの登録をしておく。その際、ダミーURLで良いのでCallback URLを指定しておく。  https://apps.twitter.com/

# opauthパッケージとTwitterストラテジーをインストール

compose.json に opauth/opauth, opauth/twitter を追加して、 ```php composer.phar update```を実行する

```
    "require": {
        "php": ">=5.3.3",
        "composer/installers": "~1.0",
        "fuel/docs": "dev-1.7/master",
        "fuel/core": "dev-1.7/master",
        "fuel/auth": "dev-1.7/master",
        "fuel/email": "dev-1.7/master",
        "fuel/oil": "dev-1.7/master",
        "fuel/orm": "dev-1.7/master",
        "fuel/parser": "dev-1.7/master",
        "fuelphp/upload": "2.0.2",
        "monolog/monolog": "1.5.*",
        "michelf/php-markdown": "1.4.0",
        "opauth/opauth" : "0.4.*",
        "opauth/twitter" : "dev-master"
    },
```

※ opauthのページのChangeLog を見ると、```v0.4.4 (10 May 2013)``` が最新なので、```0.4.*```を指定している。


# opauthの設定を記述

デフォルトの設定ファイル ```fuel/vendor/opauth/opauth/example/opauth.conf.php.default``` を ```fuel/app/config/opauth.php``` にコピーする。

```fuel/app/config/opauth.php``` の、
- path
- callback
- security salt
- Starategy
を以下のように指定する。

```
return array(

   'path' => '/url/path/to/controller/action/',
   'callback_url' => '/url/path/to/controller/callback/',
   'security_salt' => "random string",   
   'Strategy' => array(
   'Twitter' => array(
   		'key' => 'Consumer Key',
		'secret' => 'Consumer Secret',
	),
);

```
※ それぞれ簡単な説明があるので、それに従う


# コントローラーを作成

Twitterの認証ページにリダイレクトするURLは ``` /path/to/controller/action/twitter/ ``` になる。
※ /twitter/ は必須。


```
<?php

 class Controller_Login extends Controller
 {

    public function action_action( $provider = null ){
         \Auth_Opauth::forge();
     }

    public function action_callback(){
         $_opauth = \Auth_Opauth::forge( false )
         // $_opauth の値を使ってゴニョゴニョする
     }

 }
```
fdupesで検出した重複ファイルの内一番下のものを残す手順


[fdupes](http://github.com/adrianlopezroche/fdupes)は重複ファイルを手軽に削除できるコマンドだが，fdupesで削除する対象から自動的に除外できるのは重複リストの内一番上のファイルだけ．
一番下のものを残したいときは

1. 重複リスト作成
2. 削除リスト作成（ここで一番下のファイルを除外する）
3. rm

の順に行う


# インストールしておくコマンド

* fdupes
* pcregrep ... PCREパッケージをインストールすると入っている…筈

`grep -Pzo`でも良いかもしれないが，どうしても空行が残ってしまったので`pcregrep`を使った．
そもそもBSD-grepなどはPCRE未対応なので，特にマカーさんは`pcregrep`を`brew`等で入れておくのがお勧め．

_(awkerの方々から飛んでくる鉞はキャッチしたい)_

# 重複ファイルリスト作成

**[`fdupes`]**
* -q: プログレスインジケーターを出力しない
* -r: ディレクトリ内を再起検索

## 単一ディレクトリ

```bash:sh
fdupes -qr ./ > "./duped.txt"
```

## 複数ディレクトリ

各ディレクトリ毎に重複を検出したいなら関数かスクリプトを用意する

```bash:fdupesout
if [ $# -ne "1" ]; then
    exit 1
fi
fdout=`fdupes -qr "./$1"`
if [ ${#fdout} -ne "0" ]; then
    echo -e "${fdout}\n" > "./duped-$1.txt"
fi
```

プロセス数はお好みで
ここでは削除時以外`-P 4`で4つフォークさせます

**[`xargs`]**
* -P: 同時に実行できる最大プロセス数
* -d: デリミタを指定

```bash:sh
ls -1 | xargs -d '\n' -P 4 -I@ fdupesout "@"
```

重複がなかったときに空ファイルが生成されても良いと言う場合は

```bash:sh
ls -1 | xargs -P 4 -I@ sh -c 'fdupes -qr "./@" > "./duped-@.txt"'
```

だけでも可


# 削除リスト作成

重複データ毎に改行が入るので，次の行が改行だけでない行を抽出しファイルに出力
ディレクトリ毎に重複リストが分割してあるなら先に

```bash
cat duped-* > duped.txt
```

でまとめる．そのためには重複リストの末尾には改行を追記しておくこと．

**[`pcregrep`]**
* -u: UTF-8モード（を使うと何故かエラー）
* -M: 複数行を対象に検索．改行`\n`が使用可能に

```bash:sh
pcregrep -M '[^\n]+\n(?!\n|$)' duped.txt > rmlist.txt
```

これで重複結果の内一番下のファイルを残すことができる

## ディレクトリ毎削除リスト

ディレクトリ毎に分割した重複リストを元に削除リストもディレクトリ毎に分割するなら

**[`xargs`]**
* -I{置換文字}: プレースホルダを設定．

```bash:sh
ls -1 duped-* | xargs -P 4 -I@ sh -c 'pcregrep -M "[^\n]+\n(?\!\n|$)" @ > "rm-@.txt"'
```

**※注意**
* マルチプロセスで実行した結果を1つのファイルに書き込むと希に出力が混ざって壊れるので，上記のように一度別のリストに出力した後`cat`でまとめるか，リスト毎に削除を行う方が良い．
* xargsでpcregrepを使う場合は「!」をエスケープすること

# 削除

```bash
xargs -d '\n' -I@ rm "@" < rmlist.txt
```

## ゴミをこさえたくないなら

※ 処理規模が小さいなら以下のワンライナーでもできるかも知れない

```bash
fdupes -qr ./ | pcregrep -M '[^\n]+\n(?\!\n|$)' | xargs -d '\n' -I@ rm "@"
```
ライブラリを使用せずに角丸画像を表示する

Android Support Library v4にある`RoundedBitmapDrawable`を使えば、
[RoundedImageView](https://github.com/vinc3m1/RoundedImageView)や[Universal Image Loader](https://github.com/nostra13/Android-Universal-Image-Loader)など多数あるライブラリを使用せずに角丸画像の表示ができます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/22848/a73e2900-3a14-3096-02bc-2dd765091893.png)

# RoundedBitmapDrawableのインスタンス生成
`RoundedBitmapDrawableFactory`の以下のいずれかのメソッドを使用して、インスタンスを生成して使用します。

```java:RoundedBitmapDrawableFactory#create
public static RoundedBitmapDrawable create(Resources res, Bitmap bitmap)

public static RoundedBitmapDrawable create(Resources res, String filepath)

public static RoundedBitmapDrawable create(Resources res, InputStream is) {
```

引数は`Bitmap`、ファイル名、`InputStream`のいずれかなので、
ネットワーク上の画像、端末内のファイル、Assets、Rawリソースなどに使えます。

（あまり用途はないかもしれないけど）Drawableリソースの場合は以下の通り、少し面倒。
URLではなく、ファイル名なので[この方法](http://qiita.com/konifar/items/bdf8a63022b32ea84151)ではできませんでした。

```java
BitmapDrawable bitmapDrawable = (BitmapDrawable) getResources().getDrawable(R.drawable.xxx);
Bitmap bitmap = bitmapDrawable.getBitmap();
RoundedBitmapDrawable drawable = RoundedBitmapDrawableFactory.create(getResources(), bitmap);
drawable.setCornerRadius(100);

imageView.setImageDrawable(drawable);
```

# 結論
XMLでも書けないし、`RoundedBitmapDrawable`から変換後の`Bitmap`が取れるわけでもないので、`Picasso`の`Transformation`にも使えない。
個人的には使うことなさそうかな。。。
Consul bootstrap

[チュートリアル](https://www.consul.io/intro/getting-started/agent.html)に従って開発モード `consul agent -dev` で起動して使っている分には、特に問題ならない。

開発モードをやめて本番用の使い方を調べているときに、[マニュアル](https://www.consul.io/docs/guides/bootstrapping.html)で少し混乱したところが出たので、メモ。

`consul agent` の「 `-bootstrap-expect` は（3 や 5 を）設定するか、全く設定しないか」するべし。と書かれている。

例えば 3 を指定した場合は、3 node join したときに leader election が開始される。leader election 終わるまでは利用不能。3 node member があるときは、1 node fail しても一貫性は失われない。これは zookeeper でも同様。

あれ？と思ったのは「全く指定しない」ときの動作。`consul agent -server -data-dir=/tmp` で 3 node member join させても、一向に leader election が開始されない。

どういうことかと更に調べてみたら、`-bootstrap-expect` 無しの場合は[手動でのbootstrap](https://www.consul.io/docs/guides/manual-bootstrap.html)をしないといけない。

原点に立ち返ると `consul` は raft を実装した `serf` の上に構築されていて、raft の規則に従う。過半数を満たすように増減すればいいので、1 node から開始してもいいはず。

しかし同時に raft の規則では node の数が変わるときは、変わる前後の両方の総数で過半数を満たしていればよい。[raft](https://raft.github.io/#pubs)の「6 Cluster membership changes」に書かれている。

1 node (過半数は 1) で開始してしまうと、2 node (過半数は 2) に遷移できない。2 node から 3 node (過半数は 2) へは遷移できる。ということで、これはむしろ意図的な安全装置で、ノード数の変更を担保しようとしてるんだな。1 node で動かしたい場合は、`-bootstrap` か `-bootstrap-expect=1` で明示的に開始せよ、と。ノードを増やしたい場合は、すみやかにノードを追加し、bootstrap 付きで起動したノードを解除せよ、と。

あと `-bootstrap-expect` は leader election をいつ始めるかを決めるだけなので、クラスターが開始した後は、指定した数とは関係なく、過半数で状態を決める動作をする。

バージョンが上がるごとに使える手順が増えている様子。[creationonlineの記事](http://www.creationline.com/lab/10353)が分かりやすい。

話はそれるけれど、zookeeper でも同じようにノード数を変更することができる。zookeeper は設定ファイル変更しないといけないから、オペレーションは大変だけど。

全台一気に落とした時の問題？があるらしい。[シグナルによっては leader election が開始しない？](https://github.com/hashicorp/consul/issues/993#issuecomment-109661347)って、どういうことだろう？

おまけ
-----

```:Dockerfile
FROM ubuntu
RUN apt-get install -y wget unzip
RUN wget https://releases.hashicorp.com/consul/0.6.3/consul_0.6.3_linux_amd64.zip -P /tmp
RUN unzip /tmp/consul_0.6.3_linux_amd64.zip -d /usr/local/bin
```

`/etc/default/docker` で `DOCKER_OPTS="--iptables=false"` としておくと、実験がはかどる。
UnityとUniWebViewとAndroidのバックボタンと

最近のネイティブアプリによくあるお知らせ画面にWebViewを使うことは多々あると思います。
自分は**$20**（UniWebView2）を使っています。

最近AndroidのBackButtonとの連携で引っかかったのでメモ代わりに。
UniWebView2を使用している画面でバックボタンを押すと基本的には現在開いているWebページの前ページに遷移します。
ただ今回やりたいのはバックボタンを押すことでUniWebView2の終了かつ使用している画面も閉じるようにしたいということです。

結論から言うと、Assets/UniWebView/Scripts/UniWebView.csを修正しました。
この中にある`private void WebViewDone(string message)`の中身を一旦コメントアウトして、
別途にこちらで使用しているメソッドを呼び出すようにしてます。

```lang:UniWebView.cs
    private void WebViewDone(string message) {
        /*
        // 一旦元のCodeをコメントアウト
        bool destroy = true;
        if (OnWebViewShouldClose != null) {
            destroy = OnWebViewShouldClose(this);
        }
        if (destroy) {
            Hide();
            Destroy(this);
        }
        */
        #if UNITY_ANDROID
        // 独自に用意したバックボタンハンドラ
        BackHandler.Invoke();
        #endif
    }
```

この「WebViewDone」が呼び出されているタイミングはバックボタンが押された時のみにしか呼び出されている様子が無かったので今回はこういう対応で済ませました。

UniWebViewのPlugin側の挙動はソースコード読んでいる感じだと、
1.キーが押される
2.UniWebViewDialog.java内のOnKeyDownが呼ばれる
3.OnKeyDown内で押されたキーが「backkey」かどうかで処理を判断
4.backkey以外なら通常処理へ
5.backkeyならWebViewのCanGoback()を見て、GoBack()出来るようであればGoBack()させる
※GoBack():一つ前のページに戻る
6.GoBack()出来ないようであれば、Unity側のWebViewDone()がコールバックされる
という感じでした。

WebViewDone()がこの条件（BackKeyが押され+GoBack出来ない）でしか呼び出されないので、
とりあえずこの対応で問題ないかなと思います。

***
なかなかUniWebView2に関する記事が少ないので同じようなところでつまづいている人の役に立てれば…
そもそももっと使いやすく拡張しやすいWebViewをUnity側が用意s（ry
Qiita > 検索 > 限定共有の検索結果

http://qiita.com/aosho235/items/3dee1a69cb8278d60bda
と関連して

先ほど自分のメモとしてuntaggedタグで限定共有記事を投稿した。

その検索結果

1. untaggedで検索
  - 記事が見つかる
2. tag: untaggedで検索
  - 記事が見つかる
3. [untagged]をクリックした結果
  - 記事が見つからない

1,2はページ切替方式での表示
3は「もっと見る」方式での表示

二者で異なる検索結果を使っているのだろうか。

<hr>
(2016/01/19 追記)
両者の違いについては @htomine さんのコメントを参照ください。
if文で代入式を作るとオブジェクトがnilになってくれるらしい

意味不明なタイトルだけど・・・

```
a = foo if flag
a.blanK? 'hoge' : 'fuga'
```

こんな感じの書き方があり、flagがfalseだった場合エラーになるんじゃね？
って思ったらならなかったのでビックリ！

何か自分が勘違いしているのかと思って、ちょっと試してみた

```
[6] pry(main)> class Hoge
[6] pry(main)*   def foo
[6] pry(main)*     1
[6] pry(main)*   end
[6] pry(main)*   def bar(flag)
[6] pry(main)*     b if flag
[6] pry(main)*     a = foo if flag
[6] pry(main)*     p a
[6] pry(main)*     p b
[6] pry(main)*   end
[6] pry(main)* end
=> :bar
[7] pry(main)> Hoge.new.bar true
NameError: undefined local variable or method `b' for #<Hoge:0x007f95aba2f740>
from (pry):28:in `bar'
[8] pry(main)> Hoge.new.bar false
nil
NameError: undefined local variable or method `b' for #<Hoge:0x007f95b46ef0e0>
from (pry):31:in `bar'
```

やっぱ宣言されずにいきなり使った b はエラーになるよね。
なのに代入で使用した a はエラーにならない

理由がわからんけど、こんなような展開が内部的にされているのかなぁ。。。

```
var a;
if (flag) {
  a = foo
}
```

全然解決してない、何の役にも立たないブログになってしまったw
探索と計算の分割 - アルゴリズムクイックリファレンス５章の補足 -

# 概要
本を読んで勉強しなおし、気になったことを書くシリーズです。
今回は、アルゴリズムクイックリファレンス５章の「探索」がテーマです。

# 探索の目的
「概観」の内容がいきなり重要です。

- 存在：$C$の中には探している要素$t$があるか。
- 検索：探している要素$t$に合致する$C$の要素を返す。
- 関連情報：目標のキー要素$k$の関連情報を集まり$C$の中から返す。

ここでいう「検索」と「関連情報」は、本質的には同じ意味であるように見えます。

いま、何らかの要素$t$を、母集合$C$から探索する場合を考えます。
例えば、「$t$が含まれているかどうか」ということは、$C$に関する情報です。一般的なプログラミングでは、しばしば$C$に$t$が含まれていれば処理１、含まれていなければ処理２、というような分岐を生じる場合がありますが、これは$C$そのものの性質から処理を変えている、と考えることができます。
一方で、日常生活で$t$を探すというと、$t$が$C$にあるということは必ずしも本質的ではなく、$t$を見つけて使うということに焦点がある場合があります。例えばパスワードを記した紙を探すときは、パスワードを記した紙がどこにあるかということではなく、パスワードを記した紙が本質的に持っている情報が重要であり、またその情報を利用することにこそ興味があります。
この場合、「$t$を探すときに使う情報」というのは、$t$を識別できる必要がありますが、$t$の性質すべてを表している訳ではない、ということに注意します。というのも、パスワードがわかっていれば、パスワードを記した紙を探す必要が元々ないからです。
その意味で、$C$から$t$を探す場合は、じつは$t$は探している対象のすべてではなくて、何らかの付帯する価値なり情報なりを持っていると考えるのが正しいように思われ、自然に「検索」と「関連情報」は同じものを指し示しているように思われます。

# 予備情報が無ければ逐次探索しかない
何の予備知識もなければ、一つ一つ要素を地道に検証するしかありません。

# 全順序が入っていて、かつソートされていれば、二分探索
各要素について、（重複の無い）全順序が入っていて、かつソートされているならば、よく知られた二分探索を利用することが可能です。
二分探索の手法自体も面白いですが、プログラムのアーキテクチャ的な意味では「処理を分割できる」ということにも意味があります。つまり、全体としてはソート＋探索になるので、必ずしも効率が良くなるとは限らないものの、ソートと探索のタイミングを分けることができるので、要請に応じて設計を変えられる（変えるべきである）という考え方もできます。

# ハッシュに基づいた探索について
プログラミングの世界でしばしば登場する配列という概念があります。この配列へのアクセス自体、（無重複の）ハッシュであると思うこともできます。

# 二分探索木について
赤黒木についてですが、おそらくライブラリで作られているものを利用するぐらいに留まるので、いったん省略します。
AVLの実装とか入れてもよかったんですが、そこまで興味をそそられず。

# おしまい
内容があまりなくなってしまいました。
もともとRubyとPythonの練習を兼ねてもいるので、~~とりあえず次のような計画で進めます~~あとは大体Pythonでやります。

ちなみに、このシリーズには、他に次のような記事があります。
[バケツソートとn log nの壁 - アルゴリズムクイックリファレンス４章の補足 -](http://qiita.com/sasanquaneuf/items/39d00e6f49d87643d472) ※Ruby
【この記事→】[探索と計算の分割 - アルゴリズムクイックリファレンス５章の補足 -](http://qiita.com/sasanquaneuf/items/b59c0debd68e197694f8) ※Python
[Pythonで迷路を解く - アルゴリズムクイックリファレンス６章の補足 -](http://qiita.com/sasanquaneuf/items/77bf6518b4bf97bcd15b) ※Python
[フォード・ファルカーソン法とその応用 - アルゴリズムクイックリファレンス８章の補足 -](http://qiita.com/sasanquaneuf/items/14a4c6459813abf6ccbd) ※Python
Reactコンポーネント内で使いやすいreact-input-calendarを使う


Reactベースの簡単なWebページを作っている中で、Datepickerを使いたい要件があった。
jQuery UIのDatepickerでも良いのかもしれないけど、せっかくなので？Reactと相性の良さ気なものを探した。

それで辿り着いたのが、 [react-input-calendar](https://github.com/Rudeg/react-input-calendar) 。

見た目は、こんな感じ。

![スクリーンショット 2016-02-11 16.14.38.png](https://qiita-image-store.s3.amazonaws.com/0/23683/6ed120c3-856c-80bc-4fa6-c4ef8638f528.png "スクリーンショット 2016-02-11 16.14.38.png")


## インストール
```bash
% npm install react-input-calendar --save
```

## 使い方
Reactのコンポーネントのrender関数内で以下のように定義すると、とりあえず使える。
これは、READMEにある通り。

```js
var Calendar = require('react-input-calendar');

（中略）

<Calendar format="DD/MM/YYYY" date="4-12-2014" />
```

## 自分が施したカスタマイズ
以下のカスタマイズをする方法。

* 日付の書式を **YYYY-MM-DD** にする
* 日付変更時に返ってくる日付の書式もYYYY-MM-DDにする
* 初期表示時の日付を指定する
* labelタグと紐付ける
* 日付を選択したら、カレンダーが閉じるようにする

```html
<label labelFor="ticketDate">登録日</label>
<Calendar
    // 日付の書式をYYYY-MM-DDにする
    format="YYYY-MM-DD"
    // onChange時に返ってくる日付の書式
    computableFormat="YYYY-MM-DD"
    // 日付変更時のコールバック（ここでは、親コンポーネントの関数をセット）
    onChange={this.props.changeDate}
    // 初期表示時の日付（ここでは、propsで親コンポーネントから本日をもらう）
    date={this.props.ticketDate}
    // labelForとの紐付け
    inputFieldId="ticketDate"
    // 日付を選択したら、カレンダーが閉じるようにする
    // propTypesがBooleanなので{true}を渡す
    closeOnSelect={true}
/>
```

結構色々な設定値があって、今回自分が使いたい範囲であれば、問題なく対応できた。
見た目も、今回CSSフレームワークに使った [Milligram](https://milligram.github.io/) とも違和感なく溶け込んでくれたので、使って良かったコンポーネントでした。
SublimeText2でPOV-Rayのコードを書きやすくする

# はじめに
POV-Ray3.6のWindows版にはGUIが提供されているのですが、コードの編集には非常に苦労します。また、MacやLinuxでは環境が提供されていません。そこで、以前にSublimeText2用のパッケージを作成しましたので、こちらでも案内します。

本記事の詳細は以下のページをご覧ください。
[[POV-Ray][SublimeText2]SublimeText用POV-Rayパッケージを作成しました](http://www.cho-design-lab.com/2013/11/13/creatingpov-raypackage/)

## 特徴
* そこそこのシンタックスハイライト
* ほぼ全てのキーワードに対応したスニペット(ここ重要)
* レンダリング(Windows非対応)

# インストール＆利用方法
## リポジトリを登録
SublimeText2の `Preference > Package Control`をクリックし「Add Repository」を選択し
`https://github.com/cho-design-lab/POV-Ray-sublime`
を入力してください。

## インストール
`tools > Command Pallete...`をクリックし、「Install Package」を選択し、`POV-Ray-sublime`を選びEnterすればインストール完了です。

## 利用する
エディタの右下のファイル形式を`POV-Ray`に変更するか、ファイルの拡張子を`.pov`にすればパッケージが適用されます。
![povrayedit.png](https://qiita-image-store.s3.amazonaws.com/0/109715/5735ef17-deb9-0a87-6ae4-932cb5ca83d7.png)

**Control+Space**で候補が表示されます。
![povray-snipet-300x91.png](https://qiita-image-store.s3.amazonaws.com/0/109715/290988b1-1c83-3749-5622-3b52c730b408.png)

### レンダリングする(Macのみ）
MacではPOV-Rayのエンジンにパスが通っていれば、`tools > build` もしくは**Command+B**でシーンファイルと同じ階層に画像が保存されます。また、解像度やその他設定を変更する場合は、povray.iniをシーンファイルと同じ階層にコピーし、編集することで可能です。

# おわりに
ずいぶん昔に作成したパッケージだったのですが、最近POV-Rayを利用する機会があり、あらためて便利でしたので紹介しました。
multipart/alternative なのにGmailではテキストメールが表示されてしまう場合

ActionMailer使ってmultipart/alternativeなメールを送る場合、よくこんな書き方をしてHTMLとTEXTなファイルを用意すると思います

```
mail to: user.email do |format|
    format.html { render }
    format.text { render }
end
```

でもこれGmailなどで受信するとテキストメールとして表示されてしまい、HTMLソース丸見えな情けないメールになってしまうことがあります

[RFC1341 section 7.2.3] (https://www.w3.org/Protocols/rfc1341/7_2_Multipart.html)

ちゃんとRFC読めというのが結論だったのですが、優先的に表示したければ（最適なものは）最後に指定しろとあります。上記ソースコードでいうと順番を変更する必要がありました。

```
mail to: user.email do |format|
    format.text { render }
    format.html { render }
end
```