OmniAICreator/Qiita-1.07M huggingface dataset:
3. Amazon AlexaのCustom Slot Typesを設定する

# 連載記事
前後関係があるため順番に読んでもらえると分かりやすくなっています。

[1. Amazon AlexaとFire TVでHello Worldを試してみる \- Qiita](https://qiita.com/tochi/items/4da38b02b424926d1095)
[2. Amazon Alexaで音声から引数を受け取る \- Qiita](https://qiita.com/tochi/items/f96ca5979ec2ea6387d8)
[3. Amazon AlexaのCustom Slot Typesを設定する \- Qiita](https://qiita.com/tochi/items/a0342f0882b2c642d40c)
[4. Amazon AlexaからHerokuのRailsにつなぐ \- Qiita](https://qiita.com/tochi/items/183658fabd1416028065)
[5. Amazon Alexaで会話を続ける（セッションを引き継ぐ） \- Qiita](https://qiita.com/tochi/items/ec613355e4f5913a8755)
[6. Amazon Alexa のスキルを日本語化する \- Qiita](https://qiita.com/tochi/items/682adf708bb7fd0f1ca9)
[7. 自作した日本語のAlexa SkillをEcho dotで動かす \- Qiita](https://qiita.com/tochi/items/db9542e191bbdb7f77c2)

# はじめに
前回はSlotを使って入力音声のテキストを引数としてプログラムに渡しました。
今回は引数の型にあたるSlotを独自のものに置き換えてみます。
Slotについては前回の記事を参考にしてください。

[Amazon Alexaで音声から引数を受け取る \- Qiita](https://qiita.com/tochi/items/f96ca5979ec2ea6387d8)

Custom Slot Typesを定義する
---

SlotにはAmazonが定義した型が複数準備されていますが、この型を独自に定義することができます。
今回は独自定義のCustom Slot Typesを設定します。まずはいつも通りAlexaの開発者ポータルに行きます。

[Amazon開発者ポータル](https://developer.amazon.com/ja/)

Interaction ModelのCustom Slot TypesのEnter Typeに`JP_FIRST_NAME`と入力します。
これがCustom Slot Typesの型名になります。
その下の`Enter Values`に定義内容を行ごとに入力します。
今回は日本人のよくある名前を値として定義します。

``` EnterValues
tarou
hanako
tochi
```

最後に右横の「Add」ボタンを押すとCustom Slotとして追加されます。

Intent SchemaをCustom Slot Typesに変更する
---

後はIntent SchemaのSlot TypeをCustom Slot Typeで指定した型名に変更します。

``` IntentSchema
{
  "intents": [
    {
      "intent": "HelloWorldIntent",
      "slots": [
        {
          "name": "firstName",
          "type": "JP_FIRST_NAME"
        }
      ]
    }
  ]
}
```

じつはコレだけでCustom Slot Typeの設定は完了です。
設定後の画面はこんな感じ。

![スクリーンショット_2017-09-09_20_23_29.png](https://qiita-image-store.s3.amazonaws.com/0/4529/c0d10e6b-6b57-c076-450c-031ac7c4aa88.png "スクリーンショット_2017-09-09_20_23_29.png")

疑問
---
ただ、色々と検証をしていると何故か登録していない名前でも結果が返ってくることがあります。
DefaultのSlotがあって、Custom Slotはそれに追記する形なのか？調べてみたんですがわかりませんでした。
知っている方がいればぜひコメントで教えてください。

結果
---

僕「Tell hello world hello my name is Tarou」
Alext「Hello world Tarou」

Let's enjoy Alexa.
Ruby でクラスのソースを表示するコード

rubyにはメソッドのソースを取得する [method_source](https://github.com/banister/method_source) というgemがあるのですが、これのクラスバージョンもあったら便利かも？と思って書いてみました。

```rb:class_sources.rb
module ClassSource
  @lines_for_file = {}
  @locations = Hash.new { |h, k| h[k] = [] }
  @pos_stack = []

  TracePoint.trace(:class, :end) do |tp|
    next if tp.self == ClassSource
    @lines_for_file[tp.path] ||= File.readlines(tp.path)

    case tp.event
    when :class
      @pos_stack << tp.lineno - 1
    when :end
      from, to = @pos_stack.pop, tp.lineno - 1
      content = @lines_for_file[tp.path][from..to].join
      @locations[tp.self] << { path: tp.path, from: from, to: to, content: content }
    end
  end

  def self.locations(klass)
    @locations[klass]
  end
end

class Object
  def source_locations
    ClassSource.locations(self)
  end
end

class A
  def say
    "hi"
  end
end

A.source_locations.each do |data|
  puts "#{data[:path]}##{data[:from]}"
  puts "-" * 30
  puts data[:content]
  puts "-" * 30
end
```

出力

```
class_sources.rb#30
------------------------------
class A
  def say
    'hi'
  end
end
------------------------------
```

TracePoint が実行される前のクラス定義は無視されてしまうのが難点です。
(初心者向け)Swift3.0で初アプリ - AlamoFireを使ってみる

Swift3.0を使って簡単なiPhoneアプリを作ってみます
[(初心者向け)Swift3.0で初アプリ - CocoaPods, Carthagoを使ってみる](https://qiita.com/egplnt/items/80760f5c6a009e109876)でAlamoFireを使えるようにしました

#1.AlamoFireを使ってみる
-　以下のようなコードを使ってAlamoFireを使ってみます
-　ViewController.swiftに以下をコピペします

```swift:AlamoFireを使ってみる
import UIKit
import Alamofire
import SwiftyJSON

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        let urlJson = "https://ntp-a1.nict.go.jp/cgi-bin/json"
        let urlTime = "https://ntp-a1.nict.go.jp/cgi-bin/time"

        Alamofire.request(urlJson).responseJSON{ response in
            print(response)
        }
        
        Alamofire.request(urlTime).response{ response in
            print(response)
        }
    }

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


}


```

- Simulatorで稼働させると、コンソールに下記のようにNICTから取得された時刻が表示されます

<img width="487" alt="スクリーンショット 2017-09-19 12.18.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/125842/9c2e8a9c-b7f7-d9da-efa3-2a501c454947.png">
(初心者向け)Swift3.0で初アプリ - CocoaPods, Carthagoを使ってみる

Swift3.0を使って簡単なiPhoneアプリを作ってみます
外部のサイトから情報を取得するなど、様々な道具やライブラリを使えるようにするため、CocoaPodsとCarthageを使ってみます

#1. CocoaPodsを使ってみる
- [【Swift】CocoaPods導入手順](http://qiita.com/ShinokiRyosei/items/3090290cb72434852460)などを参照してCocoaPodsを使えるようにします
- 練習のため、SVProgressHUD　を導入してみます
- Xcodeの起動は、いつもの`xcodeproj`ファイルではなく、`xcworkspace`ファイルをダブルクリックする点に注意します

<img width="380" alt="スクリーンショット 2017-09-19 11.11.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/125842/0c1bcba5-0176-cb8c-7d86-95f87f30d7b7.png">

- 練習のため、AlamoFireを導入してみます。。。うまくいかない場合、下記のCartheageでのAlamoFireのインストールを試みます

#2. Carthagoを使ってみる
- [Carthageを使ってビルド時間を短縮しよう](http://qiita.com/yutat93/items/97fe9bc2bf2e97da7ec1)などを参照してCarthageを使えるようにします
- 練習のため、AlamoFireを導入してみます
GitHubのREADMEの目次を作ったりするChrome extension

GitHubで長いREADMEをじっくり読み込むとき、目次が欲しくなることがしばしばあります。なのでChrome extensionを作ってみました。

https://github.com/y-takey/kukkoro

# 機能

機能はシンプルですが2つあります。

1つ目は、↓のようにページ右部にREADMEの目次を表示します。h1 - h5タグをみて見出しの収集＆インデントを付けているだけです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/25588/18b79e95-e078-4936-9ebd-133df77a264e.png)

2つ目は、ソースコードを読む際のブックマーク的なものです。行番号をクリックすると、その行が履歴に溜まっていきます。たとえば関数や変数の宣言場所をブックマークして、行き来しやすくすることが目的です。（ちなみに最初は、それらの場所を正規表現で抜き出して、あらかじめ表示しようかと思いましたがパターンが多くて断念しました。。。）

![image.png](https://qiita-image-store.s3.amazonaws.com/0/25588/f2fa265d-1c42-d23e-96cd-1d54a773a038.png)



# インストール

以下のwebstoreから追加してください。

https://chrome.google.com/webstore/detail/kukkoro/dngmmnfbdkjdnblljongbpjcldpafbli
ansibleでdocker_serviceを使った時に Error: cannot import name splitdrive が出た時の対応

ansibleからdocker-composeを呼び出せるdocker_serviceをテストしたときに遭遇した問題です。

playbookを実行すると

> Error: cannot import name splitdrive 

と表示され何日もはまりました。

ansible 2.3 と docker-compose 1.16 は 相性問題があったのでdocker-composeのバージョンを1.15にすることで対応しました。



```yaml:playbook.yml
    - name: Installing docker compose
      pip:
        name: docker-compose
        # ansible 2.3 と docker-compose 1.16 は 相性問題がある
        version: 1.15.0
        state: present
```

ただ、この問題は最近リリースされたansibleを2.4にすることで[解消](https://github.com/ansible/ansible/issues/29498)されているのでansibleのバージョンをあげれば遭遇しません。

[github サンプル](https://github.com/va034600/sample-server/tree/master/ansible/docker-compose-service-install)
ruby をコンパイルしてテストを実行するまでのメモ


基本的にはここを読めばOK

- https://github.com/ruby/ruby/blob/trunk/doc/contributing.rdoc#running-tests

# コンパイルする

https://github.com/ruby/ruby/blob/trunk/doc/contributing.rdoc#running-tests の

> Generate the configuration files and build

に添って実行

```.shell-session
cd ruby-trunk
autoconf
mkdir build && cd build # its good practice to build outside of source dir
mkdir ~/.rubies # we will install to .rubies/ruby-trunk in our home dir
../configure --prefix="${HOME}/.rubies/ruby-trunk"
make up && make install
```

configure については、homebrew で openssl をインストールしている場合、以下のようにする

```.shell-session
../configure --prefix="${HOME}/.rubies/ruby-trunk" --with-openssl-dir="$(brew --prefix openssl)"
```

# テスト実行

`make test` で、テストに必要な `-test-` ディレクトリが生成される

```.shell-session
make test
make test-all
```

一部のテストだけ実行したい場合


```.shell-session
make test-all TESTS=../test/csv/ts_all.rb
```
エンジニアになりたい!! ITスクール講師が教えるエンジニアへの近道とは

# ロジックを組み立てる
私たちは、毎日生活の中でロジックを組み立てています。

例えば・・・
・アラームが故障していて寝坊⇒**どうする** :interrobang:
・いつも通学・通勤で使用している電車が信号機故障により大幅遅延⇒**どうする** :interrobang:
・携帯電話の充電をし忘れ連絡が取れない⇒**どうする** :interrobang:

極端な例を出してしまいましたが、判断を求められて筋道を立てることはありますよね。
「**信号を渡る**」という行動も筋道が必要です。

**【信号を渡る】**
![信号チャート.png](https://qiita-image-store.s3.amazonaws.com/0/196312/f24462db-5da7-40cb-4875-bc3901f470a7.png)


上記では、2パターンのフローチャートを作成してみました。(どちらも同じ処理の流れですが)

ヒトの考えでは、その場の判断で臨機応変にということができますが、コンピュータへの命令はそうはいきません。
冗長的な処理を無くし、的確なロジックを考えなければならないのです。

日常生活の中にも様々なロジックが溢れかえっていますので、
意識して筋道を考えることで、**ロジックを組み立てる力**が自然と付いてきます。

#「Why it so?」の考え方
ロジックを組み立てていく中で、判断に迷う時も多々あります。その決断をするには、様々なロジックパターンを貯めておく必要です。
ただし、すべてのロジックパターンを覚えている必要はありません。
常に「**Why it so?**(どうしてそうなる？)」と掘り下げていきながら、調べることが重要です:books:
全てのプログラミング言語や便利なAPIを覚えているなんて方はいません。(いらっしゃったら、すみません・・・:pensive::pensive:)
あるキーワードを元に調査をしながら進めることが通常です。
気になることに対して、調べてみるというクセを付けておくと役に立ちます :bangbang:(これはエンジニアに限らず)
ぜひ、「**Why it so?**」の考え方をもって、調査力鍛えましょう！


# 「try and error」を続けること
「try and error」は和製英語なので、正確には「**trial and error**」ですが、
プログラムを組んだり、ドキュメントを作成したりしていても、1発で上手くいくことなんてほぼありません:frowning2:
試行錯誤して、完成を目指して繰り返すことが重要です。
エンジニアになるために、プログラム言語を事前に勉強する方もいると思いますが、
エラーを怖がって考え込んでしまう時間がもったいないですので、どんどんプログラムを書いて、どんどん動かしましょう！

# さいごに
先日の投稿でも書きましたが、英語だけはアレルギーを出さずに慣れておきましょう！
**Let's become accustomed to English!!**:smile:
最近の個人的スタディフロー(at Web)まとめ。

最近の個人的スタディフロー(at Web)まとめ。

---

- 調べもの or 人気記事の定期チェック([@hatebu](https://twitter.com/hatebu)とか[@qiita](https://twitter.com/Qiita)とか)など

　　↓

- タブが溜まってきたら、[@OneTab](https://twitter.com/OneTab)でひとまとめに

　　↓

- 不要なものは削除
- 後で読むもの・メモするものは再オープンして[@Pocket](https://twitter.com/Pocket)と[@evernote](https://twitter.com/evernote)へ

　　↓

- 風呂で、外で、寝ながら、やることない時にだらだらと[@Pocket](https://twitter.com/Pocket)の気になる記事読み
- メモしたいものは星付けして、あとで[@evernote](https://twitter.com/evernote)メモ

　　↓

- [@evernote](https://twitter.com/evernote)で検索
- [@evernote](https://twitter.com/evernote)でさらっとたまに復習（← 理想。ほとんどできてない）

---

[@Pocket](https://twitter.com/Pocket)に入れた中でも気になる記事しか読まないので、記事に追われる感じはほとんどありません。
自然に優先度の高いものから読むので、効率もいいと思います。
[@evernote](https://twitter.com/evernote)の復習はほとんどできてませんが、過去に調べた内容の検索をする事はあるので、一応メモしています。



変化があったら、更新するかもしれません。
その他、おすすめのツール、フローがありましたら、コメントいただけるとありがたいです。
phpのスーパーグローバル変数+curlコマンド 簡単にまとめてみた

apiを叩きにいくときやajaxのテストなどで生のcurlコマンドを実行することが多かったので簡単にまとめてみました。

php側では対象のスーパーグローバル変数をvar_dumpして出力しているものとします。

###$_GET

```:unix
$ curl "http://test.com/?id=1"
```
```:出力
array(1) {
  ["id"]=>
  string(1) "1"
}
```

###$_POST

```:unix
$ curl "http://test.com/" -X "POST" -F "id=1" -F "name=manato"
```
```:出力
array(2) {
  ["id"]=>
  string(1) "1"
  ["name"]=>
  string(6) "manato"
}
```

###$_FILES

```:unix
$ curl "http://test.com/" -F "uploaded_image=@test.jpg"
```
```:出力
array(1) {
  ["uploaded_image"]=>
  array(5) {
    ["name"]=>
    string(11) "test.jpg"
    ["type"]=>
    string(10) "image/jpeg"
    ["tmp_name"]=>
    string(14) "/tmp/php9Hmedz"
    ["error"]=>
    int(0)
    ["size"]=>
    int(234601)
  }
}
```

コマンドを実行したディレクトリに画像がなかったりファイル名が間違っているとこんなエラーが出ました。

```
curl: (26) couldn't open file "test.jpg"
```


###$_COOKIE

```:unix
$ curl "http://test.com/" -H 'Cookie: user_id=1'
```
```:出力
array(1) {
  ["user_id"]=>
  string(1) "1"
}
```

###$_SERVER

```:unix
$ curl "http://test.com/" -H 'token: testtest'
```
```:出力
array(29) {
 (省略)
  ["HTTP_TOKEN"]=>
  string(8) "testtest"
}
```

curlコマンドのオプション-Hはヘッダー情報を付加できますが
それをphp側で受け取るには$_SERVER['HTTP_XXX']で取得できるようです。(XXXは指定した文字列の大文字)

なので上の例だと`HTTP_TOKEN`となります。

また、`$_COOKIE`のコマンドを打った際もvar_dump($_SERVER)の結果はこうなっていました。

```:出力
array(29) {
 (省略)
  ["HTTP_COOKIE"]=>
  string(10) "userid=78C"
}
```

ヘッダー情報の一つなので$_SERVERにも入っているということですね。


###まとめ

上から順に`$_GET`, `$_POST`, `$_FILES`, `$_COOKIE`, `$_SERVER`のコマンドです。

```
$ curl "http://test.com/?id=1"
$ curl "http://test.com/" -X "POST" -F "id=1" -F "name=manato"
$ curl "http://test.com/" -F "uploaded_image=@test.jpg"
$ curl "http://test.com/" -H 'Cookie: user_id=1'
$ curl "http://test.com/" -H 'token: testtest'
```

```
-Hオプションの結果は$_SERVER['HTTP_任意の文字列大文字']で取得可能。
$ curl "http://test.com/" -H 'age: 20'
echo $_SERVER_['HTTP_AGE']; // => 20
```

以上、簡単にcurlコマンドについてまとめました。
ffmpegでm3u(m3u8)を一つの動画に結合する方法

ちょっと私用でm3u8を結合する必要に迫られたのでメモ

# 結論
``` sh
"ffmpeg.exe" -protocol_whitelist "file,http,https,tcp,tls" -i "url_to_m3u8.m3u8" -movflags faststart -c copy -bsf:a aac_adtstoasc "dist_file_path.mp4"
```

# m3uってなに？
↓↓↓
https://ja.wikipedia.org/wiki/M3U

要するにただの動画プレイリストみたい。utf-8で記述された場合は拡張子に 8 をつけて .m3u8 にするらしい。

# ffmpegすごい
m3u8が動画の場所が記述されたプレイリストだってことは早い段階でわかったんだけど、これを一つのファイルに結合するのめんどくせえ・・・と思ったら、ffmpegのコマンド一発で解決した。
m3uファイルの場所と、m3uに記述された動画の場所がいずれもネット上にある場合でも問題なく結合できるみたいで、これは地味にありがたい。
「FizzBuzzクイズ」クイズ－Ruby編 を解いてみた

[「FizzBuzzクイズ」クイズ－Ruby編](https://qiita.com/sumim/items/f26902f2b813c075a619) の記事が目に飛び込んできたので自分も試しに解いてみました。

```ruby:fizzbuzz.rb
class FizzBuzz
  def initialize(receiver)
    @receiver = receiver
    @value = ''
  end

  def fizz
    @value << 'Fizz' if @receiver % 3 == 0
    self
  end

  def buzz
    @value << 'Buzz' if @receiver % 5 == 0
    self
  end

  def to_s
    value.to_s
  end

  def inspect
    value.inspect
  end

  private

  def value
    @value == '' ? @receiver : @value
  end
end

class Integer
  def fizz
    FizzBuzz.new(self).fizz
  end

  def buzz
    FizzBuzz.new(self).buzz
  end
end

1.upto(100) do |i|
  puts i.fizz.buzz
end
```

メソッドを呼び出した段階で FizzBuzz オブジェクトに変換して後はその中で処理を行うようにしました。

### 追記

投稿した後に気づいたのですが、下記の部分を満たしていなかったですね :fearful:

> 3の倍数の引数（レシーバー）を与えると"Fizz"を返し、5の倍数を与えると"Buzz"を返すメソッドを適当なクラス（あるいはモジュール）に定義せよ
ちょっとずつ読むドメイン駆動設計 第ニ部 モデル駆動設計の構成要素 第四章 ドメインを隔離する6

[前々回](https://qiita.com/YasuhiroKimesawa/items/367d0ab40433cfe2d57a)と[前回](https://qiita.com/YasuhiroKimesawa/items/46e547aadaa8402f724e)でレイヤアーキテクチャ・DIを使う・ ヘキサゴナルアーキテクチャについて読み進めました。
他の選択肢について

# 他の選択肢 [オニオンアーキテクチャ](http://jeffreypalermo.com/blog/the-onion-architecture-part-1/)
Jeffrey Palermoが2008年に提唱したアーキテクチャです。

![オニオン (1).png](https://qiita-image-store.s3.amazonaws.com/0/150455/e41f0e2b-d5ce-345b-76c7-7b93f0b7b6f2.png)

ヘキソゴナルアーキテクチャと似てますね。
特徴は

- 依存関係は外側が内側に依存します。(もちろんそうするためにDIが必要となります)
- 外側は内側であればどの層に依存してもいいです。すぐ内側のみということではないです。
- ドメインサービスという層というのは、JefferyのブログによるとDDDで言うところのRepository(インターフェイス)を集めた層のようです。
- 実装の仕方は内側にインターフェイス、外側にそのインターフェイスを実装します。
- アプリケーションCoreは様々と言っているので、必ずしもこの通りにしなければならないわけではないようですが、必ずドメインとその他（UI/インフラストラクチャ/テスト)を分離させます。
- アプリケーションCoreとその他は別々にコンパイル・実行できるようにする。

Repositryをドメインから分離するのはどうなんだろうとは思います。モデルのライフサイクルも大事なドメインの知識のような気がしますが・・・とは言え、アプリケーションCoreの中にありますし、アプリケーションCoreもこの通りでなければならないというわけでもないようなので考え方の一つとしてはいいかなという感想です。

オニオンアーキテクチャもヘキソゴナルアーキテクチャもその意図は何度も書いているような気がしますが、**ドメインを隔離する**ことにあります。
自分的にはそれさえ実現すればどんなアーキテクチャでもうまく行くような気がしていますが、他のアーキテクチャの選択肢としてClean Architectureというのが残っているので明日また読み解きます。
【AMP】amp-listで取得したデータをamp-bindを使ってリアルタイムにフィルタリングする

最終の目的は表題の通りですが、まずはamp-bindから説明します。

amp-bindを使えば、従来のAMPの仕様でできなかったダイナミックな機能を可能にします。
具体的に何ができるのかと言うとデータバインディングやJS式のようなユーザーの操作に応じて要素を変更できます。

# amp-bindのセットアップ
amp-bindコンポーネントをインポートします。

```html
<script async custom-element="amp-bind" src="https://cdn.ampproject.org/v0/amp-bind-0.1.js"></script>
```

# 簡単なテキストのバインド例

```java
<p [text]="'Hello ' + foo">Hello World</p>
<button on="tap:AMP.setState({foo: 'amp-bind'})">TAP</button>
```
![ampbind2.gif](https://qiita-image-store.s3.amazonaws.com/0/67591/04d9f4cf-0562-e178-4e74-101c39e628c9.gif)

buttonをタップすると`Hello World`の`World`の部分のテキストが`amp-bind`に置き換わるというサンプルです。

# どのように機能するのか

amp-bindは3つの主なコンポーネントでできています。

1. **State**：ドキュメントスコープで、変更可能なJSONの状態です。上の例では、Stateを定義していないので、ボタンをタップする前の状態は空です。ボタンをタップした後の状態は`{foo: 'amp-bind'}`となります。
2. **Expressions**：これはStateを参照できるJavaScriptです。上記の例は`'Hello' + foo、文字列'Hello '`と変数の`foo`を連結する単一の式を持っています。
3. **Bindings**：上記の例は、式の値が変更されるたびに`<p>`要素のテキストを更新する属性`[text]`を持っています。


# 本題：amp-listとamp-bindを組み合わせを試してみる

従来のWebアプリだと、例えばECサイトとかであれば、Ajaxを使い非同期に商品のソートやフィルタリングを行っている訳ですが、AMPであればamp-listとamp-bindを組み合わせることで、JavaScriptを記述することなく、それが実現できます。

> [amp-listでWP REST APIを使って記事リストを取得する](https://qiita.com/kingpanda/items/b78fc9699067c5506ff7)

で、amp-bindと同じくAMPの拡張コンポーネントの1つである「**amp-list**」で、WP REST APIを使いWordpressに投稿されている記事の一覧を取得して、AMP化されたサイトに表示する方法を紹介しましたが、
さらにこれを発展させて、amp-listにamp-bindを組み合わせて、取得した記事一覧をカテゴリーでのフィルタリングを試してみました。

そのコードが以下になります。

```java
<amp-list width="auto"
      height="400"
      layout="fixed-height"
      src="https://demo.wp-api.org/wp-json/wp/v2/posts"
      [src]="'https://demo.wp-api.org/wp-json/wp/v2/posts' + foo"
      class="m1"
      items=".">
      <template type="amp-mustache">
        <div>
          <a href="{{link}}">{{title.rendered}}</a>
        </div>
      </template>
</amp-list>
<button on="tap:AMP.setState({foo: ''})">全て</button>
<button on="tap:AMP.setState({foo: '?categories=1'})">カテゴリー1</button>
<button on="tap:AMP.setState({foo: '?categories=2'})">カテゴリー2</button>
```

これでカテゴリーのフィルタリングができます。
buttonをタップすると`<amp-list>`の`[src]`属性の変数`foo`にカテゴリー絞り込みのクエリパラメータが挿入され、リアルタイムに新たな記事リストが取得されることになります。

![ampbind.gif](https://qiita-image-store.s3.amazonaws.com/0/67591/4a3d350e-6b15-f6b3-e4cd-56f3f016449a.gif)

http://demo.wp-api.org/　
というWPのデモサイトから記事リストを取得しています。

# まとめ
サイトのAMP化にあたって、amp-listとamp-bindの組み合わせはよく使われるパターンだと思うので、ぜひこの記事をご参考にください。

# 参考
amp-list 公式リファレンス（英語） by Google
https://www.ampproject.org/docs/reference/components/amp-list

amp-bind 公式リファレンス（英語） by Google
https://www.ampproject.org/docs/reference/components/amp-bind
CMake で C# のプロジェクトを作ろうとしてハマった話

# 泣きごと

半年ほど前から[CMake が C# に対応しているらしい](https://cmake.org/cmake/help/v3.8/release/3.8.html)ということで，試しに使って見ようと思ったら盛大にハマってしまいましたorz

cmake の中のファイルをいじることで一応の問題解決はできましたが，英語以外の環境だと同じ所でハマる人が出そうです。

## 試した環境

* Windows 7 (64 bit) 日本語版
* CMake 3.9.3 (2017.9.24 時点で最新)
* Visual Studio Community 2017 

## 構成

以下のような構成 ([詳細はこちら](https://github.com/guttally/cmake-learning/tree/master/cs-project-simple)) を作って cmake してみたところ……

```
simple-cs-project/
├─ build/
│  ├─ CMakeGenerate.txt (中で cmake している。)
│  └─ project/
│     └─ ソリューションファイルやプロジェクトのファイルができる予定
└─ src/
   ├─ CMakeLists.txt
   └─ main.cs
```

## エラー

```bat
> cd build
> CMakeGenerate.bat

(中略)
-- The CSharp compiler identification is Microsoft Visual Studio 2017
-- The CSharp compiler version is \
(中略)
CMake Error at D:/cmake-learning/simple-cs-project/build/project/CMakeFiles/3.9.3/CMakeCSharpCompiler.cmake:10:
  Parse error.  Function missing ending ")".  Instead found unterminated
  string with text ")

  ".
Call Stack (most recent call first):
  CMakeLists.txt:5 (enable_language)


CMake Error: Could not find cmake module file: D:/cmake-learning/simple-cs-project/build/project/CMakeFiles/3.9.3/CMakeCSharpCompiler.cmake
-- Configuring incomplete, errors occurred!
See also "D:/cmake-learning/simple-cs-project/build/project/CMakeFiles/CMakeOutput.log".
See also "D:/cmake-learning/simple-cs-project/build/project/CMakeFiles/CMakeError.log".
```

という塩梅で cmake が通らない......。

# 原因

バッチを実行したときのログからも推すに，C# コンパイラのバージョンがうまく取れていません。

cmake の中をのぞいてみると，C# コンパイラのバージョンを以下のように取得していました。

```cmake:cmake/share/cmake-3.9/Modules/CMakeDetermineCSharpCompiler.cmake(LL.26-30)
  execute_process(COMMAND "${CMAKE_CSharp_COMPILER}" "/help" OUTPUT_VARIABLE output)
  string(REPLACE "\n" ";" output "${output}")
  foreach(line ${output})
    string(TOPPER ${line} line)
    string(REGEX REPLACE "^.*COMPILER.*VERSION[^\\.0-9]*([\\.0-9]+).*$" "\\1" version "${line}")
```

要するに，cmake としては Compiler version という文字列が出現することを期待しているんだけれど，手元の環境で試すと以下のようになる。

```bat
> csc.exe /help

Microsoft (R) Visual C# Compiler バージョン 2.3.2.62116 (8522b473)
Copyright (C) Microsoft Corporation. All rights reserved.
(略)
```

Σ「バージョン」！！

ご丁寧に日本語で出力していただいた結果，cmake がコケているようです。

# 対応

「バージョン」が「version」 になればよいわけなので，コンパイラが出力する言語を英語に切り替えてあげれば問題を回避できます。 コンパイラが出力する言語は /preferreduilang オプションで指定できます。

```bat
> csc.exe /help /preferreduilang:en-US

Microsoft (R) Visual C# Compiler version 2.3.2.62116 (8522b473)
Copyright (C) Microsoft Corporation. All rights reserved.
```

ということで，cmake/share/cmake-3.9/Modules/CMakeDetermineCSharpCompiler.cmake の L. 26 を以下のように修正したところ，無事に cmake できるようになりました。

```cmake:cmake/share/cmake-3.9/Modules/CMakeDetermineCSharpCompiler.cmake(L.26)
- execute_process(COMMAND "${CMAKE_CSharp_COMPILER}" "/help" OUTPUT_VARIABLE output)
+ execute_process(COMMAND "${CMAKE_CSharp_COMPILER}" "/help /preferreduilang:en-US" OUTPUT_VARIABLE output)
```

## へびの足

Visual Studio 2017 の csc.exe には /version というオプションがあって，言語に関係なく一撃でバージョン値を取得できました。 CMake 的には Visual Studio 2010 より前のバージョンには非対応ということなので，2010 以降の csc.exe で /version オプションが使えるなら，こっちに乗り換えるというのが筋なのかもしれません (ちゃんと調べていません)。
$(...).on is not a functionの対策

$(...).on is not a functionになった時の対策

https://github.com/protonet/jquery.inview/issues/55  
に書いてある通り、読み込んだjqueryのバージョンがあってないっぽい。
http://ajax.googleapis.com/ajax/libs/jquery/1.5.1/jquery.min.js
を
https://code.jquery.com/jquery-1.8.0.min.js
に変えたら治った。
PythonによるWebページのスクレイピング（Beautiful Soup）

#前置き
O'Reilly Japan の「PythonとJavaScriptではじめるデータビジュアライゼーション」を参考に、勉強をしています。

今回は、Beautiful Soupを使って、Webページの簡単なスクレイピングを実施します。

#Beautiful Soupでスクレイピング
Yahoo! JAPANページのニュース欄に表示されている記事のタイトルを取得してみます。
Chrome Developer Toolsにより、スクレイピング当時のタグや属性の情報が確認できるキャプチャを下記に添付します。

<img width="1280" alt="スクリーンショット 2017-09-25 0.23.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/179364/8e464eaa-674d-5b7e-44f4-180aa85084ee.png">

##事前準備
```py3
pip install beautifulsoup4
pip install lxml
```

##関数作成
WebページをBeautifulSoupオブジェクトにして取得する関数

```py3:bsoup4.py
from bs4 import BeautifulSoup
import requests

ua = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6)" \
     "AppleWebKit/537.36 (KHTML, like Gecko)" \
     "Chrome/60.0.3112.113"


def get_soup(url):
    response = requests.get(url, headers={"User-Agent": ua})
    return BeautifulSoup(response.content, "lxml")
```

「User-Agent」属性を設定しない場合、Yahoo! JAPANからは簡易なWebページが返却されました。
この属性を設定していない場合、Wikipedia等のようにリクエストを拒否するページもあるようです。

##Webページのスクレイピング実施
```py3
>>> import bsoup4
>>>
>>>　　#　BeautifulSoupオブジェクトの取得
>>> soup = bsoup4.get_soup('https://www.yahoo.co.jp/')

>>>　　#　BeautifulSoupオブジェクトから、ニュース欄部分を抽出
>>> topicsfb = soup.find_all('div', attrs={'id':'topicsfb'})

>>>　　#　ネストしているタグから、必要なデータを抽出
>>> for topic in topicsfb:
...     for ultags in topic.find_all('ul', attrs={'class':'emphasis'}):
...         for atags in ultags.find_all('a'):
...             print(atags.text)
...
新党合流 同調者に自民不安写真
現職堺市長3選 都構想に打撃写真NEW
6階から転落か 1歳女児が死亡動画
独に絶望 帰国する難民たち動画NEW
発売30年 糸ようじの試行錯誤写真NEW
中日岩瀬&荒木 コーチ兼任に写真NEW
元体操選手 田中理恵さん妊娠写真
だんじり 宮川大輔圧倒される写真
```
※Webページのアイコン部分の文字が出力されてしまっています。

##参考
Beautiful Soupドキュメント
http://tdoc.info/beautifulsoup/
メソッドとクラスメソッドとインスタンスメソッドが曖昧だった

Rubyでプログラムを記述している際に疑問に思うことが多々あります。
今回はメソッド、クラスメソッド、インスタンスメソッドがあいまいになったのでまとめていきます。

## メソッド
クラスメソッドにしてもインスタンスメソッドにしても、**メソッドという名称がついているのだからどちらもメソッドです。**
では、そもそもメソッドとは何なのでしょうか？

>一般には、方法、手法といった意味。オブジェクト指向プログラミングにおいて、クラスにはメソッドとフィールドがあり、メソッドには、処理内容を記述する。
引用元：コトバンク

```rb:足し算
def addition (a,b,c,d,e)
    puts a + b + c + d + e
end
```
上のadditionメソッドに5つの数字を与えると全部足して表示してくれる。というメソッドです。
**メソッドとは、なにかしらの処理をまとめ、その一連の処理に名前をつけたもの。**を指します。

## クラスメソッド？インスタンスメソッド？
>クラスメソッドとは、クラスオブジェクトから実行可能なメソッド
>インスタンスメソッドとは、クラスのインスタンス(実体)に対して紐づけられるメソッド
引用元：コトバンク

なるほど。さっぱりわかりません。とりあえず先ほどのadditionをCalculation(計算)クラスの中に入れて実行してみます。

```rb:計算クラス(エラー)
class Calculation
    def addition(a, b, c, d, e)
        puts a + b + c + d + e
    end
end

addition(1,2,3,4,5)
```
実行結果は``undefined method `addition' for Add:Class (NoMethodError)``というエラーコードが出ました。
そんなメソッド存在しない。というエラーのようです。

### クラスの中にあるメソッドを使用する
Calculationクラスに含まれているメソッドを外から勝手に使用することはできないみたいです。そこで登場するのがクラスメソッドです。
**クラスメソッドの定義はメソッド名の前にself.を加え、呼び出すときにはクラス名.メソッド名で呼び出します。**早速やってみましょう。

```rb:計算クラス
class Calculation
    def self.addition(a, b, c, d, e)
        puts a + b + c + d + e
    end
end

Calculation.addition(1,2,3,4,5)
```
15が出力されました。どうやら成功したようです。

### インスタンスメソッドは？
結論から言うと**クラスの中にメソッドを作成するとそれがインスタンスメソッドになります。**

```rb:宣言
class クラス名

  def メソッド名(変数1, 変数2, ...)
    処理
  end

end
```
インスタンスメソッドは、クラスのインスタンスに機能として搭載されているものです。
先ほどの計算クラス(エラー)となってしまったコードは、インスタンスを作り、作ったインスタンスに対してメソッドを呼び出せばエラーを吐きません。

```rb:計算クラス(インスタンス)
class Calculation
    def addition(a, b, c, d, e)
        puts a + b + c + d + e
    end
end
calculation = Calculation.new()
calculation.addition(1,2,3,4,5)
```
これで15と表示されるようになった。

# まとめ
- メソッドとは、それを実行すると何かしらの処理を行ってくれる
- インスタンスメソッドもクラスメソッドもメソッド
- クラスメソッドはself.メソッド名で作成。使用するにはクラス名.メソッド名で
- インスタンスメソッドはクラスにメソッドを作成するとそれがインスタンスメソッドとなる。特に追加で記述する必要はない
- インスタンスメソッドを使用するにはインスタンスを作成(.new)しなければならない

イメージ図
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165191/05ed079a-5752-42cf-4d4b-1a43c82fbf1a.png)

# 実践編

[クラスメソッド、インスタンスメソッド。いつ使うのか。](https://qiita.com/right1121/items/c3997653a621c74fb97d)
Zenko.ioでOSSベースのS3クローンを実現する


# 目的

諸事情があってawsのS3が利用できないけれども
開発用などでS3のクローンが手元に欲しい場合にZenko.ioを利用する。

# 免責事項

あくまでも開発・検証用なので注意。本番では利用しないこと。
(Zenko.ioのデプロイがtesting向けの設定のため)

# 手順

## 前提条件

- docker stack deployが利用できること
	- dockerの17.03-ce以降が適切(多分)

## 手順概要

1. zenko.ioのソースコード取得
2. デプロイ
3. 動作確認


## 手順詳細

### zenko.ioのソースコード取得

docker stack deployする際のymlファイルが必要なので、

zenko.ioのソースコードリポジトリをgit cloneする。

```
git clone https://github.com/scality/Zenko.git

```

### デプロイ

```
cd Zenko/swarm-testins
sudo docker stack deploy -c docker-stack.yml zenko-testing
```

しばし待つとイメージのpullとコンテナのセットの起動が完了する。

```
$ sudo docker stack  services zenko-testing
ID            NAME              MODE        REPLICAS  IMAGE
mw3akyodtzsj  zenko-testing_lb  replicated  1/1       zenko/loadbalancer:latest
tvfobhecilb4  zenko-testing_s3  replicated  1/1       scality/s3server:latest
```

起動が完了したら動作確認に移る。

### 動作確認

#### バケットを作成

今回stackを立ち上げたのは、192.168.0.3だったので、
endpointにこれを指定して、bucket1を作成する。

```
$ export AWS_ACCESS_KEY_ID=accessKey1
$ export AWS_SECRET_ACCESS_KEY=verySecretKey1
$ aws s3 --endpoint http://192.168.0.3 mb s3://bucket1 --region=us-east-1
make_bucket: bucket1
```

#### ファイルをアップロード

たまたまtemplate.txt.j2なんてファイルがあったのでbucket1にアップロードしてみる。

```bash:ファイルのアップロード確認
$ aws s3 --endpoint http://192.168.0.3 cp template.txt.j2 s3://bucket1 --region=us-east-1
upload: ./template.txt.j2 to s3://bucket1/template.txt.j2
$ aws s3 --endpoint http://192.168.0.3 ls s3://bucket1
2017-09-19 23:20:09        100 template.txt.j2
```

無事、ファイルはアップロードされている。

# 今後のToDo

現状だとswarmkitを使ったstackしかないので、
Rancherカタログでも作ろうかと。


# 参考文献

http://zenko.readthedocs.io/en/latest/swarm_testing_link/README.html#

https://github.com/scality/Zenko
ARマーカーでなんちゃってモーションキャプチャー

#背景
最近VRとか流行りですよね。
viveだとトラッカーが使えるのでモーションキャプチャーとして利用できたりします。
でもやっぱり高いです。でもそれっぽい事したい！
そんな感じの足掛けになればと思い記事にします。

#概要
ちょっと前にARマーカーって流行ったと思います。
ARマーカーの基本的な使い方はカメラ側を動かして実際の映像上に映ったマーカーに3Dオブジェクトを合成するといったものですが、これを逆手にとって利用します。カメラ側を固定し、ARマーカーを動かして、viveの例で挙げたトラッカーの代用にする考え方です。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">ARマーカーによるなんちゃってモーションキャプチャーです。 <a href="https://t.co/4O84FXugvg">pic.twitter.com/4O84FXugvg</a></p>&mdash; 琴葉 葵（偽） (@Hv2RMjHzDyqXVIr) <a href="https://twitter.com/Hv2RMjHzDyqXVIr/status/909443563473199105">2017年9月17日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>
(C) Unity Technologies JapanUCL

#環境
Unity
vuforia
FinalIK
ウェブカメラ
※これらは一例ですので、他のもので代用できると思います。

##Unity
Unityについては書きません。

##vuforia
vuforiaについてもわかりやすくまとめてくださっている方がいらっしゃいますのでそちらをご覧ください。
https://qiita.com/hey_cube/items/d12fa91abd6f7826dd78
https://qiita.com/ayumegu/items/91c1811acab95da817f4

今回の使い方で特筆するのは、カメラの設定です。
基本的に通常のカメラは削除し、vuforiaのprefabカメラを使うのですが、概要の動画のような使い方には向きません。また、prefabのカメラは初期設定だとARマーカーを基準にカメラの向きを変えてオブジェクトの見え方を変えています。

なのでまずprefabのカメラを固定にしてオブジェクト側が動くように設定します。
![1.png](https://qiita-image-store.s3.amazonaws.com/0/183870/06e8b660-2c1f-021e-b60a-bf0244719f84.png)

そしてUnityの普通のカメラを配置します。(削除せず残しておきます。)
※Target Displayの設定に注意
![3.png](https://qiita-image-store.s3.amazonaws.com/0/183870/b9db70bd-4f80-a47e-85c1-320db7c09da3.png)

##FinalIK
FinalIKであればVRIK、または動かしたい箇所だけにCCDIKが設定しやすいかと思います。
この点についてもARマーカーに設定したオブジェクトをターゲットに割り当てる以外は特筆することはありません。

##ウェブカメラ
ウェブカメラについてですが、できるだけ視野角が広い物が良いです。
1000円程度の物でも動かす事は可能ですが、動かせる範囲が狭く厳しいです。
かといって極端に視野角が広いと端が歪むため意図せず角度が変化したりと難しい選択です。

個人的には安く済ませたいのならLogiのC270、とにかく広く動かしたいのならBuffaloのBSW20KM11BKだと思います。どちらも両極端なので、Logiの1万前後の物が一番ベターかもしれません。

露光時間やセンサー感度の問題でモーションブラーが強く出る物は早く動かした場合に弱いので、そのあたりも加味しつつ、各種設定が保持できる制御ツールがある物(メーカー/機種)だとなお良しです。

#展開
VR環境下では実世界の物体の位置が把握できないのが難点です。
かといって全ての物体にviveトラッカーを始めとしたセンサーを付けるのも考え物です。
そこで「だいたいでいいから位置を把握したい」程度の要求であれば、今回のような形で対応できるのでは？
と考えています。

#注意
感度や精度といった面では昨今のVR環境に遠く及びません。
この体験で「こんなものか」と思わず「より良く！」と先へ進んでくれる事を願います。

また、残念ながらvuforiaがwindosビルドに対応していないため、win環境下では実行ファイルにできません。
早朝学習のススメ

# 早朝学習のススメ

3か月ほど前に、こちらのブログを見て、実施することに決めました。
[http://d.hatena.ne.jp/higepon/20140623/1403498563](http://d.hatena.ne.jp/higepon/20140623/1403498563)

## 実際、早朝学習ってどうなの？
結論から言うと、とても良いです！

自分もここ3ヶ月くらい、毎朝5時に起きて、本を読んだり、コードを書いたりしてますが、思った以上に捗り、正直ビックリです。

以前は仕事から帰ってきてから家で勉強していたのですが、疲れてやる気がなかったり、相方と話や食事をしたり、夜はなかなか思うように時間が確保できませんでした。

当然、学習の進みが悪く、やきもきしていた所に上のひげぽんさんの記事を発見し、これだ！と思い、一念発起して朝型に変更したところ、勉強がうまく回るようになった次第です。

## 自分なりに工夫した点
ただ、早朝型の生活と言うのは簡単ですが、実際にやると、思っていた以上に辛く、すぐに元の生活に戻したくなります。

自分の場合も、慣れるまで1ヶ月くらいかかりましたし、油断すると生まれ持った怠け癖から、すぐに元の生活に戻ってしまいそうに何度もなりました。

ですので、ある程度は自分に裁量を許す形を取るほうが良いかと思います。
たとえば、眠気が強い次の日は休んでいいとか・・・。

## 時間割を作ろう！
自分の場合、あらかじめ勉強のための時間割を決めました。

 ・ 平日の朝は、5時から6時の１時間
 ・ 土曜日は、7時から9時半、10時から11時半、13時から14時半の3コマ
 ・ 日曜日は、平日ないし、土曜日にこなせなかった分の予備日

日曜日まで問題なく消化できていれば、日曜日はフリーとしています。
実際はフリーといいつつ、2－3時間を勉強に充てることも珍しくないですが。。。

なかなか勉強時間の確保が難しい人で、朝に強い人は試してみる価値ありだと思います。

## 気をつける点など
こういった時間割を決める際に考えた方がよい点として、

　__この生活が1年ないしそれ以上、無理なく続けられるか？__

という自問自答に答えれるか否かがポイントになると思います。
まだ自分も3か月ちょっとしか持続していないので、この先挫折する可能性も無きにしも非ずですが・・・。

あと、もう一点気を付けていることがあります。

できれば寝る前のお酒は控えた方が無難です。
自分の場合、お酒が入っていると朝の寝起きがすこぶる悪いので、元の生活にもどってしまう誘惑が半端なかったので。

それでは失礼します！
Elasticsearch/kibana/x-packで気象データでMachine Learningしてみる

先日[これ](https://www.elastic.co/jp/blog/experiencing-machine-learning-with-nyc-taxi-dataset)を見て、自分も何かデータを使ってMachine Learningを体験してみたいと思っていたところ、[こちら](https://qiita.com/tsgkdt/items/bc3dfe27535cfd7fcf88)の記事で日経の株価データを使ってやられていたので、違うネタで自分もやってみることにしました。

<2017/9/25 追記>
今回x-packに追加された仕組みは機械学習を用いた「時系列異常検知」です。今後他にも追加される予定みたい。

```
ログファイルやアプリケーションメトリック、パフォーマンスメトリック、ネットワークフロー、財務/取引データなどの時系列データをElasticsearchに格納しているユーザーに付加価値を提供することに専念する方針
```
だそうです。楽しみ。
[参考](https://www.elastic.co/jp/blog/introducing-machine-learning-for-the-elastic-stack)

# 環境
- Elasticsearch: 5.6.1
- kibana: 5.6.1

使用したデータは、[ここ](http://www.data.jma.go.jp/gmd/risk/obsdl/)の気象データを適当に地域を選んでcsvデータをダウンロードしました。

# Elasticsearch/kibanaの設定
dockerを使ってやりました。最初docker-hubのを使ってやろうと思ったのですが、データを入れて計算させるぞって時にElasticsearch側でエラーがおきて上手く出来なかったので、elasticが出しているimageを使って環境を作ることにしました。

docker-compose.ymlは以下のようにしました。

```
  1 version: '2'
  2 services:
  3   elasticsearch:
  4     image: docker.elastic.co/elasticsearch/elasticsearch:5.6.1
  5     container_name: elasticsearch
  6     hostname: elasticsearch
  7     environment:
  8       - "http.host=0.0.0.0"
  9       - "ES_JAVA_OPTS=-Xms1g -Xmx1g"
 10       - "xpack.security.enabled=false"
 11     ports:
 12       - 9200:9200
 13   kibana:
 14     image: docker.elastic.co/kibana/kibana:5.6.1
 15     container_name: kibana
 16     links:
 17       - elasticsearch
 18     ports:
 19       - 5601:5601
```

10行目の「xpack.security.enabled=false」を追加しないとkibanaを起動した時にベーシック認証が掛かってしまうので、今回は明示的に外しました。

あとはElasticsearchにデータを入れたら準備は終わりです。

# 実際に動かしてみる
今回は「weather」というindexにてElasticsearchにデータを登録しました。

![スクリーンショット 2017-09-25 0.09.45.png](https://qiita-image-store.s3.amazonaws.com/0/1686/777c72f5-f134-c631-1449-5d4ed106ff98.png)

indexを設定したら、Machine Learningに移動します。

![スクリーンショット_2017-09-25_0_11_56.png](https://qiita-image-store.s3.amazonaws.com/0/1686/c81cbc67-f931-be19-7d73-d08f8ad75a46.png)

　「Create new job」を選択し、次の画面で「Single Metric Job」を選択します。
そしてindexとしてweatherを選択します。

![スクリーンショット 2017-09-25 0.18.24.png](https://qiita-image-store.s3.amazonaws.com/0/1686/75366d86-7cd9-f802-9a90-b765e2e4c535.png)

ここで計算方法(平均値、合計値など）、どのカラムを使用するか、そしてどのくらいの間隔でデータを見るかを設定します。今回３日おきの最高気温を見ることにしました(年々暑いですからね)。
すると以下のようなグラグがみれました。

![スクリーンショット 2017-09-25 0.23.42.png](https://qiita-image-store.s3.amazonaws.com/0/1686/6ecabdbd-cf0f-35e2-3028-92d96cc755e6.png)

そして「Create Job」を押すと計算処理が走り次のように結果異常値と判断された箇所が色つけされます

![スクリーンショット 2017-09-25 0.26.03.png](https://qiita-image-store.s3.amazonaws.com/0/1686/1d46d4cf-14cb-e20b-a411-8b946340294f.png)

より詳細を見るために「View Results」ボタンを押すと細かい結果を見ることが出来ます。

![スクリーンショット 2017-09-25 0.28.02.png](https://qiita-image-store.s3.amazonaws.com/0/1686/e6853c17-f568-fd9a-0f82-92450e782ff7.png)

# 所感
自分の場合、最初elaticのdockerを使わずに試行錯誤していたので、なかなか上手く環境が作れなかったが、素直にelasticの方を使ったら割とすんなりと出来ました。こうなると色々とデータを入れてみたくなりました。
PowerShell で Windows Update を実行する

# 概要

Windows サーバのセキュリティパッチ適用は手間のかかる作業です。サーバの台数にも依りますが、システム停止日に全てのサーバをアップデートするよう計画するためには、僅かな手間も省略したいところです。

そこで手間を省略するために Windows Update を PowerShell から実行する方法を検討しました（とりあえず PowerShell の流れ）。

# 方針

[Windows Update Agent API](https://msdn.microsoft.com/en-us/library/aa387099(v=vs.85).aspx) を使います。これは COM として呼び出せるので `New-Object -Com Microsoft.Update.Session` することができます。後は[MSDNのサンプル](https://msdn.microsoft.com/en-us/library/aa387102(v=vs.85).aspx)を書き換えるだけです。

# 手順

Windows サーバにログインして PowerShell を管理者権限で実行します。続いて、以下のスクリプトを全て貼り付けるとサーバの再起動まで自動で進行します。サーバ管理者は「更新プログラムの確認」やダウンロードを待つことなく、次のサーバの作業に移ることができます。

```ps1
# 1. ログの記録を開始する
$log = ".\$($env:ComputerName)_$(date -f yyyyMMdd).txt"
Start-Transcript $log
$Env:ComputerName
$Env:UserName
date

# 2. Windows Update を確認するセッションを開始
$updateSession = New-Object -com Microsoft.Update.Session

# 3. Windows Update の検索
$searcher = $updateSession.CreateUpdateSearcher()
$searchResult = $searcher.search("IsInstalled=0 and Type='software'")

# 4. Windows Update の結果確認
$searchResult.Updates | % { $_.title -replace ".*(KB\d+).*", "`$1`t$&" }

# 5. 手作業が不要な項目だけを抽出する（通常は検索結果すべて）
$updatesToDownload = New-Object -com Microsoft.Update.UpdateColl
$searchResult.Updates | ? { -not $_.InstallationBehavior.CanRequestUserInput } | ? { $_.EulaAccepted } | % { [void]$updatesToDownload.add($_) }

# 6. ダウンロードする
$downloader = $updateSession.CreateUpdateDownloader()
$downloader.Updates = $updatesToDownload
$downloader.Download()

# 7. ダウンロードが完了したものだけ抽出（通常は全てダウンロードされる）
$updatesToInstall = New-Object -com Microsoft.Update.UpdateColl
$searchResult.Updates | ? { $_.IsDownloaded } | % { [void]$updatesToInstall.add($_) }

# 8. インストールする
$installer = $updateSession.CreateUpdateInstaller()
$installer.Updates = $updatesToInstall
$installationResult = $installer.Install()

# 9. インストールの結果を確認する（ResultCode 2 なら成功、3以上なら一部または全て失敗）
$installationResult 

# 10. 再起動する（自動でStop-Transcriptされる）
date
restart-computer

```

再起動後のサーバにログインし、以下のコードを PowerShell に貼り付けて更新プログラムが無いことを確認しておきましょう。

```ps1
# 11. 続きからログを記録する
$log = Get-Item .\$($env:ComputerName)_$(date -f yyyyMMdd).txt
Start-Transcript -append $log

# 12. Windows Update を確認するセッションを開始
$updateSession = New-Object -com Microsoft.Update.Session

# 13. Windows Update の検索
$searcher = $updateSession.CreateUpdateSearcher()
$searchResult = $searcher.search("IsInstalled=0 and Type='software'")

# 14. 検索結果の確認（結果が表示されたら 5 からリトライするか、手動で windows update を実行すること）
$searchResult.Updates | % { $_.title -replace '^(.*)\((KB\d+).*$', "`$2`t`$1" }

# 15. ロギングの停止
Stop-Transcript

```

最後にログを回収してください。

```ps1
# 16. ログの回収
Set-Clipboard -Path $log

# 17. ログの削除
rm $log
```

# 心のこり

本当は `Invoke-Command` でやりたかったのですが、`$downloader = $updateSession.CreateUpdateDownloader()` でアクセス拒否エラーが発生するので諦めました。

# 追記：アクセス拒否エラーの回避策

以下のURLで公開されているモジュールを参考にしたところ、タスクスケジューラで実行するよう実装されていました。

https://gallery.technet.microsoft.com/scriptcenter/2d191bcd-3308-4edd-9de2-88dff796b0bc
Rails5の変更点

Rails5になってから、Rails5だからできることについて認識が足りないと感じたため、まとめる。

###Rails APIが使えるようになった
コントローラでActionController::APIを継承できるようになった。使い方は、以下のようにAPIオプションをつけてRailsアプリケーションを作成する。
```
$ rails new my_api --api
```

###Action Cableが使えるようになった
Action Cableはリアルタイムな双方向通信のできるWebSocketの機能を簡単にRailsに追加できるようになった。Action Cableにはサーバとクライアントの両方の機能が含まれている。

###rakeコマンドをrailsコマンドでも実行できるようになった
`rake db:create`といったようなrakeコマンドを`rails db:create`といったような書き方で実行できるようになった。`rails db:migrate`、`rails routes`などが使用できる。

###ApplicationRecordが使えるようになった
モデルの継承元がActionRecord：：BaseからApplicationRecordに変更
Python 3 エンジニア認定基礎試験の勉強法と受験した感想

#Python 3 エンジニア認定基礎試験とは？
一般社団法人Pythonエンジニア育成推進協会が実施している民間試験。

- 基礎文法が出題され、試験時間60分で40問中70%以上正解で合格
- 受験料1万円（税別）　＊学生は半額
- CBTによるPCを使ったテストですぐに結果が出る
- 教材はオライリーの「Pythonチュートリアル 第4版」(私の受験時は3版でした）

#私の勉強法
前提として私は職業プログラマではなく、raspberry piで遊んだり、ちょっとしたツール作ったり、aws lambdaでちょっとしたものを動かす程度の知識。

pythonは辻真吾さんの「pythonスタートブック」と柴田淳さんの「みんなのpython」で学習しました。

とりあえず、（当時の）教材の「Pythonチュートリアル 第3版」購入。
現在の教材である「Pythonチュートリアル 第4版」の内容はほぼwebでみれます。
「Pythonチュートリアル 第4版」の内容は3.9系です。
[https://docs.python.org/ja/3.9/tutorial/index.html](https://docs.python.org/ja/3.9/tutorial/index.html)

あと、以下のサイトを参考にしました。
[素人が "Python 3 エンジニア認定基礎試験" に合格する方法](https://qiita.com/keroplant/items/c46dc499b9907b7a6908)
出題方法については非常に参考になりました。

[Python3エンジニア認定基礎試験の効率的な勉強方法!](http://ccie-go.com/python-exam-study/)
よくテキストを読み込んでるし、この方法でやれば効率がいいとおもいます。ただし、試験に合格することに重点が置かれていますので言語の理解とはまた別です。

「Pythonチュートリアル 第3版」を１回通して読んで、よくわからないところはコードを書いて動かす。
（そんなになかったがcollectionsのdequeはなるほどと思った）
２回目はテスト前に一通り読む程度。

合計で８時間くらい学習したと思います。

追記：こちらで模擬試験が出来るようです
https://diver.diveintocode.jp/dive_into_exam/2

(2020.9.12追記)
こちらでも模擬試験ができるようです。
データ分析試験の模擬試験もできる感じです。
https://study.prime-strategy.co.jp/

追記2：開始から11か月分の結果がこちらでみられます。
1273名が受験して合格者が989名・・・
基本情報技術者試験や応用情報技術者試験といったメジャーな資格試験に比べれなマイナー感が否めません。
やっぱり受験料が高いのと出題内容がネックですね（求む抜本的な改革）
urlがpython3000っぽいところはネタなんでしょうか。
https://www.pythonic-exam.com/archives/news/python1200

#受験当日
１５分程度で試験が終わり、結果は合格でした。

#受験してみた感想
※3版（旧版）の感想ですので、受験する方は最新の4版を購入してください

 **「Pythonチュートリアル 第3版」の内容があまりよくない**

他言語のプログラミング経験者向けチュートリアルのため、プログラミング初学者にはハードルが高い。
また、説明なしにモジュールやメソッドが使用されて、どういった処理が行われているかよくわからないケースが散見される。
jsonなどimportして使用するモジュールを、本の中ではimportの記載がないまま使用しているため、自分で書いて実行すると当然エラーになるケースがある。

そのため、わからないことがすぐ調べれるのでwebのチュートリアルをみることをおすすめします。

- **試験問題があまりに簡単で、問題数が少なすぎる**

見なおしても２０分は絶対かからない難易度と問題数。
簡単にするのはいいが、せめて問題数を倍程度にしないと早く終わって試験の手応えがない。

「合格したけど１万円払ってこの程度の資格とってもしょうがないなー」というのが試験直後の私の正直な感想です。

（2019.4.23追記）
「Python 3 エンジニア認定基礎試験」で検索すると本記事がかなり上位に表示され、qiitaで引用されることもあり、今でもいいねがつくこともあるのでかなり参考にされていると感じ追記します。
私自身は何かを学ぶときに資格試験をモチベーションにすることに肯定的です。
例えば、プログラミング初学者がPythonから学び、この試験をモチベーションに学習することはいいことだと思います。
今後、データ分析試験が始まりますが私は受験する予定です。
[データ分析試験](https://www.pythonic-exam.com/exam/analyist)

（2019.11.6追記）
データ分析試験βを受験し、合格しました。
最近、atcoderをやっているのでnumpyの使い方が学べてよかったです。

- **間違えた問題が確認できない**

どの問題を間違えたか確認できないため、受験後もやもやする

- **どういった層が受ける試験なのかよくわからない**

初学者にはハードルが高い教材で、経験者には簡単すぎる試験問題。
問題数を増やして、もう少し全般的な能力を見るようにしてほうがいい気がする。
#これから受験する方へ

- **pythonがある程度書けるひと**
無勉強でも多分合格する。
心配ならwebのpythonチュートリアルを一回通して読めば十分。

- **他の言語がある程度かけるひと**
webのpythonチュートリアルを一回か二回通して読めば十分。

- **プログラミング初学者**
別の入門書（辻真吾さんのpythonスタートブックなど）を読んで、ある程度プログラミングがわかってから「Pythonチュートリアル 第3版」を読んで受験したほうがいい。
FizzBuzzクイズのruby実装例

https://qiita.com/sumim/items/f26902f2b813c075a619 見て書いてみたけどStringの場合とIntegerの場合のメソッドで2つ実装別れてしまっていけてないかんじになっちゃった

```rb
module FizzBuzz
  refine(String)do
    def fizzbuzz
      @fizzbuzz
    end

    def fizzbuzz=(n)
      extend(FizzBuzz)
      instance_variable_set(:@fizzbuzz, n)
    end
  end
end

module Fizz
  refine(Integer) do
    using FizzBuzz

    def fizz?
      (self % 3).zero?
    end

    def fizz
      if fizz?
        "Fizz".tap {|s| s.fizzbuzz = self }
      else
        self
      end
    end
  end
end

module Buzz
  refine(Integer) do
    using FizzBuzz

    def buzz?
      (self % 5).zero?
    end

    def buzz
      if buzz?
        "Buzz".tap {|s| s.fizzbuzz = self }
      else
        self
      end
    end
  end

  refine(String) do
    using FizzBuzz

    def buzz
      if fizzbuzz.buzz?
        concat("Buzz")
      else
        self
      end
    end
  end
end

using Fizz
using Buzz

1.upto(100) { |n| p n.fizz.buzz }
```
フローチャートにＯＯＰ用の記号導入のアイディア

　オブジェクト指向プログラミング（ＯＯＰ）の図式化のためには標準的なＵＭＬクラス図は存在しますが、メインの流れを説明する際にＯＯＰ用の記号があったら説明しやすいと考えました。
![フローチャート上でのメソッド使用指示.png](https://qiita-image-store.s3.amazonaws.com/0/147091/9ebd894b-cadb-b249-0cb0-42df6804fd38.png)

---
　まずは以下のような点で既存の流れ図記号のみでは、ＯＯＰの流れを捉えきれません。
###・既存の流れ図のＯＯＰ対応の限界
1. メインの流れの中で、個々のインスタンスにどんな操作をしたか分からない。
2. 各インスタンスの操作で戻り値なし（void）か、戻り値があったときに何に渡しているかが分からない。
3. 呼び出される側のオブジェクト（抽象クラス）でどんな変数（プロパティ）が用意され、何をするメソッドが使えるのかが分からない。
4. オブジェクト（抽象クラス）の継承とインターフェース継承の関係が分からない。

---
　そこでインスタンスを表すシンボルを考案しました。次の図は以前qiitaにアップした[VBSで作ったオブジェクト指向プログラミング体感用のウインドウ操作プログラムの紹介](https://qiita.com/seastar3/items/95304175cabc6d1a128c)の記事のなかの電卓オブジェクトのインスタンス化を示す図です。
![電卓クラスのインスタンス化の操作.PNG](https://qiita-image-store.s3.amazonaws.com/0/147091/ce02f212-12af-ba91-7f5f-5db9820181c0.png)

---
　メインの流れ図上でインスタンスの動作を表現するための記号が、
![スライド1.PNG](https://qiita-image-store.s3.amazonaws.com/0/147091/149c35f7-d3a9-e991-d534-66c82cc0a541.png)
のような表現になります。

---
　赤電卓と黒電卓の２つのインスタンスを連携させて操作する簡単な処理について、このインスタンスの記号を用いて表現した流れ図が
![個々のインスタンスの操作を示す流れ図.png](https://qiita-image-store.s3.amazonaws.com/0/147091/1508b993-4611-354f-1625-abbb0f617869.png)
のような形になります。

---
　このフローチャートの形のJava言語のコードが

```Java
Dentaku2 AkaDentaku = new Dantaku2();
Dentaku2 KuroDantaku = new Dentaku2();
AkaDentaku.tasu(2.0);
KuroDentaku.tasu(5.0);
AkaDentaku.kakeru(4.0);
Double a = AkaDentaku.tasu(0.0));
a += KuroDentaku.tasu(0.0));
If (a >= 10.0)
        System.out.println(“赤電卓の答は” + AkaDentaku.tasu(0.0));
Else
        System.out.println(“黒電卓の答は” + KuroDentaku.tasu(0.0));
```
です。

---
　メインのフローの解析を邪魔せずに流れ図として表現するためには、ＯＯＰ用の流れ図記号を導入するといいと考えました。

　このインスタンス記号のドロー画像を[「オブジェクト指向プログラミング入門キット２」](http://seastar.la.coocan.jp/ss/download/oop-practice-kit2.zip)のパワーポイントスライドの中に入れています。独自の流れ図に組み込んでみたいときは活用いただけます。
『ふつうのLinuxプログラミング』サンプルプログラムをGoで書いてみる① #golang

## はじめに
[ふつうのLinuxプログラミング(第二版)](https://www.amazon.co.jp/%E3%81%B5%E3%81%A4%E3%81%86%E3%81%AELinux%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0-%E7%AC%AC2%E7%89%88-Linux%E3%81%AE%E4%BB%95%E7%B5%84%E3%81%BF%E3%81%8B%E3%82%89%E5%AD%A6%E3%81%B9%E3%82%8Bgcc%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%81%AE%E7%8E%8B%E9%81%93-%E9%9D%92%E6%9C%A8-%E5%B3%B0%E9%83%8E/dp/4797386479/ref=pd_lpo_sbs_14_t_0?_encoding=UTF8&psc=1&refRID=E0EMCHJ2XMS5BSREFVWW)が12年振りにリニューアル発売されるという話を聞いて、さっそく予約購入しました。

わたしは全くのプログラミング初心者のときにGoに出会い、基礎の基礎から学び初めて1年ほどになる新米プログラマ/社内SEです。

Goを学ぶ中で、勉強会等に参加してもOSやカーネル周りの知識がないために理解が進まないことが多く悩んでいました。
そこで、この本を読んで基礎から勉強しようと思いました。

本の中では全てのプログラムがC言語で書かれていますが、せっかくなのでGoで書き直してみようと思い、この記事を書きました。

誤りや良くない書き方がありましたら、コメント等でご指摘いただければ幸いです :bow: 

## コマンドライン引数を表示するプログラム

```:args.c
#include <stdio.h>
#include <stdlib.h>

int
main(int argc, char *argv[])
{
	int i;

	printf("argc=%d\n", argc);
	for (i = 0; i < argc; i++) {
		printf("argv[%d]=%s\n", i, argv[i]);
	}
	exit(0);
}
```

出典: [ふつうのLinuxプログラミング(第二版)](https://www.amazon.co.jp/%E3%81%B5%E3%81%A4%E3%81%86%E3%81%AELinux%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0-%E7%AC%AC2%E7%89%88-Linux%E3%81%AE%E4%BB%95%E7%B5%84%E3%81%BF%E3%81%8B%E3%82%89%E5%AD%A6%E3%81%B9%E3%82%8Bgcc%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%81%AE%E7%8E%8B%E9%81%93-%E9%9D%92%E6%9C%A8-%E5%B3%B0%E9%83%8E/dp/4797386479/ref=pd_lpo_sbs_14_t_0?_encoding=UTF8&psc=1&refRID=E0EMCHJ2XMS5BSREFVWW) P18

## Goで書いてみる
```:args.go
package main

import (
	"fmt"
	"os"
)

func run() error {
	argc := len(os.Args)
	if argc < 2 {
		return fmt.Errorf("引数が足りません。")
	}
	fmt.Println("argc=", argc)

	for i := 0; i < argc; i++ {
		argv := os.Args
		fmt.Printf("argv[%d]=%s\n", i, argv[i])
	}

	return nil
}

func main() {
	if err := run(); err != nil {
		fmt.Fprintf(os.Stderr, "%s\n", err.Error())
		os.Exit(1)
	}
}
```

エラー処理、関数の切り分けについては、
Women Who Goでハンズオンの教材としている[@tenntenn](https://twitter.com/tenntenn)さんの[github.com/tenntenn/gohandon](https://github.com/tenntenn/gohandson/blob/master/imgconv/ja/solution/src/step2/cmd/imgconv/main.go)を参考にさせていただきました。


Goではfmtパッケージによってフォーマットが容易に選べる点が便利だと感じました。
またGoのmain関数は引数と戻り値を持たないため、C言語で書かれたサンプルプログラムとは異なる構成になりました。

## 参考
[github.com/tenntenn/gohandon](https://github.com/tenntenn/gohandson/blob/master/imgconv/ja/solution/src/step2/cmd/imgconv/main.go)
[Goでコマンドラインツールを作ろう #1](https://qiita.com/akane256/items/0f4a463a84b71e2134ac)
Arduino-ESP32 I2C < PCAL9555APW GPIOエクスパンダ > 

# PCAL9555APW GPIOエクスパンダ 
スイッチサイエンスさんのGPIO エクスパンダボードの動作を確認します。
GPIOポートが足りない場合などに有用なチップです。
https://www.switch-science.com/catalog/2352/

ESP32でのI2Cのピンアサインなどは[こちら](https://qiita.com/T-YOSH/items/be0be9d66da85fb6a001)を確認してください。
I2C接続なので、SDA, SCL, 3V3, GNDを接続します。

スイッチサイエンスさんのArduinoのサンプルをESP32向けに少し変更して使用しました。
http://trac.switch-science.com/wiki/PCAL9555APW

各GPIOの値を読み出ししてログに表示するサンプルです。

```sample_pcal9555apw.ino

/*******************************************************************************
// SWITCHSCIENCE wiki -- http://trac.switch-science.com/
// PCAL9555APW Arduino Sample
*******************************************************************************/
#include <Wire.h>

#define PCAL9555APW_ADDR 0x20 // in 7bit for Arduino

#define INPUT_REG     0x00
#define OUTPUT_REG    0x02
#define INVERS_REG    0x04
#define CONFIG_REG    0x06
#define OUTPUT_DRIVE  0x40
#define INPUT_LATCH   0x44
#define PULLUP_EN     0x46
#define PULLUP_SEL    0x48
#define INTRRPT_MASK  0x4A
#define INTRRPT_STAT  0x4C
#define OUTPUT_CONFIG 0x4F

#define NUM_OF_PORT 16

void datasend(int,int,int *,int);
void dataread(int,int,int *,int);

void setup()
{
  Serial.begin(115200); 
  Wire.begin(21,22);
}

void loop()
{

  int port_input[2]; //入力状態を取得する変数
  dataread(PCAL9555APW_ADDR, INPUT_REG, port_input, 2);
  Serial.print("port0:");
  Serial.println(port_input[0], BIN);
  for(int i =0; i < (NUM_OF_PORT/2) ; i++){
    int value = (port_input[0]>>i) & 1;
    Serial.print("\tGPIO ");
    Serial.print(i);
    Serial.print(" value : ");
    Serial.println(value);
  }
  Serial.print("\tport1:");
  Serial.println(port_input[1], BIN);
  for(int i =0; i < (NUM_OF_PORT/2) ; i++){
    int value = (port_input[1]>>i) & 1;
    Serial.print("\t\t\GPIO ");
    Serial.print(i+8);
    Serial.print(" value : ");
    Serial.println(value);
  }

  
  delay(500);
}

void datasend(int id,int reg,int *data,int datasize)
{
  Wire.beginTransmission(id);
  Wire.write(reg);
  for(int i=0;i<datasize;i++)
  {
    Wire.write(data[i]);
  }
  Wire.endTransmission();
}

void dataread(int id,int reg,int *data,int datasize)
{
  Wire.beginTransmission(id);
  Wire.write(reg);
  Wire.endTransmission(false);
  Wire.requestFrom(id, datasize, false);
  for(int i=0;i<datasize;i++)
  {
    data[i] = Wire.read();
  }
  Wire.endTransmission(true);
}
```
\<補足>
秋月電子さんにもI2CのGPIOエクスパンダーがあるので、入手したら試してみたいと思います。
http://akizukidenshi.com/catalog/g/gI-09486/
C++でよく困るマルチバイト文字セットとUnicode文字セットのAPI変換チートシート

C/C++のAPIでマルチバイト文字セットとUnicode文字セットに対応するチートシートです。

これまでマルチバイト文字セットをよく使ってたんであまり気にしてなかったのですが、最近マルチバイト文字セット→Unicode文字セットへ変換することがあり、そこで使われているAPIを置き換えていたんですが、どのAPIも単純に頭に'w'をつければよいというわけでなく、毎回混乱してgoogle先生に頼っていたのでひとまず実際に使ったやつについて表にまとめてみました。

※他にもよく使うものがあれば追記予定

# API表
|マルチバイト文字セット|Unicode文字セット|概要|
|:------:|:-------:|:-------|
|sprintf|swprintf|指定した文字列書式に従って文字列配列に書き込む|
|sprintf_s|swprintf_s|安全なsprintf|
|\_splitpath|\_wsplitpath_s|パスをファイル名と拡張子に分解する|
|\_splitpath_s|\_wsplitpath_s|安全な_splitpath|
|\_makepath|wmakepath|ドライブ名、ディレクトリパス、ファイル名、拡張子から絶対パスを作成する|
|\_makepath_s|wmakepath_s|安全な_makePath|
|strlen|wcs len|文字列の長さを取得する|
|fopen_s|_wfopen_s|ファイルを開く|
|rename|_wrename|ファイルを変更する|
|remove|_wremove|指定されたファイルを削除する|
|strcpy_s|wcscpy_s|文字列をコピーする|
|strcat_s|wcscat_s|文字列を結合する|
|strrchr|wcsrchr|文字列を検索する|



# 命名規則(推測)

## 基本系

頭になにもついてないので_wをつける
> rename -> _wrename

動詞の直前に
> sprintf -> swprintf

## ストリング接頭辞をワイド文字列に
str~はwcsに
> strcpy_s -> wcscpy_s

## よくわからない
頭にwをつけてついでにアンダーバーもつけちゃったぜ
> fopen_s -> \_wfopen_s



ひとまずこんなところでしたけど、ほんと混乱するのでなんとかしてほしい次第……