OmniAICreator/Qiita-1.07M huggingface dataset:
連想配列のindexを取得

## 個人的メモ
Reactをやっていて、ある連想配列の中のindexを取得したかった

```javascript
//classコンポーネントで定義
    this.state = {     
      questions: []
    };
```

```javascript
question() {
    const { questions } = this.state;
    // オブジェクト作成
    const q = {
      id: '',
      name: "",
      color: ""
    };
    //ついでに配列に色の文字列を突っ込んで
    const colorArray = ['red','blue','yellow','pink','black','orange','']

    //連想配列のインデックスを取得
    let qindex = Object.keys(questions).length + 1

    //ここでそのオブジェクトにアクセスをしてオブジェクトを更新
    q.id = qindex
    q.color = colorArray[qindex]

    //setStateで更新
    this.setState({
      //配列のマージ
      questions: [...questions, q]
    })
  }

```

`let qindex = Object.keys(questions).length + 1`を使って取得

もう少しうまく関数にしてテストできやすくすることが目標

とはいえ、一旦できたのでメモとして記載
Rails、Deviseの日本語化

#はじめに
日本語のアプリケーションを作成するため、利用する言語を日本語に設定したので、その手順をメモします。
Deviseを導入しているので、その日本語化の手順も併せてメモします。

#手順
###Railsの日本語化
Webアプリケーションの多言語化をサポートするgem「I18n」はRuby on Rails 2.2以降からRailsに同梱されています。（[Rails国際化 (I18n) API](https://railsguides.jp/i18n.html)）
####1.デフォルト言語を日本語に設定する
```ruby:config/application.rb
require_relative 'boot'

require 'rails/all'

module TripApp
  class Application < Rails::Application
    # Initialize configuration defaults for originally generated Rails version.
    config.load_defaults 5.2

    # 以下の行を追加する
    config.i18n.default_locale = :ja

    # Settings in config/environments/* take precedence over those specified here.
    # Application configuration can go into files in config/initializers
    # -- all .rb files in that directory are automatically loaded after loading
    # the framework and any gems in your application.
  end
end
```

####2.日本語の辞書ファイルをダウンロード
[svenfuchs/rails-i18n](https://github.com/svenfuchs/rails-i18n/blob/master/rails/locale/ja.yml)にある日本語の辞書ファイルを以下コマンドでダウンロードします。

```
$ curl -s https://raw.githubusercontent.com/svenfuchs/rails-i18n/master/rails/locale/ja.yml -o config/loc
ales/ja.yml
```
###Deviseの日本語化
[Junsuke/miscellaneous](https://github.com/Junsuke/miscellaneous/blob/master/devise.ja.yml)(GitHub)にDeviseの日本語訳ファイルがありますが、今回は[rails devise 日本語化](https://qiita.com/MasatoYoshioka@github/items/8d910e793e7c485403bb)にある日本語訳を使わせていただくことにしました。
config/locales/devise.ja.ymlを作成し、貼り付けます。

###参考サイト
・https://qiita.com/shi-ma-da/items/7e5c3d75c9a9f51abdd5
・https://morizyun.github.io/ruby/rails-function-i18n-internationalization.html
Mojaveに変えたらpyenvが動かない件

#pythonがインストールできなくなる
エラー出力はこちら

```
ERROR: The Python zlib extension was not compiled. Missing the zlib?

Please consult to the Wiki page to fix the problem.
https://github.com/pyenv/pyenv/wiki/Common-build-problems


BUILD FAILED (OS X 10.14.3 using python-build 20180424)

Inspect or clean up the working tree at /var/folders/fr/qy69l3wd6_xb039pl10g51w00000gp/T/python-build.20190219174615.74533
Results logged to /var/folders/fr/qy69l3wd6_xb039pl10g51w00000gp/T/python-build.20190219174615.74533.log

Last 10 log lines:
rm -f /Users/naoya.ohsaki/.pyenv/versions/2.7.15/share/man/man1/python.1
(cd /Users/naoya.ohsaki/.pyenv/versions/2.7.15/share/man/man1; ln -s python2.1 python.1)
if test "xno" != "xno"  ; then \
		case no in \
			upgrade) ensurepip="--upgrade" ;; \
			install|*) ensurepip="" ;; \
		esac; \
		 ./python.exe -E -m ensurepip \
			$ensurepip --root=/ ; \
	fi
```

サイトを色々眺めてみましたが、xcodeを入れる、pyenvをアンスコして入れ直す、中にはインストールするpythonのパッケージのパスを書いてるものまでありましたが、それってパッケージ管理ツール使う意味ないんじゃないのではなかろうか？と思いつつ悩んでいました。
しかもどれも直らない・・・

でもエラー文によく見ると普通に書いてある。

```
Please consult to the Wiki page to fix the problem.
https://github.com/pyenv/pyenv/wiki/Common-build-problems
```

というわけで、このwikiに飛んで見ると答えがありました。

```
$ brew install readline xz

# installer -pkg /Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg -target /
```

これでインストールできるようになります。
エラーをよく見ようという教訓としてここに記します。

## 特に目立ったエラーメッセージを発見できなかった時の推定される事象と解決法
特に決まったエラーメッセージもなくビルドできない場合、下記のコマンドを使うといいです。会社macはエラー見て直せたのですが個人macではエラー文がこれといって特徴なかったので、こいつを使ったらインストールできました。

こちらは、installする際にopensslが無いから無理だよってなっている時に出てくるエラーですね。gemのmysql2でこんなエラーに当たっている人を見たことがあります。それですね。もしかしたらopensslが入ってなくてできてない可能性があります。

```
$ CFLAGS=-I/usr/include/openssl LDFLAGS=-L/usr/lib pyenv install -v installしたいバージョン名
```
Angular-toggle-switchでデフォルトの値を変える方法

input要素などのように`ng-true-value`や`ng-false-value`でデフォルトの値を変えることはできないみたいです[^1]。

どうしても使いたい場合は、angular-toggle-switchをラップしたディレクティブを作成する必要があります。

[^1]: https://github.com/cgarvis/angular-toggle-switch/issues/76
graphql,vue,rails

# graphql ruby
https://graphql-ruby.org/getting_started

## Query
### define
```
 16     field :area, AreaType, null: true do
 17       description 'Find Area by id'
 18       argument :id, ID, required: true
 19     end
 20
 21     field :all_areas, [AreaType], null: false do
 22       description "Areas all"
 23     end
 24
 25     def area(id:)
 26       Area.find(id)
 27     end
 28
 29     def all_areas
 30       Area.all
 31     end
```
### query
```
{
  testField
  area(id: 1) {
    id
    name
  }
  allAreas {
    id
    name
  }
}
{
  area(id: 1) {
    id
    name
  }
  allAreas {
    id
    name
  }
}

```
### result
```
{
  "data": {
    "area": {
      "id": "1",
      "name": "札幌駅周辺"
    },
    "allAreas": [
      {
        "id": "4",
        "name": "山鼻西線沿線"
      },
      {
        "id": "72",
        "name": "むつ市"
      },
      {
        "id": "125",
        "name": "男鹿半島"
      },
      {
        "id": "126",
        "name": "仙北・田沢湖"
      },
```

## Mutation



https://qiita.com/sakupa80/items/e65f1ecc513306edf9e9
https://graphql-ruby.org/guides#graphql-pro-operationstore-guides
https://github.com/gitlabhq/gitlabhq

## ime, compositionend, keyupでのincremental search
https://github.com/vuejs/vue/issues/8231
CentOS 7.6でDocker 18.09.2をインストールしたがhello-worldが表示されなかった

# はじめに

CentOSにdockerをインストールしてhello-worldをrunしたけど、**Hello for Docker!**が表示されなかった現象の対応内容

## 環境

- CentOS 7.6
- Docker 18.09.2
   - contanerd.io 1.2.2-3.3.el7
   - docker-ce 3:18.09.2-3.el7
   - docker-ce-cli 1:18.09.2-3.el7

## 現象

[Get Docker CE for CentOS](https://docs.docker.com/install/linux/docker-ce/centos/#install-using-the-convenience-script)にかかれているとおり、
- Uninstall old versions
- Install Docker CE
   - Install using the repository
     - SET UP THE REPOSITORY
     - INSTALL DOCKER CEの1でlatestversionをインストールし、`sudo systemctl start docker`でdockerを起動して、`sudo docker run hello-world`でHello for Docker!が表示されるのを待っていたが、

いつまでたっても

```
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
1b930d010525: Pull complete
Digest: sha256:2557e3c07ed1e38f26e389462d03ed943586f744621577a99efb77324b0fe535
Status: Downloaded newer image for hello-world:latest
```
のままHello for Docker!が起動しない。

firewalldがdockerと競合するとか言う記事も見たので、`systemctl stop firewalld`して`docker run hello-world`したが結果は変わらず。

`docker ps -a`とすると、Createdで止まっている。

```
# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS              PORTS              NAMES
e9c767fe103c        hello-world         "/hello"            About a minute ago   Created                                recursing_mclaren
```

dockerを停止すると、docker run hello-worldがキャンセルされ、以下のようなメッセージが表示される。startしたままになっているのだろう。

```
docker: error during connect: Post http://%2Fvar%2Frun%2Fdocker.sock/v1.39/containers/e9c767fe103cb4287503e22d8720f95f6197110deec89e7c774691617a91ee9d/start: EOF.
```

## 対応

dockerのバージョンが18.09だが、それにする必要もなかったので、18.06にした。

[Get Docker CE for CentOS](https://docs.docker.com/install/linux/docker-ce/centos/#install-using-the-convenience-script)のUninstall Dockerで、`sudo yum remote docker-ce containerd docker-ce-cli`で、アンインストールして、`rm -fr /var/lib/docker`でファイルを全部削除した。
その後Install using the repositoryのINSTALL DOCKER CEのステップ2に沿って、バージョンを確認した。
18.09の前のバージョンとして、18.06.2があったので、`sudo yum install docker-ce-18.06.2.ce conatinerd.io`でインストールした。containerd.ioが必要か不明。

で、`systemctl start docker`して、`docker run hello-world`したら、Hello for Docker!が表示された。

## まとめ

なぜ動かなかったかの理由は不明。
18.09でdockerが動作しなかったらダウングレードしよう。
Google Spreadsheet APIのメモ

gspread.exceptions.APIError: {
 "error": {
  "errors": [
   {
    "domain": "global",
    "reason": "insufficientPermissions",
    "message": "Insufficient Permission: Request had insufficient authentication scopes."
   }
  ],
  "code": 403,
  "message": "Insufficient Permission: Request had insufficient authentication scopes."

スコープがだめらしい。
https://github.com/burnash/gspread/issues/513

scope = ['https://www.googleapis.com/auth/spreadsheets','https://www.googleapis.com/auth/drive']

でＯＫ
ありがとう
【GitHub】ブランチ作成からマージまでの一連の流れ

GitHubで`master`ではなく、違うブランチで作業をすることが一般的です。
その際に別のブランチで作成したファイルなどを、`master`にマージ（結合）する必要があります。
その流れをまとめてみました。

# はじめに
- ブランチは`master`のみ
- 新規で作成したブランチで作業をしたい
- 自分がレポジトリ管理者で、マージまで行う

このような条件でブランチ作成からマージまで行いたいと思います。

# ブランチを作る & 作業をする
現在のブランチが`master`であることを確認。

```
$ git branch
* master
```
<br/>
`master`になっていることを確認したら下記のコードを入力して、新規ブランチを作成する。

```
git checkout -b <任意のブランチ名>
```
例えばブランチ名を`chapter01`にした場合は下記のように表示される。

```
$ git branch
* chapter01
  master
```

# GitHubにプッシュする
作業が完了したら、GitHubにプッシュをする。

```GitからGitHubにプッシュする一連の流れ.
$ git status # どのファイルを変更したか確認
$ git diff　# 前回のコミットと、今回変更したファイルの差分を抽出

# ファイルを全てコミットする場合
$ git add .

# ファイルを指定してコミットする場合
$ git add ファイル名　# 例）　git add messages_controller.rb

$ git commit -m "任意コメント"

# GitHubへ反映
$ git push origin BRANCH_NAME　 # 例） git push origin chapter01
```

#GitHub上でプルリクを作成する
プルリクエストの作成は、GitHub上で行います。
<br/>
### ①`Compare & pull request`のボタンを押します。
<img width="1009" alt="01.png" src="https://qiita-image-store.s3.amazonaws.com/0/32413/fc28ec1d-a56c-4732-aede-bc9483da936b.png">

<br/>
### ②変更内容をコメントで記載して、`Create Pull Request`を押します。
<img width="716" alt="02.png" src="https://qiita-image-store.s3.amazonaws.com/0/32413/edf521bf-ade7-b567-3a18-8e373ecb73f5.png">
<br/>
### ③どのブランチから、どのブランチへ`Pull Request`するのかを確認します。
今回は、`chapter1_sub`から`master`へプルリクエストしています。
<img width="997" alt="03.png" src="https://qiita-image-store.s3.amazonaws.com/0/32413/a6605f7a-7401-a9cf-f69e-48d8f809c41b.png">
<br/>
### ④`Code`のページへ戻り、ブランチが`master`になっているか確認します。
<img width="402" alt="05.png" src="https://qiita-image-store.s3.amazonaws.com/0/32413/667fd3f2-9b08-9ad4-3c1b-b4c3831cc84f.png">
<br/>
### ⑤`Pull rquests`へ戻り、`Merge pull request`をクリックします。
<img width="784" alt="05.png" src="https://qiita-image-store.s3.amazonaws.com/0/32413/f12fd719-4121-0f02-5068-ee7ab08c2302.png">
<br/>
### ⑥コメントを記入して、`Confirm merge`をクリックしたらマージが完了。
<img width="785" alt="06.png" src="https://qiita-image-store.s3.amazonaws.com/0/32413/bc1fe3bf-1be2-e873-b03b-f5e0ff36c5fd.png">
<br/>
### ⑦変更前と変更後
変更前
<img width="989" alt="07.png" src="https://qiita-image-store.s3.amazonaws.com/0/32413/a4a5c813-8382-5be5-0d97-1d3e795bb2ac.png">

変更後
<img width="991" alt="08.png" src="https://qiita-image-store.s3.amazonaws.com/0/32413/d4c6d106-c1c2-b1a8-6156-e96f45d34402.png">

# ローカルリポジトリのブランチを`master`に切り替えて、リモートリポジトリからPullする

```
$ git checkout master
```
```
$ git pull
```

これをすることで、マージしたリモートリポジトリの変更を、ローカルリポジトリに反映することができました。

以上がブランチ作成から、マージまでの一連の流れになります。
QuantXで移動平均線のアルゴリズムをとりあえず書く

#自己紹介
5ヶ月ほど前から趣味でPythonを触っている、プログラミング初心者です。
そんな初心者の僕がSmartTrade社でインターンをさせていただくことになったので、プログラミングも投資も分からなくても理解出来るように、学んだ内容を随時更新していきたいと思います。
#この記事について
QuantXでアルゴリズムを書き始めた人でもすぐに移動平均線のアルゴリズムを書くことができるように、コードのどこをいじればアルゴリズムが作れるかの記事を書いてみました。
##使用するデータを指定する部分

```python
def initialize(ctx):
    ctx.configure(
      target="jp.stock.daily",
      channels={"jp.stock": {
                "symbols": ["使用したい銘柄"],
                "columns": ["close_price_adj"]}})
```
この部分では<b>"使用したい銘柄"</b>と<b>"シグナルを計算するために必要なデータ種"</b>の部分に自分の好きなようにデータを入れてみてください。例えばトヨタ自動車と日産自動車の終値を使用したい場合は

```python
"symbols": ["jp.stock.7203","jp.stock.7201"],
```
とします

##シグナルを生成する部分

```python
    def _mavg_signal(data):

        def _mavg_signal(data):
        m25 = data["close_price_adj"].fillna(method='ffill').rolling(window=25, center=False).mean()
        m75 = data["close_price_adj"].fillna(method='ffill').rolling(window=75, center=False).mean()

        #売りシグナル、買いシグナルのルールを決める
        ratio = m25 / m75
        buy_sig = ratio[(ratio > 1.02) & (ratio < 1.05)]
        sell_sig = ratio[ratio < 0.95]
        
        return {
            "mavg_25:price": m25,
            "mavg_75:price": m75,
            "buy:sig": buy_sig,
            "sell:sig": sell_sig,
        }

        # シグナル登録
        ctx.regist_signal("mavg_signal", _mavg_signal)
```
この部分では<b>ratio=m25/m75</b>の値がどうなった時に売りシグナル、または買いシグナルを出すかを自分で決めて値を変更してみてください。例えば上の例では<b>ratio<0.95</b>つまり<b>m25<0.95×m75</b>の時に売りシグナルを出すようなルールになっています。

##実際に売買のルールを指定する部分

```python
def handle_signals(ctx, date, current):
    done_syms = set([])
    for (sym,val) in ctx.portfolio.positions.items():
        returns = val["returns"]
        if returns < -0.03:
          sec = ctx.getSecurity(sym)
          sec.order(-val["amount"], comment="損切り(%f)" % returns)
          done_syms.add(sym)
        elif returns > 0.05:
          sec = ctx.getSecurity(sym)
          sec.order(-val["amount"], comment="利益確定売(%f)" % returns)
          done_syms.add(sym)


    buy = current["buy:sig"].dropna()
    for (sym,val) in buy.items():
        if sym in done_syms:
          continue
        
        sec = ctx.getSecurity(sym)
        sec.order(sec.unit() * 1, comment="SIGNAL BUY")
        pass

    sell = current["sell:sig"].dropna()
    for (sym,val) in sell.items():
        if sym in done_syms:
          continue

        sec = ctx.getSecurity(sym)
        sec.order(sec.unit() * -1, comment="SIGNAL SELL")
        pass
```
ここは一見複雑に見えますが、自分で変更すればいいのは
<b>1.どのような時に利益確定売・損切りをするか</b>
<b>2.どれだけ売る・買うか</b>
だけです。
<b>1.どのような時に利益確定売・損切りをするか</b>
例えば上のコードでは<b>if returns<-0.03</b>(利益が-0.03未満)なら損切り、<b>elif returns > 0.05</b>(利益が0.05より大きい)なら利益確定売りと指定しています。
<b>2.どれだけ売る・買うか</b>
どれだけ売買するかは<b>sec.order()</b>の中の第一引数で指定できます。<b>sec.order("どれだけ売買するか", comment="コメント")</b>という形になっています。


#最後に
以上で簡単に自分だけの移動平均線のアルゴリズムを書くことができました。(多分)
コードのより詳しい説明は[移動平均を使ったサンプル](https://qiita.com/RS322/items/fd7f7616e0389b63b4db)で書いているので、こちらを参照してみてください。
python: getattr

pythonでgetattrの使い方がわからなかったので調べました．

## 実行方法

```py
getattr(宣言したインスタンス名, インスタンス内の関数名)(引数1, 引数2,...)
or
getattr(宣言したインスタンス名, メンバ変数名)
```

実行の形は上の通り．

## 単純な挙動

2つ目のかっこに指定された引数を満たした状態で宣言すると，とりあえず関数が実行される．関数に返り値がない場合はNoneTypeになり，もう一回関数として呼ぼうとしても失敗する．逆に引数を与えずに実行すると関数が代入される．

```py
class a():
    def __init__(self):
        self.m = "hoge"

    def no_arg(self):
        print("Got no args.")

    def an_arg(self, b):
        print("Got an arg.")

    def args(self, b, c):
        print("Got a few args.")


cls = a()

a1 = getattr(cls, "no_arg")()
a2 = getattr(cls, "an_arg")(1)
a3 = getattr(cls, "args")(2, 3)
a4 = getattr(cls, "no_arg")
a5 = getattr(cls, "an_arg")
a6 = getattr(cls, "args")

print(getattr(cls, "m"))

a4()
a5(1)
a6(2, 3)
a1()
```

実行結果

```
Got no args.
Got an arg.
Got a few args.
hoge
Got no args.
Got an arg.
Got a few args.

Traceback (most recent call last):
  File "test.py", line 27, in <module>
    a1()
TypeError: 'NoneType' object is not callable

```

## こんな使い方？

宣言時に代入した変数は関数内で保持されているので，プチインスタンス的なものを作成可能．

```py
class a():
    def __init__(self):
        pass

    def with_func(self, d):
        print("Got 'with_func() and {}'.".format(d))

        def inside(b, c):
            print("Got {} and {} and {}".format(b, c, d))

        return inside

cls = a()

a1 = getattr(cls, "with_func")(1)

a1(2, 3)
```

```py
Got 'with_func() and 1'.
Got 2 and 3 and 1
```
Laravel5.7で動的チェックボックス（checkbox）のoldの操作について

###少しハマったのでチェックボックスの時のold操作でハマったので備忘録。~~そもそもLaravel側もメソッド用意してほしい~~



編集画面やエラー画面などで入力フォームの値を取得したい時oldヘルパーが便利ですよね。
こうするだけで入力フォームの値が取れるので重宝しています。



```php:edit.blade/php
//前の入力画面の<input type="text" name="user">から値を取得
{{ old('user') }}
```



これを動的な`タグ`のチェックボックスを使って試してみる
※テーブルの中身はidとnameの単純なもの



```php:edit.blade.php
@foreach ($tags as $tag)
    <div class="form-check">
        <input type="checkbox" name="tag[]" id="tag{{ $loop->iteration }}" value="{{ $tag->id }}" @if (old('tag') == $loop->iteration) checked @endif>
        <label for="tag{{ $loop->iteration }}">{{ $tag->name }}</label>
    </div>
@endforeach
```


上記は`tag`のIDとforeachで回した時のカウント数が一致した時に`checked`を付けるという処理。
しかしこんなエラーが。。



```terminal
htmlspecialchars() expects parameter 1 to be string, array given...
```



これは値が配列のために出るエラーですね。



調べたらすぐヒットしました！



```php:edit.blade.php
<input type="checkbox" name="tag[]" id="tag{{ $loop->iteration }}" value="{{ $tag->id }}" @if (is_array(old("tag")) && in_array("1", old('tag'), true)) checked @endif>
```



ただこれだと`"1"`の部分が決めうちになってしまい、
今回のように動的な値のチェックボックスは全てに`checked`がついてしまう。



そこであまりスマートではないですが、`"$tag->id"`で文字列展開してください。
※ダブルクォーテーションを外すとint型になり一致しません。(oldは文字列のため)




```php:edit.blade.php
<input type="checkbox" name="tag[]" id="tag{{ $loop->iteration }}" value="{{ $tag->id }}" @if (is_array(old("tag")) && in_array("$tag->id", old('tag'), true)) checked @endif>
```



> 2020.02.27追記
多分oldの型をint型にキャストした方がいいかも




```php:edit.blade.php
<input type="checkbox" name="tag[]" id="tag{{ $loop->iteration }}" value="{{ $tag->id }}" @if (is_array(old("tag")) && in_array($tag->id, (int) old('tag'), true)) checked @endif>
```



> 2020.04.17追記
割と反応多い記事なので、最近よく使う三項演算子使って書き直す




```php:edit.blade.php
<input type="checkbox" name="tag[]" id="tag{{ $loop->iteration }}" value="{{ $tag->id }}" {{ $tag->id === (int)old("tag") ? "checked" : '' }}>
```




これでイケるはず。



###最後に



**Laravel便利だけどもう少しbladeの自由度を高めてほしい。**
Rubyのライブラリの学習

#### 投稿目的
- 個人的に学習の為に調べながらメモをしている感覚で投稿しています。
- 暖かい目で読んでいただけると幸いです。

### パッケージ管理システム: gem
- gemはRuby専用で様々なライブラリをインストールできるパッケージ管理システム。

- まずはgemをインストール.

```shell
$ gum install # gemをインストール
```

- インストール後バージョンを確認. 

```shell
$ gum -v # gumのバージョンを確認
```
 
### ライブラリ管理: bundler(バンドラー)
- bundlerのインストール.

```shell
$ gum install bundler # bundlerのインストール
```

#### gemfile(ジェムファイル)
- ライブラリを一括インストールすることができる。

- お好きなディレクトリに移動してもらってinitしてgemfileを作成します.
 
```shell
$  bundler init # gmefileが作成
```

- gemfileにインストールしたいライブラリを入力してbundlerをインストールするろ入力したライブラリがインストールされます。

```shell
$ bundler install # 入力したライブラリをインストール
```

#### gemfile.lock(ジェムファイルロック)
- ライブラリのバージョンを管理することができる。
- 上記のようにライブラリをインストールするとgemfile.lockが作成されてバージョンを管理することができます。

### Webアプリケーションフレームワーク: sinatra(シナトラ)
- sinatraはgemでインストールできるライブラリの一つで簡単にWebアプリを作成することのできるフレームワークです。

- sinatraをインスートしたらrequireで読み込みます.

```ruby
require 'sinatra'  # sinatraを読み込み
```

- getメソッドをsinatraで用意されているメソッドでパスを指定して、指定したパスにアクセスした際の処理を記述します.
- getの次にパス名、do~endが処理.

```ruby
get '/パス名' do # getメソッドでパスを指定
        '処理内容' # /hiのパスにアクセスした時の処理
end
```

- requireでsinatraを読み込んでるファイル(Routes)にgetかpostかを記述してパスを記述しそれぞれの処理を記述する。

```ruby
get '/画面1' do 
    '処理内容'
end

get '/画面2' do
    '処理内容'
end

post '/画面3' do #画面2のデータ受け取る
    '処理内容'
end

```

- ターミナルでブラウザにアクセスできるよにします。

```shell
$ ruby sinatra.rb -p 4567 # これで指定したパスにアクセスができます
```

- ブラウザで[http://localhost:4567/指定したパス名]でアクセスができます。

### sinatra-contribライブラリをインストール
- sinatra-contribをインストールすることでファイルの処理を変更するたびにsinatraを再起動しないでブラウザを更新することで変更が適用される。

```ruby
require 'sinatra/reloader' # ブラウザをリロードすることで更新がされる
```

### sinatraでHTMLを読み込む
- [views]というディレクトリを作成してその中に拡張子が.erbのファイルを作成してHTMLを入力する。
    - 拡張子がerbのファイルはHTMLもRubyも記述することが可能です。
    - erbにrubyを記述する際は<%~%>で定義をして<%=~%>で結果を出力する。
    
```erb:test.erb
<!DOCTYPE html>
<html>
    <head>
        <meta charset='UTF-8'>
        <title>Rubyの記述</title>
    </head>
    <body>
        <p>テスト</p>  <!-- HTMLのPタグで'テスト'と出力 -->
        <% test = 100 # Rubyで変数に100を代入 %> 
        <%= test # 変数の値を出力 %> 
    </body>
</html>

```

- sinatraを読み込んでいるところへ移動して下記を入力してターミナルでsinatraを起動してブラウザでアクセスをする。

```ruby 
get '/パス名' do
    erb :Views内で作成したファイル名
end
```

- ブロック内にヒアドキュメントを利用することで直接HTMLなどを記述することも可能。

```ruby
get '/パス名' do
    <<-識別子
        処理内容
    識別子
end
```

### paramsメソッド
- paramsとはformなどから送られてきた値を受け取るためのメソッドです。

```ruby
get '/パス名' do
    @インスタンス変数 = params[:名前] # 受け取ったデータをインスタンス変数に代入
end
```
10日目。まだまだHerokuでRubyがうごきません。

#昨日の続きです。

###9日目。RubyをHerokuで・・・動きません！
https://qiita.com/robamimim/items/083dd4d61fd7b30a2084

###あらすじ
Herokuでrubyを公開したい
公式動画ではささっと簡単にやっていたので真似してみたら、ぜんぜん動かないやんけ！ さまざまな難題を乗り越えたものの、ローカルのRubyのバージョンがアップデートできずにギブアップしたのでした。


#どうにかしてRubyをアップデートしたい！

こちらを参考にさせていただきました。
MacのターミナルでRubyをバージョンアップする方法
https://qiita.com/Ficus/items/bdef5c2b504d7a4008fb

rbenvでアップデートしたら環境を設定しましょうね、ということで。まずは`rbenv init`コマンドを試してみました。

```
$ rbenv init
# Load rbenv automatically by appending
# the following to ~/.bash_profile:

eval "$(rbenv init -)"
```

`eval "$(rbenv init -)”` 

これなんだろう？　.bash_profileに追加せいって？
ためしにうってみる。

```
$ rbenv init -
export PATH="/Users/robamimim/.rbenv/shims:${PATH}"
export RBENV_SHELL=bash
source '/usr/local/Cellar/rbenv/1.1.1/libexec/../completions/rbenv.bash'
command rbenv rehash 2>/dev/null
rbenv() {
  local command
  command="$1"
  if [ "$#" -gt 0 ]; then
    shift
  fi

  case "$command" in
  rehash|shell)
    eval "$(rbenv "sh-$command" "$@")";;
  *)
    command rbenv "$command" "$@";;
  esac
}
$ 

```

なるほどー！
パスを`.rbenv`以下のRubyに通すのね。
さっそく`.bash_profile`に追加。

```
$ source ~/.bash_profile
$ ruby -v
ruby 2.4.5p335 (2018-10-18 revision 65137) [x86_64-darwin18]
```

いいんじゃない？
そして満を持しての`bundle install `
sourceかける。

```
$ bundle install --path vender/bundle
Your Ruby version is 2.3.7, but your Gemfile specified 2.4.5
```

だめなんかい！
しょんぼり。
(所要時間 30分)
[WIP] [MAVLINKのドキュメントの雑な日本語訳] - MAVLink C UDP Example

原文: https://mavlink.io/en/examples/c_udp.html

# MAVLink C UDP Example

> The MAVLink UDP Example is a simple C example that sends some data to QGroundControl using MAVLink over UDP. QGroundControl responds with heartbeats and other messages, which are then printed by this program.

[MAVLink UDPのサンプルコード](https://github.com/mavlink/mavlink/tree/master/examples/linux)は、MAVLink over UDPを使用してQGroundControlにデータを送信する単純なCのサンプルです。QGroundControlはハートビートや他のメッセージで応答し、それらのメッセージはこのプログラムによって出力されます。

> The example should work on any Unix-like system (Linux, MacOS, BSD, etc.). These instructions were tested on a clean Ubuntu LTS 16.04 installation using the default version of gcc (5.4.0).

このサンプルコードは、Unix系のシステム（Linux、MacOS、BSDなど）で動作するはずです。これらの手順は、デフォルトバージョンのgcc（5.4.0）を使用して、クリーンインストールしたUbuntu LTS 16.04でテストされました。


## Building/Running the Example - サンプルコードのビルドと起動

> The following instructions show how to build and run the example.

> 1. Install MAVLink and generate the MAVLink 1.0 libraries into the mavlink/include directory.
>   - Alternatively you can clone the mavlink/mavlink repository and Download prebuilt headers to the same location. We recommend that you use MAVLink 1.0 headers as some ground control software may not yet support MAVLink 2.0.
>   - You can put/generate the library wherever you like, but the build command below assumes they are located in directory named include below the MAVLink root directory.
> 2. Open a terminal and navigate to [examples/linux](https://github.com/mavlink/mavlink/tree/master/examples/linux)
> 3. Compile with GCC using the following command:
>   - ```gcc -std=c99 -I ../../include/common -o mavlink_udp mavlink_udp.c```
> 4. Run the executable from the terminal:
>   - `./mavlink_udp`
>   - By default, the example will listen for data on the localhost IP address, port 14551. You can specify another IP address as a command line argument (use ./mavlink_udp --help to see usage).
> 5. Open QGroundControl on the same machine.
>   - QGroundControl immediately starts broadcasting its `HEARTBEAT` on port 14551.
> 6. The example should start displaying the received data in the terminal:
Cupyで使うcuDNN, CUDAバージョン確認メモ

# 使ってるCupyのCUDAのバージョンとcuDNNのバージョンの確認

```bash
$ python
Python 3.6.5 (default, Jul 26 2018, 11:41:00)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-16)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import cupy
>>> cupy.__version__
'6.0.0b1'
>>> import cupy.cuda
>>> cupy.cuda.runtime.runtimeGetVersion()
9020
>>> from cupy.cuda import cudnn
>>> cudnn.getVersion()
7402
```

# ちなみに ChainerとChainerMNも

```bash
>>> import chainer
>>> chainer.__version__
'6.0.0b1'
>>> import chainermn
>>> chainermn.__version__
'6.0.0b1'
```
【Dokku】フォームをPOSTした時に"The page you were looking for cannot be served."になる場合の解決方法

## 現象
- ファイルアップロードありのフォームを実装

- dokkuで構築したアプリケーションサーバーに、フォームの内容をPOSTすると、"The page you were looking for cannot be served."が表示される。

- PCやiPhoneXからは正常にPOSTできて、iPhone7や古いAndroidからは上記のエラーになるなど、端末やブラウザによって再現性にばらつきがある。
<img src="https://qiita-image-store.s3.amazonaws.com/0/364049/8c884d69-fee5-bf27-6c68-7d600fbcf22d.png" width="50%"/>



## 環境
- Node.js
- dokku
- Mongo DB

## 原因
サーバー側で「リクエスト容量が大きすぎる」という（勝手な判断で）エラーが返却されている。

## 解決策
リクエストの最大容量を設定してあげる。

#### nginx設定を更新
1. ***設定ファイルを作成（既にある場合は上書き）***
`/home/dokku/<dokkuアプリ名>/nginx.conf.d/upload.conf`

2. ***以下の行を追加（50Mの部分は好きな値に変更してよい）***
`client_max_body_size 50M;`

3. ***SSHでサーバーにログインし、dokkuのコンテナを再起動***
`dokku ps:restart <dokkuアプリ名>`

【補足】***dokkuのアプリ名一覧確認方法***
`dokku apps`

## 参考
- [Error with Paperclip Photo uploads (S3) on Mobile in Dokku
](https://stackoverflow.com/questions/50427441/error-with-paperclip-photo-uploads-s3-on-mobile-in-dokku)
美しい数式をコマンドラインから生み出したい！

## やりたいこと

コマンドライン上で**劣化しないSVG形式の数式を作成**したいです。(PNGも生成できます)

ブラウザを使って、オンラインでTeXの記法の数式を画像化するWebサイトが既にあります。
ですが、以下のような問題があります。

* 外部にアップロードの必要性
* スクリプトでの自動化が困難

そのため、美しいSVGの形式の数式を

* **ローカル内だけで完結して生成**
* **スクリプトなどで自動化しやすい方法**

で作成する方法の紹介です。

## インストール

[`npm`](https://www.npmjs.com/get-npm)で以下のコマンド使えば`math2image`コマンドとしてインストールできます。コマンドとして使うので、`-g`オプションでinstallしてしまいます。

```bash
npm install -g math2image
```

### GitHubリポジトリ

GitHub: <https://github.com/nwtgck/math2image-npm>
`math2image`という名前で開発しています。

## 使い方

`echo`を使って数式を`math2image`コマンドに渡すとSVGの画像が生成できます。

```bash
echo "e^{i \pi} + 1 = 0" | math2image > euler_identity.svg
```

<img src="https://qiita-image-store.s3.amazonaws.com/0/84451/d271c8c5-8825-72c6-b285-0a0bfd3e3962.png" height="50">
(QiitaはSVGが表示できないみたいなので、PNGになってます)

パイプで数式を渡せるので、中間ファイルなしでSVGの生成が可能です。SVGの標準出力に出せるので、それをパイプしてJPEGにするなど、パイプをつないで他の形式に変換するのも可能なはずです。


以下みたいに、ちょっと複雑になってもいけます。

```bash
echo "\sum_{n=0}^∞\frac{f^{(n)}(a)}{ n! }(x-a)^n" | math2image > taylor_series.svg
```

<img src="https://qiita-image-store.s3.amazonaws.com/0/84451/14d281ad-338e-1dd8-8c86-9cd5c230887a.png" height="100" alt="taylor_series">

### ファイルから作成する

以下の内容の、`sample7.math.tex`を用意して、（拡張子は何でもOKです）

```tex:sample7.math.tex
% (from: https://en.wikibooks.org/wiki/LaTeX/Mathematics)
f(n) =
\begin{cases}
  n/2       & \quad \text{if } n \text{ is even}\\
  -(n+1)/2  & \quad \text{if } n \text{ is odd}
\end{cases}
```

以下のように、実行すると`sample7.math.tex.svg`として作成されます

```bash
math2image sample7.math.tex
```

![sample7.png](https://qiita-image-store.s3.amazonaws.com/0/84451/e97e3cc6-c28f-7f62-f07b-b2f489803409.png)


## 指定したファイルパスに保存する

ファイル名・ファイルパスを指定したいときは`-o`オプションで指定でします。以下の例では`out/euler_identity.svg`に保存されます。

```bash:例
echo "e^{i \pi} + 1 = 0" | math2image -o out/euler_identity.svg
```

## .png形式で保存する

`--to-png`オプションと`--png-width=500`を指定すると透過pngで綺麗に保存できます。

```bash:例
echo "e^{i \pi} + 1 = 0" | math2image --to-png --png-width=500 > euler_identity.png
```

## 使ってる技術


[MathJax](https://www.mathjax.org/)を利用しています。MathJaxはQiitaの```` ```math````のハイライト機能でも使われている機能で、TeX記法の数式をブラウザ（JavaScriptなど）で生成できる技術です。
参考： [Qiitaの数式チートシート - Qiita](https://qiita.com/PlanetMeron/items/63ac58898541cbe81ada)

このMathJaxをNode.js上で使うために、[mathjax-node](https://github.com/mathjax/MathJax-node)を使っています。

PNGの生成は[svg2png](https://github.com/domenic/svg2png)を使っていて、内部ではPhantomJSでsvgからPNGに変換しているようです。2年ぐらい前に開発が止まっているので、なるべく破壊的な変更を加えずに他のライブラリに移行できればと思います。

## 数式以外も生成できる！

**MathJaxで生成できるものなら何でも生成できる**はずなので、**数式に限らずテーブル（表）なども生成可能**です。

見てて楽しいMathJaxで生成している綺麗な数式のサイト見つけました。表とか可換図式とかもありました。`math2image`でも利用可能なはずです。
[Easy Copy MathJax](https://easy-copy-mathjax.xxxx7.com/)
textareaの高さを入力内容によって可変したい

## やりたいこと

textareaの高さを入力内容によって可変したい

改行したり、文字が折り返したりしたら、スクロールになるのではなく、
`textarea`の`height`が長くなったり短くなったりして、スクロールしなくても入力した文字が見えるようにしたい。

`textarea`の`value`を取得して、改行コードの数を調べて、
`改行の数*行間+余白`を`textarea`の`height`にするという方法を見つけたが、
文字が折り返した時には対応できないので、すごく不完全でいやだなぁ〜と思っていたら、
普通にあった(゜ロ゜)

`scrollHeight`

これで、スクロールしている`textarea`の`height`が取れるので、あとは`style.height`で`textarea`の`height`を変更するだけ。

なんて簡単なんだ。（なんで知らなかったの？）

しかし、文字にするとわかりにくいｗ

## コード

Vue.jsで書いてたので、Vue.jsの書き方です。
省略して該当部分だけ書きます。


```html
<textarea ref="adjust_textarea" @keydown="adjustHeight" v-model="textareaVal"></textarea>
```

```js
methods: {
  adjustHeight(){
    const textarea = this.$refs.adjust_textarea
    const resetHeight = new Promise(function(resolve) {
      resolve(textarea.style.height = 'auto')
    });
    resetHeight.then(function(){
      textarea.style.height = textarea.scrollHeight + 'px'
    });
  }
}
```

## 軽く解説

改行や文字の折り返しで、長くなるだけなら

```js
textarea.style.height = textarea.scrollHeight + 'px'
```

だけで大丈夫だけど、改行を消した時などに、短くもなって欲しいので、

```js
textarea.style.height = 'auto'
```

で、一度高さをリセットして、新たに高さを取得する。
その時、ちゃんと高さが`auto`になってから、高さを再取得したいので、`promise`を使う。

もし、他で何かしたら`textarea`の内容が変わり、その時にも高さの調節をしたい場合は、watchする。

```js
watch: {
  textareaVal() {
    this.adjustHeight();
  }
}
```
WSLをはじめよう

Windows Subsystem for Linux(以下、WSL)の導入方法について、
自分用の覚書として残しておきます。

WSLのGithubリポジトリ( [Github WSL](https://github.com/Microsoft/WSL) )にて
ユーザーからissueを収集している。


## 1. 環境構築

### 1.1. Windows上でWSLを有効にする

1. Windowsの設定画面で「**Windowsの機能の有効化または無効化**」を検索

![01.png](https://qiita-image-store.s3.amazonaws.com/0/181972/9bf95f1d-8299-bb8a-a4f6-bc7d40a4186c.png)


2. **Windowsの機能** ダイアログにて WSLのチェックボックスをONにする

![02.png](https://qiita-image-store.s3.amazonaws.com/0/181972/e2fdb127-969e-b5ad-fbdd-bec10ab30f86.png)

一度PCを **再起動** する

### 1.2. Ubuntuをインストールする

1. Microsoft Store で **Ubuntu** を検索

![03.png](https://qiita-image-store.s3.amazonaws.com/0/181972/f8eabf71-1f6a-2593-2caa-70ccf77edfce.png)


2. **Ubuntu, Ubuntu 18.04, Ubuntu 16.04** の三種類が表示されるがUbuntuを選ぶ

![Inked04_LI.jpg](https://qiita-image-store.s3.amazonaws.com/0/181972/7035a49c-2592-ccb9-1c88-92f29bfb212d.jpeg)


3. 起動ボタンを押下


### 1.3. ユーザーを作成する


1. ユーザー名とパスワードを登録する

```bash
$ Please enter a UNIX user name: ubuntu_user # ユーザー名を入力(Windowsのユーザではない)
$ Enter new UNIX password:     # パスワードを入力
```


### 1.4. パッケージ更新

```bash
$ sudo apt update
$ sudo apt upgrade -y
```

## 2. 起動方法

1. Ubuntuアプリを起動する
    2. Ubuntuアプリ用のターミナルが開く
2. コマンドプロンプトで `wsl` と入力
    3. コマンドプロンプト上でWSLが起動する


## 3. Windowsとフォルダを共有する方法

Windows上の `C:\dir` にはUbuntu上で `/mnt/c/dir` でアクセス可能
ショートカットを作っておくと楽

```bash
$ ln -s /mnt/c/dir ~/dir
```

### <font color=red>**注意**</font>

- Ubuntu上のファイルは文字コードUTF-8
- Windows上のエディタで操作するときはUTF-8で保存する

## 4. WSLの実体がある場所（<font color=red>直接さわらない！</font>）

```
C:\Users{user_name}\AppData\Local\Packages \CanonicalGroupLimited.UbuntuonWindows_{random_string}\LocalState\rootfs 
```

## 5. コマンドプロンプトからLinux操作

やり方は簡単で、`wsl` コマンドの引数にLinuxコマンドを入力する。

```
C:\Users\user> wsl sudo apt update
C:\Users\user> wsl sudo apt upgrade -y
```

Windows起動時にUbuntu上でルーティンワークを実行するときのスクリプトなんかで役に立つ
Go言語 キャストvs代入

# はじめに
structを別structにキャストするときどうすれば早いのかベンチマークとりました。

# 何と何を?
キャストした場合と

```go
n := Foo{M: msg}
b := Bar(n)
```

メンバーを代入した場合です。

```go
n := Foo{M: msg}
b := Bar{
	M: n.M,
}
```

# 結論
普通にキャストした方が早いです。

# 検証

```go:hoge.go
package hoge

type Foo struct {
	M string
}

type Bar struct {
	M string
}

const msg = "hgoe"

func Cast() Bar {
	n := Foo{M: msg}
	return Bar(n)
}

func Substitute() Bar {
	n := Foo{M: msg}
	b := Bar{
		M: n.M,
	}
	return b
}
```

```go:hoge_test.go
package hoge

import "testing"

func BenchmarkCast(b *testing.B) {
	b.Run("cast", func(b *testing.B) {
		b.ResetTimer()
		for i := 0; i < b.N; i++ {
			Cast()
		}
	})
	b.Run("sub", func(b *testing.B) {
		b.ResetTimer()
		for i := 0; i < b.N; i++ {
			Substitute()
		}
	})
}
```

キャストの方が２倍くらい早いです。

```sh:結果
goos: darwin
goarch: amd64
pkg: test/cast
BenchmarkCast/cast-8         	2000000000	         0.34 ns/op
BenchmarkCast/sub-8          	2000000000	         0.61 ns/op
PASS
```

以上です。
EdwardをimportしてからXGBoostをimportするとエラーになることがある

はじめに
=======

ものすごくレアな状況だと思いますが、Python Libraryの `Edward` と `XGBoost` の読み込み順によってエラーが発生することがあるので、記録として残しておきます。

再現手順
=======
とりあえず、わかっているのは、
`edward`, `scikit-learn`, `xgboost` がInstallされていて、
`edward` -> `xgboost` の順にimportしたときです。

※ tensorflow 1.6 がinstallされているのは、edwardが要求するからです(1.6じゃなくてもいいとは思いますが、1.6なら通常は動く)。

## エラーになる場合
### case1: xgboost==0.80

```
docker run -it python:3.6.4 bash -c "pip install edward==1.3.5 tensorflow==1.6.0 xgboost==0.80 scikit-learn; python -c 'import edward; from xgboost import Booster'"
```

```
Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "/usr/local/lib/python3.6/site-packages/xgboost/__init__.py", line 11, in <module>
    from .core import DMatrix, Booster
  File "/usr/local/lib/python3.6/site-packages/xgboost/core.py", line 136, in <module>
    _LIB = _load_lib()
  File "/usr/local/lib/python3.6/site-packages/xgboost/core.py", line 128, in _load_lib
    lib.XGBGetLastError.restype = ctypes.c_char_p
UnboundLocalError: local variable 'lib' referenced before assignment
```

### case2: xgboost==0.81
※ 0.80とエラーメッセージがちょっと違うだけ。

```
docker run -it python:3.6.4 bash -c "pip install edward==1.3.5 tensorflow==1.6.0 xgboost==0.81 scikit-learn; python -c 'import edward; from xgboost import Booster'"
```

```
Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "/usr/local/lib/python3.6/site-packages/xgboost/__init__.py", line 11, in <module>
    from .core import DMatrix, Booster
  File "/usr/local/lib/python3.6/site-packages/xgboost/core.py", line 150, in <module>
    _LIB = _load_lib()
  File "/usr/local/lib/python3.6/site-packages/xgboost/core.py", line 141, in _load_lib
    'Error message(s): {}\n'.format(os_error_list))
xgboost.core.XGBoostError: XGBoost Library (libxgboost.so) could not be loaded.
Likely causes:
  * OpenMP runtime is not installed (vcomp140.dll or libgomp-1.dll for Windows, libgomp.so for UNIX-like OSes)
  * You are running 32-bit Python on a 64-bit OS
Error message(s): ['dlopen: cannot load any more object with static TLS', 'dlopen: cannot load any more object with static TLS']
```

## エラーにならない
### import順が xgboost -> edward の順番の場合
```
docker run -it python:3.6.4 bash -c "pip install edward==1.3.5 tensorflow==1.6.0 xgboost==0.81 scikit-learn; python -c 'from xgboost import Booster; import edward'"
```

### scikit-learn がない場合
```
docker run -it python:3.6.4 bash -c "pip install edward==1.3.5 tensorflow==1.6.0 xgboost==0.80; python -c 'import edward; from xgboost import Booster'"
```

### import順が sklearn -> xgboost の順番の場合

```
docker run -it python:3.6.4 bash -c "pip install edward==1.3.5 tensorflow==1.6.0 xgboost==0.81 scikit-learn; python -c 'import sklearn; from xgboost import Booster'"
```

さいごに
======

まあ、こんなこともあるんですね...
jQueryで.changeメソッドが効かなくて困ったこと

## jQueryのchangeメソッドが効かない！
input type="file"に画像を入れたときのイベントをとりたかったので軽い気持ちでchangeメソッドを使ったら効かなかった・・

```javascript:jquery.js

$("input[type='file']").change(function() {
});
```

##　解決策
```javascript:jquery.js

$(document).on('change', 'input[type="file"]', function() {
});
```
onメソッドを使ってchangeのイベントをとる

### changeメソッドと.on('change')の違い
**changeメソッドは元々のHTML要素に対して有効**
**on('change', '子要素')はjavascriptで変更された後のHTMLにも有効**

### 理由
onメソッドでchangeを指定してあげたほうが便利くらいの認識だったが、今回はonとclickメソッドの違いによってイベントがとることができなかった。

今回はこの記述の前にページを読み込んだ時にjQueryの記述によってHTMLを編集していたので、変更されたHTMLになり、changeメソッドが効かなかった。
rails associationでlimitを使うときに、注意

### model定義
```ruby
class Post < ApplicationRecord
  has_many :latest_comments, -> { limit 10 }, class_name: "Comment", foreign_key: :post_id
end
```

### Postからlatest_commentsを取得
```ruby
Post.all.each {|post| p post.latest_comments } 
Post.includes(:latest_comments).each {|post| p post.latest_comments }
Post.eager_load(:latest_comments).each {|post| p post.latest_comments }
```

上記の３つの結果が異なります。原因はincludes、eager_loadがlimitをサポートできないからです。

```ruby
Post.includes(:latest_comments).first.latest_comments
Post.includes(:latest_comments).second.latest_comments
```
一個のpostだけ、取得する場合は、問題ないです。
カスタム投稿タイプ時 The block "***" must have a registered category. エラー

### 症状
Gutenbergのカスタムブロックとカスタムカテゴリーを作った。
デフォルトの投稿だとGutenbergエディタが正しく起動するのに、カスタム投稿タイプから投稿しようとするとGutenbergエディタが起動せず真っ白になり、ブラウザコンソールに```The block "***" must have a registered category.```のエラーが表示される。

同じエラーになる人少なそうだが３０分ぐらいハマってたのでメモ。

### 原因と解決方法

Gutenbergのカスタムカテゴリーを作る際、
https://wordpress.org/gutenberg/handbook/designers-developers/developers/filters/block-filters/#managing-block-categories
の


```php:my-plugin.php
function my_plugin_block_categories( $categories, $post ) {
    if ( $post->post_type !== 'post' ) {
        return $categories;
    }
    return array_merge(
        $categories,
        array(
            array(
                'slug' => 'my-category',
                'title' => __( 'My category', 'my-plugin' ),
                'icon'  => 'wordpress',
            ),
        )
    );
}
add_filter( 'block_categories', 'my_plugin_block_categories', 10, 2 );
```

をコピペしていたが、この思考停止コピペがよくなくて、このうちの

```php:my-plugin.php
    if ( $post->post_type !== 'post' ) {
        return $categories;
    }
```
の３行部分が不要だった。この３行削除し解決。
if (デフォルトの投稿じゃない時) {カスタムカテゴリ追加せずreturn} ってことになってので。

単純なミスであるが、WordPressも英語ドキュメントも浅い理解と雰囲気コピペで実装してたためハマった。
Djangoを導入してみたんだけど、それだけだと一瞬で記事が終わっちゃったので、起動するところまでやってみた。

# 前回までのあらすじ
前回の記事でpython3を導入できたので、本命のDjangoを入れる。
[【mac】brewからpyenv経由でpython 3.7.2を入れてみる
](https://qiita.com/gaku3601/items/c5e59e89c4d847f19341 "【mac】brewからpyenv経由でpython 3.7.2を入れてみる
")

# 早速構築していく
Djangoはpipからinstallできるようなので、pipがinstallされているか確認

```
$ pip -V
pip 18.1 from /Users/gaku/.pyenv/versions/3.7.2/lib/python3.7/site-packages/pip (python 3.7)
```
できてるっぽいです。

Djangoの公式ページを確認しつつinstallする。
https://www.djangoproject.com/download/

```
$ pip install Django==2.1.7
Collecting Django==2.1.7
  Using cached https://files.pythonhosted.org/packages/c7/87/fbd666c4f87591ae25b7bb374298e8629816e87193c4099d3608ef11fab9/Django-2.1.7-py3-none-any.whl
Collecting pytz (from Django==2.1.7)
  Using cached https://files.pythonhosted.org/packages/61/28/1d3920e4d1d50b19bc5d24398a7cd85cc7b9a75a490570d5a30c57622d34/pytz-2018.9-py2.py3-none-any.whl
Installing collected packages: pytz, Django
Successfully installed Django-2.1.7 pytz-2018.9
You are using pip version 18.1, however version 19.0.2 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.
$ pip list
Package    Version
---------- -------
Django     2.1.7
...
```

🎉Djangoが入りました(´・ω・｀)b🎉

# ちょっと動かしてみる

ここらへんの記事を参考にさせていただきました。
[初心者がつまづきながらDjangoをとりあえず動かす](https://qiita.com/kounorimich/items/33e21fd7d5555099bd2e "初心者がつまづきながらDjangoをとりあえず動かす")
[Djangoを最速でマスターする part1](https://qiita.com/gragragrao/items/373057783ba8856124f3 "Djangoを最速でマスターする part1")

```
[プロジェクトファイルを作成する]
$ $ django-admin startproject testProject
$ ls
testProject
```
なんかできました。
プロジェクトフォルダへ移動して。。。

```
[アプリケーションを作成してみる]
$python manage.py startapp testApp
$ ls
manage.py	testApp		testProject
```

アプリケーションを作成したら、setting.pyに追記しないといけないようなので追記する。

```
[setting.pyを編集する]
INSTALLED_APPS = [
     'django.contrib.admin',
     'django.contrib.auth',
     'django.contrib.contenttypes',
     'django.contrib.sessions',
     'django.contrib.messages',
     'django.contrib.staticfiles',
     'testApp', # これを追記しました!
 ]
```

このまま起動しても動くのは動くのだが、migrationしろよ！って怒られるのでmigrationしておく。

```
python manage.py migrate
```

ここまでできたら、とりあ起動してみる！

```
$ python manage.py runserver
Performing system checks...

System check identified no issues (0 silenced).
February 19, 2019 - 07:57:16
Django version 2.1.7, using settings 'testProject.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
```

ブラウザでhttp://127.0.0.1:8000/にアクセス！
![スクリーンショット 2019-02-19 16.59.42.png](https://qiita-image-store.s3.amazonaws.com/0/47132/96c489f6-a694-1746-769f-dfe924231738.png)

🎉とりあえず動きました(´・ω・｀)🎉

# おわりに
installは簡単。
起動できただけで、これからは各自頑張って実装していきましょう！
学校の先生に知っておいて欲しいパソコン、PAD、スマフォ、ゲーム機

学校の先生に、知っておいて欲しいこと

# 1 パソコン、PAD, スマフォ、ゲーム機は計算機だ
パソコンだ、スマフォだ、ゲーム機だという区分や、
Windows、Macintosh, Raspberry Pi, Android, iPhone, Nintendo Switch, Sony PlayStationという商品名,

Intel Corei7, Arm , 　Nvidia Tegra, というCPU名


https://www.nvidia.com/object/tegra-4-processor.html
ARM Cortex-A9 r4 CPU

# 2 計算機は電気で動いている

1)コンセントから直接電源供給を受けて動く機材
2)コンセントからの電源供給により蓄電池で動く機材
3)コンセントからの電源供給を受けずに乾電池で動く機材
4)光電池で動く機材

4)は電卓。3)は一部の電卓と事務機器。ただし、電池の代わりに、蓄電池で動くものもある。

充電の方法は、電源ケーブル、URSケーブル、無線充電などがある。

# 3 通信には有線と無線がある。

スマフォでもUSBケーブルを接続して通信する場合がある。

# 4 出荷されている計算機の99.9%は計算結果を保証していない。

# 5 出荷されている計算機のソフトウェアで保障される損害額は購入金額を上限としている場合がある。

購入金額以上の損害が出るかもしれない事象には、自己責任で使うしかない。

# 6 インタネットはネットワークの相互接続
あなたの計算機は私の計算機という原則。
共有するための仕組みで、秘密を保持するための仕組みではない。
Solidityでブラウザからコントラクトの変数を取得する方法

web3.jsを通じてブラウザからブロックチェーン上の変数を取得するのに色々手間取ったので、書き残しておきます。

今回はstruct carの配列であるcarsから要素を取得したいと思います。(Solidity version 0.5以上です。)

```javascript:sample1.sol
pragma solidity ^0.5.0;

contract sample1{
    struct car {
        string carName;
        string company;
    }

    car[] public cars;
}
```

Solidityではpublicな変数は自動的にgetterを定義してくれます。
なので、最初は下記の様にJavascriptで簡単にパッと取得出来ると思ってました。

```javascript:app.js
function() {
    var productOwnershipInstance;
    App.contracts.sample1.deployed().then(function(instance) {
        sample1Instance = instance;
        console.log(sample1Instance.cars[0]); // undefinedが出力
      })
}
```
Solidity上だと上記の取得方法、つまりcars[0]だけでcars配列の最初の要素が取得できます。SolidityもJavascriptも似た様なもんだから似た様に扱えると思ってたのが間違いでした。実際はcarsというfunctionが生成され、かつPromiseが返ってくるので実際は下記の様になります。

```javascript:app.js
function() {
var sample1Instance;
    App.contracts.sample1.deployed().then(function(instance) {
        sample1Instance = instance;
        sample1instance.cars(0).then(result => {
          console.log(result[0]); // carsの最初の要素のcarNameが出力される
          console.log(result[1]); // carsの最初の要素のcompanyが出力される
        });
    }
}
```
こんな感じで取得することになります。
もっと簡単な方法あったら教えてください。
python(9)~for文とwhile文~

#ループ
ループとは繰り返し処理のことで，条件が成り立っている間処理を実行し続けます．ループ文でもインデントは必要です．
##for文
繰り返す回数や範囲が分かっている場合はfor文を使います．for文にelseを追加すると繰り返しが終了した後に実行される処理を指定できます．
###for文　(リスト)

```python:lis.py
num = ['零', '壱', '弐', '参', '肆', '伍', '陸', '漆']
for nums in num:
    print(nums, end = ' ')
else:
    print()
```

```text:実行結果
零 壱 弐 参 肆 伍 陸 漆
```
###for文 (辞書)
辞書のキーや値を，for文で取り出すことができます．

```python:dic.py
num = {'零':'0', '壱':'1', '弐':'2', '参':'3', '肆':'4'}
for keys in num:
    print(keys, end = '')
else:
    print()
for val in num.values():
    print(val, end = ' ')
else:
    print()
for item in num.items():
    print(item, end = ' ')
else:
    print()
```

```text:実行結果
参 弐 肆 壱 零
3 2 4 1 0
('参', '3')('弐', '2')('肆', '4')('壱', '1')('零', '0')
```
##range()
range()を使うとc言語やjavaでいう通常のfor文のように扱うことができる．
####range(開始値, 終端値, 増加分)

```python:ran.py
for a in range(10):
    print(a, end = ' ')
else:
    print()
for a in range(17, 5, -2):
    print(a, end = ' ')
else:
    print()
li = list(range(4, 20, 3)) #range()を使ったリストの作成
print(li)
```

```text:実行結果
0 1 2 3 4 5 6 7 8 9
17 15 13 11 9 7
[4, 7, 10, 13, 16, 19]
```
##while文
while文は条件が成り立っている間だけ実行する制御文です．繰り替える回数がわからないときに使います．

```python:loop.py
a = 0
while a < 5:
    print(a, end = ' ')
    a += 1
else:
    print('finish')
```

```text:実行結果
0 1 2 3 4 finish
```
while文でもfor文と同じようにelseが使えます．また，「a += 1」nなどのようにaの変化を書かないと無限ループになってしまいます．ループになってしまった場合は「Ctrl+c」を押したら実行の停止ができます．
##ループの中断
プログラム自体を終わらせたい時はquit()を使います．
###break
break文はfor文やwhile文などの繰り返しを中断するときに使います．break文を使うと一番近いブロックの終わりに飛ぶことができます．

```python:bre.py
for a in range(0, 20, 3):
    if a < 15:
        print(a, end = ' ')
    else:
        break
```

```text:実行結果
0 3 6 9 12
```
###continue
continue文で繰り返しのその回だけを中断します．

```python:con.py
for a in range(0, 20, 3):
    if (a < 5) or (a > 17):
        print(a, end = ' ')
    else:
        continue
```

```text:実行結果
0 3 18
```
##最後に
ループ文は多くのプログラムで使われています．しっかり学んでいきましょう．
Gffreadのコマンド

いつも忘れてしまうので、自分用にメモ
samtoolsをインストールし、PATHを通しておくと後々困らなくていいかも。


##GTF → GFF3 

~~~
gffread -E my.gtf -g my_genome.fasta -o- > my.gff3
#もしくは
gffread -E my.gtf -g my_genome.fasta -o my.gff3
~~~
※gene行の代わりにtranscripts行ができます。
※ゲノム配列のインデックスファイル(my_genome.fasta.fai)が必要ですが、samtoolsがインストールしてあれば勝手に作ってくれるので問題ないと思います

##GFF3 → GTF

~~~
gffread -E my.gff3 -g my_genome.fasta -T -o- > my.gtf
#もしくは
gffread -E my.gff3 -g my_genome.fasta -T -o my.gtf
~~~

##GFF3 → Exon・CDS・Protein sequences
~~~
gffread -E my.gff3 -g my_genome.fasta -w my_exons.fasta -x my_cds.fasta -y my_protein.fasta 
~~~


もっと詳しいオプションが見たい！という方は

~~~
gffread -h
~~~
で確認できます。
Ubuntu 16.04の仮想端末ttyでログインできなかった時のお話

#ことの発端は、workstationを完全リモート化しようとした時
　Deep Learning workstation兼データサーバのworkstationを完全リモート化するために、いろいろインストールしてた時、guiがgpuを使用しているのでこれをどうにかしたいと思いました。
　詳しく調べると、

```
#systemctl stop lightdm
#./NVI...(driver) -s --no-opengl-files
#./cuda... -silent --no-opengl-libs 
```
の様にインストールすると、vncでguiを使用しないらしい。（参考サイトはそのうちまとめます。

そこで、Ctrl+F1で仮想端末に入り、ログインしようとしたら

```
user name: ***
passwork : (勝手に空白で入力）
Login incorrect
```
ふぁ！！！！

#virtual boxにubuntuをなんどもインストールして検証ー＞teamviewerが原因
　何が原因だかあまりに不明だったため、workstationになんどもubuntuをインストールし直し、なんども環境を再構築し、なんども問題が再現し・・・
　nvidiaのdriverであったり、cudaの問題ではなさそうだったため、lxdeやvncの問題を疑いvirtualbox下で検証（実ハードは起動が手間）。
　一コマンドずつreboot、環境再構築を行ったところteamviewerインストール直後から当該エラーが発生。uninstallすると直ることを確認。

#teamviewerで調べてもこのような情報は出てこなかった。
おそらく、teamviewerを使うかつttyにアクセスを行うような人間の数を考えると、かなり希少な情報なのではないかと思った。
Vuexの名前空間でハマった。（local mutation 云々のエラー）

# 事象

commitしている箇所で以下のような感じのエラーが出て少し悩んだ。

```
[vuex] unknown local mutation type: 'OTHER_MUTATION', global type: module/globalMutation
```

# 解決

ざっくり一言で言うと、 ***「名前空間に気をつけましょう」***でした。
答えは[vuexのリファレンス](https://vuex.vuejs.org/ja/guide/modules.html#%E5%90%8D%E5%89%8D%E7%A9%BA%E9%96%93%E4%BB%98%E3%81%8D%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB%E3%81%A7%E3%81%AE%E3%82%B0%E3%83%AD%E3%83%BC%E3%83%90%E3%83%AB%E3%82%A2%E3%82%BB%E3%83%83%E3%83%88%E3%81%B8%E3%81%AE%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9)に書いてあります。

>アクションをディスパッチするか、グローバル名前空間にミューテーションをコミットするには、dispatch と commit の3番目の引数として {root: true} を渡します。

[commitのAPIリファレンス](https://vuex.vuejs.org/ja/api/#commit)にも書いてある。

# サンプル

以下、ダメなやつのサンプル。これだと冒頭のエラーが出る。

`namespace:true` なので起点がモジュールローカルになる。

```javascript:Wrong👎

export default {
  namespace: true,
  actions: {
    doHoge ({ commit }) {
      commit('common/OTHER_MUTATION', payload)
    }
  },
  mutations: {
    SOME_MUTATION (state) {}
  }
}
```

なので、こうする。
`namespace:true`だが、commitの引数に`{ root: true }`を渡すことでroot起点で呼び出すことができるようになる。

```javascript:Good👍

export default {
  namespace: true,
  actions: {
    doHoge ({ commit }) {
      commit('common/OTHER_MUTATION', payload, { root: true })
    }
  },
  mutations: {
    SOME_MUTATION (state) {}
  }
}
```

# まとめ

初心忘れるべからず。

***公式ドキュメント読め!!***

この一言に尽きると思う（恥ずかしい）。
Solidityで動的配列（可変長配列）を返す方法

いきなりタイトルが嘘だと懺悔しなければならないのですが、今現在Solidity最新版で動的配列を返す方法はないっぽいです。ただ、それっぽいことは出来るので備忘録がてらここに書いておきます。
正確な定義は分からないのですが、ここで動的配列は要素を追加したり、配列の長さを後から変更できる様な配列とします。

理由は
1. 可変長配列はstorageで宣言する必要がある。
2. 返り値はmemoryでなければならない。

上記の理由により、動的配列を返すことはできません。
つまり下記の様なコードはエラーが出ます。

```javascript:sample.sol
// storageは返り値として取れないのでエラー
function sample1() public view returns (uint8[] storage){
  uint8[] storage array;
  array.push(1);
  array.push(2);
  return array;
}

// 可変長配列はstorageで宣言しないといけないのでエラー
function sample2() public view returns (uint8[] memory){
  uint8[] memory array = [3,4,5];
  array.push(6);
  return array;
}

```
ということで長さは別で取得して固定長長さの配列として返します。

```javascript:sample2.sol
pragma solidity ^0.5.0;

contract sample2{
   uint[] array;
    
　　// arrayにuintを追加するメソッド
    function addComponent(uint _num) public {
         array.push(_num);
    }
    
    function returnArray() public view returns(uint[] memory){
        uint array_length = array.length;
        uint[] memory arrayMemory = new uint[](array_length);
        arrayMemory = array;
        return arrayMemory;
    }
}
```
返り値は固定長のmemoryのuint配列ですが、可変長の配列arrayをこれで取得できました。

もっと簡単な方法があったら教えて下さい。