OmniAICreator/Qiita-1.07M huggingface dataset:
systemd理解のヒント - systemdの概念と歴史

最近のLinuxは、システム設定の方法が以前と大きく変わっていると感じることが多くなりました。たとえば、Linux起動時に自動開始するプログラムを設定するinit.d スクリプトや`rc.local`は原則として使われなくなりましたし、システムログの参照には従来の`less /var/log/syslog`などに替わって`jounalctl`コマンドを使うようになりましたし、ブートローダーのGRUBや予定されたコマンドを実行するcronといった基本的なツールも別のツールで代替されることが増えています。

こうした変化の結果、古くからのUNIX/Linuxユーザー（管理者）は新たな技術を身につけることを求められていると言えます。また、新しいUNIX/Linuxユーザーにとっては、新旧の情報を分けて考えることが求められるのではないかと思います。たとえばApacheやMySQLのインストールや設定方法を調べているときに、情報が古いことに気づかずに参照してハマってしまう、といった危険性が考えられます。

システム設定方法の変化の根底にあるもの、それはsystemdです。ここではsystemdを理解するためのヒントとして、systemdの概念と歴史をまとめたいと思います。

## systemdの概念

systemdは、新しいinitシステムと覚えるとわかりやすいと思います。initは、すべてのプロセスの元になるプロセスです。

systemdは従来のinitシステムに対し、起動を高速にし、設定をシンプルにすることを狙っています。Linuxでの同様の新しいinitシステムに、Ubuntuなどで用いられたUpstartがあります。また、MacOSでは新しいinitシステムとしてlaunchdが使われています。

### pstree

systemdがすべてのプロセスの元になっていることは、Linuxにログインして`pstree`コマンドを実行すると実感できるでしょう。`pstree`はプロセスをツリー（木）状に表示するコマンドです。


systemdを用いていない、CentOS 6.8での`pstree`実行例は、次のとおりです。initプロセスの下にほかのプロセスがあります。

```
$ pstree
init─┬─VBoxService───7*[{VBoxService}]
     ├─crond
     ├─dhclient
     ├─6*[mingetty]
     ├─ntpd
     ├─rpc.idmapd
     ├─rpc.mountd
     ├─rpc.statd
     ├─rpcbind
     ├─rsyslogd───3*[{rsyslogd}]
     ├─sshd───sshd───sshd───bash───pstree
     └─udevd───2*[udevd]
```

systemdを用いている、ArchLinuxでの`pstree`実行例は、次のとおりです。systemdプロセスの下にほかのプロセスがあります。

```
$ pstree
systemd-+-2*[agetty]
        |-dbus-daemon
        |-lvmetad
        |-sshd---sshd---sshd---bash---pstree
        |-systemd---(sd-pam)
        |-systemd-journal
        |-systemd-logind
        |-systemd-network
        |-systemd-resolve
        `-systemd-udevd
```

## systemdの歴史

systemdは、Red Hat社のLennart PoetteringやKay Sieversらによって2010年に最初のバージョンがリリースされました。systemdはLinuxのCgroupsという機能を使っており、当初からLinux用のinitシステムとして開発されています。

systemdと同様の新しいinitシステムとしては、MacOS用のlaunchdが2005年に、Linux用のUpstartが2006年に、それぞれ最初のバージョンがリリースされていました。

systemdは2011年5月にRed Hat社のFedoraに標準のinitシステムとなって徐々に広く使われるようになりました。一方で、その頃からsystemdへの批判も起こるようになりました。それでもその後、Red Hat系のCentOS、Red Hatのほか、ArchLinuxやDebianなどでもsystemdが標準になりました。さらに、いったんはUpstartを用いていたUbuntuも、systemdへ移行しました。

結果として、2018年時点では多くのLinuxディストリビュションでsystemdが用いられています。例外として、OpenRCという独自のinitシステムを用いているGentooがあります。

### systemdへの批判
systemdの批判の例としては、[私がsystemdを嫌う理由](https://postd.cc/why-i-dislike-systemd/ "私がsystemdを嫌う理由 - POSTD プログラミングするエンジニアに向けたトレンドメディア")があります。systemd
は設定をシンプルにしているのではなく「複雑さのたらい回し」をしているのだと主張し、記事の著者はsystemdから逃れるためにLinuxの代わりにOpenBSDを使うようになったとしています。

私としては、傾聴すべき点もあるとは思いますが、Linuxの設定をシンプルにできるようになったのはsystemdの大きな利点だと考えます。たとえばLinuxのネットワーク設定は、systemdによってだいぶやりやすくなったと考えています。なお、[第39回　init(8)とrc(8)に替わる起動および制御機能の模索 - BSD界隈四方山話](https://gihyo.jp/admin/serial/01/bsd-yomoyama/0039 "第39回　init(8)とrc(8)に替わる起動および制御機能の模索 - BSD界隈四方山話")によれば、OpendBSDなどのBSD系OSでも、systemdのようなinitシステムの開発が試みられているとのことです。

## まとめ
systemdは、2010年に登場した新しいinitシステムです。現在では、多くのLinuxでsystemdが標準のinitシステムとなっています。

## 参考
* [Linux女子部　systemd徹底入門](https://www.slideshare.net/enakai/linux-27872553 "Linux女子部　systemd徹底入門")
* [systemd - ArchWiki](https://wiki.archlinux.jp/index.php/Systemd "systemd - ArchWiki")
* [なぜsystemdなのか？ - POSTD プログラミングするエンジニアに向けたトレンドメディア](https://postd.cc/why-systemd/ "なぜsystemdなのか？ - POSTD プログラミングするエンジニアに向けたトレンドメディア")
Webデザイン技能検定2級 合格体験記

あまりメジャーな資格ではありませんが、2018年夏にWebデザイン技能検定の2級に合格したので、その時の勉強法などをまとめてみました。

# ウェブデザイン技能検定とは

* 国家資格である技能検定制度の一種。
* 検定に合格すると、ウェブデザイン技能士となる。（※名称独占資格）
 * ウェブデザイン技能士は、ウェブ業界で唯一の国家資格。
* 学科試験と実技試験で構成されている。

# 受験までの大まかな流れ

|実施したこと|実施日|
|---|---|
|受験を思い立った時期|2018/06/10前後|
|試験に関する情報収集の開始|2018/06/20前後|
|問題集と参考書の購入|2018/06/24|
|受験申込日|2018/07/04～2018/07/08|
|Adobe Creative Cloudの購入|2018/07/05|
|本格的な学習の開始|2018/07/10前後|
|試験日|2018/08/26|

* 普段はサーバーサイドの仕事ばかりなので、PhotoshopとDreamweaverに慣れるためにCreative Cloudを購入しました。
 * 試験に合格したら解約できるように月額課金（※月々プラン）で購入しました。
 * 複数のソフト（PhotoshopとDreamweaver）を使うため、月々8000円もする「コンプリートプラン」を購入しました。
 * 結果的に、高価なソフトを購入したことが学習のモチベーション維持に一役買ってくれました(笑)
* 受験申込は「受験者登録」と「受験料支払い」など複数のフェーズに分かれていたため、申込開始から完了まで数日間を要しました。
 * 締め切りギリギリに申し込もうとしても、間に合わない可能性があるので要注意です。

# 勉強に使ったもの

|種類|役立ち度|参考URL|
|---|---|---|
|教科書|★★|[ウェブデザイン技能検定 2級ガイドブック](https://www.wenet.co.jp/webapp/products/detail.php?product_id=2308)|
|過去問＆解説本|★★★|[ウェブデザイン技能検定 過去問題集 2級](https://www.fom.fujitsu.com/goods/webdesign/fpt1320.html)|
|過去問＆解答|★★|[公式ページの過去問題](http://www.webdesign.gr.jp/kentei/publication.html)|
|Adobe Creative Cloud|★★★||

* 「ウェブデザイン技能検定 2級ガイドブック」は、学科試験の範囲を幅広く学習できる本だと思いますが、まずは過去問を解いてみて、苦手な分野を「ウェブデザイン技能検定 2級ガイドブック」で学習した方が効率的かもしれません。
* 「ウェブデザイン技能検定 過去問題集 2級」には、実技試験でFlashを用いてアニメーションを作ると書かれていますが、最近はGIFアニメーションの作成に切り替わっています。
* 試験直前の1～2週間は、公式ページからダウンロードできる過去問題を使って、時間を測りながら問題を解いて最終調整しました。
* 上記以外に、通勤中にAndroidアプリで学科試験の勉強をしていたのですが、現在はGooglePlayからアプリが消えてしまったようです。
* Creative Cloudを購入した後は、短時間であっても毎晩Photoshopを触って、少しでも操作に習熟できるようにしました。
 * 一方でDreamweaverは、いわゆる普通のIDEっぽい感じなので、基本的な操作は比較的短時間で理解できました。

# その他

* 試験日の翌朝には公式ページで解答が公表されるので、学科試験についてはすぐに自己採点ができます。
* 実技試験は毎回ほとんど同じ問題なので、以下の3つを押さえていれば難しくはないと思います。
 1. HTML/CSS/Javascriptの基本を理解している。
 1. Dreamweaverで簡単なWebページ（＝HTML）を作成できる。
 1. PhotoshopでボタンやGIFアニメーションを作成できる。
* 実技試験ではAdobeのソフトを使うため、受験会場はコンピューター系の専攻がある専門学校でした。
 * 私の後に受験した勤務先の後輩も、やはりコンピューター系の専攻がある専門学校が受験会場でした。
フォノンを使った量子メモリの話

# 結論
室温で量子状態の制御までは出来たけど、まだまだ超えないと行けない壁がたくさんあります。

# 前置き
量子コンピュータといえば$\left.|\ 0\right>$ と　$\left.|\ 1\right>$の重ね合わせ状態を使って演算を早くする、ということは皆さんご存知だと思います。
D-waveでは超伝導磁束量子ビット(Superconducting　QUantum Interference Device : SQUID)により実現しています[^1]。
~~ここらへんのことは正直良く知らないんですが~~、実現するためには(?、まあとにかくD-waveでは、)磁気シールドや高真空、極低温度が必要です。

# フォノンを使った量子メモリのここがスゴイ
この問題を解決するための一つの手段としてダイアモンド光学フォノンを使った量子メモリの研究が行われいます[^2]。
ダイアモンドといえばNVセンターを思い浮かべる方も多いと思いますが、NVセンターの方はスピンで量子状態を実現しており、今回紹介するのは普通のダイアモンドです。

ダイアモンド光学フォノンは振動数 40THzなので、エネルギー換算すると　

```math
E=h\nu \sim 135 \textrm{meV} 
```
となり、室温の影響($k_BT\sim\ 25\ \textrm{meV}$)の影響を受けづらくなります。
（ちなみに超有名半導体GaAsの縦型光学フォノンは約30 meV)
ですので、もしダイアモンド光学フォノンの量子状態$\left.|0\right>, \left.|1\right>$をメモリとして使えれば、室温で動作出来る量子メモリだ！！となります。
[^2]の論文では、あくまで量子状態の制御まで出来た、とのことです。



# 量子状態を制御するための技術
1. まずフォノンの振動周期よりも短い時間幅のレーザーを入射します。
2. すると、ダイアモンドのフォノンが集団で、同じように（=同位相でと言いたい）振動し始めます（→$\left.|1\right>$状態の生成)。
3. 二発目のレーザーを入射するタイミングを操作することで、フォノンの振動を強めたり（→さらに$\left.|1\right>$生成)、弱めたり(→$\left.|1\right>$を$\left.|0\right>$に)することができます。

### 補足
* 2. の現象は、電車が急ブレーキをかけると、つり革が全て進行方向に振れることと似ています。
* 3. の現象は、既に振動している振り子をもう一度叩くことと似ています。もう一度叩くタイミングを変化させることで振り子を止めたり、振り子の振幅を大きくすることが出来ますよね。これと同じです。 


# これまでの研究で出来ているとされているところ
* $\left.|0\right>, \left.|1\right>$を保持（6 psほど[^3]）
* $\left.|0\right>, \left.|1\right>$の書き換え


# 問題点
しかし、このフォノンを制御する技術が相当難しく、というのも制御するために使っているレーザーが約10 fs（100兆分の1秒）という非常に時間的に狭いレーザーです（多分1000万ぐらいします、しかもデカイです）。
この時間幅が短い（＝波長幅が広い）レーザーは、いろんな波長が混在するので、光が進むたびに（各色ごとの）位相がずれてしまい、非常に扱いが難しいです。
また実験では状態を変えるパルスを2発、状態を測定するパルスを１発の計3発必要としますが、状態を変えるパルス2発の相対位相をロックしたまま、相対時間を変える（＝光路長を変化させる）ことも難しいです。
また共振器内の結晶を冷やすための冷却水が必要など様々な問題点があります。
さらに、今回の論文では1bitで話を進めていますが、複数bitにすることは光路設計の観点からかなり難しいと思います。
**何が言いたいかというと、室温で動作できるけど、別のところでの難しさがあるよ、ということです**

# 最後に
* 紹介した論文[^2]の凄い所は理論構築→実験で再現、というところだと思うので、興味がある方は見てみて下さい。
* 本記事の内容についてはほとんどあってると思いますが、間違ってるか箇所があるかもしれません。
* ここはどういうこと？などあればコメントしてください。


[^1]: https://jsai.ixsq.nii.ac.jp/ej/?action=pages_view_main&active_action=repository_view_main_item_detail&item_id=1607&item_no=1&page_id=13&block_id=23
[^2]: https://www.titech.ac.jp/news/2018/041803.html
[^3]: https://arxiv.org/abs/1603.06023
QEMU上でBitVisorは動作するか? SMP編

以下の記事ではQEMU上でのBitVisorの実行に成功していましたが、SMPは使用していませんでした。果たしてどうなるでしょうか。

QEMU上でBitVisorは動作するか? リベンジ編
https://qiita.com/hdk_2/items/dab49edf80975f4cc7d0

面倒なのでKVMありの場合だけ紹介します。

* Debian GNU/Linux 9
* Linux 4.9.0-8-amd64
* QEMU 2.8.1(Debian 1:2.8+dfsg-6+deb9u5)
* AMD Ryzen 7 2700

# 起動パラメーター

qemu-system-x86_64 -bios OVMF.fd -cpu host -enable-kvm -m 2048 -snapshot -cdrom ../data/iso/ubuntu-18.04-desktop-amd64.iso -hda fat:bitvisor/_ -M q35 -vga qxl -smp 2

# 結果

![z1.png](https://qiita-image-store.s3.amazonaws.com/0/103733/900deb70-521c-bbb6-6989-c8bf0f9a9c77.png)

2個目のプロセッサを開始したログも出ていますし、一見大丈夫そうに見えますね? 実はこれ、ダメなんです...

![z2.png](https://qiita-image-store.s3.amazonaws.com/0/103733/d6d429a5-79fc-7f0a-7e9c-55d6f814268a.png)

このように、taskset 1ならdbgshが動くのに、taskset 2だと動きません。

# Intel環境の場合は?

Intel環境では、2個目のプロセッサを開始したところで、VM entry failed. panicが発生するそうです。その理由は、BitVisorがVMCSのguest activity stateにwait-for-SIPIをセットしたためみたいです。実は、IA32_VMX_MISC MSRに、guest activity stateにactive以外のステートをセットできるかどうかを示す情報があるのですが、BitVisorはこれをチェックしないで使用してしまっています。QEMU KVMはwait-for-SIPI未対応と返しているみたいです。

なお、問題はそれだけではないようです。

# 何が起きているのか?

推測ですが、どうやら、QEMUかKVMのいずれかあるいは両方のINIT信号の処理には問題があるようです。BitVisorでは以下の機能を使用していますが、いずれもQEMU KVM上では正しく動作しません。

* AMDの場合: VM_CR MSRのR_INITビットをセットすることにより、INIT信号は#SX例外に変換される
* Intelの場合: INIT信号は、VMX root operationであればブロックされ、VMX non-root operationであればVM exitになる

BitVisorのSMP対応はこの機能をあてにしていて、AMD環境では常にlocal APICのIPI送信をフックしていますが、それで見ているのはUEFI環境での最初のINIT信号送信と、startup IPI送信だけです。しかも、裏から見ているだけで、実際にINIT信号もstartup IPIも送信されます。AMD環境ではwait-for-SIPIを受け取る特別な機能はないので、INIT信号を受けたらwait-for-SIPI待ちのポーリング処理に移る仕掛けになっています。

それで、QEMU KVM上ではどうやら、INIT信号を受けたプロセッサは、**本当にリセット**してwait-for-SIPIステートに移ってしまうようです。それで2個目のプロセッサではBitVisorがいなくなってしまい、QEMU KVM上で直接動作していたのでdbgshが動作しないのです。Intelの場合も同じような問題を抱えているっぽいです。

Intelでwait-for-SIPIステートが使えないプロセッサに対応できていないのはBitVisorの問題ですが、INIT信号を正しく扱えないのはQEMUあるいはKVMのバグということになりそうです。
Clovaスキルをノンコーディングで1時間で作る


[enebular](https://enebular.com/discover)(NodeRED)を使ってノンコーディングでClovaスキルを1時間で作ります。

![](https://i.gyazo.com/3d9253a1f47897edf98f8f32e007c625.jpg)

ちなみに、[Nuxt.jsとSkyWayで1時間でビデオチャットを作ってみる](https://qiita.com/n0bisuke/items/efbe6e09e30ebd941105)という記事を書いたし、今回も1時間っていうタイトルをつけてますけど、僕が時間なくて1時間で書いたってだけです。タイトル詐欺ですね()

## enebular

NodeREDをどっかにホスティングしたようなサービスです。

本来はIoTデバイスの統合管理などに使えたりもするのですが、NodeREDのホスティング版みたいにも使えます。

`ssl(https)`なエンドポイントを持てるし、ノンコーディングでやれるのでいいですね（なぞ）

## 誰かが作っプロダクトをフォークできる

のでフォークして進めると早いです。

`tseigo`さんが作っている`flow-simple-clova-cek-enebular`を使いましょう。

> https://enebular.com/discover

> ![](https://i.gyazo.com/fe96994bbd0ee92f1e1fc700db2dd37d.png)

[開く](https://enebular.com/discover/flow/626f9173-346a-4183-a8a9-bff8cb2a19db)と`import`のボタンがあるので追加します。

> ![](https://i.gyazo.com/0227c8eab8c7e90bc0a1621b00ae308c.png)

プロジェクトを選んで、`superdev`を選びます。

![](https://i.gyazo.com/e87fecc18a35171b5a6825c22b2d22e8.gif)


## フォークしたフローを使ってスキルを作る

フォークするとすでに元気だよと返してくれるスキルのフローが出来上がっています。

![](https://i.gyazo.com/c95a86b8cd488b2cc545d604ca2cb5cd.png)


いわゆるプログラム部分はこれでOKです。

Clova側の設定をします。

[clova developer center](https://clova-developers.line.biz/#/)にアクセスします。

ログインしましょう。

![](https://i.gyazo.com/3c80611997f7738298d2b6050f56553f.png)

`スキルを開発する`リンクからスキルを作成します。

![](https://i.gyazo.com/ee6c680ab10d803cf971d510802ae63b.png)

基本設定を行い、サーバー設定を行います。

![](https://i.gyazo.com/c761b8c62ec72371c83ce50e418af1aa.png)

ここでenebularの画面の`!マーク`をホバーすると表示されるURLをエンドポイントとしてClovaスキルに設定します。

![](https://i.gyazo.com/3bd162939e1cd4d304fc3b53cfcf88dd.gif)



## 出来たもの

※最初の画像と同様です。

## まとめ

通常の流れでClovaスキル作成するよりも

* コードを書く手間が削減
* サーバーを自前で用意する手間が削減
* 既存のものをコピーできるので早い

といったメリットがありそうです。

もっと広めていきたいですね。
windowのスクロールを動かせなくする

モーダルとかドロワーメニューとか表示するとき、windowのスクロールを動かせなくしたくなりますよね。動いてもクリティカルに困るわけでもないですが。

ほとんどのブラウザはhtml要素に`overflow: hidden`すれば実現できます。

```html
<html style="overflow: hidden;">
    <body>
        コンテンツ
    </body>
</html>
```

超絶シンプルでいいですね。
でも、iOS Safari以外はです。iOS Safari以外は。

[iOS Safariはダメなデモ](http://ksk1015.github.io/scroll-lock/1.html)

iOS Safariで実現する方法はいろいろあるようですが、以下のようにすると実現できます。

```html
<html style="overflow: hidden; height: 100%">
    <body style="overflow: hidden; height: 100%">
        コンテンツ
    </body>
</html>
```

しかし、上記だけだと、スクロールは動かせなくできますが、動かせなくしたときのスクロールの位置は保持できないので、以下のように、コンテンツ全体を囲む要素をかましてあげて、動かせなくしたときのスクロールの位置の分を`margin-top`とかで調整してあげます。複雑で嫌ですね。副作用もありそうだし。

```html
<html style="overflow: hidden; height: 100%">
    <body style="overflow: hidden; height: 100%">
        <div style="margin-top: -{動かさなくしたときのスクロール量}px">
            コンテンツ
        </div>
    </body>
</html>
```

[iOS Safariもいけるデモ](http://ksk1015.github.io/scroll-lock/2.html)
X-Playによるアラート/イベント処理の自動化

# はじめに
この記事は、[[2枚目]Nutanix Advent Calendar 2018](https://adventar.org/calendars/3174) 12月6日の分として作成しました。本記事の内容はこの日付の情報に基づいています。
(ここ数年12月しかQiitaを更新していないですね。反省)

Nutanixでは、ITオペレーションの効率化を実現するために、様々な機能を提供しています。
ワンクリックでインフラストラクチャーを管理できるシンプルさだけではなく、プロアクティブな対応を実現するための将来予測や、X-Fitという機械学習を取り入れた異常値検知などです。

これらの機能の多くはPrism Proと呼ばれるライセンスで提供されています。その新機能として、X-Playというアラート/イベント処理の自動化が発表されましたのでご紹介します。

#X-Playとは
X-Playは.Next 2018 New Orleansで発表されたPrism Proの機能です。(その時の発表資料は[こちら](https://next.nutanix.com/next-conference-2018-54/smarter-it-operations-act-before-business-is-impacted-27952)から参照できます。)アラートやイベントをトリガーにして、メールの送信、仮想マシンのスナップショット取得などのアクションを自動的に実行します。アクションは複数のアクションをチェーンのように組合せることができます。

2018年11月にリリースされたNutanixのバージョン5.10ではテックプレビューで、5.11でGA(General Availability)になる予定です。
(ですので、本記事の内容はリリース前のバージョンを対象にしており、予告なく変更されることがあります)


下図のような動作イメージになります。
<img width="912" alt="X-Playの動作イメージ" src="https://qiita-image-store.s3.amazonaws.com/0/83432/2c4ee2d2-bb0f-7d2a-22fd-c47e378bb9f7.png">

これらの一連のトリガーとアクションを組合せたものをPlaybookを呼びます。Playbookの管理や設定は全てPrism Centralから実施します。

# Playbookの構造
PlaybookはX-Playで自動化されるトリガーとアクションの組合せです。一つのトリガーに対して、複数のアクションをシーケンシャルに実施する事ができます。

<img width="613" alt="スクリーンショット 2018-12-06 22.10.15.png" src="https://qiita-image-store.s3.amazonaws.com/0/83432/2d876c70-3df8-ff81-bee7-a2427ac550c5.png">

上記の例では、「メモリの使用率が高い」というアラートがトリガーになっています。
そのトリガーに対して、以下の4つのアクションが定義されています。

- VMのスナップショットを取得する
- VMに対してメモリを1GiBホットアドで増設する (最大20GiB)
- アラートを解決状態にする
- 管理者にメールで通知を送信する


## Trigger
トリガーはPlaybookで定義されたアクションを起動するきっかけです。アラートは下図のようにユーザが定義することができるため、かなり自由度の高いトリガーを設定することができます。
<img width="634" alt="アラート定義画面" src="https://qiita-image-store.s3.amazonaws.com/0/83432/198fb6b5-3a13-3290-9568-905534453b21.png">

トリガーとするアラートを選択したら対象となるエンティティを選択します。例えばVMであれば、全てのVMがトリガーの対象となるのか、特定のVMのみが対象となるのかを指定します。

## Actions
アクションはトリガーによって起動される様々な操作/動作です。一つのトリガーに対して複数のアクションを実行させることが可能です。アクションはプリセットされているもの以外にも、スクリプトの実行やAPIのコールなどを指定することができますので、非常に自由度が高くなっています。定義したアクションはAction Gallaleyに格納されます。
AOS5.10のテックプレビュー版のAction Galalleyには、以下のようなアクションがプリセットされていました。

<img width="786" alt="Actions Galalley" src="https://qiita-image-store.s3.amazonaws.com/0/83432/8963eeef-58c6-b860-1ed9-37189f6c3e9d.png">

# 終わりに
X-Playによるアラート/イベント処理の自動化の概要をご紹介しました。AOS/PC ５．１１から利用可能になりますので、運用の効率化にお役立てください。
「3分でできる」Site24x7でさくっとサーバー監視

# さくっと紹介
[Site24x7](https://www.site24x7.jp/server-monitoring.html)はクラウド型の監視ツールでインフラからアプリケーションまで監視できるインド発の監視ソフト
さくらのVPSで借りてるCentOS6のパフォーマンスが見たかった。
![スクリーンショット 2018-12-06 22.55.15.png](https://qiita-image-store.s3.amazonaws.com/0/162167/f3261237-6ea4-308b-32c0-490e2e21edc1.png)

#[1分] まずはサービス登録
こちらで紹介されてる。
https://qiita.com/advent-calendar/2018/site24x7

#[2分目] 監視準備
以下を叩く
https://www.site24x7.com/app/client#/admin/inventory/monitors-configure/SERVER/server
![スクリーンショット 2018-12-06 23.14.31.png](https://qiita-image-store.s3.amazonaws.com/0/162167/13a30f74-4a39-a9fa-5490-9d0f52761a56.png)
監視設定画面に遷移するので、Linuxをクリック。

コマンドが表示されているのでコピペする。
rootユーザーかどうか、プロキシの設定してるか選択するボタンがあるのでクリックするとURLが変わる。

![スクリーンショット 2018-12-06 23.16.08.png](https://qiita-image-store.s3.amazonaws.com/0/162167/b270b8b2-959e-13ec-64ee-cd9026465b13.png)


#[３分目] 監視スタート
サーバーにログインしておもむろにコピペしたコマンドを叩く。
### おつかれさまでした。


これだけで

* CPUの合計使用率とuser,system時間、割り込み時間とか
![スクリーンショット 2018-12-06 23.23.25.png](https://qiita-image-store.s3.amazonaws.com/0/162167/497bd6b0-7f97-414e-2459-9ae9ac68259d.png)

* 合計メモリとスワップメモリの使用率とか
![スクリーンショット 2018-12-06 23.23.58.png](https://qiita-image-store.s3.amazonaws.com/0/162167/ef6deaba-9004-dd1d-959d-e2bc261fd596.png)

* ネットワークのパケット数も
![スクリーンショット 2018-12-06 23.24.44.png](https://qiita-image-store.s3.amazonaws.com/0/162167/b9a37a63-3965-80d1-fb57-e7e26c43b9c4.png)

* ディスクIOも
![スクリーンショット 2018-12-06 23.24.09.png](https://qiita-image-store.s3.amazonaws.com/0/162167/2e2151d7-0592-f703-df98-f7469c7d0c06.png)

* プロセスごとのCPU使用率も取ってくれる
![スクリーンショット 2018-12-06 23.26.08.png](https://qiita-image-store.s3.amazonaws.com/0/162167/8b61d839-c567-96aa-4251-dab6cff1834d.png)

* syslogとかcronlogも集めてるみたい
![スクリーンショット 2018-12-06 23.28.25.png](https://qiita-image-store.s3.amazonaws.com/0/162167/4dd76711-2fae-83a4-3ea3-9d1860eac01d.png)


### 圧倒的さくっと感
フリーでサーバー監視できるらしいので、VPSとかの監視はこれで良さげ。
![スクリーンショット 2018-12-06 23.40.12.png](https://qiita-image-store.s3.amazonaws.com/0/162167/12896bff-267a-0407-6709-ea41ff6f3a91.png)
[React Router] Property 'history' is missing in type

# エラー
Property 'history' is missing in type ...

# 対処法
シンプルなエラーです。

```jsx
// 誤
<Route path="/" exact render={() => <TopPage hoge={hoge} />} />
// 正
<Route path="/" exact render={(props) => <TopPage {...props} hoge={hoge} />} />
```

# 解説

```jsx
<Route path="/" exact component={TopPage} />
```
この書き方の時は、ReactRouterは、React.createElement時に [**route props**](https://reacttraining.com/react-router/web/api/Route/route-props) (match, location, history) を渡してくれるが、

```jsx
<Route path="/" exact render={(routeProps) => <TopPage {...routeProps} />} />

// {...hoge} は JSX Spread Attributes　で、下と同じ意味
<Route path="/" exact render={(routeProps) => <TopPage history={routeProps.history} location={routeProps.location} history={routeProps.history}  />} />
```

この書き方の時は、route props(match, location, history) を自分で渡さないといけない。

# 参考

https://reacttraining.com/react-router/web/api/Route/render-func

Instead of having a new React element created for you using the component prop, you can pass in a function to be called when the location matches. **The render prop receives all the same [route props](https://reacttraining.com/react-router/web/api/Route/route-props) as the component render prop.**
シクシク素数列 - C++編

###ルール
数値に4か9を含む素数をシクシク素数と呼ぶことにします
19とか41とか149とか。
標準入力として正の整数 N を与えたら N 番目までのシクシク素数を半角カンマ区切りで標準出力してください
例 N = 9 の場合、 19,29,41,43,47,59,79,89,97
N は最大で 100 とします

#ソースコード

```cpp:sksk.cpp
#include <iostream>
#include <cstdio>
//数値から4と9を見つける
bool find49(std::int_fast32_t i49_) {
	while (i49_)
		switch (i49_ % 10) {
		case 4:case 9: return true;
		default: i49_ /= 10;
		}
	return false;
}
//素数を探す
void prime(const std::int_fast32_t n_) {
	for (std::int_fast32_t i{ 1 }, prime{}, counter{};; ++i, prime = 0) {
		for (std::int_fast32_t j{ 1 }; j <= i; ++j)
			if (i % j == 0) ++prime;
		if (prime == 2 && find49(i)) {
			std::cout << i;
			if (++counter != n_) std::cout << ',';
			else break;
		}
	}
	std::cout << std::endl;
}
//入力値のシクシク素数を返す
int main() {
	std::int_fast32_t n;
	std::cin >> n;
	prime(n);
}
```

とりあえず30行で実装。
高速化はしてないです。

#実行結果

```:出力結果(入力7)
19,29,41,43,47,59,79
```

```:出力結果(入力9)
19,29,41,43,47,59,79,89,97
```

```:出力結果(入力19)
19,29,41,43,47,59,79,89,97,109,139,149,179,191,193,197,199,229,239
```

```:出力結果(入力22)
19,29,41,43,47,59,79,89,97,109,139,149,179,191,193,197,199,229,239,241,269,293
```

```:出力結果(入力49)
19,29,41,43,47,59,79,89,97,109,139,149,179,191,193,197,199,229,239,241,269,293,347,349,359,379,389,397,401,409,419,421,431,433,439,443,449,457,461,463,467,479,487,491,499,509,541,547,569
```

```:出力結果(入力100)
19,29,41,43,47,59,79,89,97,109,139,149,179,191,193,197,199,229,239,241,269,293,347,349,359,379,389,397,401,409,419,421,431,433,439,443,449,457,461,463,467,479,487,491,499,509,541,547,569,593,599,619,641,643,647,659,691,709,719,739,743,769,797,809,829,839,859,907,911,919,929,937,941,947,953,967,971,977,983,991,997,1009,1019,1039,1049,1069,1091,1093,1097,1109,1129,1193,1229,1249,1259,1279,1289,1291,1297,1319
```

##ソースコードのライセンス

These codes are licensed under CC0.
[![CC0](https://mirrors.creativecommons.org/presskit/buttons/88x31/svg/cc-zero.svg "CC0")](http://creativecommons.org/publicdomain/zero/1.0/deed.ja)

この記事のソースコードはCC0ライセンスとします。
ぜひ、自由に改変して遊んでみてください。
obniz触ってみた

AdventCalenderにエントリーしたのだがネタがない。。。
以前、何かのハンズオンで買ったbme280があったので、
セットアップしてみました。

ネタはこちら
https://obniz.io/sdk/parts/BME280/README.md?iframe=false

![IMG_2073.jpg](https://qiita-image-store.s3.amazonaws.com/0/91304/67c406ab-eb52-98b4-5cfd-5a67fb22c20a.jpeg)

（推奨された繋ぎ方じゃないけど）動きました！

簡単にできるもんなんですね。
Laravel5.5で同一接続先ホストでの複数DBトランザクションを行う方法

## 背景
laravel5.5で複数DBでのトランザクションをする方法が調べてもなかなか見つからなかったので書くことにしました。

## 別コネクションを作る方法
これはlaravelで複数DBに接続させる方法で調べるといろいろ記事が出てきます。(2018/12/01)
[Laravelで別々のDB（MySQL）に接続させる方法](https://qiita.com/qiita-kurara/items/2e3efb4ccbb2489b05c3)

設定を.envでやりたい場合は追加します。

```
DB_CONNECTION2=mysql2
DB_HOST2=localhost
DB_PORT2=3306
DB_DATABASE2=sample2
DB_USERNAME2=sample2
DB_PASSWORD2=sample2
```

その上でconfig/database.phpにその設定を追加します。

```php:config/database.php
        'mysql2' => [
            'driver' => 'mysql',
            'host' => env('DB_HOST2', '127.0.0.1'),
            'port' => env('DB_PORT2', '3306'),
            'database' => env('DB_DATABASE2', 'forge'),
            'username' => env('DB_USERNAME2', 'forge'),
            'password' => env('DB_PASSWORD2', ''),
            'unix_socket' => env('DB_SOCKET', ''),
            'charset' => 'utf8',
            'collation' => 'utf8_unicode_ci',
            'prefix' => '',
            'strict' => false,
            'engine' => null,
        ],
```

Eloquentにはdatabase.phpで設定したmysql2をconnectionに記述します

```php:app/Test2.php
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Test2 extends Model
{
    protected $connection = 'mysql2';
    protected $guarded = ['id'];
}
```

クエリビルダーはコネクションから指定します。

```
DB::connection('mysql2')->select('select * from test2s');
```

### 別コネクションの問題点
実際にDBが違うホストにあるならコネクションが別れるのは当然だと思いますが、同一ホストにある場合はコネクションを分けたくなかったりします。
実際トランザクションに対して以下の記事を見つけました。
[Multiple DB Connections in Laravel](https://fideloper.com/laravel-multiple-database-connections)
>Be careful about attempting to build relationships with tables across databases! It is possible to do, but it can come with some caveats and depends on what database and/or database settings you have.
>> 複数のデータベースを跨いだリレーションを組むことには注意が必要です。いくつかの注意点があり、それぞれの環境により注意しなければいけません。

「いくつかの注意点」についてこの記事には書かれていません。
じゃあどんな注意点があるんだというと以下。

[LaravelのDBトランザクション落とし穴](https://qiita.com/sasakure-kei@github/items/bd4f64bae860e7287b8f)

つまり、それぞれ違うコネクションを設定したテーブル(クエリビルダーもEloquentも関係なし)で、トランザクションした場合、デフォルトのコネクションの方しかロールバックされないということ。試してみると確かに片方しかロールバックされませんでした。

そして、これまたじゃあどうすりゃいいんだってことは書かれていません。
なので自分が試して上手くいった方法について載せておきます。

## 1コネクションでやる方法
.envにもconfig/database.phpにも設定を追加する必要はありません。
Eloquentにはconnectionを書かない代わりにtableにDB名から書きます。

```php:app/Test2.php
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Test2 extends Model
{
    // sample2は別DBの名前です
    protected $table = 'sample2.test2s';
    protected $guarded = ['id'];
}
```

クエリビルダーもテーブル名にDB名付きで入れればOKです。

```
DB::table('sample2.test2s')->get();
```

実際にmysqlでprocesslistを見れば1つしかプロセスがないことが分かると思います。

```
mysql> show processlist;
```

これで[LaravelのDBトランザクション落とし穴](https://qiita.com/sasakure-kei@github/items/bd4f64bae860e7287b8f)の記事のようにDB::transactionをやったとき、デフォルトのテーブルしかロールバックされないということはなく、2テーブルともロールバックされます。

あくまで接続先ホストが同じだった場合のやり方になりますので、違う場合はそもそもトランザクションを分けろということなんでしょうか。ご参考までに。
MySQLでGo

#やりたいこと
ローカル環境で、GoでMySQLのデータを取ってきます。
[Goでnet/httpしてみる](https://qiita.com/uguisu/items/ef0a7bdddc37e003837a)の若干続き的なところがあります。

#やってみた
##step1 MySQLを準備

homebrewでインストール

```
$ brew update
$ brew install mysql
```
起動

```
$ mysql.server start
```
初期設定

```
$ mysql_secure_installation
```

rootでmysql実行

```
$ mysql -uroot -p
```

ユーザー作成

```
mysql> CREATE　USER　ユーザー名@localhost IDENTIFIED BY 'パスワード';
```

テーブル作成

```
mysql> CREATE DATABASE goods;
```

権限付与

```
mysql> grant all on goods.* to 'ユーザー名'@'localhost';
```

ユーザー切り替え

```
mysql> quit
$ mysql -u ユーザー名 -p
```

データベース接続

```
mysql> use goods;
```

テーブル作成

```
mysql> CREATE TABLE fruits(   NAME varchar(20),   AMOUNT int,   ID int AUTO_INCREMENT NOT NULL PRIMARY KEY);
```

データ挿入

```
mysql> INSERT INTO goods.fruits(NAME, AMOUNT) value('orange', 50);
```

テーブル確認

```
mysql> select * from fruits;
+--------+--------+----+
| NAME   | AMOUNT | ID |
+--------+--------+----+
| orange |     50 |  1 |
+--------+--------+----+
1 row in set (0.01 sec)
```

##step2 Goを準備

###SQL Driver
ドライバーのバッケージがあるのでインストールします。
[go-sql-driver mysql](https://github.com/go-sql-driver/mysql)

```
$ go get -u github.com/go-sql-driver/mysql
```
ドライバーをインポートするだけで、API使えるようになります。
ドライバーにmysqlを指定して、dataSourceNameを指定します。

```
import "database/sql"
import _ "github.com/go-sql-driver/mysql"

db, err := sql.Open("mysql", "user:password@/dbname")
```

作成後

```mysql.go
package main

import (
	"database/sql"
	"encoding/json"
	"net/http"

	_ "github.com/go-sql-driver/mysql"
)

func handler(w http.ResponseWriter, r *http.Request) {

	//db接続
	db, err := sql.Open("mysql", "yourname:yourpass@/goods")
	if err != nil {
		panic(err.Error())
	}
	defer db.Close()

	//構造体
	type Fruit struct {
		ID     int    `json:"id"`
		Name   string `json:"name"`
		Amount string `json:"amount"`
	}
	var fruit Fruit

	//selectしたものを挿入
	err = db.QueryRow("SELECT id,name,amount FROM fruits").Scan(&(fruit.ID), &(fruit.Name), &(fruit.Amount))
	if err != nil {
		panic(err.Error())
	}

	//jsonを生成
	res, err := json.Marshal(fruit)
	if err != nil {
		http.Error(w, err.Error(), http.StatusInternalServerError)
		return
	}
	//header
	w.Header().Set("Content-Type", "application/json")

	//write
	w.Write(res)
}

func main() {
	http.HandleFunc("/getfruit", handler) // ハンドラを登録してウェブページを表示させる
	http.ListenAndServe(":8080", nil)
}
```

##step3 できたか確認

```
go run mysql.go
```
http://localhost:8080/getfruit
にアクセス

ちゃんとデータ引っ張ってこれました！！
<img width="435" alt="スクリーンショット 2018-12-06 23.23.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/231906/cc151361-8f84-5597-c31e-706a637e42eb.png">

##step4 お掃除

```
mysql.server stop
```
コードは[Github](https://github.com/uguisuhohokekyo/webapp_gogo/tree/mysql)に配置してあります。

次回はコンテナ化したいと思います。
https://qiita.com/uguisu/items/39cb0faa2e50df3bacaa

#参考URL
[MacにMySQLをインストールする](https://qiita.com/griffin3104/items/c7908359a3e3e18cd269)
[Mac へ MySQL を Homebrew でインストールする手順](https://qiita.com/hkusu/items/cda3e8461e7a46ecf25d)
[ユーザーの作成](https://www.dbonline.jp/mysql/user/index1.html)
[データベースの作成](https://www.dbonline.jp/mysql/database/index1.html)
[GoでMySQLに接続する](https://qiita.com/taizo/items/54f5f49c6102f86194b8)
EC利用時のデバイスはスマホが約8割らしいのでスマホのUIについて考察する

## 背景
今年入社して初めて案件を抱えるも、デザイナーとの打ち合わせで自分がスマホでコンテンツを見る機会が少なすぎることを知る。(9:1でPCを使用しています)

## やること
弊社はファッションECに特化しています。
そこで、ファッションECをスマホのブラウザでひたすら閲覧して思ったことを書きます。

## 注視する点
今回はこの２つに限定します。

##### コンテンツを正確にタップできるか
 
https://developer.apple.com/jp/design/tips/ 
![image.png](https://qiita-image-store.s3.amazonaws.com/0/316832/2e3289e8-7450-b641-94fa-e0935a6e02f7.png)

実際に、業務でもタップの領域が明らかに足りないところがあり改善してみました。
エンジニアとデザイナーの間でデザインの共通認識を持つと、コミュニケーションも円滑になります。


##### ブランドイメージ
今回は、主に色使いに注目します。

## 今回考察したファッションECサイト
ブランドイメージを少なからず知っている方がいいので、日頃自分が好んでいるブランドから選びました。[^1]

- YOHJI YAMAMOTO   
 - https://theshopyohjiyamamoto.jp/

- Bshop
 - https://store.bshop-inc.com/ 

## よかったところ
##### ハンバーガーメニュー内のコンテンツ
 ハンバーガーメニューを開くと、YOHJI YAMAMOTOではブランド一覧が、BshopではWOMENのカテゴリーが予め展開してありました。
このブランドはどこを一番みてほしいのかが一目でわかるのが良いです。

##### フッターのコンテンツが大きく表示されていている
結構あります。PCと同じ表示のままのサイト。
今回考察した2サイトは44px以上あって押しやすい😆

##### 色使い
ここからはかなり主観が入りますが、
筆者が思うYOHJI YAMAMOTO  のイメージは `黒`, `袴` などです。
サイト自体も白黒で統一されており、バナーなどで白黒以外の色を使用したとしても彩度を落としています。

続いて、Bshopのイメージは `シンプル`,`ベーシック`,`単色`などです。
こちらもイメージ通り、全体的に白黒で統一されており、洗練されたイメージを与えます。


## 考察によって業務に与えた影響
- デザイナーとのコミュニケーション
 - 筆者ではないですが、デザインを起こす段階からペアプロのような形でやっているエンジニアとデザイナーもいます。実装時のコストダウンも期待できそう。
 - 特に色については`彩度`,`明度`,`コントラスト`などの言葉をを用いたほうが伝わりやすいです。
- 計測に興味が湧いてくる
 - やりたいことはたくさんですが時間は有限ですね..有効な対策は刺さるところに刺さねば！😏
- 正直、悪いところもたくさん見つけてしまう..
 - 改善案も含めて筆者はチームのslackで`ひとりごと`と称して投稿しています。チームの誰かが拾ってくれることもあり、教えてもらったり議論が深まることもあるのでオススメです。

[^1]: 筆者はミニマリストを自称しており、服はほとんど買っていません。


## 参考文献
https://mmdlabo.jp/investigation/detail_1689.html
PHP5.6からPHP7.2へアップデート時の互換性チェックツール、ハマった体験談へのリンク

## チェックツール

* [php7cc](https://github.com/sstalle/php7cc): PHP 7 Compatibility Checker
    * php7ccは、PHP 5.3-5.6からPHP 7への移行を容易にするためのコマンドラインツール。
    * 既存のコードで問題の可能性がある文を検索し、ファイル名、行番号、および短い問題の説明を含むレポートを生成する。
    * **このツールは、すでにサポートが終了している**
        * [phan/phan](https://github.com/phan/phan)や[phpstan/phpstan](https://github.com/phpstan/phpstan)を代用することが推奨されている。
    * 新しいPHPバージョンで動作するようにコードを自動的に修正するものではない。
    * 「メソッドが削除されたので置き換える必要がある」はチェックされるが、「メソッドの挙動が微妙に変わったため、特定のパターンで正常に動作しなくなっていた」はチェックされない。
    * [PHP7の互換性チェック - Qiita](https://qiita.com/su_mi/items/b9f06a81bdae40b84c61)
    * [php7ccを利用したPHP5.6⇒PHP7へのコンバージョンチェック - Qiita](https://qiita.com/You_name_is_YU/items/b8c9b7adb28d0739e318)
* [php7mar](https://github.com/Alexia/php7mar): PHP 7移行アシスタントレポート
    * php7marは、PHP 7との互換性に基づいてPHP 5.xのコードベースに関するレポートを生成するコマンドラインツールです。
    * レポートには、行番号、注記事項、およびドキュメントのリンクと共に推奨される修正が含まれています。
* [php-to-7-aid](https://github.com/gisostallenberg/php-to-7-aid)
    * phpto7aidは、PHP 7で動作しないPHP 5コードを識別するために使用されるツールです。
    * 正確な解決策を提供するか、問題解決のヒントを与えることによって、これらの問題を解決する際に可能な限り支援します。
* PhpStormでのInspection
    * Preference → Language & Frameworks → PHPの「PHP Language Level」を「7.2」にする。
    * その上で、「Code」→「Inspect Code」を走らせる。

---

* [PHPを5.6から7.2にする際に苦労した点やハマった点、嬉しかった点 - WebエンジニアのLoL日記](http://www.utakata.work/entry/20181206/1544049000)
* [PHP5.6からPHP7系にするときに修正した点まとめ - WebエンジニアのLoL日記](http://www.utakata.work/entry/20180101/1514811599)
* [グーペのPHPバージョンを5.2から7.1にアップグレードしました - ペパボテックブログ](https://tech.pepabo.com/2017/06/21/goope-php71-upgrade/)
* [PHP5.3 -> PHP7.1にバージョンアップした話 - Qiita](https://qiita.com/to_muu_mas/items/d3710ba3426b4a90501c)
* [PHP5から7系への移行時には json_decodeの処理にご注意 - Qiita](https://qiita.com/hanwarai/items/7cd1a5bbaf7f370cc5a4)
* [Cheat Sheet on How to Upgrade from PHP 5.x to PHP 7](https://www.cloudways.com/blog/php-7-upgrade-guide/)
* [PHP5.6からPHP7にアップグレードして実際にはまった点9個 · DQNEO起業日記](http://dqn.sakusakutto.jp/2015/07/php7_trap.html)
* [PHP: PHP 5.3.x から PHP 5.4.x への移行: 下位互換性のない変更点 - Manual](https://secure.php.net/manual/ja/migration54.incompatible.php)
* [PHP: PHP 5.5.x から PHP 5.6.x への移行: 下位互換性のない変更点 - Manual](https://secure.php.net/manual/ja/migration56.incompatible.php)
* [PHP: PHP 5.6.x から PHP 7.0.x への移行: 下位互換性のない変更点 - Manual](https://secure.php.net/manual/ja/migration70.incompatible.php)
* [PHP: PHP 7.0.x から PHP 7.1.x への移行: 下位互換性のない変更点 - Manual](https://secure.php.net/manual/ja/migration71.incompatible.php)
* [PHP: PHP 7.1.x から PHP 7.2.x への移行: 下位互換性のない変更点 - Manual](https://secure.php.net/manual/ja/migration72.incompatible.php)
* [Migrating a PHP 5 App to PHP 7 (Tools & Implementation) - Part 3](https://auth0.com/blog/migrating-a-php5-app-to-7-part-three/)
micro:bitでtiny MMLを使ってジングルベルを鳴らしてみたよ

#はじめに
micro:bitのブロックでジングルベルを入力しようと思ったのですが、「音楽」を選んで「音を鳴らす　高さ　上のド　長さ　1拍」・・・、開始1分で挫折してしまいました。そこで、tiny MMLを使ってジングルベルを鳴らすことにしてみました。
[![IMAGE ALT TEXT HERE](http://img.youtube.com/vi/BGnRjWNOfms/0.jpg)](http://www.youtube.com/watch?v=BGnRjWNOfms)

## スピーカーと繋ぐ
- ブロックのシミュレーターの画像でも結線が表示されていますが、マイクロビットのGNDと0番をスピーカーに繋げます。

## とりあえずジングルベルを鳴らしたい方
- HEXデータを[ここ](https://github.com/KeiTakagi/microbit_tinymml/blob/master/microbit_Jingle_Bells.ino.hex)に置いておきます。

## micro:bitでMMLを使うために準備するもの
### ArduinoIDE
- ArduinoIDEは1.8.5を使用しています。

### MML
- Shinichiro Nakamuraさんの音楽再生ライブラリ[”A tiny MML parser”](https://www.cubeatsystems.com/tinymml/video.html)を使用させていただきました。
以下のフォルダーに展開してください。(※Winodws10の場合です)<br>
%USERPROFILE%\Documents\Arduino\libraries\tinymml

### Tone命令
- Tone命令のdev_notone、dev_toneは、たま吉さんのホームページ[「micro:bitをArduino環境で使う （6） PPIを使った単音出力」](  http://nuneno.cocolog-nifty.com/blog/2018/01/microbitardui-1.html?fbclid=IwAR0K0BTBlwvyM2uq5PUNdsPe6l7_BYaxBzfrhtYKJ2NUtdc3fO78XGcmieU)を参考にさせていただきました。

### 曲データ
- ジングルベルの曲データは[こちら](http://byakuya.sp.land.to/MML/list?page=4!)を参考にさせていただきました。<br>※A tiny MML parserは１オクターブ上げる、１オクターブ下げるが参考にしたMMLと反対でしたので、曲データをtinyMMLにあわせて修正しています。

## プログラム
- プログラムは[こちら](https://github.com/KeiTakagi/microbit_tinymml)に置いておきます。
AWSからの大量のメンテナンス予告メールを捌く技術

2018年もそろそろ終わりになりますが、今年の出来事で印象的だったのはElastiCacheの大量メンテナンスがあったことです。
弊社ではElastiCacheノードをテスト環境や本番環境、インスタンスサイズ大小様々なものを合わせると約600ノード運用しております。
最終的には運用中のノード全体の3分の2である約400ノードがメンテナンス対象となりました。
このメンテナンス通知はメールが主体であったため、これらをどうやって捌いたかを説明したいと思います。

## AWSはAPIでメンテナンス情報を取得できるのでは？
基本的にAWSはAPI経由でほぼ全ての情報を取得できるのですが、大規模なメンテナンス時では時折メンテナンス情報がAPI経由で取得できず、
メールがメインの情報源になる場合があります。記憶の限りでは2014年のXenの脆弱性対応による大規模なEC2メンテナンスでも同様となりました。

## メールをコピペするのは辛い
弊社はメールとしてG Suite(Gmail)を利用しているのですが、メンテナンス予告メールは大量に来るため手でコピペして処理するのは無理があります。
![スクリーンショット 2018-12-06 22.49.42.png](https://qiita-image-store.s3.amazonaws.com/0/87092/d18d89ed-25bd-0524-a21f-1ea8dbfa220f.png)
なんとか必要なメールだけファイルに書き出す方法は無いものかと探したところ、良い方法が見つかりました。

1. 対象のメールにラベルを付ける。（上のスクリーンショットではECと付けています）
2. https://takeout.google.com/settings/takeoutにアクセスする
3. 「自分のデータをダウンロード」ページでメールのみにチェックを入れ、「ラベルを選択」で１で付与したラベルを選択する。
![スクリーンショット 2018-12-06 22.56.08.png](https://qiita-image-store.s3.amazonaws.com/0/87092/3cb5806a-e730-c368-d7cb-adbef8594f5a.png)

この操作で対象のメールのみ固められた、[mbox](https://ja.wikipedia.org/wiki/Mbox)形式のメールがファイルとしてダウンロードすることができます。
このmbox形式は平文テキストなのですが、少々扱いにくいです。多くのプログラミング言語でmbox形式ファイルを読み書きできるライブラリが存在するので、
それらを使用しメール１通ごとに分割し、扱いやすい形に加工しましょう。
ざっくりですが、私がpythonで書いた簡単なスクリプトを出しておきます。

```python
import mailbox
import quopri
import re
from collections import defaultdict

mbox = mailbox.mbox('/path/to/maintenance.mbox')
bodies = defaultdict(list)
for message in mbox:
    quoted = str(message.get_payload(0))
    body = quopri.decodestring(quoted).decode('utf-8')
    num = re.findall('Account: (\\d+)', message['Subject'])
    bodies[num[0]].append(body)
```

アカウント番号をキー、値をリストとしたdefaultdictを用意し、メール本文を詰めていきます。
あるアカウントのElastiCacheノードが、メンテナンス対象になったという通知のメールが1通にまとめて送られるとは限らず別々のタイミングで送られることもあるため、アカウントごとにまとめる処理を行っています。
このような前処理をしておくと、その後の活用が楽になります。この情報を元に下記のような作業を行いました。

* 予告されたElastiCacheノードが既に存在しない場合もあるため、AWS APIを利用した突き合わせ
* メンテナンス対象リストをGoogleスプレッドシートにして、作業進捗状況の確認
* 本番環境用のElastiCacheクラスタは自動フェイルオーバーが有効になっているが、それをメンテナンス中に行いたい場合の手動対応

今時通知系の情報がメールで来ることはあまり考えられませんが、たまにこういう場合がありますので
mbox形式のファイルにしてから処理というのは便利、ということをお伝えしたいです。
ニッチなケースですがお役に立てば幸いです。
RustでDLLInjectorとDLLを作ってみた。

# はじめに
DLLインジェクタとインジェクションするDLLをRustで作ってみた。

「任意のプロセスに自分が作ったDLLをインジェクションしてコードを動かそう！」
（一般的な用途では動作中のプログラムに対するデバッグやコードパッチ）

・・・ってなったときに、そのあたりに落ちてるインジェクタ使ってもいいけど
なんか作りたいじゃん？Cで作るのもいいけどRustのほうが良いじゃん？

そんなこんなで作ってみました。
[DLL Injector](https://github.com/segfo/dllinjector-rs)

[インジェクションされるDLL](https://github.com/segfo/dllsample)

メモ帳とか起動してインジェクションしてみると楽しい（楽しくない？）

おわり
Ubuntu18.04にKindle for PCをインストールした

#はじめに
この記事は[Magento Advent Calendar 2018](https://adventar.org/calendars/3176)の6日目です。
Web開発をするにあたって使うOSは様々ですが、その中でUbuntuを使う方も多いと思います。
今回は、Kindleで技術書を読みながら作業したいけど画面から目を離したくない、でもUbuntuにはKindleクライアントがない！という方向けにインストール手順を紹介します。

#手順
前述の通り、Kindle for PCにはWindowsかMacにしか対応していません。なので、Ubuntuでこれを使用するためにはWindowsエミュレータである`wine`をまずインストールする必要があります。

##wineのインストール

```
$ sudo add-apt-repository –y ppa:wine/wine-builds
```
wineのリポジトリを追加します。

```
$ sudo apt-get install wine-stable
```
wineの安定版をインストールします。`winehq-stable`ではなく`wine-stable`としなければならないようです。（私はこれで数時間ハマりました。）
執筆時(2018/12/6)現在ではwine-3.0が安定版です。

```
$ wine --version
wine-3.0 (Ubuntu 3.0-1ubuntu1)
```
しっかりとインストールできているかバージョンを確認しましょう。
無事に最新安定版がインストールできていることを確認できたら次は設定に移ります。

```
$ winecfg
```
でてきた画面からエミュレート環境をWindows8.1にします。
![winecfg.png](https://qiita-image-store.s3.amazonaws.com/0/322197/4c816a58-5176-428e-3f5a-1ea6897f3876.png)

##Kindle for PCのインストール
[こちら](https://kindle-for-pc.jp.uptodown.com/windows)からKindle for PCをダウンロードします。

```
$ wine {ダウンロードしたディレクトリ}/kindle-for-pc-1-17-44183.exe
```
これで無事Kindle for PCが起動します。後は起動中のKindleアイコンを右クリックしてお気に入りに追加すれば、UbuntuパッケージのようにKindleを起動することができるようになります。
##おまけ
私は[Magento](https://knowledge.sakura.ad.jp/7881/)というECサイト構築パッケージでの開発をしていますが、その際参考にすることが多い本を紹介します。これらの書籍は物理的に重いのでKindle版が個人的にオススメです。

1. [Magento 2 Developer's Guide](https://www.amazon.co.jp/Magento-2-Developers-Guide-English-ebook/dp/B015Q7I3LY/ref=sr_1_11_twi_kin_1?ie=UTF8&qid=1544579734&sr=8-11&keywords=magento)
Magentoに初めて触れる際におすすめの本です。セットアップからモジュールの作成まで網羅されています。Magentoの概観を理解する際大いに助けになります。

2. [Magento 2 Cookbook](https://www.amazon.co.jp/Magento-Cookbook-English-Ray-Bogman-ebook/dp/B01AUQ9IYW/ref=sr_1_1_twi_kin_1?ie=UTF8&qid=1544579772&sr=8-1&keywords=magento+cookbook)
こちらも網羅的な内容になってますが、Developer's Guideよりコード内容が詳しくわかりやすく書いています。いざ自分でモジュールを作成するときなどに重宝します。

またMagentoはOSSなので[開発者ガイド](https://devdocs.magento.com/guides/v2.2/#/individual-contributors)が非常に充実しています。これらの本と同時にこちらも参照するとよいでしょう。
Kaggler-ja-Slackに参加してわかったこと

# 質問がしやすい
主に**#begginers-help**で活発な質問・回答がされています。最近チャンネルをのぞいていてびっくりしたのが質問して5分から10分の間に回答がついていたことです。
回答がすぐ得られやすい＝質問がしやすい環境が作られているなと感じました。

また直近で開催された[Kaggle Tokyo Meetup #5](https://connpass.com/event/105298/)で[u++](https://twitter.com/upura0)さんが発表された中で印象的だったスライドを1枚引用します。

<img src="https://qiita-image-store.s3.amazonaws.com/0/40310/fab7bb1c-a013-0d1f-ff1c-49f5256e90c0.png" width=75%>

[speakerdeck - kaggler-ja-driven-learning 24ページ目](https://speakerdeck.com/upura/kaggler-ja-driven-learning-kaggle-tokyo-meetup-number-5?slide=24)

まさにそのとおりだと思います、今後は僕も率先して質問・回答をして後続の方々が質問・回答しやすい環境が作れたらいいなと思います。

# 

# 情報のキャッチアップができる
コンペ終了後のメダル受賞した方が当然のようにコミュニティにいるだけでもすごいなぁと思うのですが、その方々が質問への回答やTipsの共有をしてくれたり、コンペ解法をまとめたブログ記事が公開されたり・・・

また、初心者に有用なKaggleのよくある質問などをまとめたWikiを公開していたりしてとても助かっています。リンクはこちらになりますっ[kaggler-ja-wiki](https://kaggler-ja-wiki.herokuapp.com/)

# 最後に

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">意外と『Kaggler Slack入っていいですか？』と聞かれるので補足<br>ここにメアドをいれて頂ければ誰でも入れます<a href="https://t.co/PUuyCJFk8F">https://t.co/PUuyCJFk8F</a><br>slackの仕様上メアドが必要なだけで誰も誰が来たか見てないので完全オープンチャネルです<br>いまなら時系列解析の議論とPortoコンペの上位解法が共有されてて必見です</p>&mdash; Takami Sato (@tkm2261) <a href="https://twitter.com/tkm2261/status/936633112326422529?ref_src=twsrc%5Etfw">2017年12月1日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

誰でもWelcomeなのでKaggler-ja-Slackにぜひとも参加しましょう！

# 参考
- [tkm2261's blog - Kaggler Slack作りました](http://yutori-datascience.hatenablog.com/entry/2017/08/23/143146)
- [slideshare - Kaggle＆競プロ紹介 in 中田研究室](https://www.slideshare.net/tkm2261/kaggle-in)
- [Kaggler-ja Wiki](https://kaggler-ja-wiki.herokuapp.com/)
地震の情報をmap上で可視化する


## はじめに

Life is Tech !でメンターをしているコバトンです。今回はweb系でgooglemapを用いて可視化をするというテーマについてやっていきたいと思います！
みなさんが何気なくアプリなどで使っているgooglemap実はめちゃくちゃ便利で、とてもカスタマイズもしやすいものとなっているので、みなさんのオリジナルアプリにも使ってみると良いのかなと思っています！

そこで、今回はgooglemap apiを使います！

今回はopen weather map apiを用いて気温を可視化していきたいなと思っていたのですが、json周りのアクセス環境周りで難しくなってしまいそうだったので、googlemapのドキュメントから取ってきたデータを可視化していきましょう！


[実際に扱うデータ](https://developers.google.com/maps/documentation/javascript/examples/json/earthquake_GeoJSONP.js)



それでは初めていきましょう！

今回使うgooglemaps apiはjavascriptで書くことができます！javascriptを用いてmapライフを楽しんでいきましょう！ 


## googlemapで描画する

まず, フォルダをつくり,index.htmlに描画する

```index.html
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
</head>
<body>
  
</body>
</html>
```

このいつもの 雛形ができたら、googlemapを描画するための準備をしていきます！

今回はgooglemapを描画するためのスペースを今回は```id = "map"```
としていきたいと思っています。

```index.html
<div id = "map"></div>

```

次にgooglemaps apiに登録してapikeyを取得して一番したで読み込んでいきましょう！

```
<script async defer src="https://maps.googleapis.com/maps/api/js?key=自分で作成したAPIKEY=initMap">
```

次に、googlemaps.jsというファイルを作り、googlemaps.jsの中に書いていきましょう！


```googlemaps.js
    var map;

    function initMap() {
      map = new google.maps.Map(document.getElementById('map'), {
        zoom: 3,
        center: {
          lat: 38.865427,
          lng: 140.196123
        },
        mapTypeId: 'terrain'
      });
    }
```

googlemaps.jsについて解説していきます！
今回指定しているのは、中央の座標(緯度経度)をする。
どこに指定しているのかというのを決めています！


## googlemapにいつものポインタを表示する

```googlemap.js
    script.src = 'https://developers.google.com/maps/documentation/javascript/examples/json/earthquake_GeoJSONP.js';
    document.getElementsByTagName('head')[0].appendChild(script);
```

データを読み込んで、あるデータの緯度経度にいつものポインタを出力します！

このデータ自体は上の方でcoordinateという部分に緯度経度が記入してあります！
![スクリーンショット 2018-12-06 22.30.05.png](https://qiita-image-store.s3.amazonaws.com/0/145800/d80aa5c9-b673-70b9-0732-2e3295cec6d0.png "スクリーンショット 2018-12-06 22.30.05.png")


## いつものポインタをサークルに変更する

```googlemap.js
   map.data.setStyle(function (feature) {
      var magnitude = feature.getProperty('mag');
      return {
        icon: getCircle(magnitude)
      };
    });

    function getCircle(magnitude) {
      return {
        path: google.maps.SymbolPath.CIRCLE,
        fillColor: 'red',
        fillOpacity: .2,
        scale: Math.pow(2, magnitude) / 2,
        strokeColor: 'white',
        strokeWeight: .5
      };
    }
```

![スクリーンショット 2018-12-06 22.32.05.png](https://qiita-image-store.s3.amazonaws.com/0/145800/5c8db8cd-2b31-bcd2-4a15-503f1a23d5be.png "スクリーンショット 2018-12-06 22.32.05.png")


このコードはアイコンの設定を変えています！   
また、magnitudeをの値によって、大きさが変わるように指数関数をを用いて定義しています！

## 最後に

googlemapsを用いると様々なカスタマイズもできたりして、ドキュメントもとても充実しています！英語ですがみなさんも読んでみましょう！


p.s. 明日はMincraft&Androidメンターでバリバリコードのかけるほりーです！整数電卓コンパイラを作ってくれるそうです楽しみですね！
これからの記事も楽しんでいきましょう！
CSS Grid のIE 対処

**Gulp で npm i autoprefixer**

```
gulp.task("default", () => {
  return gulp.src("src/style.css")
    .pipe(autoprefixer({ grid: true }))
    .pipe(gulp.dest("dist"));
});
```

-------
```
/* Autoprefixer’s IE-friendly translation */

.grid {
 display: -ms-grid;
 display: grid;
 grid-gap: 10px;
 -ms-grid-rows: 100px 10px 100px;
 -ms-grid-columns: 1fr 10px 1fr;
 grid-template:
   "a   b" 100px
   "c   d" 100px /
   1fr  1fr;
}

.cell-A {
  -ms-grid-row: 1;
  -ms-grid-column: 1;
  grid-area: a;
}

.cell-B {
  -ms-grid-row: 1;
  -ms-grid-column: 3;
  grid-area: b;
}

.cell-C {
  -ms-grid-row: 3;
  -ms-grid-column: 1;
  grid-area: c;
}

.cell-D {
  -ms-grid-row: 3;
  -ms-grid-column: 3;
  grid-area: d;
}
```
草ウィジェットを作った🤔

こんにちは。 卒業生枠で参加させていただいています @isaoeka です。
モバイルファクトリーには2014年に新卒で入社し、2017年の春頃まで働いていました。

これは[モバイルファクトリー AdventCalendar2018](https://qiita.com/advent-calendar/2018/mobilefactory) 9日目の記事です。 
昨日は @umaaaaa さんの [街の零細企業から見たIT事情](http://umaaaaa-chan.hatenablog.com/entry/2018/12/08/095027) でした。

# TL;DR

- 以前 [pixe.la](pixe.la) という、アレっぽいグラフを作れるサービスが流行っていた
- ライフログ系のゲーム/サービスとグラフは親和性が高いのでiOSウィジェットで見れると捗りそう
- [モックアップ](https://github.com/isaoeka/KusaWidget-iOS)を作ってみました


## はじめに

今回は「iOSにTodayExtension（以下`ウィジェット`）を導入してみる。」というトピックで書いていきます。

このトピックで書こうと思った背景は、数ヶ月前に [Pixela](https://pixe.la/)という `「登録された数値情報に基づいて、アレのあれっぽくグラフを作れるサービス」`[^1] といったサービスが流行っているのをTL上で見かけ、ライフログ系のサービスにピッタリだなぁと思ったことから、似たようなモノを作ってみようと思い至りました。

[^1]: https://blog.a-know.me/entry/2018/10/14/212338 より

ウィジェットについては、MFに在籍していた頃、[ステーションメモリーズ！（以下`駅メモ！`）](https://ekimemo.com/)というゲームに既に導入したことがあるので[^2]、 MFの人たちには「またかよ！」と言われてしまいそうですが、気にせず進めていきたいと思います。

[^2]: その節は関係者の皆さんありがとうございました。 :bow: 

前置きが長くなりましたが、掻い摘んで書いていきます。

## 草ウィジェット作ってみた

早速ですが、実際に作ってみたキャプチャがこちらになります。[^3]
![KusaWidget](https://raw.githubusercontent.com/isaoeka/KusaWidget-iOS/master/Sample.jpg)
[^3]: 表示しているデータは適当


本家の草の仕様では、今から1年前までの分（7行53列）を表示しているようですが、今回作ったモノはYAGNIで左上を`1月1日`、右下を`12月30日`に固定しています（7行52列）。[^4]

[^4]: 12月31日なんて無かった & うるう年も無かった

グラフ部分にはCollectionViewでGrid表示になるよう `UICollectionViewFlowLayout`に下記コードを指定しています。

```swift
if let layout = self.collectionView.collectionViewLayout as? UICollectionViewFlowLayout {
    let viewRect = self.collectionView.bounds
    let rowCount: CGFloat = 7
    let columnCount: CGFloat = 52
    let size: CGFloat = (viewRect.width - (columnCount * layout.minimumInteritemSpacing)) / columnCount
    layout.itemSize = CGSize(width: size, height: size)
            
    let cellsHeight = (size + layout.minimumLineSpacing) * rowCount
    let cellsWidth = (size + layout.minimumInteritemSpacing) * columnCount
    let topPadding = (viewRect.height - cellsHeight) / 2
    let leftPadding = (viewRect.width - cellsWidth) / 2
    layout.sectionInset = UIEdgeInsets(
        top: topPadding,
        left: leftPadding,
        bottom: topPadding,
        right: leftPadding
    )
}
```

TodayExtensionは`widgetLargestAvailableDisplayMode`を指定しない限り縦幅が固定で、横幅が端末によって変わるため、横幅を正としてCellのサイズを定め、なるべくグラフが中央に表示されるようInsetを指定しています。 あるあるな実装かもしれませんね。

AppStoreにリリースされているウィジェット系アプリにも、コンテンツがはみ出ていたり、背景色が指定されていたりするアプリをよく見るので、[Human Interface Guidelines](https://developer.apple.com/design/human-interface-guidelines/ios/extensions/widgets/)のウィジェット覧を一読して、意識しておくと良いかと思います。


### 最後に

特別特殊なことをしなくても簡単にソレっぽいものが作れたので、ゲーム系アプリにも普及すると良いなぁと思っています。 アクティビティの表示に限らず、ログインボーナスを表示をするようなウィジェットでも良さそうかなと。

また[GitHub](https://github.com/isaoeka/KusaWidget-iOS)に上げておきましたので、より詳細を知りたい人がいればこちらを見てください。

まぁ以上です！！MF最高！Web界隈のMFといえばモバイルファクトリー！！

明日は @shioiyan さんです！！
MFワッショイ！
ShellScript bash 比較演算子 数値 文字列の比較

#目的

- ShellScriptのfi文で主に使用する比較演算子についてまとめる。
- ShellScriptで数値の大小を比較できるようになる。

#この記事のターゲット

- shell scriptを初めて書く方
- shell scriptでif文を書いてみたい方
- 処理でファイルを比較したい方

#比較演算子とは

- 変数の数値や文字列、ファイルの比較を行える道具である。
- 数学でいう＝＞≧＜≦を処理で行う時使う。

#数値を比較する時
| 比較演算子 | 意味 |
|---|---|
| -eq | イコール(＝) |
| -ne | ノットイコール |
| -gt | XXより大きい(A -gt B → AはBより大きい) |
| -ge | XX以上(A -ge B → AはB以上)※その値を含む |
| -lt | XXより小さい(A -lt B → AはBより小さい) |
| -le | XX以下(A -le B → AはB以下)※その値を含む |

#文字列を比較する時
| 比較演算子 | 意味 |
|---|---|
| ＝ | イコール |
|！＝ | ノットイコール |

#ファイルを比較する時
| 比較演算子 | 意味 |
|---|---
| -nt | XXより新しい(A -nt B → AはBより新しい) |
| -ot | XXより古い(A -ot B → AはBより古い) |
| -e | 存在している |
| -d | ディレクトリかどうか |


#まとめ

- 初期は比較演算子の文字列と数値の使分けに苦労した。
- しっかり覚えて適宜使い分けるようにしよう！
Pythonで競プロに挑む日誌 vol.24 ~アルゴリズムはじめました~

# 現在の目標
* 2018年内に茶色になる**←イマココ. 現レート 368**
 * [ABC](
https://kenkoooo.com/atcoder/?user=&rivals=&kind=category) の A, B 問題を全部解く
* 2018年度内に緑色を取得する
 * [ABC](
https://kenkoooo.com/atcoder/?user=&rivals=&kind=category) の C 問題を全部解く
* (水色になったら, [APG4b](https://beta.atcoder.jp/contests/apg4b) で C++ にも手を出す)

# 今日のおはなし
### 結論
* C 問題以上は, アルゴリズムも学ばないと厳しい
* itertools は便利

#### 解いた問題
[C - 755](https://beta.atcoder.jp/contests/abc114/tasks/abc114_c)

#### TLE 祭り
```TLE_answer.py
# coding: utf-8
N = int(input())

ans = 0
if N <= 356:
    print(ans)
    exit()


if N >= 777777754:
    N = 777777753

for i in range(357,N+1,2):
    st = str(i)
    if ("0" in st) or ("1" in st) or ("2" in st) or ("4" in st) or ("6" in st) or ("8" in st) or ("9" in st):
        continue
    if ("3" in st) and ("5" in st) and ("7" in st):
        ans+=1
print(ans)
```
最近 TLE になることが多いので, 制約条件を見るだけで「あ, この手法はダメっぽいな...」というのが分かってきました. 今回は, 1<=N<=10^9 なので, 全探索だと計算が終わりませんでした. 発想としては, N 以下かつ 3, 5, 7 だけで構成される数を作って数え上げたかったのですが, 良い方法が浮かびませんでした.

#### アルゴリズムとの出会い
模範解答が python でした.

```suggested_answer.py
# 模範解答の写経
# coding: utf-8
N = int(input())

def dfs(s):
    if int(s) > N:
        return 0
    ret = 1 if all(s.count(c) > 0 for c in "753") else 0
    for c in "753":
        ret += dfs(s + c)
    return ret

print(dfs("0"))
```
ある七五三数に対して, 7 か 5 か 3 を再帰的に付け加え, 数え上げる方法とのことです. 

Twitter を見るに, 数え上げる問題(すなわち探索するような問題)を解く上で, DFS(深さ優先探索)や BFP(幅優先探索)というアルゴリズムを知っていることが大前提のようだったので, 勉強を始めました. 

以下, 参考になりそうなリンクを貼っておきます.

* [全探索アルゴリズム入門](https://qiita.com/MasayaMizuhara/items/86099ad721a329e1d6cd)
* [VisuAlgo](https://visualgo.net/ja)
* [Paizaアルゴリズム入門](https://paiza.jp/works/algorithm/primer)
* http://algoful.com/Archive/Algorithm/DFS

これらを活用しつつ, 「[アルゴリズム図鑑](https://www.amazon.co.jp/アルゴリズム図鑑-絵で見てわかる26のアルゴリズム-石田-保輝/dp/4798149772)」という書籍で代表的なアルゴリズムの勉強を始めました. 今後は頭の片隅にアルゴリズムを意識しながら, 問題に取り組もうと思います.

これを活用できるようになるには, アルゴリズムを意識しながら問題を解くしかなさそうですね. 精進あるのみです.

#### itertools との出会い
ほかの方の AC 回答を見てみると, itertools というモジュールがとても便利そうでした.

```itertools.py
# coding: utf-8
import itertools
N = int(input())
ans = 0

for i in range(3, len(str(N))+1):
    for ptn in itertools.product((3,5,7), repeat=i):
        if (3 not in ptn) or (5 not in ptn) or (7 not in ptn):
            continue
        a = int("".join(list(map(str, ptn))))
        if a <= N:
            ans += 1
print(ans)
```
itertools の product メソッドを使えば, 指定の文字だけで構成される指定長さの文字列作れるんですね. こりゃ便利だ! ほかにも組合せ, 順列, 階乗をサクサクっと計算できるようです. 参考リンクを貼っておきます. こちらも今後活用できるように, 頭の片隅に置いておきたい.

* [itertools の公式ドキュメント](https://docs.python.jp/3/library/itertools.html)
* [Pythonで競プロをやる時にそこそこ使う書き方（itertools編）](https://qiita.com/uni745e/items/9823ce5cd9c279a12d8a)
* [すごいぞitertoolsくん](https://qiita.com/anmint/items/37ca0ded5e1d360b51f3)
* [itertoolsによる順列、組み合わせ、直積のお勉強](https://qiita.com/junkls/items/10384950963056cc8e08)

# むすび
知らないことは伸びしろのはず. 精進あるのみ.