OmniAICreator/Qiita-1.07M huggingface dataset:
protobufのC++実装でChainerのCaffeモデルの読み込みを10倍早くする


**chainer v.1.16.0から対応しました**

待望の[protobuf 3.0.0](https://github.com/google/protobuf/releases/tag/v3.0.0)がリリースされました。特に2系までPython 3では動作せず、Python 3がサポートされている3系の正式リリースが待望されていました。

余り知られていないと思いますが、protobufのPythonインターフェースには、内部的にPython実装とC++実装の2つの実装を持っており、後者のほうが圧倒的に早いのです。ChainerでCaffeのmodelzooファイルを読むと異様に遅いのは、前者のPython実装を使っているためです。例えばalexnetのモデルファイルの読み込みは、Python実装では120秒位かかっていたのが、C++実装では10倍速の10秒ほどですみました。かねてより、読み込みファイルサイズ上限（バッファサイズ上限があった）のせいで、modelzooで公開されているような巨大なファイルは読めず、これを回避する方法も最近取り込まれたようです。

# インストール方法

protobufのC++実装を使うには、ソースから入れる必要があります。これは、将来的に変わるかもしれません。
まず、protobufのC++のソースをとってきて解凍し、インストールします。

```
$ wget https://github.com/google/protobuf/releases/download/v3.0.0/protobuf-cpp-3.0.0.tar.gz
$ tar -xzf protobuf-cpp-3.0.0.tar.gz
$ cd protobuf-3.0.0 && ./configure && make && make install && ldconfig
```

次に、pythonパッケージのダウンロードとビルドです。先ほどと同じディレクトリで作業してください。ここで、`--cpp_implementation`を指定するとC++実装が使われます。

```
$ wget https://github.com/google/protobuf/releases/download/v3.0.0/protobuf-python-3.0.0.tar.gz
$ tar -xzf protobuf-python-3.0.0.tar.gz
$ cd protobuf-3.0.0/python && python setup.py install --cpp_implementation
```

これで終わりです。

# インストール時の注意点

必ずC++とPythonの両方のソースを同じディレクトリで解凍してください。また、C++を先にインストールしてください。これは、`setup.py`の中でC++のライブラリを相対ディレクトリで指定しているようです。将来的には`pip`からもインストールできるようになるかもしれません。

# 備考

pickleすると読み込みが早くなるという指摘を色んな所で受けています。当面はこれでいいかもしれません。pickleはバージョン間で互換性が取れないので（例えばpython2とpython3）、その点だけご注意を。
solver > Link > pythonでExcel Solverを解く

Excelのsolverをプログラムで解くにはどうするか。
python関連で探すと以下を見つけた。

http://stackoverflow.com/questions/4634317/excel-solver-in-python

> You are looking for NumPy (matrix manipulation and number-crunching) and SciPy (optimization). To get started, see numpy: learning resources

リンク先のリンク先はリンク切れになってしまっているので、フック用のキーワードを拾うものとしてだけ使えそう。

使ったteams.csvとgames.csvは不明。
国別に通信をブロック

* ubuntu 16.04にて確認

## 参考

* [Block country IPs for ufw – IMHO.GQ](https://imho.gq/wordpress/?p=378)

## iptables版

* [iptables and groups of ips](http://www.linuxquestions.org/questions/linux-security-4/iptables-and-groups-of-ips-523971/)

```bash:競合する?のでufw止める
ufw --force reset
ufw --force disable
```

```bash:block.sh
iptables -F
iptables -X

COUNTRY="cn"
ZONE=${COUNTRY}-aggregated
if [ ! -e ${ZONE}.zone ];then
    wget http://www.ipdeny.com/ipblocks/data/aggregated/${ZONE}.zone
fi

iptables -N ${ZONE}
cat ${ZONE}.zone | while read ip; do
    iptables -A ${ZONE} -s "$ip" -j DROP
done
iptables -A INPUT -j ${ZONE}
```

```bash:iptables一覧
iptables -nL
```

## ufw版

```bash:
ufw --force reset
ufw --force disable
ufw default allow
ufw --force enable

COUNTRY="cn"
if [ ! -e ${COUNTRY}-aggregated.zone ];then
    wget http://www.ipdeny.com/ipblocks/data/aggregated/${COUNTRY}-aggregated.zone
fi

cat ${COUNTRY}-aggregated.zone | while read ip; do
    echo -n $ip
    # ufw deny コマンドで登録すると10分はかかる
    ufw deny log from "$ip" to any
done
```

```bash:ufw一覧
ufw status verbose
```

合わせて読みたい

* [Ubuntu 12.04 LTSサーバーを安全にする](https://kore1server.com/249/Ubuntu+12.04+LTS%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%82%92%E5%AE%89%E5%85%A8%E3%81%AB%E3%81%99%E3%82%8B)
ChromeのデベロッパーツールからResourcesが消えた

ある日デベロッパーツールからResouercesが消えました。

![resorcesがない.PNG](https://qiita-image-store.s3.amazonaws.com/0/135574/87794b59-265b-89a1-733a-aec529d8ee41.png)


2日間捜索したところApplicationタブに生まれ変わっていることが判明しました。
![application.PNG](https://qiita-image-store.s3.amazonaws.com/0/135574/9381dd2d-480d-a921-b46c-6c4c3ac707c0.png)


最新版(バージョン52)にアップデートすると変わるようです。
vncserverの暗号化パスワードは解析できるから注意

## 参考

* [Crack or Decrypt VNC Server Encrypted Password • Raymond.CC](https://www.raymond.cc/blog/crack-or-decrypt-vnc-server-encrypted-password/)

## パスワード値の確認(Linux)

```bash:バイナリ確認コマンド
xxd ~/.vnc/passwd
hexdump ~/.vnc/passwd
hd ~/.vnc/passwd
```

```bash:vimで開いてxxdに食わせる場合
vim ~/.vnc/passwd
:%!xxd
```

* ubuntu16.04のtightvncserverのパスワードが解析できることを確認した。

## パスワード値の確認(windows)

* RealVNC
    * HKEY_LOCAL_MACHINE\SOFTWARE\RealVNC\vncserver\Password

* TightVNC
    * HKEY_CURRENT_USER\Software\TightVNC\Server\Password

* TigerVNC
    * HKEY_LOCAL_USER\Software\TigerVNC\WinVNC4\Password

* UltraVNC
    * C:\Program Files\UltraVNC\ultravnc.ini
    * Value: passwd or passwd2


## 解析

* http://tools88.com/safe/vnc.php
* http://aluigi.org/pwdrec/vncpwd.zip


## セキュリティ向上案

vncserverのパスワードは最長8文字。
どうしてもポート開放したい場合、以下が考えられる

1. 通信ポートの変更。5900〜5909あたりは避ける
1. xrdpを使う (user + passの認証となる)
1. sshトンネリング (VPNもあり)
1. ファイアウォールで接続元IP制限
1. noVNC + nginxでDigest(Basic)認証をかける
1. noVNC + nginx + 自己署名型証明書での制限
1. vinoを使ってTLS非対応のクライアントからの接続を防ぐ
1. RealVNCはPAM対応
1. vncserverを起動させっぱなしにしない

```bash:vnc60min.sh
pgrep Xtightvnc
if [ $? -eq 0 ];then
    echo "vncserverがすでに起動しています。"
    exit 0
fi

vncserver -geometry 1200x900 -depth 15 :1
echo "waiting 60 min"
sleep 3600
vncserver -kill :1
```

## 合わせて読みたい

* [TigerVNC 1.3.1 で暗号化通信を強制する方法 - meta's blog(2014-10-15)](http://w.vmeta.jp/tdiary/20141015.html#p02)
* [第60回　いまさらながらVNC［その2］：玩式草子─ソフトウェアとたわむれる日々｜gihyo.jp … 技術評論社](http://gihyo.jp/lifestyle/serial/01/ganshiki-soushi/0060)
MSC-MOD20 > SDモジュール ソフト > v0.8 > バージョン確認コマンド実装 > 2行の受信時、1行目の終端は0x0A

```txt:動作確認
ESP8266 (気圧計で使用したユニバーサル基板: I2Cを4.7kでプルアップ)
SDモジュール: MSC-MOD20 ( http://www.microtechnica-shop.jp/shopdetail/000000000026/ )
Analog Discovery 2 (以下AD2)
```

http://qiita.com/7of9/items/c7552f193432723a6755
の続き。

MSC-MOD20の癖を見つける。

バージョン確認コマンドを実装中。

## code v0.8

[v0.8 @ github](https://github.com/yasokada/esp8266_160730_MSC-MOD20p1/releases/tag/v0.8)

```
 * v0.8 2016 Aug. 01
 *   - add Test_SDversion()
 *   - MSCMOD20lib: add MSCMOD_CheckVersion()
 *   - add GPIO14 for Analog Discovery 2 trigger
```

## 実行例

Vコマンドで取得したバージョンとACK(!00)をシリアル出力。

```txt:結果
v2.0.0
!00

v2.0.0
!00
```

## I2C波形

AD2で取得した波形。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/8f075606-5452-41ff-0bcd-e01229e32437.png)

取説によると、Vコマンドは`V<LF>`を送信して以下のような文字列を受ける。

```
v1.0.8
!00
```

`v1.0.8`という文字列の最後は0x0A, 0x00で終端していると思っていたが、波形を見ると0x0Aで終端し、そのすぐあとに`!00`(h21, h30, h30)が来ることが分かった。
0x00は2行の文字列の一番最後だけに来る、ということらしい (画像の一番右側の波形)。
Javaで動的にクラスパスを追加する

Javaで動的にクラスパスを追加する。テストのときにおすすめ。


```java
static {
String fileName = "./path";
File file = new File(fileName);
URLClassLoader sysloader = (URLClassLoader) ClassLoader
.getSystemClassLoader();
@SuppressWarnings("rawtypes")
Class sysclass = URLClassLoader.class;
@SuppressWarnings("rawtypes")
Class[] parameters = new Class[] { URL.class };
try {
@SuppressWarnings("unchecked")
Method method = sysclass.getDeclaredMethod("addURL", parameters);
method.setAccessible(true);
@SuppressWarnings("deprecation")
URL url = file.toURL();
method.invoke(sysloader, new Object[] { url });
} catch (Throwable t) {
t.printStackTrace();
}
}
```
UIAlertControllerを簡単に使う！ALRTがSwift 4.1に対応しました

UIAlertControllerを簡単に使うためのライブラリALRTがSwift 4.1に対応しました:metal_tone1:
https://github.com/mshrwtnb/ALRT

## ALRT ?
ALRTは、UIAlertControllerを簡単に呼び出すことができるライブラリです。
`.alert`, `.actionSheet`両方のpreferredStyleに対応しています。

```swift
ALRT.create(.alert, title: "Show me some alert").addOK().addCancel().show()
```

## 実行環境
* Xcode 9.3
* Swift 4.1
* iOS 9.0以上

## インストール方法
### Cocoapods

```
pod "ALRT"
```

### Carthage
```
github "mshrwtnb/ALRT" ~> 1.2.0
```

## サンプルコード
### 例1 .alert表示
ALRTを使わず、オーソドックスにUIAlertControllerを作成し、表示するにはこのようなコードが必要です。

```swift
let alertController = UIAlertController(title: "Show me some alert", preferredStyle: .alert)

let okAction = UIAlertAction(title: "OK", style: .default)
let cancelAction = UIAlertAction(title: "Cancel", style: .cancel)
alertController.addAction(okAction)
alertController.addAction(cancelAction)

self.present(alertController, animated: true)
```

しかし、ALRTを使えば、これだけで済みます。

```swift
import ALRT
ALRT.create(.alert, title: "Show me some alert").addOK().addCancel().show()
```

### 例2 .actionSheet表示、Actionタップをハンドリング
UIAlertActionのタップハンドリングはTrailing Closureで行うことができます。   
以下の例ではタップされるとメッセージがprintされます。

```swift
ALRT.create(.actionSheet, title: "ALRT", message: "Show me some action sheet")
    .addAction("Option A") { _, _ in print("Option A has been tapped!") }
    .addAction("Option B") { action, textfield in print("\(action.title!) has been tapped!") }
    .addDestructive("Destructive Option")
    .show()
```

## 独自アラートを定義しておきたい場合

```swift
// 例： 通信エラー
extension ALRT {
    class func showNetworkError() {
        ALRT.create(.alert, title: "Network Error", message: "Check your internet connection and try again")
             .addOK()
             .show()
    }
}

ALRT.showNetworkError()
```

## Special Thanks
* @shimesabaさんに[レビューいただいておりました。](http://www.cl9.info/entry/2017/08/01/220000)ありがとうございます。
技術英語 > most [error-prone] routines were those that were larger than 500 lines of code

@ Code Complete (No. 6184 / 36077)

> most <font color=red>error-prone</font> routines were those that were larger than 500 lines of code.

http://ejje.weblio.jp/content/prone
> 傾向があって、(…し)がちで、(…し)やすくて、うつむけになった、平伏した

<hr>
lingueeで例文を調べてみた。

http://www.linguee.jp/%E8%8B%B1%E8%AA%9E-%E6%97%A5%E6%9C%AC%E8%AA%9E/%E7%BF%BB%E8%A8%B3/prone+to.html

>  in a mobile environment where communication is <font color=red>prone</font> to being intercepted. 
> 通信が遮断し易いモバイル環境


某ミキプルーンの宣伝は某氏が宣伝に出る<font color=red>傾向がある</font>。
(Note: なお、proneの発音は「プルーン」ではありません。）
Gin使ってみた

## 参考

* [Gin Web Framework](https://github.com/gin-gonic/gin/blob/develop/README.md)
* [http - The Go Programming Language](https://golang.org/pkg/net/http/)


## 手順

```java:index.go
package main

import (
    "github.com/gin-gonic/gin"
    "net/http"
)

func main() {
    r := gin.Default()
    r.LoadHTMLGlob("templates/*")

    r.GET("/note", func(g *gin.Context) {
        page := g.Query("page")
        g.HTML(http.StatusOK, "note.html", gin.H{
            "page":   page,
        })
    })

    r.POST("/confirm", func(g *gin.Context) {
        //memo := g.Request.FormValue("memo")
        memo := g.PostForm("memo")
        g.HTML(http.StatusOK, "confirm.html", gin.H{
            "memo":   memo,
        })
    })

    r.GET("/", func(g *gin.Context) {
        g.HTML(http.StatusOK, "index.html", gin.H{
            "title": "Main website",
        })
    })

    r.Static("/assets", "./assets")

    r.Run(":8080")
}
```

----

```html:templates/index.html
<link rel="stylesheet" href="assets/sample.css">
<h1>{{ .title }}</h1>
```

```css:assets/sample.css
h1 {
    background-color: #ddd;
}
```

----

```html:templates/note.html 
<li>page: {{ .page }}

<li><a href="/note?page=1">1</a>
<li><a href="/note?page=2">2</a>
<li><a href="/note?page=3">3</a>
<li><a href="/note?page=4">4</a>

<form method="post" action="/confirm">
	memo: <input type="text" name="memo" values="">
	<input type="submit" value="確認">
</form>
```

```html:templates/confirm.html 
<li>memo: {{ .memo }}
```



## 起動

```
go get github.com/gin-gonic/gin
go run index.go
```

* 応答確認
    * http://localhost:8080/
    * http://localhost:8080/note
Homebrewでsitecopyはインストールできなくなったんや…

いわゆるホームページ的なものの一括ダウンロード用に重宝している`sitecopy`なのですが、もうすでにboneyard扱いなのですね…

で、Homebrewからうまくインストールできなかったので手順メモ

```bash:インストール失敗
$ brew tap homebrew/boneyard
$ brew install sitecopy
==> Installing sitecopy from homebrew/boneyard
==> Downloading http://www.manyfish.co.uk/sitecopy/sitecopy-0.16.6.tar.gz
Already downloaded: /Users/ks/Library/Caches/Homebrew/sitecopy-0.16.6.tar.gz
==> ./configure --prefix=/usr/local/Cellar/sitecopy/0.16.6 --with-libxml2 --with
Last 15 lines from /Users/ks/Library/Logs/Homebrew/sitecopy/01.configure:
checking for inet_ntop... yes
configure: IPv6 support is enabled
checking for working AI_ADDRCONFIG... no
checking for socklen_t... yes
checking for struct tm.tm_gmtoff... yes
checking for struct tm.__tm_gmtoff... no
configure: zlib not supported
checking whether to enable ACL support in neon... no
checking for pkg-config... no
checking for library containing RSA_new... -lcrypto
checking for library containing SSL_library_init... -lssl
checking openssl/ssl.h usability... no
checking openssl/ssl.h presence... no
checking for openssl/ssl.h... no
configure: error: OpenSSL headers not found, cannot enable SSL support

READ THIS: https://git.io/brew-troubleshooting
sitecopy was moved to homebrew-boneyard because it has unfixable issues.
Please do not file any issues about this. Sorry!
```

お…おぅ(´・ω・｀)

ということで、いろいろと参考に弄ってみるも…

参考：[El Capitanでソースをコンパイルしたときにopensslのエラーが出た場合の対処方法](http://qiita.com/marumaru/items/ca801c957986302f6fe6)

なにやらうまくいかないので、Homebrewでのインストールはあきらめることに。

最終的には


```bash:.bash_profile
export CPPFLAGS=-I/usr/local/opt/openssl/include -L/usr/local/opt/openssl/lib
```

と、OpenSSL関連の設定を環境変数に入れた状態で、

```bash:make&install
$ tar zxvfp ~/Library/Caches/Homebrew/sitecopy-0.16.6.tar.g
$ cd sitecopy-0.16.6/
$ ./configure --with-libxml2 --with-ssl
$ make
$ sudo make install
```

無事インストール完了( ´ ▽ ` )ﾉ

ていうか、もう大分更新もされてないし、代替えの方法考えた方がいいのかな…
C言語で現在時刻文字列をワンライナーで格納する

# 例 (C99以降で動作)

```c:strftimeを使う
#include <stdio.h>
#include <time.h>
 
int main(void)
{
    char buf[20];
    strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S", localtime(&(time_t){time(NULL)}));
    puts(buf);
    return 0;
}
```

```c:直接特定のアイテムのみ参照する&#32;(変数が完全に不要)
#include <stdio.h>
#include <time.h>
 
int main(void)
{
    printf("只今%d時です\n", localtime(&(time_t){time(NULL)})->tm_hour);
    return 0;
}
```

# 注意

スレッドセーフな処理をしたければ `localtime` の代わりに `localtime_r` を使う

# 参考

- [Stackoverflow - Pointer to literal value](http://stackoverflow.com/questions/1564701/pointer-to-literal-value)
純粋仮想関数が呼ばれてしまう場合

##エラーだよねこれ

コンストラクタやデストラクタでクラスを指定せずに仮想関数を呼ぶのは最低でも警告、純粋仮想関数を呼ぶのはエラーにすべきだと思う。

新しい規格ではもうなっているのかも知れないけど完全に静的に判定できるのでC++11の時点でとっくになっていてもおかしくなかった内容だ。

##その理由

vtableは他のメンバと同様に親から順に初期化されるので、親クラスのコンストラクタが走っている状態では一切オーバーライドされていない状態になっている。

ここで純粋仮想関数になっているメンバを呼んでしまうとvtableがオーバーライドされていないために純粋仮想関数が呼ばれてしまう...というのが機序。

ただの仮想関数の場合自クラス及び祖先クラスのメンバを呼ぶのは正当なのでクラスを指定することでエラーになる可能性を回避できるようになっている必要があるし無指定でも結果は安定なので警告でもよさそうだが、純粋仮想関数ではそもそも呼ぶ対象がないのでエラーにすべき。

またデストラクタでは逆順になるので純粋仮想関数でもvtableに値が入っているが、子クラスはすでにデストラクタが走ったあとなのでその呼び出しは無効だ。またただの仮想関数の場合でも子クラスのメンバが設定されている可能性が高いので指定がない場合はエラーにしていいと思う。
XCTestでカバレッジを確認する

#はじめに
XCTestでカバレッジの確認をする方法について書きます。

XCTestのテストコードの書き方などについてはこちらを参考にしてみてください。
XCTest入門Part1 (Swift)
http://qiita.com/okuderap/items/97f9d6026d0da59fef38

非同期処理のテストについてはこちらを参考にしてみてください。
XCTest入門Part2 (Swift) ~非同期編~
http://qiita.com/okuderap/items/e02b73880b8bc499debe

#確認できること
C0(ステートメントカバレッジ)のみ確認することができます。

#確認方法
Shift + Command + 「<」で、
Edit Schemeを開きます。
<img width="883" alt="スクリーンショット 2016-08-01 3.09.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/103695/6ce4377a-3862-9044-d36c-65c658d18027.png">

「Test」を選択して、Code Coverageにチェックをつけます。
<img width="876" alt="スクリーンショット 2016-08-01 3.10.06.png" src="https://qiita-image-store.s3.amazonaws.com/0/103695/a91da927-e65e-372c-2c0b-6bffdb988c1b.png">


テストを実行します。

実行後、Report Navigator(ナビゲータエリアの1番右のアイコン)から
実行したテストのレポートを選択します。
<img width="1239" alt="スクリーンショット 2016-08-01 3.29.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/103695/2ff00cfb-ea8c-e73d-733e-dc548bd0ee35.png">


Coverageをクリックすると、確認することができます。
<img width="1197" alt="スクリーンショット 2016-08-01 3.29.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/103695/5b702593-8caa-b2f5-3272-41bc023a05ad.png">


この例はModelクラスを対象としてテストをしましたが、
Model.swiftを選択してみると、addSuffixPというメソッドの処理を網羅できていないことがわかります。
<img width="977" alt="スクリーンショット 2016-08-01 3.29.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/103695/1cb7e145-6ebd-8993-fdc7-5936c2f5718a.png">

ダブルクリックで、対象のコードに飛ぶことができます。
コードの右側の数字がテストで呼ばれた回数を示しており、0の箇所が赤くなっています。
<img width="1015" alt="スクリーンショット 2016-08-01 3.33.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/103695/d06db3eb-ecf7-28e1-10dd-ea6ba4b41fbe.png">
赤くなっている0の箇所にカーソルをあてると、以下のように対象の行が赤くなります。
<img width="1010" alt="スクリーンショット 2016-08-01 3.34.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/103695/b8f216a7-f8bc-5633-3812-f8c9792fb4d7.png">
また、0ではない箇所にカーソルをあてると、以下のように対象の行が緑になります。
<img width="1016" alt="スクリーンショット 2016-08-01 3.34.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/103695/3941c4d5-9243-98ff-fc5f-7d039e83f410.png">

#最後に
カバレッジを確認することでテスト漏れを防ぐことができそうです。
GitBookのMarkdownでも段落内改行したい！

# 注意

**GitBook version 3.2.2で修正されているようなので、この記事は無視してください**

``gitbook-plugin-markdown-parse-add-br``をご利用の皆様は直ちにgitbookのバージョンを上げ、``package.json``および``book.json``からこのパッケージを除去してください。

# 背景

>http://blog.kengo-toda.jp/entry/2015/03/29/124356
>文中の改行が空白に変換されてしまうため、段落をすべて1行で書ききる必要があります。

どういうわけか、GitBookのMarkdown parserは段落内改行、つまりスペース2つでの改行をさせてくれません。これは困ります。

[gitbook-plugin-japanese-support](https://github.com/KazuhiroKuwabara/gitbook-plugin-japanese-support)

という改行を強制除去することで空白挿入を回避するプラグインもありますが、このプラグインはコードブロック内まで改行除去してくるので、[問題になることがあります](https://github.com/asciidwango/js-primer/issues/105)。

# 作ったもの

https://github.com/yumetodo/gitbook-plugin-markdown-parse-add-br/tree/master
https://www.npmjs.com/package/gitbook-plugin-markdown-parse-add-br

![無題4.png](https://qiita-image-store.s3.amazonaws.com/0/94177/aac3d270-f605-77b4-4bda-71924ea5d9aa.png)  
写真は昔読んでた某二次創作サイトの小説をとりあえずGitBookに変換してみたもの。


ようは行末のスペース2つを``<br>``に置き換えればいいわけです。が、先程も言ったようにコードブロック内は無視してくれないと困るので、正規表現での置換ができず、``String.prototype.indexOf``をforで回すとかいう荒業を使っています。

```json:package.json
{
  "devDependencies": {
    "gitbook-cli": "^2.1.2",
    "gitbook-plugin-markdown-parse-add-br": "^1.0.3",
  }
}
```

```json:book.json
{
  "gitbook": ">=3.0.0",
  "plugins": [
    "markdown-parse-add-br"
  ]
}
```

こんな感じで書き足せば使えます。

# 苦労したこと

- 普段C++erなもんで、[まずはC++で置換コード書いた](https://github.com/yumetodo/gitbook-plugin-markdown-parse-add-br/blob/master/C%2B%2B/parse.cpp)んだけど、どうやってJavaScriptに移植しようかで5時間くらい悩んだ。あってよかった、``String.prototype.indexOf``と~~``String.prototype.substr``~~(追記:``String.prototype.substr``はAnnex Bだから`String.prototype.substring`を使うべきらしい)
- npmのパッケージ作るのなんて初めてだから結構試行錯誤した。  
[初めてのnpm パッケージ公開](http://qiita.com/TsutomuNakamura/items/f943e0490d509f128ae2)  
に感謝
- ``package.json``の``engine``にgitbookを書かないとエラーになることに気がつくのに時間かかった。
typescript getContext()でエラー


TypeScriptでChartjsをしていたのだけど、下記のソースで``` Property 'getContext' does not exist on type 'HTMLElement'.```と怒られてしまった。

```ts:修正前.ts
var ctx = <HTMLCanvasElement> document.getElementById('lineChartCanvas').getContext("2d");
```

下記に修正することで解決


```ts:修正後.ts
var canvas = <HTMLCanvasElement> document.getElementById('lineChartCanvas');
var ctx = canvas.getContext("2d");
```

[参考url]
http://stackoverflow.com/questions/13669404/typescript-problems-with-type-system
Macro Pardise: annottee と expandee


[以前の記事](http://qiita.com/hiroshi-cl/items/0ee4bf494779f62e2373)で Macro Paradise の提供するマクロアノテーション機能について紹介しました。マクロアノテーションは、アノテーションで修飾された定義文 (annottee) を展開対象 (expandee) としたマクロ展開を行うことができる機能です。基本的に annottee = expandee なのですが、一部一致しない場合が存在します。これを利用して delegation を実現したマクロ [scala-macro-aop](https://github.com/adamw/scala-macro-aop) を例に解説したいと思います。なお、このマクロは Scala 2.11 では動かないので[修正したバージョン](https://github.com/hiroshi-cl/scala-macro-aop)も用意しておきました。ちなみにこのマクロは名前とは違いAOPとは特に関係ありません。

## Delegation

それでは、scala-macro-aop による delegation について解説します。ちなみに、口を酸っぱくして繰り返しますが、AOPとは特に関係がありません。

このライブラリでは、クラスのパラメータに `@delegate` アノテーションを付加するとそのパラメータとなったクラスのメソッドが生成されます。以下は公式の例から持ってきたものです。

```scala
trait Foo {
  def method1(): String
  def method2(p1: String): Long
  def method3(p1: String): Int
  def method4(p1: String, p2: Long): String
}

class FooWrapper(@delegate wrapped: Foo) extends Foo {
  def method2(p1: String) = 41L
}
```

この例では、`FooWrapper`クラスのパラメータ`wrapped: Foo`に`@delegate`がついています。これによって、`FooWrapper`クラスには`Foo`クラスのメソッド`method1`,`method3`,`method4`が自動で追加されます。なお、このとき元々存在する`method2`は上書きされず、追加されません。

ここで `@delegate` はマクロアノテーションです。クラスのパラメータは内部的に `val wrapped: Foo` という変数定義の一種として扱われるため、ここにアノテーションを置くことができます。

ところで、この delegation は以前説明した annottee = expandee という単純な図式では実現できません。この例では、annottee は `wrapped: Foo` という極めて狭い範囲にすぎませんが、メソッドを追加するには expandee をより広く取る必要があります。

## Macro Paradise での解決

この範囲が狭すぎる問題を Macro Paradise では、パラメータのときは expandee を広げることで解決しています。より具体的には、クラス・トレイト・メソッド定義のパラメータ・型パラメータが annottee のときは、expandee を外側のクラス・トレイト・メソッド定義としています。

では、マクロ定義を見てみましょう。以下のソースコードはレポジトリから抜粋したものです。

```delegateMacro.scala
  def impl(c: Context)(annottees: c.Expr[Any]*): c.Expr[Any] = {
    // (略)
    val inputs = annottees.map(_.tree).toList
    val (_, expandees) = inputs match {
      case (param: ValDef) :: (enclosing: ClassDef) :: rest => {
        val newEnclosing = addDelegateMethods(param, enclosing)
        (param, newEnclosing :: rest)
      }
      // (略)
    }
    // (略)
}
```

今回のように annotte と expandee が異なる場合には、annottee と expandee がそれぞれ別々に渡されます。具体的には、リスト `annottees` の1番目が annottee (`wrapped: Foo`)、2番目が expandee (`class WrappedFoo` 全体) です。ちなみに、クラスパラメータの場合にはコンパニオンオブジェクトも expandee に含まれるので、3番目にはコンパニオンオブジェクトが入ります。

## 長所・短所

この Macro Paradise のように expandee を広げるアプローチですが、一長一短あります。長所としては、表現力が上がり、今回のようにアプリケーションを増やすことができます。一方、短所としては、広げれば広げるほどその分だけ書き換えが面倒くさくなります。極端なことを言えば、プログラム全体ぽんと渡されて必要なところだけ書き換えろと言われても、困ってしまいます。それはコンパイラを作るくらい面倒なことで、これではマクロとはいったい何だったのでしょうか。何でもできるくらい表現力が高いというのは裏返せば、ユーザーにすごく努力させなければ何もできないということと同じということですね。

## 終わりに

今回は Macro Paradise の細かい機能について紹介しました。Macro Paradise は今後 scala.meta ベースになるなど、今回の話がいつまでもそのまま使えるかというとそれは難しいです。しかしながら、そのアプローチは未来の Scala だけでなく、ほかの言語でも活かしていけるのではないかと思います。
正規表現をテスト・可視化できるサイト

個人メモで〜す。

Javaの正規表現をテストしたい時につかえるサイト。

* http://regex-testdrive.com/ja/

正規表現を可視化してくれるサイト。

* https://jex.im/regulex/
* https://regexper.com/
Vagrant と VirtualBoxで開発環境

#VagrantとVirtualBoxをインストール

MAMP便利なので開発をしていたら、他のプロジェクトとデータ集積のため、
ローカル開発環境を作ることになったので、忘れないように記載していきます。

##Virtural BoxとVagrantのインストール
1.Virtual Boxのインストール元
              [VirtualBox](https://www.virtualbox.org/)

2.Vagrantのインストール元
              [Vagrant](https://www.vagrantup.com/)

##VirtualBoxのインストール
###1.[VitualBox](https://www.virtualbox.org/)にいき、VirtualBoxをダウンロード
![vb0.png](https://qiita-image-store.s3.amazonaws.com/0/133961/8e8f2864-ef49-d921-98de-54e6eabd72a1.png)


###2.[DOWN LOAD画面](https://www.virtualbox.org/wiki/Downloads)
![vb1.png](https://qiita-image-store.s3.amazonaws.com/0/133961/f0fc6b3a-f90a-84c5-7b7d-44b47ed271ea.png)

###3.インストーラーを起動してそのままインストール
基本てきなアプリと一緒なのでかきません。

###4.ダウンロードの確認
ターミナルを開いて以下を確認できればとりあえず。
*****
VirtualBox --help

*****
ヘルプの内容が確認できればとりあえず完了かと。
--versionを使わないのは、アプリが起動して終了とかおすの面倒くさいのでやりません。

###Vagrantのインストール
###1.[Vagrant](https://www.vagrantup.com/)にいき、ダウンロード
![スクリーンショット 2016-08-01 1.10.25.png](https://qiita-image-store.s3.amazonaws.com/0/133961/253d0252-62c4-c255-2c62-da42c28363d8.png)

###2.[DOWN LOAD画面]（https://www.vagrantup.com/downloads.html）
![Vagrant_Download.png](https://qiita-image-store.s3.amazonaws.com/0/133961/88513348-ea8a-09e2-072c-ddf2705c0c45.png)

###3.おそらく、聞かれるダウンロードしますか？？
![do-u-do-it.png](https://qiita-image-store.s3.amazonaws.com/0/133961/cc8b486e-cd02-33d9-c6bf-9edeb99c4d76.png)

###4.インストーラー関連に関しては特にかきません。
基本的なアプリケーションと一緒なので、特に不自由なく行けるかと思います。

###5.インストールの確認
terminalを開いて　vagrant -v　でversionの確認ができればとりま、大丈夫！！
*****
vagrant&nbsp;-v
Vagrant 1.8.1
*****

続きはそこそこのペースで書きます。
仕事が終わっていれば。
Toppers/ASP for Renasas RX: uartによるstandard io

# uartによるログ入出力を使えるようになりました
　GR-SAKURAターゲットでログの入出力コードの検証をしました。sampleアプリで動作確認しています。
 PCとデバイスを以下の設定で接続すれば使用できます。

- 使用するSCIデバイス
 - SCIc0
- 使用するIOポート
 -  TX : P20
 -  RX : P21
- GR-SAKURAにおけるコネクタ
 - TX : CN8 Pin 1
 - RX : CN8 Pin 0
- ボーレート 
 - 9600 

# 今後の予定
 とりあえず使いたい機能を一通り評価したので次はGR-KAEDE(RX64M)への移植をする予定です。
移植に伴い、RX CPU共通のコードとチップ依存のコードの分離、サポート出来ないコードの削除を行います。
NativeScript+TypeScriptでネイティブAPIを呼び出す


TypeScriptはコードの正当性を厳密にチェックするが故、ネイティブなAPIをコールしようとして

```ts
var dictionary = new NSDictionary();
```

なんてやると、見事にNSDictionaryなんてクラスは存じ上げませぬ、と文句を言われる。
なので、ネイティブAPIを定義したモジュールが公式で用意されていて、プロジェクトフォルダのトップで

```
npm install tns-platform-declarations --save-dev
```

なんて打ってやれば、とりあえずはたいていのクラスが定義されたモジュールがロードされるので、reference.d.tsに

```
/// <reference path="./node_modules/tns-platform-declarations/ios.d.ts" />
/// <reference path="./node_modules/tns-platform-declarations/android17.d.ts" />
/// <reference path="./node_modules/tns-platform-declarations/org.nativescript.widgets.d.ts" />
```

を追記してやれば、とりあえずエラーはなくなる。

が。

ネイティブAPIはNativeScriptが実行時にリフレクションで呼び出してくれるのであって、暗黙的な変換、例えばNSArrayな引数にJavaScriptの配列を与える、などを利用しようとすると、これまた引数の型がNSArrayじゃねーぞと怒られる。

これではもんげー困るので、ネイティブAPIなんてコード補完いらないぜ！　って人は、

```ts
declare var NSDictionary: any;
//＜中略＞
var dictionary = new NSDictionary();
```

ってやっちまった方が早いです。

なお、当然ながらdeclareはクラス内とかではなくトップレベルにて定義してください。
リングバッファで自分より前のデータを検索する

#リングバッファの構成

```c
#define MAX 5
char ring[MAX];   //リングバッファ
```

ring[0] [1] [2] [3] [4]が確保される。

```c
char write;       //書込み位置
char read;        //読込み位置
char work;
char point;       //検索ポイント
char search;


char lp,i;
```

#書込み動作

```c
ring[ write ] = xxx;
write = (write + 1) % MAX;
```

書込み位置が 0→1→2→3→4→0　と変化する。

#読込み動作

```c
work = ring[ read ];
read = (read +1) % MAX;
```

同じく読込み位置が 0→1→2→3→4→0　と変化する。

#自分より前のデータから検索位置まで検索させる動作

```c
point = 2;
```

read の値が 0の場合検索するバッファは【4,3,2】
read の値が 1の場合検索するバッファは【0,4,3,2】
read の値が 2の場合検索するバッファは【-】
read の値が 3の場合検索するバッファは【2】
read の値が 4の場合検索するバッファは【3,2】

```c
lp = (((read - point) < 0 ? read - pint + MAX : read - point);

/* search = (read -1) % MAX; */ /* wrong */
search = (read + MAX - 1 ) % MAX;

for(i=0;i<lp;i++){
    if (ring[search] == xxx) {
        //検索一致の処理
        break;
    }
    search = (search + 1) % MAX;
}
```
アセットバンドルマニフェストをEditorでファイルからロードする

# アセットバンドルビルドマニフェスト

[BuildPipeline.BuildAssetBundles](https://docs.unity3d.com/ScriptReference/BuildPipeline.BuildAssetBundles.html) を呼ぶと[AssetBundleManifest](http://docs.unity3d.com/ja/current/Manual/BuildingAssetBundles.html) が返ります。
このとき、アセットバンドル出力先フォルダ(仮にAssetBundlesフォルダ)にAssetBundlesとAssetBundles.manifestというマニフェストファイルが生成されます。
このマニフェストファイルから AssetBundleManifest への変換をEditor上でしたかったのですが、方法が見当たらなかったのでメモを残しておきます;-D

#　AssetBundleManifest ファイルからの読み込み

まずは以下のManifestHelper.csを保存して…

```csharp
using UnityEditor;
using UnityEngine;

public static class ManifestHelper {
	public static AssetBundleManifest LoadAssetBundleManifest(string path) {
		AssetBundleManifest ret = default(AssetBundleManifest);
		AssetBundle assetBundle = default(AssetBundle);
		try {
			assetBundle = AssetBundle.LoadFromFile(path);
			ret = (AssetBundleManifest)assetBundle.LoadAsset("AssetBundleManifest", typeof(AssetBundleManifest));
		} catch (System.Exception e) {
			Debug.LogError("Exception occur: " + e);
		} finally {
			if (assetBundle != null) {
				assetBundle.Unload(false);
			}
		}
		return ret;
	}
}
```

Assets/AssetBundles/フォルダにあるAssetBundles(.manifest拡張子が付いてない方)をロードしたい場合は、

```csharp
AssetBundleManifest manifest = ManifestHelper.LoadAssetBundleManifest(System.IO.Path.Combine(Application.dataPath, "AssetBundles/AssetBundles"));
```

で読み込めます。

以上です。
【Laravel：Eloquentクラス】fillableとguardedの指定はどちらかだけでいい

insertやcreateメソッドでテーブルのカラムに値を挿入する事ができます。
そのような複数代入をする際に、**予期せぬ代入**が起こることを防ぐために、
モデルへ**fillable**か**guarded**を設定する必要があります。

##「予期せぬ代入」って？
複数代入による予期せぬ代入とは、製作者が意図していない代入のことです。
ユーザーから変えてほしくない値（例えばidや管理者権限を管理するカラムなど）
を自由に変えることができてしまったら困ってしまいますよね😭😭😭 事件になります。

入力によって変動する値を安全に管理するために、以下の指定が必要となります。

##【方法】fillableとguardedの設定
**$fillable - ホワイトリスト_複数代入時に代入を許可する属性を配列で設定**

```
protected $fillable = ['name', 'age', 'updated_at'];
```
**$guarded  - ブラックリスト_複数代入時に代入を許可しない属性を配列で設定**

```
protected $guarded = ['id'];
```

Eloquentクラスにて上記の設定を行うことで、複数代入における許可設定が可能となります。

## 【注意】fillableとguardedの指定はどちらかだけでいい
fillableとguardedの設定は**どちらか一方のみで大丈夫です**
これらの**両者の属性を両方同時に設定することはできません！**
注意です。

このように設定方法は二種の設定方法があります。
コードの可読性を意識して状況ごとに使い分けましょう！！


ドキュメントにも記述してありましたが、こちらの文面のみではあまり理解がしづらい部分が個人的にあったため今回まとめさせていただきました。
参考：Laravel5.1 Eloquent https://readouble.com/laravel/5/1/ja/eloquent.html
Azureの無料試用期間終了後に無料オプションを使う Part-1

Azureの試用期間が終わっても無料で使える機能がありますので、それを使ってみようと思います。
[https://azure.microsoft.com/ja-jp/free/pricing-offers/](https://azure.microsoft.com/ja-jp/free/pricing-offers/)

参考
[http://genesis-tdsg.blogspot.jp/2015/08/azure_24.html](http://genesis-tdsg.blogspot.jp/2015/08/azure_24.html)

関連ページ
[Azureの無料試用期間終了後に無料オプションを使う Part-2](http://qiita.com/tworks55/items/6bd477b2295813a9d12f)
***

#無料試用期間終了時点の状況
##メールで有料サブスクリプションへの移行催促
Azureの無料試用期間が終わったら以下のようなメールが来ます。
![image](https://qiita-image-store.s3.amazonaws.com/0/131481/6c56e850-a078-9da1-33ea-67e0bbb680a2.png)

##サブスクリプションのアップグレード
Portalへ行くと、リソースなどのサブスクリプション名が「（無効）無料試用版」となっています。
![image](https://qiita-image-store.s3.amazonaws.com/0/131481/c4e34ad5-d6ea-4fe0-0e41-4debf333e98e.png)

サブスクリプションを確認すると以下のような状態になっており、サブスクリプションのアップグレードが必要です。
今すぐ変換をクリックします。
![image](https://qiita-image-store.s3.amazonaws.com/0/131481/14b4575f-923f-77f7-be22-6ec6519142dc.png)


表示された画面で「サブスクリプションは期限切れです。ここをクリックして～」をクリックします。
![image](https://qiita-image-store.s3.amazonaws.com/0/131481/89ad9c21-7e5b-fba9-c88e-68f954b64d83.png)


表示された画面で「はい」をクリックすると「キャンセル」ボタンが「今すぐアップグレード」ボタンに変わりますのでクリックします。
![image](https://qiita-image-store.s3.amazonaws.com/0/131481/d945c486-26dd-8424-143d-6d1b160e41c4.png)

アップグレードが完了すると以下の表記になります。
![image](https://qiita-image-store.s3.amazonaws.com/0/131481/2cca7120-c25b-7e76-2164-00948ebfc2c1.png)

Portalでの表記も以下のようになります。
![image](https://qiita-image-store.s3.amazonaws.com/0/131481/2502725b-e51c-41fc-c3a5-7da1ddad7745.png)

##課金されるのはいつから？
サブスクリプションを従量課金に変更する際に、課金されるサービスが残っていた場合は即時課金されるようです。。。
![image](https://qiita-image-store.s3.amazonaws.com/0/131481/8a142ea6-f63d-9a9e-b963-d377968fc980.png)

サブスクリプションの設定にリソースごとのコストを確認できる画面があります。
※少しわかりにくいので参考程度にしかならない気がします。慣れてくると見やすいのかもしれませんが、、、
![image](https://qiita-image-store.s3.amazonaws.com/0/131481/525dc02c-3f54-046e-6c89-f99a6546fdbb.png)


ということで私の場合は直ぐにリソースグループをすべて削除し、Azureをきれいにする作業が必要でした。
![image](https://qiita-image-store.s3.amazonaws.com/0/131481/d8e40a07-daef-efc8-d7ba-f878d135e65a.png)

すべてのリソースグループを削除後にPortalを確認すると6JPYは消えましたが、従量課金の概要は¥6のままです。
![image](https://qiita-image-store.s3.amazonaws.com/0/131481/3bba9b46-ecef-eead-a038-32bbe56bcf08.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/131481/1b9626e3-4e19-ac82-0f87-653e5eff5da0.png)

##数時間後
再びPortalのサブスクリプションにアクセスすると¥17になっており、従量課金の概要も¥18になっていました。
しばらく様子をみてから無料オプションを利用することにしました。

続きは次回Part-2にて。 

***
##補足
そういえば結構前に以下のような案内が来ていましたので、試用期間中にアップグレードすれば¥20,500 分を使い終わる前にリソースをすべて削除できたのかもしれません。

>評価版をまだご利用いただいていないようです。期限切れになる前に、ぜひご利用ください。ご存じのとおり、評価版には 1 か月間使用できる ¥20,500 分のクレジットが含まれています。

>無料評価版の内容にご満足いただいた場合は、無料評価版の有効期限が切れる前に有料サブスクリプションにアップグレードしてください。評価期間が終了するまでは未使用のクレジットを引き続きご利用いただけます。
方法は次のとおりです。
1.Azure にサインインする
2.無料評価版サブスクリプションを選択する
3.[今すぐアップグレード] をクリックし、[はい、サブスクリプションをアップグレードします] をクリックする
JavaScriptで学ぶ関数型プログラミング(１章)

今日から、オライリー本のJavaScriptで学ぶ関数型プログラミング(https://www.oreilly.co.jp/books/9784873116600/ )を読破していきたいと思う。

その内容を章ごとにまとめて記事にしていきます


今回のテーマはこちら

#１章　関数型JavaScriptへのいざない

Underscore.js　関数型プログラミングをサポートする
 
Underscore.jsの関数を呼ぶためには、_.times()のように_のメソッドを呼ぶ。
jQueryでいう$ですね。


##関数型プログラミングの特性
関数型プログラミング・・・戻り値として関数を返す関数を定義する
・例えるなら関数型プログラミングは、原料を入れると徐々に製品を組み立てていく組み立てラインの機械であると表現できる。
・オブジェクト指向と対比させると，このような違いに置き換えられる
 - オブジェクト指向　物事を「名詞」で分ける
 - 関数型プログラミング　物事を「動詞」で分ける


##〜型プログラミングの種類

 関数型プログラミング
 - scala Clojureなど

 宣言型プログラミング　
 - SQLなど

 命令型プログラミング
 - FORTRAN、C言語、Javaなど

詳しくは２章で・・・


##動作単位としての関数

定義済みの配列から指定した要素番号の要素を取り出すnaiveNth(nth関数)


```
var letters = ['a','b','c'];

function nth(a, index) {
	return a[index];
}

nth(letters, 1);	// => b
```


______________________________________________________
2番目の要素を返す動作を抽象化したsecond関数

```
function second(a) {
	return nth(a, 1);
}

second(['a', 'b']);		// => b
second(["fogus"]); 		// => o

```

Array#sortメソッド
- comparator()を持つ
comparator() - JavaScriptの基本的動作単位の一つ。二つの値を引数に取り，第一引数 - 第二引数を返す

Array#sortメソッドがデフォルトで持つcomparatorは配列内の要素を文字列に変換して比較を行い，辞書順にソートする
[2, 3, -1, -6, 0, -108, 42, 10].sort(); // => [-1, -108, -6, 0, 10, 2, 3, 42]
これではダメだ。文字列的に並び替えるのではなく、数学的に並び替えるためにはどうすればいいのか。
多くのJavaScriptプログラマは以下のように書くだろう


```
[2, 3, -1, -6, 0, -108, 42, 10].sort(function(x, y){
	if(x < y) return -1; 
	if(x > y) return 1;
	return 0;
})

// => [-108, -6, -1, 0, 2, 3, 10, 42]
```
無名関数に命名する場合はこう。同じ結果が得られる

```
function compareLessThanOrEqual(x, y){
	if (x < y) return -1;
	if (y > x) return 1;
	return 0;
}

[2, 3, -1, -6, 0, -108, 42, 10].sort(compareLessThanOrEqual);
```

他の例

```
function nth(a, index){
	return a[index];
}

function second(a) {
	return nth(a, 1);
}

function third(a) {
	return nth(a, 2);
}

/*____________CSVファイルを読み込み、それを配列に格納するための関数_________________*/

function lameCSV(str){
	return _.reduce(str.split("¥n"), function(table, row){
			table.push(_.map(row.split(","), function(c){return c.trim()}));
			return table;
		},[]);
};

/*___________________________________________________________________________*/


function selectNames(table){
	return _.rest(_.map(table, _.first));
}


function selectAges(table){
	return _.rest(_.map(table, second));
}

function selectHairColor(table){
	return _.rest(_.map(table, third));
}

var peopleTable = lameCSV("name,age,hair¥nMerble,35,red¥nBob,64,blonde");
console.log(peopleTable);
```



```
function existy(x) { return x != null };	//return文の後に条件式が来た場合trueかfalseが返り値となる

function truthy(x) { return (x != false) && existy(x) };

function executeIfHasField(target, name){
	return doWhen(existy(target[name]), function(){
		var result = _.result(target, name);
		console.log(['結果は', result].join(''));
	});
}

executeIfHasField([1,2,3], 'reverse');
executeIfHasField({foo: 42}, 'foo');
executeIfHasField([1,2,3], 'notHere');
```

１章では主に関数型プログラミングとは何か、関数型プログラミングの例を学んだ．

２章　→　coming soon
datetimeで曜日を調べる

pythonのdatetimeモジュールで曜日を調べるにはweekdayメソッドを使うといい。
weekdayメソッドはオブジェクトが作る日付の曜日を0-6の数字で返してくれる。
0が月曜日、1が火曜日で6が日曜日なので月〜日を格納したリストを用意しておけば曜日に変換できる。

```python:
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import sys
from datetime import *
from time import *

print "以下の形式で日付を入力してください 例：'2016/07/30'."
user_input_date = raw_input("日付:")
yobi = ["月","火","水","木","金","土","日"]
while user_input_date != "bye":
    try:
        a = datetime.strptime(user_input_data,'%Y/%m/%d')
        print "{}は{}曜日です".format(user_input_date,yobi[a.weekday()])
    except ValueError:
        print "誤った日付です"
    user_input_date = raw_input("your date :")
else:
    sys.exit(1)
```

python3.xで書くとこんな感じ。

```python:
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import sys
from datetime import *
from time import *

print ("日付を入力してください '2016/07/30'.")
user_input_date = input("your date :")

yobi = ["月","火","水","木","金","土","日"]

while user_input_date != "bye":
    try:
        a = datetime.strptime(user_input_date,'%Y/%m/%d')
        print ("{}は{}曜日です".format(user_input_date,yobi[a.weekday()]))
    except ValueError:
        print ("誤った日付です")
    user_input_date = input("your date :")
else:
    sys.exit(1)
```
Slackで毎日の朝会時や隔週のスプリント終了時など通知を送る

# Slackとは

Slackは世界で爆発的に導入が進んでいるチャットツールです。
無料プランと有料プランがありますが、まずは無料プランで試してみるのがいいでしょう。

以下にアクセスし、メールアドレスを入力して
**Create a new team** をクリックすれば、すぐにチームを作って始めることが出来ます。

https://slack.com/
![slack_create_a_team.JPG](https://qiita-image-store.s3.amazonaws.com/0/101999/f9ef0d23-99ef-5c43-02b3-3d952f9b054a.jpeg)

# リマインダーを設定する
Slackはリマインダー機能があり、任意のタイミングで通知を送らせることが可能です。
通知があるとポップアップ表示で教えてくれます。

設定はメッセージ入力欄で行います。
![slack_reminder.JPG](https://qiita-image-store.s3.amazonaws.com/0/101999/945b608a-932e-773b-7487-cbe330aa8226.jpeg)


書式は以下のようになります([]は不要です)。
対象としては、自分、特定のユーザー、チャンネルに対して通知が可能です。

```
/remind [me or @ユーザー or #チャンネル] [メッセージ] [時間]
```

なお、satoさんへの通知を設定したい場合でも、satoさんとの会話を開いてからコマンドを入力する必要はありません。
スラッシュはじまりで入力した場合、 **スラッシュコマンド** と呼ばれる便利な機能が使えます。
`/remind` はそれの1つです。

satoさんの会話ではなく、どの会話のおいても設定が可能です。

ただ、作業ミスをしてしまうことはあり得ますので、
自分自身との会話で設定することをオススメします。
自分自身との会話をする場合、 **あなたの名前(you)** というユーザーを選びます。

なお、チャンネルへのリマインダは、設定した瞬間に
設定された旨がチャンネル上の会話に見えてしまいますので、ご注意ください。

設定例を紹介します。

- **5分後**に自分に送る
    - `/remind me カップラーメンが出来ました in 5min`
- 佐藤さんを**12時**にランチに誘う
    - `/remind @sato ランチに行きませんか？ at 12:00`
- **8/1の11時**に自分に送る
    - `/remind me 外出です。 on 8/1 at 11:00`
- **平日の11時に**朝会の通知をチャンネルに送る(every weekdayは平日)
    - `/remind #team1 朝会の時間です。 at 11:00 every weekday`
- **毎週木曜15時**の定例MTGの通知をチャンネルに送る
    - `/remind #team1 定例です。 at 15:00 every Thursday`
- 毎週木曜18時に、**チャンネルの特定のメンバー**に通知を送る
    - `/remind #team1 "@sato @tanaka  リーダー定例です。" at 18:00  every Thursday`
- **隔週金曜11時**にスプリント終了の通知をチャンネルに送る(every other Fridayは隔週金曜日)
    - `/remind #team1 今日でスプリントが終了します。 at 11:00 every other Friday`
- **毎月1日11時**に勤怠申請の通知をチャンネルに送る
    - `/remind #team1  勤怠申請をしましょう at 11:00  1st of every month`


# リマインダーの確認方法

`/remind list`と入力すると、設定されているリマインダーを確認することが出来ます。
各リマインダーにはDeleteのリンクが表示されます。クリックすることで削除をすることが出来ます。


# リマインダーのヘルプ

`/remind help` と入力すると、設定例が表示されます。
![slack_remind_help.JPG](https://qiita-image-store.s3.amazonaws.com/0/101999/c98ff3b3-cd78-5c47-026f-17058b899b48.jpeg)


Slack Help Centerにはもっと詳細な情報が記載されています。
https://get.slack.help/hc/en-us/articles/208423427-Setting-reminders
[Swift]画像形式をNSDataと拡張子から判別する


## 画像バイナリデータ(NSData)から画像形式を判別

```swift
//NSDataを拡張
extension NSData {
	func imageTypeForImageData() -> String? {
		var c = [UInt32](count: 1, repeatedValue: 0)
		self.getBytes(&c, length: 1)
		switch (c[0]) {
		case 0xFF:
			return "jpeg"
		case 0x89:
			return "png"
		case 0x47:
			return "gif"
		case 0x42:
			return "bmp"
		default:
			return nil
		}
	}
}
```

## 画像ファイル名の拡張子から画像形式を判別

```swift
//NSURLを拡張
extension NSURL {
	func imageTypeForExtention() -> String? {
		let ext = self.pathExtension!.lowercaseString
		switch ext {
		case ".jpg" , ".jpeg":
			return "jpeg"
		case ".png":
			return "png"
		case ".gif":
			return "gif"
		case ".bmp":
			return "bmp"
		default:
			return nil
		}
	}	
}
```

## 例：Alamofireでmimetypeを指定して画像アップロードする

```swift
// imageData:NSData?
// fileUrl:NSURL?
// image:UIImage
Alamofire.upload(
    .POST,
    "https://httpbin.org/post",
    multipartFormData: { multipartFormData in
      if let imageType = imageData?.imageTypeForImageData() {
          //バイナリから画像形式の判別
          multipartFormData.appendBodyPart(data: imageData!, name: "file", fileName: "IMG."+imageType, mimeType: "image/"+imageType)
      } else if let imageType = fileUrl?.imageTypeForExtention() {
          //拡張子から画像形式の判別
          multipartFormData.appendBodyPart(data: imageData!, name: "file", fileName: "IMG."+imageType, mimeType: "image/"+imageType)
      } else {
          // 判別できないものはJPEG形式の画像フォーマットとしてNSDataに変換
          let data:NSData = UIImageJPEGRepresentation(image , 1.0)!
          multipartFormData.appendBodyPart(data: data, name: "file", fileName: "IMG.jpg", mimeType: "image/jpeg")
      }
    },
    encodingCompletion: { encodingResult in
        switch encodingResult {
        case .Success(let upload, _, _):
            upload.responseJSON { response in
                debugPrint(response)
            }
        case .Failure(let encodingError):
            print(encodingError)
        }
    }
)
```

## 参考
[Finding image type from NSData or UIImage](http://stackoverflow.com/questions/4147311/finding-image-type-from-nsdata-or-uiimage)
[Path extension and MIME type of file in swift](http://stackoverflow.com/questions/31243371/path-extension-and-mime-type-of-file-in-swift)
[Alamofire](https://github.com/Alamofire/Alamofire)
[自分用メモ] BlenderのSpline IKをボーンで制御する

尻尾のようなモデルをIKで制御したいときに使用するとよいSpline IKの設定手順。
自分用のメモなので質問などは受け付けてません。

例えば下記のようなモデルを尻尾のようなふるまいで動かしたいときなど。
![image](https://qiita-image-store.s3.amazonaws.com/0/36154/648d5a3b-b8d3-8e85-002c-0a9db7e679c9.png)

# モデル、ボーン、ウェイトの作成
モデルを作成して、ボーンを追加、頂点にウェイトを設定する。

# ベジェオブジェクトを追加
尻尾のボーンに沿うようにベジェオブジェクトを設定する。

このとき[Shift + TAB]でスナップしてベジェを調整するとやりやすい。
![image](https://qiita-image-store.s3.amazonaws.com/0/36154/0e69cd7b-e4c8-a84e-f9f6-ddeb07af5902.png)

このようにボーンに沿った形にベジェを調整する。
ベジェオブジェクトには方向があるので注意。(HEADとTAILと言うのかは分からないけども、、、)
![image](https://qiita-image-store.s3.amazonaws.com/0/36154/83267c8a-fe32-5586-716a-eea8132353e8.png)

ベジェの制御点がIKの制御点になるので、アニメーションのことを考慮して制御点を追加する。
![image](https://qiita-image-store.s3.amazonaws.com/0/36154/4434fccc-0d49-1c27-2f19-47edde23f69f.png)



# 制御用ボーンの追加
先ほど追加したベジェの制御点は全部で5つなので、
その数に合うように制御用のボーンを追加する。

このとき追加するボーンの親を削除しておく。
![image](https://qiita-image-store.s3.amazonaws.com/0/36154/f5bd3b22-a43c-a4c0-bb29-bf0c7d47f195.png)


##ボーンの位置の調整
ベジェの制御点を選択して、3Dカーソルを選択物に移動する。([Shift + S])
![image](https://qiita-image-store.s3.amazonaws.com/0/36154/a08d2e1e-2e4e-ea09-e81e-0953eb3021df.png)

そしてボーンのヘッドを「選択物→3Dカーソル」でベジェの制御点へ移動する。([Shift + S])
![image](https://qiita-image-store.s3.amazonaws.com/0/36154/066721dc-4cab-5732-8b35-91139778ca90.png)

ベジェの制御点へボーンを移動した結果
![image](https://qiita-image-store.s3.amazonaws.com/0/36154/c85be934-0515-4589-eadd-d51c9286d800.png)


# Spline IKの追加
尻尾の先頭にスプラインIKを追加する。
![image](https://qiita-image-store.s3.amazonaws.com/0/36154/e013cd97-4d44-85e8-e367-2b51bf0ebd6d.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/36154/ddeaa9e3-8faa-2c60-4658-9fb3631e27cc.png)


# フックの設定
ボーンのポーズモードでスプライト制御用のボーンを選択する。
![image](https://qiita-image-store.s3.amazonaws.com/0/36154/1dc4326a-a73d-1c38-a9e7-d777bab96a8d.png)

Shiftを押しながらベジェオブジェクトを選択して編集モードに変更する。([TAB])
ポーズモードで選択したボーンと対になるベジェオブジェクトの制御点を選択して
[Cntrl + H]を実行する。
![image](https://qiita-image-store.s3.amazonaws.com/0/36154/53fa8ccb-c5e8-b49c-a797-5991feea127b.png)

ベジェオブジェクトのモディファイヤを確認すると以下のようにフックモディファイヤが追加されている。
![image](https://qiita-image-store.s3.amazonaws.com/0/36154/a5381f6d-e59b-2f42-e996-aace9b788319.png)



# テスト
制御用のボーンを動かすと、ベジェ曲線が変更され、その曲線にそってボーンが移動する。
![image](https://qiita-image-store.s3.amazonaws.com/0/36154/40312ef4-f7c0-4eec-cda4-2038be8f31a3.png)
バッチごとのプロセスメトリクス (CPU, Memory など) を可視化してみた所感

モチベーションとしては、複数のバッチが並行して実行されているサーバーで、それぞれのバッチごとの CPU 使用率やメモリ使用量を可視化したかった

![image](https://qiita-image-store.s3.amazonaws.com/0/24932/aa9caa71-1955-7cc4-2a30-c4cf6cccddc7.png)![image](https://qiita-image-store.s3.amazonaws.com/0/24932/31da805b-89a1-b566-17c4-98f2555c42a4.png)

可視化して良かった点

- バッチサーバーの CPU 使用率 or メモリ使用量を減らしたいときに、どのバッチを改修すればいいのかすぐに決めやすくなった
- その後、バッチの改修によって CPU 使用率 or メモリ使用量が減ったかどうかがひと目でわかるようになった

既存のプラグインなどで適うものがなかったので自作した

### 実装方法

https://github.com/yoheimuta/Linux-GetPidstat
https://metacpan.org/pod/Linux::GetPidstat

- Perl 製
 - linux-get-pidstat というコマンドラインツールが付属する
 - 名前の通り Linux 向け
- pidfile をもとに、プロセスメトリクスを収集して Mackerel に送信するコマンドラインツール
 - 書き出す先は Mackerel ではなくファイルでもいい

__特徴__

- [pidstat(1)](http://man7.org/linux/man-pages/man1/pidstat.1.html) の出力結果を Mackerel に送る
 - たとえば、60 秒間、毎秒 pidstat を実行した結果の平均値を出力するなど
 - 子プロセスや孫プロセスの結果を加算することができる
- 適当なフォルダに置いてある pidfile を対象プロセスとして読み取る

__準備: pidfile の作成__

- 対象のバッチプロセスが起動時に pidfile を作成して、終了時に削除するようにした
 - perl のプログラムだったので [Proc::PID::File](http://search.cpan.org/~ecalder/Proc-PID-File/File.pm) を使った

__準備: linux-get-pidstat のインストール__

```
cpanm Linux::GetPidstat
```

__linux-get-pidstat の定期実行__

- crontab で毎分実行する

```
* * * * * user linux-get-pidstat  --no-dry_run --pid_dir=/var/tmp --mackerel_api_key=your_api_key --mackerel_service_name=your_service 2>&1 >> /tmp/linux-get-pidstat.log
```

- コマンドオプションはつぎの通り

```
$ carton exec -- linux-get-pidstat --help
Usage:
        linux-get-pidstat - command description
          Usage: command [options]
          Options:
            --pid_dir               A directory path for pid files
            --res_file              A file path to be stored results
            --interval              Interval second to be given as a pidstat argument (default:1)
            --count                 Count number to be given as a pidstat argument (default:60)
            --dry_run               Dry run mode. not run the side-effects operation (default:1) (--no-dry_run is also supported)
            --datetime              Datetime (ex. '2016-06-10 00:00:00') to be recorded
            --include_child         Flag to be enabled to include child process metrics (default:1) (--no-include_child is also suppoted)
            --max_child_limit       Number to be used for limiting pidstat multi processes (default:30) (skip this limit if 0 is specified)
            --mackerel_api_key      An api key to be used for posting to mackerel
            --mackerel_service_name An mackerel service name
          Requirement Programs: pidstat and pstree commands
```
gradle.propertiesの使い方が正しくなくてCircleCI導入にハマった

# この記事について

- 今更ですがCircleCIを個人プロジェクトに導入してみようかと始めてみました
- が、全然buildが通らなくて途方に暮れかかったものの
- `BuildConfig` の作り方 (build.gradleの記述方法) が良くなかったのが原因でした、という話
- メモ程度のものなので雑ですがとりあえず残しておく

# 起きたこと

- 今回CircleCIを導入したプロジェクトは、TwitterなどのAPIキーを `gradle.properties` に書くようにしてました
- [この記事](http://stackoverflow.com/questions/35440907/can-circle-ci-reference-gradle-properties-credentials) を参考にし、`app/gradle.properties` を 設定値から作成するbashスクリプトを作成
- ところが下記のエラーが起きてbuildが通らず

```
> Building 75% > :app:compileDebugJavaWithJavac/home/ubuntu/bbbbbb-android/app/build/generated/source/buildConfig/debug/pj/aaaa/bbbbb/BuildConfig.java:15: error: cannot find symbol
> Building 75% > :app:compileDebugJavaWithJavac  public static final String TWITTER_CONSUMER_KEY = xxxxxxxxxxxxxxxxxxx;
> Building 75% > :app:compileDebugJavaWithJavac                                                    ^
> Building 75% > :app:compileDebugJavaWithJavac  symbol:   variable xxxxxxxxxxxxxxxxx
> Building 75% > :app:compileDebugJavaWithJavac  location: class BuildConfig
> Building 75% > :app:compileDebugJavaWithJavac/home/ubuntu/bbbbbb-android/app/build/generated/source/buildConfig/debug/pj/aaaa/bbbbb/BuildConfig.java:16: error: cannot find symbol
> Building 75% > :app:compileDebugJavaWithJavac  public static final String TWITTER_CONSUMER_SECRET = xxxxxxxxxxxxxxxxxxxxxxxxxxxxx;
> Building 75% > :app:compileDebugJavaWithJavac  
```

## そこで

- testのコマンドに、下記を追加してBuildConfigを表示

```
cat app/build/generated/source/buildConfig/debug/pj/aaaa/bbbbb/BuildConfig.java
```

- そしたら、Stringのフィールドに "" が無い

```
public static final String TWITTER_CONSUMER_KEY = xxxxxxxxxxxxxxxx;
public static final String TWITTER_CONSUMER_SECRET = xxxxxxxxxxxxxx;
```

## なぜ？

- build.gradleでは下記のようにbuildConfigFieldを書いていた

```
buildConfigField "String", "TWITTER_CONSUMER_KEY",  TWITTER_CONSUMER_KEY_DEBUG
buildConfigField "String", "TWITTER_CONSUMER_SECRET",  TWITTER_CONSUMER_SECRET_DEBUG
buildConfigField "int", "LOG_LEVEL", "3" // DEBUG
```

- そして、`gradle.properties` を下記のように書いていた
- 上記で触れた自動生成のscriptでも "" で挟むようにしてた

```
TWITTER_CONSUMER_KEY_DEBUG="xxxxxxxxxxxxxxxxx"
TWITTER_CONSUMER_SECRET_DEBUG="xxxxxxxxxxxxxxxxxx"
```

- どうやらlocal環境では、build.gradleの `TWITTER_CONSUMER_KEY_DEBUG` が "" 込みで置き換わるらしい
- ところが、CircleCIの上では、""が入らない (何が原因かは分からないが)

## そこで

- build.gradleを下記のように書き換えた ("" で挟むようにした)

```
buildConfigField "String", "TWITTER_CONSUMER_KEY", "\"" + TWITTER_CONSUMER_KEY_DEBUG + "\""
buildConfigField "String", "TWITTER_CONSUMER_SECRET", "\"" + TWITTER_CONSUMER_SECRET_DEBUG + "\""
buildConfigField "int", "LOG_LEVEL", "3" // DEBUG
```

- `gradle.properties` から ""を取った
- 上記で触れた自動生成のscriptでも "" で挟むのをやめた
  
```
TWITTER_CONSUMER_KEY_DEBUG=xxxxxxxxxxxxxxxxx
TWITTER_CONSUMER_SECRET_DEBUG=xxxxxxxxxxxxxxxxxx
```

## 一応これで

- うごきました。
２つの画像の差分を簡単に出力できる package

[image-diff](https://github.com/uber/image-diff)

２つの画像を比較して、差分を出力してくれる package です。同じ画像かどうか boolean で返してもくれます！

簡単に使えて、便利そう。

# 使い方

npm でインストールします。事前に [ImageMagick](http://www.imagemagick.org/script/index.php) も入れておく必要があります。

```
npm install image-diff
```

準備万端！使ってみる。

こんなくだらない画像を用意してみました

|sample1.png|sample2.png|
|:-----:|:-----:|
|![sample1.png](https://qiita-image-store.s3.amazonaws.com/0/41416/c7ef1716-10f7-356c-f0bd-9eee4585934b.png)|![sample2.png](https://qiita-image-store.s3.amazonaws.com/0/41416/1a74c5c9-e126-0cb8-08a9-3c78ad8aad8f.png)|

node を起動して

```js
var imageDiff = require('image-diff');
imageDiff({
  actualImage: 'sample1.png',
  expectedImage: 'sample2.png',
  diffImage: 'difference.png',
}, function (err, imagesAreSame) {
  // err : 例外時に Error が渡されます
  // imagesAreSame : image がマッチしたか・アンマッチだったか Boolean で渡されます
});
```

出力された画像がこちらです。

|difference.png|
|:----------:|
|![difference.png](https://qiita-image-store.s3.amazonaws.com/0/41416/9c9542cd-3cd3-480b-29ac-828d79d0a413.png)|

画像サイズが若干ちがう？？のか、「ち」「と」も薄く差分が出てしまいましたが、ちゃんと差分部分が出力されました！！

同じパターンも見てみます。

|sample1.png|sample3.png|
|:-----:|:-----:|
|![sample1.png](https://qiita-image-store.s3.amazonaws.com/0/41416/c7ef1716-10f7-356c-f0bd-9eee4585934b.png)|![sample3.png](https://qiita-image-store.s3.amazonaws.com/0/41416/1f14a908-666d-5b0e-b8ad-efa26abeaeba.png)|

コマンドラインインターフェイスも用意されているようなので、使ってみます。

```
image-diff sample1.png sample3.png difference.png
```

同じ画像なので、真っ白な画像が出力されました！

|difference.png|
|:----------:|
|![difference.png](https://qiita-image-store.s3.amazonaws.com/0/41416/f63d9971-ba01-1c9f-3273-75e4cdd6c373.png)|

また、コマンドラインからもマッチしたかどうか Boolean で確認できます。

```
> image-diff sample1.png sample2.png
> echo $?
=> 1

> image-diff sample1.png sample3.png
> echo $?
=> 0
```

便利だ！（コマンドライン使うなら ImageMagick の [compare](http://www.imagemagick.org/script/compare.php) でも良い気がしますが）