OmniAICreator/Qiita-1.07M huggingface dataset:
手順メモ(ニックネームAPI/Ruby on Rails)

# 開発環境

## Cloud9
- 下記の環境で開発
 - Workspace作成時のtemplateはBlankを選択
 - Rails5.1.4(APIモード)
 - PostgreSQL

- APIモードの採用
 -  下記コマンドでRailsプロジェクトを新規作成すると、APIに不要なviewファイルなどが自動生成されないようになる（Rails5.0以降で利用可能）

```
$ rails new nickname_api_v1 --api
```

# その他準備

## githubとSlackの連携
- 参照サイト
 - [GitHubのpushやプルリク通知をSlackに投げる](https://qiita.com/unsoluble_sugar/items/072c9740e258ee93ff9a)

- メリット
 - githubでプッシュ/プルリク/コメントがあった際、リアルタイムでslackへ通知してくれる
 - チームメンバーが全体の開発状況を把握しやすくなる

# 実装

## デフォルト以外で追加した主なgem
- kakasi
 - 日本語(漢字/カナ/平仮名)をローマ字変換する機能を提供
 - 参照サイト：[Ruby on Railsで漢字/ひらがな/カタカナをローマ字に変換したい](https://qiita.com/reeenapi/items/0e36906e4c465cac2272)

- unicorn（production環境のみ）
 - Railsアプリを本番サーバで動かすためのgem
 - 参照サイト：[Unicorn設定のまとめ](https://qiita.com/syou007/items/555062cc96dd0b08a610)

## 辞書の作成
### ニックネームを付ける対象となる苗字/名前の抽出
- PythonによるWebスクレイピングで、下記サイトから苗字1,000+名前5,000の合計約6,000件を抽出。
 - [同姓同名辞典](http://www.douseidoumei.net/)
 - [赤ちゃんの名前](http://favorite-names.net/)

- 下記のようなcsvファイルを用意し、末尾列にニックネームを入力していく

```lname_2char.csv
苗字,ローマ字,ニックネーム
中井,nakai,なかちゃん
武藤,mutou,ムトゥーさん
神田,kanda,かんちゃん
岡部,okabe,..
今野,konno,..
```

- csvファイルをRails側でDBに格納するスクリプトを`seeds.rb`に記述

```seeds.rb
require 'csv'
 
# 作成したcsvを1行ずつ読みとり、ActiveRecord(Model)経由でDBに格納する
CSV.foreach('db/csv/lname_2char.csv') do |row|
  LnameTwoDict.create(kanji_lname: row[0], romaji_lname: row[1], nickname: row[2])
end
```

- 上記seeds.rbがプロジェクト内にある状態で`rails db:seed`を打てば、開発メンバー全員が同じDBを各ローカルに作成できる
- 本番環境でも同様にコマンドを打ち、辞書データをMySQLに格納
 - 注）本来、seeds.rb及び`rails db:seed`はテスト用データ作成の用途で利用されることが多いが、今回のAPI作成においてはDB(辞書)の内容を動的に変更する必要がなく、初期データさえ格納されていればOKであるため、本番でも使用した。

## ロジックの実装
- 漢字/カナ/平仮名/ローマ字、あるいはその複合パターンが入力された場合に、できる限り広くニックネームへの変換が可能なロジックを構築する
- やった事
 - 考え得るLINEネームのパターンを列挙する
 - 入力〜変換までのフローチャートを書く
- ロジックが完成したら、後はそれを実現するためのコードを記述していく。

# 本番サーバ(AWS/EC2)へのデプロイ
- 基本的には、下記サイトのどちらかを参照しつつ進めればOK
 - [世界一丁寧なAWS解説。EC2を利用して、RailsアプリをAWSにあげるまで](https://qiita.com/naoki_mochizuki/items/f795fe3e661a3349a7ce)
 - [初心者向け：AWS(EC2)にRailsのWebアプリをデプロイする方法](https://qiita.com/iwaseasahi/items/d5f2ef3eac5e349a8f7d)

### 詰まった箇所と解決策
- ターミナルからEC2にログインできない
 - [解決] AWSコンソールから、セキュリティグループのインバウンドルールに現在のグローバルIPをSSH時に許可するよう設定する

- `rails db:〜`系のコマンドがEC2で通らない
 - [解決] `RAILS_ENV=production` を末尾につけて実行する 

- 本番環境でのPostgreSQLの設定がややこしい(参照サイトはMySQLを使用した場合の解説）
 - [解決] 本番ではMySQLを使用する事に
 - productionのgemを`pg`から`mysql2`へ変更
 - EC2に入れたPostgreSQLをアンインストール → 新たにMySQL5.7をインストール

- Unicorn起動時、MySQLのsocketエラーが出る
 - [解決] `mysql_config --socket` でsocketのパスを確認
 - これをdatabase.ymlの該当箇所に転記してからUnicorn再起動コマンドを叩く

```
$ bundle exec unicorn_rails -c /var/www/rails/nickname_api_v1/config/unicorn.conf.rb -D -E production
```

- 上記エラーなどがない場合、下記を叩けばOK

```
$ kill -USR2 `cat /path/to/unicorn.pid`
```

### その他EC2メモ
- EC2での設定後は、下記でTerminalからryota(一般user)としてログインできるようになっている

```
[~/.ssh] ssh railsapi_key_rsa
```
Composerとautoloadの小さなメモ

# 参考
これの通り
これで理解できるComposerを使ったオートロード | Reffect Blog - http://reffect.co.jp/blog/post/composer-autoload

# メモ

srcディレクトリの下にクラスファイルを作成

```php:src/User.php
<?php
namespace Kuredev;
class User{
    private $name;
    public function __construct(string $name){
        $this->name = $name;
    }

    public function getName(){
        return $this->name;
    }
}
```

ルートディレクトリにcomposer.json作成
名前空間Kuredev(=srcディレクトリ配下から)

```composer.json
{
  "autoload": {
    "psr-4": {
      "Kuredev\\": "src"
    }
  }
}
```

以下実行

```コマンド
$ composer dump-autoload
```

以下の通り、vendorディレクトリ配下にautoload関連のファイルが作成される

![ScreenClip.png](https://qiita-image-store.s3.amazonaws.com/0/50690/8ac8461b-abb9-0301-a1d4-19e5d3e9329e.png)

以下のように `venor/autoload.php` を読み込み、名前空間Kuredevのクラスを使える。

```php:test.php
<?php
require('vendor/autoload.php');
$user = new Kuredev\User("kure");
echo $user->getName();
```
他スクリプトからの値の取得

弾が持っている攻撃力の値を、ダメージを受けた側のOnCollisionEnter時に取得したかったので、その時の方法。他のスクリプトの持つ変数へのアクセスはいろいろと方法があるようだけど、今回はこの方法で。

ちなみに他スクリプトの変数へのアクセスは下記の記事がわかりやすかったです。

[他スクリプトから変数の値を取得する．(ゲッター，セッター)](https://qiita.com/Teach/items/8d1cdb90a3b533707c9a)

## 1 弾側の攻撃力
![image.png](https://qiita-image-store.s3.amazonaws.com/0/185127/b780ff98-4f96-608a-f75f-1a5868cb8591.png)

publicの変数として指定。これだけ。
## 2 敵側（被ダメージ側）の処理

```C#
    private void OnCollisionEnter(Collision collision)
    {

        if(collision.gameObject.tag == "bullet")
        {
            int WeaponATK = collision.gameObject.GetComponent<bullet>().ATK;
            Damaged(WeaponATK);
        }
    }
```
衝突時のcollisionをGetComponentをするのにgameObjectを挟んでやると、bulletが当たった時にbulletに付けてある変数にアクセスができました。弾側のタグに"bullet"を設定してタグを判定しています。

以前はいろいろよくわからなくて悩んだ箇所ですが、わりとすんなりできました。
Vue.jsでカルーセルをつくる

自前でVue.jsのカルーセルを作成したい人向け。

## サンプル
https://jsfiddle.net/Wave7KN/ejm664m1/5/

<img width="351" alt="vue-carousel.png" src="https://qiita-image-store.s3.amazonaws.com/0/204256/0d0d556a-c01b-cc65-104c-e7a3657dfa3e.png">

## コード
```html:HTML
<div id="vue-carousel" class="vue-carousel">

  <!-- スライドする部分。keyを持たせることで、それぞれが個別の要素であることを示す。 -->
  <transition :name="transition_name">
    <div class="vue-carousel_body"
      :key="index"
      v-for="(content, index) in contents"
      v-if="visible_content == index"
      :style="{backgroundColor: content.bg_color}">
      {{ content.title }}
    </div>
  </transition>

  <!-- 「PREV」「NEXT」と現在地のドット -->
  <div class="vue-carousel_footer">
    <button @click="back()" :disabled="visible_content == 0">PREV</button>
    <div class="vue-carousel_footer_dot"
      v-for="(contents, index) in contents"
      :class="{'is-visible' : visible_content == index}"></div>
    <button @click="next()" :disabled="visible_content == contents.length - 1">NEXT</button>
  </div>

</div>

```

```javascript:JavaScript
new Vue({
  el: '#vue-carousel',
  data: {
    contents: [{
      // 青の中身
      title: 'Content 1',
      bg_color: '#7bbff9',
    },{
      // 赤の中身
      title: 'Content 2',
      bg_color: '#f16972',
    },{
      // 緑の中身
      title: 'Content 3',
      bg_color: '#20d2a3',
    }],
    transition_name: 'show-next',
    visible_content: 0,
  },
  methods: {
    back(){
      this.transition_name = 'show-prev';
      this.visible_content--;
    },
    next(){
      this.transition_name = 'show-next';
      this.visible_content++;
    },
  },
})
```

```sass:SCSS
.vue-carousel{
  height: 200px;
  overflow: hidden;
  position: relative;
  width: 300px;
  &_body{
    color: #fff;
    height: 150px;
    left: 0;
    line-height: 150px;
    position: absolute;
    text-align: center;
    top: 0;
    width: 100%;    
  }
  &_footer{
    align-items: center;
    display: flex;
    height: 50px;
    justify-content: space-between;
    position: absolute;
    top: 150px;
    width: 100%;
    &_dot{
    background-color: #abc2ce;
      border-radius: 50%;
      height: 6px;
      width: 6px;
      &.is-visible{
        background-color: #7b94f9;
      }
    }
  }
}

// 進むトランジションと戻るトランジションをそれぞれ用意
.show-next-enter-active, .show-next-leave-active,
.show-prev-enter-active, .show-prev-leave-active  {
  transition: all .4s;
}
.show-next-enter, .show-prev-leave-to {
  transform: translateX(100%);
}
.show-next-leave-to, .show-prev-enter {
  transform: translateX(-100%);
}
```



## 参考
Enter/Leave とトランジション一覧
https://jp.vuejs.org/v2/guide/transitions.html
awkで重複行を排除する方法

awkで重複を排除する方法を記載する。

サンプルデータとして、下記のようにAを3回、 Bを2回、Cを1回表示する。

```
# echo -e "A\nA\nA\nB\nB\nC"
A
A
A
B
B
C
```
---

* 重複を排除して表示

```
# echo -e "A\nA\nA\nB\nB\nC" | awk  '!a[$0]++'
または、
# echo -e "A\nA\nA\nB\nB\nC" | awk  'a[$0]++ == 0'
A
B
C
```

$0は行全体を示すので、A、B、Cがそれぞれ行を読み込む度に代入される。
なので、パイプの右側で下記のような計算が実施されてることになる。

```
 a[A]++
 a[B]++
 a[C]++
```

のようになる。
よって、最初にその行が現れたときだけ条件が、インクリメントされる前※なので、配列の値が0となり、条件式 ```a[$0]++ == 0 と'!a[$0]++'```  は真(つまり 1)になる。
アクションが記載されていない場合、awkは真のときだけ、行の内容を表示するので、最初にその行が現れたときだけ、その行が表示される。

※変数の後につけた場合、後置といって、次に変数が参照される際に、インクリメントが行われる。

---

* 重複行2つ以上あるものだけを表示

```
# echo -e "A\nA\nA\nB\nB\nC" | awk  'a[$0]++ == 1
A
B
```

---

* 重複行が3つ以上あるものだけを表示

```
# echo -e "A\nA\nA\nB\nB\nC" | awk  'a[$0]++ == 2'
A
```
[Python3]2017年東大数学に挑戦

#2017年東大数学に挑戦してみます
######今回は文系の第一問で練習です！

問題文は載せるのやめておきます。。探せばいくらでも出てきますので・・・
文系といえど受かろうと思ったらこれを落とすとさすがにきついのではないかな～と思われる問題。
基本を押さえていれば、東大では標準レベルかと思いましたが、プログラミングだと苦労しますね・・・
まずはグラフの描写や積分、方程式の解などベタに求めてみます。



```py3:kaitou01.py

import sympy as sy
import matplotlib.pyplot as plt
import numpy as np
plt.style.use("ggplot")
fig = plt.figure()

x, y1, y2, s, t = sy.symbols('x y1 y2 s t')

y1 = s*(x - 1)**2
y2 = -x**2 + t**2

#積分
Sp = sy.integrate(y1, (x, 0, 1))

print('Pの面積は' + str(Sp))

#y2とx軸の交点は y2=0 かつ x>0
x0 = sy.symbols('x0')
#y2=0をxについて解く
tmp_kouten = sy.solve(y2, x)

x0 = tmp_kouten[1] 
Sq = sy.integrate(y2, (x, 0, x0))
print('Qの面積は' + str(Sq))

P_waru_Q = sy.simplify(Sq / Sp)
print('従って')
print('P/Q = ' + str(P_waru_Q))

#AとBが接する条件 y1 = y2 かつ x座標が等しい
print('y1 = y2を整理すると 「' + str(sy.sympify(y1 - y2)) + ' = 0 」')
tmp_kouten2 = sy.solve(y1 - y2, x)
setten = sy.solve(tmp_kouten2[0] - tmp_kouten2[1], s)

print('y1 = y2が解を一つしか持たないときsとtは 「s = ' + str(setten[0]) + '」を満たす。')

print('sに代入すると')
P_waru_Q_only_t = P_waru_Q.subs([(s,setten[0])])
print('P/Q = ' + str(sy.factor(P_waru_Q_only_t)))

print('tで微分すると')
d_P_waru_Q_only_t = sy.diff(P_waru_Q_only_t, t)
print('P/Q’ = ' + str(d_P_waru_Q_only_t))

tmp_Max_t = sy.solve(d_P_waru_Q_only_t, t)

Max_t = [max_t for max_t in tmp_Max_t if 0 < max_t < 1]

print('極大値をとるtは' + str(Max_t[0]))

print('従ってP/Qの最大値はt = ' + str(Max_t[0]) + '　のとき')
Max_P_waru_Q = P_waru_Q_only_t.subs([(t,Max_t[0])])

print('最大値' + str(Max_P_waru_Q) + 'を取る')

print('このときAとBを描くと')

a = np.arange(-1.25, 1.25, 0.01)
ax = fig.add_subplot(111)

Y1 = (1/2)*(a - 1)**2
Y2 = -a**2 + (sqrt(3)/3)**2

ax.plot(a, Y1)
ax.plot(a, Y2)
plt.show()
```
##実行結果はこんな感じ・・・
Pの面積はs/3
Qの面積は2*t**3/3
従って
P/Q = 2*t**3/s
y1 = y2を整理すると 「s*(x - 1)**2 - t**2 + x**2 = 0 」
y1 = y2が解を一つしか持たないときsとtは 「s = -t**2/(t**2 - 1)」を満たす。
sに代入すると
P/Q = -2*t*(t - 1)*(t + 1)
tで微分すると
P/Q’ = -6*t**2 + 2
極大値をとるtはsqrt(3)/3
従ってP/Qの最大値はt = sqrt(3)/3　のとき
最大値4*sqrt(3)/9を取る
このときAとBを描くと
![kaitougraph.png](https://qiita-image-store.s3.amazonaws.com/0/210241/65e8d937-e6f9-7ac7-93dd-0673aa8b6725.png)

途中のP/Q(t)を描いてみる

```py3:PQgraph.py
p = np.arange(-1.25, 1.25, 0.01)
ax = fig.add_subplot(111)
ax.plot(p, -2*p*(p - 1)*(p + 1))
plt.show()
```
![tocyuugraph.png](https://qiita-image-store.s3.amazonaws.com/0/210241/a79f8377-b446-a070-5272-02ee97a341bf.png)


######今回は単純に計算機とグラフ描写の為にしかpythonを使えていないです・・・
######二次関数が接する等の条件は関数で表現できればいいのかなーとか思ったりしますが難しい。
######いずれはAIでできたらいいのですが、文字認識→思考→解答作成となるととても難しそうだ笑
######とにかくプログラミングの練習になったのはよかったかなと。。
改行コード一覧

私はiOSとWindows、たまにLinuxでアプリを開発しています。どのOSでどの改行コードを使うかわからなくなるときがあるため、一覧にしてみました。

|改行コード名|意味|改行コード|OS|fileformat(Vim)|
|:--|:--|:--|:--|:--|
|CR(Carriage Return)|復帰。キャレットを左端の位置に戻すこと|\r|Mac OS(9以前)|mac|
|LF(Line Feed)|改行。キャレットを新しい行に移動すること|\n|UNIX系全般|unix|
|CRLF|復帰+改行。キャレットを左端の位置に戻して改行すること|\r\n|Windows系全般|dos|

## 参考リンク
- [備忘録：改行コード「LF」と「CR」と「CRLF」の違い - marusunrise2〜Hello from Rwanda〜](http://marusunrise2.blogspot.jp/2014/06/lfcrcrlf.html)
- [テキストファイル - 改行の、\nと\r\nの違いは何ですか？ - スタック・オーバーフロー](https://ja.stackoverflow.com/questions/12897/%E6%94%B9%E8%A1%8C%E3%81%AE-n%E3%81%A8-r-n%E3%81%AE%E9%81%95%E3%81%84%E3%81%AF%E4%BD%95%E3%81%A7%E3%81%99%E3%81%8B)
- [Vimで改行コードを変更する - Qiita](https://qiita.com/bezeklik/items/aca37ffb127821311d6b)
読みやすいコード

今回は私が思う読みやすいコードについて書いていきます。
仕事をしていて他人のコードを読む機会が多く、その中でこのコード読みやすい！このコード読みにくいって思ったものを紹介できたらなと思います。

#私が思う読みやすいコードとは！
読む人の脳のキャッシュに残さないコードです！ヽ(^o^)丿脳のキャッシュとは何でしょうか？以下の例をみてください。

```java
public void main(String[] args) {
  String a = "";
  ~処理A
  ~処理B
  for (String b : args) {
    ~処理C
  }
}
```

このような処理があります。この処理では、処理A、B、Cのなかで、変数ａがどのように変わっていくかずっと気にしないといけません。つまり、ずっと脳内に残さないといけないのです。これが脳のキャッシュです。正直、たった一つの変数の値を気にしないといけないくらいでは、大丈夫です。ただ、これが２つ、３つとだんだん増えていくとより考えることが増えていきます。そしたら、コードを読むのがだんだん難しくなっていくのが簡単に想像できるでしょう。

こういったことを防ぐために、気にしてほしい例が何個かありますので紹介していきます！


#ひとつめ！

```java
public String example1( ) {
  if (条件1) {
    処理A
    return ~;
  } else {
    処理B
    return ~;
  }
}
```

この例では、条件1がtrueになったときに、処理Aを実施して、そして、なにか戻り値を返します。条件1がfalseの場合、処理Bを実施して何かを返します。
このコードの読みにくいところは、elseになってる点です。条件1がtrueになった場合、何かをreturnします。つまり、条件1がtrueになると関数が終了します。必ず終了するのに、elseにしてしまうと処理Aの処理がそれ以降の処理に影響するのではないのかというキャッシュを脳に残さないといけません。処理A、処理Bが長ければ長いほど理解が難しくなります。なので、こうするとベストです！

```java
public String example1( ) {
  if (条件1) {
    処理A
    return ~;
  }
  処理B
  return ~;
}
```

このようにすると、条件1に一致するときには関数の処理が終了すると分かりやすくなります。処理Bをするときに、処理Aの内容を気にしなくてよくなります。なので、このやり方がベストです！

#ふたつめ！
正直、一つ目とほぼ同じですがcontinueとbreakの使い方です。

```java
public String example2( ) {

  for (~) {
    if (条件1) {
      処理A
      continue or break;
    } else {
      処理B
      return ~;
    }
}
```

このようなコードをたまにみます！これもelseがいりません！処理Bをするときに、処理Aの内容を全く考えなくてもよいようにすべきです。

#みっつめ！
変更不可の修飾子をつける。Javaの場合、final。
この修飾子を使用すると一度定義された変数の値は変更することができなくなります。なので、コードを解読するときにあの変数の値はなにやったっけな？とか考えなくても良くなります。変数を使い回して、ある時点の値が何か理解するために、ロジックを追わないといけないなんて非効率極まりないので使用できるところは使用しましょう！

#よっつめ！
できるだけ、変数のスコープの範囲を小さくする。言い方を変えると、変数を使い捨てにすると言うことです。
スコープを小さくすることによって、値の変化を考えないといけない範囲が少なくなります。例えば以下のような感じです。

```java
String a = "";
String b = "";

if (条件1) {
  処理A
}

if (条件2) {
  処理B
}
```

このような処理の場合、変数a, bは処理A、処理Bともに影響を受け、値の変化を気にしないといけません。
もし、この処理では、変数aは処理Aでしか利用しない。変数bは処理Bでしか利用しない。だったらどうでしょう？このソースなら処理A、処理Bともに読まないとこの事実が分かりません。
では、以下の例ではどうでしょう？

```java
if (条件1) {
  String a = "";
  処理A
}

if (条件2) {
  String b = "";
  処理B
}
```

このように、ブロックスコープを利用すると、変数aは処理Aでしか利用しない。変数bは処理Bでしか利用しない。という事実が見てすぐ理解できます。ブロックスコープを利用できないようなパターンもあると思いますが、利用できるときはどんどん使用しましょう！

私がコードを読みやすくするために考えていることは以上です。
賛否両論あると思いますが、皆さんが良いと思うコードを書けるよう努力していきたいと思います。
Python Lambda Tutorials


+ Make requirements file

```
#requirements.txt
boto3==1.0.0
```

+ Install packages

```
pip install -r requirements.txt -t .
```

+ Login vào dynamodb

```
$ cat ~/.aws/config
[default]
region = ap-northeast-1

[profile chalice]
output = text
region = ap-northeast-1
```

```
$ cat ~/.aws/credentials
[default]
aws_access_key_id=XXX
aws_secret_access_key=XXX

[chalice]
aws_access_key_id = XXXX
aws_secret_access_key = XXX
```

Có 2 cách để có thể authen vào trong dynamodb trên aws:

```
### Cách 1: Truyền trực tiếp access_key vs access_secret
import boto3
from boto3.session import Session

dynamodb = boto3.resource('dynamodb', region_name='us-east-1', aws_access_key_id='XXX', aws_secret_access_key='XXX')
table = dynamodb.Table('test')
print(table.creation_date_time)

### Cách 2: truyền thông qua profile
import boto3
from boto3.session import Session

profile = 'chalice'
session = Session(profile_name=profile)
dynamodb = session.resource('dynamodb', region_name='us-east-1')

table = dynamodb.Table('test')
print(table.creation_date_time)
```
PHPの__autoload関数の小さなサンプル


```php:test.php
<?php

$user = new User("kure");
echo $user->getName();

```

```User.class.php
<?php
class User{
    private $name;
    public function __construct(string $name){
        $this->name = $name;
    }

    public function getName(){
        return $this->name;
    }
}

```

以上の場合、クラスのファイル(User.class.php)が読み込まれずに、以下のエラーが出る

```
PHP Fatal error:  Uncaught Error: Class 'User' not found in 
```

以下のように `__autoload` 関数を定義すれば、ファイル名を追って読み込まれる。関数の引数$nameにはインスタンス化しようとしたクラス名が渡される。

```php:test.php
<?php

function __autoload($name){
    $filename = $name.".class.php";
    require $filename;
}

$user = new User("kure");
echo $user->getName();

```
シェルでよく使う日付の連番をワンライナーで


[稀によくある作業](http://dic.nicovideo.jp/a/%E7%A8%80%E3%81%AB%E3%82%88%E3%81%8F%E3%81%82%E3%82%8B)で、
ファイルを連番で作ったりgrepしたりするときに必要になったので書いたもので既出ならすみません。
ネットで探してもforを使うのばっかりで使い辛かった。。。

環境は、Ubuntu 16.04 で試してます。

```bash
$ seq 0 5 | xargs -n1 -i date -d+{}days -I               
2017-11-05
2017-11-06
2017-11-07
2017-11-08
2017-11-09
2017-11-10
```

基準日やフォーマットを変えたいときはこれで！

```bash
seq 0 5 | xargs -n1 -i date -d2017/01/01+{}days +%Y%m%d
20170101
20170102
20170103
20170104
20170105
```
逆順や過去日も求められる

```bash
seq -1 -1 -5 | xargs -n1 -i date -d2017/01/01+{}days +%Y%m%d
20161231
20161230
20161229
20161228
20161227
```

## 実用編？
ファイル作ったり

```bash
seq 1 5 | xargs -n1 -i date -d2017/01/01+{}days +%Y%m%d | xargs -L1 touch
```

ログを日付毎にファイルに出力して、データを整理したり

```bash
seq 1 5 | xargs -n1 -i date -d2017/01/01+{}days +%Y%m%d | xargs -L1 -I@ awk '/@/{ print >> "src/@.log"}' sample.log
```
## 備考
BSD系ではオプションが違うという噂なので、
Linuxじゃない場合は少し違うかも
shadowsocks関連情報集め（予定）

shadowsocks関連の情報を集める予定のページ

* [サーバ](https://shadowsocks.org/en/download/servers.html)


サーバ側の実装は色々あるけど、Pythonがいいんじゃないのかな。

## 情報源

https://qiita.com/fallout/items/39360befe4dd35ee98c2
Java:ディレクトリを渡り歩く

#始めに
Java nioで追加された[walkFileTree](https://docs.oracle.com/javase/jp/7/api/java/nio/file/Files.html#walkFileTree(java.nio.file.Path, java.util.Set, int, java.nio.file.FileVisitor))を使うと、ディレクトリを渡り歩く処理がめっちゃ楽だった、という記事を書いてみます
・・・・・
いや、今更というのは痛いほどわかっているんですが、職場のJREのバージョンがいまだに1.6基準なのでファイルの処理でいまだにJava.ioクラスを使っているんですよ。
walkFileTreeで実装されているVistorの処理を**自前**で実装したりとか、めっちゃ泣けてきます・・・・

#やりたいこと
C:/Java/jdk1.8.0_102/srcからC:/Java/jdk1.8.0_102/src/javax/scriptにあるJavaファイルのpublicクラスを抽出します
publicクラスの抽出は[機能の記事で挙げたソース](https://qiita.com/triple4649/items/af44ee9eb0ca2cd470fb)をカスタマイズしています

#walkFileTreeに渡すVistorの実装
FileVisitor<Path>インターフェイスで定義されているメソッドをオーバーライドしていきます
ポイントは

- 戻り値でnullを返すと予期せぬところでNullPointerExceptionが発生するので、FileVisitResultを返すこと
- preVisitDirectoryを活用して無駄なファイルの入出力を抑止すること

ですかね？

```DirectroyWalkVistor.java
package triple;

import java.io.IOException;
import java.nio.file.FileVisitResult;
import java.nio.file.FileVisitor;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.attribute.BasicFileAttributes;

public class DirectroyWalkVistor  implements FileVisitor<Path>{
	private static final String DIRECTORY_ON_TARGET ="C:/Java/jdk1.8.0_102/src/javax/script";

	public static void main(String args[]) throws Exception{
		Files.walkFileTree(Paths.get("C:/Java/jdk1.8.0_102/src"), new DirectroyWalkVistor());
	}
	
	@Override
	public FileVisitResult postVisitDirectory(Path file , IOException arg1) throws IOException {
		return FileVisitResult.CONTINUE;
	}

	@Override
	public FileVisitResult preVisitDirectory(Path file, BasicFileAttributes arg1) throws IOException {
		if(Paths.get(DIRECTORY_ON_TARGET).startsWith(file)){
			//C:/Java/jdk1.8.0_102/src/javax/scriptに部分一致するときは処理を続ける
			return FileVisitResult.CONTINUE;
		}else{
			//C:/Java/jdk1.8.0_102/src/javax/scriptに部分一致しない時はサブディレクトリの処理をスキップする
			return FileVisitResult.SKIP_SUBTREE;
		}
	}

	@Override
	public FileVisitResult visitFile(Path file, BasicFileAttributes arg1) throws IOException {
		try{
			JavaFileAnalyser.execute(file);
		}catch(Exception e){
			throw new IOException(e);
		}
		return FileVisitResult.CONTINUE;
	}

	@Override
	public FileVisitResult visitFileFailed(Path file, IOException arg1) throws IOException {
		arg1.printStackTrace();
		return FileVisitResult.CONTINUE;
	}
}
```

#感想
めっちゃ楽！の一言です
ディレクトリ処理にありがちな面倒くさいループや再帰処理が一切出てこなくなるので、ロジックがとてもシンプルになります
terraformでElastiCache(Redis)のClusterを作るときにハマったこと

## 前提

- terraform v0.10.3

## この記事で言いたいこと
- Redisの複数キャッシュノードのクラスタを作りたいときは、[aws_elasticache_cluster](https://www.terraform.io/docs/providers/aws/r/elasticache_cluster.html)ではなく、[aws_elasticache_replication_group](https://www.terraform.io/docs/providers/aws/r/elasticache_replication_group.html)を使う

## 最初にハマったこと

- Redisの複数キャッシュノードのクラスタを作成しようとして、 [aws_elasticache_cluster](https://www.terraform.io/docs/providers/aws/r/elasticache_cluster.html)で定義を書いた

```redis.tf
resource "aws_elasticache_cluster" "redis" {
  cluster_id           = "cluster-redis"
  engine               = "redis"
  node_type            = "cache.t2.micro"
  port                 = 6379
  num_cache_nodes      = 2
  parameter_group_name = "default.redis3.2"
}
```

- ところが、、、

```
* aws_elasticache_cluster.redis: Error creating Elasticache: InvalidParameterValue: Cannot create a Redis cluster with a NumCacheNodes parameter greater than 1.
    status code: 400, request id: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
```

- え？`num_cache_nodes`って、1以上指定できないの？

## terraform公式を見たら

- [公式ページ](https://www.terraform.io/docs/providers/aws/r/elasticache_cluster.html#num_cache_nodes)の`num_cache_nodes`


```
(Required) The initial number of cache nodes that the cache cluster will have.
For Redis, this value must be 1.
For Memcache, this value must be between 1 and 20. 
If this number is reduced on subsequent runs, the highest numbered nodes will be removed.
```

- Memcacheは1〜20台作れるけど、Redisは1台だけだと・・・・なんだこの制限？

## 調べた結果

- Redisは[aws_elasticache_replication_group](https://www.terraform.io/docs/providers/aws/r/elasticache_replication_group.html)で複数キャッシュノードのクラスターが作成できました。

```redis.tf
resource "aws_elasticache_replication_group" "redis" {
  replication_group_id          = "tf-rep-group-1"
  replication_group_description = "test description"
  node_type                     = "cache.m1.small"
  number_cache_clusters         = 2
  port                          = 6379
  parameter_group_name          = "default.redis3.2"
  availability_zones            = ["us-west-2a", "us-west-2b"]
  automatic_failover_enabled    = true
}
```

## まとめ

- Redisの複数キャッシュノードのクラスタは[aws_elasticache_replication_group](https://www.terraform.io/docs/providers/aws/r/elasticache_replication_group.html)で作る
- 単一キャッシュノードのクラスタなら、[aws_elasticache_cluster](https://www.terraform.io/docs/providers/aws/r/elasticache_cluster.html)でも作れる

## 感想
- AWS上では両方(Memcache/Redis)共に`ElastiCacheクラスター`ってなっててわかりにくい！！！
Railsにおけるデータベース関連付けの記述方法

#リレーションシップとは
データベース同士の関連性を定義するものですね。私はRuby独自の表現だと思っていましたが、データベース用語のようです。
ここではRailsにおけるリレーションシップの指定方法について簡単にまとめて行こうと思います。

#関連付けの種類
- belongs_to
- has_one
- has_many
- has_many :through
- has_one :through
- has_and_belongs_to_many

上記6種類です。has_one :throughとhas_and_belongs_to_many以外を使用して確認していきたいと思います。

#関連付けを学校に例える
小学校に関するアプリを開発するという想定で行きたいと思います。誰でも経験したであろう小学校という場所をモチーフとしてリレーションシップを確認したいと思います。

## 1対1のつながり
データ上の1つのものに対し、他のデータ上の中から必ず1つしか存在しえないものを表すときに**1対1**の繋がりがあるといえます。
小学校で例えるなら、生徒と机でしょうか？Student(生徒)とDesc(机)は紐づいており、必ず1対1の関係にあります。机を2つもっている生徒や、逆に1つの机を2人の生徒が使用することはないでしょう。

```models/student.rb
class Student < ActiveRecord::Base
  has_one :desc
end
```

```models/desc.rb
class Desc < ActiveRecord::Base
  belongs_to :student
end
```

机になんのデータが入っているのかはさておいて、has_oneとbelong_toが紐づけのコードになります。お互いの関係は1対1のですが、has_oneとbelong_toと別々のコードを使用しています。これは参照先のidを持っているかどうかで使い分けます。

## 1対多のつながり
小学校は多くのところが担任制だと思います。Teach(先生)に対してStudents(生徒)がたくさんいる状態ですね。その関係性は**1対多**であるといえます。

```models/teacher.rb
class Teacher < ActiveRecord::Base
  has_many :students
end
```

```models/student.rb
class Student < ActiveRecord::Base
  belongs_to :teacher
end
```
belong_toは変わりませんが、has_manyというのが登場しました。こちらが**対多**を意味するコードになります。注意すべきはhas_manyで宣言する場合は複数形でないといけないところです。Studentクラスは単数形ですが、has_manyのあとはstudentsになっています。

##　多対多のつながり
小学生には部活動はありませんでした。その代わりにクラブ活動がありました。クラブ活動は週に1、2回だったので掛け持ちが可能でした。その関係は**多対多**であるといえます。Studenst(生徒)とClub(クラブ)を直接紐づけることも可能ですが、先生としてはどの生徒がどのクラブに所属しているか把握しておきたいところです。そこで、AffiliationList(所属表)も作っておくことにします。
AffilicationClubListを介してStudentとClubを紐づけさせると以下のようになります。

```models/student.rb
class Student < ActiveRecord::Base
  has_many :affilicationLists
  has_many :clubs, through :affilicationLists
end
```

```models/club.rb
class Club < ActiveRecord::Base
  has_many :affilicationLists
  has_many :students, through :affilicationLists
end
```

```models/affilicationList.rb
class AffilicationList < ActiveRecord::Base
  belongs_to :student
  belongs_to :club
end
```

ちょっと複雑になりました。ただ、使用しているコードは今までと同じなので、分けて考えていけば理解できるかと思います。
AffilicationListを中心に考えると、ClubとStudentの関連付けは**1対多**の関係です。変わってくるのはClubとStudentのコンマ以降のthroughの部分です。has_manyのあとにthroughオプションを指定すると、throughのあとのモデルを経由してアクセスできるようになります。
student基準で考えると、affilicationListを経由してclubにアクセスできるようになるということです。

# まとめ
- 1対1　belongs_toとhas_one
- 1対多 1側はbelongs_to、多側はhas_many
- 多対多 第3のデータを中継して指定。中継地からはbelongs_to。中継地にhas_manyでつなぎ、お互いをhas_many :throughで指定。

#あとがき
この手の資料を検索すると、ツイッターを例にとって説明しているものがほとんどでした。今回はもう少し現実的な視点でまとめていきたいと思い、小学校でありそうな事柄で例えてみたのですが多少強引だったでしょうか？
私自身まだ理解しきっていないところがあるため、間違いありましたら指摘していただけると助かります。

#参考
RailsGuides Active Record の関連付け (アソシエーション)：https://railsguides.jp/association_basics.html
Rails Webook：http://ruby-rails.hatenadiary.com/entry/20141204/1417688260
isolating the domainを読んでみた

関ジャバのDDD勉強会で紹介されていた isolating the domain を読んでみました。

紹介のスライド https://speakerdeck.com/haljik/isolating-the-domainfalseshao-jie
プロジェクト https://github.com/system-sekkei/isolating-the-domain

ちょうど直近のプロジェクトでDDDに沿った設計を導入することになったので、その参考にしたい、という意図です。
実際にDDDを導入しようとすると、各層のディレクトリ名の付け方でチームメンバーの意見が一致しなかったりするので、そういうところはパクっていくのがいいかなと考えてます :)


## プロジェクトの概要

ユーザ情報のCRUD操作機能を提供しているWebアプリケーション。
Java + Spring MVC + MyBatis。
DDDのプロジェクトの雛形として利用されている。
手元ですぐ実行できるスクリプトが付いている。

設計指針は Wikiにまとめられてる。 https://github.com/system-sekkei/isolating-the-domain/wiki



## プロジェクトの構造

プロジェクトは 3層(プレゼンテーション層、アプリケーション層、データソース層) + ドメインモデル で構成されています。



各層の役割: 
https://github.com/system-sekkei/isolating-the-domain/wiki/%EF%BC%93%E5%B1%A4%EF%BC%8B%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E3%83%A2%E3%83%87%E3%83%AB 


### ドメインモデル
* 業務上の判断／加工／計算ロジックを表現したドメインオブジェクトの集合。ドメインオブジェクトにはEntity, Value Objectなどが含まれる。 
* 記録と通知の関心事も、ドメインモデルの一部としてインタフェース宣言する

### プレゼンテーション層
* ユーザからの入力受付と出力
* 入力を元にしたドメインモデルの生成(バインディング)、バリデーションの実行もここでやる。

### アプリケーション層
* プレゼンテーション層からの依頼に基づき、ドメインオブジェクトを使った操作をする。

### データソース層
* 記録/参照の実装
* 外部との送受信の実装



## いかにしてドメインを隔離するか？

DDDでは、ドメインモデルにはドメイン(業務の関心事)のみを記述し、実装技術は隔離することが重要です。isolating the domainでは以下のテクニックを使ってそれを実現しています。

* (業務上の判断／加工／計算ロジックに加えて) 記録と通知の関心事も、ドメインモデルの一部としてインタフェース宣言する
* ドメインモデルで定義したインタフェースをデータソース層で実装する。
* データソース層のクラスは、他のレイヤから直接呼び出さない。



# その他
以下、各層の実装方法について、個人的に気になったところを挙げます。


## ドメインオブジェクトがimmutableになってない
* バリューオブジェクトも含め、ドメインオブジェクトのフィールドにprivateが設定されていません。
* 同じパッケージのクラスからは値をセットできてしまう。真にimmutableではない。
* private修飾子をつけてもDirect Field Accessできてしまうため、どうせ真にimmutableではない。なのでprivateつけてもつけなくてもいい、むしろ余計な情報がコードに増えるのでつけないほうがいい、という割り切った設計判断があるのかな？



## かならずアプリケーションサービスを通してドメインモデルを操作する
  プレゼンテーション層から直接リポジトリを操作せず、アプリケーションサービスを経由して操作しています。
  プレゼンテーション層から直接ドメインモデルの操作をすべきでない、ということを最近考えていたので、
  やっぱりそのように実装されてるなー、と追認できました。


## ドメインオブジェクトへの値のセットは、O-Rマッパー、Web Data Bindingにまかせている
* コンストラクタで値をセットするのでなく、ダイレクトフィールドアクセスを使って値をセットしている
* O-Rマッパー、Web Data Bindingが作るオブジェクトをDTOとして扱わず、ドメインオブジェクト自体を作っている。
* ドメインオブジェクトに値の設定方法に関するコードを含めなくて良いのはメリット。
* DTOをコードに含めなくていいのはメリット。
* O-Rマッパー、Web Data Bindingがないと、ドメインオブジェクトへの値のセットができないのはデメリット。(リフレクションを使って実現するしかない。)そういうテストのときに困るので、privateにせずに同じパッケージからなら値をセットできるようにしてるんだろうか？


## Application Serviceでトランザクション制御してない

トランザクション制御はアプリケーション層の責任だと思ってたので、ここにないのが意外でした。
MyBatisでのトランザクション制御方法をしらないので、どこでトランザクション制御してるか不明。


## オブジェクトをフィールドにセットするのにSpringのDIの機能を活用
アプリケーション層で利用するリポジトリクラスの実装や、プレゼンテーション層で利用するアプリケーションサービスをインスタンス化するのに、DI機能を利用しています。
個人的に、DI機能使ってるとどうやってオブジェクトが作られるかわからなくなってしまうので、あまり使いたくないんですよね。なので、へえ、という感じでした。
  


## 感想

DDDのプロジェクトでの、各レイヤのクラスの置き場所や記述内容の具体的なサンプルとして、大変参考になりました。
ValueObjectが真のImmutableとして実装されてないという点は、かなり意外でした。このあたりはImmutableにこだわるより、ドメインオブジェクトにとって重要なことのみを集中させるために、オブジェクト生成に関わるコードはできるだけ含めないポリシーなのかなと思いました。ある種の割り切った設計ですね。

また、すぐ動かせるサンプルがあるというのは、いいなーと思いました。
メンバーが参加するときに知識の共有をするのに非常に便利そう。
できれば自分たちでもこういうプロジェクトの雛形を作りたいですね。
PEファイルのバイナリ構造(4) IMAGE_OPTIONAL_HEADER

# IMAGE_OPTIONAL_HEADER

IMAGE_NT_HEADERSのメンバとして定義されている構造体ですが、32bitの場合は、IMAGE_OPTIONAL_HEADER32、64bitの場合はIMAGE_OPTIONAL_HEADER64として定義されます。

こちらで重要なのは以下のメンバ変数になります。

|メンバ||
|:--|:--|
|Magic|32bit(IMAGE_NT_OPTIONAL_HDR32_MAGIC)と64bit(IMAGE_NT_OPTIONAL_HDR64_MAGIC)のフラグが収納されている。|
|ImageBase|実行ファイルとしてメモリ上に読まれる時にベースとなるメモリアドレス。|
|DataDirectory|必要とされるセクション（情報）のアドレスとサイズを保存。|

前回IMAGE_FILE_HEADERのMachineでアーキテクチャを確認しましたが、こちらのMagicでも32bitと64bitは判別可能です。
ただ既に判別は終わっていますので、必要であれば一応確認するというぐらいでしょうか。

ImageBaseは実行環境のメモリのベースアドレスを示します。
実行環境ということですので、32bitではDWORD、64bitではULONGLONGとメモリを示す変数のサイズが違い、これが構造体が分けられている理由となります。

最後のDataDirectoryですが、こちらはIMAGE_OPTIONAL_HEADERの構造体配列になっており、「目的としているデータが保存されている場所を示す情報が保存されている位置を示すアドレス」が保存されています。
＃何というか、たらいまわし的な感じが…

次回はDataDirectoryの情報を元に、エクスポートされている関数の情報を取得していきます。
PowerShellからLotusScirptのクラスを呼んだときのGetFirstDocumentの挙動について

# PowerShellからLotusScirptのクラスを呼んだときのGetFirstDocumentの挙動について

※この記事の内容は、以下環境下で確認しています。

- Windows7 SP1
- IBM Notes 9 Social Edition リリース 9.0.1FP5 SHF190

　[PowershellでLotusScriptを利用して](https://qiita.com/fumimix/items/13a74e534bc5f2b6aaae)NotesDocumentCollectionからGetFirstDocumentを呼ぶとうまくいかないようです。


```PowerShell:GetFirstDocumentのサンプルコード
$ss = New-Object -COMObject Lotus.NotesSession
$ss.Initialize("")
$db = $ss.GetDatabase("", "names.nsf")
$docCol = $db.AllDocuments
$doc = $docCol.GetFirstDocument

Write-Output $doc.Created
```

　上記サンプルコードをは以下のような動きをする想定ですが、作成日が返ってきません。

1. names.nsfのすべての文書を含むオブジェクトを取得（\$docCol）
1. そのオブジェクト内最初の文書のオブジェクトを取得（\$doc）
1. 最初の文書の作成日を返す

　デバッグしてみると以下のように\$docに値が入っていないことが分かります。
　\$docにうまく値がセットされないようです。

```PowerShell:GetFirstDocumentサンプルコードの$docの値をデバッグ
>> $doc

OverloadDefinitions            
-------------------            
IDocument GetFirstDocument ()  


>> $doccol


Count     : 334
IsSorted  : False
Parent    : System.__ComObject
Query     : 
UntilTime : 
```

　一方、GetNthDocumentを使うとうまくいくようです。
　NotesDocumentCollection内全ての文書をチェックする場合、現時点ではGetNthDocument(1)で最初の文書を取得してから、GetNextDocumentを使うとよさそうです。


```PowerShell:GetNthDocumentのサンプルコード
$ss = New-Object -COMObject Lotus.NotesSession
$ss.Initialize("")
$db = $ss.GetDatabase("", "names.nsf")
$docCol = $db.AllDocuments
$doc = $docCol.GetNthDocument(1)

Write-Output $doc.Created
```

```PowerShell:GetNthDocumentサンプルコードの$docの値をデバッグ
>> $doc

（中略）
Created            : 2002/10/07 12:54:31
EmbeddedObjects    : 
EncryptionKeys     : {}
EncryptOnSend      : False
FolderReferences   : 
FTSearchScore      : 0
HasEmbedded        : False
HttpURL            : 
IsDeleted          : False
IsNewNote          : False
IsProfile          : False
IsResponse         : False
IsSigned           : False
IsUIDocOpen        : False
IsValid            : True
（以下略）
```

 ~~これが仕様なのかどうなのかについては、もう少し調べてみた上で、何か分かれば追記するつもりです。~~

(2020/06/21追記)
今後の状況の把握が難しくなりましたので、この記事の更新はこれ以上ありません。過去バージョンを利用するときに参考程度にご利用ください。

(2017/12/02追記)
[LO93308: NOTESDATABASE#GETFIRSTDOPCUMENT DOES NOT WORK IN WINDOWS POWERSHELL](https://www-01.ibm.com/support/entdocview.wss?uid=swg1LO93308) としてAPAR番号がついたようです。修正の時期は未定。

(2017/03/07追記)
NotesDbDirectoryのGetNextDatabaseも、この現象とは少し違う応答になりますが、うまく戻り値を返せないようです。
画面下のバナーをSafe area対応したときのコード

`UILayoutGuide`を使い分けてあとはautolayoutで調整したらできた。

```swift
// bannerViewは基本的な初期化が終わったバナー
let guide:UILayoutGuide
if #available(iOS 11, *) {
    guide = self.view.safeAreaLayoutGuide
} else {
    guide = self.view.layoutMarginsGuide
}

NSLayoutConstraint.activate([
    bannerView!.heightAnchor.constraint(equalToConstant: bannerView!.frame.height),
    bannerView!.centerXAnchor.constraint(equalTo: guide.centerXAnchor),
    bannerView!.bottomAnchor.constraint(equalTo: guide.bottomAnchor)
])
```
複数のROOTファイル内のヒストグラムを足し合わせて保存する

#ROOTとは
ROOTは欧州合同原子核研究機構CERNが開発している情報処理フレームワーク。高エネルギー物理や宇宙線系では広く使われている。
[本家のページ](https://root.cern.ch/)

#対象となる読者
例えば、

* モンテカルロシミュレーションで、統計を稼ぐために複数のプロセッサを持つ計算機で別々にジョブを走らせ、後からそれを足し合わせようとしている人。

* 複数回の実験で得られたデータの足し合わせをしようとしている人。

を想定している(きれいな並列計算のコードを書けるならその方がいい)。

#前提
今、手元に2つのROOTファイル
datafile1.root
datafile2.root
があり、それぞれが、2次元ヒストグラム(TH2D)h1、h2を持つとしよう。
ここでは、2次元ヒストグラムh1、h2はx軸、y軸ともに
範囲0~1、100bin
であるとする。
これらのヒストグラムを読み込んで、足し合わせたのち、結果を
result.root
に保存するものとする。

#マクロコード

```C++:merge_histo.C
int merge_histo(){
    //ヒストグラムの読み込み
    TFile *f1 = new TFile("datafile1.root");
    TH2D* h1=(TH2D*)f1->Get("h1");
    
    TFile *f2 = new TFile("datafile2.root");
    TH2D* h2=(TH2D*)f2->Get("h2");


    //足し合わせるヒストグラムをTListに格納
    TList *l = new TList;
    l->Add(h1);
    l->Add(h2);


    //足し合わせた結果を入れるためのヒストグラム
    TH2D* h = new TH2D("h","h", 100, 0.0, 1.0, 100, 0.0, 1.0);
    h->Merge(l);


    //結果を保存
    TFile *file = new TFile("result.root","recreate");
    h->Write();
    file->Close();
    
    return 0;
}
```

上ではROOTファイルが2つの場合を示したが、より多くの場合でも可能である。
PEファイルのバイナリ構造(3) IMAGE_NT_HEADERS

# IMAGE_NT_HEADERS

IMAGE_DOS_HEADERの後に配置されている構造体がこの「IMAGE_NT_HEADERS」となります。
上記のIMAGE_DOS_HEADERのe_lfanewメンバを使用してアクセスが可能です。
ちなみにImageNtHeader()という関数で参照することも可能ですが、今回はあえて低レベルな方法でアクセスしていきます。

```cpp:
IMAGE_NT_HEADERS& tNT = (*(IMAGE_NT_HEADERS*)&(pFile[tDOS.e_lfanew]));
```

こちらの構造体は具体的には以下の様な定義をされています。

```cpp:
typedef struct _IMAGE_NT_HEADERS {
  DWORD                 Signature;
  IMAGE_FILE_HEADER     FileHeader;
  IMAGE_OPTIONAL_HEADER OptionalHeader;
} IMAGE_NT_HEADERS, *PIMAGE_NT_HEADERS;
```

|メンバ||
|:--|:--|
|Signature|固定の値「PE\0\0」が指定されている。IMAGE_NT_SIGNATUREとして定義。|
|FileHeader|COFFファイル（.objファイル）のヘッダ形式。実行環境等が確認できる。|
|IMAGE_OPTIONAL_HEADER|データ部分へのオフセットなどが登録されている構造体。|

このIMAGE_NT_HEADERSですが、実は32bitと64bitでサイズが異なります。
通常はマクロで隠蔽されてしまっていますので意識しなくても良いのですが、今回は対象としているファイル側の環境に合わせる必要がありますので、チェックして対応してやる必要があります。
また今回はWindowsの実行ファイルの解析を目的としますので、この段階で対象のアーキテクチャなどを確認して絞り込みを行っておきます。

ちなみにIMAGE_FILE_HEADERまでは構造体のサイズは同じですので、最初はネイティブの構造体で読み込んでアーキテクチャを確認したところで32bitと64bitの処理を分岐させます。

以下は単純化したサンプルコードです。

```cpp:
IMAGE_NT_HEADERS& tNT = (*(IMAGE_NT_HEADERS*)&(pFile[tDOS.e_lfanew]));
if( tNT.FileHeader.Machine == IMAGE_FILE_MACHINE_I386 )
{
	IMAGE_NT_HEADERS32& tNT32 = (*(IMAGE_NT_HEADERS32*)&(pFile[tDOS.e_lfanew]));
	// 32bitバイナリ用の処理
}
else if( tNT.FileHeader.Machine == IMAGE_FILE_MACHINE_AMD64 )
{
	IMAGE_NT_HEADERS64& tNT64 = (*(IMAGE_NT_HEADERS64*)&(pFile[tDOS.e_lfanew]));
	// 64bitバイナリ用の処理
}
else
{
	return false;
}
```

次はIMAGE_OPTIONAL_HEADERの解析を行います。
libvirt のNAT インタフェース(virbr0) を有効化する

# 定義されているネットワークを確認する 
KVM, libvirt をインストールするとデフォルトでNAT インタフェースであるvirbr0 の設定ファイルが用意されます。


```xml:/etc/libvirt/qemu/networks/default.xml
<!--
WARNING: THIS IS AN AUTO-GENERATED FILE. CHANGES TO IT ARE LIKELY TO BE
OVERWRITTEN AND LOST. Changes to this xml configuration should be made using:
  virsh net-edit default
or other application using the libvirt API.
-->

<network>
  <name>default</name>
  <uuid>92b9f84f-5363-4fe2-9df7-1b9901b3a144</uuid>
  <forward mode='nat'/>
  <bridge name='virbr0' stp='on' delay='0'/>
  <mac address='52:54:00:xx:xx:xx'/>
  <ip address='192.168.122.1' netmask='255.255.255.0'>
    <dhcp>
      <range start='192.168.122.2' end='192.168.122.254'/>
    </dhcp>
  </ip>
</network>
```


上記インタフェースは自動的に定義されて起動するように設定されていますが、無い場合は手動で定義して起動設定をしてあげる必要があります。

# virbr0 を定義して有効化する 
まずvirbr0 が有効化されているか確認します。
確認するには`virsh net-list` コマンドを実行します。


```console:virshnet-list
# virsh net-list --all
 Name                 State      Autostart     Persistent
----------------------------------------------------------

```


上記のように何も表示されていない場合はvirbr0 が定義されていません。
定義されていない場合は以下のようにコマンドを実行することでネットワークを設定します。


```console:virshnet-define<filename>
# virsh net-define /etc/libvirt/qemu/networks/default.xml
Network default defined from /etc/libvirt/qemu/networks/default.xml

# virsh net-list --all
 Name                 State      Autostart     Persistent
----------------------------------------------------------
 default              inactive   no            yes

# virsh net-start default
Network default started

# virsh net-autostart default
Network default marked as autostarted

# virsh net-list --all 
 Name                 State      Autostart     Persistent
----------------------------------------------------------
 default              active     yes           yes
```


以上で`virbr0` の設定は完了です。
ip a コマンドを実行してインタフェースが表示されるようになったことが確認できると思います。


```text
# ip a
.....
3: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default qlen 1000
    link/ether 52:54:00:xx:xx:xx brd ff:ff:ff:ff:ff:ff
    inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0
       valid_lft forever preferred_lft forever
.....
```
Sphinxで作ったHTMLドキュメントをGithubに公開する手順メモ

# Githubで静的コンテンツの公開

Github(github.io)で静的コンテンツを公開する場合は `master branch` の直下か `master branchの/docs` 配下にhtmlファイルを設置して公開設定するだけです。
ここでは、Sphinxで作ったHTMLドキュメントを `/docs` 配下に設置して公開設定する手順をメモで残しておきます。

# 手順

https://sky-joker.github.io/github_sphinx_example/
アジャイル開発で使えるツール



使ったことあるものは"◯"
プロジェクト利用経験があるものには"☆"を付けてます。

特に評価という感じではなく、プロジェクトやチームにフィットしたものを選んでもらえたらと思います。

## プロジェクト管理ツール

- Redmine ☆
    - pluginを色々追加することが出来る
    - カンバンのフォントが小さくて、タスクが一度にたくさん見れる
    - カレンダーなども連携してスケジュールも同時に見れる
    - ガントチャートにも表示できる
    - そろそろ時代を感じる
    - スプリント方式で使うとバックログ画面は若干使いづらい
- JIRA ◯
    - プロジェクトでは使ったことない、古いバージョンで少し触ったことがあるだけです。
    - 大きなプロジェクト用なのが分かる感じで階層化が凄い
    - 権限管理などもしっかりしている
    - エピックバーンダウンという機能が凄く使ってみたいのだけど、触ったバージョンが古かったみたいで無かった(秀逸っぽいきがする)
    - 入力項目が多くて煩雑
    - 気軽にチケットを記入してもらえないかも
- Trello ◯
    - カンバン方式で凄くシンプルで使いやすい
    - 沢山やりたい事があるときにはスイムレーンなどが設定出来ないので向かないかも
    - シンプルなタスク管理には向いていると思う
    - 個人タスク管理に使っている
- Wrike ◯
    - タスクの階層化が出来る
    - ガントチャートなども見れて、結構簡単にいじれる
    - しっかりスケジュールを管理したい人よう？
- asana ◯
    - タスクの階層化が出来る
    - ドキュメントツール系との連携が強そう
    - シンプルにTODO管理できる
- Wekan
    - シンプルなTrelloより更にシンプルらしい
- Restyaboard
    - Trelloをもうちょっと機能追加していったものらしい
- scrumwise ☆
    - かんばんとスクラムの両方の使い方が出来る
    - カンバンだけだと微妙
    - スクラム方式で使う場合は完全にスクラム方式で回す感じになる。スプリントのタイムボックスを作らないと何も出来ない
    - 今のプロジェクトで使っていますが割といいかなと思っています
- scrummate
    - scrumwiseと同じくスクラム前提の進め方をすることで真価を発揮する感じ
    - スクラムを回すにはなかなか使いやすい
    - チケットへの直接のURLを使うことが出来ないっぽくて厳しい
- Taiga ◯
    - かんばん方式とスクラム方式の両方の使い方が出来る
    - ストーリーなどを作ってすすめるので、かんばん方式でもスクラムのさわりくらいの形になる
    - 見た目はモダン
- ProjectPlace ☆
    - カンバン方式
    - 横に区切るスイムレーンを設定できるので、複数の開発ラインなどでカテゴリを区切りやすい
    - ストーリーベースでスイムレーンを設定できるツールは多いが、カテゴリっぽくスイムレーンを設定できるのは少ないので、これがマッチするプロジェクトはあるかも
    - 以前のプロジェクトで使っていました


#### プロジェクト管理ツールまとめ
プロジェクト管理と言ってもカンバンだけで良いカジュアルなプロジェクトから、しっかり１０人以下のチームでスクラムを回したいとか、もっと大規模チームで情報をシェアしながらやりたいとか色々あると思います。
スクラムが全くわからないのにスクラムベースのツールだけ導入してもカンバンしか使わない状態になってしまうかもしれません。
アジャイルの導入であれば、カンバン慣れしたチームにしてから、スクラムを導入する方が良いかもしれません。

## ドキュメント管理ツール

- Wiki ☆
    - 有名すぎるので語りません。ググって
- Github Wiki ☆
    - ソースコードを管理している場所と揃えて管理できるのは便利
    - ちょっと機能不足を感じるところも多く、不便なところも
    - リポジトリが複数になったときに逆に管理がばらばらになるので、機能不足のデメリットが大きくなる
- Confluence ◯
    - JIRAと同じアトラシアンのツール
    - 豊富なWYSIWYGによる操作などが出来る。これは何気に便利。
    - 重いらしい (重いから使ってない)
- esa.io ☆
    - 階層表現でドキュメントを管理できる。階層設計が重要
    - PlantUMLが使える
    - 現在のプロジェクトと前のプロジェクトで使っていました
- Kibera ◯
    - esa.ioの後発。もっと掲示板っぽい
    - 日報などを書くブログみたいなものと、残す記事を書くwikiみたいな区切りがある
    - どんどん開発されているみたい
- Qiita:team ☆
    - 階層でドキュメントを管理できず、タグによって管理する
    - タグ設計が重要。もしくは検索で引っかかるためのキーワードを記事に散りばめておく
    - みんなも使ってるこのQiitaのチームコラボレーション用のツール
    - Qiitaとほぼ同じインターフェイスなので使用感などは分かりやすい
- docbase 
    - シンプルで便利らしい
    - 詳しく知らない。ごめんなさい

## ドキュメント管理ツールまとめ
PlantUMLは書くのに文法を覚えなければならず、クセがありますが、気軽に図をかける上に、差分なども分かるメンテナンス可能なドキュメントになるので、個人的に好きでした。
階層型とタグ型の管理は好みの問題なのかなーと思います。どちらも定期的にメンテナンスしないど、ドキュメントのカテゴリ管理がちりじりになります。
旧来のWikiだけでも良いのですが、最近のものだとslackなどに通知連携していて気軽に見られるようになるのでよいですね。ドンドン使いやすいものを導入していきましょう。


# まとめ
自分のチームやプロジェクトにあった機能を選べるように開発マネージャはこのような情報をチェックしておけると良いですね。開発マネジメントに興味がありますって言うのであれば、海外ツールはまだしも日本でメジャーなツールは押さえておきたいです。

開発マネジメントではツールはいつも課題感を持っています。
最近はスプレッドシートが便利すぎですね。

何か良さげなツールがあったらぜひ教えて頂きたい！
PACEMAKER > Motion + crontab > 「その日の帰宅時刻」にファイルを作る

```txt:動作環境
Raspberry Pi 2 Model B (以下RPi)
Raspbian Jessie
Python 2.7.9
```

プロジェクト開始: [link](https://qiita.com/7of9/items/6aa0ea8b3a4fc802ca61)

### 処理概要

「その日の帰宅時刻」にファイルを作りたい。

以下とした。

- 特定の時刻に/tmp/capture_motionファイルを削除
    - 例: 12:30
- Motionを使って以下の処理トリガとする
    - /tmp/capture_motionが
        - なければ: 作る
        - あれば: 何もしない

上記の例では12:30以降にカメラの前を横断した時、「その日の帰宅時刻」のファイルが作成される。
その後のカメラ横断に関しては、ファイルに対して何もしない。

### Motionのセットアップ

[Raspberry Pi > 動体を検知したら、"Rear Center"という音声を流す](https://qiita.com/7of9/items/e5c5ee22f0a156833d71)

以下のように設定した。

```/etc/motion/motion.conf(一部)
on_picture_save python /home/pi/MOTION/welcomeBack_171105.py
```

```/home/pi/MOTION/welcomeBack_171105.py
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
import os.path
import time
from datetime import datetime as dt

"""
v0.1 Nov. 05, 2017
   - touch file
   - read file datetime
"""

filepath = "/tmp/capture_motion"
if os.path.exists(filepath):
    mddt = time.ctime(os.path.getmtime(filepath))
    print(mddt)
else:
    with open(filepath, 'a'):
        os.utime(filepath, None)

```

上記の関連: https://qiita.com/7of9/items/9c537d1beb8e83bb20af


```/etc/rc.local(一部)
## for PACEMAKER (05, Nov. 2017)
motion -c /etc/motion/motion.conf
```

Motionに関してはdaemon起動の設定や、output_pictures off設定など試したが、うまくいかなかったので、`/etc/rc.local`での起動と、on_picture_saveイベントでの処理としている。

### cronの設定

```/etc/crontab(一部)
# PACEMAKER (Nov. 5, 2017)
30 12 * * * root rm /tmp/capture_motion
30 12 * * * root rm /tmp/motion/*.jpg
```

`/etc/init.d/cron start`にてcron設定しておく。

### TODO

- `/tmp/capture_motion`の時刻を見て疲れの判断基準とする
    - 早い帰宅
        - 疲れてない
    - 遅い帰宅
        - 疲れている

### 備考

当初、cronにてファイル削除でなく再起動の設定をしていた。
再起動の設定をしておくと、将来別のソフトを走らせて処理中に再起動でトラブりそうなので、ファイル削除に変更した。

### 動作確認
(追記 2017/11/07)

昨夜帰宅後、`/tmp/capture_motion`を確認したところ、帰宅時刻のファイルとなっていた。

`/tmp/motion/`以下にjpgファイルが大量にできる点は要改善点。
PEファイルのバイナリ構造(2) IMAGE_DOS_HEADER

# IMAGE_DOS_HEADER

PEファイルの先頭には「IMAGE_DOS_HEADER」構造体が格納されています。
細かい定義はヘッダファイルを検索して貰うとして、重要なメンバ変数は以下の2つになります。

|メンバ||
|:--|:--|
|e_magic|固定の値「MZ」が指定されている。IMAGE_DOS_SIGNATUREとして定義。|
|e_lfanew|拡張ヘッダへのオフセット値（バイト単位)|

まずはe_magicをチェックして正しいファイルであるかどうかを確認、e_lfanewで次の構造体へのアクセス位置を確認します。
この段階ではまだアドレスとファイルポインタの値は一致しているので、そのままアクセスできます。

```cpp:
IMAGE_DOS_HEADER& tDOS = (*(IMAGE_DOS_HEADER*)pFile);
if( tDOS.e_magic != IMAGE_DOS_SIGNATURE ){ return false;}
```

次はIMAGE_NT_HEADERSの解析に入りますが、この辺りから少し面倒な処理が入ってきます。
API Gateway のリスポンスヘッダーのカスタマイズ (Python3)

次の記事のプログラムは Node.js で書きましたが、それを Python3 に書き換えました。
[API Gateway のリスポンスヘッダーのカスタマイズ (Node.js)](https://qiita.com/ekzemplaro/items/72a18ec601846d227102)

```py3
# -*- coding: utf-8 -*-
#
#					Nov/5/2017
#
# --------------------------------------------------------------------
import sys
import json
 
# --------------------------------------------------------------------
def py01_handler(event, context):
	sys.stderr.write("*** py01_handler *** start ***\n")
#
	aa = 0
	bb = 0
	cc = 0
#
	sys.stderr.write("Received event.body: " + json.dumps(event) + "\n")
	if ('body' in event):
		json_str = event['body']
		unit_aa = json.loads(json_str)
		if ('aa' in unit_aa):
			sys.stderr.write("aa = " + str(unit_aa['aa']) + "\n")
			aa = int(unit_aa['aa'])
#
		if ('bb' in unit_aa):
			sys.stderr.write("bb = " + str(unit_aa['bb']) + "\n")
			bb = int(unit_aa['bb'])
#
		if ('cc' in unit_aa):
			sys.stderr.write("cc = " + str(unit_aa['cc']) + "\n")
			cc = int(unit_aa['cc'])
#
	version = "Nov/5/2017 PM 20:43"
#
	sum = aa + bb + cc
#
	sys.stderr.write("version = " + version + "\n")
	sys.stderr.write("sum = " + str(sum) + "\n")
	sys.stderr.write("*** py01_handler *** end ***\n")
#
	body = {}
	body['aa'] = aa
	body['bb'] = bb
	body['cc'] = cc
	body['sum'] = sum
	body['version'] = version
	body['language'] = 'Python'
#
	rvalue = {}
	rvalue['statusCode'] = 200
	headers = {}
	headers["X-Custom-Header"] = "Shimotsuke " + version
	headers["X-Powered-By"] = "Python3"
#        headers["Status"] = "200 OK"
	headers["Status"] = "401 Unauthorized"
	rvalue['headers'] = headers
	rvalue['body'] = json.dumps(body)
#
#
	return rvalue
#
# --------------------------------------------------------------------
```
Drupal7で最初に入れておきたいモジュール（コマンド付）

#概要
よく使うから標準で入れておきたいなと思うモジュールをまとめてみました
ディストリビューションにすればいいのだろうけど、作るのも管理するのも面倒なのでDrushコマンドでモジュールをインストールだけにしました

特にバックグラウンドで動くモジュールは入れ忘れが起こるのでまとめたくなりました

想定している構築方法はブートストラップとDisplay Suiteモジュールを使ってビューモードを設定して構築します。
ランディングページのみPage ManagerモジュールとPanelsモジュールで構築します

基本的に自分がどのサイトでも使ってるなーというモジュールを集めています

#コマンド
```
drush dl admin_menu adminimal_admin_menu ckeditor ckeditor_media ctools date ds entity entitycache entityreference field_group file_entity globalredirect google_analytics inline_entity_form jquery_update libraries link media metatag module_filter panels pathauto rules shield simplify smtp token token_tweaks views views_bootstrap bootstrap adminimal_theme
```
```
drush en admin_menu adminimal_admin_menu ckeditor ckeditor_media ctools date date_api date_popup ds ds_ui entity entity_token entitycache entityreference field_group file_entity globalredirect googleanalytics inline_entity_form jquery_update libraries link media media_wysiwyg metatag metatag_opengraph module_filter panels page_manager pathauto rules rules_admin rules_scheduler shield simplify smtp token token_tweaks views views_ui views_bootstrap
```

#解説
Display SuiteモジュールとBootstrapで構築していきます
基本的にはノードとタクソノミー、Viewsでページを作成します

DSプラグインのクラスの設定は最近Field Formatter CSS Classモジュールが上手く動作しないので、テーマ内でpreprocess_fieldを作成して調整してます
（使えそうなら、Field Formatter CSS Classモジュールが好ましいです）

トップページ等のランディングページはブロックでごちゃごちゃするのでPanelsモジュールとPage Managerモジュールで対応します

後はよく使うフィールドのDateとLink
PathautoやGlobalredirect、Metatag、Google Analytics等のSEO対策のものを入れてあります

Drushコマンドを変えるだけなので、良かったら自分の使いやすいように調整してみてください
PEファイルのバイナリ構造(1)

# この記事の目的
Windowsの実行ファイル形式であるPEファイル（Portable Executable、EXE、DLL等）を直接解析、エクスポート関数、インポート関数、バージョン番号を取り出すことを目的とします。

# PEファイルとは
PE(Portable Executable)ファイルとは、Windowsの実行ファイルで採用されているファイル構造。
Windowsで有名ではあるが、構造自体はOSには非依存のためLinuxカーネル等でも使用されています。
参考：[Wikipedia「Portable Executable」](https://ja.wikipedia.org/wiki/Portable_Executable)

# 基礎知識

以下に解析していく上で最低限把握しておくべき基礎知識を解説しておきます。

## 相対仮想アドレス(RVA、Relative Virtual Address)

PEファイル内で各情報へアクセスする際、その位置を示す為にアドレス値を使用します。
このアドレスは「PEファイルが実行ファイルとしてメモリ上に読み込まれた先頭位置からの相対的なアドレス」を示していて、これを相対仮想アドレス(RVA、Relative Virtual Address)と呼びます。
長いので以後この値に関しては「RVA」もしくは「アドレス」と呼称します。

## ファイルポインタ

今回はPEファイルを実行ファイルとしてメモリ上に読み込む（LoadLibrary等）のではなく、ファイルをBYTE単位のバイナリ情報として直接読み込んで解析していきます。
以後このバイナリ情報としての位置に関しては「ファイルポインタ」もしくは「ポインタ」と呼称します。

## Memory Mapped File

ファイルをバイナリとして解析する際、seek等で読み込み位置を移動させてからメモリ上に読み込んだりすると微妙に手間がかかります。
一旦メモリ上に全て読み込むとそう言う手間は省けるのですが、こう言う時にはあたかもファイルをメモリの様に扱える「Memory Mapped File」という手法が便利です。

使い方は比較的簡単ですので、以下にサンプルコードを載せておきます。

```cpp:
CFile hFile;
hFile.Open( szFile , CFile::modeRead | CFile::typeBinary );
HANDLE hMapping = CreateFileMapping( hFile , NULL, PAGE_READONLY , 0 , 0 , 0 );
BYTE* pFile = (BYTE*)MapViewOfFile(hMapping,FILE_MAP_READ,0,0,0);
//途中の処理
CloseHandle(hMapping);
```

これでpFile[]の添え字をファイルポインタとしてファイルの中身にアクセス出来る様になります。

次からは実際のファイルの解析に入っていきます。
スマホアプリのサーバーサイド構成のパターン


## 取りうるパターン
* クラウドサービスを使う
	* MBaas
* 自前のサーバーを用意する
	* VPS
	* AWS

今回はMBaasを主に使うケースについてまとめた。

# サーバーサイド環境を用意すると嬉しいこと
## リモートプッシュ通知が実装できる
* アプリがアップデートされた時、毎日オススメの記事をプッシュ通知で送るなどの施策はサーバーサイド側の用意が必要

### 実現手段の候補
* Firebaseで管理画面から送る
* Firebase + 自前サーバーで特定タイミングで送る

## アプリ共通の設定ファイルを用意することで細かい調整を行える
* 広告の表示のON/OFF
* キャンペーンの表示ON/OFF

### 実現手段の候補
* S3のバケットに設定ファイル(yaml,json)を設置
* Dropboxに設定ファイル(yaml, json)を公開
* 設定用のDBをMBaasや自前サーバーに用意

## アプリのログを取得することができる
* ある機能をユーザーが利用する時にどういう動線からその機能を訪れているかを計測できる
* モバイルアプリの画面で何を切り捨てるかという判断にも有用

### 実現手段の候補
* Google Analyticsにイベントを送る
* Firebaseにイベントを送る

## アプリをアンインストールしても状態を保存しておける
* アプリをアンインストールしても情報を復旧してあげることができる

### 実現手段の候補
* ユーザーアカウントの機能を作ってサーバーにデータを保存する
* UUIDを発行して1端末=1ユーザーで認識できるようにする (ログイン不要)

## アプリのクラッシュレポートをとる
* アプリが想定しないエラーでクラッシュしてしまった時にすぐわかるようにする

### 実現手段の候補
* FirebaseのCrash Reportingを使う
	* CrashlyticsがFirebaseに統合されたのでデファクトスタンダードになりそう
* Bugsnagを使う
* Newrelicsを使う

## ユーザー同士のコミュニケーション機能を作る
* ランキング機能、リアルタイムチャット機能など

### 実現手段の候補
* 単純なチャットやランキング機能だけなら自前サーバー無しでもできそう
	* ランキング: Google App Script + Lamda
	* チャット機能: Firebase
* この辺は知見がないので知りたい

## 結論
* 個人でアプリを新しく作る時はサーバー側はMBaasでも十分そう
* 人気が出てきてから、自前サーバーの構成に移行すればいいのではないか
* スマホアプリに必要なサーバーサイドの機能には特殊なものはそんなにないなという印象だった
ダイアログで複数ファイルを選択して除算・保存

最終的にデータを渡すときには計算式が無い状態で渡す必要がある場合(ないかな？)を仮定して、すべてのファイル、その各ファイルのすべてのシートを処理します。

Sub dialog()
Dim sfname As Variant '選択ファイル
Dim rfname As Variant '呼び出しファイル
Dim path_name As String 'ファイルパス
Dim wb As Workbook 'ファイルとして処理するための変数
Dim i As Long 'ワークシートのカウント用変数
Dim e As Long 'エンドの意味。最後のワークシート

path_name = ThisWorkbook.Path
ChDir path_name

'ダイアログで複数シートを選択可能に設定
sfname = Application.GetOpenFilename(filefilter:="選択ファイル,*.*", MultiSelect:=True)

'配列として判定
If IsArray(sfname) Then
For Each rfname In sfname
Set wb = Workbooks.Open(rfname)
ここから各シートの処理
'#################
    e = wb.Worksheets.Count
    For i = 1 To e
まずシートを選択
    wb.Worksheets(i).Select
選択したシートのすべてのセルを選択してコピー＆値を貼付け
    wb.Worksheets(i).Cells.Select
    Selection.Copy
    Selection.PasteSpecial Paste:=xlPasteValues, _
　　Operation:=xlNone,SkipBlanks:=False, Transpose:=False
    wb.Worksheets(i).Cells(1, 1).Select
    Next
'##################
ファイルの保存方法の画面を非表示にして処理の中断を防止
Application.DisplayAlerts = False
wb.Close savechanges:=True
Next
End If
End Sub