OmniAICreator/Qiita-1.07M huggingface dataset:
AWSのEC2にDockerをインストールしてOSS版Drone 0.4.0を動かす

# AWSのEC2にDockerをインストールしてOSS版Drone 0.4.0を動かす

## 背景

前々からDroneに興味があったので構築してみました。Githubなどとの連携を確認するためにAWSのEC2上で動かします。

## AWSでEC2インスタンスを用意

VPCを作成してEC2インスタンスを起動します。今回はUbuntuのAmazon EC2 AMI Locatorから15.10(hvm:ebs-ssd)のを用いました。

- https://cloud-images.ubuntu.com/locator/ec2/

sshのログインユーザ名は「ubuntu」になります。EIPを割り当ててセキュリティグループを適宜設定します。Githubからはhttpsが通ればOKです。

## Ubuntuの設定

ひとまずパッケージを最新にしておきます。

```
$ sudo apt-get update
$ sudo apt-get -y upgrade
```

Dockerのstorage driverにaufsを使うためにkernelを変更します。

```
$ sudo apt-get -y install linux-image-extra-virtual aufs-tools
```

タイムゾーンと言語を日本語にあわせておきます。

```
$ sudo timedatectl set-timezone Asia/Tokyo
$ sudo apt-get -y install language-pack-ja
$ sudo update-locale LANG=ja_JP.UTF-8
```

ここでいったんインスタンスを再起動させます。

## Dockerのインストール

以下を参考にインストールしていきます。

- http://docs.docker.com/engine/installation/ubuntulinux/

リポジトリを登録します。

```
$ sudo apt-key adv --keyserver hkp://pgp.mit.edu:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D
$ echo <<'EOT'>/etc/apt/sources.list.d/docker.list
# Ubuntu Wily
deb https://apt.dockerproject.org/repo ubuntu-wily main
EOT
```

インストール可能なバージョンを確認します。

```
$ sudo apt-get update
$ sudo apt-cache policy docker-engine
```

今回は1.8.3をインストールしてみます。

```
$ sudo apt-get -y install docker-engine=1.8.3-0~wily
$ sudo systemctl enable docker
```

## Drone 0.4.0を動かす

Droneの設定ファイルを作成します。

```
$ cat <<'EOT' | sudo tee /etc/drone/dronerc
#!/bin/bash

# server configuration

SERVER_ADDR=":8443"
SERVER_CERT="/etc/server.crt"
SERVER_KEY="/etc/server.pem"

# database configuration

DATABASE_DRIVER="sqlite3"
DATABASE_CONFIG="/var/lib/drone/drone.sqlite"

# remote configuration

REMOTE_DRIVER="github"
REMOTE_CONFIG="https://github.com?client_id=xxx&client_secret=yyy

# docker configuration

DOCKER_HOST="unix:///var/run/docker.sock"
#DOCKER_CERT=""
#DOCKER_KEY=""
#DOCKER_CA=""

# plugin configuration

PLUGIN_FILTER=plugins/*
EOT
```
REMOTE_CONFIGの「xxx」と「yyy」はGithub上で登録したアプリケーションのものをもってきます。また「/etc/server.crt」と「/etc/server.pem」にサーバのSSL証明書と秘密鍵を用意しておきます。

DroneをDockerイメージから動かします。

```
$ sudo docker run \
--volume /var/lib/drone:/var/lib/drone \
--volume /var/run/docker.sock:/var/run/docker.sock \
--volume /etc/server.pem:/etc/server.pem \
--volume /etc/server.crt:/etc/server.crt \
--env-file /etc/drone/dronerc \
--restart=always \
--publish=443:8443 \
--detach=true \
--name=drone \
drone/drone:0.4
```

これで https://(サーバ名)/ からDroneにアクセスできるようになります。
AndroidStudio1.4.1にアップグレードしたらgradleがFileNotFoundException(gradle-diagnostics-2.2.1.jar)

AndroidStudioを1.2.xから1.4.1にアップグレードしてSync gradleしたら
FileNotFoundException(gradle-diagnostics-2.2.1.jar)が
発生するようになってしまった。

Gradle sync failed: /Applications/Android Studio.app/Contents/gradle/gradle-2.2.1/lib/plugins/gradle-diagnostics-2.2.1.jar (No such file or directory)

ぐぐったらこちらの記事。
http://stackoverflow.com/questions/30526613/android-studio-1-3-preview-gradle-sync-error-on-gradle-diagnostics-2-2-1-jar

gradle-wrapper.propertiesの記述を修正したら治りました。

修正前
distributionUrl=https\://services.gradle.org/distributions/gradle-2.2.1-all.zip
修正後
distributionUrl=https\://services.gradle.org/distributions/gradle-2.4-all.zip
Guest Additions 5.0.10 - Building the OpenGL support module [ FAILED ]

#./VBoxLinuxAdditions.run

**Building the OpenGL support module [ FAILED ]**

##使用OS CentOS6.7
CentOS-6.7-x86_64-minimal.iso
に yum updateしたもの

```lang:
uname -a

Linux localhost.localdomain 2.6.32-573.8.1.el6.x86_64 #1 SMP Tue Nov 10 18:01:38 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux

```


##解決方法
Aug 2012, 08:28
　Guest Additions 4.1.18 でも起きていたようです。

Board index ‹ Guest systems ‹ Linux Guests
[CentOS 6 OpenGL guest additions failed to install
](https://forums.virtualbox.org/viewtopic.php?f=3&t=50965)


```lang:
$su -
#export MAKE='/usr/bin/gmake -i'
#./VBoxLinuxAdditions.run
```
これで通りました。
Building the OpenGL support module [OK]

##参考
Building the OpenGL support module [ FAILED ]の他のケース

*VBoxGuestAdditions fails to compile vboxvideo_drm.c on CentOS 6.4 => Fixed in SVN
https://www.virtualbox.org/ticket/11586

*CentOS 6.5 - Building OpenGL support module ... failed
https://forums.virtualbox.org/viewtopic.php?f=3&t=58855#p273755
秘密鍵のパスフレーズ解除する方法

間違えてパスフレーズつけて秘密鍵作ったけど、やっぱパスフレーズいらないわぁってなったとき。

```bash

 openssl rsa -in with_passphrase.pem -out without_passphrase.pem
```

これで解決。

作り直して、公開鍵配置しなおさなくていいんすねー。

参考: https://www.digicert.ne.jp/howto/basis/decrypt_key.html
Elasticsearch2.0でkuromojiをインストール

# Elasticsearch

最近2.0の正式バージョンが出ました。
んでインストールで1.x系のやり方がダメだったのでメモ。

## 今までのやり方ではだめ

[1.xでのインストールの仕方](https://github.com/elastic/elasticsearch-analysis-kuromoji) を見ると、バージョンごとに入れるものが違うよ、と。
では2.0系は載ってないけど？
って見ると、IMPORTANTには、「Elasticsearchのリポジトリに入ったよ」とか書いてあって。

## Docに書いてある

探すと、[ElasticのDocに書いてありました。](https://www.elastic.co/guide/en/elasticsearch/plugins/2.0/analysis-kuromoji.html)
Proxyがあるところから見ているので、

```shell-session
$ /usr/share/elasticsearch/bin/plugin install analysis-kuromoji -DproxyHost=xxx -DproxyPort=yyyyy
```

とか。

んで、クラスタにしてたら全クラスタに入れろ、とか、入れたら再起動しろ、とか書いてありますね。

とりあえず、インストールしただけで使っていないのですが。
メモです。メモ。
フィボナッチを求める回路をSynthesijerとMessagePack-RPCでFPGAに実装してみた(シミュレーション編)

#はじめに

[フィボナッチを求める回路をVHDLとMessagePack-RPCでFPGAに実装してみた(シミュレーション編)](http://qiita.com/ikwzm/items/a0ff6cf559f766162951)ではフィボナッチ回路はVHDLで記述しましたが、今回はJavaで記述してSynthesijerを使って高位合成したRTLを単体シミュレーションする例を示します。


#用意するもの

 - Xilinx Vivado 2015.3
 - [Synthesijer](https://github.com/synthesijer/synthesijer)
 - Ruby 1.9.3 以降
 - [Dummy_Plug 1.6.0](https://github.com/ikwzm/Dummy_Plug)

Dummy_Plug は AXI4/AXI4-Stream のBFM(バスファンクションモデル)ライブラリです。

#ブロック図

![akgeo2.jpg](https://qiita-image-store.s3.amazonaws.com/0/24981/d9802aeb-3dc3-1f7e-daf5-b2a3d070fbdf.jpeg)

AXI4_Stream_Master_Player、AXI4_Stream_Slave_PlayerはYAML形式のシナリオファイルを読み込んでAXI4-Stream I/F信号の入出力を行うためのDummy_Plugライブラリのコンポーネントです。

#ソースコード

フィボナッチを求めるjavaのソースコードです。kazunori279さんの[フィボナッチをFPGAで書いてみた](http://qiita.com/kazunori279/items/70030eaa08fe632b6b49)を参考にしました。

````Java:Fib.java
public class Fib {
    public long fib(int n) {
        long cur  = 0;
        long next = 1;
        for (int i = 0; i < n; ++i) {
            long tmp = cur;
            cur = next;
            next += tmp;
        }
        return cur;
    }
}
````

#手順

##リポジトリと各submodule をダウンロード

````
shell% git clone git://github.com/ikwzm/msgpack-vhdl-examples.git
shell% cd msgpack-vhdl-examples
shell% git submodule init
shell% git submodule update
````

##Fib.javaを高位合成

````
shell% export SYNTHESIJER=~/work/synthesijer/synthesijer/bin 
shell% cd examples/fibonacci/src/main/synthesijer
shell% make
````

なお、SYNTHESIJER　にはsynthesijerをインストールしているパスをしてください。


##テストシナリオの作成

AXI4_Stream_Master_PlayerおよびAXI4_Stream_Slave_Player用のテストシナリオを作ります。

````
shell% cd examples/fibonacci/src/test/scenarios
shell% ruby test_1.rb
````

test_1.rb はテストシナリオ(YAML形式)を生成するためのrubyスクリプトです。


##Vivado プロジェクトの作成

Vivado プロジェクトを作成するためのTclファイル(create_project.tcl)を用意しています。
Vivadoを起動して次のメニューからTclファイルを実行してください。

````
Vivado > Tools > Run Tcl Script... > examples/fibonacci/sim/vivado/synthesijer/create_project.tcl
````


##シミュレーションを実行

Vivado プロジェクトを開き、次のようにシミュレーションを実行してください。

````
Vivado > Flow > Run Simulation > Run Behavioral Simulation
````

#参照

- [MessagePack for VHDL (https://github.com/ikwzm/msgpack-vhdl)](https://github.com/ikwzm/msgpack-vhdl)
- [MessagePack for VHDL Examples (https://github.com/ikwzm/msgpack-vhdl-examples)](https://github.com/ikwzm/msgpack-vhdl-examples)
- [MessagePack-RPCを使ってFPGAを制御](http://qiita.com/ikwzm/items/2644c6e50a7049c75d49)
- [フィボナッチを求める回路をVHDLとMessagePack-RPCでFPGAに実装してみた(シミュレーション編)](http://qiita.com/ikwzm/items/a0ff6cf559f766162951)
- [フィボナッチを求める回路をPolyphonyとMessagePack-RPCでFPGAに実装してみた(シミュレーション編)](http://qiita.com/ikwzm/items/48acfa3003522cf0c7a3)
- [フィボナッチを求める回路をSynverllとMessagePack-RPCでFPGAに実装してみた(シミュレーション編)](http://qiita.com/ikwzm/items/37e496680e44d4b80347)
- [フィボナッチを求める回路をneonlightとMessagePack-RPCでFPGAに実装してみた(シミュレーション編)](http://qiita.com/ikwzm/items/1b7cae327719c23fe55d)

[フィボナッチをFPGAで書いてみた](http://qiita.com/kazunori279/items/70030eaa08fe632b6b49)
( 記事移動 ) Rails:  db:reset よりも db:migrate:reset を使うべき理由 (とその違い)

# [記事を移動しました](https://qiita.com/YumaInaura/items/3cf93c61c54b8775187a)



<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# メンター受付


https://menta.work/user/5694

<!-- Update From Qiita API -->
yum historyとrpm -qa --lastで、構築手順を追跡

# 「前任者が残した手順通りだとうまくいかない！」という時のtipsです。

あってはならないことですが、そういうことほどよくありますよね…
そんなとき、実際に行われた手順を探るために、yum historyとrpmが使えます。

# yum history

実行すると、下記のように、yumの実行ユーザ、実行日時、Install,Update,Eraseが行われたか、変更したパッケージ数が一覧で表示されます。

```
[vagrant@repo ~]$ sudo yum history
Loaded plugins: fastestmirror
ID     | Login user               | Date and time    | Action(s)      | Altered
-------------------------------------------------------------------------------
     5 |  <vagrant>               | 2015-11-13 13:54 | Install        |    1
     4 |  <vagrant>               | 2015-11-13 13:44 | I, U           |  144
     3 |  <vagrant>               | 2015-11-13 13:44 | Erase          |    1
     2 |  <vagrant>               | 2015-11-13 13:42 | I, U           |    2
     1 | System <unset>           | 2015-10-28 11:16 | Install        |  199
history list
```

`yum history info <ID>` で、該当IDの詳細が下記のようにでてきます。

```
[vagrant@repo ~]$ sudo yum history info 5
Loaded plugins: fastestmirror
Transaction ID : 5
Begin time     : Fri Nov 13 13:54:15 2015
Begin rpmdb    : 321:5330737f69efda14820e80fff65404d230f6100a
End time       :                           (0 seconds)
End rpmdb      : 322:a473b48264c41cba95677f27998bd4a84a26a386
User           :  <vagrant>
Return-Code    : Success
Command Line   : install unzip
Transaction performed with:
    Installed     rpm-4.8.0-32.el6.x86_64                       @anaconda-CentOS-201303020151.x86_64/6.4
    Installed     yum-3.2.29-40.el6.centos.noarch               @anaconda-CentOS-201303020151.x86_64/6.4
    Installed     yum-plugin-fastestmirror-1.1.30-14.el6.noarch @anaconda-CentOS-201303020151.x86_64/6.4
Packages Altered:
    Install unzip-6.0-2.el6_6.x86_64 @base
history info

```

`yum localinstall *.rpm` と実行した場合、`Command line`では該当するrpmファイルが、次のような感じで全て表示されます。

`yum localinstall xxx.rpm yyy.rpm ... zzz.rpm`

これらの情報があれば、いつ、何をいれて何を削ったのかがわかります。
よくわからずに、何回か色々やったらできるようになった、というときも、これで見直して一回でうまく組み合わせ・手順にまとめ直すこともできるでしょう。

# rpm -qa --last

実行すると、現在インストールされているパッケージ全てと、それらがインストール（or アップデート）された時刻が下記のように表示されます。作業者がやる前から入っていたのかどうかの判断材料になるでしょう。

```
[vagrant@repo ~]$ rpm -qa --last
unzip-6.0-2.el6_6.x86_64                      2015年11月13日 13時54分15秒
gpg-pubkey-c105b9de-4e0fd3a3                  2015年11月13日 13時54分04秒
mlocate-0.22.2-4.el6.x86_64                   2015年11月13日 13時46分19秒
libmemcached-0.31-1.1.el6.x86_64              2015年11月13日 13時46分18秒
libffi-devel-3.0.5-3.2.el6.x86_64             2015年11月13日 13時46分18秒
sqlite-devel-3.6.20-1.el6.x86_64              2015年11月13日 13時46分17秒
libxml2-python-2.7.6-17.el6_6.1.x86_64        2015年11月13日 13時46分17秒
patch-2.6-6.el6.x86_64                        2015年11月13日 13時46分16秒
libselinux-utils-2.0.94-5.8.el6.x86_64        2015年11月13日 13時46分16秒
```

また、`rpm -q <パッケージ名> --last` で、対象をそのパッケージに限定できます。

```
[vagrant@repo ~]$ rpm -q unzip --last
unzip-6.0-2.el6_6.x86_64
```

インストールされていないときは、こんな感じです。

```
[vagrant@repo ~]$ rpm -q wget --last
パッケージ                                         wget はインストールされていません。
```
AppleDeveloperProgramの更新(または購入?)の決済を現金で行う、更新期限を延長してもらう

# 事の発端
- AppleDeveloperProgramの年間費用12,744円(※税込み ※2015年11月現在)の更新や新規登録料について
- 諸事情によりクレカがすぐに用意できない場合など、現金で支払いをしたい場合
- 更新期限が迫っている場合、1週間伸ばしてもらえる(下記参照)
- Appleの対応があまりに神対応すぎたのと、Tipsがあまり多くなかったので備忘録として残す

# 結論から
- AppleDeveloperProgramの年間費用は基本クレカ決済だが、現金でも可能
- おおよそ3日営業日かかる(購入、支払い、郵送、購入まで)
- 現金と言っても、中身はその金額分(12,744円)の「Appleギフトカード」を購入し、自宅に郵送してもらい、記載のコードをAppleOnlineStoreにて入力することで可能にする
- 現金決済は「銀行振込」か、「コンビニ決済」のいずれか ※筆者はファミリーマートにて行った
- 更新期限がギリギリの場合は、まず更新期限の延長から行うと良い
- Appleギフトカードの購入方法は以下参照

# 更新期限を延長してもらう
- AppleDeveloperCenterに電話する
    - 問い合わせ先：0120-933-388(日本語／英語)
    - 営業時間：月〜金 9:00〜17:00
- 1週間だけ、更新期限を伸ばすことが可能

# Appleギフトカードの現金購入
- AppleOnlineStoreに電話する
    - 問い合わせ先：0120-993-993(日本語)
- AppleDeveloperProgramの更新料(または購入料)を諸事情で現金払いしたいので、Appleギフトカードを更新料分だけ購入したいと伝える
- 「AppleID」「氏名」」「電話番号」「住所」を伝えると、AppleIDのメールアドレスに購入手順のメール等を送って頂ける
- 現金決済は「銀行振込」か、「コンビニ決済」のいずれかを伝える
- 送られたメールに沿って支払いを行う (AppleOnlineStoreでの購入履歴のメールも来る)

# 最後に
- そもそも更新ギリギリでなんとかしようとするのが良くないので、2度としないように余裕をもって更新したい
- Appleのカスタマーサポートのすばらしさを実感
Views RSSでpubDateのdateformatを英語で扱う

マルチリンガルのサイトでViewsモジュールの日付を扱うときにどうしても翻訳されてしまうので調べたときのメモ。


## 前提

- マルチリンガルサイト
- urlのプリフィクスを見て言語を切り替える
    - en なら英語
    - ja なら日本語
- Viewsモジュール内での話
- Views RSSを使ってRSSを出力
- RSSのpubdateのdateformatとして[RFC 822](http://www.rssboard.org/rss-profile#data-types-datetime)を満たしている必要がある

Wordpressのようにカテゴリ毎っぽくRSSを出力させようとするとViews RSSとかが使いたくなる。そこまでは良いんだけど、非英語環境だとRSSのpubDateの日付出力が翻訳されてしまって困る。



```
<pubDate>Fri, 13 Nov 2015 16:16:47 +0900</pubDate>
↑こうして欲しいけど　↓こう出力される的な
<pubDate>金, 13 11月 2015 16:16:47 +0900</pubDate>
```

## 解決方法

そこで、カスタムフォーマットを選択して`r`を入力する。記法はphpのdate関数に則る。
![News (Content) | gk001 2015-11-15 22-05-04.png](https://qiita-image-store.s3.amazonaws.com/0/4319/c8d815d2-0e79-f024-3332-f24e5845d603.png)



[PHP: date - Manual](http://php.net/manual/ja/function.date.php)
[PHP: DateTime - Manual](http://php.net/manual/ja/class.datetime.php)
[RFC 2822 - Internet Message Format (RFC2822)](http://www.faqs.org/rfcs/rfc2822.html)

厳密には`r`はRFC 2822だから違うんだけど出力結果としては欲しいものが得られたのでとりあえず良しとした。
keynote powerpoint共通 一旦スライドを黒くする

本日はコーディング以外のネタ。

keynoteやpowerpointを使ってプレゼンする時に、スピーカーに注目を集めるためスライド表示を一旦切って真っ暗にしたい時があります。

それ、プレゼン中に以下のキークリックで簡単に実現できます。

B ... 画面を真っ暗にする
W ... 画面を真っ白にする

なにかキーをクリックすれば元に戻ります。
実は今日まで知りませんでしたが、スライドを消すことはかなり有効なテクニックです。

ぜひお試しあれ！
複数のActivityをスタックさせて通知する、Notifiationの通知から削除まで

プッシュ通知はアプリを起動してもらうための、良いソリューション。
通信しないアプリでも、たまに通知を（うざったくならない程度に）出してあげて、アプリを使ってもらいたいものです。
ここでは、通知を出すところから、アプリ側で削除するところまでの一連の流れについて、基本的な部分を抑えておきたいと思います。

# 通知を出す

## 手順

通知を出ときに必要なものは、**Intent**、**PendingIntent**、**Notification**、**NotificationManager**の4つです。

ざっくりとした流れは、

1. 通知をタップした時に実行したいActivityのIntent（A）を作る
2. PendingIntent（B）に、Intent（A）を登録
3. Notification（C）にPendingIntent（B）をContentIntentとして登録
4. システムサービスからNotificationManager（D）を取得
5. NotificationManager（D）からNotification（C）を通知する

こんな流れです。
これを、タイマーやカレンダーのレシーバーに置くなどすることで、通知することができるようになります。

### 簡単な実装例

```java:通知の実装例
// 起動するIntentを作成
// フラグは、これまで実行していたアプリの画面遷移はクリアして新規でアプリを開始するという意味
Intent intent = new Intent(context, MyActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_CLEAR_TASK);

// PendingIntentにIntentを登録
// 最後のフラグは、新しい通知が来た時に、内容を新しいもので更新するというフラグ（通知を追加しない）
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);

// Notificationを作成（ここではAppCompatの方を使用）
NotificationCompat.Builder builder = new NotificationCompat.Builder(context);
builder.setContentIntent(pendingIntent);
builder.setTicker(/* お知らせのティッカー（通知バーに表示される）*/);
builder.setSmallIcon(/* 通知バーに表示するアイコン */);
builder.setContentTitle(/* 通知のタイトル */);
builder.setContentText(/* 通知領域で表示するメッセージ */);
builder.setLargeIcon(/* 通知領域で表示する大きいアイコン */);
builder.setDefaults(/*  */Notification.DEFAULT_LIGHTS | Notification.DEFAULT_VIBRATE | Notification.DEFAULT_SOUND); /* 通知のしかた設定 */
builder.setAutoCancel(true); /* 「通知を削除」で消せるようにする */

// NotificationManagerを取得
NotificationManager manager = (NotificationManager) context.getSystemService(Service.NOTIFICATION_SERVICE);

// NotificationManagerから、Notificationを通知
manager.notify(1, builder.build());
```

# Activityをスタックさせて通知する

NotificationからActivityを起動した後、**バックボタンを押すと、そのタスク（アプリ）は終了**します。
できれば、**そのままアプリに留まって欲しい**ですよね。
もしそのアプリが、ホーム画面 -> お知らせ画面という画面遷移を持っているならなおさら。
通知からお知らせ画面を起動し、バックボタンを押したら、ホーム画面に戻るはずです。
ここでは、**Activityをスタックさせて、起動する**方法を簡単に一つ紹介します。

### 実装例

上の実装例と異なるのは、Intentの配列をPendingIntentに渡しているところです。

```java:Notification
// 起動するIntentを作成
Intent notificationIntent = new Intent(context, InformationActivity.class);
Intent homeIntent = new Intent(context, HomeActivity.class);
homeIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_CLEAR_TASK);

// Intentの配列を作成。スタックする順で記述
Intent[] intents = {homeIntent, notificationIntent};

// PendingIntentにIntentの配列を登録
PendingIntent contentIntent = PendingIntent.getActivities(context, 0, intents, PendingIntent.FLAG_UPDATE_CURRENT);
```

# 通知の削除

最後は、アプリから通知を削除する方法です。もちろん、通知をタップしたら通知は削除されます。
しかし、例えば、アプリ実行中に通知が届き、お知らせ画面に自ら見に行ったなどしたら、通知は削除されるのが気持ち良いですね。

### 実装例

```java:通知にひとてま
// 通知するときに、タグを付けておくといいかも
// notify(String tag, int id, Notification notification)
manager.notify("MyApplication", 0, notification);
```

```java:通知の削除
// 通知の削除
NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
// cancel(String tag, int id)
manager.cancel("myApplication", 0);
```

これで通知は完成！
Pythonテクニック

# Pythonテクニック
## flatten
`[item for sublist in l for item in sublist]`
http://stackoverflow.com/questions/952914/making-a-flat-list-out-of-list-of-lists-in-python

## 連想配列の中に入れ子
`defaultdict(list)`
http://stackoverflow.com/questions/10664856/make-dictionary-with-duplicate-keys-in-python

## 集合の集合をunion()
`set().union(*list)`
http://stackoverflow.com/questions/2151517/pythonic-way-to-create-union-of-all-values-contained-in-multiple-lists
wineでoffice2007を動かす

* wineはoffice2007,2010の32bit版に対応している様子。

## インストール

```bash:i386をインストールすること
sudo dpkg --add-architecture i386
sudo apt-get update
```

```
sudo apt-get install -y wine1.6-i386
```

## 初回起動

```bash:起動して閉じる
WINEARCH=win32 WINEPREFIX=~/wine32_mso2007 winecfg
```

```bash:office2007のCDに移動しsetup.exe実行
WINEPREFIX=~/wine32_mso2007 wine setup.exe
```

```bash:~/.bashrc
OPATH="~/wine32_mso2007/drive_c/Program\ Files/Microsoft\ Office/Office12"
WINERUN="WINEPREFIX=~/wine32_mso2007 wine"

alias excel="$WINERUN $OPATH/EXCEL.EXE 2>/dev/null"
alias winword="$WINERUN $OPATH/WINWORD.EXE 2>/dev/null"
alias powerpnt="$WINERUN $OPATH/POWERPNT.EXE 2>/dev/null"
alias visio="$WINERUN $OPATH/VISIO.EXE 2>/dev/null"
```

## フォントのズレを治す

* ~/.fonts/msgothic.ttc
* ~/.fonts/msmincho.ttc

を用意し、`fc-cache`を実行

```diff:~/wine32_mso2007/user.reg
- "MS Gothic"="Ume Gothic"
- "MS Mincho"="Ume Mincho"
- "MS PGothic"="Ume P Gothic"
- "MS PMincho"="Ume P Mincho"
- "MS UI Gothic"="Ume UI Gothic"
+ "MS Gothic"="MS Gothic"
+ "MS Mincho"="MS Mincho"
+ "MS PGothic"="MS P Gothic"
+ "MS PMincho"="MS P Mincho"
+ "MS UI Gothic"="MS UI Gothic"
```
<form> を使わないでリンクにパラメータを与える

複数選択のチェックボックスの場合、hrefのパラメータを追加していくと "," 区切りになるのを解消。もっとスマートなやり方があると思うけどJQueryとかそこら辺は苦手すぎるのでした。


```
<input type="checkbox" name="selectword" class="formlink" value="&Id99">
<input type="checkbox" name="selectword" class="formlink" value="&Id999">

<a href="#" class="selectsend"><button class="send">検索</button></a>

```

```split-insert.js
$('.formlink').click(function() {
    var checkedvalue = [];
    var urlObject = "search_result.html&selectionNum=";
    $('[name="selectword"]:checked').each(function(){
    checkedvalue.push($(this).val());

    S = urlObject + checkedvalue;
    splitvalue = S.split(",").join("")
    $(".selectsend").attr("href", splitvalue);

});
});
```

チェックボックスをチェックするとa hrefの中に、
search_result.html&selectionNum=&Id99&Id999などとパラメータが増えます。

使いみち？　うーんそれはわかりません。

value を動的に挿入するなら、

```
$(".formlink").attr("value", "&Id99");
```

みたいなことも。
Railsのselect_tagで選択時のイベントを検知して値を拾う

Rails初心者の私が試行錯誤しながら簡単なツールを開発中。
何から何まで分からないので、色んな所で詰まる。まず初歩の初歩でつまずいたこと。

```select_tag``` を使ったときに、選択が変更された時のイベントと値を拾いたかった。

とりあえず以下のコードで拾うことが出来た。

erbのファイルが以下

```rb
<%= form_tag(:name, :Label) %>
  <%= select_tag(:selected_value, options_for_select(['aaa', 'bbb', 'ccc'], class: 'select_action') %>
<% end %>
```

続いてCoffeeScript

```coffeescript
$ ->
  do ->
    onChangeEvent= ->
      value = $(".select-action option:selected").text();
      alert(value)
 
    $('.select_action').on
      'change': onChangeEvent
```

これで、選択時のイベントとともにValueが取れるようになった。
phpでコード中のボトルネックをさくっと見つける

コード中、処理時間がかかってる箇所を探す関数です。
コード中にちりばめれば、どの行間で時間かかってるか確認できます。

```php:def.php

function debug_time(){

	$debug = current(debug_backtrace());

	static $start_time = 0;
	static $pre_debug = null;
	static $pre_time = 0;

	$time = microtime(true);
	if(!$start_time) $start_time = $time;

	if($pre_time){
		echo sprintf('<div>[%s(%d) - %s(%d)]: %d ms(ttl:%d ms)</div>', 
			basename($pre_debug['file']), $pre_debug['line'],
			basename($debug['file']), $debug['line'],
			($time * 1000 - $pre_time * 1000),
			($time * 1000 - $start_time * 1000)
		);
	}

	$pre_debug = $debug;
	$pre_time = $time;
}

```


```php:hoge.php

debug_time();//何も考えずコード全体にコピペしまくる

//なんらかの処理
for($i = 0; $i < 100; $i++) some_function1();

debug_time();

//なんらかの処理
for($i = 0; $i < 100; $i++) some_function2();

debug_time();

//なんらかの処理
for($i = 0; $i < 100; $i++) some_function3();

debug_time();


```

```php:result

[hoge.php(1) - hoge.php(5)]: 200 ms(ttl:200 ms) //hoge.phpの1行目から5行目に200msかかった。累計200ms
[hoge.php(5) - hoge.php(10)]: 800 ms(ttl:1000 ms) //hoge.phpの5行目から10行目に800msかかった。累計1000ms
[hoge.php(10) - hoge.php(15)]: 100 ms(ttl:1100 ms)//hoge.phpの10行目から15行目に100msかかった。累計1100ms
```

つまり5行目から10行目の処理に改善が必要とわかります。
異なるファイルにまたがってもOKです。
sockfdとrecv

```cpp:a.cpp

int send_recv_msg(int sockfd, std::string sendmsg, std::string &recvmsg) {
    recvmsg = "";
    if (send(sockfd, sendmsg.c_str(), sendmsg.size(), MSG_NOSIGNAL) == -1) {
        syslog(LOG_INFO, "send fail. %s", strerror(errno));
        return 1;
    }
    fd_set read_set_master;
    FD_ZERO(&read_set_master);
    FD_SET(sockfd, &read_set_master);
    struct timeval waitval;
    waitval.tv_sec = 10;
    waitval.tv_usec = 0;
    fd_set read_set;
    memcpy(&read_set, &read_set_master, sizeof(read_set_master));
    int r = select(sockfd + 1, &read_set, nullptr, nullptr, &waitval);
    if (r == 0) {
        syslog(LOG_INFO, "select timeout.");
        return 1;
    } else if (r < 0) {
        syslog(LOG_INFO, "select fail. %s", strerror(errno));
        return 1;
    } else if (FD_ISSET(sockfd, &read_set)) {
        int non_recv_count = 0;
        while (1) {
            char buf[4096] = "";
            ssize_t ret = recv(sockfd, buf, 4096, 0);
            if (ret == 0) {
                ++non_recv_count;
                if (non_recv_count > 3) {
                    // 3回連続でrecvの結果が0なら、もうデータは無い、で良いかな・・・。
                    //syslog(LOG_INFO, "non recv data. recv end.");
                    return 0;
                }
            } else if (ret < 0) {
                syslog(LOG_INFO, "recv fail. %s", strerror(errno));
                return 1;
            } else {
                // データ受信できたが、まだデータが続くかもしれない・・・。
                non_recv_count = 0;
                buf[ret] = '\0';
                recvmsg += buf;
                waitval.tv_sec = 0;
                waitval.tv_usec = 0;
            }
            waitval.tv_sec = 0;
            waitval.tv_usec = 100000; // 100000usec = 100msec待ってみる・・・。
            memcpy(&read_set, &read_set_master, sizeof(read_set_master));
            // まだ読める状態かを見る。もし読めるようなら、続けて読む。
            r = select(sockfd + 1, &read_set, nullptr, nullptr, &waitval);
            if (r > 0 && FD_ISSET(sockfd, &read_set)) {
                // もう1回読み込む
            } else {
                // もう読める内容が無さそう。
                //syslog(LOG_INFO, "select timeout. recv end.");
                return 0;
            }
        }
    }
    // 知らないfd?
    syslog(LOG_INFO, "unknown sockfd hit.");
    return 1;
}

```

ソケットで、sockfdからデータを読む場合に、
何か決まったルールで文字列をやり取りするなら良いけど、
特に決まったルールが無く、汎用的に、相手が送ってきただろう、
すべてのデータをスマートに読み込む方法を模索中・・・。

結局答えは出ずに（相手がいかなる理由で残りのデータを送ってこなくなるか不明なので）、
ある程度待って、継続するデータが来ないならやめてしまう、、、しか無いかな・・・。
うーん。
フィボナッチを求める回路をVHDLとMessagePack-RPCでFPGAに実装してみた(シミュレーション編)

#はじめに
[フィボナッチを求める回路をVHDLとMessagePack-RPCでFPGAに実装してみた(ZYNQ編)](http://qiita.com/ikwzm/items/0d608ace0e9a9a872a0b)で作ったFibnacci_Server をVivadoを使って単体でシミュレーションする方法について示します。

#用意するもの

 - Xilinx Vivado 2015.3
 - Ruby 1.9.3 以降
 - [Dummy_Plug 1.6.0](https://github.com/ikwzm/Dummy_Plug)

Dummy_Plug は AXI4/AXI4-Stream のBFM(バスファンクションモデル)ライブラリです。

#ブロック図

![akgeo2.jpg](https://qiita-image-store.s3.amazonaws.com/0/24981/d9802aeb-3dc3-1f7e-daf5-b2a3d070fbdf.jpeg)

AXI4_Stream_Master_Player、AXI4_Stream_Slave_PlayerはYAML形式のシナリオファイルを読み込んでAXI4-Stream I/F信号の入出力を行うためのDummy_Plugライブラリのコンポーネントです。

#手順

##リポジトリと各submodule をダウンロード

````
shell% git clone git://github.com/ikwzm/msgpack-vhdl-examples.git
shell% cd msgpack-vhdl-examples
shell% git submodule init
shell% git submodule update
````

##テストシナリオの作成

AXI4_Stream_Master_PlayerおよびAXI4_Stream_Slave_Player用のテストシナリオを作ります。

````
shell% cd examples/fibonacci/src/test/scenarios
shell% ruby test_1.rb
````

test_1.rb はテストシナリオ(YAML形式)を生成するためのrubyスクリプトです。


##Vivado プロジェクトの作成

Vivado プロジェクトを作成するためのTclファイル(create_project.tcl)を用意しています。
Vivadoを起動して次のメニューからTclファイルを実行してください。

````
Vivado > Tools > Run Tcl Script... > examples/fibonacci/sim/vivado/vhdl/create_project.tcl
````


##シミュレーションを実行

Vivado プロジェクトを開き、次のようにシミュレーションを実行してください。

````
Vivado > Flow > Run Simulation > Run Behavioral Simulation
````

参考までに、実行したときに波形の一部を以下に示します。

![fibonacci_vhdl.jpg](https://qiita-image-store.s3.amazonaws.com/0/24981/f96e78d6-5e91-32d0-e98b-22cdd33e82f8.jpeg)

クロックの周波数は100MHzです。
fib(42)を実行するのに、MessagePack-RPCのシリアライズとデシリアライズを含めないFIB単体では430nsec((42+1)×10nsec)、MessagePack-RPCのシリアライズとデシリアライズを含めて650nsec(420nsec+13×10nsec)、かかっていることがわかります。

#参照

[MessagePack for VHDL (https://github.com/ikwzm/msgpack-vhdl)](https://github.com/ikwzm/msgpack-vhdl)
[MessagePack for VHDL Examples (https://github.com/ikwzm/msgpack-vhdl-examples)](https://github.com/ikwzm/msgpack-vhdl-examples)
[MessagePack-RPCを使ってFPGAを制御](http://qiita.com/ikwzm/items/2644c6e50a7049c75d49)
[フィボナッチを求める回路をVHDLとMessagePack-RPCでFPGAに実装してみた(ZYNQ編)](http://qiita.com/ikwzm/items/0d608ace0e9a9a872a0b)
apt-cygって色々forkされてるみたい。私はこれ使ってます。


# 概要
あまり検証していないので投げっぱなしの内容となりますが、
apt-cygって色々forkされていてよくわからないね、とりあえず私はこれ使っています、っていう話を綴ります。


# apt-cygって？
CentOSで言うところのyumみたいなやつ。
パッケージのインストールとかが簡単にできるよ！

# 色々なfork
ちょっとググってみたら分かり易いページがありました。

- [apt-cyg - PIB](http://seesaawiki.jp/w/kou1okada/d/apt-cyg) (http://seesaawiki.jp/w/kou1okada/d/apt-cyg)

ここにあるだけでも12種類？もあるみたい。

# 私はこれ使ってます

特に厳選してコレって決めたわけではなく、
適当にチョイスして動かなかったら次！次！ってとっかえひっかえした結果、
今はコレ使ってます。

- [svn2github/apt-cyg](https://github.com/svn2github/apt-cyg) (https://github.com/svn2github/apt-cyg)

で、343行目辺りの、チェックサムの方法を md5sum -> sha512sum にしているよ。


# 導入方法

多分どれも同じ手順で使えると思います。

1. まずはダウンロード
`$ wget お好きなリポジトリ/apt-cyg`
<br>

2. /usr/binに移動
`$ mv apt-cyg /usr/bin`
<br>

3. 権限を変更
`$ chmod 755 /usr/bin/apt-cyg`

とっても簡単ね！
[ chef ]data_bagsの書き方と取り出し方その2(配列パターン)

##1. data_bags

```json:data_bags/sample/sample002.json
{
    "id":"sample002",
    "samplekey02":[
        "value001",
        "value002",
        "value003",
        "value004",
        "value005"
    ],

    (...中略)

}
```

`key(i.e."samplekey02")`にひもづく配列を格納する。この場合は`[]`で配列の要素を囲む。


##2. recipe
```ruby:recipe/sample.rb
array_item = data_bag_item('sample','sample002')['samplekey02']
tmp_array << array_item
```

例えばこのように配列ごと`data_bags`から取り出して、別の配列`tmp_array`に追加することができる。
またはeach文で繰り返し処理などでも使える。
Rails, React, Redux環境を用意してherokuで動くようにするまで手順メモ

Railsなのはサクサク書けるから、Reduxなのは流行ってるっぽいからです。
サーバーサイドレンダリングもスパンと導入したいので`react-rails`gemを使った簡単バージョンです。Reduxも使うので`react-rails`だけだと困るから`browserify-rails`使おうかという流れです。

では早速、Railsのプロジェクトを用意します。

```
rails new rrrproject
cd rrrproject
```

`Gemfile`に以下を追記します。

```
gem 'browserify-rails'
gem 'react-rails'
```

おもむろにインストールします。

```
bundle install
```

`config/application.rb`にbrowserify用の設定を加えます。

```
config.browserify_rails.commandline_options = '-t babelify'
```

npmで関連パッケージを豪快にインストールします。
何故すべて`--save`なのかはherokuで動かすためです。`--save-dev`だとherokuデプロイ時にインストールしてもらえれませんでした。

```
npm install --save react redux react-dom react-redux redux-thunk browserify browserify-incremental babelify babel-preset-es2015 babel-preset-react
```

`browserify-incremental`はbrowserify-railsで必要なものです。
また、今何も考えずに実行するともれなくbabel6系が入ると思います。babel6系はプラガブルに機能分割されているので今回使いたい`babel-preset-es2015`と`babel-preset-react`を合わせて入れます。自分、ここで詰まりました。

で、色々インストールが完了したと思うので、reactのcomponentを作っていきましょう。

```
rails g react:install
```

ディレクトリとjsファイルが作られます。

`app/assets/javascripts/components/`以下に、componentを追加して、`app/assets/javascripts/components.js`でglobalにぶら下げる感じです。

`application.js`には以下を追加しておきます。reactはbrowserifyから呼びます。

```
//= require react_ujs
//= require components
```

あとプロジェクトルートに`.babelrc`を追加します。このプラグインを使ってくれよ、お願いだから、という指定です。

```bash:.babelrc
{
  "presets": ["es2015", "react"]
}
```
 
今回は環境構築なので、実際のredux, reactのコードは割愛します。
確認したい場合はreduxの[example](https://github.com/rackt/redux/tree/master/examples/counter)などを持ってくると良いと思います。

上手くいってればここまでで、`rails s`出来ると思います。
以下のようなヘルパーを使えば、サーバーサイドレンダリングも確認できるでしょう。

```
<%= react_component('App') %>
```

それでは、次にherokuの準備です。

```
heroku create
heroku buildpacks:set heroku/ruby
heroku buildpacks:add --index 1 heroku/nodejs
```

nodeを使いたいからnodeとrubyのmulti buildpacksにしています。
以上です！エンジョイ！です。

サーバーサイドもGoやらelixirやらだとモダンさ３倍増しだと思うんですが、悩んで結局Railsの書きやすさ、ライブラリの多さにクラっときました。

#### ありがたや参考URL

http://astainforth.com/blogs/setting-up-react-in-ruby-on-rails-part-1
http://qiita.com/suzan2go/items/24ef3320e04b8a84597f
http://qiita.com/sawapi/items/e11d0cfbbacd078b2c3a
Proxy環境下でのDockerbuildをするためにやること

Docker Engine 1.9 からです。

Proxy配下にいると、build時にproxyを通らないとapt-getもyumも通りません。
かと言って、これに毎回 `ENV http_proxy=XXX` ってのを書き続けるのも心が折れます。

下記のようにしておくと、様々な環境下で動いてくれるので平和な気持ちでいられます。

```docker
ARG http_proxy
ARG https_proxy

ENV http_proxy=${http_proxy}
ENV https_proxy=${https_proxy}
```

で、build時に下記のようにコマンドを打ちます

```bash
% docker build --rm -t hoge \
  --build-arg http_proxy=${http_proxy} \
  --build-arg https_proxy=${https_proxy} .
```

きちんとproxyに渡って行きます！

平和！
AndroidのActionBarにメニューが表示されない！

"invalidateOptionsMenu" is your friend.

AlloyではActionBarにメニューボタンを設置することができます。

```xml
<Alloy>
  <Window title="素敵なアプリ">
    <LeftNavButton platform="ios">
      <Button id="closer" onClick="closeWindow">閉じる</Button>
    </LeftNavButton>
    <RightNavButton platform="ios">
      <Button id="closer" onClick="openEditWindow">編集</Button>
    </RightNavButton>
    <ActionBar id="actionbar" title="素敵なアプリ" platform="android" />
      <Menu platform="android">
        <MenuItem id="scanner" title="閉じる" onClick="closeWindow" />
        <MenuItem id="scanner" title="編集" onClick="openEditWindow" />
      </Menu>
<!--以下略-->
```

これで問題なく動作するケースがほとんどなのですが、時々、いやもうこれが本当に困っちゃうんですけど、時々ちゃんと動かないことがあります。

そんな時は、深追いせずに

```js
$.index.addEventListener('open', function(e){
  if(OS_ANDROID){
    var activity = $.index.getActivity();
    if(activity){
      activity.invalidateOptionsMenu();
    }
  }
});
```

「invalidateOptionsMenu」で再描画させることができます。

これを応用すると、動的にメニューを作成・編集することもできます。

[How to access Android Actionbar's Menu in Titanium Alloy](http://stackoverflow.com/questions/31752632/how-to-access-android-actionbars-menu-in-titanium-alloy/33492170#33492170)
Unity 5.2.2fでiOS版をビルドすると実行時にEXC_BAD_ACCESSでクラッシュする

# 症状
Unity 5.2.2f で作成したアプリが Android だと問題なく動くのに、iOSだと起動した瞬間にクラッシュしてしまう。エラーログには **EXC_BAD_ACCESS** と出る。

# 解決法
Unity のバージョンをUnity 5.3（現時点ではベータのみ）に上げるか、5.1に下げる。
（詳細なバージョンについて後述）

# 詳細
Unity 5.2.2f で作成したアプリを Unity Cloud Build で バージョン5.2.2f を指定してビルドし、iOS 9.1（iPhone/iPad）で実行したところ、起動直後にクラッシュする症状に遭遇しました。
Cloud Build の問題の可能性もあるので、念のためローカルでビルドしても、やはり同様の症状でした。

～そして半日ほど色々試した結果～

5.1.1fに下げると解決するという話をどこかの英語のフォーラム（URL失念）で見た気がしたので試してみたところ、クラッシュしないようになりました。5.1系はもう少し新しいバージョンがあるので、5.1.1fまで古くする必要はないかもしれません。

また、より新しいバージョンである 5.3.0b6 でビルドしてみたところ、こちらも問題なく動作するようでした。5.3系ではまだ安定版は出ていませんが、古くするよりはマシかなと思うので、今後はこちらでビルドするようにしたいと思います。

ちなみにクラッシュしてしまうアプリではUNETを使用しているので、そのあたりの問題かもしれません。
importlib を使った横着

ユーザのデータを取り出して別のDBにimportする機能を実装した際に、

「新しいユーザデータのexport/importが必要になるたびにimport側の処理でcreateの処理を書くのが面倒だな」

と思ったので、こんな横着をしてみました。

# ユーザデータのExport
```lang:module/hoge/user_hoge.py
class UserHoge()
```
このデータをexport/importするとします。

```
user_hoges = UserHoge.all()
```
とかでユーザデータを取得した後、jsonファイルを作成（jsonでなくてもいいんですが）するんですが、その際に

```
'class_path': 'module.hoge.user_hoge.UserHoge'
```
というのをjsonに追加しておきます。

# ユーザデータのImport
jsonファイルを読み込んだ後、ユーザデータをcreateする訳ですが、通常だと

```
from module.user_hoge.hoge import UserHoge

for user_hoge_data in user_hoge_datas:
  UserHoge.objects.create(user_hoge_data)
```
と実装します（bulk_createするべきですが）。

しかし、運用後、新たにUserFooクラスができて、このデータもexport/importしたい、ってなったときにimportやcreate文が追加される訳で、これが嫌でした。

# importlib の登場
新しくデータが欲しくなるたびに行が追加されて行くのは嫌だなと思ったので、そんなときは importlib を使って下記のような処理を用意しておきます

```
import importlib

def userdata_create(user_datas, json_data):
    class_path = json_data['class_path']
    class_split_list = class_path_str.split(".")
    module_path = ".".join(class_split_list[:-1])
    class_str = class_data[-1]
    module = importlib.import_module(module_path)
    Klass = getattr(module, class_str)

    for user_data in user_datas:
        Klass.objects.create(user_data)
```
こうすると、必要なユーザデータが追加されるたびにimportやcreate文を書かなくても良くなり、ちょっと楽ができます。
特定のActiveRecordインスタンスにValidationを追加する

特定のActiveRecordインスタンスにValidationを追加する

## どんなときに使う
* 特定の場合のみコスト高めのチェック処理をしたい場合
* ↑によってより親切なエラーメッセージを表示したい場合

## やり方
```ruby:app/controler/hoge_controller.rb
class HogeController < ApplicationController
  # ...
  def create
    user = User.new(permit_params)
    @user.singleton_class.validate :validate_foobar
    user.save! # ちゃんとvalidate_foobarが実行される
  end
  # ...
end
```

```ruby:app/models/user.rb
class User < ActiveRecord::Base
  # validates :validate_foobar は記述しない
  # ...
  def validate_foobar
    # something
  end
  # ...
end
```

## 参考
* [active recordでvalidation前にerrors.addしていてもvalid?の結果がfalseにならない](
http://qiita.com/takady/items/c0c57001026313791833)
* [How to add validations to a specific instance of an active record object?](https://gist.github.com/thechrisoshow/2236521)
JavaScript 現在のページをリロードしたい

知らなかった....のでメモ


```js:hoge

// 現在表示されているページをリロードする
location.reload();

// 例: 5秒に一回リロード
setTimeout("location.reload()",5000);

/*
ブラウザの[更新]ボタンを押したときと同じ動作です。

location.reload(true)とするとWEBサーバのデータからリロード、 

location.reload(false)とするとキャッシュからリロード。
*/

```
ScalaのFutureでタイムアウトしたい時はAkkaを使う

非同期処理を書くときに[Future/Promiseパターン](https://ja.wikipedia.org/wiki/Future)は便利です。C++11とかEcmaScript6とか様々な言語に浸透した感があって、もちろんScalaにもあります。

さて、ScalaのFutureに後からタイムアウトを付けたい場合は、標準で[```Await.result[T](awaitable: Awaitable[T], atMost: Duration)```](http://www.scala-lang.org/api/2.11.7/index.html#scala.concurrent.Awaitable@result(atMost:scala.concurrent.duration.Duration)(implicitpermit:scala.concurrent.CanAwait):T)が用意されていて、複数のFutureを一斉に待ちあわせたい時はfor内包表記（yield使うやつ）で合成しておけば良さそうです。モナド……！
が、この合成は元のFutureが一つでも失敗すると全体的に失敗してしまうので、Futureそれぞれで成功したものは結果を取得したいし失敗したときはデフォルト値にしておきたい、といった場合だと単純には使えません。

で、どうするんだろうと思ったらやはり同様の質問があって、

- [scala - Run multiple futures in parallel, return default value on timeout - Stack Overflow](http://stackoverflow.com/questions/17466889/)

[Akka](http://akka.io/)ライブラリの```akka.pattern.after```を使う[回答](http://stackoverflow.com/a/17467769)があります。

```scala
implicit class FutureHelper[T](f: Future[T]) extends AnyVal{
  import akka.pattern.after
  def orDefault(t: Timeout, default: => T)(implicit system: ActorSystem): Future[T] = {
    val delayed = after(t.duration, system.scheduler)(Future.successful(default))
    Future firstCompletedOf Seq(f, delayed)
  }
}
```

implicit classなのでFutureから直接```orDefault```を呼びだせる（ように書ける）というわけですね。便利！
defaultが名前渡しなのは[```after[T](duration: FiniteDuration, using: Scheduler)(value: ⇒ Future[T])```](http://www.scala-lang.org/api/2.11.7/index.html#scala.concurrent.Future$@successful[T](result:T):scala.concurrent.Future[T])に合わせて、タイムアウト時をカウントする前にデフォルト値の評価時間を食わないためですね。

この手法の利点は解説記事があって、

- [Scala Futures with Timeout | Nami's Tech Blog.html](http://nami.me/2015/01/20/scala-futures-with-timeout/)
- [Scala Future Timeout Patterns](http://semberal.github.io/scala-future-timeout-patterns.html)

Akkaのドキュメントにも載っています。

- [Futures — Akka Documentation](http://doc.akka.io/docs/akka/snapshot/scala/futures.html#After)
python > Python 良い慣用句、悪い慣用句 > from utilxxx import *は危ない?

http://docs.python.jp/2/howto/doanddont.html

`from utilxxx import *`は使うのは危ないようだ。

一つ一つ関数をimportで指定するのがいいのだろうか?

関数を5つ程度定義した別ファイルをimportする時が面倒な気がする。


[github](https://github.com/yasokada/python-151113-lineMonitor/tree/master/toLearn)

```util1113b.py
def util1113_print_pi():
	print "3.141592"

def util1113_print_napier():
	print "2.718281828"

def util1113_print_eulerMascheroni():
	print "0.5772"
```

```151113b.py
from util1113b import util1113_print_pi, util1113_print_napier, util1113_print_eulerMascheroni

print "main"
util1113_print_pi()
util1113_print_napier()
util1113_print_eulerMascheroni()
```

```txt:結果
[toLearn]$ python 151113b.py 
main
3.141592
2.718281828
0.5772
```
Google Cloud Datalabのデプロイで403エラー発生時の対応

# はじめに

Google Cloud Datalabは大規模データの探索や分析、可視化ができるインタラクティブなツールです。
利用するためにはGAEが有効となっているプロジェクトが必要となります。

Datalabの詳しい情報や、DatalabをGAEにデプロイするためのリンクは以下にあります。

https://cloud.google.com/datalab/


# エラー内容

上記リンクより`CLOUD DATALABを起動`ボタンを押して、

![スクリーンショット 2015-11-13 12.26.17.png](https://qiita-image-store.s3.amazonaws.com/0/3676/8be40f1a-337d-8501-ef7b-55ed0b03bdf4.png)

デプロイ対象のプロジェクトを選択して`Deploy Datalab`ボタンを押すと、デプロイが行われます。

![スクリーンショット 2015-11-13 12.26.31.png](https://qiita-image-store.s3.amazonaws.com/0/3676/acfecf4b-9f17-27a9-f20b-6e2d01ddb060.png)

その後の画面でログが見れるようになるのですが、以下のエラーが発生してデプロイが失敗するケースがあります。

```
startupscript: Verifying that Managed VMs are enabled and ready.
startupscript: If this is your first deployment, this may take a while...#015If this is your first deployment, this may take a while...done.
startupscript: WARNING: If this is your first deployment, please try again.
startupscript: ERROR: (gcloud.preview.app.deploy) Server responded with code [403]:
startupscript:   Forbidden Unexpected HTTP status 403.
startupscript:   You do not have permission to modify this app (app_id=u's~xxxxxx').
startupscript: Step deploy datalab module failed.
```

デプロイする権限がない模様。一度発生する場合は、何度やっても失敗します。


# 対処方法

Stackoverflowの回答にかかれていた以下の手順で解決できました。

http://stackoverflow.com/questions/33583437/datalab-cloud-deployment-403-error 

1.Developer Consoleの権限ページを表示
https://console.developers.google.com/permissions/projectpermissions?project=xxxx
2. サービスアカウントの`-compute@developer.gserviceaccount.com`で終わるメアドのアカウントをコピー
3. 対象アカウントを削除
4. 再度対象アカウントを`編集可能`権限で追加
5. 数分待ってからDatalabのデプロイを実行

どうやらDeveloper ConsoleとAppEngineの権限が正しく共有されなくなっていたようです。
無事デプロイできるようになりました :smile:
python > import > 実装を別のファイルに持たせる

```txt:動作確認
CentOS 6.5
```

複数のファイルでの実装を行いたい。importというのを使うらしい。

参考 http://www.python-izm.com/contents/basis/import.shtml
参考 http://www.lifewithpython.com/2013/01/python-function-usage.html


[github](https://github.com/yasokada/python-151113-lineMonitor/tree/master/toLearn)

```util113a.py
def util1113_print():
	print "from util1113a"
```

```151113a.py
from util1113a import util1113_print

print "main"
util1113_print()
```

```txt:結果
[toLearn]$ python 151113a.py 
main
from util1113a
```
中国語の声調記号をEmacsで入力する

中国語の声調をEmacsで入力したかったので作りました。
https://github.com/ironsand/pinyin-mode

母音を入力した直後に0~4を入力すると声調記号がつきます。

```
ma0 -> ma
ma1 -> mā
ma2 -> má
ma3 -> mǎ
ma4 -> mà
```

わからない事だらけで書いたので改善の指摘は大歓迎です。
Stackoverflowで色々と教えてもらわなかったら、永遠にできなかったと思います。ありがとうございました！
Eclipseが"building workingspace"で固まって動かなくなった時の対処法

#Eclipseが起動できない
Eclipseを起動すると、building workingspaceで必ず止まる。
終了もできなくなるので、強制終了→起動→強制終了を繰り返したが状況は変わらず。

#解決法：Workspaceの自動ビルドをやめる
上記の状況でも環境設定は開けるので、
Eclipse > 環境設定 > General > Workspaceを開く
<img width="626" alt="スクリーンショット 2015-11-13 12.08.58.png" src="https://qiita-image-store.s3.amazonaws.com/0/78136/bf5b2297-24aa-c2cf-2615-78673e5ba1fb.png">

Build Automaticallyにチェックが入っているので、これを外す。

そして再起動すると普通に開ける。
office 2013 > カーソル移動時などのアニメーションを切る (Windows7)

```txt:動作確認
Windows 7Pro
```

## Windows7 + Office 2013

Office2013関連ソフト(OutlookやWordなど)を使用時に、カーソル移動に変なアニメーションがつくようになった。

OSがWindows7の時は以下でアニメーションを切ることができる。
参考 http://www.atmarkit.co.jp/ait/articles/1306/21/news070.html

1. コントロールパネル > 「コンピュータの簡単操作センター」>「コンピュータを画面なしで使用します」を選択
1. 時間制限と明滅画像を調整しますの項目「必要のないアニメーションは無効にします（可能な場合）（W)」にチェックを入れる
Qiitaって企業の非公式技術ブログとして、けっこう理想的だなって思った

弊社では非公式技術ブログとしてQiitaを使っています。この記事は企業の公式技術ブログとQiitaで各エンジニアが好き勝手に書いてる非公式技術ブログという観点で書いていきます。

# 公式技術ブログは書く機会の平等確保ができない
私は[クッ社の開発者ブログ](http://techlife.cookpad.com/)が大好物です。各記事の質が高く切り口も鋭いのでついつい読んでしまいます。企業の技術ブログとして成功事例と言えるのではないでしょうか。

企業が公式技術ブログを始める理由は知名度の向上、ブランディング、採用活動への寄与といった外向きの理由であることが多いです。目的達成のために技術ブログ運用を考えると社内外で評価が高いエンジニアに執筆依頼することになります。

数年前入社した時から自社公式技術ブログの存在を認識していましたが書かせてと言い出す勇気が最後まで出ませんでした。執筆段階を想像すると企業名をしょっているため下手な記事は書けませんし、レビュー依頼したりと大変そうです。公式技術ブログを運用して年月が立つと一部の花形エンジニアのみが執筆する構造になっていくと思います。それは知名度向上と採用活動への寄与という本来の目的がそもそも外向きなことや、技術ブログの効率的な運用を考えると仕方ないことです。一方で企業内に目を向けると、なんかもやもやするなーという私みたいなエンジニアがいたりします。


# 弊社でQiita利用が進んでいった事例
2-3人のエンジニアがQiitaを始めてこっそり楽しんでいました、その後社内の口コミで開設と相互フォローが徐々に進んでいきました。一部記事がバズったりしましたが平穏そのものでView数が100いけば良い方だよねと各エンジニアが楽しんでいました。

今年になって誰かがOrganizationを取得して口コミで張って回り非公式技術ブログが誕生しました。その後も大きな波風もなく各自好きなことを書いて淡々と継続しています。私がQiitaを継続している理由は承認要求である点が大きいのですが、始めた理由は好きなことを書いて良い点と会社が潰れた時に技術ブログがリクルートで有利になるだろうという下心からです。

自由に書いて良いんだけど、Organizationでゆるく社内の人と繋がっていてなかなか居心地が良いです。そんなエンジニアのニーズを上手く汲み取っているので企業の非公式技術ブログとして、けっこう理想的だなって思います。

# 【PR】弊社では12月にAdvent Calendar 2015を開催します。
ﾄﾞｳｿﾞﾖﾛｼｸ
http://qiita.com/advent-calendar/2015/gumi
windows > キー入力が遅くなった > 「フィルターキー機能を有効にする」にチェックが入っているかも

本日突然、「キー入力が遅くなった」という報告が数件入るようになった。

Windows Update関連でおかしなことになったのだろうか?

調べたが以下のようなものが見つかった。
http://blog.yamk.net/yamk/archives/1644

「フィルタ キー機能を有効にする」にチェックが入ると以下の動作になる (コントロールパネルの説明から抜粋)

> 速いキー入力または繰り返し入力されたキー入力は無視または減速して、キーボードのリポート間隔を調整します。

<hr>

Windows 7での設定の見方

1. コントロール パネル
2. コンピューターの簡単操作センター
3. キーボードを使いやすくします
4. フィルターキー機能を有効にします

の項目
jpcsc.jar を ARMv6 (Raspberry Pi) で使う

# 概要
非接触カードを扱うためのライブラリ `PC/SC` を Raspberry Pi 上で扱う．Java の実装に jpcsc.jar があるのでこれを使ったアプリケーション開発のための環境を整える．

# 環境
- Raspberry Pi Type-B
- Arch Linux
- Open JDK 8

# 手順
## pcscd を走らせる

```zsh
$ sudo pacman -S ccid opensc
$ sudo systemctl enable pcscd.service
$ sudo systemctl start pcsc.service
```

## /etc/udev/rules.d にカードリーダーを設定
`sudo` なしでカードリーダーにアクセスできるように，以下の設定をした方がいいという噂を聞いたことがある……．

```zsh:/etc/udev/rules.d/nfcdev.rules

# SONY RC-S330
SUBSYSTEM=="usb", ACTION=="add", ATTRS{idVendor}=="054c", ATTRS{idProduct}=="02e1", MODE="0664", GROUP="plugdev"
# I-O DATA USB2-NFC2
SUBSYSTEM=="usb", ACTION=="add", ATTRS{idVendor}=="23eb", ATTRS{idProduct}=="0002", MODE="0664", GROUP="plugdev"
```

```zsh
$ sudo udevadm control --reload-rules
$ lsusb
```

して認識されているか確認．


## jpcsc.jar を使って開発
- [jpcsc-0.8.0.jar](https://maven.clazzes.org/com/linuxnet/jpcsc/0.8.0/)
- [libjpcsc.so (ARMv6)](https://dl.dropboxusercontent.com/u/15722797/libjpcsc.so)

プロジェクトディレクトリの中に `lib` とかいうディレクトリを作ってその中に `jpcsc-0.8.0.jar` と `libjpcsc.so` を配置しておく．

```zsh
$ javac -cp ${PATH_TO_JPCSC.JAR} CLASS.java
$ java -cp ${CLASS_ROOT}:${PATH_TO_JPCSC.JAR} -Djava.library.path=${PATH_TO_LIB_DIR} CLASS
```

で OK．

ちなみに API doc は [ここ](https://github.com/tdierks/tageventor/tree/master/jpcsc) にある．

# 参考
- [いろいろつまみ食い - Rasberry piでfelica(edy/suica)を読む](http://d.hatena.ne.jp/imaiworks/201306)
- [アキバのアミュレット店員がやってみた - 一家に１台あると便利？お手軽Felicaカードリーダーシステム](http://www.amulet.co.jp/shop-blog/?p=5980)
- [Unable to establishContext() · Issue #3 · jnasmartcardio/jnasmartcardio](https://github.com/jnasmartcardio/jnasmartcardio/issues/3)
CircleCI上でDockerコンテナに入る方法

Dockerコンテナに入ってデバッグをしたいときが間々あります。（例: ログを見るとか）
通常は、 `docker exec -it <cotanier name> /bin/bash` のようにして入っているのですが、CircleCIでは `exec` が使えません。

https://circleci.com/docs/docker#docker-exec

リンク先のCircleCIの公式ドキュメントに書いてある通りなのですが、あまり頻度の高くないアクションなので、場所を忘れたりなんども調べたりしていたのでQiitaにメモとして残しておきます。

`sudo lxc-attach -n "$(docker inspect --format '{{.Id}}' $MY_CONTAINER_NAME)" -- bash -c $MY_COMMAND`
strftime() と strptime() を使ってtzinfo付きdatetime <-> stringの変換をやってみた

#環境
Python 2.7.10

#参考資料
[8.1. datetime — 基本的な日付型および時間型](http://docs.python.jp/2/library/datetime.html#strftime-strptime-behavior)

##strftimeを使ってtzinfoを保持したdatetime文字列を取得
```
>>> from datetime import datetime
>>> import pytz
>>> 
>>> jst = pytz.timezone('Japan')
>>> jst_datetime = datetime.now().replace(tzinfo=jst)
>>> print jst_datetime
2015-11-12 16:09:18.544266+09:00
>>> jst_datetime_str = datetime.strftime(jst_datetime, '%Y-%m-%d %H:%M:%S %z')
>>> print jst_datetime_str
2015-11-12 16:09:18 +0900
>>> datetime.strftime(jst_datetime, '%Y-%m-%d %H:%M:%S %Z')
'2015-11-12 16:09:18 JST'
```

tzinfo付きdatetime文字列を出力する事が出来る。


##strptimeを使ってdatetime文字列からtzinfo付きdatetimeを取得
```
>>> print jst_datetime_str
2015-11-12 16:09:18 +0900
>>> datetime.strptime(jst_datetime_str, '%Y-%m-%d %H:%M:%S %z')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/lib/python2.7/_strptime.py", line 317, in _strptime
    (bad_directive, format))
ValueError: 'z' is a bad directive in format '%Y-%m-%d %H:%M:%S %z'
>>> 
```

tzinfo付きdatetime文字列を使ってtimsezone付きdatetimeを取得しようとしたのだがエラー。
```
ValueError: 'z' is a bad directive in format '%Y-%m-%d %H:%M:%S %z'
```
'%z'指定子が悪いフォーマットだぞ的なエラーが発生する。


色々調べてみた結果
http://stackoverflow.com/questions/2609259/converting-string-to-datetime-object-in-python

python2.7では%zはサポートされていないよう。python3.2なら動くらしい。
バージョン変える事が出来ないので他の方法を試す


```
>>> jst_datetime_str = datetime.strftime(jst_datetime, '%Y-%m-%d %H:%M:%S %Z')
>>> print jst_datetime_str
2015-11-12 16:09:18 JST
>>> datetime.strptime(jst_datetime_str, '%Y-%m-%d %H:%M:%S %Z')
datetime.datetime(2015, 11, 12, 16, 9, 18)
```


%Zを使ってやってみたのだが、今度はエラーは発生しないもののtzinfoが付いてないdatetimeが出来てしまう。


他を探してみると
http://nekoya.github.io/blog/2013/06/21/python-datetime/

この人も、%Zを使ってだめだったので「replace(tzinfo=pytz.utc)」を使って設定しているようだ。
指定子を使用して変換するのはもう無理そうなので、ごり押しで対応してみた


```
>>> from datetime import datetime
>>> import pytz
>>> 
>>> jst = pytz.timezone('Japan')
>>> jst_datetime = datetime.now().replace(tzinfo=jst)
>>> print jst_datetime
2015-11-12 16:54:19.564920+09:00
>>> jst_datetime_str = datetime.strftime(jst_datetime, '%Y-%m-%d %H:%M:%S') + ' ' + jst_datetime.tzinfo.zone
>>> print jst_datetime_str
2015-11-12 16:54:19 Japan
>>> zone = jst_datetime_str.split(' ')[-1]
>>> print zone
Japan
>>> datetime_str = ' '.join(jst_datetime_str.split(' ')[:2])
>>> print datetime_str
2015-11-12 16:54:19
>>> datetime.strptime(datetime_str, '%Y-%m-%d %H:%M:%S').replace(tzinfo=pytz.timezone(zone))
datetime.datetime(2015, 11, 12, 16, 54, 19, tzinfo=<DstTzInfo 'Japan' JST+9:00:00 STD>)
```

こんな感じ。


#まとめ
・python2.7だとstrptimeで指定子 '%Z'と'%z'は使えない。
・ただ、strftimeでは正常に使える。
・後、確認はしてないがpython3.2だとstrptimeでも使えるようだ。
・正直相当無理矢理な感じだけど、他にいい方法ないのかな。
Ruby On Rails sitemap_generaterを使ってサイトマップの作成


## GEMのインストール

```
gem 'sitemap_generator'
```

## 設定ファイルの生成

```
rake sitemap:install
```

これで`config/sitemap.rb`が生成されるのでサイトマップに登録するURLを記載していきます

## 設定例

サイトマップの設定方法はドキュメントにだいたい全て書いてあります。
 kjvarga/sitemap_generator
 https://github.com/kjvarga/sitemap_generator#sitemap-configuration 

```config/sitemap.rb
# Set the host name for URL creation
# Defaults: :priority => 0.5, :changefreq => 'weekly',
#           :lastmod => Time.now, :host => default_host

SitemapGenerator::Sitemap.default_host = "http://www.pla-cole.wedding"

SitemapGenerator::Sitemap.create do
  current_time = Time.now

  # トップ画面
  add root_path, lastmod: current_time, changefreq: 'daily', priority: 1.0

  # 静的ページ
  static_page_options = { lastmod: current_time, changefreq: 'monthly', priority: 0.5 }
  add(sign_in_path, static_page_options)
  add(sign_up_path, static_page_options)
  add(policy_path, static_page_options)
  add(guide_path, static_page_options)
  add(faq_path, static_page_options)


  # 動的ページ
  dynamic_page_options = { changefreq: 'weekly', priority: 0.75 }

  # Hogeモデル詳細画面
  Hoge.only_opened.find_each do | hoge |
    add(hoge_path(hoge.id), dynamic_page_options.merge(lastmod: hoge.updated_at))
  end

  # Fuga詳細画面
  Fuga.find_each do | fuga |
    add(fuga_path(hall.id), dynamic_page_options.merge(lastmod: hall.updated_at))
  end
end

```

## XMLファイルの生成
 
 
```
./bin/rake sitemap:refresh
# 通知を行いたくない場合は下記
./bin/rake sitemap:refresh:no_ping
```


 参考

 https://www.suzukikenichi.com/blog/google%E3%82%B5%E3%82%A4%E3%83%88%E3%83%9E%E3%83%83%E3%83%97%E3%81%AB%E3%82%88%E3%81%8F%E3%81%82%E3%82%8B12%E3%81%AE%E8%B3%AA%E5%95%8F-%E5%89%8D%E7%B7%A8/


 http://benri-tools.net/contents.php?code=self_seo_sitemap
 
【Ruby, Rails】sitemap-generatorを使ってsitemapを作成。
http://shirusu-ni-tarazu.hatenablog.jp/entry/2012/10/09/013117 
 
 sitemap.xmlの記載方法と書式、設置する事で得られるメリット
 http://holy-seo.net/blog/seo/sitemap-sml-method-described-merit/

meta-tagsとsitemap_generatorで始めるRails 4.1時代のSEO対策
http://morizyun.github.io/blog/meta-tags-sitemap-generator-rails-seo/

Railsでサイトマップ(sitemap.xml)を作りたい
http://code.materializer.co/20

サイトマップのSEO効果と理想的な作成方法
http://bazubu.com/how-to-create-an-effective-site-map-26793.html