OmniAICreator/Qiita-1.07M huggingface dataset:
Pythonでロックファイルでの排他制御

pythonで簡単にプロセス間の排他制御がしたかったのでロックファイルによる実装を行いました。
尚、確認している環境は以下です。

- mac(OS X El Capitan バージョン 10.11.5）
- pip利用可能
- python 2.7.9

## 利用するもの

- zc.lockfile

指定した名称のロックファイルを作成し、排他制御をしてくれるライブラリ。
pidで管理されるので、ロックしたプロセスが終了した場合、closeしなくても排他状態が解放されるので例外が出ても扱いやすい。と思います。
以下で、いつものようにインストール

$ pip install zc.lockfile

## 利用例

特に意味はないですが、デコレータで実装。
ロック中の処理をちゃんとしたい場合（ログを出力するとか、待機するとか）には使えないです。
なにはともあれ排他制御したい人向け。

```python:lock.py
# -*- coding: utf-8 -*-
import sys
from zc import lockfile
from zc.lockfile import LockError


def lock_or_through(func):
    '''ロックファイルによる排他制御デコレータ
    ロックされている場合は処理自体をスルー
    '''
    def lock(*args, **kwargs):
        lock = None
        try:
            lock = lockfile.LockFile('lock')
        except LockError:
            print("locked")
            return

        func(*args, **kwargs)

        # 対象のpidが有効でなければロックされないので例外が出ても実質問題無し
        lock.close()

    return lock


@lock_or_through
def main(sys_argv):
    """ロックファイルで排他制御したい処理"""
    print('process you need')

if __name__ == '__main__':
    main(sys.argv)

```
MySQLからAuroraへ乗り換え

# 概要
手がけているサービスのコスト削減のため、AWS RDSのMySQLからAuroraへの乗り換えを行いたいと思い、移行方法の調査を行いました。

##DMSを使って移行
Databese Migration Serviceという、異なるデータベース間でのMigrationを助けてくれるサービス。MigrationとOn going replication両方行ってくれるので、Downtimeを少なく移行できます。

http://dev.classmethod.jp/cloud/aws/lets-try-aws-database-migration-service-dms/

上記のクラスメソッドさんの記事を参考にぽちぽちやってみました。
Migrationとreplicationもうまくいき、意気揚々をアプリにつないで動作確認をしてみたところ、、、

う、うごかない。

ログを見ると

```Field id doesn't have a default value```

というエラー。どうやらDBにAuto incrementの設定がなされていなく、idを指定しろと怒られているようです。よく見るとcollationやindexも移行されていません。仕方なく、MySQL workbenchでstructreを事前にexportしておき、AuroraにimportしたのちにDMSを使用したところ、うまくいきました！


そのごいろいろ調べた挙句下記を読んでみると

https://aws.amazon.com/jp/dms/

むむ、事前にSchema Conversion Toolをつかって、移行準備を整えた後、DMSで移行するだと？
こちらが正規の手順のようですね。
早速PCにインストールして使ってみましたが、よくよく考えればSecurity groupを絞っているのでPCからDBに直接繋げないし（踏み台サーバー経由できるかもしれませんが未調査）何より学習コスト高そう。私は別の方法を探しました。


##SnapShotから移行

RDSのコンソールのSnapshot一覧のページから復元したいスナップショットを選び、上の方のMigrate snapshotを選びます。
その後DBの設定を行い（執筆日現在でAuroraしか選べません）、Auroraを立ち上げます。
簡単！完了！
Auroraが立ち上がり使えるようになるまでには多少時間がかかります。

##結論
あまり手作業が多いとバグを発生させる要因になるので、今回はメンテ時間を設けて、SnapshotをとりSnapshotから移行することにしました。
Downtimeを最小にしたいというモチベーションが強いミッションクリティカルなサービスであればちゃんと準備をしてDMSを使うのもアリだと思います。

より良さげな方法が見つかれば追記します。
Fusekiをダウンロードして立ち上げるまで。Windows 10編

手軽にRDFデータを用意してSPARQLでの検索を試せるツールとして[Fuseki](https://jena.apache.org/documentation/fuseki2/index.html)があります。

今回はWindows 10で立ち上げるまでのメモを記述しますが、Windows 8.1でも同様の操作で問題なく立ち上げられることを確認済みです。
なお、Fusekiを動作させるためにはJavaのバージョン8以降が必要になりますので、適宜[こちら](http://java.com/ja/)から取得しておいてください。

1. 最初に[ここ](https://jena.apache.org/download/#apache-jena-fuseki)からapache-jena-fuseki-X.Y.Z.zipを取得します（X.Y.Zはアクセス時点での最新バージョンに読み替えてください。たとえば2.6.0、つまり、apache-jena-fuseki-2.6.0.zipなど）。
ダウンロードフォルダにある、取得したファイルについて当該アイコン上で右クリックして表示されるメニューから「すべて展開(T)…」を選択します。
![2016-07-01 (3) - コピー.png](https://qiita-image-store.s3.amazonaws.com/0/119205/19bef9d3-7b9b-18f6-6cc4-f9b239d638dd.png)

2. 続いて展開して現れたフォルダにある、「Windowsバッチファイル」の「fuseki-server」あるいは環境によっては「fuseki-server.bat」と表示されているファイルをダブルクリックして起動します。
![2016-07-01 (9).png](https://qiita-image-store.s3.amazonaws.com/0/119205/27bf95d2-8cd0-284b-0852-3186632c6bf8.png)  
ターミナルのウィンドウが開いて起動処理が始まりますが、途中でセキュリティの関係から「Windowsセキュリティの重要な警告」というポップアップウィンドウが表示されるかもしれません。当該ウィンドウに書かれている「名前(N)」が「Java(TM) Platform SE binary」、「発行元(P)」が「Oracle Corporation」であれば問題ないので、「アクセスを許可する(A)」をクリックして続行します。
![2016-07-01.png](https://qiita-image-store.s3.amazonaws.com/0/119205/5bf7f0f3-dfc9-4dc4-16de-e78e24b0bd54.png)

3. ターミナルウィンドウ内の表示が、「Started 2016/07/01 10:32:17 JST on port 3030」という感じの状態で止まっていれば問題なく起動していますので、当該ウィンドウが表示されているPCのウェブブラウザから、http://localhost:3030/ にアクセスします。

4. 「Apache Jena Fuseki」と書かれているページが表示されると思いますので、ページの右上にある「Server status:」の右隣に表示されている丸いアイコンの色が緑であることを確認します。
![2016-07-01 (10).png](https://qiita-image-store.s3.amazonaws.com/0/119205/14f95229-5497-bbcf-3c5c-e9959c21e588.png)
ufo -> python(4)

## 個別対応

edinet,TDNETから指定した年度の報告書、決算短信を取得することは可能になった

売上ならTDNET(code,year).entry('NetSale')、純利益ならobj.entry('NetIncome')という具合
※EDINETも使い方は同じ

まあここまではいいんだけども、例えばNetIncome。これはリンク先のTeCAProの製作者の方のサイトでも紹介されている通り要素名に変更があったりする、のでこういう事にいちいち対応しなけりゃいけない。
http://d.hatena.ne.jp/xbrl/20150121

上のサイトでも紹介されている通り変更内容は
EDINET：「EDINETタクソノミ更新概要」
http://www.fsa.go.jp/search/20141226.html
TDNET：「企業結合に関する会計基準」等の改正による当期純利益の表示変更の影響
http://www.shinnihon.or.jp/shinnihon-library/publications/issue/info-sensor/2014-10-01.html

EDINETはいいけどTDNETの方は追える気がしない
Ubuntu操作覚え書き

自分用、よく使う操作の覚え書き
多分Ubuntu操作というよりは、Linuxの基本操作なんだと思う

#GUIからのファイル操作を管理者権限で
GUI（ファイルエクスプローラー）から、システムフォルダ等にアクセスしたい場合
ターミナルから以下のコマンドをぶち込む
（*nautilus*というのが、Windowsでいう*explorer*に対応してるっぽい）

```bash
sudo nautilus
```

#実行ファイルが実行できない
権限が足りてないので、実行権限を与える。
以下のコマンドのどちらかをぶち込む
（下のはrwx全許可なので、多分あまり推奨されない）

```bash
chmod +x <target>
# or
chmod 777 <target>
```

#Windowsとファイル共有
sambaをインストールする

```bash
sudo apt-get install samba
sudo vi /etc/samba/smb.conf
sudo smbpasswd -a <username>
sudo service smbd restart
````

smb.confには、以下の形式で「共有したいフォルダ」を設定する。（ファイル末尾に追加）
この場合、 `/home/bar` 以下の内容が `foo` として外部に公開される。

```
[foo]
path = /home/bar
writable = yes
browseable = yes
```

#指定ファイル（以外）を削除する
`ls`して`grep`して`rm`する、というのを連続で処理できるらしい。
Linuxはこういうとこ確かに便利なんだけど習得するまでが長いのよな……

```bash
#ファイル削除
ls <path> | grep <pattern> | xargs rm -rf

#ファイル削除（指定以外）
ls <path> | grep -v <pattern> | xargs rm -rf
```

#ファイル数を数えたい
lsの結果を１行ごとに出力、wcで行数をカウントするらしい

```bash
#簡易手法
ls -1 | wc -l

#高精度手法
ls -F | grep -v / | wc -l
```

#ディレクトリの容量を調べたい
パラメータに`-k`とか`-m`とかつけると、単位を調整できる

```bash
#全体
du <path>

#サブディレクトリの情報を表示しない
du -s <path>

#サブディレクトリのサイズを除く
di -kS <path>
````

#ビルドが遅すぎる
特にカーネルビルドする場合に気になる

```bash
# timeでどれくらい時間が掛かったか表示してくれる
# -jでスレッド数を指定できる、これは4スレッドの例
time make -j4
````

#bashで変数を使いたい
（bashは記事を独立させた方が良いかもしれない）
変数は、好きな名前で定義できる。使う時は$で参照できる。
イコールで結ぶ時にスペースを入れないよう注意（スペースも含めて変数化される？）
他の文字列と引っ付いてしまう時は、`{}`で明示的に区切る事ができる。


```bash:hoge.sh
#ファイルパスを変数化する例
piyo=fuga.dat
./a.out $piyo

#文字列の一部を変数化する例
foo=abc
fooo=def

echo $fooopq    # "abcopq" となるのか "defpq" となるのか伝わらない
echo ${foo}opq  # 結果は "abcopq" となる
echo ${fooo}pq  # 結果は "defpq" となる

```

コマンドライン引数を使う場合も基本的には同じである。
main関数みたいに、自分のこと（実行ファイル名）は引数として数えない

```bash:hoge.sh
echo $# #引数の数が分かる（0～）
echo $1 #１番目の引数が表示される。（無ければ空文字？）
```

#GitでSSH認証を手軽に扱う
１．秘密鍵を`~/.ssh/id_rsa`に配置する
２．`./.bashrc`の最終行に以下の記述を追加する

```bash:.bashrc
#ssh-agent
eval `ssh-agent`
ssh-add
```

元記事：[Git:Git BashにてSSH鍵のパスフレーズ入力を初回のみにする](https://takanosho.wordpress.com/2013/01/11/input-ssh-key-passphrase-only-once-on-git-bash/)

[その他]
SSHの仕様とかが良くわからん、秘密鍵の名前とか置き場所は決め打ちなのか
gitで接続する場合、URL形式だとSSH接続にならない？ `git@xxxx`みたいな形式だとSSHになる？
ufo -> python(3)

## TDNET

edinetに続いてtdnetも取得できるようにする
全然データの内容が違って全くやり辛いので、
ゴールは要素名指定して単純にデータが取れれば良いとする
※TDNETはUfocatcherにデータを取る機能がないため簡単に・・

* 適時開示情報から対象年月の決算短信を取得する
* 決算短信から特定の要素のデータ抽出

今時点では決算短信のみ対象として、四半期報告その他は非対象
 ~~決算短信公表月＝決算日翌月の1日（？）~~そういうわけでもない

先に決算短信の特定要素のデータ抽出は割と簡単に出来た
次に対象年月を指定した決算短信の取得、これが曲者過ぎる

例えばあみやき亭（2753）の場合
http://resource.ufocatch.com/atom/tdnetx/query/27530

2014年以降とそれ以前でxbrlの形式自体が違う、うんざりする
調べると下のリンクの「4 本タクソノミの物理的なロケーション」で
決算短信のタクソノミごとにサマリの置き方が書いてあった

http://www.jpx.co.jp/equities/listing/xbrl/tvdivq00000088ai-att/325-005-05_Kaiji_taxonomy_kaisetsu_CG.pdf

この資料からまあ大体想像して必要な決算短信のデータのURLを取得してフォーマットの種類に合わせてパースする
Windows7のPCで自分をNTPサーバにしたい時のメモ

###使ったソフト
https://www.meinbergglobal.com/english/sw/ntp.htm
普通にインストールした


###設定
server 127.127.1.0
と書くだけ。
参考：http://www.turbolinux.com/support/document/knowledge/545.html

###注意点
スタートメニューから各制御を行うが
すべて「管理者権限で」実行しないとうまく行かなかった

###注意点2
ファイヤーウォールが有効になっていると他から参照できないので
NTP用のポート(UDP 123)を開ける設定を追加しておくこと
A record of IO Exception 'Permission denied' on Tomcat 5.5


会社にはとあるプロジェクトはTomcat 5.5で運行していた。サーバ移転のため他のサーバに配置し運行してみた。しかし、Excel Sheetなどを生成する際、ずっと失敗した。ログを見ると、ファイルへの権限が足りなかったと。

	java.lang.RuntimeException: java.io.IOException: Permission denied
		at org.apache.poi.xssf.streaming.SXSSFWorkbook.createAndRegisterSXSSFSheet(SXSSFWorkbook.java:304)
		at org.apache.poi.xssf.streaming.SXSSFWorkbook.createSheet(SXSSFWorkbook.java:320)
		at com.ouku.report.DIYBook.addSheet(DIYBook.java:146)
		at com.ouku.report.DIYBook.createBook(DIYBook.java:107)
		at com.ouku.report.DIYBook.writeBook(DIYBook.java:73)
		at com.ouku.report.ReportFactory.writeReport(ReportFactory.java:95)
		at com.ouku.report.ReportTask.doReportRequest(ReportTask.java:513)
		at com.ouku.report.ReportTask.doTask(ReportTask.java:105)
		at com.ouku.entities.report.ReportTimerTask$1.run(ReportTimerTask.java:12)
	Caused by: java.io.IOException: Permission denied
		at java.io.UnixFileSystem.createFileExclusively(Native Method)
		at java.io.File.checkAndCreate(File.java:1833)
		at java.io.File.createTempFile0(File.java:1857)
		at java.io.File.createTempFile(File.java:1969)
		at org.apache.poi.xssf.streaming.SXSSFSheet$SheetDataWriter.<init>(SXSSFSheet.java:1244)
		at org.apache.poi.xssf.streaming.SXSSFSheet.<init>(SXSSFSheet.java:55)
		at org.apache.poi.xssf.streaming.SXSSFWorkbook.createAndRegisterSXSSFSheet(SXSSFWorkbook.java:300)
		... 8 more
		
最初はターゲットExcel Sheetファイルを書き込むべきディレクトリの権限が配置してなかったと思った。だが、すでに書くこむ権限があった。
そして、`org.apache.poi.xssf.streaming.SXSSFWorkbook.createAndRegisterSXSSFSheet`を検索して、結果として、これは臨時ファイルを利用した。どうやら、臨時ファイルが書き込めなかったのだろう。
だが、`/tmp`は疑問なく誰でも書き込める。一体、どこに書いたの。

また、そのツールを探していた。このツールの臨時ファイルは、Javaの`java.io.tmpdir`で定義したところに書き込むはずだった。
わざわざJavaを書いた。

	public class a {
		public static void main(String[] args){
			String tmpdir=System.getProperty("java.io.tmpdir");
			System.out.println("tmpdir="+tmpdir);
			String poitmp=System.getProperty("poi.keep.tmp.files");
			System.out.println("poitmp="+poitmp);
		}
	}

もちろん、出力は別に何の用もなかった。

	tmpdir=/tmp
	poitmp=null

偶然、Tomcatのプロセスを調べた。

	root@X:/opt/apache-tomcat-5.5.36/logs# ps aux|grep tomcat
	admin    20909  6.0  1.8 4868880 301136 pts/0  Sl   09:06   0:33 /usr/lib/jvm/java-6-openjdk-amd64/bin/java -Djava.util.logging.config.file=/opt/apache-tomcat-5.5.36/conf/logging.properties -Dlog4j.configuration=file:///var/webapps/report/WEB-INF/log4j.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.endorsed.dirs=/opt/apache-tomcat-5.5.36/common/endorsed -classpath /opt/apache-tomcat-5.5.36/bin/bootstrap.jar -Dcatalina.base=/opt/apache-tomcat-5.5.36 -Dcatalina.home=/opt/apache-tomcat-5.5.36 -Djava.io.tmpdir=/opt/apache-tomcat-5.5.36/temp org.apache.catalina.startup.Bootstrap start
	root     21093  0.0  0.0  10100   876 pts/0    S+   09:15   0:00 grep tomcat
	root@X:/opt/apache-tomcat-5.5.36/logs#

はっきり、`-Djava.io.tmpdir=/opt/apache-tomcat-5.5.36/temp`と声明した。わはははは。

茶番劇のおしまいです。
Windows App Studioでノンコーディングでアプリを作る

注）この記事で扱っているWindows App Studioは2017/12/1にサービス終了が決定しています。

Microsoft、UWPアプリ作成の「Windows App Studio」を12月1日終了へ
http://www.itmedia.co.jp/news/articles/1707/03/news060.html



Windows App Studio （Beta）ってご存知でしょうか？マイクロソフトが運営するWindowsアプリをノンコーディングで作成できるWebサービス（統合開発環境？）です。

私はプログラミングど素人のBASICしか触れないリテラシが低い人間ですが、つまらないアプリなら作れたのでご紹介します。

##1.Windows App Studioについて

【特徴】

* マイクロソフトが運営
* ベータ版らしい
* 無料
* ユーザー登録はMicrosoftアカウント
* コーディング不要で、Windows アプリを作成
* Windows10,8.1用のアプリが作成可能
* アプリのテンプレートがあり選べる
* テンプレートに部品をクリックで追加する
* 部品はBing、Twitter、Facebook、Youtube検索、REST API、RSS受信など
* 部品の追加、設定が終わればあとはGenerateボタンを押すだけ
* 作ったものはストア公開も可能らしい（試してません）
* インストールはWindows App Studio Installerで行う

> [Windows App Studio](http://appstudio.windows.com/ja-jp)
> [Windows App Studio Installer](https://www.microsoft.com/ja-jp/store/apps/windows-app-studio-installer/9nblggh4qtfx)

##2.Windows App Studioの画面

以下のような画面になります。

かなりシンプル画面なんで設定した後にまめにSAVEボタンを押すことさえ注意すれば大丈夫です。

![Clipboardst.jpg](https://qiita-image-store.s3.amazonaws.com/0/35574/9285d72c-bea1-98ce-97b9-0050d46b0c28.jpeg)

##3.作ったもの

BASIC関係を検索するプログラムを作りました。

【概要】

* Bingを「BASIC Android プログラム」で検索
* Twitterを「BASIC プログラミング」で検索
* YouTubeを「BASIC プログラミング」で検索
* [自分のサイト](http://basic.amsstudio.jp/)の掲示板RSSを受信

詳細は動作テスト動画（※音付き）を作りましたのでそちらをご覧ください。

【動作テスト動画】
[![youtube動画表示エリア](http://img.youtube.com/vi/x4HnWnf0NV4/0.jpg)](http://www.youtube.com/watch?v=x4HnWnf0NV4) 

##4.作ってみて

簡単なアプリですが作ってみた私個人の感想は以下です。

* Windows App Studio自体の操作性は直感的で良い
* 部品が少ない
* TwitterやYouTubeは結局それぞれのサイトでAPI申請が必要
* APIの知識が多少ないと作れない
* 結局私みたいなど素人・初心者にはきびしい

##5.まとめ

* 無料でWindowsアプリが作れる
* ノンコーディングで作れる
* 直感的GUI操作で作れる
* もっと部品ほしい
* インストールも簡単
* でもAPIの知識がないと無理

案外いいのですがド素人＋初心者には最後だけちょっと微妙かも。
[Windows]Systeminfo

適用された更新プログラム（ホットフィックス）のリストを取得するのに便利。

```text:ヘルプ
SYSTEMINFO [/S システム [/U ユーザー名 [/P パスワード]]] [/FO 形式] [/NH]

説明:
    ローカル コンピューターまたはリモート コンピューターの、オペレーティング
    システム構成情報 (Service Pack のレベルを含む) を表示します。

パラメーター一覧:
    /S    システム            接続先のリモート システムを指定します。

    /U    [ドメイン\]ユーザー 実行するコマンドのユーザー コンテキストを指定
                              します。

    /P    [パスワード]        提供されたユーザー コンテキストのパスワードを指定
                              します。省略された場合は、入力を要求します。

    /FO    形式               表示される形式を指定します。
                              有効な値: "TABLE", "LIST", "CSV"。

    /NH                       出力しない "カラム ヘッダー" を指定します。
                                     
                              "TABLE"と "CSV" の形式のみ有効です。

    /?                        ヘルプを表示します。

例:
    SYSTEMINFO
    SYSTEMINFO /?
    SYSTEMINFO /S システム
    SYSTEMINFO /S システム /U ユーザー
    SYSTEMINFO /S システム /U ドメイン\ユーザー /P パスワード /FO TABLE
    SYSTEMINFO /S システム /FO LIST
    SYSTEMINFO /S システム /FO CSV /NH
```

```bat:コマンド例
systeminfo > sysinfo.txt
```

```text:出力結果
ホスト名:               *****
OS 名:                  Microsoft Windows 7 Professional 
OS バージョン:          6.1.7601 Service Pack 1 ビルド 7601
-- snip　--
ホットフィックス:       254 ホットフィックスがインストールされています。
                        [01]: KB2849697
                        [02]: KB2849696
                        [03]: KB2841134
                        [04]: KB2841134
                        [05]: KB2670838
                        [06]: KB2830477
                        [07]: KB2592687
                        [08]: KB2479943
                        [09]: KB2491683
                        [10]: KB2506212
-- snip　--
                        [241]: KB3156013
                        [242]: KB3156016
                        [243]: KB3156017
                        [244]: KB3156019
                        [245]: KB3159398
                        [2
-- snip　--
```

254件検出したのに、246件目の途中で途切れてしまったのはなぜ？？？

（7/11追記）
上記の途中で途切れる問題は、systeminfoコマンドのバグらしいとのこと。（MSは修正するつもりなし？？？）

また、適用された更新プログラム（ホットフィックス）のリストを取得するという目的であれば、PowerShellのGet-HotFixコマンドレットのほうが良さげ。（246件以上でもすべて出力可能）

```text:コマンド例
powershell.exe Get-HotFix > HotFix.txt
```

```text:出力結果
Source        Description      HotFixID      InstalledBy          InstalledOn  
------        -----------      --------      -----------          -----------  
*****         Update           KB2849697     *************        2016/04/**...
*****         Update           KB2849696     *************        2016/04/**...
*****         Update           KB2841134     *************        2016/04/**...
*****         Update           KB2841134     *************        2016/04/**...
*****         Update           KB2670838     *************        2016/04/**...
-- snip --
*****         Security Update  KB3161958     NT AUTHORITY\SYSTEM  2016/06/**...
*****         Security Update  KB3164033     NT AUTHORITY\SYSTEM  2016/06/**...
*****         Security Update  KB3164035     NT AUTHORITY\SYSTEM  2016/06/**...
*****         Update           KB976902      *****\Administrat... 2010/11/**...
*****         Update           KB982018      *************        2016/04/**...
```

あと、「wmic qfe」でも取得できるようです。
AVSpeechSynthesizerの読み上げ速度は、iOSのバージョンによって異なる

普通、同じでしょうと思うかもしれませんが、違ったので備忘録的な感じで書いておきます。

```objc:
- (void)speechTest {
	//初期化
	AVSpeechSynthesizer* speechSynthesizer = [[AVSpeechSynthesizer alloc] init];  

	AVSpeechUtterance *utterance = [AVSpeechUtterance 	speechUtteranceWithString:@"ほげほげ"];

	//言語指定
	AVSpeechSynthesisVoice *voice = [AVSpeechSynthesisVoice voiceWithLanguage:@"ja-JP"];

	//iOS8の読み上げ速度のみ極端に速いので分岐処理
	if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_8_3) { 
		//iOS9
		speech.rate = 0.5f; //Max 1.0 - Min 0.1
	} else if(floor(NSFoundationVersionNumber) > 	NSFoundationVersionNumber_iOS_7_1) { 
    	//iOS8
		speech.rate = 0.05f; //Max 0.1 - Min 0.01?
	} else { 
   		//iOS7
   		speech.rate = 0.5f; //Max 1.0 - Min 0.1
	}
	
	[speechSynthesizer speakUtterance:utterance];  

}
```
最初、Max1.0からMin0.1が設定範囲だと思い、標準の0.5で読み上げ速度を設定していました。
ですが、iOS8の端末のみ極端に読み上げ速度が速くなってしまったので軽く調べてみるとiOSのバージョンによって読み上げ速度が違っていたようです。
iOS9、iOS7のレートは同じにしていますが、厳密には少し速度が違うみたいなので微調整は必須でしょう。

とにかくiOS8を含んでかつ、AVSpeechSynthesizerを使うときは注意です。

>参考元
>http://tokentoken.com/blog/2015/09/avspeechsynthesizer/
[Swift] Appirater でレビューをお願いする


# Appirater

https://github.com/arashpayan/appirater

ユーザーにレビューをお願いするダイアログを簡単に表示、表示タイミングを管理できるライブラリです。

![2016-07-01 10.15.47.png](https://qiita-image-store.s3.amazonaws.com/0/27210/0840a4c1-cc88-5f3e-9f82-1997e939bf05.png "2016-07-01 10.15.47.png")

# セットアップ手順

Cocoapods でインストールします。

```
pod "Appirater"
```

セットップはapplication(application:didFinishLaunchingWithOptions) で行います。

```
import Appirater

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    Appirater.setAppId(kAppleId)
    Appirater.setDaysUntilPrompt(7)
    Appirater.setUsesUntilPrompt(15)
    Appirater.setTimeBeforeReminding(14)
    Appirater.setDebug(true)
    Appirater.appLaunched(true)
}
```

## setAppId

アプリの Apple ID を指定します。

## setDaysUntilPrompt

レビュー依頼ダイアログを表示するまでの日数を指定します。例だと「使用して７日後」に表示します。

## setUsesUntilPrompt

レビュー依頼ダイアログを表示するまでの使用回数を指定します。例だと「１５日起動した後」に表示します。

## setTimeBeforeReminding

一度ダイアログを表示した際に「後で」を選択された場合に、何日後にリマインダーを出すかを指定します。

## setDebug

デバッグ時に毎回ダイアログを表示するために使用します。リリース時に有効にしないよう注意。

##

### 使用回数のカウント方法

アプリがフォアグラウンドに来た回数を使用回数としたい場合は下記コードを追加します。

```
func applicationWillEnterForeground(application: UIApplication) {
    Appirater.appEnteredForeground(true)
}
```

## appLaunched

アプリ起動時に呼び出します。

# 文言調整

Appirater にはデフォルトで各言語の文言が入っていますが、アプリ用にカスタマイズしたい場合は下記コードを実行し、言語リソースを追加することでカスタマイズできるようになります。

```
Appirater.setAlwaysUseMainBundle(true)
```

## 言語リソース（AppiraterLocalizable.strings）の作成

AppiraterLocalizable.strings というリソースを追加し、カスタマイズしたい言語を下記ように定義します。

```
"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your support!" = "%@をお使いいただきありがとうございます！ほんの少しだけお時間をいただき同じチームのファンを増やす協力をお願いできないでしょうか？";
"Rate %@" = "%@を評価する";
"No, Thanks" ="結構です";
"Remind me later" = "あとで";
```

レビューがあるとダウンロード数増加に効果が出ますし、ユーザーが不満に思わないタイミングでレビュー依頼をしていきたいですね。
RDS(MySQL)のログファイルを削除する

## ログファイルの削除手順
* 対象のデータベースに接続
* `mysql` データベースを選択
* 以下のクエリを実行

```
// general_logをtruncate
call rds_rotate_general_log
// 2回実行することでgeneral_log_backupをtruncate
call rds_rotate_general_log
// countが0になっていればOK
select count(*) from general_log;

// slow_logをtruncate
call rds_rotate_slow_log
// 2回実行することでslow_log_backupをtruncate
call rds_rotate_slow_log
// countが0になっていればOK
select count(*) from slow_log;
```
Chrome Developer Tools で console.log を埋め込まずに dev console 出力する方法 

Edit breakpoint で 

```
console.log('hoge', hoge) === null
```

としてやると、 breakpoint で止まらずに console 出力してくれる。
これでいちいちソースコードに `console.log` を埋め込む必要ない！

<img width="469" alt="スクリーンショット 2016-07-01 9.49.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/5622/3e848496-d5fd-b906-21b5-e24a45bc3d6e.png">
22番ポートが使えなくても、SSHでGitしたい！

SSHでGit使ってると、ファイアーウォールやプロキシ環境でいらいらしますよね。
でも主要なサイト(GitHub,GitLab,Bitbucket)なら実は443ポートでSSHできちゃったりするんです。
でも、調べても正しい情報がなかなか出てこなかったりするので自分へのメモ用に残して残しておくことにしました。

使い方は簡単!以下のコンフィグを自分仕様に合わせて書くだけ！
(hoge.proxy.jpをプロキシサーバーのURLにして1080のとこはポート番号を入れてください)

## Windowsの場合
### Git Bash使っている場合（CMDは多分ダメ）
connectが入っているのでこれを使います。他の環境は調査してませんが似たような感じでいけると思います。

```bash:~/.ssh/config
Host github.com
    User git
    Hostname ssh.github.com
    IdentityFile ~/.ssh/id_rsa
    Port 443
    ProxyCommand connect.exe -H hoge.proxy.jp:1080 %h %p

Host bitbucket.org
    User git
    IdentityFile ~/.ssh/id_rsa
    HostName altssh.bitbucket.org
    Port 443
    ProxyCommand connect.exe -H hoge.proxy.jp:1080 %h %p

Host gitlab.com
    User git
    IdentityFile ~/.ssh/id_rsa
    HostName altssh.gitlab.com
    Port 443
    ProxyCommand connect.exe -H hoge.proxy.jp:1080 %h %p
```

## macOS(OS X)/Linuxの場合
ncコマンドを使ってやります。ない場合はインストールしてください（方法は省略）

```bash:~/.ssh/config
Host github.com
    User git
    Hostname ssh.github.com
    IdentityFile ~/.ssh/id_rsa
    Port 443
    ProxyCommand nc -X connect -x hoge.proxy.jp:1080 %h %p

Host bitbucket.org
    User git
    IdentityFile ~/.ssh/id_rsa
    HostName altssh.bitbucket.org
    Port 443
    ProxyCommand nc -X connect -x hoge.proxy.jp:1080 %h %p

Host gitlab.com
    User git
    IdentityFile ~/.ssh/id_rsa
    HostName altssh.gitlab.com
    Port 443
    ProxyCommand nc -X connect -x hoge.proxy.jp:1080 %h %p
```
## 最後に
筆者はプロキシ使う環境と使わない環境の2つの環境でGit使っているので環境のたびにコメントをつけたり外したりするのがめんどくさいです。なにかいい方法はないでしょうか？（ホスト名proxy.github.comみたいな感じでリポジトリ切り替えとかすればいい？）
Wio Nodeを試してみた。


Wio Nodeが気になっていたので購入して、どんなものなのか試してみました。

# Wio Node？

Wio NodeはiOS/Androidの専用アプリ「Wio Link」経由で
ESP-WROOM-02（もうESPrって呼んでもいいんでしたっけ？）のファームウェアアップデートを行う仕様になっています。
Wio Nodeの他、Wio Linkというボードがあるようです。

以下仕様（スイッチサイエンスの製品ページより抜粋）

```
[特徴]
低価格、軽量、コンパクト、かつシンプル
総務省の工事設計認証（いわゆる技適）取得済みのESP-WROOM-02を搭載
GROVEシステムを利用可能
視覚的な設定が可能
OTA（Over-The-Air）ファームウェアアップデート
RESTful API
IFTTTアプリケーション
Android & iOSアプリあり

[仕様]
Wi-Fiネットワークプロトコル：802.11b/g/n
セキュリティ：WEP/TKIP/AES
GROVEコネクタ：UART/I2C0/D0、Analog/I2C1/D1
入力電圧 
バッテリー：3.0～4.2 V
Micro USB：5 V
動作電圧：3.3 V
最大充電電流：500 mA
デジタルI/Oピン：4本
アナログ入力ピン：1本
I/Oピン一本当たりのDC電流：12 mA
フラッシュメモリ：4 MB（W25Q32B）
動作周波数：26 MHz
寸法：28 mm x 28 mm
```

Wio Node Wiki
http://www.seeedstudio.com/wiki/Wio_Node

秋月電子通商
http://akizukidenshi.com/catalog/g/gM-10631/
スイッチサイエンス
https://www.switch-science.com/catalog/2799/

たった3ステップ、5分の操作でIoTアプリを開発できる「Wio Link」
https://fabcross.jp/news/2015/12/20151207_wio_link.html

# GROVEシステムとは？
個人的にも好きな規格で、対応するソケットに接続するだけで気軽にプロトタイピングができます。
半田付けや電子工作のスキルに自信がない方でも安心です。
ArduinoやRaspberry PiなどにもGrove対応のシールドがあり、
Wio Node以外にも利用できる一般的なものだと思います。

Grove System
http://www.seeedstudio.com/wiki/Grove_System

コネクタを挿すだけで電子工作！GROVEシステムのセンサ・アクチュエータのまとめ
http://d.hatena.ne.jp/shu223/20140415/1398297071

# Get Started
アプリでも実際にチュートリアルがあるのでここはざっくり説明します。
1. スマートフォンにWio Linkアプリをインストール
2. アカウント作成
3. Wio NodeをAPとしてWifi接続し、Wio Nodeを接続するWifiを設定
4. Wio NodeのPort0とPort1にGroveのモジュールを接続し、接続したモジュールをアプリ側で選択しファームウェアをアップデート
5. アップデートが完了したらAPIを確認、各Groveに対応したRESTful APIを確認します。

これだけでGroveの各種センサやボタンなどにWifiからアクセスができるようになります。素敵ですね👍🏻

# 出来ること
- Seeed社が出してるGroveモジュールはほぼ対応してると思います。
- モジュールに対応したAPIでINPUT/OUTPUTが可能、ANALOGのみINPUTのみ


# 出来ないこと or 調査中
- PORT0とPORT1の連携は単体ではできない(例：PORT0にボタン、PORT1にLEDをつけてもAPIは作れるが内部にそれを連携する機能は無い）
- 自作のGroveモジュールについてはUART、I2Cのものは既製品のものしかファームウェアがダウンロード出来ないようでした GPIOについてはGeneric Digital InputやGeneric Digital Output、Generic PWM/Analog Outputがあるのでそれに対応するモジュールは使えそうです。
- 一部対応されてないモジュールあり、ジョイスティックモジュールが対応していませんでした。一応General Analog Inputで値をGETできますが、WebSocketに対応していないので使いづらいです。対応待ちかなと。
- ファームウェアアップデート
	- ~~Wio NodeにはUARTにTXはありますがRXが無い(?)ため、シリアル通信でのファームウェアアップデートが出来ない？ESP-WROOM-02使ってるのでRX無いってことは無いと思いますけどね^^;~~ UARTにRXもあり、ファームウェアのアップデートが出来るとの事でした！@Goji2100さんありがとうございます！(確認中)
	- OTAでカスタムスケッチのアップデートができるかも？
- MACアドレスの調べ方
	- ESP8266が使われているのとPORT0にUARTが対応しているので`AT+CIPSTAMAC?`コマンドで表示を試みましたが反応せず
	- 基本的にOTAでのファームウェアアップデートしか出来ないようなのでMACアドレスを出力するスケッチを流す事が出来ないようでした。

# 所感
想像してたよりもずっと良いですね、価格が1,000円ちょっとで非常にシンプルに使えます。ただ、スマートフォンで設定しなければいけない点とファームウェアのアップデートに不自由さがあるのでその辺は今後も少し調べてみます。
gulpでBEMの構文スタイルをチェックする

BEMの構文チェックをgulpで行う方法を記載します。

## 前提条件

- gulp実行環境がある

## できること
以下のことができるようなgulpタスクを作成します。

- gulp-notifyでNGとなった場合に通知される
 - https://github.com/mikaelbr/gulp-notify
- stylelintでcssのスタイルチェックを行う
 - https://github.com/stylelint/stylelint
- postcss-bem-linterでbemの構文チェックを行う
 - https://github.com/postcss/postcss-bem-linter
- postcss-reporterでチェック結果をコンソールに出力する
 - https://github.com/postcss/postcss-reporter


## 準備
```bash
$ gulp i -D gulp-postcss postcss-reporter stylelint postcss-bem-linter gulp-notify
```

## 実装例

gulpタスクの実装例を記載します。

```js:gulpfile.js
const gulp-plumber = require('gulp-plumber'),
      gulp-notify = require('gulp-notify'),
      stylelint = require('stylelint'),
      bemLinter = require('postcss-bem-linter'),
      reporter = require('postcss-reporter')

gulp.task('stylelint', () => {
  return gulp.src(paths.sass)
  .pipe(gulp-plumber({ // ---- (1)
    errorHandler: gulp-notify.onError(getNotifyConfig({
      title: "Error running stylelint"
    }))
  }))
  .pipe(gulp-postcss([ // ---- (2)
    stylelint({ // ---- (3)
      configFile: './.config/.stylelintrc',
    }),
    bemLinter({ // ---- (4)
      preset: 'bem',
      componentName: /^[a-zA-Z]+$/,
      componentSelectors: (componentName) => {
         const WORD = '[a-zA-Z0-9]+(?:-[a-zA-Z0-9]+)*',
               AMPERSAND = '(?:\&)*',
               ELEMENT = '(?:__' + WORD + '){0,2}',
               MODIFIER = '(?:--' + WORD + ')?',
               OTHERCLASS = '(?:\s\\.[a-zA-Z]+)?',
               ATTRIBUTE = '(?:\\[.+\\])?'

         regex = '^' + '\\.' + componentName + ELEMENT + MODIFIER + ATTRIBUTE + OTHERCLASS + '$';
         return new RegExp(regex)
       }
    }),
    reporter({ // ---- (5)
      throwError: true,
      clearMessage: true
    })
  ], {syntax: sugarss})) // ---- (6)
});
```

(1) plumberのerrorHandlerにgulp-notifyを仕込み、watch中にエラーがあった場合に通知させます。
(2) gulp-postcssを定義します。引数の配列にpluginを定義することでpluginを使用することができます。
(3) stylelintをpostcssのpluginとして使用することができます。ルールは外部ファイル（.stylelintrc）に切り出していますが、特に変わった設定はしていません。
(4) 本題となるbem構文をチェックするためのbemの構文定義をしています。

| キー名 | 説明 |
| :--- | :---|
|preset| 構文の基本パターンを`bem`にするか`suit`にするか選択することができます。<br> https://github.com/suitcss/suit/blob/master/doc/naming-conventions.md#namespace-optional |
| componentName| コンポーネント名（block）を正規表現で定義します。 |
| componentSelectors | bemの構文を正規表現で定義します。|
(5) report出力しています。
(6) postcssでどのスタイル（.scss, .sass, .less, ...）でチェックするかを定義しています。
https://github.com/postcss/postcss#syntaxes

今のところBEMの構文は必要最低限のことしかチェックしていませんので、今後変更する可能性はありますが、
とりあえずelementが３回以上連続して無駄に長くなってしまうのを防ぐことができるようになりました。
puppetmasterのCAが期限切れの対応

## 参考

* [How to renew expired puppetmaster certificates? - Ask Puppet: Puppet DevOps Q&A Community](https://ask.puppet.com/question/16111/how-to-renew-expired-puppetmaster-certificates/)
    * 5年ほどで期限切れる様子

## エラー

```bash:puppetclientにて実施
sudo puppet agent --test --noop
```

> info: Not using expired certificate for ca from cache; expired

![err.png](https://qiita-image-store.s3.amazonaws.com/0/25728/619bc928-17d0-e6ad-cf9d-7506a5ee8821.png)

```bash:puppetmasterにて実施
% sudo puppet cert --list --all
(certificate has expired)
- server.com (FF:FF:FF:FF:FF:FF:FF:FF:FF:FF:FF:FF:FF:FF:FF:FF) (certificate has expired)
```


## 対応

### puppet master

```bash:puppetmasterにて実施
mv /var/lib/puppet/ssl /var/lib/puppet/ssl.bak.`date -I`
```

```bash:puppetmasterサービスrestart
/sbin/service puppetmaster restart
```

### puppet client

```bash:puppetclientにて実施
mv /var/lib/puppet/ssl /var/lib/puppet/ssl.bak.`date -I`
```

```bash:puppetサービスrestart
/sbin/service puppet restart
```

### puppet client で使用するメッセージダイジェスト設定

puppet client が 2系かつCentOS6の時必要。

```sh
sudo /usr/bin/puppet agent --server server.com --test --noop
```

> Could not request certificate: unknown message digest algorithm
> このエラーが発生する原因はopensslのバージョンがあがったせいです
> puppet3.0はSHA256を使用するようになっています

https://it.hirokun.net/entry/puppet-md5

```sh
mv /etc/pki/tls/legacy-settings /etc/pki/tls/legacy-settings.bak.`date -I`

echo "LegacySigningMDs md5" >> /etc/pki/tls/legacy-settings
```

### puppet master

```bash:signする
sudo puppet cert --list --all
sudo puppet cert --sign client.com
```
Arduino > Wire > Wire.setClock(400000L); > 400kHzに設定する

傾斜計MPU-9250で使用しているサンプルスケッチ。
https://github.com/jrowberg/i2cdevlib/blob/master/Arduino/MPU6050/examples/MPU6050_DMP6/MPU6050_DMP6.ino

この中で以下の記載がsetup()にある。

```c
Wire.begin();
Wire.setClock(400000); // 400kHz I2C clock. Comment this line if having compilation difficulties
```

関連するリンクは以下
http://playground.arduino.cc/Main/WireLibraryDetailedReference

> sets the clock frequency that the TWI hardware will use if/when it is the master on the I2C bus. It is set in the source code to 100kHz, but theoretically at least you can reset this frequency by calling Wire.setclock(). The value passed is the bitrate from 400000L to 31000L. Wire.setclock(400000L); should set it to 400kHz. Wire.setClock() must be called after Wire.begin().  Wire.begin() initializes the bitrate to 100kHz.

上記のスケッチでは(400000)としているが、(400000L)という記載の方が暗黙の型変換を防げるかもしれない。
傾斜計 > MPU-9250関連の関数 @ i2cdevlib by jrowberg

傾斜計で使用しているMPU-9250用サンプルコード。
https://github.com/jrowberg/i2cdevlib/blob/master/Arduino/MPU6050/examples/MPU6050_DMP6/MPU6050_DMP6.ino

上記の中の処理を見ている。

setup(), loop()内で、Quaternionを取得してEuler角を取得するまでの処理で使っている関数は以下に切り出した。

[mpu関連の関数 @ mindmup](https://atlas.mindmup.com/2016/06/ff2c5cc0214001343b40673153d633dd/mpu_9250_mpu6050_dmp6_ino_160701/index.html)

いくつか気になった関数について動作の推測は以下。

- getIntStatus()
  - 0x10 : overflow
  - 0x02 : 正常?
- getFIFOCount()
  - 通信に使うFIFOのサイズを取得
  - この戻り値が dmpGetFIFOPacketSize()になるまでwaitをかける
- getFIFOBytes(fifoBuffer, packetSize)
  - fifoBufferへの読込み

get関数に戻り値を返す関数と、引数のポインタへ値をセットする関数の２種類がある。
Kotlin 1.0.3 リリース

詳しくは[公式アナウンス](https://blog.jetbrains.com/kotlin/2016/06/kotlin-1-0-3-is-here/)を参照してください。

## アップデート概要

大きな機能追加はなく、バグフィックスト改善が主な変更点です。

### コンパイラ
- -jdk-home オプションでJDKを指定できるようになりました
- for (i in a.indices) {} というコードで毎ループIntRangeが生成されないように最適化
- 戻り値がUnitの関数の最適化(不要なJVM命令の生成を抑制)

### IDE
- JavaコードをKotlinのファイルにコピペするとKotlinに変換するかサジェストされるようになった
- @Languageアノテーションを変数につけると変数の内容を記述する際に指定した言語のサジェストをするようになった
- import指定しないクラスやメソッドについても自動補完するようになった。また、それらを自動的にimportに追加するようなった。
- in や by の後の自動補完が賢くなった
- Kotlinバイトコードを表示する時にDecompileボタンが表示されるようになった
技術英語 > Nathie Katzoff > It's my job to make sure that the magic [is grounded].

Master Craftsman, Nathie Katzoff | HUMAN
https://www.youtube.com/watch?v=m3yVCHj3jA8&list=PL_MJualihC5AxdlHgVUROYKbNAaPJ5PE4&index=61
木工技術者の動画。字幕がしっかり付いている。
(4:19-)
> It's my job to make sure that the magic <font color=red>is grounded</font>.

http://eow.alc.co.jp/search?q=%22grounded%22
> `3 〔技術・性格・知識・能力などが〕しっかりした
Create user from user list by Ansible -ユーザを一括登録する方法-

# Overview
　Ansibleにはuser moduleが有るのでユーザ登録自体は簡単に操作できる。
しかしながら、一括で複数ユーザを登録したい場合は以下のようなやり方だと、単一のパラメータでしか作成できず、例えばパスワード等は指定できなくなってしまう。

<pre>
- user: name={{item}}
  with_items:
    - taro
    - jiro
    - saburo
</pre>

## Hashリストを活用する
　最も単純な方法は以下のようにHashリストを使って、パラメータを渡す。

<pre>
- user: name={{item.name}} uid={{item.uid}} comment="{{item.comment}}" group={{item.group}}
  with_items:
    - { name: 'taro', uid: 1001, group: 'users', comment: '1st' }
    - { name: 'jiro', uid: 1002, group: 'users', comment: '2nd' }
    - { name: 'saburo', uid: 1003, group: 'users', comment: '3rd' }
</pre>

ただし、これだとplaybookへのハードコーディングになるので使い回しには全く適さない。
ユーザ登録は頻繁に行うのでハードコーディングなどもってのほか。
ましてや「追加」「変更」「削除」に対応させるためにもパラメータは外出ししたい。

## vars_filesを使う
　要はパラメータを渡せればいいのでこんな風にしてみる。

<pre>
----- task -----
- name: Create user
  user: 
    name: "{{ item.name }}"
    groups:  "{{ item.group }}"
    shell: /sbin/nologin
  with_items:
    - "{{ users }}"
  when: "{{ users }}"
</pre>

<pre>
---- playbook ---
- hosts: Hosts
  roles:
    - create_user
  vars_files:
    - var.yml
</pre>

<pre>
--- var.yml ---
users:
  - { name: 'taro', uid: 1001, group: 'users', comment: '1st' }
  - { name: 'jiro', uid: 1002, group: 'users', comment: '2nd' }
  - { name: 'saburo', uid: 1003, group: 'users', comment: '3rd' }
</pre>

このようにすると、var.ymlを書き換えるだけでいくらでも使い回せるのでいい具合。
ちなみにwhen句は、保険。var.ymlが空の時にエラーにならないようにするおまじない。
Electron 独自window

ChromiumのUIを使わず、自分でwindowのUIをつくりたいとき
閉じる、最大化、最小化ボタンくらいはつくる。

```js:main.js
const el = require('electron'), {app} = el;
const Bw = electron.BrowserWindow, ipc = electron.ipcMain;

let win = null;
app.on('window-all-closed', () => {
	if (process.platform !== 'darwin') app.quit();
});
app.on('activate', () => {
	if (win === null) createMainWindow();
});
app.on('ready', createMainWindow);

function createMainWindow(){
	win = new Bw({
		title: '',
		width: 1280,
		height: 720,
		minWidth: 150,
		minHeight: 100,
		frame: false,
		darkTheme: true,
		'standard-window': false,      // これと
		titleBarStyle: 'hidden-inset', // これが
		'overlay-scrollbars': true,
		resizable: true,
		transparent: true,
		webPreferences: {},
		fullscreenable: true,
	}),
	win.loadURL(`file://${__dirname}/index.html`),
	win.on('closed', () => {win = null;});
};

ipc.on('minimize', (e, arg) => {
	win.minimize();
});
ipc.on('maximize', (e, arg) => {
	win.isMaximized() ? win.unmaximize() : win.maximize();
});
```
```html:index.html
<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<link rel="stylesheet" href="./style.css">
	<script src="./jquery-2.2.4.min.js"></script>
	<script>
if (typeof module === "object" && module.exports) {
	window.$ = window.jQuery = module.exports;
	module.exports = {};
}
	</script>
	<script>
const el = require('electron'), {ipcRenderer} = el;

$(() => {
	$('#closed').click(() => {window.close()})
	$('#minimize').click(() => {ipcRenderer.send('minimize', true)})
	$('#maximize').click(() => {ipcRenderer.send('maximize', true)})
});
	</script>
</head>
<body ng-app="app" ng-controller="RootCtrl as root">
	<div id="titleBar">
		<div id="titleName">
			<span id="name">appname</span>
		</div>
	</div>
	<main>
		<button type="button" id="closed">close</button>
		<button type="button" id="minimize">minimize</button>
		<button type="button" id="maximize">maximize</button>
	</main>
</body>
</html>
```
```css:style.css
#titleBar {
	-webkit-app-region: drag; /* ドラッグでwindowの移動可能にする */
	-webkit-user-select: none; /* 選択不可 */
	position: fixed;
	top: 0;
	width: 100%;
	height: 24px;
	margin: 0;
	padding: 0;
	background: #fcfcfc;
	z-index: 9999;
}
span#name{
	height:24px;
	margin:0;padding:0;
	font-size:14px;
	alignment-baseline: middle;
}
main {
	-webkit-app-region: no-drag; /*　ドラッグでwindowの移動不可にする */
	height: calc(100% - 28px);
	width: 100%;
	margin-top: 28px;
}
button {
	-webkit-app-region: no-drag;
}
```
Golangでディレクトリorファイルのバックアップツールを作ってる

`Golang` の勉強＆必要にかられて、[shinofara/stand](https://github.com/shinofara/stand)という、バックアップツールを作りました。
まだまだ機能は少ないですが

## 今ある機能

* `zip`, `tar + gzip`に対応
* マウント先などローカルからアクセス可能なディレクトリへの保存や、S3への保存
* 世代管理（過去何代まで保存するか）

## これから実装予定

* ファイルの暗号化・復号化
* リストアの仕組み

## 使い方(Usage)

### インストール

```
$ go install github.com/shinofara/stand
```

もしくは、[Release](https://github.com/shinofara/stand/releases)から最新のバイナリを取得
現在はMacと、Linux64bitsupport
※これ以外のOSの場合は、自前でお願いします。

### シンプルな使い方

```
$ stand -c /path/to/config.yml
```

### YAMLの構成

```
# /path/to/config.yml
- type: file
  path: "/path/to/file/path"
  storages:
    - path: "/path/to/local/directory"
      life_cycle: 1
- type: dir
  path: "/path/to/compress/target/directory"
  compression:
    prefix: sample # prefix_YYYYMMDDHHMiss.zip
    format: zip # or tar
  storages:
      type: s3
      path: "/path/to/s3/path"
      life_cycle: 2
      s3:
        access_key_id: AKXXXXXXXXXXXX
        secret_access_key: yXxxxxxxXXXXXXXXXXXXXXXX
        region: "ap-northeast-1"
        bucket_name: "backup_bucket_name"
```

`ACCESS_KEY` などは環境変数でも可能

```
$ export AWS_ACCESS_KEY_ID=AKIXXXXXXXXXXXXXX
$ export AWS_SECRET_ACCESS_KEY=xxxxxxxxxxxxxxxxxxxxxxxxxxxxx
$ export AWS_DEFAULT_REGION=ap-northeast-1
```

## 最後に

まだまだ機能追加する予定、そしてテストもちゃんと書かねば
あとはエラー制御とか課題は多いけど、、、

## 結論

Golangは書くのが楽しいですね
今すぐできるRxSwift🏄🏻

# RxSwift初心者でも挑戦できる今すぐできるRxSwift例
自分が初めてRxSwiftを書き始めた時を思い出しながら、最初に学んだRxSwiftの事例をまとめてみた。

基本的にBindは`viewDidLoad`の中で呼ぶ！ViewModelなどの場合は`init()`で呼ぶのが良い。


## TextFieldをバインド
`rx_text`と`subscribeNext {}`を使った`textField`のバインド

この組み合わせでtextFieldのtextが更新されるたびに`subscribeNext`の引数を使って処理できる。
`UITextFieldDelegate`を使わずにTextFieldの更新を検知できる。
`UITextView`でも同じ事ができる。

```swift:BindTextField
textField.rx_text
    .subscribeNext { [weak self] text in
        print(text) 
    }
    .addDisposableTo(disposeBag)
```

例えば何ができるのか！
`username`を入力する画面で決定ボタンをTextFieldに５文字以上入力されたら有効になるようにしたい。

```swift:BindTextField
textField.rx_text
   .subscribeNext { [weak self] text in
      self?.sendButton.enabled = text.characters.count > 5 
   }
   .addDisposableTo(disposeBag)
```

ここに`bindTo()`を使ってちょっと進化させよう

```swift:BindTextField
textField.rx_text
   .map { $0.characters.count > 5 } //ここで５文字以下なら`false`それ以外は`true`
   .bindTo(sendButton.rx_enabled)
   .addDisposableTo(disposeBag)
```

この4行で`UITextFieldDelegate`を使ってメソッドを使わないと実装できないことが実装できるようになります！

## UIButtonをバインド
'rx_tap'と'subscribeNext'を使ったバインド

'rx_tap'を利用すれば@IBActionを利用しなくてもタップを検知し、その時に処理を実行できる！

```swift:BindButton
button.rx_tap
   .subscribeNext { _ in 
      print("Hello World")
   }
   .addDisposableTo(disposeBag)
```

これだけでタップされた時に特定の処理を実行できます。
ついでに、ボタンを押した時にAPI通信をするときなど、短い間での複数タップを防ぎたい時！
RxSwiftには`debounce`/`throttle`というオペレーターが用意されていて、これを使うと

以下のように0.5秒間内のタップをフィルターしたりできます！

```swift:BindButton
button.rx_tap
   .throttle(0.5, MainScheduler.instance)
   .subscribeNext { _ in 
      print("Hello World")
   }
   .addDisposableTo(disposeBag)
```

ではボタンを押したらAPI通信をして、そのレスポンスで何かしたい場合はどうするか。
`flatMap`を使ってボタンのストリームをAPIのレスポンスのストリームに変えてあげる。
ここは僕も理解するのに時間がかかりました⇦

```swift:BindButton&API
button.rx_tap
   .throttle(0.5, MainScheduler.instance)
   .flatMap { _ -> Observable<Model> in // Modelはresponseの型
       return API.request() //ここは自前で用意する！レスポンスをObservableで返すRxのExtensionが必要かも
                 .catchError { _ in Observable.empty() } 
                 // エラーが流れてくると購読を終了してしまうので、empty()を返す必要がある
   }
   .subscribeNext { response in 
      // ここでresponseが引数で使える
      print("Hello \(response)")
   }
   .addDisposableTo(disposeBag)
```

## Variableってのも存在していて、これがまた便利

公式Docは[ここ](http://reactivex.io/documentation/subject.html)
Variableは値が変わればストリームがonNextされ、他で購読している場所も更新される。
(始めは僕も理解ができなかった。)

例として、true_buttonとfalse_buttonの二つを用意して、trueをタップしたら`activityIndicator`をアニメーションさせ、
falseをタップしたらアニメーションを終了させてみる

```swift:Variable
let loading: Varible<Bool> = Variable(false) //型パラメーターでどんな値もストリーム化できる

true_button.rx_tap
   .map { _ in true }
   .bindTo(loading)
   .addDisposableTo(disposeBag)

false_button.rx_tap
   .map { _ in true }
   .bindTo(loading)
   .addDisposableTo(disposeBag)

loading
   .bindTo(indicator.rx_animating)
   .addDisposableTo(disposeBag)
```

これで、ボタンを押してloadingの値がtrueかfalseに更新された時、下のところでloadingを購読しているところも更新される。
なのでactivityIndicatorをリアルタイムでアニメーションさせる事ができる。

値が変わった時に他の関係ある値も更新したい時(UIなど)はVariableを使うとすごく便利！
Variableにしておくことで値が変わった時に自動的にそのVaribleを購読している場所の値も更新される！

## まとめ
ざっと、覚えている例で初めてRxSwiftを触った最初の1-2ヶ月でよく使ったオペレーターや理解が難しかったけど、まず覚えると便利！なものをまとめてみました！
自分自身もっと川をひく勉強をしないとです(> <)
Ethnaのフォームテンプレート

#まず
- EthnaでPOSTしたいときのフォームテンプレートの忘備録です
- 実用的な実装は別途追加でする必要があります

#フォームテンプレート
- /app/action/Ethna/Post.phpにPOSTするためのフォーム

```tpl:post.tpl
<!-- POST用フォーム --!>
<form method="post" action="{$script}" enctype="multipart/form-data">

<!-- 隠れパラメータここから：action_XXXX_XXXXは適宜変更してください --!>
<input type="hidden" name="action_ethna_post" value="dummy"><br/>
<input name="hidden_param" type="hidden" value=""><br/>
<!-- 隠れパラメータここまで --!>

<!-- テキストボックスここから --!>
<input type="text" value="" name="user_name"><br/>
<!-- テキストボックスここまで --!>

<!-- チェックボックスここから --!>
<input type="checkbox" name="user_category[]" value="1" checked="checked">その1<br/>
<input type="checkbox" name="user_category[]" value="2" checked="checked">その2<br/>
<input type="checkbox" name="user_category[]" value="3" checked="checked">その3<br/>
<input type="checkbox" name="user_category[]" value="4" checked="checked">その4<br/>
<input type="checkbox" name="user_category[]" value="5" checked="checked">その5<br/>
<!-- チェックボックスここまで --!>

<!-- セレクトボックスここまで --!>
<select name="user_select">
<option value="1" selected>パターン1</option>
<option value="2">パターン2</option>
<option value="3">パターン3</option>
</select><br/>
<!-- セレクトボックスここまで --!>

<!-- テキストエリアここから --!>
<textarea name="user_profile"></textarea><br/>
<!-- テキストエリアここまで --!>

<!-- ラジオボタンここから --!>
<input type="radio" name="user_status" value="0" checked>無効
<input type="radio" name="user_status" value="1">有効
<br/>
<!-- ラジオボタンここまで --!>

<!-- 送信ボタン --!>
<input type="submit" value="送信">

<!-- POST用フォームここまで --!>
```

#アクセスすると
- cssは適宜適用してください

![スクリーンショット 2016-07-01 2.48.40.jpg](https://qiita-image-store.s3.amazonaws.com/0/92339/98f0f212-4b17-84af-612c-ec9056987c3e.jpeg)

#送信ボタンを押すとPOSTされる
- POSTされる値は以下のとおり

```php:var_dump($_POST)

array(7) {
  ["action_index"]=>
  string(5) "dummy"
  ["hidden_param"]=>
  string(0) ""
  ["user_name"]=>
  string(12) "山田太郎"
  ["user_category"]=>
  array(2) {
    [0]=>
    string(1) "1"
    [1]=>
    string(1) "4"
  }
  ["user_select"]=>
  string(1) "2"
  ["user_profile"]=>
  string(18) "はじめまして"
  ["user_status"]=>
  string(1) "1"
}
```
aggでアクセスログを単位時間ごとに集計する

アクセスログを単位時間ごとに集計して状況をみることが多いのですが、毎度毎度awkスクリプトを書くのに疲れたので、専用ツールを作ってみました。

https://github.com/winebarrel/agg

# Installation

OSXの場合はHomebrewでインストールできます。

```bash
brew install https://raw.githubusercontent.com/winebarrel/agg/master/homebrew/agg.rb
```

その他のOSはアーカイブを展開すれば実行できます。
https://github.com/winebarrel/agg/releases

# Usage

```
Usage of agg:
  -bar int
      ASCII bar length
  -s int
      Trim timestamp suffix length
  -t string
      count,countall,sum,avg,max,min (default "count")
```

# 実行例

まず、以下のようなアクセスログがあるとします。

```
$ cat access.log
12:10  FOO  100
12:10  FOO  200
12:10  BAR  300
12:11  FOO  200
12:11  BAR  300
12:11  BAR  400
12:12  ZOO  500
```

## Count系

何もオプションをつけないと、タイムスタンプをそのまま集計して、値ごとの件数を出します。

```
$ awk '{print $1, $2}' access.log | agg
12:10 BAR:1 FOO:2
12:11 BAR:2 FOO:1
12:12 ZOO:1
```

`-s`オプションを渡すと、指定された長さ分タイムスタンプの末尾を削ります。
下の例では10分ごとの集計になります。

```
$ awk '{print $1, $2}' access.log | agg -s 1
12:1  BAR:3 FOO:3 ZOO:1
```

`-t countall`で値ごとではなくすべての値の合計件数を出します。
また、`-bar`オプションで指定した最大値でのグラフを出します。

```
$ awk '{print $1, $2}' access.log | agg -t countall -bar 1
12:10 3 ###
12:11 3 ###
12:12 1 #
```

## 数値系

`-t sum`で値を数値と見なして、合計値を出します。

```
$ awk '{print $1, $3}' access.log | agg -t sum
12:10 600.000000
12:11 900.000000
12:12 500.000000
```

`-t avg` `-t max` `-t min`でそれぞれ平均値・最大値・最小値を出します。

```
$ awk '{print $1, $3}' access.log | agg -t avg
12:10 200.000000
12:11 300.000000
12:12 500.000000
```
```
$ awk '{print $1, $3}' access.log | agg -t max
12:10 300.000000
12:11 400.000000
12:12 500.000000
```
```
$ awk '{print $1, $3}' access.log | agg -t min
12:10 100.000000
12:11 200.000000
12:12 500.000000
```

`-bar`オプションを渡すと指定された最大値でグラフを表示します。

```
$ awk '{print $1, $3}' access.log | agg -t sum --bar 1000
12:10 600.000000  ##############################
12:11 900.000000  #############################################
12:12 500.000000  #########################
```

# 似たようなツール

[hystでコマンドラインでヒストグラムを書く - Qiita](http://qiita.com/winebarrel/items/95b2f52711cf9811a6c4)
後輩に教えたい情報収集術

世の中の動きを把握するため日々の情報収集は書かせません。これはエンジニアに限った話ではありませんが、流行り廃りの激しいこの業界、我々は貪欲な姿勢を維持していかなければなりません。

一方で、頭で理解していても具体的にどう実践したら良いのか分からないのも事実です。特に新人エンジニアはこの思いが強いのではないでしょうか？

そこで、私自身整理したいという意味も込めて、簡単なコメントを添えつつ情報収集の方法を公開していこうと思います。参考になれば幸い、そして他にもあればぜひ教えていただきたいです。

## 広く浅く
- 技術雑誌
  - [Software Design](http://gihyo.jp/magazine/SD)
  - [WEB+DB PRESS](http://gihyo.jp/magazine/wdpress)
  - [Web Designing](https://book.mynavi.jp/wdonline/)
- ネット
  - [はてなブックマーク　IT ホットエントリー](http://b.hatena.ne.jp/hotentry/it)
  - [@IT](http://www.atmarkit.co.jp/)

低レイヤーのSoftware Design、高レイヤーのWEB+DB PRESS、WebデザインのWeb Designingと、切り分けがされている。

はてなブックマークのホットエントリーはかなり有用。みんなが注目している記事がエントリーされるので、それだけ流行りの技術や話題に触れることができる。個人ブログも引っかかるので、ここから読者になっても良いだろう。

## 狭く深く
- 書籍
  - [O'Reilly](http://www.oreilly.co.jp/index.shtml)
  - [技術評論社](http://gihyo.jp/book)
  - [ITエンジニア本大賞](https://www.shoeisha.co.jp/campaign/award/)
- 個人ブログ
- 企業ブログ
  - [クックパッド開発者ブログ](http://techlife.cookpad.com/)

技術本はどれも高価だが、それに見合った内容になっているし読了感もバッチリ（特にO'Reillyは）。

技術評論社から出版されている「養成読本」シリーズはここ数年でITの各分野が網羅されつつある。このシリーズは狭く深くというよりは、その分野に対して広く浅くといったところか。

2014年から開催されている「ITエンジニア本大賞」に挙げられている本はどれも一級品。
特に「リーダブルコード」は今でもたまに話題として挙がっている。

個人ブログを書いている方はそれだけ尖っている人が多い。読むだけでなく自分からも発信していきたいところ。技術特化の個人ブログだとやはりはてなブログが多い印象。

企業ブログは仕事で書いているだけあって、現場の雰囲気や取り組みがよく伝わる。

## コミュニケーション
- SNS
  - [Twitter](https://twitter.com/)
  - [Facebook](https://www.facebook.com/)
- 勉強会
  - [dots.](http://eventdots.jp/)
  - [Doorkeeper](https://www.doorkeeper.jp/)
  - [connpass](http://connpass.com/)

各界の著名人をフォローしておくだけでも最新動向が把握できる。といってもSNSは趣味や技術外の普通のコミュニケーションに使用するケースが多い。

勉強会は「dots.」が広く検索できて良い感じ。

## 社会情勢
- ニュースアプリ
  - [SmartNews](https://www.smartnews.com/)
  - [gunosy](https://gunosy.com/)
- 新聞
  - [日本経済新聞](http://www.nikkei.com/)
- テレビ
- ラジオ

技術とは直接関係は無いものの、ビジネスとして技術を活用する点では、社会情勢を把握しておくことはとても重要。

個人的に（情報収集といった点では）時間が束縛されるテレビやラジオはあまり好みでない。新聞で流し読み、気になったものを熟読。

## 情報整理
- RSSリーダー
  - [feedly](https://feedly.com/)
  - [Inoreader](http://www.inoreader.com/)
- あとでよむ
  - [Pocket](https://getpocket.com/)
- Webノート
  - [Evernote](https://evernote.com)
  - [Onenote](http://www.onenote.com/)
- クラウドストレージ
  - [Dropbox](https://www.dropbox.com/)
  - [Google Drive](https://www.google.com/intl/ja_jp/drive/)
  - [One Drive](https://onedrive.live.com/about/ja-jp/)
- サービス連携系
  - [IFTTT](https://ifttt.com/)
  - [myThings](http://mythings.yahoo.co.jp/)

効率よく情報収集するためのツール。

RSSリーダーはお気に入りのサイトの更新状況を一元管理できる。Googleリーダーがサービス終了後はあれこれ試してみたがfeedlyに落ち着き、最近は話題になっているInoreaderを試している。

Pocketは後で読もうと思った記事をためこむことができるWebサービス。これのおかげでネットサーフィンする際に一つ一つの記事を熟読せずに済む。

Webノート、クラウドストレージでは気になった記事やPDFを保存。情報整理以外の用途でも汎用的に活用できる。ただしセキュリティ上、業務で使用するのはダメ。ゼッタイ。

サービス連携系は先発のIFTTT、後発で国産のmyThings。うまく分けられている。Twitterでお気に入りに入れるとEvernoteにツイートを保存したり、yahooの天気予報で雨と予報されたらスマホに通知が来たり、情報整理以外でも役立つ。最初の内はあれこれ設定してみたくなるが結局はすぐに止めてしまう、意外と使いこなすのが難しかったりする。
Python 3.4.3 と 3.4.4 の間で namedtuple の挙動が微妙に変わっていた件

今更感があるけど Python 3.4.3 と 3.4.4 の間で `namedtuple` の挙動が変わってたことを知ったので記録。

みんなだいすきな [`namedtuple`](http://docs.python.jp/3/library/collections.html#collections.namedtuple) 。
ほとんどタプル的な使い方をするけど、やっぱりクラスや辞書っぽく名前で参照したい時に使うやつ。

正しく `namedtuple` を使っている場合、この変更でほとんど困ることはないはず。

# 変更のコミットとドキュメント

## コミット

https://hg.python.org/cpython/rev/fa3ac31cfa44

- `__dict__` をオーバーライド操作しなくなった。
  - それにともなって `__getstate__` もオーバーライドしない
- `_asdict` は直接 `OrderedDict` を返すようになった。 

## ドキュメント

Python 3.4.3 と Python 3.4.4 の間のコミット。
ドキュメントについては、 3.4.X の最新が [Python 3.4 Documentation](https://docs.python.org/3.4/library/collections.html?highlight=namedtuple#collections.somenamedtuple._asdict) として記述されているので、 [Python 3.3 Documentation](https://docs.python.org/3.3/library/collections.html?highlight=namedtuple#collections.somenamedtuple._asdict) と比べる。

`namedtuple` に対しての `vars()` の記述が消えているのが分かる。

# どういうことがおこるか

自分がこれでハマった稀なパターンとして `namedtuple` を継承したサブクラスで `__slots__` を定義しなくても `_asdict` で正しく取得できるようになるため気が付かずにスルーしていて（この時点で誤りがある）、高いバージョンから低いバージョンに戻すときに何故か空の辞書が帰ってきて、初めてミスに気がついた。

## サンプルコード

```python
from collections import namedtuple


X = namedtuple('X', ('a', 'b'))


class Y(X):
    __slots__ = ()


class Z(X):
    # __slots__ = () を忘れた場合
    pass


x = X(1, 2)
y = Y(1, 2)
z = Z(1, 2)

print(x._asdict())
print(hasattr(x, '__dict__'))
print(y._asdict())
print(hasattr(y, '__dict__'))
print(z._asdict())
print(hasattr(z, '__dict__'))

```

## 結果: Python 3.4.3 (以前)

```console
OrderedDict([('a', 1), ('b', 2)])
True
OrderedDict([('a', 1), ('b', 2)])
True
{}
True
```

## 結果: Python 3.4.4 (以降)

```console
OrderedDict([('a', 1), ('b', 2)])
False
OrderedDict([('a', 1), ('b', 2)])
False
OrderedDict([('a', 1), ('b', 2)])
True
```

# 仕組み

- namedtuple が `__dict__` を持たなくなった。
 - `hasattr(target, '__dict__')` が `False` になる。
 - namedtuple で作った定義を継承して `__slots__ = ()` していれば `__dict__` を間接的に使う [`vars()`](http://docs.python.jp/3/library/functions.html#vars) を呼び出すとエラーになる。
   - それまでは `__dict__` が存在していたのでエラーにはならない。

- `__slots__ = ()` を忘れてもちゃんと空でない辞書が帰ってくるようになった。
  - [`__slots__` を利用する際の注意](http://docs.python.jp/3/reference/datamodel.html#notes-on-using-slots) にある通り、 `__slots__` をサブクラスで定義してない場合 `__dict__` に代入が行われる (もはやタプルでない) 。
  - 3.4.3 までは `__dict__` が破壊されて取れなくなっていたということ。
APK Analyzer使ってみた

AndroidStudio2.2から利用可能になるAPK Analyzerを使ってみました。
既にmultidex化して解決している方も多いかと思いますが、[64K Methods問題](https://developer.android.com/studio/build/multidex.html?utm_campaign=io16&utm_source=anddev&utm_medium=blog)の早期解決などに役立つかと思います。
## 準備
- 2016/6/30現在AndroidStudio2.2の正式版はリリースされていないのでpreview版をインストールします。
- 詳細は省略します。

## 使い方
AndroidStudioメニューの[Build] - [Analyze APK...]を選択します。
![image](https://qiita-image-store.s3.amazonaws.com/0/38164/e5233fa4-69c1-d1d5-9af9-771707085099.png)

ファイル選択のダイアログが立ち上がるので対象のapkを選択すると...  
以下のように結果が表示されます。
![image](https://qiita-image-store.s3.amazonaws.com/0/38164/fbc162fe-2dc5-ba09-a8e4-73fa53c5c5a6.png)

- ダウンロードサイズや、それぞれのファイルが何%占めているかといった内容が確認できます。
- このプロジェクトは既にメソッド数が64Kを超えていて、multidex化してあるためdexが複数あります。
- dexを選べば、パッケージごとやクラス単位で定義されているメソッド数と、参照メソッド数が確認できます。
- 右上の[Compare with...]使えば1つ前のバージョンのapkなどとの比較なども可能です。