OmniAICreator/Qiita-1.07M huggingface dataset:
NSTaskを非同期で実行する


## UNIXコマンドを非同期で実行する

SwiftでMacアプリを作るときに。

参考：[UNIXコマンドを実行する(非同期)](http://qiita.com/denjin-m/items/e859953aa83c93cddd2b)
参考：[【OSX】【swift】コマンドの実行](http://qiita.com/kitanoow/items/8b551a2d121ff95ef553)

非同期で、対話式に出力を取りたい時、少し罠があるのと、面倒が多いので、罠を乗り越えたクラスを作りました。

リポジトリ：[https://github.com/ha1fha1f/CommandTask](https://github.com/ha1fha1f/CommandTask)

重要なのは[CommandTask.swift](https://github.com/ha1fha1f/CommandTask/blob/master/CommandTask/CommandTask.swift)だけです。

使い方は、

```swift
let task = CommandTask(cmd: "/usr/bin/curl", arguments: ["https://qiita.com"])
            .addObserver { string in
                print("observe", string)}
            .addCompletionHandler {
                print("complete")}
            .launch()
```

とするだけです。（参照：[ViewController.swift](https://github.com/ha1fha1f/CommandTask/blob/master/CommandTask/ViewController.swift)）

自分のPCで実行する場合、コマンドのパスは、ターミナルで `which コマンド名` とすれば調べられます。

対話式に入力したいときは、

```swift
task.writeln("今日はいい天気ですね")
```

を実行すればよいです。よく考えれば当たり前なのですが、writeのあとに `"\n"`を入れないと入力が完了しないのに、入れ忘れて結構時間無駄にしましたので、自動で入力するメソッドを用意しました。

その他罠としては、terminationHandlerが呼ばれたあとも、NSFileHandleDataAvailableNotificationのオブザーバーが呼ばれる点です。これには完了処理を呼ばれたあとで判断することによって対処しました。

ネットのコードを見ていると、 `NSTaskDidTerminateNotification` を用いているものもありますが、標準で用意されている `terminationHandler` を用いたほうが良いと思います。タイミングは同じです。

## 実行ファイルをプロジェクトの中に入れる

実行ファイルのバイナリは、もちろんアプリの中に入れることもできます。archiveしたあとも、.app内部に入ります。

その場合は、プロジェクト内の適当なところにファイルを配置しておいて、 

```swift
NSBundle.mainBundle().pathForResource("ファイル名", ofType: "")
```

とすれば取得できます。これをCommandTaskのイニシャライザの引数にセットすればOKです。

## 不安点

メモリ管理、どうなってるのかわからなくて不安なので、詳しい方はコメントいただけると嬉しいです。
現状のコードだと、commandTaskのインスタンスを、viewcontrollerのプロパティなどとして保存しておかない)と、参照が0になって、commandTaskのプロパティとして保存しているobserverとかが消失して、呼ばれなくなるので、その辺修正の必要を感じています
Unity（C#)でリスト・配列の中身をランダムに並び替え、ランダムに要素を取得

###リストの中身をランダムに並び替え、ランダムな要素を取得</h3>

Unity関係ありませんが、結構使うので。たまに役に立ちます
ちなみにこの辺の投稿を参考にしています。
http://answers.unity3d.com/questions/486626/how-can-i-shuffle-alist.html

<h4>配列の中身を並び替え</h4>

```csharp
public static T[] Shuffle<T>(this T[] array)
{
    var length = array.Length;
    var result = new T[length];
    Array.Copy(array, result, length);

    var random = new System.Random();
    int n = length;
    while (1 < n)
    {
        n--;
        int k = random.Next(n + 1);
        var tmp = result[k];
        result[k] = result[n];
        result[n] = tmp;
    }
    return result;
}
```

<h4>リストの中身を並び替え</h4>

```csharp
public static List<GameObject> Fisher_Yates_CardDeck_Shuffle(List<GameObject> aList,int seed)
{

    System.Random _random = new System.Random(seed);

    GameObject myGO;

    int n = aList.Count;
    for (int i = 0; i < n; i++)
    {
        int r = i + (int)(_random.NextDouble() * (n - i));
        myGO = aList[r];
        aList[r] = aList[i];
        aList[i] = myGO;
    }

    return aList;
}
```

<h4>リストと配列の要素をランダムに取得</h4>
ついでに配列とリストの要素をランダムに取得するメソッドです。

<h4>配列の要素をランダムに取得</h4>

```csharp
public static T GetRandom<T>(this T[] self)
{
    return self[UnityEngine.Random.Range(0, self.Length)];
}
```

<h4>リストの要素をランダムに取得</h4>

```csharp
public static T GetRandom<T>(this IList<T> self)
{
    return self[UnityEngine.Random.Range(0, self.Count)];
}
```
2段階認証の設定がうまくいかずにGithubにログインできなくなった時の対処法

今回、結構焦ってしまったのでメモとして残しておきます。
結論、githubで開発したことがあれば新たにアカウントを作り直すといったことをしなくても復帰できます。

###そもそも
いつもセッションが残っていたので、ログインしなおすといったことをしないでずっとgithubにログインできていました。しかし、今回何を血迷ったのかログアウトしてしまい。。。ログインしようとしたところパスワードが思い出せずログインができません・・・・このままだと作業ができなかったので再度パスワードを設定することにしました。これが悪夢の始まりです。パスワードを設定仕直し、ログインしようとしたところ2段階認証で引っかかりました。ここで問題が起こります。Google Authenticatorを使っていたのですが、携帯を買い替えた際に設定を間違えてしてしまっていたため、ログインできなくなってしまいました。

Google先生に聞いたところ、こちらの記事がヒットしました。
[ヒャッハー!Githubから締め出しくらったぜぇ!](http://zafiel.wingall.com/archives/9732)

読んでみると、リカバリコードなるものを保存してあれば代わりに使うことができるとあったのですが、パソコンにあるファイルを調べてみてもそんなものはどこにも保存していませんでした。

それに付随してこの記事にはこんなことも書いてありました。
>二段階認証を設定していて携帯とリカバリーコード両方を無くした場合、セキュリティの都合上、アカウントの回復はできません

この時点でもはや希望の光は見えていませんでした。


###対処方法
新しいアカウントを再度作成するのも良いですが、それに伴いissueなどを旧アカウントから新アカウントに移行しなければならないのでどうしてもそれはしたくありませんでした。「二段階認証を設定していて携帯とリカバリーコード両方を無くした場合、セキュリティの都合上、アカウントの回復はできません」とのことですが、とりあえずgithubに連絡してみました(https://github.com/contact)

すると以下の返信がありました。
>The recovery codes would have had the default filename github-recovery-codes.txt or github_2fa_recovery_codes.txt - it may still be worth searching your computer, data backup, and/or email account for this document.
If you don't have valid recovery codes, you may be able to verify account ownership using an SSH key you have added to your account. To do this, please run the following command on the computer where your SSH key exists, and send us the full output:
ssh -T git@github.com verify
If you can verify account ownership, we can disable 2FA on your account so you can sign in again.

ざっくり内容はこんな感じ
・リカバリーコード本当に見つからないの？ファイル名は「github-recovery-codes.txt」もしくは「github_2fa_recovery_codes.txt」だから調べてみて。
・もし本当に無いなら、開発している環境でssh -T git@github.com verifyを叩いてみて。そうするとtokenが出るからそれを送ってくれ。

ということで自分のPCの開発している環境で叩いてみた
>$ ssh -T git@github.com verify
Please provide the following verification token to GitHub Support.
0194・・・・・・・・・・・・・・・・・・・・・・924h3rie90

とtoken出てきたました。こいつをコピーして、返信。。。。

その結果

>I've just removed two-factor authentication from your account, so you'll now be able to log in. As soon as you do, please be sure to re-enable two-factor authentication; it may have caused some hassle on this occasion, but we can avoid that in the future by taking some extra steps to avoid this down the road.

おー！！！2段階認証を解除してくれたみたいです。これで2段階認証なしでログイン出来ました。githubのサポートの方には心から感謝しています。



追伸）2段階認証にした際はリカバリーコードを保存しておきましょう！
ANSIエスケープシーケンス出力をHTMLに変換したい

ふと、Rails のログなど ANSI エスケープシーケンス使って吐かれたテキストを HTML に変換したくなったので調べてみたら、ansifilter なるものがあるらしい。

http://www.andre-simon.de/doku/ansifilter/en/ansifilter.php

CentOS 7 だと yum でインストール出来た(epel リポジトリ)。

ubuntu 16.04 LTS だと apt-get でインストール出来ないので、ソースを取得して、make、適当な所にコピー(もしくは make install で /usr/bin にインストール)。

~~~
$ wget http://www.andre-simon.de/zip/ansifilter-2.0.tar.bz
$ tar jxf ansifilter-2.0.tar.bz2
$ cd ansifilter-2.0/
$ make
$ cd src
$ cp ansifilter ~/bin
~~~

例えば、Rails の development.log を HTML に変換したい場合は、以下の通り。

~~~
$ ansifilter development.log -H > out.html
~~~
scalastyleのsbtプラグインがsrc/main/scala-2.11などのCross-versionのソースファイルをチェックしない時

http://www.scalastyle.org/sbt.html を動かすとき、
src/main/scala-2.11などのCross-versionのソースファイルをチェックしない。

`build.sbt` に

```
scalastyleSources in Compile := (unmanagedSourceDirectories in Compile).value
```

以上を追加すると `src/main/scala-2.11` ディレクトリ以下の
バージョン指定のソースフォルダも認識してくれるようになる。

以上
Dell OMSAをESXiに入れるワンライナー

ネット上で見かけるやり方はいちいちダウンロードしてきてscpしてとクソ面倒くさいので一発でいけるやり方をメモしておく。当たり前だけどESXiホストからインターネット必須。

1. https://vmwaredepot.dell.com/DEL でインストールしたいvibを探す
    - ESXiのバージョン毎に分かれているので簡単に探せる
2. vibのURLをコピー
3. ESXiにSSHし以下のコマンドを実行

```
~ # esxcli software vib install -v https://vmwaredepot.dell.com/DEL/5.5/vib20/OpenManage/cross_dell-openmanage-esxi_8.3.0.ESXi550-0000.vib
```

proxyが必要な場合は `--proxy=http://your.proxy:8080` でどうぞ。

ついでにiDRAC Service Moduleもインストールしておこう。

```
~ # esxcli software vib install -v https://vmwaredepot.dell.com/DEL/5.5/vib20/ISM/cross_oem-dell-iSM-esxi_2.3.0.ESXi550-0000.vib
```
python botoでS3にファイルuploadする ~Bucketに.(ドット)が入ってる時は実は厄介~


# 環境

python: 2.7.10

# コード

## Bucketの一覧を取得する
```
import boto
import boto.s3.connection

conn = boto.s3.connect_to_region(AWS_REGION,
  aws_access_key_id=AWS_ACCESS_KEY_ID,
  aws_secret_access_key=AWS_SECRET_ACCESS_KEY,
  is_secure=True,               # uncommmnt if you are not using ssl
  calling_format = boto.s3.connection.OrdinaryCallingFormat(),
           )

buckets = conn.get_all_buckets()
```

## オブジェクトの中身を取得

```
 bucket = conn.get_bucket(<Bucketの名前>)
 key = bucket.get_key(<オブジェクト名>)
 print key.get_contents_as_string() # オブジェクトの中身を取得

```

## オブジェクトをアップロード

こちらをimportとする。

```
from boto.s3.key import Key
```

```
 bucket = conn.get_bucket('dev') #アップロード先のBucket名
 fname = 'test_basic_usage.txt' # ここのファイル名は特に使用されない
 with open(fname, 'w') as f:
    f.write('basic_usage') # オブジェクトの中身
 k = Key(bucket)
 k.key = 'AA' # オブジェクト名 もしディレクトリにする場合は'aaa/test'等にする
 
 k.set_contents_from_filename(fname) # S3に作成したファイルを保存

```

やってることとしては
`test_basic_usage.txt`
という名前のファイルをカレントディレクトリに作成し、それを
`k.set_contents_from_filename`
この処理により、アップロードしている。

そういうわけなので,カレントディレクトリに `'test_basic_usage.txt` というファイルができてしまうことに注意


なので、ファイルを消す場合は

```
 delete_file = os.path.dirname(os.path.abspath(__file__)) + '/' + fname
 os.remove(delete_file)
```

という処理を上記処理の最後に追加するのが良い。


## S3のpathを期限付きで発行する

```
 bucket = conn.get_bucket('dev') #アップロード先のBucket名
 key = bucket.get_key(<Key名>) # "test/test.csv"等
 url = key.generate_url(5000)
 
```

これも、カレントディレクトリに
s3-ap-northeast-1.amazonaws.com/dev/<Key名>/ファイル名
みたいなフォルダとファイルが作成されるので以下のコードで削除することができる。

```
  shutil.rmtree("s3-ap-northeast-1.amazonaws.com") 
# "s3-ap-northeast-1.amazonaws.com"の部分は適当に弄ってください
```

# 参考
http://hacknote.jp/archives/17537/
http://srad.jp/~ninestars/journal/557562/
Androidのカウントアップ

# 初めに
[stackoverflow: How to add a Countup timer on Android?](http://stackoverflow.com/questions/9276858/how-to-add-a-countup-timer-on-android)を元に、カウントアップのコードを作ろうとした。

restartがなかったのでコードに付け足してみた。

# コード
android.os.CountDownTimer 的な感じで使える...らしい。

```CountUpTimer.java
public abstract class CountUpTimer {

    private final long interval;
    private long base;
    private long elapsedTime;

    public CountUpTimer(long interval) {
        this.interval = interval;
    }

    public void start() {
        base = SystemClock.elapsedRealtime();
        handler.sendMessage(handler.obtainMessage(MSG));
    }

    public void restart() {
        base = SystemClock.elapsedRealtime() - elapsedTime;
        handler.sendMessage(handler.obtainMessage(MSG));
    }

    public void stop() {
        handler.removeMessages(MSG);
    }

    public void reset() {
        synchronized (this) {
            base = SystemClock.elapsedRealtime();
        }
    }

    abstract public void onTick(long elapsedTime);

    private static final int MSG = 1;

    private Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            synchronized (CountUpTimer.this) {
                long elapsedTime = SystemClock.elapsedRealtime() - base;
                CountUpTimer.this.elapsedTime = elapsedTime;
                onTick(elapsedTime);
                sendMessageDelayed(obtainMessage(MSG), interval);
            }
        }
    };
}
```


```CountUp.java

public class CountUp extends CountUpTimer{
    public CountUp(long interval) {
        super(interval);
    }

    @Override
    public void start() {
        super.start();
    }

    @Override
    public void restart() {
        super.restart();
    }

    @Override
    public void stop() {
        super.stop();
    }

    @Override
    public void reset() {
        super.reset();
    }

    @Override
    public void onTick(long elapsedTime) {
        Log.d("event", "経過時間: " + elapsedTime);
    }
}

```


```MainActivity.java

public class MainActivity extends AppCompatActivity {

    CountUp countUp;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        countUp = new CountUp(500); // 仮に500ミリ秒ごとにイベントを起こすとする
        countUp.start();
    }
}

```
9/7　今日の学習内容～リダイレクションをしてみる～

###今日の学習内容
***
今日は、昨日に引き続き、[改訂３版基礎Ruby on Rails](https://www.amazon.co.jp/dp/4844338153)を読みながら、実際に手を動かして学習を進めていきました(*‘∀‘)

###リダイレクションをしてみる
***
前回の学習で作ったファイルに書き加えていきます。
前回の内容はこちら↓
>[9/6　今日の学習内容～アクションで使える機能～](http://qiita.com/shouxuohs/items/05846ae35eafa413e338)

上記の内容（というよりも、これまでの内容）を引き継いで練習を進めていくので、一緒に学習しようという方がいらっしゃいましたら、簡単にでも見ておいていただけると嬉しいですm(__)m


リダイレクションをRailsで行うのはとても**簡単**です。
Railsアプリケーションでは``redirect_to``メソッドを使うことでリダイレクションが出来てしまうからです(*‘∀‘)

では、実際にリダイレクションをしてみましょう(-ω-)/
下記の画像を参考に``lesson_controller.rb``にコードを書き加えてください。

![cloud9_27.png](https://qiita-image-store.s3.amazonaws.com/0/137880/f2798ac2-1168-92d6-d363-d01fcbf17d2b.png)

その後、上記の画像を参考に、``rails s -b $IP -p $PORT``でRailsサーバーを立ち上げてください。
（この際、**アプリケーションのディレクトリに移動していることを確認してください。**``cd アプリケーション名``をターミナルに打ち込むことで移動できますよ。）

Railsサーバーを立ち上げたなら、上記の画像の一番下の赤枠内をクリックし、Openを選択します。

![cloud9_28.png](https://qiita-image-store.s3.amazonaws.com/0/137880/8f5ac488-4378-ef49-683a-a6bfd3cbf96a.png)

これまで、私とまったく同じように進めてきた方は、上記の画像と同じようなページが開かれると思います(-ω-)/

ここまでは、これまでと変わりませんよね？

では、URL欄の最後に``/lesson/practice2``を書き加えてください。
``practice2``アクションが選択され、そこに書かれたリダイレクション先に従って、ページが移動したのが確認できますでしょうか？

![cloud9_29.png](https://qiita-image-store.s3.amazonaws.com/0/137880/73c161cb-5c9c-e9ec-0910-038d47fc1acd.png)


リダイレクションできました!(*‘ω‘ *)

###あとがき
***
今日はリダイレクションの仕方を学習していきました。
やはり[改訂３版基礎Ruby on Rails](https://www.amazon.co.jp/dp/4844338153)はわかりやすい良書だと思います(*‘ω‘ *)
専門書はお高いのですが、最初の一冊におすすめということで購入した一冊ですね(-ω-)/
オススメとあるように、とても進めやすいと思います。
いまからRailsの学習を始める方にはおすすめです(-ω-)/

###参考にさせていただいたサイトなど
***
 - [改訂３版基礎Ruby on Rails](https://www.amazon.co.jp/dp/4844338153)
 - [cloud9](https://ide.c9.io)
GitlabでCI（イメージ）

# 最初は
最初は```Gitlab```を入れればCIツールがすぐに使える物だと思っていました。
インストール後にものの５分でそれだけではダメだと気づきました(笑)

ドキュメントやらググったりで以下の環境で```runner```が動くようです。

- Linux(Debian/Ubuntu/CentOS/RedHat)
- OSX
- Windows
- Docker
- Auto-scaling(Docker？)
- FreeBSD

# 図解

文章だけ読んでいても分かりづらいです(笑)
本編のドキュメントでもざっくり図解[^1]して欲しいですね。
文章だと上の列挙だけになるのですがつまりこういうことですよね？
動かしたり、ドキュメント読んで試行錯誤して自分の中でのイメージはこうなりましたｗ

![gitlab-ci-multi-runner.png](https://qiita-image-store.s3.amazonaws.com/0/12727/aee81c8f-1903-ad7f-bf2e-1c40ef663b42.png "gitlab-ci-multi-runner.png")

図であげたのがすべてではないですが、イメージ的には```Gitlab```があって、別の場所でCI(Runner)が動くと言うことですね。[^2]
図を見ても分かる通りいろんな環境で動かすことができそうです。

# 実際動かしてみて
いくつか動かしてみてテストやデプロイやっていてノウハウを残せればと思います。
それから、環境毎の結果を一つずつ書いていこうと思います。[^3]

# 関連
- [Gitlab日本語化(docker)インストール](http://qiita.com/takara@github/items/06577c49b7e1d3f68102)
- [Gitlabでlfs](http://qiita.com/takara@github/items/554edd6b22c5dee1be36)
- [GitlabでCI docker編](http://qiita.com/takara@github/items/dce4f443f18e9f115760#_reference-8d3efea317aed7dc6352)
- [GitlabでCI debian編](http://qiita.com/takara@github/items/7a1533930bcadc57b92f)


# 参考サイト
- [Gitlab runner](https://gitlab.com/gitlab-org/gitlab-ci-multi-runner)

[^1]: 最初に右脳に訴えてくれればあとは細かいことはすんなり入るのにと思う。
[^2]: 考えてみればテストとか```Gitlab``` で動いたらいくらでも遅くなりそうですもんのね
[^3]: それは良い意味ですべてを検証してから載せるのではなく個別に確認できたものから載せるという意味で。たぶん、WindowsとFreeBSDは書かない（環境がないもしくは興味がないｗ）ので環境のある方、補足して下さいｗ
WordPressの管理画面を簡単にカスタマイズしてみる


- 世界で最も利用されているCMS
- 管理画面をカスタマイズできる

というような特徴をもつWordPress。
我が社で行われた[勉強会](http://leccafe.connpass.com/event/39269/ "勉強会")での内容をメモした内容になります。

**ただしWordPressのインストール等は完了済みであることを前提とします。**

#ファイル構成

```
/wp-admin
/wp-content
	/themes
	/plugins
	/uploads
/wp-include
```

基本的にwp-content以外は触らないようにすること。

#プラグインをインストールする

- Advanced Custom Fields
- Custom Post Type UI

**プラグイン > 新規追加** で上記２つのプラグインをインストール。

#「カスタム投稿タイプ」と「カスタムフィールド」

デフォルトで用意されているページは次の２つ。

- 投稿
- 固定ページ

コレ以外に「お知らせページを追加したいなー」とか「項目を増やしたいなー」というときに次の２つを追加する。

##カスタム投稿タイプ

「お知らせ」や「イベント」など、好きなページを追加できる。

##カスタムフィールド

投稿にタイトル、本文以外に好きな項目を追加できる。

#カスタム投稿タイプ/カスタムフィールドを管理画面に追加する

管理画面左側のメニューからそれぞれ行う。

##カスタム投稿タイプ

「CPT UI」の「Add/Edit Post Types」を選ぶ。
「Basic setting」の３つのフォームに新しく追加したいページを **英語名** で入力。
「Add Post Type」するとメニューバーに「info」が出現。

管理画面での表示を「お知らせ」のように日本語表示する場合は、「Add/Edit Post Types」の「Edit Post Types」タブから「Additional labels」に日本語訳を追加する。

##カスタムフィールド

「カスタムフィールド」を選ぶ。
「フィールド名」は必ず英語にすること。

##注意点

この時点では **管理画面にのみ カスタム投稿タイプ/カスタムフィールド が追加された** だけです。

#カスタム投稿タイプ/カスタムフィールドをweb上でも表示する

**外観 > テーマの編集** と進むと、画面右側に各ページを構成するファイルが一覧表示されている。
これらのファイルのコードを追加・修正することでテーマのカスタマイズができるようになる。
ローカルファイルをテキストエディタなどで更新して変更してもOK。


```php
// 「お知らせ（info）」ページの内容をサイドバーに表示する場合
<?php if ( is_active_sidebar( 'sidebar-1' )  ) : ?>
	<aside id="secondary" class="sidebar widget-area" role="complementary">
	
		// post_type：表示させたいページのフィールド名
		// posts_per_page：ページに表示させたい数
		<?php $args = array( 'post_type' => 'info', 'posts_per_page' => '2'); ?>
		<?php $the_query = new WP_Query( $args ); ?>
		<?php if($the_query->have_posts()) : ?>
			<ul>
			<?php while($the_query->have_posts()): $the_query->the_post(); ?>
				<li>
					<span><?php the_field('date_on'); ?></span>
					<span><?php the_field('info_detail'); ?></span>
					<?php the_title(); // ここで投稿データ取得 ?>
				</li>
			<?php endwhile; ?>
			</ul>
			<?php wp_reset_postdata(); ?>
		<?php else: ?>
		<p><?php _e( 'Sorry, no posts matched your criteria.' ); ?></p>
		<?php endif; ?>

		<?php dynamic_sidebar( 'sidebar-1' ); ?>
	</aside><!-- .sidebar .widget-area -->
<?php endif; ?>
```

##phpの制御構文

phpではif文で `;` じゃなく `:` を使ったりするらしい。
詳しくは[こちら](http://php.net/manual/ja/control-structures.alternative-syntax.php "こちら")。

##WordPress公式リファレンス

WordPressで使える関数は[こちら](https://wpdocs.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/WP_Query "こちら")を御覧ください。

##the_field()とget_field()の違い

「the_field()」は **表示まで全て** を行ってくれる。
「get_field()」は **値の取得だけ** をしてくれる。

プログラミングが少しデキる人であれば「get_field()」は変数なんかに使うと便利。
ややこしいことは必要ない、というのであれば「the_field()」でOK。

#テンプレート自体新しいものを用意して表示したいとき

テンプレートのファイルを管理画面から追加することはできないので、ローカルのフォルダ内に追加する。
そのときの名前は **single-{post_type}.php** とする。
例えば「single-info.php」のようにすると、自動的に **infoの画面はテンプレートをsingle-info.php** にするようになるらしい。

#引っ越しするとき

内容をコピペで引っ越すことはできるが、カスタマイズは引き継げないので注意。
ModemManager の止め方

ModemManager がデバイスを制御して困った！というときの方法いろいろ。下に行くにしたがって強まる。

### qmi-proxyを使う
ModemManager が起動しているせいで qmicli が使えなくて困るという話は qmi-proxy を使うと良いはず。

```
qmictl -p ...
```

### udev rule

ModemManager は udev 経由でデバイスの認識を開始する。`ID_MM_DEVICE_IGNORE` を設定すると管理対象外になる。ModemManager自身の blacklist の仕組みはコレ。

```77-mm-usb-device-blacklist.rules
# Sweex 1000VA
ATTRS{idVendor}=="0925", ATTRS{idProduct}=="1234", ENV{ID_MM_DEVICE_IGNORE}="1"
```

### systemd

普通にサービスを停止すると、デバイスは開放される。

```
systemctl stop ModemManager
```

### apt

いっそのことシステム上から取り除いてしまう。

```
apt-get remove modemmanager
```
Sublime Text3 で、特定の拡張子ファイル(".ctp"とか）のシンタックスハイライトを変更する

#環境
・Sublime Text3利用
・CakePHPの練習中
・".ctp"というファイルにHTMLタグを書いて表示画面を作っている（PHPを書いている）

#.ctpという拡張子のファイルのタグの字の色が変わらない
　".ctp"ファイルの内容はHTMLタグで書かれているのに、HTMLのシンタックスハイライトもPHPのもつかない。見づらい。

#解決方法
SUblimeText3の設定を変えるだけ。簡単だった。
<img width="758" alt="スクリーンショット 2016-09-07 22.16.27.png" src="https://qiita-image-store.s3.amazonaws.com/0/133879/a1b21c9e-8429-8d7c-72b6-fff7ca86c16d.png">



　View -> Syntax -> Open all with current extension as 
ここをPHPにすると、すべての.ctpファイルにPHPのシンタックスハイライトがつく。
API Gateway でエクスポートした Swagger の json を差分比較しようとしたら、なぜかパラメーター順序が違うので比較しにくい

標題の通りなのだが、例えば API Gateway で本番環境へ設定をデプロイする際、万全を期すため現行の本番ステージと開発ステージでどこが異なるかを事前に確認したい場合には、各ステージの API 設定を Swagger ファイル（json）にエクスポートして差分を見ることで詳細に知ることができる。

だが、json 書き出しライブラリが原因か分からないが、全然関係ない箇所でパラメーターの順序が異なることがたまにあり、単純な差分比較ができない状況になることがある。

そこで [jq コマンド](https://stedolan.github.io/jq/) を使って、以下のように正規化することで比較しやすくなる。リリース直前に何度か同じ状況に陥り、その度にあわてるので、自分用メモとしてここに残して置く。

```sh
jq --sort-keys . swagger_dev.json > swagger_dev_normalized.json
jq --sort-keys . swagger_prod.json > swagger_prod_normalized.json

vimdiff swagger_{dev,prod}_normalized.json
```

そんなに使用頻度が高いわけではないが `alias normalize_json='jq --sort-keys .'` としておけば、もう少しあわてないですむかもしれない。
SICP読書女子会#20 2.2.2 


[オンラインSICP読書女子会 #20 (2.2.2(3)) - connpass](http://ladiespp.connpass.com/event/39681/)
[SICP/2.2.2.scm at master · cocodrips/SICP](https://github.com/cocodrips/SICP/blob/master/2.1/2.2.2.scm)

```lisp

(display "==========Scele tree===========")
(newline)
(define (scale-tree tree factor)
    (cond 
        ((null? tree) ())
        ((not (pair? tree)) (* tree factor))
        (else (cons (scale-tree (car tree) factor)
                    (scale-tree (cdr tree) factor))))
)

(display (scale-tree (list 1 (list 2) 3) 10))
(newline)
(define (scale-tree tree factor)
    (map (lambda (sub-tree)
        (if (pair? sub-tree)
            (scale-tree sub-tree factor)
            (* sub-tree factor)))
    tree)
)

```


## Ex 2.30


```lisp

;; ex 2.30
(display "==========Ex 2.30===========")
(newline)

;; 普通に
(define (square-tree tree)
    (cond 
        ((null? tree) ())
        ((not (pair? tree)) (* tree tree))
        (else (cons (square-tree (car tree)) (square-tree (cdr tree)))))
)

(display (square-tree (list 1 (list 2) 3)))
(newline)
;(1 (4) 9)

;; map
(define (square-tree tree)
    (map (lambda (sub-tree)
        (if (pair? sub-tree)
            (square-tree sub-tree)
            (* sub-tree sub-tree)))
    tree)
)
(display (square-tree (list 1 (list 2) 3)))
(newline)
;(1 (4) 9)
```


## Ex 2.31

```lisp

(display "==========Ex 2.31===========")
(newline)
(define (tree-map tree f)
    (map (lambda (sub-tree)
        (if (pair? sub-tree)
            (tree-map sub-tree f)
            (f sub-tree)))
    tree)
)
(display (tree-map (list 1 (list 5) 7) (lambda (x) (* x x))))
(newline)
;(1 (25) 49)

```


## Ex 2.32

```lisp

(display "==========Ex 2.32===========")
(newline)
(define (subsets s)
    (if (null? s)
        (list ())
        (let 
            ((rest (subsets (cdr s))))
            (append rest (map (lambda (x) (cons x (car s))) rest)))))
(display (subsets (list 1 4 7)))
(newline)


;(1) -> () (1)
;(1 2 3)         : ()
;        (2 3)   : () (1)
;        (3)     : () (1) (2) (1 2)
;        ()      : () (1) (2) (1 2) (3) (1 3) (2 3) (1 2 3)
```
Bluemix：簡易ETLサービスDataConnect（JOINの方法を動画で解説してみた）

**サービスの名前が変わったようなので、タイトルだけ名前変えてます**
**旧：DataWorks 
新：DataConnect**

いつもキャプチャだらけで記録してると通り一遍等なので、解説動画的なものを作ってみました。
見て頂くとわかりますが、本当にクリックだけで概ねの設定ができてしまいます。
ぜひ、動画サイズを最大化して御覧ください（小さすぎて細かい文字が見えません涙）

<blockquote class="twitter-tweet" data-lang="ja"><p lang="und" dir="ltr"><a href="https://t.co/pIdPOgHN4z">pic.twitter.com/pIdPOgHN4z</a></p>&mdash; Jin (@jin_azzeten) <a href="https://twitter.com/jin_azzeten/status/773497967680421888">2016年9月7日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

## 参考リンク（自分の記事ですが）
そもそものDataworksの使い方はこちら
http://qiita.com/azzeten/items/a0b604c67d993387ff5e

JOINの元ネタはこちら
http://qiita.com/azzeten/items/d9d10c1418b3347a7534
Scalaのカリー化　自分用まとめ

## 自分用のまとめ

###　数値の最大値を求める関数をいくつか書いてみる
```scala
/*関数定義*/
val sample = (x:Int)=> {x}
//sample: Int => Int = <function1>  1引数を取りInt型の値を返す関数)を返す関数
```

```scala
/*２値の大きいほうを求める関数*/
val max_ = (x:Int,y:Int)=>{
    if (x>y){x}else{y}
}
//max_: (Int, Int) => Int = <function2>　2引数をとりInt型の値を返す関数
```

```scala
/*10と大きさを比較し大きいほうを返す関数をmax_をもとに作る*/
val max_10 = max_(10)
//エラー発生
Main.scala:25: not enough arguments for method apply: (v1: Int, v2: Int)Int in trait Function2.
Unspecified value parameter v2.
max_(10)
```

```scala
/*カリー化*/
val max_c = max_.curried
//max_c: Int => Int => Int = <function1>　-> max_c: Int => (Int => Int = <function1>) //1引数をとり　(1引数を取りInt型の値を返す関数)を返す関数を返す関数

/*10と大きさを比較し大きいほうを返す関数をmax_cをもとに作る*/
val max_10 = max_c(10)
//max_10: Int => Int = <function1> 1引数をとりInt型の値を返す関数

/*10と比較して大きいほうを求める*/
max_10(11) /* 11 */
max_10(9)  /*  10 */
max_c(10)(11) /* 11 */
max_c(10)(9)  /*  10 */
//max_10(11)はmax_c(10)(11)ともかける
```


```scala
/*3つの数値の中から一番大きい値を求める*/
val max3_ = (x:Int,y:Int,z:Int)=>{
    max_(z,max_(x,y))
}
/*カリー化*/
val max3_c = max3_.curried
```
### 関数の定義と自分の認識
- max_: (Int, Int) => Int = \<function2>　
 - 2引数をとりInt型の値を返す関数
- max_c: Int => Int => Int = \<function1>　-> max_c: Int => (Int => Int = \<function1>) 
 - 1引数をとり(1引数を取りInt型の値を返す関数)を返す関数を返す関数

- max3_: (Int, Int, Int) => Int =\<function3> 
 - 3引数を取り　 Int型の値を返す関数
- max3_c: Int => Int => Int => Int = \<function1> -> max3_c: Int => {Int => (Int => Int = \<function1> )}　
 - 1引数をとり　(1引数を取り(1引数を取りInt型の値を返す関数)を返す関数) を返す関数を返す関数

###まとめ
カリー化の認識
多変数引数関数(なんらかの型を返す)を１引数関数(関数を返す)に変換するという理解でOK？
Bashでテンプレートエンジンっぽいものを作った

ちょっとした自動化で使えるように、Bashで`render_template`したい。

`util::render_template template.txt 'name=bashist&wheather=good'`みたいに使う。

# できたもの

```sh
# Render a template file
#
# $ cat template.txt
#   ==========================
#   Hello, I'm {{ name }}.
#   It's {{ wheather }} wheather today.
#   ==========================
#
# $ util::render_template template.txt 'name=bashist&wheather=good'
#   ==========================
#   Hello, I'm bashist.
#   It's good wheather today.
#   ==========================
util::render_template() {
    template_text="`cat $1`"

    saveIFS=$IFS
    IFS='=&'
    parm=($2)
    IFS=$saveIFS

    declare -A params
    for ((i=0; i<${#parm[@]}; i+=2)); do
        template_text=`echo "$template_text" | sed "s/{{ ${parm[i]} }}/${parm[i+1]}/"`
    done

    echo "$template_text"
}
```

テストコードはこちら。Bats便利ですね。

```sh
tree
|-- lib
|   `-- util.sh
`-- test
    |-- fixtures
    |   |-- test_include_asterisk.tpl.txt
    |   `-- test.tpl.txt
    `-- test_util.bats
```

```sh:test/util_test.bats
#!/usr/bin/env bats

source './lib/util.sh'

@test "util::render_template with newline" {
    expected="Hello, I'm bashist.
It's good wheather today."
    actual="`util::render_template './test/fixtures/test_include_newline.txt' 'name=bashist&wheather=good'`"
    [ "$expected" == "$actual" ]
}

@test "util::render_template with asterisk" {
    expected="Hello, bashist! Asterisk is *."
    actual="`util::render_template './test/fixtures/test_include_asterisk.txt' 'name=bashist'`"
    [ "$expected" == "$actual" ]
}
```

```sh:test/fixtures/test_include_newline.txt
Hello, I'm {{ name }}.
It's {{ wheather }} wheather today.
```

```sh:test/fixtures/test_include_asterisk.txt
Hello, {{ name }}! Asterisk is *.
```

うっかり、関数内で変数を `"` で囲むのを忘れると、`*` がシェルで展開されてエラーになるので、テストコードを付けておいた。


参考

- http://qiita.com/5t111111/items/c4a382c7dd896c353d03
- http://stackoverflow.com/questions/3919755/how-to-parse-query-string-from-a-bash-cgi-script
【Java】millisSecondからHH:mm:ss:SSSにゴリ押しする

#　初めに
カウントダウンアプリを作ろうとして、ミリ秒から時間表示をさせるところで詰まったので自分で書いた。

# 問題があったもの
long型のtimeMilliSecを与えると、HH:mm:ss.SSSに変化してくれるようにしたのように書いたら、７時間ほど時間がずれてしまった。( 0を与えると 07:00:00.000 なってしまう)

```
SimpleDateFormat formatter = new SimpleDateFormat("HH:mm:ss.SSS");
String timeFormatted = formatter.format(timeMilliSec);
```

#　コード

これで解決？

```TimeFormatter.java
public class TimeFormatter {
    public static String format(long millis) {
        long hour = (millis / (1000 * 60 * 60)) % 24;
        long minute = (millis / (1000 * 60))  % 60;
        long second = (millis / 1000)  % 60;
        long millisSec = millis % 1000;

        String time = String.format("%02d:%02d:%02d:%03d", hour, minute, second, millisSec);
        return time;
    }
}
```

# 使用例

9342633ミリ秒を、02:35:42:554 に変換してみる。

```
        int hour = 2;
        int minute = 35;
        int second = 42;
        long time =  (hour * 3600 + minute * 60 + second) * 1000　+ 633;

        String formattedTime = TimeFormatter.format(time);
```

# 追記

## SimpleDateFormatを使う

タイムゾーンの関係でGenymotionで動かしていた時に時間がずれてしまっていたようです。

変なクラス作らなくとも、JavaのAPI使えばいけるそうです！

```
SimpleDateFormat formatter = new SimpleDateFormat("HH:mm:ss.SSS");
        formatter.setTimeZone(TimeZone.getTimeZone("GMT"));
        String timeFormatted = formatter.format(time);
```

## 別の環境で試して見る

記事とは関係ないですが、今勉強中のフレームワークでも動かしてみました。

PlayFrameworkを使ってChrome上で実行した時にも時間がずれる現象が確認できました。

一番右がタイムゾーンを設定する

```
        formatter.setTimeZone(TimeZone.getTimeZone("GMT"));
```

をコメントアウトした部分です。

![](https://i.gyazo.com/dbf9000b41e1d766a48cdc9513920639.png)
pecoがGoで書かれていたのでD言語でdocoを作った

#はじめに
`peco`が便利という話を前々から聞いていたのですが、Goで書かれていたこともあり(Goの環境を整えるのが面倒くさかっただけです)
つい最近まで使っていなかったのですが、最近ようやく導入して使い始めました。

とても便利で今までどうして導入しなかったんだろう...というぐらいです。

ところで、先日Qiitaの記事を適当に読んでいたところ次のような記事を見つけました。
[おい、peco もいいけど fzf 使えよ](http://qiita.com/b4b4r07/items/9e1bbffb1be70b6ce033)

ここの記事の中で紹介されている有名なテキストセレクタの表を眺めていると、pecoも含め、多くがGoで書かれていることが目に止まりました。

僕はGo言語は全然知らないのでなんとも言えませんが最近はやりのCLIツールの多くがGo言語で書かれたりしているように感じますし(というかCLIツールに限らず流行りのソフトウェアがGoで書かれている確率が高い気がする)、この手のツールを作るのもGoに向いているのかもしれません。

しかし、私の好きなD言語でも実装できるはずです。そこで、自分用に`peco`のようなテキストセレクタを実装してみようと思い、`doco`を作ってみました。
命名は`deco`だとなんか微妙な気がしたので`doco`としました。特に深い意味はないです。

#doco
というわけで、標準入力で受け取った行をフィルタして標準出力に返すだけの非常にシンプルなテキストセレクタをつくりました。

[doco](https://github.com/alphaKAI/doco)

使い方は`peco`と同様に標準出力を`doco`へパイプで渡すだけで使えます。

`cd $(ls -1 | doco)`

というような感じで。

ちなみに、`peco`よりも便利な点としては、正規表現をサポートしていることです。
たとえば、前述の`ls -1`の出力をフィルタする際にディレクトリだけをマッチさせたい場合、`.*/`と書くことでディレクトリだけを取り出す事ができます。

インストールは、DコンパイラとDのビルドツール兼パッケージマネージャのdubをインストールした状態で

```zsh
$ cd path/to/install
$ git clone https://github.com/alphaKAI/doco
$ cd doco
$ dub build
$ alias doco=$(pwd)/doco
```

とするだけです。


既知の問題として、マルチバイト文字が標準出力として受け取った標準出力に含まれていた場合、文字化けします。
これは、`doco`は`termobox-d`に依存しており、`termbox-d`は`termbox`のDバインディングであるため、`termbox`がマルチバイト文字をサポートしていないことに起因します。
この問題はいつか時間のあるときにCLIフレームワークみたいなものを書いて解決しようと考えています。


実装について何か書こうと思っていたのですが、特に書くことが思い浮かばなかったので実装について気になる方はソースコードを読んでください: [source/app.d](https://github.com/alphaKAI/doco/blob/master/source/app.d)
OSX ServerのセカンダリDNSにxname.orgを設定した

随分昔に設定したものが更新されなくなっているのに気づき再設定。OSX ServerはGUI以外から設定したものはOSアップグレード時などになかったことにされがちなのでメモ。以下、独自ドメインがhogehoge.jpだと仮定。
OSX ServerのDNSサービスはbindで構成されていて、設定ファイルは

~~~
/Libraty/Server/named/
~~~

に集約されています。
まずはNSレコードを追加。これはGUI（Server.app）からできるでしょう。正常に追加されれば

~~~
/Libraty/Server/named/db.hogehoge.jp
~~~

に

```
                                      10800 IN NS       ns0.xname.org.
                                      10800 IN NS       ns1.xname.org.
                                      10800 IN NS       ns2.xname.org.
                                      10800 IN NS       ns1.hogehgoe.jp.
```

てな感じで追加されているでしょう（ns1.hogehoge.jpは既存NSレコード）。

続いてallow-transfer設定の追加。このアドレスからのアクセスをセカンダリDNSからの情報取得として認めるよ、って設定ですね。[xname.orgのFAQ](https://www.xname.org/faq.php?language=en#item4)には、


>195.234.42.0/24 (from 195.234.42.1 to 195.234.42.254)
>193.218.105.144/28 (from 193.218.105.145 to 193.218.105.158)
>178.33.255.252
>88.191.64.64
>92.243.14.172

と書いてあり、一方、Create/Modify Zoneした後の説明書きには、

>176.31.100.84;
>195.234.42.1;
>88.191.240.146;
>178.33.255.252;

とあります。どっちが正しいのかよくわからないので、ANDをとって、

>195.234.42.0/24;
>193.218.105.144/28;
>178.33.255.252;
>176.31.100.84;
>92.243.14.172;
>88.191.240.146;
>88.191.64.64;

としておきました。これを、

~~~
/Libraty/Server/named/named.conf
~~~

の以下のあたりのnone;の代わりに書き加えます。

```
view "internal" {
        zone "localhost" IN {
                type master;
                file "localhost.zone";
                allow-update {
                        none;
                };
        };
        zone "hogehoge.jp" IN {
                type master;
                file "db.hogehoge.jp";
                allow-transfer {
                        none;                <---消す
                         195.234.42.0/24;    <---追加
                         193.218.105.144/28; <---追加
                         178.33.255.252;     <---追加
                         176.31.100.84;      <---追加
                         92.243.14.172;      <---追加
                         88.191.240.146;     <---追加
                         88.191.64.64;       <---追加
                };
```

また必要かどうか定かではないですが、Server.appのDNS画面で「ルックアップを実行」を「一部のクライアントのみ」としている場合、「ルックアップクライアントを編集...」で「次のネットワーク上のクライアント」をチェックし、上記のIPを登録しておきます。いらないような気もします。

これでDNSサービスを再起動し、反映を待ちます。数時間かかることもあるようですが、Server.appのログを眺めていればアクセスがあったことが確認できます。
ただそれでもxname.org上のView Zone -> Zone Contentでは表示されず終い。ターミナルで、

~~~
dig @ns0.xname.org hogehgoe.jp
~~~
などとするときちんと動作してるようなので良しとしました。

あとはドメイン管理会社の管理ページ上で、ns0/ns1/ns2.xname.orgをDNSサーバーとして追加しておくのをお忘れ無く。

xname.orgはお知らせなどの日付からするとあまり活発には更新されてないようですが、末永く存続してほしいものです。この機会に寄付をしておこうと思います。
TabBarControllerのタブを消したい



`View Controller`の `Hide Bottom Bar on Push` にチェックを入れる。

![Kobito.QBA3CY.png](https://qiita-image-store.s3.amazonaws.com/0/1691/6e1e8352-8504-1da9-9fc8-65867722d17b.png "Kobito.QBA3CY.png")
HDP 2.5がリリースされました

先週、HDP 2.5がリリースされました。以下はHotonworksのブログ記事です。
http://hortonworks.com/blog/announcing-availability-hortonworks-data-platform-2-5/

各サービスのバージョンは以下のようになっています。

![asparagus-hdp25.jpg](https://qiita-image-store.s3.amazonaws.com/0/8576/826c418f-6894-3820-afcc-a28a2e5575cd.jpeg)

HDP 2.5は以下からダウンロードすることができます。
http://hortonworks.com/downloads/#data-platform


主なハイライトとしては以下があります。

* Dynamic Security: Apache Atlas + Ranger Integration 
* Enterprise Spark at Scale: Apache Zeppelin Notebook for Spark
* Real-Time Applications: Storm and HBase/Phoenix
* Streamlined Operations: Apache Ambari
* Interactive Query in Seconds: Hive with LLAP (Technical Preview)

それぞれ簡単に説明していきます。

# Dynamic Security: Apache Atlas + Ranger Integration 

Apache Atlasはデータガバナンスのためのもので、Apache RangerはHadoopプラットフォーム間のデータのセキュリティを管理するためのものです。これらがインテグレーションされることにより、ダイナミックなセキュリティ管理ができるようになったようです。

# Enterprise Spark at Scale: Apache Zeppelin Notebook for Spark

Apache Zeppelinは、HDP 2.4まではTechnical Previewでしたが、HDP 2.5から正式にサポートされました。
Apache Zeppelinは、Web上でSpark用のScalaのコードや、Spark SQLを埋め込んだノートブックを作成することができるサービスです。言葉で説明するより、以下の動画で見ていただくのが非常にわかりやすいと思います。
https://www.youtube.com/watch?v=_PQbVH_aO5E&feature=youtu.be

また、Technical PreviewですがSpark 2.0も入りました。

# Real-Time Applications: Storm and HBase/Phoenix

Stormは1.0.1に上がり、Phoenixは4.7.0に上がりました。

Stormの主なハイライトは以下です。

* Developer Productivity: Sliding and tumbling windowing support
* Developer Productivity: New connectors for search and NoSQL Database
* Enterprise Readiness: Automatic back pressure
* Streamlined Operations: Resource aware scheduling and Storm view for Ambari

Phoenixの主なハイライトは以下です。

* Developer Productivity: Ad Hoc Analytics with connector to any ODBC BI tool
* Developer Productivity: Phoenix and Hive Integration to run HBASE queries in HIVE
* Enterprise Readiness: Incremental Back up/Restore
* Enterprise Readiness: Performance boost for high-scale loads

# Streamlined Operations: Apache Ambari

Apache Ambariは2.4になりました。以下が含まれています。

* Log Search (Technical Preview)
* Role-Based Access Control
* SmartSense 1.3 Integration
* Customizable Cluster Alert Checks

Technical PreviewですがSolrを使ったLog Searchが含まれています。
ここら辺は、後でこのブログで紹介したいと思います。

# Interactive Query in Seconds: Hive with LLAP (Technical Preview)

これは、Hive 2.0の話なのでTechnical Previewですが、LLAPが使えるようになっています。LLAPを使うことで1秒以内のクエリが実現できるようになります。

以下、主なハイライトです。

* Developer Productivity: Interactive query in seconds
* Ease of Use and Adoption : 100% compatible with Hive SQL
* Enterprise Readiness: Linear scaling at Terabytes volume of data
* Streamlined Operations: LLAP integration with Ambari with automated dashboards

# さらに詳細を知りたい方は

以下をご覧ください。
http://hortonworks.com/products/data-center/hdp/
pythonで非同期処理(threading)


```
import threading
import time
import sys
def f():
    '''
    非同期で行いたい処理
    今回は一秒ごとに秒数を表示する
    '''
    i = 1
    while True:
        print(i)
        i += 1
        time.sleep(1)

th = threading.Thread(target=f,name="th",args=())
# スレッドthの作成　targetで行いたいメソッド,nameでスレッドの名前,argsで引数を指定する
th.setDaemon(True)
# thをデーモンに設定する。メインスレッドが終了すると、デーモンスレッドは一緒に終了する
th.start()
#スレッドの開始

# 文字入力を受け付け、aだったら終了
# メインスレッドなので、これが終了するとデーモンスレッドであるthも終了する
while True:
    c = sys.stdin.read(1)
    if c == 'a':
        sys.exit()
```

一秒ごとに秒数を表示するthと言うスレッドを作成している。'a'が入力されたら終了する。
Adobe XD - アプリ系モックアップ制作時メモ

Adobe XDでアプリ系モックアップを作っていると
クライアントを交えたプレビューの時にこうするとクオリティ上がるかも？
的なノウハウを自分が忘れないようにメモ書き。


#背景色を白で作らない

![login_sample.png](https://qiita-image-store.s3.amazonaws.com/0/138215/0c1440ef-3d88-cd7f-cd13-016e325d541d.png)


ケースバイケースなので、必ずしも白がダメというお話ではないのですが、
どうしてもモックを作っているから感があるのか、
白のアートボードままでオブジェクトを配置していってしまうことを、
ついついやってしまいます。私もすごいやる。
勇気を出して背景色を新しく実装された線上グラデーションや、
黒バックに白文字などなど、
画面の大部分を占める背景色に色をつけてあげると
ワイヤーフレーム以上アプリ未満のモックに仕上がる気がします。たぶん。



#一コマ足す

![flow.png](https://qiita-image-store.s3.amazonaws.com/0/138215/ea842f65-34a8-01b0-427e-53a5962a0e0a.png)


例えば項目を選択して次へボタンを押すケース。
いきなりすべてがアクティブになっているものを作って、
口頭でここを選択すると、
ボタンがクリックできるんですよーを説明するよりも、
アートボードを複製してクリック前とクリック後を作り、
プロトタイプモードでリンクをつなぐとより動作がイメージつきやすくなります。
作っている側はイメージ出来ても
説明される側のクライアントはその一コマで助けられるケースが多いので
ちょいたししてあげるとみんな幸せ。私も幸せ。

#まとめ
より実装を意識したモックアップがXDで作れるので、
プレビュー時に、すでにお客様の中でデザインを意識してしまうケースが、
体感ですが多い気がします。
リピートグリッドなどで爆速でモックアップを作れますが、
楽するだけでなく、色使いやコマ足しなど、
もうひと手間加えるだけで
さらにクオリティが上がりクライアントエクスペリエンス（CX）の高い
モックアップが作れると思いますよ！よ！
カスタム投稿のリンク生成を変更する際の注意点

WordPressのカスタム投稿タイプを作成した際に、パーマリンクを投稿IDに設定したい場合があります。
その時に、ググると必ずと言っていいほど同じものがでるので、そのコードを使ってたのですが、使い回すようにするためにプラグイン化を行ったときに複数に分けて実行させてたのですね。

以下のコードが出回っているコードなのですが（CLASS化してるので若干違います。）

```php:post_type.php
// 一部抜粋
// 若干手を加えてあります。
public function __construnct()
{
	add_action('init', array(__CLASS__, 'rewrite'));
	add_filter('post_type_link', array(__CLASS__, 'permalink'), 10, 2);
}

public static function rewrite()
{
	global $wp_rewrite;

	$post_type = self::POST_TYPE;

	$query = "post_type=$post_type&p=";

	$wp_rewrite->add_rewrite_tag("%{$post_type}_id%", '([^/]+)', $query);
	$wp_rewrite->add_permastruct($post_type, "/$post_type/%{$post_type}_id%", false);
}

public static function permalink($post_link, $post)
{
	global $wp_rewrite;

	if (is_wp_error($post))
		return $post;

	if ($post->post_type === self::POST_TYPE)
	{
		$newlink = $wp_rewrite->get_extra_permastruct(self::POST_TYPE);
		$newlink = str_replace("%".self::POST_TYPE."_id%", $post->ID, $newlink);
		$newlink = home_url(user_trailingslashit($newlink));
		return $newlink;
	}
	return $post_link;
}
```

さて、このコードのどこが問題になっているのかというと、別に問題はないのです。

じゃあ何が悪いのさということですが、フィルターフックが１つ足りないんです。
`post_type_link`をフックした場合、`post_link`も一緒にフックしてあげないと、どれか一つしか動かないということ。
複数の投稿タイプを別々で処理してる場合は、この点を注意しておけば、発狂しないで済む。。。

```php:post_type.php
public function __construnct()
{
	add_action('init', array(__CLASS__, 'rewrite'));
	add_filter('post_type_link', array(__CLASS__, 'permalink'), 10, 2);
	add_filter('post_link', array(__CLASS__, 'permalink'), 10, 2);
}
```

上記のように、フックを追加すれば、バグから解放されます。

寝る時間が無くなったのは、手を抜いた罰ということですね(・ω・｀)
Boot2Dockerを試してみたときのメモ

windows環境でdocker使いたい。
そんなときはboot2dockerを。

## boot2doker

### ダウンロード

* boot2docker.exe
* boot2docker.iso

### インストール

* boot2docker.exeを実行する
    * 設定はデフォルトでOK

### 起動

* デスクトップに「Boot2Docker Start」ショートカットができてるので、実行する
    * boot2dockerの起動コマンド``$ boot2docker start``をしたのと同じ状態
    * 「Boot2Docker Start」ショートカットで起動したターミナル(MINGW32)を利用すること
* boot2dockerにログインする　``$ boot2docker ssh``
	* dockerというユーザーでsshログインできる
* クジラのAAが表示されればOK

#### Proxy設定が必要なときは

* profileにプロキシ設定を追記する

```
// viでprofileを開く
docker> sudo vi /var/lib/boot2docker/profile

// 追記したら保存する
```

### dockerから出たりboot2dockerを再起動したりする方法

```
// dockerからログアウト
docker> exit

// boot2dockerの停止、起動
$ boot2docker stop
$ boot2docker start
```

## docker-compose

boot2dockerのTiny Core Linuxは、再起動すると初期化されて利用できなくなるので、
再利用できるようにdocker-composeを導入する。

#### ダウンロード

* ダウンロードしたら、ファイルの名前を「docker-compose」に変更する

### インストール

#### boot2docker内に転送する

取得したdocker-composeをboot2dockerのカレントディレクトリに配置する

* scpコマンドでファイルをローカルからリモートにコピーする

```
$ scp -P 2022 -i ~/.ssh/id_boot2docker docker-compose docker@localhost:/home/docker/docker-compose

// scp -P [ポート] -i [鍵ファイル] [コピー元ファイル] [ユーザー名]@[コピー先ホスト名]:[コピー先ファイル]
```

* 取得したdocker-composeを、コンソールを開いたときのカレントディレクトリに置いておけば、上記コマンドでスムーズにコピーできる。
* ポートについて
    * ホストOSとboot2docker　vm間のポートフォワーディング
    * デフォルトでboot2docker　vmのSSH（ポート22）→ホストポート2022

#### boot2dockerにログインして所定の位置に配置する

```
$ boot2docker ssh
docker > sudo mkdir -p /var/lib/boot2docker/bin
docker > sudo mv docker-compose /var/lib/boot2docker/bin
docker > sudo chmod u+x /var/lib/boot2docker/bin/docker-compose
```

#### boot2docker起動時の動作追加

/user/local/bin に対してシンボリックリンクを設定するスクリプトを追加

* bootlocal.shを編集する

```
docker > sudo vi /var/lib/boot2docker/bootlocal.sh
```

* ``I``を押下し、編集(INSERT)モードにする
* 以下を追記する

```
ln -s /var/lib/boot2docker/bin/docker-compose /usr/local/bin/docker-compose
```

* ``Esc``で編集モードを終了する
* ``:w``を入力（下部に入力される）し、Enterで保存する
* ``:q``を入力、Enterでviを終了する


#### boot2dockerを再起動して設定を反映させる

```
docker> exit

$ boot2docker stop
$ boot2docker start
```

## TIPS 

### viでファイルを編集する
viの主なコマンド

* viでファイルを開く``$ vi <ファイル名>``
* 編集(INSERT)モード``I``
* モード終了``Esc``
* 保存``:w``を入力し、Enter
* 終了``:q``を入力しEnter
* 保存せずに終了``:q!``を入力しEnter

### データの永続化

* boot2docker内にファイルを作成しても boot2dockerを再起動すると初期化されて消えてしまう。
* 対策の一例
	* VirtualBoxの共有フォルダ機能を利用（boot2docker1.4〜）
	* ローカルのC:/Users配下が、boot2dockerの/c/Users配下に共有されているので、/c/Users/配下でファイルを管理する
EC-CUBE3 でテスト用のデータを生成する

EC-CUBE3 で沢山のテスト用ダミーデータを生成するスクリプトを書きました。

https://github.com/nanasess/ec-cube/blob/fixture-generator/tests/Eccube/Tests/Fixture/GeneratorTest.php

EC-CUBE3.0.11 以降向けです。

### 下準備

EC-CUBE3 をインストールし、 `composer install` を実行してください.
([Composer](https://getcomposer.org/) がインストールされてない方はインストールしておいてください)

```
cd path/to/ec-cube
composer install
```

パッケージ版の場合は、 PHPUnit など必要なライブラリが含まれてないためで、 github から clone してきた場合は不要です。

### 使用方法

ファイルをダウンロードします

```
curl -Ss https://raw.githubusercontent.com/nanasess/ec-cube/fixture-generator/tests/Eccube/Tests/Fixture/GeneratorTest.php -o tests/Eccube/Tests/Fixture/GeneratorTest.php
```

PHPUnit を実行します

```
./vendor/bin/phpunit tests/Eccube/Tests/Fixture/GeneratorTest.php
```


GeneratorTest.php の以下のパラメータを変更することで、生成される数を変更することが可能です。

```
    protected $numberOfProducts = 100;
    protected $numberOfCustomer = 100;
    protected $numberOfOrder = 10;
    protected $numberOfDeliveries = 5;
```

#### 大量のデータを生成したい場合

上記 PHPUnit を何回か繰り返し実行することをおすすめします。

以下のように cron で 10分おきに実行してもよいでしょう。

```crontab
crontab <<EOF
*/10 * * * * cd /path/to/ec-cube && /usr/bin/php ./vendor/bin/phpunit tests/Eccube/Tests/Fixture/GeneratorTest.php
EOF
```

この場合、 会員数が `$customerCountLimit` に逹すると自動的に停止します。デフォルトは 1000 です。

### その他

- 要望が多ければ、 `app/console` で実行できるやつを作ろうかなと思います
TreasureDataが便利だからリアルタイム性の高い処理に使おうとして失敗

TreasureData便利
便利だから何でもTreasureDataを使って実現してた

で、ここから当日と前日分のカウントを出すクエリが遅くなった話
6/7日13時に実行。
テーブルは58,038,203レコード 2.4GB
9/6-7日の2日分のレコード数は1,883,654件

データ量が増えたからか、最初クエリを動かし始めた頃に比べてだいぶ性能が劣化。
Prestoのクエリで↓の単純なカウントクエリなのに実行したら3.5分かかるようになった。

```
SELECT count(1) FROM impressions where TD_TIME_RANGE(time, '2016-06-06', '2016-06-08', 'JST')
```

いや、さすがになんか遅くない？

と思って何となくHiveで実行
2分で終了。＾ｘ＾
Hiveのほうが早い。

ちゃんとtimeで範囲指定しているのになんでや。。。


で、いろいろ試した結果、9/2から9/3の2日間で実行するとなんと2秒で終わった。超早いな！
しかし、直近のデータだと性能が大幅に劣化するのか？


ということで、サポートに連絡だ。


授かったお言葉
```
恐らくですが7日のデータが、まだパーティションが有効になっていないことが原因かと思われます。
先ほどのパーティションですが、データ投入から半日ほど立ってからTimeをキーとしたパーティションに作り変えられるように内部で動いております。
投入したてのデータは、Real Timeストレージに一旦書き込まれていてその時はパーティション等を考慮せずに書き込んでおります。
```

ありがとう神様


というわけでReal Timeストレージにいるデータのアクセスは時間がかかるっぽいです。
リアルタイム性を重視するなら横着せずに用途にあった別の手段を考えよう
Android Studioで、@dimen/～などの自動解釈を止めたい場合

元ネタ
AndroidStudioのstringリソース自動解釈を無効化する
http://qiita.com/consomme72/items/f2c3a2312744fbb720d1


"@dimen/～" が "～dp" と表示されるのも、
File/ Settingsで設定画面を開き、
Editor/ General/ Code Foldingで、
"Android String References" をオフにすれば無効化できます。
※Android Studio のバージョンにより、メニューの場所が異なるようです


設定を変更しなくても、自動解釈された文字列をクリックすれば、
元のリソース名が表示されますが・・・
うっかり、そのまま編集したら、自動解釈前後の状態が混ざって、
訳が分からない状態になる事があるので、気をつけましょう。


では、お約束の。
事故の元をなくそう。
C++ で関数に virtual つけないとどうなるか

環境：Xcode 7.3.1（c++98）

virtual はオーバーライドする想定の関数につけるもの、と認識してます。
ですが実際のところ virtual の有無による挙動の違いがよく分かってなかったので実験しました。

# 実験

## virtual 付けない例

Sample.h

```
// Log() はログ出力関数

class B
{
public:
    void logA() { Log("logA in B"); };
    void logB() { Log("logB in B"); };
};

class D : public B
{
public:
    void logA() { Log("logA in D"); };
    void logB() { Log("logB in D"); };
};
```

Sample.cpp

```
B b1 = D();
b1.logA();
    
B *b2 = new D();
b2->logB();
```

結果

```
logA in B
logB in B
```

基底クラス型、基底クラスポインタ型の変数に、派生クラス型のインスタンスを代入します。
関数はどちらも基底クラスのものが呼ばれています。

## virtual 付ける例

```
class B
{
public:
    virtual void logA() { Log("logA in B"); };
    virtual void logB() { Log("logB in B"); };
};

class D : public B
{
public:
    void logA() { Log("logA in D"); };
    void logB() { Log("logB in D"); };
};
```

Sample.cpp

```
// virtual 付けない例と同じ
```

結果

```
logA in B
logB in D
```

基底クラス型、基底クラスポインタ型の変数に、派生クラス型のインスタンスを代入します。
ポインタの場合のみ派生クラスのものが呼ばれています。

# 考察

virtual がないと派生クラスの関数を考慮しないため B クラスのものが呼ばれるのは想定内。
一方で virtual つけてもポインタでないと呼ばれないのは考えてなかったです。
が、考えてみれば実体である以上それと異なるクラスの処理なんて扱えないですね。

# 参考

[Effective C++ 第3版]("https://www.amazon.co.jp/Effective-%E7%AC%AC3%E7%89%88-ADDISON-WESLEY-PROFESSIONAL-COMPUTI/dp/4621066099")
【iTerm2】ターミナル上で画像を表示する方法

# 環境
Mac (OS X El Capitan 10.11.5)
iTerm2 Build 3.0.8

# 概要
iTerm2 v3 がリリースされてからターミナル上で画像が表示されるようになりました。
[Images - Documentation - iTerm2 - Mac OS Terminal Replacement](https://www.iterm2.com/documentation-images.html)

数行のシェルスクリプトをコピペするだけで簡単に使えるようになります。
なお、これは iTerm2 v3 からの新機能なので、iTerm2 v3 以前のバージョンでは使用できません。
また、Macに最初からある`ターミナル.app`では、コマンドの実行自体はできますが画像を表示することができません。

# 手順
## スクリプトを設置
公式が配布しているシェルスクリプトをコピーします。
[imgcat](https://raw.githubusercontent.com/gnachman/iTerm2/master/tests/imgcat)

上記のサイトにアクセスして表示されたシェルスクリプトを丸々コピーしてください。

次にコピーしたスクリプトを`/usr/local/bin`上に置きます。
`$ sudo vi /usr/local/bin/imgcat`

`vi`が開いたら `INSERT MODE` にして先ほどコピーしたスクリプトをそのままペーストします。
ペーストしたら保存して終了します。

## 権限を付与
最後に、このスクリプトが通常コマンドとして使えるようにファイルの権限を変更します。
`$ sudo chmod +x /usr/local/bin/imgcat`

以上で画像を表示するコマンド`imgcat`が使えるようになりました。

# 使用方法
`$ imgcat 画像ファイルパス` で使用できます。

![imgcat.png](https://qiita-image-store.s3.amazonaws.com/0/113895/750f47e6-a992-57b2-198b-7d883eceab2e.png)

⚠️ `command not found` と表示された場合は`/usr/local/bin`がパスとして通っていない可能性があります。パスを通してください。

# 特徴
Macのローカルの画像ファイルを見たいときは、その画像のあるフォルダをFinderで開いてプレビューなどで見ることができるのであまり実用性がないかもしれません。

しかし、**このコマンドはSSH接続した先のサーバでも使用できるので、リモートの画像ファイルをいちいちローカルにダウンロードしなくても確認できるのでかなり便利**です。

サーバ上の画像ファイルを表示したい場合は、上記の手順をサーバ上でも同様に行うと使えるようになります。ただし繰り返しになりますが iTerm2 v3 を使用する必要があります。

すべてのOSで確認したわけではありませんが、CentOS7では同様に使用できることを確認しています。

# 参考サイト
[Images - Documentation - iTerm2 - Mac OS Terminal Replacement](https://www.iterm2.com/documentation-images.html)
Firebase Hostingで公開したWebサイトにカスタムドメインを設定するやり方

Firebase Hostingのカスタムドメインの設定方法について書こうと思います(^O^)

カスタムドメインの設定は無料できます。設定もそれほど？？難しくないです...


## ①ドメイン取得

[お名前.com](http://www.onamae.com/)や[Route 53](https://aws.amazon.com/jp/route53/)などで、好きなドメインを取得します。

※ドメイン取得に関しては省略します。時間があるとき、Route 53のドメイン取得について書こうと思います。

## ②Firebase HostingにWebサイト公開

Webサイトを作成し、`firebase deploy`してFirebase HostingにWebサイトを公開します。

## ③ドメインの追加

次に、Firebaseのconsole画面の`Hosting`を選択すると、`カスタムドメインを接続`のボタンがあるので、それを選択します(•̀ᴗ•́)و 

![スクリーンショット 2016-09-07 13.03.45.png](https://qiita-image-store.s3.amazonaws.com/0/53996/bd2e873e-f9ff-c5a9-e45d-29ec8f881499.png)

このような画面が表示されるので、取得したドメインを入力して、`次へ`を選択。

![スクリーンショット 2016-09-06 21.55.11.png](https://qiita-image-store.s3.amazonaws.com/0/53996/cf839e17-495c-982b-ed1c-84c20dfad0a9.png)

## ④所有権の確認

`TXTレコードを追加してくださいと表示`されるので、ドメインを取得した所（Route 53など）に、表示されている値を追加します。
追加したら、`確認`を選択。

![スクリーンショット 2016-09-06 21.55.40.png](https://qiita-image-store.s3.amazonaws.com/0/53996/7ee4ae95-223f-9fa3-befe-36388cf85ce9.png)

すると、このようなステータス画面が表示されます。

![スクリーンショット 2016-09-06 22.06.38.png](https://qiita-image-store.s3.amazonaws.com/0/53996/2b896664-8c2d-373a-1c0c-81b7e9d6a1a9.png)

だいたい**24〜48時間くらい**で完了するようです。気長に待ちましょう(￣ー￣)ｂ

## ⑤実行

ステータスが`確認が完了しました`になったら、`設定を続ける`を選択します。

![スクリーンショット 2016-09-07 7.01.01.png](https://qiita-image-store.s3.amazonaws.com/0/53996/9e3c958c-6a7f-7665-0925-2c1505b72912.png)

すると、このような画面が表示されます。
CNAMEの設定をドメインを取得した所（Route 53など）に、表示されている値を追加したら完了です。

![スクリーンショット 2016-09-07 7.01.27.png](https://qiita-image-store.s3.amazonaws.com/0/53996/25a25da5-5e9a-c332-f0e7-b925cbf1c988.png)

これで、設定は完了です！！お疲れ様です（笑）

## ⑥確認

取得したドメインにアクセスして、ちゃんと表示されているか確認しましょう( *• ̀ω•́ )b
Riot.jsのコンポーネント外からデータを渡す方法

# 背景

現在のプロジェクトではjQueryを使ってDOM操作しているけれども、DOM操作だけはRiot.jsに置き換えたい。
そのようなときに、Riot.jsのコンポーネントと既存の処理をどのように連携させたらよいのか...

ということで、Riot.jsの外からRiot.jsのコンポーネントに処理を移譲する方法を調べていました。

# 解決策の概要

Riot.jｓを使っていない既存の処理から、Riot.jsのコンポーネントにデータを流し込んで表示させる場合、[オブザーバブル](http://riotjs.com/ja/api/observable/)という機構をつかって実現できます。

コンポーネント間の通信でも、この方法を利用します。
[【Riot.js】タグ間で動作を連動させる](http://qiita.com/iwamatsu0430/items/49ea5ad14c631f323d22)というエントリを参考にさせていただきました。

# 実装サンプル

サンプルとして、jQueryでajax通信した後、JSONで受け取った結果を表示するコンポーネントを作るとします。

ここでは、result-listというコンポーネントを生成しています。
オブザーバブルオブジェクトを生成して、コンポーネントのマウント時に引き渡します。

```
var observer = riot.observable();
riot.mount('result-list', {observer:observer});
```

result-listは以下のように定義されています。
マウント時の第二引数の値には、optsという変数でアクセスできるようになっています。

マウント時に引き渡されたオブザーバブルオブジェクトに対して、リスナーを登録します。

```
<script type="riot/tag">
  <result-list>
    <ul>
      <li>{ title }</li>
      <li>{ message }</li>
    </ul>

    var self = this

    // mount時にobserverを受け取る
    self.observer = opts.observer

    // 外部からobserver.trigger('result-list:refresh', result)を呼びだされたら発動
    self.observer.on('result-list:refresh', function(result) {
      self.title = result['title']
      self.message = result['message']
      self.update()
    })
  </result-list>
</script>
```

外からデータを反映したいタイミングでoberver.triggerを呼び出します。
今回のサンプルの場合は、ajax通信後のcallbackで呼び出してみます。

```
$.getJSON(url, data, function(json){
  observer.trigger('result-list:refresh', json);
});
```

この方法で、Riot.jsのコンポーネント外からデータを流し込むことができました。

ReactJS等の導入になかなか踏みきれないけど、jQueryでのDOM操作はいい加減やめたい。
そのような方にとって参考になればと思います。
ファイルサイズを指定してダミーファイルを作る方法

ファイル添付するテストのときに巨大ファイルで行いたくて

macで約1Gのファイルのテキストを作りたい場合

```
$ dd if=/dev/zero of=1G.txt bs=1024000 count=1000
```

これで、 `1G.txt` というファイルが出来る