OmniAICreator/Qiita-1.07M huggingface dataset:
(30代 && 文系 && 未経験)からフリーランスのプログラマーになったので勉強法を振り返ってみる

2017年末にVBAの本を買い、
2018年3月から本格的にPythonを勉強し始めて、
2018年7月からフリーランスのプログラマーとして客先常駐している[ryota@i2AA](https://twitter.com/ryota_biz)と申します。

今年で35歳です。
文系大学卒業してます。
大学では情報系の授業はありませんでした(たぶん…)。

仕事でプログラミングをしたことはありませんでしたが、
今では依頼されたツールを2つ作ったのちにリファクタリングをしたり、
機械学習のオペレーション(開発ではない)をしたり、
という日々を送ってます。


まだまだプログラマーとしてのレベルは低いんですが、
アリアハンを出発してレーベぐらいにはいるんじゃないかなと思い、
アリアハンにいる間にもっとこんなことしとけばよかったな、
逆にこれはしなくてもよかったな、
ということを整理整頓しようと思います。


##しておけばよかったこと
インプット重視の勉強だったので、もっと最初からアウトプット重視でいけばよかったな、と思います。

特に最初は
「コードの書き方を知ろう」
「文法を覚えよう」
「forの使い方とは…ifの使い方とは…」
という、お勉強からスタートしてしまいがちです。

でも、それを単体で覚えてもなかなか使える知識にはなりません。
なので、最初から何かを開発することをおすすめします。

もちろんいきなりサービスを開発するのは難しいので、
本に書いてあるサンプルツールとかWebにあるチュートリアルとかを丸写しでいいと思います。
文法単体で覚えるよりも、そういった完成系がイメージできるものを自分で作ってみることで、
自然と文法も覚えるようになってきます。

英語でいうと単語や文法の勉強じゃなくて会話から始めてみよう、という感じです。
やりながら足りないところを文法の勉強で補う、という流れがいいと思います。


##しなくてよかったこと
プログラミングを学び始めたての頃は、
「自分の頭で考える」
という時間はいらないな、と思います。

まずはパクることから徹底的にやった方がいいです。

僕はパクるのが苦手で、UIをどうするかとか、
どういったロジックでコードを書いたらいいかとか、
いちいち自分で考えてました。

でも引き出しが少なく、中に入ってる情報も少ないのに、
そこで考えてもいいものができるわけがないです。

最初はいろんなところからパクってきて、
作りながら引き出しを増やして中身を満たしていけばいいんです。

材料がないと料理ができないので、まずは材料を増やしていきましょう。
材料が豊富になってきたら、自分の頭で考えられるようになってくるので。
ひとりでうんうん唸ってる時間は、最初は無駄です。


##しておいてよかったこと
「まず受注した」ということ。

これはめっちゃ大事やな、と思います。

プログラミングに限らず、仕事全般に言えると思うんですが、
「勉強してレベルが上がったら仕事をもらおう」
と思いがちです。

しかし、最もレベルが上がるのは、実際に納品しないといけない状況になってから、なんですよね。
なので、勉強してから受注、ではなくて、
受注してから勉強、が一番いいパターンです。

お客さんからしたら、納期までに期待している品質のものが納品されたらいいわけですから。
間に合わせればいいわけです。

そうすれば、
「三日坊主で終わった」
「何を勉強すればいいかわからない」
「一人で勉強してもモチベーションが続かない」
という初心者にありがちな挫折理由が通用しないので、
続けるしかない、というわけです。

最初は無料とか格安とかでいいので、
「誰かに何かを納品する」
という状況を最初に作ってしまいましょう。


##これからしようと思うこと
最近は「勉強法を勉強する」ということにハマってまして、
その中でも科学的に正しいとされている勉強法をいくつか紹介したいと思います。

最初の2つは、勉強に対するスタンスです。

**1. 能動的に勉強する**
**2. 誰かに教えるつもりで勉強する**

テキストを何度も読み返す、
言われたことをただこなす、
といった受け身の姿勢では、情報が頭に入ってこないし、
入ったとしても記憶として定着しません。

なので、能動的に取り組む必要があります。

興味のある分野を勉強する、
必要なツールを作る、
教えてもらったことや本に書いてあることにツッコミを入れてみる、
などなど。

学んだことをアウトプットする、というのも能動的な姿勢だと思います。

また、能動的な姿勢をもつのに一番いいのは、
誰かに教える、または教えるつもりで学ぶ、
ということです。

ただ単に自分のためにインプットするよりも、
誰かのためにアウトプットするという前提があった方が、
勉強効率が高まります。

僕の場合、友達の中で一番プログラミングが苦手そうな機械音痴な友達に教えるなら…という前提で勉強してます。


次の2つはもう少し具体的な手法です。

**3.分散学習とインターリーブ**
**4.検索学習**

同じ内容を続けて勉強する(集中学習)よりも、
同じカテゴリーで似てるけどちょっと違う勉強をし(インターリーブ)、
時間をあけて復習する(分散学習)、という方法です。

たとえば
「3時間かけてPythonのWebスクレイピングを勉強した」
ということよりも、
「PythonのWebスクレイピングを1時間、基本的な文法を1時間、JSONファイルの操作を1時間勉強した」
の方がいい、ということです。

また、復習は毎日やっても効果が薄いので、
一定期間おいた方が長期的に見て定着率が高くなります。

7～10日ごとに復習する方がいいという説と、

1回目:1～2日後
2回目:7日後
3回目:16日後
4回目:35日後
5回目:62日後
という間隔で復習する方がいいという説があります。

どちらも効果があったみたいですが、共通しているのは
**「忘れかけたころに、思い出そうとする過程が記憶力を強化する」**
ということです。

覚えているうちに覚えていることを確認しても、脳に負荷がかかりにくいんです。
ちょっと忘れかけているときに、
「えっと…あれ…なんやっけ…あ！そうそう！こういうことや！」
という負荷のかかり具合が、脳の強化には最適である、ということです(検索学習)。

なので、同じことを毎日ずっとやるよりも、ちょっとずつ変化させて適当なタイミングでもう一度やってみる、ということを意識してみてください。


---
ということで、いろんな角度からプログラミングの勉強法についてまとめてみました。

コードの書き方とか本の選び方とか、という勉強法はよく見るんですが、
ちょっと違った視点での勉強法もあった方がいいんじゃないかなと思い、まとめてみました。

ざっくりまとめたのでわかりにくいところもあるかもしれませんが、
コメントやご指摘いただけたら加筆・修正します！

一緒に勉強がんばりましょうー！
2日目: Transfer learning for time series classification

# Transfer learning for time series classification 要約
## 読んだ論文
Transfer learning for time series classification
Hassan Ismail Fawaz, Germain Forestier, Jonathan Weber, Lhassane Idoumghar, Pierre-Alain Muller
https://arxiv.org/abs/1811.01533
上記の論文を読んだので簡単にまとめます．IEEE International Conference on Big Data 2018にて発表されていました（[BigD445](http://cci.drexel.edu/bigdata/bigdata2018/AcceptedPapers.html)）．
## 3行でまとめる
- 転移学習が画像系で流行ってていい感じだけど，時系列分類界隈では徹底的な検証がされていない．
- これを検証するために，85のデータセットを用い，7140のモデルを訓練した．
- DTWアルゴリズムを用いて，ソースドメイン（転移元）とターゲットドメイン（転移先）の類似度を図り，適切なソースドメインを提供する手法を開発した．

## 提案手法
### 使用モデル
![20190314_001.png](https://qiita-image-store.s3.amazonaws.com/0/376859/a98ccf6e-48fb-7af6-4350-abcd33daf18e.png)
今回使用したモデルはFig.3の通り，1次元の時系列データに対して，1dConvを3層，fully-connectedを挟んでクラスを予測するシンプルな構造となっている．本稿は**転移学習**の有効性を検証するものであり，モデル構造にとらわれない手法を提案するものであるため，あえてシンプルなモデルを採用しているとのこと．

### 転移学習（というかFine-tuning）
1. 上記ネットワークを各ドメインで訓練する（本稿では85データセットを用いて85個訓練した）．
2. ただし，出力内容が異なる（回帰or分類（クラス数も違う））ということで，fully-connected層以降はドメインごとに可変とした．
3. 転移させる際には，ソースドメインで訓練したモデルから，fully-connected層以降を削除して，ターゲットドメイン用に新たに接続して全体を再学習する（Fine-tuning）．

ここで，Global Average Poolingを用いる利点として，可変長の時系列入力が与えられたとしても，ここで固定長にできるという記述があった．そもそもGlobal Average Poolingとはなんぞや？と[調べてみると](https://qiita.com/mine820/items/1e49bca6d215ce88594a)，どうやらチャネルごとに平均を取るPoolingとのこと．即ち，時系列長にかかわらずチャネル長の1次元ベクトルにできるということかと．ただ，この記述はドメインごとに異なる入力長でも良いという話なのか，同じドメイン内でも異なる入力長を許容するという意味合いなのかよくわからなかった（そもそも後者のような可変長のモデルは実装できるのか？）．

### データセット間の類似度推定
1. 各データセットの入力をクラス毎に1つとなるように減らす（または，プロトタイプとする）．
2. プロトタイプは，各クラスの時系列を平均することで生成する（DTW Barycenter Averaging（DBA）法[^1]）．
3. $D_a$と$D_b$において，それぞれのクラス$\\{C_{a1}, C_{a2}, ...\\}, \\{C_{b1}, C_{b2}, ...\\}$の全パターンでDTWを算出する．（結局DTWってなんなんだ．．．？）
4. 3で算出したDTWの最小値を$D_a$と$D_b$の距離とする．

[^1]: F. Petitjean and P. Ganc¸arski, “Summarizing a set of time series by averaging: From steiner sequence to compact multiple alignment,” Theoretical Computer Science, vol. 414, no. 1, pp. 76 – 91, 2012.

## まとめ
- 時系列データの転移学習において，適切なソースドメインを選択する手法としてDTWを用いた手法を提案した．
- DTWやDBAって結局何なんだというところが，注釈論文を読まなければならなそうなので，またいつか．

## 所管
論文の選定を含め2時間たったので評価部分については割愛しました．もう少し高速に読んでいかないとやっぱり続かない気がします．．．ちなみにこの論文，評価実験に60GPU（GTX 1080Ti, Tesla K20, K40, K80のMix）のクラスタで168日かかったらしい．エグい．（と思ったら，1GPUだと168日かかるところ，クラスタのおかげで1週間くらいで済んだらしい．どちらにせよクラスタがエグい．）ざっと読んだところ結果も面白そうなんだけど，まとめるのがつらいので今回はおしまい．
ScalaでFutureの処理結果をEither型に格納してみる

## 概要
Scalaの便利な機能として、「Future」を使って、http通信などの非同期処理が簡単にかけることが挙げられます。
Futureですが内部処理でExceptionが発生した場合、どうハンドリングをすべきかという点を意識する必要があります。[【Scala】Future と未来のセカイ](https://dev.classmethod.jp/server-side/scala-concurrent-future/)の記事にもある通り、通常と異常で取得する値の型が異なるわけです。
例えばFutureの結果を次処理でそのまま使いたい場合、使えるのがEither型だろうということで今回はFutureの結果をEither型で格納するサンプルを作成してみました。

##サンプルコード
例外が発生した場合、recoverメソッドを使ってEitherのLeftに値を設定するようにします。なお、recoverについては[[Scala] Future#recoverを使って例外処理する](https://kobtea.net/posts/2015/05/18/scala-future-recover/)にて解説されています。
以下のコードは与えられた値が1だったら2倍してRightに設定し、それ以外だったらエラーメッセージをLeftに設定します。

```FutureTest.scala
  def testRecover(param: Int) = {
    val sample1 = Future {
      if (param == 1) { 1 } else { throw new IllegalArgumentException("error!")}
    }
    val test = Await.result(
      sample1.map{f => Right(f * 2)}
        recover {case e: IllegalArgumentException => Left(e.getMessage)}
      , 1 minute)
    println(test)
  }
```
android:exportedのデフォルト値


<br>
AndroidManifestのandroid:exportedに関して
指定がなかったら常にデフォルトでandroid:exported="false"になるわけではないという話。

#結論
exported属性は、明示的に全て指定したほうが安全

#理由
意図せず外部アプリに公開してる可能性があるため

1．Activityのexportedは無指定の場合、intent-filterの定義の有無によりtrue/falseが決まる。
 - intent-filterの定義有：android:exported="true"  (外部アプリに公開)
 - intent-filterの定義無：android:exported="false" (外部アプリに非公開)

うっかりexportedを無指定でintent-filterを定義してしまうと、
そのactivityは、外部のアプリからでも起動できてしまう。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/372804/50d49166-c23e-7954-8a56-195cb7807ddd.png)

さらには、そのactivityを起動しようと投げた暗黙的インテントは、外部のアプリも受け取れてしまう。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/372804/033fa852-7a7d-3ee0-cdf0-7c212a443b23.png)

2．Providerのexportedのデフォルトは、OSバージョンで振る舞いが異なる。<br>
　- Android 4.2(API Level 17)までは、デフォルトでtrue<br>
　- Android 4.3(API Level 18)からは、デフォルトでfalse

うっかりexportedを無指定でminSdkVersionを17以下も含めていると
OSバージョンの違いで公開/非公開が変わることに。

#AndroidManifest.xml見れなきゃ問題ない気もするけど。。。
Google PlayにあるアプリのAndroidManifest.xmlを見てみる。
<br>
<br>
*【この括弧内は、可変です】

1. Android端末にAndroidManifestを見たいアプリをインストールしておく
2. アプリのパッケージ名をGooglePlayから確認
アプリのページのURLで確認できる
`https://play.google.com/store/apps/details?id=【target package name】`

3. adbコマンドでフルパスを確認
> \>adb shell pm list packages -f 【target package name】
package:/data/app/【target package name】-1/base.apk=【target package name】

4. adbを使ってapkをPCにpull
> \> adb pull /data/app/【target package name】-1

5. apkの拡張子をzipに変更
![image.png](https://qiita-image-store.s3.amazonaws.com/0/372804/a18719d8-6c42-7f9d-6e2f-af41d4453409.png)
↓
![image.png](https://qiita-image-store.s3.amazonaws.com/0/372804/6f111fa3-8bdd-21b5-fce5-53de2781e90a.png)


6. zipとして展開

7. zip内のAndroidManifest.xmlをAXMLPrinter2.jarで変換
[AXMLPrinter2.jar](https://code.google.com/archive/p/android4me/downloads)
> \>java -jar AXMLPrinter2.jar AndroidManifest.xml　> AndroidManifestConverted.xml<br>

8. 変換後のandroid.intent.category.LAUNCHER以外の\<activity\>要素で、
exported="true"のactivity、または、exportedの記載がなくintent-filterが定義されているactivityを探す。
<font color="LightGray">体感、評価が低めのアプリに見つかりやすい気がする</font>


9. 他のアプリから呼んでみる

```MainActivity.kt
        val targetPackageName : String = "【target package name】"
        val targetActivityName : String = "【target activity name】"

        val intent : Intent = Intent()
        intent.setClassName( targetPackageName, targetActivityName )
        startActivity( intent )
```
こちらでも可
>adb am start -n 【target package name】/.【target activity name】

すると普通にactivityが立ち上がってくる
このactivityが、同一パッケージの特定の処理によってのみ、呼び出されることが前提だったりすると、<br>想定している処理をすっ飛ばして、動作する可能性もある。


# まとめ
知識としてはここ見れば書いてある　[Android アプリのセキュア設計・セキュアコーディングガイド
](https://www.jssec.org/dl/android_securecoding.pdf)
実際、全部レビューでチェックするのは現実的ではないし、抜け漏れが出るのでツールを使うのが現実的
作るアプリによってセキュリティ面にかけられる金額は全然違うだろうけれど
再インストールしたばかりのMacでキーボードとターミナル環境を整える

Macを再インストールしたのでキーボートとターミナルの環境を整えました。
OSの再インストール後の設定なんて滅多にすることでもないので、忘れないようにメモしておくことにしました。

# 環境

OS : macOS Mojave(10.14.3)

# Windowsのキーボードを使用するために

普段会社で使用しているキーボード(Windows用)を使用しようと考えたのですが、使ってみるとわかりますがWindows用とMac用のキーボードではキー配置が微妙に違うので使いづらいと思います。

そこで、キーの配置を変更しようと考えたのですが、なるべく新しくソフトをインストールしたくなかったので、OSに備わっている機能だけで設定しました。

### CapsLockキーとCtrlキーを入れ替える

普段、Emacsを使用しているのでCtrlキーは"a"の左にあって欲しいのですが、現実は甘くはなく"CapsLock"キーが配置されていますので、これを変更します。

"システム環境設定"=>"キーボード"=>"キーボード"=>"修飾キー..."と進みます
<img width="400" alt="config1.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/227731/cfdea3fb-184d-dc5f-635d-3735a65e7057.jpeg">

そして、設定したいキーボードを選択した後に、設定したいキーのプルダウンメニューから機能を選択します。今回は"CapsLock"と"Ctrl"を入れ替えました。
<img width="400" alt="config2.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/227731/25cb80bc-2fae-4d3d-2c89-e20dcf8acd2e.jpeg">

### CapsLock(元Ctrl)キーで日本語と英語を切り替えらるようにする

Windowsのキーボードには"半角/全角"キーが付いていて、Windowsではこれで日本語と英語の切り替えができましたが、Macではこのキーでは切り替えはできませんでした。ちなみに`が入力されてしまいます。

ショートカットキーも用意されているらしいですが、キー１つで変更したかったので、CapsLockを押した時に日本語と英語を切り替えられるようにしました。

また、入力と同時に変換される機能(ライブ変換)が煩わしかったので無効にしました。

<img width="400" alt="config3.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/227731/125d4d22-0fd3-46db-6bd9-678ee32a72c7.jpeg">


# マウスのスクロールとポインタの速度調整

マウスのポインタの速度やスクロールの方向をなれているものに変更しました。"システム環境設定"=>"マウス"で設定できます。スクロールはWindowsと同じようになるように赤枠部分のチェックをはずしました。

<img width="400" alt="config4.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/227731/55f12a62-b64c-3976-6b63-a2ab2b358521.jpeg">


# ターミナルの背景の透明化とexitで閉じるようにする

### ターミナルの背景の設定

ターミナルの環境設定で背景のカラーとエフェクトをクリックします。ポップアップした設定画面で不透明度とプラーを調整します。プラーはターミナルを透明にした際の背景のぼやけ度の調整です。

<img width="400" alt="config5.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/227731/50f44c37-bdc2-169c-c7c3-06453b261f94.jpeg">


### exitでターミナルが閉じるようにする

初期はターミナル上でexitをしても、プロセスが終了しましたと表示されるだけでターミナル自体は消えません。そこで、以下のように設定して、exitコマンドと同時にターミナルが閉じるようにしました。

<img width=400 alt="config6.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/227731/a8a11fc3-d409-4d4a-ecb6-b6e4c4d2e54e.jpeg">

# まとめ

今回は、マックを再インストールした際に真っ先に行った設定をメモしました。
フィルターをかけてシートごとに転記するマクロ　その3

今回は
『シートと一致する項目をフィルターで抽出し可視セルでコピペする』
マクロを、特定の列の単語をもとにシートを自動生成されるように改修しました。

シートの自動生成ですが、下図の方法で「マクロ」シートのA列のセルを参照してシートの作成ができるよう、コードを追加しました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/265756/82f0a53e-0586-0f32-d785-4b958fc791ac.png)

```VB
Option Explicit

Sub buntatu03()

'   マクロシート、分割前シートを変数で宣言
    Dim makuroWs As Worksheet
    Set makuroWs = Worksheets(1)
    Dim bunkatumaeWs As Worksheet
    Set bunkatumaeWs = Worksheets(2)
    
'   分割前シートのE列をマクロシートのA列にコピペする
    With bunkatumaeWs
        .Activate
        Range("E:E").Copy makuroWs.Range("A1")
    End With
    
'   マクロシートのA列の重複を削除し、昇順に並び替える
    With makuroWs
        .Activate
        Range("A:A").RemoveDuplicates Columns:=Array(1), Header:=xlYes
        Range("A1").Sort Key1:=Range("A2"), Order1:=xlAscending, Header:=xlYes
    End With
        
'   マクロシートのA列の最下行を確認
    Dim makuroLastLine As Long
    makuroLastLine = makuroWs.Cells(Rows.Count, 1).End(xlUp).Row
    Debug.Print makuroLastLine
    
'   A列の2行目以降のセルに記載された名前のシートを作る
    Dim j As Long
    For j = 2 To makuroLastLine
    
        Worksheets.Add After:=Sheets(j)
        
        Dim newWs As Worksheet
        Set newWs = Worksheets(1 + j)
        
        Dim group As String
        group = makuroWs.Cells(j, 1)
        newWs.Name = group
        
    Next j

'   新しく作ったシートに「課」ごとに内容を転記する（フィルターで抽出→可視セルでコピペ）
    Dim i As Long
    For i = 3 To Worksheets.Count

        Dim wsName As String
        wsName = Worksheets(i).Name
        Debug.Print wsName

        With bunkatumaeWs.Range("A1")
            .AutoFilter Field:=5, Criteria1:=wsName
            .CurrentRegion.SpecialCells(xlVisible).Copy Worksheets(i).Range("A1")
            .AutoFilter
        End With

    Next i
    
'   マクロシートのA列を削除しセルA1を選択して保存する
    With makuroWs
        .Activate
        Range("A:A").Delete
        Range("A1").Activate
    End With
    ThisWorkbook.Save

End Sub
```
マクロに操作を任せている部分が多いので、人的ミスも少なくなりそうです！
このマクロは一旦ここで完了とします。

次回はピボットを使ったマクロを作成する予定です。
【Rails】ERBからslimに乗り換えて最も良かったこととは？

Railsに慣れてきたら、erbではなくslimを使うことをおすすめします。
今回はERBからslimに乗り換えて最も良かったことを紹介します。
## ERBからslimに乗り換えて最も良かったこと
それはズバリ、**ファイルを分けずに書いてもストレスがないこと**です。
RailsでViewが長くなりすぎたらパーシャルに分けるのが定石ですが、それが面倒なパターンも多いと思います。
slimにすることでコード行数が約半数になるので、集中するファイルの数が減ります。
ぜひslimを使ってみてください。
## 終わりに
私は現在、Web3のサービスの開発をしています。詳しくはこちらの記事をご覧下さい。
        [無料でイーサリアムが当たる、Web3時代の寄付サイトを作った話](https://note.com/kenroda/n/n814347fbdcd7)
【Java】エラトステネスの篩で素数を求める

# はじめに

普段の開発では教科書的なアルゴリズムに触れる機会がないので、頭の体操を兼ねて「エラトステネスの篩」を使って素数を求めるコードを書いてみました。

# コード

* [Wikipedia](https://ja.wikipedia.org/wiki/%E3%82%A8%E3%83%A9%E3%83%88%E3%82%B9%E3%83%86%E3%83%8D%E3%82%B9%E3%81%AE%E7%AF%A9)に書かれているアルゴリズムをそのままJavaのコードに書き起こしました。
* 一番面倒だったのは、IntStreamをListに変換する部分でした。
 * アルゴリズムの本質とは全く関係のない部分で、やたら時間がかかってしまいました...

```java:PrimeNumberFinder.java
static void printPrimeNumbers(int maxNumber) {

	// ステップ1：「2から上限値までの整数」を探索リストに入れる。
	List<Integer> targetNumbers = IntStream.rangeClosed(2, maxNumber).boxed().collect(Collectors.toList());

	// 素数リスト
	List<Integer> primeNumbers = new ArrayList<Integer>();

	int sqrt = (int) Math.sqrt(maxNumber);

	// ステップ3：探索リストの先頭の値が、引数の平方根に達するまでふるい落とし操作を続ける。
	while(targetNumbers.get(0)<=sqrt) {
		// ステップ2：探索リストの先頭の数を素数リストに入れて、その倍数を探索リストから篩い落とす。
		int firstNum = targetNumbers.get(0);
		primeNumbers.add(firstNum);
		targetNumbers.removeIf(num -> (num % firstNum == 0));
	}

	// ステップ4：探索リストに残った値を素数リストに移して処理終了。
	primeNumbers.addAll(targetNumbers);

	// 素数の表示
	System.out.println(primeNumbers.stream().map(pNum -> pNum.toString()).collect(Collectors.joining("\t")));
}
```

```
// printPrimeNumbersの引数に100を指定した時の出力結果
2	3	5	7	11	13	17	19	23	29	31	37	41	43	47	53	59	61	67	71	73	79	83	89	97	
```

# 余談

* 中尾ミエさんが[「エラトステネスの篩」](http://www.utamap.com/showkasi.php?surl=k-131002-051)という曲を歌っているそうですが、歌詞を見ると上記のWikipediaのページの説明とほぼ同じでビックリしました。
 * 違う点は「探索リストの先頭の値が、引数の平方根に達するまでふるい落とし操作を続ける」という制約がないこと。
* どうやらNHKのEテレで使われていた曲のようですが、子供向けなのにしっかりした内容でビックリしました。
PG中にチョコレートを食べる時の注意点

# 仕事中の間食
PGをしているときは頭を使いますよね。
そうですね、頭を使うと当然糖分を欲っしてしまうわけですよ。

手軽に気軽に補給できる食材といえば
そう、**チョコレート**ですね。

# 食べるときに気を付けること
ずばり、**食べ過ぎない**ことです。

チョコレートは糖分補給にうってつけなのですが
SEたるもの、体をなかなか動かさないので栄養を蓄えがちです。

つまり、食べ過ぎてしまうと太ってしまう危険性があるのです！
ああ、おそろしい。

私は仕事をするようになってから、3年間で50Kg近く体重が増えました。
チョコレートだけが原因ではありませんが、仕事中の間食が主な原因です。
間食を食事に含めると、一日15食ぐらい食べていました。

# 太ることより恐ろしいこと
最近、特にチョコレートを食べる量が増えているのですが
そんな私の体に異変が起き始めました。

必ずしもこれだけが原因ではないとおもうのですが
(ここ最近残業しまくりというのも原因のはず。。。)

実は
**生きているだけで勝手に鼻血が出るようになってしまったのです**

# 身体の異変
別に鼻をぶつけたわけでもなにをしたわけでもないのですが
日常生活を送っているだけで、唐突に鼻血が出てくるようになりました。

なんでかなぁと原因を探っているときに
このチョコレートという結の論にたどり着きました。


この症状は非常に不便で
・歩いていたらいきなり鼻血
・動画を見ていたらいきなり鼻血
・シャワーを浴びていたらいきなり鼻血

~~もうなんかいきなりステーキですね。~~

# まとめ
なにが言いたかったかというと
**糖分補給を言い訳にしておかしばっか食べないほうがいいよ**
というでぶな私からのありがたいおことばなのでした。
Androidアプリ開発: AVDの調子が悪かったらWipeDataを行って初期化してみよう

Androidアプリ開発をやろうと思ってAndroid Studioをインストールして取り合えず空っぽのActivityを表示させてみようと思ったら、初っ端からハマってしまった話です。昨晩この問題の為に寝不足になってしまったので、同じ事で悩む人がいなくなればいいと思って書きます

# AVD(Android仮想端末) でアプリが一向に開始されない

テンプレートでプロジェクトを作って、AVDでRunしようとしたらステータスバーに `Waiting for target device to come online` と出たままアプリが起動する気配が無い状態でした

![image.png](https://qiita-image-store.s3.amazonaws.com/0/61404/6830d873-80b4-c50a-15ca-6761a29da51c.png)

一応、実機では動いたのでBuildとか、何かのインストールが足りないということではないと思ってました

PC再起動とか試して、さすがにこれは必要無いだろうと思ってたけど、開発者モードを有効にするとかも試していました

# AVDの状態を初期化する

上記の状態は実機環境でもスマホの調子が悪い時や、USBデバッグやフィンガープリントの許可をしてない時でも起こっていた気がしてたので、AVDを初期化してみようと思い浮かびました

しかし、AVD内のSystemメニューからfactory resetを行おうとしても動作しません。初期化するにはAndroid Virtual Device Managerから Actions - Wipe Data を実行します

![image.png](https://qiita-image-store.s3.amazonaws.com/0/61404/ce1be715-f780-42b8-fa2f-ec3ed0e3bc05.png)

Wipe Dataした後に再度Runすると、OSの初期状態から起動します

![image.png](https://qiita-image-store.s3.amazonaws.com/0/61404/9a76c76a-be25-194d-f1ce-d45eb74e8515.png)

起動するまで、しばらく待ってみるとすんなりアプリが起動しました

![image.png](https://qiita-image-store.s3.amazonaws.com/0/61404/b6a396b4-423a-e467-b029-2f82cd3f0e05.png)

めでたし :clap: 

# 振り返ってみると
今思うと、動作確認用の仮想端末なのにGoogleアカウントを入れないと使えるようにならないとか、何か変だと思ってました。環境設定の処理のどこかでエラーになったんだと思います
CS193p class note - 8 Animation

##### Memo:
- The closure you passed to `UIViewPropertyAnimator` gets executed immediately.

```swift
if myView.alpha == 1.0 {
    UIViewPropertyAnimator.runningPropertyAnimator(
        withDuration: 3.0,
               delay: 2.0,
             options: [.allowUserInteraction],
          animations: { view.alpha = 0.0 },
          completion: { if $0 == .end { view.removeFromSuperview() } }
    )
}
```

```swift
// let the views be three times bigger than the original size first
UIViewPropertyAnimator.runningPropertyAnimator(
    withDuration: 0.6,
    delay: 0,
    options: [],
    animations: {
        self.myViews.forEach {
            $0.transform = CGAffineTransform.identity.scaledBy(x: 3.0, y: 3.0)
        }
    },
    completion: { position in
        // do something you hope to achieve after animation is finished
    }
)
```
- Dynamic animation: If animating views, all views must be in a view hierarchy with referenceView at the top. There are many dynamic animations, such as `collisionBehavior`, `pushBehavior` and so on.

```swift
var animator = UIDynamicAnimator(referenceView: UIView)
let gravity = UIGravityBehavior()
animator.addBehavior(gravity)
let item1: UIDynamicItem = ... // usually a UIView
gravity.addItem(item1)
```

- we can create a subclass of `UIDynamicBehavior` and add as many behaviors as we want and override `init()`.

```swift
class CardBehavior: UIDynamicBehavior {
    lazy var collisionBehavior: UICollisionBehavior = {
        let behavior = UICollisionBehavior()
        behavior.translatesReferenceBoundsIntoBoundary = true
        return behavior
    }()
    
    lazy var itemBehavior: UIDynamicItemBehavior = {
        let behavior = UIDynamicItemBehavior()
        behavior.allowsRotation = false
        behavior.elasticity = 1.0
        behavior.resistance = 0
        return behavior
    }()
    
    private func push(_ item: UIDynamicItem) {
        let push = UIPushBehavior(items: [item], mode: .instantaneous)
        push.angle = ...
        push.magnitude = ...
        push.action = { [unowned push, weak self] in
            self?.removeChildBehavior(push)
        }
        addChildBehavior(push)
    }
    
    func addItem(_ item: UIDynamicItem) {
        collisionBehavior.addItem(item)
        itemBehavior.addItem(item)
    }

    func removeItem(_ item: UIDynamicItem) {
        collisionBehavior.removeItem(item)
        itemBehavior.removeItem(item)
    }

    override init() {
        super.init()
        addChildBehavior(collisionBehavior)
        addChildBehavior(itemBehavior)
    }

    convenience init(in animator: UIDynamicAnimator) {
        self.init()
        animator.addBehavior(self)
    }
}
```

- Add animation using UIView transition

```swift
UIView.transition(with: myView,
                  duration: 0.6,
                  options: [.transitionFlipFromLeft],
                  animations: {
    // put the thing you want to animate
})
```
- It's perfectly fine to add animation in the completion handler of another animation.
[Ansible]YAMLの書き方で何が間違ってるのかわからない時

#はじめに
YAML書いてて何が間違ってるのかわからない時。ありませんか？ありますねぇ！
Ansibleの理念だか何かに「シンプル」って言葉があって、
シンプル＝簡単なんだな！と思ってほいほい触ってみたら、シンプルすぎて逆にわかりづらい！
恐縮ながらまだAnsible触り始めて二週間も経ってないので、
ベストプラクティスではきっとないのだろうけど
あくまで私ならわからない時はこうやって確認する。
というのを本記事に執筆したいと思います。

#テストコード
```
- hosts: localhost
  tasks:
  - shell: ip a
    register: result
    debug:
      msg:{{ result }}
```
こちらがテストコードです。
本来は「- debug:」と書くべきであり、このままでは使えません。
試しに通してみると…。

```
The error appears to have been in '/var/ansible/test.yml': line 3, column 5, but may
be elsewhere in the file depending on the exact syntax problem.

The offending line appears to be:

  tasks:
  - shell: ip a
    ^ here
```

このようなエラーメッセージが帰ってきます。
似たようなメッセージなので全文は掲載しませんが、
まぁ、読んだら明らかに「- shell: ip a」の行が悪いんだな。
と普通だったら思いますよね？なので余計にハマってしまいます。

#解決策
##Online YAML parserを通す
http://yaml-online-parser.appspot.com/

参考にさせて頂いた記事：https://qiita.com/YumaInaura/items/8e4c08821b6940299a27

本当は、ここでばっちりエラーが表示されてこれでもうバッチリですね！で終わる予定だったのですが、幸か不幸かYAML的にはOKという結果でした。（ソシャゲ早くやりたいのにこのような結果になり残念です。あと、インデントのズレとかはしっかり見つけてくれるので実際有用です。）
![2019-03-14.png](https://qiita-image-store.s3.amazonaws.com/0/374426/5e2af98d-b8b9-fa5f-6ad4-b38e64219fe0.png)
補足：エディタとしてNotepad++やVScodeも紹介しようと思いましたが、新規にソフトウェアをインストールするよりもネットで一発！のほうがやりやすいかと思い、こちらを紹介しました（そもそもNotepad++はともかく、VScodeもYAMLとしての文法チェックしてくれてるのか不明でした。）

##--syntax-checkを通す
playbook実行時に--syntax-checkとオプションをつける事でYAMLのチェックをしてくれます。実際に動きはしないので安心です。Ansibleの構文チェックが当てにならないからその解決策を探しとるんやないかーい！ってなりますが、とりあえず上記のOnline YAML Parserを通せばYAML的にはOKなので、後はAnsibleとしてもOKか確認するだけです。

##YAML文法はOKだけど、AnsibleはNGな時。
上記にてYAMLの文法的には問題なさそうだけど、Ansibleの構文としてはNGという結果になったとしましょう。
vars_filesとかwith_itemsとかならその後に続くのは変数だとすぐわかるのでインデントの必要性も容易に把握できるのですが、shellとかdebugとか。あのあたりは何処で手続きが分かれてるのかわかりにくすぎですよね。きっとここでつまずく人多いと思うんです。

で、どうするのか？私の考えたやり方は…
……サンプルコードをコピペして、そこに少しずつマージしていく…？

カラム位置まで指定してくれるので、そこにしか目に行かないのですが
そこのブロックが悪いんだな～程度の情報として受け取る。
ぐらいが良いんだと思います。

#そもそもAnsibleを自動化ツールだと思っていないか？
ふと疑問が氷解したので、以下追記しました。
私はAnsibleは自動化ツールだと思ってました。
Redhatのサイトにも大きくAUTOMATION！って書いてあるぐらいですからね。
自動化して作業効率アップだ！改善だ！！って。
自動化もできます。しかし本質はそこではなかったのです。

<b>Ansibleは自動化ツールではなく、構成管理ツールである</b>ということです。
<b>私はYAMLにサーバ構築の処理（手続き）を書こうとしてたけど、
本当は手続きではなく設定を書くためのもの。
そもそもYAMLとは構造化されたデータを表現するためのフォーマットである。</b>

データを表現するためのフォーマット！！！
そのような言語でプログラムを書こうとしたらわかりにくいに決まってますよね。
あくまでYAMLはデータを表現するためのフォーマット。

そうなってくると私の書いたコードの何が悪いかが見えてきますね。
・意味不明な位置での改行（通常のプログラムであればこれでも全然良いと思いますけど、これが設定を書くためなのだとしたら、１つ１つの項目は１行にまとめられるべきですよね。）
・debugの不要な指定（機器の設定とは関係ないので要らないですね。-vvvv等の詳細出力パラメータを使えば大抵は問題ない筈です。
むしろここまでわかってくると、自分の書いたテストコードがAnsibleの用途をちゃんと理解してる人であれば、書きようが無いってこともワンチャン見えてきますね…（無くはないだろうけど、設定を書くという本筋からずれてる。）
世界最大高校生ロボコンFRCのプログラムについて~Climb関係~

この記事は[こちら](https://qiita.com/amidaandhero02/items/59c69d8facd2335f96ce)の記事の一部です。まずはこちらをご覧ください。

##FIRST
最初に。
段差に登るためのもの。
Robot.javaのクライム部分の説明もします。

と思ったらそもそもクライムの方法を説明から始めなければ...
初見だとほぼわからないので理解は置き去りにしても...
そもそも記事が読者を置き去りにするスタイルなので...

####まず、リフトを上げて(kLiftUp)
![ezgif.com-video-to-gif (2).gif](https://qiita-image-store.s3.amazonaws.com/0/281181/a93041ac-64ba-4725-143d-1ba441aa3cb7.gif)
　
####ストッパーを出して(kLocking)
![ezgif.com-video-to-gif (3).gif](https://qiita-image-store.s3.amazonaws.com/0/281181/e6bd4487-ab9e-7853-1861-f4a0b31cded9.gif)
　
####リフトを下げてロボットを持ち上げる(kAdvanceの一部)
![ezgif.com-video-to-gif (4).gif](https://qiita-image-store.s3.amazonaws.com/0/281181/04311ed8-62a6-2b9b-53d4-001a01719d9e.gif)
　
####前に進む(kAdvanceの一部)
![ezgif.com-video-to-gif (5).gif](https://qiita-image-store.s3.amazonaws.com/0/281181/9e30a601-2fcd-090a-9d58-fdc905dd4d01.gif)

ここまでが登るパートで、あとは後片付け
　
####リフトを上げて(kLiftUP)　
![ezgif.com-video-to-gif (6).gif](https://qiita-image-store.s3.amazonaws.com/0/281181/24e45047-fcd4-6eb0-7bb9-ce3e617d1a86.gif)
　
####ストッパーをしまってリフトを下げて終わり(LiftDown)
![ezgif.com-video-to-gif (7).gif](https://qiita-image-store.s3.amazonaws.com/0/281181/f0fd6116-7d03-5159-75e5-a4dc4f19594d.gif)

全部の流れをまとめて出そうと思ったらサイズ上限に阻まれた...
脳内補完してください:pray:


##このクラスに必要なこと
段差に登れること

##変数
<details><summary><font Color = "Blue">VictorSP</font> climbMotor  </summary><div>
クライムのときに使うモーター
</div></details>

<details><summary><font Color = "Blue">Solenoid</font>  climbSolenoid</summary><div>
ストッパーを出すためのソレノイド
</div></details>

##関数一覧
<details><summary>Climb()</summary><div>
引数...
なし

>モーターとソレノイドを代入する
</div></details>

<details><summary><font Color = "purple">public void </font> applyState()
</summary><div>
引数...
・<font Color = "Blue">State</font> state
 
>stateから情報を受け取り入力する
</div></details>

<details><summary><font Color = "purple">private void </font> climbAdvance()
</summary><div>
引数...
・<font Color = "blue">double</font> speed
 
>モーターにスピードを設定する。ここの処理をコメントアウトすれば動かなくなる。
</div></details>

<details><summary><font Color = "purple">private void </font> climbLockStopper()
</summary><div>
引数...
なし
 
>ストッパーでロックする
</div></details>

<details><summary><font Color = "purple">private void </font> climbUnlockStopper()
</summary><div>
引数...
なし
 
>ストッパーを外す
</div></details>

##関数説明
見たらわかるので省略。

##Robot.javaでのクライムについて
おおまかに前半部分と後半部分に分ける。
登りきるまでと登ったあとの後処理。
`switch(State.climbSequence)`で動作を切り替えていく。

ちなみにこのクライムの動作は目の前に段差がないとロボットが倒れてとてもまずいので、なかなか押しにくいボタンで開始するようにした。

###前半部
####kLiftUp
段差の高さは二つあるので、コマンドの入力で動作を分けた。
PID制御で高さの設定をして動かす。
目標値に届いたことを確認したらkLockingに移行する。

####kLocking
ここでストッパーを出す。
一応この間リフトの高さを維持しておく。
ロックする時間を考えて0.3秒空けてからkAdvanceに移行する。

####kAdvance
リフトを下げてロボットを持ち上げる。
ストッパーをひっかけてある後ろの枠のモーターを走らせて前に進む。

###後半部
####kLiftUp
リフトを上げて

####kUnlocking
ストッパーを外す。
そうしたら後ろの枠がバネによって戻る。(はずだが実際は荒業で戻した)


##LAST
最後に。
正直ここら辺はロボット生で見て動作わかるかな～？ぐらい初見にはわかりづらい感じでしたね。
ここら辺は知ったところで今後に役立つかといわれるとそうでもないのでまあ...

前の記事⇒[Grabber関係](https://qiita.com/amidaandhero02/items/4c4e628f90eec0ddc3a5)
次の記事⇒[]() 何を書こう..:thinking:
[Rails] ActionController::UnknownFormat エラーとなるときの解決方法

# 事象
ActionController::UnknownFormat in コントローラ名#アクション名
![FireShot Capture 063 - Action Controller_ Exception caught - localhost.png](https://qiita-image-store.s3.amazonaws.com/0/277359/475a6ca3-08d5-99f5-1cf7-a0f3478cdb2b.png)

# 原因
コントローラのアクションに対応するViewファイルが存在しないため。

# 対応
対応するViewファイル `app/views/コントローラ名/アクション名.html.erb` を作成する。
今回の場合、 `app/views/monthly_orders/show.html.erb` を作成してエラーを解消した。
Elmでマス目を描画する2

Elm本をchapter3の冒頭まで読み、ソースコードがほぼ読めるようになりました。
なんか作れる気がしてきたので、[前回](https://qiita.com/negiboudu/items/942d29f8c20811d8e26d)半端になっていたマスを描画するページをゼロから作ってみました。

# 作ったもの

https://distracted-perlman-699f4d.netlify.com

Elm guideにあるカウンターアプリの改造みたいなもので、マスの数と大きさを動的に変更できるようにしました。
JavaScriptだけでやろうとするとなかなか面倒があると思うのですが、Elmで書くと比較的簡単。関心事に注力して書けるのを実感しました。

![IMG_20190314_200632.jpg](https://qiita-image-store.s3.amazonaws.com/0/118890/40d9a0af-6f87-8995-6ee4-c235437cbb8b.jpeg)

![IMG_20190314_200716.jpg](https://qiita-image-store.s3.amazonaws.com/0/118890/3e41f595-2d28-8302-5692-fab5f7999e91.jpeg)

![IMG_20190314_200547.jpg](https://qiita-image-store.s3.amazonaws.com/0/118890/e6e5f3f8-f4d3-13a7-378f-7e54dd79bb70.jpeg)

# ソースコード

```elm:ソースコード
module Main exposing (Model, Msg(..), init, main, update, view)

import Browser
import Html exposing (..)
import Html.Attributes exposing (..)
import Html.Events exposing (onClick)


main =
    Browser.sandbox
        { init = init
        , update = update
        , view = view
        }



-- MODEL


type alias Model =
    { size : Int
    , length : Int
    }


init : Model
init =
    Model 1 1



-- UPDATE


type Msg
    = Size Int
    | Length Int


update : Msg -> Model -> Model
update msg model =
    case msg of
        Size val ->
            { model | size = model.size + val }

        Length val ->
            { model | length = model.length + val }



-- VIEW


view : Model -> Html Msg
view model =
    div []
        [ div []
            [ text "length"
            , button [ onClick (Length -1) ] [ text "-" ]
            , text (String.fromInt model.length)
            , button [ onClick (Length 1) ] [ text "+" ]
            ]
        , div []
            [ text "size"
            , button [ onClick (Size -1) ] [ text "-" ]
            , text (String.fromInt model.size)
            , button [ onClick (Size 1) ] [ text "+" ]
            ]
        , td [ style "border" "solid thin", style "width" (String.fromInt model.size ++ "px") ] []
            |> List.repeat model.length
            |> tr [ style "height" (String.fromInt model.size ++ "px") ]
            |> List.repeat model.length
            |> table [ style "border" "solid thin", style "border-collapse" "collapse" ]
        ]
```
dockerでginを取り敢えず動かしたい

そんな人向け
ライブリロード対応だよ:relaxed:

## 準備

1.docker-compose.yml

```docker-compose.yml
version: '3'

services:
  app:
    container_name: gin
    image: golang:1.12.0-alpine
    volumes:
      - .:/go/src/app
    command: >
      sh -c "cd /go/src/app &&
      apk update &&
      apk add --no-cache git &&
      go get -u github.com/codegangsta/gin &&
      go get -u github.com/golang/dep/cmd/dep &&
      dep init ||
      dep ensure &&
      gin -i run"
    ports:
      - 3001:3001
```

2.main.go

```main.go
package main

import "github.com/gin-gonic/gin"

func main() {
	r := gin.Default()
	r.GET("/ping", func(c *gin.Context) {
		c.JSON(200, gin.H{
			"message": "pong",
		})
	})
	r.Run()
}
```

## 起動

```
$ docker-compose up
```

## 確認

```
$ curl http://localhost:3001/ping
{"message":"pong"}
```

## 停止

```
$ docker-compose down
```
RailsでCGMサイトを個人開発しているお話

# はじめに
サラリーマンをしている傍、自宅で個人開発をしている「[にゅ〜ぶる(@newburu)](https://qiita.com/newburu)」です。
新しいサイトを立ち上げるたびに、何かしらアウトプットしていこうと思い、
「[BLOG](http://blog.newburu.com/)」と、ここQiitaに投稿していきます！

# 作ったサイトの紹介
今回作ったサイトは、こちら。
　「[ランキングメーカー](https://rank-maker.herokuapp.com/)」です。
名前の通り、ランキングを登録して貰うサイトになっています。
・ランキングのテンプレートを用意する事
・テンプレートに対して自分の思うランキングを作成する事
が出来ます。
<img width="401" alt="2019-03-10-20.48.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/118481/74b8fc06-ad2d-b7d2-a579-0a1108bce334.png">

# サイトの稼働環境
フレームワーク：Rails
サーバ（PaaS）：Heroku
ストレージ：AWS S3

# 作ろうと思ったキッカケ
かねてより、常にSNSを利用したCtoCのサイト・サービスを作りたいと思っていました。
※今も継続中。
CtoCと言っても、お金の取引をするものではなく、
交流を深めて貰いたい趣旨が強いので、CtoCではなく、別の言い方があるのかもしれませんが、
ご理解頂ければと思います。

Twitterがメインになっているのは、自分が一番利用しているのがTwitterだからです。

フォロー関係なく、誰かが登録・発信した事に対して、誰かが反応する。
そこから新しい輪が出来たらいいな。そんな思いがずっとあります。

# 使われている技術・Gem、参考にしたサイト
- [Device](https://github.com/plataformatec/devise)/[Pundit](https://github.com/varvet/pundit)
ログイン認証/認可に使っているGemです。説明するまでもないですね。
　参考サイト
　　https://qiita.com/cigalecigales/items/f4274088f20832252374
　　https://qiita.com/zaru/items/8bf7b41b33f3f55bd27d
ちなみに、ランキングメーカーは、ログインしなくても使えます。

- [CarrierWave](https://github.com/carrierwaveuploader/carrierwave)
画像アップロードのGem。こちらも説明いらないですね。
また、AWS S3へのアップロード用に、fog、fog-awsを使っています。

- [MiniMagik](https://github.com/minimagick/minimagick)
画像加工用Gem。
OGPの自動生成に利用しています。
　参考サイト
　　https://qiita.com/codeq_official/items/848c705252075c631e29
　　※ストレージにAWS S3を使う関係上、画像を作り置きしたくなかったので、
　　　こちらのサイトを参考に、アクセスがあった際に生成する方法を使っています。

あとは、Ransack/Kaminariとか、simple_formとか、有名なGemが入っている感じでしょうか。

# OGPはやっぱり大事
Twitterだけでなく、SNSに拡散する事を機能として盛り込む場合、OGPはやっぱり重要だと思います。
Twitterは文字投稿サービスですが、アイキャッチ画像は重要だと思っています。
今までは、画像をアップロードして、それを常に表示する仕組みにしていましたが、本システムからは、自動作成機能を追加してみました。
毎回画像を用意する必要もなく、自動でいろんなバリエーションのアイキャッチ画像が出来上がるので、
OGPを使う際には、必須な機能となるでしょう。

元となるテンプレート画像を用意して、その上に文字を追加するパターンですね。

ストレージにAWS S3を使っている関係上、先に画像を作成して配置してしまうと、課金の対象となってしまいます。
そのため、アクセスがあった際にのみ作成するような仕組みを探していて、参考サイトにたどり着きました。
パラメータに表示したい文字列を設定してアクセスする事で、画像を生成して返してくれます。
実装のソースなどについては、勝手に転記する感じになるのかなと思うので、省略させて貰いますね。

# 今後の展開
CGMの特性上、コンテンツ数がキーになってくると思っています。
拡散して誰かに使ってもらう事も大事とは思いますが、やっぱりまずは、自分で使いまくるのが良いのかなと。

何も考えずにでも、いろんなランキングのテンプレートを作成して、
Twitterにツイートしていくと思いますが、よろしくお願いします！
よければ、[Twitter(@newburu)](https://twitter.com/newburu)をフォローしてください！一緒に遊びませんか？！

また、定着率というのでしょうか、
初見さんが登録したくなる仕組みも考えて機能追加していかないといけないなと思っています。
ランキングの投稿数のランキングとか（ランキングのランキングって分かりづらいですがw）
ただ、これらも、やっぱり、データ数が大事。結局はそこになるんですよね。頑張ります！！

# 終わりに
長文のだらだらとした文章にも関わらず、最後まで読んで頂き、ありがとうございます！

次のサイトも、既に企画・立案は完了しており、現在開発中。
今回紹介した機能・Gemもそのまま利用して、素早く開発して、素早く公開。
公開してから、何がいけなかったのか、どうやったらアクセス数が増えるのか？
などを考えながらブラッシュアップして行く予定です。

公開した際には、また記事を書かせて貰いますので、その時はまたよろしくお願いします！

以上、ありがとうございました！
PerlでワンライナーFizzBuzz

#はじめに
Perlが一番好きな言語なのに、Perlの記事書いたこと無いじゃんということで2年くらいだらだら考えてたFizzBuzzを残しておきます。
三項演算子の戻り値や、printまわりをもう少し頑張ればもう2文字位頑張れそうですね...
#改行なし
```perl
print(($_%3?"":Fizz).($_%5?"":Buzz)or$_)for 1..100
```
改行なしなので数字やFizzBuzz同士がくっついちゃっています。
なんかズルい気もする。
後置forは最高ですね。
#改行あり
```perl
print((($_%3?"":Fizz).($_%5?"":Buzz)or$_)."\n")for 1..100
```
sayとか使えたらもっと短くなると思うんですけど-Eオプションがいる（もしくは、useでバージョン指定する）のでちょっとずるいし、エラーが出てprintみたいにはいきませんでした。やっぱり、改行が鬼門ですね...
#最後に
やっぱりPerlは最高ですね。FizzBuzz楽しい。
こうしたほうが良いとか、Perlでもっと短くかけるとかあったらぜひコメント下さい（懇願）
項目セットを使ってソース修正の手間を省いてみる

標準機能を使わずに開発で対応する場合、項目追加等のちょっとした改修でもいちいちソースコードを修正する必要があったり、**開発者がいなくて修正自体できない！**みたいなことが起こったりします。
ちょっと項目を追加したいだけなのに…というのをなんとかできないか考えて、項目セットを使ってみたらメンテナンスが楽にならないかなと思いました。

# 項目セットって？
詳細は[こちら。](https://help.salesforce.com/articleView?id=fields_about_field_sets.htm&language=ja&type=5)
項目セットはオブジェクト内の項目を一つにまとめて管理してレイアウトに使ったりすることができる機能なのですが、
Salesforce自体簡単にレイアウトなどを修正できるのであまり使ったことがありませんでした。

実際使ってみるとページレイアウトの編集と同様に項目の追加・削除が簡単にできることがわかります。
~~これならサルでも修正できそうなので問い合わせが減りそうです。~~

# Apexクラス内での使い方
項目セットはApexクラス内では「[FieldSetクラス](https://developer.salesforce.com/docs/atlas.ja-jp.apexcode.meta/apexcode/apex_methods_system_fieldsets_describe.htm)」から呼び出して使用します。
項目セットの中に含まれている項目は`SObjectType.sObject.FieldSets.fieldSetName.getFields()`のようにすると取得できます。
戻り値は「List\<[Schema.FieldSetMember](https://developer.salesforce.com/docs/atlas.ja-jp.apexcode.meta/apexcode/apex_class_Schema_FieldSetMember.htm)>」となり、各項目は「getFieldPath()」メソッドで取得することができます。

```java:
for(Schema.FieldSetMember fsm : SObjectType.sObject.FieldSets.fieldSetName.getFields()) {
    system.debug('この項目は：' + fsm.getFieldPath());
}
```
Queryを作成する時にこれを使うと、動的に取得する項目を変更することができます。

また、レコードの項目の値は`sObject.get(Schema.FieldSetMember.fieldPath)`のようにすると取得できます。

# サンプル
商談に親子関係を作成し、親商談の特定の項目が更新されたら子商談の同じ項目を更新しています。

```java:
private void updateChildOpp (Opportunity[] newObjs) {
    List<Id> parentIdList = new List<Id>();
    
    // 更新対象の商談件数分繰り返す
    for (Opportunity opp : newObjs) {
        // 親商談に紐づく子商談を取得する
        parentIdList.add(opp.Id);
    }

    // 子商談用のクエリ
    String query = 'SELECT Id, ';
    // 案件基本情報(OppDefaultInfo)の項目セットからクエリで取得する対象のAPI名を取得する
    for(Schema.FieldSetMember fsm : SObjectType.Opportunity.FieldSets.OppDefaultInfo.getFields()) {
        query += fsm.getFieldPath() + ', ';
    }

    // 親商談との比較用クエリ
    String parentQuery = '';
    // 案件基本情報(OppDefaultInfo)の項目セットからクエリで取得する対象のAPI名を取得する
    for(Schema.FieldSetMember fsm : SObjectType.Opportunity.FieldSets.OppDefaultInfo.getFields()) {
        parentQuery += 'OrgOpportunity__r.' + fsm.getFieldPath() + ', ';
    }
    query += parentQuery;
    query += ' OrgOpportunity__c FROM Opportunity WHERE OrgOpportunity__c IN :parentIdList';
    
    // 商談から子商談および親商談の情報を取得する
    List<Opportunity> childOppList = Database.query(query);

    List<Opportunity> updateList = new List<Opportunity>();
    for (Opportunity opp : childOppList) {
        Boolean addFlg = false;
        for(Schema.FieldSetMember fsm : SObjectType.Opportunity.FieldSets.OppDefaultInfo.getFields()) {
            // 子商談の項目セットの値を親商談の値が違う場合はセットする
            if (opp.get(fsm.fieldPath) != opp.OrgOpportunity__r.get(fsm.fieldPath)) {
                opp.put(fsm.fieldPath, opp.OrgOpportunity__r.get(fsm.fieldPath));
                // 1件でも追加された場合は更新用のリストへ加える
                addFlg = true;
            }
        }
        // 更新対象のみupdate用リストにくわえる
        if (addFlg) updateList.add(opp);
    }
    // 子商談を更新する
    if (!updateList.isEmpty()) update updateList;
}
```

全体のソースとか説明は[こちら](https://github.com/daichikudo02/fieldSetSample)
gitLabのReview Appsを使ってMRに「ここにデプロイしたよ！」ってコメントをつけたい！

# 経緯 
[前回の記事](https://qiita.com/rena_m/items/efe8ced2b1b26571c10c)で何とかdeploy previewに一歩近づいたものの、MRにそれを自動で通知する術がわからなかった私ですが、前回は触れなかったと書いたgitLab Review Appsにきちんと取り組むことになり、色々読んだ結果その方法がわかったのでまとめます。方法を突き止めるまでは苦労しましたが、やることは簡単です:sparkles:

# やりたいこと
↓これを表示すること
![previewApp.png](https://qiita-image-store.s3.amazonaws.com/0/318825/54a406b2-7864-6c40-4f73-3824c558a3f6.png)


# やり方
`gitlab-ci.yml`の対象のstageに`environment`を追加する。
例

```yml:gitlab-ci.yml
image: python:3.6.5
variables:
    ...
stages:
    - deploy
deploy_job:
    stage: deploy
    environment:
        name: review/${CI_COMMIT_REF_NAME}
        url: https://${CI_COMMIT_REF_NAME}.${APP_ID}.amplifyapp.com
    only: 
        ...
    except: 
        ...
    script:
        ...
```

こうすると、パイプラインが走ってjobが成功した後につくコメントの`Deployed to : XX`のXXがnameに、リンク先がurlになります。deploy previewではMRごとに環境を立てるので基本的には変数を使ったurlになるはずです。
cf. [変数の一覧](https://docs.gitlab.com/ee/ci/variables/README.html)

わかってから読むと確かに公式ドキュメントでも言ってなくもないのですが、正直ちょっとわかりにくかったなというのが本音です。もっとどの操作をするとどう反映されるのかわかりやすい文章になったら嬉しいな…:frowning:
【世界最大の高校生ロボコン】FRCのプログラムについて~PID制御について~

この記事は[こちら](https://qiita.com/amidaandhero02/items/59c69d8facd2335f96ce)の記事の一部です。まずはこちらをご覧ください。

##FIRST
最初に。

PID制御の話になります。
>彡(ﾟ)(ﾟ)「PID制御なんてもう知っとるわ！いらんいらん」

という方はこちらの[WPILibでのPID制御の扱い](#WPILibでのPID制御の扱い)まで。
普通にプログラム書くのとだいぶ違う書き方になりますので...

PID制御は初見だと理解しづらいと思います。
言ってることを汲み取ってふーんこんなんなんだなと思って読んでください。

詳しい仕組みはわからなくてもコードはかけると思いますし、触れてきゃわかるようになります(適当)

##PID制御とは
N個記事があると思うのでそちらに任せます()
僕がわかりやすいと思ったのを挙げておきます。

ただ、微積分の心をわかってないとどちらにしろ難しいので、軽く。
微分というのは、値の増え具合(グラフでいうなら傾き)を求める操作。
積分というのは、PID制御においては目標値との差の合計(グラフでいうなら目標値と計測値の間の面積)

これは結構簡潔
[PID制御って何？](https://www.rkcinst.co.jp/techno/22/techno_22.htm)

これは後半はつらいかも
[モータのＰＩＤ制御法](http://www.picfun.com/motor05.html)

これは数学とか用語を知っとかないと難しいかもしれない
[PID制御について宇宙一わかりやすく解説してみる](https://www.yukisako.xyz/entry/pid_control)

##WPILibでのPID制御の扱い
PID制御について理解していただいたところで、プログラム的な話になります。

その前に用語について整理しておきたいと思います。
エアコンに例えた場合、
>温度センサーを、入力部分
空気を送るところを、出力部分

>kp, ki, kdとかで示されるものを、ゲイン

と呼びます。

###基本
WPILibではPID制御は`PIDController`というクラスで行います。

`pidController.setPoint(setpoint)`というように目標値を設定して動かします。

そこで必要なのがゲインと入力部分と出力部分ですね。
これはコンストラクタにて設定します。

`new PIDController(kp, ki, kd, SourceModule, OutputModule)`

`InputModule`は`PIDSource`というインターフェースを継承した入力部分で、`OutputModule`は`PIDOutput`を継承した出力部分である必要があります。
もう一つ必要なことがあるのですが、後ほど紹介します。

###PID制御の処理の流れ
WPILibでのPID制御は別スレッドを立てて一ループ0.05秒で実行されます。(ちなみに本ループは0.20秒間隔)

毎ループ、入力部分から今の値を受け取って、それをもとに計算して、出力部分に出力します。

####入力部分について
入力部分から今の値を受け取る際には、`PIDSource`の`double pidGet()`という関数を利用します。
もちろん`PIDSource`はインターフェースなので、この関数をオーバーライドする必要があります。
ここにエンコーダなら距離を返す関数、ジャイロなら角度を返す関数とかを利用して`double`型にして返します。

他には、`void setPIDSourceType(PIDSourceType pidSource)`とか、`PIDSourceType getPIDSourceType()`もオーバーライドしなきゃいけません。
ただ、`PIDSourceType`は

```Java:PIDSourceType.java
public enum PIDSourceType {
  kDisplacement,
  kRate
}
```

と、正直使い所無いので、適当にオーバーライドしましょう。

####出力部分について
出力部分で出力する際には、`PIDOutput`の`void pidWrite(double output)`という関数を利用します。
もちろん`PIDOutput`はインターフェースなので、この関数をオーバーライドする必要があります。
引数の`output`をモーターに代入したりします。

**代入はこの関数内で閉じてなければいけません**
うっかり本スレッドで代入しちゃうと0.20秒ごとの代入で、PID制御の制度がだいぶ落ちます

###PIDControllerの使い方
インスタンスを代入して使えるようになったところで使っていきます。

`pidController.setSetpoint(double setpoint)`で目標値(Setpoint)を設定(set)して、
`pidController.enable()`で有効にすれば動くようになります。

ちなみにSetpointは`pidGet()`で単純に入力部分の値を受け渡すようにした場合、その入力部分を初期化した状態を基準とした**絶対座標**で代入する形になります。

足回りのモーターを例として考えると、
仮にエンコーダをスタート地点で初期化した場合、どれだけ動こうとも、目標値はスタート地点を基準とした距離という扱いになります。

エンコーダーを初期化してから、前に1m進んだ後、そこから2m下がりたいなと思った場合、
`pidController.setSetpoint(-2.0)`とか入力するとそこから3m下がってしまいます。

正しく動くようにするには、
`pidController.setSetpoint(-1.0)`、もっというなら`pidController.setSetpoint(1.0 - 2.0)`という代入をします。

###補足
ロボットをまっすぐ走らせたいと思ったら足回りのPID制御は二つ必要になります。
前に進むためのものと、横ずれしないためのものとで分ける必要があります。

##LAST
最後に。

説明下手もあり、だいぶわかりにくかったと思います。申し訳ないです。
書いてるとき眠かったんです(言い訳)
まあわからなくてもどうにかなります。
では。

前の記事⇒[Main関係](https://qiita.com/amidaandhero02/items/4833e36d92b58398a34c)
次の記事⇒[Drive関係](https://qiita.com/amidaandhero02/items/271215e677c54f7fb045)
React Hooksで非同期処理を仕掛ける場合、refが便利

React Hooksを使っていくと、今までの感覚ではうまくいかないことがよくあります。

## 大前提：関数内の関数はクロージャを形成する

ReactではなくJavaScriptレベルの話ですが、関数内のローカル変数は関数の実行ごとに生成されます。そして、関数`A`の内で別な関数`B`を作成して、`B`の中から`A`のローカル変数を参照すると、`A`の実行によって生成された変数が、`B`から使うために`A`の終了後も生き残ることとなります。これが「クロージャ」です。

## React Hooksの場合

React Hooksを使う場合、忘れてはならないのは、コンポーネントの描画ごとに**関数が再実行される**ことです。ただ単にコンポーネント内で書いた関数ももちろんクロージャになりますが、コンポーネントの描画（=再実行）ごとに関数が再生成されますので、そのままReact内のイベントハンドラなどにセットしている場合は値の束縛の問題は生じません。

### 非同期処理に入る

これが問題となるのが、「`useCallback`などでコールバックをキャッシュさせる場合」や「`setTimeout`や`fetch`など、React外の非同期処理に繋げる場合」です。前者については[以前に触れました](https://qiita.com/jkr_2255/items/2c3900d2c03646e8bbd2)が、破棄用の配列を適切に指定すれば問題なく乗り切れます。しかし、後者の場合はそうもいきません。

```jsx
function SimpleTimer(){
  const [value, setValue] = React.useState(1);
  
  React.useEffect(() => {
    if(value % 5 !== 0) return;
    setTimeout(() => alert(value), 2000);
  }, [value])
  
  return(
    <div>
      <button type="button" onClick={() => setValue(num => num-1)}>-</button>
      {value}
      <button type="button" onClick={() => setValue(num => num+1)}>+</button>
    </div>
  );
}
```

ものすごく人工的な例ですが、「値が5の倍数になってから2秒後」に`setTimeout`の関数が実行されます。ただ、`value`は`setTimeout`を仕掛けた時点のものを束縛してしまっているので、タイマーが動いている間に`value`を変えても、それは読み取ってくれません。

### mutableな値の置き場としての`ref`

ここで登場するのが`useRef`です。`ref`という名前の通り、「コンポーネントへの参照」を入れるという印象も強いですが、単なる値の置き場としても利用可能で、Hooks内部ではインスタンス変数の代わりとしても利用可能です（[React FAQ](https://ja.reactjs.org/docs/hooks-faq.html#is-there-something-like-instance-variables)）。

では、今回の「コールバックの束縛」に対策を行ってみましょう。

```jsx
  const ref = React.useRef(null);
  ref.current = () => alert(value);
  React.useEffect(() => ref.current = null, [ref]);
  const mutableCallback = React.useCallback(() => {
    const func = ref.current;
    func && func();
  }, [ref]);
```

まず、`ref`を作成して、次に`ref.current`に関数を代入しますが、この代入は**毎回**実行されます。そして、コールバックの**実行時**に`ref`から関数を取り出してそれを実行すれば、どんなタイミングで実行したとしても、直前に`ref.current`へ代入した、最新の値に束縛された関数が実行される、という寸法です。

なお、`React.useEffect`は、アンマウント後にコールバックが呼ばれて意図しない動作をするのを防ぐため、コールバックの動作を止めるためのものです。

このようにして作った`mutableCallback`を`setTimeout`の引数にセットすれば、最新の`value`を拾うようになります。

非同期コールバックをよく使うのであれば、`useMutableCallback`のように切り出しておいてもいいかもしれません。

## CodePenでの実装例

<p class="codepen" data-height="265" data-theme-id="0" data-default-tab="js,result" data-user="jkr2255" data-slug-hash="jJYbEv" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid black; margin: 1em 0; padding: 1em;" data-pen-title="jJYbEv">
  <span>See the Pen <a href="https://codepen.io/jkr2255/pen/jJYbEv/">
  jJYbEv</a> by Jkr2255 (<a href="https://codepen.io/jkr2255">@jkr2255</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>
Railsのfindとwhere(id: XXX).firstの違い

# findとwhere(id: XXX).firstの違い
両方ともidで絞り込みをかけるがその他の挙動が違う箇所が多いのでメモ

## find

* 返り値はレシーバーのオブジェクト
* DB問い合わせを行う
* 発行SQLにorder by id descが付与されない

```
$ User.find(1).class
User Load (0.7ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = ? LIMIT ?  [["id", 1], ["LIMIT", 1]]
=> User
```

## where

* 返り値は`ActiveRecord_Relation`のオブジェクト
* `where().first`、`where().map()`などデータを操作するタイミングでDB問い合わせを行う
* 発行SQLに`ORDER BY "users"."id" ASC`が付与される

```
$ User.where(id: 1).class
=> User::ActiveRecord_Relation

$ User.where(id: 1).first
User Load (0.4ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = ? ORDER BY "users"."id" ASC LIMIT ?  [["id", 1], ["LIMIT", 1]]
=> #<User:0x00007fffcb3d3e98
```
laravel pay.jp webhook csrf 動かない

webhookのテスト送信しても、エラーも出ないしピクリとも動かない。
なので聞いてみた。


json受け取れるようにしておいてねって。
ということで、早速。

```Http/Middleware/VerifyCsrfToken.php

    protected $except = [
        //これで payjp/webhook に json を送れるようになる
        'payjp/webhook'
    ];

```

あとはpayjpの管理画面に webhook を設定。

これで送信できるようになる。
CSRF対策とかいうのをやってるみたいね。laravelは。

# 外部URLから戻ってくる場合

外部のクレジットカードサイトで決済をし、戻ってくる場合は
以下のようにする。

エラー対策
```
The POST method is not supported for this route. Supported methods: GET, HEAD.
```


```web.php
//postでも受け取れるように
Route::post('/mypage', function () {
    return view('vue');
})->where('any', '^(?!api\/)[\/\w\.-]*');
```

そして

```Http/Middleware/VerifyCsrfToken.php

    protected $except = [
        //これでmypageに戻ってこれる。
        'mypage'
    ];

```

`OK`
Flutter バリデートの判定とonSave呼び出しがうまくいかない

# びふぉー
はじめはこんな感じで書きました。

```dart
void onPressed() {
  var form = _formKey.currentState;
  if (form.validate()) {
    form.save();
.....

```

私は書く前にいろいろ考えて
これで大丈夫だった...はずなのですが....

``Error: The method 'validate' isn't defined for the class 'State<StatefulWidget>'.
 - 'State' is from 'package:flutter/src/widgets/framework.dart' ('file:///C:/DevelopKit/flutter/packages/flutter/lib/src/widgets/framework.dart').
 - 'StatefulWidget' is from 'package:flutter/src/widgets/framework.dart' ('file:///C:/DevelopKit/flutter/packages/flutter/lib/src/widgets/framework.dart').
Try correcting the name to the name of an existing method, or defining a method named 'validate'.
    if (form.validate()) {
``
　
**なんでや。**
ついでにsave()メソッドについてもエラーで愚痴られました。


一応、公式ドキュメントを確認しても該当のメソッドは存在しました。
　  

###型推論が原因かな？？
　  
  
てことで 上記の一行目をこのように書き変えました
# あふたー
```dart
FormState form = _formKey.currentState;
```
　
うごいた。

# おわりに
なんでや。
AWS Well-Architected Frameworkのオンラインセミナー受けてみた

「[AWS Black Belt Online Seminar AWS Well-Architected Frameworkによるコスト最適化](https://www.slideshare.net/AmazonWebServicesJapan/20190312-aws-black-belt-online-seminar-aws-wellarchitected-framework)」の自分向けメモ
Well-Architected Framework（W-A）って何？......レベルの人向け


## クラウド活用の道のり
活用方法は大きく2つ

- クラウドネイティブ
    - プロジェクト初期からクラウド前提の設計・構築を行う

- リフト＆シフト
    - オンプレからクラウドへそのまま移行し、段階的にクラウド最適化を行う

## よくあるお客様の課題
 - リフト＆シフト後、最適化する技術がない

## W-Aとは
 - システム設計・運用の大局的な考え方とベストプラクティス集
 - AWSとお客様と共に、W-Aも常に進化し続ける
 - W-Aを利用することでベストプラクティスがすぐに入手できる
 - ビジネス的な判断をするための材料で、全てがW-Aに則っている必要はない

### 構成要素
 - ホワイトペーパー
    - 設計原則とQA形式のペストプラクティス集
    - あくまで原則
 - SA（Solution Architect）またはパートナーの支援
 - W-A Tool
    - ベストプラクティスとのギャップをセルフチェックできる

### 設計原則
オンプレと異なり、クラウドでは後から設計を見直すことが容易にできる
とにかくテスト、試行錯誤を繰り返すこと

 - 勘に頼らないキャパシティ設計
    - オンプレでは初期に決めてそのまま最後まで突き進む
    - クラウドでは後でスケール変更が可能
 - 本番規模でのシステムテストの実施
    - オンプレでは物理的に本番規模のテスト環境の用意が困難
    - クラウドでは本番環境も仮想なので、同様のテスト環境の用意が可能
 - 自動化
    - オンプレではアーキテクチャの設計は基本変更しない
    - クラウドでは何度もアーキテクチャを試行することを前提にする
 - 発展的なアーキテクチャ
    - オンプレではある静止点のアーキテクチャを使い続ける
    - クラウドではDDD（ドメイン駆動設計）を前提とし、都度更新していく
 - データ計測
    - オンプレでは初期に決めたアーキテクチャが問題ないか確認するに留まる
    - クラウドでは計測を行ってからアーキテクチャを決める
 - 本番想定のテストを実施、対策
    - オンプレでは本番想定のテストには制限がある
    - クラウドでは本番同様のテスト環境で試行が可能
 
### QAの使い方
 - 問いに対し、明確な答えがない項目が重要
 - AWSを超えた質問もあるが、その問いに対する明確な答えがないと仕様に落ちないことが多々あるため設けられている
 - 使い方はQAを利用したセルフチェック　→　SAとのレビュー実施　→　クラウド最適化の実施
    - SAとのレビューは設計段階がおすすめ
    - SAとのレビューは無料（個別相談会も有効）
 - リスクや改善点の顕在化させるたための問いであり、全項目の答えがベストプラクティスに則っている必要はない　

## コスト最適化
 - QAの46項目のうち、9項目がコスト最適化
 - 9項目のうち、5項目を抜粋

### サービス選択時にどのようにコストを評価しているか
利用料金だけでなく、人的コストも含めて考えてほしい

 - 必要な分だけ使用する
 - 全体効率の測定をする
 - データセンタへの投資不要
 - 投資のリターンの分析と把握
 - マネージドサービスの活用
    - オペレーションコストを減らす
        - 例えば、DBを利用する際は比較的料金が安いEC2をDBサーバーとするのでなくRDSサービスを使う
    - 日々進化している、他サービスとの連携が容易

### インスタンスタイプとサイズをどのように選択しているか
決め打ちではなく、きちんと計測して選択してほしい
オンプレではある静止点での最適解を求め、後からスペック変更をする慣習はない
オンプレではスペックが要求を満たしているのであれば、運用開始後も見直す慣習はない
クラウドでは世代をあげることでコストが安価になるので必ず見直すこと

 - CloudWatchでリソース利用状況を把握する
    - 利用率が安定している場合
        - ファミリー、タイプの見直し
        - リザーブドへの見直し
    - 利用率が一定ではない場合
        - AutoScalingの検討
        - バッファベース、キューイング処理の検討（SQS、Kinesis）

### コスト削減のための料金モデルをどのように選択しているか
海外リージョンを含めて検討してほしい

 - リージョンごとに価格が異なる
    - ビジネス要件を満たせるのであれば東京リージョン以外も考慮すべき
        - 例えば、データ分析に必要な高価なインスタンスのみ比較的安価な海外リージョンに立てる
 - レイテンシーも高い実感はない
    - CloudFrontでAPIコールの高速化を実現（静的コンテンツだけではない）
 - 海外リージョンは最新のサービスが使いやすい
 - 購入オプションも考慮すべき
    - オンデマンド
        - 一時利用
    - リザーブド
        - 常時稼働
        - EC2だけでなくCloudFront、DynamoDBでも選べる
    - スポット
        - 処理系

### データ転送量について、設計時にどのように考えたか
動画配信等を提供するサービスだとコスト全体に占める割合は大きいので特に考えるべき

 - CloudFrontの活用
    - レイテンシーの改善
    - 分析
    - セキュリティ対策
    - EC2、S3の負荷軽減　⇒　EC2、S3のスペック、台数削減につながる

### AWS使用量とコストをどのようにモニタリングしているか
試行錯誤を繰り返すためには必須

 - 請求情報のアクセス有効化、コストエクスプローラーの有効化
 - コストエクスプローラーでタグ別に見ることが可能
 - AWS Budgetsにて、閾値を超えたら通知可能

## サポートの活用
 - Trusted Advisor
    - セキュリティ観点などのチェック項目
    - ビジネス、エンタープライズのプランだと項目数が多い


## まとめ
 - ベストプラクティスを知った上でのビジネス的な判断を！
 - AWSサポートとTrusetd Advisorの活用でコスト削減につながる
githubのガイドラインに従ってリポジトリを作成する

# はじめに
[Githubのガイドライン](https://guides.github.com/activities/hello-world/)に従って、リポジトリの作成方法についてをまとめる。
日付：2019/3/14

## 環境
macOS Mojave(バージョン10.14.1)

##参考
https://guides.github.com/activities/hello-world/

##リポジトリ作成手順
1. Githubにログインする
2. 右上の+ボタンをクリックする
![スクリーンショット 2019-03-14 21.54.57.png](https://qiita-image-store.s3.amazonaws.com/0/377612/a6037c74-1e09-1e0c-46ba-3bd24c1e1923.png)
3. New Repositoryをクリック
4. Repository nameに任意の名前(test-Repo)を入力
5. Descriptionにリポジトリの説明を入力
6. Public(Default値)を選択
7. initialize this repository with a README　にチェックをつける
8. Create Repositoryをクリック
![スクリーンショット 2019-03-14 21.59.14.png](https://qiita-image-store.s3.amazonaws.com/0/377612/80123cb6-0c62-7e85-ffea-765932d1e1bb.png)
9. 完了
![スクリーンショット 2019-03-14 22.04.52.png](https://qiita-image-store.s3.amazonaws.com/0/377612/26ebf6f4-4b34-17c6-7dd5-2e77d126e4b2.png)