OmniAICreator/Qiita-1.07M huggingface dataset:
AviUtil をインストールしようぜ

つまり　このサイトを読めということだが、

「AviUtilの易しい使い方」
http://aviutl.info/

読んで　インストールしてみよう。


「AviUtilのお部屋」
http://spring-fragrance.mints.ne.jp/aviutl/

||||
|---|---|---|
|aviutl100.zip|version1.00|2013/4/1|
|exedit92.zip|version0.92|2013/7/15|

これをダウンロードしたらいいのか。

適当に AviUtil というフォルダーを作って その中で .zip ファイルを解凍する。
中身が　ぶちまけられるタイプのようだ。フォルダーを作っておいてよかった。

.exe をダブルクリックする。

動作が軽いのが特徴のようだ。ウィンドウがすぐ開いた。

音ファイルというと ogg が鉄板なんで、使えるように L-SMASH プラグインを入れよう。

AviUtilフォルダーの下に `Plugins` フォルダーを作った。

'L-SMASH Works r921' をダウンロードする。

L-SMASH_Works_r921_plugins.zip も中身をぶちまける解凍方式のようだ。
Pluginsフォルダーの中で解凍してよかった。


AviUtil のメインメニューから [ファイル] - [環境設定] - [入力プラグインの優先度の設定] と進む。
めんどくさい。このままでいいか。


exedit.ini をテキスト・エディターで開く。

試しに

```
.ogg=音声ファイル
```

と追記。

出力フォーマットは Avi があれば十分だぜ。出力プラグインは　パス。

初期設定をするか。

なんか　めんどくさいので　読み飛ばして　使い方講座へ。

# 声とかどうやって入れるのか

棒読みちゃん

拡張編集

「【AviUtl】動画に音声を合成する方法【MP3】」
http://aviutl.info/onnsei-gousei/


# gifアニメとかどうするのか

「【AviUtl】拡張編集で.gifファイルが読み込めない時の対処法【画像】」
http://aviutl.info/gif-yomikomi/


# 文字とかどうやって入れるのか

「【AviUtl】動画への字幕(テロップ)の入れ方【テキスト】」
http://aviutl.info/zimaku-tekisuto/
macOS のセットアップでやったことメモ

Sierra

## Keyrepeat の高速化

```
defaults write NSGlobalDomain KeyRepeat -float 1.5
```

## IME

1. Google IME をインスコ

2. システムデフォルトの IME 削除

  macOS の英語と日本語がある状態で、英語->日本語の順番に消せば消せる

3. Google IME で全角英数字、記号、スペースを打てなくする

  画面ぽちぽち
EmotionTech本番環境でのDocker活用事例

# 先日の勉強会にて

こんにちは。Emotion Techの子安です。最近急に暖かく、というか暑いくらいになりましたね。暑いといえばアイスです。アイスは森永乳業のピノ（バニラ）が好きです。はい。

ところで、先月・今月とDocker関連の勉強会でお話しする機会をいただきました。ありがとうございます。

- [【ヒカ☆ラボ】Dockerを利用した開発事例～Docker導入から運用まで～](https://atnd.org/events/86945)
- [JAWS-UG コンテナ支部 #8](https://jawsug-container.connpass.com/event/55568/) ・・・[動画（2コマ目）](https://crash.academy/class/70/)

どちらもDockerを本番環境に適用するにあたって、その開発から運用までの事例を知るというテーマでしたので、弊社Emotion TechでのDocker活用についてご紹介しました。スライドはこちらです。

[![WebService-with-Docker2-1.001.png](https://qiita-image-store.s3.amazonaws.com/0/169518/8fe39ed0-9438-2b07-72c3-825c5c89baf1.png "Dockerで構成するWebサービス スライド表紙ページ")](https://www.slideshare.net/akirakoyasu/dockerwebemotiontech)
（画像をクリックするとSlideShareへジャンプします。以下の画像も同様です）

以下、お話した内容を簡単にまとめます。

# EmotionTechでのDocker

前半では、システム構成と開発フローについて説明しました。

[![WebService-with-Docker2-8.001.png](https://qiita-image-store.s3.amazonaws.com/0/169518/cca16fa2-531e-2604-f1d1-219bff0c816d.png "Dockerで構成するWebサービス システム構成図")](https://www.slideshare.net/akirakoyasu/dockerwebemotiontech/8)

EmotionTechでは、AWS Elastic Beanstalk上にphusion/baseimage-dockerをベースとしたDockerコンテナを構築して運用しています。システム構成はマイクロサービスというわけではないのですが、役割ごとにWebサーバやAPIサーバなどを5つのコンテナに分けて配置しました。そしてコンテナの軽さを活かし、ローカル環境でも本番環境とほぼ同じコンテナの構成を再現しています。

また開発フローはGitHubフローをベースにしています。masterブランチからコンテナイメージをビルドして、ステージング環境へデプロイするまでがTravis CIの役割。その後、本番環境へデプロイするのはJenkinsサーバから行います。


# 導入から運用まで

後半では、このシステムの構築や運用で起きたいろいろな問題や発見、検討方針などについてお話ししました。

[![WebService-with-Docker2-13.001.png](https://qiita-image-store.s3.amazonaws.com/0/169518/df2f6ab8-583c-eca9-65fe-7a162cdd6500.png "Dockerで構成するWebサービス 導入から運用までのアジェンダ")](https://www.slideshare.net/akirakoyasu/dockerwebemotiontech/13)

大きなストーリーとしてはスタートアップ企業という事情もあって人が少ない中、属人化や環境依存を最小にしつつ、いかに効率よく構築・運用するかを考えたという流れです。Elastic Beanstalkやphusion/baseimage-dockerの採用は、AWS・Docker・Rubyについて先人の知恵を借りるためという理由が大きいですし、CIの大部分をTravis CIで実施しているのは、属人化しがちなJenkinsの役割をできるだけ小さくしておきたいという事情によります。

この6月で本稼働してから7ヶ月が経つことになりますが、今までのところ大きな問題は起きていません。


# 最後に

スライド中でも言及していますが、Dockerの最大の利点は「実行環境＋アプリケーションをパッケージしてデプロイできること」だと、私は思っています。Dockerを本番環境まで導入するなら、確認環境（ステージング環境）から本番環境まで、必ず同じコンテナイメージを使うようにしましょう。

ご意見、ご感想、ご質問などありましたら、是非々々フィードバックをお願いいたします。
マストドンの新規ユーザーをRails Consoleから作成する

マストドンにおいて、Web上の新規会員登録を有効にしたくないけれど、
任意のユーザーを新規作成したい時のメモ。

# STEP1 SSHログイン
```bash
ssh root@example.com -i pem鍵のパス
```

# STEP2 マストドンを実行しているユーザーでログイン
ユーザーがわからないときは

```bash
ps axu | grep puma
```
とかで調べる。

さくらのスタートアップスクリプトの場合、「` mastodon `」ユーザーなので

```bash
su - mastodon
```
でmastodonユーザーでログイン

# STEP3 マストドンのRailsディレクトリに移動
マストドンのRailsディレクトリに移動。
わからないときは、

```bash
ps axu | grep node
```
とかで調べる。

さくらのスタートアップスクリプトの場合、` /home/mastodon/live `なので、

```bash
cd /home/mastodon/live
```

# STEP4 Rails Console に入る

```bash
bundle exec rails console -e production
```

# STEP5 ユーザーを作る
```ruby
user = User.create(email:'example@example.com', password:'YOUR_PASSWORD', password_confirmation:'YOUR_PASSWORD')
user.locale = 'ja' # 日本語なら'ja'、英語なら'en'など
user.build_account
user.account.username = 'YOUR_USERNAME' # アルファベットのユーザー名
user.save
# 確認メールが飛びます
user.account.save
```

build_accountがミソですね。
passwordとpassword_confirmationは同じ値を入れてください。

# STEP6 Rails Consoleを抜ける

```ruby
exit
```
AWS ECSにてカスタムしたredmineのdockerイメージを動かすまでのメモ(その２）

前回の記事(http://qiita.com/ms_os_pssb/items/fa434ed1d61ca8256a99)
に引き続き、カスタムしたredmineのdockerを動かすためにAWS側の設定をしていきます。

## 大きな流れ（復習）
1.Dockerfileを用意
2.AWSにてElastic Container Service(ECS)のタスクを定義
3.ECSのインスタンスを用意

今回は2を行います。

## 2.AWSにてElastic Container Service(ECS)のタスクを定義
見出しはタスクの定義としてますが、実際にはこんな作業が必要です。
なお、Redmineで使用するデータベースはRDS(MySQL)を利用しています。
(MySQLの用意方法は割愛）

2.1. Amazon EC2 Container Registryにdockerイメージの格納場所を用意
2.2. ローカルの端末でDockerfileをビルドし、2.1にて作成したRegistoryにpushする。
2.3. ECSのタスク定義にてpushしたイメージをつかうよう設定したタスク定義を作成

### 2.1 Amazon EC2 Container Registryにdockerイメージの格納場所を用意
- 管理コンソールより、「EC2 Container Service」→「リポジトリ」→「リポジトリの作成」ボタンをクリック。リポジトリ名を入れ、作成完了

![スクリーンショット 2017-05-29 16.20.51.png](https://qiita-image-store.s3.amazonaws.com/0/95618/592aaa3c-8f9b-64da-3973-10718e9b12e1.png)

![スクリーンショット 2017-05-29 16.27.17.png](https://qiita-image-store.s3.amazonaws.com/0/95618/c1ca659b-704d-4f9c-e75f-61dfcda12f9f.png)

### 2.2. ローカルの端末でDockerfileをビルドし、2.1にて作成したRegistoryにpushする。
上記にて完了画面に出てきたコマンドをローカルで実施。Dockerfileのビルドとregistoryへのpushを行う。

```
#事前にaws configにてローカル端末にawsアカウントを設定していること
aws ecr get-login --region (リージョン名)
# dockerfileおよびdocker-entrypoint.shファイルがあるフォルダ上で実施
docker build -t redmine .
docker tag redmine:latest xxxxxx(awsアカウント+region).amazonaws.com/redmine:latest
docker push xxxxxx(awsアカウント+region).amazonaws.com/redmine:latest

```
### 2.3 ECSのタスク定義にてpushしたイメージを使うように設定したタスク定義を作成

-管理コンソールより、「EC2 Container Service」→「タスク定義」→「新しいタスク定義の作成」を選択する。
-「コンテナを追加」より、詳細内容を入力

実際に動作しているものをキャプチャします。

![スクリーンショット 2017-05-29 18.36.14.png](https://qiita-image-store.s3.amazonaws.com/0/95618/81b33546-6bec-0c87-df8e-89eb75c0d7df.png)

##### ポイント
- タスク定義名→適当、タスクロール→なしでOK
- コンテナイメージに先ほどpushしたイメージのパスを貼り付け
- メモリ→512MBもあれば十分。
- ポートマッピング→3000portで動作するイメージのため、ホスト側の80とマッピング
- マウントポイント→configの内容(database.yml)を置く場所と、添付ファイルを置くフォルダをホスト側のディレクトリにマッピングするために設定する。ボリュームにてホスト側のディレクトリのソースパスを指定したものを用意し、マッピングにて設定する。
- ログ設定でcloudwatchのロググループを指定している。例ではあらかじめ「redmine-log」というロググループを作成し、それを指定している。




ようやくDockerのイメージの動作定義まで出来たので最後にイメージを動かすインスタンス(EC2)の用意をします。

（次回/最終回に続く）
Angular4ベースの開発を行うための開発環境手順（メモ）

Angular4を活用した案件開発を模索中。一旦Macにて1から開発環境を作ったので個人的にメモ。

## Angularとは
Googleと個人や企業のコミュニティによって開発されている、フロントエンドWebアプリケーションフレームワーク。
SPA方式でのWebアプリケーション開発の他、ionicなどのcordovaハイブリッドアプリにも利用されている。
なお、2.0からコードベースをTypeScriptに変更している。


## 構築する端末などの前提
- 開発端末→Mac
- OS → OS X (Sierra)以上
- nodejsのパッケージマネージャはnを利用。バージョンは6.10.3をインストール。
- こちらの内容を参考にしてます。
[Angular CLI QUICKSTART](https://angular.io/docs/ts/latest/cli-quickstart.html)

## インストール手順 
### brewおよびbrew caskをインストール(MacOS用パッケージマネージングツール)
```
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
brew tap caskroom/cask
```

参考）
[brew](https://brew.sh/index_ja.html)
[brew cask](https://caskroom.github.io/)

### nodejsのインストール
```
# nのインストール(nodejsのバージョン管理)
brew install n
#nodejs(6.10.3)のインストール
n 6.10.3
```

### angular cliのインストール
```
npm install -g @angular/cli
```

### 開発エディタ(visual studio code)をインストール

```
brew cask install visual-studio-code
```

## サンプルを動かす
```
ng new my-app
cd my-app
ng serve --open
```
app works!と出ればOK
![スクリーンショット 2017-05-29 19.06.15.png](https://qiita-image-store.s3.amazonaws.com/0/95618/4949d3f2-79c7-4773-a447-da3eba23daed.png)

## ちょっとだけいじって見る
app works!と出た画面をいじる。

```
#vscodeにて起動
code my-app
```

app.component.tsにあるtitleの部分を書き換えてみる

```src/app/app.component.ts
import { Component } from '@angular/core';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent {
  title = 'My First Angular App';
}
```
色とフォントの種類、サイズをいじってみる

```src/app/app.component.css
h1 {
  color: #369;
  font-family: Arial, Helvetica, sans-serif;
  font-size: 250%;
}
```

開いていたブラウザ上でリアルタイムに正しく反映されていることを確認
![スクリーンショット 2017-05-29 19.12.44.png](https://qiita-image-store.s3.amazonaws.com/0/95618/41a94bca-8b95-4ba3-bb1c-dc9b40ec7197.png)

## この後の予定
チュートリアルを一通りやってみる。
[Angular公式チュートリアル](https://angular.io/docs/ts/latest/tutorial/)
Docker を使って Assets をビルドする

**本番サーバ内で Assets のビルドをしたいが、ビルドのためだけに Node.js をインストールしたくない、しかし Docker はインストールされている**、というレア(？)な状況に遭遇した際に Docker で Assets のビルドをやってみたのでそのメモ。



``` console
$ docker run -it --rm -v $(pwd):/app -w /app node:alpine npm install --unsafe-perm
```

以下、オプションの細かい解説。

### `-it`
いつものやつ。
今回はなくても問題はないけど一応。

### `--rm`
Assets ビルドのためだけに立ち上げるコンテナでビルドが終わったら不要なため、ビルド後にコンテナを消去するために `--rm` オプションをつける。

### `-v $(pwd):/app`
ホスト側のカレントディレクトリ (アプリケーションのルート) をコンテナ側の `/app` にマウントする。

### `-w /app`
コンテナ内でコマンドを実行する際の作業ディレクトリを指定する。

### `node:alpine`
ビルドに使用する Node イメージ。

`node:alpine` だと最新版の Node イメージが落ちてくるが、例えば Node v6 でビルドしたい場合は `node:6-alpine` のようにタグを指定する。

詳しくは： [library/node - Docker Hub](https://hub.docker.com/_/node/)

### `npm install --unsafe-perm`
コンテナで実行するコマンド。

今回は `postinstall` フックで `webpack -p` が実行されて Assets がビルドされるように `package.json` に設定してあったため、 `npm install` だけでビルドまですることができた。

``` js:package.json
  "scripts": {
    "postinstall": "npm run build",
    "build": "webpack -p",
  },
```

`npm install` だけだと `postinstall: cannot run in wd %s %s (wd=%s)` という WARNING が出て `postinstall` が実行されなかったため、 `--unsafe-perm` が必要だった。

もし `postinstall` を使わずに `npm install` と `npm run build` を実行したい場合は、実行コマンドを `/bin/sh -c 'npm install && npm run build'` このようにするといい。
bashで入力履歴も出力履歴も保存する

bash上でさまざまな操作をして、後になってから何をしたかわからなくなったり、あるいはどんな数値を見たか忘れてしまったりしたときはありませんか？ そんなときのためのtipsです。自分が行った研究の記録をつける用途で考えているため、意図的なログの抹消への対策はしていません。サーバ管理用途で利用者の操作を監視したいといった目的には不向きです。

# 入力履歴の保存（.bashrcのバックアップ）
```~/.bash_logout
DATETIME=`date +%Y%m%d%H%M%S`

history > ~/log/bash_history/$DATETIME
rm ~/.bash_history
```
と追記。もともとのbash_historyは消さなくてもよい（そうしたほうが前回ログイン時のコマンドをたどれる）ものの、ここではログの簡素化のため消してしまっています。もう少しうまい処理をすれば昨日の分だけは残しておくとかできるでしょうが……。セッションが正常に終了せず.bash_logoutが実行されなかった場合は次回まで持ち越されて保存されるのでログを失うリスクは大きくないはずです。

* ある日のログファイルだけ一覧したければ`cat ~/log/bash_history/20170101*`。
* ある日に実行したコマンドを一覧したければ`cat ~/log/bash_history/* | grep 20170101`とでも（これはhistoryの中身にもタイムスタンプをつけている前提。以下参照）

### Historyの各エントリにもタイムスタンプを表示する
```~/.bashrc
export HISTTIMEFORMAT="%Y%m%d%H%M%S "
```
参考：
1. https://askubuntu.com/questions/391082/how-to-see-time-stamps-in-bash-history
2. 日付の書式は`man date`

### .bash_historyを複数のターミナル間で共有する（お好みで）
```~/.bashrc
function share_history {
    history -a
    history -c
    history -r
}
PROMPT_COMMAND='share_history'
shopt -u histappend
export HISTSIZE=9999
```
参考：
1. http://iandeth.dyndns.org/mt/ian/archives/000651.html
2. https://unix.stackexchange.com/questions/1288/preserve-bash-history-in-multiple-terminal-windows

# 出力履歴の保存（scriptコマンド利用）
```~/.bashrc
if [ "$SSH_TTY" != "" ]; then # scpが使えなくなる問題を回避するためのおまじない。
    P_PROC=`ps aux | grep $PPID | grep sshd | awk '{print $11}'` # 子プロセスでは実行しない
    if [ "$P_PROC" = "sshd:" ]; then
        script -f -q ~/log/script/`date '+%Y%m%d%H%M%S'`
    fi
```
やってみるとわかりますが、このログは見づらく量も膨大になるので、特段必要があるときにがんばって検索してやる程度のものになるでしょう。それでもあるのとないのとでは大違いです。また、sshで接続していることを前提としているのでこのままではローカルでは走りません。

参考：
1. http://blog.mogya.com/2008/01/ssh.html
2. https://stackoverflow.com/questions/12440287/scp-doesnt-work-when-echo-in-bashrc
ABAPでの検証時の便利なクラスCL_DEMO_OUTPUT

#検証時に不便だったこと
ABAPで検証している時に、変数の値を確認するのは地味に面倒でした。特に内部テーブルや構造は、Writeコマンドで簡単に書けないので、Writeをたくさん書いたり、デバッガで確認したりとストレス溜まっていました。

#クラスCL_DEMO_OUTPUT
クラスCL_DEMO_OUTPUTを使うと簡単に確認できます。前から知っていましたが、多少余裕があったので、改めてメモしておきます。
こんな感じで書きます。するとポップアップ画面が出て変数の中身を確認できます。

```abap:Report.abap
SELECT *
FROM t000
INTO TABLE @DATA(lt_output).

cl_demo_output=>display( lt_output ) .
```

複数変数を同時に見たい場合は、こんな書き方です。

```abap:Report.abap
* 複数出したい場合
SELECT *
FROM t000
INTO TABLE @DATA(lt_output).

DATA(lr_out) = cl_demo_output=>new( )->write_data( lt_output ).

DELETE lt_output FROM 3.

lr_out->write_data( lt_output )->display( ).
```


#参考
以下のレポートプログラムがサンプルです。
DEMO_USAGE_OUTPUT_INSTANCE
DEMO_USAGE_OUTPUT_STATIC

以下のページが参考になります。
[CL_DEMO_OUTPUT, Part 1 of 2 – Usage](https://blogs.sap.com/2016/05/10/cldemooutput-part-1-of-2-usage/)
[CL_DEMO_OUTPUT, Part 2 of 2 – A Look Behind](https://blogs.sap.com/2016/05/10/cldemooutput-part-2-of-2-a-look-behind/)
getUserMedia()のconstraintsでカメラデバイスおよび出力解像度の選択に使用されるfitness distanceアルゴリズムについて

getUserMediaのConstraintsは、いまだブラウザーごとの実装に差異がありますが、W3Cの[Media Capture and Streams](https://w3c.github.io/mediacapture-main/)にconstraintsの値からカメラデバイスおよび解像度の選択において"fitness distance"というアルゴリズムが使用されると書かれています。
この"fitness distance"について説明したいと思います。
ただし、現在、このアルゴリズムをサポートしているのはFirefoxのみとなっています。

この"fitness distance"がどのようなアルゴリズムかというと、仕様にはアルゴリズムで使用する計算式が書かれています。

```c
(actual == ideal) ? 0 : |actual - ideal|/max(|actual|,|ideal|)
```

actualにはカメラの解像度、idealにはconstraintsで設定した解像度が入ります。
解像度といっても、widthとheightの2つの値があります。ちょっと自信がないのですが、Firefoxのソースを見るとwidthとheightでそれぞれこの計算式で値を算出し、2つの値を足したものがそのカメラと解像度の組み合わせに対するConstraints設定とのdistance値としているようです。
接続されているカメラおよびカメラが対応している出力解像度分このdistance値を求め、distance値が最小となる組み合わせが選択されます。
例えば、constraintsを

```js
{
  video: {
    width: 200,
    height: 200
  }
}
```
としたとき、解像度160x120のdistance値は

```js
(160 == 200) ? 0 : Math.abs(160 - 200) / Math.max(160, 200) = 0.2
(120 == 200) ? 0 : Math.abs(120 - 200) / Math.max(120, 200) = 0.4
0.2 + 0.4 = 0.6
```
ということで0.6となります。


私が所有するカメラで検証してみました。
Logicool HD Webcam C615(以降Logicool) とノートPCに搭載されている BisonCam, NB Pro(以降Bison) というカメラです。
それぞれのカメラが提供している出力解像度は以下のようになっています。また既定デバイスはLogicool になっています。

|Logicool(既定デバイス)|BisonCam|
|:--:|:--:|
|160x120|160x120|
|176x144|176x144|
|320x240|320x240|
|352x288|352x288|
|432x240| - |
|640x360|640x360|
|640x480|640x480|
|800x448| - |
|864x480| - |
|800x600| - |
|1024x576| - |
|960x720| - |
|1280x720|1280x720|
| - |1280x1024|
|1600x896| - |
|1920x1080|1920x1080|

ここで、Constraintsを以下のように設定してgetUsermedia()を実行してみます。

```js
{
  video:{
    width: 300,
    height: 300
  }
}
```
すると、Logicoolで352x288の解像度が選択されてストリームが取得されました。
distanceの値を計算してみます。(小数点第3位四捨五入)

|Logicool(既定デバイス)|BisonCam|distance値|
|:--:|:--:|:--:|
|160x120|160x120|1.07|
|176x144|176x144|0.93|
|320x240|320x240|0.26|
|352x288|352x288|★0.19|
|432x240| - |0.51|
|640x360|640x360|0.7|
|640x480|640x480|0.91|
|800x448| - |0.96|
|864x480| - |1.03|
|800x600| - |1.13|
|1024x576| - |1.19|
|960x720| - |1.27|
|1280x720|1280x720|1.35|
| - |1280x1024|1.47|
|1600x896| - |1.48|
|1920x1080|1920x1080|1.57|

distance値が最小となったのは352x288の解像度で、この解像度は両デバイスともに対応していますが、既定デバイスがLogicoolですのでLogicoolを選択、ということで計算による選択と実際の動作が一致しました。

次にConstraintsを以下のようにして、getUserMedia()を実行してみます。

```js
{
  video:{
    width: 1000,
    height: 1000
  }
}
```
すると、Bisonで1280x1024の解像度が選択されてストリームが取得されました。
distanceの値を計算してみます。

|Logicool(既定デバイス)|BisonCam|distance値|
|:--:|:--:|:--:|
|160x120|160x120|1.72|
|176x144|176x144|1.68|
|320x240|320x240|1.44|
|352x288|352x288|1.36|
|432x240| - |1.328|
|640x360|640x360|1|
|640x480|640x480|0.88|
|800x448| - |0.752|
|864x480| - |0.656|
|800x600| - |0.6|
|1024x576| - |0.4474375|
|960x720| - |0.32|
|1280x720|1280x720|0.5|
| - |1280x1024|★0.24|
|1600x896| - |0.48|
|1920x1080|1920x1080|0.55|

となり、解像度1280x1024がdistance値が最小となりますが、この解像度はBisonしかサポートしていませんので、Bisonで1280x1024を選択ということでこれも実際の動作と一致しました。

このように、デバイスを指定していない場合、既定のデバイスとは違うデバイスが選択される場合があることに注意しておいたほうがいいでしょう。
【AnotherNewGame】カスタマイズ覚書

# データロード時のメッセージを専用のものにしたい

AnotherNewGame.jsの下部に追加する。

```js:AnotherNewGame.js
	Scene_Load.prototype.helpWindowText = function() {
        if (localExtraStage === true) {
	    	return "\\C[5]【強いままニューゲーム】\\C[0]の対象セーブデータを選んでください。";
	    } else {
	    	return TextManager.loadMessage;
	    }
	};

```

通常ロード呼び出し時
![sshot 1.jpg](https://qiita-image-store.s3.amazonaws.com/0/180923/dbbf5bca-a72b-872b-8dcb-3815cab42fa1.jpeg)


アナザー呼び出し時
![sshot.jpg](https://qiita-image-store.s3.amazonaws.com/0/180923/edbd2859-00a4-d19f-598f-18a8b0c9ea01.jpeg)


localExtraStageがtrueの時に、アナザーニューゲームから呼び出しているので、通常ロードと分岐。
※日本語を含む時はUTF-8(BOM無し)で保存する事を忘れずに。
OverloadedStringsとANNプラグマが干渉する場合の回避方法

# tl;dr
プラグマ内部での文字列リテラルを `::String` と型指定すればよい
`{-# ANN module ("HLint: ignore Use camelCase" :: String) -#}`

## これに出くわした経緯
新しいプロジェクトで、テストスイートに [tasty](http://documentup.com/feuerbach/tasty) を使い、テストコードのディスカバリには [tasty-discover](https://github.com/lwm/tasty-discover) を導入しようとしました。
### tasty-discover
tasty-discover は ファイル名が `*Test.hs` あるいは `*Spec.hs` とサフィックスのついたモノをテスト対象のモジュールと判別し、その中で宣言されている `prop_` `spec_` などのプレフィックスのついた関数をテストスイートに自動的に追加してくれるというものです。
- `prop_` [QuickCheck]() でテストしてくれる
- `scprop_` [SmallCheck]() でテストしてくれる
- `unit_` [HUnit]() でテスト
- `spec_` [Hspec]()
- `test_` Tastyでこれら上記のテストをまとめる等

cabal ファイルのテストのビルド設定で `main-is` に指定しているエントリーポイントには

```Tasty.hs
{-#
 OPTIONS_GHC -F -pgmF tasty-discover
 -optF --debug --moduleSuffix=Spec
#-}
```

とか書いておくだけで、あとはテストファイルを追加していけば良いっていう感じになります

### HLint の `ANN` プラグマ指定
ここで、 `prop_` とかのスネークケースな命名をすると、当然 HLint は「キャメルケース使え」って怒ってくるのですが、それを回避する方法として、モジュール内にGHCの `ANN` プラグマを指定する方法があります。 `ANN` は _Annotation_ の意らしいです。

```Main.hs
module Main where

import System.IO
--
--
{-# ANN module "HLint: ignore Use camelCase" #-}
hoge_huga :: a -- 怒られなくなる
```

なお、注意事項としては、 __ANNプラグマは `import` の後に書くようにしないとコンパイルが通りません。__ 気をつけよう

このように特定のモジュールや関数をLintの検査対象から外す使い方もあれば、逆に特定の対象にだけより強い厳格なルールを付与したりすることもできます。みんな使おうね

### Megaparsec でTextをパースした結果をテストしたい→コンパイルできない→「！？」
で、 [Megaparsec](https://mrkkrp.github.io/megaparsec/) を利用して、Textをパースした結果のテストを書こうとして、このようにテストを書き始めたら、そもそもコンパイルができなくなってしまいました

```LexerSpec.hs
{-# LANGUAGE OverloadedStrings #-}
module LexerSpec where

import Test.Tasty.Hspec

import Lexer
import Parser

{-# ANN module "HLint: ignore Use camelCase #-}
```

```
LexerSpec.hs:__:__: error:
    • Ambiguous type variable ‘t0’ arising from the literal ‘"HLint: ignore Use camelCase"’
      prevents the constraint ‘(Data.String.IsString
                                  t0)’ from being solved.
      Probable fix: use a type annotation to specify what ‘t0’ should be.
      These potential instances exist:
        instance a ~ Char => Data.String.IsString [a]
          -- Defined in ‘Data.String’
        ...plus 10 instances involving out-of-scope types
        (use -fprint-potential-instances to see them all)
    • In the annotation:
        {-# ANN module "HLint: ignore Use camelCase" #-}
```

## 技術的解説
調べたところ、ちょうど[2016年の頭にチケットがGHCに寄せられていました](https://ghc.haskell.org/trac/ghc/ticket/11460)（修正の必要なしとしてクローズされています）
### `OverloadedStrings` の脱糖
↑ に書いてある通りですが、 `OverloadedStrings` は文字列リテラルを糖衣構文とみなし、以下のような脱糖をします

```hs
"hello" -- このままだとただの [Char]
```
↓

```hs
(fromString ("hello" :: String)) -- この時の型は IsString a
```

なので、件のプラグマのコンパイルエラーが `Ambiguous type variable` で始まっていたんですね。

```hs
{-# LANGUAGE OverloadedStrings #-}
-- ...
{-# ANN module ("HLint: ignore Use camelCase" :: String) -#}
```
こう書いた場合は

```hs
{-# ANN module ((fromString ("HLint: ignore Use camelCase" :: String)) :: String) -#}
```

たぶんこんな感じに展開されるのですが、冗長でも無事に型が特定できてコンパイルできるようになります。
Rubyでオブジェクトの配列を特定の属性の配列に変換する

# Rubyでオブジェクトの配列を特定の属性の配列に変換する
主にC＃をやっている私はC#とRubyで若干感覚が違いました。

結論から言うと`map`を使います。
C#の感覚だと`select`を使いそうなのですが、`select`だとうまくいきません。

- [map](https://docs.ruby-lang.org/ja/latest/method/Enumerable/i/map.html)
- [select](https://docs.ruby-lang.org/ja/latest/method/Enumerable/i/select.html)

```rb:sample.rb
class Person
  attr_accessor :name, :sex

  def initialize(name, sex)
    @name = name
    @sex = sex
  end
end

people = [Person.new("John", "M"), Person.new("Kid", "F")]

p people
# => [#<Person:0x007f8cf58aacd0 @name="John", @sex="M">, #<Person:0x007f8cf58aac58 @name="Kid", @sex="F">]

p people.map { |person| person.name }
# => ["John", "Kid"]

p people.map { |person| person.sex }
# => ["M", "F"]

p people.select { |person| person.sex }
# peopleがそのまま返されてしまう（Rubyのselectはブロックの戻り値が真になる要素を集めて返すメソッド）
# => [#<Person:0x007f8cf58aacd0 @name="John", @sex="M">, #<Person:0x007f8cf58aac58 @name="Kid", @sex="F">]
```
pykintoneで2つのレコードの集計結果をメールで送信してみる

kintoneは簡単に集計することができますが、異なる2つのレコード値の加減を簡単に計算することができません。そこで、毎週記録している統計情報を元に、先週からの差分を知らせてくれるプログラムを作成してみました。

**その結果、良かったこと**

- 電卓を使わなくて良くなった
- Excelに毎週書き出して集計することがなくなった
- メールを見るだけで良くなった（定期実行すれば）

# やりたいこと
## 1. kintoneアプリにある値の差分を計算
![20170529-16-5_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/100494/3c04da33-7697-abf7-8a02-7d998dab04e2.png)


## 2. メール（定期）送信
![20170529-16-36_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/100494/30bcecea-56a5-9903-3cf8-66a203b2ef14.png)

※定期送信するにはcron設定へ

# 環境づくり
このプログラムはPythonで動きますので、次の準備をしましょう。

- OS: Ubuntu（Cloud9を使いました）
- Python 3.5.3
- pykintone https://github.com/icoxfog417/pykintone
- PyYAML
- **[kintone-indicator](https://github.com/ushiront/kintone-indicator)** のダウンロード
- kintone（便利な開発者ライセンスがあればベスト）

## kintoneアプリの設定値

| FieldCode       | FieldType       | DefaltValue          |
|:----------------|:----------------|---------------------:|
| Date            | Date            |                Today |
| Member          | Number          |                    0 |
| PV              | Number          |                    0 |
| UU              | Number          |                    0 |

# 解説

**[kintone-indicator](https://github.com/ushiront/kintone-indicator)** を参照

## [account.yaml](https://github.com/ushiront/kintone-indicator/blob/master/README.md#accountyaml)

```yaml
domain: {サブドメイン名}
apps:
    send:
        id: {アプリID}
        token: {アプリのAPIトークン}
```

## [settings.yaml](https://github.com/ushiront/kintone-indicator/blob/master/README.md#settingsyaml)

```yaml
mail:
    smtp: {SMTPサーバー}
    port: {ポート番号}
    to: {送信先のEmailアドレス}
    from: {送信元のEmailアドレス}
    password: {送信元のEmailパスワード ※不要な場合には空白}
```


# シェルスクリプトの実行と結果例

```bash:
$ sudo sh indicator/run.sh 
Between 2017-06-05 and 2017-05-29
Members: 7,000 (+2,150)
PV: 6,000
UU: 400

Send to mail >>xxx@*****.***
```

指定のメールアドレスに送信されました♪
メール以外にもSlackなどのIMに通知されるとさらに便利になると思います。
rails-ujsとjquery-ujsで2回リクエストが送られる

## はじめに

Railsチュートリアルの拡張機能でいいね機能を実装した時に、Ajaxの処理のところで詰まったので記事にしました。
問題があったソースコードは[こちら](https://github.com/hisas/sample_app2/blob/4b7d6659a733a417938e9fbc2ab987377f33f2d5/app/assets/javascripts/application.js#L14-L15)です。
いいね機能自体の実装が知りたい方はこちらの[PR](https://github.com/hisas/sample_app2/pull/57)を参考にしてください

## 環境
- Ruby 2.4.1
- Rails 5.1.1

## 発生した問題
いいねボタンを押した時にいいねのカウントが2個増えたり、処理が固まったりする現象が発生しました。
処理が固まった時のエラーはこんな感じで出ていました。

```
ActiveRecord::StatementInvalid (SQLite3::BusyException: database is locked: commit transaction):
ActiveRecord::StatementInvalid (SQLite3::BusyException: database is locked: INSERT INTO "likes" ("user_id", "micropost_id", "created_at", "updated_at") VALUES (?, ?, ?, ?)):
```


![スクリーンショット 2017-05-29 17.32.49.png](https://qiita-image-store.s3.amazonaws.com/0/111631/c70cbe35-078f-057a-aebe-d732267fe1e2.png)


![スクリーンショット 2017-05-29 17.33.49.png](https://qiita-image-store.s3.amazonaws.com/0/111631/c5b05fb5-fb2d-3885-51df-ff68711143bf.png)



## 解決方法
application.jsのjquery_ujsを外す。

```diff
 //= require jquery
-//= require jquery_ujs
 //= require rails-ujs
 //= require bootstrap
 //= require turbolinks
```

添付したエラーを見てみると、jqueryとrails-ujsの両方が呼ばれていることが分かります。
Rails5.1系からjQuery依存が無くなっているため、jquery_ujsの方を外しても良いでしょう。([参考](https://github.com/rails/rails/issues/25208))
BioContainers のコンテナがどのように作られるか。メモ

# 追記 2020-12-05

公式のドキュメントPDF

[BioContainers Documentation](https://readthedocs.org/projects/biocontainers-edu/downloads/pdf/latest/)

上記ドキュメントより引用

> BioContainers build the docker containers from two different sources the Dockerfile or Conda recipes . The BioContainers team first try to create a Conda recipe (if it is possible). If not possible, then a Dockerfile is created. The system
automatically builds the container after the pull request is merged into Conda github or BioContainer github
repos.

# 追記 2019-08-22

Bioconda にあるが、 Biocontainers にコンテナがないときは、以下を参照

- [Biocontainersにない、Biocondaのツールを入れたコンテナを作る - Qiita](https://qiita.com/manabuishiirb/items/d30b92339c653083ac0d) 

# 概要

BiocCntainers のコンテナがどのように作られるかのメモ
いつも忘れてしまうのと、新しくなるときがあるので、備忘録をまとめる

# 結論

Bioconda 側でつくっているようだ

# 調べたこと

BioContainers のドキュメントのページの

このあたりとか読むとよいかもしれない

http://biocontainers.pro/docs/developer-manual/developer-intro/

## BioContainers の spec

[BioContainers/specs: BioContainers specifications](https://github.com/BioContainers/specs)

## BioContainers のタグ

* 再現性の観点から、`latest`タグは、ないとのこと

## Bioconda の FAQ

* [FAQs — Bioconda documentation](https://bioconda.github.io/faqs.html)

## ビルドシステムについて

2016年10月ごろからこのような形のようだ

* [the new bioconda build system · Issue #2695 · bioconda/bioconda-recipes](https://github.com/bioconda/bioconda-recipes/issues/2695)

### ローカルでテストする方法について

以下の `simulate-travis.py` というのを使うとできるようだ

* [bioconda-recipes/simulate-travis.py at master · bioconda/bioconda-recipes](https://github.com/bioconda/bioconda-recipes/blob/master/simulate-travis.py)

# gitter でみかけたこと。

* BioContainers は、再現性の観点から、docker(コンテナ)イメージに `latest` タグはない

# 追記 2019-06-19

推測では
- OpenWRT からつくられていて
- ビルドされたバイナリを、ADDで、いれているようなかんじ？
- Dockerfileはみあたらない

どのようにできているかは詳しく調べる必要がある

# TODO

あとで、もう少し書きたい
ansible httpd.conf(jinja2テンプレート)のLogformat部分でエラーが発生


## 問題
ansibleでjinja2テンプレートを使用して、
apacheのhttpd.confを配置しようとしたところ下記エラーが発生しました。

```
FAILED! => {"changed": false, "failed": true, "msg": "AnsibleError: template error while templating string: Encountered unknown tag 'Y'.. 

...以下省略

```

## 原因
httpd.confの設定は、問題なさそうだし、何だろうと、ググってみると、
下記参考サイトにたどり着きました。
http://tadasy.hateblo.jp/entry/2017/01/16/120025

apacheのLogformatがjinja2のテンプレートとして、
認識されてしまったため、エラーになっていました。


## 解決策
Logformatの前後に、{% raw %}、{% endraw %}を入れることで解決しました。

```httpd.conf.j2
{% raw %}
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
{% endraw %}
```


## 参考サイト
http://tadasy.hateblo.jp/entry/2017/01/16/120025
amazon linuxにcakephp3をインストールしてみる

## 前提
・yumでphp関連のモジュールはインストール済み。
・cakephp3は、php-intlがないと動かないので、これもyumでいれておく必要があります。
　(以前、ハマりました...詳細は下記参考のリンク2を参照してください。)


## インストール	
```
EC2インスタンスにsshログイン

コンポーザーをインストール
curl -s https://getcomposer.org/installer | php

テストプロジェクト作成
php composer.phar create-project --prefer-dist cakephp/app bookmarker

bookmarkerをDocumentRoot配下に移動
mv bookmarker ドキュメントルート
```

## 確認
設定してあるドメイン/bookmarker/index.php
にブラウザでアクセスすると、デフォルト画面が表示されました！

## 参考
1. https://book.cakephp.org/3.0/ja/quickstart.html
2. http://momoiro-tj.hateblo.jp/entry/2016/01/15/200512
EC2にansibleのcronモジュールを使ってcronを設定する方法


## ansible cronモジュール　
```main.yml
---
- cron:
    name: "cronモジュールテスト"
    minute: "*"
    hour: "*"
    day: "*"
    month: "*" 
    weekday: "*"
    job: "ls -alh > /dev/null"
    state: present

```


## 実行結果(crontab -l)
```
#Ansible: cronモジュールテスト
* * * * * ls -alh > /dev/null
```

デフォルトでは、rootユーザーでcrontabが設定される仕様なので、
動作確認する際は、rootユーザーで確認する必要があります。

なお、実行ユーザーを指定したい場合は、オプションで「user」を指定する必要があります。

下記の公式ドキュメントに、詳しく書いてあります。

## 公式ドキュメント
- http://docs.ansible.com/ansible/cron_module.html
IBM Cloud Object Storage - S3 APIの使い方のメモ

# IBM Cloud Object Storage - S3 APIの使い方のメモ

BluemixのS3 APIのObjectStorageでファイルを外部に公開したい時にどうやったらいいかのメモ書きです。
基本的にAWSのS3と一緒です。そちらを使われている方ならなんの違和感もなく使えると思います。
取り急ぎ手順について簡単に纏めます。
セキュリティ面は考慮していないので、誰でもアクセスできる状態になりますのでご注意ください。

S3コマンドはすでに使える様になっていることが前提です。
基本的な操作はS3と同じです。


# ファイルを外部に公開する

S3コマンドでファイルを共有します。

```
s3cmd setacl --acl-public s3:{バケット名}/{オブジェクト名}
```

公開されるURL
```
http://{エンドポイント}/{バケット}/{オブジェクト名}
```


Show Credentialsで表示されるPUBLICのURLならなんでもつながります。
５箇所ぐらいあると思いますが、好きなところを使ってもらって構いません。

# その他のS3コマンドのまとめ

### バケット参照
```
# s3cmd ls
```
### バケット内参照
```
# s3cmd ls s3://バケット名
```
### ディレクトリ内参照
```
# s3cmd ls s3://バケット名/ディレクトリ名/
``` 
### バケット作成
```
# s3cmd mb s3://バケット名
```
###オブジェクトアップロード
```
# s3cmd put オブジェクト名 s3://バケット名
```
###オブジェクトアップロード （ACL公開）
```
# s3cmd --acl-public put オブジェクト名 s3://バケット名
##オブジェクトをアップロードしてhttpで公開設定します。
```
###オブジェクト上書き
```
# s3cmd put オブジェクト名A s3://バケット名/オブジェクト名A
```
###ディレクトリアップロード
```
# s3cmd put -r ディレクトリ名 s3://バケット名
      空のディレクトリは送信できません
```
### ディレクトリ名を変更して アップロード
```
# s3cmd put -r ディレクトリA/ s3://バケット名/ディレクトリB/
      空のディレクトリは送信できません。
      ディレクトリAとディレクトリBの後の/は必須です。
```
###オブジェクトダウンロード
```
# s3cmd get s3://バケット名/オブジェクト名
```
###バケット削除
```
# s3cmd rb s3://バケット名
      バケット内が空でないと消せません
```
###コピー
```
# s3cmd cp s3://バケットA/オブジェクトA s3://バケットB/(オブジェクトB)
      別バケットにオブジェクトをコピー（例）
```
###移動
```
# s3cmd mv s3://バケットA/オブジェクトA s3://バケットB/(オブジェクトB)
　   別バケットにオブジェクトを移動
```
###ディレクトリ削除
```
# s3cmd del -r s3://バケット名/ディレクトリ名/
```
###オブジェクト削除
```
# s3cmd del s3://バケット名/オブジェクト名
```
###パーミッション変更 （publicへ）
```
# s3cmd setacl --acl-public s3://バケット名/ディレクトリ名/オブジェクト名
      httpで公開されます
```
###パーミッション変更 （privateへ）
```
# s3cmd setacl --acl-private s3://バケット名/ディレクトリ名/オブジェクト名
      httpで非公開となります
```
###オブジェクト情報表示オブジェクト情報表示
```
# s3cmd info s3://バケット名/オブジェクト名
```
###容量計算
```
# s3cmd du
      単位：byte ※パケット指定も可能
```
###helpコマンド
```
# s3cmd -h
```
Herokuのタイムゾーンを日本に合わせる


## 準備
heroku cliをインストール

```
$ brew install heroku
```

herokuログイン

```
$ heroku login
```

## タイムゾーン変更
アプリを指定してbashを起動する

```bash
heroku apps
# アプリ一覧を確認して

heroku run bash --app アプリ名
Running bash on ⬢ yaimafuni-backend... up, run.3480 (Free)
~ $ #←bashに入れた
```

## 現在の時間を確認

```bash
~ $ date
Mon May 29 12:50:21 UTC 2017
```
UTCになっているので、JSTに設定したい。
一旦、control + dでheroku bashを抜ける。

## JSTに変更

```bash
heroku config:add TZ=Asia/Tokyo --app アプリ名
Setting TZ and restarting ⬢ アプリ名... done, v18
TZ: Asia/Tokyo
```
↑変更された

## 確認

```bash
$ date
2017年 5月29日 月曜日 21時58分08秒 JST
```
JSTと表示されたらOK
馬鹿の一つ覚え: openSUSE

#### openSUSEのバージョン確認
```
$ cat /etc/os-release
NAME="openSUSE Leap"
VERSION="42.2"
ID=opensuse
ID_LIKE="suse"
VERSION_ID="42.2"
PRETTY_NAME="openSUSE Leap 42.2"
ANSI_COLOR="0;32"
CPE_NAME="cpe:/o:opensuse:leap:42.2"
BUG_REPORT_URL="https://bugs.opensuse.org"
HOME_URL="https://www.opensuse.org/"
```

#### zypperを用いてソフトウェアのアップデートやインストール
```
$ sudo zypper up -y    # ソフトウェアのアップデート
$ sudo zypper ps -s    # アップグレードにより削除されたファイルを噛んでいるプロセスを確認
$ zypper search rsh    # rsh関連のパッケージを検索
$ sudo zypper install -y rsh rsh-server    # パッケージのインストール
```

#### sudoの実行時にrootではなくユーザのパスワードが要求されるように変更
```
$ sudo visudo    # %wheel ALL=(ALL) ALL を有効にする    # rootのパスワードが要求されるが、これを共有したくない
$ sudo /usr/sbin/usermod -G wheel glire    # グループwheelにsudoを許可するユーザglireを追加
$ grep wheel /etc/group    # 追加されたことを確認
$ sudo visudo    # Defaults targetpw および ALL ALL=(ALL) ALL を無効に
$ sudo date    # 自分のパスワードが要求される
```
rippleのdestination tagとは？


# destination tagとは

振込人を特定するためのID

リップルはアドレスを無限に発行できない仕組みになっているのでビジネスアカウントの場合、一つだけアドレスを取得し、destination tagを利用してユーザーを識別する仕組みを推奨している

そうでない場合はユーザーごとに新規にアドレス発行し、20xrpをユーザーに負担させる必要がある。

# タグつけ忘れ防止機能

リップルには入金トランザクションにdestination_tagがついていない場合に受け取りを拒否する機能がある

具体的にはaccount_setトランザクションでアカウントにlsfRequireDestTagフラグを付与すればよい

https://ripple.com/build/transactions/#accountset
https://ripple.com/build/transactions/#accountset-flags
https://ripple.com/build/ledger-format/#ledger-node-types

エラーとなったトランザクションのステータスに tecDST_TAG_NEEDED が入る。


# その他参考資料

https://forum.ripple.com/viewtopic.php?f=2&t=3663

# サンプルコード

```
　　const instructions = {
   maxLedgerVersionOffset: 5,
   fee: "0.1",
 };
 const settings = {
   requireDestinationTag : true,
 };
 api.prepareSettings(wallet_address, settings, instructions)
```
【Python】pycryptoで投げるたけでAES暗号化復号してくれる関数作った。

<h3>できること</h3>
・平文・パスワード・ベクトルを引数に入れて実行するとbase64形式で暗号化されたデータを返す。
・同様に平文をbase64形式で暗号化されたデータに差し替えて実行すると平文を返す。


<h3>AES暗号化の条件</h3>
鍵は16バイト,24バイト,32バイトのうちのいずれかの長さにしなければならない。
平文は16バイトの倍数の長さにしなければならない。
ivを使用して、推測されにくくする。
ivに関しては一つのアプリケーションに対して同一のものを使うのが適切かと思います。

コピペして使っても大丈夫だとは思うが、AESの理解が完全ではないため正しいコードかは保証できない。
脆弱性があるならコメントでご指摘をお願いします。


インストールは

```cmd
$ pip install pycrypto

```

<h2>暗号化</h2>
```get_encrypt_data.py

from Crypto.Cipher import AES
import hashlib
import base64

def get_encrypt_data(raw_data, key, iv):
    raw_data_base64 = base64.b64encode(raw_data)
    # 16byte
    if len(raw_data_base64) % 16 != 0:
        raw_data_base64_16byte = raw_data_base64
        for i in range(16 - (len(raw_data_base64) % 16)):
            raw_data_base64_16byte += "_"
    else:
        raw_data_base64_16byte = raw_data_base64
    secret_key = hashlib.sha256(key).digest()
    iv = hashlib.md5(iv).digest()
    crypto = AES.new(secret_key, AES.MODE_CBC, iv)
    cipher_data = crypto.encrypt(raw_data_base64_16byte)
    cipher_data_base64 = base64.b64encode(cipher_data)
    return cipher_data_base64
```
引数に平文データ。鍵。ベクトル。
まず最初にbase64に変える(2バイト文字でも画像でもokにするため)
次に暗号化文は16ビットの倍数にしなければならないため、
基本的にbase64で使用しない"_"をケツに補完して16ビットの倍数に直す。
16バイトの倍数ならそのまま
鍵をsha256で32ビット長に変える。
ベクトルをMD5で16ビット長に変える。
暗号化して、送信しやすいようにbase64に変換してし返す。
<h2>復号</h2>

```get_decrypt_data.py

from Crypto.Cipher import AES
import hashlib
import base64

def get_decrypt_data(cipher_data_base64, key, iv):
    cipher_data = base64.b64decode(cipher_data_base64)
    secret_key = hashlib.sha256(key).digest()
    iv = hashlib.md5(iv).digest()
    crypto = AES.new(secret_key, AES.MODE_CBC, iv)
    raw_data_base64_16byte = crypto.decrypt(cipher_data)
    raw_data_base64 = raw_data_base64_16byte.split("_")[0]
    raw_data = base64.b64decode(raw_data_base64)
    return raw_data
```

引数にbase64に変換された暗号データ。鍵。ベクトル。
まず最初にbase64に変換された暗号データを暗号データに直す。
次に鍵をsha256で32ビットに変える。
復号して、split("_")[0]で有効なbase64だけを取り出して変換後リターンで返す。

<h2>実行結果</h2>

```main.py
if __name__ == "__main__":
    message = "114514"
    password = "This is password"
    iv = "hoge"
    encrypt_data = get_encrypt_data(message, password, iv)
    print encrypt_data
    decrypt_data = get_decrypt_data(encrypt_data, password, iv)
    print decrypt_data
```

```cmd.sh
$ r64FMFs04APfNQo2d6uFpQ==
$ 114514
```
Bluemix Iaasで使えるObjectStorageのまとめ


# Bluemix Iaasで使えるObjectStorageのまとめ
Bluemix Iaasでは２種類のObjectStorageが利用できます。
それぞれについて簡単にまとめました。
用途に合わせて使い分ければ便利に使えると思います。
2017/05/29現在の状況なので、料金はプランは変更になっているかもしれませんので、ご自分で確認してください。

## Cloud Object Storage - Standard Regional Swift API
- OpenStack SwiftのObjectStorageです。
- 大きな特徴はCDNを使ってデータを配信できるところです。

### 料金体系
![スクリーンショット 2017-05-29 16.36.17.png](https://qiita-image-store.s3.amazonaws.com/0/57909/d3d3e8d0-e710-16b1-8fb7-3ff05c0c8c5b.png)

## Cloud Object Storage - S3 API
- CreverSafeのObjectStorageです。
- AWSのS3と互換で利用できます。
- 操作もS3cmdなどで操作できます。


| 種類     |   内容    |
|:-----------------|:------------------|
| Standard         |保存したデータを頻繁に取り出したりするときに利用。保存料は若干高いが、データを取り出す時は安い|
| Vault           |保存したデータをたまに取り出す場合。Standardほど保存したデータを再利用しない場合に利用するといい|
| Cold Vault       |データ退避用に利用する場合。保存料は安いが、データを取り出す時に割高     |
| Flex            | Standard と Vaultの間ぐらい   |

Standard以外はデータを取り出す時に別途費用がかかるので、注意が必要です。
Cold Vaultでは、保存の料金より、データを取り出す時のほうが高くなるので気をつけてくださいね。

### 料金体系
![スクリーンショット 2017-05-29 16.35.57.png](https://qiita-image-store.s3.amazonaws.com/0/57909/ea9ed636-dbf6-e8d4-d5d9-a53c012c1394.png)
SassとCss

今回は、Sassを学んだので、その内容をCssと比較したいと思います。

Sassでは、CSSと比べてHTMLに映し出すための記述を簡単にすることが出来ます。

#メリット１
記入を簡略化できる

入れ子構造にすることによって、既存のCssのようにクラスを形で記入をしなくてもいいです。
親子関係にあるセレクタを入れ子にして書くことができます。
CSSでは、親の要素から対象要素までのセレクタを何度も書く必要がありますが、Sassはネストさせることで、同じ親のセレクタをまとめることができます。

#メリット２　　　プログラムのような処理ができる

Sassでは、今までのCssにはない「変数」という概念を用いることで柔軟なコードを書くことができます

#メリット３
複数のCSSファイルを1つにまとめることができる
　
Sassでは複数のファイルを、まとめることができ、ファイルごとに整理することもできます！

#メリット４
Sassでは変数を使うことによって、同じ値を使い回すことができます。

以上に挙げられる４つのメリットから、Sassを活用することは非常に便利で、かつ利便性が高いため、利用したほうがいいと思いました。
Pythonのpopとappendではまった話

for文を回してFIFOみたいな配列を使いたい事がある。
Pythonにはキューっていう物が存在しているみたいだが、仕事柄、JavascriptとかMATLABとかObjective-CとかJavaとかを同時に扱っているので、どうしても同じ様なコードで書きたくなってしまう。

今回Pythonで見事にはまった。popとappendは悪くないと思うけど、たぶん同じようにpopとappendを使って実装してしまう人がいるかもしれないので、メモ。

今回やりたかったのは、[1,2,3,4,5,6,7,8,9,10]のように並んでいる配列から、1文字ずつずらした配列を取得して、以下のような行列を作る事。

<img width="511" alt="無題2.png" src="https://qiita-image-store.s3.amazonaws.com/0/175647/dfa8a5bb-3eea-1f08-b6d2-061154acd674.png">

そこで、今回Pythonで書いてしまい、見事にはまったコードがこれ。
（このコードだと簡略されており、このように書かなくても問題ないが、元コードはこう書く必要があった）

```
data_array=[1,2,3,4,5,6,7,8,9,10]

A=[]
R=[]

for i in range(10):
    if(len(A)<5):
        A.append(data_array[i])
    else:
        R.append(A)
        A.pop(0)
        A.append(data_array[i])
```

最初５文字は普通にappendして、それ以降はpopとappendで、FIFOみたいな配列を作って、追加してやればいいやーな発想。

しかし、結果は無残にも以下。

<img width="511" alt="無題.png" src="https://qiita-image-store.s3.amazonaws.com/0/175647/926cc664-7743-6289-301d-ed713adfcdba.png">

ん！？ちゃんと、popしているよね？　appendしているよね？？　何々！？
って感じでテンパってしまったのだけど、まぁPythonで一番気を付けるべき、初歩的な間違いをやってしまってました。配列のメモリに気を付けないといけないんです。

詳細はこちらの方が詳しく紹介してくれています。
http://qiita.com/utgwkk/items/5ad2527f19150ae33322

んで、正しいコードはこちら。`copy.deepcopy`で他のメモリに移さないといけないっぽい。

```
import copy

data_array=[1,2,3,4,5,6,7,8,9,10]

A=[]
R=[]

for i in range(10):
    if(len(A)<5):
        A.append(data_array[i])
    else:
        temp_data = copy.deepcopy(A)
        R.append(temp_data)
        A.pop(0)
        A.append(data_array[i])
```
Spark: サイズが小さいDataFrameを書き出す際の注意点

##### sparkでparquetファイル書き出しする際にハマった
```lang:scala
dataframe.write.mode(SaveMode.Overwrite).parquet(s"s3://$bucket/hogehoge")
```
上記のように書くと，一部のdataframeで正常終了しない(*_temporary*は作られるけども)

下記のようにパーティション数を少なくするとうまくいった

```lang:scala
dataframe.coalesce(1).write.mode(SaveMode.Overwrite).parquet(s"s3://$bucket/hogehoge")
```
どうやらdataframeのサイズがパーティション数に対して小さすぎる場合，空のパーティションができてしまうことが原因っぽい?
MySQL5.7.18のログローテートの設定

## やること 
   
CentOS7の上のMySQL5.7.18のログローテートの設定をします


## 以下のファイルがコメントアウトされているので、コメントをはずします

```
/etc/logrotate.d/mysql

/var/log/mysqld.log {
        create 640 mysql mysql
        dateext　（追加）
        notifempty
        daily
        rotate 7
        missingok
        compress
    postrotate
       # just if mysqld is really running
       if test -x /usr/bin/mysqladmin && \
          /usr/bin/mysqladmin ping &>/dev/null
       then
          /usr/bin/mysqladmin flush-logs
       fi
    endscript
}
```

## ユーザーとパスワードの設定をします。セキュリティ的にはrootユーザーではやらない方が良いです。

```
mysql_config_editor set --login-path=client --user=root --host=localhost --password
```

~/.mylogin.cnfに暗号化されたパスワードが設定されます。これでOK

## テストだけする場合

```
# logrotate -dv /etc/logrotate.d/mysql
```

## 実際にローテートしてみる

```
# logrotate -v /etc/logrotate.d/mysql
reading config file /etc/logrotate.d/mysql
Allocating hash table for state file, size 15360 B

Handling 1 logs

rotating pattern: /var/log/mysqld.log  after 1 days (7 rotations)
empty log files are not rotated, old logs are removed
considering log /var/log/mysqld.log
  log needs rotating
rotating log /var/log/mysqld.log, log->rotateCount is 7
dateext suffix '-20170529'
glob pattern '-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
glob finding old rotated logs failed
renaming /var/log/mysqld.log to /var/log/mysqld.log-20170529
creating new /var/log/mysqld.log mode = 0640 uid = 27 gid = 27
running postrotate script
compressing log with: /bin/gzip

```

## できました

```
-rw-r-----   1 mysql  mysql        0  5月 29 16:44 mysqld.log
-rw-r-----   1 mysql  mysql   159660  5月 29 16:12 mysqld.log-20170529.gz
```


## ローテートしない場合はこのあたりの日付をバックデートして実行してみましょう

```
vi /var/lib/logrotate.status

logrotate state -- version 2
"/var/log/mysqld.log" 2017-5-29-16:44:32
"/var/log/nginx/access.log" 2017-5-14-8:50:42
```
Cloud9を授業で使うときの注意

# Cloud9
- Rails Tutorialでおすすめされているクラウド開発環境(https://c9.io/)
- Educationプランで、Teamをつくれる（100円/月）
- Educationプランなら、クレジットカード登録なしでアカウント作成できる
- ユーザ数は無制限/Team

# Catch 1
1分間に 15 Workspaces/Teamしか作れない

# Catch 2
1時間に 45 Workspaces/Teamしか作れない
Apache Benchでhttps(SSL)を使う方法

##SSL not compiled in; no https support

`ab`コマンドはhttpsのサイトだとエラーとなる...

```
ab -n 100 -c 100 https://www.example.co.jp/
SSL not compiled in; no https support
```

##absコマンドを使う
SSLに対応した`abs`コマンドがリリースされている。
使い方は`ab`コマンドと同じで、`s`を付けるだけ。
参考：[Apache Benchでサクッと性能テスト](http://qiita.com/flexfirm/items/ac5a2f53cfa933a37192)

```
abs -n 100 -c 100 https://www.example.co.jp/

This is ApacheBench, Version 2.3 <$Revision: 1757674 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking www.example.co.jp (be patient)


Server Software:        nginx
Server Hostname:        www.example.co.jp
Server Port:            443
SSL/TLS Protocol:       TLSv1.2,ECDHE-RSA-AES128-GCM-SHA256,2048,128
TLS Server Name:        www.example.co.jp
. . .
```
python3でAM復調

#概要
python3で、AM復調やってみた。
AM信号は、5000Hzの搬送波、wavファイル。
復調アルゴリズムは、IQ復調。

#AM信号
http://jsdo.it/ohisama1/C4km

#復調後の音声
http://jsdo.it/ohisama1/0Ss4

#サンプルコード

```
import numpy as np
import scipy.signal as sg
import wave
from scipy import fromstring, int16
from struct import pack

wavfile = "sHlM0.wav"
wr = wave.open(wavfile, "rb")
print (wr.getparams())
sample_rate = wr.getframerate()
para = wr.getparams()
wlen = wr.getnframes()
data = wr.readframes(wr.getnframes())
num_data = fromstring(data, dtype = int16)
left = num_data[::2]
right = num_data[1::2]
wr.close()
left = left
right = right
t = np.arange(wlen) / sample_rate
F_4KHz = 4000.
i1 = left * np.cos(t * 2 * np.pi * F_4KHz)
q1 = left * np.sin(t * 2 * np.pi * F_4KHz)
nyq_rate = sample_rate / 2.
cutoff_hz = 1000.0
lpf = sg.firwin(29, cutoff_hz / nyq_rate)
i2 = sg.lfilter(lpf, 1, i1)
q2 = sg.lfilter(lpf, 1, q1)
o = np.sqrt(i2 * i2 + q2 * q2) * 30
write_wave = wave.Wave_write("am7.wav")
write_wave.setparams(para)
for i in range(0, wlen):
	wvData = pack('h', int(o[i]))
	write_wave.writeframes(wvData)
	wvData = pack('h', int(o[i]))
	write_wave.writeframes(wvData)
write_wave.close()
print ("ok")

```
ABRTを起動していて遭遇したエラーを解消した小さな話　/usr/bin/abrt-watch-log -F BUG: WARNING: at WARNING


CentOS7での出来事
ps auxしたら、変なエラーメッセージが。。。


```
 /usr/bin/abrt-watch-log -F BUG: WARNING: at WARNING: CPU: INFO: possible recursive locking detected ernel BUG at list_del corruption list_add corruption do_IRQ: stack overflow: ear stack overflow (cur: eneral protection fault nable to handle kernel ouble fault: RTNL: assertion faile
```
  
  


---

abrt-watch-log　って。

[第22章 自動バグ報告ツール \(ABRT\)](https://access.redhat.com/documentation/ja-JP/Red_Hat_Enterprise_Linux/6/html/Deployment_Guide/ch-abrt.html)


[abrt\-dump\-oops ](https://lists.centos.org/pipermail/centos/2016-February/157821.html)

```
Please, do not be scared from that ugly command line. It is a perfectly 
valid command line where
abrt-watch-log process is searching for the strange strings in 
/var/log/messages and calling
/usr/bin/abrt-dump-oops if the tool finds a string present in the list 
of searched strings.
```
----

起動しているサービスを調べます。
いましたね。

```
 systemctl list-units |grep service
abrt-ccpp.service                                                                   loaded active exited    Install ABRT coredump hook
abrt-oops.service                                                                   loaded active running   ABRT kernel log watcher
abrtd.service                                                                       loaded active running   ABRT Automated Bug Reporting Tool
auditd.service                                                                      loaded active running   Security Auditing Service
chronyd.service                                                                     loaded active running   NTP client/server
crond.service                                                                       loaded active running   Command Scheduler

```

---

止めます。再起動しても起きてこないようにします。

```
sudo　systemctl stop abrtd.service

sudo systemctl disable  abrtd.service

```

もう一度、ps auxしたら、消えていました。
不要なサービスは止めて起きましょう。
raspberry pi で、MCP23017 の出力ポートを使う smbus版

```py3:mcp23017_smbus_out.py
#! /usr/bin/python3
# -*- coding: utf-8 -*-
#
#	mcp23017_smbus_out.py
#
#					May/29/2017
#
# ----------------------------------------------------------------
import sys
import smbus
import	time
#
# ----------------------------------------------------------------
sys.stderr.write("*** start ***\n")
CHANNEL   = 1
ICADDR    = 0x20
REG_IODIR = 0x00
REG_OLAT = 0x14
#
bus = smbus.SMBus(CHANNEL)
bus.write_byte_data(ICADDR, REG_IODIR, 0x00)
time.sleep (1)
#
for value in [0x10,0x20,0x40,0x80,0x40,0x20,0x10,0x00]:
	print(value)
	bus.write_byte_data(ICADDR, REG_OLAT,value)
	time.sleep (0.5)
#
sys.stderr.write("*** end ***\n")
# ----------------------------------------------------------------
Swift3で座標から角度を得る方法

画面をタップしたままドラッグすると現在自分がドラッグしてる座標の角度を割り出せるようにしてみます。時計をクルクル回したり、車のハンドルを回したり、金庫の鍵を回したりするのに使えそうです。


# xとyを保持しておくstructを定義する

```swift
struct Point {
        var x:Double = 0
        var y:Double = 0
    }
```

# 座標を引数に与えると角度を返してくれる関数

```swift
func angle(a:Point, b:Point) -> Double {
        var r = atan2(b.y - a.y, b.x - a.x)
        if r < 0 {
            r = r + 2 * M_PI
        }
        return floor(r * 360 / (2 * M_PI))
    }
```

# ドラッグ時に呼ばれるメソッド

```swift

    //　ドラッグ時に呼ばれる
    override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
        //タッチイベントを感知
        let touchEvent = touches.first!
        //ドラッグ前の座標
        let preDx = touchEvent.previousLocation(in: self.view).x
        let preDy = touchEvent.previousLocation(in: self.view).y
        //ドラッグ後の座標
        let newDx = touchEvent.location(in: self.view).x
        let newDy = touchEvent.location(in: self.view).y

        //ドラッグ後の座標からドラッグ前の座標を引けば現在の座標の位置が割り出せる
        let dx = newDx - preDx
        let dy = newDy - preDy
        
        //引数に現在の座標を入れてさっきの関数を呼ぶ
        print(angle(a: Point(x: 0, y: 0), b: Point(x: Double(dx), y: Double(dy))))
    }

```

# 全ソース

```swift
import UIKit

class ViewController: UIViewController {


    override func viewDidLoad() {
        super.viewDidLoad()
    
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    
    struct Point {
        var x:Double = 0
        var y:Double = 0
    }
    
    func angle(a:Point, b:Point) -> Double {
        var r = atan2(b.y - a.y, b.x - a.x)
        if r < 0 {
            r = r + 2 * M_PI
        }
        return floor(r * 360 / (2 * M_PI))
    }

    //　ドラッグ時に呼ばれる
    override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {

        let touchEvent = touches.first!
        let preDx = touchEvent.previousLocation(in: self.view).x
        let preDy = touchEvent.previousLocation(in: self.view).y

        let newDx = touchEvent.location(in: self.view).x
        let newDy = touchEvent.location(in: self.view).y
        
        let dx = newDx - preDx
        let dy = newDy - preDy

        print(angle(a: Point(x: 0, y: 0), b: Point(x: Double(dx), y: Double(dy))))

        
    }

}
```

# 参考

[2つの座標から角度や距離を求める](http://qiita.com/arthur87/items/23d3c896dafbc8223fd5)
[]()
formのsubmit時にdata-loading-textを適切に有効にする

# フォームの送信ボタンの二度押しを防ぎたい

## 必要なもの

* Bootstrap 3
* jQuery

## やっていること

* フォームの送信時にsubmitのボタンをdisableにしてローディング表示に変更し、二度押しを防ぐ
* HTML5のバリデーションにも対応する
* いちいちフォームにスクリプトを適用するのが面倒なので、submitボタンにクラス設定をするだけで使えるようにする（便利！

## ポイント

* input要素の checkValidity() を適切に処理しないと、requiredな要素などがあった場合に対処できない
    * input要素がエラーになっているのに、ボタンだけがローディング中になってしまう
* input[type="submit"] でも button でも対応可能
    * classに btn と loading-button の指定が必須
 
## コード

```javascript:app.js
$(function () {
    // submitボタンにloading-buttonクラスを設定した場合、
    // 親フォームが送信される際に data-loading-text の表示に変え、
    // ボタンの二通しを防ぐ
	$('.loading-button').on('click', function () {
        var form = $(this).parents('form:first');

        // フォーム内の各要素がvalidな時だけローディング表示にする
        var valid = true;
        $(form).find(':input').each(function() {
            valid &= this.checkValidity();
        })

        if (valid) {
            var $this = $(this);
            $this.button('loading');
        }
    });
});
```

```html:form.html
<script src="jquery.js"></script>
<script src="bootstrap.js"></script>
<script src="app.js"></script>

<link href="bootstrap.css" rel="stylesheet">

<form>
    <input type="text" required="required">

    <input type="submit" 
    class="btn loading-button"
    data-loading-text="<i class='fa fa-circle-o-notch fa-spin'></i> 登録しています"
    value="登録する">
</form>
```
raspberry pi で、IOエクスパンダ　MCP23017 の出力ポートを使う

```bash:mcp23017_out.sh
#! /bin/bash
#
#	mcp23017_out.sh
#
#					May/29/2017
#
# ------------------------------------------------------------------
echo "*** start ***"
i2cset -y 1 0x20 0x00 0x00
sleep	1
#
for data in 0x10 0x20 0x40 0x80 0x40 0x20 0x10 0x00
do
	echo $data
	i2cset -y 1 0x20 0x14 $data
	sleepenh 0.5 > /dev/null
done
sleep	1
#
echo "*** end ***"
#
# ------------------------------------------------------------------
```
時々
Error: Write failed
となるが、その時は、mcp23017 の　RESET （１８番ピン）を使う。