OmniAICreator/Qiita-1.07M huggingface dataset:
EC-CUBE 次期バージョン 3.n説明会振り返り

アドベントカレンダー6日目です。

せっかくの機会ですので、現在進行中のEC-CUBE 次期バーション 3.nの説明会を振り返ります。
当初は3.1計画としてスタートしたProjectでしたが、説明会を重ねるなかで、より踏み込んだバージョン・アップとして、3.1では収まらないレベルであることからナンバリングを検討するために、現在は3.nとしております。
そうやって重ねてきた説明会をすこしまとめて振り返ります。各回の資料も公開しておりますのでこの機会にぜひご覧いただければ幸いです。


## 3月 EC-CUBE3.1開発方針説明会資料 機能カスタマイズ編

スライド：https://www.slideshare.net/ec-cube-official/clipboards/201703_ec-cube3-1

スタートは、3月の3.1開発方針説明会でした。

ここでは、主にEC-CUBEで機能カスタマイズを行ってきた方々をターゲットに、3.1の開発方針を説明し、方針への期待や不安を測ることとしました。
3.0系が安定してきたこと周辺のプラグイン環境も充実してきてことをお伝えしつつ3.1の開発方針として、学習コストと開発コストを下げることを方針として説明させていただきました。

+ 機能カスタマイズのハードルを下げるための新機構の紹介 
+ プラグインの依存関係を解決する機構
+ フレームワークのアップグレードに対応したUpgrade Fixer
などの機能カスタマイズを中心にしつつ、フロントのFormHelperを分解しHTMLとCSSだけの知識でもデザインが理解しやすくする事や、HTMLのコーディングルールを理解しやすくするスタイルガイドを提供する方針についても紹介しました。


## 6月 EC-CUBE3.1開発進捗説明会資料 デザインカスタマイズ＆新機能編

スライド：https://www.slideshare.net/ec-cube-official/clipboards/201706_ec-cube3-1

6月にはα2としてリリースさせていただき、主にEC-CUBEでデザインカスタマイズをされている方々にむけて3.1の開発進捗をお伝えいたしました。

+ スタイルガイドの具体的な説明
+ 商品の別送や別注文への同梱に対応した出荷管理機能
+ その他細かな機能改善

特にその他では、URLからHTMLをなくす話や、CSVによるデータインポートなど、デザインカスタマイズ中心でも色々と触る機会の多い、痒いところへの機能改善がはいっていることを紹介させていただきました。

## 6月 3.1開発合宿

6月の説明会後に、EC-CUBEのインテグレートパートナーやプラグインを多く提供いただいている開発者の方をあつめて、3.1のこれまでの進捗の共有とさらに改善を行いたい以下の点について議論しました。

+ 新拡張機構（拡張API）の実装のレビュー・プラグイン開発テスト
+ 管理画面のUIの見直し
+ デザイン管理機能の見直し

この合宿を通じて、さらに多くの改善案があつまり、3.1という規模からさらに踏み込んで、3.nとして進めることを決定しました。

## 10月 EC-CUBE開発進捗説明会 

スライド：https://www.slideshare.net/ec-cube-official/clipboards/201710_ec-cube

10月の説明会では、6月の説明会、合宿でのフィードバックを元に3.nとして大きく開発を進めてきた内容として

+ 管理画面UIの改善の説明
+ カスタマイズ・プラグイン制作の実際に手法についてライブコーディングで説明

をおこない、合宿であがった課題にどう対応しているのかや、2系のようなカスタマイズと汎用的なプラグインの制作がそれぞれどの程度の内容なのかご覧いただきました。

## 11月 EC-CUBE 次期バーション 最新機能紹介

スライド： https://www.slideshare.net/ec-cube-official/20171117-83124494

11月には初心者の方も広く対象に、3.nで強化される各ポイントとして

+ デザインカスタマイズ向けのスタイルガイドとコードエディター
+ PCファーストで刷新された管理画面UIのプロトタイプ
+ 本体とオーナーズストアの連携

などを具体的に紹介させていただきました。中でも管理画面UIのプロトタイプは実際にさわっていただき、非常に好感をいただきました。

## 説明会を振り返って

説明会を重ね、いただいたお声を少しづつ形にしていくなかで、3.nへの期待感の高まりを日々感じています。

アンケートの感想などを見ても、やはり新しいものへの学習コストは一定感じられているものの、デザインカスタマイズ・機能カスタマイズ共に学習効率や開発コストについては期待がよせられています。
特に、「3.0ではデザイナーレベルでは難しかった点が、３.nでは解消されているように見える」といったお声や「今までのバージョンで一番良い気がする」「管理機能の使いやすさの面で3.ｎ系を進めていきたい！」といったお声もありがたい限りです。

もちろん、「メモリ使用や速度面でのパフォーマンス不具合数など安定したものであるかを確認できれば利用させてもらおうと思います。」といったお声や「半年は、勉強期間として私自身のスキルを挙げてからクライアントに提案したいと思います」というように、慎重なお声もあります。
こういった点は単なる機能だけではなく、しっかりとした作りこみと、ドキュメントなどの学習環境の整備にかかってきます。

当初は3.1として年内でのリリースを目標に開発を進めてきましたが、いただいたお声、フィードバックを参考にまだまだ開発を進めており、リリース時期をお約束できる段階ではありませんが、よりしっかりと作り込んだ形でお届けできるよう、期待いただければと考えております。

12月は皆様お忙しい時期ですので、説明会は開催せず次回の説明会は1月末を想定しています。
それまでお待ちいただけない方は、[パートナー忘年会](http://ptix.at/ohUm0j)を開催しておりますので、お時間よろしければぜひご参加ください。
Theanoのscanを使ってフィボナッチ数列を計算する。

## Theano
Pythonの数値計算ライブラリ。
自動微分を行ってくれるので深層学習でよく使われる。
今更ながら勉強してます。

## scanについて

Theanoにおける繰り返し処理に対応する関数。
RNNなどの時系列処理における中心的役割を担う関数。

使い方は下記が分かりやすかった。
[Python Theano function / scan の挙動まとめ](http://sinhrks.hatenablog.com/entry/2015/04/25/233025)

## フィボナッチ数列

フィボナッチ数とは第 n 項の値が第 n - 1 項と第 n - 2 項の和となる数のこと
これを並べた
0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946, …
みたいな数列をフィボナッチ数列と言う。

詳しくは[Wiki](https://ja.wikipedia.org/wiki/%E3%83%95%E3%82%A3%E3%83%9C%E3%83%8A%E3%83%83%E3%83%81%E6%95%B0)参照

## やってみた

こんな感じでできた。

```py
import numpy as np
import theano
from theano import tensor as T


def fib(seq1, seq2):
    return seq2, seq1 + seq2


x = T.iscalar('x')
y = T.iscalar('y')
n = T.iscalar('n')
result, _ = theano.scan(fn=fib,
                        outputs_info=[x, y],
                        sequences=None,
                        non_sequences=None,
                        n_steps=n)
f = theano.function(inputs=[x, y, n], outputs=result)
print f(0, 1, 20)[0]
[   1    1    2    3    5    8   13   21   34   55   89  144  233  377  610
  987 1597 2584 4181 6765]
```

最初に[0, 1]を与えてあげる。20は計算回数。
n項目の計算は、(n-1)+(n-2)なので、3項目の計算は、1項目と2項目の和となる。
また、n+1項目の計算は、(n)+(n-1)なので、n-1項目の値は、n,n+1での計算に使われる。
なので、fib関数でn項目の計算時、seq1 + seq2[(n-1)+(n-2)]だけでなく、seq2[(n-1)]の値も返している。
（n+1項目の計算でn-2項目の値は不要なので、seq1は返す必要がない。）

もっと良い書き方もある気がするけど、とりあえずできた。
scanの挙動を勉強するには良い練習だった。
terraformはどの単位で分割すべきか

terraformでインフラ管理をする際のベストプラクティスとして、`実行単位を細かく分けよう`というのがあるのですが、安全に運用するためにはどのレベルで分割を行うべきかについて考えてみました。

# terraformとは
https://www.terraform.io/

AWSやGCPなどのインフラ等をコードで管理するツールです。

# なぜ分割して管理する必要があるのか
[Terraform Best Practices in 2017
](https://qiita.com/shogomuranushi/items/e2f3ff3cfdcacdd17f99)に記載がありますが、1つのtfstateファイルで多くのリソースを管理してしまうと、問題があった場合の影響範囲が大きくなってしまいます。
また、変更したい場所以外で何かしらの差分がある場合、その差分の原因を突き止めるまで更新が出来ない等いろいろ不便な状況になります。(本番環境でなんかよくわからないけど差分が出ちゃった場合それを無理やり元に戻すなんてなかなか出来ないですよね。。)

だからといって、すごく細かくリソースを分割して管理すると運用上煩雑度が増すので、楽で安全に運用できる塩梅を探したいなと思っています。

# 案
## 変更頻度で分ける
AWSでシステムを運用する場合、よく変更するものしないものがあると思います。例えばVPCやルーティングテーブル等の設定は開発時には変更があるかもしれませんが、運用に入ってからはそんなに頻繁に変更することは少ないのではないでしょうか。逆にEC2やsecurity group等は、EC2のインスタンスサイズ変更、アクセス元IPアドレスの追加等、運用に入ってからもちょこちょこ変更がありそうです。

## AWSのサービス単位で分ける
AWSのサービス毎にEC2ならEC2、S3ならS3をまとめて管理する案です。ただ、同一サービスの中にも重要度の高いもの、低いもの等があると思う(例えばEC2ならwebサーバと踏み台サーバでは何かあったときの影響度に差がある)ので、単純にAWSのサービス単位で分けるのはあまり安全な分割方法ではなさそうな気がします。


## システム内の役割単位で分ける
システム内の役割単位で分けるのも一つの手かもしれません。商用のサービスを提供しているEC2、RDS、管理用のEC2(例えば踏み台サーバ)等に役割ごとに分けておくと、管理用EC2の設定を更新した際に仮に問題が起こってもサービス自体には影響が及ばない等メリットがありそうです。

# まとめ
最終的にこれと言った答えは自分の中でも出てないですが、変更頻度やシステム内での役割を考慮しつつ分割していけば良いのかなと思っています。
個人的な案としてはこんな感じにするのが良いのかなと考えています。

1. network
    - ネットワーク系の設定VPC、subnet、NAT、routing等の設定を管理
- securitygroup
    - セキュリティグループの管理
- iam
    - IAMの管理
- s3
    - S3回りの管理
- backend
    - DB等のデータストア関連のリソースを管理
- webservers
    - webサーバやALB等の管理
- opsservers
    - 運用系のサーバの管理


terraform自体の変化とともに最適な構成は変わってくると思うので、今後も運用しながら適切な構成を探っていきたいなと思います。
FactoryGirl 外部キーのuniquenessテストで手こずったこと

まず、belongs_to, has_many の関係で外部キーに関するテストを行いたかった。。。。が 



# 書いていたコード

## model

```ruby
class UserName < ApplicationRecord
  belongs_to :user
```

## facrtory
```ruby
FactoryGirl.define do
  factory :user_name do
    name 'hogehoge'
    user_id 1
  end
end
```

## model_spec
```ruby
context 'uniqueness' do
 subject { create(:user_background) }
 it { is_expected.to validate_uniqueness_of(:user_id) }
end
```

## error

```
.F

Failures:

  1) UserBackground#create should have a unique user_id
     Failure/Error: should validate_uniqueness_of(:user_id)

     Shoulda::Matchers::ActiveRecord::ValidateUniquenessOfMatcher::ExistingRecordInvalid:
       validate_uniqueness_of works by matching a new record against an
       existing record. If there is no existing record, it will create one
       using the record you provide.

       While doing this, the following error was raised:

         PG::NotNullViolation: ERROR:  null value in column "user_id" violates not-null constraint
         DETAIL:  Failing row contains (17, null, null, 2017-12-06 20:38:00.990373, 2017-12-06 20:38:00.990373).
         : INSERT INTO "user_backgrounds" ("created_at", "updated_at") VALUES ($1, $2) RETURNING "id"

       The best way to fix this is to provide the matcher with a record where
       any required attributes are filled in with valid values beforehand.
     # ./spec/models/user_background_spec.rb:18:in `block (3 levels) in <top (required)>'
     # ------------------
     # --- Caused by: ---
     # PG::NotNullViolation:
     #   ERROR:  null value in column "user_id" violates not-null constraint
     #   DETAIL:  Failing row contains (17, null, null, 2017-12-06 20:38:00.990373, 2017-12-06 20:38:00.990373).
     #   ./spec/models/user_background_spec.rb:18:in `block (3 levels) in <top (required)>'

```

# 原因

どうやら、user_id は外部キーであるために直接いれてはいけないらしいです。
ということで、アドバイスをもらいつつこんな感じにもしましたがだめでした。

## facrtory
```ruby
FactoryGirl.define do
  factory :user_name do
    name 'hogehoge'
    user_id user
  end
end
```


# 解決策
こちらを参考にさせてもらいもらったところこんな感じでいけました。
http://shim0mura.hatenadiary.jp/entry/2014/06/29/002102

## factory

``` ruby
FactoryGirl.define do
  factory :user_name do
    image_url { Faker::File.file_name('path/to') }
    association :user, factory: :user
  end
end
```

## model_spec
```ruby
context 'uniqueness' do
  subject { create(:user_background) }
  it { is_expected.to validate_uniqueness_of(:user_id) }
end
```


# まとめ
belongs_to, has_many が関連するモデルをテストする場合は

## model_spec

### belongs_to :user
```ruby
 association :user, factory: :user
```

### has_many :user
```ruby
  users {[
      FactoryGirl.create(:user)
    ]}
```

でassociationをくんであげると善きみたいですね。
JavaプロジェクトでElmのビルドする


https://github.com/kawasima/bouncr
これのpomとpackage.jsonみて

# 前提
Javaに軽量Webフレームワークのenkanとkotowariというのがあるんですが
https://qiita.com/kawasima/items/723646eb30a91d724352
これを使うとClojureみたいにrepl(疑似repl)を立ち上げっぱなしにして、その中で`/compile`とか`/reset`して開発するんですよ

[Bouncr](https://github.com/kawasima/bouncr) （バウンサー）ではviewは基本的にテンプレートエンジンですがちょっとリッチな入力フォームが欲しかったので一部をElmで作りました

# `/compile` -> `/reset`
`/compile` -> `/reset`でElmのbuildも走るようにしました

enkanでの開発は、コードを書き換えたら疑似replで`/compile` をたたいてmvn compileして、次に`/reset`して実際に動いているものと入れ替える（たぶんclass loaderを作り直す感じだと思ってる）というフローになっているので`/compile`でElmのbuildが一緒に走ればいいということになりました

# exec-maven-plugin
exec-maven-pluginというのがあってこれ使うと任意のコマンド叩けます
叩くコマンドは[package.json](https://github.com/kawasima/bouncr/blob/master/package.json#L12) に用意しました
`yarn run build:elm`を実行するとelmからjsファイルが作られます

で、これをたたくようにpomに書きます
https://github.com/kawasima/bouncr/blob/06b6becc7c5bfa4c843aeddfcd3a243b5f6f708f/pom.xml#L256
maven lifecycleのgenerate-sourcesのときに呼ばれるようになります


これでElmもJavaも一貫した開発フローで回せるようになりました
ただElm入ってないとcompileこけるようになってしまった問題がありますが、ちょっとmaven力が足りないので自分でやってません・・・

Formの一部分でもリッチなものを作るのにElmを使ってみてもいいと思います
ただuglify通しても200kbくらいあって、これは、大きいんだろうな・・・
0.19でサイズ下がるといいですね
Rails PostgresqlでDate/Datetime型のカラムから"年・月・日"などでデータを抽出する

### 経緯
誕生日情報を持ったDBより"今月が誕生日のユーザー"を抽出したくて調べた際の忘備録です。

## 環境
Ruby     2.3.0
Rails    5.0.4
Database Postgresql

### 参考
[stackoverflow: ActiveRecord Find By Year, Day or Month on a Date field](https://stackoverflow.com/questions/9624601/activerecord-find-by-year-day-or-month-on-a-date-field)

---

### 例
```rb:schema.rb
create_table "users", force: :cascade do |t|
  t.string   "name"
  t.datetime "birthday"
end
```
↑こんな感じのDBから今月の誕生日のユーザーの一覧を表示したいという感じです。

# SQL関数を利用して抽出する
SQLの日付関数の"EXTRACT"関数を利用して抽出できました。

>### EXTRACT
EXTRACT(日付 FROM 日付)

>日付データからその一部分、たとえば「年」や「月」、または「時間」や「秒」だけを切り出す場合に使用。戻り値は日付型ではなく数値型になる。

<small>
※SQLの日付関数はDBMSによって実装がバラバラらしいので利用しているDatabaseによってはうまく抽出できないかもしれません。
EXTRACT関数は"Postgresql"と"Mysql"では利用可能な様子です。
</small>

SQLで書くと下記のような感じです。

```sql
SELECT CURRENT_TIMESTAMP,
    EXTRACT(YEAR   FROM CURRENT_TIMESTAMP) AS year,
    EXTRACT(MONTH  FROM CURRENT_TIMESTAMP) AS month,
    EXTRACT(DAY    FROM CURRENT_TIMESTAMP) AS day,
    EXTRACT(HOUR   FROM CURRENT_TIMESTAMP) AS hour,
    EXTRACT(MINUTE FROM CURRENT_TIMESTAMP) AS minute,
    EXTRACT(SECOND FROM CURRENT_TIMESTAMP) AS second;
```

##### 実行結果

now | year | month | day | hour | minute | second
--- | --- | --- | --- | --- | --- | ---
2017-12-07 09:45:33.987+09 | 2017 | 12 | 7 | 9 | 45 | 33.987

Railsでは、上記を参考にしてActiveRecordのwhereメソッドを利用して誕生日月のユーザーを抽出します。


```rb:controllers/users_controller.rb
class UsersController < ApplicationController
  def index
    // 現在の日時の月
    now_month = Time.now.month
    
    @birtyday_users = User.where('extract(month from birthday) = ?', now_month)
  end
end
```
画面に描画します。

```erb:views/users/index.html.erb
<h1>今月誕生日のユーザー</h1>

<% if @birtday_users.any? %>
  <dl>
    <% @birthday_users.each do |user| %>
      <!-- 見やすいように表示を整えてます -->
      <dt><%= user.birthday.strftime('%m月%d日') %></dt>
      <dd><%= user.name %></dd>
    <% end %>
  </dl>
<% end %>
```

こんな感じで今月の誕生日のユーザーの一覧を描画できました。
EXTRACT関数を使用すれば用途に応じて"年"や"日"毎でデータを抽出して利用できそうです。
BaseElementsのファイルインポートエラー

ベースエレメンツでファイルをインポートしようとした際にこのようなエラーが発生した。
`The xslt plugin produced no output file.
<<ファイルパス>>¥BaseDirectory.csv
BaseDirectory
`


##対策
セットアップの
XSLタイプを「Xalan」に変更する。

![ベースエレメンツでファイルインポートのエラー3.png](https://qiita-image-store.s3.amazonaws.com/0/215529/bb141640-242c-1edf-2aff-ac9ced31e234.png)

これで再度インポートを行い、エラーが発生しないことを確認した。
Dialogflow V2 API の紹介 

Actions on Google Advent Calendar 2017の12/6に空きができたので、Dialogflow V2 API の紹介で埋めたいと思います:smiley:

#Diaglogflow V2 API
Dialogflowから新しいAPIがリリースされました。新しいAPIはGoogleのインフラやサービスを活用し、より強力なAPIになりました。新しいAPIはDialogflow Standard EditionとEnterprise Editionの２つのEditionを公開しています。２つのEditionを簡単にまとめてみました。

### Diaglogflow V2 APIの特徴
- AudioによるIntentの検出
    - これからはテキストのリクエストだけではなく音声にも対応します
- ストリーミングによるIntentの検出
- [APIからIntentの作成](https://qiita.com/flatfisher/items/a0e13aba8761ae5b7e6b)
- [APIからIntentの削除](https://qiita.com/flatfisher/items/a0e13aba8761ae5b7e6b)


## Dialogflow Standard Edition
- APIリクエストが少ない小規模なプロジェクトやDialogflowを試したい人向け
- dialogflow.comで無料で利用できる
- Enterprise Editionと同じ機能を使用できる
    - ただしAPIリクエスト数に制限がある
- コミュニティと電子メールによるサポートが提供される

## Dialogflow Enterprise Edition
- エンタプライズレベルのサービスを必要とする人向け（ビジネス向け）
    - 将来スケールアップしたい人向けでもある
- 従量課金制である
    - Google Cloud Platform（GCP）の一部として提供される
- APIリクエスト数に制限が無い
    - リクエスト数に応じた従量課金制である
- コミュニティ、電子メール、Google Cloudサポートによるサポートが提供される

## Dialogflow V2 APIを試す
Dialogflow V2 APIは既存のdialogflowのプロジェクトからすぐに試すことが出来ます。Dialogflow V2 APIは**現在ベータ版**ということを理解した上でお試しください。

<img width="720" alt="Screen Shot 0029-11-25 at 10.15.56.png" src="https://qiita-image-store.s3.amazonaws.com/0/114922/8d9dbae3-e0f9-e82b-e6d6-16c2b88b5908.png">
正規表現での漢字マッチをUnicodeプロパティーを使って綺麗に書く方法 in Python

# Unicode暗記してますか?
日本語で自然言語処理をやったことがある人なら誰もが一度はぶつかるであろう問題が、特定の文字種だけを抜き出す処理だと思います。
「python 正規表現 漢字」などで検索すると

```py3
re.search([あ-んア-ン一-鿐])
```
こんな感じの正規表現がよく見付かると思います。`あ-ん`と`ア-ン`はまあいいとして`一-鿐`これ本当に正しいんでしょうか?別のサイトでは`[一-龠]`と書いてあったりして、よく分かりません。
そもそもこの形式の範囲指定でいいんでしょうか?つまりユニコードで本当に全ての漢字が一塊に配置されているんでしょうか?[^C]
答えはノーで、この形式では漢字を取り零すか、漢字以外のものも含むかしかありません。([参考](http://tama-san.com/kanji-regex/))

[^C]: こういう範囲指定って、C言語でAsciiだけ扱ってたころの匂いを感じるのは私だけでしょうか?

# Unicode Script
そこでUnicode scriptの登場です。これはUnicode側の定義で文字種などを定義しているものになります。`\p{Ascii}`や`\p{Katakana}`などがあります。
なんかBlockとかPropertyとかSciptとか色々あって、厳密には違うみたいなんですが、調べてる+書いてる時間がないので、本記事ではScriptでいきます。
python以外の言語で漢字の正規表現方法を調べると、これを使った用例がいっぱい出てくると思います。

# regexモジュール
ところがpythonの正規表現モジュール`re`は、Unicode Scriptは使えません。
が、[`regex`](https://pypi.python.org/pypi/regex)という、`re`の代替を狙ったモジュールがあり、こちらはUnicode Scriptに対応しています。

```py
>>> import regex
>>> regex.findall(r'\p{Han}+',"朝早く起きた")
['朝早', '起']
```
このように、漢字だけにマッチしていることが分かります。

```py
>>> print(regex.findall(r'[あ-んア-ン一-鿐]',"々"))
[]
>>> regex.findall(r'\p{Han}+',"々")
['々']
```
Unicode Scriptだけで拾える場合もあります。


# 漢字以外にもScriptによる文字種指定を使おう
気付いた人もいると思いますが、最初に出てきた`[あ-ん]`は間違いです[^引用]。「ぁ」に引っ掛りません。片仮名も同様でかなり深刻ですよね。漢字だけでなく、平仮名、片仮名でも文字種で指定した方が安全ですね。

```py
>>> regex.findall(r'\p{Katakana}+',"ファンターを飲んだ")
['ファンタ']
>>> regex.findall(r'\p{Hiragana}+',"ファンターを飲んだ")
['を', 'んだ']
```
ただし、延ばし棒が記号扱いで、拾えなかったりするので、そこは適宜補う必要があります[^記号]。

皆さんも是非、正規表現を使いこなして、楽しく日本語自然言語処理をしましょう。

[^引用]: 見に行ったページに書いてあったので、あえてそのまま載せてます。
[^記号]: 確か`\p{S}`とかで記号が拾えたような…(駄目みたいです。scivolaさんご指摘ありがとうございます。)
Phalcon3.1.2 改行コードが消える現象 textareaで

#改行コードはどこへ？
phalconの3.1.2使ってます。
いつのころからか、public/index.phpこのファイル内に不気味な記述を発見。

```php:public/index.php
    echo str_replace(["\n","\r","\t"], '', $application->handle()->getContent());
```

改行をすべて取り除け！という記述があるではないか！！！！

ってことで、ここは、

```php:public/index.php
    echo $application->handle()->getContent());
```

こうすることで解決。簡単でしたね。
SynologyのNASにインストールしたWordpressでパーマリンク設定ができるようにする

こんにちは。　Qiita初投稿です。よろしくお願いいたします(-_-)

最近SynologyのNAS(DS116j)を使ってポートフォリオサイトをWordpressで作成しています。パーマリンク設定を変更したところ、リンク先がすべて　404エラーになってしまった....　修復するまでの備忘録

#構成
NAS : DS116j(DSM 6)
Wordpress 4.9.1
Nginxを利用

#修復方法
DSMよりSSHが有効になっている前提。NASにSSH経由で接続
Nginxの設定を確認する

```
$ vim /etc/nginx/app.d/server.webstation-vhost.conf
```

下の方に以下のような記述があるところがあるのでパスをメモする

```
include /usr/local/etc/nginx/conf.d/固有の番号/user.conf*;
```



先程メモしたパス先にuser.conf.wordpress-permalinkファイルを作成し以下を記述(要root)

```
location /{
try_files $uri $uri/ /index.php?$args;
}
```

Nginxを再起動する

```
synoservicecfg --restart nginx
```

これでパーマリンク設定変えても404エラー出ることなくページ遷移できるようになります

#参考
[DSM6 : Configure Nginx for Wordpress permalinks (avoid 404)](https://stackoverflow.com/questions/36392365/dsm6-configure-nginx-for-wordpress-permalinks-avoid-404)
Visual Studio | WPF > SizeToContent="WidthAndHeight" > 内容に応じてウィンドウサイズを変更してくれる

```txt:動作環境
Windows 8.1 Pro (64bit)
Microsoft Visual Studio 2017 Community
Sublime Text 2
```

https://stackoverflow.com/questions/15710176/c-sharp-wpf-different-size-from-ide-after-debugging
> answered Mar 29 '13 at 19:48
Viv

により以下の指定が紹介されている。

```
SizeToContent="WidthAndHeight"
```

### デザイン時

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/78c3cf2c-bd76-35e8-477a-fb8a1afc81c0.png)

### 実行時

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/1eaf2374-569a-e60c-b397-c4418de52530.png)

右下にあるボタンに合わせてウィンドウサイズが変更される。

これは使えそう。

### リンク

[Window.SizeToContent プロパティ](https://msdn.microsoft.com/ja-jp/library/system.windows.window.sizetocontent(v=vs.110).aspx)
配列を使ったキューとスタック


## はじめに

この記事は書籍「[プロを目指す人のためのRuby入門](http://gihyo.jp/book/2017/978-4-7741-9397-7)」に掲載できなかったトピックを著者自らが紹介するアドベントカレンダーの7日目です。
本文に出てくる章番号や項番号は書籍の中で使われている番号です。


この記事では配列を使ったキューとスタックを説明していきます。

### 必要な前提知識

「プロを目指す人のためのRuby入門」の第4章まで読み終わっていること。

## 配列を使ったキューとスタック

配列はキューやスタックとして使うこともできます。

### キュー

キューは最初に入れたデータを最初に取り出すデータ構造です。このデータ構造はFIFO（First In First Out、先入れ先出し）と呼ばれることもあります。イメージ的には遊園地の入り口に並んだお客さんが順番に中へ入っていく様子を想像するとわかりやすいかもしれません。

![IMG_8205.JPG](https://qiita-image-store.s3.amazonaws.com/0/7465/31342df7-5c68-5694-7881-2cef281f9514.jpeg "IMG_8205.JPG")

配列をキューとして使う場合は、要素の追加に`push`メソッドを（`<<`でも可）、要素の取得と削除に`shift`メソッドを使います。

```ruby
queue = []

# 要素を末尾に追加する
queue.push '田中'
queue.push '鈴木'
queue #=> ["田中", "鈴木"]

# 先頭の要素を取得して削除する
queue.shift #=> "田中"
queue.shift #=> "鈴木"
queue       #=> []
```

### スタック


スタックは最後に入れたデータを最初に取り出すデータ構造です。このデータ構造はLIFO（Last In First Out、後入れ先出し）と呼ばれることもあります。イメージ的には洗ったお皿を棚にしまい、そのお皿を棚から出す様子を想像するとわかりやすいかもしれません。

![IMG_9648.JPG](https://qiita-image-store.s3.amazonaws.com/0/7465/6ece7736-119d-44cf-ec8a-9c039883c13d.jpeg "IMG_9648.JPG")


配列をスタックとして使う場合は、要素の追加に`push`メソッドを（`<<`でも可）、要素の取得と削除に`pop`メソッドを使います。

```ruby
stack = []

# 要素を末尾に追加する
stack.push '大きい皿'
stack.push '小さい皿'
stack #=> ["大きい皿", "小さい皿"]

# 末尾の要素を取得して削除する
stack.pop #=> "小さい皿"
stack.pop #=> "大きい皿"
stack     #=> []
```

なお、配列の先頭に要素を追加したい場合は`unshift`メソッドを使います。

```ruby
fruits = ['melon', 'orange']
fruits.unshift 'apple'
fruits #=> ["apple", "melon", "orange"]
```

### 参考：prependとappend（Ruby 2.5）

Ruby 2.5では`unshift`/`push`のエイリアスメソッドとして`prepend`/`append`が追加されました。
Ruby 2.5以降であればこちらを使っても構いません。

```ruby
array = [3, 4]
array.prepend(1, 2) #=> [1, 2, 3, 4]
array               #=> [1, 2, 3, 4]

array = [1, 2]
array.append(3, 4)  #=> [1, 2, 3, 4]
array               #=> [1, 2, 3, 4]
```

- [サンプルコードでわかる！Ruby 2\.5の主な新機能と変更点 \- Qiita](https://qiita.com/jnchito/items/f182b6f0093a6a3701a1)

## 次回予告

次回は配列の便利メソッドをあれこれ紹介します。
ToodoistのTips集


日々のタスク管理に非常に便利な「Toodoist」のTipsです。

## 期日を設定する

| 記述 | 設定される期日 |
|---|---|
|今日|今日|
|明日|明日|
|月曜日|次に来る月曜日|
|次の月曜日|今日から数えて2回目の金曜日|
|明日の15:00|明日の15:00|
|15|次に来る15日|
|+10|今日から数えて10日後|

## 繰り返しの設定

| 記述 | 設定される繰り返し |
|---|---|
|毎日|毎日|
|平日|毎週月曜〜金曜|
|毎週 月曜日, 金曜日|毎週月曜と金曜|
|毎月7日|次の7日から、毎月7日|
|毎末日|毎月の月末|
|毎月初|毎月の月末|
insert servlet

public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request,
			HttpServletResponse response) throws Exception {
		request.setCharacterEncoding("utf-8");

		///////////////////////////////////////////////
		// [閉じる]ボタン押下判定
		///////////////////////////////////////////////
		String type = request.getParameter("submitClose2");
		if (type != null) {// 本来ならば、"閉じる"文字列との比較になるのですが、文字化けするため、NULL比較にしています。
			return mapping.findForward("close");
		}

		///////////////////////////////////////////////
		// [申請]ボタン押下判定
		///////////////////////////////////////////////
		type = request.getParameter("submitshinsei");
		if (type != null) {// 本来ならば、"申請"文字列との比較になるのですが、文字化けするため、NULL比較にしています。
			return setKoutuhi(mapping, form, request, response);
		}

		///////////////////////////////////////////////
		// [初期処理]
		///////////////////////////////////////////////
		return init(mapping, form, request, response);


	}

	/**
	 * 初期処理です。
	 *
	 * @param mapping
	 * @param form
	 * @param request
	 * @param response
	 * @return ActionForward
	 */
	private ActionForward init(ActionMapping mapping, ActionForm form, HttpServletRequest request,
			HttpServletResponse response) throws Exception {


		KshinseiForm ksForm = (KshinseiForm)form;
		//ksForm = new KshinseiForm();

		//交通費新規申請画面の日付のプルダウン作成
		List<KbnData> selYmdList = makeYmdList();
		ksForm.setSinSelYmdList(selYmdList);


		request.getSession().setAttribute("selYmdList", selYmdList);


		// 遷移先は自画面(struts-config.xmlで定義)
		return mapping.findForward("success");
	}

	//交通費新規申請画面の日付のプルダウン作成メソッド
	private List<KbnData> makeYmdList()	{
		List<KbnData> selYmdList = new ArrayList<KbnData>();
		int mm = 20170801;
		for (int i=0;i<31;i++) {
			KbnData dd = new KbnData();
			String vDay = String.valueOf(mm++);
			dd.setKey(vDay);
			dd.setValue(vDay.substring(0, 4) + "/" + vDay.substring(4, 6) + "/" + vDay.substring(6, 8));
			selYmdList.add(dd);
		}
		return selYmdList;
	}

	private ActionForward setKoutuhi(ActionMapping mapping, ActionForm form, HttpServletRequest request,
			HttpServletResponse response) throws Exception {

		//formにあるJSPより取得したデータをKshinseiForm型にする
		KshinseiForm ksForm = (KshinseiForm)form;

		//JSPより取得したデータをSQLでインサートするほうへ移す
		DKoutuhiInfoData insertData = new DKoutuhiInfoData();
		insertData.setShainId("111003");
		insertData.setKinmuDay(ksForm.getSinSelYmd());
		insertData.setGyoumuNo(ksForm.getSinGyoumuNo());
		insertData.setVisit(ksForm.getSinVisit());
		insertData.setDepartArea(ksForm.getSinDepartArea());
		insertData.setArrivalArea(ksForm.getSinArrivalArea());
		insertData.setVehicle(ksForm.getSinVehicle());
		insertData.setKinngaku(ksForm.getSinKinngaku());
		insertData.setEtc(ksForm.getSinEtc());
		insertData.setJoutai("申請");
		insertData.setDelKbn("0");
		insertData.setEntryId("111003");
		insertData.setUpdateId("111003");


		// データINSERTクラス
		MKoutuhiInfo info = new MKoutuhiInfo();

		// データをINSERTクラスへリストデータ送信
		info.setKoutuhiInfo(insertData);

		// 遷移先は自画面(struts-config.xmlで定義)
		return mapping.findForward("kmeisai");


	}
insert jsp

		<html:form action="/kshinsei">
			<!-- 右側テーブル -->
			<table class="cssBorderNone">
				<!-- 右側ヘッダー -->
				<tr>
					<td class="cssHead"><p>&nbsp;&nbsp;交通費申請</p></td>
				</tr>
				<!-- 右側ヘッダー End -->
				<!-- 右側エラーメッセージ -->
				<tr><html:errors/></tr>
				<!-- 右側エラーメッセージ End -->


				<!-- 交通費情報入力 Area -->
				<tr>
					<td>
						<table class="csstable">
							<tr>
								<td>
									<!-- 入力 Area -->
									<table class="csskoutuuhitable">
										<tr>
											<td class="cssTitle">日付*</td>
											<td>
												<a>
												<html:select property="sinSelYmd" name="kshinseiform">
												<html:options
												collection="selYmdList"
												property="key"
												labelProperty="value" />
												</html:select>
												</a>
											</td>
										</tr>
										<tr>
											<td class="cssTitle">業務Ｎｏ*</td>
											<td class="itemunevenrow">
												<html:text property="sinGyoumuNo"  name="kshinseiform" />
											</td>
										</tr>
										<tr>
											<td class="cssTitle">訪問先</td>
											<td><html:text property="sinVisit" name="kshinseiform" /></td>
										</tr>
										<tr>
											<td class="cssTitle">出発地</td>
											<td class="itemunevenrow"><html:text property="sinDepartArea"  name="kshinseiform" /></td>
										</tr>
										<tr>
											<td class="cssTitle">到着地</td>
											<td class="itemunevenrow"><html:text property="sinArrivalArea"  name="kshinseiform" /></td>
										</tr>
										<tr>
											<td class="cssTitle">交通機関</td>
											<td class="itemunevenrow"><html:text property="sinVehicle"  name="kshinseiform" /></td>
										</tr>
										<tr>
											<td class="cssTitle">金額*</td>
											<td class="itemunevenrow">
											￥<html:text property="sinKinngaku" name="kshinseiform" /></td>
										</tr>
										<tr>
											<td class="cssTitle">備考</td>
											<td class="itemunevenrow"><html:text property="sinEtc" name="kshinseiform" /></td>
										</tr>
										<tr>
											<td class="cssTitle">状態</td>
											<td class="itemunevenrow">
											</td>
										</tr>
										<tr>
											<td class="cssTitle">申請日</td>
											<td class="itemunevenrow">
											</td>
										</tr>
										<tr>
											<td class="cssTitle">承認者</td>
											<td class="itemunevenrow">
											</td>
										</tr>
										<tr>
											<td class="cssTitle">承認日</td>
											<td class="itemunevenrow"></td>
										</tr>
									</table>
									<!-- 入力 Area End -->
								</td>
							</tr>
							<tr>
								<!-- ボタン Area -->
								<td align="right" >
									<table class="cssbuttontable">
										<tr>
											<td class="cssbutton">
											<html:submit property="submitshinsei" value="申請" />
											<html:submit property="submitClose2" value="戻る" /><br>
											</td>
										</tr>
									</table>
								</td>
								<!-- ボタン Area End -->
							</tr>
						</table>
					</td>
				</tr>
				<!-- 交通費情報入力 Area End -->


			</table><!-- <!-- 右側テーブル End -->
		</html:form>
回文である数式

# 概要
[文字列アルゴリズム advent calendar 2016 の21日目の記事](https://qiita.com/Shiho_tksam/items/17ed870cd4c8c0f1f478)にある
> 142+382×567=765×283+241

と同様の回文を紹介します。

# ウォームアップ
- 12 x 12 x 441 = 12 x 12 x 21 x 21 = 144 x 21 x 21.
- 13 x 13 x 961 = 13 x 13 x 31 x 31 = 169 x 31 x 31.

これらの回文では式の値（それぞれ63504, 162409）は回文ではありません。

# 式の値も回文である例
- 12 x 231 = 2772 = 132 x 21,
- 12 x 2331 = 27972 = 1332 x 21,
- 12 x 23331 = 279972 = 13332 x 21,
- ...

---

- 12 x 2121 = 25452 = 1212 x 21,
- 12 x 21021 = 252252 = 12012 x 21,
- 12 x 210021 = 2520252 = 120012 x 21,
- ...

---

- 12 x 23331 = 132 x 2121 = 279972 = 1212 x 231 = 13332 x 21
- 12 x 2333331 = 1332 x 21021 = 27999972 = 12012 x 2331 = 133332 x 21,
- 12 x 233333331 = 13332 x 210021 = 2799999972 = 120012 x 23331 = 133333332 x 21,
- ...

---
上記の回文はいずれも繰り上がりを含まず多項式として扱えます. (例えば 231 は 2x^2+3x+1 とみなす.)
そうではない次のような例もあります

96 x 933 x 2599 = 23 x 96 x 113 x 933 = 232787232 = 339 x 311 x 69 x 32 = 9952 x 339 x 69.



# Open?
- 最後の例の一般化
- 冒頭に引用したような足し算を含むタイプなど, もっとかっこいい回文を探す


引用した回文以外は自分で見つけましたが, 既出なら引用先を教えて頂けるとありがたいです。
Nim入門 (2)

# Nim入門

## はじめに

Nimの入門記事があまりにもないので、世の中の業務で使ってもらうためには日本語ドキュメントが足りないと感じたので、自分で翻訳記事を書くことにしました。

## 実行環境

* macOS High Sierra v10.3
* Docker v17.09.0-ce
* Docker Compose v1.16.1
* Nim v0.17.2
* nimble v0.8.8

## インストール

インストール記事は公式を参照のこと。  
https://nim-lang.org/install.html

Dockerでの作成方法については、記事を書いたのでそちらを参照して下さい。
<>

主にマニュアルをベースに解説していきます。  
https://nim-lang.org/docs/manual.html

## 標準構文(Syntax)

ここではNimの標準構文について説明します。
字句解析については以前に説明済みです。

Nimではユーザ定義の演算子が利用でき、バイナリ演算子には11段階の優先順位があります。

### 結合法則(Associativity)

最初の文字が^であるバイナリ演算子は右結合であり、他の2項演算子はすべて左結合です。
数学的な結合法則について改めて見直したい方はこちら  
[Wiki 結合法則](https://ja.wikipedia.org/wiki/%E7%B5%90%E5%90%88%E6%B3%95%E5%89%87)

```nim:
proc `^/`(x, y: float): float =
  # 右結合による除算
  result = x / y
echo 12 ^/ 4 ^/ 8 # 24.0 (4 / 8 = 0.5, 次に 12 / 0.5 = 24.0)
echo 12  / 4  / 8 # 0.375 (12 / 4 = 3.0, 次に 3 / 8 = 0.375)
```

### 優先順位

単項演算子は、常にバイナリ演算子よりも強力に作用します。  
$a + bは($a) + bであり$(a + b)ではありません。  

単項演算子の最初の文字が@の場合、それはプライマリサフィックスよりも強く結びつく"しるし"のような演算子です。   
@x.abcは(@x) .abcとしてかいせきされ、$x.abcは$(x.abc)として解析されます。

キーワードでないバイナリ演算子では、優先順位は次のような規則で決まります。  

->, ~>, => などのように矢印で終わる演算子は、すべての演算子の中でもっとも低い優先順位になります。

演算子が=で終わり、最初の文字が<、>、！、=、〜、？のいずれでもない場合は、2番目に優先順位の低い代入演算子です。

それ以外の場合、優先順位は最初の文字で決まります。

| 優先順位 | 演算子 | 最初の文字 | ターミナルシンボル |
| --- | --- | --- | --- |
|10||$ ^|OP10 | 
|9|* / div mod shl shr %|* % \ /|OP9|
|8|+ -	| + - ~ \| |OP8|
|7|&|&|OP7|
|6|..|.|OP6|
|5|== <= < >= > != in notin is isnot not of|= < > !|OP5|
|4|and||OP4|
|3|or xor||OP3|
|2|	|@ : ?|OP2|
|1|代入演算子 (like +=, *=)	||OP1|
|0|矢印っぽい演算子 (like ->, =>)||OP0|
演算子がプレフィックス演算子として使用されるかどうかは、先行する空白の影響を受けます（この解析の変更はバージョン0.13.0で導入されました）。

```nim:
echo $foo
# is parsed as
echo($foo)
```
Nim入門 (1)

# Nim入門

## はじめに

Nimの入門記事があまりにもないので、世の中の業務で使ってもらうためには日本語ドキュメントが足りないと感じたので、自分で翻訳記事を書くことにしました。

## 実行環境

* macOS High Sierra v10.3
* Docker v17.09.0-ce
* Docker Compose v1.16.1
* Nim v0.17.2
* nimble v0.8.8

## インストール

インストール記事は公式を参照のこと。  
https://nim-lang.org/install.html

Dockerでの作成方法については、記事を書いたのでそちらを参照して下さい。
<>

主にマニュアルをベースに解説していきます。  
https://nim-lang.org/docs/manual.html

## 字句解析(Lexical Analysis)

### 文字コード

ソースファイルのエンコードは全てUTF-8でお願いします。
それ以外はサポートしてません。

### コメント

コメントはこんな感じ。

```nim:
# コメントを書く
```
複数行にわたってコメントを書く場合はこんな感じ。

```nim:

# 複数行コメントは
このようにして書いてくれれば
問題なくかけます。 #
```

### Stringのリテラル

文字列リテラルは、二重引用符(ダブルコーテーション)で区切ることができ、エスケープシーケンスを含めることができます。  
ダブルコーテーションで区切ればStringリテラルになるよ。

| エスケープ | 意味 | 
| ------ | ------  |
| \n | 改行 |
| \r, \c | 復帰改行 | 
| \l | 改行 |
| \f | 改ページ |
| \t | タブ |
| \v | 垂直タブ |
| \\ | バックスラッシュ |
| \" | ダブルコーテーション |
| \' | シングルコーテーション |
| \ '0'..'9'+ | 小数点がひつようなdecimal文字 |
| \a | アラート |
| \b | バックスペース |
| \e | エスケープ[ESC] |
| \x HH | 16進数の文字必ず2桁入力 |

### 三重Stringリテラル

```nim:
""""長い日本語文字列とダブルコーテーション""""
```

出力

```nim:
"長い日本語文字列とダブルコーテーション"
```

### エスケープを無視できるStringリテラル

例えばPathの表記中にバックスラッシュと「t」が入ってしまった場合に、タブになってしまう。
それを回避するために「r」を使う。

```nim:
var f = openFile(r"C:\texts\text.txt")
```

以下のように利用した場合はダブルコーテーションが1つ残る。

```nim:
r"a""b"
```

結果

```nim:
a"b
```

### Characterのリテラル

文字リテラルは、一重引用符(シングルコーテーション)で区切ることができ、エスケープシーケンスを含めることができます。  
シングルコーテーションで区切ればCharacterリテラルになるよ。

| エスケープ | 意味 | 
| ------ | ------  |
| \r, \c | 復帰改行 | 
| \l | 改行 |
| \f | 改ページ |
| \t | タブ |
| \v | 垂直タブ |
| \\ | バックスラッシュ |
| \" | ダブルコーテーション |
| \' | シングルコーテーション |
| \ '0'..'9'+ | 小数点がひつようなdecimal文字 |
| \a | アラート |
| \b | バックスペース |
| \e | エスケープ[ESC] |
| \x HH | 16進数の文字必ず2桁入力 |

### Numerical 定数

数値定数は読みやすくするためにアンダースコアを含めることができます。

```nim:
let num = 10_000_000
```

整数および浮動小数点数のリテラルは、10進数（接頭辞なし）、バイナリ（接頭辞0b）、8進数（接頭辞0または0c）および16進数（接頭辞0x）の表記で指定できる。

各数値型のリテラルが定義されおり自動で型が決定しますが、曖昧なリテラルについては、アポストロフィ（ '' '）で始まる接尾辞は型接尾辞をつけることでわかりやすくすることができます。
  
型接尾辞を持たないリテラルは、リテラルがドットを含んでいなければint型であるか、E | e型でなければfloat型です。表記上の便宜のために、型接尾辞のアポストロフィは、あいまいでない場合はなくても大丈夫です。  
（型接尾辞付きの16進浮動小数点リテラルのみがあいまいである可能性があります）

```nim:
let
  x = 0     # x は ``int``
  y = 0'i8  # y は ``int8``
  z = 0'i64 # z は ``int64``
  u = 0'u   # u は ``unit``
```

| 型接尾辞 | 型 |
| ---- | ---- | 
| 'i8 | int8 |
| 'i16 | int16 |
| 'i32 | int32 |
| 'i64 | int64 |
| 'u | uint |
| 'u8 | uint8 |
| 'u16 | uint16 |
| 'u32 | uint32 |
| 'u64 | uint64 |
| 'f | float32 |
| 'd | float64 |
| 'f32 | float32 |
| 'f64 | float64 |
| 'f128 | float128 |

### 演算子

演算子は以下のようなものが使えます。
またNimではユーザ定義によって演算子をつくることができます。

```nim:
=     +     -     *     /     <     >
@     $     ~     &     %     |
!     ?     ^     .     :     \
```

### その他

```nim:
`   (     )     {     }     [     ]     ,  ;   [.    .]  {.   .}  (.  .)
```
Nimをインストールしてみる


# はじめに
最近新しい言語を覚えようと思い立ち、いろいろ調べていくうちにCの「-O2」と同程度の高速をもち、モジュールが小さくできるNimというものを発見。
特段、何か使う予定があるわけではないですがとりあえず使って慣れておくためにインストールする。

#　環境

* macOS High Sierra 10.3
* MacBook Pro 2015

<img width="589" alt="スクリーンショット 2017-11-01 18.53.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/50276/44cf9a96-4fc0-8d25-7636-0f1e1e55206f.png">

# インストール

Nimの公式サイトのガイドを確認しながらインストール
https://nim-lang.org/install.html

brewでインストールできるそうだが、dockerで分離して試す。
とりあえず公式サイトの情報通り、イメージを取ってくる。

```
docker pull nimlang/nim
```

コンテナの作成

```
docker run -d -it --name nim_app nimlang/nim /bin/bash
```

コンテナに入る

```
docker exec -it nim_app /bin/bash
```

とりあえず、vimを入れる。

```
apt-get install vim
```

以下のチュートリアルを参考にHello Worldを出す。
https://nim-lang.org/docs/tut1.html

とりあえず、適当な場所にんファイルを作る。

```
cd /var/opt
vim greetings.nim
```

もちろん最初の確認はいつもの。

```nim:greetings.nim
# This is a comment
echo "What's your name? "
var name: string = readLine(stdin)
echo "Hi, ", name, "!"
```

さて、ファイルを実行をしてみましょう。

```
root@f08033a89621:/var/opt# nim compile --run greetings.nim
Hint: used config file '/nim/config/nim.cfg' [Conf]
Hint: system [Processing]
Hint: greetings [Processing]
Hint:  [Link]
Hint: operation successful (10987 lines compiled; 0.159 sec total; 17.938MiB peakmem; Debug Build) [SuccessX]
Hint: /var/opt/greetings  [Exec]
What's your name?
```

さて入力をしてみよう。

```
hello world
```

↓↓↓↓結果↓↓↓↓

```
Hi, hello world!
```

以上！！！
ようやくEcho Dotが届いたのでNature RemoとIFTTTで連携してみた話

# はじめに

招待メールをリクエストしたのが予約開始日の11月8日。

<img width="375" alt="FullSizeRender.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/127332/6b4bc7d7-5e1b-e03b-26d5-b40ab7480fd1.jpeg">

その日から首を長くして待ち続けてはや1ヶ月。12月8日に招待メールが到着。

<img width="375" alt="FullSizeRender (1).jpg" src="https://qiita-image-store.s3.amazonaws.com/0/127332/610d16c3-639d-5269-8c8d-d77494972580.jpeg">

即座に注文してその日のうちに発送され、一度は残業で受け取り損ねたものの本日ようやく受け取り完了。

![IMG_4804.JPG](https://qiita-image-store.s3.amazonaws.com/0/127332/5ebce789-7a23-ed33-5764-59cb7502fed7.jpeg)

長かった。。。

# さっそくセットアップ

セットアップは簡単。dotsをケーブルにつないでしばらく待つだけ。
あとはスマホのalexaアプリからwifiの設定をすればもう使えるようになった。
このお手軽さはfireタブレットやfire tv stickやらに通ずるものがあるわね。さすがamazon。

# とりあえずお試し

「アレクサ、音楽流して」
でamazon musicで音楽を再生。

![IMG_4808.PNG](https://qiita-image-store.s3.amazonaws.com/0/127332/740d3a3d-dcaf-ed85-1845-31e4adc2acb3.png)

アニソンプレイリストなのは私の趣味だから？
たしかにmusicアプリでもよくおすすめされるかも。
知らない曲のときは
「曲名を教えて」
でアルバムとアーティストと曲名を返してくれるのが地味に便利。

「アレクサ、なにか面白い話して」
の無茶振りにもとっさに謎掛けで返してきたり。

![IMG_4809.PNG](https://qiita-image-store.s3.amazonaws.com/0/127332/e3db86d0-8fa7-8f95-fca4-a93e97ac6876.png)

「アレクサ、ヘイミクをスタート」
でHey MIKU!のアプリを起動。

![IMG_4810.PNG](https://qiita-image-store.s3.amazonaws.com/0/127332/5471b17c-1067-e0f0-6770-b0c2ea5fcfc9.png)

おなじみ初音ミクの機械音声で会話ができた。
アレクサに比べて合成っぽさが強いなーという印象。ミクのほうが古いから？
あと履歴はこれでいいんかい。

# Nature Remoと連携

さて本題。
とはいえ実は公式ブログに詳しい手順が載ってたりする。

> Amazon Echoから日本語で家電を操作 — Nature
http://nature.global/jp/ifttt-setup/2017/11/23/amazon-echo

手順はこいつでどうにかすれば良いので、気になった点をいくつか。

* IFTTTの仕様上、決めたフレーズに対して「<フレーズ>をトリガー」「<フレーズ>トリガー」というように呼びかける必要がある。それも込みで、なるべく発声して不自然にならないフレーズにしたい
* 当初テレビをつけるフレーズを「リモでテレビ（をトリガー）」としてたが、話しかけた結果が「remoでテレビ」「ニモでテレビ」「今でテレビ」「スリムでテレビ」とばらついた。私の話し方が悪かったのかもだが、フレーズはなるべくシンプル（可能であれば単語）にしたほうが良さそう
* 結局フレーズはシンプルに「テレビ」にした。「アレクサ、テレビをトリガー」ならまあ不自然ではないし覚えやすいかなと

以上
既存のlistに複数の値を一度に追加したいときは「+=」または「extend()」を使うと1行で書ける

この記事は [Pythonのコードを短く簡潔に書くテクニック Advent Calendar 2017](https://qiita.com/advent-calendar/2017/python-short-code) の7日目です。

# はじめに

既存のlistオブジェクトに値を追加したいときに`append`を使いますが、一度に複数の値を追加したい時は`+=`または`extend()`を使うと1行で書けてスッキリします。

# `append()`で追加する場合

```py3
l.append(1)
l.append(2)
l.append(3)
```

# `+=`で追加する場合

```py3:
l += [1, 2, 3]
```

# `extend()`で追加する場合

```py3:
l.extend([1, 2, 3])
```

# 参考

- Python3 ドキュメント
    - Python チュートリアル
        - [リスト型 (list)](https://docs.python.jp/3/tutorial/introduction.html#lists)
Node.jsでRS232Cを受信、Arduinoをモニター

Arduinoのプログラムのデバックする時に、Serial.print を使うことは良くあることだと思います。Windows のフリーのアプリケーションを使ってモニターしても良かったのですが、自分なりにあれこれやりたかったのでnode で受信するようにしました。

### 私の環境
- windows 7 Professional 32bit
- node v5.6.0
- RS232C-USB変換　USB-CVRS9
- 3V,3.3V,5V系－RS232Cレベル変換基板 ADM3202
- 参照　https://qiita.com/YumeYakata/items/01ace8a588bb58bc0bc5

### serialportのインストール

> npm install serialport

### Arduino側（送信側のプログラム）
テストプログラムです。n のインクリメントのリミットは無視しています。

``` monitortest.ino
void setup() {
  Serial.begin(9600);
}

int n=0;

void loop() {
  Serial.print("ABC");
  Serial.println(n,DEC);
  delay(500);
  n++;
}
```

### node 側（受信側のプログラム）
COM ポートはコンパネ、デバイスマネジャで確認、今回はCOM6に接続されています。

```rs232cmonitor.js
serialport = require('serialport');
var portName = 'COM6';
var sp = new serialport(portName,{
	baudRate: 9600,
    dataBits: 8,
    parity: 'none',
    stopBits: 1,
    flowControl: false,
});

sp.on('data', function (data) {
  console.log('Data:', data);
});
```
### 受信例
送信側と受信側のモニターのタイミングで、一度にデータが複数受信される場合と、ばらばらに受信される場合があるようです。

```receive1.log
Data: <Buffer 41>
Data: <Buffer 42>
Data: <Buffer 43>
Data: <Buffer 31>
Data: <Buffer 30>
Data: <Buffer 36>
Data: <Buffer 31>
Data: <Buffer 0d>
Data: <Buffer 0a>
```

```receive2.log
Data: <Buffer 41>
Data: <Buffer 42 43 31 30 35 39 0d 0a>
```

### Parsers を使うと、ASCII文字に変換できます。

```rs232cmonitor_add.js
const Readline = serialport.parsers.Readline;
const parser = new Readline();
sp.pipe(parser);
parser.on('data', console.log);
```
以下のように表示されます。

```receive3.log
ABC1063
ABC1064
ABC1065
'''
コントラクトの関数を呼び出す際起こったこと

## 前提
- geth とかのイーサリアムのクライアントを実行しているマシンを**ノード**と呼ぶ
- web3 とかのクライアントライブラリを経由しノードにアクセスするマシンを**クライアント**と呼ぶ

## 書き込みの場合
- 流れとしては、
    - クライアントがコントラクト宛のトランザクションが作成し、ノードに送信する（eth_sendTransaction）
    - ノードがトランザクションをイーサリアムのネットワークに送信する
    - 各マイニングするノードのブロック生成処理（マイニング）で、そのトランザクションが実行され、コントラクトアカウントのステータス（ストレージに格納しているデータとか）が変更され、ブロックチェーンに書き込まれる
    - 最新のブロックがイーサリアムのネットワークに送信される
    - 接続接続しているノードが最新のブロックにある変更結果をライブラリによってクライアントに通知される
- なので、書き込みがある場合は、マイニングが必要

## 読み取りの場合
一方で、書き込みがない場合は、ブロックチェーンのデータを変更しないので、**即時返される ＋ gas かからない** ようになっています。

流れとしては

- クライアントがノードに対して、`eth_call`でコントラクトの関数が呼び出す
- ノードの geth で、ブロックチェーンのデータを読み取って結果をクライアントに返す

一番シンプルなコントラクトで例を上げます。

```js
contract SingleNumRegister {
    uint storedData;
    function set(uint x) {
        storedData = x;
    }
    function get() constant returns (uint retVal) {
        return storedData;
    }
}
```

このコントラクトをコンパイルすると、下記のABIになる

```js
[{
  constant: false,
  inputs: [{name: 'x', type: 'uint256'}],
  name: 'set',
  outputs: [ ],
  type: 'function'
}, {
  constant: true,
  inputs: [ ],
  name: 'get',
  outputs: [{name: 'retVal', type: 'uint256'} ],
  type: 'function'
} ]
```

上記前提で、 `web3.js` を使う場合は下記のコードになります。

```js
// ABI_DEF：上記どおり、コントラクトをコンパイルした時できたコントラクトの定義情報
// ADDRESS：コントラクトアカウトのアドレス
var cnt = eth.contract(ABI_DEF).at(ADDRESS);

// 書き込み
cnt.set.sendTransaction(6,{from:eth.accounts[0]})

// トランザクションIDが返される '0x979c4e413a647673632d74a6c8b7f5b25a3260f3fefa4abea2dc265d61215939'
// マイニングし、上記トランザクションがブロックチェーンに書き込まれるまで待つ必要がある

cnt.get()
// '6'
```

## 参考記事
- [Contractを作成する · Ethereum入門](https://book.ethereum-jp.net/first_use/contract.html)
なんとなくエンジニアマネージャーな方必見!ここだけは押さえておけ3つのポイント!!

この記事はサムザップ Advent Calendar 2017の7日目の記事です。
昨日は[Gaku_Ishii](https://qiita.com/Gaku_Ishii)さんの[UnityとMono.Cecilでポストコンパイル時アセンブリ編集をやってみた](https://qiita.com/Gaku_Ishii/items/c489d795bc1422a01a24)でした。

昨日のGakuさんありがとうございます。
本日は、アナフィラキシーショックはまじで死に至るから侮るな。
アナフィライフなfujisyunです。


アナフィラキシーについては、
[ファイザーさんのHP](http://allergy72.jp/qa/anaphylaxis.html)を参照してみた。

> "重篤な症状があらわれるまでの時間が数分～15分と極めて短く"

重篤って息できなレベル。ね、怖いでしょ。
アナフィラキシーを侮るなかれと啓蒙をつづけようと勝手に思ってます。

# 先にまとめ

* 目標を立てる
* 振り返りをする
* 腹をくくる

以下は駄文です。

# なんとなくエンジニアマネージャーって?

これ過去の自分のことなんだけれどね。
上司｢君、マネージャーやってよ。やってくれる人いなくってさ。｣

エンジニアってそういうことやりたくない人多いですよね。

誰かが貧乏くじを引くような流れで
エンジニアマネージャーってわりかし生まれてくると思うんですよ。

やりたいわけでもないけど、言われたし誰かがやるまでそのくじは回るし、
｢じゃあ やるか。｣みたいなネ。

# それが悪いわけではない。

自分はそれを機に新しい価値観も生まれた。(プロジェクトマネジメント大事っていうね)
良い機会だったと思うし、とても幸せだ。

けど、そういったキッカケから出現したエンジニアマネージャーの人って、
マネージャー業務にモチベーションが特別にあるわけでないと思うから、
続けないし、より良いチームにしようということもあまり思考しない。

しかも、マネージャーっていう肩書がつくだけで、
プログラミング以外の作業が振ってくる、要求されるし、責任を持たされる。

# なんて嫌な役回りなんだ!!

いやいやそんなことはない。
マネージャーは環境を作れるから面白いんだ。

# 自分の好きな環境でプログラミングが出来る!

環境は開発環境っていう意味だけでなく広い意味でね。
環境が作れて面白いっていうのはそういう事。

なんでそんなスケジュール、納期なの?
なんでそんなの作らなければいけないの?
なんでそんな予算なの?

そんな風に思っていたルールが自分の好みにアレンジされた環境でプログラミングが出来るって魅力的じゃない?
制約はもちろんあるけれどね。
でも、ルール以外はノールール。
ルールだと思っていたことも疑って、自分の好きに、チームの好きにやろう。

## 開発の現場にはエンジニアのマネージャーが絶対に必要。

プロダクトの開発が複雑な物なら特にね。
それらがどのくらいのもので、どう進めなければいけないか。
それを一番適切に仕切れるのはエンジニアのマネージャーだ。

それ以外の人間にやらせたら大変だったことなんていくらでも経験してきただろ??

# 目標を作ろう。

さてマネジメントを始める第一歩。
最初が肝心だ｢目標を作ろう｣。

自分たちのチームの存在意義は?

個人目標よりもチーム目標がよい。
これからチームを目標達成に向けて支援しなければいけないからね。
チームで目標が揃っていなければ、支援がちぐはぐになってしまう。

目標が無い?じゃあチームは解散だ。
必要ないからね。

解散できないのなら何かしら理由があるはずだ。
建設的な理由であることを期待するよ。
そして、ピッタリの目標を言語化してチームですり合わせよう。

1度だけでなくていい、繰り返し繰り返し。
｢認識がすりあっていた｣と思っていたことが実は違った。みたいなことはよくある。

｢分かり合えない!｣ではなく、チームで協力して目標を決めていこう。
**チーム**だったらそれが出来る。

# 振り返りをしよう。

チームが目標に近づくための根源が振り返りだ。

目標にたいして、何が出来て何ができなかった?
調整した気で失敗していることはないか?
自分たちだからこそやりとげられたことを確認してより伸ばしていこう。

学びや改善があるはずだ。
それらの情報は次へ申し送りをしよう。
そして、絶対に活かすんだ。

活かせないなら、そこが改善点だ根気よく行こう。

## 3つのポイントなんてウソ。

やらなければいけないことは本当に沢山ある。
3つなんかじゃ物足りない。
ただ、この3つがあれば適応、成長はしていけると思うんだ。

そして、やれることから順に解決していくんだ。
ミラクルなアイデアがあれば良いかもしれない。
けどそうでなければ現実を見るんだ。
それから腹をくくる。腹をくくるのだ。

嘆くことはない、失敗も経験。

プログラマが一人前になるのにかかる時間は半年?1年?3年?
一人前の程度や前提に違いはあるにせよ、自分は5年から10年は必要かなと思っている。
エンジニア領域のマネジメントも同様に一朝一夕になど、それこそいかない。

# マネジメントはやっぱやだな…。

待って待って待って!
好きな環境で好きなモノづくりをして、作ったプロダクトを好きになってもらったら、それこそ素晴らしいことだと思うんだ!
それがモチベーションとなりそうだと感じてくれたら是非5年を目標に頑張ってみてもらえたらと思う。
大変だけれど、頑張れた結果がきっと出てくると信じている。

# おわりに

プログラマ、エンジニアって面白いしやりがいがあると思っている。
想像したものを現実に生み出してそれを更に使って生活を豊かにできるんだ。

そんなプログラマ、エンジニアの活動を促進できる役割もとても面白いしやりがいがあると思うでしょ!
マネジメントにやりがいを感じて活動してくれる方が一人でも増えるとよいなと!!

ということで明日はleosakiさんで
『Alexa (Amazon Echo Plus)を使ってピカチュウと会話してみた。』のお話です。
re:Inventは面白かったですか!!ヒトコトで表現してみてください!!
では、よろしくおねがいします!
data classとclassを難読化してデコンパイルした時のjavaコードについてみてみる

data classみなさん便利に使っていますよね。
ところで、難読化した時はどうなるのでしょうか？
普通のclassと難読化した結果はどう違うのでしょうか？

ふと気になったので、data classとclassを難読化した結果を比較してみました。


## 作ったdata class, class, javaのclass達

難読化したdata classとclassは以下のように定義しています。


```kotlin
data class Cat(
        val name: String,
        val age: Int,
        val memo: String
)
```


```kotlin
class Dog(
        val name: String,
        val age: Int,
        val memo: String
)
```

また、比較の為にjavaで作ったクラスも入れています。久しぶりにjavaのクラスを作ったので書き方を完全に忘れていました。

```java
public class Penguin {
    private final String name;
    private final int age;
    private final String memo;

    public Penguin(final String name, final int age, final String memo) {
        this.name = name;
        this.age = age;
        this.memo = memo;
    }

    public String getName() {
        return this.name;
    }
}
```



実験に使ったソースは以下にアップしています。
https://github.com/mapyo/KotlinDataClassProGuardSample


さてこちらを難読化してjavaにデコンパイルするとどうなっているのでしょうか？

デコンパイルの方法は過去に自分が書いた以下の方法でデコンパイルしています。
https://qiita.com/mapyo/items/d52715feab9188db6629


## デコンパイルした結果

デコンパイルした結果は長いのでgistに貼りました。

data class Cat をデコンパイルしたもの
https://gist.github.com/mapyo/cefc38d562e292a10b81302cc6a3f761

class Dogをデコンパイルしたもの
https://gist.github.com/mapyo/defc2e426b6baadf01e144514e27c75b

class Penguin(java)をデコンパイルしたもの
https://gist.github.com/mapyo/f9cc80e48395fb3952673cdfeb613c10



## 気になった事

#### その１

data class Catの以下の部分

```
    public String toString()
    {
        return (new StringBuilder()).append("Cat(name=").append(a).append(", age=").append(b).append(", memo=").append(c).append(")").toString();
    }
```

普通にクラス名とプロパティ名が見えてますね。。。！
また、data classが自動生成してくれるequalsやtoStringなどのメソッドは難読化されていないようです。

#### その２
kotlinで書いたdata classと普通のclassは、以下のように何故か文字列のプロパティ名が見えてしまっている状態でした。なんでだろう。。？


```
        a.a.a.a.a(s, "name");
        a.a.a.a.a(s1, "memo");
```

一方のjavaで書いたclassは特に何事もなく難読化されているようでした。

## まとめ
難読化した結果どうなってるかをデコンパイルして比較してみる機会は特になかったので面白かったです！
Rustのmoduleがすっきりわかる


Rustのmoduleシステムが複雑だと感じる人が多い[らしい](https://users.rust-lang.org/t/the-rust-module-system-is-too-confusing/8715)ので、頭の中でどうイメージしたら良いかを追求しました。
\* 筆者はまだコンパイラが読めていないので、中で何が起こっているかは一旦無視し、どう考えるべきかにこだわりました。


# `mod`も`use`も`extern crate`も`mod foo {}`で置き換えてOK
まずは大前提から。それぞれ役割は違いますが、外からみたら大体同じなので、コードを書いてるときは頭の中で`mod {}`と置き換えるととても楽になります。

## `mod`
以下は`foo.rs`または`foo/mod.rs`を探してインポートしてくれます。

```rust
mod foo;
```
なので、コード上ではこれと一緒ですね。

```rust
mod foo {
    // foo.rsまたはfoo/mod.rsの中身
}
```

## `extern crate`
```rust
extern crate foo;
```
`extern crate`も、結局は

```rust
pub mod foo {
    // crateの中身（lib.rs）
}
```
と考えてほぼ差し支えません。

## `use`
`use`も、基本的に同じですが、`mod`以外を`use`することもできるので、そのときはそれぞれで差し替えてください。

```rust 
use foo::bar::baz;
```
`baz`がmoduleの場合：

```rust
mod baz {
    // foo::bar::bazの中身
}
```
また、実体は別にあるのでsymlinkのようなものとイメージすると良いと思います。
###### その他
`pub use`は`pub mod {...}`、`use foo::bar as wow`は`mod wow {...}`と考えてOK

# `use`は絶対パス、実際に使うときは相対パス
以下のコードはコンパイルしません。

```rust
extern crate reqwest;

pub mod foo {
    pub fn hello() {
        let client = reqwest::Client::new(); // compile error
    }
}
```
`extern crate reqwest`は`pub mod reqwest{...}`と同値でしたね。そう考えると、`foo`から`reqwest`は直接参照できません。正しくは`::reqwest::Client::new();`、または`super::reqwest::Client::new();`になります。
では、次はどうでしょうか。

```rust
extern crate reqwest;

pub mod foo {
    use reqwest::Client;
    pub fn hello() {
        let client = Client::new();
    }
    pub mod bar {
        use reqwest::Client;
        pub fn hello() {
             let client = Client::new();
        }
    }  
}
```
普段見ないようなコードかと思いますが、ここでは`foo`内でも`bar`内でも`use reqwest::Client`になってますね。
もう少し良い例を挙げたかったですが、まとめます。

* `use`を使うときは常にrootから（絶対パス）。相対パスで指定したい場合は、`self::foo`のようにする。
* その他の参照では相対パスで探す。絶対パスで指定したい場合は`::foo::bar`のようにする。

# 親子のプライバシー
これがちょっと複雑ですが、なるべく少ない文字数でまとめたいと思います。
\* ここでは、itemは{mod, fn, impl, struct}を指すこととします。

1. 親moduleからは直接な子itemにだけ`pub`関係なしにアクセスできるが、それよりも内側は`pub`でないとアクセスできない。
1. 子moduleは親module全てに`pub`関係なしにアクセスでき、それぞれの親がアクセスできるitemにもアクセスできる。

どういうことでしょうか。以下に例を示します。

```rust
mod outer {
    mod middle {
        mod inner1 {
            pub fn func() {}
        }
        mod inner2 {
            use outer::middle::inner1::func; // ok
        }
    }
    use outer::middle::inner1::func; // compile error
}
```
この例では`pub mod`は一つもありませんが、`inner2`から`inner1`内の`func`関数にアクセスできています。これは、`middle`が`inner1`にアクセスでき（ルール１）、`inner1`は`middle`と`middle`がアクセスできるitem全てにアクセスできるため（ルール２）、結果的に兄弟にもアクセスできることになるためです。moduleにアクセスできるということは、それに含まれる`pub`なitem全てにアクセスできるということなので、`func`を呼び出すことができます（pubが付いていなければ無理です）。
それに対し、`outer`からは`middle`にアクセスできますが、`middle`の中の`pub`なitemしか見ることができないため、`inner1`の中の`func`には届きません。
###### 例外など
`pub(crate)`, `pub(restricted)`, `pub(in ..)`などについても書こうと思いましたが、シンプルにするため割愛します。

# まとめ
* `use`, `mod`, `extern crate`まとめて考えよう
* `use`は絶対パス
* 親は直接の子しか見えないが、子は祖先全員見ることができる

少しでもイメージしやすくなればと思います。
正直「`extern crate`と`use`は全てrootファイルのトップに」というノウハウが浸透しているので、以上に示したような複雑な例が現れることはあまりないと思いますが・・
以上でした
Amazon Polly で青空文庫の作品の音読を聴く

こちらは「[青空文庫 Advent Calendar 2017](https://qiita.com/advent-calendar/2017/aozora)」の6日目の記事です。5日目は @myokoym さんの「[青空文庫をNDC等で絞り込みつつ全文検索できるWebサイト『Aozorasearch』の紹介](https://qiita.com/myokoym/items/a97f6901d4fa12bb8cb9)」でした。


RubyGems.org に hogelog さんが作った「[aozora-polly](https://rubygems.org/gems/aozora-polly)」というものがあるので、今回はその紹介をします。

# AozoraPolly とは

[Amazon Polly](https://aws.amazon.com/jp/polly/) を利用して、青空文庫のXHTMLをMP3に変換するRubyのライブラリです。

## Amazon Polly とは

[Amazon Polly のトップページ](https://aws.amazon.com/jp/polly/)から引用すると以下の通りです。

> Amazon Polly は、文章をリアルな音声に変換するサービスで、話すことができるアプリケーションを作成でき、まったく新しいカテゴリの音声対応製品を構築できます。Amazon Polly は、高度なディープラーニング技術を使用したテキスト読み上げサービスで、人間の声のような音声を合成します。

## AozoraPolly で音読MP3を生成する

```
$ gem install aozora-polly
$ aozora2mp3 http://www.aozora.gr.jp/cards/000035/files/1567_14913.html merosu.mp3
```

でいけるかと思いきやエラー。

```
E, [2017-12-07T01:27:19.793349 #37259] ERROR -- : unable to sign request without credentials set
```

このエラーを発生させているコードを辿るとAWS（アマゾンウェブサービス）のアカウントの設定が必要なのが分かりました。以下のコマンドでアカウントの設定をしてやるとうまくいきました。

```
$ pip install awscli
$ aws configure
# ここでAWSのアカウントの情報を入力
```

AWSのアカウント自体は持っていたので、セットアップと aws configure を以下を読んでやりました。

* [AWSアカウント作ったらこれだけはやっとけ！IAMユーザーとAuthyを使ったMFAで2段階認証](https://qiita.com/yoshidashingo/items/cd206daca0596659b440)
* [AWS CLIのインストール](https://qiita.com/yuyj109/items/3163a84480da4c8f402c)

# AozoraPolly（Amazon Polly）による音読

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">Aozora Polly（Amazon Polly）に音読させてみる（太宰治『女生徒』の冒頭） <a href="https://t.co/hFAC4b09bk">https://t.co/hFAC4b09bk</a> <a href="https://twitter.com/YouTube?ref_src=twsrc%5Etfw">@YouTube</a>さんから</p>&mdash; pawa＠朗読部 (@_pawa_) <a href="https://twitter.com/_pawa_/status/938474423417413634?ref_src=twsrc%5Etfw">2017年12月6日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

音読であって朗読にはならないのだと痛感させられました。

朗読例：[萌えで読む!「女生徒」](https://www.audible.co.jp/pd/%E3%83%A9%E3%82%A4%E3%83%88%E3%83%8E%E3%83%99%E3%83%AB%E3%83%BBBL%E3%83%BB%E5%A3%B0%E5%84%AA/%E8%90%8C%E3%81%88%E3%81%A7%E8%AA%AD%E3%82%80-%E3%80%8C%E5%A5%B3%E7%94%9F%E5%BE%92%E3%80%8D%E3%82%AA%E3%83%BC%E3%83%87%E3%82%A3%E3%82%AA%E3%83%96%E3%83%83%E3%82%AF/B00YTCA172)

__まだまだ Advent Calendar への参加者を大募集中です！__
Ripple コンセンサス　アルゴリズム

#コンセンサス　アルゴリズム
※独自の意訳です。かなりの間の単語を省略しています。

#引用元
https://ripple.com/build/reaching-consensus-xrp-ledger/
他にも訳してくれている人もいるかも。。。

#XRP Ledgerにおけるコンセンサスに至るまで

XRP Ledgerは，E-mailを送信するようにシームレスに，支払いを行うシステムです。XRP Ledgerは，ビットコインなどの暗号通貨のように，P2Pでやり取りを行い非中央集権的にトランザクションを処理するシステムです。XPR Ledgerは，他の暗号通貨と違い，ネイティブな通貨(XRP)以外の暗号通貨のトランザクションを処理することができます(おそらくOfferCreateなどのことと想像している)。
それに加えて，ほとんどリアルタイム(3-6秒)で決済することができ，(他の通貨へ換金が必要な際も)最も安くてなるように為替ルート(マーケットメーカーのこと?)を選択することができます。

#コンセンサスルール
1. トランザクションがグループに含まれない理由がない限り，ノードはグループにトランザクションを含むことに合意する。全てのノードが既に合意している場合，コンセンサスはその時点で終了(完了)となる。