OmniAICreator/Qiita-1.07M huggingface dataset:
長い文字列リテラルの定義にはヒアドキュメントや('...' '...')が便利

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

# はじめに

ソースコード内で長い文字列リテラルを定義したいときに、`+`や`+=`で複数の文字列を結合したりしてませんか？
Pythonの文法ではもっとスマートなやり方が2つ用意されています。

- ヒアドキュメント(`'''...'''`)
- 文字列リテラルを連続して並べる(`'...' '...'`)

# 例題

例題として、改行を含まない文字列と、改行を含む文字列を定義する方法を考えます。

```:改行なしの長い文字列
Qiitaは「プログラミングに関する知識を記録・共有するためのサービス」ですので、再利用性・汎用性の高い情報が多く集まっている場をつくっていきたいと考えています。そのためには、記事を読むこと、記事を書くことを通して、読む側・書く側それぞれがお互いに関わり合って、再利用性・汎用性の高い情報を育てていきましょう。
```
```:改行ありの長い文字列
Qiitaは「プログラミングに関する知識を記録・共有するためのサービス」ですので、
再利用性・汎用性の高い情報が多く集まっている場をつくっていきたいと考えています。
そのためには、記事を読むこと、記事を書くことを通して、
読む側・書く側それぞれがお互いに関わり合って、
再利用性・汎用性の高い情報を育てていきましょう。
```

# 普通に文字列結合する場合

```py3:改行なしの長い文字列
msg = 'Qiitaは「プログラミングに関する知識を記録・共有するためのサービス」ですので、'
msg += '再利用性・汎用性の高い情報が多く集まっている場をつくっていきたいと考えています。'
msg += 'そのためには、記事を読むこと、記事を書くことを通して、'
msg += '読む側・書く側それぞれがお互いに関わり合って、'
msg += '再利用性・汎用性の高い情報を育てていきましょう。'
```
```py3:改行ありの長い文字列
msg = 'Qiitaは「プログラミングに関する知識を記録・共有するためのサービス」ですので、\n'
msg += '再利用性・汎用性の高い情報が多く集まっている場をつくっていきたいと考えています。\n'
msg += 'そのためには、記事を読むこと、記事を書くことを通して、\n'
msg += '読む側・書く側それぞれがお互いに関わり合って、\n'
msg += '再利用性・汎用性の高い情報を育てていきましょう。\n'
```

どちらも`msg += `というのが並んでてイケてないですね。
行末の`\n`も面倒です。

# ヒアドキュメント(`'''...'''`)を使う場合

文字列を三連引用符(`'''...'''`)で囲うことでいわゆるヒアドキュメントを定義できます。

ヒアドキュメント内での改行はそのまま文字列内の改行になります。
改行を文字列に含めたくないときは行末に`\`を追加します。

```py3:改行なしの長い文字列
msg = '''\
Qiitaは「プログラミングに関する知識を記録・共有するためのサービス」ですので、\
再利用性・汎用性の高い情報が多く集まっている場をつくっていきたいと考えています。\
そのためには、記事を読むこと、記事を書くことを通して、\
読む側・書く側それぞれがお互いに関わり合って、\
再利用性・汎用性の高い情報を育てていきましょう。\
'''
```
```py3:改行ありの長い文字列
msg = '''\
Qiitaは「プログラミングに関する知識を記録・共有するためのサービス」ですので、
再利用性・汎用性の高い情報が多く集まっている場をつくっていきたいと考えています。
そのためには、記事を読むこと、記事を書くことを通して、
読む側・書く側それぞれがお互いに関わり合って、
再利用性・汎用性の高い情報を育てていきましょう。
'''
```

ソースコード上はインデントしたいけど文字列にインデントを含めたくないときは`textwrap.dedent()`を使うことで各行に共通して現れる先頭の空白を取り除くことができます。

```py3:改行ありの長い文字列
import textwrap
msg = textwrap.dedent('''\
    Qiitaは「プログラミングに関する知識を記録・共有するためのサービス」ですので、
    再利用性・汎用性の高い情報が多く集まっている場をつくっていきたいと考えています。
    そのためには、記事を読むこと、記事を書くことを通して、
    読む側・書く側それぞれがお互いに関わり合って、
    再利用性・汎用性の高い情報を育てていきましょう。
''')
```

# 文字列リテラルを連続して並べる(`'...' '...'`)を使う場合

Pythonでは文字列リテラルを連続して並べると自動的に連結してくれます。

```pycon:
>>> 'py' 'thon'
'python'
```

これを使えば長い文字列も複数行に分割して定義することができます。
ただし改行を含む文字列を定義したい時は`\n`が必要です。

```py3:改行なしの長い文字列
msg = ('Qiitaは「プログラミングに関する知識を記録・共有するためのサービス」ですので、'
       '再利用性・汎用性の高い情報が多く集まっている場をつくっていきたいと考えています。'
       'そのためには、記事を読むこと、記事を書くことを通して、'
       '読む側・書く側それぞれがお互いに関わり合って、'
       '再利用性・汎用性の高い情報を育てていきましょう。')
```


```py3:改行ありの長い文字列
msg = ('Qiitaは「プログラミングに関する知識を記録・共有するためのサービス」ですので、\n'
       '再利用性・汎用性の高い情報が多く集まっている場をつくっていきたいと考えています。\n'
       'そのためには、記事を読むこと、記事を書くことを通して、\n'
       '読む側・書く側それぞれがお互いに関わり合って、\n'
       '再利用性・汎用性の高い情報を育てていきましょう。\n')
```

# 結論

- 改行なしの長い文字列
    - `'...' '...'`を使ったほうが簡潔に書ける
- 改行ありの長い文字列
    - ヒアドキュメント(`'''...'''`)を使ったほうが簡潔に書ける
    - インデントしたいときは`textwrap.dedent()`を使う

# 参考

- Python3 ドキュメント
    - チュートリアル
        - [3.1.2. 文字列型 (string)](https://docs.python.jp/3/tutorial/introduction.html#strings)
    - ライブラリーリファレンス
        - [textwrap.dedent(text)](https://docs.python.jp/3/library/textwrap.html#textwrap.dedent)
イングリッシュキンダーガーテン

## はじめに

なんのこっちゃとお思いかと、思いますが、まじめに勉強して英語話せてすごい人は話せて凄いです。素晴らしいです。でも、英語の点数はいいのに英語話せないと言う人が多いのもまた事実です。中学校で３年、高校で３年、大学で４年と勉強すると１０年勉強したのに、英語話せない。って人はザラにいます。うまく話せない人は英語話すな。そんな風潮が日本にはあり常識となっていると思います。

日本は海に囲まれていて外国の人と接することはまれでした。特に江戸時代には鎖国をしていて一部の人達だけが出島で外国と接するだけでよかった。しかし時代は流れ、通信技術が発達し、運送技術も劇的に変わりました。飛行機運賃も安くなりました。外国の人と触れ合う機会はずっと増えました。さらに、インターネットの出現によってその状況は大きく変わりました。地球の裏側の人とも気軽にインターネットを使って話すことが出来る時代が来てしまったのです。

こうなると、外国の人たちと話す必要性は増してきます。様々な言語がある中で、特筆すべき言語はやはり英語でしょう。なぜならば、英語はイギリス、アメリカだけの言葉ではなく全世界共通の言語、共通言語だからです。だから、英会話は大事なのです。

## 英会話の早期教育

が、問題は話し相手です。
ネイティブ・アメリカンがいれば、、、。イギリス人の友達がいれば、、、。そううまい状況があればよいのですが、お金をかければ、家庭教師がついたりしますが、本当に必要なのでしょうか？幼稚園児が日本語を話す際に、家庭教師がいないから話しちゃ駄目です。友達とは、変な日本語が身につくから話しちゃ駄目です。そういった教育をするでしょうか？答えはNoでしょう。子どもは同い年の子供と遊ばせてコミニュケーションを取ることが大事です。

幼稚園から、英語を話す幼稚園というのもあります。私は実はそういった幼稚園に通っていました。先生は日本人の先生とアメリカ人の先生がいて、ネイティブの発音で勉強し、そのまま、小学校の間中週３回、通って英語の勉強をしていました。
英語でコミニュケーションしながら、英語の歌を歌ったり、アメリカの文化を学びつつ、走り回って遊んでいました。なので自分は英語で話すのは楽しくて好きです。

でもです。幼稚園の月謝は３倍は高く、競争率も高いそうで地域の中で全員通うわけにもいきませんでした。他の友達は英語が話せません。親もばあちゃんもじいちゃんも話せません。家に変えると英語は話してはいけない。タブーでした。

中学校になると、状況は変わるかとおもいきや、受験英語です。英語の時間に先生は生徒を黙らせ静かにさせてから、授業です。文法です。間違えて点数が引かれます。aが抜けている、theを付けて意味が違う、文法が違う。失敗して笑われる。間違えて怒らせたら大変だ。そういう話を聞いて皆萎縮し、話さなくなりました。
たまに英語を話そうというとわざわざ難しい単語を流暢に聞き取れないスピードで話して、オオーなどといいます。おおーじゃない。聞き取れないっていうの。

いいですか、みなさん。言語とは、芸でも、スポーツでもありません。スポーツなら上手い人が偉いでよいです。でも、言語は違う。言語は人と人がコミニュケーションするための道具です。

子どもがいて、その子どもと話すときに難しい言葉を使いますか？
簡単な言葉でゆっくり喋るでしょう。
相手のレベルに合わせて話すのがいいんです。

英語の勉強を始めた人たちは生まれたばかりの赤ちゃんと一緒です。
英語は一度も話したことがない。赤ちゃんが最初に何かを話したら喜びますよね。
ママでも、パパでも、マンマでもなんでもいい。素直に喜びましょうよ。

話し始めたら、うるさいですよ。３歳児くらいの子どもはうるさい。でも、うるさいけど話す練習は大事です。そこで、友達作って遊ばせれば楽です。社会性も身につきます。
英語も同じです。レベルに合わせて同レベルの英会話をしたほうがいい。
最初はテニヲハは難しいです。a とか the とか語順とか気にせずに話していい。それでも子どもは成長したら、成長具合によって、きちんとした日本語が話せるようになるのです。いきなり子どもが政治家みたいな話し方をしたら気持ち悪いでしょう。

ということで、英会話の勉強は幼稚園レベルの片言英語から始めたらいいとおもいます。
年齢が幼稚園ではなくても、幼稚園レベルの英会話を恥じること無く話してみる。その勇気が大事です。そして、幼稚園レベルの英会話をして盛り上がっているところに、英語のうまい人たちがやってきて水をさすのはやめてもらいたい。

子どもには子どもの会話がある。そこに大人が口出ししては、子供同士のコミニュケーション能力は伸びません。自由に会話させることが大事です。英語ネイティブな外国人は偉いお父さんのようなものですが、英会話のお勉強の主人公はお父さんではありません。お父さんが授業参観に来て、演説されても子どもたちの発達状況はわからないし、子どもたちの勉強にはなりません。

そのようなことを考えて今後の英会話教育を見直してみてはどうかと思います。

## イングリッシュインテリジェンスとイングリッシュウィズダム

RPGゲームには、僧侶と魔法使いが出てきます。魔法使いは「ちしき」というパラメータを高く、僧侶は「きょうよう」と言うポイントが高くすることによってより強いキャラクターへと成長します。英語で言えば、インテリジェンスとウィズダムです。
ところで日本の英語教育の現状を考えてみましょう。知識と教養、知識とは物事がどのような論理でどのように行われるかどうかを知っていることが重要です。教養は知識とは別ですが、とにかく行動が素早く出来てその行動がうまく行くことが教養といえるでしょう。
日本の英語教育は主に、受験英語などの知識教育がメインで行われてきました。英語の教養が足りない人が多いのです。

ご飯をたく炊き方は知識は多くの人があると思います。今やご飯をたくのは簡単です。電子ジャーに、米を量っていれて、無洗米ではない場合は水をいれて洗い、無洗米なら洗わずに、お米のりょうにあった水をいれて、炊飯器のスイッチを入れるだけでいい。

でもできない人は多いかもしれない。自分でご飯をたかなくてもご飯が食べられる状況であればたかない人がいてもおかしくない。英語も同じです。

問題は英語は長い時間をかけて勉強しているということにあります。ご飯の炊き方は学校で習うとしてもそんなに長い時間をかけません。でも英語は知識にかける時間の長さに比べると教養を鍛える時間が短い。結果的に話せない人が多いのだろうと思います。

ご飯宅のめんどくさかったら、どうしたらよいかというと、水の量は適当でいい。ご飯は洗わんでもいい無洗米を使ったらいい。楽です。日によって硬かったり柔らかかったりする。でも怒らない。ホッホッホと笑ってたらいいと思うのです。英語も同じようなことがあるのではないかと思います。
Cloud9 on Fargate など模索の経過報告

こんなの書いていきます

- 利用例
- 小ネタ

# 利用例

この辺に使えないかと模索しています

- ECS のあふれたタスク処理
- 踏み台サーバ
- Cloud9 リモートサーバ

## ECS のあふれたタスク処理

`aws ecs describe-clusters` に `--include "STATISTICS"` を付与すると返ってくる `pendingEC2TasksCount` が 1 以上であれば `run-task` で `--launch-type FARGATE` を指定。
とはいえスケーリングの設定やアプリケーションの作り次第では必ずしもこの負荷の逃がし方が適切でもなく、目下思案中。

## 踏み台サーバ

多段 SSH するときだけ起動する EC2 はありませんか？
Fargate にしてしまいましょう。

これくらいあれば最低限動きそうです。
https://github.com/pottava/fargate-shell/tree/master/serverless-bastion/docker

- sshd に [`-d` をつけて起動](https://github.com/pottava/fargate-shell/blob/master/serverless-bastion/cfn.yaml#L204) することで、セッションが切れたら Fargate も落ちる
- パスワード、または公開鍵認証（鍵は S3 を経由して配布）
- sudo させるかどうかを環境変数 ENABLE_SUDO で制御

Docker イメージとして踏み台を管理できれば、これをベースに作業内容をログに残したり、渡す IAM タスクロールで AWS-CLI の利用できるコマンドを制限したりもある程度自由にカスタマイズできそうです。

## Cloud9 リモートサーバ

Fargate で Cloud9 のリモートサーバを管理すれば、Docker イメージで作業者の環境を管理できそうです。ベースイメージはこんな感じ。
https://github.com/pottava/fargate-shell/blob/master/serverless-cloud9/docker/Dockerfile

- AmazonLinux に必要なミドルウェアを入れたもの
- Cloud9 からの SSH 接続に必要な鍵は S3 を経由して連携

その上で、開発に必要なミドルウェアを載せて、Cloud9 のリモートサーバに指定すれば IDE が起動します。例えば go v1.9.2 ならこんな感じ。
https://github.com/pottava/fargate-shell/tree/master/samples/cloud9-go1.9

ただし・・

- docker in docker できないため、Cloud9 の
 IDE に c9.ide.lambda.docker はインストールできない
- 作業が終了したら Fargate を明示的に停止する必要がある

のが惜しい感じになりました。AWS さんのネイティブ対応が待たれます。それにしても Fargate、ハンズオンや Jupyter notebook を配るといったことにも応用できそうです。

# 小ネタ

（以下 2017/12/12 時点のものであり、また仕様やドキュメントとして記載がないものも取り上げているため、機能追加や特にアナウンスなく変更が入る可能性も十分にありえます）

## 渡ってくる環境変数

- AWS_DEFAULT_REGION
- AWS_REGION
- AWS_CONTAINER_CREDENTIALS_RELATIVE_URI

最後の変数でタスクに割り当てた [IAM ロールを確認できる](http://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/task-iam-roles.html#task-iam-roles) ものの
コンテナ内であればそのロールは Assume された状態なので
例えば以下のコマンドも同等の情報を返してくれます。普通。
`$ aws sts get-caller-identity`

## 渡せない環境変数

EC2 ホストがないので ECS Agent にオプションが渡せない。例えば `ECS_ENABLE_CONTAINER_METADATA` を `true` にしたいけどできない。[`ECS_CONTAINER_METADATA_FILE`](http://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/container-metadata.html) が渡ってくると地味に便利なんですが・・

## タスク定義の制約

とある理由で docker in docker がしたかったのですが、おそらくセキュリティ上の理由から ECS では設定できる以下の項目が使えません。まあ、はい。

- linuxParameters/capabilities
- privileged

## awsvpc の制約

Fargate の注意点というわけではないものの、Fargate である以上 [awsvpc](https://aws.amazon.com/jp/blogs/news/under-the-hood-task-networking-for-amazon-ecs/) が避けられないので。
ECS ではコンテナの定義として `containerPort` と `hostPort` を別にすることができましたが、awsvpc ではそれが許されません。異なったポートを定義すると `register-task-definition` で弾かれます。

An error occurred (ClientException) when calling the RegisterTaskDefinition operation: When networkMode=awsvpc, the host ports and container ports in port mappings must match.

## ENI の上限

起動するコンテナごとに一つ消費されていくので、初期リージョン上限である 350 個が一つのハードルでしょうか。Lambda ほどスケールしてくれませんが、まあ、ユースケース違うしね。ところでいつか awsvpc でない起動方法は追加されるんでしょうか。されない気もしますね・・
小規模アプリで実装するシングルストアの強さを語る

----

# 前説
この記事は [モバイルファクトリー Advent Calendar 2017](https://qiita.com/advent-calendar/2017/mobilefactory) 12日目の記事です。

11日目の記事は @akihiro_0228 さんの 「[【Unity】Zenjectに学ぶDependency Injection](https://qiita.com/akihiro_0228/items/d6fe2bfea5306900624d)」 でした。

Unityを例に今回記事を投稿しますが、Unity要素は薄めです。

----

# シングルストアとは何か
ここ1年でfluxやreduxという言葉がJS界隈では流行っている。
詳細は他の多くの記事に任せるとして、今回注目したいのはこのfluxのStoreです。

----

# flux(redux)をUnityで実装する場合
[Unidux](https://github.com/mattak/Unidux)というものがあるので、これを使うのが良いだろう。

----

# でも、そんな大規模なアーキテクチャうちのアプリにいらないねん。。

----

## そんなあなたでもStoreだけは実装しておくことをおすすめしたい

----

### fluxでのStoreとは何か
- APIのキャッシュではなく、Viewのためのキャッシュ
- Viewはこのデータをbindすることで、変更を検知する
- StoreはDispatcher(Reducer)によって更新される

----

## Storeはどうやって実装されてるか
Singleton!!

----

# アプリの状態をシングルストアで管理することのメリット

----

## NPEの危険が減る
- シングルトンなのでデータのライフサイクルがアプリのライフサイクルと一致する
- これはアプリが起動している間は常にデータが有ることを意味する
- つまりNPEの危険が低減される

----

## アプリの規模が大きくなったとき、fluxアーキテクチャに移行できる
- 幸いにもアプリがあたり、規模が大きくなっていったとき、大規模アーキテクチャに移行できる余地を備えているのは魅力的だ

----

## Viewの状態が再現できる
- 例えばClashが起きたとき、クラッシュレポートにStoreの情報を乗せればその時のViewの状態が再現できる
- 特定端末で起きる問題なども検証が容易になる

----

### Storeだけを実装する戦略
![無題の図形描画.png](https://qiita-image-store.s3.amazonaws.com/0/78827/dbb9aefd-f8bd-f263-c18e-7d16f6dcb189.png)

----

### StoreをModelとして扱いMVVMで実装
- 他のSceneやVMへのイベント伝搬は、UniRx.SubjectをあつめたAppEventsシングルトンクラスを用意しそこを経由させる
- データはEntityとして持つ

----

## flux化時に必要な対応
- StoreとViewのバインディングはflux化後も使用できる
- VMで直接Storeに設定しているものを、Dispatcherに投げ、DispatcherがReducerに振り分ける
- Reducerが適宜、それぞれのStoreにデータを保存する
- AppEventsをObserveしている別Sceneは、Storeの状態をObserveするようにする

----
# まとめ
- 今回はUnityを例題にしたけど、どの言語でも適用できる
- fluxアーキテクチャを考えているなら、とりあえずStoreだけでも実装しておくと楽だよ

次は @lycoris102 さんの「[Unity] BuildSettingのScene定義をよしなにしたい」です。よしなになってそう。
発表に慣れよう

#はじめに
本記事は[プレゼン研究会 Advent Calendar 2017](https://qiita.com/advent-calendar/2017/infrapre) 11日目の記事です。

#プレゼン研究会に参加して
##出会い
もう、2年くらい前になると思うのですが、自分はあまり人前で喋ることが得意ではありませんでした。そんな中、勉強会イベント告知サイト?の[connpass](https://connpass.com/)にて当研究会を知り、何か変えることができるのではないかと思い、参加しました。

##課題
自分が参加した会では、勉強会の数時間の間にプレゼン資料を作って発表する課題がありました。発表できそうなネタは無いかと考えた挙句、自分にとって簡単な内容に逃げてしまいました。

##勉強会が終わって
発表することに少し自身がついたこともあり、自分が発表できそうなLT会があれば出かけていって発表するようにしました。その結果、LTがあまり怖くなくなった気がします。

#まとめ
たしかに、発表内容をわかりやすくまとめる、伝える技術はあるかと思います。しかし、それ以前に、

1. 失敗を恐れず発表する
2. ダメ出しをもらう
3. めげずに改善する

の繰り返しが良いのかと思います。
コンピュータの動作原理（１）概要


[コンピュータの動作原理（０）](https://qiita.com/niQSun/items/91396b620638e3f44f19) から読み始める事をお薦めします。

このシリーズで扱う範囲と概要
---
このシリーズで解説する範囲についてです。
![CPU階層.png](https://qiita-image-store.s3.amazonaws.com/0/136856/14f267f8-3be3-919d-5784-3a0f683ac584.png)
マシンコードよりも上の階層は、ソフトウエアのプログラミング言語やOSの領域になるので、今回の範囲には入れていません。アセンブラやマシン語といったキーワードで検索すると丁寧な解説がたくさん出てきます。また、トランジスタよりも下の階層は物理法則です。トランジスタの構造や電子の振る舞いの領域ですから範囲に入れません。
メモリとI/Oについても特に解説はしません。外付けのメモリはプロセッサの機能とは切り離して考えることが出来ます。またI/Oを特別なモノとして見るのは、主にコンピュータシステムの仕組みの方の話になります。

このシリーズは、パーソナルコンピュータの出始めの頃のプロセッサ、例えば現在のインテルのプロセッサの直系の先祖のi8086やその前の8085、モトローラのMC6809などを想定しています。これらのプロセッサと呼ばれる物達が、どういう原理で動作しているのか、について解説します。具体的にこのうちのどれかについての解説ではありませんが、基本となる技術はどれにでも通用しますし、今でも基本は変わっていません。

図について
----
上の図について、それぞれの階層の概要です。
それぞれの階層は考え方や扱う対象が違います。より上の階層は、下の階層を「こういう機能を持ったもの」と考え、下の階層の内部が具体的にどういう構造になっているのか、とは切り離して設計・実装します。ソフトウエアと同じように下の階層のものについては抽象化して考えるのです。

#### トランジスタ
プロセッサを構成する最も基本的な要素です。トランジスタとだけ言うと色々な特性の色々な用途のものがありますが、今回はMOSFETを取り上げて解説します。MOSFETは信号のスイッチング用途に適しています。また殆どのプロセッサが（コンピュータの黎明期や最近の最先端のものを除けば）MOSFETで出来ています。
MOSFETを組み合わせると基本要素のAND、OR、NOTなどを作る事が出来ます。

#### 論理回路
減算/加算器、バッファ、マルチプレクサなどの論理回路はAND、OR、NOTの組み合わせで出来ています。
それら論理回路を組み合わせると、プロセッサ内部の各ユニットを作ることが出来ます。レジスタ、命令デコーダ、ALUなどが代表的なユニットです。プロセッサは各ユニットを制御信号でコントロールする事で動作します。

#### プロセッサ
コンピュータの核です。用途やメーカーによってCPUとかMPUとかマイクロコントローラとか、色々な呼び方があります。またプロセッサには特定の処理専用に作られた物もあります。GPUとか数値データプロセッサ、メモリ管理ユニットなどもプロセッサです（コプロセッサと呼ぶ場合もあります）が、このシリーズでは一般にCPUと呼ばれているものについて解説をします。

#### マシンコード
命令とかバイナリーコードとも言います。主にデータと区別する時に、単に「コード」という言い方をする事もあります。CPUが直接実行出来るのがマシンコードで、アセンブラや(狭義の)コンパイラが出力するのはこれです。マシンコードはプロセッサ内部の変換テーブルで制御信号に変換されます。

プロセッサの動作
----
プロセッサは論理回路で組まれたユニットと、制御信号で動作します。制御信号の役割は主に、各ユニットに対して、他のユニットの出力のうちどれを入力するかの選択です。
例えばALU（Arithmetic Logic Unit)は四則演算や論理演算の結果を、それぞれの演算ユニット全部が常に出力しています。これをレジスタやメモリに書き込もうとする時に、ALUのどのユニットの出力を選ぶのか、それを選択する信号を出力するのがマシンコードからの変換テーブルです。そうして選択された結果とクロックと呼ばれる同期信号でその先のユニット（メモリやレジスタ）の次の状態が決まります。それが連鎖して、また次の演算結果が出力される、選択信号がどれにするか選ぶ、これの繰り返しです。


次回からMOSFETを組み合わせてプロセッサを作るまで、順を追って解説します。

参考
----
YouTubeより。
[コンピュータの正体をつかまえよう](https://www.youtube.com/watch?v=ZHlKo1Yhd6U)
時代は古いですが、よく出来ています。

準備
----
このシリーズでは回路図が色々出てきます。これらはLogisimのドキュメントとして掲載しますので、実際の動作を確認するためにも Logisim 本体を落とておく事をおすすめします。
[Logisimサイト](http://www.cburch.com/logisim/)
実行ファイル（中身はjar）がナマで置いてありますから、インストーラはありません。
それからJavaのRuntimeが必要です。

一覧へ
----
[コンピュータの動作原理](https://qiita.com/niQSun/items/91396b620638e3f44f19#%E3%83%AA%E3%82%B9%E3%83%88)
Fusion360を使ってThingsをつくる

　
どうもInternetが苦手なへっぽこまるこです。
IoTに興味を持ったのはThingsが入っていたからです。
アドカレどころか初めてQiita書きます。
（投稿遅れました、申し訳ございません・・・）

今日は、私がThingsを作るのに最近使っているFusion360というCADソフトについて書きます。

##Fusion360とは

>Fusion360は、Autodesk社が提供している高機能3DCADソフトです。
3DCAD機能に加え、3DCAM、レンダリング、解析、アセンブリ、2次元図面などの機能が搭載されています。
>データはクラウド上で管理されているため、チーム内でのデータのやりとりを円滑にしてくれます。
従来は数百万円した3DCADですが、Fusion360は月額4,320円、年間35,640円ですべての機能を利用することができます。
>また、30日間の無料体験版も用意されております。さらに、学生や教育機関、非営利団体、スタートアップであれば30日の無料期間を過ぎても無料で使い続けることができます。
>引用（[http://fusion360.3dworks.co.jp/fusion360/](https://www.autodesk.co.jp/products/fusion-360/overview)）

年商1000万以下ならタダで使えるCADソフトという認識でいいかと思います。
私は、3Dプリンタなどで出力するためのデータを作ったり、レンダリングして遊ぶのに使っています。

##インストール

[公式](https://www.autodesk.co.jp/products/fusion-360/overview)からインストールできます。

体験版終了後の無料ライセンスを使用方法は以下で
[http://fusion360.3dworks.co.jp/tutorial/licence/](http://fusion360.3dworks.co.jp/tutorial/licence/)

##基本的な操作

たくさんたくさん機能はありますが、とりあえず、初めてな方は、「スケッチ」ツールと「押し出し」ツールを覚えておけばいろいろ遊べるかと思います。

[基本操作](http://fusion360.blog.jp/beginner/3dcad-modeling)
[スケッチ〜押し出し解説](http://fusion360.blog.jp/beginner/sketch)

##パンダを作ってみる
せっかくなので、デバイス的なものを作ってみます。

構成はこんな感じで、
![pandae.png](https://qiita-image-store.s3.amazonaws.com/0/115325/977c0205-cbfb-ce60-f841-df49d1be3c15.png)

モータの振動でパンダが微動する、感じなものが完成予定です！
このパンダの部分をFusion360で書いてみます。


[![IMAGE ALT TEXT HERE](http://img.youtube.com/vi/Cw8O5ETlJIE/0.jpg)](http://www.youtube.com/watch?v=Cw8O5ETlJIE)

※諸々編集できずだらだらな動画になってます・・・頑張れたら後日編集します・・

##出力してみる
ってことで、モデリングができたので、3Dプリンタで出力してみます。
・・・
と進めるはずだったのですが、この寒さのせいか3Dプリンタの温度が上がらず死んだので、
急遽、予定変更しました。


##パンダを縫ってみる
Fusion360には、プラグイン的なものがあり、
今回は前から使ってみたかったExactFlatというアドオンを使って、型紙を作成し、フェルトで縫ってしまおうという作戦にしました。

![スクリーンショット 0029-12-10 19.38.18.png](https://qiita-image-store.s3.amazonaws.com/0/115325/316947c3-d438-307c-1ae3-8c83d916737d.png)

（使い方割愛します汗）

![スクリーンショット 0029-12-11 0.21.26.png](https://qiita-image-store.s3.amazonaws.com/0/115325/9fc1bc07-e72e-d6ae-b89f-643c1889f353.png)

上のような型紙ができたので、
とりあえず家にある材料をかき集めてパンダを縫って無理矢理モジュール突っ込んで完成です！
ちなみに、wio nodeがうまく動いてくれなかったので、Nefryを使ってみました。

[![IMAGE ALT TEXT HERE](http://img.youtube.com/vi/ZAUuRK4Z4w0/0.jpg)](http://www.youtube.com/watch?v=ZAUuRK4Z4w0)

結果は色々あれあれなんですけど、動くものをつくるって楽しいです。

Fusion360はUIわかりやすくて初心者から上級者まで楽しめて、なんせ無料でも使えるので、
興味がある方はFusion360で登壇映え(?)なThingsを作ってみるのも良いかと思います。
<br>
<hr>
明日、ではなく今日は@shanonimさんです！
楽しみですね！
Cisco IOS で公開鍵認証でのSSHを有効化する


この記事はSFC-RG Advent Calendar 2017の10日目です。
誰も書かないから埋めました。
来年のNOCでヤング:boy_tone1:たちに見せるための備忘録。

---

# 概要
* Cisco IOSでsshによる公開鍵認証を 有効化する方法:v:
* と、ハマりどころ:metal:

なんか知らないけど当たり前のようにパスワード認証で我慢してる人が多い気がする。出来ないもんだと思ったけど調べたら方法があったので共有。
*ちなみにYamaha RTXは出来ない。悲しい。*



# 検証環境
* Cisco 891FJ 
* Cisco IOS 15.4
* 検証に用いる鍵はごく一般的なRSA

```IOS:#
router# show version
Cisco IOS Software, C800 Software (C800-UNIVERSALK9-M), Version 15.3(3)M5, 
ROM: System Bootstrap, Version 15.4(1r)T1, RELEASE SOFTWARE (fc1)
```




# 設定内容

クライアントPCとL3で導通するところまではがんばってやる :checkered_flag: 



## :one:  とりあえずパスワードでSSHログイン出来るようにする
[[Cisco IOS] SSHによるリモートアクセスの設定
](https://qiita.com/jinnai73/items/b8100818a639afb22342)
等を参考に行う。
時間に余裕が無い現代ピーポー:cop:のために必要なところを抜粋。



```IOS:enable用パスワードを作成
cisco1(config)enable secret ぱすわーどは半角英数記号で書く
```

```IOS:SSHの有効化とバージョンの明示的宣言
cisco1(config)# ip ssh version 2
```

```IOS:vtyの設定
cisco1(config)#line vty 0 4
cisco1(config-line)#login local
cisco1(config-line)#transport input ssh
```


```IOS:hostnameとドメインの設定
cisco1(config)#hostname cisco1

cisco1(config)#crypto key generate rsa
<中略>
How many bits in the modulus [512]: 2048
```
注:この鍵はルーター側の鍵。鍵長は2017年12月現在2048なら問題ない。


```IOS:ユーザーの作成
cisco1(config)username ユーザー名 privilege 15  secret ぱすわーどは半角英数記号で書く
```
- privilege値を15とすることで、ログイン後すぐに管理者モード```#```になる。

## :two:  公開鍵を登録する

```IOS:(config)#
cisco1(config)#ip ssh pubkey-chain
cisco1(conf-ssh-pubkey)#username ユーザー
cisco1(conf-ssh-pubkey-user)#key-string
cisco1(conf-ssh-pubkey-data)#公開鍵鍵をペタペタペーストする
cisco1(conf-ssh-pubkey-data)#exit
```
鍵をペタペタする際に一気に全部貼ると怒られる。
５回くらいに分けて改行しながら入れる。

#### :three:   認証方式を決定する
デフォルトでは、以下の３つのプロトコルが有効。パスワードや対話式入力を無効化したい場合は```no ip ssh server authenticate user hogehoge```する。

```IOS:(config)#
ip ssh server authenticate user publickey
ip ssh server authenticate user keyboard
ip ssh server authenticate user password
```

ちなみに最近のIOS-XEでは別のコマンドでの設定が必要。（上記コマンドを打つと古いよって怒られる)
以下はASR1Kの16.9での場合。

```IOS-XE16.9:(config)#
ip ssh server algorithm authentication password publickey
```

## :four:  試す
```IOS:#
cisco1# exit
```
```bash:~/
Macbook% ssh ユーザー名@ルーターのIPアドレス

cisco1#

```

出来た :confetti_ball:
失敗した場合は面倒くさいけどコンソールケーブルを繋いで設定を見直して下さい...



# refs.
全て2017年12月参照
[Cisco Router - Basic Security](http://www.infraexpert.com/study/ciscorouter6.html)
[[Cisco IOS] SSHによるリモートアクセスの設定
](https://qiita.com/jinnai73/items/b8100818a639afb22342)
avaで始めるフロントエンドテスト！

# 自己紹介

じゅんじゅんと言うニックネームで、関西を拠点に活動しているフロントエンドエンジニアです。

HAL大阪3回生です。（2017/12/20現在）

イベントや、勉強会に参加してるので是非お会いした際はお声掛けください！

# フロントエンドでもテスト書こう！

HALのみなさん、テスト書いてますか？

テスト...かいてますか？？？？？？？？

フロントエンドでテスト、導入してますか？？？

さて、僕はいま同年代の大阪HAL生でフロントエンドでテスト書いてる人みたことないんですがテスト書いていこう。という話

# テストとはなにか

テストとはなにか。

>コンピュータプログラミングにおいて単体テスト（たんたいテスト）あるいはユニットテストとは、ソースコードの個々のユニット、すなわち、1つ以上のコンピュータプログラムモジュールが使用に適しているかどうかを決定するために、関連する制御データ、使用手順、操作手順とともにテストする手法である。

なるほど。その名の通り、テストをするんだなと。

じゃあテストってどうやって書くの？？

# テスト書くならava使ってみようぜ

https://github.com/avajs/ava

![](https://raw.githubusercontent.com/avajs/ava/master/media/header.png)

まずロゴかっこよすぎる。それだけでava採用したいぐらいにはかっこいい。

## インストール

```shell
$ npm install --save-dev ava
```

package.jsonにscriptを書いておきましょう。

```json:package.json
"scripts": {
  "test": "ava --verbose"
}
```

## 使い方

avaはルートにある`/test`ディレクトリを見に行ってくれる（どこを見に行くかは設定で書くことができます）ので、適当に作ってみます。

```js:test/hoge.js
import test from 'ava'

// 基本形
test('タイトル', t => {
  t.pass()
})
```

タイトルのところには、なんのテストをするのかを書いておくといいです。

## 実行

npm scriptにかいているので、

```shell
$ npm test
```

で実行することができます。

![スクリーンショット 2017-12-12 3.13.11.png](https://qiita-image-store.s3.amazonaws.com/0/90347/d32d7d4d-82c5-3df0-2da5-70cf818076e0.png)

このようにテストに通ると、わかりやすくだしてくれます。

テストが駄目だった場合

![スクリーンショット 2017-12-12 3.13.47.png](https://qiita-image-store.s3.amazonaws.com/0/90347/67b88e7e-8bba-6a76-05ab-c3c40e90b764.png)


このようになぜテストが落ちたのか、どこで落ちたのかをわかりやすく表示してくれます。

もう少しだけ具体的なテストを書き足したいと思います。

```js:test/hoge.js
import test from 'ava'

// 基本形
test('タイトル', t => {
  t.pass()
})

test("1 + 1 = 2", (t) => {
  const a = 1
  const b = 1

  t.is(a + b, 2)
})
```

1 + 1は2だなと。なにかとなにかが同じであるか見るときは、`.is`と言うのをつかいます。

この結果をみてみると

![スクリーンショット 2017-12-12 3.17.38.png](https://qiita-image-store.s3.amazonaws.com/0/90347/a8cf6711-5ff9-dceb-c3bd-b38b6b45237c.png)


テストに通っていますね！

avaのアサーションは他にもいろいろありますが、詳しくは[README.md](https://github.com/avajs/ava/blob/master/readme.md)を参照ください。

では、最後に非同期のもののテストをかいていきます。例えばAPIにアクセスした結果のステータスコードは`200`である。みたいなテストを書くのに良いかもしれません。

```js:test/hoge.js
test("async test", async (t) => {
  const res = await new Promise((resolve) => {
    setTimeout(() => {
      resolve("hoge")
    }, 5 * 1000)
  })

  t.is(res, "hoge")
})
```

とりあえず、5秒の待ち時間を与えてみました。

async/await でさっぱりキレイにかけるので、いいですね！

この結果は

![スクリーンショット 2017-12-12 3.24.43.png](https://qiita-image-store.s3.amazonaws.com/0/90347/080e489e-d1d9-1dba-76f7-bed2aa94a113.png)

キチンと通っていますね！

# あとがき

テストをあまり書いたこと無い人も是非、テストガンガンかいていきましょう！！

詳しく使い方を見たい人はいい記事があるのでそちらを参照ください。

[ava で始めるテスト自動化入門 実践編](https://qiita.com/TsutomuNakamura/items/df537837127c7e4f65bc)

Twitterしています！ぜひフォローください。 [@konojunya](https://twitter.com/konojunya)

そんなに大したこと書いてないですが、一応ソースコードは[konojunya/ava-test](https://github.com/konojunya/ava-test)

にあります！
[Haskell] FunctorクラスはHask圏からHask圏への関手

タイトルは、**[Haskell] FunctorクラスはHask圏からHask圏への関手**となっていますが、
もっと正確には、**[Haskell] FunctorクラスはHask圏からHask圏の部分圏への関手**のほうが、より適切かもしれません。


もともとこの記事は[Haskellアドベントカレンダー(その3)](https://qiita.com/advent-calendar/2017/haskell3)の、12/14に登録した「とびだせ！Hask圏」という記事の前半部分として書いていたものです。
。
ただ、その記事がクソ長くなってしまいそうだったので、前半を分離して一つの記事にしたのがこの記事になります。


# 基本的な用語
## 圏とは
圏の公理を書こうかと思ったんですが、結構面倒くさいので省略します。
忘れちゃダメなポイントは、

- すべての対象に**恒等射が存在する**。
- 射の合成は**結合則を満たす**。

という点です。

## Hask圏とは
- 対象はHaskellの、**カインドが`*`である**型
- 射はHaskellの関数
- 射の始域は関数の引数の型
- 射の終域は関数の戻り値の型
- 恒等射は`id`
- 射の合成は関数結合 `(.)`

であるような圏です。

## 関手とは
圏 C から圏 D への共変関手 F とは、

- C の任意の対象 X を、 D の対象 F(X) に対応させる。
- C の任意の射 f : X -> Y を、Dの射 F(f) : F(X) -> F(Y) に対応させる。
- C の恒等射は、 D の恒等射に対応させる。
- C の任意の射 f : X -> Y と g : Y -> Z について、F(g ∘ f) = F(g) ∘ F(f) を満たす。

以上をみたすようなもののことです。

最後のはちょっと分かりづらいかもしれませんが、射を合成してから関手で移しても、関手で移してから合成してもおんなじってことです。

# Haskell の Functorクラス

Haskellには`Functor`という型クラスがあり、これは関手を表現しています。

では、具体的にどんな圏からどんな圏への関手なのでしょうか？

##例：Maybe

代表的なFunctorである `Maybe` を例にとって考えてみましょう。
`Maybe`という型コンストラクタのカインドを見てみると

```hs:kind
ghci> :kind Maybe
Maybe :: * -> *
```

というように、カインド`*`を持つ任意の型を、カインド`*`を持つ別の型に移すものだとわかります。

具体的には、

```hs:kind
ghci> :kind Int
Int :: *
ghci> :kind Maybe Int
Maybe Int :: *
```
という具合です。

どうやらこれは関手の定義のうちの一つ、「**C の任意の対象 X を、 D の対象 F(X) に対応させる**」という性質を表現しているようです。

つぎに、`fmap`という関数について考えてみます。
fmapの型を見てみると

```hs:type
ghci> :type fmap
fmap :: Functor f => (a -> b) -> f a -> f b
```

これは多相的な表現になっていますが、Maybeに限って言えば`fmap :: (a -> b) -> (Maybe a -> Maybe b)` ということです（`(->)`は右結合なので括弧を補足しました）

この型を見ると、`fmap`は任意の型の間の関数 `f :: a -> b` を、`fmap f :: Maybe a -> Maybe b` に移すものだとわかります。

これは関手の定義のひとつ、「**C の任意の射 f : X -> Y を、Dの射 F(f) : F(X) -> F(Y) に対応させる**」という性質を表現しているようです。

## Maybeの例からわかること
さて、型コンストラクタ `Maybe` が関手による対象の対応付け、`fmap` が関手による射の対応付けを表現していることがわかりました。

では、この関手はどんな圏からどんな圏への関手を表現しているのでしょう？
その答えは、関手によって移される前後の「**対象**」と「**射**」に注目してみるとわかります。


|| Maybeで移される前 | Maybeで移された後 |
|:--:|:--:|:--:|
|対象| カインド`*`を持つ型 | カインド`*`を持つ型 |
|射| 関数 | 関数 |

この表を見ると、Maybeによって移される前後で両方とも対象が`*`で射が関数なので、両方ともHask圏であると言えそうです。

（移された後の対象はすべて `Maybe a` という形をとる型に限られるので、「Hask圏の部分圏」と言ったほうが、より適切かもしれません）

ここではMaybeを例に挙げましたが、他のFunctorでも同じことです。

一般に**HaskellのFunctorクラスはHask圏からHask圏への関手**を表現していると言えます。

#まとめ
タイトルにもなっていますが、

**HaskellのFunctorクラスはHask圏からHask圏への関手**

ということがわかりました。
Componentの中にJSXを返す関数を作るのはやめよう

ReactのComponentをどう設計すればいいかという話で最近ちょっと学びがあった

まず以下のコードを見て欲しい

```.js
class menuPopup extends React.Component {
  ...
  
  renderPopup() {
    if (this.props.isPopupOpen) {
      return <Popup />;
    }
    return null;
  }
  
  render() {
    return (
      <div>
        <button onClick={this.handleButtonClick} />
        {this.renderPopup}
      </div>
    )
  }
}
```

結論から言えば`renderPopup()`なんていう関数はやめようという話

## renderPopup()に切り分けてしまう動機
上記のようなコードを僕は大量に生成していた。

なんで切り分けたかというと、
ロジック(ここではif文)がある部分は切り分けたかったから。

僕はもともとrailsでサーバを書いてたので
**ついついロジックがある部分はメソッドに切り出したくなってしまった**
そして上記のようなコードを書いてしまったのだ

## そもそもなぜメソッドに切り出すのか
そもそもバックエンドのコードでロジックをメソッドに切り出すメリットはなんなのかを考えて見ると大きく分けて次の2つあると思う

- 可読性を上げるため
- 変更に強くなるため

まず可読性をあげるということだが、バックエンドのコードはロジックそれ自体ではぱっと見何をしているのかわからないことが多い
しかしメソッド化して名前をつけてあげれば、そのコードが何をしているのか、実際のロジックを見なくても理解することができる。

次に、変更に強くなるというのがどういうことかというと、同じロジックが複数の箇所で使われている場合それをメソッドに切り分けておけば、そのロジックに変更があった場合にそのメソッドの中だけを変更すればよくなるということ
そしてそれをできるだけ細かく役割ごとに分けるほど、変更する理由は減っていき、メンテナンス性が向上する

## 今回の場合切り出す必要はあるのか？
それぞれについて考えて見る

まず可読性はあがるか
個人的な意見だが、そこまで**可読性は変わらないんじゃないか**と思う

renderPopupの中で`<Popup />`が呼ばれていてこれが直接書いてあっても何をしようといるのか一目でわかる
そもそもHTMLはviewを直接反映しているのであまりに膨大ではない限りそのまま書いてあった方がviewをイメージしやすい

次に変更に強くなるか
これは場合によると思う
このrenderPopup()はともかく、このような**JSXを返す関数を他で使うのであれば関数化することでメンテナンス性が向上する**

ただここでひとつ考えるべきなのは、**JSXを返す関数とはComponentに他ならない**ということだ
stateless componentはまさにpureにJSXを返す関数である

つまり、**あるJSXを返す関数を複数の場所で使うのであればそれははっきりとComponentとして別ファイルに書き出したほうが管理がしやすくなる**
これをレビューで指摘していただいたときはすごく納得した

## 結論：renderPopup()はやめよう
以上のように考えるとComponentの中にJSXを返す関数を定義するのはよくないのではと思う

**他の場所で使わないのであればrender()の中にベタ書きして可読性をあげよう
他の場所でも使いそうならComponentとして切り分けてメンテナンス性をあげよう**

だらだら書いたが、最初に見せたような条件分岐の書き方としてはReactのドキュメントにあるように**Conditional Rendering**の記法を使うのがいいと思う
https://reactjs.org/docs/conditional-rendering.html

```.js
class menuPopup extends React.Component {
  ... 
  render() {
    return (
      <div>
        <button onClick={this.handleButtonClick} />
        {this.props.isPopupOpen && 
          <Popup />
        }
      </div>
    )
  }
}
```

可読性もかなりいい

## 学んだこと
この話を通して学んだことは、ある状況で推奨されている設計はその背景をきちんと理解したほうがいいということだ
今回のように関数での切り分けはある状況ではベストプラクティスが、別の状況では違うかもしれない

設計の判断をするためにも、**なぜその設計だといいのか**ということをちゃんと学ぼうと思った
schema.rbにROW_FORMATの記載が出てきてびっくりしたのでまとめてみた！

グロービスでは2022年までの5年間、「アジア化」をテーマに、Edtechを推進し、日本初の学習プラットフォームの提供を行っています。サーバーサイドエンジニアとしてRailsを書いてます。Let's go global♬

…今日はそんな開発中にdb/schema.rbに膨大なdiffが出てビビった話ｗ
![ben-white-197668.jpg](https://qiita-image-store.s3.amazonaws.com/0/52634/d2835c2b-a80e-a15d-27e5-9fa94cfe7e84.jpeg)


# 「innodb_file_format」と「row_format」って？
Railsの開発やっている時、DBで気にするのは、`character_set`くらいでした。
ゼロからRailsのアプリ作って、MySQL立てて…って何も考えずやると、

```sql
$ show variables like "chara%";
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | latin1 |  <--- latin1になってる！！
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | utf8 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
```
みたいな感じになって、my.cnfの設定直してMySQLを再起動するハメになったり。

文字通りだけど、
innodb_file_formatはファイルのフォーマットで、row_formatは行のフォーマット。

## だから、「innodb_file_format」って？
innodb_file_formatには、**Antelope**とそれより新しいフォーマットの**Barracuda**があって、インデックスレコードの使い方が違う。

**Antelope**
可変長カラム(VARCHARとか、TEXTとか)の先頭768バイトをインデックスレコードに格納し、残りをオーバーフローページに格納する。
可変長カラムが多いと行の最大長に達してしまう…

**Barracuda**
可変長カラム(VARCHARとか、TEXTとか)の全てを外部のオーバーフローページに格納し、クラスタインデックスレコードにそのページへのポインタ(20B)のみを格納する。
ポインタのみを格納するためより多くの文字列を格納できる。

## そして、「row_format」って？
row_formatにはinnodb_file_formatにも依存する形で4つある。
テーブルにするとわかりやすい！

| innodb_file_format | row_format | 簡単な内容  | file_format毎のデフォルトrow_format |
|----|----|----|:----:|
| Antelop | Redundant | 昔使われてた… |  |
| Antelop | Compact | Redundantよりもデータサイズが小さくないるようになっている？ | ◯ |
| Barracuda | Dynamic | データ圧縮をされない | ◯ |
| Barracuda | Compressed | データ圧縮をされる |  |

# まとめ
ちなみに、MySQL5.7.7以上だとBarracudaがデフォルトのinnodb_file_formatだそう。
schame.rbは、`ROW_FORMAT=DYNAMIC`(緑枠線囲い)が増えたのだけど、
heroku->AWS移行時にMySQLのバージョンが上がったのが原因っぽい気がする。
<img width="1019" alt="skitch.png" src="https://qiita-image-store.s3.amazonaws.com/0/52634/c36faf8b-40ec-137c-3481-2a6dfc8806d4.png">

たまに、こうやって調べると色々勉強になる^^

### (参考)設定を確認するためのコマンド
```sql
/* innodb_file_formatがわかる */
$ SHOW GLOBAL VARIABLES LIKE '%innodb_file_%';

/* row_formatがわかる */
$ SHOW TABLE STATUS LIKE '%table_name%';

/* MySQLのバージョンを確認 */
$ select version(); 
```
source+pipe

xonshのアドベントカレンダー記事だし、
xonshと他の対象としてとりあえずbashとzshと比較してソースコード。
test.shはすべて同じもの。

# 普通にsource

## Bash, Zsh

```test.sh
a=2
echo "test"
```
```test2.sh
a=1
source test.sh
echo $a
```
```bash
bash test2.sh
# -> test
# -> 2
```
```zsh
zsh test2.sh
# -> test
# -> 2
```

## xonsh

```test.sh
a=2
echo "test"
```
```test2.sh
a=1
source test.sh
echo @(a)
```
```sh
xonsh test2.sh
# -> test
# -> 2
```

# つなぐ

## bash, zsh

```test.sh
a=2
echo "test"
```
```test2.sh
a=1
source test.sh | sed -e "s/test/hoge/"
echo $a
```
```bash
bash test2.sh
# -> hoge
# -> 1
```
```zsh
zsh test2.sh
# -> hoge
# -> 1
```

## xonsh

```test.sh
a=2
echo "test"
```
```test2.sh
a=1
source test.sh | sed -e "s/test/hoge/"
echo @(a)
```
```sh
xonsh test2.sh
# -> hoge
# -> 2
```

なるほど。

# 楽しい
```pow.py
print(i*i)
```
```logger.sh
for i in range(1,10):
    source pow.py > @("%02d.log"%i)
```
iOSエンジニアによるPython3入門(環境整備編)

## 環境整備済みの人向け
Python3の環境が整っている人には、[iOSエンジニアによるPython3入門(文法編)](https://qiita.com/otis/items/1787b7783cd5d2748194)も書いているので良かったら読んで頂きたい。

## 背景
fastlaneにはrubyが使われてるし、gybにはPython使われてるし…。より深く理解や学習しようとした時に、Objective-CやSwiftだけでは完結できなくなってきるので、以前から興味のあったPythonを学びつつ活かしていこう画策した。

macOSならデフォルトでPython2系は入っているが、今からなら最新のPython3を選ばない理由はないと思うので、macOSかつPython3を基準で記載していく。

## Python3導入
1. brewが入っていない人は、下記を参考に導入
[Homebrew macOS 用パッケージマネージャー](https://brew.sh/index_ja.html)

1. `brew install python3`を打つ

1. `python3 --version` で Python 3.6.3(2017/12/12現在)と表示されたのでちゃんと入っていること確認。

## GUI環境の整備
ターミナルで、`python3`を打ってコマンドライン環境でやるのもありだけど、iOSエンジニアとしてはGUI環境に慣れすぎてコマンドベースにはツラみがある。

なので[Visual Studio Code](https://code.visualstudio.com/)を使って、Python環境を整える。

## Visual Studio Codeのセットアップ
##### Pythonのデバッグ環境等のインストール
1. サイトからダウンロード、解凍、アプリケーションフォルダに入れる、起動
1. 赤い箇所のアイコンをクリックして拡張機能を開く
![Kobito.LPk9w0.png](https://qiita-image-store.s3.amazonaws.com/0/154832/644e6cb3-db88-1d33-a53a-6ed2d058798b.png "Kobito.LPk9w0.png")

1. 拡張機能の検索欄に`python`と入力
![Kobito.9kwSGD.png](https://qiita-image-store.s3.amazonaws.com/0/154832/7120befe-3a9e-da5f-07e3-f0c2eda9c2bd.png "Kobito.9kwSGD.png")

1. だいたい1番上に出てくる "Linting, Debugging..."と表示されている機能をインストール
![Kobito.1AezSy.png](https://qiita-image-store.s3.amazonaws.com/0/154832/d34e00ff-025f-3564-6458-e36200d01db3.png "Kobito.1AezSy.png")


##### Visual Studio CodeでのPythonをPython3がデフォルトになるよう設定
1.  左下のアイコンから設定を開く
![Kobito.pI5rU0.png](https://qiita-image-store.s3.amazonaws.com/0/154832/159b08d5-570c-1f65-c704-5feccd812433.png "Kobito.pI5rU0.png")

1. 右側のカラムの`{}`の間に`"python.pythonPath": "python3"`と記述する
![Kobito.w0i6nO.png](https://qiita-image-store.s3.amazonaws.com/0/154832/ae7524bc-2c81-0c79-534b-5ff7dc1c69f0.png "Kobito.w0i6nO.png")


##### ターミナルから`code`と打ってVisual Studio Codeを起動するように設定
1. `Shift(⇧) + Cmd(⌘) + P` を入力またアプリケーションメニューからコマンドパレットを選択して開く
![Kobito.jc5S63.png](https://qiita-image-store.s3.amazonaws.com/0/154832/bf028e01-afd9-e029-521a-2737ada68df1.png "Kobito.jc5S63.png")

1. コマンドパレットの入力欄に `shell` と入力し、”シェルコマンド:PATH内に'code'コマンドをインストールします” を選択 (アンインストールの項目のほうが先に表示されているので注意)
![Kobito.uIZ84T.png](https://qiita-image-store.s3.amazonaws.com/0/154832/70ea616c-14c0-5afd-085e-16f52a4bec4c.png "Kobito.uIZ84T.png")

1. インストール完了後、ターミナルを起動して`code`と打ってVisual Studio Codeが起動することを確認

これでVisual Studio Codeの導入も完了。

Pythonファイルがあるディレクトリで、ターミナルから`code .`とか`code hoge.py`と打つことで、Visual Studio Codeでプロジェクトやファイルを開いてくれる。
Raspberry Piでフレームバッファを使ったデジタルサイネージ

# TL; DR

X Windowを使った画像表示が重いとき（特にRaspberryPi ZERO），X Server等を立ち上げずにフレームバッファで画面表示をするとサクサクになりがち．

# なにがしたいか

RaspberryPiを使ってデジタルサイネージっぽいものやってる例があったので([これ](https://qiita.com/nanbuwks/items/59ad753775dcead549d6)とか[これ](https://www.skyarch.net/blog/?p=5676)とか）がうらやましかったので，ブラウザを全画面表示してやってみようとしたところ，RasPiZeroだとブラウザの処理が重く実用に耐えませんでした．

そこでX Windowサーバを立ち上げずに直接フレームバッファを使うことで，軽量化を図ってみました．

# 基本戦略

普通にブラウザを立ち上げるとブラウザがCPUを食い潰してしまうのでHTMLのレンダリングとレンダリング結果の表示を独立して行います．
具体的には

1. ChromiumのHeadlessモードを使ってHTMLを画像に変換し
1. 画像をfbiコマンドを使ってフレームバッファに表示
1. 1から繰り返す

という流れになります．
（結論から言うと1.のHTMLのレンダリングが時間がかかりすぎてそんなに体感速度は出ませんでした・・・）

# 下準備

## Chromium, fbiのインストールとfbiのパス無しsudoの許可

HTMLをPNGに変換するために`chromium-browser`を,PNG画像をフレームバッファに表示するために`fbi`を使うのでインストールします．

```shell-session
$sudo apt install chromium-browser fbi
```

また，fbiは実行時に/dev/ttyXにアクセスする必要があるのでsu権限での実行が必要ですが，
自動化する手前```sudo```時にパスワードを聞かれるのは困るのでパスワード無しで```sudo```可能にしておきます．
（参考：(sudo のパスワードを入力なしで使うには)[https://qiita.com/RyodoTanaka/items/e9b15d579d17651650b7]）
```visudo```して以下の一行をsudoersに追加します．

```
pi ALL = NOPASSWD: /usr/bin/fbi
```
## /sys/class/graphics/fb0/blankの権限変更

RaspberryPiではHDMI出力のOn/Offを切り替えは

```shell-session:HDMI出力ON
#echo 0 > /sys/class/graphics/fb0/blank
```

```shell-session:HDMI出力OFF
#echo 1 > /sys/class/graphics/fb0/blank
```

のようにすればいいっぽいんですが（画面スリープからの復帰も同様），一般ユーザからも操作したいので

```shell-session
$sudo chmod 666 /sys/class/graphics/fb0/blank
```

する必要があります．
ただ，毎回起動後に```sudo```するのは現実的ではないので```/etc/rc.local```に以下を追加して起動後に権限を変更するようにしておきます．（セキュリティ的にどうなの？的な問題はあるとは思いますが，たかが画面のON/OFFだし・・・）

```shell
chmod 666 /sys/class/graphics/fb0/blank
```

# 動作

## HeadlessなChromiumを使ってHTML→PNG

ChromeのHeadlessモードの詳細は本家の[ヘッドレス Chrome ことはじめ ](https://developers.google.com/web/updates/2017/04/headless-chrome?hl=ja)に紹介をゆずりますが，端的に言えばコマンドライン上で動作が完結するモードです．
例えば，以下のようにすることで1920x1080のサイズのヤフー天気のページが取得できます．
```--hide-scrollbar```を指定することでスクロールバーが表示されず見栄えが良くなります．
（なぜかコマンドを間違えた時にエラーが出ずに無視されるだけなので非常にtypoに気付きにくいです）

```shell-session
$chromium-browser --headless --disable-gpu --screenshot --hide-scrollbar --window-size=1920,1080 https://weather.yahoo.co.jp/weather//weather/
```

とすると，実行したディレクトリにYahooのお天気ページがscreenshot.pngとして保存されます．
（↓こんな感じ）
![screenshot.png](https://qiita-image-store.s3.amazonaws.com/0/145065/6aade1e7-614e-0146-b5c4-b59e9eb53e49.png)

## HDMI出力の有効化

イマイチ条件がわかってないんですが，放っておくとHDMI出力がOFFになりがちなので，

```shell-session
$echo 0 > /sys/class/graphics/fb0/blank
```

してHDMI出力を有効化します．

## フレームバッファへの画像出力

以下のコマンドを実行することで，先ほど保存した画像が全画面表示されます．

```shell-session
$sudo fbi -T 1 -d /dev/fb0 -noverbose screenshot.png
```

以上の手順をスクリプトにまとめて無限ループさせることでX無しにデジタルサイネージっぽいことが可能になります．

# 感想

Chromiumのheadlessモードの利用法としてはかなり邪道な予感がするせいか，全くパフォーマンス的には改善が見られませんでした．
ただ，フレームバッファに画像を表示する動作自体は高速なので，サーバサイドで表示する画像を作ってあげてwgetして表示とか言う流れならもっとフレームレートが上げられる気はします．
まぁそもそもHTML→PNGが重いので，表示したい内容をSVGで作ってconvert(imagemagic)するとか，もっと他の画像作成方法を使うと言う手は十分に考えられそうです．
ただ，「Webベースのダッシュボードを作ってそれを定期的に更新しながら画面に表示する」的なアプリケーションなら今回の構成で十分実用可能そうです．
あとモニタを起動後に接続しても上手いこと解像度等設定してくれないので，プラグアンドプレイな状態を実現したいものです．
SECCON 2017 Online CTFに出た話

AdventCalendarということで何か実用的な記事が書けたらよかったのですが、間に合わなかったのでSECCONオンライン予選SECCON 2017 Online CTFに初参加した話を書きます。
Team名:RICORAで参加しました。結果は100pt×5問=500ptでした。
解けた/解けないに関わらず僕が手をつけていた問題について書こうと思います。
どうやらWrite-upというものが12/10にあったらしく、この記事の公開時期的に完全に出遅れている感は否めないのですが、勘弁してください。

#Vigenere3d
　ヴィジュネル暗号[(wikipedia)](https://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=4&cad=rja&uact=8&ved=0ahUKEwiZjNTxqoLYAhVJOrwKHUykAu4QFgg4MAM&url=https%3A%2F%2Fja.wikipedia.org%2Fwiki%2F%25E3%2583%25B4%25E3%2582%25A3%25E3%2582%25B8%25E3%2583%25A5%25E3%2583%258D%25E3%2583%25AB%25E6%259A%2597%25E5%258F%25B7&usg=AOvVaw0hdg5SxPZr8tZym6BsnCEF)というものがあるらしく、この問題のプログラムでは暗号化過程で３次元配列を使用しているみたいです。
`SECCON{**************************} `
という文字列を
`**************`
をキーにして暗号化すると
`POR4dnyTLHBfwbxAAZhe}}ocZR3Cxcftw9`
になるので、元の文字列とキーを特定することが求められていました。
　与えられたソースコードから暗号化の特徴を掴んだり、文字列を探索するプログラムを書くことができたらよかったのですが、知識的にも技術的にも未熟だった僕は地道に検証していくことにしました。
元の文字列を`SECCON{AA...AA}`、
キーを`AA...AA`にして適当な部分を変えたりして検証したところ
どうやらキーの前半分（７文字）だけ求めればよく、後ろ半分は全部Aでよいことがわかったので、`SECCON{`と`POR4dny`に注目しながら元の文字列とキーを探索していました。
`key:_KP2Za_AAAAAAA`
`flag:SECCON{Welc0me_to_SECCON_CTF_2017}`
を求めることができました。
#Run me!
　ソースコードをみる限りフィボナッチ数列の11011項目の先頭32桁が答えになるみたいです。
　とりあえずソースコードを愚直に実行すると、終わる気配が一向に見えず、一時中断しました。再帰関数は深くなるにつれ時間計算量が半端ないことになることを思い出したのでループで回して結果を求めることにしました。

```fib.py
a=0
b=1
for i in range(11011):
    a,b=b,a+b
print ("SECCON{" + str(a)[:32] + "}")
```
`flag:SECCON{65076140832331717667772761541872}`
を求めることができましたが、チームメンバーがすでに通していました。
#Log search
　Elasticsearchを使う問題のようです。
 Elasticsearchについては知識がnull状態だったのですが、他のチームの人たちが投げたリクエストのログを見ることができたのでそれっぽいリクエストに対して200が返ってきているものに便乗する作戦をとりました。
　ダメでした。flag-XXXXに対して200が返ってきているものがあったのでこれじゃないかと思ってGETを投げてみたのですが、無事そのページのHTMLが返ってきてずっこけました。
　参加した人の書いた記事を見たところ、どうやらそれでいけたチームがちらほらといたようなので正攻法ではないにせよ手段としては間違いではなかったと思います。
#Ps and Qs
　"Mind your Ps and Qs"で日本語で「礼儀に気をつけなさい」的な感じの言葉だそうです。
　公開鍵ファイルが2つと暗号化済みのファイルが1つあったので恐らく公開鍵の元となる2つの合成数の公約数を求めて秘密鍵を特定するのだろうというところまでは予想しましたが、肝心の方法は一切わからなかったのでハッシュをただ眺めてました。
#感想
　全くこの系統の問題を解いていない中での初参加だったので、まともに解けたのがたとえ２問でも結構達成感を感じました。こういったコンテストには今後も出たいので精進したいと思います。あとツールの幅広さを考えるとそこそこのスペックのwindowsマシンが欲しいなあ・・・
silkでお手軽プロファイリング


## はじめに

この記事は、[Django Advent Calendar 2017](https://qiita.com/advent-calendar/2017/django) 11日目の記事です。


## silkとは

https://github.com/jazzband/silk/

> Silk is a live profiling and inspection tool for the Django framework. Silk intercepts and stores HTTP requests and database queries before presenting them in a user interface for further inspection:

Request/ResponseのログとSQLクエリのログ、cProfileでのプロファイリングを記録してくれるやつです。

[AWESOME DJANGO](http://awesome-django.com/)の「Debugging」の項目にも載ってますね。

今年のEuroPythoでもsilkを紹介しているトークがありました。

* [Alejandro Castillo - Django Rest Framework, one year after: tips, tools, tricks and pitfalls.](https://youtu.be/0URILwS7-WI)


## silkのいいところ

* django-debug-toolbarではできないAjaxでの非同期リクエストが計測可能
* Dashboardから誰でも確認できる(閲覧権限も設定可能)
	* 計測結果はDBに保存されている
* `/health`へのRequestはログから除外するなどの設定が柔軟にできる
* DBに保存したやつをリセットするコマンド(`python manage.py silk_clear_request_log`)が便利

Dashboardはこんな感じです。

![1.png](https://qiita-image-store.s3.amazonaws.com/0/19111/dea50ae8-8a9d-fcc7-9f9b-6e322ede73fa.png "1.png")

![2.png](https://qiita-image-store.s3.amazonaws.com/0/19111/448eff56-a96a-2141-0b65-add14e25b6d6.png "2.png")

![5.png](https://qiita-image-store.s3.amazonaws.com/0/19111/09b39889-6c53-8239-f971-7ab9e58ed445.png "5.png")


## おわりに

このsilkには、Django REST frameworkを使ったSPAなアプリケーションで、N+1クエリを撲滅するときにお世話になってます。

この手のツールではdjango-debug-toolbarが有名ですが、Ajaxリクエストに対応できなかったり、toolbarをぽちぽちクリックするのが面倒だったりするので、そんな時にはsilkを試してみるのがおすすめです。
JavaからKotlinに移行しはじめて思ったこと

## Kotlinを書き始めた
会社で開発しているAndroidアプリをこれまでJavaで書いてきたが、10月末のAndroid Studio 3.0リリース = Kotlin正式サポートを機に、新規開発部分の実装にKotlinを使うことにした。また、既存実装部分も必要に応じて（練習も兼ねて）少しずつ書き直したりしている。<br>

ということで、まだ1ヶ月も使ってないくらいだが、Kotlin書いてて感じたことをポツポツ書いていく。<br>

※ちなみに、既存の部分の書き換えに関しては、Android Studio（≒ IntelliJ）の自動コンバート機能が非常に優秀。ファイルごと変換するのも楽だし、Javaのコードを部分的にコピーして`.kt`のファイルにペーストすると変換してくれるのも嬉しい。<br>


## オプショナルの存在がありがたい
もう改めて書く必要も無いことだけど、やはり挙がるのがこれ。<br>
同じくネイティブアプリを書くときに利用するSwiftと比較して、ぬるぽの発生を気にしながら書かなければいけないのが不安要因だったが、これで解消された。もちろんJavaでもNullチェックをしたり`Optional.ofNullable`を使ったりして回避そのものはできるものの、NullableやNotNullがはっきりと分かれている世界になって良かった。<br>

エルビス演算子使って、Swiftの`guard`ぽく書けたりするの好きです。<br>

```kotlin:sample.kt
val str: String = optionalStr ?: return
```

## オプショナルの良さを消さないためには、Java側でもケアが必要
JavaとKotlinが入り混じったプロジェクトを扱う場合、当然ながらKotlinからJavaのコードを呼び出すケースが出てくる。そういうときには、Java側でアノテーションを付けてあげると、Kotlinでのオプショナル関連の制約が効くようになる。<br>

例えば、Java側で以下のようなコードがあったとする。<br>

```java:AppUtil.java
public class AppUtil {
    public static String getVersion() {
        return "1.0";
    }
}
```

Kotlin側から呼び出すと`AppUtil.getVersion()`の返り値は`String!`となり、`String`でも`String?`でも許容しているような状態になってしまう。うっかりnullでも入ってしまうとぬるぽ時代に逆戻り。これでは持ち味が消えてしまうので、Java側のメソッドに`@NonNull`か`@Nullable`アノテーションを付けてあげる。これで、IDEが返り値の型を`String`もしくは`String?`だと推論してくれるようになる。<br>


## extensionが便利
既存のクラスにメソッドやプロパティを新しく生やせる。Javaで書いていた頃は、Swiftと比較してこれが無いのが不便な感じだった。（実現するために、`HogeUtil`みたいなクラスのstaticメソッドが結構な数生まれていた）<br>

```kotlin:Extension.kt
fun Button.disableTouch() {
    alpha = 0.5f
    isEnabled = false
}
```

上記は`android.widget.Button`にメソッドを追加した例。<br>


## Javaにおけるstaticメソッド・static変数 etc.
よく使っていたstaticメソッドやstaticプロパティがKotlinには存在しない。例えば、フラグメントのファイルにだいたい書いていた`public static HogeFragment newInstance(...) { ... }`みたいなファクトリメソッドはどう表現すれば良いのかというと、解決法の1つとしてCompanion Objectを使うという手がある。<br>

```kotlin:HogeFragment.kt
class HogeFragment : Fragment() {
    companion object {
        fun newInstance(...): HogeFragment {
            ...
        }
    }
}
```

※ただしこのままだと、Javaから呼び出す際に`HogeFragment.Companion.newInstance(...)`という呼び方をしなければならず、ちょっと不格好。Javaで書いたときのように`HogeFragment.newInstance(...)`と呼び出したい場合は、メソッドにアノテーション`@JvmStatic`を付ける。<br>

```kotlin:HogeFragment.kt
companion object {
    @JvmStatic
    fun newInstance(...): HogeFragment {
        ...
    }
}
```

一方で、staticメソッド（ぽいもの）を表現する方法としては、ファイルのトップレベル関数を使う手もある。<br>

```kotlin:HogeFragment.kt
fun topLevelFun(...) {
    ...
}
 
class HogeFragment : Fragment() {
    ...
}
```

Javaのときと同じように呼べること・名前の衝突を気にしなくてよいことなどから、基本的に前者の方法（Companion Object使う方）で良いかと思っていた。が、以下のブログなどを最近読んで、使い分けのなんとなくのイメージがついて勉強になりました。
[companion object vs. top-level - hydrakecat’s blog](http://hydrakecat.hatenablog.jp/entry/2017/12/02/companion_object_vs._top-level)<br>


static変数に関しても同様で、Companion Objectの中でプロパティを宣言する方法とトップレベルで宣言する方法がある。（前者に関しては、`@JvmField`を付けるとJavaのときと同様の呼び出し方ができる）<br>


## おわり
ということで、まだまだ使い始めて日が浅いけど、Kotlin書いてて感じたことを少しだけ書いた。<br>
上で書いてきたことに加え、Swiftと書き味が似ていることやコード量がJavaと比較して減ることも嬉しい。サーバサイドで利用するのもありなんじゃないかと思っている。<br>


## [PR] 仲間探してます
アトラエで一緒にKotlinやSwift, RailsやPythonを書いてくれる仲間を募集中です！
https://www.green-japan.com/company/172
POV-Rayにおけるオブジェクト集合演算

# はじめに
これは [POV-Rayによる数学お絵かき入門 Advent Calendar 2017](https://qiita.com/advent-calendar/2017/povray4math) の12日目の記事です.

POV-Rayでは立方体と球の差集合を取って次のようなオブジェクトを構成する事が出来ます.

![](https://i.imgur.com/lLWD9LU.png)

このようなオブジェクトの構成をPOV-RayではCSG(Constructive Solid Geometry)と呼びます.
今日の記事ではこの機能の使い方と少しの応用について述べます.

公式ドキュメントでは以下が近いです.
http://www.povray.org/documentation/3.7.0/r3_4.html#r3_4_5_4

POV-RayでのCSGを「論理演算」と書いている記事がインターネットには散見されますが, 「集合演算」が正しい和訳かと思います.

# 和集合 union
これまでに既に解説しましたが, 複数のオブジェクトをまとめて扱うには`union`が有効なのでした. ([第7回](https://qiita.com/Hyrodium/items/a30ff5e5304457ff102a#union))
CSGの観点から見ればこれは和集合に相当します.

```Povray
union{
	OBJECT1
	OBJECT2
	..
	OBJECTn
}
```

## 具体例

```Povray
union{
	box{-1,1 pigment{rgb<1,0,0>}}
	sphere{0,1.5 pigment{rgb<0,0,1>}}
}
```

![](https://i.imgur.com/OwmiUWF.png)

# 積集合 intersection
積集合の用語には曖昧さがありますが, ここでの積集合は集合の交わりの意味での積集合です.
構文は`union`のそれと同じで, 次のように書きます.

```Povray
intersection{
	OBJECT1
	OBJECT2
	..
	OBJECTn
}
```

## 具体例

```Povray
intersection{
	box{-1,1 pigment{rgb<1,0,0>}}
	sphere{0,1.5 pigment{rgb<0,0,1>}}
}
```

![](https://i.imgur.com/rsbyaHl.png)

# 差集合 defference
差集合を指定するには次のように書きます.

```Povray
difference{
	OBJECT1
	OBJECT2
}
```

これによって`OBJECT1`から`OBJECT2`を差し引いたオブジェクトが得られます.

## 具体例

```Povray
difference{
	box{-1,1 pigment{rgb<1,0,0>}}
	sphere{0,1.5 pigment{rgb<0,0,1>}}
}
```

![](https://i.imgur.com/lLWD9LU.png)


```Povray
difference{
	sphere{0,1.5 pigment{rgb<0,0,1>}}
	box{-1,1 pigment{rgb<1,0,0>}}
}
```

![](https://i.imgur.com/dZczSYV.gif)

この例では穴が開いてることが分かりにくかったのでカメラの位置を移動させています.


# 補集合 inverse
`inverse`を使えば補集合を得ることができます.
これと`intersection`を組み合わせる事で`difference`を実現させることが出来ます.
次に具体例を示します.

```Povray
intersection{
	box{-1,1 pigment{rgb<1,0,0>}}
	sphere{0,1.5 pigment{rgb<0,0,1>} inverse}
}
```

![](https://i.imgur.com/lLWD9LU.png)


## おもしろい例題
次のようにすればトーラスの2重接平面の断面で得られる2つの円が描けます.

```Povray
#declare k=(1-cos(2*pi*clock))/2;
intersection{
	torus{sqrt(2),1 pigment{rgb<0,0,1>} rotate x*90}
	torus{sqrt(2),0.99999 pigment{rgb<1,1,0>} rotate x*90 inverse}
	box{<-5,-5,-5>,<5,5,0> rotate -y*135 pigment{rgbft<1,0,0,0,1>} inverse}
}
torus{sqrt(2),1.0001 pigment{rgbft<0.3,0.3,0.3,0,k>} rotate x*90}
```

![](https://i.imgur.com/c82Tk3j.gif)



# 和集合2 merge
`merge`の構文も同様に`union`と同じです.

```Povray
merge{
	OBJECT1
	OBJECT2
	..
	OBJECTn
}
```

## 具体例
`merge`の有用性を見るには[前回](https://qiita.com/Hyrodium/items/bde8e4ee40a1ec518ff3)説明した透過オブジェクトをを使った具体例を見るのが分かりやすいです.
次の比較を見てみましょう.

```Povray
union{
	box{-1,1 pigment{rgbft<1,0,0,0.3,0.3>}}
	sphere{0,1.5 pigment{rgbft<0,0,1,0.3,0.3>}}
}
```

![](https://i.imgur.com/kuLUNGs.png)

```Povray
merge{
	box{-1,1 pigment{rgbft<1,0,0,0.3,0.3>}}
	sphere{0,1.5 pigment{rgbft<0,0,1,0.3,0.3>}}
}
```

![](https://i.imgur.com/7BB8Guy.png)

このように, `merge`を使えば物体の内側の面が描画されずに外側の表面だけが描画されます.

## unionとmerge
最後に, `union`と`merge`の違いについて述べます.

* 透過オブジェクトでなければ, 出力画像は全く同じものになる.
* 透過オブジェクトであれば, レンダリング速度は`union`の方が一般には速い.
アグリゲートに於ける要素数不定の配列の初期化と同様にstd::arrayを定数として初期化する

# 目的

配列を初期化する時、扱うデータによっては要素数が頻繁に変化したり、コード表面上からは分かりにくい事がしばしばある。その様な場合は、配列の宣言の際、[]で要素数を指定せず、アグリケートの初期化リストによって要素数を決定する事ができる。例えば、以下の様なコードである。

```cpp
// 要素数は5
int array[] = {
  1,2,3,4,5
};
```

この様な配列は、初期化によって要素数が決定する為、型に要素数を指定するstd::arrayでは対応できない。

```cpp
#include <array>
// テンプレート引数に要素数5を渡さなければならない
std::array<int, 5> array = {{
  1,2,3,4,5
}};
```

ここでは、前述の配列と同じ様に、初期化リストの要素数と同じ要素数をもつstd::arrayを定数として作りたいとする。

# 方法

初期化リストをstd::initializer_listとして扱うとbegin,endによる操作や要素のコピー等によってconstexprで定数式にする事が難しい。しかし、関数テンプレートにパラメータパックによる可変個数の仮引数をとる事で、可変個数の初期値を受け取り、sizeof...演算子によって、その個数を得る事が可能である。また、関数のconstexpr指定子によって定数式としてstd::arrayを初期化する事が可能である。関数の戻り値をautoで受ける事で型の変更に対応すればよい。

具体的には以下の様なコードである。

```cpp
#include <array>
#include <iostream>

template <class T, class... ARGS>
constexpr auto make_array(ARGS... args) -> std::array<T, sizeof...(ARGS)>
{
  return std::array<T, sizeof...(ARGS)>{{ args... }}; // rvalue-refとstd::forwardを使用しない事に注意
}

int main()
{
  constexpr auto a = make_array<int>(1,2,3,4,5);
  static_assert(a.size() == 5, "");
  for (auto&& it : a) { std::cout << it << std::endl; }
}
```

定数aは、make_arrayによって5つの要素で初期化された定数のstd::arrayである。
また、static_assertにより、その要素数が定数的に5である事を確認できる。

以上
1エンジニアが人事になってみて

株式会社オズビジョンの@smiraxです。

2回目のカレンダー投稿です。

もともとカリカリコードを書いていたエンジニアが人事に異動してて一ヶ月と少し経ちました。キャリアチェンジしたことで色々と考えることが多くなり、ここで少し考えを整理したいなーと思っています。
もし、会社で「エンジニア採用を強化だ！」みたいな話を聞いている人がいれば、少しでも参考になれば幸いです。

## 異動のきっかけ
上記にも記載しましたが、弊社でもエンジニアの採用を強化していきたいという話がありました。
もともと少しは採用に関わっていましたが、どちらかというと言われたから手伝っていた。という側面が強かったような気もしています。

当時自分が関わっていた新規事業のクローズが決まり、これからどうするかすごく迷っていました。
その時、人事の方からもエンジニアの採用がうまくいっていないという話を聞いていて、何か自分にできることがあるのかなーと思って人事に飛び込んで見ることにしました。

## 違い
オズビジョンのエンジニアが関わっているチームでは基本的に毎週計画MTGをして、1週間のタスクを洗い出します。そのため、計画外の仕事はなるべく減らすようにずっと取り組んできましたし、計画に割り込むほどのものは優先度が高い背景があるものがほとんどだったので、再計画を立ててというのもやりやすかったです。

人事に異動してからは1週間の計画を立てることが難しいことに気づくまでに時間がかかりました。
人材紹介会社を利用していると、決まっと時に紹介があるわけではありません。多くご紹介いただける週もあれば、全然ない週もあります。そのため決まった計画が立てづらいことが一番困りました。
今は、ご紹介いただいた方とお会いする曜日をだいたい決めておいて、計画が大幅に狂わないように日々調整をしています。

## リファラルという安心とリスク
人材紹介会社を利用して採用すると当たり前ですが、紹介料が発生します。優秀なエンジニアの方はお給料も良いですから、その分人材紹介会社へ支払う紹介料も増えていきます。その時に、既存社員の紹介であれば、紹介料が発生しないため、会社として増やしていきたい部分でもあります。

ですが、既存社員の紹介での採用は、「この人の紹介ならある程度安心だろう」という気持ちもありますが、もし会社と合わないときのリスクを考えるとなかなか紹介しづらいなぁ。。。と自分は思います。
なので今は「いい人がいたらご飯食べながら会社の話でもしてよ」という形で社員の方に動いてもらうようにしています。
まずは会社のことを知ってもらい、少し時間をかけてでも会社と合うか見ていくように取り組みを整えていくことが大事だと考えています。

## 面接
人を見る。というのはスキルが必要です。もともとエンジニアをしていた自分もそんなスキルはありませんでした。
しかし、エンジニアが面接に早い段階から関わることはメリットが多いなぁと思っています。

履歴書だけ見て、判断するというのはなかなか難しいですが、一緒に働きたいと思える仲間かどうか。という視点で見れば職種関係なく行えると思っています。
人柄はいいけどスキルが足りない。といったことにも早い段階から関わっていくことでミスマッチを減らせますし、当たり前ですが、一緒に働きたいエンジニア像は現場のエンジニアが一番知っているますよね。
あと自分が候補者だったとして、最初からエンジニアの人とお話できる方がなんとなく安心できる気がしています。。。

## つながりからの学び
今、会社として外部の方と協力しながら勉強会を開催しようと動いています。
その時に色々なエンジニアの方とお会いしてお話を聞く機会があるのですが、そればかなり自分にとっての学びになっています。
考え方、勉強の仕方、業務内容...etc
ずっとコードだけ書いていた時はなかなか人と話すことが難しかったのですが、人事に配属になってからは人と話すことが仕事ですのでだんだんとなれてきました。
つながりが増えてくると勉強会に参加しないか？とお声がけいただくこともあり、また学びが増えていく。
エンジニアとして自分の可能性が少しでも広がる感覚があるのは嬉しい限りです。

## 最後に
やっぱり自分の中はエンジニアが基礎になっていて、ちょっとした面倒も自分で開発して楽にできると思うとまた開発が楽しくなり、やる気が湧いてくる感覚があります。
また、普段エンジニアと関わりが少ない人達とお仕事をしているので、ちょっとしたツール関連でもドヤれるタイミングは多いです！

------------
またもや次は 弊社に第二新卒で入社した@seungyeon-kim が書いてくれます！
gasを使った話のようですので、ご興味あればぜひー！
Ubuntu 16.04上でMySQLサーバーを設定含めて完全消去する話

### MySQLの初期化
MySQLを完全初期化する方法というものが、世の中には伝わっているようだ。
まずサーバーの停止。

```console
$ killall mysqld
```

その上で、mysqld/の全消去。

```console
$sudo rm -rf /var/lib/mysqld/
```

そして初期化。

```console
$sudo su - mysql
$mysql --initialize --datadir=/var/lib/mysql --user=mysql
```

とすると良いそうだ。しかしこの方法では、my.cnfに書いてある設定情報がそのまま初期化時に使われてしまう。

### 設定情報まで消す
この時点でかなりやばめな雰囲気が漂っているがこの話は、そのとおり真似しないでいただきたい失敗例だ。言われなくても大体の人は真似しないと思う。

mysqlの設定情報は/etc/mysql/my.cnfなどに書いてある。これを消してしまった。つまり

```console
$sudo rm -rf /etc/mysql/*
```

してしまった。その上でmysql-serverをパージして再インストールすればええやろ！とか考えてノリで実行してしまった結果1時間近く溶かしてしまった。とにかく頭の悪い話だ・・・。

このまま

```console
$sudo apt-get purge mysql-server
$sudo apt autoremove
```

の後に、

```console
$sudo apt-get install mysql-server
```

とすると消してしまった設定ファイルの依存関係の問題から設定できないよー、と言われてしまう。当たり前っちゃあ当たり前。

### 諸事情でmy.cnfを消しちゃった場合
ほんとにすべての依存関係からMySQLを消し去ってしまえばよい(頭が悪い)

```console
$sudo apt-get remove --purge mysql-*
$sudo apt-get install mysql-server mysql-client
```

とすれば、mysql-serverを最初にUbuntuマシンに入れたときの気持ちになれる。

### 参考
[mysqlの初期化方法](https://qiita.com/kaihei777/items/9a155a7569962c1c05f9)
[Having trouble installing and removing MySQL in Ubuntu](https://askubuntu.com/questions/643251/having-trouble-installing-and-removing-mysql-in-ubuntu)