OmniAICreator/Qiita-1.07M huggingface dataset:
Unity ミニマムなGPU Instancing

## GPU Instancing条件

同一メッシュ&&同一マテリアル&&非skinned meshRenderer

## ミニマムコード
```
            #pragma multi_compile_instancing
            #include "UnityCG.cginc"
            #include "UnityInstancing.cginc"

            UNITY_INSTANCING_BUFFER_START(Props)
            UNITY_DEFINE_INSTANCED_PROP(float4, _Color)
            UNITY_INSTANCING_BUFFER_END(Props)
            struct appdata
            {
                float4 vertex : POSITION;
                UNITY_VERTEX_INPUT_INSTANCE_ID
            };

            struct v2f
            {
                float4 vertex : POSITION;
                UNITY_VERTEX_INPUT_INSTANCE_ID
            };

            v2f vert(appdata v)
            {
                v2f o;

                UNITY_SETUP_INSTANCE_ID(v);
                UNITY_TRANSFER_INSTANCE_ID(v, o);// フラグメントシェーダーのインスタンス化したプロパティーにアクセスしたい場合にのみ必要

                 o.vertex = UnityObjectToClipPos(v.vertex);
                return o;
            }

            fixed4 frag(v2f i) : SV_Target
            {
                UNITY_SETUP_INSTANCE_ID(i); // フラグメントシェーダーのインスタンス化したプロパティーがアクセスされる場合にのみ必要
                 return UNITY_ACCESS_INSTANCED_PROP(Props, _Color);
            }


```

**何となくの記憶で**各記述の意味を説明すると、

`UNITY_VERTEX_INPUT_INSTANCE_ID`は実質`uint instnaceID:SV_InstanceID`なので、直接`instanceID`を扱いたい場合は書き換えて問題なさそう。

`UNITY_SETUP_INSTANCE_ID(v);`はモデル行列の配列から`instanceID`に対応するモデル行列を`unity_ObjectToWorld`に代入している。なので`UnityObjectToClipPos()`とかモデル行列が関与する処理よりも前にこのマクロが来ないと意図していない挙動になるはず。

`UNITY_TRANSFER_INSTANCE_ID(v, o);`は`o.instanceID = v.instanceID`しているだけなのでここも書き換えて問題なさそう。

`UNITY_INSTANCING_BUFFER_START(Props)
UNITY_DEFINE_INSTANCED_PROP(float4, _Color)
UNITY_INSTANCING_BUFFER_END(Props)`
は複雑なマクロで構造体を定義してる。`UNITY_DEFINE_INSTANCED_PROP(○○, ××)`の後ろに`;`を書くとエラーになる。やりがち。

`UNITY_ACCESS_INSTANCED_PROP(Prop, ○○) = ...;`みたいにプロパティアクセスを左辺に持ってくるとエラーが出る。これは言語とかGPUとか由来っぽい。そういう場面では一回変数に代入してから左辺値としてその変数を使えば良い。

もろもろの記述をちゃんと確認したい場合は`UnityInstancing.cginc`を読む。`UnityCG.cginc`も少し絡んでいたようんいなかったような。


あとはマテリアルの`Enable GPU Instancing`のチェックを付ければGPU Instancingが使える条件がそろっていれば同じマテリアルのオブジェクトがGPU Instancingされる。

#注意
## boolの扱い
```
UNITY_INSTANCING_BUFFER_START(Props)
UNITY_DEFINE_INSTANCED_PROP(bool, _Animate)
UNITY_INSTANCING_BUFFER_END(Props)
```
みたいに構造体にboolを入れると、
>Instancing: Property '_Animate' type is not one of the following: float, half, int, uint. Ignoring.
UnityEngine.Experimental.Rendering.ScriptableRuntimeReflectionSystemWrapper:Internal_ScriptableRuntimeReflectionSystemWrapper_TickRealtimeProbes(Boolean&)

ってエラーがでる。boolではなくuintにしておいて、

```
bool animate = UNITY_ACCESS_INSTANCED_PROP(Props, _Animate) == 1;
```
みたいにアクセスしてboolとして扱ってます。自分は。

##TRANSFORMTEXマクロ
```
UNITY_INSTANCING_BUFFER_START(Props)
UNITY_DEFINE_INSTANCED_PROP(float4, _MainTex_ST)
UNITY_INSTANCING_BUFFER_END(Props)
//...
o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);
```

は`TRANSFORM_TEX`マクロが破綻するので、

```
UNITY_INSTANCING_BUFFER_START(Props)
UNITY_DEFINE_INSTANCED_PROP(float4, _MainTex_ST)
UNITY_INSTANCING_BUFFER_END(Props)
//...
float4 mainTexST = UNITY_ACCESS_INSTANCED_PROP(PropsLame, _MainTex_ST);
o.uv = v.texcoord * mainTexST.xy + mainTexST.zw;
```

みたいにマクロを展開するなり同等の関数なりマクロなりを用意する必要がある。
Version in "./docker-compose.yaml" is unsupported.と言われた

docker-composeのバージョンが古かったため、docker-compose upがエラーになってしまいました。
その際の対応をまとめていきます。

# 起こったエラー
```
ERROR: Version in "./docker-compose.yml" is unsupported. You might be seeing this error because you're using the wrong Compose file version. Either specify a supported version ("2.0", "2.1", "3.0") and place your service definitions under the `services` key, or omit the `version` key and place your service definitions at the root of the file to use version 1.
For more on the Compose file format versions, see https://docs.docker.com/compose/compose-file/
```

# やったこと

```
$ rm $(which docker-compose)
$ curl -L https://github.com/docker/compose/releases/download/1.25.4/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
$ chmod +x /usr/local/bin/docker-compose
```

# まとめ
本来であれば、macの場合Docker for Macをインストールしたらdocker-composeが使えるのですが、他のバージョンを入れてしまったために起こったようです。

# 参照
https://stackoverflow.com/questions/30988566/how-do-i-uninstall-docker-compose
http://docs.docker.jp/compose/install.html
AWS サーバー構築手順(ネットワーク編)


勉強したことを忘れないようにメモ

##概要

AWSの第一段階の勉強として基本的なWEBサーバーをAWSを使用して構築してみた。

ネットワーク構築から各サーバーの立ち上げをまとめる

##やった流れ
・ネットワーク設定
・ユーザー設定（IAM）
・EC2インスタンス作成
・ストレージ設定（S3）

###詳細
####◆ネットワーク設定
・CloudWatchでの料金ログチェック
・CloudTrailでのアクションログチェック
・公開用サーバーと非公開用サーバーの立ち上げ
・各サーバーにIPアドレスを設定

####◆ユーザー設定（IAM）
・AWSではルートユーザーのログインは推奨されていないので、Admin権限を持つユーザーを新規作成

####◆EC2インスタンス作成
・使用するOSのスペックによって値段が変動する
・Elastic IPで固定IPの指定が可能。EC2の稼働に応じて料金発生
・セキュリティグループ設定(簡単に言えばファイアウォール)

####◆ストレージ設定（S3）
・CloudTrailのログデータをS3に格納。
・S3は無制限のストレージ・高耐久
　１か月のストレージ料金・リクエスト料金・データ転送料金発生

##まとめ
掘り下げるときりがないのでこの辺で。。。
可用性重視の設計が一般的(AZを2か国運用)
VPCは一度設定すると変更不可のためIPアドレスが溢れないように設定するのが大事。

AWSマネジメントコンソール関係の記事は個人情報怖いのでスクショ少なめです。
WEBサーバーとDBサーバーを構築してなんかWEBサイトでも載せてみようかと思います。
計算する

#計算式
計算式を書くと計算できます。式が自動的に計算結果に置き換わります。

~~~rust
fn main(){
    let answer = ( 1 + 3 ) * 4 + 5 ;//( 1 + 3 ) * 4 + 5を計算してanswerという名前をつける。
    println!("answer = {}",answer);
}
//実行結果：answer = 21
~~~

演算子には優先順位があります。掛け算割り算のほうが足し算引き算より先に計算されます。
演算子の優先順位は　[このページ](https://doc.rust-jp.rs/book/second-edition/appendix-02-operators.html)　に書いてあります。
多すぎて訳が分かりませんが、よく使うものだけ覚えていればいいでしょう。それ以外はカッコで順番を明確にすれば間違いが減ります。

[目次](https://qiita.com/tonesuke/items/52e469f18e747c794376)
ibmcloudコマンドのlocaleを変更する方法

#1. はじめに
IBM CloudのCLIには、[ibmcloudコマンド](https://cloud.ibm.com/docs/cli?topic=cloud-cli-ibmcloud_cli)があります。
デフォルトのロケールが日本語である場合、例えばサポートなどとのやりとりのために出力を英語に切り替えたいなどの要件がある場合があります。LinuxやMacであれば環境変数として`export LANG=C`などを設定すれば切り替わりますが、WindowsではOSそのもののデフォルトの言語設定を変更する必要があり手軽に変更はできません。でも、ibmcloudコマンドには、実はlocaleを変更する専用の設定方法があります。本記事ではそのlocale変更について紹介します。

#2. locale変更

`ibmcloud config --locale xxx`で切り替え可能です。
xxxの箇所は以下から選択可能です。設定を解除するためには`CLEAR`を選択してください。

```txt:選択可能なkeyword
de_DE
en_US
es_ES
fr_FR
it_IT
ja_JP
ko_KR
pt_BR
zh_Hans
zh_Hant
CLEAR
```


#3. 実行例

```bash:現行値の確認（何も設定されていない）
$ ibmcloud config --list
名前                              値
有効な色                          -
HTTP タイムアウト (秒)            0
トレース                          -
ユーザー・ロケール                -
有効な CLI バージョンのチェック   true
有効な使用統計の収集              true
```

```bash:localeを英語に変更
$ ibmcloud config --locale en_US
$ ibmcloud config --list
Name                                  Value
Color enabled                         -
HTTP timeout (Second)                 0
Trace                                 -
User locale                           en_US
Check CLI version enabled             true
Collecting usage statistics enabled   true
```

```bash:localeを日本語に変更
$ ibmcloud config --locale ja_JP
$ ibmcloud config --list
名前                              値
有効な色                          -
HTTP タイムアウト (秒)            0
トレース                          -
ユーザー・ロケール                ja_JP
有効な CLI バージョンのチェック   true
有効な使用統計の収集              true
```

```bash:locale設定値のクリア
$ ibmcloud config --locale CLEAR
$ ibmcloud config --list
名前                              値
有効な色                          -
HTTP タイムアウト (秒)            0
トレース                          -
ユーザー・ロケール                -
有効な CLI バージョンのチェック   true
有効な使用統計の収集              true
```
BeamのDoFn/SimpleFunction/SerializableFunction

DoFn/SimpleFunction/SerializableFunctionは、Beamの抽象クラス/インターフェイスです。
機能が似ており、時々忘れるのでメモです。


# [DoFn](https://beam.apache.org/releases/javadoc/2.15.0/org/apache/beam/sdk/transforms/DoFn.html)
## 説明
ParDo.ofの引数に指定してTransformを定義するためのクラスです。
アノテーションを設定し制御することが出来ます。

* ProcessElement
 * 入力から出力の変換処理（任意の数の出力）。
* StartBundle/FinishBundle
 * [bundle](https://beam.apache.org/documentation/runtime/model/)単位の処理
* Setup/Teardown

DoFnが満たすべき性質などについて、ParDoの[ドキュメント](https://beam.apache.org/releases/javadoc/2.15.0/org/apache/beam/sdk/transforms/ParDo.html)に補足が記載されています。

* シリアライザブル
 * 無名クラス（=内部クラス）でDoFnを継承すると、[外側のクラスへの参照を持つ](https://www.jpcert.or.jp/java-rules/ser05-j.html)ので気をつけよう
* グローバルな状態を持たない
 * なんかやり取りしたい時はPCollection通してやろう
* フォールトトレランス性
 * 再実行されることはありうるので、冪等になるようなDoFnにしよう
 * （無理な時はDoFnの外側のどこかで、カバーする必要）
* 最適化
 * Beam RunnerがParDo同士をくっつけて(fusion)、最適化することもあるよ
 * くっつけやすいように、また、プログラムが理解しやすいように、DoFnは一つのタスクだけに集中した方がよい
 * Dataflowのfusion[の説明](https://cloud.google.com/dataflow/docs/guides/deploying-a-pipeline#fusion-optimization)


## 使用例
* [ParDo.of](https://beam.apache.org/releases/javadoc/2.15.0/org/apache/beam/sdk/transforms/ParDo.html)
 * Beam Programming Guideでも[紹介されています](https://beam.apache.org/documentation/programming-guide/#applying-transforms)

---

# [SimpleFunction](https://beam.apache.org/releases/javadoc/2.15.0/org/apache/beam/sdk/transforms/SimpleFunction.html)

## 説明
名前の通り、シンプルなメソッドを定義する抽象クラスです。


## 使用例
* [MapElements.via](https://beam.apache.org/releases/javadoc/2.15.0/org/apache/beam/sdk/transforms/MapElements.html#via-org.apache.beam.sdk.transforms.SimpleFunction-)
 * [1:1のTransformを定義](https://beam.apache.org/documentation/programming-guide/#core-beam-transforms)するメソッドです
 * [WordCount](https://github.com/apache/beam/blob/8db095d75da67a0ee17351dbd53a429356ea1afc/runners/spark/src/main/java/org/apache/beam/runners/spark/examples/WordCount.java#L127)でも使われています


---



# [SerializableFunction](https://beam.apache.org/releases/javadoc/2.15.0/org/apache/beam/sdk/transforms/SerializableFunction.html)

## 説明
* 名前の通り、[Serializable](https://docs.oracle.com/javase/jp/8/docs/api/java/io/Serializable.html)である必要があります
* さらに検査例外を投げることも出来ません
 *  検査例外投げたい時は、[ProcessFunction](https://beam.apache.org/releases/javadoc/2.15.0/org/apache/beam/sdk/transforms/ProcessFunction.html)を使えとのこと

## 使用例
* [FileIO#by](https://beam.apache.org/releases/javadoc/2.15.0/index.html?org/apache/beam/sdk/io/FileIO.html) 
 * 動的に送り先を指定するメソッドです
UserDefaultsをもっとシンプルに

## はじめに
今回はUserDefaultsをもっと簡単に管理しやすくするためのコードを紹介していきたいと思います。是非参考にしていただけると幸いです☺️
※[ジェネリクス](https://qiita.com/ktaguchi/items/fc260a0af506f258177d)と[enum](https://qiita.com/hachinobu/items/392c96820588d1c03b0c)を利用しています。
# 環境
- macOS Catalina(10.15.2)
- xcode(11.3)
- Swift5.1

## コード
**※UserDefaultsはあちこちのファイルで定義すると管理が大変になるので、このように1つのファイルで管理するといいかもです。**

```swift:UserDefaults.swift

enum UserDefaultsKey: String {
    case title = "title"
        
    func get<T>() -> T? {
        return UserDefaults.standard.object(forKey: self.rawValue) as? T
    }
    
    func set<T>(value: T) {
        UserDefaults.standard.set(value, forKey: self.rawValue)
    }
    
    func remove() {
        UserDefaults.standard.removeObject(forKey: self.rawValue)
    }
}
```

利用するときはこんな感じです。

```swift
     UserDefaultsKey.title.set(value: "氷菓")
     UserDefaultsKey.title.get() ?? String()
     UserDefaultsKey.title.remove()
```

##解説
enumを利用しenumのメソッドに登録、取得、削除の処理を定義しています。caseの部分にKeyを定義しています。UserDefaultsはどの型でも扱うことができるので、メソッドにジェネリクスを利用しています。
流れとしては、caseでキーを指定しそれに対応する値を各メソットでどう取り扱うかという感じです。

##おまけ(UserDefaultsのファイルを見る!)
思ったより早く説明しきってしまったので、おまけコーナーを設けました笑。知っている方もいるかと思いますが、知らなかった方は是非参考にしてみてください。

1. xcodeの左上にあるiPhoneマークをクリックし、「Add Additional Simulator」を選択後、下の写真を参考にファイルをダウンロードしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/523914/ae5bfd05-3823-7173-dc3f-bad6b54d457e.png)

2.ダウンロードしたファイルを「パッケージの内容を表示」を選択して開いてください。
3.次のパス(AppData/Library/Preferences/任意のファイル名.plist)にあるファイルを開くとUserDefaultsの中身を確認することができます。
何でbelongs_to :userになるか？（忘備録）

# はじめに

「**ActiveRecord::AssociationNotFoundError in Tweet#index**」エラー向けの記事になります。
エラー勉強会の復習した時に、疑問に思ったのでアウトプットしてみました。
Associationと出てる時点で、DBの問題であると考える事ができますが、今回は掘り下げてみたいと思います。

<img width="1072" alt="スクリーンショット 2020-03-01 20.55.55.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593642/495ae23a-771c-9c3b-6b3c-a58c318ab58e.png">

## エラーの意味
エラーの通りで、tweet_controllerのindexアクションでAssociationが見つからないエラーです。


###### Associationとは
DBに構築されているテーブルの関連付ける事を指しています。

今回は、下図のようなAssciationを組んでいる時に起こるエラーとなります。

<img width="795" alt="スクリーンショット 2020-03-01 20.59.37.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593642/7e8e23b3-4005-d55c-35db-876fc9c133c1.png">



まずは、tweet_controllerのindexアクションをみてみます。

app/controllers/tweet_controller.rb
<img width="642" alt="スクリーンショット 2020-03-01 21.07.57.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593642/1179c64c-6c71-f578-c2a4-f571f45aca05.png">

記述に問題はありませんが、SQLを読み込むincludeメソッドにエラーが起きている事が分かります。
:userはUserモデルの事を指しているので、　Userモデルを見てみます。

app/models/user.rb
<img width="395" alt="スクリーンショット 2020-03-01 21.51.39.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593642/687402bc-aeef-ecc2-557f-854b2ccb9729.png">


記述に問題はなさそうです。

has_manyの復習すると、　**has_many モデル名(複数)**　という記述をします。
userはtweetとcommentの１対多の関係になります。

そうすると、他のtweetモデルかcommentモデルに問題があると考えます。 

app/models/tweet.rb    
<img width="318" alt="スクリーンショット 2020-03-01 21.55.09.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593642/d30dc911-a718-c227-9043-86ec300d7b23.png">

app/models/comment.rb
<img width="300" alt="スクリーンショット 2020-03-01 21.57.17.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593642/25d82ca6-1a51-f482-656d-997f535045a1.png">)

ようやくエラー元を見つけました。　**belongs_to :users**が悪さをしていました。

**belongs_to モデル名(単数)** と定義されます。
ここで :users　⇨ :user に直すとエラーが解消されます。

tweetモデルとuserモデルが、associationができていなかった為にエラーが出てたようです。

参照文献：[railsガイド](https://railsguides.jp/association_basics.html)
nuxt.js + auth使用時のFATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory解消法

こんにちは、普段railsとvue.jsでインターンをしている私文大学生のkomiyaです。

nuxtを用いて個人的なプロジェクトを開発している際、devモードで
```FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory```
というエラーに悩まれたのでその解決策を書きます。

## エラー発生の原因と解決法
このエラーは、ログイン機能を追加するためにnuxtjs/authを使用したした際に発生しました。apiサーバーをlocalhostの3000番ポートで立ち上げていたので、axiosのbaseURLをlocalhost:3000に設定したのですがこれが良くなかったようです。nuxtのdevサーバーのデファルトのポート番号が3000なので、この設定だとauthモジュールがuser情報を取得する際、nuxt自身にリクエストを飛ばしてループ状態に陥ってしまうのがこのエラーの原因のようでした。
なので、apiサーバーは8080ポート、nuxtを3000ポートで立ち上げ直し(私の場合はdockerを使っていたのでdocker-compose.ymlを修正）、axiosのbaseURLをlocalhost:8080に変えたら解決しました。

```javascript:nuxt.config.json
  axios: {
    host: 'localhost',
    //apiサーバーを8080で立てて、ここを3000から8080に変更
    port: 8080,
 
  },
  auth: {
    redirect: {
      login: '/login',
      logout: '/login',
      callback: false,
      home: '/',
    },
    strategies: {
      local: {
        endpoints: {
          login: { url: 'api/users/sign_in', method: 'post',propertyName: 'token' },
//portを3000にするとこのuser取得の部分でエラーが発生する。
          user: {url: 'api/users/current', method: 'get',  propertyName: false},
          logout: false
        }
      }
    
  },
```
Serverless Framework lambda 1プロジェクトで複数関数を定義したい

Serverless Frameworkを使って1プロジェクト内にlambdaの複数関数を用意するには、どうしたらいいの？(TypeScriptで)ということで、簡単にserverless.ymlとプロジェクトの構成を解説していこうかなと思います。

# プロジェクト構成
今回はhandler.tsとhandler2.tsにそれぞれ一つづつ関数を定義しています。
<img width="265" alt="スクリーンショット 2020-03-01 21.59.01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325856/fc100aa9-878b-ffe4-069b-daedb430f0df.png">


# serverless.yml

lambdaの関数を複数定義したい場合は、serverless.ymlのfunctionを複数書けばいいだけ。
すごく簡単。

```yaml
functions:
  hello:
    handler: handler.helloWorld
    events:
      - http:
          method: get
          path: hello
  hello2:
    handler: handler2.helloWorld2
    events:
      - http:
          method: get
          path: hello2
```

今回は、helloとhello2がそれに当たります。
そこで、それぞれのhandlerの関数を指定すればいいだけです。

# デプロイ後
こんな感じで複数関数ができてます。
<img width="1281" alt="スクリーンショット 2020-03-01 22.02.51.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325856/361e1715-3457-0f96-1ebe-8ebf2450b956.png">


# まとめ
ServerlessFrameworkすごく簡単。
関数ごとにプロジェクトを分ける必要がない。
Kubernetes関連ツール調査(適宜追記)

# Kubernetesを効果的に使うためのツール群をまとめる
## Podのデバッグ
トラブルシューティング用のツールをインストール済みのcontainerを横付けすることで、本番側のPodにツールを入れずにトラブルシュートできる。
※使い方未確認

```
brew install aylei/tap/kubectl-debug
```

参考: https://github.com/aylei/kubectl-debug

## Podのデバッグ2
.bashrcなどに下記のような関数を定義する

```:.bashrc
kcdebug() { kubectl run -i --rm --tty debug --image=busybox --restart=Never -- sh}
```
実行すると下記のように、一時的にデバッグコンテナを起動しターミナルに接続する。
このPodから、他のPodに対してpingやnc,wgetを行って、接続性の確認を行うことができる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94861/4546a644-c4fa-f0df-9a92-3400ff302841.png)


参考: https://medium.com/@pczarkowski/kubernetes-tip-run-an-interactive-pod-d701766a12

# 下記のリストから個人的に使えるツール類をまとめる
http://dockerlabs.collabnix.com/kubernetes/kubetools/?utm_sq=ganrvzkv2k
確率積分(Ito integral)を算出してみた

■ 確率積分として以下のような方式があります

**Riemann sum**
式)
$ \sum_{j=0}^{N-1} h(t_j) (t_{j+1}-t_j) $

**Ito integral.**
伊藤清（Kiyoshi Ito)によって拡張された確率過程の方式
式)
$ \sum_{j=0}^{N-1}h(t_j) (W(t_{j+1})-W(t_j)) $. 
<=> $ \int_0^{T} h(t)dW(t) $.

**Stratonovich integrals**
式)
$\sum_{j=0}^{N-1}h\big(\frac{t_j+t_{j+1}}{2}\big)(W(t_{j+1})-W(t_j))$





###　Ito integralの計算
$h(t)\equiv W(t)$の時、Ito integralは、

```math
\begin{align*}
\sum_{j=0}^{N-1} W(t_j) (W(t_{j+1})-W(t_j)) \\
&=\sum_{j=0}^{N-1} ({W(t_{j+1})}^2 - {W(t_{j+1})}^2 + 2 W(t_j) W(t_{j+1}) - {W(t_j)}^2  - {W(t_j)}^2) \\
&= \frac{1}{2} \sum_{j=0}^{N-1} ({W(t_{j+1})}^2 - {W(t_j)}^2 - (W(t_{j+1}) - W(t_j))^2 )\\
&= \frac{1}{2} (W(T)^2 - W(0)^2)  -  \frac{1}{2} \sum_{j=0}^{N-1} (W(t_{j+1}) - W(t_j))^2
\end{align*}
```

$\sum_{j=0}^{N-1} (W(t_{j+1}) - W(t_j))^2$はWiener Processの分散に等しく、$T$とおけるため、
$$\sum_{j=0}^{N-1} (W(t_{j+1}) - W(t_j))^2=\frac{1}{2}(W(T)^2-T)$$と表現できる。


Ito integralを算出してみる。

```py
N=10000;
M=1;
T = 1.0
dt = T / N;

t = np.arange(0.0,1.0, dt);
dW = np.sqrt(dt)*randn(N,M); # (N, M)行列
W = np.cumsum(dW,axis=0);
e = np.array([[0]])
W_=np.concatenate((e,W[:-1]), axis=0)  # 初期値に0をおく　 W(0)として。

ito = np.dot(W_.T,dW) # (10000, 1).T * (10000, 1)  => (1, 1)
np.abs(ito - 0.5*(W[-1]**2 - T) )[0][0]

## output
##  0.00414652405737
```


参考記事
- Desmond J. Higham "An Algorithmic Introduction to Numerical Simulation of Stochastic Differential Equations"

https://www.semanticscholar.org/paper/An-Algorithmic-Introduction-to-Numerical-Simulation-Higham/1c4126f96df7690dd40dab5f34ee4be5a5f95fbb

- Wikipedia「伊藤清」 https://ja.wikipedia.org/wiki/%E4%BC%8A%E8%97%A4%E6%B8%85
- Learning SDEs in Python
https://www.quantopian.com/posts/learning-sdes-in-python
Next.jsをserverlessでビルドしてawsにデプロイするには(s3, lambda, apigateway, route53)

## 概要

筆者が当初ざっくりと考えていたのは「Next.jsをLambdaにデプロイしたい・デプロイを自動化したい」だったのですが、これに結構苦戦したのでそのまとめと言ったところです。

この記事はaws初学者には意味がわからないと思うので、以下に登場ワードを書いておくのでまずはそちらをある程度調べてから挑戦した方がいいかと思います。

- S3
- Lambda
- API Gateway
- Route53
  - ACM
- IAM
  - Role
  - Policy

## 注意点

まず、ただ単に「Next.jsで作ったものを公開したい」だけであれば、AWSに限定する必要は全くないです。[ZEIT Now](https://zeit.co/docs#)を使えばいいと思います。

同じようなことをするためのライブラリで[Serverless Nextjs Component](https://github.com/danielcondemarin/serverless-next.js)と言うのがあります。今回やることはこれに近いので、実際問題これを使ってもいいのかもしれません。そこは読者さんご自身で考えてみてください。

一応僕の意思決定としては、

- わりと新しいツールなのでハマった場合すごく面倒そう・即時解決しない可能性までありそう
- ツールの使い方で時間取られるくらいなら、AWS直接使った方が勉強にもなるしマシ
- デプロイ全自動化したいので、aws-sdkで書いた方が繋ぎ込むときに簡単そう

などの理由から今回aws-sdkを使って直接操作する方針を取りました。

また、今回紹介する方法はカスタムドメインを使いますが、API Gatewayだけでもいけるじゃん？と思っている場合ソースコードのURLを書き換えなければいけない箇所が出てきます。API Gatewayには`stage`と言う概念があることが関係します。簡単に言うと、API Gatewayのルートパスに対してのパスマッピングができず、`/static/xxx.png`などが`/<stage>/static/xxx.png`と言うパスでしか公開できないので、ソースコード中の静的ファイルへのリンクを変更しなければいけません。

## AWSにデプロイするファイルは？

Next.jsは、`public`ディレクトリを特別扱いしていて、`public`ディレクトリに配置されたファイルはその構造のまま配信されると言うルールがあります。

a. `public/**/*`

Next.jsは、次のようなファイルを生成します。

b. `.next/serverless/pages/**/*.html`
c. `.next/serverless/pages/**/*.js`
d. `.next/static/**/*`

bは、静的ファイルを返すだけのページの場合に出力されます。それに対して、cはサーバーサイドでのレンダリングが必要なページに対して出力されるファイルです。dは、splitされたソースコードや、各ページのロード後の動的コンテンツ用のスクリプトなどです。

上のうち、a, b, dはS3にアップロードし、cは加工後にlambdaにデプロイします。

## 加工とは？

Next.jsが出力する、各ページ向けのjsファイルは、例えば`lambda`だったり`zeit now`などと関係がないインターフェイスで出力されます([#6173 issuecomment](https://github.com/zeit/next.js/issues/6173#issuecomment-458618785))。なので、lambdaのhandler向けに加工しなければlambdaでは使えません。それは、[#6070 issuecomment](https://github.com/zeit/next.js/pull/6070#issuecomment-454846201)だったり、[next-aws-lambda](https://github.com/danielcondemarin/serverless-next.js/tree/master/packages/next-aws-lambda)を使うことで解決します。

## Route53

筆者の場合、Google Domainsで購入したドメインをAWSで使っています。Google DomainsでドメインのネームサーバーをAWSのネームサーバーに変更し所有者の確認が取れれば、あとは基本的にAWS側で使えます。
API Gatewayから使えるようにするため、事前にACMで証明書の発行が必要です。

## API Gatewayとの結合

S3, Lambdaにデプロイしたリソースは、API Gatewayを使ってAPIのパスをコントロールしていきます。
API Gatewayで特別扱いしなければいけないファイルがあります。それは`_error.js`です。
これは、エラー(例えば404など）に対する画面をハンドリングするファイルなので、全てのパスに対して`_error.js`のLambda関数と統合する必要があります。`{proxy+}`のようにリソースパスを指定します。動的パスの場合もこれを用いてリソースパスを設定しLambda関数と統合します。

それが終わったら、任意のステージにデプロイし、カスタムドメインを設定すれば完了です。

## おわりに

まだあまりNext.js + Lambda界隈は盛り上がっていないような気がしますが、個人的には今後にかなり期待しています。
この記事ではコードを添付していないですが、理由としてはまだいくらか手作業の部分が残っていて完全自動化できていないためです。（特にIAM, Role, Policy, Route53まわり）

もし需要がありそうであれば、コードを整えて共有しようかなと言う気持ちはありますがとりあえずは個人で利用するだけなのでいったん手作業も容認かなあと言うところです（...
プログラミング言語ってポケモンシリーズみたいだなって話

## 最近の頭の中

最近、技術ロードマップを考える（まだ妄想に近い）にあたって教育とか採用とか組織体制とかそういうのを諸々考える機会が増えています。

それに伴って、

「弊社の開発環境（言語とかフレームワークとかも含め）と社内のエンジニアのスキルセットって世間的に見てどうなんだろう？」

っていうのを顧みるのは外せないわけですけれど、その時に思ったお話を一つ。


## 技術トレンドはアップデートされる

エンジニアの開発言語とか環境とかって、まあまあな頻度でアップデートされていきますよね。
僕が開発しだしてからまだ7年少々ですが、その間にもトレンドは2～3巡位している印象です（もっと意識高い界隈ではきっともっとすごいことになっている気もしますが…）。

そんなさなかで「新しい言語はどんどん覚えていかないとね！」というのはやっぱりあります。

開発環境のトレンドから出遅れると、運用メンテできる人材の確保がだんだんめんどくさくなったり、他社と比較したときに競合優位性を発揮しづらくなって行ったり。


## 同業者と話してるときのちょっとした違和感

ただ、その一方で
「僕、この言語もこの言語もこの言語もやったことありますね！あ、あと今はこれも勉強中なんです！この後はこれやろうと思っています！」
みたいな20代後半エンジニアの方と最近けっこうお話させていただく機会が多いんですが、あえて誤解を恐れずに言うと「もっと深い話したいな」って思ってしまいがちだったりします。

逆に言ってしまうと
「言語はこれとこれしかやったことないんですけど、ここのところこういう課題にぶつかってて、どうしたらいいですかね？」
みたいな話はたまにしかできない割にめっちゃ面白かったり。

あ、ここでいう「面白い」っていうのはfunnyではなくinterestingです。
もっと言えば「この人と仕事したらいろいろ深堀出来て面白そうだな」みたいな感覚に近い。


## そういえば昔似たようなことがあった

この違和感てなんだろう、って日々過ごしていたんですが、ふとした拍子に「そういえばめっちゃ既視感ある」と気づいたんです。なんと「ポケモン」。

大學の研究室でめちゃくちゃポケモンが流行ってた時期の話です（当時の色はブラックホワイト２）。

ポケモンにめっちゃドはまりしていた同級生がいました（以下、Ｓ君とします）。

ご存じの方もいると思うんですけど、ポケモンて同じ種類でもゲットした個体によって『個体値』て言われるランダムなパラメータがあって、それがレベル100になったときの強さに結構インパクトするんですよね。

もちろんＳ君はその辺極めきってました。ただ背景がちょっと特殊で、プレイソフトは前々作「ダイヤモンド」のみ、前作「ブラックホワイト」は未プレイ。ただしダイヤモンドはプレイ時間が9999時間、みたいな突出パラメータの持ち主でした。

ちなみに私は大体のソフトはやるけど「四天王倒したらテンション下がって終わり」みたいなどこにでもいる人種。

で、二人で「ブラックホワイト２」を一緒に買って、よーいどんで競争みたいな感じで始めたんですよね。二人とも順調にプレイを続け、四天王倒すあたりまでは仲良く一緒にやってました。


## 徐々に差が出始める

明確に違いが表れ始めたのはプレイ時間が50時間超えたあたりぐらいからです。

「通信対戦で何回やっても勝てない」

いやホントに、マジで勝てない。どころか研究室内でもＳ君がぶっちぎり。

「おんなじぐらいの時間かけてるのになんでそんな強いねん」

ってきいたら

「そらみんな戦略が足りなさすぎるわ。時間かければええわけじゃないねん。ええか、まず最初に捕まえるところからやな…」

みたいな講義を延々続けてきます（プレイ時間同じ）。
よくよく聞いてみたら、最初の草むらで捕まえるポケモンから後々のことを見据えて厳選していたとか。マジかよ。はんぱねえな。
で、どうやらその知識や戦略は、唯一プレイした「ダイヤモンド」を極めたときのノウハウのマイナーチェンジであると。

そんでその時、学生ながらに思ったんですよね。

「いろいろつまみ食いするより、1点集中で極めたやつってなんだかんだ強いんじゃん？」


## 既視感の正体

プログラミングの言語もなんか似たようなとこあるんじゃないですかね。

「言語1つずつで毎年変えながら開発経験があります」ていうのより、

「悶絶する修羅場を5年間乗り越えてきました」みたいなのほうが、

単純な機能実装以上に、あとあとの戦略的な「課題解決」地力として効いてくるんじゃないかなっていう。

「四天王倒したらまあやりきったな」って次のソフトに乗り換えるのもいいけど、プレイ時間カンストするまでやってみたら？っていう。


## 頑張ってまとめると

勝手なイメージもあると思いますけどエンジニアの転職理由の一つによくある、
「今のプロダクト開発環境に物足りなさを感じて」
っていうのは存外慣れて刺激が少なくなってきただけで焦る必要はない、

「地味に極めなければならないレベル90からレベル99までの道のり」
っていうのを追ってくのも悪くないんじゃないかと。

今一生懸命プロダクトを作ってる人は、あんまり焦らず自分のプロダクトを課題解決しながら前進させてく紆余曲折を経験するのも、それはそれで需要あると思いますよ、安心して課題に向き合ったらいいと思います、ていうお話でした。



というわけでソード＆シールドはそのうちやる気がしないでもないですが、やるならちゃんとやります。


おわり。
ネットワークカメラのRTSPをgstreamerで読み込む際に、gstreamer1.0-plugins-uglyをアンインストールするとうまくいった話

# 問題の現象と解決策
ネットワークカメラのRTSPをgstreamerで読み込む際にハマったので問題と解決策を残しておきます。

現象： ネットワークカメラ（RTSPで配信）の映像をgstreamerで読み込む際に、Bad Request (400)となりRTSPサーバーに接続できない。

解決策： gstreamer1.0-plugins-uglyをアンインストールします。以下のサイトに情報があります。特定のネットワークカメラで起きるようです。

rtspsrc authorisation problem.
http://gstreamer-devel.966125.n4.nabble.com/rtspsrc-authorisation-problem-td4679792.html

Bug 772043 - rtsp real extensions make some rtsp streams unplayable
https://bugzilla.gnome.org/show_bug.cgi?id=772043

# 環境
Jetson TX2 (Jetpack 4.3)
mac Mojave
ネットワークカメラ：Panasonic BB-SP104W
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103795/88420d3a-d49f-3e99-88c2-f6d81e4339af.png)


# plugins-uglyの削除コマンド
Jetsonでは以下のコマンドでgstreamer1.0-plugins-uglyを削除します。

```bash
sudo apt remove gstreamer1.0-plugins-ugly
```

Macでは、以下のコマンドでgst-plugins-uglyを削除します。

```bash
brew uninstall gst-plugins-ugly 
```



# エラー時のメッセージ
ネットワークカメラのRTSPをgstreamerで読み込む際に発生したエラーメッセージです。
GST_DEBUGを設定してログを確認すると”Bad Request (400)”でRTSPサーバーへの接続が失敗していることが確認できます。

```
$ GST_DEBUG=3 gst-launch-1.0 -v rtspsrc location=rtsp://192.168.0.10:554/MediaInput/h264  user-id="admin" user-pw="password" ! fakesink dump=true
パイプラインを一時停止 (PAUSED) にしています...
Pipeline is live and does not need PREROLL ...
Progress: (open) Opening Stream
Progress: (connect) Connecting to rtsp://192.168.0.10:554/MediaInput/h264
Progress: (open) Retrieving server options
0:00:00.059070000 98217 0x7fb9ef883850 WARN                 rtspsrc gstrtspsrc.c:6564:gst_rtspsrc_send:<rtspsrc0> error: Unhandled error
0:00:00.059149000 98217 0x7fb9ef883850 WARN                 rtspsrc gstrtspsrc.c:6564:gst_rtspsrc_send:<rtspsrc0> error: Bad Request (400)
ERROR: from element /GstPipeline:pipeline0/GstRTSPSrc:rtspsrc0: Unhandled error
0:00:00.059487000 98217 0x7fb9ef883850 WARN                 rtspsrc gstrtspsrc.c:7951:gst_rtspsrc_open:<rtspsrc0> can't get sdp
追加のデバッグ情報:
gstrtspsrc.c(6564): gst_rtspsrc_send (): /GstPipeline:pipeline0/GstRTSPSrc:rtspsrc0:
Bad Request (400)
0:00:00.059594000 98217 0x7fb9ef883850 WARN                 rtspsrc gstrtspsrc.c:6031:gst_rtspsrc_loop:<rtspsrc0> we are not connected
ERROR: pipeline doesn't want to preroll.
パイプラインを一時停止 (PAUSED) にしています...
Setting pipeline to READY ...
Setting pipeline to NULL ...
Freeing pipeline ...
```

# 参考： テストの際に試したコマンド

環境変数にGST_DEBUG=X（Xは1-9の数字）をするとログの出力量を増やせます。
fakesink dump=trueで入力をダンプすることができます。とりあえずストリームに接続出来てデータが流れてきているかを確認出来ます。

```
$ GST_DEBUG=3 gst-launch-1.0 -v rtspsrc location=rtsp://192.168.0.10:554/MediaInput/h264  user-id="admin" user-pw="password" ! fakesink dump=true
```

decodebin ! autovideosinkでいい感じにデコードして画面に映像を表示できます。

```
$ GST_DEBUG=3 gst-launch-1.0 -v rtspsrc location=rtsp://192.168.0.10:554/MediaInput/h264 user-id="admin" user-pw="password" ! decodebin ! autovideosink
```

gst-play-1.0を使ってストリームを再生し、画面で確認することが出来ます。

```
$ gst-play-1.0 rtsp://admin:password@192.168.0.10:554/MediaInput/h264 
```
coc.nvimをvim8のデフォルトのplugin managerでインストールする方法

# 概要
coc.nvimをvim8のデフォルトのplugin managerでインストールする方法
## インストール
##### vim8のデフォルトのpluginマネージャー
```vimscript
cd ~/.vim/pack/mypackage/start
curl --fail -L https://github.com/neoclide/coc.nvim/archive/release.tar.gz|tar xzfv -
```

##### 拡張機能(phpls)のインストール
vim起動後、下記コマンドを実行

```
:CocInstall coc-phpls
```
## 参考
- [Install coc.nvim](https://github.com/neoclide/coc.nvim/wiki/Install-coc.nvim)
- [Using coc extensions](https://github.com/neoclide/coc.nvim/wiki/Using-coc-extensions)
GDMログイン画面をHiDPIディスプレイに対応する

# はじめに

前回（[GNOMEデスクトップでHiDPIディスプレイに対応する](https://qiita.com/underflow/items/31dfa31210d7cbd0f147)）の続きです。

高解像度のディスプレイを使用するとGDMのログイン画面がとても小さくて見えづらいので改善します。

<img width="1440" alt="スクリーンショット 2020-03-01 17.31.07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/561682/7f4e9614-5fc4-09a8-dda4-502349ac732e.png">
図　GDMのログイン画面
視力検査をしているかのよう。

# スケールを変更する
一般ユーザーであれば設定からスケールを変更できますが、GDMのログイン画面は、gdmという一般ではないユーザーが管理しているため同じ方法が取れません。そこでdconfの設定を変更します。

### GDMユーザーにログインする

```
$ sudo su - gdm -s /bin/bash
```
（※ -sオプションについて知った。今までpasswdをvipwから/sbin/nologinを編集していたので結構危ないことをしていた。）

### スケールを２倍の設定にする（整数倍のみ）

```
$ dbus-launch gsettings set org.gnome.desktop.interface scaling-factor 2
```
gsettingsを直接実行するとX11に関するエラーが通知される。

### 設定を確認する
```
$ dconf dump / | grep scaling-factor
scaling-factor=uint32 2
```

再起動するとスケールが変更された画面が表示されます。

<img width="1440" alt="スクリーンショット 2020-03-01 17.33.00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/561682/c41d8743-d9e8-46a0-6506-eeed714c7a06.png">
図　scaling-factor 2のGDMログイン画面

# 参考
https://garajau.com.br/2018/04/changing-gsettings-on-gdm-user
【Udemy Python3入門+応用】　17.リストの操作

**※この記事はUdemyの
「[現役シリコンバレーエンジニアが教えるPython3入門+応用+アメリカのシリコンバレー流コードスタイル](https://www.udemy.com/course/python-beginner/ "現役シリコンバレーエンジニアが教えるPython3入門+応用+アメリカのシリコンバレー流コードスタイル")」
の講座を受講した上での、自分用の授業ノートです。
講師の[酒井潤](https://twitter.com/sakaijun "酒井潤")さんから許可をいただいた上で公開しています。**

##■リストの操作
#####◆リストの要素を置換する
```
>>> s = ['a', 'b', 'c', 'd', 'e', 'f', 'g']
>>> s[0] = 'A'
>>> s
['A', 'b', 'c', 'd', 'e', 'f', 'g']
>>> s[2:5] = ['C', 'D', 'E']
>>> s
['A', 'b', 'C', 'D', 'E', 'f', 'g']
```
リスト内のインデックスやスライスを指定して、直接文字列を代入することができる。


#####◆`.append()`と`.insert()`
```
>>> n = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> n
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> n.append(100)
>>> n
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 100]
>>> n.insert(0, 200)
>>> n
[200, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 100]
```
`.append`により、リスト内の最後に文字列が付け加えられる。
`.insert`を用いると、任意のインデックスを指定し、その場所に文字列を挿入できる。


#####◆`.pop()`
```
>>> n = [200, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 300]
>>> n
[200, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 300]
>>> n.pop(0)
200
>>> n
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 300]
>>> n.pop()
300
>>> n
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
```
`.pop()`でインデックスを指定すると、その要素が抽出される。
抽出された要素はリストからなくなる。
インデックスを指定しない場合は、最後の要素が抽出される。


#####◆リストの要素を消去する(空のリストで置換する)
```
>>> s = ['a', 'b', 'c', 'd', 'e', 'f', 'g']
>>> s[2:5] = []
>>> s
['a', 'b', 'f', 'g']
```
指定した部分を空のリストに置換してやることで、要素を消去できる。


#####◆リストの要素を消去する(`del`を用いる)
```
>>> n = [1, 2, 3, 4, 5]
>>> n
[1, 2, 3, 4, 5]
>>> del n[0]
>>> n
[2, 3, 4, 5]
>>> del n
>>> n
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'n' is not defined
```
インデックスを指定したものを`del`で消去できる。
うっかりインデックスを指定せずに`n`に`del`をかけた場合、`n`自体が抹消されるため注意。


#####◆リストの要素を消去する(`.remove()`を用いる)
```
>>> n = [1, 2, 3, 4, 5]
>>> n
[1, 2, 3, 4, 5]
>>> n.remove(2)
>>> n
[1, 3, 4, 5]
>>> n.remove(4)
>>> n
[1, 3, 5]
>>> n.remove(6)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: list.remove(x): x not in list
```
`.remove()`を用いると、要素を直接指定して消去することができる。
このときリスト内に存在しない要素を指定するとエラーとなる。


#####◆リストに別のリストの要素を追加する
```
>>> a = [1, 2, 3]
>>> b = [4, 5, 6]
>>> x = a + b
>>> x
[1, 2, 3, 4, 5, 6]
```
これは前にやった通り。

```
>>> a = [1, 2, 3]
>>> b = [4, 5, 6]
>>> a += b
>>> a
[1, 2, 3, 4, 5, 6]
```
`+=`により、`b`のリスト内の要素が`a`のリストに付け加えられる。

```
>>> x = [1, 2, 3]
>>> y = [4, 5, 6]
>>> x.extend(y)
>>> x
[1, 2, 3, 4, 5, 6]
```
`.extend()`というメソッドを使う方法もある。
最初のRustプログラム

#Hello,World!
最初に書くプログラムはHello,World!と決まっています。

~~~rust
fn main() {
    println!("Hello,World!");
}
~~~

このコードを実行すると「Hello,World!」と出力されます。
画面に文字を出すのは波カッコ`{` `}`で囲まれている部分です。

~~~rust
println!("Hello,World!");
~~~

それ以外の部分は関数を定義するための構文です。

~~~rust

//mainという名前の関数を定義している。
fn main(){
    //main関数の中身を書く
}

~~~
`//`で始まる行はプログラムの動作に影響を与えません。コメントといいます。プログラムが何をするかを分かりやすく書くためのものです。
main関数は特別な関数です。プログラムの開始場所となる役目を持っています。

[目次](https://qiita.com/tonesuke/items/52e469f18e747c794376)
時系列予測のためのLSTM(1)(初心者向け)

今回は、LSTMについて。
時系列などの規則性がある現象についての予測問題はアプローチとして有効かもしれない。
自分の理解のためのアウトプットなので、一旦は参考サイトをほぼトレースしている。
# LSTM(Long Short-Term Memory)
ひとことでいうと、短期記憶で長期期間で活用して学習を進める。特徴がある。
LSTMの部分を図式化すると、以下になる。
<img width="678" alt="スクリーンショット 2020-03-01 19.57.58.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/351494/55ed1217-269d-fc5b-f645-5bb0494ff022.png">
htでの計算で、前の出力結果ht-1とXtを使い求める。htはht+1を求めるために使われるイメージ。
それぞれ、
・OutputGate
・Forget Gate
・Input Gate
・活性化関数部分
・Memory Cell
で成り立っている
###OutputGate
以下の矢印赤い部分。
Xtに対しての線形変換Wo、htに対しての線形変換Ro、バイアスBoを使い
Ot=σ(WoXt+Roht−1+Bo)
という計算が行われる。
ニューラルネットワークと同様の計算式。
<img width="698" alt="スクリーンショット 2020-03-01 20.22.56.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/351494/fed77442-6a69-7a1c-144d-1bb44dd3b67d.png">
###Forget Gate
OutputGateと同様、
Wf、Rf、Bfのパラメータがあり
ft=σ(WfXt+Rfht−1+Bf)
という計算が行われる。
<img width="688" alt="スクリーンショット 2020-03-01 20.30.57.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/351494/b96379d5-7efb-8781-57b5-445c16a8b9db.png">
###Input Gate
同様に、
it=σ(WiXt+Riht−1+Bi)
という計算が行われる。
<img width="685" alt="スクリーンショット 2020-03-01 20.33.26.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/351494/6612666e-fd87-7753-c54a-6077bf75e58c.png">
####活性化関数部分
Zt=tanh(WzXt+Rzht−1+Bz)
活性化関数部分の計算式。
<img width="696" alt="スクリーンショット 2020-03-01 20.39.47.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/351494/2e8a6064-9574-8bd7-85da-867f992e695c.png">
##Memory Cell付近の計算
###①Forget Gate側
ft=σ(WfXt+Rfht−1+Bf)とセル点線からのアウトプットCt-1により
Ct−1 ⊗ ft というアウトプット。
⊗ は要素ごとの積
<img width="692" alt="スクリーンショット 2020-03-01 20.43.05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/351494/eae18cd9-9650-94b3-4cb0-431ddf2da706.png">
###②Input Gate側
it=σ(WiXt+Riht−1+Bi)とZt=tanh(WzXt+Rzht−1+Bz)により、
it ⊗ Zt  というアウトプット。
<img width="669" alt="スクリーンショット 2020-03-01 20.44.28.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/351494/6a04199d-a46e-0826-0104-0cd1fe93e314.png">
###③Cellの手前
①でのCt−1 ⊗ ft と②での it ⊗ Zt により
Ct = Ct−1 ⊗ ft　+ it ⊗ Zt
という計算が行われる。
<img width="687" alt="スクリーンショット 2020-03-01 20.45.04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/351494/a6b06a12-f8a9-4d98-5fc5-5595c39d1abf.png">
###④出力付近
Memory Cell部分　Ct = it ⊗ Zt + Ct−1 ⊗ ft
OutputGate部分　Ot = σ(WoXt+Roht−1+Bo)
を使い
ht = Ot ⊗ tanh(Ct)
が行われる。
<img width="680" alt="スクリーンショット 2020-03-01 20.45.28.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/351494/b05ec8c4-17f9-af33-a3b4-4eb672c7dbca.png">
#LSTMのポイント
Ct = Ct−1 ⊗ ft　+ it ⊗ Zt
Ct−1 ⊗ ft　Forget Gate部分で、Ct-1は過去の情報のパラメータをどれくらい反映するかを調整している。
it ⊗ Zt　Input部分で、得られた入力値 it をどれだけ反映するか、を Zt 活性化関数により調整している。

## 参考
[今更聞けないLSTMの基本]
(https://www.hellocybernetics.tech/entry/2017/05/06/182757)
【Automation Anywhere】TaskBot、MetaBot、IQ Botの違いとは？

Automation Anywhereを使っていると、「TaskBot」「MetaBot」「IQ Bot」という3つの何となく似たような「Bot」を表す単語が登場します。これらの違いについて、きちんと理解したいので調べてみました～(^^)/

# TaskBot
**いわゆる普通のRPAロボット。**自動化のコアに当たる部分。文書管理、人事、クレーム管理、支払管理、見積もり管理、ITサービスなどで利用されるルールベースの繰り返しタスクを実行するとボットで、生産性、コスト削減、エラー削減に効果がある。アクションを組み合わせて作成され、Automation Anywhereで最も一般的な形のロボットです。

# MetaBot
**ロボットの部品。**複雑で大規模展開を予定しているプロセスにて、誰もが使う共通部分を切り出して部品化できます。操作対象のアプリケーションが更新された時に、大規模展開済みの個々のTaskBotを更新する代わりに部品であるMetaBotを改修するだけで対応が済んでしまいます。このためMetaBotにしておくことでメンテナンス性がよく簡単に使うことができ、ダウンタイムを最小化することが可能です。アクションを組み合わせたり、ロジックに当たるDLLを呼び出すことが可能です。[Bot Store](https://www.automationanywhere.com/jp/products/botstore)と呼ばれるインターネット上のマーケットプレイスでも配布されています。

**※ MetaBotはv11での名称で、A2019ではこの概念と名称はなくなり、「アクションパッケージ」が代わりになるようです。**


# IQ Bot
**ファジーな論理で構造化データ以外も扱う、教師あり学習によりプロセス自動化を拡張する高度なロボット。**Automation Anywhere RPAプラットフォームの頭脳に当たる部分で、電子化された帳票などの紙情報の構造やデータの認知機能を持っています。RPAからアクションのひとつとして呼び出されます。

[IQ Botとは](https://autodojo.hatenablog.com/entry/IQBot)
特定パスのファイルをまとめて require するワンライナー

### 1. はじめに

はじめに結論！

```ruby
Dir.glob(Rails.root.join('lib', 'tasks', 'module', '*')).each(&method(:require))
```

### 2. そもそも

`Array#map` などに、ブロックではなく、 `&:メソッド名` を渡すショートハンドは、Ruby に慣れた方なら割と使っているかもしれません

```ruby:こういうやつ
irb(main):001:0> [1, 2, 3].map(&:to_s)
=> ["1", "2", "3"]
```

ところで、この配列の要素を、レシーバー側ではなく、引数側に取りたい場合は、 `#method` メソッドを用いて以下のような書き方ができます

```ruby:こんな感じ
irb(main):002:0> [1, 2, 3].map(&2.method(:eql?))
=> [false, true, false]
```

ただこの書き方は、ややテクニカル過ぎてかえってコードが読みづらくなるため、あまり使うことはないだろうと思っていました

### 3. 何があったのか

ところが、仕事が4つも5つもある、妙に多機能な rake task スクリプトを書かされる悲しい事件が起きたとき :sob: 、スクリプトを短く保つために機能ごとに module を分割することにしたのですが、module が増えるたびに rake ファイルに require 行を増やすのが美しくなかったため、読み込みを自動化できるようワンライナーで書いたのが冒頭のコードとなります

### 4. まとめ

`#require` ならレシーバーも省略できてややスッキリ書けますし、記述するのはファイルの冒頭なので、お決まりの書き方的な感じで、他のコーダーにも受け入れてもらいやすいかもしれません :upside_down: 

みなさんもぜひ使ってみてくださいね :heart: 


これらのショートハンドが動作する仕組みについては、以下の記事が詳しいです
**参考：** [&演算子と、procと、Object#method について理解しなおす](https://qiita.com/kasei-san/items/0392097791d3a5998216)
Blazor(WebAssembly)過渡期の現在


今、Blazor WebAssemblyを使う方法について軽くまとめておきます。情報ソースはこちらです。
https://docs.microsoft.com/ja-jp/aspnet/core/blazor/hosting-models?view=aspnetcore-3.1

* .NET Core 3.1 SDK(最新版でOK)
* 正式版リリースまでは以下のコマンドでテンプレートをインストールします。

```
dotnet new -i Microsoft.AspNetCore.Blazor.Templates::3.2.0-preview1.20073.1
```
5月の正式リリース以降はあんまりごちゃごちゃ書かないでも良いようになるはずです。

さて、新しいプロジェクトを作る場合、以下のようにします。

クライアント側だけで動くものを作る場合

```
dotnet new blazorwasm
```
ホストとかなり通信したい場合(--hosted オプションを使う)

```
dotnet new blazorwasm --hosted
```
Client/Server/Sharedが区別されたプロジェクトを作るにはこちらを使う必要があります。
Next.jsの動的ページ遷移を高速化する為のサンプル

#Linkコンポーネントを使う

遅いサンプル

```
        <button
          onClick={() => router.push(`/sample/${id}/edit`)}
        >
          Edit
        </button>
```

速いサンプル

```
        <Link href="/sample/[id]/edit" as={`/sample/${id}/edit`}>
          <button className="btn btn-warning btn-lg" href="#" role="button">
            Edit
          </button>
        </Link>
```

#Router.pushで第二引数まで書く

遅いサンプル

```
    updateSample(sample).then(updatedSample => {
      Router.push(`/sample/${sample.id}`);
    });

```

速いサンプル

```
    updateSample(sample).then(updatedSample => {
      Router.push("/sample/[id]", `/sample/${sample.id}`);
    });
```
(自分用)debounceとthrottleをasync/awaitでシンプルに作成してみたサンプル

**※自分で試してみた感じでは良さそうだったのですが、おかしい部分があるかもしれません、その時は教えていただければありがたいです。**

追記
throttle修正しました、間違えていたら教えてくだい。

```js
function debounce(callback, wait) {
  let lastRunTimestamp;
  return async () => {
    lastRunTimestamp = Date.now();

    await new Promise(resolve => setTimeout(resolve, wait));

    if (Date.now() - lastRunTimestamp >= wait) {
      callback();
    }
  };
}

function throttle(callback, wait) {
  let firstCallFlg = true;
  let runFlg = false;
  return async () => {
    runFlg = true;
    if (firstCallFlg) firstCallFlg = false;
    else return;

    do {
      callback();
      runFlg = false;
      await new Promise(resolve => setTimeout(resolve, wait));
    } while (runFlg);
    firstCallFlg = true;
  };
}
```

<p class="codepen" data-height="451" data-theme-id="light" data-default-tab="js,result" data-user="okumurakengo" data-slug-hash="MWwooyj" style="height: 451px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="MWwooyj">
  <span>See the Pen <a href="https://codepen.io/okumurakengo/pen/MWwooyj">
  MWwooyj</a> by 奥村健吾 (<a href="https://codepen.io/okumurakengo">@okumurakengo</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>
趣味でプログラミングする人がRustを勉強する

#個人的Rustまとめ
Rustで勉強したことをアウトプットする場所です。Rustを書いてる人ってレベル高い人が多いので説明が難しいです。もちろんRust自体も難しいです。なので、自分に分かるような解説をここに書いていきます。

~~筆者のレベルはC言語でブラックジャックとかを作れる程度です。~~
レベルアップしました。~~今はFXのバックテストを高速に実行するプログラムを作ってます。~~出来たけどテスト結果の正しさを保証できなくてお蔵入りになりました。


順次追記していきます。
##目次
###情報源
具体的な順に

- [実践Rust入門](https://www.amazon.co.jp/%E5%AE%9F%E8%B7%B5Rust%E5%85%A5%E9%96%80-%E8%A8%80%E8%AA%9E%E4%BB%95%E6%A7%98%E3%81%8B%E3%82%89%E9%96%8B%E7%99%BA%E6%89%8B%E6%B3%95%E3%81%BE%E3%81%A7-%CE%BAeen-ebook/dp/B07QVQ7RDG)
これを一通りなぞることでRustの全体像がつかめるはず。

- [The Rust Programming Language](https://doc.rust-jp.rs/book/second-edition/)
Rustの教科書的な感じ。ここを見ればRustの仕様がわかる。

- [Rust by Example日本語版](https://doc.rust-jp.rs/rust-by-example-ja/)
サンプルコード集。こっちのほうがとっつきやすい。
このページではサンプルコードを走らせることが出来ます。さらに編集もできます。
1から書くより既存のコードを書き換えて結果を観察するほうが効率的です。

- Qiita
当然Qiitaも見ます。

- 何かあったらGoogle検索
まずはこれ。

###開発環境
- windows10  
 私はwindows10のノートPCを使っています。
- lubuntu18.04  
VirtualBox上のlinuxでも動かしてみました。rustupとvscodeのインストールさえ終わればwindowsとの違いは感じません。  
ubuntuでも動きましたが重すぎたためlubuntuにしました。
- [rust playground](https://play.rust-lang.org/)  
Rustのコードを書いたらすぐ動きます。短いコードはここで作れます。Rustコンパイラすらいりません。  
→環境構築してからは全く使わなくなりました。
- rustup  
Rustをインストールしてくれるものです。バージョン管理などの機能もあるらしいです。  
 - rustc  
rustのコンパイラです。  
操作するのは後述のCargoのため、コンパイラはバージョンさえ知っていれば大丈夫だと思います。
 - Cargo  
Rustのコンパイルとかライブラリの管理とかいろいろできるらしいけどよくわかってません。   
最低限、プログラムを書いて実行するのに必要な知識をまとめました。→[cargoの使い方](https://qiita.com/tonesuke/items/d393195f1fd346c8023d)
- visual studio code  
略してvscodeと書きます。テキストエディタですが、プログラミングに特化しています。かといって、IDE（統合開発環境）というわけでもありません。拡張機能をダウンロードすることで様々なプログラミング言語に対応可能なIDEの骨格みたいなものだと思っています。  
Rustを書くのに最も多く使用されているエディタはvscodeらしいです。
 - rust-analyzer  
rustのコーディングを支援するvscodeの拡張機能です。高機能かつ軽快に動作します。
vscodeの拡張機能として簡単にダウンロードできます。


###コードの書き方など
・[最初のRustプログラム](https://qiita.com/tonesuke/items/74cfaf7c7effbd67424b)
・[画面に文字を表示する](https://qiita.com/tonesuke/items/4ab3d92e107bcd2b4a76)
・[ユーザーからの入力を受け取る](https://qiita.com/tonesuke/items/cd73f1d9244b3c31d4d6)
・[Rustのデータ型](https://qiita.com/tonesuke/items/733fdb2fa96a6f8374f8)
・[Rustの複合データ型](https://qiita.com/tonesuke/items/a4142c6ae7e7c55739ae)
・[列挙型とmatch](https://qiita.com/tonesuke/items/adfdb2b0e17780671ccb)
・[変数](https://qiita.com/tonesuke/items/9152343c81144ab0214d)
・[計算する](https://qiita.com/tonesuke/items/fb868d7624695a16e94b)
・[繰り返し](https://qiita.com/tonesuke/items/8a9201fcef44b7b1680e)
・[関数](https://qiita.com/tonesuke/items/a2ee1f26de771bd790f6)
・[所有権・ムーブ・借用・参照](https://qiita.com/tonesuke/items/9db8eb095a77977a85ec)
・[メソッド](https://qiita.com/tonesuke/items/bc27630b105939c2774f)
・[トレイト](https://qiita.com/tonesuke/items/743244f398186f174de4)
・[イテレータ](https://qiita.com/tonesuke/items/2dfbce6df56edace0078)

###stdライブラリ
・[Vec（可変長の配列）](https://qiita.com/tonesuke/items/d0d08c3cbf48a3151804)
ubuntuにユーザを追加後root権限を与え、パスワード認証方式から公開鍵認証方式に変更する手順

# 背景
現在、パスワード認証となった状態のubuntuサーバを、公開鍵認証方式に切り替える事で、セキュリティレベルを高める。

- ここではtest1というアカウントを追加する手順について説明する。適宜、test1を読み替えてください。
- Ubuntu 18.04.3 LTS (GNU/Linux 5.0.0-1032-azure x86_64)
- クライアントPCはMacBook Air。
- sshはport22番

## 1. アカウントの追加
（参考：https://qiita.com/white_aspara25/items/c1b9d02310b4731bfbaa）

/home以下にディレクトリを作ってくれる。このコマンドを入力するだけで一般ユーザの追加に成功する。

```
adduser test1
```

root権限を付与する。

```
gpasswd -a test1 sudo
```

## 2. ssh鍵を作る

クライアントPCで鍵を作成する。test1、test1.pubという二つのファイルが作られる。前者が秘密鍵で、後者が公開鍵。ssh-keygenコマンドの詳細な仕様については、一番最後にリンクを貼ったので他のドキュメントに委ねたい。

```
ssh-keygen -t rsa -b 2048 -f test1
```

- デフォルトのままで鍵を作ると、複数の鍵を作りたい時に不便なので「-fオプション」を指定して、それぞれのアカウントに対応して、鍵の名称を指定して作り分けた方が良いと思う。
- 作成した鍵は、~/.ssh/配下に格納するのが習わし。

## 3. ubuntuサーバに鍵を送る
公開鍵はサーバ上に見える形で仕込む。秘密鍵は認証する際に指定するものとなり、置き場所等は隠し持つ形となる。
ubutunサーバに対して、以下のコマンドで公開鍵を送る。

```
scp ./test1.pub test1@<ubuntuサーバのIPアドレス>:~/.ssh/authorized_keys
```

- authorized_keysは公開鍵を記述するためのファイル。下記で述べる設定ファイルで指定されるので自由に変更できるかとは思うが、誤解や混乱を生まない為にも、変更せずこのまま使う形が良いと思う。
- 複数の公開鍵を設定する場合は、ここに追記していく形となる。


## 4. 権限を整える

ubuntuサーバにtest1ユーザでログインして、以下のコマンドを実行する。

```
chmod go-w ~
chmod go-w ~/.ssh
chmod go-w ~/.ssh/authorized_keys
```

- 上記の３つのディレクトリやファイルは、sshdが求める、アクセス権限の条件をクリアするように設定する必要がある。条件をクリアせず権限が正しく無いと、sshdが公開鍵認証方式の対象として有効に扱わない。つまりここで指定した公開鍵は無視されて、最悪二度とログインできなくなる。

## 5.設定の変更

以下のように設定ファイルを書き換える。

- PasswordAuthenticationをnoにする事で、パスワード認証が行われなくなる。
- PubkeyAuthenticationをyesにする事で、公開鍵認証方式で接続が可能となる。

```sh:/etc/ssh/sshd_config
PasswordAuthentication no
PubkeyAuthentication yes
```
AuthorizedKeysFileはコメントを外し、以下のようにする。
**※ここの設定に気がつかず、少しハマった**

```sh:/etc/ssh/sshd_config
AuthorizedKeysFile      .ssh/authorized_keys 
```

## 6.sshdのリスタート

### 注意点！
ここで、とても大切な事がある。動作確認を終えるまで、サーバ側にログインしたターミナルからログアウトしないで欲しい。というのは、設定に失敗していて（例えばフォルダのアクセス権限が強すぎていて、sshdに公開鍵を無視された場合）、公開鍵認証方式でログインできない状態となってしまったのにもかかわらず、ログアウトしてしまうと、**二度とログインできないサーバになってしまう！**　

これからお知らせするコマンドを入力したのにもかかわらず、何をやってもこんな風にエラーを出力する場合は、

```
lhormace@xxx.xxx.xxx.xxx: Permission denied (publickey).
```

迷わず「5.設定の変更」の設定を、変更する前に戻した上で、sshdを再起動して欲しい。特に本番運用中のサーバでこれをやってしまうと、取り返しのつかない大事故になるから要注意。（できれば設定ファイルは作業の前にバックアップを取っておく方が良い）

気を取り直して、
上記の「**注意点**」をよく読んだら、設定の変更内容は以下のリスタートコマンドで反映する。

```
sudo /etc/init.d/ssh restart
```

## 7.動作確認
以下で無事ログインに成功すれば、作業完了。

```
ssh -i ~/.ssh/test1 test1@<ubuntuサーバのIPアドレス>
```

## まとめ
ネット上を検索しながら、新規アカウントの追加と公開鍵認証方式への変更を進めたが、思わぬところでハマったりした（書いてない）ので、同じ落とし穴に二度とハマらない為に作成しました。

## 参考にしリンク
参考：https://qiita.com/mukoya/items/f20def019e25dc162ca8
参考：https://qiita.com/white_aspara25/items/c1b9d02310b4731bfbaa
参考：https://webkaru.net/linux/ssh-keygen-command/
参考：https://blog.neoflow.jp/oss/openssh/2816/
参考：https://orebibou.com/2014/10/ssh%E3%82%B5%E3%83%BC%E3%83%90sshd%E5%86%8D%E8%B5%B7%E5%8B%95%E3%81%AE%E6%96%B9%E6%B3%95%EF%BC%88os%E5%88%A5%EF%BC%89/
参考：https://qiita.com/kazokmr/items/754169cfa996b24fcbf5
Rails5 特定のページに特定のscssを読み込ませる

# application.scssのrequire_tree . を削除
```ruby
require_tree .
```
これはassests/stylesheets以下の全てのcss,scssを読み込むという設定です。
これを削除しちゃいましょう。
# config/initializers/assets.rbのコメントアウトを解除
一番下の行の

```ruby
# Rails.application.config.assets.precompile += %w( admin.js admin.css )
```
このコメントアウトを解除し、

```ruby
Rails.application.config.assets.precompile += %w( top.scss )
```
を記入します。

# 任意のhtml.erbファイルの最初にlink_tagを追加

```ruby:top.html.erb
<%= stylesheet_link_tag 'top' %>
```

書いてみましたが、かなり強引な気がする。。。
もっといいやり方を知っている方、ご教示していただければ幸いです。。

読んでくださりありがとうございました！
Unity 2019.3 と Oculus Integration で発生するメッシュの謎の点滅現象を解消する

なぜ起こっているのか切り分けまでできなかったので、タイトルは釣りの可能性があります m(_ _)m

# 点滅現象
なぜこうなるのか、何が原因でこうなるのかわかりませんが、あるメッシュが点滅するかのように、見え隠れします。
![点滅.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506075/c15be93a-fa62-9011-8f74-ddf32b1bf5ea.gif)

# とりあえずの解消方法
Plyaer Settings → Player → Others Settings の Compute Skinning(２０１8の頃は GPU Skinning という項目だった) の設定をオフにします。
![Build_Settings_と_Donuts_-_HandTracking_-_Android_-_Unity_2019_3_0f6_Personal__Personal___Metal_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506075/63e7b828-469c-4b53-9604-0ed842d8f78e.png)

# 補足
* Unity2019.3 + Oculus Integration で構築したからと言って 100% 起こる問題ではない
    * 新規プロジェクトでやってみたが、同じ現象に出くわさなかった
* SkinnedMeshRenderer だからと言って問題になるわけではない。
    * Unity-chan の顔も同じメッシュ
* 参考に記載した記事との関連を考えると、Android ビルドと関係があるのかも
    * 両眼用のカメラを配置している方が怪しい気もする。謎。

# 参考
[Daydream＋Unity で激しい点滅やらポリゴンメッシュ崩壊やら起こる件](https://ch.nicovideo.jp/tenoji/blomaga/ar1745105)
Ruby/GTK3 - 表示するだけのTreeView

`gem install gtk3`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144608/a6ffd6f4-4886-da08-ef9a-45dfb9ca6be8.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144608/7da730e0-ff6e-c456-d97d-d7007fc2794f.png)


なるべくシンプルにしてみたらこんな感じになった。
改良の余地があるはず。

```ruby
require 'gtk3'
require 'csv'
require 'open-uri'

url = "https://raw.githubusercontent.com/pandas-dev/pandas/master/pandas/tests/data/iris.csv"
iris = CSV.parse(URI.open(url))

ls = Gtk::ListStore.new(*([String] * 5))
mf = ls.create_filter

treeview = Gtk::TreeView.new(mf)
iris.shift.each_with_index do |header, i|
  column = Gtk::TreeViewColumn.new(header, Gtk::CellRendererText.new, text: i)
  treeview.append_column(column)
end

iris.each do |val|
  iter = ls.append
  iter.values = val
end

win = Gtk::Window.new
win.title = 'Gtk::TreeModelFilter sample'
win.set_size_request 500, 400

sw = Gtk::ScrolledWindow.new
sw.add_with_viewport(treeview)

win.add sw
win.signal_connect('destroy') { Gtk.main_quit }
win.show_all
Gtk.main
```
【Udemy Python3入門+応用】　16.リスト型

**※この記事はUdemyの
「[現役シリコンバレーエンジニアが教えるPython3入門+応用+アメリカのシリコンバレー流コードスタイル](https://www.udemy.com/course/python-beginner/ "現役シリコンバレーエンジニアが教えるPython3入門+応用+アメリカのシリコンバレー流コードスタイル")」
の講座を受講した上での、自分用の授業ノートです。
講師の[酒井潤](https://twitter.com/sakaijun "酒井潤")さんから許可をいただいた上で公開しています。**

##■リスト型
#####◆リストの使い方
```
>>> l = [1, 20, 4, 50, 2, 17, 80]

>>> type(l)
<class 'list'>
```
このように、リストを使うことができる。

```
>>> l
[1, 20, 4, 50, 2, 17, 80]
>>> l[0]
1
>>> l[1]
20
>>> l[-1]
80
>>> l[0:2]
[1, 20]
>>> l[:2]
[1, 20]
>>> l[2:]
[4, 50, 2, 17, 80]
>>> l[:]
[1, 20, 4, 50, 2, 17, 80]
```
リストに対しては、インデックスやスライスも使える。

<br>

##■リストに`len()`を使う
```
>>> len(l)
7
```
リストに対して`len()`を用いると、リストに含まれるデータの個数が返る。

<br>

##■文字列をリストに変換する
```
>>> letters = list('abcdefg')
>>> letters
['a', 'b', 'c', 'd', 'e', 'f', 'g']
```
あまり使いみちはないらしいが…

<br>

##■リストからの抽出
#####◆1つとばしで抽出する
```
>>> n = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> n[::2]
[1, 3, 5, 7, 9]
```
`[::2]`とすることで、1つとばしに抽出できる。

#####◆反対順にする
```
>>> n[::-1]
[10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
```
`[::-1]`とすることで、並び順を逆にして出力することができる。

<br>

##■リストの中にリストを入れる
#####◆リストの中にリストを入れる
```
>>> a = ['a', 'b', 'c']
>>> n = [1, 2, 3]
>>> x = [a, n]
>>> x
[['a', 'b', 'c'], [1, 2, 3]]
```

#####◆インデックスはどうなる？
```
>>> x[0]
['a', 'b', 'c']
>>> x[1]
[1, 2, 3]
```
この状態では、含まれているリストにインデックスがふられる。


#####◆要素になっているリストの中でのインデックス
```
>>> x[0][1]
'b'
```
`[0][1]`とすることにより、`[0]`の中での`[1]`を指定できる。