OmniAICreator/Qiita-1.07M huggingface dataset:
2系3系共存している場合のライブラリインストールの罠[Python]

#**はじめに**
`pymatgen`モジュールをインポートしようとした時に、`ModuleNotFoundError`に遭遇しました。
過去にインストールした記憶があるだけに一瞬？になりましたが、解決は難しくなかったです。
解決策をここで共有します。

<img width="1166" alt="material-scientist-tutorial.png" src="https://qiita-image-store.s3.amazonaws.com/0/269862/5813bd77-683b-c2b1-9e89-3f70a82f85a6.png">

#**解決までの流れ**

##**ライブラリがインストール済みか確認**

`pythonコマンド`に`mオプション`をつけて実行することで、`Python`モジュールパスにあるモジュールをスクリプトとして実行します。

また、`pip freeze`コマンドによって、現在インストールされているパッケージを表示し、この結果をパイプ`|`で`grep pymatgen`に入力として渡しました。
そして、`grep pymatgen`によって、`pymatgen`がインストールされているかを確認します。


```
$ python -m pip freeze | grep pymatgen
pymatgen==2018.11.6
```
ここで、僕は、「あれ、インストールされてるじゃん。。」と思いましたが、`python3`コマンドもインストールしていたので、こちらにインストールされていないのが原因なのではと考え下記のコマンドを実行しました。

```
$ python3 -m pip freeze | grep pymatgen
```
結果は何も表示されず、`python3`の方では、`pymatgen`がインストールされていないことがわかりました。

ですので、`pip3`でインストールすることにしました。

##**ライブラリのインストール**

```
$ pip3 install pymatgen
```
そして、次のコマンドを実行し、無事インストールされたかを確認しました。


```
$ python3 -m pip freeze | grep pymatgen
You are using pip version 10.0.1, however version 18.1 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.
pymatgen==2018.12.12
```
今回は結果が表示されました。完了ですね。

##**モジュールのアップグレード**

ここからは補足ですが、
先ほどのコマンド実行結果にpipコマンドのバージョンをあげるようにと警告が出ていますね。
素直に従って、実行。

```
$ pip install --upgrade pip
Requirement already up-to-date: pip in /usr/local/lib/python2.7/site-packages (18.1)
```
ですがpyhoon2系に紐づいたpipは最新版だと言われました。。

そうでしたね、3系に紐づいているpIpのバージョンをあげることが目的でしたので、`pip3`コマンドで実行しました。


```
$ pip3 install --upgrade pip
Collecting pip
  Using cached https://files.pythonhosted.org/packages/c2/d7/90f34cb0d83a6c5631cf71dfe64cc1054598c843a92b400e55675cc2ac37/pip-18.1-py2.py3-none-any.whl
Installing collected packages: pip
  Found existing installation: pip 10.0.1
    Uninstalling pip-10.0.1:
      Successfully uninstalled pip-10.0.1
Successfully installed pip-18.1
```
無事、最新バージョンがインストールされましたね。
先ほどと同じコマンドを再度実行します。

```
$ python3 -m pip freeze | grep pymatgen
pymatgen==2018.12.12
```
先ほどと違い、警告は出なくなりましたね。

そして、最後に`python3`で対話モードを起動し、`import pymatgen`を実行すると、エラーは表示されなくなりました。

##**対話モードでライブラリがインストールされたか確認**

```
$ python3
Python 3.6.5 (default, Apr 25 2018, 14:23:58)
[GCC 4.2.1 Compatible Apple LLVM 9.1.0 (clang-902.0.39.1)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import pymatgen
>>>
```

成功ですね。
Python３系に`pymatgen`ライブラリがインストールされました。


#**おわりに**
今回は、`pymatgen`ライブラリをインストール済みかの確認を含めて、流れを追って記述しましたが、`pymatgen`ライブラリに限った話ではないので、
その他ライブラリのインストールの際にも、必要に応じてご参考ください。

この記事が役に立ったという方は、いいね、お願いします(^^)


#**Python関連記事**
[環境構築の真髄(PATHなどの概念)を理解しよう[Python編]](https://qiita.com/takuyanin/items/2f432e90462484cb03a2)
[Jupyter Notebookの効果的な使い方を知ろう[Python/機械学習]](https://qiita.com/takuyanin/items/8bf396e7b6b051670147)
Powershellで"/"(スラッシュ)を含むパスのレジストリキーの作成

# この記事の目的
Powershellから"/"(スラッシュ)を含むパスのレジストリキーを作成する方法を記載します。
# なぜ必要だったのか?
Triple DESやSSLv2といった暗号方式、プロトコルは脆弱性があるため現在は無効化することが推奨されています。
複数のWindows Serverに対してレジストリエディタを使用してこれらを無効化するのは面倒かつ危険と考え、Powershellで定型的に実行することを考えました。
Powershellでレジストリを変更することはそれほど難しくはありませんが、ある暗号方式のレジストリだけ正しく変更できませんでした。
# どのようにやろうとしたのか?
以下の暗号方式、プロトコルの無効化を検討しました。

* Triple DES
* SSLv2
* SSLv3
* RC4

上記に対応するレジストリキーはデフォルトでは存在しません。
よって、レジストリキーを作成してから無効化する必要があります。

以下のようなコマンドでレジストリキーを作成しようとしました。[^1]

```powershell
New-Item -Path "HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Ciphers\Triple DES 168"
New-Item -Path "HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 2.0\Server"
New-Item -Path "HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 3.0\Server"
New-Item -Path "HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Ciphers\RC4 128/128"
New-Item -Path "HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Ciphers\RC4 40/128"
New-Item -Path "HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Ciphers\RC4 56/128"
```
Triple DES、SSLv2、SSLv3は正しく作成できましたが、RC4はエラーが発生しました。

```
New-Item : 指定したパスにレジストリ キーが存在しません。
発生場所 行:1 文字:1
+ New-Item -Path "HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNE ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (HKEY_LOCAL_MACH...Ciphers\RC4 128:String) [New-Item]、ArgumentException
    + FullyQualifiedErrorId : System.ArgumentException,Microsoft.PowerShell.Commands.NewItemCommand
```

# 何が問題だったのか?
RC4のレジストリキーの他レジストリキーとの違いはパスに"/"が存在することです。
Powershellは階層のセパレータとして"\"(バックスラッシュ)と"/"(スラッシュ)両方をサポートします。
ここでは"RC4 128/128"という階層のキーを作成したいのですが、Powershellは
`New-Item -Path "HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Ciphers\RC4 128/128"`
というコマンドが
`HKLM: -> SYSTEM -> ...省略... -> Ciphers -> RC4 128/128`
というパスにしたいのか
`HKLM: -> SYSTEM -> ...省略... -> Ciphers -> RC4 128 -> 128`
というパスにしたいのか判断ができません。
このような場合、Powershellでは前者のパスが存在する場合はそちらを使用し、存在しない場合は後者のパスを使用しようとします。
今回はレジストリキーを作成するところからですので、前者のパスは存在しません。
よって後者のパスを使用しようとしますが、存在しない"RC4 128"というキーの中に"128"というキーを作成しようとしているので前述のエラーになります。
これは"/"をエスケープしても意味がありません。

# どうしたのか?
結論としては以下のコマンドで正しく作成できました。

```powershell
$key = (Get-Item HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\).OpenSubKey('Ciphers', $true).CreateSubKey('RC4 128/128')
```
コマンドレットでは無理だったので、.NETのメソッドを用い、"Ciphers"をOpenSubKeyで開いて、さらに"RC4 128/128"をCreateSubKeyで作成します。
当然、"Ciphers"までが存在することが前提です。
より汎用性を持たせるのであれば一つずつキーが存在することを確認し、存在しないキーを作っていく処理にする必要があります。
今回はRC4のレジストリキーがこのような形だったため難儀しましたが、もし自分でレジストリキーを作成する場合は"/"を含まないキー名にした方が思わぬ問題を生まずに済むと思われます。

# 参考
上記問題に直面した際にMicrosoftフォーラムで質問し、その際にいただいた回答をもとに上記対応方法をまとめました。
https://social.msdn.microsoft.com/Forums/ja-JP/5fa54921-242d-4435-9c3d-a3a9ae11f4c2/powershell?forum=powershellja
回答いただいた方々に感謝いたします。

[^1]: 実際にはレジストリキーが存在する場合、しない場合の条件分岐等がありますが簡略化して書いています。
SE/PGが覚えておくと幸せになれるかもしれないツール・サイト

#【経緯】
自分用まとめメモです。Windows環境です。
一々リンクを探したりまとめたりするのが面倒だったので。
※随時更新予定

# 【ツール編】
__■ [WinMerge 日本語版](http://www.geocities.co.jp/SiliconValley-SanJose/8165/winmerge.html)__
ファイルやフォルダの比較、マージが出来るフリーソフト。
三方向比較、マージが出来たりプラグインを入れればExcelや画像なんかのdiffも見れます。
昔からかなり重宝させてもらっています。

__■ [さくらエディタ](https://sakura-editor.github.io/download.html)__
こちらも昔から重宝しています。元々開発をテキストエディタベースで行う開発の現場に入っていたので、このエディタが大活躍でした。
Grep機能、正規表現での一発置換なんかを行う際は今でもこのエディタを多用しています。
現在ではテキストエディタで開発は基本行わないので使用頻度は減ってますが。。。

__■ [Tera Term](https://ja.osdn.net/projects/ttssh2/releases/)__
定番のターミナルエミュレータ。自前で簡単なサーバーを立てたり、Linuxサーバの環境を触ったりする時にメインでつかっているエミュレータです。シンプルで使いやすい。

__■ [Source Tree](https://ja.atlassian.com/software/sourcetree)__
GUIのGit無料クライアント。なんちゃってエンジニアなのでCUIよりGUIでGit操作することの方が多いです。
コマンドをぱちぱち打ったりviやlessでファイル操作するのも好きなんですが、業務中はGUIベースでやるようにしてます。

__■ [Slack](https://slack.com/)__
便利なコミュニケーションツール。口頭で話すよりSlackで話す時間の方が長い。
有料ユーザでないとワークスペースごとにメッセージの最大件数が決まっていたり、アプリの最大個数が決まっていたりするので大人数で無料ユーザのままだと辛いかも。
とはいえ使いやすいし、他サービスとの連携が出来たり、拡張アプリやサービスが個人でも簡単に開発出来たり、やれることが多いので使い方も拡張性も高く、カスタマイズや効率化の夢が広がるツール。
あと[リリースノート](https://slack.com/intl/ja-jp/release-notes/windows)のコメントがおもしろかわいい。ノリ突っ込みとかしてます。

__■ [Chatwork](https://go.chatwork.com/)__
こちらも便利なコミュニケーションツール。タスクが簡単に追加出来たり、メッセージ数に制限もなし。ただグループチャットの最大数に限りがあるので、個人間のやり取りやある程度の小規模でのチャットに向いてます。色んなグループに頻繁に出入りするとあっという間に上限に達するイメージ。
個人で残しておきたいメモやずっと残しておきたいタスクなんかはこっちで保存していることが多いです。

# 【便利サイト編】
__■ [LUFTTOOLS](http://www.luft.co.jp/cgi/randam.php)__
パスワードに使うようなランダム文字列の自動生成、文字数カウント、IPアドレスチェック、環境変数確認など。
主にパスワード生成にお世話になっています。

__■ [gitignore.io](https://www.gitignore.io/)__
言語やツール、統合開発環境等のキーワードを入力して「Create」を押すと.gitignoreファイルを自動生成してくれます！
新しい言語や開発環境でのプロジェクト、新規プロジェクトなんかをgit管理する時にお世話になります。

__■ [テキスト操作ツール](https://hogehoge.tk/tool/text.html)__
テキストを編集する時によく使います。
置換では対応できない場合や仕様書から持ってきた単語の大文字小文字変換、スネークケース/キャメルケースへの変換によく使用しています。
機能としては以下があります。

|機能|概要|
|---------------|---------------|
|データの並び替え|行単位でのデータの順番入れ替え|
|重複削除|データの重複削除|
|シャッフル|行単位でのデータのランダム入れ替え|
|文字列置換|文字列の置換。正規表現にも対応|
|キャメルケース変換|キャメルケース変換。先頭の大文字/小文字も切替できます|
|スネークケース変換|スネークケース変換。大文字/小文字なんかも出来ます|
|大文字/小文字変換|全て大文字/小文字に変換できます|

__■ [エンコードマニアックス](http://www.encodemaniax.com/)__
エンコード/デコード、ハッシュ等への変換等に使います。たまーに必要なタイミングが来る。。。

__■ [codis](https://codic.jp/)__
日本語を打てば変数などのネーミングを生成してくれます！センスのないPGにはうれしい。
Visual Studio/Visual Studio Code、Eclipce、Sublime text 3、NetBeans、ATOM等のプラグインとしてもあるようです。
パスカルケース、キャメルケース、スネークケース（大文字/小文字）、ハイフネーションに対応しています。

# 【勉強サイト編】
__■ [typing.io](https://typing.io/)__
プログラマ向けタイピングサイト。各言語のフレームワークの中身やライブラリの中身でタイピング練習できるぞ！

__■ [Progate](https://prog-8.com/)__
プログラミングの勉強サイトとしてよく利用してます。画像もスライドも分かりやすいので初心者向けで簡単に学べます。
一切触ったことのない言語はこのサイトを最初に触ることが多いです。

__■ [CodePrep](https://codeprep.jp/)__
こちらもプログラミングの勉強サイトとして利用しています。こちらはちょっと難しめの内容かも。
慣れてない言語だとちらちらヒントとかテキストを見返しながら勉強してます。
ただ、運営終了予定だったものを無期限延長で運営を継続して頂いているサービスなので、定期的な更新や機能改善要望は無いとのこと。詳しくは[こちら](https://paiza.jp/)を参照。

__■ [paiza.io](https://paiza.io/ja/)__
ブラウザ上でコードを書いてすぐに実行できます。
ちょっとだけ動作確認したかったり、初めての言語を軽ーく触ってみたい時にぴったり。
色んな言語に対応しているのでとてもありがたいです。

# 【所感】
こういうサイトやツールを全力で活かして効率化出来るSEになりたい（願望）
スマートスピーカーを選ぼう


# はじめに
　この記事はロボP Advent Calendar 2018の18日目の記事です。

　最近家にあるスマートスピーカーがただのスピーカーになっているので、実際購入して使用するなら何のスマートスピーカーがいいのか調べてみたのと、自分が使ってみたレビューのまとめ的な感じです。(あくまで一意見)


##　Googleホーム
![google_home.jpg](https://qiita-image-store.s3.amazonaws.com/0/316624/7e20399a-be92-8f2c-567b-a1f108ca3d4f.jpeg)
天下のGoogle印のスマートスピーカー。Wi-Fi接続をするにはGoogle Homeアプリをスマホにインストールする必要がある。Google Homeアプリを入れていない人がこれを使用すると今日の天気と簡単な翻訳機能、ラジオ等の機能を使うことができる。
アプリをインストールすることでGoogleカレンダー等、Googleの提供しているサービスとの連携をすることができるようになる。(ぶっちゃけ廃Googleユーザーでもない限りGoogle Homeを購入しなくてもいいんじゃないかって思う)
またChromecastとの連携するとNetflixやHulu、Youtubeの操作ができる。
値段は楽天市場で9670円、価格.comで10800円だった。

##　Alexa
![alexa.jpg](https://qiita-image-store.s3.amazonaws.com/0/316624/c2a52325-deca-cf13-d511-756e1608654b.jpeg)
Amazonで購入可能なスクリーン()付きのスマートスピーカー。購入時にAmazonアカウント連携とWi-Fi接続設定が完了された状態でお家に届くため、届いてすぐに使用が可能。
電話やテレビ電話のようなモードだけでなく、ピカチュウや鷹の爪団の吉田君とお喋りできるモードがあるが、まともに機能しない。また、YouTubeなどの動画の再生も可能だが、調べ物をすると99.9%の確率でAmazonに飛ばされるため、おすすめはしない。
価格は14980円と他のスマートスピーカーと比べると少し高めである。

##　Clova Wave
![clova_wave.jpg](https://qiita-image-store.s3.amazonaws.com/0/316624/06e0d072-0ce4-806a-a6f4-6cc9303a8d12.jpeg)
LINE社の開発したスマートスピーカー。LINEが開発しただけあってLINEアプリとの連携ができるため、
新着メッセージの読み上げやLINE電話などの通話機能を搭載している。
また、他のスマートスピーカーと違いバッテリーを搭載しているため、屋外への持ち運びが可能。(ただし通信環境は自分で準備する必要がある)
お値段も3974円(価格.com参照)と他のスマートスピーカーに比べると安くなっている。

# 最後に
AIのレベルが一番高いのはGoogleHomeで、質問の意図をちゃんと理解できていることが多い(比較Alexa)ため、ストレスを少なくしたい人やバリバリにスマートスピーカーを生活の一部に組み込みたい人はGoogleHomeがおすすめ。
逆に特に機能が必要なく高性能スピーカー()が欲しいという人はClovaをおすすめする。
Alexaはカメラやスクリーンがついているため、ラズパイ使って調教したらGoogleHomeとかよりも優秀になるかもしれないが今のところ特に魅力という魅力は感じていない。無限の可能性をAlexaは秘めているかもしれないと思った。

###　ここみた
・http://kakaku.com/item/K0001003893/
・https://www.amazon.co.jp/dp/B074BJRPT9/ref=asc_df_B074BJRPT92551328/?tag=jpgo-22&creative=9303&creativeASIN=B074BJRPT9&linkCode=df0&hvadid=225687876419&hvpos=1o4&hvnetw=g&hvrand=14677763423165419807&hvpone=&hvptwo=&hvqmt=&hvdev=c&hvdvcmdl=&hvlocint=&hvlocphy=1009343&hvtargid=pla-465962334384&th=1&psc=1
・https://yuki-no-yabo.com/smart-speaker-comparison-2017/#Clova_Wave
KURURU - テスト管理ツールを作った

**テスト管理ツールというのを知ってますか？？**

一般的にテスト管理ツールというのは、膨大なテストを管理し実行する手助けをするツールのことを指します。OSSとして提供されているものとしては、[TestLink](https://ja.wikipedia.org/wiki/TestLink)が有名ですね。

メルカリさんでも過去の記事で色々とテスト管理ツールを比較したかなり良い記事があります。
[モダンなテスト管理プロセスのためにテスト管理ツール３つを比較検討したはなし](https://tech.mercari.com/entry/2017/03/30/100920)

ただ、Web企業の多くの現場ではExcelやスプレッドシートで管理していてあまり馴染みのないツールでもあります。とくに最近では手動でのテストよりもTDD・BDD影響もあってテストコードの話題が多くなり、手動テストの手法自体があまり日の目を見なくなってきていますね。
ただあまり話題にならなくなっても手動テスト自体は今後も有用であり、テストコードと対立する手法でもありません。
まず、私のサービスを紹介する前に少しだけテストに関しての私の個人の見解を書かせてください。

## Excel・スプレッドシートで管理する問題点
先程書いたようにExcelやスプレッドシートで管理している現場は多いと思います。
そういう現場では昔から使い慣れたフォーマットがあり、それを流用して管理していることもあると思います。

Excel・スプレッドシートのメリットとして以下が挙げられます。

1. 学習コストが低い
2. フォーマットが自由に作成できる
3. 直感的なため、誰でも説明を受ければテストを実行できる

ただし、以下のようにデメリットもあります。

1. フォーマットが自由なため、あれこれ追加してしまい段々使いにくくなる
2. ケース数が膨大になるとどこのシートにどのテストをしたのかわからなくなる。(網羅性は強いが管理が難しい)
3. テストを失敗していても開発者に通知されないため、開発者はいちいち確認しないといけない
4. **テストが蓄積されず、その場限りとなってしまう**

私はとくにテストケースが蓄積されずその場限りとなってしまうことが一番問題だと感じていました。
理由として、テストケースが十分にあればそのサービスの仕様として活かせると感じるからです。ただ、このあたりについて書くとかなり長くなってしまうので今回はそこまで書きません。

## 今回作ったサービスの話
今回作ったサービスは[KURURU](https://www.kururu.io/)というサービスになります。
まだ、トップに表示されている機能が十分に完成していないので心苦しいのですが。。

注目点としてテスト実行後に作成したテストケースを将来再利用出来るように設計しました。その場限りのテストケースを使うのではなく、将来的にも流用できる資産として活用出来ます。

今後は特徴にあるPull Requestに紐づけることでよりコードとテスト実行の統合を目指します。
ちなみに今回のサービスで利用した技術は[Elixir/Phoenixで個人サービスを作ったことの振り返り・本番環境運用](https://qiita.com/hackpopo/items/4ac7bc03650a4777a697)に説明されています。
関数型言語を使ったきっかけはテストコードを書くのが楽だというのが動機です。

## 最後に何で作ったのか
ここまで読んで不思議と思うかもしれませんが、私自身はそんなにテストが実は好きではないですw
そのため、好きじゃないテストを効率良く実装したいというモチベーションで作りました！

最後にテストに興味を持ったきっかけとして、かつて一緒に働いていた仲が良くテストに強かった同僚が「7年間でバグを混入したことが1回しかない」かつ「開発期間を伸ばしたこともない」という驚異的なエンジニアに憧れたのがきっかけです。その同僚も今回ツールを作ったことで草葉の陰で喜んでいると思います。


明日は、[skycat_me](https://qiita.com/skycat_me)さんの記事になります!
軸ラベルの数値を三桁カンマ区切りで描画する(matplotlib)

matplotlibでグラフを描画する際、
y軸の数値を__`三桁毎にカンマで区切って表示したい`__場合があります。
検索してもすぐに見つからなかったので、備忘も含めて下記に記載。
![Figure_1.png](https://qiita-image-store.s3.amazonaws.com/0/290041/a293b28c-0334-649f-d994-03dc5beef8c4.png)

``` python
import numpy as np
import matplotlib.pyplot as plt

height = np.array([1000, 2000, 3000, 4000, 5000])


fig, ax = plt.subplots(1, 1)
# 三桁カンマの設定
ax.yaxis.set_major_formatter(plt.FuncFormatter(lambda x, loc: "{:,}".format(int(x))))

plt.bar(range(len(height)), height)
plt.show()
```
x軸を三桁区切りにする場合は、`yaxis`→`xaxis`でOK
Kotlin Gradle DSLでExperimentalの設定ができないときの対処法


## 問題

Kotlin Android Extensionsの実験的機能を使おうとした際、Kotlin Gradle DSLで書かれた `build.gradle` に、以下のような記述をしても使いことができない。

```build.gradle.kts
plugins {
    kotlin("android.extensions")
    kotlin("android")
}

android {
    androidExtensions {
        isExperimental = true
    }
}
```

## 対処法

`AndroidExtensionsExtension` をインポートしてその中で `isExperimental = true` を記述する。

```build.gradle.kts
import org.jetbrains.kotlin.gradle.internal.AndroidExtensionsExtension

plugins {
    kotlin("android.extensions")
    kotlin("android")
}

android {
    androidExtensions {
        configure(delegateClosureOf<AndroidExtensionsExtension> {
            isExperimental = true
        })
    }
}
```
ｲ為サイトを作ってみようと思う

ニフティグループ Advent Calendar 2018の17日目です．

こんばんは．会社ではニコラスとか呼ばれています．日本人です．
# はじめに
最近巷ではｲ為サイトが話題になっています．年末に魔物が済むといわれていますが，ｲ為サイトも年末になると元気になるようです．知らんけど．
https://www.fnn.jp/posts/00407155CX
http://news.livedoor.com/article/detail/15691051/
なので，今日は話題の偽サイトを作ってみようとおもいます．

#偽サイトの作り方
## 手順１

サイトにアクセスします．
![image.png](https://qiita-image-store.s3.amazonaws.com/0/162708/28372dbb-9cdf-dd2d-03d6-af129454e24d.png)

## 手順２
次に特殊なコマンドを入力します．
```Ctrl + s (windowsの場合)
⌘ + s (Macの場合)
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/162708/4860cada-eb04-21d8-0b96-a88cece721b5.png)

## 手順３
あとはサーバーにアップロードして完成・・・・あれ？
![image.png](https://qiita-image-store.s3.amazonaws.com/0/162708/61e623a4-60fb-a900-e3b7-5722693113de.png)

作ってみた．でも出来なかった．おしまい．

# 解説
googleの場合はchromeのページ保存機能でロゴが保存できませんでした．残念です．ではロゴの部分のソースをみてみましょう，
![image.png](https://qiita-image-store.s3.amazonaws.com/0/162708/72ac4377-15bb-e63a-0e70-a3d3ef570971.png)

ロゴは画像なので，imgタグで表示しています．　src属性でロゴ画像のパスが指定されています．見慣れないsrcset属性がありますが，これはHTML5で新しく定義された属性表示している画面の解像度によって表示する画像を変更できる属性になります．
Chromeの機能でページを完全保存した場合はHTMLから呼び出すリソース（画像とかjsファイル，cssファイル)をローカルに保存して，HTMLのパスを書き換えます．今回の場合ではsrcに指定されているリソースは保存されパスが書き換えられています．実際にGoogle_filesの中にはsrcのロゴ画像が保存されています．
![image.png](https://qiita-image-store.s3.amazonaws.com/0/162708/c344db87-44bf-d498-0ebd-c2535905495d.png)


しかしChromeはsrcset属性で指定されている画像を表示しようとします．Chromeの完全ページ保存機能ではsrcset属性の依存関係は解決しないので，画像のダウンロードもHTMLのパスの書き換えも行なわれないため，画像のパスが存在せず画像が表示されません．

googleのトップページは意図している訳ではないですが，chromeの保存機能では完全なページはできません．逆に言うと簡単にはコピーしたページを作ることはできないということです．

さて，最近の問題ですがフィッシング詐欺が巧妙化し，偽サイトを作ることが多くなっています．ひと昔であれば，適当なサイトでフィッシングしていたようですが，最近のは見た目は本物そっくりな事があります．私はフィッシングサイトを作ったことが無いので実際にどうやっているのかはわかりませんが，ブラウザの保存機能を使うと誰でもコピーできるのは事実です．
偽サイトもブラウザの保存機能を使っているのでしょう．知らんけど．

なので，偽サイトを作らせないためにも，ブラウザの保存機能の動作を理解し，「完全」な保存させないサイト作りが偽サイト対策になります．

# Chromeで保存できないサイトの作りかた

##１ srcset属性を使う
googleが教えてくれた方法．ただしIEではsrcset属性は非対応なので，IEではsrcを読みにいきます．なのでフィッシングサイトがIEが対応しているなら（皮肉）,これは無効です．IEのみの対応のフィッシングサイトが登場したら，セキュアなchromeに誘導するつもりなのでしょう．知らんけど．

##2 background_img属性を使う
imgタグにcssファイルでbackground_imgを指定すると画像は表示されるますが，保存はされません．どうにもchromeでは再帰的にパスの解決をしないようです．　

##３ CSSの@import url();を使う
cssはimportが可能なので複数ファイルに分割できます．そのためのimportなのですが，この依存関係もchromeは解決してくれないです．ただし，cssのimportはページのロード時間が伸びる（＝レンダリングされるまでに時間がかかる）ので副作用もあります．

##4 querySelector("[src$='.ダウンロード']")でダウンロードを検出する．
 chromeはjavascriptファイルの拡張子を変更します．リネームせずに保存するとWSH直接実行できるのを防ぐためだと思いますが，jsファイルの拡張子がかわるのを利用して，保存されたのを検出する事ができます．検出が出来るなら，レポートを送るのもありですし，全部```dispay:none;```にするなりして嫌がらせしたりできます．


# 結局のところ
いたちごっこです．

でも相対パスが解決されないことを利用して偽サイトを作りにくくできます．ただ，これが通用するのはエンジニアもどき程度が偽サイトを作った場合です．本当にできるエンジニアリングならば，パスを解決もお手の物なので対策が効きません．
ただ，メジャーなサイトを見ていると保存対策をしているところが無く無防備です．偽サイト対策にもある程度でもいいので，簡単に保存できなくすることぐらいしておいてもいいとは思います．画像が表示できなくなるだけの対策なら簡単だと思います．

知らんけど．
IIJ Machinistで室温をモニタリングする。

#Machinist
IIJから、[Machinist] (https://machinist.iij.jp/)というサービスが発表されました。数値データ(メトリクス)を記録し、グラフ化、監視、比較できるサービスです。
現在ベータ版で、１０メトリクス、保存期間は直近の１ヶ月までなら無料で利用できるので、Raspberry Piに繋いだ温度センサーで取得した室温を記録してみることにします。
##データ保存
基本的にJSON形式のデータをhttps/putするだけ。チュートリアルに従ってjsonを書きます。

```json
{
  "agent": "BME280",
  "metrics": [
    {
      "namespace": "bme280",
      "name": "temperature",
      "tags": {
        "location": "living"
      },
      "data_point": {
        "value": 22.37
      }
    }
  ]
}
```
#温度計測
Raspberry pi3B にBME280基盤を、ブレッドボードなしでジャンパ線４本で接続。
BME280のRubyによるデータの読み出しは、[ruby-i2c-devices](https://github.com/cho45/ruby-i2c-devices)を使用。

```ruby:qiita.rb
#!/usr/bin/env ruby

$LOAD_PATH << "/home/pi/BME280/ruby/i2c/lib"
require "/home/pi/BME280/ruby/i2c/lib/i2c"
require "/home/pi/BME280/ruby/i2c/lib/i2c/driver/i2c-dev"
require "/home/pi/BME280/ruby/i2c/lib/i2c/device/bme280"

@device = I2CDevice::Bme280.new(driver: I2CDevice::Driver::I2CDev.new("/dev/i2c-1"))
#p @device.read_id
#p @device
@device.write_config(I2CDevice::Bme280::T_STANDBY_0_5MS, I2CDevice::Bme280::FILTER_16)
@device.write_ctrl_hum(I2CDevice::Bme280::OVERSAMPLE_1)
@device.write_ctrl_meas(I2CDevice::Bme280::OVERSAMPLE_16, I2CDevice::Bme280::OVERSAMPLE_2, I2CDevice::Bme280::MODE_NORMAL)
#p @device.calc_sensor_data
temp = @device.calc_sensor_data[:temp]
```
ひとまずこれで室温を取得。

##JSON組み立て
データをハッシュで整理してJSONに変換するのがとっつきやすそう。

```ruby
require 'json'
metrics = [ {"namespace" => "bme280","name"=>"temperature","tags"=> {"location"=> "living"},"data_point"=>{"value"=> temp}}]
data = {"agent" => "BME280","metrics"=> metrics}

input = JSON.pretty_generate( data )
```
これで先のJSONが組み上がります。

##https put
できたJSONをput

```ruby
require 'net/http'
require 'openssl'
require 'uri'

url = URI.parse("https://gw.machinist.iij.jp/endpoint")
http = Net::HTTP.new(url.host,url.port)
http.use_ssl = true
http.verify_mode = OpenSSL::SSL::VERIFY_PEER

api_key = "your_api_key"
req = Net::HTTP::Post.new(url.request_uri)
req["Content-Type"] = "application/json"
req['Authorization'] = 'Bearer ' + access_token
#BearerのBが大文字でないと認証通りません。
req.body = input
res = http.request(req)

puts res.code, res.msg,res.body
```
これでデータをPUTできました。
cronに登録して２分おきで回しておきます。

##データ
<img width="1073" alt="Machinist.png" src="https://qiita-image-store.s3.amazonaws.com/0/23964/331fb00b-d71d-1b83-5aca-cd7bdc68b986.png">
室温データがこんな感じで保存、確認できます。(21時まではデータに欠落があります)
22:30に暖房をオフにしたのがよくわかりますねw。
##監視
[監視設定](https://app.machinist.iij.jp/monitor/settings)で、保存した値が設定値を上回る、下回るなどした時にメールで通知することができます。
メール以外は今の所実装されていないので、メールをトリガーにして他のサービスや製品と連動を実装すれば色々使い道がありそうです。

##まとめ
IIJの新サービス　Machinistで室温の記録、監視を設定してみました。
【Rails】アプリ作成に欠かせない手順（modelを除く）

# Railsのアプリ作成に欠かせない手順

## 最初のコマンド
```
$ Rails new hoge_app
　　　　　　アプリケーション名
```
すると、入力したアプリケーション名と同じフォルダが用意される。

```ディレクトリ構造　
hoge_app/
     app/ アプリケーションのメインフォルダ
     config/ 設定情報に関するフォルダ
     db/ データベースに関するフォルダ 
          ・
          ・
          ・
```

## 次のコマンド

```
$ rails generate controller hoge piyo
　# hoge：コントローラー名, piyo:アクション名
```

すると、webページを表示するために必要なファイルが作られる。

- `hoge`フォルダの中に`app/views/piyo.html.erb`ファイルが出来る

## 開発中のアプリケーションをブラウザで表示

```
$ rails server
　# rails sに省略可能
```
サーバーの立ち上げ後、`localhost:3000/hoge/piyoに`アクセス出来る

### 予備知識
- controllerについて
    - Rails：コントローラを経由してviewに返す。
        - アクション（コントローラ内のメソッド）：ブラウザに返すviewを、controller名と同じ名前のviewフォルダの中から、アクションと同じ名前のHTMLファイルを探し、ブラウザに返す。

- viewについて
    - Railsからviewが返され、ページが表示される

- routingについて
    - URLを見て、適切なコントローラーのアクションを呼び出す
        - URLで`/`を指定してあげると、`localhost:3000`で対応するルーティングのブラウザが表示される。

### ページが表示される流れ
1. routing
2. controlle
3. view
【Noby API】ノビィ取り扱い説明書【CotoGoto】

こんにちは。この記事は[国産Web API Advent Calendar 2018](https://qiita.com/advent-calendar/2018/apijp)の１9日目の記事です。

# 1. CotoGoto(コトゴト)とは？
[CotoGoto(コトゴト)](https://www.cotogoto.ai/)は毎日の会話を作業内容として記録し、作業時間、モチベーションを集計・解析をするWebサービスです。
毎日の会話を人工知能と楽しむことで、いつの間にかライフログが形成されていきます。

![スライド04.png](https://qiita-image-store.s3.amazonaws.com/0/20464/a0a93cf3-3c61-1bd6-9b1f-b5d512db0cb2.png)
![スライド05.png](https://qiita-image-store.s3.amazonaws.com/0/20464/08f2529f-bd94-8d5d-f19f-36525628339f.png)

# 2. NOBY APIとは？
[NOBY API](https://webapi.cotogoto.ai/) は自動で会話対応し、会話からモチベーションの解析、生活のサポートをしてくれるAPIです。近年のスマートフォンの普及により、LINEやFacebookメッセンジャーなどのチャット型のコミュニケーションサービスが一般化したのに加えて、2016年に入ってからFacebookとLINEがチャットボット開発用のAPIを公開したことからニーズも高まりつつあります。
[NOBY API](https://webapi.cotogoto.ai/) を提供することで、会話ログを解析し、モチベーションの変化、気づきを助ける、サポートサービスを提供します。

【このAPIが提供する機能】 
簡単にBotが作成できる。
形態素解析、感情解析、固有表現抽出、オプション機能が豊富。
コマンド機能による外部連携のサポート。

## 2-1. NOBY API のユーザーの流れ
![スライド14.png](https://qiita-image-store.s3.amazonaws.com/0/20464/ef192d66-f73e-5c0c-eb86-a540bac55f1b.png)

## 2-2. 応答機能一覧
|id|機能名|機能概要|
|:--|:--|:--|
|000|短い応答|一文字とかの短い問いかけに聞き返してくれる。|
|001|コマンド応答|話かけた言葉に対して、特定のキーワードが含まれている場合、<br>登録した該当キーを返します。<br>※コマンド機能については別途説明|
|002|挨拶応答|挨拶に対して、挨拶を返します。
|003|係り受け応答|係り受け関係にある文節をペアとして発話者の言葉に含まれる係り受けのペアと、応答にある係り受けペアを組み合わせて言葉を返します。
|004|マルコフ応答|マルコフ連鎖を用いて、該当するキーワードから言葉を生成します。
|005|パターン応答|登録されている特定の言葉に対して、<br>該当する言葉を返します。
|006|テンプレート応答|用意されたテンプレートの言葉に、<br>話かけた言葉の名詞を当て込み言葉を返します。
|007|オウム返し応答|話かけた言葉に合わせて、オウム返しをします。
|008|ランダム応答|ランダムで言葉を返します。
|009|あいづち応答|話かけた言葉に対して、感情解析をして感情に合わせたあいづちを返します。
|010|その他応答|ひ・み・つ
|011|質問応答|全ての機能で返す言葉がない場合に質問を返します。

## 2-3. 機能の応答処理の流れ
![noby_api.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20464/27e7601e-cac6-b3e2-e259-c607bc8d41da.png)


## 2-4. コマンド機能について
コマンド機能は文章中に設定した単語が登場した場合、登録したコマンドIDを返却します。
![NOBY_API_取扱い説明書_2019.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20464/3eff952c-bd2f-2d34-d336-27017ac97043.png)


# 3. 使い方について
使い方については[次の記事](https://qiita.com/blue_islands/items/20c61c1737873117dcf9)で紹介しています。

また、参考として、Twilioを使って音声ポットを作るサンプルソースも[こちらに記事](https://qiita.com/mobilebiz/items/b1548fe567dbe52f1a9d#_reference-23d8d8f6f9312b00ec96)が上がっていますので、参考にしてみて下さい。
[NOBY APIを使って、Twilioで音声ボットを作る](https://qiita.com/mobilebiz/items/b1548fe567dbe52f1a9d#_reference-23d8d8f6f9312b00ec96)

他にノビィ作品を作ってくれた人の記事
[ノビィからの返答を伺かに話させる仕組み その①](https://qiita.com/nodeShell/items/c5d90c3b45f9c1ba5f12)

# 4. コマンド機能について
コマンド機能については[こちらの記事](https://qiita.com/blue_islands/items/e9f9ccefade25af0cd96)で紹介しています。
ARKitでジェスチャーを使ってオブジェクトを拡大縮小、回転する

一度物体をAR空間に置いたときに、その物体を調整したい時があると思います。

そんなときに使える、指のジェスチャーを使った、物体を操るための実装を紹介します。

# ピンチインアウトで拡大縮小

![scale.gif](https://qiita-image-store.s3.amazonaws.com/0/111366/f267f306-a8bc-bcd4-9e53-874d8faec50a.gif)

## UIPinchGestureRecognizerを実装

viewDidLoadなどでgestureをaddします。

```swift
// scale gesture
let pinch = UIPinchGestureRecognizer(
    target: self,
    action: #selector(type(of: self).scenePinchGesture(_:))
)
pinch.delegate = self
sceneView.addGestureRecognizer(pinch)
```

## ジェスチャーで呼ばれるメソッドを定義
```swift
@objc func scenePinchGesture(_ recognizer: UIPinchGestureRecognizer) {
    if recognizer.state == .began {
        lastGestureScale = 1
    }
    
    let newGestureScale: Float = Float(recognizer.scale)
    
    // ここで直前のscaleとのdiffぶんだけ取得しときます
    let diff = newGestureScale - lastGestureScale
    
    let currentScale = boxNode.scale

    // diff分だけscaleを変化させる。1は1倍、1.2は1.2倍の大きさになります。
    boxNode.scale = SCNVector3Make(
        currentScale.x * (1 + diff),
        currentScale.y * (1 + diff),
        currentScale.z * (1 + diff)
    )
    // 保存しとく
    lastGestureScale = newGestureScale
}
```


# 回転

![rotate.gif](https://qiita-image-store.s3.amazonaws.com/0/111366/284a3799-c2ba-b7bc-08de-e5326678065d.gif)

## UIRotationGestureRecognizerを定義

```swift
// rotate gesture
let rotaion = UIRotationGestureRecognizer(
    target: self,
    action: #selector(type(of: self).sceneRotateGesture(_:))
)
rotaion.delegate = self
sceneView.addGestureRecognizer(rotaion)
```

## ジェスチャーで呼ばれるメソッドを定義

```swift
@objc func sceneRotateGesture(_ recognizer: UIRotationGestureRecognizer) {
    let newGestureRotation = Float(recognizer.rotation)
    
    if recognizer.state == .began {
        lastGestureRotation = 0
    }
    // 前回とのdiffを取得
    let diff = newGestureRotation - lastGestureRotation
    
    // 今回はオイラーアングルのyを取るため、y軸中心の回転をさせます。
    let eulerY = boxNode.eulerAngles.y
    boxNode.eulerAngles.y = eulerY - diff
    
    lastGestureRotation = newGestureRotation
}
```

# まとめ

- UIPinchGestureRecognizerを使って物体を指で拡大縮小しよう
- UIRotationGestureRecognizerを使って物体を指で回転させよう

# サンプルコード

https://github.com/kboy-silvergym/ARKit-Emperor のGestureのところを確認してください！
Firebaseを使ってWebサイトをデプロイするまで


楽にサイトをデプロイする方法について調べていて、そのひとつである**Firebase Hosting**を試してみたら思いのほかスピーディで感動したので、メモがてら記事にします。


#### 前提

nodeがインストール済みであり、npmコマンドが使用できること


#### 準備

- Googleアカウントにログインします。
- [Firebaseの公式サイト](https://console.firebase.google.com/?hl=ja)を開きます。
- プロジェクトを追加 という項目があるので選択し、任意の名前でプロジェクトを作成します。
- コンソールが開いたら、Hostingを選択してダッシュボードを開きます。

![5YSMhPQUX.png](https://qiita-image-store.s3.amazonaws.com/0/46962/38406b11-41cc-5ec2-7698-dace10c5bcc9.png)



#### Firebaseプロジェクトのセットアップ

この作業はローカルで行います。
ターミナル等を立ち上げて実行してください。


```bash
# Firebase CLI を利用できるようにします。
npm install firebase-tools --global

# デプロイしたいプロジェクトがあれば、そのディレクトリに移動してください。
cd /projectName

# Firebase にログインします。
firebase login

# 現在のディレクトリを、Firebaseプロジェクトとします。
firebase init
```

firebase initではすでにプロジェクトが作成されていた場合、それを選択できるようになっています。
もし作ってなかったゆえに「don't setup a default project」を選択していたとしても、後々以下のコマンドで設定できます。

```bash
# プロジェクト作成時に作られる、プロジェクト名を元にしたID
firebase use --add firebaseProjectID
```

#### Firebaseへのデプロイ

```bash
# Firebaseへのデプロイを行う
firebase deploy
```

![console.png](https://qiita-image-store.s3.amazonaws.com/0/46962/f98a5f78-75d5-3057-2f75-ad4528d4ba7f.png)

うまくいけば、上記のような感じになります。
HostingURLから、実際にデプロイしたページを見ることができます。


#### 感想

Webサイトを公開といったら、FC2ホームページみたいなサービスを使うか、ConohaのようなVPSを使ってサーバー環境を整えた上でアップロードするなど手間のかかるイメージがありました。

Firebase Hostingや GitHub Pagesを使えば手間いらずでデプロイできるので、より開発に専念することができるようになり、時間当たりの開発速度（生産性）も向上して素晴らしいと思います。

今後も、こういった楽をできるサービスや手間を減らすツールについては調べていきたいですね。

#### おまけ

とりあえず静的Webページをアップして遊んでいます。
https://portfolio-256ac.firebaseapp.com/
KaggleのデータをAPI経由で取得する方法

# kaggleのデータをAPI経由で取得する方法
kaggleのデータは、Webブラウザ経由でダウンロードできますが、API経由でもダウンロードできるため、その方法について公式を参考にして書きました。

```sh
# kaggleモジュールのインストール
$ pip install kaggle
```
https://www.kaggle.com/`username`/account で Create Mew API Tokenをクリックしてkaggel.jsonを取得。
Macの場合、~/.kaggle/フォルダにkaggel.jsonを配置


```sh
# パーミッションの変更
$ chmod 600 kaggle.json
```

コンペのデータページにあるコマンド
https://www.kaggle.com/c/microsoft-malware-prediction  の場合は下記。

```sh
$ kaggle competitions download -c microsoft-malware-prediction
```

# 参考
- https://github.com/Kaggle/kaggle-api
GitHubからポートフォリオを公開

#概要
web系の学生であれば自分のポートフォリオページを作ってみたいと一度は考えたことがあるでしょう。実際僕もオシャレなホームページを作りたいと思いbootstrapなど勉強しました。
しかし、作ったのはいいもののどうやって公開しようかと悩んでる方はたくさんいると思います
ホームページやポートフォリオページを公開するには必ず「 サーバ」が必要です。
ただ実際にサーバを準備するといっても、自前で用意するとなると大きなコストが発生します。
レンタル サーバはコストを小さく抑えられますし、xdomainなど無料のレンタルサーバなどもあります。
しかしそんなことしなくても簡単にwebページを管理する方法があるのです。しかも必要なものはgithubアカウントと数分の時間だけです。
#GitHubを使いWebサイトを公開する方法
##make repository
まずリポジトリを一つ作ります。名前はなんでも大丈夫です。
##clone
次に作成したリポジトリをクローンします

```
$ git clone https://github.com/<username>/<repository name>.git
```
##make index.html
次に表示させるページを作成します.今回は"hello world"とします。
masterを直接触るのはよくないですが今回は見逃します。

```
$ cd <repository name>
$ echo "hello world" > index.html
```
##commit&push
作ったindex.htmlをコミット＆プッシュしましょう。

```
$ git add .
$ git commit -m "add index.html"
$ git push origin master
```
##setting
repositoryのページから設定タブをクリックし、GitHub PagesのSorceをmaster branchにしsaveします。無事終われば上に記載されているURL(https://<user name>.github.io/<repository name>/)にアクセスするとHelloWorldと出るはずです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/267562/507f74bc-4e3b-22fa-db03-4d734a769b1c.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/267562/5c362e66-b0e3-22e9-efd6-83304cce507b.png)

#まとめ
3分程で作れるので皆さん一度試してみてはいかがですか?
公開したポートフォリオを友達に自慢しちゃいましょう!
[僕のポートフォリオ](https://tiger59.github.io/portfolio/)
太古に3hで作ったシンプルゲームを眺めるの巻

#はじめに
らいたーは`JavaScript`の`J`も忘れてしまっています。
「[JavaScript2 AdventCalendar2018](https://qiita.com/advent-calendar/2018/javascript_02)に1個空きがあったので埋めたい」そういう思いで書いています。そして「太古」といってもゆうて一年くらい前であることをお伝えしておきます。

#やっぱりくそげーか？
[ここ](https://brackss1.github.io/ClearBalls/)にあります。`github.io`はちょっとしたものを公開したいときに便利ですよね。
<div align="center"><img src="https://qiita-image-store.s3.amazonaws.com/0/147891/00f57177-c4f6-9553-3676-84554d2babb3.png" width=50%>
</div>
3時間クオリティーって感じですね～(泣)。色にはわりと気遣ったつもりなんですけどね。縦横比はスマホに合わせています。(たしかiPhone5とかそこら)
電車内でニヒリズムに陥ったとき(つまり暇)にたまにやってるんですけど、これが150行くらいで書けるのが[phina.js][1]です！
改行も結構頻繁にしていて空行を削るともっと圧縮できて100行くらいにはなりますね。

#[phina.js][1]#とはとはとは

`phina.js`は見ての通り`JS`のライブラリでゲームエンジンです。他のゲーム作成ライブラリをあまり知らないのであれですが、このライブラリはクラス生成がとても楽です。というか**カッコいい**です。完全に主観です(笑)。

```js:BallClass
phina.define('Ball',{
  superClass: 'CircleShape', 
  init: function() {
    this.superInit(RADIUS);

    let hue = Random.randint(0,360);
    this.fill='hsl({0},75%,75%)'.format(hue);

    this.setInteractive(true);

    this.onpointend = function() {
      this.hide();
    }
  }
});
```

ソースコードの一部を出してみました。`define関数`の引数をしてクラスのあれこれを指定します。
これが特別便利かと言われればそれはゲームにもよりますが、オブジェクト指向で**ちゃちゃっとなんか作りたい**みたいなときにとても便利ですしなんか好きでーーす。

#感想
[phina.js][1]に一目惚れしました。でもこれ以外なんもつくってないんですよ。一時の気の迷いだったのかなあ～。このゲームエンジンに興味がある人はSlackに入ったらいいと思います。ホームページで募集しているはずです！

#おわり
9割5分以上ポエムになってしまっていますね～。そこまで分量ないんですけど。おわり

[1]:http://phinajs.com/
Unity 2018.3初さわりメモ

今まで2018.2系を使ってました。2018.3を初めて使ってみて気が付いたことを書いていく。

## アイコンが白い
昔は青?アイコンだった気が・・・
<img width="285" alt="スクリーンショット 2018-12-17 23.00.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/278474/3de2ac85-f6d5-11e8-531e-0bb6f3717e4a.png">

## window開きすぎると > が出てくる
<img width="257" alt="Unity 2018.3.0f2 Personal - SampleScene.unity - Sample_PokemonBattle - PC, Mac &amp; Linux Standalone (Personal) &lt;Metal&gt; 2018-12-17 23-01-35.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/278474/39b0e8dd-b731-c2f8-e874-da3f515df9b4.jpeg">

## Transformツールに新しいのが
あれ、前からあったっけ？
<img width="270" alt="スクリーンショット 2018-12-17 23.02.21.png" src="https://qiita-image-store.s3.amazonaws.com/0/278474/77f828f7-6742-73fc-ee92-b3e264cc9aa8.png">

## UIElements Debugger
なんだこれ
<img width="326" alt="スクリーンショット 2018-12-17 23.03.20.png" src="https://qiita-image-store.s3.amazonaws.com/0/278474/e5ca785c-66a0-2c7f-34b6-2b7c431e9094.png">

<img width="743" alt="スクリーンショット 2018-12-17 23.04.07.png" src="https://qiita-image-store.s3.amazonaws.com/0/278474/f5c479ef-2a39-c3cf-2671-c0332377054d.png">
<img width="719" alt="スクリーンショット 2018-12-17 23.04.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/278474/14db5f35-7dc9-e692-1fe3-100137746af8.png">

## TextMeshPro uGUIのinspector変わってる
<img width="210" alt="スクリーンショット 2018-12-17 23.05.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/278474/fef5fa44-2640-1e25-eaf6-b2ceb289e944.png">

## Preferences かっこいい！
<img width="668" alt="スクリーンショット 2018-12-17 23.07.27.png" src="https://qiita-image-store.s3.amazonaws.com/0/278474/e232c79c-7eb7-7396-3460-3d0e14d96add.png">
ショートカット編集嬉しい。ちょっと使いにくそうだけど
<img width="660" alt="スクリーンショット 2018-12-17 23.08.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/278474/b58772d8-5875-080c-9ab8-0984489dc191.png">

## デフォルトで .Net 4.x Equivalentになってる
うれしい
<img width="380" alt="スクリーンショット 2018-12-17 23.09.27.png" src="https://qiita-image-store.s3.amazonaws.com/0/278474/de9d60bc-16de-007d-5c74-882c125deda2.png">


## Clear All PlayerPrefs 
前からあったのかな？地味に嬉しい機能
<img width="309" alt="スクリーンショット 2018-12-17 23.10.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/278474/6e4414b1-860b-8f62-0bac-b1a3bb3f0459.png">
macos + python3.7.1 + virtualenv + Visual Studio Code での開発

やりたいこと

* Visual Sutio CodeのPython実行環境をきちんと `Virtualenv` の環境を引き継いだ状態で使いたい。

ということです。

環境が`Mojave` なのですが, `Python3.7.1` がうまく `pyenv` から入らなかったのですが詳しく調べてないです。なので `Python3.7.1` は普通にサイト Cからダウンロードして導入しています。

# Install

* `pip install virtualenv` で導入
* Visual Studio Code も普通にサイトから導入


# 構成

だいたい以下の感じで

```
work/projectA
             /bin/activate
             main.py
```

Virtualenvのファイル自体は .gitignore で除外しておくようにしています。

```
cd work
virtualenv -p python3 projectA
```

Visual Studio Code を　`code` コマンドで実行できるようにします。Visual Studio Codeを起動した後に、`SHIFT`+`Option`+`P` でコマンドパレット　に shellと入力して　`code` で起動できるように設定します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/11540/a7db28a7-4a6b-a502-e418-5204b3816460.png)

次にターミナルからプロジェクトのディレクトリから `code` コマンドで起動します。その後インタプリタから選択することができます。 `./bin/python` 

![image.png](https://qiita-image-store.s3.amazonaws.com/0/11540/258055de-3a05-851a-d1e8-cc40128c8db8.png)

# memo

* 別の環境では普通に `pyenv` 利用してVisualSudioCodeからみると環境のところに　`(xxxx)python` という感じで 正しいと思われる表示になっていたのですがそのように今回は設定できなかったのでメモがてらに残しておきます。
* どうしても思い通りにならないときに参考になればと思います。

# Tips

環境をふと間違えると嫌なのでたいていなんらかの仮想環境になるように zshrc でシェル(activate)を読み込むようにしています。
まだER図の管理で消耗してるの？ SchemaSpy でER図を自動生成して管理する　


はじめまして。謎の集団ZeneloでDBAやらSREの見習いをやっている者です。
初めてQiitaを書くので、煽りタイトルの割には駄文かつかなり内容が薄いですがご了承ください。 :bow: 

## ER図を手で管理するのはつらい
現在、謎の集団zeneloではER図を [ERMaster](http://ermaster.sourceforge.net/content/manual/ja/index.html) というツールで管理している。 ERMasterは細かい部分までER図を表現できる素晴らしいツールではあるが、Json型やDatetime(6)など対応していない為表現できない型があったり、Eclipseを開かなければならないなどいくつかの課題があります。

何より手で管理するのがつらく、 ER図を作成するのは、SRE用語で言うトイルにあたる作業である為、
SREを志す身としては、このトイルを撲滅したいと思い、何か良いツールがないかを探していました。

## そこでSchemaSpyの登場


[SchemaSpy](https://github.com/schemaspy/schemaspy)とは、指定したDatabaseのテーブルの情報(ColumnやIndex)や、リレーション(ER図)などをよしなにhtmlに出力してくれるツールです。

あのメルペイ様でも使用事例があり、CircleCIで自動生成しているそうです。
https://tech.mercari.com/entry/2018/05/25/133818

また、githubの「database-diagrams」タグで一番のスター数であり、開発も盛んに行われているようです。
https://github.com/topics/database-diagrams



## SchemaSpyのいいところ
### UIがキレイ
この手のツールは一昔前の堅苦しいUIのイメージ(偏見)ですが、今風のUIでとても見やすいです。

サンプルのリンク
http://schemaspy.org/sample/index.html

### docker run で作成できる
schemaspyは、dockerのimageを予め提供してくれているので、dockerを実行できる環境さえあれば、以下のコマンドで一発で作成できる。
これによりcodebuildなどのCI上で実行することにより、ER図の自動生成をすることができる。

```
docker run -v "$PWD/schema:/output" --net="host" schemaspy/schemaspy:6.1.0 -t mysql -host $ENDPOINT:3306 -db $DB_NAME -u $DB_USER -p $DB_PASSWORD -connprops useSSL\\=false -s information_schema 
```
※ バージョンは2020/05/25現在最新のバージョンの6.1.0を指定

使い方は以下のQiitaの記事がわかりやすかったです。

https://qiita.com/kamukiriri/items/ab1669c19831c18db9ee
https://qiita.com/miurabo/items/9cd5826db0018177db6d

### 指定したテーブルの関連する部分だけ表示させてくれる
見たいテーブルをクリックすると、そのテーブルと直接関係をもつテーブルだけを表示してくれます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/202479/48365639-ce62-3ea1-7f35-ce70724246d7.png)
しかも、各関連テーブルはリンクになっていて、クリックするとそのテーブルの詳細ページに飛べるようになっています。
複数のテーブルを管理するDBの場合、一般的なER図のツールではテーブルが多すぎて何を見ればいいのかわからなくなる場合があるのでとても助かる機能です。

もちろん全体図も表示することも可能。
http://schemaspy.org/sample/relationships.html

## 最後に
codebuildなどと組み合わせて、トリガーが発動したら、ER図を生成して、S3にpublishする仕組みを作ればER図を管理する苦労から開放されます。　~~あの重いEclipseを開かなくてよくなる。~~ ERMasterからの移行はまだできていませんが、AWSリソースを用いた仕組みの部分についてはまた後日書こうかなと思います。
Circle CI 2.0を(過度に)使わない

## はじめに

いきなりですが私の考える `config.yml` の理想形は以下になります。

```
version: 2
jobs:
  build:
    working_directory: /xxx/
    docker:
      - image: aaa/bbb
    steps:
      - checkout
      - run:
          command: make ci
```


なぜこれが理想形なのかというと、Circle CI 2.0ではソースコードの変更検知、チェックアウト、コマンド実行、結果通知だけに徹するべきであり、その他の責務については適切な他のツールが担うべきだと考えているためです。

責務を意識して適切にツールを採用していくと、以下のメリットが得られます。

- 特定のCIツールを過度に学習する必要がなくなる
- 特定のCIおじさんだけではなく開発者全員がメンテナンスできるようになる
- CIツールとエンジニアから共通のスクリプトが実行される
- その結果、スクリプトがメンテされる状況を維持できる
- 別のCIツールに移行できる


## ツールの採用

CIで実施する処理は以下になりますが、`config.yml` には直接書かずに適切なツールで実現します。

- ソースコード変更検知
- 実行環境の準備
- 実行環境に必要なツールの準備
- ソースコードの準備
- ビルド、テスト、デプロイ
- 結果通知
- 上記の制御

### ソースコードの変更検知
これはすべてのCIツールに搭載されている機能だと思います。
変更があったタイミングでCIが走ります。

### 実行環境の準備
実行環境はDockerイメージで実現します。
これは必ずそうなるでしょう。

### 実行環境に必要なツールの準備

必要なツールはDockerイメージにあらかじめインストールしておくことが大切です。
`config.yml` にインストール手順を記述してしまうことは、やりがちですが避けたほうがいいです。

何故ならCIを実行するたびにツールをインストールするとCIの実行完了が遅くなります。
またツールのインストールで遅くならないためにキャッシュの処理を書くことはやりがちですがやるべきではありません。これによりCircle CI 2.0への依存が大きくなりメンテナンスのコストが上がります。

さらに `config.yml` にインストール手順を記述してしまうと、各エンジニアの開発環境で実行環境を再現することが難しくなります。Dockerイメージを作成しておけばdocker pullするだけでCIと同様の実行環境が再現できるようになります。

以上のように実行環境の準備はDockerイメージに閉じるべきです。

続いて、鍵の情報やソースコードのようなプロジェクト固有の情報はDockerイメージに含めないことが大切です。
可能な限りこれらの情報はリポジトリに配置し、それも難しい場合にはCircle CI 2.0の環境変数として設定しましょう。
こうすることでDockerイメージが公開可能になりCircle CIからの認証が不要になるというメリットもあります。

### ソースコードの準備
Githubなどからリポジトリを取得することになります。
これは必ずそうなるでしょう。


### ビルド、テスト、デプロイ
具体的なビルド、テスト、デプロイ手順を `config.yml` に記載することは避けるべきです。

コマンドの情報や特にそのオプション引数に渡す情報は、`config.yml` ではなく、別途 `ci.sh` のようなShellscriptに記載しておき、それを実行します。
そうすることでCIで必要なフローを開発者が容易に実行可能になります。またShellscriptとして構成管理されるようになるため、処理を追いやすくなります。
もちろん状況に合わせてShellscript以外のChefやAnsibleなどの構成管理ツールを使うといいでしょう。

また別途Makefileなどを作成して、それを `config.yml` から実行するようにすると、各エンジニアがCIとまったく同じビルド、テスト、デプロイを1コマンドで実現することができます。

```
# エンジニアもCircle CIも以下のコマンドを実行することでビルド、テスト、デプロイができるようになる
make ci
```

## 結果通知
結果通知はCircle CI 2.0の通知を利用することで十分だと思います。
CIの途中で通知が必要ならば、別途スクリプトを作成してShellscriptから実行する手もあるでしょう。

## 構成のイメージ

### ディレクトリツリー

build.shやdeploy.shはCIでも日常の開発でも利用されます。

```
proj
├── Makefile
├── scripts/
│   ├── build.sh
│   ├── ci.sh # build.shとdeploy.shを実行
│   ├── deploy.sh
│   └── test.sh
└── src/
```

### Makefile

Makefileは人間のためのインターフェースとして割り切るべきです。
Makefileは手続きを書くためのツールとしては向いていないため、手続きはスクリプトに記載しましょう。

またMakefileはREADMEとしても機能します。

```
ci: 
  ci.sh

build:
  build.sh

test:
  test.sh

deploy_prod:
  deploy.sh prod

deploy_dev:
  deploy.sh dev
```

CI固有のフロー制御などがなければ以下のようになっていることが理想的です。

```
ci: build deploy
```

## まとめ


| 責務 | ツール |
|:-----------|:------------|
|ソースコード変更検知|Circle CI 2.0|
|実行環境の準備|DockerイメージのPull|
|実行環境に必要なツールの準備|DockerイメージのPull|
|ソースコードの準備(プロジェクト固有情報)|GithubからPull|
|ビルド、テスト、デプロイ|Makefileを経由してスクリプトを実行|
|結果通知|Circle CI 2.0|
|上記の制御|Circle CI 2.0|

<img width="825" alt="スクリーンショット 2018-12-17 22.58.17.png" src="https://qiita-image-store.s3.amazonaws.com/0/54186/09a13ca0-8050-483d-c3c6-557825d94fd5.png">
半角スペースで改行してしまう！？のを解決しよう（Unity）

#表示する文字の間に半角スペース入れたら改行しちゃった！？
Unityは、日本語を『長い１単語』と認識しています。恐らく半角スペースから次の半角スペースまでで１語という処理なんでしょうね。英語圏が本国だしね、まぁ英語用の処理になってます。

#どうやって対策しよう
世の中にはnbsp、つまりノーブレークスペースというのがあります。コイツは『スペースと認識されないスペース』です。つまり改行されない。
文字列中の半角スペースに対してコイツをReplaceしてやれば解決ですね。

text=text.Replace(" ", "\u00A0");

こんだけ。
何も考えずに作ってると意外と見落としてて後で『表示が変だ！』ってなって発生個所を確認するのが面倒なので、文字列を扱う前に

string TextFix(string text)
{return text.Replace(" ", "\u00A0");}

なんて関数を作っておいて使うようにすれば手軽に回避できますね。

2020/1/20追記
当初はnbspを直接入力する形で書いていたのですが、どうも環境によってただの半角スペースとして認識されるっぽいので文字コードのままで入れる形に例文を修正しました。
ConoHaのVPS ログイン画面ではまず 2015年〜 をクリック

[ConoHa Advent Calendar 2018](https://qiita.com/advent-calendar/2018/conoha)

うちはConoHaアドベントカレンダー2018 18日目

昨日の記事は @waxsd100 さんの
[ConoHaWING もしかしたら色々と凄いかもしれないのでMisskey入れようとしてみた](https://qiita.com/waxsd100/items/0f9bdf61a1a242f4bce9)


###偶然、Misskeyに触れてる記事が昨日あったので
ふうむ、、、WING特有の制約でなのでしょうか。


>やっぱり権限や制限的な問題でMongoDBと繋げられることはできない見たいですね。
>
>まぁもしできたとしても次に
>基本的に外部との80，443以外のポート番号通信できない&リバースプロキシできない、という壁があるのでどっちにしろMisskeyを立ち上げられても外部から見れないという問題があります。

VPSでならMongoDBなども入れて2GBプランの環境でインストール、更新取り込みに伴うビルド作業、インスタンス稼働を完結させて運用することが可能で実際に運用しています。(ウチはアカウント新規登録をいまは受け付けておりませんが、、)
VPS環境でインスタンス立ち上げにご興味がある方は、
[https://github.com/syuilo/misskey/blob/develop/docs/setup.ja.md](https://github.com/syuilo/misskey/blob/develop/docs/setup.ja.md)
[https://github.com/mei23/memo/blob/master/misskey/Setup-Ubuntu1804-Quick.md](https://github.com/mei23/memo/blob/master/misskey/Setup-Ubuntu1804-Quick.md)
[https://joinmisskey.github.io/ja/](https://joinmisskey.github.io/ja/)
やqiita内記事を参考に頑張ってください。

今回は特にMisskeyを取り上げる予定ではなかったので軽い誘導だけです。

###ログインについてなど
はい。うちは技術や知識が何もないのですが、VPS使っている歴はそこそこ長いお付き合いなので振り返りなどなどでお茶を濁します。以降は基本的に全てVPSのお話です。
ログインは 2015年〜 というとても辛いリンクをクリックして行います。このはちゃんが清楚かわいいので問題ありません。
![login2.png](https://qiita-image-store.s3.amazonaws.com/0/5118/0eeab723-4a16-3ead-54ac-8e25e43aa2e6.png)

最新情報をチェックしていると新しいテンプレートエンジンが追加〜などのニュースがよくあります。素晴らしい開発速度です。ですが旧仕様登録のユーザーでは選択できない制約があったりして悲しい思いをすることがあります。そんなときは画面右上のモード選択で、このはを選択しましょう。
![mode.png](https://qiita-image-store.s3.amazonaws.com/0/5118/18802448-d7c2-82f9-7e74-995a06a77b67.png)
多少の制約はこのはちゃんが清楚かわいいので何も問題ありません。使いたいものがあるのなら自分でインストールするのです。そのほうが清楚かわいいこのはちゃんをより長い時間触ることが出来ます。
(とはいえども本音では新しい方に統合されたいです。。。)
OSやテンプレートエンジンの選択の幅、料金が定額&日割り可能など柔軟さ、このはちゃん清楚かわいいなど国内業者ではかなりおすすめですよ！(日割りなので何かが違ったら即日やめられますし) 
海外業者は、、まぁ英語とかに問題がなくてよく確認した上で利用できるなら問題ないのかなと。AWSは何か事故すると課金額が膨れ上がるのとか、ubuntu使った時にAWSの独自の挙動とかに苦戦した記憶があります。個人の技術の問題なのでAWSのが良い場合はそれはそうなのかなと思います。
また、課金しないでもそれherokuで無料で運用できるじゃないの？？みたいなことも特に考えることなく複数詰め込むことが出来たり、スリープ対策がいらなかったりなども個人ではメリットかな、と思ってます。twitterやdiscord、Misskeyのbotなど(slackは試してないのでわかりません)複数同時運用も清楚かわいいこのはちゃんなら問題ありません。(ですけどtwitterのbotは現在は作りにくくなったらしいですし、これからもどんなハードル上げがあるかわからないので新しく始めるのは、、、、頑張ってください。。)

###使用した履歴
私個人がこれまで清楚かわいいこのはちゃんを使ってきたら歴史では、
・wordpressでちまちまブログ更新したり(はてなに移住したのでもうwordpressはもうやってないです)
・画像アップローダにしたり(もうやってないです)
・twitterのbotで再生中の音楽や天気予報、見たいアニメのリマインド機能(このbot機能はtwitterからdiscordに移住してたりします)
・codeforcesというサイトの成績を表示するblogパーツ(codeforcesは最近はログインしてないのでほぼ無意味になってます)
・redmineやgitlabインストールしたり(これらはあまり活用せずに消えていきました)
・Misskeyインスタンスを立てたり(これは現在も稼働中です)

###最後に
19日目予定は @kanpapa さんです。よろしくお願いします。

###最後の最後に
公式サイトのトップページで現在の情報など確認しようと思って左上のConoHaをポチッとクリックしたらリンクでも何でもなかったのであわわあわわしました。
![left.png](https://qiita-image-store.s3.amazonaws.com/0/5118/1ee75af9-9619-17c4-bdae-9635ae0d61e8.png)
ですけどそれはそれで別にリンク無しで何も困りません。
このはちゃん清楚かわいい
抽象構文木（AST）を立ててみる

プログラム言語などの操作を行う上で、欠かせないデータ構造が抽象構文木（AST）です。

## 文法構造の特徴

多くのプログラミング言語は文脈自由文法に従って書かれるものですが、これは同じ構造のネストが可能となっています。

* 数式におけるカッコのネスト
* 連想配列の中に連想配列が入るようなネスト
* HTMLなどでのタグのネスト

というように、各種のデータ構造に普遍的に存在する構造です。

## 抽象構文木って…？

名前は仰々しいのですが、構文構造をデータ構造に起こしたものが抽象構文木です。DOMツリーもその1つと言って間違いはありません。

なお、「抽象」は「カッコなどを取っ払って、元のコードに完全に戻すことができない」という意味で、文法的意味を完全に保つ程度には具体的です。

## 実際にやってみた例

以前に、「同じオブジェクトを入れればキーの順序を含めて同じJSONを作る」ような`JSON.stringify`が必要になったことがあって、[jkr2255/sorted-json-stringify](https://github.com/jkr2255/sorted-json-stringify/)として作成しました。JSONは

* `true`/`false`
* `null`
* 文字列
* 数値
* 配列
* オブジェクト

の組み合わせですが、並べ替えに必要なのはオブジェクトのキーだけなので、そこだけうまく取り出すようにして、文字列の値のエンコード・デコードすらサボっています。

## JavaScriptのAST

JavaScriptでは、ASTが標準化されて、ASTレベルで加工していくことが一般化しているという、独自の文化圏となっています。このあたりも掘り下げてみると面白そうです（半ば投げやり）。
Mac を買ったら最初にやりたい最低限の初期設定

「パソコンの設定」というものは多くの場合好みの問題なのであれこれ言いたくないのだけれど、とはいえ Mac を初めて使う初心者を目の前にしたら「とりあえずこれだけは設定しておこうな？」と言いたくなる設定項目がいくつかある。

他にもオススメの設定やアプリはいくらでもあるけど、その中でも「あまり好みによるものではなく万人にやってほしい設定」を厳選したので、Mac 初心者にはぜひ参考にしてもらいたい。

## トラックパッドの設定
Mac を使う理由の半分は「ハードウェアと OS が密に連携することによる操作性の良さ」で、特にトラックパッドの使いやすさは尋常ではない。

Mac を使うのであればトラックパッドを使いこなせるようになった方がいい。

### タップでクリックできるようにする
`システム環境設定` > `トラックパッド` > `タップでクリック` にチェックを入れる

macOS の初期設定ではトラックパッドを「カチッ」っとなるまで押しこむことでクリックするようになっているが、これはおそらくトラックパッドに慣れていない (マウス操作に慣れている) 初心者向けの設定。このままでは使いづらく、シングルタップだけでクリックできるように慣れてしまった方が圧倒的に操作性がいい。慣れるのも簡単なので、Mac を買ったらまず真っ先にこの設定をしたい。

### カーソルの移動量を増やす
`システム環境設定` > `トラックパッド` > `軌道の速さ` を速めにする

これはトラックパッドの操作に慣れてからでもいいと思うが、軌道の速さは速めにしたほうがいい。Mac のトラックパッドは微妙な指の動きもちゃんと認識してくれるので、軌道の速さを最大にしても細かい操作で困ることはない。むしろ軌道の速さを速くしておくことで少しの指の動きだけで画面全体をカーソル移動できるようになって非常に便利。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/16369/dcc2c939-0826-c666-104c-740c41c17799.png)

### 3本指でドラッグできるようにする
これも便利なので是非設定したい項目。

しかしこれはなぜかトラックパッドの設定ではなく、 `システム環境設定` > `アクセシビリティ` > `ポインタコントロール` > `トラックパッドオプション...` > `ドラッグを有効にする` とかなり見つけにくい場所にある。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16369/ec4d7c26-3690-5bab-ac83-23a2c4a936fa.png)


## キーボードの設定

### Caps Lock を無効にする
`システム環境設定` > `キーボード` > `キーボード` > `修飾キー` > `Caps Lock キー` に `Control` を割り当て

`Caps Lock` をマトモに使ってる人ってどれだけいるのだろうか・・・。少なくとも自分は全く使わないし、むしろ誤って押してしまうので邪魔でしかない。逆に頻繁に使う `^control` キーが押しづらい位置にあるので `Caps Lock` キーは `^control` に割り当てて利用している。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/16369/26c1cc8a-9427-7fd0-0922-ce8e78222eb3.png)

### 日本語を入力ソースを設定する
`システム環境設定` > `キーボード` > `入力ソース` > `+` > `日本語`

入力ソースは `日本語` だけで 英数/かな を両方入力できるので、 `U.S.` などの入力ソースは消しても問題ない。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/16369/57b76527-3849-7d23-f13b-b2321cc1320f.png)

macOS 標準の日本語 IM は正直ちょっと使いづらいのだけど、以下の設定をすると多少はマシになる。

- `ライブ変換` をオフにする
    - ライブ変換は入力している途中でも次々と変換されていく機能
    - これは好みあるかもしれない、自分は要らないのオフにしている
- `Windows風のキー操作` をオンにする
    - これをオンにしないと変換を確定するために Enter を二回押さないといけなかったりして面倒
- `"¥"キーで入力する文字` を `\ (バックスラッシュ)` にする
    - 開発者だと特に `\` を入力する機会が多いので、この設定はしておいた方がよさそう

それでもまだ使いづらいという場合は、もう [Google 日本語入力](https://www.google.co.jp/ime/) を入れるしかない。

### (US 配列の場合) `⌘command` キー単押しで切り替えれるようにする
キーボードが JIS 配列の場合は `英数` `かな` キーがあるので切り替えに困ることはないが、US 配列を使っている場合は `^control` + `space` で切り替えなければならず、このショートカットキーはあまり使い勝手がいいとは言えない。

そこで [⌘英かな](https://ei-kana.appspot.com) というツールを入れると、左 `⌘command` キー単押しで `英数`、右 `⌘command` キー単押しで `かな` として動作させることができるようになる。

また、より複雑にキーマッピングをカスタマイズしたい場合には [Karabiner Elements](https://pqrs.org/osx/karabiner/) というツールもある。

### ダイアログをキーボードからキャンセルできるように設定する
[\(macOS 小ネタ\) ダイアログをキーボードからキャンセルできるように設定する \- Qiita](https://qiita.com/hoto17296/items/afc6ff4dfdd3b5f9db07)

これは好みが分かれそう。
「すべてキーボードで操作したい」という人は是非。

## (開発者のみ) 開発関連ツールをインストールする
ターミナルから `xcode-select --install` で Command Line Tools をインストールできる。Command Line Tools には `git` や `gcc` などの開発関連コマンドが含まれていて、開発者ならとりあえず最初にこれを入れておけという感じ。

[Homebrew](https://brew.sh/index_ja) を入れる際にもこの Command Line Tools があらかじめインストールされている必要がある。
来年度Jsys19に導入したい"RDD"を紹介してみる

この記事は[Jsys Advent Calendar 2018](https://adventar.org/calendars/3323#list-2018-12-13)の第16日目の記事です。


どうも、Jsys 1年、にー兄さんです。遅れてしまって申し訳ございません(汗)
ブログで書こうかも迷ったのですが、今回は慣れ親しんだQiitaで書かせていただきます。

さて本記事では、「来年度Jsys19に導入したい"RDD"を紹介してみる」というテーマでお送りいたします。
実際にJsys18で初めて本格的なチーム開発を経験し、感じたことは多々ありました。
良い機会なので、それらも含め来年度の開発に向けて「これ使いたい！」と思った、ある技術について紹介できればいいなと思います。

前置きが長くなりましたが、最後までお付き合いいただけると光栄です。よろしくお願いします。

# 学園祭を終えた感想

チーム開発と言えば、GitHubは必須ですね。gitやGitHub自体は前から使っていたものの、個人開発ではバージョン管理さえできればいいので、ブランチを切るのも`master`と`develop`くらいでした。中途半端に一人でissueとかプルリクとか上げてみたりしてましたが、結局Closeするのもマージするのも自分だし、最終的には`master`でベタベタ書いてしまうなんてこともしばしば。(いけない)
そんなこともあり、自分のアカウント名がついたブランチのコミットがぐんぐん伸びていく様子を見ると頑張ってる実感ができたのは嬉しかったです。
とはいえ不慣れなところが多かったので、コンフリクトも結構起こしましたし、ブランチの扱いとかコミットメッセージとかもテキトーなところが多かったと思います。

ところで、今回の開発で困ったことがありました。コーディングが始まった頃の話ですが、「あれ、何すればいいんだろう」と思うことがあったのです。素直に先輩に聞けばいいのですが、なんというか、「どれを見ればいいのか」「どこまでが自分の仕事なのか」「果たしてこんなこと聞いていいのか（Slackの発言とか結構気にするタイプ）」みたいなよくわからない疑問というか、変に気を遣ってしまっているだけではないと思いますが、そういう状態に陥ってしまうことがありました。そうなると開発は進みませんから当然モチベーションも落ちます。一時期Nuxtのコードを見るのも嫌な時期がありました(ご迷惑をおかけしました)
そんなこともあり、来年の体制には何が必要なのかと考えました。考えた末、たどり着いた答えは「ドキュメントの充実」でした。

# 学生プログラマにこそ、ドキュメントあれ

ドキュメントの充実という結論に至った時、頭をよぎったのは**RDD**でした。
RDDとは、**README Driven Development**の略で、字のごとく「READMEを大切にして開発していく手法」の事です。この記事を見ている方には説明不要かもしれませんが、READMEとはプロジェクトの概要（About/Description）、使用方法（Usage）、要件（Installation）、ライセンス（License）などの情報を記した、一般的にはマークダウンで書かれたドキュメントの事です。
自分もまだ完全に理解したわけではないのですが、READMEを書く→開発という流れをとります。READMEってどのタイミングで書くのが正解なのか、自分もわからず開発していましたが、この手法では明確に決まっています。

RDDに関する素晴らしい記事が以下にあります。

- [Readme駆動開発を和訳してみた](https://qiita.com/syossan27/items/38e2f4b7f0dc74207dc9)
- [わかりやすい README 駆動開発](https://qiita.com/b4b4r07/items/c80d53db9a0fd59086ec)


## RDDのメリット

RDDのメリットについて引用させていただくと、

- モチベーションが高いときに書ける
- 要件定義につながる

と紹介されています。

確かにドキュメントを書くというのはめんどくさい行為です。逆に言うと、ドキュメントを書けるくらい余裕がある時を有効活用できるのはとても素晴らしいですね。結局何かしらの形でドキュメントにするのであれば、書けるときに少しづつ書いていくのが得策でしょう。
それと、ドキュメントを書いているときって「今からこんなサービスを作るぞ！」という気持ちで書くのでやる気もアップしますね。

## 学生プログラマにとってのドキュメント指向

私がRDDをお勧めするのは、↑に書いてあるメリット以外にも、私たち学生プログラマならではのメリットも考えられると思います。

### 入門者にやさしい
まぁ当たり前と言えば当たり前なんですけど、多くの学生プログラマはプログラマ歴が短いです。実際にJsys18の中にも初めてHTMLやCSSを書いた人も多かったですよね。私が思うに、いわば入門者や初心者と呼ばれる学生にこそドキュメントの読み書きをして欲しいのです。常々思うことなのですが、大学から何かを始めた人って習得がめちゃくちゃ早くてびっくりするんですよね。だから伸びの大きい時期に本格的なチーム開発に参加できるなんて、本当はすごく贅沢で貴重な体験なわけです。

ドキュメントを書けるということは、ある程度そのことについて知見がなくてはなりませんから、書いている最中に頭の中で情報が整理されるという経過があります。しかも、そのドキュメントは自分と同じ世代の人が書いたものですから、もしかすると同じバグを踏んでいたり、手こずっていたりするかもしれません。自分と同じ状況の人がいるってだけで安心しますし、その解決方法が載っていれば、一層開発が捗るはずです。

### ドキュメントを書く習慣が身につく

前項と同じ内容が含まれますが、「書く」ということに焦点を当てて考えてみます。
私自身もこの記事を執筆しているので感じているのですが、文書に起こすというのは結構大変です。そういう感覚を身に着けるのも大事なことだと思います。

### お堅いこと書かなくてもいいんじゃない？

これはメリットと言えるか微妙なのですね...w 私たちは学生です。会社員じゃありません。べつにどのドキュメントも正式なものである必要はありませんし、外部に公開しないのであれば、自分たちさえ内容を把握できれば良いのです。そうなるとフランクな感じで書いてもいいんじゃないかと思います。いつもの通り、Jsysの和気あいあいとした内輪ネタで盛り上がろうじゃありませんか。

# 最後に

今回は以上となります。RDDを取り入れた開発が来年のできたらいいなぁという妄想記事でした。
最後まで読んでいただき、ありがとうございました。
EC-CUBE4にオーナーズストアからコマンドでプラグインをインストールする


EC-CUBE4ではpluginの依存関係をcomposerで管理している。
以下のコマンドを利用することでオーナーズストアのAPI経由でプラグインをインストールできる。

先に有効な認証キーを設定しておく。

```sql:SQLの例
update dtb_base_info set authentication_key='xxxxxxxxxxxxxxxx';
```

EC-CUBE4の以下のコマンドを利用する。

```sh:プラグインのインストール
bin/console eccube:composer:require
```

実行例

```sh:実行例
bin/console eccube:composer:require "ec-cube/RelatedProduct4:^4.0"
bin/console eccube:composer:require "ec-cube/Recommend4:^4.0"
```

プラグインの依存関係の解決等でインストールには少し時間がかかる。