OmniAICreator/Qiita-1.07M huggingface dataset:
Capistrano タスクの実行順序を確認する

Capistranoのタスクの実際の動作を確認したい時に`--dry-run`を指定するのですが、その際に実際に実行するコマンドがサーバー台数分列挙して表示されるため、タスクの実行順序を確認したい際に苦労します。
そこで、タスクの実行順序のみを表示する方法を見つけたので、紹介します。

## 実行するコマンド

```sh
bundle exec cap development deploy --trace --dry-run 2>&1 | grep -E "\(first_time\)"
```

実行すると以下の様なタスク名が列挙されます。

```sh
** Invoke development (first_time)
** Invoke load:defaults (first_time)
** Invoke rbenv:validate (first_time)
** Invoke rbenv:map_bins (first_time)
** Invoke bundler:map_bins (first_time)
** Invoke deploy:set_rails_env (first_time)
** Invoke deploy:set_linked_dirs (first_time)
** Invoke deploy (first_time)
** Invoke deploy:starting (first_time)
** Invoke deploy:check (first_time)
** Invoke git:check (first_time)
** Invoke git:wrapper (first_time)
** Invoke deploy:check:directories (first_time)
** Invoke deploy:check:linked_dirs (first_time)
** Invoke deploy:check:make_linked_dirs (first_time)
** Invoke deploy:check:linked_files (first_time)
** Invoke deploy:set_previous_revision (first_time)
** Invoke deploy:started (first_time)
** Invoke deploy:updating (first_time)
** Invoke deploy:new_release_path (first_time)
** Invoke git:create_release (first_time)
** Invoke git:update (first_time)
** Invoke git:clone (first_time)
** Invoke deploy:set_current_revision (first_time)
** Invoke git:set_current_revision (first_time)
** Invoke deploy:symlink:shared (first_time)
** Invoke deploy:symlink:linked_files (first_time)
** Invoke deploy:symlink:linked_dirs (first_time)
** Invoke deploy:updated (first_time)
** Invoke bundler:install (first_time)
** Invoke deploy:compile_assets (first_time)
** Invoke deploy:assets:precompile (first_time)
** Invoke deploy:assets:backup_manifest (first_time)
** Invoke deploy:cleanup_assets (first_time)
** Invoke deploy:normalize_assets (first_time)
** Invoke deploy:migrate (first_time)
** Invoke deploy:migrating (first_time)
** Invoke deploy:publishing (first_time)
** Invoke deploy:symlink:release (first_time)
** Invoke deploy:published (first_time)
** Invoke deploy:finishing (first_time)
** Invoke deploy:cleanup (first_time)
** Invoke deploy:finished (first_time)
** Invoke deploy:log_revision (first_time)
```

## 解説
仕組みとしては、`---dry-run`で実際の流れを追いつつも、`--trace`でタスクの呼び出しを出力されるようにしています。
ここで、出力されるtraceのログは"** Invoke"や"** Execute"という形で標準エラー出力に出力されるので、`2>&1`でエラー出力を標準出力にリダイレクトさせてます。

あとは、サーバ台数分の"** Invoke"や"** Execute"が出力される中から、`** Invoke bundler:map_bins (first_time)`というように"(first_time)"が記載されたログのみを抽出するようにします。

`after`や`before`といったフックで複雑化したり、gemでそもそもどのタイミングなのかわかりづらく、全体の実行順序を把握しづらいCapistranoのタスクですが、これで把握できるようになります！
Google Play Developer Consoleの「リリース前レポート」を試す


Google I/O 2016でFirebaseの拡張機能が発表された際、I/O 2015で発表されていたGoogle Play Developer Consoleの「Test Lab」は正式リリースされることなく、「リリース前レポート」へと姿を変えました。Test Lab自体はFirebaseの方に統合されてリリースされているようです。 **有料プランとして**。

[GoogleのCloud Test LabでデベロッパがAndroidアプリを、人気上位20機種の上でテストできる | TechCrunch Japan](http://jp.techcrunch.com/2015/05/30/20150528googles-new-cloud-based-test-lab-helps-android-developers-test-their-apps-on-multiple-devices/)

（やっぱり、この当時無料って言ってたよなぁ……？）

![スクリーンショット 2016-05-30 19.19.56.png](https://qiita-image-store.s3.amazonaws.com/0/4560/c2d2d6da-ba34-0e74-f1d4-3efaf6927d7b.png "スクリーンショット 2016-05-30 19.19.56.png")

※ リリース前レポートの画面

画面には「早期アクセス」と出ているので、おそらく当時「テストラボに参加する」を行ったデベロッパーのみ利用できるのではないかと思われます。

## リリース前レポートの使い方

リリース前レポートが一度も行われていない場合、上記のスクリーンショットの画面が表示されていて、そこにも書かれていますが **「アルファ版、もしくはベータ版のapkがアップロードされたタイミングで自動的に実行される」** ようです。

というわけで、さっそくアルファ版にapkをアップロードしてみました。 **Android N Preview 3でビルドされたapkを（アップロードできました）**。

![スクリーンショット 2016-05-31 14.16.00.png](https://qiita-image-store.s3.amazonaws.com/0/4560/caa751e7-05c5-9a80-2160-9acdcc8254cb.png "スクリーンショット 2016-05-31 14.16.00.png")

アップロードしてテスト終了後、レポート結果が表示されるようになりました。

今回は機能がほとんど実装されていないアプリだったこともあってか、10数分程度でチェックは終わりました。が、グラフを見ても分かるように一台も動作テストされていません。

この画面にはテストに使われた端末の一覧もリストアップされています。

![スクリーンショット 2016-05-31 14.16.20.png](https://qiita-image-store.s3.amazonaws.com/0/4560/912631c4-0cfb-356c-f0f6-653953ff8a9e.png "スクリーンショット 2016-05-31 14.16.20.png")

この13台でテストが行われたようです。お分かりのように、Android N Previewが載っている端末が一台もないからテストはなかったようですね（当然の答え）。
ただ6.0系が1台もないのが気になりますが……。

というわけで、今度はキチンとminSdkを14、compileSdkVersionを23にしたapkをアップロードしました。

![スクリーンショット 2016-05-31 15.25.11.png](https://qiita-image-store.s3.amazonaws.com/0/4560/9684404f-671e-c400-3821-2a8a3c653ddf.png "スクリーンショット 2016-05-31 15.25.11.png")

今度は13台全部でテストが行われました。なんか言語が一部変わってるのが気になりますが…。

## 各画面の紹介

### クラッシュ

先程から紹介しているスクリーンショットの画面です。チェック中にクラッシュすると、どの端末で問題が起きたかがひと目でわかるようになっています。

また、各端末をクリックすると、端末の情報からスクリーンショット（1枚のみ）＋操作動画を見ることができます。LogCatも保存してくれているみたいです。
動画は１分〜３分とまちまちでした。

![スクリーンショット 2016-06-08 17.39.56.png](https://qiita-image-store.s3.amazonaws.com/0/4560/e91bfab4-3614-958a-e607-7a9da08cb48c.png "スクリーンショット 2016-06-08 17.39.56.png")

### スクリーンショット

各端末の操作中の画面が複数枚掲載されています。枚数は固定でなく（３〜７枚）、どのタイミングで撮影されているかはよくわかりません。

![スクリーンショット 2016-05-31 15.26.37.png](https://qiita-image-store.s3.amazonaws.com/0/4560/22711482-5098-272f-5d87-eaba5d0dddae.png "スクリーンショット 2016-05-31 15.26.37.png")

このスクリーンショットや、クラッシュで見れる動画を見る限り、「ランチャーから起動して、メニューや画面上のボタンWidgetなどを手当たりしだいに触ってみる」動作チェックをしてくれるようです。こちらからテスト内容を指定することは（恐らく現状は）できません。

### セキュリティ

恐らくAPKを解凍して何かしらのチェックをしていると思うのですが、何も怒られなかったので、どんなものが掲載されるのかはわかりません。

![スクリーンショット 2016-06-08 17.45.56.png](https://qiita-image-store.s3.amazonaws.com/0/4560/1703ccec-3650-c06c-89f3-408188e2ef55.png "スクリーンショット 2016-06-08 17.45.56.png")

## まとめ

名前こそ変わったものの「アップロードするだけで簡易テスト」「スクリーンショットが見れる」など、I/O 2015で発表された機能はキチンと搭載されてるなという印象です。
反面、やはり用意されている端末はローカライズされてリストアップされているもののようではないため、これを「テスト」の一つとして信頼するにはかなり微妙なところがあります。

しかし利用方法は「アルファ（ベータ）版にapkをアップロードするだけ」という楽さと、チェック自体も高速で行ってくれるため、最終チェックの一つとして

「まずアルファ版にアップロード ＞ リリース前レポートで最終チェック ＞ 問題なければapkを製品版にプロモート」

という運用を導入するのは、結構ありなんじゃないかなと思いました。以上です。
Best WYSIWYG editor - Jodit

Jodit is a beautiful WYSIWYG HTML text editor
Tons of examples make it easy to integrate and your users will simply love its clean design.
#### Nice design
![Jodit Editor](https://qiita-image-store.s3.amazonaws.com/0/128906/f85d025a-7a3d-3015-d65f-13c6562030b6.png)

- Copy/Paste image
- Drag&Drop
- Split Mode
- Free for non-Commercial
- CodeMirror out of the box
- Pure JavaScript. No libraries
- Lightweight: ~32kB gzipped.

#### FileBrowser out of the box
![FileBrowser out of the box](https://qiita-image-store.s3.amazonaws.com/0/128906/891674d1-1c5f-47fd-4ca2-607d5df4ffd6.png)

- [Download](http://xdsoft.net/jodit/index.html#download) 
- [Documentation](http://xdsoft.net/jodit/doc/)
- [Google Group](https://groups.google.com/forum/#!forum/jodit)
YUI Compressor 指定されたファイルが見つかりません。

JSを圧縮して容量を減らしたかったのでYUI Compressor をsublimeTextに入れた。
ビルドしても「指定されたファイルが見つかりません。」でビルドできなかった。
ハテナ？と首をひねってたんだけど、どうやらJAVAが入ってないと使えないみたいです。
https://java.com/ja/download/

JAVAを入れたら使えました。
docker pull のときの出力を切りたい

# 概要

```
docker pull ubuntu:16.04
```

すると、進捗が表示されるが、スクリプトの中など、出力があると困ることがある


# 結論

今の段階では、


```
docker pull ubuntu:16.04 > /dev/null
```

のように、

```
/dev/null
```

で受けるしかないようである。

***--quiet***

などのオプションがあるかとおもったが、現段階ではサポートされていない。

* [Add a quiet option to docker pull · Issue #13588 · docker/docker](https://github.com/docker/docker/issues/13588)
* [docker pull without crazytown control code central · Issue #3694 · docker/docker](https://github.com/docker/docker/issues/3694)
リテラルSQLとバインド変数化とJava

# SQL
最近ではフレームワークの発展により性能を意識したSQLを書くことは少なくなりました。
たまに性能がでない時に思い出すのは**リテラル**と**バインド変数化**です。


SQLには**リテラル**と**バインド変数化**というものがあります。
**リテラル**は**ハードパース**であるため、重い処理となります。
**バインド変数化**は**ソフトパース**であるため、軽い処理となります。

##### ハードパース
 構文解析して構文エラーがないかどうかをチェックするとともに、テーブル名と列名が正確であるかどうかをチェックし、SQL 文を最適化して最善の実行計画を見つけます

##### ソフトパース
SQL 文が共有プールにすでに存在していることから、アクセス権限やセッション検証のためのわずかな処理で完了します

##### リテラルSQL

以下、SQLにはWHERE句に1000というリテラルが含まれます。

    SELECT * FROM table WHERE no = 1000; 

##### バインド変数化

以下は先程のSQLをバインド変数化した例となります

    variable no=1000;
    SELECT * FROM table WHERE no = :no;

Javaで書くと以下の構文になります。

    PreparedStatement pstmt = 
        conn.prepareStatement(“SELECT * FROM table WHERE no = ?”);
    pstmt.setInt(1, 1000);
Raspberry Pi Zeroにカメラユニットを繋いで表示させる

#序
事前の準備として、Raspberry Pi Zeroを購入するわけであるが、その場合、カメラユニットが付けられる後期型を購入すること。
カメラユニットに関しては、現在販売してるカメラユニットはあくまでPi用なので、別途Zero用のケーブルを購入しなければならない。
以下の販売サイトのURLを書いておくので参考にしてほしい。

- [Pi Zero (Pimoroni)](https://shop.pimoroni.com/search?type=product&q=Pi+Zero)
- [Cemera Unit (Pimoroni)](https://shop.pimoroni.com/products/raspberry-pi-camera-module-v2-1-with-mount)
- [Camera Cable - Raspberry Pi Zero edition (Pimoroni)](https://shop.pimoroni.com/products/camera-cable-raspberry-pi-zero-edition)

また、Zero用のUSB+EatherNet Hubもお奨めである。

- [Three Port USB Hub with Ethernet ](https://shop.pimoroni.com/products/usb-multi-function-lan-adaptor)

ZeroはPi3とは違い、はじめるのがまずは面倒臭い。特に本体にネット関連のモジュールがないので、そういうものをまずは買うところからはじめなければならず、1つでもないとはじめるのが大変なので、買い忘れがないようにしたい。

#カメラユニットの認識
カメラユニットの認識はそれほど難しくはない。
基本的には、次のようにRaspberryのコンフィグでカメラユニットを認識さればいいだけだ。

```
$ sudo raspi-config 
```

Configが立ち上がったら6番にある6 Enable Cameraを選択して、Enableにするだけだ。
後は、リブートを行えば、カメラが認識するようになる。

#まずは試し打ち
カメラが認識したかどうか下記のコマンドを実行してみる。

```
raspistill -o test.jpg
```

撮影してみるとわかると思うが、カメラユニットをマウントして撮ると像が逆さまになっているはずである。
その場合、下記のコマンドで像を反転することができる。

```
raspistill -vf -hf -o cam2.jpg
```

これで画像が反転してはずである。

#Motion-MMALを使う
Motion-MMALは簡単に言えば監視カメラソフトである。
特にRaspberry Piでカメラユニットを利用する場合、大概はこのソフトを使うが、最近のRaspberry PiのOSだとこれが正しく使えないことがあるようで、実は私もはまってしまった。
今回は、[ハードウェアエンジニアの備忘録](http://tosh419.hatenablog.com/entry/2016/04/12/025226)が紹介している方法で、このMotion-MMALを使ってみようと思う。

##Motion-MMALのInstall
Motion-MMALのInstall方法はそれほど難しくない。
下記の通り行えば、誰でもInstallできるだろう。
まずは必要となるライブラリをapt-getでInstallする。

```
$sudo apt-get install -y libjpeg-dev libavformat56 libavformat-dev libavcodec56 libavcodec-dev libavutil54 libavutil-dev libc6-dev zlib1g-dev libmysqlclient18 libmysqlclient-dev libpq5 libpq-dev
```

次にMotion-MMALのInstallを行う。
Installといっても、wgetで落としてきて解凍するだけだが。

```
$ mkdir motion
$ cd motion
$ wget https://www.dropbox.com/s/6ruqgv1h65zufr6/motion-mmal-lowflyerUK-20151114.tar.gz
$ tar -zxvf motion-mmal-lowflyerUK-20151114.tar.gz
```

後は、次のようにコマンドを入力する。

```
./motion -c motion-mmalcam-both.conf
```

後は、ZeroのIPアドレス：8081にウェブブラウザからアクセスすれば、Webブラウザからカメラ映像が見ることができるはずだ。

##Motion-MMALの画像が反転してる場合
raspistillの時もそうだが、カメラユニットを標準のマウントで表示する場合、カメラ映像が逆さまになっているはずだ。
流石にこのままだと使いづらいので、`motion-mmalcam-both.conf`の設定をいじることにする。
まずは、`motion-mmalcam-both.conf`を適当なエディタで開く。

```
$ vi motion-mmalcam-both.conf
```

次に、rotateを検査し、次の一文を見つける。

```
# Rotate image this number of degrees. The rotation affects all saved images as
# well as movies. Valid values: 0 (default = no rotation), 90, 180 and 270.
rotate 0
```

この`rotate 0`を`rotate 180`とすれば像が反転する。
修正したら、保存し、先ほどのコマンドを打ち込んで、確認してほしい。

```
$ ./motion -c motion-mmalcam-both.conf
```

うまく像が反転したはずである。

#結
Motion-MMALは簡単なアプリではあるが、色々利用できて面白いと思う。
個人的にも完全には把握出来ていない機能があるので、また色々触って見て、ここに追記していく予定である。
PHPで改行コード

問題の始まり。

```echo.php
<?php

echo "hoge";
echo "fuga";

```

実行結果

```
hogefuga
```

見ずれぇ...

## 結論:HTMLの改行コードを[nl2br](http://php.net/manual/ja/function.nl2br.php)関数で挿入すればいい

###例1 echoで呼び出す。
```echo_br.php
<?php

echo "hoge";
echo nl2br("\n"); //<br />タグが挿入される。
echo "fuga";

```

実行結果

```
hoge
fuga

```

僕が見たかった結果isコレ


###例2 いちいち `echo nl2br("\n");`するのがめんどい。

```echo_br_func.php

<?php

function br(){
echo nl2br("\n"); //<br />タグが挿入される。
}

echo "hoge";

br(); 

echo "fuga";

```

## `PHP_EOL`を使う。

`PHP_EOL` is 何?



実行結果は同じ。
Firebase 使い始めまとめ

## Firebaseを使ってみたいと思ったので調べたリンクをまとめました。

[Firebase を拡張、統合アプリ プラットフォームとして登場](http://googledevjp.blogspot.jp/2016/05/firebase.html)

[Google I/O 2016で発表されたFirebase Analyticsを使ってみた] (http://tech.connehito.com/entry/2016/05/20/091539)

[無料で使えるアプリ版Google Analyticsとでも言うべき「Firebase Analytics」などを繰り出すGoogle傘下Firebaseのすごいバックエンド機能まとめ](http://gigazine.net/news/20160519-firebase/)

[Firebase Analytics を iOS / Android アプリに導入する手順のまとめ](http://dev.classmethod.jp/smartphone/firebase-analytics-getting-started/)

[Google I/O 2016 で「Firebase」の新バージョンが発表！プッシュ通知機能を iOS アプリで使ってみた](http://dev.classmethod.jp/smartphone/firebase-notification-ios/)
カテゴリごとにデータを分割してファイルに出力する

素人の備忘録。

# 動機
以下のようなデータがあったとして、

| 元データ  |  変数1  |  変数2  |  カテゴリ |
|:--------:|:-------:|:------:|:--------:|
| サンプル1 | 変数1-1 | 変数2-1 | カテゴリ1 |
| サンプル2 | 変数1-2 | 変数2-2 | カテゴリ3 |
| サンプル3 | 変数1-3 | 変数2-3 | カテゴリ1 |
| サンプル4 | 変数1-4 | 変数2-4 | カテゴリ2 |
| サンプル5 | 変数1-5 | 変数2-5 | カテゴリ3 |
| サンプル6 | 変数1-6 | 変数2-6 | カテゴリ2 |
|    …     |   …    |    …    |    …     |

これを以下のように、カテゴリごとに別のファイルに分割したい。

| カテゴリ1 |  変数1  |  変数2  |  カテゴリ |
|:--------:|:-------:|:------:|:--------:|
| サンプル1 | 変数1-1 | 変数2-1 | カテゴリ1 |
| サンプル3 | 変数1-3 | 変数2-3 | カテゴリ1 |
|    …     |   …    |    …    |    …     |

| カテゴリ2 |  変数1  |  変数2  |  カテゴリ |
|:--------:|:-------:|:------:|:--------:|
| サンプル4 | 変数1-4 | 変数2-4 | カテゴリ2 |
| サンプル6 | 変数1-6 | 変数2-6 | カテゴリ2 |
|    …     |   …    |    …    |    …     |

| カテゴリ3 |  変数1  |  変数2  |  カテゴリ |
|:--------:|:-------:|:------:|:--------:|
| サンプル2 | 変数1-2 | 変数2-2 | カテゴリ3 |
| サンプル5 | 変数1-5 | 変数2-5 | カテゴリ3 |
|    …     |   …    |    …    |    …     |

# 解決策
例として`iris`を使う。
まず念のため`iris`の確認。

```r
> head(iris)
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1          5.1         3.5          1.4         0.2  setosa
2          4.9         3.0          1.4         0.2  setosa
3          4.7         3.2          1.3         0.2  setosa
4          4.6         3.1          1.5         0.2  setosa
5          5.0         3.6          1.4         0.2  setosa
6          5.4         3.9          1.7         0.4  setosa

> summary(iris)
  Sepal.Length    Sepal.Width     Petal.Length    Petal.Width          Species  
 Min.   :4.300   Min.   :2.000   Min.   :1.000   Min.   :0.100   setosa    :50  
 1st Qu.:5.100   1st Qu.:2.800   1st Qu.:1.600   1st Qu.:0.300   versicolor:50  
 Median :5.800   Median :3.000   Median :4.350   Median :1.300   virginica :50  
 Mean   :5.843   Mean   :3.057   Mean   :3.758   Mean   :1.199                  
 3rd Qu.:6.400   3rd Qu.:3.300   3rd Qu.:5.100   3rd Qu.:1.800                  
 Max.   :7.900   Max.   :4.400   Max.   :6.900   Max.   :2.500            
```

変数`Species`がカテゴリ(Factor)で、`setosa`、`versicolor`、`virginica`の３種類のカテゴリがある。
この`iris`をランダムに並べ替えたデータフレームを、`Species`ごとに分割し３つのcsvファイルを出力する。

```r
## irisをシャッフル
data <- iris[sample(1:nrow(iris), nrow(iris)),]
## Speciesごとに別のデータフレームを作成し、１つのリストに格納
list <- by(data, data$Species, data.frame)
## リスト内のデータフレームごとに別のファイルに出力
sapply(1:dim(list), function(x){write.csv(list[[x]], file=paste0("data_", dimnames(list)[[1]][x], ".csv"), row.names=FALSE)})
```

出力されたファイルを見るとわかるとおり、きちんと分割されている。
FileAPIでAndroidのフォトライブラリから画像が読み込めない問題


file.typeを確認

今回のケースは、Android端末で
・カメラから読み込んだ画像は`file.type=image/jpeg`
・フォトライブラリから読み込んだ画像は`file.type=null`

という状態だったので、強制的にfile.typeを付けることで解決

```javascript
var file    = document.querySelector('input[type=file]').files[0];
var reader  = new FileReader();

reader.onloadend = function (e) {
    // file.apiの処理

    // 画像生成
    var img = new Image();

    img.onload = function(){

    }

    if (file.type.indexOf('image') >= 0) {

        // 画像が入っている場合は 0が返ってくる
        // そのまま使用
        img.src = reader.result;

    } else {

        // nullの場合は -1が返ってくる
        // 強制的にfile.typeを付ける
        var base64 = reader.result.replace('data:', '');
        var newSrc = "data:image/jpeg;" + base64;
        img.src = newSrc;

    }

}
```
遠隔地Windowsから事務所複合機に印刷する L2TP/IPsec＋route add編

事務所パソコン : Windows7
事務所複合機 : Richo C2503
DCパソコン : WindowsXP

事務所パソコンからRDPでDCパソコンに接続して事務所複合機に印刷したい。
RDPのローカルリソースでプリンタがリダイレクトされるようにチェックしている。
DCパソコンのプリンター一覧で事務所複合機リダイレクトされ、ポートもTS000*で繋がっているのに印刷出来ない。

たぶんRDPホストとクライアントのＯＳバージョンが異なり、プリンタードライバーのバージョンも違うからだと思うが、立証方法も解決方法も浮かばない・・・。

なので直接DCパソコンをVPN L2TP/IPsec で事務所ネットワークに参加させてTCP/IPポートで印刷をかける。

VPN L2TP/IPsecで事務所に接続するとゲートウェイが変わって、RDP接続出来なくなる。
リモートネットワークでデフォルトゲートウェイを使うを外すとRDP接続できるようになるが、事務所複合機まで到達できなくなる。
事務所複合機までのrouteを手動で追加する。
> route -p add 192.168.001.165 mask 255.255.255.255 10.0.0.1 metric 1

これで事務所複合機に印刷できるようになった。
なんか超遠回りぃ～ｗ

> route -p add 192.168.001.165 mask 255.255.255.255 10.0.0.1 metric 1 if インターフェイス

ifでインターフェイス名をしてしてもいいが、VPN接続するたびインターフェイス名が変わる。
オプションpは永続的に。

現在のルーティングテーブルを確認するコマンド
> route print
EXCEL VBAで列番号をアルファベット表記に変換する

## 列番号をアルファベット表記に変換する関数
適当なモジュールに以下の関数をコピペしてください。

``` js
Public Function ColAddr(ByVal col As Long)
    Dim q, r As Long
    col = col - 1
    q = CLng(Application.RoundDown(col / 26, 0))
    r = col Mod 26
    
    If q = 0 Then
        ColAddr = Chr(65 + r)
    Else
        ColAddr = ColAddr(q) & Chr(65 + r)
    End If
End Function
```

## セルのアドレスを返す関数
セルのアドレスを返す関数も実装したのでついでに。

``` js
Public Function CellAddr( _
    ByVal row As Long, ByVal col As Long, _
    Optional absRow As Boolean = False, Optional absCol As Boolean = False) As String
    
    CellAddr = IIf(absCol, "$", "") & Utils.ColAddr(col) & IIf(absRow, "$", "") & row
    
End Function
```

## レンジのアドレスを返す関数
レンジのアドレスを返す関数も実装したのでついでに。

``` js
Public Function RangeAddr( _
    ByVal r1 As Long, ByVal c1 As Long, _
    ByVal r2 As Long, ByVal c2 As Long, _
    Optional absR1 As Boolean = False, Optional absC1 As Boolean = False, _
    Optional absR2 As Boolean = False, Optional absC2 As Boolean = False) As String
    
    RangeAddr = CellAddr(r1, c1, absR1, absC1) & ":" & CellAddr(r2, c2, absR2, absC2)
    
End Function
```
Capistranoで環境変数を個別に引き継ぐ

したいこと
---

* Capistranoで接続先のサーバに環境変数を渡したい

よく出てくる情報
---

* ```set :default_env, {"ENV1" => "VALUE1"}```とかやると渡せるよ
* この方法だと全体に効いてしまう
* かつ、deploy.rb系列の中で書かないと効かない
    * task系の中で書いても無視される

対応方法
---

* withを使うと渡せる
* on rolesの中じゃないと呼べないので注意

```ruby
on roles :apsv do
  with {"ENV1" => "VALUE1"} do
    execute :xxx
  end
end
```
Sequel ProでCSVファイルをインポートする方法

## インポートコマンド
`shift + option + i`

## 2画面インポートに関して設定する項目あり

### 1つ目
インポートするファイルを選ぶ。設定は下記のような感じであまり考えなくても良い。
![Screen Shot 2016-06-08 at 4.22.59 PM.png](https://qiita-image-store.s3.amazonaws.com/0/27895/1d8de208-0b1f-4dd8-0860-29fe9702885b.png)

### 2つ目
四角形で囲った

- First line contains field names（CVSファイルの1行目はカラム名 or １行目からデータ　チェックのON, OFFで選択）
- Import Method　(発行するSQL)
- Align field names by（First line contains field namesのチェックによって選べる項目が変わる）

を適切に設定すること。

![Screen Shot 2016-06-08 at 4.25.09 PM.png](https://qiita-image-store.s3.amazonaws.com/0/27895/93abd1a2-a836-2203-d678-3c0b0889db07.png)
jenkinsのディスク容量がいっぱいになったら

# 起こったこと
jenkinsをバッチサーバーとして運用し、バッチのログファイルなどでディスク容量が足りなくなった(newrelicでディスク容量を監視してる)

# 対応
### jenkinsサーバーにログインして、状況確認
```
# 全体容量確認
$ df -h 

# 容量食ってるフォルダ確認
$ sudo du -sh /var/lib/jenkins/workspace/* | sort -h -r | head -10
$ sudo du -sh /var/lib/jenkins/jobs/* | sort -h -r | head -10
```

自分の場合は一部のバッチがbuild回数が多くて、ログファイルで14G以上使ってた

### 手動で消すのは面倒で、関連するプラグインがないかを調査
* ディスク容量の把握
 * [Disk Usage Plugin](https://wiki.jenkins-ci.org/display/JENKINS/Disk+Usage+Plugin)
 * 利用量が大きいタスクから以下のビルド履歴削除を設定する

* ビルド履歴の削除
 * [Discard Old Build plugin](https://wiki.jenkins-ci.org/display/JENKINS/Discard+Old+Build+plugin)
 * プロジェクト毎の設定画面に「古いビルドの破棄」オプションが追加されたので、それを30日以上、100ビルドなどに適切設定する
3つ以上の数の最大公約数と最小公倍数

ちょっと必要になって、最大公約数について調べたところ…

数が2個の場合は検索ですぐに出てくるんですが
3個以上の数、になるとあまり見かけないなーということで
試しに作ってみました。
(結果の証明は省きます)

# (おさらいを兼ねて)数が2個の場合
## 最大公約数

[**ユークリッドの互除法**](https://ja.wikipedia.org/wiki/%E3%83%A6%E3%83%BC%E3%82%AF%E3%83%AA%E3%83%83%E3%83%89%E3%81%AE%E4%BA%92%E9%99%A4%E6%B3%95)を用いるのが有名みたいですね～。

- 2数の剰余が0になったら、『割られる数』＝『**最大公約数**』・・・①
- そうでなければ2数を『割る数』と『2数の剰余』として①を再度計算

ということらしいので、以下のような処理が多いかと思います。

```php:math.php
function gcd($a, $b) {
    if ($b === 0)
        return $a;
    
    return gcd($b, $a % $b);
}

echo gcd(1071, 1029); // 21
```

## 最小公倍数

[**最小公倍数**](https://ja.wikipedia.org/wiki/%E6%9C%80%E5%B0%8F%E5%85%AC%E5%80%8D%E6%95%B0)を見ると、2数に限っては

- 『最小公倍数』と『最大公約数』を掛け合わせると、2数の積になる

という性質があるみたいですね～。

つまるところ、**『2数の積』を『最大公約数』で割ったものが『最小公倍数』**
ということなので、gcd関数を流用して以下のような感じに。

```php:math.php
function gcd($a, $b) {
    if ($b === 0)
        return $a;
    
    return gcd($b, $a % $b);
}

function lcm($a, $b) {
    return $a * $b / gcd($a, $b);
}

echo lcm(1071, 1029); // 52479
```

# 数が3個以上の場合は？
本題はこっち。

まず調べる数が不定なので、引数を配列に変更してみます。

次にアルゴリズム部分ですが、数が増えたとは言っても
変数a,b,cについて

- 『aとbとcの最大公約数』　＝　『aとbの最大公約数』と『c』　の最大公約数
- 『aとbとcの最小公倍数』　＝　『aとbの最小公倍数』と『c』　の最小公倍数

という関係になるので、やはり再帰にすれば問題はなさそうです。

# というわけで
クラスにしたりなんだりを経て、できあがったものが[こちら](https://github.com/tawaship/etc/blob/master/MathAppend.php)です！
(キュー〇ー3分クッキングのテーマに乗せて)
※gitに移しました


法則に沿っているだけなので、コードの実装の詳細は省きますが
テクニックっぽいものとしては以下です。

## 必要に応じて参照渡しで

```php

// 値渡し
ini_set('memory_limit', '1024M');
echo  MathAppend::gcd(array_fill(0,6500,1)); // Fatal error: Allowed memory size of 1073741824 bytes exhausted...

// 参照渡し
ini_set('memory_limit', '16M');
echo  MathAppend::gcd(array_fill(0,13000,1)); // 1
```
使用メモリを1/64にして、更に要素数を倍にしても余裕で処理できる！　すごい！

calcGCD/calcLCMの中で、配列長を変更しているため
値渡しだとその都度新しい配列が生成されてしまうので
特に要素数が多い場合、参照渡しにしないと厳しいです。

getGCD/getLCMの方も参照渡しを試してはみたのですが、
処理時間が増加するという結果になったのでお蔵入りに。

## 配列からの値の取り出し方

2数を取得する際、indexを0と1でベタ書きできるので
コード中のarray_popの部分は、最初array_shiftで作ってました。
が、

```php

$a = array();
for ($i=1;$i<=6500;$i++) {
    $a[] = $i;
}

// array_shift
$s = microtime(true);
MathAppend::gcd($a);
echo (microtime(true) - $s); // 2.04~2.05secくらい

// array_pop
$s = microtime(true);
MathAppend::gcd($a);
echo (microtime(true) - $s); // 1.94~1.95secくらい
```
と、処理時間にそれなりの差が出るようなのでarray_popに変更しました。

array_shiftが『全要素が前詰めされる』のに対して
array_popだと『最後の1要素がなくなる』だけですしね！

# まとめ
更にメモリ消費を抑えたり、処理時間を減らしたりなどのコード面の課題や
実はもっと単純なアルゴリズムがあるかも！　などの数学面の課題もありますが～

数学アルゴリズムをコードに落とすのって意外と楽しいです。

みんなもアルゴリズム使ってね！
Rubyの配列をインデックス付きでHashにする方法。

```test.rb
ary = %w(takeshi jun aya ayumi noriko tatsuya)
hash = Hash.new; ary.each_with_index{|value, index| hash.store( index, "#{value}")}
p hash

#=> {0=>"takeshi", 1=>"jun", 2=>"aya", 3=>"ayumi", 4=>"noriko", 5=>"tatsuya"}
```
できた。
Browserstack(php-webdriver)でよく使う操作まとめ


# 環境
[こちらの記事] (http://qiita.com/imunew/items/dd68924ea5d6b3c982d9)を参考に。

# 参考
[php-webdriver API Documentation](http://facebook.github.io/php-webdriver/index.html)
[php-webdriver Issues](https://github.com/facebook/php-webdriver)
[9ineBB PHP GDを使って画像を連結、合成し生成する](http://9-bb.com/php-gd/)

# ひとりごと
- php-webdriverのIssuesに「こんなことしたいけどどうすればいいの」的な質問があって助かる。
- Wikiにも使い方が丁寧に書いてあって便利
C > 指定角度範囲の1/4を計算する > 内分点の公式を使う/使わない

```txt:動作環境
組込みC (極力ライブラリは使わない)
```

## 問題の定義

角度の範囲 A,Bが与えられた時に、その範囲の1/4になる角度を計算する。

- Aの範囲(度) [0,360)
- Bの範囲(度) [0,360)

計算結果の範囲も[0,360)度になるようにする。

## 実装1 (内分点の公式使用)

中点の公式は覚えていたので、それに近い方法で探して「内分点の公式」を見つけた。非常に懐かしいキーワードだ。
参考 http://batmitzvah.blog136.fc2.com/blog-entry-726.html


http://ideone.com/Nz6bC2

```c
#include <stdio.h>

float calc_1of4(float fLow, float fHigh)
{
	// calculate 1/4th of the range
	float fres;
	float fHighDash;

	fHighDash = fHigh;
	if (fLow > fHigh) {
		fHighDash += 360.0;
	}

	fres = ( 3.0 * fLow + 1.0 * fHighDash ) / (1.0 + 3.0);
	if (fres >= 360.0) {
		fres -= 360.0;
	}
	return fres;
}	

int main(void) {
	printf("%.1f\n", calc_1of4(330, 60));
	printf("%.1f\n", calc_1of4(340, 70));
	printf("%.1f\n", calc_1of4(350, 80));

	return 0;
}
```

```txt:結果
Success	time: 0 memory: 2160 signal:0
352.5
2.5
12.5
```

## 関数名

英語では point of division formula や division point formula などとして呼ぶようだ。

http://www.mathwords.com/p/point_of_division_formula.htm


## 実装2. 他の実装

公式を使わない実装

http://ideone.com/Hqnjw7

```
#include <stdio.h>

float calc_1of4(float fLow, float fHigh)
{
	// calculate 1/4th of the range
	float fres;
	float fwid;
	
	fwid = (fHigh - fLow);
	if (fwid < 0.0) {
		fwid += 360.0;
	}

	fres = fLow + fwid * 1.0 / 4.0;
	if (fres >= 360.0) {
		fres -= 360.0;
	}
	return fres;
}	

int main(void) {
	printf("%.1f\n", calc_1of4(330, 60));
	printf("%.1f\n", calc_1of4(340, 70));
	printf("%.1f\n", calc_1of4(350, 80));

	return 0;
}
```

行数的に変わらない。
分かりやすさはどちらがいいのだろうか。
複数NICを使うネットワーク設定 備忘録

# 問題
## やりたいこと
固定IPが割り振られているセンサを使用しながら他のネットワークへもアクセスしたかったので， 初心者ながらネットワーク設定をいろいろいじってみる．
センサには固定のIPアドレスが割り振られている（ここでは192.168.0.10 マスク255.255.255.0)．

## できていないこと
Logitecの USB-ethernetアダプタ(LAN-GTJU3H3)を介してセンサへ接続するのだけれど， そもそもIPアドレスをどう割り振って， IPアドレスに従ってどうやって使うネットワークを変えさせるのかが分からなかった．
上記アダプタはeth1として見えている.

## できたこと
192.168.0.0/24のネットワークをUSB-ethernetアダプタ側に設定して， センサへのpingが通った

# 解決策
## IPアドレスの設定
まず， センサとつながっているPC側のIPアドレスを設定する．
やり方はあるみたいだけれど， うまく動くかわからなかったので可逆的な方法で試してみる

```
sudo ifconfig eth1 192.168.0.3
```
IPアドレスは適当．　192.168.0.0/24のどれかを使用．

## ルーティングテーブルの設定
次に， 192.168.0.0/24宛のパケットをeth1へ流すようにしないといけない．これをしないとeth0(インターネットへ向けてつながっている．センサはいないネットワーク）へ全て出ていこうとする．

```
sudo route add -net 192.168.0.0 netmask 255.255.255.0 dev eth1
```

これでOK.

あとはpingを打てばかえってくる．

ついでにセンサ情報を取得してみる
```
~$ rosrun urg_node urg_node _ip_address:=192.168.0.10
[ INFO] [1465369377.842362358]: Connected to network device with intensity and ID: 
[ INFO] [1465369377.971724430]: Streaming data.
```
いい感じに出てきた．

# ハマったところ
## ifconfigでRUNNING フラグが出ない
センサが電源不足でうまく動いておらず， 接続されていないことになっていた．

## ルーティングテーブルの設定
よくわからない． 結局これで動いたけれど， もう少し勉強しないといけない． 

## Ubuntu 14.04 でsudo service networking restartは動かない
途中でネットワーク周りを再読込させようとしたところ上記コマンドが動かない．どうもバグらしい．
[Android] bringToFrontが効かない

## bringToFront not working!!
もともと、以下のような階層で描かれているxmlがあって、
bringToFrontを使って、root直下のFrameLayoutのviewをトップに出していました。(FrameLayoutを一番下に置いてもいいです。)

```before.xml
root: RelativeLayout

-FrameLayout
-LinearLayout
　- ImageButton
　- EditText
　- ImageButton
- RecyclerView
```
それを以下の様にする必要がありましたが、なぜがbringToFrontが効かなくなりました。

```after.xml
root: RelativeLayout

-FrameLayout
-LinearLayout
　- ImageButton
　- EditText
　- ImageButton
- CardView
　- RecyclerView
```

## 詳細
間違いなくCardViewが悪いのは予測がつくわけですが、bringToFrontのメソッドを覗きにいくと、

```View.java
public void bringToFront() {
　if (mParent != null) {
　　mParent.bringChildToFront(this);
　}
}
```
親Viewがいれば、親Viewが所持する子Viewを一番前に持ってくるようです。
そこでViewParent(mParentのオブジェクト)の中身を見ると、

```ViewParent.java
/**
 * this method should be followed by calls to 
 * {@link#requestLayout()} and {@link View#invalidate()} 
 * on this parent to force the parent to redraw with the new child ordering.
 * /
```

だそうです。
つまり、bringToFrontを使った際には、親Viewが子Viewの順番を考慮して、再描画する必要があるので、requestLayout() と invalidate()を利用しろということでした。

ところが、これをやってもL以上ではダメでした。
bringToFrontにしてroot直下の階層で一番前面に出してもロリポップ以上では、エレベーションを考慮する必要があります。

今回の場合利用している、root直下のCardViewのエレベーションを2dpつけていたのですが、root直下のFrameLayoutのプロパティで`android:elevation="2dp"`を追加してあげると直りました。(2dp以上ならOK)

## 結論
1. bringToFront -> requestLayout && invalidate()の順番で呼ぶ。
2. ロリポップ以上はエレベーションに気をつけて、必要ならばelevationをつける。(Material Designに沿って)

以上です。
EspressoでcheckableなMenuItemのテスト

タイトルの通り、オプションメニューにあるcheckableなMenuItemのテストをしたくて、こんな投稿をしました。

http://ja.stackoverflow.com/questions/25324/espresso%E3%81%A7checkable%E3%81%AAmenuitem%E3%81%AE%E3%83%86%E3%82%B9%E3%83%88

が、回答が付かず･･･
まあ英語で使ってなんぼですよね、Stack Overflowは。
で、結局いろいろ試行錯誤して、質問にも載せたViewの階層状態を参考にして、次のようにMatcherを作りました。
Matcherを作るのには全然馴れていないので、かなり四苦八苦しましたが、見た感じ意図したとおりに動作しているようです。

やっていることは、Checkboxクラスのオブジェクトを全部受け取って、その親Viewが持つ子Viewの中からTextViewを探して、そいつが指定したタイトル文字列を持っているかチェックしています。
階層状態が見えたから書けた愚直な手法ですね。
OSのバージョンが違ったらもしかしたらアウトかも知れませんが、support-libraryを使っている間は大丈夫な気がします・・・が、何も保証は出来ません。

```EspressoUtil.java

    public static MenuItemTitleMatcher withCheckBoxTitle(final String title) {
        return new MenuItemTitleMatcher(title);
    }

    public static class MenuItemTitleMatcher extends BaseMatcher<Object> {
        private final String title;

        public MenuItemTitleMatcher(String title) {
            this.title = title;
        }

        TextView getChildTextView(ViewGroup view, String title) {
            int num = view.getChildCount();
            for (int i = 0; i < num; i++) {
                View child = view.getChildAt(i);
                if (child instanceof TextView) {
                    if (title.equals(((TextView) child).getText())) {
                        return (TextView) child;
                    }
                }
            }
            return null;
        }

        @Override
        public boolean matches(Object o) {
            if (o instanceof CheckBox) {
                CheckBox checkbox = (CheckBox) o;
                ViewParent parent = checkbox.getParent();
                if (parent instanceof ListMenuItemView) {
                    // 子のViewGroupからTextViewを探す
                    int num = ((ListMenuItemView) parent).getChildCount();
                    for (int i = 0; i < num; i++) {
                        View child = ((ListMenuItemView) parent).getChildAt(i);
                        if (child == o) continue;
                        if (child instanceof ViewGroup) {
                            TextView textView = getChildTextView((ViewGroup) child, title);
                            if (textView != null)
                                return true;
                        }
                    }
                }
                return false;
            }
            return false;
        }

        @Override
        public void describeTo(Description description) {
            description.appendText("expected with Title: ");
            description.appendText("" + title);
        }
    }
```

使い方

```
onView(allOf(withClassName(endsWith("CheckBox")),
                EspressoUtil.withCheckBoxTitle(getString(R.string.action_lock))))
                .check(matches(isNotChecked()))
                .perform(click());
```
【AppleScript】iMessageを自動送信する

基本のコード
--
iMessageを自動で送信できないか考えていて、AppleScriptでできないかとやってみた。

```applescript:imessage.scpt
tell application "Messages"
	
	set targetBuddy to "iMessageの送信先（メールアドレスor電話番号）"
	set targetService to id of 1st service whose service type = iMessage
	
	set textMessage to "送信するメッセージ"
	
	set theBuddy to buddy targetBuddy of service id targetService
	send textMessage to theBuddy
	
end tell
```
これでわりと簡単に送信できた。


1秒に1回送るようにしてみる
--

```applescript:imessage.scpt
tell application "Messages"
	
	set targetBuddy to "iMessageの送信先（メールアドレスor電話番号）"
	set targetService to id of 1st service whose service type = iMessage
		
	repeat
		
		set textMessage to "送信するメッセージ"
		
		set theBuddy to buddy targetBuddy of service id targetService
		send textMessage to theBuddy
		
		delay 1
		
	end repeat
	
end tell
```
ちなみに、

```applescript
delay 1
```
の行を、

```applescript
delay (random number from 1 to 30)
```
とかにすれば、1〜30秒の間に1回送信される。


送るメッセージをランダムにしてみる
--

```applescript:imessage.scpt
tell application "Messages"
	
	set targetBuddy to "iMessageの送信先（メールアドレスor電話番号）"
	set targetService to id of 1st service whose service type = iMessage
	
	set rand to random number from 1 to 4
		
	if rand = 1 then
		set message to "うっひょー"
	end if
	
	if rand = 2 then
		set message to "ほげほげ"
	end if
	
	if rand = 3 then
		set message to "ﾇﾍﾞｼﾞｮﾝﾇｿﾞｼﾞｮﾝﾍﾞﾙﾐｯﾃｨｽﾓｹﾞﾛﾝﾎﾞｮ"
	end if
	
	if rand = 4 then
		set message to "うぇーい"
	end if
	
	set textMessage to message
	
	set theBuddy to buddy targetBuddy of service id targetService
	send textMessage to theBuddy
	
end tell
```




数字と一緒に送ってみる
--

```applescript:imessage.scpt
tell application "Messages"
	
	set targetBuddy to "iMessageの送信先（メールアドレスor電話番号）"
	set targetService to id of 1st service whose service type = iMessage
	
	set rand to random number from 1 to 100
	
	set textMessage to rand & "億ほしい"
	
	set theBuddy to buddy targetBuddy of service id targetService
	send textMessage to theBuddy
	
end tell
```
任意の数以上の最小の2のべき乗を求める


WebGL（やOpenGL）で利用されるテクスチャは通常、2のべき乗の幅・高さで使用されます。（パフォーマンスなどの問題から）
（参考: [なぜテクスチャサイズは2の累乗なのか](http://variously.sblo.jp/article/68664570.html)）

ただ、使用される画像が必ず2のべき乗になっているとは限りません。（というより、なっていないことのほうがほとんどでしょう）

それでも、いちおうそのままのサイズで利用することはできますが、最適化のため内部的には足りない部分が自動的にべき乗になるように補われたり、そのままだとパフォーマンスが落ちたりといいことはなにもありません。

なのでできるだけ画像のサイズを2のべき乗で揃えておきたいですね。
とはいえ、例えば動的に作成した画像などをテクスチャにしたい場合、ロジック的に2のべき乗のサイズを求めたくなるケースがあると思います。

ということで、さくっと[計算する方法を紹介](http://qiita.com/Ushio@github/items/bc431c5bdcb193c6966d)してくれている人がいたのでそれを参考にJSで書いてみました。


上記の記事を参考に、JSにしたのが以下のコードです。

```js
function nearPow2(n) {
	// 0以下の場合は常に0を返す
	if (n <= 0) {
		return 0;
	}
	
    var k = Math.ceil(Math.log2(n));
	return Math.pow(2.0, k);
}
```

最初のガード節はコメントに記載した通りです。
最後の部分が実際に計算を行っているところです。

`Math.log2` は引数に取った数字に対する、`2` を底とする指数を求める関数です。
いわゆる「[対数](https://ja.wikipedia.org/wiki/%E5%AF%BE%E6%95%B0)」を求める関数ですね。

計算を見てみると、引数 `n` の対数を求め、その小数部分繰り上げています。
試してみると分かりますが、 `Math.log2(n)` を実行すると大体の場合、小数点で表示されます。
それをそのまま `Math.pow` で利用しても元の数字は復元できません。（浮動小数点の丸め込みなどが関係していると思います）

なので、いったん対数を求め、端数を繰り上げることによって求めたい数字を含むべき乗の数字を求めている、というわけですね。
apache2.4系のhttpd.conf設定のあれこれ（書きかけ）

#Options -Indexes FollowSymLinks
デフォルトファイル（index.htmlなど）が存在しないディレクトリにWebブラウザでアクセスすると、Apacheの設定によってはそのディレクトリのファイル一覧を表示する。
このデフォルトファイルが存在しない時にその階層のファイル群を一覧表示させないために設定する。
ちなみに、
Options Indexes FollowSymLinks
と記述したり、むしろ記述しなかったりすると、その階層のファイル群を一覧せず、シンボリックリンク先のforbiddenと記述されたhtmlファイルが実行される。

#AddHandler server-parsed .html
こいつを置いていたばかりに、ディレクトリに入ろうとするといちいちダウンロードポップアップが出力されてうざかった。
ので、コメントアウト。
これはSSIを設定するものらしいが、今しらべらんないのでとりあえず調査次第追記。
【WordPress】カスタム投稿タイプを自作する

#【WordPress】カスタム投稿タイプを自作する

***カスタム投稿タイプを作成する場合、[Custom Post Type UI](https://wordpress.org/plugins/custom-post-type-ui/)などのプラグインを利用すると工数なども削減出来て便利なのですが、カスタム投稿タイプがどう作られるのか中身をしっかり理解しておくため、今回はカスタム投稿タイプを自作してみる。***

・function.phpにフックを追加し、カスタム投稿タイプを作成する。

```lang:function.php
<?php

〜〜省略〜〜

//======================================================================
// カスタム投稿タイプを自作
//======================================================================
function self_made_post_type() {
	register_post_type( 'self_made',
		array(
			'label' => '自作', //表示名
			'public'        => true, //公開状態
			'exclude_from_search' => false, //検索対象に含めるか
			'show_ui' => true, //管理画面に表示するか
			'show_in_menu' => true, //管理画面のメニューに表示するか
			'menu_position' => 5, //管理メニューの表示位置を指定
			'hierarchical' => true, //階層構造を持たせるか
			'has_archive'   => true, //この投稿タイプのアーカイブを作成するか
			'supports' => array(
				'title',
				'editor',
				'comments',
				'excerpt',
				'thumbnail',
				'custom-fields',
				'post-formats',
				'page-attributes',
				'trackbacks',
				'revisions',
				'author'
			), //編集画面で使用するフィールド
		)
	);
}
add_action( 'init', 'self_made_post_type', 1 );
```

自作した関数（self_made_post_type）の中で[register_post_type](http://wpdocs.m.osdn.jp/%E9%96%A2%E6%95%B0%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9/register_post_type)の引数に必要な項目を設定するだけで、自作投稿タイプが作成出来ます。これだけです。

・カスタム投稿タイプ作成前
<img width="594" alt="before.png" src="https://qiita-image-store.s3.amazonaws.com/0/97158/64ba3d04-0faf-d08e-cc74-f936889533ce.png">
デフォルトのWordPress管理メニューです。

・カスタム投稿タイプ作成後
<img width="494" alt="after.png" src="https://qiita-image-store.s3.amazonaws.com/0/97158/bd4c3fde-98c1-6c1a-fb1c-b922e06b3df6.png">
管理メニューに「自作」というメニューが追加されています！


・自作投稿画面
![after_post (1).png](https://qiita-image-store.s3.amazonaws.com/0/97158/0eeba318-a082-4eb7-9bdb-fe6cf8a1d7cc.png)

「抜粋」や「カスタムフィールド」など、[register_post_type](http://wpdocs.m.osdn.jp/%E9%96%A2%E6%95%B0%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9/register_post_type)の第二引数のキー、「supports」に設定したフィールドが表示されています。


カスタム投稿タイプの自作自体は覚えてしまうと簡単で、プラグインを使用して作成するのと手間は変わらないかと思います。
Ubuntu16.04にLXDEをインストールしても環境が変えられない

# UbuntuをLXDEの環境にする
デフォルトの環境はやや重いので、LXDEにしたときのメモです。

## UbuntuにLXDEをインストール
  ```bash
  $ sudo apt-get install lxde
  ```

ログアウト後に、本来ならログイン画面に環境の選択が表示されるのだが、私は選択のメニューが無かった。

ちなみに、メニューが選択できる状態なら「/usr/share/xsessions」に複数のファイルが存在する。

  ```bash
  $ ls /usr/share/xsessions
  ubuntu.desktop
  ```
が、今回は「ubuntu.desktop」しか存在しなかった。

## 別の環境をインストール
試しに別の環境「lubuntu」をインストールしてみる。

  ```bash
  $ sudo apt-get install lubuntu
  ```

今度は複数のファイルが存在した。なぜか「LXDE.desktop」もある。

  ```bash
  $ ls /usr/share/xsessions
  LXDE.desktop Lubuntu-Netbook.desktop lubuntu.desktop openbox.desktop ubuntu.desktop
  ```

この状態でログアウトすると、ログイン画面には名前の横にアイコンがあり、それを選択すると環境が選ぶことができた。

## 参考
[デスクトップ　ログイン時の環境選択項目について](https://forums.ubuntulinux.jp/viewtopic.php?id=14641)
middlemanをwerckerでデプロイしたらエラーが発生した件

# 事象

wercker上で`bundle exec middleman build --verbose`を実行すると、以下のエラーが発生した。

~~~
/pipeline/cache/bundle-install/ruby/2.2.0/gems/middleman-core-4.1.9/lib/middleman-core/util/data.rb:60:in `match': invalid byte sequence in US-ASCII (ArgumentError)
~~~

利用しているbox: ruby:2.2.2
利用しているmiddlemanのバージョン: 4.1.9

# 解決方法

wercker上で、`RUBYOPT=-EUTF-8`という環境変数を設定する。
wercker.ymlでコマンドで追加する方法と、werckerのGUI上で追加する方法がある。

~~~yml
# wercker.ymlで追加する方法

- script:
    name: set env
    code: export RUBYOPT=-EUTF-8
~~~

GUIでは、「setting」の「Environment variables」に環境変数を追加することができる。

# 原因

rubyのエンコードがUS-ASCIIになっていたのが原因かもしれない。

~~~sh
$ /Users/hikaru/.rbenv/shims/ruby -e 'puts Encoding.default_external' # 手元の環境
UTF-8

$ /usr/local/bin/ruby -e 'puts Encoding.default_external' # CIツール
US-ASCII
~~~


# 参考

参考にさせていただきました。
http://qiita.com/kijibato/items/5e6543fd6e681f916bb0
Storyboard上でスワイプのジェスチャーを追加する


UISwipeGestureRecognizerでスワイプでのジェスチャーイベントを追加できますが、今回はそれをStoryboradから追加する方法です。
今回、上下左右のスワイプイベントをするとログ出力するようにしました。

## Swiftコード
```ViewController.swift
import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    
    @IBAction func leftSwiped() {
        NSLog("leftSwiped");
    }
    
    @IBAction func rightSwiped() {
        NSLog("rightSwiped");
    }
    
    @IBAction func upSwiped() {
        NSLog("upSwiped");
    }
    
    @IBAction func downSwiped() {
        NSLog("downSwiped");
    }
}
```

## StoryboardからSwipe Gesture Recognizerを追加

### 1. Xcode右下のコンポーネント一覧から「Swipe Gesture Recognizer」をViewControllerへドラッグ
![スクリーンショット 2016-06-08 14.36.29.png](https://qiita-image-store.s3.amazonaws.com/0/44140/6ac3768b-38da-5855-72ea-885b6fbea0a5.png "スクリーンショット 2016-06-08 14.36.29.png")

### 2. 追加したSwipeGestureRecognizerにDirctionを設定

![スクリーンショット 2016-06-08 14.29.53.png](https://qiita-image-store.s3.amazonaws.com/0/44140/1f747821-9084-39c5-414d-f8bab789de51.png "スクリーンショット 2016-06-08 14.29.53.png")

### 3. 追加したSwipeGestureRecognizerにSelectorを設定

![スクリーンショット 2016-06-08 14.30.09.png](https://qiita-image-store.s3.amazonaws.com/0/44140/bd50be38-86de-4815-f761-2c93c4f96645.png "スクリーンショット 2016-06-08 14.30.09.png")

![スクリーンショット 2016-06-08 14.29.57.png](https://qiita-image-store.s3.amazonaws.com/0/44140/e77d3943-fee7-c3d4-dac8-fcfbe048133d.png "スクリーンショット 2016-06-08 14.29.57.png")


コードを書かずに設定できるので、コード部分がスッキリしますね。
WebGraphのインストールと利用、大規模ネットワークデータの獲得

ネットワーク解析において、グラフ形式データの獲得は基本である。　データの獲得において、自分でCrawler programを作って、ネット上から取得し、加工することもできれば、他のひどが上のようなstepで用意したデータをダウンロードし、使うことも可能。 まだ、small world性、 scale free性、cluster性などの性質を持つデータを生成モデルから作ることも可能である。

リアルデータの場合、実データなので、信頼性も高いし、それに対する解析は汎用性も高いと思うが、取得、加工するのに面倒くさい。一方、人工データの場合だと、リアリティが低くなる *(ネットワークのいろんな性質のうち、特定の幾つかの性質のみ持つデータしか作れない)* のと、実は生成コストもかなり高い *(生成モデルによって、100million頂点のグラフを作るのに24hもかかったりする)*。

リアルデータのダウンロードできるサイトとして、stanford大学の[snap project dataset](https://snap.stanford.edu/data/index.html) や [Laboratory for Web Algorithmics](http://law.di.unimi.it/datasets.php) などが有名である。　

この文章では、　Laboratory for Web Algorithmicsで公開されている、よく圧縮されているデータから、edgelist形式のグラフデータに変換する過程を記録する。 Laboratory for Web Algorithmicsのデータを扱うのに、 WebGraphという、グラフの圧縮や解析に有用なフレームワークが必要になる。 

#WebGraphのインストール

Step 1. [Mavenをインストールする](http://doc.aipo.com/startguide/maven.html)

Step 2. [WebGraphをダウンロードし、展開する](https://github.com/lhelwerd/WebGraph)

Step 3. WebGraphのroot directoryで mvn install を実行し、webgraphのjarファイルを生成する。 webgraph-x.x.x.jarはwebgraph/targetフォルダにある。

Step 4. Webgraphと依存関係が存在する他のjarファイルをダウンロードし、展開する。[依存jarファイルのダウンロード](http://webgraph.di.unimi.it/webgraph-deps.tar.gz)

Step 5. Step 3で生成されたwebgraph.x.x.x.jarファイルとStep 4でダウンロードしたファイルを同じdirectoryにまとめる。

Step 6. .bashrcファイルでjavaのclasspathを設定する。 classpathがStep5で用意したjarファイルを指すように設定する。

#WebGraphの引用

1. JavaのMavenプロジェクトを作成し、dependencyでwebgraph.x.x.x.jarファイルを追加することで、java programでwebgraphを使う。
2. WebGraph frameworkをそのまま使うことも可能。

例：  
a. Laboratory for Web Algorithmicsのデータセットをedgelistに変換
```
java -Xmx8192m it.unimi.dsi.webgraph.ArcListASCIIGraph basename newName ```
b. recompresses a dataset with other parameters:
```
java -cp "*" it.unimi.dsi.webgraph.BVGraph -o -m 1 ../sets/uk-2002 ../sets/uk-fast
```

もっと詳しい応用は[こちらへ](https://github.com/lhelwerd/WebGraph/blob/master/README.txt)

#大規模ネットワークデータの獲得

[Laboratory for Web Algorithmics](http://law.di.unimi.it/datasets.php)からdataname.propertiesとdataname.graphをダウンロードし、 webgraphを使うことにより、edgelistデータ、degree distribution, average degree, average distanceなどの特徴量を獲得する。
Git: 特定の変更中のファイルの一覧を取得して何かする

大量の変更の中からあるクラスHogeを使った個所だけをまとめて小さいコミットにしたかったが、全部の差分を目視して確認したくなかったので考えた記録。

`git ls-files` の `-m` オプションで変更のあるファイルの一覧を出せたので

`ag -l HOGE $(git ls-files -m) | xargs git diff`

で関係ありそうな個所をチェックして

```
ag -l HOGE $(git ls-files -m) | xargs git add
git commit
```

もしファイル内で含めなくない行があったら `git add -p` で調整する。
Ubuntu16.04にDockerをインストール

## Dockerのインストール
0. rootユーザでログイン

    ```bash
    $ sudo su
    ```

0. 最新のDockerパッケージをインストールする  

    ```bash
    # curl -fsSL https://get.docker.com/ | sh
    ```

0. 一般ユーザに"docker"グループの追加  

    ```bash
    # gpasswd -a username docker
    ```

0. 一般ユーザで再度ログインして、hello-worldを実行する

    ```bash
    # exit
    // ログアウト
    // ログイン(再起動でもOK)
    
    $ docker run hello-world
    ```

## 備考
公式サイトの通りにインストールしてみたのですが、どうもうまく行かなかったので調べてみました。
Ubuntuではdockerというグループで実行しなくてはいけないようですね。

もしdockerが起動していないようだったら、

  ```bash
  $ sudo service docker start
  ```
として、Dockerを起動します。

## 参考
[公式サイト](https://docs.docker.com/linux/step_one/)
[DockerをLinux(Ubuntu 14.04 LTS)にインストールする方法と解説](http://tracpath.com/works/devops/how_to_install_the_docker/)
fablicでGitデプロイ

## やりたかったこと

コマンド一発で複数台サーバにGitデプロイ

## 参考URL

http://fabric-ja.readthedocs.io/ja/latest/tutorial.html
このページ読めば大体理解できます

## インストール
```
sudo yum install fabric

# 確認
fab --version
python --version
```

## fabfile.py作成

```
cd project/path
vim fabfile.py
```

``` file:fabfile.py
# coding: utf-8

from __future__ import with_statement
from fabric.api import run, env, abort, cd
from fabric.contrib.console import confirm

# デプロイ先のサーバ設定（この場合は2か所にデプロイ）
env.hosts = [
    'hoge_username@hoge.com',
    'fuga_username@fuga.com'
    ]
env.passwords = {
    'hoge_username@hoge.com:22': 'hoge_password',
    'fuga_username@fuga.com:22': 'fuga_password'
    }

# env.hostsの数だけ実行される
def deploy():
    hostname = run('hostname')
    
    # 確認
    if not confirm(hostname + " <- このサーバにデプロイします、よろしいですか？"):
        abort("中止しました")

    # デプロイ
    project_path = '/project/path/html'
    with cd(project_path):
        run("git pull origin master")
```

#### Point
* `run('any command')`で外部サーバ上でコマンドが実行できる
* `cd('path/to')`で外部サーバ上でディレクトリ移動ができる

## デプロイ実行

```
fab deploy
```

fabコマンドはカレントディレクトリの`fabfile.py`を処理対象とします
ActionBar左上のホームボタンのイメージ変更

## setHomeAsUpIndicator を使う
`getSupportActionBar().setHomeAsUpIndicator(R.drawable.icn_close);`
ToolBarとかカスタムViewとかいろいろ試してたら普通にメソッドあった...

## リファレンス
https://developer.android.com/reference/android/app/ActionBar.html?authuser=0#setHomeAsUpIndicator(android.graphics.drawable.Drawable)
SpringBootでEntity設計時に知りたいアノテーション

#はじめに
SpringBootをいじってる際にアノテーションが多く、一覧がほしかったのでまとめました。
勉強中のため、間違いがある可能性があります。気づいた方はご指摘ください

#アノテーション一覧表

|	アノテーション	|	機能・意味合い	|
|	:---	|	:---	|
|	`@`Entity	|	Entityクラス	|
|	`@`Table(name = "hoge")	|	テーブル名	|
|	`@`Table(name="foo", schema="bar")	|	テーブル名とスキーマ名	|
|	`@`Id	|	主キーを指定	|
|	`@`EmbeddedId	|	複合主キー<BR>（with `@`Embeddableクラス）	|
|	`@`Embeddable	|	Serializableを継承した主キーをもつクラス	|
|	`@`IdClass(MimaKey.class)	|	複合主キーをもつクラス（EmbeddedIDと別）	|
|	`@`Column(name = "hoge")	|	カラム名	|
|	`@`Column(name = "hoge" ,length = 10)	|	カラム長	|
|	`@`Column(name = "hoge" ,nullable = true/false)	|	nullを許容/許容しない	|
|	`@`Basic(optional = true/false)	|	nullを許容/許容しない	|
|	`@`GeneratedValue(strategy = GenerationType.IDENTITY)	|	自動採番(最適設定）	|
|	 `@`GeneratedValue(strategy = GenerationType.AUTO)	|	自動採番(DBのidentityを利用）	|
|	`@`GeneratedValue(strategy = GenerationType.SEQUENCE, generator = ""seq_gen"")<BR>`@`SequenceGenerator(name = ""seq_gen"", sequenceName = ""seq"", allocationSize = 1)"	|	自動採番(Oracle)	|
|	`@`Temporal(TemporalType.DATE)	|	日付	|
|	`@`Temporal(TemporalType.TIME) 	|	時刻	|
|	`@`Temporal(TemporalType.TIMESTAMP)	|	日付と時刻	|
|	`@`Transient	|	永続化対象外	|
|	`@`Enumerated(EnumType.STRING)	|	Enumの文字列	|
|	`@`ElementCollection	|	基本型のコレクション型	|
|	`@`ElementCollection(fetch = FetchType.EAGER)	|	基本型のコレクション型を即時ロード	|
|	`@`CollectionTable	|	コレクションの要素を取得するテーブル（"エンティティ名_フィールド名"）	|
|	`@`CollectionTable(name = "hoge")	|	コレクションの要素を取得するテーブル	|
|	`@`Column(name = "value")	|	カラムを指定	|
|	`@`OrderBy("DESC")	|	ソート条件（降順）	|
|	`@`CollectionTable(name = "hoge", joinColumns = `@`JoinColumn(name = "value") )	|	結合	|
|	`@`MappedSuperclass	|	子クラスがEntitiyのときの親クラス	|
|	`@`ManyToOne	|	多対一関連定義	|
|	`@`OneToMany(mappedBy = "hoge")	|	一対多関連定義	|
|	`@`OneToOne(mappedBy = "hoge")	|	一対一関連定義	|
|	`@`JoinColumn(name = "hoge")	|	結合に用いるカラムを指定	|


#参考サイト
+ [2.6.20　`@`GeneratedValue Cosminexus アプリケーションサーバ V8　リファレンス API編](http://itdoc.hitachi.co.jp/manuals/link/cosmi_v0870/APR4/EU260072.HTM#ID00294)
+ [2.6.20　`@`GeneratedValue Cosminexus アプリケーションサーバ V8　リファレンス API編](http://itdoc.hitachi.co.jp/manuals/link/cosmi_v0870/APR4/EU260072.HTM#ID00294)
+ [JPA注釈の参照情報](http://otndnld.oracle.co.jp/products/ias/toplink/jpa/resources/toplink-jpa-annotations.html)
+ [JPA (Java Persistence API)のアノテーション SE学院](http://itref.fc2web.com/java/jpa/annotation.html)
+[`@`Basic(optional = false) vs `@`Column(nullable = false) in JPA](http://stackoverflow.com/questions/2899073/basicoptional-false-vs-columnnullable-false-in-jpa)
+ [JavaEE使い方メモ（JPA その１ - 基本）](http://qiita.com/opengl-8080/items/e4840aa3e33b42ae0d6b)
+ [JavaEE使い方メモ（JPA その２ - マッピング）](http://qiita.com/opengl-8080/items/265f9f66a65e966678cb)
+ [JavaEE使い方メモ（JPA その３ - JPQL）](http://qiita.com/opengl-8080/items/e074330b5f4862d9995f)
+ [JavaEE使い方メモ（JPA その4 - クライテリアAPI）](http://qiita.com/opengl-8080/items/6e3e03e4c90cd3d5e211)
+ [JPA関連アノテーションの基本として-その1-](http://etc9.hatenablog.com/entry/20090830/1251606823)
+ [JPA関連アノテーションの基本として-その2-](http://etc9.hatenablog.com/entry/20090831/1251728605)
Android UI Tips その1



UIのちょっとしたあれこれメモ

# padding分もスクロール領域にしたい

ListViewやRecyclerViewなどでpaddingだけを指定するとその余白分はスクロール領域になりません。
アイテムが途切れているように見えるため、その場合は`android:clipToPadding`で`false`を指定します。

```xml
<android.support.v7.widget.RecyclerView
    android:padding="8dp"
    android:clipToPadding="false"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

</android.support.v7.widget.RecyclerView>
```

# ListViewなどをスクロール可能なViewに見せたくない

アイテム数が固定のリストを表示するなどの場合、スクロールさせる必要がありません。
しかし、そのままだとスワイプなどでスクロール限界のフィードバック（青くなったりするやつ）が残ってしまいます。
その場合は`android:overScrollMode`で`never`を指定します。

```xml
<android.support.v7.widget.RecyclerView
    android:overScrollMode="never"
    android:layout_width="match_parent"
    android:layout_height="128dp">

</android.support.v7.widget.RecyclerView>
```
［Javadoc］Javadocとは

#Javadocとは

Javaでは、「Javadoc」と呼ばれるコメントを記述できる。これは、プログラムについて説明するドキュメントをソースコードに埋め込むためのものである。
　
Javadocは、クラスの概要やメソッドの概要を記述しておくと、その情報からHTML形式のドキュメントファイルを生成してくれる。
Java Platform SEのAPIリファレンスは実際に、この機能を使って生成されている。
　
##Javadocの書き方

Javadoc内では、コメントを記入する際にクラスやメソッドの役割を示すためにタグを使用する。使用できるタグには以下の種類があります。

| タグ名   　　　　   | 説明　|
|:-------------|:--------------------|
| @author      | クラスの作成者情報を記載　|
| @param       | メソッドの引数の説明　|
| @return      | メソッドの返り値の説明 |
| @throw       | 発生する例外クラスを指定 |
| @see         | 他のAPIを参照する場合に記載 |
| @deprecated  | 推奨されないAPIであることを示す |
| @serial      | 直列化されたフィールドの説明 |
| @sesrialData | 直列化された状態でのデータ型と順序を記載 |
| @since       | 導入されたバージョンを記載 |  
| @version     | バージョンを記載 |


##XCode
XcodeでメソッドのJavadocコメント追加を瞬時に行えるようにする プラグイン[VVDocumenter-Xcode]を試す

###使いかた
method の前で /// ← と入力するだけ 

※ 注意点としては、プラグインの最新版はXcode 4には対応していない
※ Xcodeのショートカットに依存しているので[Paste]と[Delete to Beginning of the Line]がデフォルトと異なる場合にはうまく動作しない

###インストール
次のコマンドを実行してください。

> git clone  https://github.com/onevcat/VVDocumenter-Xcode.git
> cd VVDocumenter-Xcode 
> xcodebuild -project VVDocumenter-Xcode.xcodeproj  

その後、Xcodeを再起動をお願いいたします。


~/Library/Application\ Support/Developer/Shared/Xcode/Plug-ins にプラグインフォルダが生成されているので、アンインストールしたいときはこれを削除してください。

## 関連記事

【About】(http://qiita.com/sunstripe) - サンストライプ

---

## 制作チーム：サンストライプ

[![sunstripe_logo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80600/322f2d60-f19d-af9e-2b6f-7290ca546848.png)](http://sunstripe.main.jp/)
http://sunstripe.main.jp/

(月１WEBコンテンツをリリースして便利な世の中を作っていくぞ！！ボランティアプログラマー/デザイナー/イラストレーター/その他クリエイター声優募集中！!)

### 地域情報 THEメディア
THE メディア 地域活性化をテーマに様々なリリース情報も含め、記事をお届けしてます！！
https://the.themedia.jp/

### ゼロからはじめる演劇ワークショップ
多様化の時代に向けて他者理解を鍛える

https://workshop.themedia.jp/

### プログラミングワークショップ・ウェブ塾の開講！！！
様々なテーマでプログラミングに囚われずに取り組んでいきます。
詳しくはこちら　↓　↓　↓　↓　↓　↓　↓　↓
[プログラミングサロン 月１だけのプログラミング学習塾](https://workshop.themedia.jp/posts/7057553?fbclid=IwAR32CfRQ7RvDOhvuogoSwqxDLMOU7Jvuzljlnx-TMc27qBPX1BnWsfLcBR8
)

### 協力応援 / 支援者の集い
## チーム：サンストライプ
#### プログラミングラボ
https://twitter.com/sunstripe2011

一緒にポートフォリオを作りませんか？現場の体験やそれぞれの立場から年齢関係なく作品を作りたい方々と一緒にチームを作って、作品を作っています。現場に行きたい人には、職場紹介や職場の体験や悩み相談なども受けております。
様々な職種からプログラミングの知識を得たい、デザインの知識を得たい、データーベースの知識を得たいという人が集まっております。
週１のミーティングにそれぞれの近況と作業報告して、たまにリモート飲み会などをしております！！

興味がある方は、DMに話しかけてみてください。

## トラストヒューマン
http://trusthuman.co.jp/
私たちは何よりも信頼､人と考えてます｡

｢コンサルティング｣と｢クリエイティブ｣の両角度から｢人材戦略パートナー｣としてトータル的にサポートします！！

キャリア教育事業
広域学習支援プラットフォーム『のびのび日和』
https://slc-lab.amebaownd.com/