OmniAICreator/Qiita-1.07M huggingface dataset:
TensorFlow Object Detection API : 利用するための流れ 

# 物体検出までの流れ
TensorFlowの物体検出を実際にやってみたので、そのプロセスをまとめてみました。いくつかのステップを踏みながら進める必要があり、結構大変ですね。
この記事の前提として、画像ファイルは収集、加工してあるものとして、アノテーションからのプロセスを書いてみました。
また、TensorFlowが動かせる環境は準備されているものとします。PCでもクラウドでも何でもよいです。学習する数や画像サイズにもよりますが、私がMac PC環境で動かすと学習時間に7~8時間もかかります:sweat_smile:GPUがなくてもできるだけ速いマシンがあればよいです。学習は一度止めて、チェックポイントから再開できるので、分割して何回も動かしてもよいですが、それはそれで大変ですね:frowning2:
Macのアノテーションツールとしてlabelimgを使いました。出力されるxmlファイルの要素名(<要素名>)がチュートリアルと同じものになるツールを使った方が、コード変更が少ないのでよいと思います。
Object Detectionのコードはここから入手しました。
https://github.com/bourdakos1/Custom-Object-Detection/blob/master/object_detection/create_tf_record.py

実行するプログラムや画像ファイル、パラメータなどのフォルダー構造を決めておくと、開発しやすくなる。[追加した記事][link-1]と合わせて見ていただくと、わかりやすいと思う:grinning:
[link-1]:https://qiita.com/t_kawa1/items/c7cd7d067c0334503eab

物体検出までの流れ：
![物体検出プロセス.jpg](https://qiita-image-store.s3.amazonaws.com/0/225748/205feaa1-1b50-3d13-17f3-039cb326136b.jpeg)
Python(Flask)で作った画像認識アプリのHerokuデプロイはOpenCVインストールにheroku.ymlを使おう

## 症状

画像認識アプリをFlaskでつくった。
一見Herokuデプロイはうまくいったかに見える。
しかし以下の画面。

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

ログを確認。

```
app[web.1]:   File "/app/.heroku/python/lib/python3.6/site-packages/cv2/__init__.py", line 4, in <module>
app[web.1]:     from .cv2 import *
app[web.1]: ImportError: libSM.so.6: cannot open shared object file: No such file or directory
app[web.1]: [4] [INFO] Shutting down: Master
app[web.1]: [4] [INFO] Reason: Worker failed to boot.
heroku[web.1]: Process exited with status 3
heroku[web.1]: State changed from up to crashed
heroku[router]: at=error code=H10 desc="App crashed" method=GET path="/" host=xxxx.herokuapp.com request_id=xxxxx-xxxx-xxxx-xxxx-xxxxxxxx fwd="xx.xxx.xx.xx" dyno= connect= service= status=503 bytes= protocol=https
```

なんやこれ。

## エラーの原因

なんか`import cv2`っぽいんでコメントアウトしたらエラー解決。
※まあ、もちろんcv2がないのでpythonが動かんのだが。。
ということで、つまり`import cv2`が原因。
Heroku環境でopenCVをインストールできていなかったということだろう。

## でどうやってOpenCVをHerokuにインストールするのか

ちゃんと`requirements.txt`にopencv-pythonはあるのに。。

```requirements.txt
Flask==0.12
gunicorn==19.7.1
Jinja2==2.9.4
numpy==1.14.1
opencv-python==3.4.0.12
tensorflow==1.5.0
```

いろいろ調べていると`Docker`もしくは`heroku.yml`をつかってHerokuにOpenCVをインストールせねばらならんらしい。

## Docker知らんし、heroku.ymlでやろう！

以下のファイルを作成。

```heroku.yml
build:
  languages:
    - python
  packages:
    - libopencv-dev
run:
  web: gunicorn web:app --log-file=-
```

※`runtime.txt`、`Procfile`、`requirement.txt`はそのままで大丈夫大丈夫。。

で、

```
$ git add -A
$ git commit -m "heroku.yml やったったで"
$ heroku stack:set container
$ git push heroku master
```

するとHerokuにズコズコopenCVが入ってきます！
いっちょ上がりです！
aタグにデフォルトでついているスタイルの取り方

たまに忘れるので、メモがわりに置いておきます。

## 下線
![スクリーンショット 2018-04-01 18.33.09.png](https://qiita-image-store.s3.amazonaws.com/0/237008/b01bc281-f634-7bcc-b264-3c013ca8b180.png)

```css
a {
  text-decoration: none;
}
```
## 青や紫などの文字色
![スクリーンショット 2018-04-01 18.33.37.png](https://qiita-image-store.s3.amazonaws.com/0/237008/cab1f160-151b-c292-84be-e5be923e45e7.png)

```css
a {
  color: #000000;
}
```
## クリックした瞬間に赤くなる文字色
![スクリーンショット 2018-04-01 18.34.10.png](https://qiita-image-store.s3.amazonaws.com/0/237008/fdea0f0b-1bd4-c7d8-10e6-049bfe288928.png)

```css
a:active {
  color: #000000;
}
```
## フォーカスがあたっているときの青い囲み線
![スクリーンショット 2018-04-01 18.34.50.png](https://qiita-image-store.s3.amazonaws.com/0/237008/6b82e624-170a-82e8-978a-eca1128b93e9.png)

```css
a:focus {
  outline: none;
}
```
CSVファイルをSQLで操作できるgem「CSQL」を作りました

# はじめに
最近アルバイトでcsvファイルを触ることが多かったので、データをSQLで検索できたら便利だなと思ったので、csvファイルをSQLで操作できるようにするgem、「[csql](https://rubygems.org/gems/csql)」を作成しました。

# セットアップ方法
## 「q」のインストール
csqlはライブラリ内で「[q](https://github.com/harelba/q)」というコマンドラインツールを利用しているので、csqlインストール前にqをインストールする必要があります。
各OSごとのインストール方法は以下のURLに書かれています。
http://harelba.github.io/q/ja/install.html

## 「csql」のインストール
csqlは以下のようにgemをインストールすれば利用することができます。

```
gem install csql
```

# 使い方
はじめに使い方の例をあげます。
まず、例の中で利用しているtest.csvを以下のように定義します。

```test.csv
hoge1,hoge2
ほげ,100
ホゲホゲ,200.0
```

READMEに記されている例は以下になります。

```ruby
require 'csql'

sql = CSQL::SQL.new('test.csv')
p sql.execute("SELECT * FROM csv") #=> [{"hoge1"=>"ほげ", "hoge2"=>"100"}, {"hoge1"=>"ホゲホゲ", "hoge2"=>"200.0"}]
p sql.execute("select hoge.hoge1 from csv as hoge") #=> [{"hoge.hoge1"=>"ほげ"}, {"hoge.hoge1"=>"ホゲホゲ"}]
p sql.execute("SELECT * FROM csv WHERE hoge2 <= 100") #=> [{"hoge1"=>"ほげ", "hoge2"=>"100"}]
p sql.execute("SELECT SUM(hoge2) from csv") #=> [{"SUM(hoge2)"=>"300.0"}]
```

上の例を用いて利用方法を説明します。
まず、操作したいcsvファイルのパスを引数として、CSQL::SQLオブジェクトを生成します。
その後、そのオブジェクトに対してexecuteメソッドを用いてクエリを発行すれば、結果がハッシュの配列として返ってきます。
ここで重要なのが、**「テーブル名はcsvとすること」**です。よってfrom csvは固定です（ASは使うことができます）

SQLの文法はSQLiteと同じです。

# できないこと
## テーブル結合
今回gemを作成した目的が、csvファイルをSQLで操作したかったからなので、複数のファイルに対する操作を考えていませんでした。
よって、現在はテーブル（ファイル）結合を行うことはできません。

## 挿入、更新、削除
このgemを用いてCSVファイルの内容を変更することはできません。データを参照のために利用してください。

# 参考URL
https://github.com/getty104/CSQL
https://rubygems.org/gems/csql
http://harelba.github.io/q/ja/index.html
https://github.com/harelba/q/

# 更新
4/5 SELECTで「*」を利用した際に、日本語のカラムが設定できないバグを修正
OpenLayers の練習


- GoogleMapAPIしか使ったことなかったので、[OpenLayers](https://openlayers.org/)の練習
- ついでに[Bootstrap](https://getbootstrap.com/)も4で。

## ライブラリ

- OpenLayers : v4.6.5
- Bootstrap  : v4.0

## 感想

- GoogleMapAPIと感じが違いすぎて...苦労しました。
- マーカーの処理は多分ちがうと思います...

## GitHub Pages

- [ここで動きます。](https://qoaopx.github.io/openlayers/)
DynamicBone　ReadMe

ダイナミックボーンはキャラクターの骨や関節に物理学を適用します。
シンプルな設定で、あなたのキャラクターの髪、布、胸、またはあらゆる部分が現実に動くでしょう。

Assets / DynamicBone / Demo / Demo1を開いて動作を確認します。
ご不明な点がございましたら、willhongcom @ gmail.comまでご連絡ください。


-------------------------------------------------- -----------------------
基本設定：

1.適切に設定された文字を準備すると、Mecanimと従来のリグの両方がサポートされます。
2.ダイナミックボーンを適用するゲームオブジェクトを選択します。
3.コンポーネントメニューで、Dynamic Bone - > Dynamic Boneを選択します。
4.インスペクタで、ルートオブジェクトを選択します。
5.動的骨パラメータを調整します（次のセクションの詳細の説明を参照）。


必要に応じて、コライダーオブジェクトを追加できます。

1.コライダーがアタッチするゲームオブジェクトを選択します。
2.コンポーネントメニューで、Dynamic Bone - > Dynamic Bone Colliderを選択します。
3.コライダーの位置とサイズを調整します。
4. Dynamic Boneコンポーネントでは、コライダーのサイズを大きくし、対応するオブジェクトを追加します。


-------------------------------------------------- -----------------------
ダイナミックボーンコンポーネントの説明：

- ルート
  物理を適用する変換階層のルート。

- 更新レート
  内部物理シミュレーションレート。フレーム/秒で測定。

- UpdateMode
  通常：通常の更新。
  AnimatePhysics：フィジックスエンジンと同期するためにフィジカルループ中に更新されます。
  UnscaledTime：Time.timeScaleから独立して更新されます。

- ダンピング
  どのくらいの骨が減速した。値が高いと、ふんわりと元の位置に戻る感じ

- 弾力性(Elasticity)
  各骨を元の向きに戻すために適用された力。値が高いと常にかかっている、元に戻す力が強くなる。つまり、値が低いと物体はブランブランに動き、値が高いとほとんど動かなくなる。

- 剛性(Stiffness)
  骨の元の向きがどれくらい保存されているか。

- 不活性(Inert)
  どのくらいキャラクタの位置変化が物理シミュレーションで無視されるか。

- 半径
  各骨は、衝突者と衝突する球体とすることができる。半径は球のサイズを表します。

- ダンピング分布、弾性分布、剛性分布、不規則分布、半径分布
  階層チェーン上でのパラメータの変更方法曲線の値は、対応するパラメータに乗算されます。

- 終わりの長さ
  End Lengthがゼロでない場合、変換階層の最後に追加のボーンが生成され、
  長さは最後の2つの骨の距離で乗算されます。

- 終了オフセット
  End Offsetがゼロでない場合、変換階層の最後に追加のボーンが生成され、
  オフセットは文字のローカルスペースにあります。

- 重力
  力は、世界の空間の骨に適用されます。キャラクターの初期ポーズに適用される部分的な力は相殺されます。

- 強制
  力は、世界の空間の骨に適用されます。

- 衝突
  Colliderオブジェクトは、骨と相互作用します。

- 除外
  骨は物理シミュレーションから除外されます。
     
- 凍結軸
  特定の平面上を移動するように骨を拘束する。

- 遠隔ディスエーブル、参照オブジェクト、オブジェクトまでの距離
  キャラクターがカメラやプレーヤーから遠い場合、物理シミュレーションを自動的に無効にします。
  参照オブジェクトがない場合、デフォルトのメインカメラが使用されます。

Dynamic Bone Colliderコンポーネントの説明：

- センター
  オブジェクトのローカル空間にある球またはカプセルの中心。

- 半径
  球またはカプセルの半径は、変換のスケールでスケーリングされます。

- 高さ
  2つの半球を含むカプセルの高さは、変換のスケールでスケーリングされます。

- 方向
  カプセルの高さの軸。

- バウンド
  骨を外側に束縛するか内側に束縛するかを制限する。

-------------------------------------------------- -----------------------
ダイナミックボーンスクリプトリファレンス：

- パブリックvoid SetWeight（float w）;
  物理学と既存のアニメーションとの融合を制御します。

- パブリックvoid UpdateParameters（）;
  実行時にパラメータを更新し、パラメータを変更した後にこの関数を呼び出します。

-------------------------------------------------- -----------------------
バージョン履歴

1.0.1初期リリース。
1.0.2インスペクタのUIを改善しました。
1.0.3有効/無効にすると不活性不安定になる不具合を修正しました。
1.1.0カーブを使用して、階層チェーン上のパラメータを設定します。
      Colliderは束縛内の骨を束縛するように設定できます。
1.1.1除外設定を追加します。
1.1.2負のスケール問題に対処する。
1.1.3ボーンにスケールが含まれているバグを修正しました。
1.1.4フリーズ軸を追加する。
      スクリプト経由で追加したときにバグを修正しました。
1.1.5遠隔ディスエーブルを追加します。
      GCの割り当てを減らす。
1.1.6カプセル衝突者のバグを修正しました。
1.1.7 Unity 5のサポート。
1.1.8負のスケールに起因する問題を修正しました。
1.1.9マイナススケールの検出を改善する。
      衝突者が内部に設定されているとバグを修正しました。
      UpdateMode設定を追加します。
1.1.10 Unity 5.4以降のマイナススケールによる問題を修正しました。
1.2.0ツールチップを追加する。
      平面コライダーを追加します。
      実行時にパラメータを更新する関数を追加します。
Pythonの勉強会に参加してきたメモ

## Pythonの特徴
* スクリプト言語
* インデント利用
* 誰が書いても同じようになる
* ライブラリが豊富
* オブジェクト志向
* 型宣言がない

関数を書いていくこともできるが、上から順次実行していくのが基本。
研究や機械学習をやるときはプログラムを書いていくと時間がかかるが、とりあえず軽く動かしてみるときや、結果を共有することに向いている。

## Pythonのオブジェクト志向
* 継承
* ポリモーフィズム
* 厳密にカプセル化することはできなくて、暗黙の了解として指定することはできる。

## Pythonの種類
Python3系、Python2系 がある
 ⇒基本は Python3系 を使用する。

## Anacondaとは
本来は必要なライブラリを個別にインストールし、環境を整えていく必要があるが、
Anacondaをインストールすることで、一括で行うことができる。
インストール先:
https://www.anaconda.com/download/#macos

## Jupyter Notebook
ノートブックと呼ばれる形式で作成したプログラムをブラウザで実行できるツールのこと。
(Anacondaをインストールすれば一緒に使える)
「Anaconda-Navigator」と呼ばれるアプリを起動して、「Jupyter Notebook」を起動するとブラウザが勝手に起動する。

### ショートカットキー
* Shift + return セルを実行する
* tab コマンドの保管
* Shift + tab ツールチップ(ヘルプ）

ツールチップ「後ろに”？”」
$ a = "あいうえお"
$ a？   ⇒予測で結果が見ることができる。

### お題
3で割れる数はFizz、５で割れる数はBuzz、3と5で割れる数はFizzBuzzと表示する。

```
for i in range(1, 100):
    if i % 3 == 0 and  i % 5 == 0:
          print("BuzzFizz")
    if  i % 3 == 0:
         print("Fizz")
    elif  i % 5 == 0:
         print("Buzz")
    else:        
         print(i)
```

http://omake.accense.com/wiki/PythonIntroLogicalAnd

python にswitch文ない 涙

### 機械学習で使う代表的なライブラリを知る
* NumPy
 科学技術計算や機械学習に必要な多次元データ、大量のベクトル演算を拘束に処理することが可能な計算ライブラリ。

* pandas
  CSVファイル、テキストファイルなどのデータを読み込んで、文字列データや数値データをまとめたデータフレーム型として扱うことができるライブラリ。

* matplotlib
  散布図、ヒストグラム、折れ線グラフ、3次元グラフ等が手軽に描画できるグラフ描画ライブラリ。

* scikit-learn
  オープンソースの機械学習ライブラリ。様々な機械学習手法が利用可能。

* TensorFlow
  オープンソースの機械学習ライブラリ。主に深層学習（ディープランニング）で利用されている。 

```
$ pip install tensorflow 
```

* Keras
  TensorFlowなどの機械学習ライブラリをさらに便利に使えるラッパーライブラリ。

```
$ pip install keras
```

### 参考資料
https://github.com/takahiro-777/ML_tutorial
https://github.com/takahiro-777/deeplearning_tutorial

Python入門
https://www.pythonweb.jp/tutorial/

公式ドキュメント
https://docs.python.jp/3/tutorial/
dot back

```html
<div class="f dot"><h1>the list</h1></div>
```
```scss
@mixin dot($s:black){
.dot:hover{background-size:100px}
.dot{
 background-repeat:repeat;
 background-image:url('https://i.imgur.com/J0y4RA2.png');
 background-size:50px;
 transition:background-size 0.1s linear;
 text-shadow: 2px 2px 0 $s;
}
}@include dot(/*white*/)
;
body{margin:4rem;background-color:orange}
.f{width:33rem;height:auto;border:2px solid}
h1{color:white;line-height:1}
```
【PowerShell】csvから読み込んだPSCustomObjectにNotePropertyとしてindex等を追加する

## 機能
csvにn行1列で納められているstringを読み込み、indexとsubstringをメンバーとして追加します。csvデータは以下のような固定長のものを想定しています。

"C:\Users\~~~\Desktop\test\test.csv"

| string      |
|:---------------:|
| 58111361         |
| 44215590         |
| 44123622         |
| 23115643         |

## 注意点
- 使用する際はご使用者の責任でお願いします。
- 自分用のメモですが、何か役に立てば幸いです。
- PowerShellのバージョンが古い場合、Import-Csvに-EncodingパラメタがないのでGet-Content CSVファイル | CovertFrom-CSVを使います。[（Import-CSVコマンドレットには、-Encodingパラメタがなく、文字化けする）。](http://scripting.cocolog-nifty.com/blog/2010/02/import-csv-enco.html)

## 環境
- PSVersion 5.1.16299.251
- Windows 10 Home

## 手順
1. csvを読み込んでstringをNotePropertyとして持つPSObjectを作成する。
2. PSObjectにindexを追加する。
3. stringから抜きだしたsubstringをPSObjectに追加する。

## コード
```powershell:
#csvの格納場所を指定してcsvを読み込む
$csv = Import-Csv "C:\Users\~~~\Desktop\test\test.csv"

#行数を取得する
$csv | Add-Member NoteProperty index 0
for($i = 0; $i -lt ($csv | Measure-Object).Count; $i++){
    $csv[$i].index = $i+1
}

function Add-Submember($TargetObject,$MainString,$MemberName,$SubstringStartIndex,$SubstringCount){
    #stringのNotePropertyを持つPSCustomObjectから、そのstringの一部を切り出して名前を付けて、NotePropertyとして追加する
    #使用例) Add-Submember $csv string age2 1 2 ⇒ $csvのstringの1文字目から2文字を取り出してage2と名付けてNotePropertyに追加 
    $TargetObject | Add-Member NoteProperty $MemberName 0
    for($i = 0; $i -lt ($TargetObject | Measure-Object).Count; $i++){ 
        $TargetObject[$i].$MemberName = $TargetObject[$i].$MainString.ToString().substring($SubstringStartIndex-1,$SubstringCount)
    }
}

#stringの1個めからの2文字を抜き出す
Add-Submember $csv string substring 1 2
#stringの3個めからの4文字を抜き出す
Add-Submember $csv string substring2 3 4

#sort（おまけ）
$csv | Sort-Object {[int] $_.substring} 
$csv | Sort-Object {[int] $_.substring}, {[int] $_.substring2} 

```

## 工夫点
- csvデータの操作について、行を追加する方法はググったらすぐ出てきましたが、列を追加する方法はパッと出てこなかったので書いてみました。

## 課題・問題点
- 今回のやり方では、いったんAdd-memberで0を代入してから、再度for文で数値を代入していますが、あまりスマートではないと感じます。

## おわりに
- コメント大歓迎です。
 
## 他の参考文献・参考サイト
- 本投稿では触れていませんが、必要な変数が揃った後のデータ処理については、次のサイトが参考になりました。[（[Powershell]自作オブジェクト作る練習）。](https://qiita.com/S_SenSq/items/456260c39f5a3e816c4c)
[Swift] GetterとSetterには異なるアクセス修飾子を設定できる

コードリーディングをしていた時に見つけたコード。

```swift
public internal(set) var appName: String?
```

SwiftではGetterとSetterで異なるアクセス修飾子を設定出来るみたい。
上のコードは、getterはpublic, setterはinternalと別々の修飾子が付いている。

この記法を使わずに書くと下のようになる。一手間多くなる。

```swift
internal var appName: String?

public func getAppName() -> String? {
    return appName
}
```

>Getters and setters for constants, variables, properties, and subscripts automatically receive the same access level as the constant, variable, property, or subscript they belong to.
You can give a setter a lower access level than its corresponding getter, to restrict the read-write scope of that variable, property, or subscript. You assign a lower access level by writing fileprivate(set), private(set), or internal(set) before the var or subscript introducer.
[The Swift Programming Language (Swift 4.1)](https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/AccessControl.html)

どうやらSetterにはGetterよりも低いアクセスレベルを割り当てることが出来るみたい。
`internal(set)` `private(set)` `fileprivate(set)`といったアクセス修飾子が用意されている。

```swift
struct TrackedString {
    private(set) var numberOfEdits = 0
    var value: String = "" {
        didSet {
            numberOfEdits += 1
        }
    }
}

var stringToEdit = TrackedString()
stringToEdit.value = "This string will be tracked."
stringToEdit.value += " This edit will increment numberOfEdits."
stringToEdit.value += " So will this one."
print("The number of edits is \(stringToEdit.numberOfEdits)")
// Prints "The number of edits is 3"
stringToEdit.numberOfEdits = 10
// error: Cannot assign to property: 'numberOfEdits' setter is inaccessible
```

`private(set)` の為、 `stringToEdit` に値を入れようとするとエラーが発生する。
Pythonでキーロガー

# キーロガー
キーロガー(keylogger)というのはキーボードの入力を記録するソフトで
一般的にはウィルスです。
悪用しないでください。

# コード
環境: Python3.6.4

```keylogger.py
from pynput.keyboard import Key, Listener

FILE_NAME = 'text.txt'
out = []

def on_press(key):
    try:
        char = key.char
    except:
        #char = key
        char = ''
    finally:
        out.append(char)
def on_release(key):
    pass

def shuffle(out):
    import random
    random.shuffle(out)

if __name__ == '__main__':
    try:
        with Listener(on_press=on_press, on_release=on_release) as listener:
            listener.join()
    except:
        pass
    shuffle(out)

    with open(FILE_NAME, mode='a') as f:
        f.write(''.join(out))
```
# 注釈
 - 一般のキー入力を取得するためにはroot権限が必要
 - `on_press`関数内は`try`で一般キー取得、`except`で修飾キー取得。今回修飾キーの情報は不要なのでコメントアウトしてる
 - 終了するときはCtrl+cとかで

# きっかけ
キー入力の頻度を測ってキーボード配列をカスタマイズしたかった。
一般に出回るDvorakやColemakだとvimでのhjkl移動が困難なので。

~今後の流れ~
使用頻度の高いキーを記録
→既存のキー配列で自分に合ったものがないか確認
http://patorjk.com/keyboard-layout-analyzer/#/main
→なければ作る
【ドメイン正規化】Nginxで「www」ありのURLを「www」なしにリダイレクトする【nginx Ver.1.12.2】

## 概要

`www.example.com` にアクセスした際、 `example.com` にリダイレクトさせる。
このように、wwwありなしのいずれかにまとめることをドメイン正規化という。

**そもそも以下のような選択肢がある。**

1. wwwありとなし、どちらも使える
2. wwwありとなし、一方のみ使えるようにできる（使わない方にはアクセスできない）
3. wwwありとなし、一方のみ使えるようにできる（使わない方にはアクセスした際、使える方にリダイレクトされる）

### 「1.」と「2.」を選ばない理由

> 1\. wwwありとなし、どちらも使える

こちらに関しては、検索エンジンがwwwありとなしの両方を別のページとしてインデックスしてしまうため、重複コンテンツとみなされ、評価が下がってしまう可能性がある。つまりSEOに弱くなる。

参考：
*[重複するコンテンツ - Search Console ヘルプ](https://support.google.com/webmasters/answer/66359?hl=ja)*
https://support.google.com/webmasters/answer/66359?hl=ja

> 2\. wwwありとなし、一方のみ使えるようにできる（使わない方にはアクセスできない）

こちらの選択肢は「1.」のようなSEO的なデメリットはないものの、ユーザビリティが良くない。
ユーザーが誤ってアクセスを試みた際にページが閲覧できず、流入機会の損失となる可能性がある。

> 3\. wwwありとなし、一方のみ使えるようにできる（使わない方にはアクセスした際、使える方にリダイレクトされる）

この方法であれば、「1.」と「2.」で挙げたようなデメリットがない。
また、静的なWebページではなくWebアプリケーション（Ruby on Railsなどで作るようなやつ）の場合、リクエストURLのホスト名の部分で処理を分岐させるようなこともあるので、そういった点も「1.」では期待した動きにならない場合があるが、「3.」では期待通りの動きになる。

## 設定手順

### 1. DNSでレコードを追加する

```
example.com IN A 0.0.0.0 # Aレコードで0.0.0.0のグローバルIPアドレスにexample.comのドメイン名が紐付けられている
example.com IN CNAME www.example.com # CNAMEレコードでwww.example.comのドメイン名にexample.comのドメイン名が紐付けられている
```

※サーバーのグローバルIPアドレスが0.0.0.0でドメイン名がexample.comの場合

この時点ではexample.com、www.example.comのどちらにアクセスしても0.0.0.0に繋がる。

詳細な設定方法はドメインレジストラ（お名前.comなど）によって異なるため割愛

### 2\. 設定ファイル（ `nginx.conf` ）の設定を変更する

`/etc/nginx/nginx.conf`

```
   server {
        listen       80;
        server_name  www.example.com;
        return       301 http://example.com$request_uri;
    }

    server {
        server_name  example.com;
        // 省略
    }
```

serverディレクティブを追加し、www.example.comへのアクセスをexample.comにリダイレクトさせる。
このとき、$request_uriと記述しているので、URLのホスト名以降のパスやパラメータを保持したままリダイレクトしてくれる。

例：

`www.example.com/hoge?lang=jp`

というリクエストが

`example.com/hoge?lang=jp`

にリダイレクトされる。

### 3\. nginxを再起動する

```
# service nginx restart
```

あるいは、

```
# systemctl restart nginx.service
```

再起動することで設定が反映される。

これで対応完了。

## 備考

`.htaccess` に記述することでドメイン正規化する方法もある。

## 検証環境

```
# nginx -v
nginx version: nginx/1.12.2
# cat /etc/system-release
Amazon Linux release 2 (2017.12) LTS Release Candidate
```
プレイモード中にUnity Editorの色を変える

# はじめに
Unity Editorでプレイモード中(再生ボタンみたいなやつを押した時)にInspectorなどGameObjectの内容を変更しても、プレイモードを終了すると変更した内容は反映されません。
プレイモードと気付かず変更した内容が反映されてなくてガッカリしない為には、プレイモード中はUnity Editorの色が変わるように設定しておくことをお勧めします。

# 設定方法
設定画面を開きます。

- Windows：メニューバーの [Edit] - [Preferences…]
- Mac：メニューバーの [Unity] - [Preferences]

![設定画面](https://qiita-image-store.s3.amazonaws.com/0/242340/31ea8f65-1567-4b0a-8872-8fa4625ecc8a.png)
[Colors] の「Playmode tint」を任意の色に変更します。(この場合は水色)
これでPlaymode時に色が変わるようになります。

↓編集モード
![編集モード](https://qiita-image-store.s3.amazonaws.com/0/242340/bed8c46f-56e4-2a51-5012-8d0c79d0553a.png)

↓プレイモード
![プレイモード](https://qiita-image-store.s3.amazonaws.com/0/242340/9e2eb3d2-0246-69de-7771-b8d99734d87d.png)

おわり
Homebrewでnodenvをインストール

## 前提
homebrew経由でインストールしたいと思います。
※homebrewの導入手順は、[前回記事](https://qiita.com/mzmiyabi/items/0e5ef874bad0b35d5a56)の前半部分を参照。

## nodenvのインストール
homebrew経由でnodenvをインストールします。

```bash
$ brew install nodenv
```

## インストールできるバージョンの確認

```bash
$ nodenv install --list
```

## 指定のバージョンのNode.jsをインストールする

```bash
$ nodenv install 9.9.0
```
Gitでmergeで衝突がたくさん起きてもう全部Aで(Bで)いいやというとき


## マージで衝突したときにAかBか選んでしまうオプション

- A を選ぶときは `--ours`
- B を選ぶときは `--theirs`

## 「もう全部 B でいいわ」

```sh
git checkout --theirs -- ファイル名
```

を用います。

```sh
git checkout --ours -- ファイル名
```

を使えばよいです。


git status の unmerged からファイル名を取り出して、

```fish
for f in (cat hoge)
  git checkout --theirs -- $f
end
```

としました。
Let's Encrypt で standalone で作っていたのを webroot に変更する


Let's Encrypt で当初、standalone で作成したものを、webroot に変更したくなった。


```sh
certbot certonly --webroot -w /var/www/example.net -d example.net
```

とすると `/etc/letsencrypt/renewal/example.net.conf` にある、

```
[renewalparams]
authenticator = standalone
```

の部分が、

```
[renewalparams]
authenticator = webroot
```

と、webroot のものに変更される (周辺も適当に変わる)。 以降は webroot 形式で更新ができる。


## Ubuntu のときに普通のパッケージでやろうとしたらエラーが出る

Ubuntu 16.04 の `apt-get` で入る `letsencrypt` でやろうとしたら、


```
An unexpected error occurred KeyError: 'server'
```

というエラーが出て正常に更新されなかった。ググると、 https://github.com/certbot/certbot/issues/3569 に、

> This is caused by taking configuration files from a newer version of certbot/letsencrypt and using them with letsencrypt 0.4.1 in Ubuntu. 

と書かれていた。了解した。

おとなしく https://certbot.eff.org/#ubuntuxenial-nginx に書かれているクライアント `certbot` を使ってみたら、正しく更新できた。
Karabiner-Elements の少し前の思い出, SandSなど


この話は、最近はもう [Karabiner-Elements](https://github.com/tekezo/Karabiner-Elements) がかなり開発されてきたので、もういらなくなったことの話です。

Karabiner-Elements の利用はもちろん takezo さんの恩恵がものすごく大きいわけですが、長らく [wwwjfy (Tony Wang)](https://github.com/wwwjfy) さんのフォークにも助けられてきました。忘れないためにそのことをメモしておこうと思います。


## wwwjfyさんのフォーク

<https://github.com/tekezo/Karabiner-Elements/pull/247> にて、wwwjfy さんが standalone keys + one-to-many mapping のフォークを作られていることが紹介されました。思わず飛びついて使いました。

それは <https://github.com/wwwjfy/Karabiner-Elements/releases> でダウンロードできるものです。


## SandS, command単独 to 英数/かな

SandS という、スペースバーを単独で押したときにはスペース、スペースバーを押しながら別のキーを押した場合はシフトキーとなる設定を好んで使っています。これが再びできるようになるものです。

~/.config/karabiner/karabiner.json では、

    "simple_modifications": {
        "left_command": "f17",
        "right_command": "f18",
        "spacebar": "left_shift"
    },
    "standalone_keys": {
        "spacebar": "spacebar"
    },

として使用していました。

f17, f18 をhetimaさんの [Karabiner-Elements と Hammerspoon を持って Sierra に行こう - d.hetima](http://hetima.hatenablog.jp/entry/2017/05/23/221721) で英数にしたりしていました。
(以前は [⌘英かな](https://ei-kana.appspot.com/) を使用していました。)

wwwjfyさん、長らくありがとうございました。
【Swift】ジェネリクス（関数、クラス）

# 実行環境
- Swift4
- Xcode9.2

# ジェネリクスとは
プロパティやメソッドで使用される型が実際に使う段階で決定される機能のこと。
これによりIntやStringなどの型に左右されずに、柔軟に動作する関数やクラスを定義することができる。

# ジェネリック関数
## 定義
```swift
func 関数名<T>(引数名: 型) -> 戻り値の型 {
  // 処理
}
```

- 関数名の後に型パラメータ\<T>を指定する
- ジェネリクスの型は\<T>でなくても構わないが、一般的には\<T>が使われる

## 基本的な使い方
### 通常の関数の場合
```swift
// Int型の引数を受け取り、そのまま引数の値をタプルで返す関数
func test(param1: Int, param2: Int) -> (Int, Int) {
    return (param1, param2)
}
let result = test(param1: 1, param2:2)
print(result.0) // 結果: 1
print(result.1) // 結果: 2
```
上記だと、Int型以外の引数を渡すとコンパイルエラーとなる

```swift:ex.Double型の値を引数に指定
let result = test(param1: 1.0, param2:2.0) // コンパイルエラー
```
なので、Double型に対応するには、Double型の引数を受け取る関数を作る必要がある。

```swift
// Double型の引数を受け取り、そのまま引数の値をタプルで返す関数
func test(param1: Double, param2: Double) -> (Double, Double) {
    return (param1, param2)
}
let result = test(param1: 1.0, param2: 2.0)
print(result.0) // 結果: 1.0
print(result.1) // 結果: 2.0
```

同様に、String型に対応するにはString型の、Boolean型に対応するにはBoolean型の関数を作る必要があり、型ごとに作業が発生し、手間がかかる。

```swift
// String型の引数を受け取り、そのまま引数の値をタプルで返す関数
func test(param1: String, param2: String) -> (String, String) {
  return (param1, param2)
}

// Boolean型の引数を受け取り、そのまま引数の値をタプルで返す関数
func test(param1: Bool, param2: Bool) -> (Bool, Bool) {
  return (param1, param2)
}
```

### ジェネリック関数の場合
```swift:
func testGenerics<T> (param1: T, param2: T) -> (T, T) {
    return (param1, param2)
}
```
ジェネリック関数は引数や返り値から型を推論するため、型ごとに同じような関数を作る必要がなく、一度の定義でどの型にも対応することができる。

```swift
// Int型
let resultInt = testGenerics(param1: 1, param2: 2)

// Double型
let resultDouble = testGenerics(param1: 1.0, param2: 2.0)

// String型
let resultString = testGenerics(param1: "1", param2: "2")

// Boolean型
let resultBool = testGenerics(param1: true, param2: false)
```

# ジェネリッククラス
## 定義
```swift
class クラス名<T> {
  // 処理
}
```
- クラス名の後に型パラメータ\<T>を指定する
- ジェネリクスの型は\<T>でなくても構わないが、一般的には\<T>が使われる

## 基本的な使い方
```swift
class Test<T> {
    var data: T
    
    init(data: T) {
        self.data = data
    }
}

// Int型
let resultInt = Test(data: 10)
// 型の確認
print(type(of: resultInt.data)) // 結果: Int
// 値の確認
print(resultInt.data) // 結果: 10

// Double型
let resultDouble = Test(data: 1.0)
// 型の確認
print(type(of: resultDouble.data)) // 結果: Double
// 値の確認
print(resultDouble.data) // 結果: 1.0

// String型
let resultString = Test(data: "Hello")
// 型の確認
print(type(of: resultString.data)) // 結果: String
// 値の確認
print(resultString.data) // 結果: Hello

// Boolean型
let resultBoolean = Test(data: true)
// 型の確認
print(type(of: resultBoolean.data)) // 結果: Boolean
// 値の確認
print(resultBoolean.data) // 結果: true
```
VScode拡張機能：package.json内のcategoriesに"Languages"は指定出来なくなった

## はじめに

~~ググったのですが、MSのドキュメントやアナウンス等から詳細を見つけられず、~~
~~VSCode最新版（1.21.1）でのpackage.json編集時にも候補として出ないため~~
~~備忘録として残します。~~

2018年4月9日追記：

MSのドキュメントが更新されていました。
https://code.visualstudio.com/docs/extensionAPI/extension-manifest

categories:
"Languages" → **"Programming Languages"**

という変更が入っています。

＊VScode 1.22.1 では package.json 編集時に警告文が出ますが、publish には影響ありません。

以下の過去の内容は、categoriesにLanguagesを指定している場合に publish 出来ない時の対応方法となります。

## MSマーケットプレイスにアップロードできない

[Language support for NI KONTAKT(TM) Script Processor (KSP)] (https://marketplace.visualstudio.com/items?itemName=rkoubou.ksp) というプログラミング言語拡張機能を公開しています

このあたり https://github.com/Microsoft/vscode/issues/43701 が
関連していそうですが、package.jsonには

~~~
中略)

    "categories": [
        "Languages",
        "Snippets",
        "Linters"
    ],
~~~

という風に 従来どおり **"Languages"** を指定していました。
が、本日2018/04/01(JST)にアップデートを実施しようと思ったのですが
以下のエラーに悩まされました。

![スクリーンショット](https://qiita-image-store.s3.amazonaws.com/0/48743/06139c61-f34a-f038-f480-daf3246c4216.png)

他のプログラミング言語拡張のCategoriesを見たら

![2.png](https://qiita-image-store.s3.amazonaws.com/0/48743/ec851411-277e-a3d9-fcaa-0785bbc11fc1.png)

という風に１〜２日前にアップデートしている拡張機能が多く、自分のCategoriesとの違いを見ていたら **Programming Languages** に変更が入った（？）ようです。

## 対応

以下のように修正した所、マーケットプレイスにアップロード・アップデートが出来ました。

**Languages → Programming Languages**

~~~
    "categories": [
        "Programming Languages",
        "Snippets",
        "Linters"
    ],
~~~

## vsix ファイルを作成し手動でインストールはできる

~~~
vsce package
~~~
でインストーラーを作成し、手動でインストールする分には支障はありませんでした。
【Flutter】任意のWidgetにクリックイベントをつける

Flutterアプリで任意のWidgetにクリックイベントをつけるやり方メモです。

## 結論

`GestureDetector` widgetを使う。

## サンプルコード

```dart
GestureDetector(
  onTap: () {
    print("onTap called.");
  },
  child: Text("foo"),
),
```

## 環境
- Flutter 0.1.5
- Dart 2.0.0-dev.28.0

## Link
user interface - Flutter - Container onPressed? - Stack Overflow
https://stackoverflow.com/questions/43692923/flutter-container-onpressed
リスコフの置換原則(LSP: Liskov Substitution Principle)

## そもそもリスコフとは？
- バーバラ・リスコフ氏のことで提唱者の名前である

## リスコフの置換原則(LSP: Liskov Substitution Principle)
- 派生型はその基本型と置換可能でなければならない
 - うーん、なんか難しい・・・
     - クラスAのインスタンスがクラスBのインスタンスに依存
     - クラスBのインスタンスの代わりにクラスB2を作成
     - このとき、クラスAに対してクラスB2を渡してもクラスAは正常に動作しなければならない
         - 正常に動作しない場合はリスコフの置換原則に違反している 
- リスコフの置換原則を守ることは、OCPを守るために必要なことでもある

## 経験則と約束事
- 基本クラスから何らかの機能を省いてしまっているような派生クラスはLSPに違反する
 - 基本クラス以下のことしかできない派生クラスは、その基本クラスの代わりにはならないからである 

## まとめ
- リスコフの置換原則はOCPを有効にする主要な役割の一つである
- この原則はあるモジュールに修正を施すことなく拡張する方法を派生型と基本型の置換性という形で表現している
アイコン追加

bootstrapのアイコンでは良いのがない場合があるので、Font Awesomeを使う。

[Font Awesome](https://fontawesome.com/icons?d=gallery)

### ダウンロードする
Download font Awesome Free ボタンでダウンロードする。

[ダウンロード画面](https://fontawesome.com/get-started)


### jsをフォルダにコピーする
fontawesome-all.min.jsを所定のフォルダにコピーして使えるようにする。

### 使用する
`<i class="fas file"></i>` のように記述するだけで使える。
Freeでどんなアイコンがあるかは、下記の画面でfreeのみ検索すればわかる。

[アイコン検索画面](https://fontawesome.com/icons?d=gallery)
１台のEC2でもELBを使ってALBでハマったこと

どうも、僕です。

classmethodさんが書いている記事を参考にEC2のシングル構成のサーバを参考にサーバ構築をして502エラーにハマったのでメモを書いておきます[†1]。

# ハマった内容
ブラウザからドメイン経由(Route53)で自作サーバにアクセスしたときに
「502 BAD Gateway」がでる不具合に直面しました。

### 原因
ALBのヘルスチェックのパスの設定の問題でした[†2]。
ヘルスチェックでエラーにならないページを準備するまたは200番を返却Webアプリケーションを作成することで502エラーを返却しなくなります。

### 対策
対策を以下に記載しておきます。

1. ヘルスチェックのパスに合わせてWebアプリケーションを作成すること<br>
初期値はルートディレクトリを指定されているのでtomcatにルート用のwebアプリケーションがなければROOTフォルダと「index.html」を作成する
<br><br>
2. ヘルスチェックのフォルダを変更すること<br>
初期値はルートディレクトを設定しているので作成したそのWebアプリケーションのパスを設定する。

# サーバ構成とEC2内の構成(エラーが発生している状況)
## AWS シングル構成
![サーバ構成.png](https://qiita-image-store.s3.amazonaws.com/0/56169/26c6fcd5-4ada-475b-b2e4-23e0b6feb8a4.png)

## ec2内のアプリケーション
![サーバ構成_EC2内部.png](https://qiita-image-store.s3.amazonaws.com/0/56169/3e2b9f81-8e53-18d8-24b0-d48deb9c4a19.png)

## 「502 bad gateway」エラー
![502_BAT_GATEWAY.png](https://qiita-image-store.s3.amazonaws.com/0/56169/4c5a2c86-3148-ca2c-b684-b0c4f04de5cf.png)

## TOMCATの設定
ROOTアプリケーションを作っていない状態です。

・WEBAPPSの中身
　- APPLICATION1
　- APPLICATION2

## ALBのヘルスチェック
初期設定：ROOTに対してヘルスチェックする設定となっています。
設定値：「/」

■ ALBのヘルスチェックの設定値
![ヘルスチェックの設定値.png](https://qiita-image-store.s3.amazonaws.com/0/56169/9f7e7533-b97c-d179-9c5b-0d11ed4d54de.png)

# おわりに
この問題を解決するためにALBのログを確認したりしましたが変な値を返却するといったことはありませんでしたので原因を把握するまでに時間がかかってしまいました。

# 参考
†1：１台のEC2でもELBを使うメリットについてまとめてみました，豊崎隆
https://dev.classmethod.jp/cloud/aws/benefit_elb_with_one_ec2/
†2：ELBとEC2のホームページ運用で502エラー 
https://forums.aws.amazon.com/thread.jspa?threadID=247138
Parityで Error: Invalid params: invalid type: null, expected a string. が出る場合

Parityを利用していて以下のようなエラーが出る場合があります。

```bash
Error: Invalid params: invalid type: null, expected a string.
```

web3から以下のコマンドを叩いた時に再現しました。

```bash
web3.personal.unlockAccount("0x7ad8f90cfa071c8420e3f09fe0e413d0c47502e6")
```

ちょっとエラーメッセージがわかりづらいのですが、単純にパラメータを指定していない場合にも発生するので、その場合は指定すれば解決です。

```bash
web3.personal.unlockAccount("0x7ad8f90cfa071c8420e3f09fe0e413d0c47502e6", 'YOURPASSWORDHERE')
```
pythonの処理速度とメモリ消費(補足)

だいぶ前の記事でpythonでcsvの読み込み→再書き出しの処理について言及した際、csvモジュールでの実行時間が22時間という驚異的な時間をたたき出してしまった件。


最近になって何も調査してないことを思い出したので、ちょっと自分のソースを見直してみた。



5分で原因が判明。
結論から言えば間違っていたのは私のコードの書き方であり、モジュール自体には何も悪いところはなかった。


```python:csv_module_2.py
@profile
def main():
  with open('data/sample.csv', mode='r') as f:
    with open('data/csv_module_output_2.csv', mode='w') as output:
      reader = csv.reader(f)
      writer = csv.writer(output)
      for row in tqdm(reader):
        writer.writerow(row)

if __name__ == '__main__':
  start = datetime.now()
  main()
  print ("elapsed_time:{0}".format(datetime.now() - start))

'''
elapsed_time:0:29:05.530542
Filename: csv_module_2.py

Line #    Mem usage    Increment   Line Contents
================================================
     5   13.703 MiB   13.703 MiB   @profile
     6                             def main():
     7   13.703 MiB    0.000 MiB     with open('data/sample.csv', mode='r') as f:
     8   13.703 MiB    0.000 MiB       with open('data/csv_module_output_2.csv', mode='w') as output:
     9   13.703 MiB    0.000 MiB         reader = csv.reader(f)
    10   13.703 MiB    0.000 MiB         writer = csv.writer(output)
    11   13.895 MiB    0.180 MiB         for row in tqdm(reader):
    12   13.895 MiB    0.012 MiB           writer.writerow(row)

'''
```


22時間？何の話だ。1000万行程度のcsvなら30分もあればお釣りがくる。


これが結論。


ファイルの読み出しにはモジュール使ってんのに、なぜか書き出し部分が生python。丁寧に読みだした行を分割してチマチマ出力。
そら時間かかりますよね。


で、せっかくなのでPandasのchunksizeもパターンを変えて実験しました。

結論から言うと、1000万行に対してchunksize=30000辺りが一番速く処理が終わった。

10万行だとかえってやや遅くなった。


pandasを使った処理の限界の時間というのもあろうけど、メモリに乗っかるのであれば最大行数に近いほど処理速度は上がると思っていたので少々予想外。(chunksize=10000000で最速だと思ってました)



うーんよくわからない。


とりあえず、前回の件については以上が結論です。


### ちょっと関係ないけど

pythonの処理速度向上のためにCythonやNumbaという手段があるそうなので、用途について調べてみようと思います。
kaggleのKernelを適当に選んで読んでみる

# この文章について

kaggleに挑戦しようと思い、ちょっとkernelを読んでみて見方を書いてみました。

## Competitionを選ぶ

[日本語の解説](https://qiita.com/masleisii/items/9bcf86a8fcc2cd321221
)があったので[こちら](https://www.kaggle.com/c/talkingdata-adtracking-fraud-detection)を選択
理由は画像解析や集計対象のモデルが理解しやすいそうだったので…

## Kernelを適当に選ぶ

kaggle界隈で人気のxgboostを利用したkernelがたまたま上の方に来ていたのでこちらを選択
https://www.kaggle.com/aharless/swetha-s-xgboost-revised

中身を見てみるとタイトルの下に下記の文言がありました。

forked from [XGBoost: Approx tree method](https://www.kaggle.com/swethaboga/xgboost-approx-tree-method?scriptVersionId=2825071) by [Swetha Boga](https://www.kaggle.com/swethaboga) [(+47/–23)](https://www.kaggle.com/aharless/swetha-s-xgboost-revised/versions#base=2825071&new=2895211)

fork先の記事とその作者、fork先のコードとの差分へのリンクが表示されています。
他人のコードをフォークすることができるようです。

## 次回

コードも言ってることもよくわからなかったので
次回は下記の方法でkernelを動かして試すところまでやってみようと思います。
https://qiita.com/jagainu/items/2a1e3779f944588d29de
iOSアプリに利用したいMMD PMX まとめ

# 【iOS MMD player アプリ開発中】
MikuMikuDanceの3Dモデルに魅了されてから５年、未だにモデルデータの理解が出来ず奮闘中。
# アプリ開発中 [goMMD - github](https://github.com/rockyappdev/goMMD)
1. iPhone X screen capture no sound
   - [![iPhone X App screen](http://img.youtube.com/vi/fhYw3nqT2wk/0.jpg)](http://www.youtube.com/watch?v=fhYw3nqT2wk)


2. 機種
   - iPhone, iPad
3. 使用ツール
   - MMDAgent
   - bulletphysics
4. 出来る事
   - File type パスワード無しのzipファイル
   - PMDモデルデータのロード
   - VMDモーションデータのロード
   - シナリオデータの作成及び編集
     - iTuneミュージックのセレクト
     - 複数のモデルの設定
     - モデルごとのモーションの設定
   - 画面でのタッチコントロール
5. 追加したい物
   - PMXモデルデータのロード
   - シェーダーでのエフェクト
   - ARKit連携
   - 複眼サポート

# Xcode10に成っての不具合
- Build Settings
  - Build Options (何故か *.txt *.luaもコンパイルしてしまう)
      - Exclude Source Fie Names
        - Add(+) *.txt *.lua

# 参考になりそうな記事
- [C++でMMDを読み込むライブラリを作った Saba](https://qiita.com/benikabocha/items/ae9d48e314f51746f453)
- [MMDモデルを使用したデスクトップユーティリティの開発 その1 PMD読み込みクラスの作成](https://qiita.com/JI1LDG/items/6a50e2eb7751f02ffe50)
- [assimp 3.2 を試す](http://blog.livedoor.jp/tek_nishi/archives/9271123.html)
- [libcinder](https://libcinder.org)
- [assimp](https://github.com/assimp/assimp)
- [CocoaPods] (https://qiita.com/ShinokiRyosei/items/3090290cb72434852460)
- [eugenebokhan / AssetImportKit] (https://github.com/eugenebokhan/AssetImportKit)
  - PMX is not supported
僕がプログラミング未経験者に教えるときに苦心していること

プログラミング未経験者に対して教えていると
どこで詰まっているのか歳を経る毎に理解できなくなってきている気がしたので
自戒の意味を含めてこの際まとめておきます。
（少数精鋭で開発していたり、能力値が高い人ほど、この現象に陥りやすい気がした・・・）

# 何で詰まっているのか
大体下の３分類な気がしてます。

## 原因①：そもそも動作原理を把握していない
システムやアプリケーションが動いている根本的な仕組みを理解していない

### 対策：

- 動作原理を図解化（可視化）してあげる
- テストできる環境を構築して自分で動かせるようにする
- 公式のライブラリドキュメントを読ませる

## 原因②：仮説と検証ができず必要なコードを書くことができない
原因は色々あるが、主に効率的に解消する方法を知らないのと、経験値不足と開発環境的な面も影響する。
プログラミング言語の文法習熟度不足、ライブラリ知識や実経験の不足、試行回数の不足による実装力の不足など。

### 対策：

- テスト環境でテストコードを書かせる（失敗しても問題ない試行できる環境の導入）
- コードレビューをする（GitHubにpull requestを上げるなど）
- 試行回数を増やす（検索効率を上げる、エイリアス・スニペットを作る）
- レベルに合ったタスクを任せる（タスクの粒度を細かく切る）

## 原因③：エラー時に何をすればいいかわかっていない
エラーになる原因は色々ありますが・・・
そもそも検索方法や原因を特定する方法がわかっていない場合が多いです。
あるいはシステムのインフラ起因の場合はインフラ周りの知識不足など

### 対策：

- 開発環境をチーム内で揃える（OS、ライブラリのバージョン、エディタ、 ...etc）
- エラーログ・エラーメッセージで調べさせる（Google検索、プロジェクト内検索、ライブラリの実装を見る）
- デバッグ手法を教えてあげる（デバッグツールの導入など）
- システム構成図を書く
- フローチャート（ユースケース図）を書く
- CIを導入する
- 本番環境と同じステージング環境を用意する

## その他
エンジニアはコーディングだけでなく、システムに関わるあらゆる雑務に関しての知識も必要です。（ということを新人に教える必要があります）

- システム設計論（DDD、Clean Architecture、マイクロサービス、デザインパターン、 ...etc）
- サーバの運用に必要な知識(パフォーマンス・冗長化、アクセス権、インフラ知識)
- プラットフォーム別の管理知識（設定ファイル、管理画面の設定、DevOps）
- 利用規約・プライバシーポリシー・特定商取引法に関する知識
- セキュリティ系の知識と対策（ユーザ管理、XSS、多重クリック防止、CORS、　...etc）
- 書類周り（契約書など）
リストモナドについて

# TL;DR;

リストモナドは、**非決定的な値** と **非決定性計算** からさらにより多くの非決定的な値を生成する非決定性計算です

# 非決定性計算と非決定的な値とは

関数型プログラミングでは、
**０個を含む複数の値を返す関数** のことを、 **非決定性計算** と呼びます。
また０個を含む複数の値、そのものを一つの値と見なしたものを **非決定的な値** と呼びます。

# Haskellのリストについて

## 非決定的な値である

Haskellのリストは複数の値を保持する事ができるので、非決定的な値としてリストが用いられています。

## モナドのインスタンスである

またリストは以下のようにモナドのインスタンスとして定義されています。

```hs:リストモナド
instance Monad [] where
	return x [x]
	xs >>= f = concat (map f xs) -- xs:: [a], f:: a->[b]
```

上記から、リストモナドの **>>=** 関数は、以下のことが言えます。
(※ [>>= は　bind と呼びます](https://en.wikibooks.org/wiki/Haskell/Understanding_monads#Definition))

* 中置関数である
* ２つの引数を受け取り、それぞれの引数の型は以下である
	* 第１引数: `xs:: [a]`
	* 第２引数: `f:: a -> [b]`
* `map f xs` の出力値は、**二重リスト `[[b]]`** である
* `>>=関数`は、`map f xs` の出力結果をconcat関数で一つのリストに結合した結果を返す

## つまりリストモナドとは

**非決定的な値(`xs:: [a]`)** と **非決定性計算(`f:: a->[b]`)** を引数にとり、さらにより沢山の候補値を含んだ非決定的な値を返す関数(非決定性計算)であると言えます。

## リストモナドを使った簡単な問題

### 入力された数字の正数と負数を求める

```haskell:リストモナドのサンプル
ghci> [3,4,5] >>= \x -> [x, -x]
[3,-3,4,-4,5,-5]
```

非決定的な値(`[3,4,5]`)と非決定計算(`\x->[x,-x]`)から、さらにより多くの値が生成されている。

### 

# 騎士の旅をリストモナドを使って解く
## 騎士の旅

チェス盤の上にナイトのコマが一つだけ乗っており、ナイトを３回動かして特定のマスまで移動させることが出来るか？

**ヒント**
ナイトの次の位置は複数の候補が存在し、その関数は非決定性計算になる。

## リストモナドを使った解答例

```haskell:リストモナドを使って騎士の旅を解く

-- ナイトの現在位置を表す型
type KnightPos = (Int, Int)

-- 騎士の次の位置の候補を返す関数 (非決定計算である)
moveKnight :: KnightPost -> [KnightPos]
moveKnight (c, r) = do
	(c', r') <- [(c+2, r-1), (c+2, r+1), (c-2, r-1), (c-2, r+1), (c+1, r-2), (c-1,r-2), (c-1, r+2)]
	guard (c' `elem` [1..8] && r' `elem` [1..8])
	return (c', r')
	
-- ３手先の候補を導出する関数
in3 :: KnightPos -> [KnightPos]
in3 start = do
	first <- moveKnight start
	second <- moveKnight first
	moveKnight second
	
{- 以下do記法を使わず書いた場合
in3 start = return start >>= moveKnight >>= moveKnight >>= moveKnight
-}


-- ３手先にその候補が含まれているかどうか求める関数
canReachIn3 :: KnightPos -> KnightPos -> Bool
canReachIn3 start end = end `elem` in3 start
```

動作結果

```console:ghci
ghci> (6, 2) `canReachIn3` (6, 1)
True
ghci> (6, 2) `canReachIn3` (7, 3)
False
```

# 参考サイト
http://learnyouahaskell.com/a-fistful-of-monads
> A knight's quest

# 書籍
[上記参考サイト](http://learnyouahaskell.com/a-fistful-of-monads)の日本語訳が以下の書籍で紹介されています。

[すごいHaskellたのしく学ぼう! 単行本（ソフトカバー） – 2012/5/23](https://www.amazon.co.jp/%E3%81%99%E3%81%94%E3%81%84Haskell%E3%81%9F%E3%81%AE%E3%81%97%E3%81%8F%E5%AD%A6%E3%81%BC%E3%81%86-Miran-Lipova%C4%8Da/dp/4274068854)
> p306 騎士の旅
社内IPからのアクセスだけに制限する

CentOS7でのケース。
firewalldを使ってやってく。

[サーバーセットアップ（CentOS7 + Node.js + Mysql + Nginx）](https://qiita.com/mazeltov7/items/92d4a742ad1d39af36c8)の続き的な感じでメモ書き。

hogepiyoというnew-zoneを作ってそこに設定を書いていく。
コマンドで書いた設定は、 `/etc/firewalld/zones/hogepiyo`に記載される。


```bash
$ firewall-cmd --permanent --new-zone=hogepiyo
$ firewall-cmd --reload

$ firewall-cmd --permanent --zone=hogepiyo --set-target=ACCEPT

# 許可するIPアドレスを記載
$ firewall-cmd --permanent --zone=hogepiyo --add-source=123.456.7.89
$ firewall-cmd --permanent --zone=hogepiyo --add-source=111.111.1.11

# 許可するサービスを記載
$ firewall-cmd --permanent --zone=hogepiyo --add-service=ssh
$ firewall-cmd --permanent --zone=hogepiyo --add-service=http
$ firewall-cmd --permanent --zone=hogepiyo --add-service=https
$ firewall-cmd --permanent --zone=hogepiyo --add-service=smtp
$ firewall-cmd --permanent --zone=hogepiyo --add-service=smtps

# publicに設定してたのを消す（参考）
$ firewall-cmd --permanent --zone=public --remove-service=http
$ firewall-cmd --permanent --zone=public --remove-port=80

$ firewall-cmd --reload

$ firewall-cmd --list-all
$ firewall-cmd --list-all --zone=hogepiyo
$ firewall-cmd --get-active-zones

```




## 参考
- https://centosinstall.com/centos/centos7/firewalld
- https://everyday-growth.com/?p=1952
- https://qiita.com/tomoki1207/items/44c7d19f984ae6a8df09
- https://maltblade.wordpress.com/2014/12/22/firewalld%E3%81%A7ip%E5%88%B6%E9%99%90%E3%82%92%E3%81%99%E3%82%8B/
- https://kaede.jp/2018/02/11022556.html
Vue.jsの開発環境

最近、Vue.jsを使ってクライアント開発をしています。
忘備用に、開発環境のメモを残しておきます。

# 公式サイト
- [Vue.js](https://jp.vuejs.org/index.html)

# 開発ツール
- [Atom](https://atom.io/)　開発環境。フリーです。プラグインが豊富です。
    - [AtomのVue.js関係プラグインまとめ](https://qiita.com/mrmr/items/f6927eb2fe5aa13a2f90)
- [Visual Studio Code](https://code.visualstudio.com/)　開発環境。Microsoft社製ですがフリーです。Atomより軽量に感じます。コンソール・日本語対応等もよい。当初こちらを使っていたのですが、私の会社の環境ではなぜかプラグインフォルダが消えてしまう不具合があってAtomに乗り換えました。個人的にはとても気に入っています。
    - [Visual Studio Code で Vue の開発環境を整える](http://idkqh7.hatenablog.com/entry/2017/02/12/182921)
- [Vue.js DevTools](https://github.com/vuejs/vue-devtools) Chrome、Firefox用のプラグイン。Vueで管理するdataやコンポーネントの構成、イベントを見ることができるので便利です。
    - [Vue Devtools4.0 の新機能](https://jp.vuejs.org/2018/01/16/whats-new-in-vue-devtools-4-0/)
- Vue-cli　Vueのプロジェクトテンプレートを用意してくれるツール。ただ私が使ったときは入るコンポーネントが古かったため、後でバージョンを手動で変更しました。

# コンポーネント
- [Vuex](https://vuex.vuejs.org/ja/intro.html)　状態管理用ライブラリ。Vue純正。１画面に複数コンポーネントを配置するときに、コンポーネント間で共通のデータを配置するとともに、ここでサーバとの通信を行います。
- [ElementUI](http://element.eleme.io/#/en-US)　Vue用のGUIコンポーネント集。Bootstrapよりリッチです。コンポーネントはきれいだし、Validationも高機能。ただ、カスタマイズするにはそれなりの知識と調査がいります。公式サイトのサンプルをよく読みましょう。
    - [ElementのValidationの使い方はasync-validatorを参照する](https://qiita.com/frost_star/items/f5a61ffed037ae7bd81e) 業務用だとValidation（入力チェック）は必須だと思いますが、このサイトにあるように、公式サイトのドキュメントでは情報が不足しています。AsyncValidatorのサンプルなど、様々なサンプルを読むことが理解のために大切だと思います。
- [BootstrapVue](https://bootstrap-vue.js.org/) Vue用のBootstrap。CSSライブラリとあるように、レイアウトや装飾中心です。
- 他にも、[Veutify](https://vuetifyjs.com/ja/)、 [Quasar](http://quasar-framework.org/)、[Vuestrap](https://yuche.github.io/vue-strap/)などがあるようですが、試していません。

# ノウハウ
- [Vuejs Axiosで共通的な例外をあつかう](http://kimulla.hatenablog.com/entry/2018/01/19/001135)
～ これだけ解けば十分闘える！過去問精選 10 問 ～ の9問目 Daydream をPHPで

はい、[前の記事](https://qiita.com/takepan/items/c9290498db32a922e556)の続きです。

[AtCoder に登録したら次にやること ～ これだけ解けば十分闘える！過去問精選 10 問 ～](https://qiita.com/drken/items/fd4e5e3630d0f5859067) から、[9問目](https://beta.atcoder.jp/contests/abc049/tasks/arc065_a)。


与えられた文字列が、"dream", "dreamer", "erase", "eraser"を任意に組み合わせることで、できるか判定せよ。という問題。

はっきり言ってしまえば、もっと難しい組み合わせだったら、私は正解できないかもしれません。

こちらの問題の場合は、例えばdreamer…という文字列を先頭の方から見ると、

dream/er…
dreamer/…

どちらか分からないので探索することになります。
この手の問題は苦手です……

ただ、後ろから見れば最後の文字が drea **m**、eras **e**、dreame **r**、erase **r** でrが2つありますが、後ろから3文字目で見分けがつきますので、判定は可能です。

そんな訳で、4つの単語と末尾を比較して、一致したらどんどん削っていき、何も文字が残らなかったら `YES` 、何か残っていたら `NO` と出力するプログラムを書きました。

```php5
<?php
$words = ["dream", "dreamer", "erase", "eraser"];

fscanf(STDIN, "%s", $S);

while($S) {
    $flg = false;
    
    foreach ($words as $word) {
        $len = strlen($word);
        $exam = substr($S, -$len);
        if ($exam === $word) {
            $S = substr($S, 0, strlen($S) - $len);
            $flg = true;
            break;
        }
    }
    
    if ($flg === false) break;
}

echo $S === "" ? "YES\n" : "NO\n";
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/90217/89414a72-77de-79bc-cc67-59b96d81c8ed.png)

前からがダメなら、後ろから行けばいいじゃない？ということで。
Show型クラス　〜型クラスで見るPureScript〜

<!-- # Show型クラス -->

※この記事は「[型クラスで見るPureSciript](https://qiita.com/u4da3/items/c1692f7c6e9a53d2d3b5)」の連載記事です。

## ショーの開幕
この記事を読みに来てくださった皆様、ありがとうございます。「[型クラスで見るPureSciript](https://qiita.com/u4da3/items/c1692f7c6e9a53d2d3b5)」第１回Show型クラスの幕開けです。

最初はウォーミングアップ程度の話題ですが、しばしの間、お付き合いください。

## 型クラスとは

まずはじめに型クラスとは何であるかを簡単に説明しましょう。

型クラスというのはPureScriptを特徴付ける機能の１つであり、Javaや.NETにおけるInterfaceのような役割を担う機能です。型クラスの定義は次のように記述します。

```haskell
class Show a where
  show :: a -> String
```

上記の`a`という変数は型変数と呼ばれており、データ型名に置きかわります。このコードは次のように理解します。

「型クラス`Show`には、データ型`a`から`String`への関数`show`が定義されていること。」

これをオブジェクト指向言語のように書き換えると、次のようになります。

```java
interface Show {
  public String show();
}
```

この２つを見比べると、インターフェースの役割を担う機能であることを直感的に理解できると思います。ここでは、型引数`a`はオブジェクト指向言語の`this`に相当するものと思っておけば大丈夫です。

## 型クラスの実装
型クラスは、オブジェクト指向言語のインターフェースに相当することから分かるように、型クラスを定義しただけでは、何の役にも立ちません。型クラスを定義したら、型クラスのインスタンスを実装して初めて、役に立つコードになります。

試しに、先ほどのShow型クラスをBooleanデータ型に実装したコードを見てみましょう。

```haskell
instance showBoolean :: Show Boolean where
  show true = "true"
  show false = "false"
```

型クラスを実装するには、インスタンス名という名前をつけなければなりません。ここでは"showBoolean"というのがインスタンス名になります。インスタンス名は何でも良いのですが、慣例的に「型クラス名＋データ型名」を使うことが多いようです。

インスタンス名に引き続き、ダブルコロン`::`、型クラス名`Show`、型引数`Boolean`を書きます。そして、`where`ブロックに型クラスの関数定義を記述します。

今の例では、型クラスには１つの関数しか定義されていませんでしたが、もちろん、複数の関数が定義されている型クラスもありますし、定数値が定義された型クラスもあります。また、データ型に対して印をつける目的から、定義されているメンバが０個の型クラスもあります。

## 型クラスの継承関係
オブジェクト指向言語のインターフェースと同じように、型クラスにも継承関係を構築することが可能です。型クラスを継承するには次のように書きます。

```haskell
class Eq a <= Ord a where
  compare :: a -> a -> Ordering
```

このように書くことで、型クラス`Ord`は型クラス`Eq`をスーパークラスに持つことになります。すると、データ型`a`に対して型クラス`Ord`を実装するには、先に型クラス`Eq`を実装しておくことが必要になります。

また、型クラスは多重継承をすることも可能なので、次ような書き方もできます。

```haskell
class (Applicative m, Bind m) <= Monad m
```

## Show型クラス
それでは最も基本的な型クラス（？）であるShow型クラスについて見てみましょう。（やっとここまで来ました）

Show型クラスはオブジェクト指向言語で言う所の`Object.toString()`に相当する型クラスです。Show型クラスを実装しなくても実用的なプロフラムを作ることは可能なのですが、PSCIでテストするときなど、Show型クラスを実装しておかないと、値の検証をするのに不便なことが多いです。テストコードのためにもデータ型を定義したらShow型クラスだけは実装しておくことをオススメします。

まずはShow型クラスを実装するためのデータ型を作りましょう。

```haskell
data Person = Person String String
```

ここで左側の`Person`がデータ型名です。右側の`Person`は値構築子（値コンストラクタ）と呼ばれています。値構築子`Person`は２つのString型引数を取ります。（若干正確な表現ではないですが、初めはこういう理解で十分でしょう。）

データ型`Person`はfirstNameとfamilyNameの２つの値を保持するデータ型です。そこで、データ型`Person`にShow型クラスを実装してみましょう。

```haskell
instance showPerson :: Show Person where
  show (Person a b) = a <> " " <> b
```

これをPSCIで実行して見ると次のようになります。

```haskell
> him = Person "John" "Smith"
> show him
"John Smith"
```

ちなみに、PSCIでは実行した式に対してshow関数を適用して得られる文字列を表示するので、単に`him`と書いても値を表示できます。（形式の若干の違いはありますが）

```haskell
> him
John Smith
```

## 今夜のショーはここで閉幕

さて、今回は簡単に型クラスの紹介をしました。次回からは、PureScriptの代数的側面にフォーカスを当てて書いていこうと思います。それでは、また[次回](https://qiita.com/u4da3/items/083a61459dd3f95e4138)。

## 演習問題
電話番号を表すデータ型を次のように定義します。

```haskell
data Phone = Phone Int Int Int
```

このデータ型`Phone`に対して、Show型クラスを実装してください。

## 参考文献
Show型クラスについては下記のページを参考にしました。

- https://pursuit.purescript.org/packages/purescript-prelude/3.1.0/docs/Data.Show
- https://github.com/purescript/purescript-prelude/blob/v3.1.0/src/Data/Show.purs
なぜfor文は禁止なのか？関数型記述のススメ

# なぜfor文は禁止なのか。
結論からいうと、可読性のためです。
for文は何かを「繰り返し処理をする」ことに使いますが、実際に求められるのは、「全ての要素に処理をする」とか、「母集団から選択して処理をする」こともおおくあります。

また、for文を用いることは、関数名にfuncという名前をつけるのと似ています。こんな関数名あっても、何をしてくれる関数かわからないだろう。と。
for文も同じで、繰り返すやるのはわかるが、何故繰り返すのか、どの要素に対して何をやるのかわからないだろう、だから禁止だ。ということです。異論は認めます。

これ以上の言語化が難しいので、サンプルコードを例示します。

# サンプルコード
サンプルの命題は、

```
0から100未満の偶数のみを累計する。
```
とします。

## 禁止

```JavaScript
var totalOfEvenNumberUnder100 = 0;
for (var i = 0; i < 100; i++) {
    if (i % 2 === 0) {
        totalOfEvenNumberUnder100 += i;
    }
}
```
命題に、「繰り返す」という文字がないのに、forで繰り返しています。手続き型に慣れたプログラマは、もう違和感を感じなくなってしまっているかもしれませんが、なぜ繰り返すのでしょうか。0から100未満の数字がほしいだけなのに。
また、最初に0で変数を初期化するのも命題にはありません。
さらには、偶数のみを取り出す処理と足す処理が交互に行われることになっています。偶数のみを累計する、という命題とは違う処理になってしまっています。

もちろん答えは一緒ですが、命題とは別の処理になってしまっているともいえます。

## 推奨
できるだけ処理に名前をつけていきます。
命題を「0から100未満」と、「偶数のみ」という処理と、「累計する」という処理に分解して名前をつけます。

```JavaScript
const from0To100Array = Array.from(Array(100).keys());
const isEvenNumber = i => i % 2 === 0;
const addAll = (total, i) => total + i;
const totalOfEvenNumberUnder100 = from0To100Array.filter(isEvenNumber).reduce(addAll);
```
「0から100未満」がfrom0To100Array
「偶数のみ」がisEvenNumber
「累計する」がaddAllです。
最後に「0から100未満」から「偶数のみ」を取り出して「累計する」をしています。
この方が命題に即しているのではないでしょうか？

今回は、関数型に有利な命題を選択したような気もするのですが、実際にプログラムに求められる処理には、このような形式の命題も多くあります。

for文のような手続き型だけでなく、関数型でも処理を記述できるエンジニアになってみるのも良いと思います。
（あれ？for文禁止から随分トーンダウンしたじゃないか、というご指摘ですか？ですよね。。。実際for文を書いたほうが、短くプログラミングできることもありますからね。。。。失敬）

現場からは以上です。
Ruby 繰り返し処理いろいろ

Rubyでよく使う繰り返し処理を書いていきます。
また、転職の際のコーディングテストでもよく出題されるので、一個でも覚えておくと良いかと。。。。
こういうの使いこなせるとカッコええと思うのでまとめておきます。

#メソッド系
繰り返す系メソッドまとめます。
##each
みんな大好きeachメソッド。なんだかんだで一番使う頻度が多い。

公式：
格納データ.each do |個別データ|
繰り返し処理
end

```example_controller.rb
lists = [a,b,c,d]
lists. each do |list|
 puts list
end
#結果
a
b
c
d
```
格納データは複数形、個別データは単数形の方が読みやすいです。

##loop
どのタイミングで使うのか、未だに把握できていないloop。
やろうと思えば、めちゃめちゃサーバーに負荷をかけられますw。

公式：
loop do
繰り返し処理
end

```example_cotroller.rb
loop do
 puts "アイウエオ"
end
#結果
アイウエオアイウエオアイウエオアイウエオアイウエオアイウエオアイウエオアイウエオアイウエオアイウエオアイウエオアイウエオアイウエオアイウエオアイウエオアイウエオアイウエオアイウエオアイウエオアイウエオアイウエオアイウエオアイウエオアイウエオアイウエオアイウエオアイウエオアイウエオアイウエオ.........
```

もちろんこれに関しては、止める方法もあります。

###loopメソッド時に使える命令 break
これを打てばloopメソッドを止めることができます。
条件式を指定し、その式を満たした時、ループを止めることができます。

```example_controller.rb
i = 0
loop do
 i += 1
 puts "アイウエオ"
 if i == 5
  break
 end
end
#結果
アイウエオ
アイウエオ
アイウエオ
アイウエオ
アイウエオ
  
```

###補足　next
次の処理を飛ばすことができます。

```example_controller.rb
i = 0
lists = [a,b,c,d]
lists.[i]
i += 1
 if i == 1
  next
 end

#結果
a
b
d
```

上の例では、iが１になったタイミングで次の2を飛ばしています。
よってcが飛ばされ、dが出てきます。


 
  
##times
繰り返し処理の回数を規定したい時に使います。
公式：
回数.times do
繰り返し処理
end

```example_controller.rb
5.times do
 puts "アイウエオ"
end

#結果
アイウエオアイウエオアイウエオアイウエオアイウエオ
```

#構文系
次は構文で繰り返す処理を書きます。
##while
条件式が真である限り、処理を繰り返します。
公式：
while 条件式 do
繰り返し処理
end

```example_controller.rb
 i = 0
 while i<7
  puts i
  i += 1
 end
#結果
0
１
２
３
４
５
６
```
単純な計算式を作りたい時に利用できます。

##until
これはwhileとは逆で、条件式が偽である限り、処理を繰り返します。
公式：
until　 条件式 do
繰り返し処理
end

```example_controller.rb
i = 0
until i == 5 do
 puts i
 i += 1
end
#結果
0
1
2
3
4

```

 

##for
eachの構文版のような形で、データに格納されているものを一つずつ取り出し、
処理を行います。
公式：
for 個別データ　in 格納データ
繰り返し処理
end

```example_controller.rb
lists = [a,b,c,d]
for list in lists
 puts "list"
end
#結果
a
b
c
d

```

処理は結構ありますが、その場その場で使いこなせるようになりたいです。
他にもあったら教えてほしいいです！