OmniAICreator/Qiita-1.07M huggingface dataset:
OpenWhisk の RESTエンドポイントメモ

# はじめに
OpenWhisk をちまちま使ってみようとしているので忘れないようにメモ

## Bluemix OpenWhisk
とりあえずBluemix版で感触をつかむ

### マイ・アクション
Bluemix OpenWhisk の`Develop`タブを開くと作成済みのアクションやルールが表示されます。
※デフォルトで下記の`Hello World`用のアクションとシーケンスがあります。
![image](https://qiita-image-store.s3.amazonaws.com/0/11547/0e411cb9-a175-acc0-8afc-a338e8a2b99a.png)

右下に表示される「RESTエンドポイントの表示」を選択します。
![image](https://qiita-image-store.s3.amazonaws.com/0/11547/6640bd17-18f5-f180-4d5f-c326fe3f915c.png)


APIで呼び出すためのエンドポイントの情報が表示されます。
![image](https://qiita-image-store.s3.amazonaws.com/0/11547/1c5fc50c-454c-7a5b-7109-19fcdf545dec.png)

cURLでの実行方法が書いてあるので参考に。
![image](https://qiita-image-store.s3.amazonaws.com/0/11547/27ad52ba-a8c2-cc02-3b49-c833e9a4a5d0.png)


エンドポイントURLへの`POST`をそのまま投げると`401`が返ってきますのでAPI Keyを設定します。
![image](https://qiita-image-store.s3.amazonaws.com/0/11547/0c20c636-9cc5-e6db-a90e-3557b39c0cff.png)


API Keyの確認には画面左上の「資料」を選択します。
※ちゃんとした管理画面あるようでしたら誰か教えてください・・・
![image](https://qiita-image-store.s3.amazonaws.com/0/11547/6d1606c0-131a-b82e-1b3f-5ac97a81f715.png)

新しいタブが開くので「iOS SDK」を選択します。
`WhiskAppKey` `WhiskAppSecret`がAPI Keyになるのでこれを使います。
![image](https://qiita-image-store.s3.amazonaws.com/0/11547/5737143f-8e45-f140-ff4a-946654b5c9f5.png)


API Key設定しエンドポイントURLへのPOSTが成功すると`activationId`が返ってきます。
![image](https://qiita-image-store.s3.amazonaws.com/0/11547/d1a2f0d6-2a51-c857-7638-49c50b4144c2.png)

Bluemix OpenWhisk の`Monitor`タブで先程返ってきた`activationId`と同じ値のアクティビティー・ログが出ているのが確認できます。
![image](https://qiita-image-store.s3.amazonaws.com/0/11547/5829e55a-25b9-74b9-a9cf-866adeb34aac.png)

### マイ・シーケンス
シーケンスもアクションと同様にRESTで実行してみたいと思います。
アクションと同様にRESTのエンドポイントを確認してみますが今度はありません。
![image](https://qiita-image-store.s3.amazonaws.com/0/11547/ff34c36f-e93c-9517-6b72-78369b95a9bf.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/11547/82e8707d-30bf-5310-38c8-5c2110418b8b.png)

APIをコールすると判るのですがシーケンスもアクションの扱いになっています。
`annotations`のvalueでシーケンスなのか何らかの単一アクションなのか区別しているようです。
[IBM Bluemix penWhisk API Docs](https://console.ng.bluemix.net/apidocs/98-ibm-bluemix-openwhisk?&language=node#get-all-actions)
![image](https://qiita-image-store.s3.amazonaws.com/0/11547/3ef2fc5c-2f88-c4e7-3775-8ef9c10fa3f3.png)


ということでシーケンスの場合も実行方法は単体のアクションと基本は同じで良くて
URLの後半`/actions/Hello%20World`となっていた部分を`/actions/My%20First%20Sequence`に変更して実行します。
![image](https://qiita-image-store.s3.amazonaws.com/0/11547/6c9ff527-6361-dfeb-1591-0b75a6fad7a1.png)

先程返ってきた`activationId`と同じ値の`My First Sequence`のアクティビティー・ログが出ているのが確認できます。
続く`Hello World`と`echo`はシーケンス定義の順に呼び出しがされていることも確認できます。
![image](https://qiita-image-store.s3.amazonaws.com/0/11547/c1e7b9a5-9391-e391-16ca-4a3c09923920.png)

### ちょっとした疑問

API KEYに関して資料の「CLI」のページに以下のような記述があります。
`認証モデルでは、各名前空間に固有の認証キーが関連付けられるようになっています。`
これってキーが最初に設定されたら、ずっと固定ってことなのかな？

外部から呼び出したいときは`API Connect`とかのGatewayが必須かな？
メーカー品パソコンのソフトウェアオーバークロック

古くてもう壊れてもそんなに問題ないパソコンだけど、
限界まで使い倒したい、けれども重すぎて使う気がおきない。

なんでそこで諦めるんだよ。もっと熱くなれよ（CPU的な意味で）

というわけでオーバークロックを試してみた記録をここにまとめます。



#オーバークロックとは？

定格で動いているCPUにたいして、
もっと本気だせよと鞭打つ行為とイメージして頂けるとわかりやすい。
![syachiku.png](https://qiita-image-store.s3.amazonaws.com/0/162496/0f61c447-0ac5-060d-7e50-807a1f301d11.png)

オーバークロックにはリスクが伴い、
マザーボードやメモリなど他の機器にも負荷がかかるので、
行う場合にはリスクを承知の上で行いましょう。


#普通のパソコンならば・・・
BIOS画面（Windowsを起動したときになんらかのキーを押下するといける画面）にて設定可能なのだが、DELLなどのメーカ品パソコンの場合などはBIOSレベルで制御されており、オーバークロックが行えないようになっている。

しかしもう一つ裏道とも言える手法が残っているので、今回はそれを紹介する。

※当然の如くメーカーのサポート対象外になるので自己責任でお願い致します。

#具体的やり方

##1 Clock Generatorを確認する
まずパソコンの蓋をあけて「Clock Generator」（通称PLL？）のコードを確認する。


以下の記事を見る限り、水晶発振子というパーツを目印に探すのが良さそうです。
http://jizounokimagure.at.webry.info/201007/article_1.html


##2 作業用のツールを用意する

様々なツールといろいろなやり方があるそうだが、
今回は恐らく初心者がやりやすいであろう以下の２つのツールを使ってオーバークロックを行う。

CPU-Z（CPUの状態を表示するソフト）
http://www.vector.co.jp/soft/winnt/hardware/se492853.html

setFSB(オーバークロックを行うソフト）
http://www.vector.co.jp/soft/win95/hardware/se453950.html

上記２つのソフトをダウンロードしたら、両方とも起動する。

![WS000002.JPG](https://qiita-image-store.s3.amazonaws.com/0/162496/19a75eda-4707-e9ee-79c2-694256208505.jpeg)

GetFSBボタンを押下して正常に認識すると以下の画像の部分に値が入り、メモリをいじくれるようになるので、初期値をメモしておくと良い。
![WS000003.JPG](https://qiita-image-store.s3.amazonaws.com/0/162496/16af2f14-508a-446e-cf0b-71047fd26cb5.jpeg)

##3 オーバークロック開始！

上のつまみを右に対して少しずつ、こまめに動かして「SetFSB」ボタンを押下する。
つまみを右に動かせば動かすほどCPU-ZのCore Speedがガンガン上昇していくのが確認できる。
![WS000004.JPG](https://qiita-image-store.s3.amazonaws.com/0/162496/b741a598-26d1-6606-0163-ec94cd1b5b5c.jpeg)

右につまみを動かしてsetFBS
右につまみを動かしてsetFBS
右につまみを動かしてsetFBS .....これを繰り返す。

そうしてるうちに限界ポイントに到達し、システムが不安定（フリーズOR強制終了）する位置までくるので、そこがオーバークロック限界点でとなる。


#4 システムがフリーズしまくって（再起動しまくって）設定なおせない＼(^o^)／

BIOSでオーバークロックの設定はいじれないが、BIOSの初期化はできるので
落ち着いてPCを再起動し、BIOSのデフォルト化のボタンを押下すればクロック数は元に戻る。


以上のサイクルを通して、
もっともシステムが安定する、
かつコアスピードをあげられる地点を指定して固定ができればオーバークロックは完了となる。


以上、快適なPCライフを！
railsで動的に引数付きメソッドを定義する

rubyには動的にメソッド名を定義するdefine_methodが用意されています。

これを上手く使う事で同じような処理をする同じような名前のメソッド、例えばget_{all_user|active_user|noactive_user|resign_user|}_reportみたいな定義をする場面でDRYに書けるので可読性、メンテナンス性の両面に有効です。

```rb

%w(all_user active_user noactive_user resign_user).each do |key|
  define_method("get_#{key}_report") do |term = "weekly"|
    User.get_report(key, term)
  end
end

```

更にdefine_methodの引数には定義されたメソッドの引数だけでなく、メソッド内で実行出来るProcを引数に取ることも出来るので上手く組み合わせるとメタプログラミングが捗ります。より詳しくはリファレンスを参照して下さい（何か良い具体例を思いついたら追記します）。

[define_method (Module)](http://ref.xaio.jp/ruby/classes/module/define_method)
《Sass》CSSだけで行数を指定してテキストを丸めて省略するためのmixinを作ったよ

下記のコードを用意しました。

```scss

@mixin lineClip($line-number: 2, $line-height: 1, $right-space: 1em, $background-color: #ffffff) {
  position: relative;
  overflow: hidden;
  height: calc(#{$line-number + em } * #{$line-height});
  padding-right: $right-space;
  line-height: $line-height;
  background-color: $background-color;
  &:before {
    content: "...";
    position: absolute;
    right: 0;
    bottom: 0;
    display: inline-block;
    width: $right-space;
  }
  &:after {
    content: "";
    position: relative;
    right: calc(#{$right-space} * -1);
    float: right;
    width: $right-space;
    height: 100%;
    margin-left:calc(#{$right-space} * -1);
    background-color: $background-color;
  }
}

```

以下のようにヘルパークラスをつくると、htmlの任意の要素のクラス属性に`one`を記述すると１行に、`two`を記述すると２行に指定することができます。

```scss

.one {
  @include lineClip(1);
}

.two {
  @include lineClip(2, 2);
}

.line-clip {
  // @include lineClip(row, line-height, right-space, background-color(same parent));
  // @include lineClip(行数, line-height, 右側の余白, 親要素の背景色);
}

```

一行に丸めたいときは、

```html

<p class="one">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Tempore ipsam saepe sit rem, vitae, repudiandae, culpa illum eligendi nihil cupiditate quidem reprehenderit sunt atque ut veniam, similique. Officiis, assumenda quasi?</p>

```


おわります。
Link > [Glaeja] エスケープキャラクタ解説と一覧

C++ Builderにおいて、通信文字列の分割に","を使おうとしていた。
しかしながら、送信しようとする文字列自体に","が含まれる例が見つかり、通信前に文字変換が必要になりそうだ。

こういう場合のキーワードとして「エスケープキャラクタ」も検討した。

その過程で偶然見つけたのが以下のリンク。
http://bananawani-mc.blogspot.jp/2013/02/glaeja.html

> 『Glaeja』の文字列解析エンジンは、この特殊記号が文字列中にあった場合には、その記号文字で囲まれた部分を読み取り、その記述内容に従って以下の動作をおこないます。

> 1. 囲まれた部分を、システム情報等を表す別の文字列に展開・置換する
2. 囲まれた部分より前方（左側）の文字列を置換する（@...@）
3. 文字列解析エンジン自体の挙動を変更する（|...|）
Laravel5.3 特定のステータスのユーザーのみログイン許可

LoginController で、 `validateLogin` メソッドを上書き（追記）する。

```LoginController.php
/**
 * Validate the user login request.
 *
 * @param \Illuminate\Http\Request $request
 * @return void
 */
protected function validateLogin(Request $request)
{
	$this->validate($request, [
		$this->username() => [
			'required',
			Rule::exists('tbl_users')->where(function ($query) {
				$query->whereIn('status', [
					User::STATUS_NOT_ACTIVE,
					User::STATUS_IS_ACTIVE,
					User::STATUS_CANCELLED,
					User::STATUS_PAUSED,
				]);
			})
		],
		'password' => 'required'
	]);
}
```
Unityで再生中にシーンを編集してしまう問題

#Unityで再生中にシーンを編集

再生中(プレイモード時)にシーンに加えた変更は、停止ボタンを押すとリセットされて元の状態に戻ってしまいます。
時々、うっかり再生中だと知らずにガッツリシーンを弄った後(特にUIの調整中なんか)再生中だったと気づいて愕然とすること、ありますよね。

##再生中かどうかを視覚的に分かりやすくしてミスを防ぐ
Unity Preferences を開く Unity->Preferences...[⌘+,]
![スクリーンショット 2017-03-06 11.35.26.png](https://qiita-image-store.s3.amazonaws.com/0/144288/8610470e-c206-cc72-31f0-ec2af0f52991.png)
Colors->General->Playmode tint を編集
![スクリーンショット 2017-03-06 11.35.36.png](https://qiita-image-store.s3.amazonaws.com/0/144288/9a7e371f-51ea-6d42-b7ea-1f4cefb3333c.png)
これで再生中のエディタの色彩を変更することが可能です。
個人的にはデフォルトでちょっとだけ色変えておいて欲しい・・・

##参考
[シーン再生中にオブジェクトを調整し、シーン再生終了時も調整内容を保持する-テラシュールブログ-](http://tsubakit1.hateblo.jp/entry/2015/10/22/000241)
Gradleを2.3にアップデートしたらDatabindingでビルドが失敗するのでその対処法

Gradleを2.3にアップデートしたらDatabindingのとこでエラーが出てビルドができなくなった。

build.gradleのdependencies内に `apt 'com.android.databinding:compiler:2.3.0` を追記したらビルドできるようになった。


```build.gradle

dependencies {

    ...

    apt 'com.android.databinding:compiler:2.3.0'
}

```
swfit3.0 画像の塗りつぶし

画像の塗りつぶしの自分用メモ 未検証

```swift
       let size = CGSize(width: 150, height: 150)
        UIGraphicsBeginImageContext(size)
        let cgContextRef = UIGraphicsGetCurrentContext()
        cgContextRef!.setFillColor(UIColor.gray.cgColor)
        cgContextRef!.setAlpha(0.8)
        cgContextRef!.fill(CGRect(x: 0, y: 0, width: 300, height: 300))
        let colorImage = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        let view5: UIImageView = UIImageView(frame: CGRect(x: 0, y: 0, width: 300, height: 300))
        view5.image = colorImage
```
CodeCommitでリポジトリのclone


AWSのリポジトリサービス「CodeCommit」の使い方。
APIアクセスキーを使用したHTTPSの通信が前提。

### AWSCLIのインストール
AWSのサイトからCLIのインストーラーをダウンロードする。
https://s3.amazonaws.com/aws-cli/AWSCLI64.msi

ダウンロードしてきたインストーラーを起動しインストールする。

### アクセスキーの登録
次のコマンドでアクセスキーを登録する。
４項目質問されるのでそれぞれ次のように入力する。

```
aws configure --profile codecommit
  AWS Access Key ID [None]: { アクセスキー }
  AWS Secret Access Key [None]: { シークレットキー }
  Default region name [None]: us-east-1
  Default output format [None]:

```

### アクセスキーの設定
上記の手順で登録したアクセスキーをGitに設定する。
「--profile」の項目は上記で登録した内容に合わせること。
（ここでは codecommit にしている）

```
git config --global credential.helper "!aws codecommit --profile codecommit credential-helper $@"
git config --global credential.UseHttpPath true
```

### CodeCommitのリポジトリからclone
次のコマンドでCodeCommitにpushします。

```
git clone {リポジトリのURL}
```

### おまけ プロキシの設定
プロキシを通る場合は下記のコマンドでプロキシを設定する。

```
git config --global https.proxy http://xxxxxx.com:8080
git config --global http.proxy http://ユーザー:パスワード@xxxxxx.com:8080
```
配列から要素を探す

javascriptにも配列の便利なメソッドがあるので備忘録

##find(配列から対象の要素を探す)

```javascript:find.js
const cityList = [
    { name: '東京', value: '1' },
    { name: '神奈川', value: '2' },
    { name: '千葉', value: '3' },
    { name: '埼玉', value: '4' },
];

const target = cityList.find((city) => {
    return (city.name === '東京');
});

console.log(target); // { name: '東京', value: '1' }
```

##filter(配列から任意の条件のものだけ取得する)

```javascript:filter.js
const cityList = [
    { country: '日本', name: '東京', value: '1' },
    { country: '日本', name: '神奈川', value: '2' },
    { country: '日本', name: '千葉', value: '3' },
    { country: '日本', name: '埼玉', value: '4' },
    { country: 'アメリカ', name: 'ワシントン', value: '5' },
    { country: 'イギリス', name: 'ロンドン', value: '6' },
    { country: 'フランス', name: 'パリ', value: '7' },
];

const targetList = cityList.filter((city) => {
    return (city.country === '日本');
});

console.log(targetList); 
// [
//     { country: '日本', name: '東京', value: '1' },
//     { country: '日本', name: '神奈川', value: '2' },
//     { country: '日本', name: '千葉', value: '3' },
//     { country: '日本', name: '埼玉', value: '4' }
// ]
```
vagrantの環境設定とコマンド

## インストール
https://www.vagrantup.com/downloads.html
1. [Mac OS X]から最新バージョンのdmgファイルをダウンロード
2. dmg->pkgをクリックし、インストーラーからインストール

## アップデート
インストールと同じ方法で、上書きインストールされます。

``` Bash:vagrantが最新バージョンのとき
$ vagrant version

...
You're running an up-to-date version of Vagrant!
```

## Boxの追加
Boxパッケージ一覧が公開されています
http://www.vagrantbox.es/

```Bash:CentOS7.0x64のパッケージを追加し、Vagrantfileを作成する
$ vagrant box add CentOS-7.0x64 https://github.com/tommy-muehle/puppet-vagrant-boxes/releases/download/1.1.0/centos-7.0-x86_64.box
==> box: Box file was not detected as metadata. Adding it directly...
==> box: Adding box 'CentOS-7.0x64' (v0) for provider:
...
==> box: Successfully added box 'CentOS-7.0x64' (v0) for 'virtualbox'!

$ vagrant box list
CentOS-7.0x64  (virtualbox, 0)

$ vagrant init CentOS-7.0x64
A `Vagrantfile` has been placed in this directory. You are now
ready to `vagrant up` your first virtual environment! Please read
the comments in the Vagrantfile as well as documentation on
`vagrantup.com` for more information on using Vagrant.
```

## 便利なPluginのインストール
### Sahara 
vagrantの仮想サーバに対する変更をロールバック可能にするプラグインをインストールします

```Bash:
$ vagrant plugin install sahara
...
Installed the plugin 'sahara (0.0.17)'!
```

```Bash:コマンド一覧
//ロールバックを有効化する
$ vagrant sandbox on

//ロールバックする
$ vagrant sandbox rollback

//変更を反映する。commitするとrollback不可。
$ vagrant sandbox commit
```

### vagrant-cachier
aptコマンドやyumコマンドなどでダウンロードされるパッケージファイルを、ホストOSにキャッシュするプラグインをインストールします

```Bash:
$ vagrant plugin install vagrant-cachier
...
Installed the plugin 'vagrant-cachier (1.2.1)'!
```
MacでJupyter Notebookを使ってみる

# はじめに
Python がらみで，Jupyter Notebook というものがあることを知りました．評判がいいようなので，早速試してみることに．

使い方は，Markdown で解説をつけながら，Python コードを添付・実行していくもので，プログラムの解説を行う場合などに便利そうです．Python 以外の言語にも対応しているそうです．

そこで，Jupyter Notebook のインストールと自分用のかんたんな設定，matplotlib でのグラフ作成を事例に作成した Notebook の紹介を行ってみようと思います．

実行環境は，以下のとおりです．

+ MacBook Pro (Retina, 13-inch, Mid 2014)
+ OS: macOS Sierra

# Python3のインストール
Python3 は，```brew install python3``` で普通にインストール．Puyhon3.6.0 がインストールされます．

あとは pip3 をアップグレードし，モジュール類は pip3 でインストールしています．

```
brew install python3  # Python3.6.0
pip3 install --upgrade setuptools
pip3 install --upgrade pip
brew linkapps
pip3 install numpy
pip3 install scipy
pip3 install matplotlib
pip3 install Pillow
```

# 通常のPythonでの使い方
私が通常やっている matplotlib の使い方です．

コマンドラインで入力データファイルと出力画像ファイルを指定．png で出力し，報告書などに貼り付けています．

```
import numpy as np
import matplotlib.pyplot as plt
import sys

# Parameter setting
param=sys.argv
fnameR=param[1]     # input filename
fnameF=param[2]     # output image file name

......

plt.savefig(fnameF,dpi=200, bbox_inches='tight', pad_inches=0.2)
plt.show()
plt.close()
```

# Jupyter Notebook のインストール
ここ([http://jupyter.org/install.html](http://jupyter.org/install.html)) に従ってインストール． ただし，Python3, numpy, scipy, matplotlibは導入済みの環境とします．

```
pip3 install --upgrade pip
pip3 install jupyter
```

これでインストールは完了．以下で起動できます．

```
jupyter notebook
```

起動すると，起動したディレクトリ内の，子ディレクトリとファイルが並んだ画面が現れます．

アップグレードの場合は以下のコマンド．

```
pip3 install -U jupyter
```

# Jupyter Nootbook でグラフを表示
Jupyter Notebook で matplotlib のグラフを表示するためには，コードの先頭に以下を記載します．

```
%matplotlib inline
```

でも毎回起動のたびに書き込むのはめんどう．そこで．．．

ここ（[http://keisanbutsuriya.hateblo.jp/entry/2015/11/28/220429](http://keisanbutsuriya.hateblo.jp/entry/2015/11/28/220429)）に従い，以下を実行．

```
ipython profile create
```

これで ```~/.ipython/profile_default に ipython_config.py``` というファイルができるのでこれを開いて編集．

```
## lines of code to run at IPython startup.
#c.InteractiveShellApp.exec_lines = []
c.InteractiveShellApp.exec_lines = ['%matplotlib inline']
```

上記の部分３行目　```c.InteractiveShellApp.exec_lines = ['%matplotlib inline']```　を書き込みます．

これで，毎回 ```%matplotlib inline``` を書き込まずにすみます．

# Notebook 作成事例
自分の Mac 内で作成した，```.pynb``` ファイルを Gist に貼り付けたものへのリンクを示します．グラフの装飾過程を示したものですが，このような使い方には，便利ですね．

１つめの事例は，通常の２次元グラフの作成・装飾過程を示しています．

２つめの事例は，２軸グラフの装飾事例です．線種の指定，凡例の表示を工夫してみました．

matplotligでグラフ作成
[https://gist.github.com/damyarou/9b453a3e306b959d7b971aa91a32edd7](https://gist.github.com/damyarou/9b453a3e306b959d7b971aa91a32edd7)

matplotlibでグラフ作成（２軸グラフ）
[https://gist.github.com/damyarou/40ff25ed1da207bdc53db981b0f51a93](https://gist.github.com/damyarou/40ff25ed1da207bdc53db981b0f51a93)

nbviewerへのリンクを追加．
[http://nbviewer.jupyter.org/gist/damyarou/9b453a3e306b959d7b971aa91a32edd7](http://nbviewer.jupyter.org/gist/damyarou/9b453a3e306b959d7b971aa91a32edd7)

[http://nbviewer.jupyter.org/gist/damyarou/40ff25ed1da207bdc53db981b0f51a93](http://nbviewer.jupyter.org/gist/damyarou/40ff25ed1da207bdc53db981b0f51a93)

以　上
AppleScriptでntpdate

自宅に[NTP Stratum 1なサーバが設置](http://qiita.com/yamori813/items/d9b0a451f1e115de893f#pps%E3%81%AE%E8%A9%B1)できたので、Macの時間をntpでAppleScriptで設定する方法を調べてみました。

通常はntpdateなどを使うのですが、これだと管理者権限が必要になるので、システム環境設定の「日付と時刻」の「日付と時刻」パネルを開いたときにntpdateを実行するようなので、これをAppleScriptでシュミュレーションしてみました。

```applescript

tell application "System Preferences"
	activate
	reveal anchor "DateTimePref" of pane id "com.apple.preference.datetime"
end tell
tell application "System Events"
	tell process "System Preferences"
	end tell
end tell
quit application "System Preferences"
```

雪豹で確認しています。新しいMac OS Xでは試していません。

あ、事前に「日付と時刻を自動設定」にチェックを入れてサーバを設定しておく必要がありました。on/offはコマンドでもできるようです。

```
bash-3.2$ systemsetup -setusingnetworktime on 
setUsingNetworkTime: On
```

Mac OS X 10.5で実行したかったのだが、動かない。。。

下記は10.5でも実行できました。事前にパネルを開いておけば、同じように動くようです。

```applescript
tell application "System Preferences"
	activate
	set current pane to pane "com.apple.preference.datetime"
end tell
quit application "System Preferences"
```

なぜこれが必要だったかというと、FMラジオをエアチェックするMac OS Xアプリ（[猫のお留守番](http://hp.vector.co.jp/authors/VA009278/cat/)）で録音開始時刻をずれないようにしたかったからです。
jsforceで子レコードのqueryMoreのやり方

# 概要

jsforceでサブクエリを含むレコードを取得する際に、子レコードでqueryMoreが発生する際にちょっとハマったので、
取得する方法を紹介したいと思います


# サンプルコード（JSforce）

下記のサンプルコードでは以下のような参照関係があるオブジェクトを用いて説明します
また、子レコードは親レコード1件につき2000件以上を取得できるとする

親オブジェクト名はParent_\_c
子オブジェクト名はChild_\_c (リレーション名 Child_\_r)

※当コードは説明用のコードとして作ったものです
効率よく再帰的な処理で実装していませんのでご了承ください

```
var jsfConn = new jsforce.Connection({ accessToken: '{!$API.Session_Id}' });
jsfConn.query("Select Id, Name, (Select Name from Child__r limit 10000) from Parent__c").run({
    // 明示的にautoFetchしない
    autoFetch: false
}).then(function(parentRow) {

    // autoFetchしないため、1件ずつ取得される
    var parentRow = parentRow.records[0];

    // 子レコードが200～2000件以上だった場合は、nextRecordsUrlでその続きのレコードを取得する
    var nextUrl = parentRow.Child__r.nextRecordsUrl;

    // queryMoreにnextRecordsUrlを渡すことで続きが取得できる
    jsfConn.queryMore(nextUrl).on("record", function(childRows) {
        console.log(childRows);
    }).on("end", function() {
        console.log("get child rows end");

        // 次の親レコードを取得する(再帰的な実装が必要)
        jsfConn.queryMore(parentRow.nextRecordsUrl).run({
            autoFetch: false
        }).then(function(nextParentRow) {
            console.log(nextParentRow);
            // 子レコードの取得
            // ...
        });
    }).run({
        // autoFetchをtrueとすることで、自動で再帰的に取得してくれる
        autoFetch: true
    });
});
```

# 説明

<処理の流れ>
親レコード1 => 親レコード1の子レコード => 親レコード2 => 親レコード2の子レコード => 以降省略・・・

1. 親レコードの取得は明示的にautoFetchしない
   子レコードを取り切る前に親レコードをすべて取り切ることで、子レコードのnextRecordsUrlが無効になるのを防ぐため

    ```
      jsfConn.query("Select Id, Name, (Select Name from Child__r limit 10000) from Parent__c").run({
          autoFetch: false
      })
    ```

2. 親レコードの取得はPromiseで取得する
   親レコードのnextRecordsUrlを取得するために戻り値をPromiseで受け取る
   on("record")イベントではnextRecordsUrlが含まれない

    ```
      jsfConn.query("Select Id, Name, (Select Name from Child__r limit 10000) from Parent__c").run({
         autoFetch: false
      }).then(function(parentRows) {})
    ```

3. nextRecordsUrlの件数は200 ～ 2000
   nextRecordsUrlが結果に含まれる条件としては、取得しようとしたレコード数が200～2000以上の時
   取得対象項目の型に応じて取得可能なレコード数が変わります
   例えば、ロングテキスト型を含む場合は、1度に取得できるレコード数は200件になります

## リファレンス

https://jsforce.github.io/document/#query
https://developer.salesforce.com/docs/atlas.en-us.ajax.meta/ajax/sforce_api_ajax_more_samples.htm?search_text=queryMore
Haskell による型安全プログラミングの実装例(和暦)

## 概要

型安全プログラミングがどのように役に立つかを Haskell を使った和暦(元号)の実装を例に紹介します。

実装は下記の repository にあります。
https://github.com/algas/haskell-example-date

## 対象読者

Haskell の最低限の知識と haskell stack の使用経験があることを前提とします。
基本的な文法や言語構文の説明は入門書に任せることにします。

## 使い方

以下の単体テストを動作させることができます。

1. `git clone git@github.com:algas/haskell-example-date.git`
2. `stack build`
3. `stack test`

## 実装の概要

`Data.Time.Wareki` で公開している関数を説明します。

```hs
data Gengoh = Meiji | Taisho | Showa | Heisei -- 元号(簡単のため明治以降のみ)
data Wareki = Wareki Gengoh Integer Int Int -- 和暦(コンストラクタは非公開)

fromGregorian :: Integer -> Int -> Int -> Maybe Wareki -- 西暦から和暦
toGregorian :: Wareki -> (Integer, Int, Int) -- 和暦から西暦
fromDay :: Day -> Maybe Wareki -- 西暦から和暦
toDay :: Wareki -> Day -- 和暦から西暦
toText :: Wareki -> Text -- 和暦から文字列
addDays :: Integer -> Wareki -> Maybe Wareki -- 日を足す
diffDays :: Wareki -> Wareki -> Integer -- 日の差分
```

関数の使用方法についてはテストコード `test/WarekiSpec.hs` をご参照ください。

## 何が安全なのか？

正しくない和暦を入力できないように型で守っています。

### 独自型の定義  
`Wareki` (和暦)型を独自に定義していて、整数型(Int,Integer)や日付型(Day)などとは型で区別されているので混同することはありません。型の変換は定義した関数を通じて行うしかなく暗黙的に意図しない型変換が行われることはありません。

### コンストラクタ非公開  
`Data.Time.Wareki` では `Wareki` のコンストラクタを公開していません。したがって `Wareki` を直接生成することはできません。Wareki を作るには `fromGregorian` か `fromDay` かいずれかの関数を使うしかありません。

```hs
warekiExample = Wareki Heisei 13 3 11 -- コンストラクタが公開されていないのでコンパイルできない
fromGregorian 2017 3 5 -- Just (Wareki Heisei 29 3 5)
```

### 定義域の設定  
本実装では昭和1年(西暦1868年)1月25日を和暦の始まりとしていて、それよりも前の日は和暦として未定義としています。ただし和暦の終わりは制限していないので未来の和暦はすべて「平成」として定義されます。

```hs
fromGregorian 1868 1 24 -- Nothing
(toText . fromJust) (fromGregorian 2100 1 25) -- "平成112年1月25日"
```

## 本実装のポイント

### 公開する関数の制限  
`Data.Time.Wareki` で公開する関数を制限しています。上述のとおり型安全を実現するために `Wareki` のコンストラクタを非公開にしています。

### Internal の実装  
和暦の中身は `Data.Time.Wareki.Internal` (src/Data/Time/Wareki/Internal.hs) に実装して、`Data.Time.Wareki` で公開範囲の制限しています。 Internal と公開モジュールを分離することで単体テストを実現しています。テスト側で Internal モジュールを直接参照することで非公開の関数もテストできます。

### Calendar モジュールの利用  
日付の基本的な操作は [time](https://hackage.haskell.org/package/time) ライブラリの `Data.Time.Calendar` の実装に依存しています。

## 注意

- 本記事の実装は完全＆最善ではなく、あくまでも型安全のサンプルとして平易な記述で作成したものだという点をご理解ください。
- 型安全といっても変換関数の実装が間違っている場合には正しくない結果が出力されます。テストが全く不要になるわけではありません。本実装はテストによって正常な動作を確認していますが、もし不具合を発見した場合にはお知らせください。

## 雑感

- 実装してみたら当初に想定したほどシンプルじゃなかった。型安全の例としては最適ではなかったかも。
- `Read` も実装しないとやや実用性に欠けるか。
- Haskell 自体の説明を省いてどれだけの人に意図を理解してもらえるのか不安。

## 参考文献

- [関数プログラミング実践入門 第6章](https://www.amazon.co.jp/dp/4774169269/)
- [Haskellの単体テスト最前線](https://github.com/kazu-yamamoto/unit-test-example/blob/master/markdown/ja/tutorial.md)
scala の repl で手軽に構文糖を解く(desugarする)

普段使わないので使おうと思った時に思い出せないアレ。

## 1. 行末に `// print` + タブ

例: for式ってどう展開されるんだったかな?

```scala
scala> for (i <- Option(1)) yield i // print
   scala.Option.apply[Int](1).map[Int](((i: Int) => i)) // : Option[Int]
```

`// print` の後にタブを押すと2行目が表示される。この場合の for 式は `map()` に展開されることが分かる。

`//print` + タブ は代入文には使えないようだ。 `val x = 1 + 1 // print` と入力してタブを押しても何も表示されない。他にも使えないパターンがあるかもしれない。

## 2. 行末に `// show` で評価(Enter)

こちらは評価する前に desugar された状態のプログラムが表示される。
周りの object も表示されるのが少し煩い。

```scala
scala> for (i <- Option(1)) yield i // show
object $read extends scala.AnyRef {
  def <init>() = {
    super.<init>;
    ()
  };
  object $iw extends scala.AnyRef {
    def <init>() = {
      super.<init>;
      ()
    };
    object $iw extends scala.AnyRef {
      def <init>() = {
        super.<init>;
        ()
      };
      val res3 = Option(1).map(((i) => i))
    }
  }
}
res3: Option[Int] = Some(1)
```

`// print` + タブと違い代入文でもいけるようだ。

```scala
scala> val x = 1 + 1 // show
object $read extends scala.AnyRef {
  def <init>() = {
    super.<init>;
    ()
  };
  object $iw extends scala.AnyRef {
    def <init>() = {
      super.<init>;
      ()
    };
    object $iw extends scala.AnyRef {
      def <init>() = {
        super.<init>;
        ()
      };
      val x = 1.+(1)
    }
  }
}
x: Int = 2
```
systemdを使ってWindows共有フォルダをマウントする

Windows共有フォルダをsystemdを使って起動時にマウントする際のメモ
パッケージはcifs-utilsを利用する。

# 環境
**クライアント**
OS:Arch Linux
マウントポイント:/mnt/share

**サーバ**
OS:Windows Server 2016
共有パス://ws2016/share
IPアドレス:192.168.10.10
ユーザ:shareuser
パスワード:sharepasswd

# systemdユニットファイル
```/etc/systemd/system/mnt-share.mount
[Unit]
Description=Mount Share at boot
Requires=systemd-networkd.service
After=network-online.target
Wants=network-online.target

[Mount]
What=//ws2016/share
Where=/mnt/share
Options=user=shareuser,password=sharepasswd,workgroup=workgroup,ip=192.168.10.10,iocharset=utf8,uid=1000,gid=1000
Type=cifs
TimeoutSec=30

[Install]
WantedBy=multi-user.target
```
注1...ユニットファイル名と**Where**は一致するようにする。（例:mnt-test.mount→**Where**=/mnt/test)
注2...**uid**及び**gid**はマウントしたいユーザのIDを指定する、指定しなければrootでマウントされるはず。
注3...**Requires**は利用してるネットワーク設定サービスを指定、このシステムではsystemd-networkdを利用している。

# ユニットの有効化と確認
```
$ sudo systemctl enable mnt-share.mount
$ sudo systemctl start mnt-share.mount

$ mount |grep share
//ws2016/share on /mnt/share type cifs....
```


参考URL:[Samba - ArchWiki](https://wiki.archlinuxjp.org/index.php/Samba)
windowsサーバーのプロダクトキーの認証

windowsサーバーのプロダクトキーはGUIからでは更新できず、何かしら調べておかなくてはいけないの備忘録として残しておきます。
画面に表示される「プロダクトID」とは違うので、コマンドを入力して確認する必要があります。


```bat
rem 削除
slmgr /upk

rem 登録
slmgr /ipk "ここへプロダクトキーを入力"

rem 認証
slmgr /ato

rem 確認 ※プロダクトキーの一部が表示される
slmgr /dli

pause
```
docker コンテナ + capybara-webkit のスクショで Noto フォントを使う


前に [docker コンテナ \+ capybara\-webkit でウェブサイトのスクリーンショットを撮影](http://qiita.com/tily/items/b3d72afaead3d1a60abb)してみたんだけど、IPA フォントがなんかイマイチに感じられたので Noto フォントを試してみた。

## やり方

* [use noto font by tily · Pull Request \#42 · tily/prgrphs](https://github.com/tily/prgrphs/pull/42/files)

前回からの差分としては、

* apt で `fonts-ipafont fonts-ipafont-gothic fonts-ipafont-mincho` をインストールしないようにした
* apt で `unzip` をインストールするようにした (ダウンロードしたファイルの展開用)
* Noto フォントをインストールするようにした

Noto フォントインストール部分はこんな感じになった。

```
RUN cd /tmp && \
    mkdir noto && \
    curl -O -L https://noto-website-2.storage.googleapis.com/pkgs/NotoSansCJKjp-hinted.zip && \
    unzip NotoSansCJKjp-hinted.zip -d ./noto && \
    mkdir -p /usr/share/fonts/noto && \
    cp ./noto/*.otf /usr/share/fonts/noto/ && \
    chmod 644 /usr/share/fonts/noto/*.otf && \
    fc-cache -fv && \
    rm -rf NotoSansCJKjp-hinted.zip ./noto
```

ほんとは docker イメージサイズ縮小のために unzip をアンインストールしたほうがいいんだけど、めんどくさくてやってない。

ちなみに apt リポジトリにも fonts-noto というパッケージがあるみたいだが、これをインストールしても日本語は文字化けしたままの状態になってしまうようだった。(CJK が入っていない？)

## 結果

IPA フォント:
![](https://pbs.twimg.com/media/C6IXVZZWQAAeEXU.jpg)
Noto フォント:
![](https://pbs.twimg.com/media/C6Ja3GiVUAA7p9E.jpg)

うーん、よくなったような悪くなったような。Noto フォントのほうが若干丸っこい感じがする。
だいぶ前に試したときは IPA フォントでももう少しメイリオみたいに表示できてた気がするんだけど、何か工夫していたのか覚えていない…。
あと、この微妙にブロックノイズ (?) が出ちゃってるのを直せないものだろうか。
情報お待ちしております。

## 参考資料

* [docker コンテナ \+ capybara\-webkit でウェブサイトのスクリーンショットを撮影する \- Qiita](http://qiita.com/tily/items/b3d72afaead3d1a60abb)
* [はちびる日記](https://nmbr8.com/blog/2014/11/28/how_to_install_noto_sans_cjk_on_centos/)
    * ダウンロード先の URL が古かった
* [How to install fonts – Google Noto Fonts](https://www.google.com/get/noto/help/install/)
数値をカンマ区切りに整形するプラグインを書いた


`<input type=text>` に入力した数値をカンマ区切りにして表示するプラグインです。
単純に表示だけを整形する分には、それほど面倒ではないのですが、submit時にカンマが付いたままサーバーに送信するのは都合が悪い。
数値が入力されているので、フォーカスを受け取った時に、キャレットは文字列の最後にあってほしいと、なんだかんだで、面倒。
主に3点に付いて対応したものを作成しました。

##ソースコード

```javascript:jquery.number-format.js
/*!
 jquery.number-format.js

 This software is released under the MIT License
 http://opensource.org/licenses/mit-license.php
 */
(function ($) {

	$.fn.numberformat = function (options) {

		// option
		var setting = $.extend({
			align: 'right',
			separator: ','
		}, options);

		// remove comma
		var rmcomma = function (val) {
			return val.toString().replace(setting.separator, '');
		};

		// format number
		var fmcomma = function (val) {
			var v = rmcomma(val);
			return v.replace(/(\d)(?=(?:\d{3}){2,}(?:\.|$))|(\d)(\d{3}(?:\.\d*)?$)/g
					, '$1$2' + setting.separator + '$3');
		};

		// make the string formatted on changed
		this.change(function () {
			var val = $(this).val();
			$(this).val(fmcomma($(this).val()))
					.attr('data-value', rmcomma(val))
					.css({
						textAlign: setting.align
					});
		}).change();

		// Move caret to end of string on focused
		this.focus(function () {
			var v = $(this).val();
			$(this).val('').val(rmcomma(v));
		});

		// format number on blur
		this.blur(function () {
			var v = $(this).val();
			$(this).val(fmcomma(v));
		});

		// Remove comma on submit
		this.parents('form').submit(function () {
			$(this).find('input').each(function () {
				$(this).val(rmcomma($(this).val()));
			});
		});

		return this;
	};
})(jQuery);
```

##サンプル

数値を用いて、JavaScript で演算するときは、data-value 属性を使ってください。

```html
<!DOCTYPE HTML>
<html lang="ja">
	<head>
		<meta charset="UTF-8">
		<title>サンプル</title>
	</head>
	<body>
		<form action="" method="post">
			<p>
				<label for="quantity">数量</label>
				<input type="text" name="quantity" id="quantity" data-format="number" value="30" />
			</p>
			<p>
				<label for="price">単価</label>
				<input type="text" name="price" id="price" data-format="number" value="1380" />
			</p>
			<p>
				<label for="sumption">合計</label>
				<input type="text" name="sumption" id="sumption" data-format="number" />
			</p>
			<p>
				<button type="button" id='calc'>計算</button>
			</p>
		</form>
		<script type="text/javascript" src="//code.jquery.com/jquery-3.1.1.min.js"></script>
		<script type="text/javascript" src="jquery.number-format.js"></script>
		<script type="text/javascript">
			$(function () {
				var options = {
					align: 'right', // 右寄せ: right, 左寄せ: left, 中央: center
					separator: ',' // 桁区切りに用いる文字
				};
				$('[data-format="number"]').numberformat(options);
				
				// JavaScript で演算するときは、data-value で行う。
				function calc() {
					var quantity = $('#quantity').attr('data-value');
					var price = $('#price').attr('data-value');
					var sumption = quantity * price;
					$('#sumption').val(sumption).change();
				}

				$('#calc').on('click', function () {
					calc();
				}).click();
				$('#quantity, #price').on('change keyup', function () {
					calc();
				});
			});
		</script>
	</body>
</html>
```
IPアドレスの短縮（？）

主に自分用

会社や自宅で直にIP打つことがあるので簡単なメモ用

よく打ち間違えやすいIPとしては 10.0.0.1とか10.10.0.1とかある
pingならまだいいがsshなんかで間違えたら大変
ということでなんとかできないかといろいろ試してた結果IPアドレスの短縮（？）
っぽいことができることに気づいたのでここにメモしたいと思う

10.0.0.1 -> 10.1

みたいに短縮できる

ただこれだけ pingとsshで動作確認済み
（hostsかDNSでやればいい話なんだけどね...　何かの役に立てばと）
メモ: highcharts使ってみた

* [IE6にも対応](http://www.highcharts.com/documentation/compatibility)
* 商用は有料。 [Licenses](https://shop.highsoft.com/highcharts)

## 読み込むのは1ファイルだけでよい手軽さ。

* https://code.highcharts.com/highcharts.js

## 使い方

![chart1.png](https://qiita-image-store.s3.amazonaws.com/0/25728/521d7e93-06f0-26ef-a763-4a3ce97c6d85.png)

```html:sample.html
<style>
#container {
	min-width: 310px;
	max-width: 800px;
	height: 400px;
	margin: 0 auto
}
</style>
<script src="https://code.highcharts.com/highcharts.js"></script>
<!-- <script src="highcharts.js"></script> -->

<div id="container"></div>


<script>
Highcharts.chart('container', {

    title: {
        text: 'Solar Employment Growth by Sector, 2010-2016'
    },

    subtitle: {
        text: 'Source: thesolarfoundation.com'
    },

    yAxis: {
        title: {
            text: 'Number of Employees'
        }
    },
    legend: {
        layout: 'vertical',
        align: 'right',
        verticalAlign: 'middle'
    },

    plotOptions: {
        series: {
            pointStart: 2010
        }
    },

    series: [{
        name: 'Installation',
        data: [43934, 52503, 57177, 69658, 97031, 119931, 137133, 154175]
    }, {
        name: 'Manufacturing',
        data: [24916, 24064, 29742, 29851, 32490, 30282, 38121, 40434]
    }, {
        name: 'Sales & Distribution',
        data: [11744, 17722, 16005, 19771, 20185, 24377, 32147, 39387]
    }, {
        name: 'Project Development',
        data: [null, null, 7988, 12169, 15112, 22452, 34400, 34227]
    }, {
        name: 'Other',
        data: [12908, 5948, 8105, 11248, 8989, 11816, 18274, 18111]
    }]

});
</script>
```
Rubyのスクリプトに文法エラーがあるかどうかを調べる

rubyには起動オプションで `-c` という文法エラーの有無をチェックするものがあります。

実行して文法エラーが存在しない場合は `Syntax OK` が出力されます。

```rb:hello.rb
puts "hello world"
```


```
$ ruby -c hello.rb
Syntax OK
```

文法エラーを含んでいる場合はそのエラーが出力されます。

```rb:hello.rb
puts "hello world'
```

```
$ ruby -c hello.rb
hello.rb:1: unterminated string meets end of file
```



このオプションは `.rb` ファイル以外にも使用が可能で、例えば下記のCのコードに対して実行してみると `Syntax OK` が出力されます。

```c:hello.c
#include <stdio.h>

int main () {
  printf("hello world!\n");
  return 0;
}
```


```
$ruby -c hello.c                                                                                                                                             
Syntax OK
```

試しに動くように書いてみました。


```rb:c.rb
class C
  def self.run(&block)
    new.instance_eval &block
  end

  def int(val)
  end

  def main
    yield
  rescue LocalJumpError => ex
  end

  def printf(str, *values)
    puts str % values
  end
end

C.run do
  #include <stdio.h>

  int main() {
    printf("hello world\n");
    return 0;
  }
end
```

出力

```
hello world
```

ちょっと無理矢理感がありますが、動かすことができました。


## 参考サイト

[Rubyの起動](https://docs.ruby-lang.org/ja/latest/doc/spec=2frubycmd.html)
メモ: Jupyter使ってみた

jupyter/notebook は deprecated のため、以下を使う。

## base

```bash:586.2MB
docker run -it --rm -p 8888:8888 jupyter/base-notebook
```

## minimal

```bash:2.191GB
docker run -it --rm -p 8888:8888 jupyter/minimal-notebook
```

## datascience

```bash:6.829GB
docker run -it --rm -p 8888:8888 jupyter/datascience-notebook
```

### オプション色々

```bash:./notebooks/にデータを残す
docker run -d -p 8888:8888 \
 -v `pwd`/notebooks:/home/jovyan/work \
 -e GRANT_SUDO=yes \
 --user root \
 jupyter/datascience-notebook \
 start-notebook.sh
```

* 上記で`sudo`可能になる。

```bash:url_token確認
docker logs `ContainerID`
```

## Noteからコマンド実行

```bash:
%%bash
df -h
```

----

## 再入門

```
sudo apt install -y jupyter-notebook

jupyter-notebook
```

### グラフを描画してみる

* [NumPy で数学系の関数を使ってみよう – Python でデータサイエンス](https://pythondatascience.plavox.info/numpy/%E6%95%B0%E5%AD%A6%E7%B3%BB%E3%81%AE%E9%96%A2%E6%95%B0)
* [Gallery — Matplotlib 2.2.2 documentation](https://matplotlib.org/gallery/index.html)

```sh:
apt install -y \
 python3-matplotlib \
 python3-numpy
```

```py
import matplotlib.pylab as plt
 
x = np.linspace(-np.pi, np.pi, 201)
plt.plot(x, np.sin(x))
plt.xlabel('Angle [rad]')
plt.ylabel('sin(x)')
plt.axis('tight')
plt.show()
```

![jupyter.png](https://qiita-image-store.s3.amazonaws.com/0/25728/04ddfb56-36c1-91be-25dd-61f1212bb32a.png)
技術英語 > data that is created [on the fly]

@ Introducing Python: Modern Computing in Simple Packages by Bill Lubanovic
(No. 2143 / 12833)

> data that is created **on the fly**

https://www.merriam-webster.com/dictionary/fly
> on the fly
> `1 :  in motion
...
`4 :  simultaneously with another task

前後の文章は

> You can even iterate over data that is created on the fly, allowing processing of data streams that would otherwise not fit in the computer's memory all at once.

iterator使用の利点はこのあたりになるのだろう。
bitcoin coreのインストール（ubuntu）

ただ試したいだけだし、いちいちインストールするのめんどくせえ、、、
って人はもうすでにbitcoin coreが使える状態のコンテナを用意してます

> $ sudo docker pull tokuo201/bitcoin_core_on_ubuntu

#必要なライブラリ
当然ながら更新はしてください
> $ sudo apt-get update

###gccのインストール
> $ sudo apt-get install build-essential libtool autotools-dev automake pkg-config libssl-dev libevent-dev bsdmainutils

###openSSLのインストール
> $ sudo apt-get install libtool autotools-dev autoconf libssl-dev

###Boostのインストール
> $ sudo apt-get install libboost-all-dev

###libdb4.8のインストール
> $ sudo add-apt-repository ppa:bitcoin/bitcoin
$ sudo apt-get update
$ sudo apt-get install libdb4.8-dev libdb4.8++-dev

###GUIライブラリのインストール
> $ sudo apt-get install libqt5gui5 libqt5core5a libqt5dbus5 qttools5-dev qttools5-dev-tools libprotobuf-dev protobuf-compiler

###その他ライブラリ
> $ sudo apt-get install libminiupnpc-dev libqrencode-dev git

#Bitcoin Coreのインストール
> $ git clone https://github.com/bitcoin/bitcoin.git
$ cd bitcoin
$ ./autogen.sh
$ ./configure
$ make
$ sudo make install
Debian8にHugoの環境を構築してみた

##はじめに

MarkDownでコンテンツを書くことができる静的サイトジェネレータが、自分の中で流行り始めているので、Debian8にHugoの環境を構築してみた

## 構築のベース環境
debian-8.7.1-amd64-netinst.iso

## Debian8をインストール
インストールウィザードに従ってとりあえずDebian8をインストールしないと始まらない
途中の設定値はこんな感じ

```
Language:English
Cuntry:United States
Keymap:American English
Hostname:hogo
Domain:local
Username for your account:user
timezone:Eastern
Debian archive mirror countory:Japan
Debian archive mirror:ftp.nara.wide.ad.jp
Choose software to install:SSH Server,Standard system utilities
```

## 最初のログイン(ローカルログイン)
とりあえず最初のログインでこれくらいのことをやっておく

### IPアドレスの確認
リモートログインするためにIPアドレスを確認しておく

```
/sbin/ifconfig
```

### パッケージのアップデート
インストールされているパッケージ類を最新にしておく

```
su
apt-get update
apt-get upgrade
```

### Localeの追加

```
echo "ja_JP.UTF-8 UTF-8" >> /etc/locale.gen 
locale-gen 
export LANG=ja_JP.UTF-8
```

ログインユーザーの.profileを書き換えておく

```
nano .profile
```

```
export LANG=ja_JP.UTF-8
```
を追記する

### sudoのインストール

```
apt-get -y install sudo
visudo
```

```
administrator   ALL=(ALL:ALL) ALL
```
を追記する

### TimeZone変更

```
sudo dpkg-reconfigure tzdata
```

Asia/Tokyoに変更する

### avahiのインストール
hogo.localでアクセスできるように

```
sudo apt-get -y install avahi-daemon
```

### tmuxのインストール

```
sudo apt-get -y install tmux
```

### gitをインストール

```
sudo apt-get -y install git
```

### ssh認証にする

```
sudo nano /etc/ssh/sshd_config
```

```
#AuthorizedKeysFile     %h/.ssh/authorized_keys
```
を

```
AuthorizedKeysFile     %h/.ssh/authorized_keys
```
に書き換える

```
sudo service sshd restart
mkdir ~/.ssh
chmod 0700 ~/.ssh/
```

端末側(MacOSX)から

```
scp ~/.ssh/id_rsa.pub user@hugo.local:/home/user/.ssh
```

Debian8側で

```
mv ~/.ssh/id_rsa.pub ~/.ssh/authorized_keys
chmod 0600 ~/.ssh/authorized_keys
```

## Hugoをインストール

```
mkdir ~/pkg
cd ~/pkg
wget https://github.com/spf13/hugo/releases/download/v0.19/hugo_0.19-64bit.deb
sudo dpkg -i hugo_0.19-64bit.deb
```

これでとりあえず環境構築は終わり

## ログイン(リモートログイン)
端末側(MacOSX)から

```
ssh user@hugo.local
```

## なにか作ってみよう
### 準備

```
mkdir -p ~/Site/Test
cd ~/Site/Test
hugo new site test.local
```
これでtest.localサイトのコンテンツが書けるようになる

### サイトの構成ファイルを書く

```
nano ~/Site/Test/test.local/config.toml
```

```
baseURL = "http://test.local/"
languageCode = "ja-jp"
title = "Test Site"
```
くらいを書いておいた

### コンテンツを書く
MarkDownでコンテンツを書いていく

```
mkdir -p ~/Site/Test/test.local/content/post
nano ~/Site/Test/test.local/content/post/HelloWorld.md
```

```
+++
title = "HelloWorld"
date  = "2017-03-06"
+++
HugoでMarkDownを使って書いてみた
```

### 適用するテーマを取ってくる

```
cd ~/Site/Test/test.local/themes
git clone https://github.com/jaden/twentyfourteen.git
```
今回はWordPressっぽいのにしてみた

### 書いたコンテンツを見てみる
HugoがWebサーバーの機能を持っているので簡単に書いたコンテンツを確認できる

```
rm -r public
hugo server --bind=0.0.0.0 --baseUrl=http://hugo.local/ --theme=twentyfourteen
```

### コンテンツが書けたら

```
hugo -t twentyfourteen
```
と実行すると

```
~/Site/Test/test.local/public
```
ディレクトリにコンテンツが生成される
bashのそれって実はこういう書き方できるよ一覧

bashで普段こう書いているけど、実はこういう書き方もあるんですよというのをまとめてみました。
->の右側がmanに載ってるテク名です。
例えばどういったものが書けるかはガチャガチャした[前回の記事](http://qiita.com/hasegit/items/4a721329a64cd47b754e)で…。

## \`command\` -> Command Substitution
書く量は増えるけど、視認性が良い(ネストした時が特に)。
尚、これは書き方が違うだけでどっちもCommand Substitutionです。

```bash:before
hosts_data=`grep \`uname -n\` /etc/hosts`
```
```bash:after
hosts_data=$(grep $(uname -n) /etc/hosts)
```

尚、Command Substitutionでcatをする場合、以下のように書けます。(catより高速らしい…)

```bash:before
hosts_entry=$(cat /etc/hosts)
```
```bash:after
hosts_entry=$(< /etc/hosts)
```


## echo -> Here Strings
噛ませる為のechoはやめる。単独では使えないので注意。

```bash:before
echo "1+5+7^2" | bc
```
```bash:after
bc <<<"1+5+7^2"
```

## echo >txt; echo >txt ... -> group command
処理をまとめて早く処理。

```bash:before
echo aa >a.txt
echo bb >>a.txt
echo ccc >>a.txt
```
```bash:after
{
echo aa
echo bb
echo ccc
} >a.txt
```

## command >tmp.txt -> Process Substitution
余計な一時ファイルを使わなくて済む。

```bash:before
commandA >comA_tmp.txt
commandB >comB_tmp.txt
diff comA_tmp.txt comB_tmp.txt
rm comA_tmp.txt comB_tmp.txt
```
```bash:after
diff <(commandA) <(commandB)
```

## var is null then set var -> Parameter Expansion
変数が空文字か設定されていないときは「:=」か「:-」で。
「:=」は変数に値が設定されます。「:-」は一時的。

```bash:before
a=
if [ -z "${a}" ] ; then
    a="poi"
fi
echo ${a}
```
```bash:after
echo ${a:=poi}
```

## sed -> Parameter Expansion
${parameter/pattern/string}の形で書くのがベースです。

### 文頭置換(#がパターンの一文字目の時)

```bash:before
a="/usr/local/bin";echo ${a} | sed "s@^.*/@/s@"
```
```bash:after
a="/usr/local/bin";echo ${a/#*\//\/s}
```

### 文末置換(%がパターンの一文字目の時)

```bash:before
b="200MB";echo ${b} | sed 's/B$/iB/'
```
```bash:after
b="200MB";echo ${b/%B/iB}
```

### 該当箇所全置換(/がパターンの一文字目の時)

```bash:before
c="a1b2c3d4";echo ${c} | sed 's/[0-9]//g'
```
```bash:after
c="a1b2c3d4";echo ${c//[0-9]}
```

## 1 2 3 4 5 -> Brace Expansion
### 数列

```bash:before
echo 1 3 5 7 9 11 
```
```bash:after
echo {1..11..2}
```

### 文字列
```bash:before
touch data_a data_b data_c ......... data_z
```
```bash:after
touch data_{a..z}
```

## expr -> Arithmetic Expansion
計算にexprはNo。ただ、有効桁数はbcよりしょぼい。

```bash:before
x=$(expr 1 + 1)
```
```bash:after
x=$((1 + 1))
```

## おまけ 一時的に環境変数を変える
後ろのコマンドにだけ影響を与える。

```
LANG=C PAGER=less man bash
```

## 〆
大体どれもより簡潔に書けるようになるので、認知度が上がってほしいところです。

尚、古いbashだと対応していない場合があるので注意。
(古いSolaris環境にリリースしたらシェルがこけた…)
activerecordでself.table_nameの値と、定義したmodelのrelationshipが被っちゃった時の悲劇

ふと思ったのですが、映画の年間パスが非常に欲しいのですがそういうのあまりないんですね。

## 背景

とある既存システムの、次世代バージョンを開発している。その既存システムはweb版とネイティブ版を持っていて、僕はネイティブ版の次世代バージョンを作っている。web版との兼ね合いでデータベースは既存のものを使うことになっている（ここがめっちゃ辛い）。ネイティブはreact-native, APIはrailsで開発している。


データベースは既存のものを使うことになっているのですが、この命名とかが僕的にはとてもわかりにくかったので、DBのテーブル名とモデル名は基本的に全て違っている。activerecordで帳尻合わせをしている感じ。

開発中に諸事情によりテーブル名を変更した。そのタイミングでよくわからないエラーが出続けて非常に困ったのでその備忘録と、理由を知っている人がいたら教えて欲しいのでqiitaに残しておくことにした。

叩いたコマンドは以下の通り。relation組んでる相手側から呼び出そうとするとエラーがでる。relationの組み方にはエラーはまったくありません。

```
AnotherModelClass.first.test
```

## 実際のコード

ちなみに僕はrailsの書き始めて２ヶ月。プログラミング始めて10ヶ月のぺーぺーで、まだ至らない点がそりゃもうたくさん。これからエラーが出るコードとその内容を書いて行くのですが、見て欲しいのは次の３箇所。

1. self.table_name = "value1"
2. has_one :value2
3. エラーメッセージの NameError: 以下略

以下の３つのパターンを試したところ全て挙動が違っていた。railsの裏側もしっかり学ばないとな。。って思った次第です。


#### エラーが出るパターン

```app/model/user.rb
class Test < ApplicationRecord
  self.table_name = "test_users"

  has_one :test_user

# エラーは以下のとおり
=begin
NameError: uninitialized constant Test::TestUser
from /path/to/app/vendor/bundle/ruby/2.3.0/gems/activerecord-5.0.1/lib/active_record/inheritance.rb:152:in `compute_type
=end
```


#### エラーでないパターン

```app/model/user.rb
class Test < ApplicationRecord
  self.table_name = "different_users"

  has_one :test_user

## エラーなし
```

## まとめ

結局エラーが解消できたのでよかった。ちゃんと理解していないことについてまとめるのは大変だなぁと思いつつ、なんかよくわからないからとりあえずまとめるしかなかった。言葉とかわかりにくいと思いますが、最後まで付き合ってくれた方、ありがとうございます。
Raspberry Piのクロスコンパイル環境を整える

# コンパイラのインストール

```
$ git clone git@github.com:raspberrypi/tools.git
$ cd tools
$ cp -r arm-bcm2708/arm-rpi-4.9.3-linux-gnueabihf /opt
$ export PATH=$PATH:/opt/arm-rpi-4.9.3-linux-gnueabihf/bin >> ~/.bash_profle
$ source ~/.bash_profile
```
これで`arm-linux-gnueabihf-c++`が使えるようになる。終わり。これ以降は便利なライブラリをビルドしてみる手順。

# mraa のビルド
I/Oを操作するのにmraaがあると便利ではないかと思うのでインストールする。[この資料](https://github.com/intel-iot-devkit/mraa/blob/master/docs/building.md)に従って作業していく。今回は共有ライブラリでなく静的ライブラリを生成するようにした。ラズパイにデプロイしたときに、ファイルが無いとか言われると面倒なので。

```
$ sudo apt-get install swig3.0 python-dev nodejs-dev cmake libjson-c-dev
$ git clone git@github.com:intel-iot-devkit/mraa.git
$ cd mraa
$ mkdir build
$ cd build
$ cmake -DCMAKE_INSTALL_PREFIX:PATH=/home/ubuntu/vanilla/thirdparty/mraa -DBUILD_SHARED_LIBS=OFF -DCMAKE_C_COMPILER=/opt/arm-rpi-4.9.3-linux-gnueabihf/bin/arm-linux-gnueabihf-gcc -DCMAKE_CXX_COMPILER=/opt/arm-rpi-4.9.3-linux-gnueabihf/bin/arm-linux-gnueabihf-c++ -DBUILDARCH=arm ..
$ make
$ sudo make install
```

試しに[example](https://github.com/intel-iot-devkit/mraa/tree/master/examples/c%2B%2B)なんかをビルドしてみる。

```
$ arm-linux-gnueabihf-c++ ./test.cpp -I../thirdparty/mraa/include -L../thirdparty/mraa/lib -lpthread -lmraa -o test
```

# Boostのビルド
C++書いてたらBoostが欲しくなると思うのでビルドする。
VM上で作業している場合は、メモリが足りなくなるので、4Gくらいには増やしておく。

クロスコンパイルの設定用に`~/user-config.jam`を作成する。

```bash:user-config.jam
using gcc : arm
  : arm-linux-gnueabihf-c++
  : <compileflags>--sysroot=/opt/arm-rpi-4.9.3-linux-gnueabihf/arm-linux-gnueabihf/sysroot
  <cxxflags>-I/opt/arm-rpi-4.9.3-linux-gnueabihf/arm-linux-gnueabihf/sysroot/usr/include
  <cxxflags>-I/opt/arm-rpi-4.9.3-linux-gnueabihf/arm-linux-gnueabihf/include/c++/4.9.3
  ;

using python : 2.7
  : /usr/bin/python
  : /opt/arm-rpi-4.9.3-linux-gnueabihf
  /opt/arm-rpi-4.9.3-linux-gnueabihf/arm-linux-gnueabihf/python2.7
  /opt/arm-rpi-4.9.3-linux-gnueabihf/python2.7
  ;
```

pythonのライブラリがtoolsに含まれていないため、python関係のモジュールのビルドが失敗してしまうので
https://packages.debian.org/jessie/libpython2.7-dev から取ってきて配置する。

```
$ wget http://http.us.debian.org/debian/pool/main/p/python2.7/libpython2.7-dev_2.7.9-2+deb8u1_armhf.deb
$ dpkg -x libpython2.7-dev_2.7.9-2+deb8u1_armhf.deb libpython2.7-dev_2.7.9-2_armhf_extracted
$ sudo cp -r libpython2.7-dev_2.7.9-2_armhf_extracted/usr/include/arm-linux-gnueabihf/python2.7/ /opt/arm-rpi-4.9.3-linux-gnueabihf/arm-linux-gnueabihf
$ sudo cp -r libpython2.7-dev_2.7.9-2_armhf_extracted/usr/lib/python2.7/config-arm-linux-gnueabihf/ /opt/arm-rpi-4.9.3-linux-gnueabihf/lib/python2.7
$ sudo cp -r libpython2.7-dev_2.7.9-2_armhf_extracted/usr/include/python2.7/ /opt/arm-rpi-4.9.3-linux-gnueabihf
```

boostをダウンロードしてきて適当なところに展開する。

```
$ mkdir ./boost
$ wget -O Boost.tar.gz https://sourceforge.net/projects/boost/files/boost/1.63.0/boost_1_63_0.tar.gz/download
$ tar xvzf Boost.tar.gz
```
適当に`/opt/boost`以下にビルドしてみる。これもstaticライブラリとしてビルドすることにする。デプロイが(以下略

```
./b2 install -j2 --prefix=/opt/boost --toolset=gcc　link=static
```
しばらく待つと、

```
#error "platform not supported"

...

...skipped 9 targets...
```
とかで一部ビルドできないが、大体できた。もし使えないモジュールあったらごめんなさい。
google cloud translate API

#クイックスタート

```json:translate-request.json
{
  "q": "The quick brown fox jumped over the lazy dog.",
  "source": "en",
  "target": "es",
  "format": "text"
}
```

サービスアカウントの認証

```
gcloud auth activate-service-account --key-file=<path/to/service-account-key.json>
```

承認トークンを取得

```
gcloud auth print-access-token
```

リクエスト発行

```
curl -s -k -H Content-Type: application/json" \
    -H "Authorization: Bearer <access_token>" \
    https://translation.googleapis.com/language/translate/v2 \
    -d @translate-request.json
```

##結果

```
{
  "data": {
    "translations": [
      {
        "translatedText": "El zorro rápida saltó sobre el perro perezoso."
      }
    ]
  }
}
```

#日本語に変換してみた

```json:translate-request.json
{
  "q": "The quick brown fox jumped over the lazy dog.",
  "source": "en",
  "target": "ja",
  "format": "text"
}
```

##結果

```
{
  "data": {
    "translations": [
      {
        "translatedText": "速い茶色のキツネが怠惰な犬を飛び越えました。"
      }
    ]
  }
}
```
Gitのコミットを取り消したい時あれこれ

#直前の複数のコミットをなかったことにしたい場合
気前よくコミットしまくったけど、一日たって冷静に考えるとかなりアレな感じだったりすることってありますよね。そんな時はこれ。

##リセットボタンをぽちっと押す
無かったことにしたいコミットのあるブランチに飛んでresetする。
ただし他人がcloneしてたらその人がpushした時に元に戻してしまうので意味がない。
その時は`git revert`で恥をさらし続けるか、cloneした人を全員探し出すしかない。

以下は`develop`ブランチの`Paraphrase readme`と`Fixed ToC link `を無かったことにしたい例

```bash:
$ git checkout develop
$ git log --oneline
4e3e94b Paraphrase readme                                      
2d9d50a Fixed ToC link                                         
59ac102 revert local.go                                        
7f0002e Update README.md                                       
(略)

$ git reset --hard 59ac102
$ git push -f
```


##タグを消す
上記リセットしてもタグを打ってしまうと結局コミットは残り続ける。`reset`した後にタグを消すことを忘れないのが、真のバックラー。

```bash:
$ git tag -d v0.0.2
$ git push origin :refs/tags/v0.0.2
```

#直前のコミットをなかったことにしたい場合
こちらはイケてなかった場所を修正してcommitの時に--amendオプションをつけるだけ。
コミットしたら素早くpushしよう。

```bash:
$ git commit --amend
$ git push
```

#最後に
Githubでコントリビューターが自分だけだと上記コマンドだけで黒歴史を消すことができます。
コンパイル通らないGoプロジェクトをリリースするとか、そういうダサい過去は私くらいしかいないでしょうけど・・・。
Raspberry Pi で MPEG-2 TS の動画を H.264 にハードウェアエンコードする(ffmpeg版)

# この記事について
Raspberry Piを使って、どのご家庭にもある`.ts`なファイルを圧縮してディスクの空き容量を増やし、
さらに溜め込んでいくぞという試みです。

以下の2モデルで確認しています。

- Raspberry Pi（初代） Model B+
- Raspberry Pi3 Model B

----
従来、Raspberry Piでのハードウェアエンコードでは`GStreamer`を使って行うのが一般的でした。
しかし、`GStreamer`はそもそもこのような単純な動画エンコードを目的としたツールではないため、

- オプションなどがわかりにくい
- 情報が少ない

などの問題がありました。
そこで、本記事では皆さんが使い慣れたFFmpegを使ってハードウェアエンコードを行っていきます。
なお、FFmpegがRaspberry Piのハードウェアエンコードに対応したのは2016年中頃のようです。

# 事前準備
- Raspbianの初期設定
- MPEG-2ライセンスの入手と設定

この辺りの説明は割愛します。各自お好きなようにしてください。

# FFmpegのビルド
ここから本編です。

```bash
$ wget https://ffmpeg.org/releases/ffmpeg-snapshot.tar.bz2
$ tar jxvf ffmpeg-snapshot.tar.bz2
$ cd ffmpeg
$ ./configure --enable-static --enable-omx-rpi --enable-mmal

# 使用している Raspberry Pi　のCPU数に応じて変更 (Pi=>1, Pi3=>4 あたり)
$ make -j4
# Piだと6時間弱, Pi3でも40分程度かかります

$ sudo make install
```

# エンコード
ビルドしたffmpegを使ってエンコードしていきます。
ハードウエアエンコードにありがちですが、以下の操作をしようとすると、エンコード速度が落ちます。

- 解像度を変更する
- インターレースを解除する

あくまでファイル容量削減程度に考え、割り切ってエンコードしていくのが良さそうです。

### 例
hoge.tsをH.264に変換する例です。`h264_omx`がポイントです。

```bash
$ ffmpeg -fflags +discardcorrupt -i hoge.ts -bsf:a aac_adtstoasc -c:a copy -b:v 5000k -c:v h264_omx -y hoge.mp4
```

`-fflags +discardcorrupt` `-bsf:a aac_adtstoasc` あたりはaudioのコピーをするためのオプションです。
audioをそのままコピーすることによってエンコード速度低下を防いでいます。

`-b:v 5000k` でmovieのビットレートを指定できます。
元の解像度や好みによって変えると良いと思います。

上記オプションの場合、
- Raspberry Pi: 動画長さの3倍程度の時間
- Raspberry Pi3: 動画の長さとほぼ同じ時間
でエンコードできるようです。

あとは各自でスクリプト書くなりして、どんどんエンコードしていきましょう。💪