OmniAICreator/Qiita-1.07M huggingface dataset:
Laravelで使うartisanコマンド

Artisanコマンドとは**Laravel**の**コマンドラインツール**です。
よく使うやつだけとりあえずメモ。

#サーバーを走らせる
`$php artisan serve`

**ローカルホスト**で見れる。
>**TCP/IP環境のネットワークにおいて、ネットワークに接続しているコンピュータをホスト**と呼ぶ。そのうち、**自分が操作しているコンピュータがローカルホスト。**それ以外のネットワークにつながっているコンピュータはすべて「リモートホスト」（remote host）と呼ばれ・・・
*IT単語帳*

#コマンドを一覧表示する
`$php artisan list`

#現在の動作環境を表示する
`$php artisan env`

#ルートの定義一覧を表示
`#php artisan route:list`

後ろに`--name=ルート名`や`--path=パス`などをつけるとフィルタリングも可能
何も知らない状態からkafka in dockerを試す



とりあえずkafka試してみたいけれど、apacheのOSSなのでサーバ立てるのもめんどくさそうってことでDockerでさくっと立ててちょっと試してみた。
OSXマシンに立てたいってことであれば、[Mac OSXにApache Kafkaをインストールして使えるようにするまで](http://qiita.com/AKB428/items/50d8c597c8c6e0f4fb1e)という記事の方にある通り、brewでインストールできてくっそ楽なので、こっちでやれば良し

準備
==========

https://github.com/spotify/docker-kafka
spotifyが提供しているリポジトリを利用した。

https://github.com/wurstmeister/kafka-docker
の方が有名っぽいけれど、composeするのめんどくさいし、動けばいいでしょ程度の安直な考え

動かし方はREADMEにある通り

```sh
docker run -p 2181:2181 -p 9092:9092 --env ADVERTISED_HOST=`docker-machine ip \`docker-machine active\`` --env ADVERTISED_PORT=9092 --name test_kafka spotify/kafka
```

2181番がzookeeperのポートで、9092がkafkaのポートになる。ホストマシンのIPを与えよう。DNSで解決できるのであればドメインでも良し。

これでkafkaサーバが立つ。
起動したらconsoleを離してくれないけれど、detachしても生きてるので適当にコンソール閉じるなりしてもOK
Ctrl + Cとかするとkafkaも死ぬので、やらないように

簡単なメッセージを送る
======

kafkaは簡単に言うとproducer, broker, consumerで成り立つ。
brokerがざっくりkafka本体という考えで良い。producerがpublishし、consumerがsubscribeする。
詳しくは[Apache Kafkaに入門した](http://deeeet.com/writing/2015/09/01/apache-kafka/)とかにまとまっているのでここを読めば良し。

[quick start](http://kafka.apache.org/documentation.html#quickstart)とかにあるように、本体付属のshを使うのが楽だ。
container内では `/opt/kafka-(version)/bin/` 以下にある。

```sh
docker exec -it test_kafka bash
```

などでcontainerの中でbashを動かす

topicは、扱うメッセージの単位だと考えていい。メッセージを送る時、受け取る時いずれも必ずtopicの指定は必要になる。
ここにはないけれど、試しに存在しないtopicをsubscribeしてみたりしたら、勝手にtopicができていた。とはいえ設定できる項目は多いので、そのような方法で増やすと後々首を閉めそうなので辞めた方が良さそう

```sh
bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic test
```

で、シンプルなtestというtopicが誕生する。
後はクイックスタートに沿って実行してみるととりあえず動くはずだ

Clientライブラリからメッセージをやりとりしてみる
=======

ここまではshを使ってきたが、普通は各システムからメッセージを送るはずなので、そこらへんもどんな感触か試したい。

今回は
https://github.com/dpkp/kafka-python
というkafkaのクライアントライブラリを使った。理由は、最初に適当に書きたいからスクリプト言語が良かったのと、rubyクライアントのconsumerが動かなかったためだ。
目的の言語などがある場合は、[クライアント一覧のページ](https://cwiki.apache.org/confluence/display/KAFKA/Clients)から探せば良さそうだ

`requirememts.txt` を用意して

```
kafka-python
```
を入れて、 `pip install -r requirements.txt` してとりあえず使えるようにする。

topicの作成からclientにまかせてみようとしたら、明示的に作るAPIはなさそうだった
[githubのissue](https://github.com/dpkp/kafka-python/issues/438)を見ると、どうやら自動で作られるしかなさそうだ。
[StackOverflow](http://stackoverflow.com/questions/27036923/how-to-create-a-topic-in-kafka-through-java)曰く、Zookeeperをいじって作る口がJavaならあるっぽいので、そういうことをしたいなら結局はjavaしかないのかもしれない。

一番簡単なスクリプトを以下に書く

__producer__

```python
from kafka import KafkaProducer

producer = KafkaProducer(bootstrap_servers="your.kafka.host.ip:9092")
producer.send('test', b'foobaa').get(timeout=1)
```

__consumer__

```python
from kafka import KafkaConsumer

consumer = KafkaConsumer('test', bootstrap_servers='your.kafka.host.ip:9092')

for msg in consumer:
    print(msg)
```

consumerを先に動かしてproducerを動かすとメッセージが届くはずだ
kafkaは内部にストレージがあり、一定期間メッセージを保存するので、それらを取り出すやり方もあるはずなので、ためしてみるといいと思う。
Laravelについてざっくり説明

#Laravelとは
**多機能なPHPフレームワーク**です。

特徴：
- 多種多様なバリデーションルールと容易な拡張性
- 簡単に実現できるページネーション（ページ付け）
- 柔軟なサービス（DI）コンテナ
- 使いやすく使用準備の手間がかからないORM
- 実行しやすいテスト

**Laravel**では**Blade**と呼ばれる**PHPテンプレートエンジン**での記述も可能。
もちろん普通のPHPでの記述も可能。

#Laravelのバージョンについて
バージョン**5.1**は**LTS**と呼ばれる長期間サポート版としてリリースされている。
私は5.２を使ってますが、あまり深くはやらないというのであれば5.1でいいかも。

#兄弟フレームワーク「Lumen」
LaravelはComposerを導入し、積極的に既存のパッケージを採用。
その分オーバーヘッドの増加で実行速度が低下する傾向があります。
そこで**より軽量な新しいフレームワーク「Lumen」**というのもあり。

**Laravel**を一般的なWebアプリ側、**Lumen**をAPI側と使い分けも可能。

私はあまりLumenを使ったことはないんですが、「シンプルで使いやすいLaravel」みたいなもんらしいです。
ハッシュタグの変更時にイベントを発生させる

ハッシュタグ(#xxx)によってタブ切り替えをしておいたりするとき、(グローバルメニューとか)
違うページから遷移してきた時は問題なく動くが、同じページ内でアクセスしようとすると、ページ遷移しないので、うまく動かない。

`hashchange`というものがある。

```js
$(window).on('load hashchange',function(){
    var color;
    if(location.hash == '#01'){
        color = 'black';
    }else if(location.hash == '#02'){
        color = 'white';
    }
});
```

例えばこんな感じで使う。
スペースを含む複数行テキストを、行ごとに処理する

次のようなテキストがあるとします。各行にスペースはありません

```text:sample_without_space.txt
12345
67890
```

行ごとに処理をするには、 for が使えます。 do と done の間にやりたいことを書きます。

```shell-session
$ for i in $(cat sample_without_space.txt"); do echo $i; done
12345
67890
$
```
上記の例では、各行をただ単に echo しています。

スペースで区切られている文字列のときは

```text:sample_with_space.txt
1 2 3 4 5
6 7 8 9 0
```

for を使うと、設定によっては（コメントを参照ください）スペースで区切られてしまうため、各行に対して実行することができません

```shell-session
$ for i in $(cat sample_with_space.txt); do echo $i; done
1
2
3
4
5
6
7
8
9
0
$
```

そこで while read を使うと、スペースで分割されないので、各行ごとに実行することができます

```shell-session
$ cat sample_with_space.txt | while read i; do echo $i; done
1 2 3 4 5
6 7 8 9 0
$
```
BootstrapをGruntでコンパイルする

#bootstrapをgruntで動かす

これから準備する環境

- node.js
- npm
- Grunt

##開発環境の準備
node.js / npm インストール

- ソース	[https://nodejs.org/en/](https://nodejs.org/en/)
- やり方	[http://qiita.com/taipon_rock/items/9001ae194571feb63a5e](http://qiita.com/taipon_rock/items/9001ae194571feb63a5e)

grunt-cli インストール

- コマンド    `npm install -g grunt-cli`
- やり方     [http://kojika17.com/2013/03/grunt.js-memo.html](http://kojika17.com/2013/03/grunt.js-memo.html)

##bootstrap 各プロジェクトの開発環境
bootstrapの準備

1. 公式サイトを開く [http://getbootstrap.com/getting-started/](http://getbootstrap.com/getting-started/)
1. 真ん中にある"Source code"をダウンロードする
1. （既存のプロジェクトを編集する場合はそちらをダウンロードする）
1. 任意の階層に保存する
1. ターミナルから保存したディレクトリ(Grunt.jsが保存されている階層)に移動する
1. コマンド`npm install grunt --save-dev`と打ちフォルダにGruntをインストールする
1. Gruntのインストールが完了したらコマンド`npm install`と打ち込みbootstrapのnode modulesをダウンロードする
1. ダウンロードが完了しターミナルで`grunt`と打ち込めばコンパイルが開始する

##lessファイルの編集とコンパイル

1. ターミナルから保存したディレクトリ(Grunt.jsが保存されている階層)に移動する
1. `grunt watch`と打ち`waiting...`の表示が出る（この状態でlessファイルを変更し保存すると自動的にコンパイルされます。）
1. theme.lessを開きスタイルの追加と変更を行ったら保存→自動でコンパイルされる
1. バッチ ジョブ終了は Ctrl+C
1. `grunt` と打てばMinifyされたCSSも作成される

##Reference

###Grunt関連
- [今さら聞けないフロントエンドタスクランナー - Qiita](http://qiita.com/syunk38/items/1e4ae893e78c3585dd07)
- [現場で使えるGrunt入門 - 第1回 Gruntを試そう](https://app.codegrid.net/entry/grunt-introduction)

###Bootstrapのコンパイル準備
- [Bootstrap 3 RC1をGruntで効率的にカスタマイズ](http://qiita.com/suzukima/items/bde0a2686e5b2eb4cd1a)
- [Bootstrap3 LESSのカスタマイズ -環境設定編](http://www.ajike.co.jp/switch/bootstrap3_less1/)
- [Bootstrap3 LESSのカスタマイズ -カスタマイズ編](http://www.ajike.co.jp/switch/bootstrap3_less2/)
UILocalNotificationのfiretime設定

連投になりますが、、、

UILocalNotificationのfiretime設定で困っています。

APPdelegete

        //バックグラウンドタスクの処理を実行
        dispatch_async(dispatch_get_global_queue(
            DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), {
                //バックグラウンドタスクの記述
                print("バックグラウンドタスクの内容をここに記述")
                //ローカルノーティフィケーションの表示(5)
                self.checkTime = NSUserDefaults.standardUserDefaults().doubleForKey("Span")
                print ("SAPN")
                print (self.checkTime)
                let notification = UILocalNotification()
                notification.alertBody = "タスク完了"
                notification.alertAction = "OK"
                notification.soundName = UILocalNotificationDefaultSoundName
                notification.fireDate = NSDate(timeInterval: self.checkTime, sinceDate: NSDate())
                notification.timeZone = NSTimeZone.defaultTimeZone()
                app.presentLocalNotificationNow(notification)
                
                //バックグラウンドタスクの終了を通知
                self.finishBackgroundTask()
        })


viewController

    func timeSet(NStime:Double) -> Int{
        let now = NSDate()
        let formatter = NSDateFormatter()
        formatter.dateFormat = "yyyy/MM/dd HH:mm:ss"
        
        Count = Int(NStime)
        //秒数を切り捨て
        hour =  ((Count / 60) / 60)
        time = (Count - (hour * 60 * 60))
        spanTime = hour + time
        print (time)
        print(spanTime)
        
        return spanTime
    }


viewController側ではdatePickerでカウントダウンの時間を取得
時間と分を秒数に切り替えています。
それをNSUserDefaultsに値を渡し、Appdelegete側で取得し、
X秒後にアラートが表示される。
という計算だったのですが、すぐに通知されてしまいます。

根本がいけないのでしょうか。
/etc/sysconfig/network-scripts/ifcfg-NIC に冗長なONBOOTを書いてはいけない。

CentOS7.2のネットワーク設定をifcfg-NICに直接記述する方法で行ないました。

以下の設定ファイルエディッタで直接編集したのですが、

```
/etc/sysconfig/network-scripts/ifcfg-NIC(抜粋)
ほげほげ
ONBOOT=no
ほげほげ
ONBOOT=yes

```

と書いてました。ONBOOTはOS起動時にNICを自動的に有効にしてIPアドレスを設定しなさいという意味です。

で、この設定ファイルはプログラミング言語のように最後にONBOOTに代入した値が有効になるのだろうと思い込んでたのですが、

何度OS再起動しても自動でIPアドレスを設定する機能が有効になりません。

小一時間検索したりして悩む。

最後にソース嫁めかなと、起動スクリプトを漁ってたら、、

```
/etc/rc.d/init.d/network(抜粋)
                if LANG=C grep -EL "^ONBOOT=['\"]?[Nn][Oo]['\"]?" ifcfg-$i > /dev/null ; then
                        # this loads the module, to preserve ordering
                        is_available $i
                        continue
                fi
```

悲しみが止まらない。

ようはプログラミング言語のようにファイルの最初から最後まで評価するのでなく、前後の設定は全く見ずに"ONBOOT=NO"と書いてあったら有効になりません。この行を消してください。
aws-java-sdkを1.11.0に上げるとamazon-kinesis-clientが動かなくなる

aws-java-sdkを1.11.0に上げるとamazon-kinesis-clientが以下のエラーを吐いて動かなくなる。

```java
java.lang.NoClassDefFoundError: com/amazonaws/util/json/JSONObject
	at com.amazonaws.services.kinesis.leases.impl.Lease.toString(Lease.java:229)
```

###解決策
aws-java-sdkを1.10.77に下げると動くようになる。なお、dynamodb-streams-kinesis-adapterをmavenで入れている場合はpomに以下の定義があるため、自動でaws-java-sdkの最新版が適用されてしまうことがあるので注意。  

```xml
<aws-java-sdk.version>[1.10.7, 2.0.0)</aws-java-sdk.version>
```

取り急ぎ自分の環境ではdynamodb-streams-kinesis-adapterをmavenから外してjarファイルを直接プロジェクトに追加するように変更した。
Linuxでユーザーをグループに追加するコマンドのmemo

グループ＆ユーザーの追加は余り使わないので、忘れがちなのでメモ。

## usermod

### デフォルトのグループを変更する

````
usermod -g [グループ名] [ユーザー名]
````

ユーザー asahi がグループ「asahi」をデフォルトグループとしていたが、グループ「sage」にデフォルトグループを変更したい場合は以下のようになる。

````

# ユーザーasahiの情報を確認
id asahi
uid=500(asahi) gid=500(asahi) 所属グループ=500(asahi)

# デフォルトグループをsageに変更する
usermod -g sage asahi

# デフォルトグループが変更されたか、ユーザーasahiの情報を確認
id asahi
uid=500(asahi) gid=1001(sage) 所属グループ=1001(sage),500(asahi)

````


### サブグループを変更する

````
usermod -G [グループ名] [ユーザー名]
````

ユーザー asahi がグループ「asahi」をサブグループとしていたが、グループ「hoge」にサブグループを変更したい場合は以下のようになる。

````

# ユーザーasahiの情報を確認
id asahi
uid=500(asahi) gid=1001(sage) 所属グループ=1001(sage),500(asahi)

# サブグループをhogeに変更する
usermod -G hoge asahi

# サブグループが変更されたか、ユーザーasahiの情報を確認
id asahi
uid=500(asahi) gid=1001(sage) 所属グループ=1001(sage),1002(hoge)

````

つまり、`` -G `` オプションでは、「サブグループの情報を置き換え」するのであって「追加」するのではないので注意！

サブグループに「追加」したい場合は、以下。


### サブグループを追加する

````
usermod -aG [グループ名] [ユーザー名]
````

addの「-a」オプションと合わせて `` -aG `` オプションを付ければサブグループを「追加」出来る。

ユーザー asahi がグループ「hoge」をサブグループとしていたが、サブグループに「asahi」を追加したい場合は以下のようになる。

````

# ユーザーasahiの情報を確認
id asahi
uid=500(asahi) gid=1001(sage) 所属グループ=1001(sage),1002(hoge)

# サブグループにasahiを追加する
usermod -aG asahi asahi

# サブグループが追加されたか、ユーザーasahiの情報を確認
id asahi
uid=500(asahi) gid=1001(sage) 所属グループ=1001(sage),1002(hoge),500(asahi)

````



## gpasswd

````
gpasswd -a [ユーザー名] [グループ名]
````

サブグループが書き換えられることはないので、使いやすいが、何となく覚えにくいコマンド…。

ユーザー asahi にサブグループに「hoge」を追加したい場合は以下のようになる。

````

# ユーザーasahiの情報を確認
id asahi
uid=500(asahi) gid=500(asahi) 所属グループ=500(asahi)

# サブグループにhogeを追加する
gpasswd -a asahi hoge

# サブグループが追加されたか、ユーザーasahiの情報を確認
id asahi
uid=500(asahi) gid=500(asahi) 所属グループ=500(asahi),hoge(1002)

````


## （おまけ）ユーザーの一覧を見る

ユーザー名の一覧「だけ」を見たい時は、以下。

````
cat /etc/passwd|sed -e 's/:.*//g'
````
Windows 10 バージョン1511へアップデートする前の準備

専門的なパーティション管理ソフト--<a href="https://jp.easeus.com/partition-manager-software/professional.html">EaseUS Partition Master</a>を使って、Windows 10 バージョン1511へアップデートする前の準備を整えましょう。

まず、Windows 10 バージョン1511に更新する前、システムのエラーを修正

1.EaseUS Partition Masterを起動し、ターゲットパーティションを右クリックして、「パーティションをチェックする」を選択します。
![1.png](https://qiita-image-store.s3.amazonaws.com/0/124905/4f662ed5-e845-a7ec-50f9-2c3ad68df590.png)

2.パーティションのエラーをチェックする方法を選びます。必要に応じて、「パーティションのプロパイをチェックする」・「windowsのchkdsk.exeを使用して検出したエラーを修正する」・「サーフィステスト」にチェックを入れ、「OK」ボタンをクリックします。
![2.png](https://qiita-image-store.s3.amazonaws.com/0/124905/28ea3b42-e97a-7ef9-58bb-68c393a7cefa.png)

3.EaseUS Partition Masterが自動的にパーティションをチェックしてエラーを修正します。終ったら「OK」ボタンをクリックし、完了させます。

そして、システムドライブまたはシステム予約済みパーティションを拡張

1.システムドライブまたはシステム予約済みパーティションを右クリックし、「パーティションのサイズを調整或いはパーティションを移動する」を選びます。
![3.png](https://qiita-image-store.s3.amazonaws.com/0/124905/ae329c12-1dd7-223c-bac0-86db3fcc9924.png)

2.システムドライブの右ハンドルをドラッグし、空き領域をシステムドライブに追加できます。
![4.png](https://qiita-image-store.s3.amazonaws.com/0/124905/8c3ffb65-d7e0-babf-1ba8-951275c2adc2.png)

より詳しい内容はこちら:[パーティション変更](https://jp.easeus.com/partition-manager/resize-partition-windows-10.html)
CotEditor を git のエディタとして使用する

コマンドライン経由で git を操作するとき、使い慣れない ~~emacs や vim などの~~エディタを使うのは疲れますよね。
そういうときでも CotEditor を使えるようにする方法です。


## cot コマンドのインストール

まず、CotEditor のコマンドラインツールである `cot` をインストールする。
homebrew 経由でインストールする方法とシンボリックリンクを通す方法がある（個人的にはシンボリックリンクの方がオススメ[^1]）。

#### homebrew

```
$ brew tap coteditor/coteditor
$ brew install cot
```

#### シンボリックリンク

```
$ ln -s /Applications/CotEditor.app/Contents/SharedSupport/bin/cot /usr/local/bin/cot
```

## git の EDITOR に指定

`git` で使用するエディタとして `cot` コマンドを指定する。

```
$ git config --global core.editor "cot -w"
```

`-w` オプションを指定するとウインドウを閉じるまでプロンプトを返すのを待ってくれます。忘れないように。


## 使い方

これで `git rebase -i` などの作業をするときに CotEditor が立ち上がるようになります。

![Screen Shot 2016-05-17 at 14.34.35.png](https://qiita-image-store.s3.amazonaws.com/0/6520/cfe2b650-2cf4-0c7f-c2ae-5ad8d5d185da.png)


編集が終わったら保存をしてウインドウを閉じると編集結果が反映されます。

~~git コミットもシンタックスハイライトされればいいのにね！[^2]~~

--- 

[^1]: 実は両者は CotEditor.app の探し方に違いがあり、.app にバンドルされてる cot にシンボリックリンクを張った方が直接親の CotEditor を起動するので起動が若干速い。
[^2]: ~~まぁ、こんどやります。~~ → CotEditor 2.5.5 で入れたよ
ACM：AWS Certificate Managerが日本リージョン来たし試しに取ってみるか【AWS】


戦闘員です。

#前提条件
- 有効なドメインを持ってる：なければお名前.comあたりで安いの買いましょう
- Route53で上記ドメインのホスト済み

分からなければ[過去記事](http://qiita.com/Yuki_BB3/items/effdf1bb38263bfef82a)とか[こっちの記事](http://qiita.com/Yuki_BB3/items/52dc529cf7a700933e59#_reference-7c58890eb27b66151edf)とかどうぞ

ドメインでメール運用していればSESの準備は不要です。
僕は無かったので作ったのでこっちも簡単に見ていきましょう。

#SESでメール受信する

[リージョンと Amazon SES](https://docs.aws.amazon.com/ja_jp/ses/latest/DeveloperGuide/regions.html)に書いてあるように立てた場所でエンドポイント変わります。

オレゴン選んだので僕は　```inbound-smtp.us-west-2.amazonaws.com``` がポイントです。

[[新機能]Amazon SES でメール受信が出来るようになりました！](http://dev.classmethod.jp/cloud/receiving-email-with-amazon-ses/)を参考にしてSESでメール受信出来るようにしましょう。

以下のように変えました

MXレコード：ドメインに対してMXレコードを作成しました
受信はSNSのみ：楽だから

SNS使う場合、SNS側でメールアドレスの登録しておいて下さい。

---

#ACM

##注意
- ワイルドカード証明書を取得する場合 .*ドメイン名で申請して下さい
- 当たり前ですけどその場合ドメイン確認の為にMXレコードはドメインに対して張って下さい
- SNS経由でURL認証する場合、JSONで飛んでくるのでどこ見ればいいかわかりません

###To approve this request, go to Amazon Certificate Approvals直後のhttps:を\r\nand手前までコピーしてアクセスしてください

![aws_mng.jpg](https://qiita-image-store.s3.amazonaws.com/0/52141/8686e72e-82a1-6a43-b775-d38248367d68.jpeg "aws_mng.jpg")

![AWS_Certificate_Manager.jpg](https://qiita-image-store.s3.amazonaws.com/0/52141/039fe3f5-f4c5-f336-ec56-2f4cb446b89a.jpeg "AWS_Certificate_Manager.jpg")

![AWS_Certificate_Manager_01.jpg](https://qiita-image-store.s3.amazonaws.com/0/52141/e9b14946-9a7a-1d3c-fe1c-8475d7136339.jpeg "AWS_Certificate_Manager_01.jpg")

![AWS_Certificate_Manager_02.jpg](https://qiita-image-store.s3.amazonaws.com/0/52141/a3c87c13-a0e9-c77d-40a7-2e7d65ca480f.jpeg "AWS_Certificate_Manager_02.jpg")

![Amazon_Certificate_Approvals_04.jpg](https://qiita-image-store.s3.amazonaws.com/0/52141/37cbc802-1132-b51b-6295-f717150ec15c.jpeg "Amazon_Certificate_Approvals_04.jpg")

これで取得できます
![Certificate_Manager.jpg](https://qiita-image-store.s3.amazonaws.com/0/52141/00eac6a4-faab-5ac2-5f58-10a1a4f1f90c.jpeg "Certificate_Manager.jpg")

ワイルドカード証明が簡単に取得できました。
[Swift]protocolを別のprotocolを継承してextensionすることは出来ない


## はじめに

Swiftでコードを書いていて以下のようなエラーに出会った。

>Extension of protocol 'プロトコル名' cannot have an inheritance clause

エラーが出るコードは以下。

```swift:エラーが出るコード
protocol SomeProtocol {
}

protocol AnotherProtocol {
}

extension SomeProtocol : AnotherProtocol {
}
```

上記のコードの```extension SomeProtocol : AnotherProtocol``` のところがエラーになる。


## どうしてこのようなコードを書いてしまったのか

ここで、どうしてこのようなコードを書いたのか考えてみた。

### １．既存の型をextensionする

Swiftでは、既存の型をextensionすることができる。 
その場合の書き方は以下のようになる。

```swift:クラスをextension
class SomeClass {
}

protocol SomeProtocol {
}

extension SomeClass : SomeProtocol {
}
```

### ２．protocolをextensionする

また、Swiftではprotocolをextensionして、デフォルトの実装を追加できる。


```swift:protocolをextension
protocol SomeProtocol {
    func foo()
}

extension SomeProtocol {
    func foo(){} // デフォルトの実装
}
```

### ３．結論

protocolやextensionを何となくしか理解していないと、１と２を合わせた書き方ができるような気がして、最初のコードのようなものが出来上がる。

```swift:エラーが出るコード（再掲）
protocol SomeProtocol {
}

protocol AnotherProtocol {
}

extension SomeProtocol : AnotherProtocol {
}
```

実際には上記のようなコードは書けなかったという覚書。

## 追記：どういうときに起きやすいのか

このエラーは、自分で書いたprotocolをextensionするときに起きるというよりは、SequenceTypeなどをextensionしたくなったときに起きやすい（と思う）。

```swift:Arrayをextension
protocol SomeProtocol {
}

extension Array : SomeProtocol {
}
```

上記のようにArrayをextensionすることはもちろん出来る。

ここで、「ArrayではなくSequenceTypeを拡張すればいろんなものを拡張出来るじゃん！」とか思って、次のようなコードを書いてしまうとエラーになる。

```swift:SequenceTypeをextension
protocol SomeProtocol {
}

extension SequenceType : SomeProtocol {
}
```

SequenceTypeぐらいならまだprotocolだとわかりやすいが、LazyMapSequenceやLazyFilterSequenceなどをいろいろいじった後にLazySequenceTypeの存在に気づくと何が何だかよくわからなくなってくるのでエラーを起こしやすい気がする。
gulp-watchify で browserify と parcelify を差分ビルド

# 概要
[![English](https://img.shields.io/badge/English-here-lightgrey.svg?style=flat)](https://www.jkawamoto.info/blogs/incremental-build-by-gulp-watchify/)
利用するライブラリが増えてビルドに時間がかかるようになったので，[watchify](https://github.com/substack/watchify) を使った差分ビルドを試してみる．タスクランナーに [gulp](http://gulpjs.com/) を使用しているので，[gulp-watchify](https://github.com/marcello3d/gulp-watchify) を使い，[browserify](http://browserify.org/) と [Parcelify](https://github.com/rotundasoftware/parcelify)によるビルドを差分ビルドにする．

# gulp-watchify の使い方
[サンプルファイル](https://github.com/marcello3d/gulp-watchify/blob/master/examples/simple/gulpfile.js) によると，単純な使い方は，

```coffeescript:gulpfile.coffee
gulp = require "gulp"
$ = require("gulp-load-plugins")()
watching = false

gulp.task "browserify", $.watchify (watchify) ->
  gulp.src "src/*.js"
    .pipe watchify
      watch:watching
    .pipe gulp.dest "public/js/"

gulp.task "watch", ->
  watching = true
```

となるようだ．これで，`gulp browserify` とすれば通常のビルドを `gulp watch browserify` とすれば，watchify による監視を始めることができる．

なお，`gulp-load-plugins` に関しては，[[gulp] 効率的にプラグインを読み込む](http://qiita.com/superbrothers/items/a342f3580b8acb5b9b06) を参照．上の例では変わらないが，require を減らすために使っている．

## 注意
gulp-watchify をインストールしただけでは，watchify はインストールされない模様．なので，

```shell-session
$ npm i —save-dev watchify gulp-watchify
```

と両方インストールするのを忘れずに．

# parcelify の利用
先ほどの例では，gulp-watchify の内部で browserify を呼んでいるため，parcelify を使う場所がない．gulp-watchify は，オプションで bundle の前に実行するコールバックを渡せるので，そこで parcelify を使う．

```coffeescript:gulpfile.coffee
gulp = require "gulp"
parcelify = require "parcelify"
$ = require("gulp-load-plugins")()
watching = false

gulp.task "browserify", $.watchify (watchify) ->
  gulp.src "src/main.js"
    .pipe watchify
      extensions: [".js"]
      watch: watching
      setup: (bundle) ->
        parcelify bundle,
          bundles:
            style: "public/css/bundle.css"
    .pipe $.rename "bundle.js"
    .pipe gulp.dest "public/js/"

gulp.task "watch", ->
  watching = true
```

これで先ほどと同様に，`gulp browserify` とすれば通常のビルドを `gulp watch browserify` とすれば，watchify による監視を始めることができる．

上は，`main.js` をエントリーにスクリプトとして，出力を `bundle.js` にする例となっている．名前変更のために別途 `gulp-rename` が必要．

watchify のオプションには，browserify に渡すオプションと同じものを使える．上の例では，`extensions` を渡している．

# 参考
* [gulp-watchify を試す &#8211; アカベコマイリ](http://akabeko.me/blog/2015/05/gulp-watchify/)
* [Watchifyでbrowserifyを差分ビルド](http://qiita.com/mizchi/items/b59a6c27558d238658c6)
Googleの２段階認証をアプリを使わずMacのターミナルで行う方法

Googleの２段階認証の数字を出すのにいちいちiPhone取り出すのがいつも面倒だったのでMacのターミナルに入れた。これでコマンド一発で認証が完了するのでとても快適。

このアイコンのアプリをiPhoneとかのスマフォに入れて、起動したら出てくる数字を入れるのが通常のやり方。
![20160517130503.png](https://qiita-image-store.s3.amazonaws.com/0/108761/ca5d8d2b-06d3-042a-77f0-91f584d773b8.png)
<img width="275" alt="20160517131019.png" src="https://qiita-image-store.s3.amazonaws.com/0/108761/f4669707-0a69-d7bf-4416-e9e1847b6720.png">
　
　
それをターミナルのコマンドでポンと数字だす方法。こんな風に。

```
$ google_key
322445
```


## やり方

まずはoath-toolkitをインストールする。

```
$ brew install oath-toolkit 
```
　
google にログインして、２段階認証設定画面に行く。
QRコードが出たところで「CAN'T SCAN IT」 をクリック
![20160517131428.png](https://qiita-image-store.s3.amazonaws.com/0/108761/45c70e3b-82de-39de-8406-8a571c94f2c0.png)


出てきた３２文字の文字列をコピーする。

ターミナルから先ほどインストールしたoath-toolkitを使って数字を出す。

```
$ oathtool --totp --base32 "３２文字のキーをスペース無しで入れる”
123456
```

出てきた数字をGoogleに登録すれば完成。

後は上記のコマンドをaliasに設定して$ google_keyとか短いコマンドにするなり、PATHを通しておくなりして、ご自由に。

ウェブアプリやってるエンジニアの場合、だいたいデスクの上には歴代のiPhoneやらスマフォが５−６台あると思う。その中のどれに２段階認証のアプリを入れたのか、ゴッチャになって「あーこのiPhoneじゃねー！どれだー！？」とイラっとしたことがあればMacBookに入れてしまうのオススメです。

# エンジニアの皆様へ
「[ほとんどのエンジニアには解けるが、下位10％のダメなエンジニアにだけ解けないパズル?](http://tango-ruby.hatenablog.com/entry/2015/11/30/122814)」なるものをシリーズ化してパズル１から８まで作成した。もしご興味あれば解いてみてください。
http://tango-ruby.hatenablog.com/entry/2015/11/30/122814
V-RayをレンダリングエンジンにしてMayaでレンダリングした際に、メモリーが開放されない問題について

#現象
V-RayをレンダリングエンジンでDeadlineやBackburnerといったディスパッチを経由して、Mayabatchでレンダリングをした際にメモリーが開放されない。

## レンダリングマシン環境
- Windows7pro 64bit
- RAM : 32GB
- CPU :Corei7

- V-Ray 3.x
 - V-Ray 3.30.01 for Maya2016
 - V-Ray 3.30.01 for Maya2015
 - V-Ray 3.30.01 for Maya2014

- Maya
  - Maya2016 
  - Maya2015 SP6
  - Maya2015 SP4

- Deadline 7.22.02

#レンダリングプロセスのおさらい
Maya上でのV-Rayのディスパッチャを利用したレンダリングプロセスとしては...
1.Deadline/Backburnerがシーンパスなどを合わせてジョブをサブミットする。
2.レンダーノードのmayabatch.exeがシーン(.ma/mb)ファイルを読み込む。
3.MayaがシーンファイルをV-Rayのネイティブシーンファイル(.vrscene)に変換する。
4.vray.exeに変換したシーンを転送。
5.リファレンスしているファイルを転送。
6.V-Rayレンダリング
7.Mayaにレンダリングしたバッファ(.vrimage)をV-Ray VFBに転送、または任意のフォーマットで指定のフォルダに書き出す。

V-Rayに限らずディスパッチャー使った大体のレンダリングはざっくりとはこの7工程になります。

ここでメモリーを利用する工程としては**2**,**3**,**5**,**6**,**7**です。

- *mayabatch.exeがシーン(.ma/mb)ファイルを読み込む*
- *ネイティブシーンファイルの変換*
- *レンダリングしたバッファ*

これらの何処かで問題が起きていると予測されます。

#今までの推測と対応
前々から睨んでいたところとしては「*2.mayabatch.exeがシーン(.ma/mb)ファイルを読み込む*」「*5.リファレンスしているファイルを転送。*」じゃないかと思っていました。

Mayaがレンダリング終了した時点でもバックグラウンドで起動し続けたりリファレンスしたファイルメモリーを保持し続けてるのだと思っていなのです。
しかし長期的にマシンを起動し続けていると、どんどんメモリーを消費していくのですが「タスクマネージャー」などではmayabatch.exeは確認できないためマシンごと再起動する他ありませんでした。

#おかしい様子
もう一度「タスクマネージャー」をよく見てみるとずっとvray.exeが起動しているのが確認できました。
V-RayにはDistribution Renderingという分散レンダリングのために、「Register V-Ray render slave as a service」というサービス設定が可能です。
これはマシン起動時にDistribution Rendering用にvray.exeをサーバーモードで起動させるためのものになります。

従来の僕の考えでは、Maya側から呼び出すV-RayとDistribution Rendering用のvray.exeは別物だと思っていました。

しかし、どうやらそうではなくこのDistribution Rendring用のvray.exeがバッチレンダリングで走らせていた際のvrsceneを何らかの原因でキャッチしてしまったようです。

#検証でわかった現象:追記2016/05/17
このDistribution Rendring用のvray.exeは例えばMaya2015でレンダリングした場合、それ以外のMayaバージョンのSpwnerとして起動しているvray.exeでも保持し続けて利用なので、複合的な問題が絡んでいそうです。

#解決方法

そして、このvray.exeはそのままサービスとして起動はされ続けるので、そこでメモリーを消費し続けていたというのが、ことの全貌のようです。

結論としてはこの問題の解決として、レンダリングマシンで「Remove V-Ray render slave as a service」を実行してvray.exeをサービス・プロセスから終了することで解決しました。

この問題に関してDistribution　Rendering用のサーバーと通常のバッチレンダリングのサーバーが同一の場合に発生し易い問題になりますので、代理店経由にて現象を報告して修正依頼等を開発元に申請してもらう予定です。

若干モヤモヤしますが、とりあえずDistributionとバッチレンダリングを併用することはないので、当面はこの形で運用しようと思います。
多次元配列に対するstripflashes

<pre>素人の個人的メモ兼、スニペット
勉強も兼ねてますのでコメントとかも感謝です。
（忙しさによっては返信が遅れるかもしれません）</pre>

```php
if( !function_exists('array_stripslashes') ){
  function array_stripslashes($v){
  	//再帰処理
    $v = is_array($v)?
    		array_map('array_stripslashes', $v):
         	stripslashes($v);
    return $v;
}}
```

memo
KEYに対しては処理しない。KEYは対象外でいいのかな？
Travis CI 風のバッジを自作したいとき shields.io

# 概要

Travis CI 風のバッジを作る必要がでてきた。
そのようなサービスがあるかを調べた

# 結論

* [Shields.io: Quality metadata badges for open source projects](http://shields.io/)

を使う。



# 使い方

2016-05-17 現在は、

[Shields.io](http://shields.io/) のサイトの下の方に使い方がいろいろ書いてあるので、そこを参考にするのが良いと思う。

## 1.2.0 passing で色を green にして、SVG形式で。

```
https://img.shields.io/badge/1.2.0-passing-green.svg
```

![1.2.0 passing](https://img.shields.io/badge/1.2.0-passing-green.svg)


## 1.3.0 failure で色を red にして、PNG形式

png形式を指定することもできる。

```
https://img.shields.io/badge/1.3.0-failure-red.png
```

![1.3.0 failure](https://img.shields.io/badge/1.3.0-failure-red.png)

# 参考情報

[GithubのマイルストーンからCHANGELOGを生成する - Qiita](http://qiita.com/sawanoboly/items/abd46dafc18c59dde368)

ここのコードをみると、日本語もいけるみたい。
Debug用 Codeigniter Helper

<pre>素人の個人的メモ兼、スニペット
勉強も兼ねてますのでコメントとかも感謝です。
（忙しさによっては返信が遅れるかもしれません）</pre>

`Debug($array);`
=>ソースコード内にvar_dumpをコメント表示

`Debug($array,'d');`
=>ブラウザ上にvar_dumpを < pre > 表示

`Debug($array,'p:300','memo');`
	=>ブラウザ上に縦300pxでprint_fを < pre > で表示

後は作り途中ですがメモ＆スニペットとして。


```php
if ( ! function_exists('Debug')){
//$type='300,p' 300=>height p=>print_r
function Debug($datas, $type=null, $hd_mark=null){
  $types = explode(':',$type);

  switch(@$types[0]){

  case 'print_r':
  case 'print':
  case 'p':
    echo "<pre style='overflow:auto; max-height:".@$types[1]."px;'>". $hd_mark. "<br>";
    print_r($datas);
    echo "</pre>";
    break;

  case 'dump':
  case 'd':
    echo "<pre style='overflow:auto; max-height:".@$types[1]."px;'>". $hd_mark. "<br>";
    var_dump($datas);
    echo "</pre>";
    break;

  case 'json':
  case 'j':
    echo json_encode($datas);
    break;

  case 'source':
  case 's':
  case 'html':
  case 'h':
    echo "<!-- Debug: ". ($hd_mark?:"********************************************"). "\n\n";
    var_dump(trim(strip_tags($datas)));
    echo "\n\n******************************************************* -->\n";
    break;

  default:
    echo "<!-- Debug: ". ($hd_mark?:"********************************************"). "\n\n";
    var_dump($datas);
    echo "\n\n******************************************************* -->\n";
  }
}}

```
Android ディスプレイをフルスクリーンにする方法

Androidのディスプレイは、デフォルトではタイトルバーとナビゲーションバーが表示されます。
ディスプレイをフルスクリーンに以下の方法を試してみてください。

#タイトルバーを無くす方法
requestWindowFeatureを使用します。
コードを参考にしてください。

```java:activity
@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.activity_main);
    }
```
※Activity#onCreateにてsetContentViewの前にセットすること。

#ナビゲーションバーを隠す方法
今回はナビゲーションバーを隠す方法を説明します。
以下のコードを参考にしてください。

```java:activity
@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        View decor = this.getWindow().getDecorView();
		decor.setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
				| View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
    }
```
getDectorView()で取得したViewに各フラグをセットします。


####■View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
インタラクションがない間ナビゲーションバーを非表示にする
API14（Ver4.0）から使用できます。

####■View.SYSTEM_UI_FLAG_FULLSCREEN
ステータスバーを非表示にする
API16（Ver4.1）から使用できます。

####■View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
一定時間経過すると、再度非表示にする。
API19（Ver4.4）から使用できます。

こんな感じで分岐すれば、、、

```java:java
public static void setNavigationbarHide(Activity activity, boolean hide){
		View decor = activity.getWindow().getDecorView();
		if(hide && Build.VERSION.SDK_INT > 18)
		{
			decor.setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
					| View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
		}
		else if(hide && Build.VERSION.SDK_INT > 15)
		{
			decor.setSystemUiVisibility(
					View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_FULLSCREEN);
		}
		else if(hide && Build.VERSION.SDK_INT > 13)
		{
			decor.setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION);
		}
		else
		{
			decor.setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE);
		}
		
	}
```
各APIによって、可能な限り各バーを隠すことができます。
が、アプリの挙動に合わない場合もあるので、仕様によって使い方は考えたほうがいいと思います。
GitbookでTOC（目次）をサクッと追加する

GitbookでTOC（目次）をサクッと追加したい。それをPDFでも出力したい。
https://github.com/whzhyh/gitbook-plugin-toc

# 事前準備
## 参考サイト
* [GitBook Toolchain Documentation](http://toolchain.gitbook.com/)
* [GitBookローカル開発環境セットアップ](http://qiita.com/mamohacy/items/98c0d790074c9bdfef1a)
* [Gitbookでpdfとebookを作成する](http://qiita.com/kyokomi/items/1375ba44aaa3e78e10fb)


Gitbookのインストール

```
npm install gitbook -g
```

gitbook-pdfのインストール

```
npm install -g gitbook-pdf
```

calibreのインストール

```
brew cask install calibre
```


# ドキュメント作成
プロジェクトディレクトリの作成

```
mkdir gitbook
```

Gitbookの初期化

```
gitbook init
```

あとは、README.mdやSUMMARY.mdをごにょごにょ...

-----

...で、ここからが本題！

# gitbook-plugin-tocのインストール
https://github.com/whzhyh/gitbook-plugin-toc

## プラグインのインストール

```
npm i gitbook-plugin-toc
```





## book.jsonの作成
プロジェクトのルートに配置

``` book.json
{
    "plugins": ["toc"],
    "pluginsConfig": {
        "toc": {
            "addClass": true,
            "className": "toc"
        }
    }
}
```

## README.mdの編集
目次を挿入したい位置に ```<!-- toc -->``` を追加

以上。

-----

サーバ起動して http://localhost:4000 にアクセスすればHTMLで確認できる。

```
gitbook build
gitbook serve
```

PDFで出力してもちゃんと表示される。

```
gitbook pdf . readme.pdf
```
Amazon Linuxでapache2.2をrpmbuildしたらspecファイルではまった件

いつものノリでソースからコンパイルしようとしたらいろいろはまったのでメモ。

Amazonのリポジトリから取ってきてyumで入れるのがいいんだけど
いろいろ事情がありまして…

バージョン：httpd-2.2.31
※2.4系だとどうなるか調べてないです

＜理由＞
AmazonLinuxのrpmbuildが4.11系になっているので
PreReqやBuildPreReqの記述がspecファイルに入ってるとエラーになる。

※CHANGELOG見ても書いてなかったけど、何処読みにいけばいいんだろ…

＜対策＞
tarballを展開して
PreReq->Requires
BuildPreReq -> BuildRequires
に書き換え。
$ 
```
$ sed -i 's/PreReq/Requires/g' httpd.spec
$ sed -i 's/BuildPreReq/BuildRequires/g' httpd.spec
```

再度圧縮してビルド。
```
$ rpmbuild -tb --clean --rmspec httpd-2.2.31.tar.gz
```

この後また別の箇所でbuild error出てしまったけどそれはそれはまた後。

20160609追記
CentOS7系でもrpmbuildが4.11なので同じように修正が必要(まだ未確認)
ソースからビルドだとsystemd周りのスクリプトが作成されないような気がするので
別のやり方が必要。
おとなしく2.4系使えばすむ話なんですよね。
.NET アプリの CLI でのテストでは MSTest.exe ではなく vstest.console.exe を使おう

Visual Studio 2013 でテストを実行する際、プロセッサのアーキテクチャはメニューの [テスト] -> [テスト設定] -> [既定のプロセッサアーキテクチャ] から、x86 / x64 を選択できます。

しかし、CI ツールなどから CLI でテストを流す時、これまで通り MSTest.exe を使おうとすると、例えば Oracle Data Provider for .NET (ODP.NET) で DB 接続するケースで、開発環境に 64bit 版のみがインストールされている場合、MSTest.exe は 32bit 版を使おうとするため

```
要求された .Net Framework データ プロバイダーが見つかりません。これは、インストールされていない可能性があります。
```

のようなエラーを吐いてテストが失敗してしまいます。MSTest.exe は x86 のプロセッサアーキテクチャのみに対応した古いツールということになります。

そこで、MSTest.exe ではなく vstest.console.exe を使います。

MSTest.exe は(Visual Studio 2013 の場合)、`C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE` 配下にありますが、vstest.console.exe は `C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE\CommonExtensions\Microsoft\TestWindow` 配下にあり IDE の拡張モジュールの位置づけでしょうか。

MSTest.exe も vstest.console.exe も 開発者コマンドプロンプト(`C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\Tools\Shortcuts`) にはパスが通されていて任意のフォルダで使用できます。

vstest.console.exe のコマンドラインオプションの解説は [VSTest.Console.exe のコマンドラインオプション](https://msdn.microsoft.com/ja-jp/library/jj155796.aspx) にあります。

/Platform:[ プラットフォームの種類 ] でプロセッサアーキテクチャ(x86、x64、および ARM )を指定できます。

Jenkins では [VSTestRunner Plugin](https://wiki.jenkins-ci.org/display/JENKINS/VsTestRunner+Plugin) というプラグインが提供されていて、プロセッサアーキテクチャは WebUI のラジオボタンで設定できます。
Twitterの埋め込みウィジェットの横幅を画面に合わせる方法

Twitterの埋め込みウィジェットの横幅調整は、埋め込みの
コードをdivで包んで、div側で行えばよい、という話。


Twitterの埋め込みウィジェットを利用しようとして、
横幅の調整に少しハマッたので、その対応策のメモ。

ウィジェットの作成時（※１）に指定した横幅が、
実際に吐き出されるウィジェットには反映されなくて、困った。

※１：埋め込みタイムラインhttps://dev.twitter.com/ja/web/embedded-timelines


「Twitter ガジェット 横幅」でGoogle検索すると、
「jQueryを使って強引に設定する」とかそういうのが見つかる。
えー、もっと簡単に出来るんじゃね？と思って、
以下のようにdiv要素で囲って「width:100%; overflow: scroll;」を
指定してあげたところ解決した。
（※２；この例では、画面の横幅に合わせてる）

```js:gadget.html
<div style="height: 480px; width:100%; overflow: scroll; background-color: white;">
        <!-- 以下、Twitter公式が吐いたコード -->
	<a class="twitter-timeline"  href="https://twitter.com/xingyanhuan" data-widget-id="645854653368832000">@xingyanhuanさんのツイート</a>
	<script language="JavaScript">
	!function(d,s,id){
		var js;
		var fjs=d.getElementsByTagName(s)[0]
		var p=/^http:/.test(d.location)?'http':'https';
		if(!d.getElementById(id)){js=d.createElement(s);
		js.id=id;js.src=p+"://platform.twitter.com/widgets.js";
		fjs.parentNode.insertBefore(js,fjs);}
	}(document,"script","twitter-wjs");
	</script>
</div>
```


で、後から知ったが、こっちのページに「別途div要素を追加して」
って書いてあるね。メジャーな方法でしたかｗ
http://algorhythnn.jp/blg/2014/01/28/width-change-twitter-widget/

なお、divで包むってのは、高さをあらかじめ指定する上でもよいかも。
Twitterの埋め込みウィジェットが読み込まれるまでタイムラグがある故の
縦方向の配置が時間差でズレる現象、を回避できる。
PHPerがつまづいたRubyの仕様(その2)


あるあるな判定処理を書こうとしてハマってしまった...

```ruby
irb(main):001:0> a = true
=> true
irb(main):002:0> p "foo" if a
"foo"
=> "foo"
irb(main):003:0> a = false
=> false
irb(main):004:0> p "foo" if a
=> nil
```

うん、ここまでは当たり前。パーフェクト。

で、ハマったのは次のやつ

```ruby
irb(main):005:0> a = 1
=> 1
irb(main):006:0> p "foo" if a
"foo"
=> "foo"
irb(main):007:0> a = 0
=> 0
irb(main):008:0> p "foo" if a
"foo"
=> "foo"
irb(main):009:0>
```

・・・え？0でもifでtrueになるの？

PHPと比べてみる

```php
php > $a = 1;
php > if ($a) { echo "foo"; }
foo
php > $a = 0;
php > if ($a) { echo "foo"; }
php >
```

うん、PHPだと **0** は **false** と同じような扱い。
だけど、Rubyだと **0** は **0** であって **false** ではないので、判定式にそのまま埋め込んじゃダメ。

・・・LLなのに妙なところで型に厳しいな...。
Oracle Database 12cのサンプルスキーマ(HR, SH, OE...)をインストール

ちょっとした機能検証や動作確認をしようと思った時にサンプルスキーマがあると何かと便利。

DBCAでデータベースを作成する際に「サンプルスキーマの作成」にチェックを入れれば作成することができます。
![WS0002.png](https://qiita-image-store.s3.amazonaws.com/0/109229/2f1bb531-00b1-5408-b9ec-7fcf1143c4c8.png)

しかし作成済みのデータベースに後からサンプルスキーマを追加しようとすると、作成スクリプト(hr_main.sql)が見つからない・・・

```shell-session
[oracle@host1 ~]$ cd $ORACLE_HOME/demo/schema/human_resources
[oracle@host1 human_resources]$ ls
hr_code.sql

```

作成スクリプトを入手するためにはOracle Database Examplesをダウンロードします
![WS0001.png](https://qiita-image-store.s3.amazonaws.com/0/109229/57a63034-afa0-a7d8-be79-68cda9c9a7f6.png)

あとはrunInstallerを実行して進むだけ
![WS0003.png](https://qiita-image-store.s3.amazonaws.com/0/109229/797bcb1f-8eb7-c221-9f28-1404efe9cb5f.png)

スクリプトが展開されました

```shell-session
[oracle@psc01 human_resources]$ ls
hr_analz.sql  hr_comnt.sql  hr_dn_c.sql  hr_drop.sql  hr_main.sql
hr_code.sql   hr_cre.sql    hr_dn_d.sql  hr_idx.sql   hr_popul.sql
```

マニュアルはこちら
http://docs.oracle.com/cd/E57425_01/121/COMSC/installation.htm#COMSC00002
AMP で Google Analytics を利用する

## やり方
次のスクリプト分を `<head>` 内かつ AMP JS library[^1] よりも前に以下の内容を記述

```html
<script async custom-element="amp-analytics" src="https://cdn.ampproject.org/v0/amp-analytics-0.1.js"></script>
```

Body 先頭に以下の内容を記述

```html
<amp-analytics type="googleanalytics" id="analytics1">
    <script type="application/json">
        {
            "vars": {
                // 通常ページのトラッキング用と、 AMP 用ではプロパティを分けて設定することが推奨
                "account": "UA-XXXXXX-Y"
            },
            "triggers": {
                "trackPageview" : {
                    "on": "visible",
                    "request": "pageview"
                }
            }
        }
    </script>
</amp-analytics>
```

ちなみに `amp-analytics` に `id` は必須ではないがデバッグのために追加しておくことが推奨

[^1]: AMP JS library は `<script async src="https://cdn.ampproject.org/v0.js"></script>` です
pythonでキャスト


# キャスト

[How to convert (inherit) parent to child class?](http://stackoverflow.com/questions/10030412/how-to-convert-inherit-parent-to-child-class)

これでキャストのようなことは出来た

[Python でクラスのキャスト](http://nihaoshijie.hatenadiary.jp/entry/2014/08/09/152558)

キャスト用のメソッドを作って要素をキャストする側にコピーしてくる。
こっちの方が使いやすい。
Oracleデータベースでテーブルの列をカンマ区切りで表示する方法

Oracle データベースでテーブルの列をカンマ区切りで表示したいことがあると思います。そんなときはデータディクショナリ USER_TAB_COLUMNS と Oracle 11g R2 以降で使用可能になった LISTAGG 関数を使用しましょう。

例えばこれで SQL*Loader のコントロールファイルに、コピペができるようになりますね。

次の SQL を実行すればすべてのテーブルの名称と列名が一気に表示されます。

```sql
SELECT TABLE_NAME, LISTAGG(COLUMN_NAME, ',') WITHIN GROUP (ORDER BY COLUMN_ID) AS COLUMN_NAMES FROM USER_TAB_COLUMNS GROUP BY TABLE_NAME;
```

次のような DDL で作られたテーブルだと・・・

```sql
CREATE TABLE PERSON (
  NAME VARCHAR2(20),
  AGE NUMERIC,
  ADDRESS VARCHAR2(50),
  GENDER CHAR(1),
  HOBY VARCHAR2(50)
);
```

次のような結果になるでしょう。

|TABLE_NAME|COLUMN_NAMES|
|:--|:--|
|PERSON|NAME,AGE,ADDRESS,GENDER,HOBY|
VMでホストマシンの秘密鍵をゲストマシンと共有する


## 1. はじめに

1. ssh-agentが起動している必要あり。
（Macの場合は最初から入っていて、起動もしてるので何もしなくてOK）

1. 秘密鍵の生成が終わっていること（ここでは `~/.ssh/id_rsa` として説明）


## 2. ホストマシン側で以下のコマンドを実行

```
ssh-add -K ~/.ssh/id_rsa
```

## 3. ゲストマシン側で見えるか確認

vagrant起動ファイル（Vagrantfile）に以下を追加しておき、 `vagrant up`

```
config.ssh.forward_agent = true
```

ゲストOSにログインし、以下コマンドで秘密鍵が表示されれば共有完了

```
ssh-add -l
```
【2016年版】NewRelicを使って無料でHerokuのSleepを防ぐ


Herokuの料金体系が変わりましたが、
無料Dynoがすぐ寝ちゃうのは変わっていません。

そこで定期的にpingで起こすソリューションが一般的ですが、
NewRelicのアドオンを入れると無料でさくっとできてお手軽です。

しかし1年ぶりに設定しようとしたら
管理画面がだいぶ変わってて戸惑ったので、2016年版の設定メモ。


## NewRelicの設定
### NewRelicアドオンを追加
いまの無料プラン名はwayneです。starkじゃないよ。

```
heroku addons:add newrelic:wayne
```

### 管理画面を開く

```
heroku addons:open newrelic
```


## 管理画面での設定
### メニューは「SYNTHETICS」を選択
ここが一番わからなくて困るやつ。
いっぱいメニューが増えてるけど、「SYNTHETICS」を選びます。


### 1.Choose your monitor type

まよわず「ping」を選択。

### 2. Enter the details

pingしてもらうURLを入れとく。

### 3. Select monitoring locations

「Tokyo,JP」でいいんじゃないですかね（てきとう）

### 4. Set the schedule

何分おきにpingしてもらうか。
30分アクセスがないとsleepしちゃうので、
よゆうをみて「15分」とかにしておくとよさげ。

### 5. Get notified(optional)

ping失敗したときに通知先メアドを登録。


---


これで設定はばっちりです。

しかしいくらpingしても無料dynoだと毎日6時間は寝るしかないので、
お休み中はカスタムエラーページ出してあげたりするといいですね。

>[Herokuの無料dynoがsleepしてる時間を表示するカスタムエラーページを設定する](http://qiita.com/tomomichi/items/fed08545ab4b02a7beec)


おしまい。
JavaScriptとPHPとRubyのclass定義をなんとなく並べてみた

#メモです
　
筆者は、底辺エンジニアであり、
窓際エンジニアでございます。
なので間違え、誤記等があるかもしれません。
あらかじめご了承ください。
ご指摘、編集リクエストの方をよろしくお願いします。
　
#目的
暇つぶしを兼ねてJavaScriptの再入門でもしようかと思い執筆しました。
　
#では初めに
JavaScriptは、オブジェクト指向のプロトタイプベースのスクリプト言語としてその歴史をスタートしました。
昨今、フロントエンド界隈では、非常に多くのJavaScriptのライブラリ、フレームワーク等が存在し、群雄割拠な言語となってます。
　
流行り廃りあれどJavaScriptの根本的な部分は変わらないと思います。ES2015、すでに2016、2017とプロジェクトは動いている、そんな中、本来クラスという概念を持たないJavaScriptにクラス構文なるものが導入されました。
※alt.jsなどでJavaScriptの構文に変換する必要があります。

バックエンドエンジニアの人にはとても敷居が低くなったのではないでしょうか？
筆者は、Ruby、PHPをメインに開発に従事しています。
　
そんな中改めてJavaScriptの基礎について理解を深めたいと思い、自分なりの解釈、理解を進めています。
なのでこの記事は、気づきがある際は、随時更新していこうと思います。
もちろん本来フロントエンジニアではない、人間が書いてますので間違い等が存在するかと思います。なのでその際は、なんなりとご指摘、編集リクエストをくださいますようよろしくお願いします。

#独自解釈を始めます。
その前にオブジェクトとは、何か？
単純にこの世に存在する物すべてがオブジェクトです。

そうです。道行く車、通勤に使う電車、バス、改札を通るために使うスイカこれらすべてがオブジェクトです。
　
ではオブジェクト指向とは何ぞやって話です。
大雑把にざっくり言うとオブジェクトを現実世界から仮想世界(PC)へ具現化しよう(PCが理解できるように)という考えだと思っています。

先に述べたようにJavaScriptはプロトタイプベースといいました。では違うものも存在するのか？
答えは、存在します。それがクラスベースです。
　
いきなり難しい話になってきましたが、この話を深くするには、筆者は理解が乏しいため今は、一旦置いときましょう。
　
#整理をしてみる
 
試しにclassを作成し税込み価格を出すclassを作成してみます。
PHP、Ruby、JavaScriptの順に作成をしてみます。 
 
```test.php
class Test{
    public $num;
    
    public function __construct($num){
        $this->num = $num;
        
    }
    public function sample(){
        echo $this->num * 1.08;
    }
}
$test = new Test(100);
$test->sample();
/* 
=> 108
*/
/*クラスのインスタンス化*/
$test = new Test();

```
 

```hoge.rb

#通常
class Hoge
  #初期化
  def initialize( num )
    @num = num   
  end

  def sample
  #何か
    p @num * 1.08
  end 
end

hoge = Hoge.new(100)
hoge.sample()
#=>108.0

#以下selfメソッドを使用した方法
class Hoge
  def self.sample( num )
    num * 1.08
  end 
end

hoge = Hoge.sample(100).floor
p hoge
#=>108

#クラスのインスタンス化
test = Test.new()

```
　
ではJSのクラスの作成方法とは？

```fuga.js
var Fuga = function (arg) {};

//クラスのインスタンス化
var fuga1 = new Fuga();

```
となります。
んー？上2つと異なりますね。
それもそのはず、JSは、あくまでクラスっぽいに過ぎない。
一応クラス定義となっているが、カスタムオブジェクトと呼ばれる。

※これは関数式と呼ばれています。関数宣言とは、違うので注意が必要です。

上記2種類の言語に関しては、新たに何かしらの処理を付け加えたい場合は、class内にメソッド、関数を追加すればいいのですがJSでは、少し異なります。
※メソッドと関数は、classに属するオブジェクト＝これがクラスベースという考え、設計指向になると思います。
※phpの場合原則として、class内にあるものをメソッド、外にあるものを関数と認識してます。　
　
JSに関して、メソッドの定義は以下の様にします。

```fuga.js
//消費税の計算とする
//クラスを作成
var Fuga = function (num) {
  this.num = num;
};

//メソッドの定義
//メソッドの定義は関数の定義と同じように書く
Fuga.prototype.sum = function(){
  console.log(this.num * 1.08);
};

//クラスのインスタンス
var fuga = new Fuga(100);
fuga.sum();

//=>108

//以下自分的な書き方※関数宣言でありクラス定義ではないです。

function sum(num){
  //関数は、returnを付けるのが原則 
  return console.log(num * 1.08);
}
sum(100);
//=>108
```
 
自分的には、最後の書き方がしっくりきます。
クラス定義ではなく関数宣言になっているので
他の言語と目的が異なりますが・・・・
フロントエンジニアとして業務をしたことがないのでどのタイミングでどのようなときに使うべきなのかはわからないですが
今後は、設計を頭で描き、仕様を具現化できるようになりたいと思います。

上記ソースコードは、検証済みです。


#一旦終わり
再度PHP、Rubyについての復習にもなって結果一石三鳥くらいになってhappyです　
実感したのは、やはり知ったつもりになっている箇所が多いのと理解度がやはり薄いことに気づかされました。
スプラッシュWindowを表示する

#やりたいこと#
アプリ起動時にスプラッシュWindowを表示する。画像ではなくてWindow。
#方法#
```C#
public partial class App : Application
{
    protected override void OnStartup(StartupEventArgs e)
    {
        var win = new MainMenuWindow();
        // this.MainWindow = new MainMenuWindow(); // こっちのほうが明示的でいいかも

        var splashWindow = new splashWindow();
        splashWindow.Show();
        // ***いろんな処理***
        splashWindow.Close();

        win.Show();
        // this.MainWindow.Show();
    }
}
```

最初、下記のようにしていて期待通りに動かなかった。
最初にnewされたWindowがメインのWindowになるのね。

```C#
public partial class App : Application
{
    protected override void OnStartup(StartupEventArgs e)
    {
        var splashWindow = new splashWindow();
        splashWindow.Show();
        // ***いろんな処理***
        splashWindow.Close();

        var win = new MainMenuWindow();
        win.Show();
    }
}
```
ES5で書くAngular v2（３）「繰り返し処理」

※現在この方法は推奨されません

[前回](http://qiita.com/puku0x/items/48f13804251e9b9cd0d7)はAngular v2の双方向バインディングを試しました。

今回はAngular v2公式サイトの[TypeScriptサンプル](https://angular.io/docs/ts/latest/tutorial/toh-pt2.html)を参考に繰り返し処理をしてみましょう。

メインのHTMLに`list-component`を追加します。

```html:index.html
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/2.0.0-beta.17/Rx.umd.min.js"></script>
        <script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/2.0.0-beta.17/angular2-polyfills.min.js"></script>
        <script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/2.0.0-beta.17/angular2-all.umd.dev.js"></script>
        <script src="components/list-component/list-component.js"></script>
    </head>
    <body>
        <list-component></list-component>
    </body>
</html>
```

コンポーネントのJavaScriptに配列`heroes`を追加します。

```js:components/list-component/list-component.js
(function(app) {
    app.ListComponent = ng.core
    .Component({
        selector: 'list-component'
    })
    .View({
        templateUrl: 'components/list-component/list-component.template.html'
    })
    .Class({
        constructor: function() {
            this.heroes = ["Mr. Nice",
                           "Narco",
                           "Bombasto",
                           "Celeritas",
                           "Magneta",
                           "RubberMan",
                           "Dynama",
                           "Dr IQ",
                           "Magma",
                           "Tornado"
                          ];
        }
    });
    document.addEventListener('DOMContentLoaded', function() {
        ng.platform.browser.bootstrap(app.ListComponent);
    });
})(window.app || (window.app = {}));
```

テンプレートには`ngFor`を使った繰り返し処理を書きます。

```html:components/list-component/list-component.template.html
<li *ngFor="let hero of heroes">
    {{hero}}
</li>
```

↓今回の動くサンプルはこちらです。
https://codepen.io/puku0x/pen/ZWNLgx

`ngFor`の前の`*`は`<li>`要素（とその子要素）をテンプレートにするという意味だそうです。
`let`が見慣れない方は`var`に置き換えると良いでしょう。

# まとめ

Angular v2の`ngFor`を用いて1.x系にあった

```html:AngularJS&nbsp;v1.xを用いた場合
<li ng-repeat="hero in $ctrl.heroes track by $index">
    {{hero}}
</li>
```

といった繰り返し処理を行いました。

個人的には「文字列配列の場合は`track by`必須」という縛りが無くなって嬉しいのですが、皆さんはいかがでしょうか？

[次回](http://qiita.com/puku0x/items/9f4b9457a91d36294bf8)はクリックイベントをやってみようと思います。
laravelのeager loadingで発行されるクエリをキャッシュする

下記のようにeager loadingを使ってデータを取得しようとした時、にメインのクエリしかキャッシュされていないことに気づきました。 
調べてみると、それぞれキャッシュする方法があるようです。

### 修正前
下記の場合、rankingのmodelから取得するクエリはキャッシュされるのですが、postやuserを取得するクエリはキャッシュされません。

```php:キャッシュされない
// 省略
    $data = $this->ranking
        ->with('post', 'post.user')
        ->remember(Config::get('lifetime'))
        ->get();

    $records = [];
    foreach ($data as $record) {
        $records[] = [
            'rank' => $record->rank,
            'postImage' => $record->post->image,
            'userID' => $record->post->user->id
        ];
    }
// 省略
```
```mysql:発行されるクエリ
select * from `ranking` order by `id` asc; // キャッシュされる
select * from `posts` where `posts`.`deleted_at` is null and `posts`.`id` in (?, ?, ?, ?) // キャッシュされない
select * from `users` where `users`.`deleted_at` is null and `users`.`id` in (?, ?, ?, ?) // キャッシュされない
```

### 修正後
withの部分を変更します。

```php:キャッシュされる
// 省略
    $data = $this->ranking
        ->with(['post' => function($query) {
            $query->remember(Config::get('lifetime'));
            $query->with(['user' => function($sub_query) {
                $sub_query->remember(Config::get('lifetime'));
            }]);
        }]) 
        ->remember(Config::get('lifetime'))
        ->get();
// 省略
```

これで無事、全てのクエリがキャッシュされるようになったはず。

### 参考
https://github.com/laravel/framework/issues/3230
webdriver用のテストシナリオをJavaScript(nashorn)で書いてみる

# はじめに
[Seleniumテスト環境](http://qiita.com/gluelan2013/items/44539209a17b5d75778a)について書いた際　テストスクリプトにJavaVm環境で動くスクリプトがよいのではないか？と思ったので、その中から　JavaScript言語である Nashornで動くところまで頑張ってみました。
一般的（？）にはJavaScriptを使ってwebdriverを使用するにはまず Node.jsのインストールから始めることになりますが、この方法であれば、Javaがインストールされた環境であれば、すぐに動かすことができます。またJava用に作成されているライブラリーの恩恵を得ることができます。

## Nashornとは
### これまでのJavaScriptエンジン「Rhino」
　Javaは、Java SE 6からJavaScriptをサポートしており、Java SE 7では、Rhino　名前のJavaScriptエンジンが搭載されています。


### 新JavaScriptエンジン　「Nashorn」

　Java 8 からは　Nashorn　という新しいJavaScriptエンジンが　搭載されています。

[Nashorn Documentation](https://wiki.openjdk.java.net/display/Nashorn/Nashorn+Documentation)

[Java Platform, Standard Edition Javaスクリプト・プログラマーズ・ガイド](https://docs.oracle.com/javase/jp/8/docs/technotes/guides/scripting/prog_guide/toc.html)

どちらもJavaScriptをJavaで実装しており、使い方としては以下の２パターンがあります。

1. Javaソースの中で JavaScriptを使う
  コードの基本はJavaで記述し　スクリプトエンジンでJavaScriptコードを評価する方式で、コンパイルが必要
2. VM上でJavaScriptを実行する
　コードはJavaScriptで記述し実行する、コンパイルは不要

- スクリプト言語として使用したいので　２　の方式を調査します。

## 環境
Javaで実装している実態（？）は　以下にあるファイルになります。

| 名称|ディレクトリ |
|:--:|:--|
|Rhino|JDKの bin ディレクトリにある　jrunscript.exe|
|nashorn|JREの bin　ディレクトリにある jjs.exe|

ちなみに、OSXでもコンソールから　jjs と打つとコマンドラインで起動しました。

## 実行スクリプト

必要なのはパッケージのインポート方法ですが、公式によると 互換性スクリプト(mozilla_compat.js)に組み込まれているとのこと

[3.2 Javaパッケージおよびクラスのインポート](https://docs.oracle.com/javase/jp/8/docs/technotes/guides/scripting/prog_guide/javascript.html#A1147187)

これを利用して動かしてみます

```js:1strun.js
load("nashorn:mozilla_compat.js");

importPackage(org.openqa.selenium);
importPackage(org.openqa.selenium.firefox);

var driver = new FirefoxDriver();

driver.get("http://www.google.com");
var element = driver.findElementsByName("q");
element.get(0).sendKeys("Cheese!");
element.get(0).submit();
driver.quit();

print("End!");
```

全部JavaScriptですが、１行目以外は特に目新しいところはないと思います。

###　修正

load importPackageはグローバルオブジェクトを作成してしまうため非推奨とのことでした。

```js:1strun.js
var wd = JavaImporter(org.openqa.selenium.firefox);

var driver = new wd.FirefoxDriver();

driver.get("http://www.google.com");
var element = driver.findElementsByName("q");
element.get(0).sendKeys("Cheese!");
element.get(0).submit();
driver.quit();

print("End!");
```

## 実行

JavaVM環境を使用するので　クラスパスが通っている必要があります。これが結構曲者だとおもっていますが今回は　カレントディレクトリに　テストシナリオとドライバーファイルを置いています。

```
c:\>jjs 1strun.js -cp selenium-server-standalone-2.53.0.jar
```

# おわりに
こんなに簡単に動くのは意外でした。
gem install時のpackage metadata is missingエラー

ちょっとはまったのでメモ

gem installしようとするとpackage metadata is missingというエラーが出てしまった。

```
$ gem install rails
ERROR:  While executing gem ... (Gem::Package::FormatError)
    package metadata is missing in hoge.gem
```

current directoryに拡張子`.gem`のファイルがあると読もうとしてエラーになるらしい。
もちろん適切にビルドされた`.gem`ファイルであれば問題ないが。

```
$ ls
hoge.gem
```

というわけで削除すれば解消する。