OmniAICreator/Qiita-1.07M huggingface dataset:
Gulpを使ってwordpressのテーマを作成

MAMPでwordpress環境を作り、gulpを使いテーマを作る環境を作ることにする。

#用意するもの
タスクランナー（gulp）
wordpress環境（MAMP）

## wordpressを構築
MAMPをインストールして、ローカルサーバーの設定（ルート）と
データベース作成する。
<img width="995" alt="スクリーンショット 2019-07-06 0.51.03.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/376588/2e9c2ae1-5e52-a3ac-544a-36acc1a04bf9.png">

ルートに設定したディレクトリにwpのファイルを格納
<img width="754" alt="スクリーンショット 2019-07-06 0.55.58.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/376588/515ecbff-5228-4a6e-5634-03649f7970e7.png">

ルートのパスを叩くとwordpressのインスールをするためのデータベース設定あるので
データベース名,port,host,password,メールアドレス等を入れていきます。
<img width="590" alt="スクリーンショット 2019-07-06 1.16.50.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/376588/1d9a02b9-9b50-7816-431b-7f6a71f17bd5.png">
<img width="785" alt="スクリーンショット 2019-07-06 1.13.40.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/376588/dd494405-a944-a117-25c5-2148eb47ffe3.png">

データベースの設定が終わるとwordpressがインストールされます。無事にインストールされたら設定にいき、アドレスをメモしておきます。
<img width="807" alt="スクリーンショット 2019-07-06 1.16.34.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/376588/677faa13-09fb-3e96-bbf2-a1d1a799127e.png">

## タスクランナーの設定
タスクランナーはテーマディレクトリで動かします。
node.js gulpのインストールは割愛します。
<img width="641" alt="スクリーンショット 2019-07-06 1.50.34.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/376588/8fcffa92-307d-323d-91b8-947c405f4d59.png">

必要なプラグインはプロキシの設定ができるローカルサーバーです。その結果browserSyncを選びました。
`$ npm i -D browser-sync`

gulpのタスクを書きます。htmlなど静的なファイルはoptionの設定で**server**を選び制作するらしいですが、
それだとphpは更新されないためoptionでは**server**ではなく**proxy**で設定するようです。
<img width="347" alt="スクリーンショット 2019-07-06 1.35.33.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/376588/fb774b41-ee9a-0f7c-2033-5dd26ea5d660.png">
タスクを実行するとローカルサーバーが立ち上がり、proxyで設定したwordpressが表示されます。

個人的に、このほかにsassやjavascriptのためのタスクを入れ、watchタスクで監視しています。そして、cssやphpなどテーマファイルに更新があればbrowserSyncリロードのタスクが発動します。


プロキシで設定するだけなんですね、、、どんだけ〜　ってくらいここまでくるのに
時間かかりました。とほほ、、、、、

**参考**
[いまさら始めるGulpでWordPressテーマ開発](https://olein-design.com/blog/gulp-wp-starter）
IntelliJのPluginをバージョンを指定してインストールする

## 概要
IntelliJのプラグインをバージョンを指定してインストールする方法をまとめました。
調べてもすぐに出てこなかったので、メモとして残します。

## 背景
[HashiCorp Terraform / HCL language support JetBrains](https://plugins.jetbrains.com/plugin/7808-hashicorp-terraform--hcl-language-support/)プラグインの最新バージョンは`Terraform 0.12`に対応されていますが、使用しているTerraformのバージョンは`0.11.13`であり構文エラーが発生したため、`Terraform 0.12`に対応前の`0.6.14`バージョンをインストールしました。

なお、`Preferences`画面からインストールしようとすると最新バージョンしかインストールできませんでした。

## 手順

[HashiCorp Terraform / HCL language support JetBrains](https://plugins.jetbrains.com/plugin/7808-hashicorp-terraform--hcl-language-support/versions)からバージョンを指定してダウンロードします。

<img width="967" alt="スクリーンショット 2019-07-06 1.34.05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206741/17842481-079a-d93e-9f78-780c5e641a5c.png">

`Preferences` > `Plugin` > `install plugin from disk` を選択して、先ほどインストールしたZipファイルを選択します。

<img width="234" alt="スクリーンショット 2019-07-06 1.36.35.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206741/d156c2c9-b3db-352a-b803-bf06df0cdd7e.png">

これで、インストールは完了です。
【Laravel】タイムスタンプがないテーブルを更新する

#環境
・windows10
・PHP(7.3.6)
・Laravel(5.8.27)
・MariaDB


#問題
インスタンス作成
```$post = new App\post;
=> App\Post {#2960}
```
レコード挿入
```$post->title = 'title 1';
=> "title 1"
$post->body = 'body 1';
=> "body 1"
```
そしてsaveメソッド
```$post->save();
```
すると
Column not found: 1054 Unknown column ‘updated_at’ in ‘field list’
というエラー表示

#解決
こちらのサイトが参考になりました
・[【Laravel】タイムスタンプがないテーブルを更新（保存）する方法]
(https://nori-life.com/save-a-data-without-timestamps/)

上記エラーはupdated_atカラムとやらがないのが原因なので
日付情報を記録するタイムスタンプ機能を無効にすればいいらしい


``` $post->timestamps = false;
=> false
$post->save();
=> true
```
成功
AutoLayout優良記事まとめ

# コード
### 基本
**・[Xcode5の「Auto Layout」機能の使い方[制約の編集方法]](https://nanananande.helpfulness.jp/post-3100/)**
→`Attributes Inspector`のパラメータの説明が一覧で乗っていて辞書がわりに見たい
**・[怖くない！AutoLayout 〜多画面対応 with Storyboard〜 - Qiita](https://qiita.com/_ha1f/items/5c292bb6a4617da60d4f)**
→優しく基本が学べる
**・[Auto Layoutをコードから使おう](https://blog.personal-factory.com/2016/01/11/make-auto-layout-via-code/)**

### NSLayoutAnchor
**・[iOS 9で追加されたNSLayoutAnchor使うと簡単にわかりやすく間違えずにNSLayoutConstraint（制約）が作れます【Auto Layout】 - Qiita](https://qiita.com/yucovin/items/4bebcc7a8b1088b374c9)**
**・[[Swift 3.0]NSLayoutAnchorを用いたコードによるAuto Layout - Qiita](https://qiita.com/shindooo/items/36d2e8bf9d8ba3fa4ed5)**
**・[Auto Layoutをコードで書いてみた - Qiita](https://qiita.com/dddisk/items/8001598ea7951bcdcc30)**
**・[【swift4】【NSLayoutAnchor】 設定の順番とtopAnchorの％指定方法 - Qiita](https://qiita.com/Gokna/items/23886a6565f5e6b3f346#_reference-26a52d4af555e7bab04d)**

### priority(優先度)
**・[AutoLayoutのpriorityについてまとめてみた。 - ミネハルライフ](https://blog.hapinaru.com/tech/autolayoutpriority/)**
**・[AutoLayoutで優先度を設定する | ねこブログ](https://nekosoftware.wordpress.com/2014/10/02/autolayout%E3%81%A7%E5%84%AA%E5%85%88%E5%BA%A6%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%99%E3%82%8B/)**

### UI
**・[【AutoLayout】UILabelの幅を文字列の長さに合わせて可変にする方法 - Qiita](https://qiita.com/Simmon/items/0f3b82e98d56bd476f7a)**
→`不等号制約`の良い一例

# Storyboard
**・[[iOS 7] Xcode 5 で始める Auto Layout 入門 #2 – Interface Builder 編 ｜ DevelopersIO](https://dev.classmethod.jp/references/ios-7-xcode-5-auto-layout-2/)**
#### UIScrollView
**・[Storyboard 上で UIScrollView を AutoLayout を使って設定する - xykのブログ](http://xyk.hatenablog.com/entry/2017/03/08/125132)**
開発したサービス用のTwitterアカウントを1日で凍結させてしまった話。

## 追記
2019年7月6日夕方、Twitter凍結解除しました!

---
タイトルのまんまなんですけどね。

https://qiita.com/LiL-B/items/e4e8176b92f2c8340ca1
でPOSTした通り、現在6人人チームでサービス開発合宿を行っており、リリースに向けて公式Twitterアカウントを開設、運用していました。

そのアカウントはこちら。
https://twitter.com/LiLB_choitashi
~~※とある事情で凍結中。~~
解除できました！

## 凍結した理由について
個人開発でも企業でのサービス開発でも、新しいプロダクトを立ち上げるならTwitterアカウントの運用は必須になってきていると思います。

リリース後にアカウント開設じゃなくて、リリース前から事前登録促したり開発の進捗をシェアしてたりと、「リリース前からサービスのことを身近に感じられる」状況を作っているTwitterアカウントも増えています。

そこで僕たち「ちょいたしアプリLil'B!」でも、開発の進捗とか開発の様子などを皆さんに知ってもらうためのTwitterアカウントを作成しました。

- メンバー紹介
- 開発合宿の様子
- 開発中のドキュメントをちょいだし

など、いろいろなTweetをしていたんですが、誕生日を設定したことによってアカウントがロックされました。

![d30f1b3af03cb00a4a1388e2650bfe45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/455296/2a503247-4e03-173f-1bc5-c1ed14af9673.png)


「サービスを作るぞ！」ってなって、そのサービスをアカウントにしたTwitterアカウントを作ったら、誕生日の入力はリリース日にしたいじゃないですか。
だから、サービス開発着手日の今日、2019年7月5日を誕生日に設定したんです。

そしたら、このありさまです。
誕生日の入力によって、13歳未満のユーザーだと認識されれば瞬時にロックされてしまいました。

Google先生に聞いてみると、アカウント凍結の解除まで4週間かかるとのこと。

みなさん、サービスのTwitterアカウントを作るときは、誕生日入力はやめたほうがいいです。
4週間の無駄な時間を過ごすことになります。
orientation 優良記事まとめ

# 総合記事
`orientation`でつまづいたら、とりあえず最初はこれに目を通してみるといいかも
**・[iOSアプリのレイアウトを回転で変更するとき注意していること - Qiita](https://qiita.com/kazuhiro4949/items/2d2f6f1636f0baed2341)**
**・[iOSでの各回転検知方法とその結果 - Qiita](https://qiita.com/www51k/items/7be9abff8f6efea5748e)**

# UIInterfaceOrientation, UIDeviceOrientation
**・[Swiftで端末の向きが変わったことを検知する。 - プログラムを書こう！](https://paveway.hatenablog.com/entry/2018/12/30/swift_deviceorientation)**
**・[【iOS】画面の向き（Orientation）を特定のページのみで制限したり許可したりしたい【supportedInterfaceOrientations】 - DRYな備忘録](http://otiai10.hatenablog.com/entry/2016/09/19/044605)**
**・[iOSTraining/1-3_Supporting-Multiple-Interface-Orientations.md at master · mixi-inc/iOSTraining](https://github.com/mixi-inc/iOSTraining/blob/master/Swift/pages/day2/1-3_Supporting-Multiple-Interface-Orientations.md)**
**・[【Swift4】特定の画面で回転を制御する方法について、サンプルを作って理解する - Qiita](https://qiita.com/orimomo/items/6ab57c6706a8dbc181a1)**
**・[iOS で Landscape モードのみサポートする - Qiita](https://qiita.com/codelynx/items/e68252153bcaed9a3784)**
**・[UIInterfaceOrientationMaskで縦画面だけ許可する[Swift4] : 永遠日誌](http://blog.livedoor.jp/eienf/archives/1069071485.html)**
**・[iOS6.0以降の回転制御について | まるーんの開発備忘録](http://miblog.guruguruheadslab.com/archives/63)**
**・[supportedInterfaceOrientationsForが呼ばれない -Swift4 | あんまり長いことは書けないブログ](https://off.tokyo/blog/supportedinterfaceorientationsfor%E3%81%8C%E5%91%BC%E3%81%B0%E3%82%8C%E3%81%AA%E3%81%84-swift4/)**


# UITraitCollection
**・[【swift4】UITraitCollectionと仲良くなる(AdaptiveUIに対応する方法を考える) - Qiita](https://qiita.com/shiz/items/dcef8abf7b90449edc3b)**
**・[[iOS 8] マルチデバイス対応の新機能「Trait Collection」 ｜ DevelopersIO](https://dev.classmethod.jp/references/ios8-trait-collection/)**
**・[iOS:画面の向き、大きさ、端末によって表示を変える - Qiita](https://qiita.com/on0z/items/f3a8c3aab2c8f9f8e491)**

# ライフサイクル
制約の更新のタイミングなどの参考になるかも

**・[基礎からやりなおしメモ 【ライフサイクルと記述ルール】 - Qiita](https://qiita.com/yuri_RN/items/8ff47aac98dbf6c9dc7a)**
**・[UIViewにおけるレイアウトのライフサイクル - Qiita](https://qiita.com/shoheiyokoyama/items/2f76938dffa845130acc)**
**・[ios – 向きの変更後にUIViewフレームが更新されない - コードログ](https://codeday.me/jp/qa/20190407/574428.html)**

# RxSwift
`RxSwift`の場合、`Binder`で独自の`orientation`という変数が定義されており
それを使うっぽいのでややこしくなりがち？
**・[How to observe orientation change with RxSwift · Issue #783 · ReactiveX/RxSwift](https://github.com/ReactiveX/RxSwift/issues/783)**

# 動画
**・[iOS - [Swift]動画を横画面で再生｜teratail](https://teratail.com/questions/9741)**
ソフトウェアライスタライザ実装 その2 (クリッピング)

[ソフトウェアライスタライザ実装 その1 (頂点処理)](https://qiita.com/N-H-Shimada/items/8d4d328a3b95176c2347)の続きです。
クリッピングの処理について扱います。クリップ座標系の理解・クリッピングアルゴリズムについて詳しく書きます。
(今回も[三葉レイさんの動画](https://www.youtube.com/watch?v=gQx4PyKpQh0)を参照・引用しています。)

# クリッピング
<img width="447" alt="Screen Shot 2019-07-05 at 23.45.26.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230477/4efe3db4-fe06-dd44-4392-9c2b8ddc969e.png">
頂点処理で行った投影変換では、下図のように描画対象である四角錐台領域を-1~1の座標に正規化した立方体領域に変換した。
<img width="835" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230477/4dda87f1-191a-9223-164b-2e87097524b1.png">
この変換は、下式のように2ステップの計算で表されるのであった。

```math
\begin{eqnarray}
\begin{pmatrix}
P_x \\ P_y \\ P_z \\ 1
\end{pmatrix}
\rightarrow
\begin{pmatrix}
P_x \cdot \frac{2n}{\omega} \\ P_y \cdot \frac{2n}{h} \\ \frac{(f+n)(-P_z) - 2fn}{f-n} \\ -P_z
\end{pmatrix}
\rightarrow
\begin{pmatrix}
P_x \cdot \frac{2n}{\omega(-P_z)} \\ P_y \cdot \frac{2n}{h(-P_z)} \\ \frac{(f+n) - \frac{2fn}{(-P_z)}}{f-n} \\ 1
\end{pmatrix}
\end{eqnarray} 
```
クリッピングでは、描画したい領域内に存在しないオブジェクト情報を排除することを目的とする。

## クリップ座標系
2段階の計算stepを経る投影変換において、中間状態をクリップ座標系と呼ぶ(後で見るようにこの座標系においてクリッピングを行うからである)。ここでは、投影変換の幾何学的な変化を図で追うことでクリップ座標系について理解しておく。
1段階目の線形変換では、

```math
\begin{eqnarray}
\begin{pmatrix}
P_x \\ P_y \\ P_z \\ 1
\end{pmatrix}
\rightarrow
\begin{pmatrix}
P_x \cdot \frac{2n}{\omega} \\ P_y \cdot \frac{2n}{h} \\ \frac{(f+n)(-P_z) - 2fn}{f-n} \\ -P_z
\end{pmatrix}
\end{eqnarray} 
```
のように、$x,y$座標については只の定数倍、$z$座標については複雑な式、$\omega$座標については$-z$の値が入ることになる。これを$x-z$平面(変換後は$x-\omega$平面)で切り取って見ると下図のようになっている。$\omega$軸は$z$軸を反転させただけなので縦方向には実質何の変化も起きていない。$x$軸方向には定数倍され、領域を区切る線分の傾きがちょうど1となるように調整されていることがわかる(これによりクリッピングの際に行う内外判定が簡単になる)。
![Picture2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230477/2fd10557-a240-a90c-d0b7-96a652334eb1.png)
2段階目のデバイス座標系への変換では、$\omega$の値で$x$座標値を割るので、幾何学的には$\omega=1$に設置されたスクリーンに"投影"するような操作にあたる。


## デバイス座標系でのクリッピング...
クリッピング処理をどの座標系で行うか考察してみる。デバイス座標系では描画対象領域が単純な立方体になっているため、領域の内外判定が最も容易いと思われる。しかし、問題点がいくつか存在するため、デバイス座標系でクリッピング処理を行うことは好ましくない。

#### (問題点1) カメラ後方にあるはずの頂点が領域内に投影されてしまう。
図のように$(x-\omega )$平面を縦に貫く実線矢印がある場合、どのように$\omega=1$のスクリーンに投影されるのかをみてみる。
<img width="435" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230477/a57622fd-6a3a-cee1-9b95-4330b4ef37c7.png">
図では、実線矢印は同一色の点線矢印へと投影されている。このとき、カメラ後方(つまり$\omega<0$)にある線分も$\omega=1$のスクリーンに投影されてしまうことがわかる。
(解決策として、$\omega$値を保持しておいて、カメラ後方から投影されたものを除くような処理を行うことが考えられる。しかし、もし三角形の3頂点の一つが$\omega>0$側でもう一つは$\omega<0$側から来たものであるような場合、この2点を結ぶ線分は上図でみたように不連続に分断されることになるので、これをちゃんと追跡してクリッピング処理を行うことは困難となる。)

#### (問題点2) カメラに近い頂点は無限遠点に投影される
上図で見たように、カメラに近い座標点($\omega\simeq0$)はゼロ除算を行うことで発散することになり、数値計算上での扱いが面倒である。


## クリップ座標系でのクリッピング
前セクションで見たように、デバイス座標系でクリッピングを行うことは難しい。また、カメラ座標系よりはクリップ座標系の方が領域の内外判定が容易いので、クリップ座標系でクリッピングを行う。(動画では、クリッピングによって三角形の数が増えるので、出来るだけ後で行う方が計算効率が良いという話であったが、完全に領域外の三角形は無視して減らすことが出来るという側面もあるため、一概には言えなそう。)

## Sutherland-Hodgmanアルゴリズム (未完成)
はみ出た三角形をいい感じに区切る。。。
Certified Kubernetes Administrator (CKA) 合格体験記


# はじめに
2019年7月1日 に Certify されましたので、Log & Tips を書いておきたいと思います。

<img width=400 src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/20749ecc-99cd-ca99-363d-45af47e017d7.png>

# 書籍

他の方も使われている通り、CKA/CKAD保有者直伝の『[Kubernetes完全ガイド](https://www.amazon.co.jp/dp/4295004804)』をゴールデンウィークに読了しました。
読みながら実際に操作することで理解が深まりました。

# Kubernetes 環境
こちらを利用したローカルPCの `vagrant` 環境を使って、後述の演習問題をおこないました。

>[takara9/vagrant-kubernetes: create k8s cluster on vagrant, master, node1, node2](https://github.com/takara9/vagrant-kubernetes)

`vagrant up` でエラーとなった場合は `vagrant-kubernetes/ansible-playbook/versions.yml` で `k8s_version: =1.13.5-00` としてみてください。

また、試験では`1.14` の Kubernetes クラスタ環境のため、最新バージョンが提供されている `IBM Cloud Kubernetes Service (IKS)` の無料トライアルも一部確認に使いました。
IKS のライトクラスタ準備はこちらを参照してください。
>[Node-REDをIKS(IBM Cloud Kubernetes Service)で動かす - Taiji - Medium](https://medium.com/@taiponrock/node-red%E3%82%92iks-ibm-cloud-kubernetes-service-%E3%81%A7%E5%8B%95%E3%81%8B%E3%81%99-d2ff1e785f67)


# 試験対策の演習問題
実用的な演習問題を提供してくれている有志がいるので、ひと通り実施しました。

`Exercise, Exercise, Exercise!`

- [dgkanatsios/CKAD-exercises: A set of exercises to prepare for Certified Kubernetes Application Developer exam by Cloud Native Computing Foundation](https://github.com/dgkanatsios/CKAD-exercises)
- [cka-practice-environment/lab/files/questions at master · arush-sal/cka-practice-environment](https://github.com/arush-sal/cka-practice-environment/tree/master/lab/files/questions)
- [stretchcloud/cka-lab-practice](https://github.com/stretchcloud/cka-lab-practice)

Tips としては、`yml` ファイルのテンプレートをすぐに生成できるように `Generator` を活用しました。

>[kubectl Usage Conventions - Kubernetes](https://kubernetes.io/docs/reference/kubectl/conventions/#generators)


# ブックマーク集のインポート
試験には自分のブラウザを使えるので、 [cka.html](https://drive.google.com/file/d/1HWXRNyHawuE29VkAzu5Df9Z8txAs8Wbn/view) のブックマーク集をインポートしておき、すばやく情報にアクセスできるように準備しました。

# 結果通知
受験後に送られてくるメールの通り、36時間後以内に通知がありました。

>Our records show you recently completed the CKA Exam.  Within **36 hours** of your completion of this Exam, a score report will be emailed to you and exam scores will be made available in your My Portal account

# スコア
配点が高いものを1問捨てましたが、回答が不完全でいくつか落としてしまったのかなという印象です。

>You scored 84% for this Exam. A score of at least 74% was required to pass.

# Certification の有効期間

受験後に送られてくるメールでは、３年間有効とされています。

>Certified Kubernetes Administration Certificaitons are active for a period of **36 months** from the date of achievement or renewal, unless revoked earlier for cause or renewal requirements are completed prior to expiration of Certification. 

#参考記事
体験記について網羅的にまとめられています。

>[CKA(Certified Kubernetes Administrator) & CKAD(Certified Kubernetes Application Developer) 合格体験記](https://qiita.com/go_vargo/items/3644c3a44734e2c155f4)

Kubernetes Slack で網羅的にまとめられていたリソース集も参考になります。

>[Kubernetes Learning Resources](https://docs.google.com/spreadsheets/d/10NltoF_6y3mBwUzQ4bcQLQfCE1BWSgUDcJXy-Qp2JEU/htmlview#)
リモートに不要なコミットをプッシュしてしまった時にやったこと

# 不要なコミットを消したい
**状況** 
プルリク出してレビューをお願いしようと、リモートの作業ブランチにプッシュした。直後に、不要なコミットが混ざっていたことに気づいたので特定のコミットを消したい。

**解決策**

* `git log` ローカルでまず不要なコミットのidを調べる
* `git revert 不要なコミットのid` ローカルからコミットを削除（履歴は残る）
* `git push origin リモートのブランチ名`リモートのコミットを上書きして不要なコミットを削除（履歴は残る）

この４ステップで完了。

# git revert の流れ
### コミットの履歴を確認

```
$ git log
```
コミットの履歴を見ることができます。コミットのid以外にも、Authorや日付、コミットメッセージも見ることができる。ここで消したいコミットのidを特定して、revertの際に指定してあげます。

### revertコマンド
```
$ git revert コミットid
```
冒頭では`コミットを削除`と簡単に書いてしまいましたが、正しく表現すると`指定したコミットを打ち消すコミットを新たに作る`という処理です。何にもなかったことにするわけではありません。
このあたりは運用ルール的なこともあるかと思いますが、個人的には消した履歴も残っててくれる方がありがたいので、この方法が良いです。

revertを実行すると、上記の通りコミットを新たに作るのですが、その際のコミットメッセージは元のままにすることもできますし、変更することも可能です。

### revertしてコミットしない（複数コミットを一気に処理）

```
$ git revert コミットid -n
```
消したいコミットが複数ある場合は、`-n`のオプションをつけると、コミットされずにrevertだけされます。一番最後にまとめてコミットできるので便利です。


### 完全に消したいとき

```
$ git reset コミットid
```
完全になかったことにする場合は、`git reset`コマンドを使います。ただし履歴で遡れないので注意が必要です。

### 変更をリモートにプッシュ
```
$ git push origin リモートブランチ
``` 
ローカルでの変更をリモートにプッシュして上書きします。作業を打ち消すコミットをプッシュすることになるので、当然リモートにも履歴が残ります。

### はじめてgit revert使った
はじめて使ったので、復習ついでにまとめました。gitはまだまだ使ったことないコマンド多いです。たまにやらかした時しかググって使わないので、使ったものはまとめていこうと思いました。

コミットを取り消す前に、もし誰かが作業を進めている可能性がある場合は、確認しないといけないですね。今回はゆるっとできる状況だったので問題なく取り消し作業できました。
Raspberry Pi + Python 3 に OpenCV 3 をなるべく簡単にインストールする

# はじめに

Raspberry Pi で Python から OpenCV を使えるようにする方法をググると山のようにヒットする。
それらをよく読むと、大体は次のどちらかになっている。
Python 3 で OpenCV 3/4 を簡単に使えるようにする方法はなかなか見つからない。

- Python 2.x に OpenCV とモジュールをインストールする。
  下の ２ 行を叩いてお終い。
  `$ sudo apt-get install libopencv-dev`
  `$ sudo apt-get install python-opencv`

- Python 3.x に OpenCV をコンパイルする。
  apt-get で色々インストールした挙句、コンパイルに数時間かかるらしい。

散々探したところ、apt-get と pip3 だけでインストールできる方法が見つかったのでメモしておく。
一次ソースは多分[ここ](https://www.pyimagesearch.com/2018/09/19/pip-install-opencv/)。

# 手順

## 前提

次の環境で確認しています。

- Raspberry Pi 3 model B+ (他のモデルでも大丈夫なはず)。
- OS は、Rasbian Stretch。
- Python 3.5.3。

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

OpenCV が依存しているライブラリを事前にインストールします。

```
$ sudo apt-get install libhdf5-dev libhdf5-serial-dev libhdf5-100
$ sudo apt-get install libqtgui4 libqtwebkit4 libqt4-test python3-pyqt5
$ sudo apt-get install libatlas-base-dev
$ sudo apt-get install libjasper-dev
```
## OpenCV のインストール

pip3 で OpenCV をインストールします。
ダウンロードが 100% に到達しないとハッシュエラーになる。そうなったらやり直します。

```
$ sudo pip3 --default-timeout=1000 install opencv-python
```

インストールが完了したら、利用できるか確認します。
カレントディレクトリに `test.jpg` を置いておき、以下の通り実行して `canny.jpg` ができたら成功です。

```
$ python3
Python 3.5.3 (default, Sep 27 2018, 17:25:39)
[GCC 6.3.0 20170516] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import cv2
>>> cv2.__version__
'3.4.4'
>>> bgr = cv2.imread('./test.jpg', cv2.IMREAD_COLOR)
>>> gray = cv2.cvtColor(bgr, cv2.COLOR_BGR2GRAY)
>>> canny = cv2.Canny(gray, 200, 50)
>>> cv2.imwrite('./canny.jpg', canny)
True
```

# おわりに

最初に見つけたのをやらずに、根気よく調べたおかげで却って手間が省けました。
urllistを作って、その中から何か探し出すための雛形


# puppeteerを使ったURL確認用雛形
これをコピーしてよしなに書き換えて使っています。

``` javascript
/**
 *
 *
 *
 */

const fs = require('fs');
const puppeteer = require('puppeteer');
const devices = require('puppeteer/DeviceDescriptors');

class AnyClass {

    constructor() {
        this._urllist;
    }

    set urllist(v) {
        this._urllist = v;
    }

    run() {
        (async () => {
            const browser = await puppeteer.launch({
                headless: false, devtools: true, waitUntil: 'networkidle2',
                args: [
                    '--disable-infobars',
                    '--disable-gpu',
                    '--disable-dev-shm-usage',
                    '--disable-setuid-sandbox',
                    '--no-first-run',
                    "--proxy-server='direct://'",
                    "--proxy-bypass-list=*",
                    '--no-sandbox',
                    '--no-zygote',
                ]
            });

            const secretMode = await browser.createIncognitoBrowserContext();
            const page = await secretMode.newPage();

            await page.emulate(devices['iPhone X']);

            let records = [];
            for (let url of this._urllist) {

                if (url === "") {
                    continue;
                }

                if (!new RegExp(/^http.*/).test(url)) {
                    url = "http://" + url;
                }

                await page.goto(url);
                const response = await page.goto(`${url}`);
                if (response._status === 200) {
                    hasSomthing = await page.evaluate(() => {
                        return document.body.innerText.search('何か') > 0
                    });
                }

                records.push([url, hasSomthing].join(','));
                console.log(`${url} をチェックしました`);
            }

            await browser.close();
            await fs.writeFileSync('result.csv', records.join("\n"), err => {
                if (err) {
                    console.log('err', err);
                } else {
                    console.log('fin');
                }
            });
        })();
    }
}


/**
 *
 * ファイルからurllistを追加して、runで検証
 *
 */
(async () => {
    const acn = new AnyClass;
    let urllist = fs.readFileSync('urllist', 'utf8');
    acn.urllist = Array.isArray(urllist) ? urllist : urllist.split('\n');
    acn.run();
})();

```
MySQLで数字の並びを指定する方法

MySQLでデータベースのカラムに入っている数字が並んでくれない状況に陥ってはいませんか？
MySQLでは、関数を使うことで数字を順番に並ばせることができるようになります。

## カラムの型を数字に変更する
例えば、以下のような`cat`テーブルがあるとします。
現状として、`level`（レベル）が思い通り低い順番（昇順）に並んでくれていないとします。

**【user】テーブル**

| name | level |
|:----------|------:|
| クロ | 12 |
| しょーぐん | 144 |
| あいうえお | 23 |
| マモル | 231 |
| あああ | 3 |
| Xx_GoD_xX | 999 |

一見`1`から始まりそれ通り並んでいるように見えますが、「あああ」というユーザが一番低いのでうまく昇順に並べれていません。
数字が思い通りに並んでくれないときは大体カラムの型が「文字列として認識されています。

そこで、下記のような記述をすることでカラムの型を数字に変更させ、数字と認識されて思い通りに並んでくれます。

```sql
SELECT * FROM user ORDER BY CAST(level AS SIGNED)
```

### CAST()による効果
`CAST()`の引数に並び替えの基準とするカラム名を入れることで、様々な型への変更が可能になります。
今回は、カラムの型を数字としたかったので、`CAST()`の引数に`AS SIGNED`を付け加えました。

それにより、上記のテーブルは`level`（レベル）通り昇順に並んでくれるようになりました。

| user_name | level |
|:----------|------:|
| あああ | 3 |
| クロ | 12 |
| あいうえお | 23 |
| しょーぐん | 144 |
| マモル | 231 |
| Xx_GoD_xX | 999 |

## 参考サイト
以下のサイトも参考にすることによって、いろんな型への変更方法を知ることができます。

[12.10 キャスト関数と演算子](https://dev.mysql.com/doc/refman/5.6/ja/cast-functions.html)
【AWS】CloudTrailで操作ログを取ろうとしたらS3バケットに知らないファイルが勝手に増えて怖かった話

タイトルの通りです。クラウド初心者なのでちびりそうでした。

##ことの発端
AWSの本に従いCloudTrailを有効にしS3バケットにぶち込む設定をする。
(S3はここで初めて作った)
↓
次の日にそのバケットの中身を覗いてみる。
↓
「なんかAWS使ってない時間帯のタイムスタンプのファイルがわんさか出てる！！」★1
「しかもそのファイルを開こうとしたら"Access denied"ってでる！！！」★2
「めっちゃ不正アクセス試行されてるかも！！！！」★3
↓
クラウド怖い…

というのが今回のスタートでした。
結論としてはまったくの正常動作で何も怖いことはありませんでした。(よかった)
せっかくなのでそれぞれの事象について以下にまとめようかと思います。

##★1の事象について
ズバリ「ダイジェストファイル」というものでした。
[CloudTrail ダイジェストファイルの構造 - AWS CloudTrail](https://docs.aws.amazon.com/ja_jp/awscloudtrail/latest/userguide/cloudtrail-log-file-validation-digest-file-structure.html)

CloudTrail が配信した後でログファイルが変更や削除されないかを署名などの仕組みで検証するためのものらしいです。改ざん検知って感じでしょうか。無害ですね。

##★2の事象について
"Access denied"はアクセス試行失敗のログとかではなく、私自身に向けられたものでした。お恥ずかしい限りです…。
[Amazon S3 のアクセス拒否エラーを解決する](https://aws.amazon.com/jp/premiumsupport/knowledge-center/s3-access-denied-error/)

gzファイルをダウンロードして`zgrep`コマンドでちゃんと中身が見れました。

##★3の事象について
不正アクセスなんてぜんっぜんそんなことありませんでした。
★2で開けたダイジェストファイルの中身をいくつか見たところ下記のような内容でした。
「ここ1時間はなんのログもなかったよ」
「ここ1時間はなんのログもなかったよ」
「ここ1時間はなんのログもなかったよ」
「ここ1時間はなんのログもなかったよ」
「ここ1時間はな(以降エンドレス)

めっちゃ親切じゃん！びっくりさせないでよ！
いやありがたいけどさ！！！

##解決方法
ちょうど[@fkooo](https://qiita.com/fkooo)様の記事でダイジェストファイルの配信停止方法の記事を見つけたので参考にさせていただきました。
[AWS初心者が無料利用枠で個人運用していたら$0.64請求がきた話し - Qiita](https://qiita.com/fkooo/items/df3b1b47a61f7826ffd4)

この設定変更を試してみると無事にダイジェストファイルの配信が止まりました。
(無料枠の上限ギリギリでした…)
ダイジェストファイルってセキュリティの面ですごく重要な気がしますが、ひとりで閉じた環境でポチポチやってる現状では不要なのかなと思っています。そこらへんも今後しっかり調べていきたいです。
docsifyでgitbookやSphinxより手軽にドキュメントサイトを構築

# docsifyとは

https://docsify.js.org/

documentation site generator.
ドキュメントサイトを構築するツールです。

使ってみるとわかりますが、すごく手軽に使えます。
開発ドキュメントを書くのにピッタリです。

似たようなツールとして、gitbookやSphinxもこれまで使ってきましたが、

- gitbookはローカルで使うにはサポート切れ
- SphinxはPython使わないプロジェクトでPython環境構築するのしんどい

などあって、良いツールを探していましたが、やっと見つけました。

# docsifyでできること

以下のような要件であれば、docsifyはちょうど良いと思います。

- Markdownでドキュメントを書きたい
- 書いたドキュメントをクラウド上でホスティングしたい
- ドキュメントはgitでソースコードと一緒に管理したい
- plantumlを使いたい

# docsifyのいいところ

## セットアップが簡単

```sh
# 初期化
npx docsify-cli init ./docs
# 以下の3ファイルが作成される
# ./docs/index.html
# ./docs/README.md
# ./docs/.nojekyll　（Github Page用）

# ローカルでドキュメントサイト立ち上げ
npx docsify-cli serve docs
# http://localhost:3000にアクセスすると、README.mdの内容が表示される
```

これだけで済みます。
Node.jsの環境さえあれば、ライブラリのインストール不要で実行できます。

## ビルド不要

docsifyは、MarkdownをコンテンツとするCMSと思えばよいです。
例えば、`index.html`と同じ階層に`AWS.md`を作成すると、
**ビルドなし**で`http://localhost:3000/#/AWS`にてコンテンツ（AWS.mdの内容）を閲覧できます。

## カスタマイズが簡単

テーマの変更、プラグインの追加等のカスタマイズはindex.htmlを編集するだけでOKです。
下記htmlのコメントを入れたところだけカスタマイズすればよいと思ってください。

```html
<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charset="UTF-8" />
    <title>my service documents</title>
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
    <meta name="description" content="my service documents" />
    <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0" />
    <!-- 好きなThemeを挿入 -->
    <link rel="stylesheet" href="//cdn.jsdelivr.net/npm/docsify-themeable@0/dist/css/theme-simple.css"/>
    <!-- スタイルをカスタマイズ -->
    <style>
      .markdown-section {
        max-width: 90%;
      }
    </style>
  </head>
  <body>
    <div id="app"></div>
    <script>
      // docsifyの設定
      window.$docsify = {
        name: 'service name',
        // docsifyはSPA。ページを切り替えたときに左上にスクロールする設定
        auto2top: true,
        // サイドバーを表示。別途_sidebar.mdを書く必要あり。gitbookのSUMMARY.mdと同じ要領。
        loadSidebar: true,
        alias: {
          '/.*/_sidebar.md': '/_sidebar.md' // 詳細はissueの301参照
        },
        plantuml: {
          skin: 'classic' // plantumlのskinの設定
        }
      }
    </script>
    <script src="//unpkg.com/docsify/lib/docsify.min.js"></script>
    <!-- plantumlのプラグイン -->
    <script src="//unpkg.com/docsify-plantuml/dist/docsify-plantuml.min.js"></script>
    <!-- ソースコードのハイライト。既定はhtml,css,javascriptのみ。必要なものを追加する。 -->
    <script src="//unpkg.com/prismjs/components/prism-bash.min.js"></script>
    <script src="//unpkg.com/prismjs/components/prism-python.min.js"></script>
    <script src="//unpkg.com/prismjs/components/prism-typescript.min.js"></script>
  </body>
</html>
```

# デプロイ方法

公式サイトにGitHub Pages, GitLab Pages, Firebase Hosting, VPS, Netlify, AWS Amplifyへのデプロイ方法は記載があります。
https://docsify.js.org/#/deploy

僕はAWSのS3にデプロイしたかったので、以下がその方法です。
（CloudFront + S3 の静的サイトホスティング環境がある前提）

といっても大したことはしておらず、同期するだけです。

```sh
# 1. docsをS3に同期
aws s3 sync --delete $PWD/docs s3://my-service-docs

# 2. CloudFrontのキャッシュをinvalidate
aws cloudfront create-invalidation --distribution-id $DOCS_DISTRIBUTION_ID --paths "/*"
```
[Twilio/nodejs]今だからこそ二段階認証(二要素認証)を試してみる

とあるpayアプリで話題になってる二段階認証(二要素認証)今だからこそTwilioで試して見ようと思います。

## AUTHY_API_KEYの調べ方
[AUTHY_API_KEYの調べ方はこちら](https://jp.twilio.com/docs/authy/api#authy-api-keys)

## 新規ユーザー登録
```
request

curl "https://api.authy.com/protected/json/users/new" \
-H "X-Authy-API-Key: [AUTHY_API_KEY]" \
-d user[email]=your email address \
-d user[cellphone]=90xxxxxxxx \
-d user[country_code]=81
```

```
response

{
    "message": "ユーザーの作成に成功しました。",
    "user": {
        "id": <userId>
    },
    "success": true
}
```

## ユーザー確認用SMS送信
```
request

curl https://api.authy.com/protected/json/sms/<userId>?force=true -H "X-Authy-API-Key: [AUTHY_API_KEY]"
```

```
response

{
    "success": true,
    "message": "SMS token was sent",
    "cellphone": "+81-XXX-XXX-XXXX"
}
```

## ユーザー確認
```
request

curl https://api.authy.com/protected/json/verify/<SMSで届いた認証コード>/<userId> -H "X-Authy-API-Key: [AUTHY_API_KEY]"
```

```
response

{
    "message": "Token is valid.",
    "token": "is valid",
    "success": "true",
    "device": {
        "id": null,
        "os_type": "sms",
        "registration_date": 1562338290,
        "registration_method": null,
        "registration_country": null,
        "registration_region": null,
        "registration_city": null,
        "country": null,
        "region": null,
        "city": null,
        "ip": null,
        "last_account_recovery_at": null,
        "last_sync_date": null
    }
}
```

## まとめ
なんと3APIで二段階認証が実装できます！
今だからこそ導入を検討してみてください。

## webアプリサンプル
node.jsで書かれた[サンプル](https://github.com/friendtree16/account-security-quickstart-node/tree/run_on_docker)をdockerで動くように改良しました！
それ使えばすぐにAuthy試せるのでお試しください！
金曜夜から日曜昼まで、6人で0からサービス開発日記[序章]

この投稿は、特に技術的な解説もないし、大きな学びにつながるようなものでもありません。
でも、「いつか自分でサービスを作りたいなぁ」と思っている方には何かしらの示唆を与えられると嬉しいなぁと思ってます。

なぜ6人でサービス作りをすることになったのか、どうやって技術選定を進めたのか、開発合宿当日までにどんな準備をしたのかなどを書いていきます。

開発中の実況中継はこちらのTwitterで！
https://twitter.com/LiLB_choitashi


## はじまり
きっかけは「私、フロントエンドの勉強したいねん」という、あるメンバーの一言でした。

そのメンバーはバックエンドエンジニアとしてAPI開発を中心に行っていたけど、別のスキルセットや領域に足を踏み入れたかった。
みなさんも、「そろそろ○○な領域にも足入れたいな」なんて思うことあると思います。

でも、現状の仕事に無関係な領域を、自分一人で勉強するとかって結構しんどいじゃないですか。
責任もなければ期限もないし、プライベートも仕事もやることたくさんあるし、新しい勉強とかってなかなか手をつけられない。

じゃあどうすんの？ってなると、誰かを巻き込んで「勉強しなきゃいけない状況」に追い込むのが一番なんですよね。

まさに、今回の「0からサービス開発」はそこからスタートしました。
つまり、その「フロントエンドの勉強したいねん」と放ったエンジニアの一言で「俺はこれを勉強したい」「私はここら辺のサービス一回触っておきたい」というメンバーが集まって、みんなが責任と連帯感で縛られた状態でやりたいことをやる。

その「やりたい」アウトプットが「とあるサービス」のリリースにつながる。
そんな風になればいいねぇー。ってなって、”開発合宿しよう”という結論に達しました。


## なにやるの？どうやるの？
開発合宿をすることが決まってから参加メンバーを募り、合計6人でサービス開発合宿を行うことになりました。

開発合宿の1か月前に、渋谷の金の蔵で「どんなサービス作ろっか？」ミーティング。

* ゴーンORビーン:出てきた画像がビーンかゴーンか見分けるアプリ
* 早押しネコ:プッシュ通知で「ネ」が飛んできたら、いち早くコをレスポンスするアプリ

など、かなりいけてる案が出ましたが、最終的に決まったのは「ちょいたしアプリLiL-B」。

例えば、いつも食べてる日清のとあるカップラーメン。食べすぎるとあきますよね。
そんな「あきちちゃう」「味にひとひねり欲しい」 食材や食品に何をチョイタシすればいいかユーザー同士で教えあうアプリです。

あなたには、とっておきの「ちょいたし」ありますか？
私は卵焼きにラー油をチョイタシしてます。

そんなみんなの「とっておきのちょいたし」をお勧めしたり、「この食品に何チョイタシしたほうがいいと思う？」という質問をみんなに投げかけられるようなアプリを作ろうということになりました。

食べ物じゃなくても、「初めてのデート」にちょいたし、「60歳の誕生日」にちょいたしなんていう、森羅万象全ての物に「ちょいたし」をみんなで進めあえるような世界になればいいなぁなんて思ってます。


で、どうやんの？って。

それはみんなの「触りたい技術」とか「触ってみたいAWSのサービス」とかそんなものを中心に選定。それが結局うまくいかないことが合宿直前で判明してしんどい思いをしたのはいい思い出です。


## さてこれから
今この記事を書いているのは、合宿初日の金曜夜。サービス開発の時間は残り40時間くらい？かな？

このQiitaでは、エンジニアのメンバーが（開発中余裕があれば）技術の記事を書こうと思ってます。
よくある「こんかことしたよー」という過去のはなしではなく、「今こんなことしてる！」というリアルタイム記事を上げていくと思います。

＼フォローよろしく／

使っている技術は
- React
- GraphQL
- AWS Appsync

などなど。
続報をお待ちくださいませー！

では開発頑張りまーす！

2019年7月5日　開発初日　ビールを片手に。
[JavaFX]CheckBoxについて確認してみました。

## 外観
![checkbox.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143537/727cdedc-aa32-ac17-ba30-702032ef0e21.png)

## サンプルコード
```java
package myapp.gui;

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.CheckBox;
import javafx.scene.layout.Pane;
import javafx.stage.Stage;

public class Main extends Application {
	public static void main( String[] args ) {
		Main.launch( args );
	}

	@Override
	public void start(Stage stage ) throws Exception {

		CheckBox cb = new CheckBox( "アイテム１" );

		Pane root = new Pane();
		root.getChildren().addAll( cb );

		stage.setTitle( "JavaFXサンプル(CheckBox)" );
		stage.setMinWidth( 400 );
		stage.setMinHeight( 300 );

		Scene scene = new Scene( root );
		stage.setScene( scene );

		stage.show();
	}
}
```

## 主なメソッド
- setSelected( boolean b )
・ bにtrueを設定した場合、チェックボックスがチェックありの状態となる。
・ bにtrueを設定した場合、チェックボックスがチェックなしの状態となる。


- isSelected()
チェック有無を取得する。（true：チェックあり、false：チェックなし）
Pythonの数学関数をいくつかまとめてみました

#はじめに
[未来電子テクノロジー](https://www.miraidenshi-tech.jp/intern-content/program/)でインターンをしているにのみやです。

プログラミング初心者なので、間違いも多いと思います。
間違いがあれば、ぜひ教えてください。

#主な数値計算用のモジュール

## ceil(x)
x以上の最小の整数を返す

```python

import math

a = math.ceil(2.3)
print(a)
#3
b = math.ceil(-2.3)
print(b)
#-2
```

## floor(x)
x以下の最大の整数を返す

```python
import math
a = math.floor(2.3)
print(a)
#2
b = math.floor(-2.3)
print(b)
#-3
```

## gcd(a, b)
aとbの最大公約数を返す

```python
a = math.gcd(90, 60)
print(a)
#30
```
## factorial(x)
xの階乗を返す

```python
import math
a = math.factorial(9)
print(a)
#362880
```
## pow(x, y)
xのy乗を返す

```python
import math
a = math.pow(3, 3)
print(a)
#27.0
b = math.pow(-3, 3)
print(b)
#-27.0

```
## sqrt(x)
xの平方根を返す

```python
import math
a = math.sqrt(2)
print(a)
#1.4142135623730951
b = math.sqrt(121)
print(b)
#11.0

```
WSL2を機に始めるWindows上での環境構築

# はじめに
以下二つをやりたいなーと思っていました

- Dockerを使う
- Docker使って開発環境構築のコストを減らす

以前、Docker Toolbox使って試したんですが、色々問題起きて、開発環境構築のコストが爆増したのであきらめました。
ところが、最近Windowsも色々充実してきたので試してみることにしました。

- 最近VSCode でリモート開発できるようになった
- WSL2がLinuxカーネル積んだおかげでDockerが使用できる

というわけでwsl2を利用可能にするところから

## 環境
- Windows10 Home
- メモリ 16GB

## 手順
1. Windows 10 Insider Preview の登録
2. Windows10 Preview Buildのインストール
3. 仮想マシンの有効化
4. WSL1でUbuntuのインストール
5. WSL1→WSL2への変換

### 1. Windows 10 Insider Preview の登録 
手持ちのMicroSoftアカウントを、[ここから](https://insider.windows.com/ja-jp/how-to-pc/)Insider Previewに登録。
利用規約やFBを送ることに同意する。

### 2. Windows10 Preview Buildのインストール
ここでやることは2つ
1. Windows Insider Programの設定
2. WindowsUpdate

1. Windows Insider Programの設定
Windows10内の `システム設定` > `更新とセキュリティ` > `Windows Insider Program`  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308037/26c9fd34-5fcf-e1dd-26e9-e4cdbbe0a32a.png)
 `Windows Insider Program` の画面上で、以下の設定を行うこと

- 新しいビルドを取得する頻度：ファースト
- どのようなコンテンツの受け取りを希望されるか：Windows のアクティブな開発

2. WindowsUpdate
Windows10内の `システム設定` > `更新とセキュリティ` > `Windows Update` 

- build version が18917以上になっていれば可(※「1. Windows Insider Programの設定」を行っていないとVersionが上げられないので注意)
- 確認方法は コマンドプロンプトからwinverと打つ かコンソール上部をみる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308037/680735b3-438c-c2ff-4a89-6fc553389f23.png)

### 3. 仮想マシンの有効化
powershellを管理者権限と実行し以下のコマンドを実行
`Enable-WindowsOptionalFeature -Online -FeatureName VirtualMachinePlatform` を実行
2.でbuild version が18917以上になっていないと実行できない

### 4. WSL1でUbuntuのインストール
※ディストリビュートはUbuntuでなくともかまわない
Microsoft stoe からアプリをインストールする。
[リンクはここを参照](https://docs.microsoft.com/en-us/windows/wsl/install-win10#install-your-linux-distribution-of-choice)

### 5. WSL1→WSL2への変換
- まずはVersionを確認 `wsl -l -v`

```
  NAME            STATE           VERSION 
* Ubuntu-18.04    Running         2
```

-  wsl --set-version <ディストリビューション名> 2   例)` wsl --set-version Ubuntu-18.04 2`

## おまけ
以下公式の手順通りに進めると、Dockerをインストールしたら、Dockerが動くようになりました。Windows上からDockerを普通に利用できるなんて素敵です。
https://docs.Docker.com/install/linux/Docker-ce/ubuntu/#supported-storage-drivers

本来の目的であるDockerが使えるようになったのでこれからバシバシ開発していきたいなと思います。


-----------------------------
環境構築をするにあたって参考にさせていただいた記事/ブログ
https://www.softantenna.com/wp/tips/windows-10-20h1-wsl-2/
http://hanocha.hateblo.jp/entry/2019/06/18/001136
DOMエレメントの領域を表示するChrome拡張が便利

## DOMエレメントの領域を表示するChrome拡張が便利
こちらのChrome拡張「Pesticide for Chrome」です。
https://chrome.google.com/webstore/detail/pesticide-for-chrome/bblbgcheenepgnnajgfpiicnbbdmmooh

<img width="1440" alt="Screen Shot 2019-07-05 at 23.51.35.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/250231/47aee725-ba7d-bcac-278b-62fe9800204f.png">

有効にするとこのようになります。

ぜひ活用してみてはいかがでしょうか。この記事が参考になれば幸いです。
## 終わりに
私は現在、Web3のサービスの開発をしています。詳しくはこちらの記事をご覧下さい。
        [無料でイーサリアムが当たる、Web3時代の寄付サイトを作った話](https://note.com/kenroda/n/n814347fbdcd7)
FirefoxでCtrl-Tabでタブ切り替えするときにプレビューを表示する方法

# はじめに
## この記事を書くに至った経緯
仕事中に同期から「Firefoxってタブ切り替えするときにWindowsのウィンドウ切り替えみたいにプレビューが見られるんだね〜」と言われて、自分のPCで試したところ設定が必要なことが発覚したので調べてみました。
# 設定方法
以下の記事がヒットしましたが、何故か`browser.ctrlTab.previews`が見つからない。。。
https://qiita.com/keisuke-nakata/items/4ff99eac7ab00c78da30

同期のPCと見比べてみた結果、現在は`browser.ctrlTab.recentlyUsedOrder`をいじると良いみたいです。ただ、こちらの設定にするとCtrl-Tabで、最近使用したタブ6個までしか切り替えることができないようです。
Laravelのソフトデリートについてメモ

Laravelの勉強がてらメモ。
#まずはモデルの削除の仕方

`delete`メソッドを使用。


```php
$user = App\User::find(1);
$user->delete();
```

削除するモデルのキーがわかっている場合は、
モデルを取得せずとも、```destroy```メソッドで削除できる。

```php
App\User::destroy(1);

//複数指定も可能
App\User::destroy(1, 2, 3);
App\User::destroy([1, 2, 3]);
```

#ソフトデリート
物理削除ではなく、論理削除。
DBのテーブルに```deleted_at```カラムを追加する必要がある。

まずはモデルの書き方

```php
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;

class Flight extends Model
{
    use SoftDeletes;
}
```

有効にするには```Illuminate\Database\Eloquent\SoftDeletes```トレイトを使用。

これで、deleteメソッドを使用すれば、deleted_atカラムに現在時刻が挿入される。
モデル取得時も、deleted_atがNULLでなければ、クエリ結果に含まれない。

ちなみに、指定されたモデルインスタンスがソフトデリートされているかを確認するには、```trashed```メソッドを使用。

```php
if ($user->trashed()) {
    //
}
```

#ソフトデリートされたモデルも検索結果に含める
検索結果にソフトデリートされたモデルも含める場合は、```withTrashed```メソッドを使用。

```php
$users = App\User::withTrashed()->get();
```

ソフトデリートされたモデルのみ取得するには、```onlyTrashed```メソッドを使用。

```php
$users = App\User::onlyTrashed()->get();
```

#ソフトデリートの解除
ソフトデリートされたモデルを解除したい場合は、```restore```メソッドを使用。

```php
$user->restore();
```

複数のソフトデリートされたモデルを一度に未削除にするには、

```php
App\User::withTrashed()->restore();
```

#物理削除（完全に削除したい）
物理削除したいときは```forceDelete```メソッドを使用。

```php
$flight->forceDelete();
```



laravelは直感的でわかりやすいなーと思いました。
Rails + Vue ~サーバー立ち上げ~

SPAとやらを会社で教えてもらったので復習として自分でアプリを作ってみようと思う。

##アプリ作成(mysqlで作る)

```ruby

rails new アプリ名 -B -d mysql -S -T --skip-coffee --skip-turbolinks --skip-test --webpack=vue
```


##foreman導入
サーバーの立ち上げを一気にまとめてやってくれる


###Procfile.devをルートディレクトリに作成

```Procfile.dev
 web: bundle exec rails s -b 0.0.0.0 -p 3000
 webpacker: bin/webpack-dev-server
```
  
###webpacker.ymlのhostを編集する

```webpacker.yml
 host: 0.0.0.0
 port: 8000
```
  
##サーバー立ち上げ
```ruby
command: bundle exec foreman start -f Procfile.dev
```

成功。いつもの画面
<img width="934" alt="スクリーンショット 2019-07-05 23.29.00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265805/b087745b-08c6-617e-bf10-9b54305230c9.png">




参考: https://qiita.com/jnchito/items/30ab14ebf29b945559f6
DonkeyCar 3.1.0 のカスタマイズ

#~/mycar/myconfig.py
◎教師データを格納するdataフォルダをRAMディスクに作成
DATA_PATH = '/run/shm/data/'

◎ステアリング キャリブレーション(タミヤM-05用)
STEERING_LEFT_PWM = (400+100)
STEERING_RIGHT_PWM = (400-100)

◎スロットル キャリブレーション(タミヤM-05用)
THROTTLE_FORWARD_PWM = (380-100)
THROTTLE_STOPPED_PWM = 380
THROTTLE_REVERSE_PWM = (380+100)

◎起動時は自動レコードをオフとする
AUTO_RECORD_ON_THROTTLE = False
（controller.pyでBボタンで自動レコードのオン/オフを反転するように改造）

◎コントローラー選択
~~CONTROLLER_TYPE='F710'~~
ps3のまま変更しない（バージョン2でps3用を手直ししてF710を使用していたため）
　コントローラーの設定
　　X-Dの切り替えスイッチはX側にする
　　MODEボタンで緑LEDを消灯状態にする

◎スロットルの操作量が少ないときは自動レコードがオンでも記録しない
JOYSTICK_DEADZONE = 0.5
（controller.pyでMAX_THROTTOLEに対する割合で設定するように改造）

◎自動走行時も自動レコードを可能にする
RECORD_DURING_AI = True

◎ホストPC画面にDonkeyCarのカメラ画像を送信
PUB_CAMERA_IMAGES = True
（ホストPCでdonkeycar/script/remote_cam_view_tcp.pyを起動する）
（遅延が大きいので画像の確認程度）
#~/mycar/manage.py
◎モデルファイルの指定が無いときに走行モードを切替えてもエラーにならないように
◎シングルタブ化
#~/projects/donkeycar/donkeycar/part/controller.py
◎JOYSTICK_DEADZONEがMAX_THROTTOLEに対する割合となるように改造
◎Bボタンで自動レコードのオン/オフを反転するように改造
◎YボタンとAボタンの機能をMAX_THROTTOLEの＋0.1と－0.1に変更
◎R1，L1ボタンの機能を無効化
#~/projects/donkeycar/scripts/remote_cam_view_tcp.py
◎画面サイズを小さく
#~/projects/donkeycar/donkeycar/parts/network.py
◎3行目がエラーになるのでコメントアウト
DonkeyCar 3.0.2 ラズパイ インストール

#Get Your Raspberry Pi Working.
http://docs.donkeycar.com/guide/robot_sbc/setup_raspberry_pi/
##Step 1: Flash Operating System
「Download Raspian Lite (300MB).」とあるがVNCを使えるデスクトップ版をダウンロードして使用する．

Raspbianは最新のBusterではうまくいかない．
ひとつ前のStretchを使用すること．

ホストPCには「Real VNC Viewer」をインストールする．
https://www.realvnc.com/en/connect/download/viewer/
注：画面サイズは小さめに設定すること．

以下，Docと同じ手順
##Step 2～5
ホストからSSHでラズパイにログイン．
##Step 7: Raspi-config
$ sudo raspi-config
camera,ssh,i2cを有効にする
VNCも有効にする
タイムゾーンを日本に設定
##Step 6: Update and Upgrade
$ sudo apt-get update
$ sudo apt-get upgrade
##Step 8: Install Dependencies
$ sudo apt-get install build-essential python3 python3-dev python3-virtualenv python3-numpy python3-picamera python3-pandas python3-rpi.gpio i2c-tools avahi-utils joystick libopenjp2-7-dev libtiff5-dev gfortran libatlas-base-dev libopenblas-dev libhdf5-serial-dev git
##Step 9: Install Optional OpenCV Dependencies
$ sudo apt-get install libilmbase-dev libopenexr-dev libgstreamer1.0-dev libjasper-dev libwebp-dev libatlas-base-dev libavcodec-dev libavformat-dev libswscale-dev libqtgui4 libqt4-test
##Step 10: Setup Virtual Env
$ python3 -m virtualenv -p python3 env --system-site-packages
$ echo "source env/bin/activate" >> ~/.bashrc
$ source ~/.bashrc
$ mkdir ~/projects
$ cd ~/projects
##Step 11: Install Donkeycar Python Code
$ git clone https://github.com/autorope/donkeycar
$ cd donkeycar
$ git checkout master
$ pip install -e .[pi]
$ pip install tensorflow==1.13.1
##Step 12: Install Optional OpenCV
$ pip install opencv-python
#SDカードイメージファイル
ここまでをインストールしたSDカードのイメージファイルのコピーを7月6日の勉強会で提供(8GB)．
8～16GBサイズのSDカードに書き込み，
step2のwpa_supplicant.confを作成(注：country=JP)し，
ラズパイを起動してホストPCからターミナルまたはVNCにて接続
$ sudo raspi-config
でサイズ拡張を行う．
#Create your car application.
http://docs.donkeycar.com/guide/create_application/
$ donkey createcar --path ~/mycar
$ cd ~/mycar
続・退職エントリを毎日自動で集めるBlogを作った ~過去編~

# 概要

[この記事](https://qiita.com/obuchi3/items/fd1e6cf217e6fac85122)の続編です。
予想以上の反響を頂いたので、みんな退職エントリ読みたいんだなぁと思いました。

# 今回は

日付指定で退職エントリを拾ってきて、はてなBlogに投稿します。
ループさせれば過去分を一気に取得できますね。やりましたね。

## 退職エントリをあつめる

前回のコードを変更します。変更したとこメインで抜粋します。
微妙に変数名が違ったりするのはリファクタリングしてるからです。

```javascript
// moment使うと日付処理が楽です
const moment = require('moment');

// "tbs=cdr:1,cd_min:%DATE%,cd_max:%DATE%"を指定すると日付指定の検索ができる(%DATE%は後で置換する）
const BASE_URL_GOOGLE =
  'https://www.google.com/search?q=%22%E9%80%80%E8%81%B7%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F%22&tbs=cdr:1,cd_min:%DATE%,cd_max:%DATE%&start=';

const getEntries = async moment => {
  const entries = [];
  for (let i = 0; ; i += 10) {
    const date = moment.format('M/D/YYYY');
    // minとmaxに同じ日付を入れると、その日のみの検索になる。
    const res = await client.fetch(
      `${BASE_URL_GOOGLE.replace(/%DATE%/g, date)}${i}`
    );
    const contents = res.$('div.r > a > h3');
    if (contents.length === 0) {
      break;
    }
    contents.each((index, elm) => {
      const url = elm.parent.attribs.href;
      const title = elm.childNodes[0].data;
      if (!title) {
        return;
      }
      if (!includesIgnoreSites(url) && includesRetirementWords(title)) {
        entries.push({ url: url, title: title });
      }
    });
  }
  return entries;
};
```

## はてなブログAPIで投稿する

```javascript
const postBlog = async (entries, moment) => {
  const title = `${moment.format('YYYY-M-D')}の退職エントリ`;
  let content = '';
  for (const entry of entries) {
    if (content !== '') {
      content += '\r\n';
    }
    content += `[${entry.url}:embed:cite]`;
  }
  if (content === '') {
    return;
  }
  // updatedタグで、投稿日時を決めれる。
  const data = `<?xml version="1.0" encoding="utf-8"?>
  <entry xmlns="http://www.w3.org/2005/Atom"
         xmlns:app="http://www.w3.org/2007/app">
    <title>${title}</title>
    <content type="text/x-markdown">
${content}
    </content>
    <updated>${moment.format('YYYY-MM-DD')}T00:00:00</updated>
  </entry>`;

  await axios.post(
    'https://blog.hatena.ne.jp/{はてなID}/{ブログID}/atom/entry',
    data,
    { auth: { username: /* はてなID */, password: /* APIキー */ } }
  );
};
```

## 自動投稿する

あとは、日付した`moment`オブジェクトでそれぞれのメソッドを呼び出せばOK。
`mom.add(1, 'days')`とかで日付計算しつつ、ループさせれば過去分一気に投稿！
良いですね。

…とは、行きませんでした。
Google検索のリクエスト制限に引っかかって、`429`が返ってきちゃうので、
1週間ごととかにリクエストを分けて送るのが良さそうでした。

現場からは以上です。
書籍『たのしいRuby』の練習問題を解いてみた Part.1

# はじめに  
Railsの勉強を始めようと思い、Rubyを復習することに。大学1年生の頃に買った『たのしいRuby』を頭からやってみることにした。
# 本題
今回は第12章の練習問題を解いていく。それでは早速解いてみる。
**(1)**　摂氏温度を華氏温度に変換するメッソドcels_to_fahrを定義せよ。  

```ruby:cels_to_fahr.rb

def cels_to_fahr(n)
  (n * 9).fdiv(5) + 32
end

puts cels_to_fahr(37)
#実行結果：　98.6
```
一応、出力して確認した。  
**(2)**　(1)の逆、華氏温度を摂氏温度に変換するメソッドfahr_to_celsを定義せよ。また、摂氏1度~100度まで1刻みにし華氏温度との対応を出力せよ。

*メソッドfahr_to_cels*

```ruby:fahr_to_cels.rb
def fahr_to_cels(n)
      5*(n-32).fdiv(9)
end

p fahr_to_cels(98)
#実行結果：　37.0
```

*摂氏1度~100度まで1刻みにし華氏温度との対応*  

```ruby:1to100.rb
def cels_to_fahr(n)
  (n * 9).fdiv(5) + 32
end

range=1..100
range.each do |i|
    print "#{i}℃　："
    puts "#{cels_to_fahr(i)}°F"
end
#実行結果：割愛
```

(2)のfahr_to_celsメソッドは(1)で作ったメソッドの逆の式にすればよいだけでした。1~100°Cの華氏温度の対応は,rangeで範囲を決め対応して出力するようにしました。  
**(3)**　1~6までのランダムな整数を返すメソッドdiceを定義せよ。  

```ruby:dice.rb
def dice
	return Random.rand(6)+1
end

puts dice
#実行結果：4(1~6ランダムに変わる)
```

ランダム関数を使うだけでそこまで難しくない。0~5までランダムに出してそれに1を足すことで、1~6を出すようにした。  
**(4)**　10個のサイコロを振って出た目の合計を返すメソッドdice10を定義せよ。  

```ruby:dice10.rb
def dice10
	ans=0
	range=1..10
	range.each do |x|
		x = Random.rand(6)+1
		ans += x
	end
	return ans
end

puts dice10
#実行結果：38(10~60の範囲でランダムに変わる)
```

ansに作られたサイコロの目の数を順に足していくプログラムにした。  
**(5)**　整数numが素数であるかどうか調べるメソッドprime?(num)を定義せよ。  

```ruby:prime.rb
def prime?(num)
	if num==0 or num ==1
	      puts "素数ではありません"
	      exit
	else
	end
	lis=Array.new
	range=1..num
	
	range.each do |i|
		if num % i ==0
			lis.push(i)
			if lis.length > 2
				puts "素数ではありません"
				exit
			end
		end
	end
	puts "素数です"
end

prime?(403)
#実行結果：素数ではありません
```  
0,1には例外的に素数でないと処理させ、1~numまでの数字で割り切れた場合はansに1を足し、この値が3以上になったら素数では無いのでこれ以上処理を続けても意味は無いので処理を止めるようにしました。  
# 最後に  
今回はQiitaに初投稿の記事でした。今後、『たのしいRuby』の練習問題を解いてみたPart.2が出せるようにしたいと思います。
著名なOSSがどのように構成され、何故そのように作ったかを解説する「The Architecture of Open Source Applications」がすごい!!

## 要約
著名なOSSのアーキテクチャを学べる[The Architecture of Open Source Applications](https://www.aosabook.org/en/index.html)がすごい

## The Architecture of Open Source Applicationsとは
Vol1~2では48個の(実際には49個ある)OSSのアーキテクチャを、それらの開発者やメンテナが説明する本。なんと無料で読める(PDFやepubで読む場合は有料)。
また、より簡単にアーキテクチャを学ぶ為に、500行ぐらいでスプレッドシートやテンプレートエンジンなどのソフトウェアを作る「500 Lines or Less」もある。これは特にVol1~3で取り上げられている大きいプログラムを読むのがまだ辛い開発者に向けて書かれている。

## 取り上げられているOSS
* nginx
* Git
* Eclipse
* Asterisk
* etc..

上記のような著名なOSSが他に45個解説されている。全編英語ではあるが、図やコードを交えて説明されているので、それほど難しくはないと思う。というか英語を読む訓練になりそう。
Django REST framework (DRF) でModelViewSetを部分的に使いたい

## ModelViewSet
Django Rest Framework(DRF)では`ModelViewSet`というクラスが用意されています.これを使うと基本的なAPIViewをまとめて一発で実装できます.
また,`ModelViewSet`を使えば,`urls.py`に記述する各メソッドのエンドポイントも`rest_framework.routers`クラスを使って簡単に実装できるようになります.安定したURI設計にも役立ちますね.
可読性も良くなります.

`ModelViewSet`には以下のメソッドが実装されています.

```Python
.list()            # 全件取得
.retrieve()        # 1件取得
.create()          # 作成
.update()          # 更新
.partial_update()  # 部分更新
.destroy()         # 削除
```

## 部分的に利用したい
この中で一部のメソッドだけ実装したい場合どうしようとなりました.
APIViewで必要なメソッドだけを選んで逐一実装して行く方法があると思います.しかし今回はViewSetの良さを活かしたいです.

つまり例えば以下のクラス

```Python:views.py
class HogeViewSet(viewsets.ModelViewSet):
```

Createできないようにしたい場合,`CreateAPIView`以外のものを書く
↓

```Python:views.py
class HogeListView(generics.ListAPIView):
class HogeRetrieveView(generics.RetrieveAPIView):
class HogeUpdateView(generics.UpdateAPIView):
class HogeDeleteView(generics.DestroyAPIView):
```

クラス数が増える! `urls.py`の行数も増える!可読性も下がりそう!
そのままの感じでどうにかできないだろうか.

ということが今回の記事の内容です.

## ModelViewSetの中身
Djangoのカスタマイズをしたい場合Githubのレポジトリを見ればいいと考えています.リファレンスももちろん見ます.
[DRFのレポジトリ](https://github.com/encode/django-rest-framework/blob/master/rest_framework/viewsets.py#L217-L227)を確認します.

```Python:/rest_framework/viewsets.py
class ModelViewSet(
                mixins.CreateModelMixin,
                mixins.RetrieveModelMixin, 
                mixins.UpdateModelMixin, 
                mixins.DestroyModelMixin, 
                mixins.ListModelMixin, 
                GenericViewSet): 
    """
    A viewset that provides default `create()`, `retrieve()`, `update()`,
    `partial_update()`, `destroy()` and `list()` actions.
    """
    pass
```
ModelViewSetはGenericViewSetとmixinを多重継承して実装されているだけなのです.

## 不要なmixinを削れば良い
答えはシンプルで不必要なmixinを消せばよいということです.
例えば自作のユーザーモデルについて,ユーザー作成(create)は他の方法(django-allauthとか)で実装したいけどそれ以外の処理は一つにまとめておきたい.そういうモデルビューを作成したい時に今回のやりかたを使いました.

```Python:views.py
from .models import CustomUser
from .serializer import CustomUserSerializer
from rest_framework import viewsets
class CustomUserViewSet(viewsets.ModelViewSet):

    queryset = CustomUser.objects.all()
    serializer_class = CustomUserSerializer
    .
    .
    .
```

↓ 

```Python:views.py
from .models import CustomUser
from .serializer import CustomUserSerializer
from rest_framework import viewsets, mixins

# mixins.CreateModelMixinを継承していないのでcreate()はできない.
class CustomUserViewSet(
                   mixins.RetrieveModelMixin, 
                   mixins.UpdateModelMixin,
                   mixins.DestroyModelMixin,
                   mixins.ListModelMixin,
                   viewsets.GenericViewSet):

    queryset = CustomUser.objects.all()
    serializer_class = CustomUserSerializer
    .
    .
    .
```
できた.

## まとめ
* ViewSetはまとめてくれて便利  
* ModelViewSetはModelmixinとGenericViewSetを継承している.
* メソッドを削減したいならmixinを削ればいい.

見返すとたいした内容ではないのですが
DRFに関する日本語の情報はあまりないので少しでも誰かの役に立てばなあと思います.
何かあればご指摘お願いします.
以上です.ありがとうございました!