OmniAICreator/Qiita-1.07M huggingface dataset:
Selenium + Capybaraで target="_blank" をテストする

# 困ったこと
タイトルの通り、Selenium + RSpec + Capybara でRailsアプリのテスト自動化をしている際、

```html
<a href="https://www.sample.com/xxxxx" id="link" target="_blank">リンク</a>
```
のようにクリックしたら別タブで`href`にアクセスするコードがあり、クリックしたら別タブでそのページに遷移しているかを検証したかった。

色々調べたところ、`within_window`を使う例が多く出てきたのですが、もともと非推奨だったらしく今ではSelenium的にundefinedになっており使えないようだったので別の方法を模索。

# 解決方法
`swith_to`というメソッドを利用することで解決しました。
以下、ソースコード例です。

```rb
scenario "xxxxx" do
  visit root_path
  click_on :link

  # 全てのタブを取得
  windows = page.driver.browser.window_handles
  
  # 最後に開いたタブに移動=リンククリックで開いたタブ
  page.driver.browser.switch_to.window(windows.last)
  
  # URLを検証（ここは自由に検証を）
  expect(current_url).to eq "https://www.sample.com/"
  
  # 現在表示中のタブ=リンククリックで開いたタブをクローズ（これをしないとゴミのタブがたまる）
  page.driver.browser.close

  # 元いたタブに戻る
  page.driver.browser.switch_to.window(windows.first)

end
```

# Troubleshooting: invalid session id
テストしていると高い頻度で、

```
Selenium::WebDriver::Error::InvalidSessionIdError:
invalid session id
```
でNGになってしまう。メモリ不足とかが原因らしい。ウィンドウサイズの設定を変更したらうまくいったという人もいるがうまく行かない。
そして気づいた。`a`要素に`href`が正しく設定されていて、`target`に`_blank`が設定されていれば、まぁよしとできるんじゃないかと。

```rb
scenario "xxxxx" do
  visit root_path
  expect(find("a#link")[:href]).to eq "https://www.sample.com/xxxxx"
  expect(find("a#link")[:target]).to eq "_blank"
end
```
画面操作ができているわけではないが、どうしてもの場合はこれで応急処置できそう。


# Reference
- [rspec - Switch between different tabs using capybara or selenium - Stack Overflow](https://stackoverflow.com/questions/24745675/switch-between-different-tabs-using-capybara-or-selenium)
rails5.1以降へのバージョンアップ時に、migrationのFK制約が貼れず躓いた話

rails5.1以降で外部キーの仕様変更でコケてしまったので備忘録として。

#エラー内容・エラーに至るまでの経緯
エラーが起きたのは、railsを5.0から5.2にバージョンアップ後、
`rails db:migrate`した時でした。
ターミナル上のエラー文は以下です。

```bash:bash
-- create_table(:tours, {:options=>"ENGINE=InnoDB", :id=>:integer})
rails aborted!
StandardError: An error has occurred, all later migrations canceled:

Column `user_id` on table `tours` does not match column `id` on `users`, 
which has type `bigint(20)`. 
To resolve this issue, 
change the type of the `user_id` column on `tours` to be :bigint.
 (For example `t.bigint :user_id`).
Original message: Mysql2::Error: Cannot add foreign key constraint: 
CREATE TABLE `tours` (`id` int NOT NULL AUTO_INCREMENT PRIMARY KEY, `tourname` varchar(255),
 `tourcontent` text, `user_id` int, `created_at` datetime NOT NULL, `updated_at` datetime NOT NULL, 
 INDEX `index_tours_on_user_id`  (`user_id`), CONSTRAINT `fk_rails_644aa67ccf`
FOREIGN KEY (`user_id`)
  REFERENCES `users` (`id`)
) ENGINE=InnoDB
Caused by:
Mysql2::Error: Cannot add foreign key constraint
```

また、toursテーブル作成時のmigrationファイルは以下です

```bash:toursテーブル作成時のmigrationファイル
# frozen_string_literal: true

class CreateTours < ActiveRecord::Migration[5.0]
  def change
    create_table :tours do |t|
      t.string :tourname
      t.text :tourcontent
      t.references :user, foreign_key: true

      t.timestamps
    end
    add_index :tours, %i[user_id created_at]
  end
end

```


#rails5.1以降はreferenceがbigint型で生成される
エラー文をざっと読んでみたところ

```
Column `user_id` on table `tours` does not match column `id` on `users`, 
which has type `bigint(20)`. 
To resolve this issue, 
change the type of the `user_id` column on `tours` to be :bigint.
 (For example `t.bigint :user_id`).
```

ここらへんがエラーの原因＆解決策っぽいですね。
「toursテーブルのuser_idカラムがuserテーブルのidと一致しません。user_idはbigint型です。解決するために、toursテーブルのuser_idをbigint型にしてください」
という意味だと解釈。

え、user_idってinteger型じゃないの？？と疑問に思ったのですが、

[Rails 5.1以前に作成されたテーブルにFK制約を張れない問題の解決策](https://qiita.com/takeoverjp/items/bb56d6a8eae191cd3732)

バッチリ書いてありました。。。rails5.1以降はuser_idのようなカラムがbigint型で生成されるとのことでした。

外部キーエラーの原因なんですが、今回の場合だと、usersテーブルのid(bigint型)とtoursテーブルのuser_id(integer型)の異なる型を持つカラムが混在している状況なので、整合性が取れず、FK制約が貼れないらしいです。

#railsバージョンアップ時はmigrationファイルのバージョンも確認しよう
しかし、toursテーブルのuser_idがinteger型になっていたのはなぜだろうと考えていたところ、有識者の方からmigrationファイル内で継承元クラスのActiveRecord::Migration[5.0] と ActiveRecord::Migration[5.2]が混在しているとご指摘をいただきました。
railsをバージョンアップした際に、migrationファイルのバージョンを確認できていなかったようです...


指摘して頂いたとおりに、バージョンを訂正したところ無事想定どおりの動きをしてくれるようになりました。
感謝！！

#まとめ
・rails5.1以降はreferenceがbigint型で生成される
・railsバージョンアップ時はmigrationファイルなどのバージョンも確認しよう
numpyのスライシング

Pythonで始める機械学習に手を出し初めたのだが、numpyを扱うのが初めてなので調べながら進めている。
スライシングについて忘れそうなので、ここに纏めておく


# まず行列を作る
テキトーに3×5行列を作る

```python
a = np.arange(15).reshape(3, 5)
```

```:出力
[[ 0  1  2  3  4]
 [ 5  6  7  8  9]
 [10 11 12 13 14]]
```

#スライシング
スライシングとは行列において特定の範囲の要素のみ抜き出す操作です。
二次元行列であれば```[start:end:step, start:end,step]```で記述します。

0~1行、0~1列を抜き出したいなら

```python
b = a[0:2, 0:2]
```

```:出力
[[0 1]
 [5 6]]
```

##省略もできるよ。
```[start:end:step, start:end,step]```各パラメータは省略することができる。
行のendを省略してみる。そうすると、最後の行まで選択される。

```python
b = a[0:, 0:2]
```

```:出力
[[ 0  1]
 [ 5  6]
 [10 11]]
```

##「:」を抜くとどうなるん？
「Pythonで始める機械学習」では時々「:」を入力していないので、これもどんな効果があるのか試してみる。

```python
b = a[2, 4]
```
```:出力
14
```
単に2行目、4列目（右下）の要素が出力された。
「:」を省略すると、単に要素を指定できる。

## 片方の「:」を抜くとどうなるん？
面白くなってきたので、列の「:」のみ取り除いてみる。

```python
b = a[:, 4]
```

```:出力
[ 4  9 14]
```
と、4列に位置する要素のみ**ベクトルの形**で出力できた。

行の「:」を抜くとどうなるの？

```python
b = a[2, :]
```

```:出力
[10 11 12 13 14]
```

**こちらもベクトルである！！！**分かりづらい。。。


## まとめ
よく考えたら自明だった；
Exception: python3.5 -c 'import imp; print(imp.get_tag())' failed with status code 127

## 前提条件：
Ubuntu16

## 発生状況：

```
sudo apt install python3-sip
sudo apt install python3-pyqt5 
```

の実行したときに生じた。

```
Exception: python3.5 -c 'import imp; print(imp.get_tag())' failed with status code 127
```

## 状況の解釈：

インストール作業の中でpython3.5 のインタプリタ起動しているが、python3.5のインタプリタにPATHが通っていないことによって生じている。

python3.5の所在
/usr/bin/python3.5

## 対処方法
python3.5 のある/usr/bin をPATHの最初に設定する。

```
$ export PATH=/usr/bin/:$PATH
```

$ python3.5 でPython3.5のインタプリタが立ち上がることを確認する。

以下のコマンドを再度実行する。

```
sudo apt install python3-sip
sudo apt install python3-pyqt5 
```

私の場合は、このようにして問題が解決した。
【Ruby】入力された値の処理

# この記事の概要
・Rubyについて、Progateで学んだことを書き記す
・ガチ初心者によるもの
・主に備忘録として、随時書き足していく

# 項目
## 入力された値を受け取る
※入力フォームに入力された値を取得する方法とは全く別の可能性あり、あとで加筆修正

` info = gets.chomp `

` count = gets.chomp.to_i //入力された内容をint型で受け取り、変数に代入 `
【Ruby】クラスを定義する/インスタンスをあれこれする

# この記事の概要
・Rubyについて、Progateで学んだことを書き記す
・ガチ初心者によるもの
・主に備忘録として、随時書き足していく

# 項目
## クラスの使用

```
Class Menu
    attr_accessor:name  //Menuクラスが持つインスタンス
    attr_accessor:price  //Menuクラスが持つインスタンス
end

menu1 = Menu new //Menuクラスからインスタンスを生成し、変数Menu1に代入
menu1.name = "pizza" //Menuクラスのインスタンス変数であるnameに値を代入
puts menu1.name

実行結果）pizza
 ```

##　インスタンスメソッドの利用

```
Class Menu
    attr_accessor:name
    attr_accessor:price

  def show  //Menuクラス内でメソッドを定義（＝インスタンスメソッド）
    puts "today's menu"
  end
end

menu1 = Menu.new
menu1.show  //インスタンスメソッド呼び出し

実行結果）today's menu
```

## インスタンス変数の利用

```
class Menu
  def show_name
    puts "My name is #{self.name}"
  end
end

menu1 = Menu.new
menu1.name = "tanaka" //インスタンス変数に値を代入
menu1.show_name  //インスタンスメソッドの呼び出し
```

## IF文を含んだインスタンスメソッド呼び出し例

```
class Menu
  attr_accessor :name
  attr_accessor :price
  
  def info
    return "#{self.name} #{self.price}円"
  end
  
  # get_total_priceメソッドを定義
  def get_total_price(count)
    total_price = self.price * count
      if count >= 3
        total_price = total_price - 100
      end
    return total_price
  end
end

menu1 = Menu.new
menu1.name = "ピザ"
menu1.price = 800

# menu1に対してget_total_priceメソッドを呼び出し、その戻り値を出力
puts menu1.get_total_price(3)

```
開発者ツールでのCookie操作

# Cookieの操作

- ブラウザの開発者ツールでCookie操作

## 値の設定

```javascript
document.cookie = 'key=value;path=/'
```

## 値の無効化

```javascript
document.cookie = 'key=value;path=/;expires=' + (new Date(0)).toGMTString()
```
Fragmentの画面遷移のおさらい

# やること
Fragmentの画面遷移で単純に A -> B の画面遷移と A <- B のように
1つ前の画面に戻るのはすぐ理解できるのに
A -> B -> C の後に A <- (B) <- C のように C から A に戻るのが苦戦するので
メモを残すことにしました。
(Webアプリでよくある　
　一覧画面(A) -> 詳細画面(B) -> 変更画面(C) -> 確認画面(D) -> 一覧画面(A) 
　のようなパターンだけど、アプリでも類似のものは意外と出くわす印象があります。)

# 作ったアプリ
https://github.com/shinya-takano/FragmentSample
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/384422/d5c15a90-3747-fba2-e242-de480c62a918.png" width=50%>
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/384422/7b60f441-fc88-6865-e231-c4873bb8b3e8.png" width=50%>
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/384422/edb1e85a-fe4d-52f7-2e24-826801516013.png" width=50%>
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/384422/fc1ccffe-374e-f622-e540-232ce115fd3f.png" width=50%>

単純に画面遷移するアプリですが、
画面Dから画面Aに遷移し、画面B・画面Cには戻れないようにしました。
（よくある、編集中の画面には戻れないようにする作り）

# 理解したこと

### 1. FragmentManagerはstackでした

```kotlin:FragmentD.kt
    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        Log.d("FragmentD", "onViewCreated")

        val backStackEntryCount = getMainActivity()?.supportFragmentManager?.backStackEntryCount ?: 0
        for (index in 0 until backStackEntryCount) {
            val backStackEntry = getMainActivity()?.supportFragmentManager?.getBackStackEntryAt(index)
            Log.d("FragmentD", "index=$index name=${backStackEntry?.name}")
        }
```

このコードのログが以下です。stackだと理解できました..

```kotlin:
FragmentD: onViewCreated
FragmentD: index=0 name=FragmentA
FragmentD: index=1 name=FragmentB
FragmentD: index=2 name=FragmentC
FragmentD: index=3 name=FragmentD
```


### 2. A画面に戻る場合は、B画面までのstackをpopすると理解すると良さそうです..多分

```kotlin:FragmentD.kt
        button3.setOnClickListener {
            // fragmentManager から pop したい Fragment の tag を取得(popした後のFragmentが表示される)
            val tag = getMainActivity()?.supportFragmentManager?.getBackStackEntryAt(1)?.name
            Log.d("FragmentD", "tag=$tag")
            getMainActivity()?.supportFragmentManager?.popBackStack(tag, FragmentManager.POP_BACK_STACK_INCLUSIVE)
        }
```

実行時のログは以下のようになります。tagにFragmentBを指定すると、FragmentBまでが消えて、
FragmentAが表示されます。

```kotlin
FragmentD: tag=FragmentB
FragmentA: onCreateView
FragmentA: onViewCreated
```

# 所感
画面Aに遷移したいからといって、画面AのFragmentをpopBackStack(tag, FragmentManager.POP_BACK_STACK_INCLUSIVE)してハマってました。
きちんと挙動を理解すれば、癖も把握できるのでやっぱりサンプルで理解を深めるのは
大事だと思いました。

# その他
Fragmentの拡張関数を用意しておくと、addBackStackなどは楽そうなので、参考までに。

```kotlin:FragmentExtension.kt
fun Fragment.getBackStackTag(): String {
    return this.javaClass.simpleName
}
```

```kotlin:MainActivity.kt
    fun replaceFragment(fragment: Fragment) {
        supportFragmentManager.beginTransaction()
            .replace(R.id.container, fragment)
            .addToBackStack(fragment.getBackStackTag())
            .commit()
    }
```

# 参考
自分でサンプルコード作る前まではこちらの記事を参考にしてました。
こちらの記事の方がわかりやすいと思います...
https://qiita.com/tomo1139/items/62902093d1850085742d

こちらは内部処理にも言及していて、とても参考になりました。
http://nein37.hatenablog.com/entry/2018/05/06/204943
Ruby、Railsについて

Ruby
・インタプリタ方式なのでプログラムを書いている最中に実行させることができるため、エラーを見つけやすい。
・gemと呼ばれるライブラリ群が充実しているので、Webシステム開発以外も開発ができる、非常に汎用性が高い。
Rails 
・MVCアーキテクチャを採用している
model, view,Controllerと役割分担することで、どこに何を書けば良いのかが明確になり、効率よく開発ができる。さらに、テストを自動化する仕組みを持っているので、従来のようにWebブラウザを立ち上げて操作しなくても、テストすることができます。
・ヘルパーの機能
Viewは基本的にHTMLで作成するのですが、動的なコンテンツを記述するには、HTMLの中にRubyコードを埋め込みます。また、共通的な処理の場合は、同じRubyコードを何度もHTMLに混ぜて記述することになるため、もしその共通的な処理に変更が生じたら、全部の箇所をひとつずつ変更しなければなりません。これはDRYの原則に反していて、保守性を大きく低下させてしまいます。そこで登場するのがヘルパーという機能です。ヘルパーは、Viewから呼び出すことができるメソッドを定義することができる機能です。先ほどお話した、長い処理や何度も出てくる共通処理は、ヘルパーに記述しておいて、Viewからは1行で呼び出しを書けばよいのです。
(DRY(Don't Repeat Your Self：繰り返しを避けること)
参考記事　https://kuguru.jp/2796#i-2
　　　　　https://kuguru.jp/2876#i
　　　　　https://xn--97-273ae6a4irb6e2hsoiozc2g4b8082p.com/%E3%82%A8%E3%83%83%E3%82%BB%E3%82%A4/DRY%E5%8E%9F%E5%89%87/
とりあえずdockerで自分の環境をパパっと作る

# 誰に向けて書いてるの？
- 自分のメモ用
- とりあえず難しいことは抜きでパパっとdocker環境を作りたい人
- docker使えるようになれ！と上司や先輩に言われてしまった人
- 主に***深層学習環境***を作りたい人向け（サーバー関係の仮想環境は知らん！）

# とりあえず作る
- とりあえずdockerfileを作るけども、[docker](https://www.docker.com/)のインストールの手順とか[nvidiaうんたらかんたら](https://github.com/NVIDIA/nvidia-docker)の環境構築については割愛（やる気があれば記事を書きます）とりあえずやる

## Dockerfileを作る
- ファイル名は***Dockerfile***拡張子なし
- 自分の作りたい環境の名前のディレクトリとか作ってそこにフアイル生成
- 需要なのはコマンドが一気実行できるようにすること（***&&***つけて）！！
- ベース環境は[dockerhub](https://hub.docker.com/)から探して来る

```dockerfile:Dockerfile
#なんの環境をベースに作るかを指定。今回はpytorchGPU版
FROM pytorch/pytorch:1.1.0-cuda10.0-cudnn7.5-runtime
#メンテナンス者。別に公開する気がないなら書かなくていいと思う
MAINTAINER Admin <admin@admin.com>
#ベースOSに個別で入れたいものがあるならここに記述
#今回はmecabとmatplotlibを入れてみよう！
RUN apt -y update && \
    pip install hogehoge && \
    #みたいな感じ
```
## dockerimage作成
- dockerbuildコマンドを使って、dockerfileのあるディレクトリで実行

```bash:dockerbuild
$ docker build -t test-image .
#test-imageは適宜名前変更
```
## dockerrun!!
- とりあえずコマンド実行

```bash:dockerrun
$ docker images
#docker確認
$ docker run -it --name test-image
```
- とりあえずこんな感じで何となくはできると思うよ！

#　追記項目
- なんかあれば書きます
- コメントあれば[@fleming_tone](https://www.twitter.com/fleming_tone)へ
プログラミング独学初心者によるMarkdown記法のメモ書き

みなさん, はじめまして.
tekupoko3です.

初投稿の記事.  

どんな方が閲覧してくださるかはわからないですが,
こっそり投稿を初めて、のんびりスケールアウトしていきます. 適度に.
よろしくお願いいたします.
___
#Markdownとは#
要するに  

メモ書きを（ちょっとだけ）プログラミング風にしたけれど
基本メモ書きとしても（ちょっとは）見栄えのする記述になってますし
多少応用も利きますよ,

という, 文章の記述方法.  

#特徴#
 - *文章構造を簡単に明記* できる
 - 読み書きはメモ帳やテキストエディットなど*txtファイルが読み込めれば可*
 - いくつかの記事投稿サイト（はてなブログ、Qiita、githubなど）で使うと自動的に装飾を施してくれる
 - スライド形式に出力してくれるサービスも有る

##効用
###1, アウトプット脳を鍛えるには丁度いい
論理構造を磨くことができます。
しかもパソコンが使えれば「いつでも」「どこでも」「誰でも」.
###2, 復習にも丁度いい
アウトプットという行為はいつでも思考を整理させてくれます.
たとえそれがメモ書き程度の思考だとしても、記録に残しやすければ見返すこともできます.
しかし, それがためにわざわざ都度パワーポイントやPagesなどを起動する必要はありません.

チリツモです.

##デメリット##
デメリットとしては

 - 記事投稿サイトに依って細かな文法が異なる
 - 非エンジニアにとっては、直接読むには少し癖がある

といった点でしょうか. 特に前者は慣れないと初めは混乱しやすいかもしれません.
きっと慣れれば気にならなくなる.

##文法##
簡単なものだけ.

### １， 見出し ###
「\#（ハッシュ）記号」を重ねます. 数が多いほど小さな見出しになります
<例>

```
#見出し１#
##見出し2##
###見出し3###
####見出し4####
#####見出し5#####
######見出し6######
```
<結果>
#見出し１#
##見出し2##
###見出し3###
####見出し4####
#####見出し5#####
######見出し6######

### ２, リスト　###
「-（ハイフン）」, 「+（プラス）」, 「*（アスタリスク）」のいずれかを使います.
上記記号のあとに「半角スペース」を一つ追加するのがポイントです.
リストのインデントも可能です.

また, ここQiitaではリストの前に「改行」がないとうまく認識しないようです.
これはサービスに依って差がありそうです.
####<例>
```
\←ここに改行
- リスト１
- リスト2
    - リスト２-1
* リスト3
```
<結果>


- リスト1
- リスト2
    - リスト2-1
* リスト3

### 3, ソースコード ###
「`（バッククオート）」を使います.
日本語キーボードだと"Shift + ＠"で打てるかと思います.
~~なぜUSキーボードの話をしないのか、その理由は闇が深いのでここでは省きます~~

<例>


>\`\`\`
ここにコードを書きます
>\`\`\`

<結果>

```
ここにコードを書きます
```

### 4, 引用 ###
「>」を使います.
先程のソースコードの例も, 「`」では表現できなかったため敢えて引用で表現しました.

<例>

```
>これは引用です.
>>引用に引用を重ねることもできます.
```
<結果>

>これは引用です.
>>引用に引用を重ねることもできます.

### 5, 強調 ###
「*（アスタリスク）」を強調したい文字の前後に重ねます.
１つだと斜体, ２つだと太字となります.
<例>

```
ここは*ポイント*です.
ここは**重要**です.
太字斜体にしたい場合は***さらに重ねましょう.***
```
<結果>

ここは*ポイント*です.
ここは**重要**です.
太字斜体にしたい場合は***さらに重ねましょう***.

※どうやら、太字斜体もサイトに依って記法差がありそうです.
「\*\*  \*強調したい文字\* \*\*」のように. 半角スペースを入れないと機能しないサイトも有りました.
とにかく入れ子にして重ねる, これがミソです.

##最後に
こんな記事は探せばいくらでもヒットしますが, まずは初投稿よろしく自分用の備忘録として.
今後もすこしづつアップしてみます.

ちなみに, 久々のコーダ系記事作成なので, 久々に句読点にこだわってみました.
（本当は、こうしたい。）
好みの問題でしょうが, 独学なので業界標準がいまいちピンときません.
皆さんどちらがお好みですか?

##参考記事
Markdownについて、詳細はこちら
- [Markdown記法 チートシート - Qiita](https://qiita.com/Qiita/items/c686397e4a0f4f11683d)
- [メモ書きやドキュメント作成に便利な「Markdown記法」を使ってみよう _ ビジネスとIT活用に役立つ情報](https://www.asobou.co.jp/blog/bussiness/markdown)
- [Markdownとは · 日本語Markdownユーザー会](https://www.markdown.jp/what-is-markdown/)
- [Markdown - Wikipedia](https://ja.wikipedia.org/wiki/Markdown)
Chromeの履歴をAWSから護る(chrome-extension)

# 背景

今日調べたアレどこだったかな～

履歴に残ってるハズだよね、、、

![unnamed.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63018/4ad1163d-3c1d-523d-5425-d7698044def9.jpeg)

、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、  
### awsコンソールばっかり！

履歴をまったく残さないわけにもいかないし、要らない履歴は消したいし、
そうだ！~~京都へ行こう~~ chrome-extensionを作ろう


# 仕様

- 指定したURLだけ履歴から消す
- ワイルドカード指定を可能にする

### ブレスト

とくになし。設定画面が面倒くさそう ← 実際そのとおりだった
 

# ファイル構成

[前回の反省](https://qiita.com/ctrlzr/items/80bd6e9c4e1e73ca8c41)を活かし、min化しない

root_folder
│  manifest.json
│  options.html
│
├─img
│      icon-128x128.png
│      icon-16x16.png
│      icon-48x48.png
│
├─js
│      background.js
│      jquery-3.4.1.min.js
│      script.js
│
└─css
       chromeapp.js



# ソース

- manifest.json 

履歴を削除する権限がhistory
設定をローカルストレージに保存する権限がstorage
多言語対応はめんどくさい:sweat:

```manifest.json
{
  "name": "off-the-record History",
  "version": "1.0.0",
  "manifest_version": 2,
  "description": "off-the-record history",
  "permissions": [
    "history",
    "storage"
  ],  
  "background": {
    "scripts": ["js/background.js"]
  },
  "icons": {
    "128": "img/icon-128x128.png",
    "48": "img/icon-48x48.png",
    "16": "img/icon-16x16.png"
  },
  "options_ui": {
    "page": "options.html",
    "chrome_style": false
  }
}
```

- script.js

設定画面のjsなので省略:sweat:
jquery-3.4.1.min.js も設定画面用


- background.js

設定とmatchしたら、chrome.history.deleteUrl するだけ。
イベントはconsole.logで確認し、onVisited のみにした。
matchしたらすぐに処理を終えたいので `for (var i=0;・・・` を使用した。forEachはbreakできないそうな。

```background.js
chrome.history.onVisited.addListener(function(history_item) {

    chrome.storage.sync.get([chrome.runtime.id], function(val){

      var jsonstr = val[chrome.runtime.id];
      if (!jsonstr) {
        return;
      } 
      var patterns = JSON.parse(jsonstr);
      if (0 == patterns.length) {
        return;
      } 

      for (var i=0; i<patterns.length; i++) {
        var pattern = patterns[i];
        if (!pattern.checked) {
          continue;
        }

        if (history_item.url.match(pattern.regexp)) {
          chrome.history.deleteUrl({url: history_item.url});
          break;
        }
      }
    });
    
});

```

# 注意点

[前回の注意点](https://qiita.com/ctrlzr/items/b84ff452030b05765cab#%E6%B3%A8%E6%84%8F%E7%82%B9)と同じ

# 公開

[off-the-record History](https://chrome.google.com/webstore/detail/off-the-record-history/pmpakmbebdhmaamjdnbjpkdlilkmkjom)

自分で言うのもなんですが、便利です。
今のところ以下の4つを指定しています。


### 履歴除外設定

```
https://*.slack.com/
https://*.aws.amazon.com/
https://*.heroku.com/
https://photos.google.com/
```

# 課題

- 設定をインポート＆エクスポートできると便利

めんどくさいので万年課題。ユーザー数が1000超えたら考えるということで:sweat:


# 懸念事項

- 設定URLが増えたときのパフォーマンス。遅いようなら上限数を設ける
Laravel 雑なまとめ

自分用メモです。
下書きがいっぱいになってしまったので仕方なく、、恥ずかしいので見ないで。。

###マイグレーション作成

```
php artisan make:migration create_items_table --create=items
```

カラム追加時

```
php artisan make:migration add_votes_to_users_table --table=users
```

###seeder作成からのシーディング

```
php artisan make:seeder ItemsTableSeeder
///seederを書き上げたら
composer dump-autoload
php artisan db:seed --class=ItemsTableSeeder
```

###全てを作る時

```
php artisan make:model Item --resource
```


#Laravel注意点

* Eloquentのinsertはcreateと異なり、created_atとupdated_atが入らない。
が、多次元配列化を引数に渡せば、複数レコードを同時に代入できる。
* N+1問題はeagerロードでEloquentのwithを使う。

# クエリ確認
```
DB::enableQueryLog();

// クエリ

dd(DB::getQueryLog());
```
Kodiライブラリーのアルバム等がスマホからだと200しか表示されない

# 困ったこと
Windows上のKodiでDLNAサーバーを構築、スマホからサーバー上の音楽ライブラリー見たとき、アルバムやらアーティストやらが200アイテムしか表示されない。しかも検索しても出てこない。

## 前提(環境)
以下の環境で試しました。

- DLNAサーバー
    - Windows 10 Pro (1903)
    - Kodi 18.4 ストアアプリ(UWPアプリ)じゃない方
- DLNAクライアント
    - Andoriod 9のスマホ
    - VLC MediaPlayer

# 解決方法
%APPDATA%\Kodi\userdata\upnpserver.xmlの

```xml
<MaxReturnedItems>200</MaxReturnedItems>
```
200の部分を変更。
(最初UWPアプリ版のKodiを入れていて、upnpserver.xmlが見つからなくて困った)

# その他
いろいろ困ったこと。簡単に。

## 日本語化
タグ情報が豆腐だらけになるので日本語化する。フォントも変更しなければならない。
http://tecnosite.co.jp/en/content/30-tmp9054k-support

## タグの文字化け
ID3タグの文字コードの関係で文字化けする。Mp3tagで「ID3v2.4／文字コードUTF-8」にする。
https://naripp.hatenadiary.org/entry/20121106/1352183856
  
## DLNAサーバーの設定
https://freepc.jp/kodit
(「HTTPを介したリモートコントロール」とかはOnにしなくても良さそうですが。)
MATLAB®で生成されたC / C ++から高位合成の加速

##はじめに##

自己紹介
十年間にわたり組込みOSの分野でFAE/プロジェクトマネージャを経験。
現在はヘテロマルチコア向けのソースコード解析や最適化を行うSilexicaで奮闘中。


HLSの一般的なユースケースは、サードパーティーによって生成されたもの、あるいは既存のC/C++アルゴリズムをHLSコンパイラを使用してハードウェア実装に変換します。しかし、基礎となるコードについての洞察や理解がほとんどない場合、開発者に多くの課題を与える可能性があります。 SLX FPGAは、開発者がHLSのアルゴリズムコードを理解し最適化のサポートをすることによって、これらの課題に対する解決策を提供します。

最近発表された[ホワイトペーパー](https://www.silexica.com/resources/#whitepapers-reached)では、SLXFPGAを用いてMATLAB Embedded Coder™で生成されたC/C+アルゴリズム（この場合はカルマンフィルター）を使用し、HLS用にC/C++　コードを最適化する方法について解説されています。この例では、プラグマが挿入されていない元のコードに対してHLSコンパイラによって生成されたソリューションと比較し、SLX FPGAがHLSプラグマを自動挿入したコードのほうがパフォーマンスが62倍以上も改善されました。
![grafik.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423336/80645122-63fa-5681-a844-4cd50eb03bc0.png)

ホワイトペーパーでは、以下の設計フロー手順について詳しく説明します。

![grafik.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423336/371dc3ba-bc4c-85da-06b4-ad84d6dfae13.png)



##HLS用の合成不可能なコードのリファクタリング 

MATLAB Embedded CoderでアルゴリズムC/C++コードを生成した後、SLX FPGAはHLSコンパイラによって合成不可能なコードを識別し、コードをHLS合成可能なコードに変換するための自動およびガイド付きコードリファクタリングを提供します。
![grafik.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423336/13ba746c-749f-fde8-6eca-c87c119a60ab.png)



##並列処理の検出

SLX FPGAは並列処理を検出し、ハードウェア実装でどのように活用するかを開発者にガイドします。 また、並列処理の障害をフラグで示し、ユーザーがそれらの障害を排除することを助け、追加の並列処理を行えるようにします。
![grafik.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423336/69f0e90e-0b87-50f5-4343-4800a088e514.png)


##ハードウェアの最適化

SLX FPGAは、適切な関数のパイプライン化とループの展開を調査し、ターゲットプラットフォームで使用可能な配列分割と利用可能なインターフェースのデザインスペースを通じてハードウェアにデータを提供します。
![grafik.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423336/73f884e7-77cb-5f4d-5724-3419bda2b6fe.png)




##プラグマ挿入  

SLX FPGAは、コンパイラの最適化を導くHLSプラグマを自動的に挿入します。また、 HLSプラグマには、チューニングが必要な様々なパラメータが含まれています。 SLX FPGAは、静的および動的解析データを活用し、最適化アルゴリズムと組み合わせることとで、開発者が提供する制約に基づいて調整および最適化されたプラグマを挿入します。
![grafik.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423336/c27f4f80-b2fb-403a-b5a5-e51472a5e519.png)



SLXとVivado HLSを使用してMATLAB Embeddedコーダーによって生成されたアルゴリズムをFPGAに実装する方法に関しては、ホワイトペーパー「[MATLABで生成C / C ++からの高位合成の加速](https://www.silexica.com/resources/#whitepapers-reached)」をダウンロードしてください。ライブデモ、またSLX FPGAの評価を検討したい場合は、こちらからお問い合わせください。
（brew/brew-cask )インストールパッケージのバージョン一覧表示

超便利なパッケージマネージャーbrew/brew caskにて、インストールしたパッケージのバージョン一覧をぱっと出す方法。

既に下記記事にて考案されていましたが、執筆者様が公開された当時よりcaskroomのパスが変わったらしくそのままでは使用できなかったため、修正版を残しておきます。
https://qiita.com/kkdd/items/a4e75e95d0445499e3c6

```sh
> brew list --versions | awk '{printf("%-18s %s\n",$1,$NF)}'
gettext            0.20.1
libidn2            2.2.0_1
libunistring       0.9.10
maven              3.6.2
ncurses            6.1
openssl            1.0.2s
openssl@1.1        1.1.1d
pcre               8.43
wget               1.20.3_1
zsh                5.7.1
```

```sh
> brew cask list | cut -d' ' -f1 | xargs -I % bash -c "echo -n %' '; ls -C /usr/local/Caskroom/%" | awk '{printf("%-18s",$1);$1="";print}'
clipy              1.2.1
docker             2.1.0.2,37877
eclipse-jee        4.12.0,2019-06:R
google-chrome      74.0.3729.131
google-japanese-ime latest
iterm2             3.2.9
java               12.0.2,10:e482c34c86bd4bf8b56c0b35558996b9
kitematic          0.17.8
slack              4.0.3
spectacle          1.2
visual-studio-code 1.38.1
```
Set-ExecutionPolicy コマンドレットの主なオプション

詳しくは[公式ドキュメント](https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.security/set-executionpolicy?view=powershell-6)を参照。

### 実行ポリシーの指定
```
-ExecutionPolicy <実行ポリシー>
```

設定可能な値は以下の通り。

* `AllSigned`: 署名付きのスクリプトのみ実行。
* `Bypass`: すべてのスクリプトを確認なしで実行。
* `Default`: クライアント OS では `Restricted` と同じ。サーバー OS では `RemoteSigned` と同じ。
* `RemoteSigned`: ローカルにあるスクリプトを実行。インターネットから取得したスクリプトの実行には署名が必要。
* `Restricted`: スクリプトを実行しない。
* `Undefined`: 実行ポリシーを設定しない。すべてのスコープで `Undefined` であれば `Restricted` と同じ。
* `Unrestricted`: ローカルにあるスクリプトは確認なしで実行。インターネットから取得したスクリプトの実行には確認が必要。非 Windows 環境では常にこの値。

### スコープの指定
```
-Scope <スコープ>
```

設定可能な値は以下の通り。

* `CurrentUser`: 現在のユーザー。
* `LocalMachine`: すべてのユーザー。
* `Process`: 現在の PowerShell セッションのみ。

省略した場合は `LocalMachine`。

`LocalMachine` の実行ポリシーを変更するには PowerShell を管理者として実行する必要がある。

### 確認せずに設定
```
-Force
```
cloud9でRailsチュートリアル初学者にありがち？な、「Bitbucketへ反映されない」「git push heroku masterでエラーが出る(デプロイできない)」「インストールしたはずのHerokuが消える」の対処法

# 対処法
ググったら出てくる他の様々な対処法を実行してみる前にまずやってほしいです。
いきなり結論からですがターミナルのcdの場所を確認してください。

例えば1章なら

```
ec2-user:~/environment/hello_app (master) $ 
```
2章なら

```
ec2-user:~/environment/toy_app (master) $ 
```
の様な状態になっていたらokです。

日をまたいで学習したりするとcloud9がリログしてるっぽい画面になり、ターミナルが

```
ec2-user:~/environment (master) $ 
```
の様なappではない場所に戻っていることがあります。

これに気付かないでターミナルを操作しているとタイトルにあるような

- Bitbucketへ反映されない
- git push heroku masterでエラーが出る(デプロイできない)
- インストールしたはずのHerokuが消える

みたいな問題が発生してしまいます。
(実際私がこれらの問題で頭を抱えておりました……。)

もし戻っていましたら

```
cd ~/environment/hello_app/
```
のコマンドで再び自分が作業しているappの場所へ移動してください。

超初心者な内容ですが問題に直面している方の解決になれたら幸いです。
エクセルVBAでのレコードセットの運用について

簡単な覚書ですが、誰かの役に立てれば幸いです。
ExcelとAccessの連携を取りたい時に色々調べた結果、便利そうなレコードセットという機能を発見しました。
#レコードセットについて
VBAの参照設定することで使える配列より勝手がいいかなと思う情報の集合体
イメージはテーブルを作っていくイメージ(と、いうか実際にテーブルとして扱われるのを無理やり扱ってるのかも)
#配列との違い
配列は1つの型のみ設定出来ますが、
レコードセットは各フィールド毎に型設定出来るので、次のようなデータを扱い時などに便利

|No|名前|給料|住所|
|:-----------------|------------------:|:------------------:|:------------------:|
|1|AAA|15円|熊本|
|2|BBB|20円|愛知|

配列では、2次元配列を準備してなんとか入れる事は出来ますが、どこに何が入っているかが面倒

レコードセットでは
フィールドという箱を準備し、その中にデータを格納出来るのですごく便利です。
イメージは配列の箱ごとに名前を付けてあげるイメージ？

#実際の定義方法
参照設定で、"Microsoft ActiveX Data Object *** Library"を選択
(***はバージョンです。自分の環境だと6.1が最新でした)

あとはエクセルVBA内で

```vb
'追加
sub otamesi()
 dim Rs as new Adodb.Recordset
end sub
'ここまで
```
オブジェクトを定義し、好き勝手使えます。
(Rsは変数名なので、お好きにどうぞ)

#使い方
主に自分が使う機能を記載します
##フィールド定義
そもそも値を入れる箱を準備する必要がありますので、その対応を行います。

```vb
sub otamesi()
 dim Rs as new Adodb.Recordset

'追加
 with Rs.Fields
  .append "フィールド名", adVarChar, 65535
 End with
'ここまで
end sub
```
##解説

|対象|説明|
|:------------------|:-----------------|
|.append|フィールド追加用のメソッド|
|"フィールド名"|セットするフィールド名|
|adVarChar|セットする型|
|65535|adVarCharは文字列型であり、文字数のセットが必須のため、65535文字入るよう設定(こんなに長くは要らないのでお好きに)|
型などの制約は[MSDN](https://docs.microsoft.com/ja-jp/office/client-developer/access/desktop-database-reference/append-method-ado
)の"Type"の項目を参照ください

#フィールド値設定
実際にフィールドに値を格納します

```vb
sub otamesi()
 dim Rs as new Adodb.Recordset

 with Rs.Fields
  .append "フィールド名", adVarChar, 65535
 End with

'追加
 Rs.Open
 with Rs
   .addnew
   !フィールド名 = "愛してるのさ君たちを！"
   .update
 End with
'ここまで

end sub
```
##解説
まずは値を入れたり、参照したりする際は"Open"必要なので忘れずに
当然使い終わった後に"Close"後、メモリ解放ください(マクロ終了時にメモリ解放されるみたいなので厳密にやる必要はないかもですが、[アトゼキ](https://www.web-nihongo.com/k_hougen/kh_p017/)の気持ちでやりましょう)

|対象|説明|
|:------------------|:-----------------|
|.Open|レコードセットを使いますよーという命令|
|.addnew|新しく情報登録しますよーという命令|
|!フィールド名 = "愛しているのさ君たちを!"|値を入れるフィールドを選択し、値をセット可能。文言は[ACの主任](https://dic.nicovideo.jp/a/%E6%84%9B%E3%81%97%E3%81%A6%E3%82%8B%E3%82%93%E3%81%A0%21%E5%90%9B%E3%81%9F%E3%81%A1%E3%82%92%21)|
|.update|設定した値を登録レコードセットに登録してねという命令|
"Rs!フィールド名"で指定のフィールド名を参照できます
具体的な内容自体はMSDNにありますので、以下を参照ください
・[Open:R/W許可](https://docs.microsoft.com/ja-jp/office/client-developer/access/desktop-database-reference/open-method-ado-recordset)
・[Addnew：新規レコード追加時に呼び出し必要](https://docs.microsoft.com/ja-jp/office/client-developer/access/desktop-database-reference/addnew-method-ado)
・[Update：レコードセット更新](https://docs.microsoft.com/ja-jp/office/client-developer/access/desktop-database-reference/update-method-ado)

#ワークシートへの出力
これが一番簡単だと思います

```vb
sub otamesi()
 dim Rs as new Adodb.Recordset

 with Rs.Fields
  .append "フィールド名", adVarChar, 65535
 End with

 Rs.Open
 with Rs
   .addnew
   !フィールド名 = "愛してるのさ君たちを！"
   .update
 End with

'追加
 Rs.MoveFirst
 Range("A1").CopyRecordset(Rs)
'ここまで

end sub
```

#解説
|対象|説明|
|:------------------|:-----------------|
|.MoveFirst|レコードセット一覧の一番初めに戻してねという命令|
|Range("A1").CopyRecordset(Rs)|現在開かれているワークシートのレンジA1を起点にレコードセットの内容をコピペしてねという命令|

#終わりに
正直ここまで書くのに2時間かかったので、続きは次回・・・
VScode の設定を簡単に共有する Settings Sync の使い方

複数の端末間で VSCodeの設定を共有できる Settings Sync の使い方です。

SettingSync は有名なプラグインで、他の方も同じような記事を挙げられているのですが、アップデートがあったのか、かなり簡単に使えるようになっていたため、その方法を紹介します。

とても簡単に設定できるので、ぱぱっとやってみてください。

# VSCodeの設定をUploadする

## プラグインのインストール
<img width="1440" alt="Screen Shot 2019-09-16 at 21.39.17.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252342/3d0ec050-c679-34f5-45df-92be4df146d2.png">
Extensions から `Setting Sync` のプラグインを検索し、インストールします。

## GitHubとの連携

<img width="1440" alt="Screen Shot 2019-09-16 at 22.08.24.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252342/1a72f03a-1943-358f-5909-8ec7d122b7dc.png">

コマンドパレットで `Sync` (Sは大文字) と検索してでてくる `Sync: Update/Upload Settings` 、
もしくは `Shift + Option + U` (Macの場合) のショートカットを実行します。

<img width="1440" alt="Screen Shot 2019-09-16 at 21.48.24.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252342/5fa783e7-bbbb-f8b9-69f5-67adcda15969.png">

すると、 `Login With GitHub` と書かれた、GitHubへのリンクがあるタブが開かれるので、
ここをクリックし、遷移先でGitHubへのログイン、SettingSyncへRead権限等の付与を行ってください。

`Success! You may now close this tab.`
と、成功したっぽいメッセージが表示されれば、GitHubとの連携は完了です。

## 設定のUpload

<img width="1440" alt="Screen Shot 2019-09-16 at 22.01.02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252342/4d39d6dc-9848-a32c-02df-3cf555f2b0e4.png">

もう一度、コマンドパレットで `Sync: Update/Upload Settings` 、
もしくは `Shift + Option + U` (Macの場合) のショートカットを実行します。
すると、設定のUploadが行われるはずです。

<img width="1440" alt="Screen Shot 2019-09-16 at 22.32.01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252342/b209b64a-fb41-8ed2-eabd-869c0aee4881.png">

gistのページにアクセスすると、設定がuploadされていることが確認できると思います。

# 共有先で設定をDownloadする

## プラグインのインストール
<img width="1440" alt="Screen Shot 2019-09-16 at 21.39.17.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252342/3d0ec050-c679-34f5-45df-92be4df146d2.png">
共有先でも、`Setting Sync` のプラグインをインストールします。

## Githubとの連携
<img width="1440" alt="Screen Shot 2019-09-16 at 22.08.24.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252342/1a72f03a-1943-358f-5909-8ec7d122b7dc.png">

その後、コマンドパレットで `Sync: Download Settings` 、
もしくは `Shift + Option + D` (Macの場合) のショートカットを実行します。

すると、 `Login With GitHub` の書かれたタブが開くので、
このリンクに飛び、設定のアップロードを行った時と同じように、GitHubとの連携を行ってください。

`Success! You may now close this tab.`
と、成功したっぽいメッセージが表示されれば、GitHubとの連携は完了です。

## 設定のダウンロード

<img width="1440" alt="Screen Shot 2019-09-16 at 22.09.12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252342/281b450e-e337-1226-a938-de8e61153533.png">

GitHubとの連携が完了すると、連携されたGitHubのGistが表示されます。
ダウンロードしたい設定がアッップロードされているGistを選択してください。

最後に、コマンドパレットで `Sync: Download Settings` 、
もしくは `Shift + Option + D` (Macの場合) のショートカットを実行すると、
設定がダウンロードされ、不足しているプラグインのダウンロード等が始まります。

# 最後に

SettingSyncを利用するにあたって使い方を調べてみると、「トークンを取得して、それをここに入れて…」といった手順が見つかり、少し面倒だなあ、と感じていました。
ただ、複数のPC間で設定が共有できる利便性はこれを上回るものだとも思うので、重い腰を上げて設定してみると…
思いの外簡単に設定できてしまい、驚きました。
SettingSyncを作られている方も、トークン発行して…という手順が面倒に感じたんでしょう…
アップデートありがとうございます。
PHPの標準入力で値取得して表示するのによく使う処理（paizaスキルチェック用）

paizaラーニングのスキルチェック問題で、標準入力から得た値を整形したり、複数行を配列に入れるなど、よく使う処理を記録。どの問題でもだいたい使うと思います。

#### STDIN から 1 行読み込む

末尾の改行コードをtrimで取り除く。

```php
$line = trim(fgets(STDIN)); 
```

#### 複数行を取得して配列に格納

値を取得できる分だけループ。取得回数が決まってるならforで。

```php
while ($line = fgets(STDIN)) {
   $array[] = trim($line);
}
```

#### 値の途中に改行コードが存在する場合に取り除く

```php
$line = str_replace(array("\r\n","\r","\n"), '', fgets(STDIN));
```

#### 文字列のスペースで分割して配列に格納

```php
$array = explode(" ", trim(fgets(STDIN)));
```

逆に、配列を文字列により連結するなら、implode

```php
$string = implode ( "," , $array );
```
【rails】モデルの記述は順番も大事 『accepts_nested_attributes_for』

# はじめに
モデルに関するエラーでハマったので備忘録として残しておきます。

# エラー内容

<img width="1437" alt="はまやんエラー文.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/442023/a16a049f-0335-8587-0a39-59c213a88864.png">


【エラー文】
**No association found for name `item_images’. Has it been defined yet?**
訳）item_imagesに対するアソシエーションが定義されていません。

`accepts_nested_attributes_for`メソッドを使うにはアソシエーションを組まないといけないのですが、
きちんと3行目で

```/models/item.rb
has_many :item_images, dependent: :destroy
```

と記述しているのに、何故定義されていないことになってるんだ？と悩みました。



# 原因

```/models/item.rb
has_many :item_images, dependent: :destroy #アソシエーションを先に書いてから
accepts_nested_attributes_for :item_images #こちらを書く
```
記述する順番が大切でした。
プログラムの基本である、上から下へ読み込まれると言う基本を見落としていました。
Bitvalley2019 in 渋谷ヒカリエに参加してきました!!

#Bitvalley2019 in 渋谷ヒカリエに参加してきました!!
## Day1セッション
1. テクノロジーとデザインによる、”感動価値” 創造への挑戦
- AWS 体験ハンズオン –セキュア＆スケーラブルウェブサービス構築
- 執念とこだわりで社会を変えるあるプロダクトマネージャーの試行錯誤
- AWS 認定にチャレンジしよう！
- 懇親会

## Day2セッション
1. 「よい」だけでは足りない！ –世界に飛び出していくために必要なマインドセット
- クラウド時代のエンジニア生存戦略 
- 経営とはソフトウェアだ –若者が担うこれからの経営と技術とキャリアの話
- BIT VALLEY 4社プロダクトオーナーが語る これからのモノづくりとは？
- 就活前に身につけておきたい、クラウド時代に必要なエンジニアスキル
- モノづくりにおけるテクノロジーとデザインの力

# ~それぞれざっくり何を話していたのか~
## Day1セッション
1. ユーザーによってインターフェースが変わっていき、体験としての価値が生まれるというように私は解釈しました...面白い話でした
2. AWSを利用してWordpress環境を構築するハンズオン 
    - スケーリングと冗長化は自分でやりたいと思います
    - ただ個人的にはこのレベルのハンズオンはスラスラいけたので次はコンソールポチポチじゃなくて、コードで構築していたいです。
    
3. 現在のプロダクトマネジメントの重要性についてお話しいただきました
    - テクノロジーによって物の価値や価値観が破壊されたり変化している
    - 日本に体験の価値はころがっているか？
    - ___プロダクト___ではなく、___プロジェクト___のみを管理しているだけだった->失敗
    - プロダクト愛を持ち、プロダクトの目標を定めた
    - 資料上がってますのでぜひ！<br>[執念とこだわりで社会を変える あるプロダクトマネージャーの試行錯誤](https://www.slideshare.net/takoratta/ss-171489351)
4. AWS認定の内容を全く知らなかったので、1から10まで学べてよかったです!
    - こんなイベントあるそうです<br>[セッション紹介 \- AWS INNOVATE オンラインカンファレンス \| 2019 年 10 月 1 \(火\) 〜 11 月 5 \(火\)](https://aws.amazon.com/jp/about-aws/events/aws-innovate/sessions/#cert-saa)
    - 平日でAWSアカウントを持っている人だったらコワーキングスペースも...<br>[AWS Loft Tokyo 〜 挑戦をカタチにする場所へ 〜 \| AWS](https://aws.amazon.com/jp/start-ups/loft/tokyo/)
5. 懇親会でお話してくださった方ありがとうございました!!<br>なんか2,30人の方と話したのでTwitterが一致しないです...笑

## Day2セッション
1. 個人的にはこのセッションが一番面白かったような気がします<br>他にまとめてるかたがいっぱいいらっしゃると思うのでその分だけ見方があると思いますが、私が感じたことです。<br>[ Madoka Sawa / 澤 円（@madoka510）さん / Twitter](https://twitter.com/madoka510)
    - 例えば物はよいだけでは売れない、価格と性能のバランスが良くないと売れない
    - そもそも、今まで世の中で言われてきた「よい」は本当に正しいのか？
    - 価値観の多様化により「よい」という考え方が___アップデート___されている
    - 日本はイノベーティブな行動をする人が少ない
    - ___「賢くて速い」___人になるために...___どうありたいか___
    - Being-自分はどう有りたいかを問いかける(自分に)
    - 世間体、固定概念が邪魔になる
    - はじめに「なにをやめれるか」を考えるとやりやすい
2. 開発をする人と、マネジメントをする人で視点別でお話していただきました
    - 成長するために小さな成功体験を作り、成功癖を作ることが大切
    - 短期、中期、長期の目標を作る
    - できない理由ではなく、できる理由を探す
    - 自分が挑戦できる環境を探し、飛び込む
3. このお話は難しかったです...認識があっているかどうか微妙です
    - 経営がソフトウェアであると考えると入力が人材や資金であり出力が利益である
    - 事業の可視化が必要
    - ソフトウェアの中に人を置き、よりひとに人らしい仕事を
4. 各社のプロダクトマネージャーに考え方を話し合っていただきました
    - ユーザーファーストかビジネスファーストか
        - サービスの歴が長くなるほどバランスが難しい
    - ユーザーから愛されるプロダクトとは？
        - 自身のプロダクトに芯を持つこと
    - PMの見せ所
         - ロジカルにまとまっているほど疑わなくなり危ない
         - 失敗をなくすのではなく打率を上げる
         - 世の中の動きを少し違う角度で見る
         - 最後は一定のリスクを持っていけるか
5. クラウド時代になり、開発がどのように変化していったかをお話していただきました
    - オンプレからクラウドへ
    - インフラ専任がいなくなった、インフラとアプリケーションの壁がなくなった
    - コーディング力がこれから重要なのではないか
6. お題がすべてキャリアの話になってました...笑<br>起業は失敗しても死なないからリスクが低いそうです()

# 感想
- 技術ゴリゴリのイメージで行ったら意外とそうではなく、よいものづくりとは？みたいな感じだった
- 「技術学んだー！」というより「ロジック学んだー！」という感じだった
- 今までエンジニアからの視点しか持っていなかったが、マネージャーやビジネス的な視点も学べた
- 意外と大学からプログラミングはじめましたという人が多かった
- いい意味で他者と比較しなくなった
- 就活の幅が広がった
Apache環境構築

# Apache環境構築
## 概要
LinuxにApacheをインストールして、基本的な設定までを行う方法を紹介します。
(ドメインとSSLなどの設定はありません。)

## 環境
- OS: Amazon Linux2
- Apache2.4.39  

## 構築手順
### インストール
```bash

// パッケージ情報確認
$ yum info httpd

// インストール
$ yum -y install httpd

// バージョン確認
$ httpd -v

// 自動起動設定
$ systemctl enable httpd.service

// 起動
$ systemctl start httpd.service

// 起動確認
$ systemctl status httpd.service
```

### 設定
`vi`コマンドを使用して、設定ファイルを作成および編集していきます。

#### ドキュメントルート設定
ドキュメントルートを`/var/www/test`に変更します。

```apache:/etc/httpd/conf.d/server.conf(新規作成)
<VirtualHost *:80>
  DocumentRoot /var/www/test
  <Directory "/var/www/test">
    AllowOverRide All
    Require all granted
  </Directory>
</VirtualHost>
```

#### ログ設定
##### ログフォーマット追加

```apache:/etc/httpd/conf/httpd.conf(編集)
<IfModule log_config_module>
    #
    # The following directives define some format nicknames for use with
    # a CustomLog directive (see below).
    #
    LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
    LogFormat "%h %l %u %t \"%r\" %>s %b" common
    LogFormat "%{X-Forwarded-For}i %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" \"%{X-Forwarded-Proto}i\"" elb-customlog
```

##### 出力制限

```apache:/etc/httpd/conf.d/log.conf(新規作成)
# ファビコンのログを出さない
SetEnvIf Request_URI "\.(ico)$" nolog
 
# 画像やJSのログを出さない
SetEnvIf Request_URI "\.(gif|jpg|png|ico|jpeg|js|css)$" nolog

CustomLog logs/access_log common env=!nolog
```

##### ログローテーション
ApacheログはDailyローテート、365日保管の設定

```/etc/logrotate.d/httpd(編集)
/var/log/httpd/*log {
    daily
    rotate 365
    missingok
    ifempty
    dateext
    sharedscripts
    delaycompress
    postrotate
        /bin/systemctl reload httpd.service > /dev/null 2>/dev/null || true
    endscript
}
```

##### セキュリティ
###### デフォルトコンテンツ対策
```apache:/etc/httpd/conf.d/autoindex.conf(編集)
# We include the /icons/ alias for FancyIndexed directory listings.  If
# you do not use FancyIndexing, you may comment this out.
#
#Alias /icons/ "/usr/share/httpd/icons/"

#<Directory "/usr/share/httpd/icons">
#    Options MultiViews
#    AllowOverride None
#    Require all granted
#</Directory>
```

###### そのほか全般
```apache:/etc/httpd/conf.d/security.conf(新規作成)
# バージョン情報の隠蔽
ServerTokens Prod 

# phpバージョンの隠蔽
Header unset "X-Powered-By"

# httpoxy 対策
RequestHeader unset Proxy
# クリックジャッキング対策
Header always append X-Frame-Options SAMEORIGIN

# XSS対策
Header always set X-XSS-Protection "1; mode=block"
Header always set X-Content-Type-Options nosniff

# XST対策
TraceEnable Off

# エンティティタグ（ETag）の出力制御
FileETag None

# HTTPOnly属性
Header edit Set-Cookie ^(.*)$ $1;HttpOnly;Secure

# HSTS (HTTP Strict Transport Security) の導入
Header set Strict-Transport-Security "max-age=31536000; includeSubDomains"

# ファイル一覧出力の禁止
Options -Indexes
```

### 再起動
```bash
// 文法チェック
$ httpd -t

// Apache再起動
$ systemctl reload httpd
```

## 関連
- [Apache脆弱性診断および対応](https://qiita.com/A-Kira/items/52e7439081c372097923)
Vimgolf One to Ten をやってみた

### 問: One to Ten

Vimgolf の[One to Ten](http://www.vimgolf.com/challenges/5c4d042acfafb4000c9f06c2)を解いてみた。

スタート(空ファイル)

```

```

ゴール

```
1
2
3
4
5
6
7
8
9
10
```

### 解答

12キーストロークでいくつか最短キーが上がっている(2019/09/16)
とりあえず1番上の解答について調べてみる

```
i0<Esc>Y9Pv}g<C-A>ZZ
```

## 解説

### `i0<Esc>`

0を書いてノーマルモードに戻る

### `Y9P`

行をコピーし、下の行に９回ペーストする

### `v}g<C-A>`

ヴィジュアルモードで段落を選択し、
g + Ctrl-Aは何をしているのかと[vim-jpのリファレンス](https://vim-jp.org/vimdoc-ja/change.html#v_g_CTRL-A)を調べていたら書いてあった。

>ビジュアル選択されたテキスト中の数字またはアルファベットに [count] を加える。複数行がビジュアル選択されている場合、各行は付加された [count] ごとに増やされる (そのため効果的に [count] ごとに増加する配列を作ることができる)。

つまり、こういうテキストを全ての行選択して

```
0
0
0
0
0
0
0
0
0
0
```

g + Ctrl-Aすると、それぞれの行にカウントアップしてくれるので

```
1
2
3
4
5
6
7
8
9
10
```

となるようだ。

### `ZZ`

保存して終了する。
初めてのAndroidアプリ開発（AndroidStudio編）

#はじめに
アプリ開発未経験者がAndroidアプリを開発することになった。
AndroidStudioってなに？
アプリってどうやって開発してんの？
上記状態の人間が得られた知識を忘れないように書き留めたものとなっています。

#AndroidStudioって？
Google社が推奨している統合開発環境。
Androidアプリを開発するためには必須の開発ツールでJavaを使用する。

**特徴**
・複数人でのソースコード管理がしやすい
・ビルドしやすい
・編集しやすい
・PC種類に関係なく開発できる　　などなど....

#覚えておいたほうがいいと思ったこと
**①Changelistはしっかりとチェックする**
Changelistとは自分なりに理解した書き方をすると
**コミットしたい箇所だけを管理してその部分だけコミットすることができるもの。**
例えば、編集はしたがサーバに上げることはしたくないファイルなどがあった場合に
Changelistでdefaultから外すとコミット時に読み込まれなくすることができる。
間違えて不必要なものをコミットしないで済むというメリットがある。

**②エミュレータ使用時のプロキシ設定**
プロキシによって外部とのやりとりを行っている環境では
エミュレータ使用時に設定を行わないとうまくアプリが動作しないことがある。
また、設定してもネットに繋がらない場合は
ターミナルなどでコマンドを入力することで起動させるとうまくいくかもしれない。（ググればでてくる）


またなにかあったら追加していく予定。
すぐ忘れちゃうlnコマンド

## シンボリックリンク作成
`-s`オプション
`/var/www`はファイル

```
ln -s /mnt/data/www/ /var/www
```

```
ln -s [リンク元] [リンク先]
```


## シンボリックリンク削除
ファイルの最後に`/`を付けるとディレクトリ扱いになる

```
unlink /var/www
```

## ディレクトリに対して`unlink`すると

```
unlink: `/mnt/data/www/www/' を削除 (unlink) できません: ディレクトリではありません
```
【Go】rand.Sourceを並列で使いまわすなんて何事だ

#結論から言うと
rand.Sourceを使いまわすとpanicが起きます。
サーバーサイドで行うと、永遠に乱数パニックです。
しかも、本番環境にリリースするまでわからないため、うっかり実装すると凶悪バグの出来上がりです。

#はじめに
インスタンスを再生成するコストを抑えるために使いまわそうと、誰でも一度は考えますよね。
スレッドセーフでどうかと言う概念を知らないと、サーバーをGoで立てたときに後悔することになります。
今回はrand.Sourceを使いまわすとどうなるのかを実験していきます。

#実験
強制的にエラーを引き起こすために並列処理でrand.Sourceを呼ぶ実装を雑に作りました。
## 環境
```
$go version
go version go1.13 darwin/amd64
````

## 実験用ソースコード
```Go:main.go
package main

import (
	"fmt"
	"math/rand"
	"sync"
)

var randSource = NewRandSource()

// rand.Sourceを使いまわすとどうなるかの実験コード
func main() {

	ch := make(chan int, 100)
	wg := sync.WaitGroup{}

	for i := 0; i < 1000; i++ {
		ch <- 1
		wg.Add(1)
		go func() {
			calcRnad()
			<-ch
			wg.Done()
		}()
		fmt.Println("for count =", i)
	}
	wg.Wait()
}

func calcRnad() {
	for i := 0; i < 10000; i++ {
		randSource.Intn(1000) // インスタンスを使いまわす場合
		//		NewRandSource().Intn(1000)// インスタンスを毎回生成する記述
	}
}

// NewRandSource 新しいインスタンスを作る
func NewRandSource() *rand.Rand {
	return rand.New(rand.NewSource(time.Now().UnixNano()))
}

```

簡単に説明すると100のスレッドを作って、10000回randを呼び出す処理を書いただけです。
動作チェックのためにエラーにならないコードをコメントしています。


##実行結果
下記の通り12スレッド目で、panic:runtimeエラーが起きました。

```
go run main.go 
for count = 0
for count = 1
for count = 2
for count = 3
for count = 4
for count = 5
for count = 6
for count = 7
for count = 8
for count = 9
for count = 10
for count = 11
for count = 12
panic: runtime error: index out of range [-1]

goroutine 22 [running]:
math/rand.(*rngSource).Uint64(...)
	/usr/local/Cellar/go/1.13/libexec/src/math/rand/rng.go:249
math/rand.(*rngSource).Int63(0xc000089500, 0xf886e3da440ba38)
	/usr/local/Cellar/go/1.13/libexec/src/math/rand/rng.go:234 +0x93
math/rand.(*Rand).Int63(...)
	/usr/local/Cellar/go/1.13/libexec/src/math/rand/rand.go:85
math/rand.(*Rand).Int31(...)
	/usr/local/Cellar/go/1.13/libexec/src/math/rand/rand.go:99
math/rand.(*Rand).Int31n(0xc0000641b0, 0x3e8, 0x165)
	/usr/local/Cellar/go/1.13/libexec/src/math/rand/rand.go:134 +0x5f
math/rand.(*Rand).Intn(0xc0000641b0, 0x3e8, 0x165)
	/usr/local/Cellar/go/1.13/libexec/src/math/rand/rand.go:172 +0x45
main.calcRnad()
	/playground/go/src/rand/main.go:32 +0x3f
main.main.func1(0xc00008c000, 0xc000016054)
	/playground/go/src/rand/main.go:21 +0x22
created by main.main
	/playground/go/src/rand/main.go:20 +0xc7
exit status 2
```

## painicとなった箇所の実装を眺めてみる
対象ファイルの237行目から

```Go:math/rand/rng.go
// Uint64 returns a non-negative pseudo-random 64-bit integer as an uint64.
func (rng *rngSource) Uint64() uint64 {
	rng.tap--
	if rng.tap < 0 {
		rng.tap += rngLen
	}

	rng.feed--
	if rng.feed < 0 {
		rng.feed += rngLen
	}

	x := rng.vec[rng.feed] + rng.vec[rng.tap]
	rng.vec[rng.feed] = x
	return uint64(x)
}

```

rng.tapとrng.feedが負の値にならないように実装しているのがわかります。

しかし、並列処理の場合は
1. スレッドA処理：rng.tap < 0のチェック
2. スレッドB処理：rng.tap--で負の値になる
3. スレッドA処理：rng.vec[rng.tap]が負のindexを見てpanicになる
となる可能性が確率的に存在します

#おわりに
並列で使わなければいいんです。並列で。

#参考
なおissuesでも議論されてる模様
https://github.com/golang/go/issues/21393
Prophet + Pythonで時系列解析

# はじめに
Facebook社が提供しているProphetという時系列を解析するパッケージを用いて、時系列分析する方法を記載しています。

ProphetのQuick Start（ https://facebook.github.io/prophet/docs/quick_start.html ）をベースに記載しつつ、いくつか補足を追記しています。

# テストデータ ダウンロード
以下からダウンロードしてください。
このデータはWikipediaのPeyton Manningの日次ログページビューの時系列だそうです。
このデータを用いて未来の日次ページビューの予測などを行います。

https://github.com/facebook/prophet/blob/master/examples/example_wp_log_peyton_manning.csv

# インストール

```python
pip install fbprophet
```

# データインポート
pandasを用いてcsvを読み込みます

```python
import pandas as pd
from fbprophet import Prophet

df = pd.read_csv('./example_wp_log_peyton_manning.csv')
```

# データの中身の確認
読み込んだデータの先頭5行を表示します。

```python
df.head()
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402872/645e3e70-5f47-0b9d-6f4c-c7b41f13fccd.png)

読み込んだデータの末尾5件を表示します。

```python
df.tail()
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402872/4b18c86f-6732-8ea5-86de-be0740df6a34.png)

2007年12月10日から2016年1月20日までの日数は2963日ですが、2905行しかありません。一部のデータが欠損しているようですが、Prophetの使い方を説明する上では大きな問題ではありませんのでこのまま進めようと思います。

# 学習
Prophetのモデルを用いて先ほど読み込んだデータを学習させます。

```python
m = Prophet()
m.fit(df)
```

# 予測するための準備
まず何日先まで予測するか範囲を決めます。
365日先まで予測する場合は、`periods`を`365`にします。

```python
future = m.make_future_dataframe(periods=365)
```

末尾5件を表示します。

```python
future.tail()
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402872/c7c0f7a9-b348-701c-ec03-2e092d09df85.png)

365日先までのびていることがわかります。

# 予測1
予測を行います。

```python
forecast = m.predict(future)
forecast[['ds', 'yhat', 'yhat_lower', 'yhat_upper']].tail()
```

上記のコマンドを実行すると以下のグラフが表示されます。
yhatが予測値で、yhat_lowerが予測される最小の値、yhat_upperが予測される最大の値というような意味です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402872/db7236fa-371a-b6cc-951f-4e642492f1d9.png)

# グラフにプロット
表で表示してもわかりづらいので、先ほど予測したデータをグラフにプロットします。

```python
fig1 = m.plot(forecast)
```

上記のコマンドを実行すると以下のグラフが表示されます。
黒い点が実データ（y）の値です。
水色の部分がyhat_lowerとyhat_upperの範囲です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402872/4b9d5228-3906-d6ac-5473-c6abfec178da.png)

# 予測2
今度は時系列の予測だけでなく、年次と週次の予測も行います。

```python
fig2 = m.plot_components(forecast)
```

上記のコマンドを実行すると以下のグラフが表示されます。
時系列の予測、年間の予測、週次の予測の3つのグラフが表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402872/14a9faf0-8953-a383-86d5-ee284f406342.png)

簡単な使い方の説明は以上です。
Prophetを用いれば簡単に時系列解析ができることがわかっていただけたかと思います。
Docker Desktop for Mac をインストールする

Docker Desktop for Mac をインストールしました。

手順は下記の通り（あとで気づいたけど、Dockerのトップページから順に行ったほうが良かった）。

[Mac OS X &mdash; Docker-docs-ja 1.9.0b ドキュメント](http://docs.docker.jp/v1.9/engine/installation/mac.html)
>Docker Toolbox のページに移動します。

Docker Toolbox のページへ。

[Docker Toolbox | Docker Documentation](https://docs.docker.com/toolbox/)
>Legacy desktop solution. Docker Toolbox is for older Mac and Windows systems that do not meet the requirements of Docker Desktop for Mac and Docker Desktop for Windows. We recommend updating to the newer applications, if possible.

Docker Desktop for Mac のページへ。

[Get started with Docker Desktop for Mac | Docker Documentation](https://docs.docker.com/docker-for-mac/)
>See Install Docker Desktop for Mac for information on system requirements and stable & edge channels.

Install Docker Desktop for Mac のページへ。

[Install Docker Desktop for Mac | Docker Documentation](https://docs.docker.com/docker-for-mac/install/)
>To download Docker Desktop for Mac, head to Docker Hub.

Docker Hub からダウンロード。インストールの前に知っておくことが書かれている。私の場合は、Dockerは今回が初めてなので、既存の環境との共存は気にしなくてＯＫ。

ダウンロード前に Docker Hub のアカウントを作成する必要あり。ダウンロードされるファイルはdmg。ダブルクリックで下記の画面がでて、ドラッグ＆ドロップでインストール。
<img width="722" alt="スクリーンショット 2019-09-16 21.58.06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497762/219b9f00-cb9a-ed03-0df9-d72113556cb7.png">


※あとで気づいたけど、Docker.comから始めた方が簡単だったっぽい。

[Enterprise Container Platform | Docker](https://www.docker.com/)
「Get Started」のボタンをクリック。

[Get Started with Docker | Docker](https://www.docker.com/get-started)
「Download Desktop and Take a Tutorial」のボタンをクリック。

Docker Hub のサインアップ（新規アカウント作成）の画面が表示されたら、アカウントを作るか、サインインする。

[Docker Hub](https://hub.docker.com/)
「Get Started With Docker Desktop」のボタンをクリック。チュートリアルへのリンクがあるページからダウンロードできます（ダウンロードdmgへのリンク先は同じ）。

チュートリアルはまた明日。
Railsでディレクトリを作成してクラスを呼ぼうとしたらハマった

Railsで`models/`の配下にディレクトリを作って、
その配下のクラスを呼ぼうとしたらハマったので、メモ

## ディレクトリ（例）

下記のような感じで、models配下に、
ディレクトを作成してそのクラスを、
コントローラーで呼ぼうとしたのだけれど、

```:directory
app/
  models/
    user.rb
    factories/
      user_factory.rb
    domains/
      user.rb
```

## うまく呼び出せなかったやつ（例）

ApplicationRecordで取得した値を、
JSONのデータ構造を作るファクトリクラスと、
データ構造を持つクラスを呼ぼうとしたのだけれど、
そんなクラスないよって怒られた。

```~/models/user.rb
class User < ApplicationRecord
    def self.find_user(login_id, password)
        user = self.find_by(login_id: login_id, password: password)
        userFactory = UserFactory.new(user)

        return userFactory.make_user()
    end
end
```

```~/factories/user_factory.rb
class UserFactory
    def initialize(user)
        @user = user
    end

    def make_user()
        return User.new(@user.login_id, @user.password)
    end
end
```

```~/domains/user.rb
class User
    def initialize(login_id, password)
        @login_id = login_id;
        @password = password;
    end
end
```

## うまく呼び出せたやつ（例）

調べたら、呼び出しかたは色々あるらしいのだけれど、
今回は、オートロードされているディレクト配下の、
`ディレクトリ名::クラス名`で指定するやり方でうまく呼び出せた。

```~/models/user.rb
class User < ApplicationRecord
    def self.find_user(login_id, password)
        user = self.find_by(login_id: login_id, password: password)
        userFactory = Factories::UserFactory.new(user)

        return userFactory.make_user()
    end
end
```

```~/factories/user_factory.rb
class Factories::UserFactory
    def initialize(user)
        @user = user
    end

    def make_user()
        return Domains::User.new(@user.login_id, @user.password)
    end
end
```

```~/domains/user.rb
class Domains::User
    def initialize(login_id, password)
        @login_id = login_id;
        @password = password;
    end
end
```

## 終わり

もっとうまいやり方はあるのだろうか？