OmniAICreator/Qiita-1.07M huggingface dataset:
Ubuntu MATEで文字化けせずにzipファイルを展開するスクリプトを作りました

> ※この記事は私の[ブログ](http://nmtysh.hatenablog.com/entry/2016/08/03/214910)にも投稿しています。

Ubuntu MATEのCaja(Nautilus)上でzipファイルを右クリックして「展開」すると文字化けします。MATEの書庫マネージャーであるEngrampa(file-roller)で読み込んでも文字化けします。
文字化けは[Japanese Teamのリポジトリ](https://www.ubuntulinux.jp/japanese)を有効にして ubuntu-defaults-ja をインストールしても解消されません。
これはMATEの依存関係でp7zip-fullがインストールされているためです。(Engrampaが依存しているので削除できません)
そしてfile-rollerは仕様としてunzipよりも7zのコマンドを優先して使用してしまうためです。
端末からunzipを行えば文字化けせずに展開できますが、毎回コマンドで展開するのは手間がかかるのでCajaから実行できるシェルスクリプトを作成しました。

# 0. 環境

- Ubuntu MATE 16.04 LTS

# 1. スクリプトファイルを作成する

`~/.config/caja/scripts` に任意のファイル名でファイルを作成します。

    #!/bin/bash
    
    for arg
    do
        basename=${arg##*/}
        extension=${basename##*.}
        case "${extension}" in
            zip)
                unzip -OCP932 "${arg}"
                ;;
            rar)
                unrar -x "${arg}"
                ;;
            7z)
                p7zip -d "${arg}"
                ;;
            *)
                # unknown file
                ;;
        esac
    done
    exit 0


# 2. 実行権限を付与する

作成したスクリプトファイルに実行権限を付与します。

```bash
$ chmod u+x ~/.config/caja/scripts/extract.sh
```

# 3. Cajaから実行する

展開したい圧縮ファイルを選んで(複数選択可)、コンテキストメニューの「スクリプト」→「(1で作ったスクリプト)」を選択してスクリプトを実行します。
これで文字化けせずにファイルを展開できます。

※rarを展開する場合は、 unrar-free ではなく unrar (non-free) のインストールをおすすめします。


# X. 参考

- [夜な夜な涙とともにパンをかじった。: 右クリックメニューの拡張 scripts nemo caja コードページエラーZipの克服](http://poor-user.blogspot.jp/2016/04/scripts-nemo-caja.html)
ArukasでWordpressをMariaDBで動かす

Arukasを試した時のメモ。

# MariaDB
![arukas_mariadb.png](https://qiita-image-store.s3.amazonaws.com/0/135041/913f3c7e-14dc-f8c7-f2b0-f655bbeaa1db.png)

https://hub.docker.com/_/mariadb/

* Image
    * mariadb:latest
* Endpoint
    * mariadb001
* Port
    * 3306
* ENV
    * MYSQL_ROOT_PASSWORD
    * MYSQL_DATABASE
    * MYSQL_USER
    * MYSQL_PASSWORD

とりあえずWordpressのデータを入れるのに使うデータベースと、
ユーザーとパスワードを環境変数として設定。

# Wordpress
![arukas_wordpress.png](https://qiita-image-store.s3.amazonaws.com/0/135041/480d92ea-e30b-194d-ee12-fe474eee0122.png)


https://hub.docker.com/_/wordpress/

* Image
    * wordpress:latest
* Endpoint
    * wordpress002
* Port
    * 80
* ENV
    * WORDPRESS_DB_HOST
        * 作成したMaritDBのPort項目のURLを指定
    * WORDPRESS_DB_USER
    * WORDPRESS_DB_PASSWORD
    * WORDPRESS_DB_NAME

# 表示確認
作成したWordpressのendpointをブラウザで表示。

https://wordpress002.arukascloud.io

これ以降は通常のWordpressセットアップ手順と一緒。
今回はただ立ち上げただけなのでセキュリティはガバガバ。

# 注意点
https://arukas.io/help/help-specification/
Arukasのアプリで使っているストレージは揮発性なので、アプリを再起動したら全部消えます。
またβ版なので勝手に再起動してデータが消える可能性もあります。
そのあたりを理解したうえでArukasで遊ぼう。
`zplug` と `prezto` を install してみた。

# plugin manager の選択

`zsh` の plugin manager には `antigen` , `antibody` , `zgen` ... といくつかあるようですが、そのなかで `zplug` が良さそうだと判断しました。 作者のドキュメント http://blog.b4b4r07.com/entry/2015/12/13/174209 がわかりやすかったので、これなら私でもできそうだと思ったわけです。

# `zplug` の install

https://github.com/zplug/zplug の README.md を読むと、 install の 「 The best way 」として

```
$ curl -sL zplug.sh/installer | zsh
```

と書かれています。この 1 行を `zsh` にcopy & paste して `enter` を叩いたら install できました。簡単です。

# prezto の clone

`.zshrc` に、以下の記述を加えます：

```
source ~/.zplug/init.zsh

zplug "sorin-ionescu/prezto"

zplug load --verbose
```

そうしたら、 `zsh` を再起動して、

```
$ zplug install
```

と叩きます。これで、 `prezto` の repository が `$HOME/.zplug/repos/sorin-ionescu/prezto` に clone されます。

# prezto の install の準備

ここで `prezto` の `README.md` https://github.com/sorin-ionescu/prezto を見てみましょう。

> Clone the repository:

```
git clone --recursive https://github.com/sorin-ionescu/prezto.git "${ZDOTDIR:-$HOME}/.zprezto"
```

と書いてありますね。標準では `$HOME/.zprezto` に clone することを想定しているわけです。いま我々は `$HOME/.zplug/repos/sorin-ionescu/prezto` に clone したので、 symbolic link を張ってやりましょう。

```
$ ln -s $HOME/.zplug/repos/sorin-ionescu/prezto $HOME/.zprezto
```

で OK です。

また、ここからの手順で、 `.zshrc`, `.zlogin`, `.zlogout`, `.zprofile`, `.zshenv` が overwrite されてしまうので、必要に応じ退避しておきます。

# prezto の install

`README.md` https://github.com/sorin-ionescu/prezto に従い、

```
setopt EXTENDED_GLOB
for rcfile in "${ZDOTDIR:-$HOME}"/.zprezto/runcoms/^README.md(.N); do
  ln -s "$rcfile" "${ZDOTDIR:-$HOME}/.${rcfile:t}"
done
```

を実行します。これで完了します。 `zsh` を再起動すると prompt がきれいになっているはずです。

# 参考

おい、Antigen もいいけど zplug 使えよ
http://qiita.com/b4b4r07/items/cd326cd31e01955b788b
ナビゲーションバーの戻るボタンの文言をstoryboardで変える

iOSアプリのナビゲーションバーに自動で表示される「戻る」ボタンは、遷移前のViewControllerのタイトルが自動で使われるが、これを自由に変更したい時がある。

## Storyboardで変更したい

そういう時は、Storyboardで"遷移前"のNavigation ItemのBack Buttonに記載すればいい。

図はStackOverflowにある
http://stackoverflow.com/questions/24693248/ios-storyboard-back-button/24695475#24695475

## コードで書きたい

これをどうしてもコードで書きたいと、Storyboard(IntefaceBuilder)という便利でフレンドリーなやつがあるのにそれを使わずに条件分岐によって書き換えたい場合や、もしくは特殊な性癖のせいで常人には理解できない理由がある人は次のようにするとコードで変えられる。

```swift
// 遷移前のViewControllerだよっ...！！！
override func viewDidLoad() {
    super.viewDidLoad()
    
    navigationItem.backBarButtonItem = UIBarButtonItem(title: "戻ります", style: .Plain, target: nil, action: nil)
}
```

遷移後の画面の表示なのに遷移前のnavigationItemに設定するというのは基本的には遷移前のタイトルを使うからなんだろうなあ、と覚えると2日くらいは覚えていられる。
【Unity】Wikipediaから情報を取得して表示させてみる【ネタ】

# はじめに

Wikipediaの情報をUnity上で取得してUnity上で表示させてみたいなぁ。　 とおもったので作ってみました。

この記事ではバージョン5.3.5f1のUnityを使います。

# 作ったものについて
指定したWikipedia記事がどの記事からリンクされているかを取得して表示させるだけものを作ってみました。
<br>
![image](https://qiita-image-store.s3.amazonaws.com/0/44288/ffb5160e-55b6-6afe-dc6b-558a94ca2b15.png)

# Wikipediaの情報を表示させるまでの流れ
ざっくりと書くとこんな感じになります

WWWクラスを使ってWikipediaからJSONを取得 
　> 　JsonUtilityを使ってJSONをObjectへ変換
　　>　 Objectをメンバ変数に格納（インスペクターに表示される)


# ソースコード
以下はソースコードとなります。 シーン内の適当なオブジェクトにアタッチして再生すれば動きます

``` WikipediaManager.cs
using UnityEngine;
using System.Collections;
using System.Collections.Generic;

public class WikipediaManager : MonoBehaviour
{
	public string title = "シーラカンス";

	public Wikipedia.RootObject wikipedia;

	IEnumerator Start()
	{
		var param = new Dictionary<string, string> ();

		param ["format"] = "json"; // JSON形式で取得
		param ["action"] = "query"; // アクション
		param ["prop"] = "links"; // リンクを取得
		param ["bltitle"] = title; // 記事タイトル
		param ["list"] = "backlinks"; // リンク元を取得
		param ["bllimit"] = "16"; // 取得するリンク数の上限

		// WikipediaからJSONを取得
		WWW www = this.GET("http://ja.wikipedia.org/w/api.php?", param);
		yield return www;
		Debug.Log(www.text);

		// JSONデータ -> Wikipediaオブジェクト
		var wikipedia = JsonUtility.FromJson (www.text, typeof(Wikipedia.RootObject)) as Wikipedia.RootObject;
		this.wikipedia = wikipedia;
	}

	private WWW GET(string url, Dictionary<string,string> param)
	{
		foreach (var p in param)
		{
			url += string.Format ("{0}={1}&", p.Key, p.Value);
		}

		WWW www = new WWW (url);
		StartCoroutine (WaitForRequest (www));
		return www;
	}

	private IEnumerator WaitForRequest(WWW www)
	{
		yield return www;

		// check for errors
		if (www.error == null) {
			Debug.Log ("WWW OK");
		} else {
			Debug.Log ("WWW Error: " + www.error);
		}
	}
}
```

以下は JSONデシリアライズ用に用意したクラスです.  

```Wikipedia.cs
using UnityEngine;
using System.Collections.Generic;

namespace Wikipedia
{
	[System.Serializable]
	public class Backlink
	{
		public int pageid;
		public int ns;
		public string title;
		public string redirect;
	}

	[System.Serializable]
	public class Query
	{
		public List<Backlink> backlinks;
	}

	[System.Serializable]
	public class RootObject
	{
		public string batchcomplete;
		public Query query;
	}
}
```

# Titleを変えて実行してみる
Titleを変えて実行すると異なる結果が表示されます。

試しにマクドナルドと入れてみると....
<img width = 400 src = "https://qiita-image-store.s3.amazonaws.com/0/44288/da04fb92-d59b-e309-acb0-4d350c79ef58.png">
<a href = "https://ja.wikipedia.org/wiki/%E5%AE%87%E5%A4%9A%E7%94%B0%E3%83%92%E3%82%AB%E3%83%AB">宇多田ヒカル</a>からリンクされているみたいです。

<br>
<img height = 200 src = "https://qiita-image-store.s3.amazonaws.com/0/44288/4a17e038-e3e9-117c-34dc-7dc8e99a5196.png">

だいぶ下のほうにありました。　文字列を適当に入れるだけでもけっこう遊べますね。 (完

#参考URL
MediaWiki APIを使ってWikipediaの情報を取得
http://qiita.com/yubessy/items/16d2a074be84ee67c01f#%E8%A8%98%E4%BA%8B%E3%81%8B%E3%82%89%E3%83%AA%E3%83%B3%E3%82%AF%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B%E8%A8%98%E4%BA%8B%E3%81%AE%E4%B8%80%E8%A6%A7%E3%82%92%E5%8F%96%E5%BE%97

JsonからC#のクラスモデルを作成してくれるサイト リンク
http://qiita.com/maeda_t/items/8da3ac3826988adf6f32

Unity5.3でJsonを扱うまとめ
http://qiita.com/toRisouP/items/53be639f267da8845a42
C#とXPathで名前空間を無視してXMLを解析する


XDocumentという便利なXML操作用のクラスがあります。このクラスは通常ではXPathによる検索、解析用の機能はありません。

ところが、`System.Xml.XPath`をusingするとXPath用の拡張メソッドが使えます。とても便利です。これでXPathで楽に要素の取得ができます。

```csharp
//XDocumentでXPath用の拡張メソッドを使うのに必要
using System.Xml.XPath;
```

しかし、XMLが名前空間付きの場合、面倒な問題があります。いちいち名前空間（namespace）を指定しないといけないのです。

## 名前空間を指定する場合

```csharp
//XML文字列からXDocumentオブジェクトを生成
var doc = XDocument.Load(new StringReader(xmlString));

//名前空間のための処理
string nameSpace = "http://example.com";
var nsmgr = new XmlNamespaceManager(new NameTable());
nsmgr.AddNamespace("ns", nameSpace);

//名前空間を指定して検索
var nodeD = doc.XPathSelectElement("ns:nodeA/ns:nodeB/ns:nodeC/ns:nodeD", nsmgr);
```

XmlNamespaceManagerを作り、XPathSelectElementを呼び出す度にこれを渡さないといけません。それだけならまだいいのですが、XPathの指定で毎回ns:を付けるのが非常に面倒だし可読性も悪いです。

## 名前空間を無視して検索する

以上のように名前空間を指定すると色々面倒です。
この問題の解決策として、名前空間を無視して解析する方法が以下です。

```csharp
//XML文字列からXDocumentオブジェクトを生成
var doc = XDocument.Load(new StringReader(xmlString));

//各ノードのNameを名前空間なしの要素名にする
foreach(var e in doc.Descendants())　e.Name = e.Name.LocalName;

//上記処理により、検索時に名前空間の指定が不要
var nodeD = doc.XPathSelectElement("nodeA/nodeB/nodeC/nodeD");

```

無理矢理な感じですが、動いているので多分大丈夫でしょう。
これですっきり！
やっぱり私がUbuntuになってしまった理由 (Windows 10 Anniversary Update)

要するに
=======

ターミナルがすべての原因です

cmd.exeは無理で、[Windowsで使えるターミナルとシェルのまとめ - Qiita](http://qiita.com/Ted-HM/items/9a60f6fcf74bbd79a904) この辺見ながら最終的に [cmder](http://cmder.net/) を選んだのですが、やっぱダメでした

日本語(UTF-8)も、**表示は** 調子がいいのです
------------------------------------

![キャプチャ1.PNG](https://qiita-image-store.s3.amazonaws.com/0/22754/9605e559-3ab8-f8f2-bd4d-b074c7f09216.png)

しかし！vimで日本語入力すると、こんな感じで崩れます(注: いろいろやったけど、だめだった)

![キャプチャ2.PNG](https://qiita-image-store.s3.amazonaws.com/0/22754/c5bf659a-9a5b-8699-0246-1ff3305855cf.png)


start.exeでexplorer.exe等のWin32バイナリが起動できない
---------------------------------------------------

当たり前の話なのですけど、これが使えないのは地味に困るんです

![キャプチャ3.PNG](https://qiita-image-store.s3.amazonaws.com/0/22754/2e0a7765-ed49-385e-1cb6-e2033a535a8e.png)

※ `/sbin/start` は Upstart の制御用ですね

![キャプチャ4.PNG](https://qiita-image-store.s3.amazonaws.com/0/22754/06cedecf-7e64-e50f-0700-bee406b40939.png)

KaoriyaさんのgVimが起動できない。。。


総括
----

[Xming](https://sourceforge.net/projects/xming/) とかいれてX Windowを使うって方法も考えられるのですが、、、少なくとも gnome-terminal は起動できませんでした

Windowsは直接関係ありませんが、先日リリースされた Docker 1.12でサポートされたWindows対応も、内部的には Hyper-V を使っており、2GBくらいメモリを要求されるのですが、4GBなPCでは動かないのも決定打となってしまいました


Windows 10 Anniversary Update で Bash on Ubuntu on Windows を使う方法
====================================================================

念のため、書いておきます

1. 開発者向け設定 から 開発者モード にする (要 再起動)
2. アプリと機能 → プログラムと機能 → Windowsの機能の有効化または無効化 から Windows Subsystem for Linux を有効化 (要 再起動)
3. cmd.exe上 で `bash.exe` を起動、インストールを開始

これでBashが動きます

あとがき
========

Windowsが悪いわけじゃありません。 というか、よくできていまして、ssh するのであれば十分役に立ちます！

が、それ以上にLinux上での開発が多かった自分が悪いのです
c++ builder / TTimer > Intervalの最大値 > 4294967295 > 1193時間

```txt:動作環境
C++ Builder XE4
```

関連 http://qiita.com/7of9/items/8f7502d64a8b81f99445

リトライする間隔をTTimer->Intervalで指定する。

その場合、TTimer->Intervalの上限はいくらなのか？

実際にTTimerのプロパティIntervalに9999999999999999などの値を入れた時に、以下のメッセージが表示された。

> 値は 0 から 4294967295 までの値でなければなりません。

4294967295 msec
= 4294967 sec
= 1193時間

これほど長い間隔のリトライはすることはないだろう。

10分間隔などは問題ない。
rails5 + unicorn + nginx : ログローテーション

ログの容量が増えると管理しにくいことと追跡が難しくなるため、ログローテーションをしたい。

rails関連のログローテーションをlogrotateで管理する。

##logrotateにログローテーションを作成する

まずlogrotate.d配下にあるものを確認してみる。

```
$cd /etc/logrotate.d

$ls -l

合計 36
-rw-r--r-- 1 root root 103  9月 14  2015 dracut
-rw-r--r-- 1 root root 185  3月  7 23:48 httpd
-rw-r--r-- 1 root root 118  6月 23 09:42 mackerel-agent
-rw-r--r-- 1 root root 907 11月 11  2015 mysqld
-rw-r--r-- 1 root root 204  2月 19 22:52 nginx
-rw-r--r-- 1 root root 329  9月 10  2014 psacct
-rw-r--r-- 1 root root 210 11月 11  2014 syslog
-rw-r--r-- 1 root root 100 10月 15  2015 yum
```

ログローテーション設定ファイルを作成します。

```
touch unicorn
```

作成したファイルに設定を記載します。

```
$sudo vim unicorn

/var/www/rails/app/current/log/*.log {
  daily
  missingok
  rotate 7
  dateext

  compress
  delaycompress
  copytruncate

  create 0666 ec2-user ec2-user

  lastaction
    pid=/var/www/app/current/tmp/pids/unicorn.pid
    test -s $pid && kill -USR1 "$(cat $pid)"
  endscript
}
```

- daily：ログローテーションを毎日行う
- missingok：指定のログファイルがなくてもエラーを出さずに処理を続行する
- rotate：ログローテートの世代管理は7
- dateext：ログローテートを日付形式にする
- lastaction~endscript
    - unicornには、USR1シグナル(プロセスの動作を中断させたり、再開、変更といった合図を送るための指定)を送ると、ログファイルを開き直してくれる機能があります。
    - test -s \$pid「ファイルが存在すれば」kill -USR1 "\$(cat \$pid)"「pidをUSR1でkillする

##テスト
設定が終了したらテストで実行してみます。

```
$cd /etc/logrotate.d

$logrotate -df /etc/logrotate.d/unicorn
```
- d : デバッグモード 
- f : 強制実行

##実行（手動で適用）

```
$logrotate -f /etc/logrotate.d/unicorn

$ls -l /var/www/rails/app/current/log

total 652
-rw-rw-r-- 1 vagrant vagrant 553843 Sep 20 12:19 development.log-20160213
-rw-rw-r-- 1 vagrant vagrant  99141 Sep 20 12:19 unicorn.stderr.log-20160213
-rw-rw-r-- 1 vagrant vagrant      0 Dec 21  2014 unicorn.stdout.log-20160213
```

logrotateはcronから起動されるので、以上で設定完了です。再起動は不要です。
ログをチームメンバーと手軽に共有する

## TL;DR

- [`gist`](https://github.com/defunkt/gist) コマンドを使ってログを private gist にアップロードすると共有するのが楽
    - オプションには　`-pof LOG_NAME` を指定する
- カラーシーケンスを取り除かないと汚くなるので、コマンドを用意しておくといい

## モチベーション

何か作業をしていてそのログをチームメンバーと共有したくなることがあります。

ログにコメントしたりなんだかんだしたいので、gistとか使うと楽そうです。

## gistコマンド

[`gist`](https://github.com/defunkt/gist) コマンドはファイル、もしくはSTDINをgistにアップロードしてくれるコマンドです。

### セットアップ

インストールは簡単で

```bash
# Mac
brew install gist
# Other
gem install gist
```

認証情報を設定します

```bash
gist --login
```

と実行すると、ユーザIDとパスワードを聞かれるので、それらを入力したら完了です。

### 使う

```bash
some-command | gist -pof LOG_NAME
```

`gist` コマンドはこのようにパイプすることで標準入力で受け取った内容をgistにアップロードしてくれます。ここでは3つのオプションを使っています:

<dl>
<dt>-p, --private</dt>
<dd>private gistにアップロードする
<dt>-o, --open</dt>
<dd>アップロードが完了したらブラウザでそのgistファイルを開く</dd>
<dt>-f, --filename [NAME.EXTENSION]</dt>
<dd>アップロードするときにファイル名を指定する。指定しないとデフォルトで "a.rb" が使われる</dd>
</dl>

`-o` がついていると、コマンド実行している間に他のことをしていても、ブラウザが開くことでコマンドの完了を知ることができるので便利です。

後はブラウザで開いたURLをメンバーと共有すれば完了です。簡単ですね。

## カラーシーケンスを取り除く

ログの中にはANSIのカラーシーケンスを出力するものがあると思いますが、gistでは綺麗に表示できないので取り除いた方がいいです[^1]

以下のようにaliasを作って

```bash
alias strip-color="perl -MTerm::ANSIColor=colorstrip -ne 'print colorstrip(\$_)'"`
```

`gist` コマンドにいれる前に `stip-color` を通すと便利です。`Term::ANSIColor` モジュールはperl本体にバンドルされているので、どの環境でも使えるはずです。

```bash
some-command | strip-color | gist --private -o -f log-name
```

[^1]: 綺麗に表示する方法をご存じの方は教えてください :pray:
Rails でふわっとモダンっぽい JavaScript 開発

# webpack を使う。
ツイッターでBrowserify良いとかアホっぽくつぶやいたところ元上司から

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr"><a href="https://twitter.com/mayutan">@mayutan</a> 今から使うならwebpackでいいんじゃないかな</p>&mdash; nekoya (@nekoya) <a href="https://twitter.com/nekoya/status/750627178899845120">2016年7月6日</a></blockquote>

とか反応があったのでwebpackに鞍替え。クライアント側はテンプレートとべったりなので完全分離はあきらめる。そこで割りきって適当に離すことにする。↓ここを参考に。

http://clarkdave.net/2015/01/how-to-use-webpack-with-rails/
http://qiita.com/necojackarc/items/afa674ab10aafa9784eb

# 前提
- Rails　初心者
- Rails　4.2.1
- Rails　ちゃんにインされてる JQuery であれこれ実装されている。
- javascript は project/app/assets/javascripts/ 以下にすべて配置してある。
- Rails　ちゃんが　precompile したものが project/public/assets/javascripts/ 以下にコピーされる。
- project/app/assets/javascripts/app 以下に angular アプリを置く。
- あまりこだわると死をみるのでゆるく。


## インストールなど準備
- ES6 で書いてみようと思うので project 直下で

```
npm install -g webpack
npm install -D webpack babel babel-loader babel-core
npm install --save angular
```

- babel の preset を使う

```
npm install -D babel-preset-es2015 babel-preset-stage-2
```

- 開発環境でビルドできるように設定

```js:project/app/assets/javascripts/app/config/development.js

module.exports = {
  devtool: 'inline-source-map',
  entry: {
    application: './app/assets/javascripts/app/app.js',
  },
  output: {
    path: './app/assets/javascripts/app',
    filename: '[name].js'
  },
  module: {
    loaders: [
      {
        test: /\.js$/,
        exclude: /node_modules/,
        loader: 'babel?presets[]=es2015,presets[]=stage-2'
      }
    ]
  }
}
```

- 適当に angular っぽいのを書いてみる。

```js:project/app/assets/javascripts/app/app.js

import angular from 'angular';
import testCtrl from './controllers/testCtrl';

export default angular.module('testapp', [])
  .controller(testCtrl.name, testCtrl)

```

```js:app/assets/javascripts/app/controllers/testCtrl.js

export default class testCtrl {
  constructor() {
    console.log('test');
  }
}
```

```html:app/views/test.html

<div ng-controller="testCtrl"></div>

```

## ビルドコマンドを追加


```json:package.json
"scripts": {
    "release": "webpack --config app/assets/javascripts/app/config/production.js",
    "build": "webpack --config app/assets/javascripts/app/config/development.js",
    "watch": "webpack --watch --config app/assets/javascripts/app/config/development.js"
  }
```

- 面倒なので rake task にして assets:precompile で実行されるようにする

```rb:lib/tasks/precompile.rb

task :build_frontend do
  sh "npm install"
  sh "npm run release"
end

Rake::Task["assets:precompile"].enhance(%i(build_frontend))

```
こうすると bundle exec rake assets:precompile の前に勝手にビルドしてくれる。



- view への反映。Rails の流儀？ここに追加

```js:project/app/assets/javascripts/application.js

//=require app/appllication.js

```

ビルドしてブラウザにアクセスすると

<img width="532" alt="スクリーンショット 2016-07-12 21.20.31.png" src="https://fout.qiita.com/files/6564cc81-845f-ac46-cddc-8afec332ac14.png">

じゃーん


# 結論

**レイルズはクソ**
**angular1.x 系で ES6 にこだわるのは死。無理して書くことはない**

ざっくり書いたけど、あれこれエラったりその他諸々ほんとにはまりまくりまクリスティ。なんでもかんでも Rails に邪悪に組み込まれていて辛さしかない。だいたいすぷろけっつがゴミすぎ。いにしえのフレームワークで今は使う必要ないという感じ。

- あとこれだとせっかくファイルを分割できるという webpack の良さが全く生きない。
- angular2 を使うなら react 使っったほうがいい気もする。
Eclipse4.5+gradleでいれたlombokが動かない場合(mac)

javaのgetter/setterという冗長部分を良い具合に隠してくれるlombokをよく使いますが、久しぶりに入れ直したらうまく動かなかったので自分へのメモとして。


### 環境
OS: OSX El Capitan
Eclipse 4.5.2
Gradle 2.9
lombok 1.16.6

### lombok導入
lombokはgradle経由でいれます。
lombokはコンパイル時のみ必要なライブラリなので、compileじゃなくてprovidedらしい。

```xml:build.gradle
configurations {
    provided
}

sourceSets {
    main { compileClasspath += configurations.provided }
}

dependencies {
	compile('org.springframework.boot:spring-boot-starter-data-jpa')
	compile('org.springframework.boot:spring-boot-starter-jdbc')
	provided('org.projectlombok:lombok:1.16.6')
	
	compile('org.springframework.boot:spring-boot-starter-web')
	runtime('mysql:mysql-connector-java')
	testCompile('org.springframework.boot:spring-boot-starter-test')
}

eclipse {
	classpath {
		 plusConfigurations += [configurations.provided]
		 noExportConfigurations += [configurations.provided]
		 containers.remove('org.eclipse.jdt.launching.JRE_CONTAINER')
		 containers 'org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8'
	}
}

```

### eclipseの設定に追加
上記でgradleをリフレッシュすると、lombokが参照ライブラリーとしてダウンロードされて使えるようになる。
かと思いきや、@Dataアノテーションをつけてもgetter/setterが生成されない・・・

そんなときは、eclipse.iniファイル内に下記を追加すればいけた。

```xml:eclipse.ini
-Xbootclasspath/a:lombok.jar
-javaagent:lombok.jar
```
追加したらeclipse再起動してね。

ちなみにeclipse.iniファイルの場所は
Eclipse.app > 右クリック[パッケージの内容を表示] > Contents > Eclipse >eclipse.ini

![160803-0001.png](https://qiita-image-store.s3.amazonaws.com/0/118585/98ced62a-b34f-df80-8c5f-8fd8d5c2c9de.png)


### 追記
lombok.jarファイルが、上図のようにEclipseディレクトリ直下に入ってないとeclipse.iniファイルに書き込んだだけではだめでした。

公式からダウンロードしてきても良いですが、今回はGradleでダウンロードしてきたのでプロジェクトのライブラリ内に入っています。

lombok.jarは単体でインストーラが起動するようになっているので、対象のEclipseを選択しましょう。

するとEclipseディレクトリに入ります。あとはeclipse.iniに追記したらOK
pug (jade) で改行文字を br にする

```jade
- var text = 'hoge\r\nfuga\r<script>alert("escape!")</script>\nyeah!' // 入力値

- var lines = text.split(/\r\n|\r|\n/)
- var lastLine = lines.pop()

.text
 each line in lines 
   = line
   br
 = lastLine
```

結果↓

```html
<div class="text">hoge<br/>fuga<br/>&lt;script&gt;alert(&quot;escape!&quot;)&lt;/script&gt;<br/>yeah!
</div>
```

うーん、エスケープも考慮しながら書くとこんな感じかなぁ。これを mixin 登録か。もっと良いやり方ないですか？
Vagrantセットアップ

### 1. サーバーを構築したいディレクトリへ移動し、利用するBOXで初期化
```
vagrant init <BOX名>
```


Vagrantfileを編集

ブラウザからアクセスできるようにする
vagrant-hostsupdaterのようなローカルマシンのhostsファイルを自動で書き換えてくれるプラグインも忘れずにインストールしておく

```
config.vm.network "private_network", ip: "192.168.33.10"
config.vm.hostname = "local.vagrant"
```

### 2. Vagrant起動
```
vagrant up
```




### 3. CentOSの諸々の設定を行う

* シンボリックリンクで同期
* Apacheのインストールと設定
* PHPのインストールと設定


## 仮想マシンとホストマシンをシンボリックリンクで同期

`Vagrant ssh`でログインする。

```
sudo rm -r var/www/html
sudo ln -s /vagrant /var/www/html
```


## Apacheのインストールと設定
`vagrant ssh`で仮想サーバーにログインし、ApacheとPHPをインストールします。




```
sudo yum -y install httpd
sudo service httpd start

# ファイアーウォールをOFFにして、再起動してもOFFのままにする
sudo service iptables stop
sudo chkconfig iptables off
```

httpd.confの設定
　静的ファイル群の更新が反映されないので、sendfile機能をOFFにする。
> EnableSendfile off

```
sudo service httpd restart
```



## PHPのインストールと設定

```
sudo yum -y install php
```

httpd.confに追記
> AddType application/x-httpd-php .php
> AddType application/x-httpd-php-source .phps



```
sudo service httpd restart
```


## VagrantへiPhoneなど外部デバイスからアクセスする
同じWi-Fiに接続していることが前提。
　Vagrantfileを編集し以下をコメントアウト。`vagrant reload`すると、ネットワークの接続設定をどれにするか聞かれるので、WI-Fiを選択。
> config.vm.network :public_network


その後、Vagrant sshして、仮想サーバーにログインし、`ifconfig`で、IPを確認し、Iphoneなどからアクセスする。
laravelでのbootstrap + scss + gulp の利用

[laravel5で顧客管理webアプリ](http://qiita.com/ryo2132/items/769968fcf28a7333eda6)を作成したのでメモの続きです。

laravelで標準で利用出来るbootstrap、scss、gulpの設定方法です。

#bootstrapの利用
laravelプロジェクトのresource > assets > sass > app.scss のファイルに下記が記述されているので//を外します。

```scss:app.scss
// @import "node_modules/bootstrap-sass/assets/stylesheets/bootstrap";
// ↓
@import "node_modules/bootstrap-sass/assets/stylesheets/bootstrap";
```

これでbootstrap利用の準備が完了です。

#gulpのインストール
laravelではLaravel ElixirというLaravel 用に作られたgulpタスクが使えます。
laravelのルートディレクトリで下記コマンドで必要なモジュールをインストールしましょう。
```
$ npm i
```
エラーがなければgulp、laravel Elixir、bootstrap-sassがインストールされたかと思います。

#gulpでscssをコンパイル
gulpコマンドでElixirが作動し、自動的にapp.scssをコンパイルしてくれます。
app.cssには前述のbootstrapのインポートが記載されているのでこれで、
bootstrapのcssが
コンパイル先の、public > css > app.css に記載されます。
```
$ gulp
```

いちいちscssの編集でgulpを入力するのが面倒な場合は、
```
$ gulp watch
```
で変更を監視しましょう。こちらもgulpfile.jsになにも記入せずとも利用可能です。
本当にいたれりつくせりですね。
まわり将棋に挑戦！


まず、金将の状態を列挙し、取りうる和の集合を求める。その集合の要素を8で割ったあまりに振り分ける。

```rb
T=[0,1,5,10,20]
M=8

h={}
T.repeated_permutation(4){|a|h[a.reduce(:+)]=1}
a=[0]*M
h.each_key{|k|a[k%M]+=1}
```

2回金将を振った時、駒が角に動く場合は、`(1回めに角、2回めに角)+(1回めにあまり1、2回めにあまり7)+...+(1回めに7、2回めにあまり1)`通りである。
これは以下のように乗算として定義できる。

```rb
def mul(a,b)
	raise if a.size!=b.size
	r=[0]*a.size
	a.size.times{|i|
		b.size.times{|j|
			r[(i+j)%a.size]+=a[i]*b[j]
		}
	}
	r
end
```

乗算として定義できれば、繰り返し二乗法を適用することができる。

```rb
e=[1]+[0]*(M-1)
n=gets.to_i
while n>0
	e=mul(e,a) if n%2>0
	a=mul(a,a)
	n/=2
end
p e[0]
```

以上により、(多倍長計算を考えなければ)計算量`O(logN)`で求解することができた。

Ruby https://github.com/cielavenir/codeiq_solutions/blob/master/thisweek_masuipeo2/tyama_codeiq2900.rb
Python(2/3) https://github.com/cielavenir/codeiq_solutions/blob/master/thisweek_masuipeo2/tyama_codeiq2900.py
MacでBootCampを使用する時の注意

#BootCampを使用するときの注意
最近のMacでは、BootCampを利用してWindowsをインストールすることができる。インストールはそれなりに簡単に行えるが、意外と見落としがちになる項目を挙げてみた。

1. キーボードの日本語入力のための設定
2. 後からパーテションの変更ができない
3. Windowsパーテションの暗号化ができない
4. 仮想化支援機能の有効化になる条件がある

##キーボードの設定
Mac Book Air等のノートPCでBootCampを使用すると、キーボードがMacのキーボートを使用することになる。「そういえば、日本語の入力ってどうやるんだけ・・・」となりやすい。

英数 と かな でMacと同じような感じで日本語の切り替えを行うには、インストール後にログインして設定を行う必要がある。

###日本語入力の設定方法
 1. **IME**の**プロパティ**を開く
 2. **詳細設定** を押す(Windows 10 の場合)
 ![1.jpg](https://qiita-image-store.s3.amazonaws.com/0/39277/acfad86e-9e5b-5f53-6036-854178d5ec86.jpeg)

 3. **編集操作** の **変更** を押す
![2.jpg](https://qiita-image-store.s3.amazonaws.com/0/39277/a52097a8-b8db-671a-ed96-b1b26de5cc20.jpeg)
 
 4. **無変換** に **IME-オフ** 、**ひらがな** に **IME-オン** を設定する。
![3.jpg](https://qiita-image-store.s3.amazonaws.com/0/39277/ea6c3947-fb9d-94a1-2a5e-2c78a6135667.jpeg)
 
**無変換** が左の **英数** キーにあたり、**ひらがな** が右の **かな** キーにあたる。

その他、Macのキーボードに無いキーは下記のリンクを参照していただければだいたい分かる。

http://inforati.jp/apple/mac-tips-techniques/windows-hints/how-to-use-windows-short-cuts-with-mac-keyboard.html

ちなみに、みんな大好きPrintScreenは
**fn + Shift（左側） + F11**
になる。

## パーテションについて
Mac でも Windows でもデフォルトでパーテションの容量が調節できる。しかし、BootCampでパーテションの大きさを変えると、OSが起動できなくなることがある。

パーテションの大きさを変更するには、一度、BootCampの領域を削除して、再インストールするしか方法が無いようだ。

## Windows の暗号化について
Windows 10 Pro にはシステムパーテションを暗号化する **Bitlocker** という機能がある。Boot Camp の環境では、この機能でシステムの入っているパーテションを暗号化できない。

通常、Windowsをインストールすると、**System Recovery 領域** というのがドライブに作成される。MacにBootCampでWindows をインストールすると、この領域が作成されない。 **Bitlocker** を使用するには、この **System Recovery 領域** が必要になる。

**System Recovery 領域** の領域が無いPCで **Bitlocker** を使用するには、暗号化に使用するチップがハードウェアに搭載されている必要があるそうだ。Mac にはこのチップが搭載されていない。

## 仮想化支援機能について
BootCampを使用してVMware や Virtualbox を使用する時に仮想化支援機能がOffになっていると、仮想マシンの動きが重くなってしまう。また、仮想化支援機能を有効にしなければ、Windows 10 Pro の Hyper-v が使用できない。

仮想化支援機能は、**デフォルトでWindowsが起動する設定** になっていないと有効にならない。今後、Macの仕様変更があるかもしれないが、理由は分からない。
狩野モデルという品質モデルが的を得ている

# 品質についてちょうどいい考え方

品質についてのモデルとして「狩野モデル」というのがあります。
魅力品質・性能品質・当たり前品質の3軸となっています。

![karino-model.png](https://qiita-image-store.s3.amazonaws.com/0/114529/3d744971-12a0-e3d9-b3f8-704b47c877fb.png)

魅力品質が高いと顧客満足度が上がりますが、
堅実なユーザーはそこまで求めないこともあります。

当たり前品質は高くしたからといって顧客満足はあがりません。
当たり前なので。
しかしこの品質が悪いと一気に使えないものという烙印が押されてしまいます。
まずは当たり前品質を満たすように計画・活動しなければなりません。
AtomからVSCodeへ はじめの一歩

このところAtomを使っていたのですが、やはり起動がおそい。
1000行くらいのファイルだと応答がなくなってしまう事も多々。
さらには、閉じるたびに[応答がありません]とか言われてほとほと困っていたのでVSCodeに乗り換えてみました。

Windowsのお話です。

## インストール
[公式サイト](https://code.visualstudio.com/download)でOSにあったバイナリをインストール
あとは実行するだけ
基本的にはそのまま[Next]で、僕はコンテキストメニューに[Codeで開く]を追加しました

## `Win+Q`で開く場合
Wind8になってからなんでも`Win+Q`で開くようになった僕のような方は、
`vscode` では出てこないし `visual` ではVisualStudioが一番上に来てイライラしたかと思いますが、`code` で出てきますので安心してください

## セットアップ

## 左に表示されるメニューのショートカット
まずはこれが欲しくなるかと

|操作|ショートカット|
|:---|:---|
| コマンドパレット|`Ctrl-Shift-p` (Atomと一緒!)|
| サイドバー(エクスプローラだとツリーが表示されている部分)の切り替え|`Ctrl-b`|
| サイドバー(エクスプローラ)|`Ctrl-Shift-e`|
| サイドバー(検索)|`Ctrl-Shift-f`|
| サイドバー(Git)|`Ctrl-Shift-g`|
| サイドバー(デバッグ)|`Ctrl-Shift-d`|
| サイドバー(Extension)|`Ctrl-Shift-x`|

他のいろいろは[オフィシャル](https://code.visualstudio.com/docs/customization/keybindings)見るなり、他の方の記事読むなりということで。
だいたい`Ctrl-Shift-p`で選択して、使用頻度が高かったら併記してあるショートカット覚える方針ですかね。
あと、コマンドパレットがAtom一と緒なのは結構ありがたいです。

ちなみにですが、マルチカーソルを今のカーソルの下に出そうと、`Ctrl+Alt+↓`とか押すと画面が回転するので気を付けてください。
正しくは`Ctrl+Shift+Alt+↓`です。(これで動く理由は分かりません)

## 移行したパッケージ
- EditorConfig for VS Code
- vscode-icons(インストール後の有効化時に管理者権限でVSCodeを起動する必要あり?)
- ESLint

## いらなくなったAtomパッケージ(標準で入っているっぽい)
- Emmet
- git-plus
- Pigments
- terminal-plus
- atom-beautify

## ちょっと困りごと
- 日本語よわめ?  
    文字が入力中なのか確定されているのかが分かりづらいです  
    入力中の文字がたまに2重に表示されたりなんかもしますね
- ファイルのエンコーディングが自動で判別されない  
  なにがなんでもデフォルトエンコーディングで開こうとするので、ここから毎度[Change File Encoding]とやるのは面倒です

まぁきっとこの辺はそのうち解消されるのでしょう。

## 拡張機能
  よく書かれているようにまだまだ少ないです。
  そして公開されている[拡張機能用API](https://code.visualstudio.com/docs/extensionAPI/vscode-api)も少ないです。
  一応コマンドとかも呼べるには呼べるのですが、かゆいところには手が届かない印象です。
  上記のファイルエンコーディング判定を、Atomの[auto-encoding](https://atom.io/packages/auto-encoding)をマネして作ろうと思ったのですが
  エンコーディングの設定APIがなくて困り果てました。
  `workbench.action.editor.changeEncoding`とかいうコマンド呼んでみても、ミニパレット的なものが開いてしまってこれじゃない感。
  この辺もプロジェクトが盛り上がって来れば拡充されていくのでしょう。

## 所感
いろいろ困りごとはあれど、Atomより軽くてまずはよい感じです。そしてAtomに似ているので移行は割とスムーズだと思います。
コードハイライトで応答がなくなる、なんて事態にも遭遇しなくなりました。
VisualStudioを名乗っているだけあって、普段IDEのVisualStudioを使っている人は結構すぐ使えるようになりそうです。
移行でなくともメインとなるエディタをお探しの方、VSCodeいかがでしょうか?
node.jsでリクエストオブジェクトの内容をJSONでファイルに保存する

httpserverでhandleHttpコールバックでリクエストを受けるとします。

    fs = require('fs');
	function handleHttp(req, res) {

	    var cache = [];
	    fs.writeFile("./req.txt", JSON.stringify(req, function (key, value) {
	        if (typeof value === 'object' && value !== null) {
	            if (cache.indexOf(value) !== -1) {
	                return;
	            }
	            cache.push(value);
	        }
	        return value;
	    }));
        }

これでリクエストの内容をJSONで視認できます。
aタグhref属性telに関する書き方（国際電話）

telの内容表記はハイフン(-)を取ることが常識。
では、国際番号の+は？っていう疑問が浮かぶ。
答えは以下の通り。+はつけたままにすること。


国内電話

`<a href="tel:090-9999-9999">090-9999-9999</a>`


国際電話
`<a href="tel:+81999999999">+81-9-9999-9999</a>`
PHP printf() 関数

##printf()関数

<font color=ff0000>printf()</font>
書式(フォーマット)を整える。
様々な指定に合わせて書式を整えることが出来る関数。
<TABLE border=0 width=横幅 height=縦幅 style="border: 1px  solid black ;"><TR><TD>printf( 書式文字列(型変換指定子, 可変個引数 );</TD></TR></TABLE>
▪️可変引数(or可変個引数)
任意の個数となっている引数

<font color=cyan>------------------------------------------------------------------------------------------</font>
▪️test1.php 例①

```php
<!-- http://localhost:8888/sample3/test01.php -->
<?php
$date = sprintf ( '%04d年 %02d月 %02d日', 2010, 1, 23 );
?>
<?php

print ($date) ;
?>
```

▪️test1.php 実行結果
2010年 01月 23日
▪️test1.php 解説
1番目のパラメーターで「%d」などの書式指定を含む出力結果を書き、
2番目以降のパラメーターで、指定に代入したい値を書く。
<font color=cyan>------------------------------------------------------------------------------------------</font>
▪️test1.php 例②

```php
<?php
$fix = sprintf ( '%s', 10 );
print ($fix) ;
?>
```

▪️test1.php 実行結果
10
<font color=cyan>------------------------------------------------------------------------------------------</font>
▪️test1.php 例③

```php
<?php
$fix = sprintf ( '%d', 'abc' );
print ($fix) ;
?>
```

▪️test1.php 実行結果
0
<font color=cyan>------------------------------------------------------------------------------------------</font>

▪️test1.php 例③

```php
<?php
$fix = sprintf ( '%s', 'abc' );
print ($fix) ;
?>
```
▪️test1.php 実行結果
abc
<font color=cyan>------------------------------------------------------------------------------------------</font>
▪️test1.php 例④

```php
<?php
$fix = sprintf ( '%05d', 10 );
print ($fix) ;
?>
```

▪️test1.php 実行結果
00010

▪️test1.php 例④ 解説
<font color=ff0000>%05d</font>は、<font color=ff0000>5桁になるまで0を補って数字として整える</font>という意味。







[参考になるページ](http://php.net/manual/ja/function.sprintf.php)
GalaxyProject の Galaxy の job スケジューラ及びdocker関連のドキュメントなど

# 概要

Galaxy の job スケジューラ関連と、docker 関連のドキュメントを探すことがあるので、いくつかまとめる

# まとめ

* [Admin/Tools/Docker - Galaxy Wiki](https://wiki.galaxyproject.org/Admin/Tools/Docker)

* [galaxy-hackathon-2014/smalt at master · apetkau/galaxy-hackathon-2014](https://github.com/apetkau/galaxy-hackathon-2014/tree/master/smalt)
* [galaxy-hackathon-2014/catDocker.xml at master · apetkau/galaxy-hackathon-2014](https://github.com/apetkau/galaxy-hackathon-2014/blob/master/catDocker.xml)
* [galaxy / galaxy-central / Pull request #401: Allow tools and deployers to specify optional Docker-based dependency resolution. — Bitbucket](https://bitbucket.org/galaxy/galaxy-central/pull-requests/401/allow-tools-and-deployers-to-specify/diff)

## slurm との連携など

* [docker-galaxy-stable/Running_jobs_outside_of_the_container.md at dev · bgruening/docker-galaxy-stable](https://github.com/bgruening/docker-galaxy-stable/blob/dev/docs/Running_jobs_outside_of_the_container.md)

## cluster

* [Admin/Config/Jobs - Galaxy Wiki](https://wiki.galaxyproject.org/Admin/Config/Jobs)
* [Admin/Config/Performance/Cluster - Galaxy Wiki](https://wiki.galaxyproject.org/Admin/Config/Performance/Cluster)
* [Admin/Config/Performance/Scaling - Galaxy Wiki](https://wiki.galaxyproject.org/Admin/Config/Performance/Scaling)

## DRMAA

* [Microsoft Word - GFD.143.doc - GFD.143.pdf](https://www.ogf.org/documents/GFD.143.pdf)

## Job Runner

* [galaxy/build_a_job_runner.rst at 115df2963e339b44c4dec459f19cbc706af2da92 · varunshankar/galaxy](https://github.com/varunshankar/galaxy/blob/115df2963e339b44c4dec459f19cbc706af2da92/doc/source/dev/build_a_job_runner.rst)
Webプッシュのチュートリアルをやったときにハマったところ:Chrome編

#はじめに
[Webプッシュのチュートリアル](https://developers.google.com/web/fundamentals/getting-started/push-notifications/)をやってハマったところのメモ
[GCM](https://developers.google.com/cloud-messaging/)を使ってwebプッシュを実装します

#ハマったところ
## endpointが出力されない
[Subscribe to Push Notifications
](https://developers.google.com/web/fundamentals/getting-started/push-notifications/step-06)という章でlocalサーバーのアプリにアクセスしてendpointを出力するところがあります。
が、いつも開発につかっているアカウントでendpointが出力されなかった

ブラウザはChromeのversionは52.0.2743.82 (64-bit)
(現行の最新版)

### この時点での状況
* Chromeの他のアカウントでは出力された
* Firefoxだと出力された

状況としては↑だったので、アカウントに紐付いている設定かなと思いendpointが出力されているアカウントと極力同じ設定に変更した

### やったこと

* Chromeを再起動
* 有効にしていた拡張機能をgoogleDocs系以外無効にする
* 以下のデータを削除
 * ダウンロード履歴
 * Cookieなどのサイトデータやプラグインデータ
 * キャッシュされた画像とファイル
 * ホストされているアプリデータ
 * コンテンツライセンス

そして、スーパーリロード（Shift+Command+r）

endpointがやっぱり出力されない・・

同じことにハマっている人はいないのかと検索してみたけど見つからず
最終的に1回Chromeからアカウントを切断してみた
アカウントに紐付いている設定等が邪魔しているならChromeのデータ全部消そうと思ったので
切断する際に

```
□ 履歴、ブックマーク、設定、このデバイスに保存されているその他のChromeデータも削除する
```
にチェックしてから切断

もう一度Chromeにアカウントを追加してアプリにアクセスしてみたら

endpointでた・・・

なぜだ。
一か八かでやったことがうまく言ってしまったので原因はわかりませんでした。

## Pushこない
[Send a request from the command line for GCM to push a message
](https://developers.google.com/web/fundamentals/getting-started/push-notifications/step-07)この章でターミナルでcurlを叩いてpushを通知するところが出てきます。
この通りにやってみましたが、push通知こない・・・

こないなあと思っていたらいつの間にかConsoleに

```
Push message >PushEvent {data:hogehoge...}
```
とcurlを叩いた回数分でてきていて、どうやら遅延して届いたようだ
もう一回やってみたら、プッシュ通知の通知もちゃんときた。遅延して。

？

調べたのですが理由はわからず・・まだ調べ途中です
どなたかなぜ遅延してしまうか教えて下さい

ちなみに、Chrome Canaryを使ったらすぐ通知がきました


とりあえず今ハマったところはこのくらい
Cakephp3のFormHelperで年月日の入力フィールドを出力するときの便利なオプション


## 例は誕生日

* 年・月・日のselectタグにそれぞれにcssのclassをあて
* 月をJanuaryとかじゃなくて数字で出し
* 表示フォーマットをｘ年ｘ月ｘ日って後ろに漢字を混ぜ
* 空っぽのところは「ー」って文字を出し、valueには空や数字ではなくで何かの文字を入れておく（空にしとくと0ってだされるので、年が00が選ばれて変になる）
* 年の最初と最後の範囲を指定し
* エラーがあった時は、cakeデフォルトのエラーcssを当てるために、``form-error``っていうのが当たろうとするんだけど、年月日それぞれに``class``をオプションで指定してしまっているので、form-errorが自動的に各フィールドに当てはまらない。だから、``$append_class``を書き足すようにしている。


```src/Templates/Pages/date-form.ctp
<?php if ($this->Form->isFieldError('birthday')){
	$append_class = " form-error ";
}
?>
<?php
$this->Form->templates([
	'dateWidget' => '{{year}} 年 {{month}} 月 {{day}} 日 ',
]);
$attr = [
	"required"=>false,
	'monthNames'=>false,
	'empty' => ['-' => 'ー'],
	'year' => [
		'start' => 1960,
		'end' => 1998,
		'order' => 'desc',
		'class' => "select-year $append_class",
	],
	'month' => ['class' => "select-month $append_class"],
	'day' => ['class' => "select-day $append_class"]
];
?>
<?= $this->Form->date('birthday',$attr);?>
```

ここに色々書いてあるけど、
http://book.cakephp.org/3.0/en/views/helpers/form.html#datetime-options

FormHelper.phpが表示されようとしている直前``return $this->widget('datetime', $options);``で、``debug($options);``って出力して出したのを頼りにやるほうが、ドキュメントを読むより楽かも。

```vendor/cakephp/cakephp/src/View/Helper/FormHelper.php

public function date($fieldName, array $options = [])
{
    $options += [
        'empty' => true,
        'value' => null,
        'monthNames' => true,
        'minYear' => null,
        'maxYear' => null,
        'orderYear' => 'desc',
    ];
    $options['hour'] = $options['minute'] = false;
    $options['meridian'] = $options['second'] = false;

    $options = $this->_initInputField($fieldName, $options);
    $options = $this->_datetimeOptions($options);
	    debug($options);
    return $this->widget('datetime', $options);
}


```
Vagrant v1.8.5  以降で、vagrant ユーザのprivate keyのパーミッションがおかしいために、rsyncでファイルの同期ができないバグ


# 解消方法
vagrant/plugins/guests/linux/cap/public_key.rb  に、以下の変更を加える。  
Windowsなら、
`C:\HashiCorp\Vagrant\embedded\gems\gems\vagrant-1.8.5\plugins\guests\linux\cap\public_key.rb`です。

```diff
@@ -54,6 +54,7 @@
             if test -f ~/.ssh/authorized_keys; then
               grep -v -x -f '#{remote_path}' ~/.ssh/authorized_keys > ~/.ssh/authorized_keys.tmp
               mv ~/.ssh/authorized_keys.tmp ~/.ssh/authorized_keys
+              chmod 0600 ~/.ssh/authorized_keys
             fi

             rm -f '#{remote_path}'
```

つい先日（7月19日）にBug Fixされてた。
[Authentication failure after inserting new key with Vagrant 1.8.5. [PATCH] #7610](https://github.com/mitchellh/vagrant/issues/7610)
GalaxyProject の Galaxy の Docker stable の開発環境を整える

# 概要

GalaxyProject の Galaxy の Docker stable の開発環境を整える
* [bgruening/docker-galaxy-stable: Docker Images tracking the stable Galaxy releases.](https://github.com/bgruening/docker-galaxy-stable)
* [hub.docker.com: galaxy-stable](https://hub.docker.com/r/bgruening/galaxy-stable/)

# 結論

いまのところ以下の方法で整えられそう。

## サブモジュールを取得するまで

```
git clone https://github.com/bgruening/docker-galaxy-stable.git
cd docker-galaxy-stable/
git fetch
# git checkout -b dev origin/dev
git submodule init
git submodule update
```

追記 2016-11-30
最近最先端がdevではないようなので、ブランチの変更をしないようにした。


## docker build してみる。

```
cd galaxy
docker build --no-cache -t manabu/docker-galaxy-stable:20160803 .
```

## 特定のブランチ、PRなどをテストしたい時

Dockerfileの88行目(2016-11-17現在の行数)

```
wget -q -O - $GALAXY_REPO/archive/$GALAXY_RELEASE.tar.gz | tar xzf - --strip-components=1 -C $GALAXY_ROOT && \
```

ここの、wgetのアドレスを変更する

## 特定のロールを最先端にしたい

それぞれのroles以下は、最初にとってきたとき、docker-galaxy-stableに
コミットされているバージョンまでしか取得してくれない。
修正を取り込みたいとき、たとえば、masterに修正があるときは、
更新したいroles以下のsubmodule(subproject?)に移動して、以下のコマンド

```
git checkout master
```

# サブモジュールのレポジトリ
開発版(dev)

* [bgruening/docker-galaxy-stable at dev](https://github.com/bgruening/docker-galaxy-stable/tree/dev)

## 更新頻度の高いレポジトリ

* [galaxyproject/ansible-galaxy-extras: Ansible roles to configure assorted compontents for an Ubuntu VM or container configured with https://github.com/galaxyproject/ansible-galaxy with production services including nginx, uwsgi, supervisor, protftp, and slurm.](https://github.com/galaxyproject/ansible-galaxy-extras)

## 更新頻度がそれほどでもないレポジトリ

* [galaxyproject/ansible-postgresql: An Ansible role for managing a PostgreSQL (http://www.postgresql.org/) server](https://github.com/galaxyproject/ansible-postgresql/tree/master) 
* [afgane/galaxy-tools-playbook: A ready-to-use Ansible playbook for the Galaxy Tools role](https://github.com/afgane/galaxy-tools-playbook/tree/master)

# 参考

submodule 関連の操作は以下の場所を参考にした。

[git submoduleしてるリポジトリをリモートの最新に更新する - Qiita](http://qiita.com/kshimo69/items/ac22d414d756ea08943f)
MySQL5.7のワンタイムのrootのパスワードを確認するワンライナー


rootで、以下のコマンドで、パスワード取れる。
```bash
# cat /var/log/mysqld.log | grep "localhost:" | sed -e "s/.*localhost: //"
```

MLまで追ってないのでわからんけど。
インストールしたときに、「rootユーザのパスワードは/var/log/mysqld.logをみてね☆」的なことを言われるようになってた。
普段メッセージを読まないような"にわか"勢には、気づきにくい変更だった。
ログアウトしたあともバックグラウンドでコマンドを実行し続ける


# コマンド実行時に指定する

`nohup`と`&(バックグラウンドで実行)`を利用する。

```
$ nohup sh -c "cd /home/user/test && command.sh > result.txt" &
[1] 20515
nohup: 入力を無視し、出力を `nohup.out' に追記します  
```


# コマンドを実行してしまったとき

`disown`を利用する。

```
$ cd /home/user/test && command.sh > result.txt
# Ctrl-Zでジョブを一時停止する
$ jobs # セッションに紐づくジョブ一覧を表示
[1]  + suspended command.sh > result.txt
$ bg %1 # 1のジョブをバックグラウンドで走らせる
$ disown %1 # ジョブテーブルから対象のジョブを外す
$ jobs
# 先ほどのコマンドがジョブテーブルから外れていることを確認
```

# ちょっと補足

`nohup`を使う場合は、自分のジョブテーブルでコマンドを実行している。
ただ端末のセッションが破棄されるときに、[SIGHUP](http://www.oki-osk.jp/esc/linux/signal-4.html)シグナルを無視する。実行しているセッションは同じ。

`disown`を使う場合は、現在のセッションと切り離される。
slick.jsのスライダー機能をタブ切り替え内で使用する際の落とし穴

# 概要
HTML上にslick.jsを使用してスライドをサムネイル付で配置している作りに対し、
タブクリックで内容を切り替える仕掛けを追加することになった際のメモ。
具体的には下記の画像の上部6つのボタンをクリックすると、
その下のメイン画像および横並びのサムネイルが切り替わるというものだ。欲張りな話である。
この際、スライドはタブ毎に6種類用意している。

![キャプチャ.JPG](https://qiita-image-store.s3.amazonaws.com/0/122507/85f856d7-0124-9e00-d129-dbbb70bae00a.jpeg)

# 問題発生
PCブラウザでは特に問題なく動いていたのだが、iphone、Androidで問題が起きた。
タブをクリックして内容を切り替えると、初回読み込み時にアクティブになっていたタブ以外では、メイン画像が表示されないのだ。

おそらくslick.jsがスライドのメイン画像を表示する際にCSS3のtransitionやdisplayが関係していると思われる。（読み込み時に表示されていない内容のメイン画像寸法をスマートフォン上では取得できていない）

#解決策
読み込み時にタブ内の内容が存在しているかどうかがトリガーとなっているので、
タブ切り替えのjavascript記述を工夫してみた。

詰まるところ、CSSのvisibilityを利用して存在だけ確保し、
レイアウト上邪魔になるheightを取り除いてやったのだ。
これで高さをもたず透明でありながら、ページ上に常に存在しているタブが配置できる。
言葉にしてみるとぶっちゃけ意味がわからない。slick用の記述は省略する。

##Javascript
```
	$(window).load(function () {
		$(function() {
			$('.hoge ul li a[href^="#panel"]').on('click',function(){
    			//すべてのli要素の class="active" を取り除いて
    			$(".hoge ul li").removeClass("active");
    			//クリックされたa要素の親要素になるliだけにactive付与(ボタンCSS変更)
    			$(this).parent().addClass("active");

				$(".panel").css("visibility", "hidden");
				$(".panel").css("height", "0px");
				$(this.hash).css("visibility", "visible");
				$(this.hash).css("height", "auto");
				return false;
			});
			
			$('.hoge ul li a[href^="#panel"]:eq(0)').trigger('click');
		})
		
	});
```
##HTML
```
<ul class="hoge">
	<li><a href="#panel1">1</a></li>
	<li><a href="#panel2">2</a></li>
	<li><a href="#panel3">3</a></li>
	<li><a href="#panel4">4</a></li>
	<li><a href="#panel5">5</a></li>
	<li><a href="#panel6">6</a></li>
</ul>

<div id="panel1" class="panel">
	<div class="gal">
		<div class="btn prev"><a href=""><img src="prev.png" alt="prev"></a></div>
		<div class="btn next"><a href=""><img src="next.png" alt="next"></a></div>
		<ul class="slick-slider">
			<li><img src="hoge1_big.jpg"></li>
			<li><img src="hoge2_big.jpg"></li>
			<li><img src="hoge3_big.jpg"></li>
			<li><img src="hoge4_big.jpg"></li>
			<li><img src="hoge5_big.jpg"></li>
　　　　</ul>
	</div>	
	<ul class="thumb">
		<li><a href="1"><img src="hoge1.jpg"></a></li>
		<li><a href="2"><img src="hoge2.jpg"></a></li>
		<li><a href="3"><img src="hoge3.jpg"></a></li>
		<li><a href="4"><img src="hoge4.jpg"></a></li>
		<li><a href="5"><img src="hoge5.jpg"></a></li>
	</ul>
</div>
```
これ以降はpanel2の内容が続く。
Android Studio 1.kでjdk1.7のバージョンを扱っている方々へ


# 概要
新しいプロジェクトを作成して、ある検証を行いたかったのですがエラーが出て数分悩みました。  
結果を知ればなんてことのない内容ですが、Android初心者やPC初心者はてこずるかも。

# バージョン
Android Studio 1.4  
jdk 1.7.0_75
ターゲット: APILevel.24(Android 7)

# 状況
 起きたこととしては、次のエラーが発生。

## エラー :Execution failed for task ':app:preDexDebug'.
> com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process 'command '/Library/Java/JavaVirtualMachines/jdk1.7.0_75.jdk/Contents/Home/bin/java'' finished with non-zero exit value 1

# 内容
どうもAPIレベル24(Android 7)にターゲットを設定することで起きる。  

おそらく多くの人が、「Android Studio1.4かよ、バージョンあげろよw」って思うだろうが、確かにそうでした。
別端末で現在(2016/08/3)最新の[Android Studio 2.1.2](https://developer.android.com/studio/index.html)をダウンロードして同じことをやってみたがjdk1.7でもなんなくビルドが通りました。
　  
おそらく1.kは1.5あたりまでなので、1.kと2.kで違うかもしれません。


そして、結論として次章である。

# 結論
対応としては2点。

### ・1. Android Studio1.kを最新にアップデートする。

### ・2. ツールバー > File > Project Structure...(ショートカットでcommand + ;)を選択し、Source CompatibilityとTarget Compatibilityをjdk1.7からjdk1.8に変更する。

# まとめ
タイトルにも書いているようにjdk1.7が原因でした。  
[Android 7(nougat:ヌガー)](http://japan.cnet.com/news/service/35086783/)から、[jdk1.8サポート](http://gfx.hatenablog.com/entry/2016/03/11/001717)されるためこのエラーが起き、そもそもjdk1.7のものは使えなくなったようだ。
　  
かれこれAndroidの開発を数ヶ月離れたせいでいろいろと今時に遅れてしまったので、おそらく今回の内容はすでに知っている人が多いはずだけどもメモとこれからAndroidの開発をする人向けにまとめました。

でも、おそらくこれからAndroidを開発していく人は1.kなんて使わないですよね笑  
関係ないかw
てか、これ読む人ほぼいなくね？www
　  

***追記(記事投稿の数時間後...)***  
別端末で作業を続けていると、新しくAndroid Studio 2.1.2をDLしたので、APK自動ビルド(./gradlew assembleReleaseを実行。空っぽだからAPKビルドする前にDownloading httpts://services.gradle.org/distributions/gradle-2.10-all.zipが実行されました。)時に以下のエラーが起きました。  

```
* What went wrong:
Execution failed for task ':app:compileReleaseJavaWithJavac'.
> compileSdkVersion 'android-24' requires JDK 1.8 or later to compile.

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.

BUILD FAILED
```

結局は、jdk1.8にしなくてはいけないのかな？w
まぁ、今後はそうだけど今はターゲットを全てAPILevel.23に戻して作業を再開しよう笑汗

　  
とまぁ、仕事の合間にまとめたので、いい息抜きになりました笑
apexを利用してAWS LambdaでS3にファイルがアップロードされたhookを利用する場合(準備編)

[apex](http://apex.run)が便利すぎるのでGoで書いてapexでLambdaへデプロイして
適当にやらせるのにハマっている。S3に上がったファイルを読み込んで何かやるための
下準備としてこんな感じの値が取れるので、`aws-sdk-go`の`s3.GetObjectInput`を利用して
ファイルを読み込んだりする

```go
package main

import (
	"encoding/json"
	"log"

	"github.com/apex/go-apex"
)

func main() {

	apex.HandleFunc(func(event json.RawMessage, ctx *apex.Context) (interface{}, error) {
		data, err := event.MarshalJSON()
		if err != nil {
			log.Fatal(err)
		}
		log.Println(string(data))

		return nil, nil
	})
}

// 2016/08/03 07:08:26
// {
//     "Records": [
//         {
//             "eventVersion": "2.0",
//             "eventSource": "aws:s3",
//             "awsRegion": "ap-northeast-1",
//             "eventTime": "2016-08-03T07:08:25.726Z",
//             "eventName": "ObjectCreated:Put",
//             "userIdentity": {
//                 "principalId": "AWS:XXXXXXXXXXXXXXXXXXXXX"
//             },
//             "requestParameters": {
//                 "sourceIPAddress": "192.0.2.1"
//             },
//             "responseElements": {
//                 "x-amz-request-id": "XXXXXXXXXXXXXXXX",
//                 "x-amz-id-2": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
//             },
//             "s3": {
//                 "s3SchemaVersion": "1.0",
//                 "configurationId": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
//                 "bucket": {
//                     "name": "BUCKET_NAME",
//                     "ownerIdentity": {
//                         "principalId": "XXXXXXXXXXXXXX"
//                         "principalId": "A2XB359WQOLGWM"
//                     },
//                     "arn": "arn:aws:s3:::BUCKET_NAME"
//                 },
//                 "object": {
//                     "key": "FILE_NAME",
//                     "size": SIZE,
//                     "eTag": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
//                     "eTag": "e3ab69a36d84838ad2824fe34033368b",
//                     "sequencer": "XXXXXXXXXXXXXXXXXX"
//                 }
//             }
//         }
//     ]
// }
```
semaphore usage


## usage

### 手順

1.ログイン
2.Projectの作成
3.公開鍵の登録
4.ansible-playbook リポジトリの登録
5.inventoryの登録
6.environment 登録
7.task template の登録
8.実行

### login

ログインはsemaphoreのinitialize時に登録したアカウントでまずログインします。
userの追加はログイン後の画面から可能です

### Projectの作成

画像を参考に新規Project作成画面を開く
名前を入力し作成

### Projectの詳細設定

作成したProjectをクリックしProjectの詳細に遷移しくてださい。
Projectの詳細ではProjectのactivityが表示され、使用するansible-playbookの設定、inventoryの設定などが可能です。

*ここを正しく設定しないとansibleが正常に動作しません*

#### 公開鍵の登録

Projectの詳細メニューからkey storeを選択
ここに登録した鍵は ssh ログインや git clone などに使われます。

+ create kye を選択
+ Key Name の入力
+ Key type の選択
> 通常ではSSH Keyを選択します。awsなどの際はaws credentialを選択、各環境にあったものを選択してください。

+ Public Key の入力
+ Private Key の入力

以上で公開鍵の登録は完了です。

#### playbookリポジトリの登録

Projectの詳細メニューからPlaybook Repositoriesを選択
ここでは作成したansible-playbookのリポジトリの登録を行います

+ create epositoryを選択
+ Name を入力(なんでもOKです)
+ RepositoryのURLを入力
+ SSH Keyを選択
> SSH Keyは事前に登録したssh keyの中から選択します

#### Inventoryの登録

Inventoryとは対象ホストを記述したものになります。
hostsファイルのDSL形式で記述します。

```ex.test
[server]
192.168.33.10
```

keyの部分は実行するタスクなどを定義したconfファイル(ここではplaybook.ymlとしています)のhostsという項目と一致している必要があります。

```playbook.yml
- hosts: server
  become: yes
  user: hogehoge
  vars_files:
    - vars/package.yml
  roles:
    - git
    - common
    - nginx
    - php
    - composer
    - mysql
    - redis
    - rbenv
    - td-agent
```

Projectの詳細メニューから Inventoryを選択
create Inventoryを選択後

+ Name を入力(なんでもOKです)
+ Type を選択(ここでは事前に登録した公開鍵と紐づくのでStaticを選択します)
+ SSH Key を選択

これで使用するInventoryは登録完了です。
*Inventoryに関しては別途値を入力する必要があります*

#### Inventory の値設定

Inventoryから edit inventory contentを選択
画像のようにhosts形式で入力します。

save changesを選択し完了です

#### environment 登録

environmentは環境ごとに使う変数の定義が可能です。
変数はjson形式で記述します。ここで定義した変数は
ansible-playbook実行時にplaybookに渡されます。

*environmentは不要であれば登録しなくても問題ありません*

+ user変数の定義
userという変数をplaybook内で定義しているとした場合

```user.json
{user: hogehoge}
```

+ Environment Nameを入力
+ Environment jsonで定義

これでenvironmentの登録完了です。

#### task template の登録

task templateでは実行するansible-playbookの設定をします
task templateは複数登録することができます

+ Playbook Nameの入力

> タスクなどを定義したconfファイルの名前を入力します

+ SSH Keyの選択

> 登録したsshログイン時に使用するssh keyを選択

+ Inventoryの選択

> 登録したInventoryを選択

+ Playbook Repositoryの選択(複数ある場合は実行したいタスクがあるplaybookを選択してください)

> 登録したPlaybook Repositoryを選択

+ Environmentの選択(事前にenvironmentを入力していない場合は未選択でOKです)

+ Extra CLI Arguments(未入力でOKです)

> 引数として渡したい値がある場合にjson配列形式で設定してください

以上でタスクを実行する準備が整いました。

## 実行

登録したtask templateの横にあるrunボタンを押すと実行画面に移ります。

実行時にoverrideしたい値などがある場合runボタン押下後に表示されるwindowに
overrideしたい値をjson形式で入力し実行してください。またDebug(-vvv)にチェックを入れると ansible-playbook実行時にDebugメッセージが出力されます。

これでansible-playbookが実行されます。
エラーなどがなければ対象サーバに対してtaskが実行されます。
python pickleでRuntimeError: maximum recursion depth exceeded while pickling an objectが出る場合

python pickleでオブジェクトを保存するときに
```
RuntimeError: maximum recursion depth exceeded while pickling an object
```
が出る場合の対処

```
import sys
sys.setrecursionlimit(10000)
```
引数の数値は適当に。
なお自分の場合440万単語のトライ木を保存するときに上記数値で保存できた。