OmniAICreator/Qiita-1.07M huggingface dataset:
AWS CodeBuild で Rails アプリケーションの docker build

業務で、Rails アプリケーションの `docker build` を [AWS CodeBuild](https://aws.amazon.com/jp/codebuild/) で行なっており、`assets:precompile` 時に assets を [Amazon S3](https://aws.amazon.com/jp/s3/) にアップロードしています。
その際に、AWS CodeBuild サービスロールで全てを行うために設定したことをまとめます。

## 結論
- Asset Sync では、 `aws_iam_roles: Yes` で設定する。
- `docker build` 時に AWS CodeBuild のコンテナの環境設定変数  `AWS_CONTAINER_CREDENTIALS_RELATIVE_URI` を参照する。

## 前提
- Rails アプリケーションを Docker で運用している。
- `assets:precompile` 時に [Asset Sync](https://github.com/AssetSync/asset_sync) を利用して assets を Amazon S3 にアップロードしている。
- `docker build` は、AWS CodeBuild で実行している。

## 詳細
### Asset Sync の設定
Asset Sync では、 [README](https://github.com/AssetSync/asset_sync#amazon-aws-iam-users) に書かれているように、 IAM ロール を利用すればアクセスキーを設定する必要はありません。
具体的には、[こちら](https://github.com/AssetSync/asset_sync/blob/v2.3.0/lib/asset_sync/config.rb#L197-L200)で [fog-aws](https://github.com/fog/fog-aws) に設定が引き渡されています。

```ruby:config.rb#L197-L200
if aws_iam?
    options.merge!({
        :use_iam_profile => true
    })
```

### docker build 時の環境設定変数
上記の設定により、fog-aws では、 [こちら](https://github.com/fog/fog-aws/blob/v2.0.0/lib/fog/aws/credential_fetcher.rb#L16-L51) にて認証情報を取得しています。

```ruby:credential_fetcher.rb#L16
if options[:use_iam_profile]
```

さらにコードを読むと以下のような条件が存在します。

```ruby:credential_fetcher.rb#L21
if ENV["AWS_CONTAINER_CREDENTIALS_RELATIVE_URI"]
```

AWS のコンテナ (CodeBuild) では、インスタンスのメタデータ取得先が [Amazon EC2](https://aws.amazon.com/jp/ec2/) とは異なります。そのため、上記の環境設定変数の参照が必要となっています。

`docker build` で変数を利用したい場合は、 `ARG` を利用します。こちらの値を `assets:precompile` の際に参照させるようにしてください。

```Dockerfile
ARG AWS_CONTAINER_CREDENTIALS_RELATIVE_URI
```

最終的に、 AWS CodeBuild で利用する buildspec.yml の `docker build` の部分は、以下のようになります。

```yml:buildspec.yml
build:
    commands:
      - |
        docker build -t app \
        --build-arg AWS_CONTAINER_CREDENTIALS_RELATIVE_URI=${AWS_CONTAINER_CREDENTIALS_RELATIVE_URI} \
        .
```

## 参考
- [IAM Roleの仕組みを追う – なぜアクセスキーを明記する必要がないのか](https://dev.classmethod.jp/cloud/aws/iam-role-accesskey/)
- [Use appropriate ECS credentials on CodeBuild maven job](https://stackoverflow.com/questions/42794486/use-appropriate-ecs-credentials-on-codebuild-maven-job/47028691#47028691)
OpenCVで主人公レンズ

## 主人公レンズとは
@itopoid さんが作ったノベルゲーム風フレームのグッズ。透明なプラスチック製？でゲームのセリフ画面をリアルに持ってこれる。

![DPOdG2KUEAAiCCO.jpg](https://qiita-image-store.s3.amazonaws.com/0/103496/3363f754-483f-3cf3-89fa-ae6012d27b6c.jpeg)
https://twitter.com/itopoid/status/933262577651433478

Web版を作ろうと思ったら[もうあった](https://syujinko-lens.com)。でもめげずにOpenCVで実装してみる。

## 素材集め
フリー素材サイトから集める。

枠は[空想曲線](http://kopacurve.blog33.fc2.com/)より、サンプル背景は[freephotos.cc](https://freephotos.cc)より取得。

枠:
![message_box.png](https://qiita-image-store.s3.amazonaws.com/0/103496/01daa146-ac4c-4952-cde9-69bae844059e.png)

背景:
![hallway.jpg](https://qiita-image-store.s3.amazonaws.com/0/103496/6dd85804-3b53-cfd1-b2aa-2abc6919eb27.jpeg)

## テキストから画像を生成
OpenCVでやろうと思ったが日本語テキストは単体だと無理っぽい。しかたがないのでPillowを使う。

```python3:main.py
from PIL import Image
from PIL import ImageDraw
from PIL import ImageFont

def draw_text(img, text, color):
  draw = ImageDraw.Draw(img)
  draw.font = ImageFont.truetype("/Library/Fonts/ヒラギノ丸ゴ ProN W4.ttc", 20)

  position = np.array([0, 0])
  draw.text(position, text, color)

img = Image.new("RGBA", (750, 80))
text = "いったいアイツはどこにいったんだ。まだOpenCVのビルドの途中だってのに、、、"
draw_text(img, text, (38, 57, 54))
img.save('output/text.png')

img = Image.new("RGBA", (250, 30))
text = "CTO"
draw_text(img, text, (255, 255, 255))
img.save('output/speaker.png')
```
## OpenCVで画像合成
alphaチャンネル付きで読み込んで合成する。imreadに-1のオプションをつけると計4チャンネルで読み込まれる

```python3:main.py
def merge_images(background, foreground_with_alpha, o_h, o_w):
    alpha = foreground_with_alpha[:,:,3]
    alpha = cv2.cvtColor(alpha, cv2.COLOR_GRAY2BGR) # 1 -> 3
    alpha = alpha / 255.0

    foreground = foreground_with_alpha[:,:,:3]

    f_h, f_w, _ = foreground.shape
    b_h, _, _ = background.shape
    background[b_h-f_h-o_h:b_h-o_h, o_w:f_w+o_w] = (background[b_h-f_h-o_h:b_h-o_h, o_w:f_w+o_w] * (1.0 - alpha)).astype('uint8')
    background[b_h-f_h-o_h:b_h-o_h, o_w:f_w+o_w] = (background[b_h-f_h-o_h:b_h-o_h, o_w:f_w+o_w] + (foreground * alpha)).astype('uint8')

    return background

 # -1 to read alpha channel
# foreground: (210, 960, 4)
message_box_with_alpha =cv2.imread('samples/message_box.png', -1)
# background: (640, 960, 3)
hallway = cv2.imread('samples/hallway.jpg')
result = merge_images(hallway, message_box_with_alpha, 0, 0)

# text (80, 750, 3)
text_with_alpha = cv2.imread('output/text.png', -1)
result = merge_images(result, text_with_alpha, 40, 105)

# speaker (30, 250, 3)
speaker_with_alpha = cv2.imread('output/speaker.png', -1)
result = merge_images(result, speaker_with_alpha, 145, 50)

cv2.imwrite("output/result.png", result)
```

## 結果
![result.png](https://qiita-image-store.s3.amazonaws.com/0/103496/fc9fdbb5-c4d8-aab5-5885-16ad22947859.png)


[ソースコード](https://github.com/hiromichinomata/serifu-lens) 

## 参考
* [python/OpenCVで透過pngをオーバレイする](https://blanktar.jp/blog/2015/02/python-opencv-overlay.html)
* [Python Image Library (PIL)で文字を書く](http://d.hatena.ne.jp/bettamodoki/20130417/1366178461)
gulpでCSSの差分ビルド


gulpを使ったCSSの差分ビルドについて記事にしてみたいと思います。
使用するgulpのプラグインは以下の2つです。

* [gulp-chached](https://github.com/contra/gulp-cached)
* [gulp-progeny](https://github.com/HerringtonDarkholme/gulp-progeny)

単純にキャッシュしただけだと変更が反映されないのですが、
gulp-progenyを使うと依存関係を解決して差分ビルドが可能になります。

nodeのパッケージに[progeny](https://github.com/es128/progeny)というものがあり、
gulp-progenyはprogenyを使って依存関係を解決しているようです。
progenyのソースコードを見てみると、初期設定ではPug(Jade), Slim, LESS, Sass(*.sass, *.scss), Stylus, CSSをサポートしています。(PostCSSでも問題なく使えます。)
https://github.com/es128/progeny/blob/master/index.js#L9-L52

## サンプルコード
公式のREADMEに乗っているものそのままですが、
以下のように記述してもらうと差分ビルドが可能になります。
試す場合は、各自の環境に置き換えてみてください。

```javascript
var cache = require('gulp-cached');
var progeny = require('gulp-progeny');
var stylus = require('gulp-stylus');

gulp.task('style', function(){
  return gulp.src('*.styl')
    .pipe(cache('style'))
    .pipe(progeny())
    .pipe(stylus())
});

gulp.task('watch', function(){
  gulp.watch('*.styl', ['style']);
});
```

自分が関わっているプロジェクトで導入していますが、
gulp#4.0とPostCSSの組み合わせでも問題ありません。

## 実際どのくらい早くなっているの？
導入しているプロジェクトでの計測結果です。
小規模なプロジェクトで、まだ基本構成+といった感じのCSSです。
色々なCSSで5回計測してみました。

|回数|実行時間|
|-----|-------|
|初回|613ms|
|1回目| 287ms|
|2回目| 369ms|
|3回目| 355ms|
|4回目| 290ms|
|5回目| 329ms|

導入しているプロジェクトの現状のCSSでは、初回の約半分ぐらいの時間でビルド出来るようになりました😀
プロジェクトが進み、CSSが増えてきた時にどうなるか分りませんが、しばらく様子を見てみようと思います。

## 関連リンク
http://log.playr.jp/2015/10/31/gulp-progeny.html
http://sssslide.com/speakerdeck.com/ktsn/watch-shi-falsebirudowomotutosu-kusitai

## 〆
CSSのビルドに時間がかかって遅いと感じたら、gulp-progenyを試してみては如何でしょうか？
間違っていたり、おかしい箇所があればコメントいただけると幸いです🙌
wercker導入手順①

werckerの導入手順をまとめました。
Werckerの基礎知識は[こちら](https://qiita.com/k_g/items/90cbbdccd57c35204702)
##werckerへの登録
・[werckerのHP](https://app.wercker.com/users/new)から新規登録を行う。
![登録画面.jpg](https://qiita-image-store.s3.amazonaws.com/0/222268/07e28c92-d0c9-9f94-e9a1-c00967bf671c.jpeg)

##アプリケーションの作成
・ログイン後、"Add Application"からアプリケーションを作成する。
（ここではgithubを選択します）
![作成画面.png](https://qiita-image-store.s3.amazonaws.com/0/222268/505bfd64-c64b-d6a0-b489-7d51130e7d52.png)

・githubのログイン画面が表示されるのでログイン。
![githubログイン.jpg](https://qiita-image-store.s3.amazonaws.com/0/222268/d40ebc05-f915-f891-d011-591daf5399e4.jpeg)

・werckerを導入するリポジトリを選択。
![リポジトリ.jpg](https://qiita-image-store.s3.amazonaws.com/0/222268/44c1ef33-65d1-3d0b-3ac1-aedcbeca76a8.jpeg)


・werckerがリポジトリからソースコードを取得するためのアクセス方法を設定
（ここではデフォルトのデプロイキー追加とします）
![アクセス方法.jpg](https://qiita-image-store.s3.amazonaws.com/0/222268/00a24117-16d4-8035-6676-9edc7c837966.jpeg)

・createを選択し、作成は完了。
![完了.jpg](https://qiita-image-store.s3.amazonaws.com/0/222268/bf05d401-dbc5-ca67-8fbb-e46f3f49b9c3.jpeg)

今回はWerckerの登録からアプリケーションの作成までをまとめました。
次回は作成したアプリケーションとgithubの紐づけを行います。
[wercker導入手順②](https://qiita.com/k_g/items/54f2bd2eb01fb0898440)
Docker in Dockerの良いところ、悪いところ

## Docker in Dockerの種類
Docker in Dockerには二種類あり、ホストのDocker daemonと共有し、自分自身と同じ階層にコンテナを増やしたりする方法と、dockerコンテナの中でdockerコンテナを起動する、dockerマトリョーシカがある。
↓の記事にうまくまとめられているのでここでは深く説明しません。
https://qiita.com/sugiyasu-qr/items/85a1bedb6458d4573407

この記事ではコンテナの中にコンテナを生成するDocker in Dockerについて記載します。

##  コンテナの中のコンテナ
VirtualBoxやVMwareなどの仮想化技術でも仮想化環境の中で仮想化することは出来るようです。「nested virtualization」と検索すると記事がいろいろ出てきます。例えば今あるVPSやクラウドなどで一人一人に与えられるリソースはたいていの場合は物理マシンではなく仮想マシンで与えられるためその中で個々人が仮想化を行おうとすると仮想化の中の仮想化を行なっているということになります。
使われ方としては与えられた仮想マシンの中で仮想化をするということで、継続的インテグレーションなどでも使われています。

同様に準仮想化と呼ばれるコンテナの中でコンテナを起動することもできます。今回はDockerでの話をします。

## メリット
### 階層型にリソースの制限ができる
例えば1台の物理サーバー上にWebサーバが3台、DBが2台あるとします。
このとき、DBに7割のCPUやディスクの読み書きのリソースを与え、3割をWebサーバにしたいとなったときに、Docker in Dockerの場合はDBが入っているコンテナとWebサーバが入っているコンテナを制限すればよいです。注意として、全てを並列で動かすときにもリソースの制限はできます。しかし、階層型の方がより直感的で人間にとってわかりやすいと思います（＝コンピュータにとって負荷が大きい）
### 別のコンテナへのアクセスを制限することが出来る
Docker Daemon共有化では、ホストマシンのDockerを使って横にコンテナを増やしたりすることで擬似的にDocker in Dockerを実現します。しかし、ホストマシンのDockerを操作できるということは、別に動かしているコンテナや自分自身を止めることもできるということになります。外部からのアクセスによってDocker in Dockerを動かす場合、動かし方によっては脆弱性となりえます。
一方、Dockerマトリョーシカにしてしまう場合は、子にしかアクセスできないため別のコンテナへのアクセスはできません

## デメリット
### 負荷が大きい
不可の原因は具体的にはわかっていませんが、僕の場合は一時期コンテナ作るのに10秒かかる状況がありました。その時に一番負荷がかかっていたのはディスクIOで、おそらく後述する差分ストレージによる問題と考えています。

### 動作が一部不安定
Docker in Dockerを進めたJérôme PetazzoniさんによるとAppArmerやSELinuxなどLinux Security Modules絡みでクラッシュすることがあるようです。
https://jpetazzo.github.io/2015/09/03/do-not-use-docker-in-docker-for-ci/

## Dockerのストレージドライバ
Dockerコンテナ内で使われるストレージはいろんなファイルシステムで実装されています。
<img width="713" alt="Screen Shot 2017-12-17 at 22.19.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/65198/3b92054d-9c8b-31a2-09e8-6177086bbb4d.png">
http://docs.docker.jp/engine/userguide/storagedriver/selectadriver.html

DockerはもともとAUFSで作られていましたが、ホストのファイルシステムが原因でRHEL/CentOS系では利用できませんでした。そのためDockerではDevicemapperというストレージドライバも使われるようになりました。そのため、現在のdockerでも使われるストレージドライバは決まっておらずOSやホストのファイルシステムによって決められています。
↑の図に書いてあるようにそれぞれストレージドライバによって適したものを選択する必要があります。

![column68_fig02.png](https://qiita-image-store.s3.amazonaws.com/0/65198/26a9e6b5-0fee-f3b9-22bf-94bb21897c9c.png)
それぞれのストレージドライバのコンテナの作成速度を比較した図があります。この中ではoverlayfsが一番早く動作していることがわかります

## 使われ方
Docker in DockerはやはりCI(継続的インテグレーション)での使われ方が多いようです。Dockerをプロダクト環境で使うということもありJenkinsなどをprivileged権限をつけて使われることが多いようです。そもそもDocker in DockerはDockerの開発のワークフロー改善のために作られていました。

## まとめ
今回Docker in Dockerの良いところ、悪いところを記述してみましたが、実際にはDocker in Dockerを動かして見て問題なく動くかどうかを調べると良いと思います。
latexmkで文字コードを自動推定する

# 概要

latexmk は大変便利で、typeset 処理を意識することなく実施してくれるので重宝しています。
latexmk を日本語環境で利用する場合は、[TeX WiKi の記述](https://texwiki.texjp.org/?Latexmk)にあるように、`~/.latexmkrc` を用意して、platex を使うよう指定し、かつ、文字コードに何を使うか、を指定する必要があります。

最近では、日本語を含む TeX ソースは Unicode で記述することが一般的だと思うのですが、人によっては Shift-JIS や EUC-JP で記述していることもまだかなりあります。そのため、これまでは `~/.latexmkrc` を切り替えることで対応[^dir]していたのですが、不便で仕方がないので、文字コードを自動推定するようにしてみました。

[^dir]: latexmk は、カレントディレクトリにある `latexmkrc` という名前のファイルを、`~/.latexmkrc` よりも優先して読み込みます。ですから、必要に応じて漢字コード指定を変更した `latexmkrc` をカレントディレクトリに配置すれば、漢字コードを切り替えることができます。

# 詳細

以下のように、コマンドライン引数で指定されたファイルを対象として文字コードを自動推定し、その推定結果を使って platex へのオプションを切り替えるコードを記入した `~/.latexmkrc` を配置しておきます。全体を `{}` で囲っているのは、`my` で宣言した変数が latexmk 本体に影響を与えないよう、スコープを限定するためです。

```perl:~/.latexmkrc
# -*- perl -*-
{
    use Encode::Guess;
    my $enc = undef;
    for my $argv ( @ARGV ){
        my $file;
        if( $argv =~ m/\.tex\Z/ and -f $argv ){
            $file = $argv;
        } elsif( -f $argv.".tex" ){
            $file = $argv.".tex";
        }
        if( $file ){
            if( open( my $fh, '<', $file ) ){
                my $guess = guess_encoding( join( '', <$fh> ), qw/ ascii euc-jp shiftjis 7bit-jis utf-8 / );
                $guess = $guess->name if ref $guess;
                if( $guess =~ m/euc/ ){
                    $enc = 'euc';
                } elsif( $guess =~ m/shiftjis/ ){
                    $enc = 'sjis';
                } elsif( $guess =~ m/jis/ ){
                    $enc = 'jis';
                } elsif( $guess =~ m/utf/ ){
                    $enc = 'utf';
                }
                last if $enc;
            }
        }
    }
    # For Japanese ASCII pLaTeX environment.
    if( $enc ){
        $latex  = sprintf( 'platex -kanji=%s -src-specials --shell-escape', $enc ); 
        $latex_silent = sprintf( 'platex -kanji=%s -interaction=batchmode -src-specials --shell-escape', $enc );
        $bibtex = sprintf( 'pbibtex -kanji=%s', $enc );
    } else {
        $latex  = 'platex -src-specials --shell-escape'; 
        $latex_silent = 'platex -interaction=batchmode -src-specials --shell-escape';
        $bibtex = 'pbibtex';
    }
    $makeindex = 'mendex';
    $dvips  = 'dvips';
    if( -f 'cid-x.map' ){
        $dvipdf = 'dvipdfmx -f cid-x.map -V 7 %O -o %D %S';
    } else {
        $dvipdf = 'dvipdfmx -V 7 %O -o %D %S';
    }
    # Generate PDF with $dvipdf, which is equivalent to -pdfdvi option.
    $pdf_mode = 3;
}
```

# 制限事項

 * コマンドライン引数の解析部は、厳密ではありません。本来なら、latexmk の動作を指定する何らかのオプションを、ファイル名を指定していると間違えて解釈し、そこから推定された文字コードを使ってしまう可能性があります。
 * コマンドライン引数で指定されたファイルを対象として文字コードの推定を行なっており、`\input` 等のコマンドで読み込まれているファイルは対象としていません。したがって、全体のファイルは ASCII のみで記述されており、`\input` で読み込んでいるファイル内で日本語を使っている、というような場合には正しく文字コードを推定できません。
PyCharm 2017.3で追加されたコンテキストメニューのRun File in Consoleが便利

開いているスクリプトを実行してそのままインタラクティブモードに移行したい場合、PyCharm 2017.2まではファイル全体を選択してコンテキストメニューの"Execute Line in Console"で実行していましたが、2017.3では下図のとおり"Run File in Console"というコマンドで同じことが出来るようになっています。ちょっとしたことですが一手間省けて使いやすくなりました。

<img width="199" alt="pycharm.png" src="https://qiita-image-store.s3.amazonaws.com/0/147872/e523b467-aa14-b181-ffcd-6f16696ba1c4.png">
他のユーザーとデータを共有してみよう

データを分析したらその結果を他の人と共有したい、できれば結果だけでなく、どういった分析をしたのかまで併せて共有できると便利ですね。

Galaxy にはもちろん、**ヒストリーの共有機能** があります。ヒストリーというのは、一つの分析の入力のデータから結果まで、右側のパネルに積み重なっていく一連のデータを含みます。

では、Galaxy 本家、https://usegalaxy.org/ で試してみましょう。

ヒストリーの共有機能を使うためには、まずユーザーでログインしておくことをお忘れなく。ログインしていれば、右上の歯車から**「共有またはパブリッシュ」**というメニューが選べるはずです。

![スクリーンショット 2017-12-17 22.18.33.jpg](https://qiita-image-store.s3.amazonaws.com/0/191970/62c1c131-ff2d-0c46-e5f1-0f23f7c66406.jpeg)

すると、現在右側のパネルに表示されているヒストリー（ここでは、My History 2017-12-12）の共有設定画面が出てきます。ここで、**「Share with a user」**をクリックします。

![スクリーンショット 2017-12-17 22.18.50.jpg](https://qiita-image-store.s3.amazonaws.com/0/191970/d42d0cde-2c55-e654-8917-ddaa1f8b726a.jpeg)

共有したいユーザーのメールアドレスを入れて Submit！

![スクリーンショット 2017-12-17 22.19.22.jpg](https://qiita-image-store.s3.amazonaws.com/0/191970/3a26ea0b-006f-6d2c-c31c-38ce518cfda3.jpeg)

ここからは別のユーザーの画面です。共有されたユーザーはどうやってこれを確認するかというと、右上の歯車から**「私と共有されているヒストリー」**をクリック。

![スクリーンショット 2017-12-17 22.20.19.jpg](https://qiita-image-store.s3.amazonaws.com/0/191970/c0df3076-6dd0-748a-53de-2127df95fecd.jpeg)

ちゃんと共有されていますね！これを**「Copy」**すると自分のヒストリーとして使うことができます。コピーなので共有元のヒストリーには影響を与えません。

![スクリーンショット 2017-12-17 22.21.15.jpg](https://qiita-image-store.s3.amazonaws.com/0/191970/4b438c8f-93ef-1d2e-3f11-9be843cd05a3.jpeg)

他にも、URL で共有する方法や、全ての Galaxy ユーザーに公開する方法もあるのですが、それらはまたおいおい :grinning:
BitVisorのacpi_dsdt.cに実装されている各種回避策

BitVisorのcore/acpi_dsdt.cに実装されている各種回避策について簡単に紹介します。

ACPI specについてはUEFIのサイトにあります。

Specifications | Unified Extensible Firmware Interface Forum
http://www.uefi.org/specifications

Preexisting ACPI Specifications | Unified Extensible Firmware Interface Forum
http://www.uefi.org/acpi/specs

# 旧対策

## DefDevice

DefDeviceのObjectListの部分にIf()やZeroOpが含まれるケースがよくあり、仕様に合致していないものとして特別にObjectList2を作って対処していました。ACPI spec 6.1 (Errata A) で、ObjectListではなくTermListになったことで、仕様に合致したものとなり、特別扱いは不要になりました。

この旧実装については、以下の記事のDSDT/SSDTの項目にも一部説明があります。

BitVisorとACPI - Qiita
https://qiita.com/hdk_2/items/941699d40d9a5905639b#dsdtssdt

# ACPI specの不思議

## NamedObj

ACPI spec 5.0から、AMLのNamedObjの定義がなぜかずいぶんと減り、明らかに必要なものが足りていない状態となっています。ACPI spec 6.2 (Errata A) においても同じですが、古いspecと見比べると、以下のものが**編集ミス**で脱落したとしか思えない状態なので、この部分は古いspecに合わせています。

* DefDevice
* DefEvent
* DefField
* DefIndexField
* DefMethod
* DefMutex

## Type6Opcode

ACPI spec 5.0で、UserTermObjの定義が消え、代わりにMethodInvocationに置き換えられたように見えますが、なぜか、Type6Opcodeには、未定義となったUserTermObjが残されています。ACPI spec 6.2 (Errata A) においても同じですが、おそらく、**目視による置換ミス**でMethodInvocationに置き換えられなかっただけだと思われるので、MethodInvocationとして入れています。

## ExtendedAccessField

ACPI spec 5.0で、ExtendedAccessFieldというのが追加されましたが、不思議なことに、その定義が参照するAccessLengthが未定義です。ACPI spec 6.2 (Errata A) においても同じですが、おそらく**単なる書き忘れ**で、雰囲気からしてByteDataで解釈できるだろうということで、ByteDataとしてあります。

## ConnectField

ACPI spec 5.0で、ConnectFieldというのが追加されましたが、不思議なことに、その定義が参照するBufferDataが未定義です。ACPI spec 6.2 (Errata A) においても同じですが、おそらく**単なる書き間違い**で、雰囲気からしてBufDataが正解だろうということで、BufDataとしてあります。

# 解釈ルーチンの都合によるもの

## MethodInvocation

ACPI spec 6.1 (Errata A) で、ObjectListが削除され、既存のTermListに置き換わりました。ObjectListには含まれなかったものがTermListには含まれていることにより、BitVisorのちゃちな解釈ルーチンでは問題が発生するようになってしまいました。

ObjectListは0個以上のObjectで、ObjectとはNameSpaceModifierObjまたはNamedObjで、これらはMethodInvocationを含みませんでした。しかし、TermListになったことで、0個以上のTermObjとなったため、Type1OpcodeとType2Opcodeが使えるようになり、Type2OpcodeとしてMethodInvocationが使えるようになりました。これによって、これまで特別扱いのZeroOpとして解釈されていた部分が、NullNameのMethodInvocationに引数がZeroOpとして解釈できるようになってしまいました。しかし、引数のZeroOpもまた、NullNameのMethodInvocationとして解釈できてしまうことから、ZeroOpが続く部分で解釈パターンが収束しなくなりました。

そもそも、NullNameのMethodInvocationなんてものがおかしな話なわけですが、AMLの仕様上は許されていそうですので、単純に切り捨てるわけにはいかないでしょう。そこで、特別扱いでNullNameのMethodInvocationの引数等にはNullNameのMethodInvocationが来ないという制限をかけてあります。この実現のために、NameStringからNullNameを除いたNameString2を定義し、NameString2の場合は通常通りの定義としています。そして、NullNameのためのMethodInvocation2を定義し、その中でMethodInvocationが来る場合は解釈しないようにしてあります。

# 機種依存問題

## AMLCode

AMLCodeというとものすごく根本的なところですが、ThinkPad L570というPCで、なぜか、AMLCodeのTermListにOneOpが含まれるというケースが見つかりました。謎のZeroOpが並ぶケースはいろいろありましたが、それらはなんでNoopOpを使わないのかという疑問は残るものの、単純に使わない領域をゼロクリアしちゃったんだなと思えば、擁護できる面はありました。OneOpというのはさらに謎です。回避策としてTermList2を用意し、謎のOneOpが来ても解釈エラーにならないようにしてあります。

# 一言

iaslコマンドはこのような謎のコードを読んでも全くエラーを出さないのも面白いところです。上述の編集ミスらしき内容を見ても、実はAMLの本当の仕様書はACPICAのソースコードで、ACPI specは誰も見ていないのかも知れませんね。
UE4でVR空間にカノジョを錬金 19日目

[UE4でVR空間にカノジョを錬金する Advent Calendar 2017](https://qiita.com/advent-calendar/2017/ue4vrgame-create) 19日目の記事です。

12/1～25日までに一人で、UE4を用いてサ○○レッスンとかVR○○ジョっぽいゲームを作って仮想彼女を生み出すことにチャレンジします。

昨日に引き続き呼吸のロジック実装になります。

#呼吸ロジック実装

まず初期化処理です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/104377/cc9bf3cd-82c6-e8aa-6a95-e4f98fe525a0.png)

Phaseに吸引状態を示すInhalingとStartTimeにGetAudioTIめSecondsをセットします。

つづいてBlueprint Update Animationの設定に入ります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/104377/9e8a930f-a18f-db2b-df38-0d4be6cfd4af.png)

全体としてはこんな感じです。

細かく分けていきます。まず最初でPhaseの値を見て処理をスイッチさせています。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/104377/8465770d-7ee9-c146-cb09-a6b1b5b4a607.png)

Inhaling:吸う処理
Exhaling:吐く処理
Rest:吸った後の待機処理
Exhal Rest:吐いた後の待機処理

になります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/104377/1a464c0e-6da9-f992-36b1-d82306ba11f6.png)

この二つが呼吸モーションを計算する関数になります。
こちらは長くなるので明日以降それぞれ説明します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/104377/5a6bc4ab-6215-5ced-2315-50916868fd6b.png)

待機処理の実装です。こちらはRestの値を見て、呼吸モーションを待機する処理です。
待機が終了したら吸う処理、吐く処理に移行するようにPhaseをセットしています。

これでイベントグラフの実装は完了です。

#次回以降
明日は吐く処理の関数を説明していきます。
とりあえずsystemd-nspawnを始めるには

[systemd-nspawn Advent Calendar 2017](https://qiita.com/advent-calendar/2017/systemd-nspawn) 14日目の記事です。

とりあえずsystemd-nspawnを始めたいという方が居たら以下のコマンドを打つだけでOKです

```bash
# インストール
apt install debootstrap systemd-container
# ファイル用意
debootstrap --arch amd64 xenial /var/lib/machines/ubuntu http://archive.ubuntu.com/ubuntu
# 中に入る(パスワードを設定する場合はここで)
systemd-nspawn -D /var/lib/machines/ubuntu
# 通常起動してみる(-bオプションを足すだけ) 終わらせるときはCtrl+] を3回連打
systemd-nspawn -b -D /var/lib/machines/ubuntu
```

とりあえずこれだけやって感触を確かめてみるのが良いと思います。
たった4コマンドです。


その他systemd-nspawnで役立ちそうなリンクまとめです

* [systemd-nspawnマニュアル](https://www.freedesktop.org/software/systemd/man/systemd-nspawn.html)
* [machinectlマニュアル](https://www.freedesktop.org/software/systemd/man/machinectl.html)
* [systemd-nspawnのユニットファイルサンプル](https://github.com/systemd/systemd/blob/master/units/systemd-nspawn%40.service.in)
* [archlinux wiki](https://wiki.archlinux.jp/index.php/Systemd-nspawn) (多分一番詳しい)
ReactNative のインストールとサンプル実行


React Native に興味があるので、触ってみようと思います。

----

取り急ぎ、公式の [Getting Started](http://facebook.github.io/react-native/docs/getting-started.html) の通りに実行してみます。

### インストール

```
$ sudo npm install -g create-react-native-app
```

### 新規プロジェクト作成

#### create-react-native-app コマンドでプロジェクト作成

```
$ mkdir ReactNative

$ create-react-native-app AwesomeProject

$ cd AwesomeProject

$ ls -1
App.js
App.test.js
README.md
app.json
node_modules
npm-debug.log
package.json
```

#### プロジェクト実行(?)(失敗)

```
$ npm start
```

何やらエラーが出ました。とりあえず https://git.io/v5vcn を見てみます。

```
20:49:59: Unable to start server
See https://git.io/v5vcn for more information, either install watchman or run the following snippet:
  sudo sysctl -w kern.maxfiles=5242880
  sudo sysctl -w kern.maxfilesperproc=524288
```

Environment のリストを確認したところ、yarn と watchman がインストールされていないようです。

```
$ yarn --version
-bash: yarn: command not found
```

```
$ watchman version
-bash: watchman: command not found
```

#### yarn インストール

```
$ brew install yarn
```

今度は何？

```
...

/usr/local/Homebrew/Library/Homebrew/brew.rb:12:in `<main>': Homebrew must be run under Ruby 2.3! You're running 2.0.0. (RuntimeError)
```

Ruby 2.3 が必要？ rbenv で 2.4.3 を入れて再度実行します。

```
$ ruby -v
ruby 2.4.3p205 (2017-12-14 revision 61247) [x86_64-darwin16]

$ brew install yarn

$ yarn --version
1.3.2
```

OK

#### watchman インストール

```
$ brew install watchman

$ watchman version
{
    "version": "4.9.0"
}
```

OK

#### プロジェクト再実行

```
$ npm start
```

<img width="1389" alt="スクリーンショット 2017-12-17 21.54.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/170980/8eadfc76-cdac-5e79-4e1b-4bf606bf13c4.png">

なるほど。これでサーバが動作してるのかな。

#### expo のインストール

iPhone に [expo アプリ](https://itunes.apple.com/us/app/expo-client/id982107779?mt=8) をインストール。

----
<img width="414" alt="IMG_4635.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/170980/c656d9af-03a2-b97d-6a4a-0738f5b2145d.png">
----

#### expo で QR 読み込み

----
<img width="414" alt="IMG_4636.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/170980/691f4d92-6588-1039-0446-23f00a9f4221.png">
----

あれ？同じネットワークなのだけど、繋がらない？ 後で別なネットワークでもう一度試して見ます。一旦終了。

まだよく分からない。もう少しドキュメントも読んでますか。

----
持っている技術書のレビュー(Rails,HTML,Arduino,IoTなど)

あんまり書いてる時間がなかったので前に書いておいた記事です。

あと、
12月16日の学生LTAdventcCalenderで投稿した記事も見てください。

[WebVRでWebサイトを三次元で表現してみる！](https://qiita.com/haruan2394/items/a2d54101377b96ba08f2)


# 技術書が大好きなので、技術書のレビューをします。
![4A67F490-9C22-4626-8882-550194342DD9.jpeg](https://qiita-image-store.s3.amazonaws.com/0/188304/ee78ec0a-9c9a-6072-41b7-ebc01d1a24b2.jpeg)


# なぜ技術書が好きか
#### インターネットの情報はごちゃごちゃしてて分かりにくいです。本の方が、情報が整理されている。
[Twitterで話題の画像でイメージ]
左がインターネットの情報で右が本の情報的な感じ。
![05E8A32F-C940-455B-9A8F-D021C46F162E.jpeg](https://qiita-image-store.s3.amazonaws.com/0/188304/cdce0fd5-ee96-4294-974f-187eb3280a93.jpeg)
[ツイート詳細](https://twitter.com/hinasdca/status/936975862292930561)

- 図が書いていてとても分かりやすい。
- モチベーションが上がる。
- レベルによって自分にあった本がある(ないこともある)


## 技術書展行った
![A1696249-372E-4451-98AD-BFBDFB258587.jpeg](https://qiita-image-store.s3.amazonaws.com/0/188304/8d96ccc2-ba76-f3a1-a97c-a3e4d64da00c.jpeg)

技術書が大好きなので、技術書展に行ってきました。技術書のコミケみたいな感じです。
安いし、興味深い内容なのでとても楽しかったです。

## Ruby on Rails 5 超入門
![Ruby on Rails 5 超入門](http://t3.gstatic.com/images?q=tbn:ANd9GcTEyUi2YIejygAu-WXfFPh3JpRRq3MGhzM8Oau5qEG3dSo28eF-)
私が初めて買った技術書です。Life is Techのキャンプで初めてプログラミングに触れ、Webアプリケーションをやり、面白いなと思ってRailsを勉強しようと思いました。中身はとても分かりやすく題名の通り**超入門者向け**ですね。

## Ruby on Rails 5 アプリケーション プログラミング
![Ruby on Rails 5 アプリケーション プログラミング](https://images-na.ssl-images-amazon.com/images/I/51vycwIasvL._SX392_BO1,204,203,200_.jpg)
Tech CampのイナズマコースのWebアプリケーションコースを受講し終わった後に買ってもらった本です。基礎から応用まで幅広く書かれていてとても良いです。詳しくメゾットの説明など書かれています。だいたいRailsの基礎が分かっている人にオススメですね。

## HTML5 + CSS3 の新しい教科書
![HTML5 + CSS3 の新しい教科書](http://t0.gstatic.com/images?q=tbn:ANd9GcQU9193DjEDGc2v222tQisZ-amN19CLMAD0fp73zmbdmNGqSo9e)
HTML/CSSの理解を深めるために買った本です。
HTML/CSSの基礎が分かりやすく説明されています。
でも、意外と内容が薄くてそこまで必要な本ではなかったです。

## Prototyping Lab
![Prototyping Lab](https://www.oreilly.co.jp/books/images/picture_large978-4-87311-789-8.jpeg)
Arduino Unoを買い、Arduinoをしっかり学ぼうと思って買った本です。
何かをセンサーで測定したいと思ったらだいたいこの本に書いてあるので便利ですね。
流行りのBLEやesp8266についても書いてあるので面白いですね。

## プログラミングコンテストチャレンジブック
![プログラミングコンテストチャレンジブック](http://t0.gstatic.com/images?q=tbn:ANd9GcRt4gDK5jz23_5XlzSRzVmnk-rlLnCpgRhEFVWUkNPsqaFXzcAE)
JOI(情報オリンピック)にチャレンジしたいと思って買った本です。
プログラミングコンテストの問題の解き方が丁寧に説明されています。
まだ最初の方しか読んでないので最後まで理解していないのですが、こまめに図でプログラムを説明しており、とても分かりやすいです。
これで来年は必ずJOIの本戦に行きたい！！

## 
技術書展で買った本はこんな感じ

![IMG_3639.JPG](https://qiita-image-store.s3.amazonaws.com/0/188304/4cdaad5f-44ee-d644-34c6-248107a260d8.jpeg)
Java スレッドについて

[サブスレッドのランタイム例外を親スレッドで検出する方法](https://codezine.jp/article/detail/85)


[スレッドプールを使用しトラフィックの大量発生による急激なサービス低下を防ぐ](https://www.jpcert.or.jp/java-rules/tps00-j.html)
UE4でVR空間にカノジョを錬金 18日目

[UE4でVR空間にカノジョを錬金する Advent Calendar 2017](https://qiita.com/advent-calendar/2017/ue4vrgame-create) 18日目の記事です。

12/1～25日までに一人で、UE4を用いてサ○○レッスンとかVR○○ジョっぽいゲームを作って仮想彼女を生み出すことにチャレンジします。

今回は呼吸しているように見えるようなアニメーションを実装していきます。
今回処理がかなり長いので、複数回に分けます。

#参考にしたサイト

[[Unity] キャラクターが呼吸するスクリプトが公開されています](http://pronama.azurewebsites.net/2015/09/01/unity-breathing-script/)で掲載されていたフルートさんの記事と公開されているスクリプト、[スクリプトで呼吸させる - 第2回 | Unity3D](http://mebiustos.hatenablog.com/entry/2015/08/31/201902)を参考にしています。
同じような感じで、特定のボーンを回転させて、呼吸をしているように実装していきます。

#変数設定

呼吸に必要な変数をセットします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/104377/7d5df7f9-7455-4aa8-5bf1-330ba0f81e99.png)

色々と変数を設定しているので簡単に説明していきます。

|変数名     | 説明 |    型   |    初期値    |
|:-----------------|:------------------|:------------------:|:------------------:|
|SpineRotator|腰の回転を示す変数|Rotator|0,0,0|
|ChestRotator|胸の回転を示す変数|Rotator|0,0,0|
|NeckRoator|首の回転を示す変数|Rotator|0,0,0|
|HeadRoator|頭の回転を示す変数|Rotator|0,0,0|
|durationRate|呼吸1サイクルに要する時間を調整|float|1|
|effectRate|呼吸の深さを調整|float|1|
|inhale|息を吸う時間|float|1.2|
|exhale|息を吐く時間|float|2.4|
|rest|呼吸モーションの待機時間|float|0.2|
|spineInhale|吸うときの腰の回転値|float|2|
|spineExhale|吐く時の腰の回転値|float|-2|
|chestInhale|吸うときの胸の回転値|float|-3|
|chestExhale|吐く時の胸の回転値|float|3|
|neckInhale|吸うときの首の回転値|float|0.5|
|neckExhale|吐く時の首の回転値|float|-0.5|
|headInhale|吸うときの頭の回転値|float|0.5|
|headExhale|吐く時の頭の回転値|float|-0.5|
|phase|呼吸のフェーズを示すenum（日本語だと列挙型）|Phase|Inhaling|
|StartTime|各呼吸のフェーズを開始した時間|float|0|

Phaseというenum型は自作です。中身は以下の通りです
![image.png](https://qiita-image-store.s3.amazonaws.com/0/104377/bbf87ff7-bd49-8c8f-dbc4-19c0927d370f.png)

#アニムグラフ実装

まずアニムグラフを実装していきます。
以下のようにボーンをトランスフォームで修正するノードで腰、胸、首、頭、左肩、右肩をセットします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/104377/cbc5829b-9bd8-483c-061e-679b6f976187.png)

各ノードの詳細にある全てのRoatationにあるRotationModeをAdd to Existingにします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/104377/1f923bf1-bd4f-ffaa-469e-63b4dc59ce3a.png)

後はすべてのボーンを設定するだけです。

##ボーン設定

腰、胸、首、頭のボーンをセットします。
これは各モデルによってボーン名が違うので、以下は参考例として出します。

・ユニティちゃんの場合
![image.png](https://qiita-image-store.s3.amazonaws.com/0/104377/be39b669-3c0b-7016-d46f-41794dd87b8f.png)

・グレイちゃんの場合
![image.png](https://qiita-image-store.s3.amazonaws.com/0/104377/156c9717-5f00-26a8-5c35-ccd558f6efbd.png)

上記画像の通り、Rotatonにそれぞれの回転量を示す変数をセットします。

続いて右肩、左肩のボーンをセットします。

・ユニティちゃんの場合
![image.png](https://qiita-image-store.s3.amazonaws.com/0/104377/c25af2b7-ea0f-9224-b9c7-0f62649bfe60.png)

・グレイちゃんの場合
![image.png](https://qiita-image-store.s3.amazonaws.com/0/104377/608dd5b8-3afd-59d8-1b83-9d590b3c044d.png)

RotatorにはChestRotatorに-1をかけて、値を反転させています。

呼吸のモーションが不自然であれば上腕のボーンをセットするのもいいかもしれません。
ユニティちゃん：Character1_LeftArm,Character2_RightArm
グレイちゃん：UpperArm_L,UpperArm_R

これでアニムグラフの設定が終わりました。
複数のアニムグラフがある場合、全てこの設定をする必要があるので、コピペで貼り付けましょう。

本日は以上となります。

#次回以降

呼吸のロジックを実装していきます。
人生いろいろ、ジャイロもいろいろ

ぬるぽだって色々　(ログに)咲き乱れるの
という訳でAdvent Calendarもなんだかんだで3回目、専門学校界の旅キチ(自称)です。

今回はUnityを利用してスマホアプリを制作する際に役に立つ、ジャイロセンサーについてお話ししたいと思います。
#そもそもジャイロセンサーとはなんぞや
ジャイロセンサーとは、一言で言うとスマホの傾き等の状態を検知するためのセンサーです。
これを利用することにより、スマホを傾けたり、降ったり、といった情報を取得することができます。

#ジャイロいろいろ
ジャイロとひとくちに言っても、一般的には3つの項目に分かれます。

* 現在どのような傾きになっているか
* XYZ軸でどれほどの力で回転しているか
* XYZ方向にどれほどの力が加わっているか

一つずつ説明していきましょう。

###現在どのような傾きになっているか
`Input.gyro.attitude`によって、`Quaternion`型で取得できます。

例えば、スマホを傾けた方向にボールを転がしたい、等といった場面で使用できます。

###XYZ軸でどれほどの力で回転しているか
`Input.gyro.rotationRateUnbiased`によって、`Vector3`型で取得できます。

例えば、スマホを現在の傾きより手前に傾けることで何か動作をしたい、という場面等で役立ちます。
最近のiPhoneに搭載されている、スリープ状態から手前に倒すと画面が点灯する、というのを想像してもらえると分かりやすいかと。

###XYZ方向にどれほどの力が加わっているか
`Input.acceleration`によって、`Vector3`型で取得できます。

例えば、スマホを振ることによって何か動作させたい、といった場面で役立つでしょう。


#実機確認の壁
さて、ここまで紹介したジャイロセンサーですが、利用にあたって一つ問題があります。
それは、**そもそも実機で確認するにはスマホからUnityに情報を渡せるようにしないといけない**、という点です。

Androidであれば誰でも自作したアプリを手持ちのデバイスにインストールできるのですが、iPhoneだとそうはいきません。(有料のデベロッパ登録が必要)
そもそもAndroidにしたってちょっとジャイロセンサーを確認するためにいちいちインストールするのはかなりの手間となるでしょう。
そこでUnityにはとても便利なツールが用意されています。

それがこちら、アプリのダウンロードも以下にリンクがあります。
[Unity Remote(公式マニュアル)](https://docs.unity3d.com/jp/540/Manual/UnityRemote5.html)

こちらのUnity Remoteのアプリをスマホにインストールすることで、実機ビルドすることなくジャイロセンサー情報をはじめとした様々な情報をUnityに送ることができるようになります。

こちらとても便利なのですが、動作としてはUnityエディタで実行している映像をスマホに転送する形になるので、実フレームレートはかなり低下するのでご注意を。(音楽ゲームなどリアルタイム性が要求されるものはきついかも？)

ジャイロセンサーもいろいろ、人生も~~台風で沖縄から帰れなくなったり~~いろいろ。
ぬるぽにはくれぐれもお気をつけて、快適な開発ライフを。
Windows共有フォルダからデータをコピー

目的
Windows共有フォルダからデータをコピーしたい。

準備
pip3からpysmbをインストールしておく


```Python3:windows_copy

from smb.SMBConnection import SMBConnection
import platform


connection = SMBConnection(
    "USERNAME",             # ログインユーザ
    "PASSWORD",             # ログインパスワード
    platform.uname().node,  # 自ノード名
    "REMOTE_NODE_NAME",     # リモート端末名
    domain = "DOMAIN_NAME", # リモート端末の所属するドメイン名
    use_ntlm_v2 = True      # NTNMv2認証を利用
    )

connection.connect("IPADDRESS", 139) # IPアドレスとsmbで使用するポートを指定

# マウントするボリュームと対象パスを指定
files = connection.listPath("Users", "everyone/Desktop") 

# testが入るファイル名を取得してみる。
for a in files:
    print(type(a)) # -> <class 'smb.base.SharedFile'>
    if "test" in a.filename:
        print(a.filename) # -> ex) test.txt

# セッション断
connection.close()

```

a.filenameでファイル名を取得したが、ファイルサイズ等他の属性は以下を参照
http://pysmb.readthedocs.io/en/latest/api/smb_SharedFile.html

```Python3:windows_copy

# testを含むファイルをコピー
for a in files:
    if "test" in a.filename:
        with open(a.filename, mode='wb') as file:
            connection.retrieveFile("Users", "everyone/Desktop/" + a.filename, file,)
        
connection.close()
```

備忘録代わりに。
大学生がRails Girlsにコーチとして参加して


#はじめに
第7回のRails Girlsにコーチとして参加した現大学四年生です。とても素敵なイベントなので、若年層にもこちらのイベントを紹介したく思い、今回Advent Calendarに参加させていただきました。

#Rails Girlsとは
世界各地で行なわれているイベントで、Scaffoldを使った簡単なサービス開発を初心者の方に体験していただくイベントです。東京では年に二回ほど開催されております。
http://railsgirls.com/tokyo.html

#参加者層
###ガールズ
社会人のお姉さまたち、主婦の方々がほとんど（たまに大学生）

###コーチ
社会人のエンジニアの方々

回にもよるそうなのですが、私が参加した七回は大学生は参加者とコーチを含めても私一人でした。

#コーチとして参加するのに必要な技術力
☆Railsの経験が一年以上
（Githubの公開リポジトリやコミットログをを見れば一目瞭然）
(なお過去参加者じゃない場合です。参加者の場合、経験が少なくてもコーチになりやすいかもです。)

私の回はほぼマンツーマン状態でガールズの方々に教えており、とても細かいところまでガールズの方に聞いていただいていたので上記の技術力は必須かと思いました。（なおコーチの場合は男性でもウェルカムかと）

私の場合は一年ほどRailsのエンジニアインターンをしていることや、普段中高生にプログラミングを教えていることが評価されコーチに参加させていただけたのだと思います。

#参加して良かったこと
1.すごいRailsエンジニアの方と会える
これが一番の強みだと思うのですが、参加者の皆様はRubyやRailsのコミュニティの中でも有名な方々が多かったです。(松田明さんをはじめとするRubyKaigiの登壇者等)
そのような方々とも大学生の身ながら、懇親会などでカジュアルにお話しさせていただきとてもいい経験になりました。

2.教えることで自分の実力も上がる
細かいところまでガールズからの質問をいただくので、よりわかりやすく伝えようとしたり、説明が不足していた部分を調べて補うことにより、自分の知識も整理されるかと思います。普段なかなか人に教える機会はないと思うのでいい機会かと思います。

3.グッズがかわいい
オリジナルステッカーやTシャツがとてもかわいかったです。大事に保存しております。
![IMG_5394.JPG](https://qiita-image-store.s3.amazonaws.com/0/140595/5415291c-29d0-8d73-80d2-322afc92782a.jpeg)


4.ごはんが素敵
会場がクックパッドさんだったこともあり、とてもおしゃれで美味しいごはんをいただくことができました。
![IMG_7971.JPG](https://qiita-image-store.s3.amazonaws.com/0/140595/fb6ec1d9-e934-691a-a625-07a1013641dc.jpeg)

5.スポンサー企業のステッカーやグッズがもらえる
GitHubのステッカーなどなどいろいろGetしました（ありがとうございます）

#LTをさせていただいた話
スポンサーやコーチからのLTの時間があるのですが、そこでLTをさせていただきました。その時のスライドがこちらです。

[一年で初心者からステップアップする方法](https://www.slideshare.net/ManamiMatsubara/ss-84297030)

コーチの中では一番若い身であり、むしろ技術力的にはガールズに一番近いであろうコーチだったので、緊張でgkbrだったのですが、むしろその状態の自分だからこそガールズに刺さるLTだったとして、たくさんのコーチの方々から賞賛していただくとともに、ガールズの方々が何人もスライドを写真で撮ってくださっていたり、共有して欲しいと頼まれたりととても好感触でした。

大学生の身だとなかなかこのような機会はないかと思うので、是非是非大学生コーチもLTをしてみることをお勧めします。

#おわりに
あたたかく活気のあるコミュニティでRails Girlsに参加できてよかったです。次回も予定が合えばまたぜひ参加したいです~!
【Python】BeautifulSoup4 と RequestsでWEBスクレイピング

#基本的な使い方
##コード
シンプルに http://google.com からタイトルを取得し表示します。

```python:sample.py
import requests
from bs4 import BeautifulSoup

URL = 'http://google.com'
headers = {"User-Agent": "hoge"}

resp = requests.get(URL, timeout=1, headers=headers)
r_text = resp.text

soup = BeautifulSoup(r_text, 'html.parser')
soup_titles = soup.find_all('title')

for t in soup_titles:
    print(t.get_text())
```
```bash:実行結果
Google
```

##説明
###1
```python3
import requests
from bs4 import BeautifulSoup
```
今回はrequestsを使いHttp経由でデータを取得し、BeautifulSoupでタグをパースするので上記２つをインポートします。入っていない場合は下記の様にpip installします。

```bash:
$ pip install requests
$ pip install beautifulsoup4
```

###2
```python3
URL = 'http://google.com'
headers = {"User-Agent": "hoge"}
resp = requests.get(URL, timeout=1, headers=headers)
r_text = resp.text
```
URLに取得元のURLを指定。
headersにリクエストヘッダを指定。
requests.getメソッドでデータを取得。

###3
```python3
soup = BeautifulSoup(r_text, 'html.parser')
```
取得したテキストを元にBeautifulsoupオブジェクトを取得

###4
```python3
soup_titles = soup.find_all('title')
```
titleタグのセットを取得

###5
```python3
for t in soup_titles:
    print(t.get_text())
```
セットからタグ要素を取得し、テキスト部分を表示
React プライバシーポリシー画面お手軽作成

TECH::CAMP Advent Calendar 2017　17日目です。

# はじめに
Reactで画面作成をしていて、長い文章などを画面に表示する事があるかと思います。例えば利用規約やプライバシーポリシーなど、どういう風にに書いて行こうかなと思った時に実践した方法を紹介したいと思います。

# 実装
実際にどのようにするかというと以下のようにしてみました。

```components/config/aseets.js
function assets() {
  return Object.assign(
    {},
    {
      policy: {
        privacy: [
          {
            title: '第1条（プライバシー情報）',
            body:
              'プライバシー情報のうち「個人情報」とは，
               個人情報保護法にいう「個人情報」を指すものとし，生存する個人に関する情報であって，当該情報
               に含まれる氏名，生年月日，
               住所，電話番号，連絡先その他の記述等により特定の個人を識別できる情報を指します。プライバ
               シー情報のうち「履歴情報および特性情報」とはxxxxxxxxxxx',
            key: 'privacyContents1',
          },
        ]
      }
    }
  );
}
export default assets();

```
configの中のassets.jsファイルの中で関数を作って、APIのような形で呼び出せるようにしました。

関数を呼び出した先の記述は下記のようにしました。

```js
class PrivacyComponent extends React.Component {

  mapPolicyRender() {
    return assets.policy.privacy.map(item => (
      <div key={item.key}>
        <div 
         className='item_title'
         {item.title}
        </div>
        <div>
         {item.body}
        </div>
      </div>
    ));
  }


  render() {
    return (
      <Grid 
        className='grid_policy_privacy'
      >
        <div
          className='privacy-container'
        >
          <div
            className='privacy'
          >
            <div>
              {this.mapPolicyRender()}
            </div>
          </div>
        </div>
      </Grid>
    );
  }
}


export default Privacy();
```

関数を呼び出して、mapで回せば一つ一つ表示できます。こうすることで、要素一つ一つにクラスをつけて、cssを書く必要もありませんし、非常にすっきりしたコードにする事が出来ます。

ただこれだと文字列を改行させたいとなった時に今の記述のままだと出来ないので、dangerouslySetInnerHTMLを書く必要があります。これも簡単に書くことが出来ます。

```js
class PrivacyComponent extends React.Component {

  mapPolicyRender() {
    return assets.policy.privacy.map(item => (
      <div key={item.key}>
        <div 
         className='item_title'
         {item.title}
        </div>
        <div>
         dangerouslySetInnerHTML={this.BeginOnNewLinePrivacyText(item.body)}
        </div>
      </div>
    ));
  }

  BeginOnNewLinePrivacyText(item) {
    return {__html: item};
  }

  render() {
    return (
      <Grid 
        className='grid_policy_privacy'
      >
        <div
          className='privacy-container'
        >
          <div
            className='privacy'
          >
            <div>
              {this.mapPolicyRender()}
            </div>
          </div>
        </div>
      </Grid>
    );
  }
}

export default Privacy();

```

新しく記述したのはこれだけです。

```js
<div>
 dangerouslySetInnerHTML={this.BeginOnNewLinePrivacyText(item.body)}
</div>
```

```js
BeginOnNewLinePrivacyText(item) {
  return {__html: item};
}
```

これで``</br>``をassets.jsのなかで使用することが出来ます。

## 最後に
とりあえず、これで文字は表示することが出来ましたが、画面左上に文字が出ているで、UIは綺麗ではありません。
ここからgridシステムなどを使えば簡単に中央によせたり、レスポンシブ対応ができるのでぜひやってみて下さい。
実行ファイルと同じディレクトリにあるファイルへアクセスする

# はじめに
実行ファイルと同じディレクトリにある設定ファイルなどへアクセスしたいことがあります。
そのようなときの良くある書き方というものをまとめていきたいと思います。

もっと効率の良い方法があるとか、他の言語などの情報を、お待ちしています。

# 環境
Windows 7以降を対象とします。

# C/C++
```C:getModulePath.c
#include <windows.h>
#include <string.h>

#define BUF_SIZE 1024

TCHAR name[BUF_SIZE];
TCHAR* lastdelim;
GetModuleFileName(NULL, name, BUF_SIZE);
lastdelim = _tcsrchr(name, '\\');
*lastdelim = '\0';
```
# C\# / .NET
```C#:getModulePath.cs
using System;
using System.Reflection;
using System.IO;

Assembly assem = Assembly.GetExecutingAssembly();
String path = Path.GetDirectoryName(assem.Location);
```
# python
```python:getModulePath.py
os.path.dirname(os.path.abspath(__file__))
```
【FileMaker】20件ごとにページに収めて集計結果を出したい

タイトルのようなことを相談され、「はぁ。。。」と返事をしたのですが、ようは、カテゴリごとに集計して印刷するのを応用できるかな、と実装した記録です。

# やりたいこと
20件（例として20件）を１ページに収め、ページの下にそのページの集計を出したい。
つまり、1ページ目の集計が以下のようになり、
<img width="600" alt="1217_1.png" src="https://qiita-image-store.s3.amazonaws.com/0/60538/13e851e3-a747-ebef-09bb-a4ef84b65185.png">

最終ページは最終ページでその件数分で集計を出したい。
<img width="590" alt="1217_2.png" src="https://qiita-image-store.s3.amazonaws.com/0/60538/024cbd56-daa1-a921-4f83-287a4398c165.png">


# 仕掛け
業務フィールドとは別に、印刷用のフィールドとして、印刷カテゴリを持ちます。
今回は20件なので、そのページに表示されているレコード番号-1を20件で割った結果に、1を足します。
<img width="763" alt="1217_3.png" src="https://qiita-image-store.s3.amazonaws.com/0/60538/a86cf5d5-a1b1-8096-0cae-46e57385988e.png">
1を足すのは、例えば1件めから20件めまでの場合、Div結果は0となるので、0ページめというのではなく、表示するのは1ページ目になる、という感じです。
レコード番号から1を引くのは、20件めの場合（つまりページの境目の番号）、1を引かずに計算すると2ページ目に配置されてしまうので、それを考慮しています。

そして、その集計結果を集計フィールドに持っています。
<img width="769" alt="1217_4.png" src="https://qiita-image-store.s3.amazonaws.com/0/60538/cacbcd66-ff31-0463-0810-1dcb02a31955.png">


印刷番号の結果は、こんな感じです。
<img width="380" alt="1217_5.png" src="https://qiita-image-store.s3.amazonaws.com/0/60538/4d9691af-7cc2-7d87-b4ac-4380bc077499.png">
ちゃんと20件目まで１ページ目ということになってますね。

注意することは、20件を１ページに収めたい、ということなので、ボディの高さを調整する必要があります。
ちょっとでも高かったり低かったりすると、20件が１ページに収まりません。。。
最終ページで20件にならない場合でもページの一番下に集計を出したい場合は、ダミーデータを用意するなどの調整が必要です（面倒ですが。。。）
レイアウトが決まっているお役所系の文書などでよくみる構造ですので、ちょっと覚えておくと便利だと思います。

では！
ユーザーストーリーマッピングをやってみた

勉強会に行った時にユーザーストーリーマッピングというものを教えてもらったので、実践してみました。

## ユーザーストーリーマッピングとは？

- プロダクトの全体像の見える化をする時に便利
- ユーザの行動や時間軸に対して、整理を行い、ストーリーを作る
- 大きい要求「ex: 街を作るゲームが欲しい」等については、ユーザーストーリーマッピングを使ってストーリーを作ると良い

参照 : [ユーザーストーリーマッピングをやってみました](https://developers.eure.jp/tech/user-story-mapping/)

## 全体の流れ
1. 課題を決める
2. ユーザーのタイプを決定する
3. ユーザーのアクションを書き出す
4. 改善ポイントや欲しい機能を書き出す
5. 整理
6. 最優先で作りたいものを決める
7. プロダクトバックログに組み込む

<img width="692" alt="スクリーンショット 2017-12-17 20.22.41.png" src="https://qiita-image-store.s3.amazonaws.com/0/60405/6e773297-6684-12f9-36dc-7b0ea97f4ce7.png">


### 1. 課題を決める
今回は対象の場面とユーザを絞ることで目的と課題をわかりやすくするため、「就活の合同説明会に参加した企業人事の課題」にフォーカスします。

### 2. ユーザーのタイプを決定する
より具体的にユーザーの課題や行動がイメージできるように、簡単なユーザーのペルソナを作ります。今回は2タイプのユーザーを作り、より我々が課題を解決したいユーザーはどちらか、チーム内で決定し、1つのユーザータイプに絞りました。決定したユーザータイプを緑の付箋に書き出し、ホワイトボードの左端に貼り付けます。

### 3. ユーザーの行動を書き出す
ここから本格的に付箋とホワイトボードを使います。
「参加予定の学生を確認する」「プレゼンで自社の説明をする」「自社ブースに来てくれた学生の確認をする」等、合同説明会前後のユーザーのアクションを青い付箋に書き出し、時系列に並べます。複数のアクションが出たら、共通の目的に向かって行われているアクションをグループにまとめ、共通の目的を黄色い付箋に書き出し、メインアクションとしてアクションのグループの上にまとめます。

この時点で、黄色い付箋からユーザーの大まかな行動の流れ、青い付箋からユーザーの詳細な行動の流れがわかるようになります。

### 4. 改善ポイントや、欲しい機能を書き出す
ユーザーのアクション、メインアクションを見ながら、改善ポイントや欲しい機能の案を赤い付箋に書き出していきます。ユーザーの行動をイメージしながら、「この行動をしている時はこんな機能が欲しい」、「ユーザーはこんなことを考えるはず」というものをブレスト式で話していきましょう。

たくさんの機能案が書き出されたら、類似している付箋をグループとしてまとめ、さらに掘り下げていきます。

### 5. 最優先で作りたいものを決める
全ての付箋の機能を実装しようとすると、時間がいくらあっても足りなくなってしまうため、ここから最も必要な機能を決定していきます。「最初のリリースで達成したいこと」をMVP(Minimum Viable Product)*としてチームで決定し、ホワイトボードの左側に書き込みます。MVPが決まったら、赤い付箋を貼り付けているスペースの真ん中を横切る線を引き、MVPに必要な機能の付箋を線より上に、不要な機能の付箋を線より下に振り分けていきます。

時間に余裕があれば「次のリリースで達成したいこと」を繰り返し決定していきましょう。

### 6. プロダクトバックログに組み込む
ここまでの手順で必要になった機能、リリースをユーザーストーリーとして改めて定義し、プロダクトバックログに組み込みます。受け入れ条件等の詳細に関しては、ユーザーストーリーマッピング後に必要に応じて詰めていきましょう。

## まとめ

今回のケースでは時間が限られていた関係上、対象ユーザーや場面をかなり絞り込んだ状態で実施しましたが、より広い視点でユーザーやプロダクトの課題を見つける方法には、絞り込みを緩くした状態からユーザーストーリーマッピングを行った方が良いと感じました。
みなさんの会社、現場の事例も共有してくれると嬉しいです。
機械学習3ヶ月の初心者がKaggleHousingPriceに挑戦した(Top29%)　後半(アルゴリズム)

[前回の記事](https://qiita.com/AykeJq0ILeYFOR4/items/20589df26b550aaa16b0)の続きです。
挑戦したKaggleチュートリアル:[KaggleHousingPrice](https://www.kaggle.com/c/house-prices-advanced-regression-techniques)

この記事はアルゴリズムについて書いています。
今回使用したアルゴリズムはXGboostです。
Xgboostの他にLightGBMもありますが、パラメータの調整がうまくできず、いいスコアが出せませんでした。
（どなたかLightGBMのハイパーパラメータの調整教えてください＞＜）

XGboostのハイパーパラメータの調整については[この記事](https://www.analyticsvidhya.com/blog/2016/03/complete-guide-parameter-tuning-xgboost-with-codes-python/)が参考になりました。
Xgboostはパラメータがたくさんあるので、重要なパラメータを調整するだけでも時間がかかります。そこでRandomizedSearchCVというグリッドサーチを採用しました。グリッドサーチは総当たりで、一番良いパラメータの組み合わせを算出しますが、ランダムサーチは文字通りランダムに各パラメータが選択され、CV*iterの回数だけ実行されます。

```python:HousingPrice.py
from scipy.stats import randint as sp_randint
from scipy.stats import uniform as sp_uniform
learning=[0.05,0.07,0.09,0.1,0.12,0.14,0.16,0.18,0.2]
r=[]
for i in range(6,10):
    r.append(i/10.0)
mod = xgb.XGBRegressor(reg_lambda=1,gamma=0.0)
params ={'learning_rate':sp_uniform(0.05,0.2),'n_estimators':list(range(10,150,10)),\
         'max_depth':list(range(3,11,1)),'min_child_weight':list(range(1,6,2))\
        ,'colsample_bytree':r,'subsample':r}
#繰り返し処理計算式＝cv * n_iter
import sklearn
gscv =RandomizedSearchCV(mod, params, verbose=1,
                   cv=3,n_iter=500, scoring='neg_mean_squared_error',n_jobs=1)
gscv.fit(X_train1, y_train1)
gscv.best_params_
```

実行結果
learning_rate=0.15124835871864328,max_depth=3,min_child_weight=3,n_estimators=120,colsample_bytree=0.8,subsample=0.6

このまま提出してもよいのですが、スコアを少しでも上げるために、バギングと呼ばれるアンサンブルを使います。
バギングとはトレーニングセット数がN個の場合、ランダムにN個復元抽出(重複あり)して、機械学習のモデルに食わることです。
これをだいたい10~100回くらい繰り返して、その平均値を算出します。
バギングの利点は手元のデータセットとは若干異なるデータセットが手に入るので、データセットのノイズが少し軽減されます。
自分は100回繰り返しました。

```python:HousingPrice.py
mod=xgb.XGBRegressor(reg_lambda=1,gamma=0.0,learning_rate= 0.15124835871864328,max_depth=3,min_child_weight=3,n_estimators=120,colsample_bytree=0.8,subsample=0.6)
y_pred_on_test=np.zeros(1459)
import random
for i in range(0,100):
    sampling=np.ones((1457,310))
    sampling_y=np.zeros(1457)
    for j in range(0,1457):
        element=np.random.randint(0,1457)
        sampling[[j]]=X[[element]]
        sampling_y[j]=y[element]
    mod.fit(sampling,sampling_y)
    y_prediction= mod.predict(test_df)
    y_pred_on_test+=y_prediction

y_pred_on_test=y_pred_on_test/100
output_df = pd.DataFrame(y_pred_on_test,columns=['SalePrice'])
output_df['Id']=ID
output_df=output_df.ix[:,['Id','SalePrice']]
output_df.to_csv('housing_ans.csv', index=False, encoding='utf-8')
```


この状態で提出し、スコアは0.12343でした。(2017/12/17の時点でTOP29％)
![提出.JPG](https://qiita-image-store.s3.amazonaws.com/0/224195/50383f35-6e5a-0828-5cc4-328f0465aac2.jpeg)

-----------------------------------------------

複数の違う分類器を使ってアンサンブルをすればもっとスコアを挙げれそうなのですが、LightGBMのパラメーターの調整がうまくいかないので現時点ではこれ以上スコアをあげれなさそうです。
redux-thunk や redux-saga がつらかった

ので [redux-capsule](https://github.com/x7c1/redux-capsule) を作りました

## これは何？

以下の動機で作られた [redux middleware](https://redux.js.org/docs/advanced/Middleware.html) です

* 関数ベースではなくクラスベースで dispatcher を設計したい
  * `redux-thunk` で `(dispatch, getState)` を引き回すのがつらい
  * そもそも関連のある処理は同じクラスにまとめたい
* 非同期処理のためだけに新しい仕組みを導入したくない
  * `redux-saga` って本当に必要なんだろうか（反語）

## サンプルコード

`dispatch` と `getState` をクラスの中で扱えるようになります

```js
import { ReduxCapsule } from 'redux-capsule';
import { increase } from './actions';

export class CounterButton extends ReduxCapsule {
  onClick = () => {
    this.dispatch(increase(1));
  };
  get label() {
    return `increment counter : ${this._currentCount}`;
  }
  get _currentCount() {
    // this.state は this.getState() と等価
    return this.state.sampleCounter.count;
  }
}
```

`react-redux` による利用例はこんな感じです

```js
import React from 'react';
import { connect } from 'react-redux';
import { CounterButton } from './CounterButton';

const SampleView = props => {
  const button = props.createCounterButton();
  return (
    <div>
      <button type='button' onClick={button.onClick}>
        {button.label}
      </button>
    </div>
  );
};
const mapStateToProps = state => state;

const mapDispatchToProps = {
  createCounterButton: () => CounterButton,
};
export default connect(mapStateToProps, mapDispatchToProps)(SampleView);
```

その他テストや非同期処理などの実装方法については通常のクラスと同様なので省略します

## 導入方法

```
npm install --save redux-capsule
```

あとはいつもどおりに [applyMiddleware](https://redux.js.org/docs/api/applyMiddleware.html) を呼びましょう

```js
import { createStore, applyMiddleware } from 'redux';
import { capsule } from 'redux-thunk';

const store = createStore(
  _ => _,// rootReducer
  applyMiddleware(capsule)
);
```

## 関連リンク

* [ReduxでのMiddleware不要論](https://qiita.com/uryyyyyyy/items/d8bae6a7fca1c4732696)
    * 動機は異なるものの発想はほぼ同じです
    * ただ、毎回 `dispatch => ... new ...(dispatch, someClient)` を<br />書くのも嫌だったので、結局今回のような middleware を作ることにしました
tomcatのSSL/TLS化

１．　キーストアファイル作成

```
keytool -genkey -alias tomcat -keyalg RSA -keystore /（keystoreの保存先）/.keystore
```

2. server.xml編集
server.xmlのConnectorを編集

```
    <Connector port="8443"
　　　　　　　　　　　　　　　　　　　　　　　　　　　　 protocol="org.apache.coyote.http11.Http11Protocol"
               maxThreads="150"
　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　SSLEnabled="true"
　　　　　　　　　　　　　　　　　　　　　　　　　　　　 scheme="https"
　　　　　　　　　　　　　　　　　　　　　　　　　　　　 secure="true"
               clientAuth="false"
　　　　　　　　　　　　　　　　　　　　　　　　　　　　 sslProtocol="TLS"
               keystoreFile="/（keystoreの保存先）/.keystore" #←追加
               keystorePass="（keystoreのパスワード）" #←追加
               URLEncoding="UTF-8" />
```

以上
UE4でVR空間にカノジョを錬金 17日目

[UE4でVR空間にカノジョを錬金する Advent Calendar 2017](https://qiita.com/advent-calendar/2017/ue4vrgame-create) 17日目の記事です。

12/1～25日までに一人で、UE4を用いてサ○○レッスンとかVR○○ジョっぽいゲームを作って仮想彼女を生み出すことにチャレンジします。

今回はまばたきの実装を行います

#まばたき

まばたきは目を閉じるモーフターゲットが3Dモデルにあれば実装可能です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/104377/5c862e34-6144-8b79-449e-c650f2e39e40.png)

全体処理はこのような感じです。

まず最初の処理、乱数を生成し、一定値以上であればまばたきの処理を行います。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/104377/3fef59ca-9ac5-6959-975c-b01b63511152.png)

乱数が一定値以下の場合はdelayで少し待ってから再度チェックを行います。

続いてまばたきの処理です。アニメーションブループリントからSetMorphTargetを呼び出し、まばたきのアニメーションに必要なモーフターゲット名を入れます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/104377/69deb8c2-f418-4d15-2a89-cd054e5d4000.png)

値はタイムラインを作成して取得しています。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/104377/3ecf350b-41d3-8b5a-2660-46eedb9ac172.png)

これで瞬きが出来ました。簡単ですね。
瞬きをしたくないアニメーションの場合は、何かフラグを持たせて処理を切らせるように実装するのがいいかもしれません。
第一原理計算ソフトウェア'PHASE/0'をCentOS７にインストール

##0.はじめに
論文で引用されがちな第一原理計算パッケージは外国のモノ(ABINIT,Quantum ESPRESSO,...)等が多いですが、ここでは日本製の第一原理計算パッケージ"PHASE/0"について紹介します。


##1.PHASE/0 2017のダウンロード

プログラムは以下の公式ホームページからダウンロード可能。
https://azuma.nims.go.jp
「プログラムダウンロード」に行きユーザー登録を済ませたら、2018年現在の最新版である
PHASE/0 2017.01フルパッケージ版をダウンロードする。ホームディレクトリにでも置きましょう。
ターミナルで以下のコマンドを叩き、ダウンロードしたphase0_2017.01.tar.gzを解凍する。

```
$ cd ~
$ tar -zxvf phase0_2017.01.tar.gz
```

なおWindows版もリリースされているが、シリアル版となっていて要は「お試し版」的な感じらしい。これを機にぜひLinuxライフをおくりましょう。

##2.動作環境の構築
###2.1.関連パッケージのインストール
環境はCentOS 7(64bit)を想定。まずはソフトをいっぱいインストールします。

```
$ sudo yum -y install gcc gcc-gfortran
$ sudo yum -y install lapack lapack-devel
$ sudo yum -y install fftw fftw-devel
$ sudo yum -y install openmpi openmpi-devel
```
###2.2.Makefileの作成

src_phaseディレクトリに移動し、コンパイルの準備を行います。

```
$ cd ~/phase0_2017.01/src_phase
$ sh configure
```

するといろいろ選ぶように言われるので、
GNU Linux (EM64T/AMD64), GNU compiler collection (gfortran), MPI parallel, Netlib BLAS/LAPACK, FFTW3 library を選んでMakefileを作成しましょう。

###2.3.Makefileの編集
よくわからないですが、そのままmakeをたたくとうまくいかないらしいのでMakefileを編集します。

```
$ vi Makefile
```
`INCLUDE` `LIBS` `LAPACK`の行を見つけられるはずです。それを

```
INCLUDE=-I/usr/include

(略)

LIBS = -L./ ${LESM}  -L/usr/lib64 -llapack -lblas -lfftw3

(略)

LAPACK =
```
のようにします。
###2.4.環境変数の設定

2.1.でインストールしたopenMPIの実行コマンド`mpiexec`を叩けるように環境変数にパスを追加します。

```
$ vi ~/.bashrc
```
このファイルの最終行に


```
export PATH=$PATH:usr/lib64/openmpi/bin
```
を追加します。
さらに、共有ライブラリに以下を追加します。共有ライブラリの追加は/etc/ld.so.confに書き込みます。

```
$ vi /etc/ld.so.conf
```
と叩き、

```
/usr/lib64:/usr/lib64/openmpi/lib
```
を追記すればオッケーです。


###2.5.PHASE/0のインストール
``` 
$ make 
```
文字が大量に流れてきます。ところどころ怪しそうなのが出ますがなんとか大丈夫。

```
$ make install
```
実行ファイル(phase,ekcal,etc...)が`phase0_2017.01/bin`直下に移動します。おわり。




##3.phaseおよびekcalの実行
**phase実行コマンド**
`$ mpiexec -np NP ~/phase0_2016.01/bin/phase ne=NE nk=NK`

**ekcal実行コマンド**
`$ mpiexec -np NP ~/phase0_2016.01/bin/ekcal ne=NE nk=NK`