OmniAICreator/Qiita-1.07M huggingface dataset:
C++の悩みのほとんどはRustで解決する


[Rust](https://www.rust-lang.org/ja-JP/) を勉強し始めて１年半ほどになりました。
勉強しているうち、C++のデバッグで悩まされる事の多くは、Rustではコンパイラが解決してくれている！と思ったので、紹介します。

※できるだけ平易な言葉を使って、大事なポイントをうまく伝える事に重きを置いて書いています。よって表現として正確ではない部分もあるかも知れませんが、ご了承ください。

対象読者：C++ 中上級者で、Rustに興味がある方


### お悩みその１：「このメモリはいつ確保されていつ開放されるの？」

ある程度C++の経験がある人なら、既存のソースコードをデバッグする時、「このメモリはいつ確保されていつ開放されるのか？」と気にしますよね。そしてそれがわからない場合は、

- ソースコードを目で追って、メモリの状況を頭の中で想像しながら確認する。
- デストラクタでブレークポイントを仕掛けて、実際にプログラムを実行してみる。

こんなことをするんじゃないでしょうか。
shared_ptrを使っていたとしても、その参照カウントがどこで増えてどこで減るのか、気にする必要があります。
つまりC++では、メモリの確保と開放は、実行してみないと分からない状況になっています。

Rustでは、「オーナーシップ（所有権）」という機能により、コンパイル時にメモリの確保と開放のタイミングをすべて決定できるようになっています。
よってメモリの確保・開放のタイミングを気にする必要はありません。


参考：
https://doc.rust-lang.org/book/first-edition/ownership.html （英語）
http://rust-lang-ja.github.io/the-rust-programming-language-ja/1.6/book/ownership.html （日本語）


### お悩みその２：「この変数はいつ誰によって変更されるの？」

C++では、ある変数の書き換えを制限したい場合、クラスのprivateを使うか、constを使うかです。
それ以外の変数については、いつどこから書き換えられるか、管理する方法はなく、プログラマーの頭の中で考えるしかありません。

デバッグするなら、

- 変数名で全検索して、書き換えられる可能性のある箇所を探す
- ウォッチポイントをセットして変数がいつ書き換えられるかを調べる。

こんなことを良くやっているのではないでしょうか。

Rustでは、コンパイラに「これからこの変数を書き換えるよ」と伝える事ができます。そして、ある変数の書き換え権限は、常に誰か１人しか持つことが出来ません。（複数の場所から同じ変数を書き換える様なコードはコンパイルエラーになる）
この制約により、プログラムがすっきりと分かりやすくなります。


参考：
https://doc.rust-lang.org/book/first-edition/mutability.html （英語）
http://rust-lang-ja.github.io/the-rust-programming-language-ja/1.6/book/mutability.html （日本語）


### お悩みその３：「boost使ってみたけど、謎のエラーが大量に出る！」

boostにはテンプレートを使ったライブラリが多くありますが、テンプレートにまつわるコンパイルエラーは、慣れていないと何が悪いのか全くわからないことが多いです。

Rustでもジェネリクス（＝テンプレート）が使えます。そして、型引数に対して、トレイトという制約を掛けることができます。
型引数がトレイトによって示された条件を満たしていない場合は、エラーとなります。
このトレイトをうまく使うことによって、ジェネリクスを使う側に利便性が生まれます。

※C++でも、type_traits を使って、型引数に対する制約をつける事は出来ます。



参考：
https://doc.rust-lang.org/book/first-edition/generics.html （英語）
http://rust-lang-ja.github.io/the-rust-programming-language-ja/1.6/book/generics.html （日本語）



### まとめ

以上、ざっくりと、C++での悩みどころがRustでは解決されている事を紹介しました。
Rustをやり始めると、上に挙げた制限の所為で、「こんな事でコンパイルエラーになるの？？」と戸惑うことが多くあると思います。
最初は、コンパイルエラーとの戦いにうんざりするかも知れません。
でもそのうち、Rustさんが、危険なコードを書かない様に僕を導いてくれている！と感じられるようになるはずです。

また、制限をあえて回避する方法も用意されています。
unsafeでくくれば、生ポインタも使えますし、RefCell/Cellを使えば、書き換え権限のチェックをコンパイル時でなく実行時に行ってくれる様になります。
どうしてもという場面では、このような回避策を使えば、C++と同じ感じでコーディングもできるはずです。

これを機会に、Rustの勉強を始めてみてはいかがでしょうか。
Metabase で始める簡単データ可視化 ～GitBucketデータベースを題材に～

# はじめに

https://twitter.com/takezoen/status/948889886454501378

このツイートで [Metabase](https://www.metabase.com/) というものを知って気になったので試してみた。驚くほど簡単に可視化できたのでメモを投稿してみようと思う。

# インストール（実行？）

metabase.jarをダウンロードしてきて`java -jar metabase.jar`だけでポート3000で待ちうけしてくれる。データベースがカレントディレクトリに出力されるので、そこだけは注意しておく。

# セットアップ

![20180105-211352.png](https://qiita-image-store.s3.amazonaws.com/0/53147/0e398d04-d967-696f-3436-c937f8b50a61.png)

こんな画面からユーザ名と接続するデータベースについて聞かれるので、適当に入力していく。

# グラフ作成

あとはポチポチと選択していくだけでグラフをダッシュボードに追加できる。

![metabase.gif](https://qiita-image-store.s3.amazonaws.com/0/53147/c4795a8f-99e9-b009-e7bd-90dcb1872ee7.gif)

ここではIssue数の推移をダッシュボードに追加している。同じようにしてリポジトリ数・PR数・コメント数などを追加していくことが簡単にできる。
MeCab-ipadic-neologdをshift-jisでコンパイルする 

# MeCab-ipadic-neologdをshift-jisでコンパイルする

## 概要

- MeCab-ipadic-neologdはWindows用には作られていない。だけどデフォルトのシステム辞書だけでは精度が悪すぎる...
- そこでMeCab-ipadic-neologdをLinuxやMacOSでコンパイルしてWindowsに辞書だけを持ってくる方法がある。但しデフォルトの文字コードはutf8。
- 文字コードはShif-JISが一般的であるWindowsのために、MeCab解析をShift-jisで使えるようにコンパイルする方法を紹介。Windowsでも幸せなMeCab生活を送りたい人へのtips。


## 辞書をshift-jisでコンパイル
### Mac(linux)側でやること
1. [MeCab-ipadic-neologd](https://github.com/neologd/mecab-ipadic-neologd)をダウンロード
2. ダウンロードしたディレクトリの中の/libexec/make-mecab-ipadic-neologd.shを以下に編集
	
	```sh:./libexec/make-mecab-ipadic-neologd.sh
	# 上の行のutf8を下の行のようにshift-jisに書き換えてあげる
	# ${MECAB_LIBEXEC_DIR}/mecab-dict-index -f UTF8 -t UTF8 -d ${MECAB_DIC_DIR}/ipadic -u ${NEOLOGD_DIC_DIR}/${SEED_FILE_NAME}.dic ${NEOLOGD_DIC_DIR}/${SEED_FILE_NAME}
	${MECAB_LIBEXEC_DIR}/mecab-dict-index -f UTF8 -t shift-jis -d ${MECAB_DIC_DIR}/ipadic -u ${NEOLOGD_DIC_DIR}/${SEED_FILE_NAME}.dic ${NEOLOGD_DIC_DIR}/${SEED_FILE_NAME}
	```
	
	```sh:./libexec/make-mecab-ipadic-neologd.sh
	# 上の行を下のように編集
	# ${MECAB_LIBEXEC_DIR}/mecab-dict-index -f UTF8 -t UTF8
	# ${MECAB_LIBEXEC_DIR}/mecab-dict-index -f UTF8 -t shift-jis
	```

3.  MeCab-ipadic-neologdを下のコマンドでコンパイル

	``./bin/install-mecab-ipadic-neologd -n``
	
4. buildで出来上がったディレクトリの下にあるsys.dicとunk.dicをWindowsマシンに渡してあげる


## Windowsでやること
mecabは事前に入っているという前提.
以下のコマンドを叩く

``mecab -d hoge-directory		# sys.dicとunk.dicを置いた場所のパス``

そもそもShift-JISを使って開発してることに驚きを隠せないが・・
後輩が困っていたら教えてあげて下さい。

## 参考にしたページ
http://sky-y.hatenablog.jp/entry/2015/07/08/190456
DB2DBA: DB2 11.1のPDFマニュアルが公開されました

DB2 11.1からはPDFのマニュアルが廃止されてオンラインマニュアルのみの提供となっていたのですが、2017年12月にPDF版の提供が再開されました。

- [Db2 Version 11.1 for Linux, UNIX, and Windows English Manuals](http://www-01.ibm.com/support/docview.wss?uid=swg27050624)

PDFのマニュアルは、更新頻度はオンラインマニュアルに劣るものの、スムーズな閲覧が可能でオフラインでも読むことが出来るため、利用されている方も多かったかと思います。DB2-L[^1]には[復活を望む声](http://www.idug.org/p/fo/et/thread=46656)が寄せられており、[RFE](http://www.ibm.com/developerworks/rfe/execute?use_case=viewRfe&CR_ID=103623)にも多くの投票がありました（私も投票済み）。

なお、この記事の執筆時点では英語版のみの提供で、全マニュアルが網羅されておらずメッセージリファレンス等がありません。体裁も以前より簡素になっています。今後に期待？

### 2018/04/22追記
2018年2月と4月にいくつかのマニュアルが追加されました。

[^1]: [IDUG (International DB2 User Group)](http://www.idug.org) が運営するDB2に関するメーリングリスト
とりあえずこいつは入れてけ！google chromeのアドオンたち（随時更新予定）

# はじめに
快適にネットサーファイン、開発をするために自分が思うchromeに入れておくべきアドオンを備忘録として残しておきます。

# セキュリティ向上系
## [AdBlock](https://getadblock.com/)
広告をブロック、yotubeのCMもこれで消せます
これを入れるだけで画面がすっきりするのでオススメ

## [LastPass](https://www.lastpass.com/ja)
* クラウド型のパスワード管理サービスであるため、どのブラウザ、端末でも使用可能
* 無料ユーザでも他デバイスとの同期、パスワード保存数無制限
* Safariからも使用できるため、スマホでも使用可能

詳細は下記参照
http://www.cp-daijin.com/lastpass

# Web開発系
## [Full Page Screen Capture](https://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&uact=8&ved=0ahUKEwj0nOKOycDYAhVHE5QKHXNWBmIQFggoMAA&url=https%3A%2F%2Fchrome.google.com%2Fwebstore%2Fdetail%2Ffull-page-screen-capture%2Ffdpohaocaechififmbbbbbknoalclacl&usg=AOvVaw2di8RLMhlSlbeB7zqzA1sA)
webページ全体のスクリーンショットが撮れる
実はアドオンなしでも同様のことはできるが、手順が面倒

## [JSON Formatter](https://chrome.google.com/webstore/detail/json-formatter/bcjindcccaagfpapjjmafapmmgkkhgoa?hl=en)
JSON形式を改行とハイライトを入れて見やすくします

# [Page Ruler](https://chrome.google.com/webstore/detail/page-ruler/jlpkojjdgbllmedoapgfodplfhcbnbpn)
* ウェブページ上で「ものさし」が使えるようにしてくれる拡張機能
* 要素の大きさを簡単に測ることができる

# その他
## [vimium](http://vimium.github.io/)
vimキーバインドでGoogle Chromeを使えるようにできるプラグイン
これがvimmerにとって結構便利なんだ

# 終わりに
セキュアに開発するために、環境を見直してみました。随時更新していくので、暖かく見守っていてください。
Udemyの「【UE4】Unreal Engine 4 + VR で建築ビジュアライゼーション」でドアノブの処理を改善してみた

# はじめに

[Udemy](https://www.udemy.com)で @shop_0761 さんの[【UE4】Unreal Engine 4 + VR で建築ビジュアライゼーション](https://www.udemy.com/unrealengine-4-archviz-vr/)をやってみて気になる挙動があったので改善してみました。

# 気になる部分

この講座ではVR内にドアを設置してコントローラーでドアノブを回すとドアを開けるようになります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/8995/23c32be2-3543-b511-9493-5b64b044e14a.png)

ドアノブを掴むと`Pickup` イベントが呼ばれて手のオブジェクトとなる `Contoller` を非表示にします。
そしてドアノブを離すと `Drop` イベントが呼ばれて `Controller` を再表示しています。

この時に両手でドアノブを掴むと次のように先に握った手が消えたままになります。

1. 右手でドアノブを掴む
    * 右手が消える → OK
1. 左手でドアノブを掴む
    * 左手で掴み直して消える → OK
    * 右手も消えたまま → 掴んでない手は再表示したい

更にどちらの手から先に離してもおかしな事になります。

* 先に右手を離す
    1. 左手も離して再表示される → 左手は掴んだままにしたい
    1. 右手は消えたまま → 離した手は再表示したい
* 先に左手を離す
    1. 左手は再表示される → OK
    1. 右手は消えたまま → 掴んでいない手は再表示したい

これを後から掴んだ手がドアノブを掴み、先に掴んでいた手を再表示する。
また先に掴んでいた手を離しても何もしないといった改善をしてみます。

# ドアノブを掴む処理の改善

改善するに当たってまずは仕様を決めます。

1. 後から掴んだ手がドアノブを掴む
1. 先に掴んでいた手を再表示する
1. 先に掴んでいた手を離しても何もしない

最初の項目は実現できているので残り2つを改善したのがピンクの線で囲んだ部分です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/8995/e63769eb-72d7-3e74-f591-2dd8e0e4258b.png)


## 先に掴んでいた手を再表示する

`Pickup` イベントが呼ばれた時に既に掴んでいるか判定できればよいので `Controller` が有効かどうかで分岐します。

* `Drop` イベントで `Set Visibility` の後に `Controller` を破棄する
* `Pickup` イベントで `Attach To` を `Controller` に代入する前に `IsValid` 関数の結果が `Is Valid` なら `Set Visibility` で表示する

どちらかの手でドアノブを掴んでいれば `Controller` を有効、両手を離していれば `Controller` を無効にしているわけです。


## 先に掴んでいた手を離しても何もしない

`Drop` イベントが呼ばれた時にどっちの手を離したのか分からないのでちょっと詰まったのですが、VR Templateから持ってきたBPを改造して実現できました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/8995/5efb1050-e36d-cdc1-d091-58988a43c700.png)

まずは `VirtualRealityBP/Blueprints/PickupActorInterface` の `Drop` のInputsに変数を追加します。
次に `VirtualRealityBP/Blueprints/BP_MotionController` の `ReleaseActor` グラフで `Drop` の引数 `DettachFrom` に `MotionController` をつなぎます。

これでドアの `Drop` イベントが呼ばれた時に離した手を取れるようになったので変数 `Contoller` と比較して同じなら後から掴んだ手なので処理を進める、違うなら先に掴んでいた手なので何もしない、として判定できるようになりました。

# さいごに

VR Templateを使うと簡単に掴み処理を実装できたり、改造も割と簡単にできるので導入におすすめです。
ここから更に両手で掴んだ時に拡大縮小したり色々発展できそうです。
TypeScript を使って Alexa Custom Skills を作ろう (0) はじめに

# 背景
元々、.NET Framework(VB.NET や C#)を利用したクライアントアプリを作っていた。
そんな中、Alexa の開発に関わることで最近やっと？ Node.js(JavaScript) を触り始めた。

新しい言語を使うことに抵抗感は全く無いが、型付き言語に慣れてしまったことで
JavaScript はものすごい違和感があった。

そこで TypeScript。

Microsoft 社製なので、 TypeScript があることは前から知っていた。
絶好の機会に恵まれたので、 Alexa Custom Skill を TypeScript で作ってしまおうとふと思った。

# この投稿について
音声設計などは公式ページに丁寧な説明があるので、この投稿では何回かに分けて、
TypeScriptで実装する上でどう作っていくか、実装、単体テストまでを私の経験を元に投稿していく予定です。
余裕があったら、デプロイ〜申請もやりたいな。

# TypeScript を使って Alexa Custom Skills を作ろう　目次

1. TypeScript を使って Alexa Custom Skills を作ろう (0) はじめに
1. [TypeScript を使って Alexa Custom Skills を作ろう (1) 設計](https://qiita.com/daisukeArk/items/c22f7f4e4f231d05dd51)
1. [TypeScript を使って Alexa Custom Skills を作ろう (2) 環境構築](https://qiita.com/daisukeArk/items/f5cbc6065308ecd735b7)
1. [TypeScript を使って Alexa Custom Skills を作ろう (3) 実装 - ハンドラ](https://qiita.com/daisukeArk/items/56e53c2970d6a6f5c808)
1. [TypeScript を使って Alexa Custom Skills を作ろう (4) 実装 - インテント](https://qiita.com/daisukeArk/items/53a45115d1530cb8782f)
1. [TypeScript を使って Alexa Custom Skills を作ろう (5) 実装 - 発話](https://qiita.com/daisukeArk/items/e95028597daae6d3d110)
1. [TypeScript を使って Alexa Custom Skills を作ろう (6) 単体テスト](https://qiita.com/daisukeArk/items/afa12708810a6b0b0fde)

# 番外編

1. [TypeScript を使って Alexa Custom Skills を作ろう 番外編 機能テスト](https://qiita.com/daisukeArk/items/9abda17f2bf79ca6357e)
1. [TypeScript を使って Alexa Custom Skills を作ろう 番外編 カバレッジ
](https://qiita.com/daisukeArk/items/220f543512351099f276)
1. [TypeScript を使って Alexa Custom Skills を作ろう 番外編 localstack](https://qiita.com/daisukeArk/items/45fb4cc5ca127f745aaa)
1. [ASK CLI を使って Alexa Custom Skills をデプロイしよう (1) 設計 〜 環境構築](https://qiita.com/daisukeArk/items/ecd9687b44969917ddd7)
1. [ASK CLI を使って Alexa Custom Skills をデプロイしよう (2) buildspec作成 〜 デプロイ](https://qiita.com/daisukeArk/items/873b0cf553a6ce436258)

# まとめ
あまり間が空かないよう短い期間で投稿していきます！
フワっとしたPopupを出してみる。

## 見た目
![movie.gif](https://qiita-image-store.s3.amazonaws.com/0/57541/cd6515a6-9806-6843-527b-0d4a30a178bd.gif)

(gifだとわかりづらい…orz)

## 処理抜粋
```PopupViewController.swift

    override func viewDidLoad() {
        super.viewDidLoad()
        
        self.baseViewWidthConstraint.constant = 0
        self.baseViewHeightConstraint.constant = 0
        self.view.layoutIfNeeded()
    }

    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        self.baseViewWidthConstraint.constant = 250
        self.baseViewHeightConstraint.constant = 250

        UIView.animate(withDuration: 1.2, delay: 0.3, usingSpringWithDamping: 0.6, initialSpringVelocity: 10, options: .curveEaseOut, animations: { () -> Void in
            
            self.baseView.alpha = 1.0
            self.view.layoutIfNeeded()
            
        }, completion: nil)
    }
```
・AutoLayoutでPopupのサイズをいじってアニメーションを実現しています。
・高さも変えるため、baseViewのHeightの制約のPriorityを下げています。

## コードはこちらです。
https://github.com/tony1224/PopupAnimationSample

もう少し滑らかでくっきりとバウンドがわかるような処理にしたい（´・ω・｀）
[Swift]UITableViewCellをregisterしなくて良いようにしたい

dequeueするタイミングでregisterしてなかったら自動でregisterすれば良くない？って思ったので実装してみた。
XIBとクラスを一緒にして型名でregister/dequeueしていること前提です。

```swift
public extension UITableView {
  func register<T: UITableViewCell>(_ cellType: T.Type) {
    let className = cellType.className
    let nib = UINib(nibName: className, bundle: nil)
    register(nib, forCellReuseIdentifier: className)
  }
  
  func dequeue<T: UITableViewCell>(_ cellType: T.Type, indexPath: IndexPath) -> T {
    return dequeueReusableCell(withIdentifier: cellType.className, for: indexPath) as! T
  }
}

var AssociatedObjectHandle: UInt8 = 0

public extension UITableView {
  var registeredClasses: [UITableViewCell.Type] {
    get { return ((objc_getAssociatedObject(self, &AssociatedObjectHandle) ?? 0) as? [UITableViewCell.Type]) ?? [] }
    set { objc_setAssociatedObject(self, &AssociatedObjectHandle, newValue, .OBJC_ASSOCIATION_RETAIN) }
  }
  
  public func retrieve<T: UITableViewCell>(_ cellType: T.Type, indexPath: IndexPath) -> T {
    if !registeredClasses.contains(where: { $0 === cellType }) {
      register(cellType)
      registeredClasses.append(cellType)
    }
    return dequeue(cellType, indexPath: indexPath)
  }
}
```

使う時は

```swift
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.retrieve(CustomTableViewCell.self, indexPath: indexPath)
    return cell
}
```

UITableViewにregisterする必要はありません。

# 解説

retrieveを呼んだタイミングでregisterしていなければしているだけ

# まとめ

実装してみたもののcellAtRowのパフォーマンスに影響無いか不安（あっても初回だけだと思うけど）
どうなんだろうなぁこの実装
あと`retrieve`はもっと良い名前ありそう
iphone5でもヌルヌルコンテンツ全体をスライドできるような仕組みを考える。


![img_20180105_194834.jpg](https://qiita-image-store.s3.amazonaws.com/0/206790/22ecdb64-66d7-039e-5bca-0607a9acd522.jpeg)

コンテンツ全体をスライドさせる。  

jsを使い、次へ、前へボタン押下で現在表示されているliタグに `is_active` を `.addClass（'is_active'）` させ、  
`.is_active:marign:-20%;` させる
* liタグにはcssで `transition:all .5s ease` をつけている
* 前へを押下すると、現在表示されているliタグから`.removeClass（'is_active'）`
* 現在の居場所は、コンテンツ全体を管理する `<div id="location">` に、 `data属性` で数字を１~5まで与えている。

これでスライドショーが完成。  

ところが、 `margin-20%` 　だと、iphone5でカクカクしながらスライドした。  
  
`margin-20%` を `translateX(-100%)` に変更。  

iphone5では２つめのliタグまでは滑らかに動いたが、`3つ目のスライドからアニメーションが無くなった`（ように見える）  

画面枠いっぱいに横並びさせたコンテンツをアニメーションしながらスライドさせる場合、 `スライドを重ねるごとにどんどん処理が重くなるのでは` と仮設を立てた。   

まだ実験はしていないので、どこかでやります！  

いい回避方法はないだろうか・・・
High Sierra で bundle install 時に libv8 と therubyracer がインストールできない

## 概要
新しい ruby のバージョンを入れて bundle install するとコケる

## 結果
MacOS High Sierra 上の v8 を使うのだが、 brew で v8 を アップデートすると 5系や 6系がインストールされてしまうので、3系を指定してインストール。

```bash
$ brew install v8-315
$ gem install libv8 -v '3.16.14.19' -- --with-system-v8
$ gem install therubyracer -- --with-v8-dir=/usr/local/opt/v8@3.15/
```

どの記事のコマンド叩いても therubyracer がエラー吐いて終わるので、 2018年1月5日時点での対応をメモ。
シングルファイルコンポーネント内で Font Awesome をクラス指定で使う

宮崎在住エンジニアのジョウ(@JotarO_Oyanagi) です。

[Font Awesome](https://fontawesome.com/) の ver.5 が出たということで、Vue で使いたいと思い[公式](https://github.com/FortAwesome/vue-fontawesome)をみたところ「コンポーネントとして使う」という内容が目に...。

いやいや普通にクラス指定で使いたいと思ったので、以下の方法で import しました。

# TL;DR
- Font Awesome 5 をシングルファイルコンポーネント内で使う
- npm でインストールした css ファイルを import（web font として使用）
- メインとなる js ファイルで読み込んでおけば、vue ファイルごとに読み込まなくてOK

# 実装してみる
まずは Font Awesome（free 版） をインストールします。

```
npm install --save @fortawesome/fontawesome-free-webfonts
```

次に、インストールしたファイルをメインとなる js ファイルから import します。

```javascript:main.js
import Vue from 'vue'

// Font Awesome のメインファイルを import

import '@fortawesome/fontawesome-free-webfonts/css/fontawesome.css'

// 使用するカテゴリーのファイルを import

import '@fortawesome/fontawesome-free-webfonts/css/fa-brands.css'
import '@fortawesome/fontawesome-free-webfonts/css/fa-regular.css'
import '@fortawesome/fontawesome-free-webfonts/css/fa-solid.css'

new Vue({
  el: '#App',
  ...
```

あとはそのプロジェクトで使用する .vue ファイル内で、従来のクラス指定の方法で Font Awesome が使えます。

```html:component.vue
<template>
  <div>
    <i class="fab fa-accessible-icon"/>
  </div>
</template>
```

一点注意としましては、対応するのアイコンのカテゴリー用クラスも一緒に付ける必要があります。
（上記の例では `fab`）

カテゴリーは現時点で以下の4種類のようです。
対応するクラスを併記します。

- **Solid** : `fas`
- **Regular** : `far`
- **Light** : `fal`
- **Brands** : `fab`

**Light は free 版にはない**ようなので、free 版なら３種のカテゴリーを使用できます。

参考：[Font Awesome アイコン一覧](https://fontawesome.com/icons?d=gallery&m=free)

# おわりに
free 版でも900以上のアイコンが使える Font Awesome 5。
SVG でも使えるので、 とても重宝しています。

# 参考資料
- JS Component Packages | How to Use | Font Awesome 5
  - [https://fontawesome.com/how-to-use/js-component-packages](https://fontawesome.com/how-to-use/js-component-packages)
- icons (free) | Font Awesome 5
  - [https://fontawesome.com/icons?d=gallery&m=free](https://fontawesome.com/icons?d=gallery&m=free)
「knife cookbook create」から「chef generate cookbook」へ

## 環境
```
Mac OS X 10.12.6
```

```sh
$ knife -v
Chef: 13.6.4
```

よーし、ひさびさにchefでrecipeでも書いてみるかー！ :muscle: 


https://tsuchikazu.net/chef_solo_start/
を参考にcookbookの雛形を作成して、、と。

```sh
$ knife cookbook create unicorn -o site-cookbooks
Error: invalid option: -o
USAGE: Usage: /Users/paranishian/.rbenv/versions/2.4.1/bin/knife (options)
...
```

あれ、オプションがない... :thinking: 

オプションなしで実行。 

```sh
$ knife cookbook create unicorn
FATAL: knife cookbook create has been removed. Please use `chef generate cookbook` from the ChefDK
```

おうふ、、、コマンドが変わったっぽい。。
http://d.hatena.ne.jp/rougeref/20170426

## ChefDKのインストール
以下からdmgをDLしてpkgインストール。
https://downloads.chef.io/chefdk

```sh
$ chef -v
Chef Development Kit Version: 2.4.17
chef-client version: 13.6.4
delivery version: master (73ebb72a6c42b3d2ff5370c476be800fee7e5427)
berks version: 6.3.1
kitchen version: 1.19.2
inspec version: 1.45.13
```

`chef`コマンドできた。 :clap: 

## cookbook作成
cookbook作成のパス指定オプションがないようなので自分で移動して作成。。

```sh
$ cd site-cookbooks/
$ chef generate cookbook unicorn
Generating cookbook unicorn
- Ensuring correct cookbook file content
- Ensuring delivery configuration
- Ensuring correct delivery build cookbook content

Your cookbook is ready. Type `cd unicorn` to enter it.

There are several commands you can run to get started locally developing and testing your cookbook.
Type `delivery local --help` to see a full list.

Why not start by writing a test? Tests for the default recipe are stored at:

test/smoke/default/default_test.rb

If you'd prefer to dive right in, the default recipe can be found at:

recipes/default.rb
```

## template作成

```sh
$ chef generate template site-cookbooks/unicorn unicorn_app
Recipe: code_generator::template
  * directory[site-cookbooks/unicorn/templates] action create
    - create new directory site-cookbooks/unicorn/templates
  * template[site-cookbooks/unicorn/templates/unicorn_app.erb] action create
    - create new file site-cookbooks/unicorn/templates/unicorn_app.erb
    - update content in file site-cookbooks/unicorn/templates/unicorn_app.erb from none to e3b0c4
    (diff output suppressed by config)
```

chef卒業してitamaeでも導入していこうかな :sunglasses:
スイスの地図

[スイスの地図](https://map.geo.admin.ch/)はブラウザからアクセスできる。
[モバイルアプリ](https://shop.swisstopo.admin.ch/en/products/maps/SwissMapMobile_Abo)も存在するが有料である。

開発に使えそうなものは、[WMTS](https://www.geo.admin.ch/fr/geo-services-proposes/geoservices/services-de-consultation-applications-cartographie-en-ligne-sig-web/web-map-tiling-services-wmts.html)で1種類と[WMS](https://www.geo.admin.ch/fr/geo-services-proposes/geoservices/services-de-consultation-applications-cartographie-en-ligne-sig-web/web-map-services-wms.html)で2種類存在している。

[WMTS](http://wmts.geo.admin.ch)は登録ドメインからのアクセスが必須であり、自己ドメインを所有していないと使用できないため、敷居が高い。

[WMSの一つ](http://wms.geo.admin.ch)は、何の制限もなくアクセスできるが、内容的には主題図にあたり、地形図のようなものは含まれていない。

[WMSのもう一つ](https://wms.swisstopo.admin.ch/)は、ユーザ登録が必要であり、アクセス時にユーザIDとパスワードを求められるが、何種類かのベースマップがあるため、単なる地図アプリの開発には最適である。
はじめてのモデリング

#はじめに
姉が「バーチャルYouTuberになりたい！！！」というので、3Dモデル制作に取り組むことにしました。文章を書くのは得意ではないのですが、備忘録として制作過程を記事にしていこうと思います。
#使用したソフト
今回はblenderを使用してモデルを作成していきます。
参考にしたのは榊政宗さんの「東北ずん子で覚える！アニメキャラクターモデリング」という本。これ、すごく分かりやすいです！手順が細かく書かれているのでこれ通りにやればできそうな気がします。がんばります。
#キャラクターデザイン
![VY.jpg](https://qiita-image-store.s3.amazonaws.com/0/228547/ce91b120-e711-9b5d-655e-002dec9afc6f.jpeg)
姉の要望を取り入れつつ、チャイナ×バニーな女の子をデザインしました！この子をblenderで作っていきたいと思います。

#下絵の準備
![正面1.jpg](https://qiita-image-store.s3.amazonaws.com/0/228547/416b0f3a-c511-2d5e-c125-3e2c8efcbf25.jpeg)
とりあえず服は取っ払って作っていきます。なんだか髪のもっさり感が足りない…。横の図も描いたのですが、どうやら東北ずん子の参考書では使用しないようなのでお蔵入りに。
#モデリング
実は作り始めたときは記事にする気がなかったので、途中経過の図がなくて申し訳ないです。手順としては

下絵の読み込み
　　↓
カメラの準備（アイラインと水平線を合わせる）
　　↓
四角形を左足に合わせて、上面を押し出し箱人間を作成
　　↓
【細分割曲面】を選択して箱人間を棒人間に
　　↓
頂点や辺を追加しながらひたすら調整していく
このような流れで取り組みました。

そして現在の状態がこちら。
![test.jpg](https://qiita-image-store.s3.amazonaws.com/0/228547/d5a80716-8e8e-906f-67a1-6c8869f13c4c.jpeg)
ここまでで約7時間。なれてないとなかなか難しいですね…！でもなんだか形になってきた気がする！
肩甲骨が上手にできたので見てもらいたい。
![キャプチャ.jpg](https://qiita-image-store.s3.amazonaws.com/0/228547/2197ea6e-0dc6-e53e-e632-681d8b2bb8e7.jpeg)
難しかったのは、胸とお尻です。綺麗な凹凸のラインをモデリングするのって難しい。
それでは次はいよいよ顔に移ります！楽しみ…！また進んだらぼちぼち書いていこうと思うのでよろしくお願いします。
#よく使うショートカット
・【z】ワイヤーフレームとソリッドの切り替え
正直これとテンキーくらいしか使ってない気がする…。何か便利なショートカットあれば教えてください。
Google Apps ScriptでGmailの情報を取得する際に、受信日時を細かく指定する方法。

#やりたいこと
Google Apps Scriptを使ってGmailの情報を取得する際に、受信日時を細かく（分単位）で指定したい。

##それでができると何が良いの？
**スクリプトに重複取得時の挙動を書く必要がなくなります。**

Gmailから定期的に該当するメールを検索して取得するスクリプトにおいて、抽出対象の時間とトリガーの時間を一致させます。
そうすることで、同じメールが重複して取得されることがないため、後続での重複制御が不要になります。（たぶん）

例）
**検索条件：受信日時が今から5分前**
**トリガー：5分毎に実行**

#完成したコード

```javascript:Code.gs
function searchMail(){

  // Gmailから特定条件のスレッドを検索しメールを取り出す
   //受信日時指定
  const date = new Date() ;//現在時刻を取得
  const unixTime = date.getTime();//UNIX TIMEに変換
  const now = Math.floor(unixTime/1000); //ミリ秒を秒に変換
  const term = now - 300; //現在時刻から5分（300秒）前
  const termStr = term.toString(); //検索期間を文字列に変換
   //検索条件指定
  const srchCondition = [ //検索条件を配列で格納
  '（検索条件その1）',
  '（検索条件その2）'  
  ].join("\u0020"); //半角スペースで連結

  const strTerms = 'after:'+ term +' '+ srchCon; //検索条件：termの期間に、srchConの条件に合致するメール
  const myThreads = GmailApp.search(strTerms, 0, 30); //条件にマッチしたスレッドを取得
  const myMsgs = GmailApp.getMessagesForThreads(myThreads); //スレッドからメールを取得する

/**
あとは取得した情報を煮るなり焼くなりする。
**/
}
```
##コードの説明

###前段：Gmailの検索条件について
[Gmailのヘルプ](https://support.google.com/mail/answer/7190)には、日付単位での指定方法しか書いてありません。

|説明|検索演算子と例|
|:--|:--|
|指定した期間に送信されたメールを検索します|after:<br>before:<br>older:<br>newer:<br>例: after:2004/04/16<br>例: before:2004/04/18|
|日（d）、月（m）、年（y）を指定して、それより古いメールか新しいメールを検索します|older_than:<br>newer_than:<br>例: newer_than:2d|

しかしながら、UNIX時間（エポック時間）を指定して検索することもできるので、これを利用します。
[Gmail非公開テクニック：時間帯を指定してメール検索 | ライフハッカー［日本版］](https://www.lifehacker.jp/2016/12/161221_gmail_timesearch.html)

>Gmail検索において「after」「before」のパラメータを先ほどのエポック時間で入力し、メールの検索を>します。すると、特定した2つの時間の間に受信したメールが表示されるのです。

###コードの中身の説明

```javascript:Code.gs
function searchMail(){

  // Gmailから特定条件のスレッドを検索しメールを取り出す
   //受信日時指定
  const date = new Date() ;//現在時刻を取得
  const unixTime = date.getTime();//UNIX時間に変換
  const now = Math.floor(unixTime/1000); //ミリ秒を秒に変換
```
コメントに書いてある通りの内容ですが、**getTimeで取得したUNIX時間はミリ秒で返ってくるので、秒に変換するのがポイントです。**

```javascript:Code.gs
   //検索条件指定
  const srchCondition = [ //検索条件を配列で格納
  '（検索条件その1）',
  '（検索条件その2）'  
  ].join("\u0020"); //半角スペースで連結
```
受信日時だけ指定することもあまりないと思うので、検索条件も指定しておきます。
一行でつらつら書いても良いのですが、配列で書くと見やすいです。

```javascript:Code.gs
  const strTerms = 'after:'+ term +' '+ srchCon; //検索条件：termの期間に、srchConの条件に合致するメール
  const myThreads = GmailApp.search(strTerms, 0, 30); //条件にマッチしたスレッドを取得
  const myMsgs = GmailApp.getMessagesForThreads(myThreads); //スレッドからメールを取得する
```

「after:（UNIX時間）（検索条件）」でメールの検索をして、結果を取得しています。
あとはここから必要な情報を取り出して、煮るなり焼くなり調理してもらえればOKです。

#関連URL
- [Gmail非公開テクニック：時間帯を指定してメール検索 | ライフハッカー［日本版］](https://www.lifehacker.jp/2016/12/161221_gmail_timesearch.html)
- [【GAS】Gmailに送られた過去のメールから特定条件のメールを検索して取得する](https://tonari-it.com/gas-gmail-search-thread/)
SQLデータ分析入門#6『結果の順番をいい感じにする』

[SQLデータ分析入門#5『集計関数を理解する』 - Qiita](https://qiita.com/piyoSakai/items/16214cd50e28386c97ed)
の続き

# 本記事のスコープ
- ～順で並べ替えることができるようになる
- 具体的には「ORDER BY」が出来るようになる

# 例えば
こんなテーブルがあったときの実行結果
![image.png](https://qiita-image-store.s3.amazonaws.com/0/214098/d8a14513-5820-863f-2430-8db5139902d9.png)

## 身長ちいさい順にしたい
```SQL
SELECT *
FROM User
ORDER BY 身長 -- 身長で並び替える宣言
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/214098/056d546c-acc0-47fb-24f8-a468d435d60e.png)


## 身長おおきい順にしたい
```SQL
SELECT *
FROM User
ORDER BY 身長 DESC -- DESCってのが身長「大きい順」にする宣言
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/214098/eff7ac62-ea53-b210-ba24-9f6d93283b1a.png)

## IDと身長だけを引っ張ってくるとき、身長順にしたい
```SQL
SELECT ID, 身長
FROM User
ORDER BY 2 -- SELECT文の2つめの項目で並び替える宣言
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/214098/39bf3d50-3309-8f11-7d94-8340ade6ac06.png)

# どんなときに使うの？
あるテーブルの直近のレコード1000件見てみたい、みたいなとき。
(テーブルは基本的にどんどん下にレコードが追加される)

```SQL
SELECT *
FROM Large_table
LIMIT 1000
```
だと、最初の(最も古い)1000件が出てくるけど

```SQL
SELECT *
FROM Large_table
ORDER BY ID -- IDが古い順に振られているとして
LIMIT 1000
```

だと、最新の1000件を見ることができる


# 推薦図書
よくあるSQL本はエンジニア向けなのですが、この本は分析をしたいだけの人に向いてます。
<a href="https://www.amazon.co.jp/10%E5%B9%B4%E6%88%A6%E3%81%88%E3%82%8B%E3%83%87%E3%83%BC%E3%82%BF%E5%88%86%E6%9E%90%E5%85%A5%E9%96%80-SQL%E3%82%92%E6%AD%A6%E5%99%A8%E3%81%AB%E3%83%87%E3%83%BC%E3%82%BF%E6%B4%BB%E7%94%A8%E6%99%82%E4%BB%A3%E3%82%92%E7%94%9F%E3%81%8D%E6%8A%9C%E3%81%8F-Informatics-IDEA-%E9%9D%92%E6%9C%A8/dp/4797376279/ref=as_li_ss_il?ie=UTF8&qid=1529821989&sr=8-1&keywords=10%E5%B9%B4%E6%88%A6%E3%81%88%E3%82%8B%E3%83%87%E3%83%BC%E3%82%BF%E5%88%86%E6%9E%90%E5%85%A5%E9%96%80&linkCode=li2&tag=t11378rs0f-22&linkId=904d97de322a8c31a37e518e1ef2a7a8" target="_blank"><img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&ASIN=4797376279&Format=_SL160_&ID=AsinImage&MarketPlace=JP&ServiceVersion=20070822&WS=1&tag=t11378rs0f-22" ></a><img src="https://ir-jp.amazon-adsystem.com/e/ir?t=t11378rs0f-22&l=li2&o=9&a=4797376279" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />

# 前後の記事
[SQLデータ分析入門#1『SQLってなんだ』 - Qiita](https://qiita.com/piyoSakai/items/926b8f46b08c4a9d439a)
[SQLデータ分析入門#2『SELECT ~ FROM ~ を理解する』 - Qiita](https://qiita.com/piyoSakai/items/b001eac8e0981244be39)
[SQLデータ分析入門#3『WHERE句を理解する』 - Qiita](https://qiita.com/piyoSakai/items/44bc21178349103e2d45)
[SQLデータ分析入門#4『LIMIT句を理解する』 - Qiita](https://qiita.com/piyoSakai/items/131553cbc40ac357477f)
[SQLデータ分析入門#5『集計関数を理解する』 - Qiita](https://qiita.com/piyoSakai/items/16214cd50e28386c97ed)
[SQLデータ分析入門#6『結果の順番をいい感じにする』 - Qiita](https://qiita.com/piyoSakai/items/6008c62a88554a44eb2a)
[SQLデータ分析入門#7『複数のテーブルにまたがって集計する』 - Qiita](https://qiita.com/piyoSakai/items/84bd688b4e4db2148193)
[SQLデータ分析入門#8『基本的な関数を知る』 - Qiita](https://qiita.com/piyoSakai/items/f79869a5b60ab7e8c3b2)
javascript promiseでresolve実行前に次の関数が実行されてしまう

記事のタイトルが微妙ですが、自分の備忘録であるので。
promiseチェーンを作るときに、Promise機能を持つ関数にreturnを付け忘れるとまずい。
下記の例で言うと、second内のresolveに辿り着く前にthirdが実行される。

javascriptもpromiseも雰囲気で触っているのでやばい。

```js
first().then(() => {
})
.then(() => {
  return second();
})
.then(() => {
  return third();
})
```
UIImageの画像が黒っぽいか白っぽいかどうか判別するExtension

# やりたいこと
画像が黒っぽい画像か白っぽい画像かを判定する


# 実装

## 1.CGImageのextensionを作成
以下のswiftファイルをプロジェクトに追加する。閾値や明るさの定義は好みで修正していただければと思います。<br>

``` CGImage+.swift
//
//  CGImage+.swift
//
//  Created by Hiromasa Suzuki on 1/5/17.
//  Copyright (c) 2017 Hiromasa Suzuki. All rights reserved.
//
import UIKit

extension CGImage {
    var isDark: Bool {
        get {
            guard let imageData = self.dataProvider?.data else { return false }
            
            // ピクセルレベルで画像の色を取得
            guard let ptr = CFDataGetBytePtr(imageData) else { return false }
            
            // CFDataの長さを返す
            let length = CFDataGetLength(imageData)
            
            // 閾値(各人で調整)
            let threshold = Int(Double(self.width * self.height) * 0.45)
            var darkPixels = 0
            
            // 閾値のループ
            for i in stride(from: 0, to: length, by: 4) {
                let r = ptr[i]
                let g = ptr[i + 1]
                let b = ptr[i + 2]
                
                // 明るさ(各人で調整)
                let luminance = (0.299 * Double(r) + 0.587 * Double(g) + 0.114 * Double(b))
                if luminance < 150 {
                    darkPixels += 1
                    
                    // 閾値を超えたら黒っぽい画像とする
                    if darkPixels > threshold {
                        return true
                    }
                }
            }
            // 最後まで閾値を超えなかったら、白っぽい画像とする
            return false
        }
    }
}

```
こちらにGist格納してます。
https://gist.github.com/suzuhiroruri/aa83814042bb04120d91c03991f47c89


## 2.CGImageのextensionを使用する
``` 
// 適当にUIImageのインストタンスを生成(適宜変える)
let image:UIImage = UIImage(named:"sample.jpg")!
                
// extensionを使い、Boolで返却値を取得
guard let isDark = image.cgImage?.isDark else {
  return
}

// 黒っぽいか白っぽいか出力
if isDark {
  print("黒っぽい")
}else{
  print("白っぽい")
}
```
awscliでs3コマンドが使用する最大帯域幅をコントロール

#概要
[AWS CLI S3 Configuration](https://docs.aws.amazon.com/cli/latest/topic/s3-config.html#max-bandwidth)

- `1秒あたりのバイト数`で値を定義できる
- `1048576`だと最大帯域幅使用量を1MB/sに設定
- レートサフィックスは、`KB/s、MB/s、GB/s`

```
[profile development]
aws_access_key_id=foo
aws_secret_access_key=bar
s3 =
  max_concurrent_requests = 20
  max_queue_size = 10000
  multipart_threshold = 64MB
  multipart_chunksize = 16MB
  max_bandwidth = 50MB/s
  use_accelerate_endpoint = true
  addressing_style = path
```

#検証

- `100MB`のダミーファイルをローカルからS3にUploadする
その時の帯域幅制限は`10MB/s`とする


##設定

```~/.aws/credentials
(snip)
s3 =
  max_bandwidth = 10MB/s
(snip)
```

##結果

```
$ time aws s3 cp 100mb.txt s3://<bucket-name>/<folder-name>/
upload: ./100mb.txt to s3://<bucket-name>/<folder-name>/100mb.txt

real    0m11.222s
user    0m2.199s
sys 0m0.508s
```
- 帯域幅は9MB/sで頭打ちになりました

#考察
~~くそでかい~~大きなファイルを頻繁にやりとりするような要件があれば、Fitしますね
SQLデータ分析入門#4『LIMIT句を理解する』

[SQLデータ分析入門#3『WHERE句を理解する』 - Qiita](https://qiita.com/piyoSakai/items/44bc21178349103e2d45)
の続き

# 本記事のスコープ
- LIMIT句が何をするか理解する
- LIMIT句をいつ使うべきか理解する

# 1行で説明すると
- 指定したレコードを上限に、結果を引っ張ってくる

# 例えば
こんなテーブルがあったときの実行結果
![image.png](https://qiita-image-store.s3.amazonaws.com/0/214098/dae14fcd-c853-7eff-ddef-11aceb068810.png)

```SQL
SELECT *
FROM User
LIMIT 5
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/214098/989a0d32-540d-a7ed-47a6-6664c2c2dc89.png)

# いつ便利なの？
どんなレコード入っているか確認するときなど、なにか試したいときに便利。
例えば1000億レコードのテーブルで、

```SQL
SELECT *
FROM Large_table
```

してしまうと生きている内に結果が返ってこない可能性も高い。
単純に、どんなカラムやレコードが入っているかみたいのであれば、

```SQL
SELECT *
FROM Large_table
LIMIT 1000
```
すれば事足りる


# 推薦図書
よくあるSQL本はエンジニア向けなのですが、この本は分析をしたいだけの人に向いてます。
<a href="https://www.amazon.co.jp/10%E5%B9%B4%E6%88%A6%E3%81%88%E3%82%8B%E3%83%87%E3%83%BC%E3%82%BF%E5%88%86%E6%9E%90%E5%85%A5%E9%96%80-SQL%E3%82%92%E6%AD%A6%E5%99%A8%E3%81%AB%E3%83%87%E3%83%BC%E3%82%BF%E6%B4%BB%E7%94%A8%E6%99%82%E4%BB%A3%E3%82%92%E7%94%9F%E3%81%8D%E6%8A%9C%E3%81%8F-Informatics-IDEA-%E9%9D%92%E6%9C%A8/dp/4797376279/ref=as_li_ss_il?ie=UTF8&qid=1529821989&sr=8-1&keywords=10%E5%B9%B4%E6%88%A6%E3%81%88%E3%82%8B%E3%83%87%E3%83%BC%E3%82%BF%E5%88%86%E6%9E%90%E5%85%A5%E9%96%80&linkCode=li2&tag=t11378rs0f-22&linkId=904d97de322a8c31a37e518e1ef2a7a8" target="_blank"><img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&ASIN=4797376279&Format=_SL160_&ID=AsinImage&MarketPlace=JP&ServiceVersion=20070822&WS=1&tag=t11378rs0f-22" ></a><img src="https://ir-jp.amazon-adsystem.com/e/ir?t=t11378rs0f-22&l=li2&o=9&a=4797376279" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />

# 前後の記事
[SQLデータ分析入門#1『SQLってなんだ』 - Qiita](https://qiita.com/piyoSakai/items/926b8f46b08c4a9d439a)
[SQLデータ分析入門#2『SELECT ~ FROM ~ を理解する』 - Qiita](https://qiita.com/piyoSakai/items/b001eac8e0981244be39)
[SQLデータ分析入門#3『WHERE句を理解する』 - Qiita](https://qiita.com/piyoSakai/items/44bc21178349103e2d45)
[SQLデータ分析入門#4『LIMIT句を理解する』 - Qiita](https://qiita.com/piyoSakai/items/131553cbc40ac357477f)
[SQLデータ分析入門#5『集計関数を理解する』 - Qiita](https://qiita.com/piyoSakai/items/16214cd50e28386c97ed)
[SQLデータ分析入門#6『結果の順番をいい感じにする』 - Qiita](https://qiita.com/piyoSakai/items/6008c62a88554a44eb2a)
[SQLデータ分析入門#7『複数のテーブルにまたがって集計する』 - Qiita](https://qiita.com/piyoSakai/items/84bd688b4e4db2148193)
[SQLデータ分析入門#8『基本的な関数を知る』 - Qiita](https://qiita.com/piyoSakai/items/f79869a5b60ab7e8c3b2)
Joyplot ggplot2風に楽に行う

複数のデータを可視化する際にJoyplotを用いますが、ggplot2風に楽にJoyplotを行うpackage "ggjoy"が出ていたのでみんな大好きなirisでサンプルコード

```
library(ggjoy)

# ggplot風なところがちらほら
ggplot(iris, aes(x = Sepal.Length, y = Species, fill = Species)) +
  geom_joy(show.legend = F) +
  geom_vline(xintercept = 10, col = "#ffc1c1") +
  theme(axis.text.y = element_text(size = 7.5),
        axis.text = element_text(colour = "#ffffe0"),
        panel.grid = element_blank(), 
        panel.background = element_rect(fill = "#0a0a0a"),
        plot.background = element_rect(fill = "#0a0a0a"),
        plot.margin = unit(rep(0.2, 4), "cm"))

```

綺麗なグラフが出ますね。
![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/161216/b4e67cf3-d5ea-97f4-9b0e-4f75ea0c2121.png)
Appium desktop のインスペクタをエミュレータで使うまでの覚書(Androidアプリ)

環境については [前回の記事](https://qiita.com/Real_analysis/items/3389a0eb56aad6596d12) を参照

# ADVの準備
立ち上げておく。

# インスペクタの起動
appiumを起動し、サーバをスタートさせたら右上の start inspector session をクリックする
![スクリーンショット 2018-01-05 14.03.13.png](https://qiita-image-store.s3.amazonaws.com/0/6817/f8234e97-cceb-7527-f586-bfb19c7a87f4.png)

こんな画面が出て来るので、 desired capabilities を選択し、接続情報を左下のフォームに入力していく。
一番したにドキュメントへのリンクがあるのでそれを見ると良い。(テンプレ的な物用意してくれてもいいのに……)
![スクリーンショット 2018-01-05 14.06.57.png](https://qiita-image-store.s3.amazonaws.com/0/6817/8ca40d0d-b427-6ae4-778d-f1e4cbdca5dd.png)

ドキュメントみてもどんなときに何つかえばいいのかよくわからないので、とりあえず私が設定したのは以下のとおり。これも人の丸パクリ。
パッケージ名とかアプリパスとかプラットフォームバージョンとかはご自分のものに変えてちょ。

```json
{
  "automationName": "Appium",
  "platformName": "Android",
  "appPackage": "jp.production765.minori.wevbiewtest",
  "appActivity": "jp.production765.minori.wevbiewtest.MainActivity",
  "platformVersion": "8.1.0",
  "deviceName": "Android Emulator",
  "app": "/Users/minori/AndroidStudioProjects/wevbiewtest/app/build/outputs/apk/debug/app-debug.apk"
}
```
右下の「Start Session」をクリックすると立ち上がってるエミュレータにアプリをインストールした上でインスペクタが起動する。これでネイティブアプリ内の要素名とかを直接見る事ができる。

![スクリーンショット 2018-01-05 17.58.43.png](https://qiita-image-store.s3.amazonaws.com/0/6817/8251ae0e-2607-a998-a66f-d97f35f7d5ff.png)
mobile UI

## github star多いプロジェクト

* Material UI http://www.material-ui.com/
* Elemental-UI http://elemental-ui.com/
* Ant Design http://beta.ant.design/docs/react/introduce
* React-MDL (Material Deisgn Lite) https://getmdl.io/
* React-Bootstrap https://react-bootstrap.github.io/
* semantic https://semantic-ui.com/
* semantic for react https://github.com/Semantic-Org/Semantic-UI-React


### 纏めてくれている記事
* [React＋CSSフレームワークを検討してみたよ](https://qiita.com/usagi-f/items/9c675737ef44d0bfcb4e)
* [Why I choose semantic-ui-react over other material-ui react frameworks](http://www.reactfrontend.com/i-choose-semantic-ui-react-material-ui-react-frameworks/)

### wget ...
* wget --mirror -p --html-extension --convert-links http://example.com
Swift、Objective-Cのベストプラクティスまとめ

# 事始め
世の中にはベストプラクティスと銘打つ記事が沢山あるようなので集めてみました。

# iOS関係のベストプラクティス関係の記事
* [SwiftのOptionalのベストプラクティス](https://qiita.com/koher/items/8b6156c8263b9b23c43c)
* [NSRunLoopを立ち上げるベストプラクティス](https://qiita.com/soranoba/items/0c94005bace638a76b0e)
* [アイスタイル的 iOS設計ベストプラクティス](https://qiita.com/mishimay/items/229913a1a0e980f45acc)
* [iOSアプリ開発時の実ファイルの配置ベストプラクティス](https://qiita.com/yimajo/items/6cffb5cd5a5dd659edb4)
* [[iOS] Swift時代の! コードによるViewレイアウトのベストプラクティス](https://qiita.com/nori0620/items/f2e6aef9cac3a8c9e366)
* [[Swift] Property のベストプラクティスを考える](https://qiita.com/mokumoku/items/b2dcf0b64f748b7906d0)
* [Auto Layoutの設計ベストプラクティスと、Viewの種類ごとのテクニック集](https://qiita.com/yuya_presto/items/08b0656f67a59c8c2d03)
* [iOSのトラッキング実装ベストプラクティスを考える](https://qiita.com/horimislime/items/71702594363b17483567)
* [ライブラリ・SDKにSwiftLintを導入するベストプラクティス](https://qiita.com/nerd0geek1/items/9edad9a8b1d4c4051ab6)
* [Apple公式 アプリ改善のベストプラクティス](https://qiita.com/motokiee/items/31da03d7e8e40640410c)

# 自分なりのiOSアプリ開発ベストプラクティスについて
## Optionalについて
Optionalは「値が存在しない可能性がある場合」or「エラーで値の取得などに失敗する可能性がある場合」に使用します。Optionalであるにも関わらず「値が必ず存在する」と保証できる場合はforced unwrapをし、それ以外はOptional ChainingかOptional Bindingで適切に処理を行うのが望ましいです。
ベストプラクティスの記事にはなるべくOptional Bindingですぐに処理をすることが推奨されていますが、該当メソッドで必要になる値を取り出す過程全てでOptional Bindingするよりは、全てOptional Chainingで取り出してから、最後の必要になる値のところでOptional Bindingして、それに失敗した場合に必要になる値が取れなかった旨を返すのが妥当なところだと思います。

```swift

// 全てOptional Bindingするパターン
guard let foo = ... else { ... }
guard let bar = foo.bar else { ... }
guard let baz = bar.map { Baz($0) } else { ... } // 以降は`baz` を使う処理
// ↑こちらだと全てのnilケースについて細かくエラーハンドリングする感じになる（理屈的には正しいが、ほとんどの場合はコード全体が長くなりがち）

// 必要な箇所でOptional Bindingするパターン
guard let baz = foo?.bar?.map { Baz($0) } else { ... } // 以降は`baz` を使う処理
// ↑こちらだと必要なbazが取れないという旨だけエラーハンドリングする感じになる
```

## 実ファイル配置について
よくModel/View/ViewControllerのMVCに区別して配置するパターンが見受けられますが、個人的にはModel/View+ViewControllerで区別し、View+ViewControllerの配下には画面ごとでフォルダを作って管理するのがやりやすいと感じています。
その一番の理由が、ViewControllerとViewはよく行き来しながら修正を行うので、プロジェクト上での配置位置が同じディレクトリにある方が開きやすいという点にあります。また、ViewModelを作ったりするとそれをどこに入れるのかとか迷ったりしがちですが、ViewとViewControllerの配置を一緒くたにしておけば大体みんなViewModelを作っても同じ配下に入れてくれる感じがします。
画面関係とロジックを分けるということさえ徹底しておけば、ディレクトリ構成を細かく分けていく必要性は個人的にはあまりないと思います。

## コードによるViewレイアウトについて
* UIViewController#viewが持つsubviewのレイアウトはviewDidLayoutSubviewsの中で行う
* CustomViewが持つsubviewのレイアウトはlayoutSubviewsの中で行う
ほぼほぼ上記2行は同意ですし、これ以上言うことはほとんどないですが、viewDidLayoutSubviewsではなくviewWillLayoutSubviewsでレイアウトを決めることもよくあります。viewDidLayoutSubviewsではレイアウトが終わった後でのframe設定になってしまうので、挙動によってはviewWillLayoutSubviewsの方が望ましいこともあります。

## Auto Layoutについて
個人的にはViewControllerの直接の子のviewだけ親viewに対してConstraintをかけて、その下のviewはコードでlayoutSubviewsに書くか、小さいxibに分けてちゃんとConstraintかけるのが良いように思います。一つのstoryboard/xibに多くのconstraintが含まれないように気をつけるのが個人的なベストプラクティスだと考えています。
SQLデータ分析入門#2『SELECT ~ FROM ~ を理解する』

[SQLデータ分析入門#1『SQLってなんだ』 - Qiita](https://qiita.com/piyoSakai/items/926b8f46b08c4a9d439a)
の続き

# 本記事のスコープ
- 「SELECT」の意味がわかる
- 「FROM」の意味がわかる

# 1行で説明すると
- 「SELECT」は、どのフィールド(列)がほしいのか指定する句
- 「FROM」は、どのテーブルからほしいのか指定する句

# 例えば
こんなテーブルがあったときの実行結果…
![image.png](https://qiita-image-store.s3.amazonaws.com/0/214098/a2367d4e-c275-119d-1799-bb1324cbfd1b.png)

## SELECT 名前 FROM User
![image.png](https://qiita-image-store.s3.amazonaws.com/0/214098/0558de7b-6729-b5e7-de50-d38910803b98.png)

## SELECT 名前, 身長 FROM User
![image.png](https://qiita-image-store.s3.amazonaws.com/0/214098/5cddcb87-923c-250b-2aa0-28610f6c649d.png)

## SELECT * FROM User
※「*」は『すべてのカラム』という意味
![image.png](https://qiita-image-store.s3.amazonaws.com/0/214098/08f37304-17f6-5da1-1b9b-5b8f997e1dff.png)

# FROM句にはSQLの実行結果を入れることもできる
## SELECT * FROM( SELECT 名前, 身長 FROM User )
※いまはメリットわからなくていいけど今後つかう
![image.png](https://qiita-image-store.s3.amazonaws.com/0/214098/5cddcb87-923c-250b-2aa0-28610f6c649d.png)

# 推薦図書
よくあるSQL本はエンジニア向けなのですが、この本は分析をしたいだけの人に向いてます。
<a href="https://www.amazon.co.jp/10%E5%B9%B4%E6%88%A6%E3%81%88%E3%82%8B%E3%83%87%E3%83%BC%E3%82%BF%E5%88%86%E6%9E%90%E5%85%A5%E9%96%80-SQL%E3%82%92%E6%AD%A6%E5%99%A8%E3%81%AB%E3%83%87%E3%83%BC%E3%82%BF%E6%B4%BB%E7%94%A8%E6%99%82%E4%BB%A3%E3%82%92%E7%94%9F%E3%81%8D%E6%8A%9C%E3%81%8F-Informatics-IDEA-%E9%9D%92%E6%9C%A8/dp/4797376279/ref=as_li_ss_il?ie=UTF8&qid=1529821989&sr=8-1&keywords=10%E5%B9%B4%E6%88%A6%E3%81%88%E3%82%8B%E3%83%87%E3%83%BC%E3%82%BF%E5%88%86%E6%9E%90%E5%85%A5%E9%96%80&linkCode=li2&tag=t11378rs0f-22&linkId=904d97de322a8c31a37e518e1ef2a7a8" target="_blank"><img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&ASIN=4797376279&Format=_SL160_&ID=AsinImage&MarketPlace=JP&ServiceVersion=20070822&WS=1&tag=t11378rs0f-22" ></a><img src="https://ir-jp.amazon-adsystem.com/e/ir?t=t11378rs0f-22&l=li2&o=9&a=4797376279" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />

# 前後の記事
[SQLデータ分析入門#1『SQLってなんだ』 - Qiita](https://qiita.com/piyoSakai/items/926b8f46b08c4a9d439a)
[SQLデータ分析入門#2『SELECT ~ FROM ~ を理解する』 - Qiita](https://qiita.com/piyoSakai/items/b001eac8e0981244be39)
[SQLデータ分析入門#3『WHERE句を理解する』 - Qiita](https://qiita.com/piyoSakai/items/44bc21178349103e2d45)
[SQLデータ分析入門#4『LIMIT句を理解する』 - Qiita](https://qiita.com/piyoSakai/items/131553cbc40ac357477f)
[SQLデータ分析入門#5『集計関数を理解する』 - Qiita](https://qiita.com/piyoSakai/items/16214cd50e28386c97ed)
[SQLデータ分析入門#6『結果の順番をいい感じにする』 - Qiita](https://qiita.com/piyoSakai/items/6008c62a88554a44eb2a)
[SQLデータ分析入門#7『複数のテーブルにまたがって集計する』 - Qiita](https://qiita.com/piyoSakai/items/84bd688b4e4db2148193)
[SQLデータ分析入門#8『基本的な関数を知る』 - Qiita](https://qiita.com/piyoSakai/items/f79869a5b60ab7e8c3b2)
この記事を読んだ人はこのコマンドだけでも覚えて帰ってください

# はじめに
僕はVimmerではありません
ただ、vimで作業することは避けて通れません。
作業の中「これは使える！」というコマンドがあったので紹介します。
# そのコマンドは....
	shift + v
重要なことなのでもう一度言います
	
	shift + v
# これ何のコマンド？？？？？
これはvimで範囲選択ができるコマンドなのです！
この状態でしたカーソルを押せば下に範囲選択ができる！
すごい！
ここからどのように作業するかはあなた次第！
GitLabでCIしてみた

# 環境
OS：Windows10

# 手順

1. 下記手順に従ってGitLab-Runnerをインストールする<br/>
ほぼ公式ガイド通りに行えばOK。ただし、サービス登録時にユーザーを指定しなかった。<br/>
https://docs.gitlab.com/runner/install/windows.html<br/>

1. Runnersがアクティブか確認。
GitLabのプロジェクトのSettings>CI/CD>Runners settingsを開き、Runners activated for this project を確認。インジケーターが緑色になっていればアクティブになっている。
1. gitlab-ci.yml を記述して、gitリポジトリにプッシュ。
このファイルがCIの手順書らしい。Windowsばかりやっってたので、この辺の仕組みがなかなか、すんなりと理解できない。サンプルを参考に次のようなスクリプトを記述した。

```
job1:
  script:
    - echo "this is shell"
```

# 実行結果の確認
1. 実行結果の確認
GitLabのCI/CDを開くと実行結果が表示される。
![ci-fail.png](https://qiita-image-store.s3.amazonaws.com/0/41649/1607caff-5665-1713-c14f-198d9d88b638.png)

2. 文字コードの設定
ジョブは失敗しているのは分かったけど、出力結果が文字化けして原因が良く分からなかった。
![mojibake1.png](https://qiita-image-store.s3.amazonaws.com/0/41649/7bfbab65-b3d2-a95c-efaa-4ed91f4059a2.png)

https://qiita.com/yufu/items/86a455f948a3e1c0ef97 を参考に、コマンドプロンプトの文字コードをUTF-8に変更すると、文字化けが直った。
![mojibake2.png](https://qiita-image-store.s3.amazonaws.com/0/41649/624500a0-f99c-94d8-aae8-9bab86272fd7.png)

1. Gitが見つからないというエラーメッセージ。環境変数のPATHにgit.exeのディレクトリを追加。その後、git-runnerサービスを再起動。（ここも、パスを通した直後にJOBを実行したけど、gitが見つからないというエラーで悩んだ。）https://gitlab.com/gitlab-org/gitlab-runner/issues/2743で解決。
2. やっと成功
![ci-success.png](https://qiita-image-store.s3.amazonaws.com/0/41649/09228971-7a55-fc24-42f4-378e91a0cac7.png)

# 参考
https://muunyblue.github.io/2d5b53f80151aea5fef0722f8b1edf99.html
https://qiita.com/enomotok_/items/83935c1137203e1c2c0f
初心者の中の初心者がtmuxを使うことになった話

## はじめに
バイト先で急遽tmuxを使うことになりましたので、ここにメモを残す所存である。
## そもそもどうやってtmuxウインドウ的なのに入るの？？
	tmux a -t 「セッション名」
僕に教えられたのはこれだけなので、これ以上はワカリマセン

## とりあえずこれだけは忘れられないベースコマンド
	ctrl+b　←これがtmuxのベースとなるコマンド
vimで言う所の:的な..?esc的な...？
このctrl+bの後にコマンドを実行することでtmuxさんに働きかけることができるのである。
## 一歩進んで覚えよう
	ctrl+b からの → //右のウインドウに移動
	ctrl+b からの d //tmuxから脱出
以上！初心者のメモでした！
SQLデータ分析入門#1『SQLってなんだ』

# 本連載のスコープ
- SQLの超初心者が、ざっくりと分析SQLにつかう文法を覚える
- 多少、正しくない説明があっても許してほしい

# 本記事のスコープ
- SQLとは何なのか理解する

# SQLとは何かを3行で
- データベースを操作するための構文
- テーブルを作ったり、テーブルから情報を引っ張ったりできる
- MySQLやPostgreSQLなどいろんな種類があるが、それぞれ方言程度にしか違わない

# よく出る用語
## 言葉で
- データベース(DB)      ：情報を蓄積した箱
- テーブル          ：情報をまとめた表。データベースの中にあるイメージ
- カラム(フィールド)：縦の列のこと
- レコード         ：各行のこと

## イメージで
![image.png](https://qiita-image-store.s3.amazonaws.com/0/214098/721a8c4b-85cd-f8eb-a8f5-e19fb2410946.png)

## 用語の利用メージ
「分析用DBには250のテーブルがあるけど、業務で使うのは高々20程度」
「Userテーブルには登録日など50のカラムがあるけど、業務で使うのは高々10程度」
「access_logテーブルは200億レコードあるので、全数を集計するのは現実的に無理」

# 推薦図書
よくあるSQL本はエンジニア向けなのですが、この本は分析をしたいだけの人に向いてます。
<a href="https://www.amazon.co.jp/10%E5%B9%B4%E6%88%A6%E3%81%88%E3%82%8B%E3%83%87%E3%83%BC%E3%82%BF%E5%88%86%E6%9E%90%E5%85%A5%E9%96%80-SQL%E3%82%92%E6%AD%A6%E5%99%A8%E3%81%AB%E3%83%87%E3%83%BC%E3%82%BF%E6%B4%BB%E7%94%A8%E6%99%82%E4%BB%A3%E3%82%92%E7%94%9F%E3%81%8D%E6%8A%9C%E3%81%8F-Informatics-IDEA-%E9%9D%92%E6%9C%A8/dp/4797376279/ref=as_li_ss_il?ie=UTF8&qid=1529821989&sr=8-1&keywords=10%E5%B9%B4%E6%88%A6%E3%81%88%E3%82%8B%E3%83%87%E3%83%BC%E3%82%BF%E5%88%86%E6%9E%90%E5%85%A5%E9%96%80&linkCode=li2&tag=t11378rs0f-22&linkId=904d97de322a8c31a37e518e1ef2a7a8" target="_blank"><img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&ASIN=4797376279&Format=_SL160_&ID=AsinImage&MarketPlace=JP&ServiceVersion=20070822&WS=1&tag=t11378rs0f-22" ></a><img src="https://ir-jp.amazon-adsystem.com/e/ir?t=t11378rs0f-22&l=li2&o=9&a=4797376279" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />

# 前後の記事
[SQLデータ分析入門#1『SQLってなんだ』 - Qiita](https://qiita.com/piyoSakai/items/926b8f46b08c4a9d439a)
[SQLデータ分析入門#2『SELECT ~ FROM ~ を理解する』 - Qiita](https://qiita.com/piyoSakai/items/b001eac8e0981244be39)
[SQLデータ分析入門#3『WHERE句を理解する』 - Qiita](https://qiita.com/piyoSakai/items/44bc21178349103e2d45)
[SQLデータ分析入門#4『LIMIT句を理解する』 - Qiita](https://qiita.com/piyoSakai/items/131553cbc40ac357477f)
[SQLデータ分析入門#5『集計関数を理解する』 - Qiita](https://qiita.com/piyoSakai/items/16214cd50e28386c97ed)
[SQLデータ分析入門#6『結果の順番をいい感じにする』 - Qiita](https://qiita.com/piyoSakai/items/6008c62a88554a44eb2a)
[SQLデータ分析入門#7『複数のテーブルにまたがって集計する』 - Qiita](https://qiita.com/piyoSakai/items/84bd688b4e4db2148193)
[SQLデータ分析入門#8『基本的な関数を知る』 - Qiita](https://qiita.com/piyoSakai/items/f79869a5b60ab7e8c3b2)
Railsで1つのフォームで複数のモデルを登録・更新させる（NEST）


```
cd /var/opt/data
rails new NestSample -d mysql

cd NestSample
rails db:create

rails g scaffold targetserver hostname:string os:string cpu:integer
rails g model disk serverid:integer partitionname:string size:integer

rails db:migrate
```

---

「Railsで1つのフォームで複数のモデルを登録・更新させる」
https://qiita.com/Tommy1218/items/6349d8d860c5982771ff


「【Rails】複数のレコードを作成する。modelの関係性によって異なるform_for / fields_forの使い方」
https://qiita.com/ftyabu/items/cae912b211e985d74d58

「【Rails初心者向け】モデル間の関連付け（アソシエーション）まとめ」
https://qiita.com/To_BB/items/47d2c7b1bc3513025d7b

「Active Record の基礎」
https://railsguides.jp/active_record_basics.html

「[初心者向け] Railsで関連するデータ(親子関係)を保存する方法あれこれ」
https://railsguides.jp/active_record_basics.html


https://qiita.com/Matsushin/items/4829e12da2834d6e386e
https://mikazuki.hatenablog.jp/entry/2016/03/26/040229
https://techmory.hateblo.jp/entry/171107-cocoon
UMLとスレッド

#UMLとスレッド
「UMLとスレッド」
どういう関係だと思いますか？
※この記事の中では、混乱を防ぐため、**スレッド**は.NETのスレッドを指します。

UMLは、クラスと関連と属性のラフスケッチだと思っていませんか？
しかし、UMLの「オブジェクト」の概念には主体的に動作する、という考え方が含まれています。
今回は、それを知ってもらいたく記事を書きました。

##クラスとスレッド
UMLの「クラス」には、「IsActive」という属性があります。

>11.8.3.5 Attributes
• isActive : Boolean [1..1] = false Determines whether an object specified by this Class is active or not. If true, then the owning Class is referred to as an active Class. If false, then such a Class is referred to as a passive Class.
(UML仕様書 2.5 より引用)

ざっくりいうと、クラスには、IsActiveというBooleanのフラグがあり、このフラグがtrueだと「自律的に動く」いう意味です。
つまり、実装しようとするとスレッドのようなものがあるということです。
モデリングツール(astah*)でみると、↓これ、です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/197297/b49ec3f4-2371-b425-a79d-049eb6d2e02f.png)

##ステートマシンとスレッド
UMLのステートマシン図は、オブジェクトのライフサイクル（人生）を示す図です。
オブジェクトの人生である以上、自然と独立したスレッドのようなものを前提としています。
例えば、状態には doアクティビティがありますが、これはその状態の間動き続けることが表現可能です。
下の図では、Running状態の間、データ収集を続けている可能性があります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/197297/adeed577-87c2-0625-c8a0-99c49d45d0d2.png)

オブジェクトが動き続けているというイメージは、実装ではスレッドなどを使うことになりそうですね。

#自律的なオブジェクトとそうでないもの
一般的に、人によるオブジェクトの認識は、次のようです。

- (A)生き物や電気などで動いているモノは自律的な動作をします。
- (B)書類や石などの無生物は自律的な動作をしません。

(A)をUMLで表現すると、クラスのIsActiveがtrueで、ステートマシン内にdo処理を持ち得ます。
(B)をUMLで表現すると、クラスのIsActiveはfalseで、ステートマシン内にdo処理を持ちません。

(A)のように動いているものは、Activeで状態によっては動き続けている。
(B)のように動かないものは、（たとえば書類に「承認前」や「承認済」状態があったとしても、）Activeではなく、動き続けていることはありません。

皆さん、ここの説明は、読めば読むほど**「当たり前だろう」**と感じているかも知れません。

**では、この考え方に基づいてUMLのモデルを描き実装した経験のあるかたは、
どれだけいるのでしょうか。**

#実開発を振り返ると
実際の開発でも、自律的なオブジェクトとそうでないオブジェクトがあるはずです。
でも、普通は、どのオブジェクトのスレッドでどのオブジェクトが動くとか、あまり考えていないですよね。

仮に.NET開発ならば、
基本的にはUIスレッドで動かして、長い処理だけスレッドプールで動かすように、
実装時に帳尻合わせしているだけではないでしょうか？

その場合、自律的なオブジェクトもそうでないオブジェクトも、
どのスレッドで動いているのか、よく分かっていないけれど、プログラムは動いている、という感触ではありませんか。

もし、上述のようにオブジェクトとスレッドを意識して考え、それに基づいて実装すれば、
どのクラスのどの処理がどのスレッドで動くのかを、イメージしやすくなります。
皆さんの「当たり前」の感覚に近いスレッドで、クラス（オブジェクト）のプログラムコードが動くからです。

**ここが、UMLモデリングを実装につなげる重要な点の１つなのです。**

##自律的でないものは、どのスレッドで動くのか？
自律的なオブジェクトは、自分のスレッドで動きますよね。
では、自律的でないオブジェクトは？　との疑問が湧くのではないでしょうか。

いま、この文章が印刷された紙だとして仮定して、モデルにすると、たぶんこんな感じでしょう。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/197297/304eef8f-a3b5-a78a-43ca-819697dc7abb.png)

この図では、「読者」が自律的なオブジェクトで、「記事」は自律的でないオブジェクトです。
プログラミングしたときに、記事クラスのインスタンスがどのスレッドで動作するかと考えると、まずは「読者」のインスタンスのスレッドで動くと考えるのが自然かと考えられます。

#オブジェクトとスレッドを結び付けた実装
ここまでは、概念的な話が多いので、なんとなく、うーん、そうだよな、と思っていただけたのではないかと思います。
でも、私たちはオブジェクト指向を開発に利用するために使っているので、設計実装できなければなりません。

これについては、続きの記事で書きたいと思います。書いたら、ここにリンクを入れます。
ではまた。

リンク追記しました ⇒ [UMLとスレッドの実装](https://qiita.com/azuki8/items/65775a731018dab7e78c)
PHPでFlysystemのAwsS3AdapterをS3互換サービスで使うときにハマったこと

# ハマった時の状況

- Laravelを使ってる
- 環境はDockerで構築
- S3互換サービスはDocker上のminio

#結論
use_path_style_endpointをtrueにするとサブドメインを使わずにバケットを指定することができる

#タイムライン

- LaravelからS3にアップロードしたい
- S3だけローカルから外すのはびみょい
- テスト環境としてminioを選択
- minioをdocker-composeに追加してみる
- 一通りの設定をして、接続してみる
- バケット名がサブドメインになるので、docker-composeでの名前解決に失敗する
- 取り急ぎhostsに名前書いて名前解決できるようにする
- 依然としてエラー　そのようなバケットはありませんと言われる
- minioのブラウザ側でバケットを作成
- それでもエラー・・・　よく見るとエラー対象のバケット名が入っていない
- ひょっとして、サブドメインでバケット名拾えない？
- ネットの海を彷徨う
- force_path_styleという設定をrubyのコードないで見つける
- ダメ元で設定を追加してみる、ダメっぽい
- AwsS3Adapterのオプションにuse_path_style_endpointというのを見つける
- 上記オプションをオンにすることで接続が成功