OmniAICreator/Qiita-1.07M huggingface dataset:
[Rails] cloud9でのデバッグ方法

#結論

処理を止めたい場所で"debugger"と打ち込む

#例

```
  def create
    @voice = Voice.new
    @voice.user = current_user
    @voice.voice = params[:voice][:voice]
    
　　debugger

    if @voice.save
      redirect_to @voice, notice: 'Voice was successfully created.'
    else
      render :new
    end
  end
```

この状態でプレビュー画面にて処理を実行。（この場合だとcreateの処理を実行）

#すると

![debugger.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/561934/8d88ee52-76db-091d-ce6a-6170b775a1a8.png)

プレビュー画面が停止し、debuggerが起動される。

矢印の部分に変数などを入力することで、処理を止めた時点での変数の値を確認することができる。
VBoxのKail LinuxでArcher T4Uを使えるようにする

KailLinuxでWi-Fiのアクセスポイントを作るために、ArcherT4Uを購入したのですが
すんなり使えるようにならなかったので、メモついでに書いてみます。

初めての記事でおかしな部分も多いと思うので、
間違っている所、おかしな所があれば教えてください

#環境
- MacBookPro (15-inch,2017)
 - macOS Catalina v10.15.2
- VirtualBox 6.1.2 (kali-linux-2019.4-vbox-amd64)
- Archer T4U V3.0

#やり方

まずはパッケージのアップデートをしてから、必要なものをインストールしていきます

```bash
apt-get update
apt-get install -y　linux-headers-generic build-essential dkms
```

次にGitHubからドライバーをダウンロードします

```bash
git clone https://github.com/cilynx/rtl88x2BU_WiFi_linux_v5.3.1_27678.20180430_COEX20180427-5959.git
```

続いてパッケージのバージョンを取得するために、次のコマンドを入力して確認します
この時出力される数値をメモしておいてください

```bash
sed -n ' s / \ PACKAGE_VERSION = "\（。* \）" / \ 1 / p ' dkms.conf
```

最後にインストールしていきます
[数値]の部分を先ほど出力された数値に置き換えて実行してください

```bash
sudo rsync -rvhP ./ / usr / src / rtl88x2bu-[数値]
sudo dkms add -m rtl88x2bu -v [数値]
sudo dkms build -m rtl88x2bu -v [数値]
sudo dkms install -m rtl88x2bu -v [数値]
sudo modprobe 88x2bu
```

あとは、念のため再起動をすれば使えるようになっているはずです

#参考資料
> [Driver Github](https://github.com/cilynx/rtl88x2BU_WiFi_linux_v5.3.1_27678.20180430_COEX20180427-5959)
Railsで1日以上詰まったエラー

## Railsを始めようとしたらさっそくエラーに遭遇

Railsを始めようとしたらエラーが出て丸一日なにも進みませんでした。
今日はそのエラーを共有します。

以下のようなエラーです

``` ruby
Webpacker::Manifest::MissingEntryError in hogehoge

Showing /Users/yuhiisk/Work/sites/smout/app/views/layouts/application.html.slim where line #10 raised:
Webpacker can't find application.js in /Users/yuhiisk/Work/sites/smout/public/packs/manifest.json. Possible causes:
1. You want to set webpacker.yml value of compile to true for your environment
unless you are using the `webpack -w` or the webpack-dev-server.
2. webpack has not yet re-run to reflect updates.
3. You have misconfigured Webpacker's config/webpacker.yml file.
4. Your webpack configuration is not creating a manifest.
Your manifest contains:
{
}
```

これはwebpackerが**コンパイル**されていないことが原因です。

なので下記のコマンドで解決しました。

``` ruby
rails webpacker:install
rails webpacker:compile
```

ぜひ試してみてください！
セッションを確認する

新しいタブを開いてもセッションは同じになるということを今日知りました。
実際にコード書いて確かめてみました。

以下を参考にしました
https://itsakura.com/php_session

##ソース
https://github.com/hinamomo/laravel60-quickstart-basic/commit/9812659ed29a5766362b61778a5d9e04617dca09
この記事用に追加したのは以下２箇所(コントローラ新規作成、ルート追加)です


```app/Http/Controllers/SessionController.php
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class SessionController extends Controller
{

    public function index(Request $request)
    {
        session_start();

        if(!isset($_SESSION["count1"])){
	       $rec = "初回表示時";
	       $_SESSION["count1"]=1;

        }else{
	       $rec = $_SESSION["count1"]++;
        }
    
        return $rec;
    }
    
}
```

上記コントローラを呼ぶルート

```routes/web.php 
Route::get('/session', 'SessionController@index')->name('session');
```

##実行結果
macだとfnキー押しながらf12でブラウザ開発ツールを開き、
Application>Cookies>http://localhost/
をチェック

PHPSESSIDをチェック
<img width="954" alt="スクリーンショット 2020-01-27 23.08.13.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559953/9e09a539-ae34-7513-bc02-eb6784f1bcad.png">

何回ブラウザ立ち上げても変わらない
<img width="912" alt="スクリーンショット 2020-01-27 23.09.04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559953/34927cc3-7bf2-0dbb-0243-85a1c41366ab.png">

一度Choromeを終了し、サイド立ち上げたら別のセッションになった
<img width="903" alt="スクリーンショット 2020-01-27 23.12.54.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559953/4825a2bb-691c-0de0-3a8c-ea0d89192516.png">

##感想
クッキーやセッションについて改めて調べて見ると色々な発見が。。
勉強になりまする。
今まで意識してないの反省。。
新しいセッションを開始するために一回Choromeを終了した時、
Qiitaの下書き消えた！！:fearful:と思いましたが、自動保存されていました。
素敵。。
5分くらいでMapTilerをQGISに導入してみる

※(2020/6/15追記)
MIERUNEとMapTilerによってQGISにすぐ取り込めるプラグインが開発されましたので、こちらの記事もおすすめです！
[MapTiler公式QGISプラグインでベクトルタイルを素敵に表示しよう](https://qiita.com/Kanahiro/items/a014c24e2c314fd458db)



![](https://i.imgur.com/63F63mz.png)


2020年1月27日より、MapTilerの[日本向けサービス](https://www.maptiler.jp/)が始まりました

※[プレスリリースはこちら](https://www.value-press.com/pressrelease/235157)
※[InternetWatchさんによる紹介はこちら](https://internet.watch.impress.co.jp/docs/column/chizu3/1232026.html)

MapTilerとはスイス発の地図提供プラットフォームで、様々な美しい地図をwebやアプリで使用することができます。これまでIBM・RedBull・NASAのサービスなどでも使用されており、[月10万リクエスト](https://www.maptiler.com/cloud/plans/)まで無料なフリープランがあります。今回はQGISでサクッとMapTilerを読み込む方法を紹介します。

まず[MapTilerJP](https://www.maptiler.jp/)にアクセスし、アカウントを作成するために右上のSign in をクリック

![](https://i.imgur.com/lyXViWL.png)

アカウント作成画面になりますのでemailでもGoogleアカウントのどちらかを選択します

![](https://i.imgur.com/4dAiH1L.png)|
|:-:|

MapTiler cloudの管理画面になりますので、下にスクロールしていくと

![](https://i.imgur.com/0znQwGd.png)

日本の[MIERUNE](https://mierune.co.jp/)とかいう会社さん()が提供している`JP MIERUNE Streets`スタイルを選択しましょう。
MIERUNEスタイルのデザインは元🍎のカートグラファーである[森さん](https://medium.com/a-cartographer-in-tokyo)によるバージョンアップがされているので、より見やすく美しくなっています

![](https://i.imgur.com/Wj6bCOF.png)|
|:-:|

JP MIERUNE Streetsの詳細情報画面になりますので、下にスクロールすると

![](https://i.imgur.com/RsLBxvg.png)|
|:-:|

`web map tile service`の欄にAPIキーの入った　wmts接続用アドレスがありますので、紙が重なったようなアイコンをクリックしてクリップボードにコピーしてください

![](https://i.imgur.com/5ueqRAt.png)|
|:-:|

※このほかにもTileJSON/XYZtile/JSON/iframeなどでもQGIS読み込めます
普段タイル地図をXYZtileお使いの方は、XYZ形式のほうがわかりやすいかもしれません
（無料/有料プランで使える形式が異なりますのでご注意を）

QGIS(v3以降)を起動し、ブラウザパネルのWMS/WMTSレイヤで右クリック

![](https://i.imgur.com/30CI2SI.png)

`新しいWMS/WMTS接続を作成する`ウインドウで、
- 名称…(適当)に`MIERUNE`
- URL…さっきコピーした`https://api.maptiler.com/maps/…`のアドレスをペースト

![](https://i.imgur.com/UAYx70S.png)

ブラウザにMIERUNEレイヤが追加されるので、`JP MIERUNE` をダブルクリックまたは、右クリック後`レイヤをプロジェクトに追加する`を選択
![](https://i.imgur.com/ENpLqjt.png)

QGISのマップキャンバスにあのMIERUNE地図が！



![](https://i.imgur.com/SP4Nkqr.png)

もし、POIやラベルが小さい・タイルかかすれているという方は表示したレイヤプロバティのシンボロジタブ内にある`リサンプリング`内の

- 縮小…平均
- オーバーリサンプリング…1.2

などにするといい感じになります

![](https://i.imgur.com/EmXncU8.png)

あと、Attributionは
`© MIERUNE © MapTiler © OpenStreetMap contributors `
になりますので、お忘れなく！

このほかにも様々なスタイルが準備されていますし、SDKやエディタも標準で提供されていますので、いろいろ試してみましょうー
EfficientNetを最速で試す方法

# TL;DR
- Tensorflow Hubにて[imagenetによる事前学習済み重み]((https://tfhub.dev/google/collections/efficientnet/1))が公開されている
 - EfficientNetB0 - B7まですべて公開
 - 転移学習用のfeature vectorsが公開されているのでそれを使う
- [公式のTensorFlow Hubを使った転移学習のチュートリアル](https://www.tensorflow.org/tutorials/images/transfer_learning_with_hub)と共に、EfficientNetを最速で試す方法の紹介
 - GoogleColabratory環境で[画像分類のデモ]((https://colab.research.google.com/drive/18IVEXsLwHnuXq1GU18-6LvsuuDCjjYaD))を動かす
 - 環境さえ用意できればデモと同じコードで動作確認できるはず 
 - やることは[tensorflow-hub](https://pypi.org/project/tensorflow-hub/)ライブラリでDLするモデルを表すURLを変えるだけ

# はじめに

「EfficientNet」については素晴らしい記事がありますのでこちらをご覧ください。
[Qiita - 2019年最強の画像認識モデルEfficientNet解説](https://qiita.com/omiita/items/83643f78baabfa210ab1)

今回の記事はEfficientNetを最速で試す方法を紹介することに重きをおきます。

## 早速デモを動かしてみる

動かすデモのGoogleColabratoryは用意しておきましたのでこちらをお使いください。

[GoogleColabratory - transfer_learning_EfficientNet](https://colab.research.google.com/drive/18IVEXsLwHnuXq1GU18-6LvsuuDCjjYaD)

上記GoogleColabratoryより肝になるコード、モデルの定義部分だけ抽出してみました。これだけでEfficientNetを利用できるようになります。
あとの学習部分をどうするか気になる方は上のデモを動かしてみてください。

```python:EfficientNet.py
import tensorflow as tf
import tensorflow_hub as hub
from tensorflow.keras import layers

# クラス数はデータに合わせて適当に変えてください
num_classes = 10

# URLはこちらのページ https://tfhub.dev/google/collections/efficientnet/1
# 末尾に記載されているURLから使いたいモデル(B0-B7)までのどれかを選んでください
# 今回はB0を使います
feature_extractor_url = "https://tfhub.dev/google/efficientnet/b0/feature-vector/1"

# width/heightについてはB0は(224, 224)が推奨とされているのでそうしています
# 推奨のwidth/heightについてはこちらのページをご覧ください https://tfhub.dev/google/collections/efficientnet/1
feature_extractor_layer = hub.KerasLayer(feature_extractor_url,
                                         input_shape=(224,224,3))
# 学習済み重みは固定
feature_extractor_layer.trainable = False

# Keras functional APIで動くかなと試したのですがうまく動かず
# 公式Tutorialに倣って以下の通りにしています
model = tf.keras.Sequential([
  feature_extractor_layer,
  layers.Dense(num_classes, activation='softmax')
])
```

# 参考
- [Qiita - 2019年最強の画像認識モデルEfficientNet解説](https://qiita.com/omiita/items/83643f78baabfa210ab1)
- [tfhub.dev - efficientnet](https://tfhub.dev/google/collections/efficientnet/1)
- [公式のTensorFlow Hubを使った転移学習のチュートリアル](https://www.tensorflow.org/tutorials/images/transfer_learning_with_hub)
JavaScriptで重複排除するときのSetってなんぞや

## 出発点
重複をなくした配列が欲しいときに以下のようなコードを使うけれど、そういえばちゃんと理解していない。
なんかよくわからんけど重複をなくしてくれる魔法のコード的に使っていたのだが、さすがに情けないので勉強する。

```JavaScript:例
const arr = [1, 2, 2, 3]

const arr2 = Array.from(new Set(arr));
// もしくは

const set = new Set(arr);
const arr3 = [...set]
```

## Setってなに?
[Set(MDN)]
(https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Set)によると、
> Set オブジェクトは、プリミティブ値・オブジェクト参照を問わず、あらゆる型で一意の値を格納できます

となっている。

特徴として、[JavaScript Setオブジェクト](https://qiita.com/chihiro/items/0e610a31b589e3cc435f)では、以下の2点が挙げられている。

> - 値が一意であることが保証されている
> - 順序を持たず、インデックスでアクセスできない

なるほど、ユニークな値を持つことを保証したものに変換することで重複を排除しているのか!

## Array.fromと...（スプレッドオペレーター）はなんのため?
とりあえず、重複を排除するところまでは理解できた。さらに進めて重複を排除したあとに、Arrayに戻している理由は何なのだろう?

[JavaScript: Sets vs. Arrays](https://medium.com/better-programming/javascript-sets-vs-arrays-25337bea7939)では利便性のためとされていた。

> Sets do not support functional programming methods like map, filter, and reduce so it’s often convenient to convert them to Arrays for processing.

mapやfilterといったメソッドが使えず、先述の特徴にあったインデックスでのアクセスもできないとなると使い勝手が悪いのは想像に難くない。

あれ? じゃあSetっていつ使う?のという疑問が湧いてくる。

## Setはいつ使うのか?
これについても、さきほどの[JavaScript: Sets vs. Arrays](https://medium.com/better-programming/javascript-sets-vs-arrays-25337bea7939)で例を挙げて紹介されており非常にわかりやすかったので簡単に紹介する。

Setは、くどいようだが値がユニークということが保証されている。つまり、ダブってほしくないものを格納しておくのに使うと便利だ。先程の記事では、ブログのカテゴリーがそうしたものの例として挙げられている。

ArrayではなくSetを使うことでダブっていないことが`自動的に`保証される。そのため、if文とincludedなどを組み合わせて格納してもいい値かどうかをいちいち調べる必要がないのである。めちゃ便利!

## まとめ
- Setの特徴を利用して重複を排除している
- mapとかでさらに加工するには使いにくいからArrayに戻すと便利
- Setは重複してほしくない値の格納の処理をより効率的に書けるので重複排除の魔法のフレーズにしておくのはもったいない

## 参考
- [Set(MDN)]
(https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Set)
- [JavaScript Setオブジェクト](https://qiita.com/chihiro/items/0e610a31b589e3cc435f)
- [JavaScript: Sets vs. Arrays](https://medium.com/better-programming/javascript-sets-vs-arrays-25337bea7939)
OSの歴史ざっくりまとめ

# この記事について
Unix、Linux、Windows、MacOS・・・・。ざっくりと、OSというものの全体像を把握するためにまとめました。
Linuxひいきの記事になっています。

# OSの概念
- 現在のコンピュータはOSが通訳として様々なアプリケーションを動かしている。
- OSが開発される以前は、アプリケーションごとにコンピュータが用意されていた。
 - 例えば計算用なら計算用のコンピュータ、文章作成なら文章作成用のコンピュータ（ワープロとか）という感じ。
- これでは用途ごとにアプリケーションとコンピュータを買わなくはいけなく、これは売る側にとっても買う側にとっても不便である。

そこで開発されたのがOS（Operation System）である。

# 1960年代　~OSの誕生と概念の確立~
#### OSの誕生
- System/360（IBM）や、Multics（ベル研究所）
 - 複雑になり過ぎてしまい当時のコンピュータのハードスペックではろくに動かなかった・・・。

- Unics（ベル研究所）（後にUnix）
 - ベル研究所は、独占禁止法によりUnixを開発しながらも販売することができなかった。そのため、利益が出ない程度の小額で大学や企業に配られた。
 - ソースコードは公開されており、様々な派生Unixが誕生する。
 - **このビジネスチャンスに気づいたAT＆Tは、AT＆Tとライセンス契約を結んだ組織のみが、自社のOSをUnixと宣言できるようにした。**

# 1985年〜1995年　~Windowsの勝利~
- ライセンス契約は企業間の激しい争いを引き起こした。各社が全力でお互いの足を引っ張り合っていた。
- そうこうしているうちに、Windows（Microsoft）が標準OSの座を手に入れた。

# 1991年　~天才児が誕生する~
- リーナス・トーバルズ（フィンランド　ヘルシンキ大学）は大学の授業で渡されたUnix（Minix）の機能が不足していると感じ、ターミナルのエミュレータ部分を作り変えた。
- せっかくだからとOSをゼロから作り直すことにし、誕生したのが**Linux**である。
- 「多くの人に見てもらいたい」、「フィードバックが欲しい」という理由から、オープンソースライセンスをつけソースコードを公開した。
- **LinuxはUnixを参考にゼロから作り直されているのでUnixとは別物である。**

#### Unix
ライセンスで縛られており、自由な公開や改良がし難い。

#### Linux
オープンソースで自由な公開、改良、これを使って商売ができる。

**以上のようなLinuxの優位性により、Linuxは支持を集め広がっていった。**

# 1995年　~各社の参加、Linuxの市民権獲得~
- IBM、HP、インテルなどのプログラマーが参加し始め、Linuxは市民権を獲得していった。

# 図にすると・・・
こんな感じかと思います。
RedHatやDebianは「Linuxのディストリビューション」としてよく聞きます。

<img width="514" alt="スクリーンショット 2020-01-27 22.38.31.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/570918/d1d4d771-2dc8-d877-f439-5b4e744eaf3e.png">

# 参考
[【リナックスアカデミー】【初心者向け】Linuxの歴史解説！ OS誕生からLINUXへ](https://eng-entrance.com/linux_birth)
[【Wikipedia】計算機の歴史](https://ja.wikipedia.org/wiki/%E8%A8%88%E7%AE%97%E6%A9%9F%E3%81%AE%E6%AD%B4%E5%8F%B2)
ProgateのCommandLineを受講してみた

Progeteのレッスン一覧からCommandLineを選択

https://prog-8.com/languages
![2020-01-27_22h48_16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567263/3cdfc22c-d6bf-1e3e-2a28-de3c56a85be3.png)

コンテンツは1つのみです。

初歩中の初歩です。
![2020-01-27_22h50_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567263/9554b080-3c17-0e16-a789-148b6f06d5fe.png)

左側に指示が出ます。
中央のターミナルにコマンドを打ちます。
また右側にディレクトリ構造が表示されます。
進むにつれファイルを追加したりディレクトリを追加、削除した場合は右側のディレクトリ構造の内容も変更されるので初心者にはカレントディレクトリの位置が把握しやすく非常にわかりやすいと思います。
Atcoder Beginner Contest 153

## E
個数なしナップサック問題。
再帰で組んだが、計算量を考慮しておらずTLE。
配列を用いたdpの作り方がわからずタイムアップとなった。

解説はyoutubeにて、
https://www.youtube.com/watch?v=pHzHTVIqrG8&feature=youtu.be

```python

Hitpoint, N = map(int, input().split())
magic_damage = []
magic_point = []
for _ in range(N):
    A, B = map(int, input().split())
    magic_damage.append(A)
    magic_point.append(B)

# dp = [[float("inf") for _ in range(Hitpoint + 1)] for _ in range(N + 1)]
dp = [float('inf') for _ in range(Hitpoint + 1)]
dp[0] = 0
for i in range(N):
    for now_HP in range(Hitpoint + 1):
        next_HP = min(now_HP + magic_damage[i], Hitpoint)
        dp[next_HP] = min(dp[next_HP], dp[now_HP] + magic_point[i])
        
        # dp[i + 1][now_HP] = min(dp[i + 1][now_HP], dp[i][now_HP - magic_damage[i]] + magic_point[i])
print(dp[Hitpoint])


```
Laravelの基本コマンド。

今回はLaravelについての記事を書きます。

実はLarvelはこれまで触れたことがなかったのですが、ここ２日間で書籍で学習しながら頭に詰め込んだので、基本的なコマンドを備忘録としてここに書いておきました！


## 新しいプロジェクトの作成
 
    laravel new アプリ名

## アプリケーションの実行

    php artisan serve

## ルート情報の記述
一般的なWebページとしてアクセスするためのルーティングはroutesフォルダの中のweb.phpに記述する。

    Route::get(アドレス、関数など);
    
    Route::get('/〇〇/{パラメータ}', function($受け取る引数) {.....});

    Route::get('アドレス',　'コントローラ名@アクション名' )

## コントローラの作成

    php artisan make:controller コントローラ名

コントローラ名は通常HelloControllerのように〇〇Controllerというような名前で作成する。

## コントローラでのテンプレートの返し方

    return view('views以下のフォルダ名.ファイル名', $テンプレートへ渡す変数);

    例
    return view('hello.index', $data);

## Bladeとは
Laravelに用意されている独自のテンプレートエンジン。

### テンプレートを作る
〇〇.blade.phpという名前で作る。

### Bladeでの具体的な書き方。

1 変数等の埋め込み

    {{$変数・値・式・関数など}} と書くと変数をテンプレート内に埋め込むことができる。

2 フォームの書き方

{{ csrf_field }}というヘルパ関数が使える。
これはCSRF対策のために用意されたヘルパ関数。

    <form method='POST' action='/hello'>
       {{ csrf_field }}
       <input type='text' name='msg'>
       <input type='submit'>
    </form>

3 ディレクティブ
例えば以下の様な書き方ができる。
その他、unless, empty, isset, foreach, while等も同様に書ける。

    @if (条件)
       出力内容
    @elseif (条件)
       出力内容
    @else
       出力内容
    @endif　

## データベースの利用

#### DBクラスを利用した方法
    
    DB::select( 実行するSQL文 );
    DB::insert( クエリ文, パラメータ配列 );
    DB::update( クエリ文, パラメータ配列 );
    DB::delete( クエリ文, パラメータ配列 );

#### クエリビルダを利用した方法
    
    //テーブルの全レコード取得
    DB::table(テーブル名)->get();

    //条件にあうものを取得
    DB::table(テーブル名)->where(フィールド名, 値)
    DB::table('people')->where('id', $id)->first();

    //レコードの追加
    DB::table(.....)->insert(データをまとめた配列);

    //レコードの編集
    DB::table(.....)->where(更新対象の指定)->update(データをまとめた配列);

    //レコードの削除
    DB::table(.....)->where(更新対象の指定)->delete();

#### Eloquent ORMを用いた方法

現状peopleテーブルがあるとすると、まずはモデルを作成する。
モデルは単数系、テーブルは複数形という命名規則がある。

    php artisan make:model Person

Personモデルを使用するコントローラを作成する。

    php artisan make:controller PersonController

ORMでの書き方

    //全レコードを取得する
    モデル名::all();
     
    //IDによる検索
    モデル名::find(整数);

    //whereによる検索
    モデル名::where(フィールド名, 値)->get();
    //条件に当てはまった最初のレコードのみを取得
    モデル名::where(フィールド名, 値)->first();

    //レコードの追加
    インスタンスの作成
    $person = new Person;
    送られてきた値を変数に入れる
    $form = $request->all();
    unset($form['_token']);
    インスタンスに値を設定して保存
    $person->fill($form)->save();

## マイグレーション

マイグレーションファイルの作成

    php artisan make:migration ファイル名

マイグレーションを実行

    php artisan migrate

## シーディング

シーダーファイルの作成

    php artisan make:seeder ファイル名

シーディングの実行

    php artisan db:seed




最後まで目を通していただきありがとうございました。
２つのベクトルの内積から角度を得る

```js
var a = {x:0,y:100};
var b = {x:10,y:20};

//内積
var dot = a.x * b.x + a.y * b.y;

//絶対値
var absA = Math.sqrt(a.x*a.x + a.y*a.y);
var absB = Math.sqrt(b.x*b.x + b.y*b.y);

//dot = |a||b|cosθという公式より
var cosTheta = dot / (absA*absB);

//すでにベクトルがノーマライズされてたら dotのみでいける

//cosθの逆関数
var theta = Math.acos(cosTheta);
```
閏年判定について（可読性とともに）

先日、教材に記載されていた閏年判定のコードに対し、
自分なりに改善できる点があったのでアウトプットする。

```c#
bool IsLeapYear(int year) { //良い点 その1
    bool result = false; //悪い点 その1

    if (year <= 0) { //良い点 その2
        throw new ArgumentException("Year needs to be positive.");
    }

    if (year % 4 == 0) {
        if (year % 100 == 0) {
            if (year % 400 == 0) { //悪い点 その2
                result = true;
            }
        } else {
            result = true;
        }
    }
    return result;
}
```

#なんで自作するの？
そもそもの前提から覆すが、最近の高級言語では、閏年判定のライブラリはあらかじめ用意されている。
これらを知らずして自作することは、よほどの事情がない限り、許されないだろう。
自作が許されない理由は明白である。第一に品質であり、第二に品質を担保するまでの工数である。

自作メソッドと公式ライブラリでは使用実績及び、品質はどちらが上であろうか。間違いなく後者である。
また、自作メソッドの品質を担保するまでにどの程度の工数を必要とするであろう。ライブラリならば0である。

がむしゃらに作ることをやめ、同じことをするメソッドがないかを調べることはとても大切なことである。


#それでも自作する場合
教材のソースコードの良い点、悪い点を見ていく。
##良い点
###その1 メソッド名
名前は良いだろう。
どういう場合にtrueが返ってくるのかをメソッド名のみで判断することができる。
bool値を返すメソッドの命名規則は、いろんな記事があるので、ググって参考にしてほしい。

###その2 引数検査あり
引数の検査を行っており、適切な例外を投げている。
エラーアトミック性に努めているといえるだろう。

##悪い点
###その1 無駄なローカル変数
メソッドの一行目でresult変数を宣言しているが、不要である。
本メソッドの返り値はbool値であるため、return true; もしくは return false;を直接書けばよい。
仮に変数を設けるとしても、変数のスコープは可能な限り狭くすべきだ。


###その2 if文のネスト数
このメソッドの最大の問題点である。
if文が3つ続いており、そのあとにelseが来ている。このelseはどのifに対するelseだろう。
当然、よく読めば理解できる。しかし、あなたは少なからず考えることを強制されたであろう。

ここで、閏年となる条件式を見てみよう。

```
4で割り切れる。 かつ 100で割り切れない。
もしくは
400で割り切れる。
```

そのままif文にしてみよう。

```csharp
if((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) {
   return true;
}
else{
  return false;
}

```
なぜ、わざわざ複雑にするのだろうか。

##改善の余地はまだある。
###return文の多用
if文の条件式の構造がわかりずらい。return文を多用することで、条件式を分解しよう。
return文の多用はいいこと尽くしである。
以下の説明は、恥ずかしながら適切とは言えない。ぜひ最後のソースコードと一緒に読んでほしい。

if文内の条件式の構造を省略すると (A and B) or C となる。
①(A and B) を満たした時点で閏年が確定するため、trueを返す。
②Cを満たす場合も、閏年のため、trueを返す。
③上記に当てはまらない場合、閏年ではない。よって、falseを返す。

①と②は or の関係であるが、①を満たす場合はtrueを返し、①を満たさない場合は②に処理が流れる。
よって、処理が②に移っている時点で、①を満たしていないという暗黙の条件記載が存在するのである。
①を満たせばtrue、①を満たさずとも②を満たせばtrueというor条件をorの記載なしに実現できるのだ。

③も同様である。処理が③に移っている時点で①、②の両方とも満たしていないことになる。
よって、③にいる時点で閏年ではない。else句を記載することなく、elseのような処理を実現できるのだ。

これは、プログラムは上から順に処理されるという大前提と、return文による暗黙の条件記載が見事にかみ合っているのだ。

###おまけ
{}内が1行ならば、省略することができる。(C#)

```c#
bool IsLeapYear(int year) {
    if (year <= 0)
        throw new ArgumentException("Year needs to be positive.");

    if (year % 4 == 0 && year % 100 != 0) //1
        return true;

    if (year % 400 == 0) //2
       return true;

    return false; //3
}
```
可読性は十分だろう。上から流れるように読める。
あなたはこのプログラムを見るときに考えることを強制されるだろうか。

#所感
美しさを求めるだけはNGなので、大儀を見失わないこと。
小さいプログラムならば効果は薄いかもしれないが、複雑な業務ロジックでは小さなことが効いてくる。
多段ホスト時の変数格納


# メモ
- じぶん用のただのメモ書き
 - 実際に挙動見てないのでできるかどうかを確かめる　（無理かも。。。）

```ruby:memo
#!/bin/bash -e
read -a ssh
echo ""
for i in ${ssh[@]}
do
host=$(ssh -t ${LLLLLLL} ssh ${i} exec hostname)
echo ${host} >/dev/null 2>$1
if [ ${host} = "x" ]; then
   hostx=${host}
   echo $hostx
elif [ ${host} = "y" ]; then
   hosty=${host}
   echo $hosty
elif [ ${host} = "a" ]; then
   hosta=${host}
   echo $hosta
elif { ${host} = "b" ]; then
   hostb=${host}
fi
done

echo $hostx
echo $hosty
echo $hosta
echo $hostb
```
TeX入門

#Tex入門
とりあえずTeX環境ができた人で, 書いていきたいときにどうぞ. 
内容はおそまつですが...

`\documentclass[a4j,11pt,dvipdfm, titlepage]{jreport}
\usepackage{amsmath,amsthm,color}
\usepackage[top=20truemm,bottom=20truemm,left=20truemm,right=20truemm]{geometry}
\newtheorem{theo}{定理}[chapter]
\newtheorem{defi}{定義}[chapter]
\newtheorem{lemm}{補題}[chapter]
\newtheorem{prop}{命題}[chapter]
\newtheorem*{Proof}{証明}
\newtheorem{cor}{系}[chapter]
\newtheorem*{Note}{注意}
\newtheorem*{example}{例}
\newcommand{\N}{\mathbb{N}}%新しい命令の作成．
\newcommand{\Z}{\mathbb{Z}}
\newcommand{\Q}{\mathbb{Q}}
\newcommand{\R}{\mathbb{R}}
\newcommand{\C}{\mathbb{C}}
\newcommand{\E}{\mathbb{E}}
\newcommand{\al}{\alpha}
\newcommand{\be}{\beta}
\newcommand{\ga}{\gamma}
\newcommand{\de}{\delta}
\newcommand{\si}{\sigma}
\newcommand{\la}{\lambda}
\newcommand{\ep}{\varepsilon}
\newcommand{\ze}{\zeta}
\newcommand{\La}{\Lambda}
\begin{document}
%ここに本文
\end{document}`
セキュリティ対策を考えるための4つのキーワード：アセット・脅威・脆弱性・リスク

## 対象読者

自分たちが作るサービスは自分たちが守る！けどどうすれば良いかよくわからない！というチーム。のほか、

- セキュリティはなんとなく重要だと思ってるけど何すればいいかわからない人
- DevSecOpsの実現を目指していてどこから手を付けようかなーとか思ってる人
- リスクアセスメントや脅威モデリングをやろうとしたけど難しすぎて挫折した人

## ざっくり内容

セキュリティ対策を下記４つのステップで分析し、情報システムのセキュリティを考えるための基本を習得する。

1. 守るべきモノ（アセット）を特定する
2. 守るべきモノを脅かす事象（脅威）を探す
3. 弱点（脆弱性）を見つける
4. どうやって守るか（リスク軽減）を考える

前半は身近なセキュリティ対策の例として「家（部屋）」を対象に分析し、セキュリティ対策とは何かを理解する。
後半は架空のオンラインショッピングサービスを分析し、ソフトウェア開発におけるセキュリティ対策とは何かを理解する。


## スライド

文章を起こすのがつらかったのでスライドで。※[slideshare へのリンク](https://www.slideshare.net/takutoyamada2/ss-226479043)<a href="https://www.slideshare.net/takutoyamada2/ss-226479043">
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118451/429fe43c-9566-e763-b652-8af8da04795e.png">
</a>


## Next Step（兼、参考文献）

今回やったことは「情報システム」に対する「リスクアセスメント」や「脅威モデリング」の一部。
より深く学習するためのキーワードを乗せておく。また、本記事を作成するために参考にした情報にはリンクを張っている。

### アセットの特定

分析にはソフトウェアのモデリング（図を起こすこと）が重要。今回のような分析には下記のダイアグラムが有用。

- コンポーネントダイアグラム（アーキテクチャダイアグラム）
- ユースケースダイアグラム
- データフローダイアグラム

### 脅威・脆弱性

よくある脅威や脆弱性を知りたい場合は OWASP や CWE 等を当たるとよい。過去に発生したセキュリティ事故の事例も参考になる。

- [OWASP TOP 10](https://owasp.org/www-project-internet-of-things/)
- [OWASP IOT TOP 10](https://www.owasp.org/images/2/23/OWASP_Top_10-2017%28ja%29.pdf)
- よくある脆弱性の種類：CWE (Common Weakness Enumeration)
- 報告されている脆弱性：CVE (Common Vulnerabilities and Exposures)
- セキュリティ関連ニュース記事

脅威と脆弱性を特定したり、評価する手法としては下記のようなものがある。

- Abuse case, misuse case
- Attack Surface Analysis
- Threat Modeling (脅威モデリング)
  - STRIDE: 脅威の発見
  - DREAD: 脅威の評価
  - Attack Tree

脅威モデリングについて詳しく知りたい場合、下記の書籍がお勧め。ただし英語。

- Threat Modeling: Designing for Security (Adam Shostack) ISBN-13: 978-1118809990

### リスク

リスクマネジメントやリスクアセスメントについてガチで学習したいなら、NISTのリスクマネジメントフレームワーク(RMF)が参考になる。ただし長い。超長い。

#### リスクマネジメント

NIST SP 800-37 rev.2 Risk Management Framework for Information Systems and Organizations
[原文](https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-37r2.pdf)　[IPAによる日本語訳 ※rev1](https://www.ipa.go.jp/files/000025329.pdf)

情報システムだけでなく組織のリスクマネジメントを考えるときに参考になる。
リスクマネジメントのプロセスや、リスクマネジメントを１．組織、２．ミッション、３．情報システムの3段階に分けて考えるなど。
`Appendix F Summary of RMF Tasks` を眺めると、リスクマネジメントにはどんな活動が必要なのかがなんとなく分かる。ただし多い。

#### リスクアセスメント

NIST SP 800-30 rev.1 Guide for Conducting Risk Assessments
[原文](https://nvlpubs.nist.gov/nistpubs/Legacy/SP/nistspecialpublication800-30r1.pdf)　[IPAによる日本語訳](https://www.ipa.go.jp/files/000025325.pdf)

リスクアセスメントの標準的なプロセスを知りたかったらこれ。
`Appendix D Threat Source` や `Appendix F Threat Event` は脅威探しに非常に役立つ。

#### リスク軽減策（＝セキュリティコントロール）

NIST SP 800-53 rev.4 Security and Privacy Controls for Federal Information Systems and Organizations
[原文](https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-53r4.pdf)　[IPAによる日本語訳](https://www.ipa.go.jp/files/000056415.pdf)

リスク軽減を考えるときに重宝するのがこれ。
`Appendix F Security Control Catalog` や `Appendix J Privacy Control Catalog` がセキュリティコントロールのカタログになっており、多数の方法を知ることができる。なんかしないとヤバいことはわかっててもどうすればいいか分からないときは、このカタログを眺めてみるといい方法が見つかるかもしれない。

### セキュアアプリケーション開発

ソフトウェア開発プロセスにセキュリティを組み込みたい場合、上記 NIST の RMF のほか、[Microsoft SDL](https://www.microsoft.com/en-us/securityengineering/sdl) が参考になる。
【自分用メモ】Web上のデータを取得し、DataFrameにする

```python
# Webからデータを取得するために、requestsをインポートします。
import requests

# CSVデータのために、StringIOをつかいます。
from io import StringIO

# データのURLです。
url = "http://elections.huffingtonpost.com/pollster/2012-general-election-romney-vs-obama.csv"

# requestsをつかってデータをtextとして取得します。
source = requests.get(url).text

# StringIOを使ってpandasのエラーを防ぎます。
poll_data = StringIO(source) 

poll_df = pd.read_csv(poll_data)

```
頭が壊れた時のブート方法

こんにちは。
今回は体が壊れた時のブート方法です。

これは、筆者の妄言です。

#ミルストームと素地
某ゲームの話なのですが、ミルストームという生命力が一桁になる特殊能力があります。
私はそれを現実で食らいました。その時、頭の負荷限界まで行ったのです。
そして、素地くらいまで頭が壊れてしまいました。

そこからのブート方法です。
なお、精霊が必要になる。

#素地からの基本構築法
頭にプログラムのような命令セットがあるとしたらどうしますか？
先んじてやっておけば治るパスを構築することができるかもしれません。
そこで、健康なときに最小の命令セットで素地から応用の手前に至る位までのブートコードを書いておきます。
遅いとかはあまり問題ではありません。小さなことが重要なのです。

応用に至るには、そこから豊かさをベースにブートしていきます。

#リハビリ
今自分もやってる途中ですが、やはり頭の機能を回復するには何かを触らないといけないですね。
触った瞬間のショック療法とか色々発動して少し思い出します。
「賢者・テラ」ですかいな？？

#綾と負荷
綾とはエンタングルオブジェクトである。
頭というか意識は適度な負荷の綾を解くのが中毒である。
その際、意識に負荷をかけるので意識に少し馬力がかかって鮮明になる。
それも、頭の回復に寄与するかもしれません。

#終わりに。
めちゃくちゃ簡素になりましたが、基本的には、最小の方法でブートできないと手がありません。
道具がないとか概念が無いとかになると、構築する機運も来ないですしされる機運もなかなか来ません。
なので、最小の効果で最大の効果をこの際狙わないといけないですね。

それでは。
【初心者向け】.ymlファイル内のデータが認識されない2つの理由

Rubyonrailsを勉強し始めて2週間が経過したわけですが、特に私が落とし穴だなと思ったymlファイルの決まり事について紹介していきます。


##.ymlファイルの決まり事①データを記述する際、データ間の空白を1行以上開けてはいけない


users.ymlを使って2人目のユーザー「archer」を追加したかったのでチュートリアル通りにコードをコピペして保存。

```users.yml
michael:
name: Michael Example
email: michael@example.com
password_digest: <%= User.digest('password') %>




archer:
name: Sterling Archer
email: duchess@example.gov
password_digest: <%= User.digest('password') %>

```



rails testをしたところ、'users' テーブルに'archer'という名前のカラムが入っていないというエラーが出ました。




```terminal
 table "users" has no column named "archer"
```

知り合いに聞いたところ、YAMLファイルと言うのは結構厳密で余分なスペース一つ入るだけで動かなくなることもあるとのこと。

記述したファイルをみてみると4行ほど空いていました。


```users.yml
michael:
name: Michael Example
email: michael@example.com
password_digest: <%= User.digest('password') %>
archer:
name: Sterling Archer
email: duchess@example.gov
password_digest: <%= User.digest('password') %>
```

間を詰めたところ無事テストが通りました。

間を2行以上開けるとデータの判別がしやすくなるのですが、流石にこれは初心者泣かせですww

チュートリアルの中でも言及して欲しい内容でした。

##.ymlファイルの決まり事②default: &default

一番上のdefault: &defaultと記述をして、それぞれの環境に  ``<<: *default``とつけてあげればデフォルトで記述したルールがそれぞれの環境に適応されます。


```database.yml
default: &default
  pool: 5
  timeout: 5000
development:
adapter: sqlite3
  <<: *default
  database: データベース名
test:
adapter: sqlite3
  <<: *default
  database: データベース名
production:
  <<: *default
  encoding: utf8
  adapter: postgresql
  port: 5432
  database: データベース名
  username: ユーザー名
  password: パスワード
  host: ホスト名
```

したがって、下記のようにデフォルトをadapterを sqlite3としてしまうとそれぞれの環境でpostgresqlと記述しているのにもかかわらずsplite3が優先されてしまうので注意が必要です。

```database.yml
default: &default
adapter: sqlite3
  pool: 5
  timeout: 5000
development:
adapter: sqlite3
  <<: *default
  database: データベース名
test:
adapter: sqlite3
  <<: *default
  database: データベース名
production:
  <<: *default
  encoding: utf8
  adapter: postgresql
  port: 5432
  database: データベース名
  username: ユーザー名
  password: パスワード
  host: ホスト名
```

## その他のエラー

```
Please note that YAML must be consistently indented using spaces. Tabs are not allowed. 
```

空白がない、あるいはインデントを使って右にコードを押しやっているのでエラーが出てます、というメッセなのでその2点をチェックしましょう。
Leetcode 1295. Find Numbers with Even Number of Digits

```ruby

require 'test/unit'
require 'pry'
class FindNumbersWithEvenNumberOfDigits < Test::Unit::TestCase

  #https://leetcode.com/problems/find-numbers-with-even-number-of-digits/

  def test_calc

    nums = [12, 345, 2, 6, 7896]
    output = 2
    find_numbers(nums)

    nums = [555, 901, 482, 1771]
    output = 1
    find_numbers(nums)
  end

  def find_numbers(nums)
    count = 0
    nums.each do |num|
      if num.to_s.size % 2 == 0
        count += 1
      end
    end
    count
  end

end
Leetcode 977. Squares of a Sorted Array

```ruby

require 'test/unit'
require 'pry'
class SquaresOfASortedArray < Test::Unit::TestCase

  #https://leetcode.com/problems/squares-of-a-sorted-array/

  def test_calc
    #Given an array of integers A sorted in non-decreasing order, return an array of the squares of each number, also in sorted non-decreasing order.

    input = [-4, -1, 0, 3, 10]
    output = [0, 1, 9, 16, 100]
    assert_equal(output,
                 sorted_squares(input))

    input = [-7, -3, 2, 3, 11]
    output = [4, 9, 9, 49, 121]
    assert_equal(output,
                 sorted_squares(input))
  end

  def sorted_squares(array)
    array.map { |n| n ** 2 }.sort
  end

end
Leetcode 1281. Subtract the Product and Sum of Digits of an Integer

```ruby

require 'test/unit'
require 'pry'
class SubtractTheProductAndSumOfDigitsOfAnInteger < Test::Unit::TestCase

  #1281. Subtract the Product and Sum of Digits of an Integer
  #https://leetcode.com/problems/subtract-the-product-and-sum-of-digits-of-an-integer/

  #Given an integer number n, return the difference between the product of its digits and the sum of its digits.
  def test_calc
    #Explanation:
    #Product of digits = 2 * 3 * 4 = 24
    #Sum of digits = 2 + 3 + 4 = 9
    #Result = 24 - 9 = 15

    test_cases = [
        [234, 15],
        [4421, 21],
        [705, -12]
    ].each do |test_case|
      input = test_case[0]
      output = test_case[1]
      assert_equal(output,
                   subtract_product_and_sum(input))
    end
  end

  def subtract_product_and_sum(n)
    product = 0
    sum_of_digits = 0
    n_string = n.to_s
    n_string.size.times do |i|
      n = n_string[i].to_i
      if product == 0 && i == 0
        product = n
      else
        product = n * product
      end
      sum_of_digits += n
    end
    product - sum_of_digits
  end

end
Leetcode 771. Jewels and Stones

```ruby

require 'test/unit'
require 'pry'
class JewelsAndStones < Test::Unit::TestCase

  #771. Jewels and Stones
  #https://leetcode.com/problems/jewels-and-stones/

  # You're given strings J representing the types of stones that are jewels, and S representing the stones you have.
  # Each character in S is a type of stone you have.
  # You want to know how many of the stones you have are also jewels.
  # The letters in J are guaranteed distinct, and all characters in J and S are letters. Letters are case sensitive, so "a" is considered a different type of stone from "A".
  def test_calc
    #Explanation:
    #Product of digits = 2 * 3 * 4 = 24
    #Sum of digits = 2 + 3 + 4 = 9
    #Result = 24 - 9 = 15

    #Input : J = "aA", S = "aAAbbbb"
    test_cases = [
        {j: "aA", s: "aAAbbbb", output: 3},
        {j: "z", s: "ZZ", output: 0},

    ].each do |test_case|
      assert_equal(test_case[:output],
                   num_jewels_in_stones(test_case[:j], test_case[:s]))
    end
  end

  def num_jewels_in_stones(j, s)
    s.gsub(/[^#{j}]/, '').size
  end

end
【初心者向け】ページネーションを付けたページにおける項目番号取得（クラスメソッドの定義まで）

はじめに。
クラスメソッドやんわり理解し始めた人間が書いています。
”クラスメソッド　定義”とかで調べても、初心者には理解仕切れない部分があったので、「こんなこと書いてあれば理解の助けになったな」という内容を書いています。
タイトル通り、ページネーションの話から始まり、最後の方で少しクラスメソッドのこと書いてます。
##前提(環境)
ruby 2.6.3
rails 5.2.4
db PostgreSQL

gem kaminariを使用してページネーションをしています。
##やりたいこと
ページネーションを使用したページで、eachで繰り返し処理したものに、インデクス番号を付けたい。
##問題点
eachで繰り返し処理したものの番号を取得する場合、
```each.with_index```
の使用を考えると思います。

```rails:items_controller.rb
def index
  @items = Item.page(params[:page]).per(10)
end
```

```rails:index.html.erb
<% @items.each.with_index do |item,i| %>
  <%= "#{i+1} 、 #{item.title}" %>
<% end %>

<%= paginate @items %>
```
これだと、ページ毎に番号を取得することとなり、常に１から数えてしまう。
##解決策　
###クラス名.page(params[:page]).current
で、現在表示しているページが何ページ目かを表示できるため、

```rails:index.html.erb
<% @items.each.with_index do |item,i| %>
  <%= "#{(Item.page(params[:page]).current - 1)*10 + i + 1} 、 #{item.title}" %>
<% end %>
```
とすることで、
１ページ目であれば　(1-1)*10+i+1　１〜１０を表示
２ページ目であれば　（2-1)*10+i+1　１１〜２０を表示
することができ、解決。

##リファクタリング
とても読みづらいコードなのでリファクタリング。
まず、インデックスを０から数える必要がないので

```rails:index.html.erb
<% @items.each.with_index(1) do |item,i| %>
  <%= "#{(Item.page(params[:page]).current - 1)*10 + i} 、 #{item.title}" %>
<% end %>
```
とできる。
更に長ったらし部分をコントローラーに出して

```rails:items_controller.rb
def index
  @items = Item.page(params[:page]).per(10)
  page_num = Item.page(params[:page]).current_page
  @base_level = (page_num - 1)*10
end
```
```rails:index.html.erb
<% @items.each.with_index(1) do |item,i| %>
  <%= "@base_level + i} 、 #{item.title}" %>
<% end %>
```
とできる。
更に更に、クラスメソッドを定義して、コントローラーをすっきりと。

```rails:items_controller.rb
def index
  @items = Item.page(params[:page]).per(10)
  @base_level = Movie.base_level(params[:page])
end
```
```rails:item.rb
class Item < ApplicationRecord
  def self.base_level(page)
    (self.page(page).current_page - 1) * 10
  end
end
```
こんな感じできれい目に実装できるかと思います。
##備考（クラスメソッド のこと）
正直私はクラスメソッドの定義はかなり苦戦しました。
そもそもクラスメソッドって何？ってところからだったので。
その点はクラスメソッドでググるればいっぱい出てくると思うので、割愛しますが、私は
###params[:page]をクラスメソッドにどう受け渡すか
という点にハマったので少し解説します。
まずクラスメソッドにはparams使えません。
よって

```rails:item.rb
class Item < ApplicationRecord
  def self.base_level(page)
    (self.page(params[:page]).current_page - 1) * 10
  end
end
```
とは書けないのです。
ですがコントローラーで

```
Movie.base_level(params[:page])
```
とクラスメソッドで定義したbase_levelの引数に(params[:page])が入っています。
そしてクラスメソッドでは

```
def self.base_level(page)
```
と,引数は(page)になっています。
ですので
(params[:page])=(page)
の関係になっていると言えます。

よって今回は、"page(page)"となり、ファッ？？って気持ちになるけど（・・・なりませんか？私はなりましたw）

```rails:item.rb
class Item < ApplicationRecord
  def self.base_level(page)
    (self.page(page).current_page - 1) * 10
  end
end
```
という記述になります。

それともう一つ、クラスメソッドはmodelに定義して下さいw
私ははじめ、コントローラーに定義しており、うんともすんとも動かないとうい時間を過ごしてしまいました。
stylintでStylusをlintチェックする

[stylint](https://github.com/SimenB/stylint)を使って、stylusの構文チェックをします。

## ディレクトリ構成
```
root/
  ├ node_modules
  ├ src/
  │  └ style.styl
  ├ .stlintrc
  └ package.json
```

## インストール
```
$ npm install -D stylint
```

## 実際に動かす
`npm run lint`のコマンドで実行できるように、`package.json`にスクリプトを登録します。

```json:package.json
{
  ...
  "scripts": {
    "lint": "stylint src/style.styl"
  }
  ...
}
```
例として、下記のようなStylusを用意します。

```stylus:style.styl
div {
  margin 0
  padding 0px
  font-siz 16px
  color: red;
}
```
実行します。

```
$ npm run lint
```
```bash
> stylint src/style.styl

src/style.styl
1:4   warning  unnecessary bracket                          brackets  
2:6   warning  missing colon between property and value     colons    
3:7   warning  missing colon between property and value     colons    
3:9   warning  0 is preferred. Unit value is unnecessary    zeroUnits 
4:8   warning  missing colon between property and value     colons    
4     warning  prefer alphabetical when sorting properties  sortOrder 
4:2   warning  property is not valid                        valid     
5:12  warning  unnecessary semicolon found                  semicolons
5     warning  prefer alphabetical when sorting properties  sortOrder
6     warning  unnecessary bracket                          brackets

Stylint: 0 Errors.
Stylint: 10 Warnings.
```
このように警告などが表示されればチェック成功です。

## 設定ファイルを書く
stylintはデフォルトでルールが決められていますが、プロジェクトのルートに`.stylintrc`を作成すれば、そのルールを自分で設定できます。

```json:.stylintrc
{
	"blocks": false,
	"brackets": "never",
	"colons": "always",
	"colors": "always",
	"commaSpace": "always",
	"commentSpace": "always",
	"cssLiteral": "never",
	"customProperties": [],
	"depthLimit": false,
	"duplicates": true,
	"efficient": "always",
	"exclude": [],
	"extendPref": false,
	"globalDupe": false,
	"groupOutputByFile": true,
	"indentPref": false,
	"leadingZero": "never",
	"maxErrors": false,
	"maxWarnings": false,
	"mixed": false,
	"mixins": [],
	"namingConvention": false,
	"namingConventionStrict": false,
	"none": "never",
	"noImportant": true,
	"parenSpace": false,
	"placeholders": "always",
	"prefixVarsWithDollar": "always",
	"quotePref": false,
	"reporterOptions": {
		"columns": ["lineData", "severity", "description", "rule"],
		"columnSplitter": "  ",
		"showHeaders": false,
		"truncate": true
	},
	"semicolons": "never",
	"sortOrder": "alphabetical",
	"stackedProperties": "never",
	"trailingWhitespace": "never",
	"universal": false,
	"valid": true,
	"zeroUnits": "never",
	"zIndexNormalize": false
}
```
`.stylintrc`を作成し実行すれば、それをもとにしてチェックしてくれます。

各項目についての詳細は[こちら](https://github.com/SimenB/stylint#options)

## VSCodeの拡張機能
VSCodeに[stylintの拡張機能](https://marketplace.visualstudio.com/items?itemName=HaaLeo.vscode-stylint)があります。これをインストールすれば、コマンドを実行しなくてもエディタ上でStylusをチェックしてくれます。プロジェクト内に`.stylintrc`があれば、それをもとにしてチェックします。

## 参考
* [stylint](https://github.com/SimenB/stylint)
gitからクローン後にコマンド rails testが通らない際の解決法【チュートリアル】


##  結論：ruby -vとrbenv -versionsのバージョンを同じにする 

今回クローンしたのはrails チュートリアルの14章のsample_appデータ。

[チュートリアルサンプルコード14章のデータ](https://github.com/yasslab/sample_apps)をクローンして、それからrails testを実行したら以下のようなエラーが出ました。

### 環境
rails 6.0.2.1
ruby 2.6.3
Macbook pro 2018 Osカタリーナ。

### 確かめた手順 

rails -vでrailsのバージョンを確認。
→Rails6.0.2.1と出た。

ruby -vでrubyのバージョンを確認。
→ruby 2.6.3p62と出た。

念の為rbenv versionsでrubyのバージョンを確認。
→2.5.0と出た。

この時にアプリの環境内で、`ruby -v`のバージョンと`rbenv versions`のバージョンが同じでなければ行けなったらしい。

`rbenv versions`の結果を2.5.0から2.6.3に変えてあげたところ、gitからクローンしたデータでrails testが通りました。




なぐり書きなのでわからない部分、間違っている部分があればコメントください。


こんな対処法もあります。
https://qiita.com/YukiWebTech/items/fb0b23b8d39573354ce5
https://madogiwa0124.hatenablog.com/entry/2017/03/26/133051
プログラミング学習スタート！

大学３年生をしています、あんぬです！

自分でWEBサイトを作れるようになりたくて、プログラミングを勉強することにしました！

QUIITA では、ラフに、その日に勉強したことをアウトプットしていこうと思います！


今日は、ドットインストールで、HTML/CSSの学習環境を整えました！

VS code がちょっと分かっただけで感動してます。（笑）

これからレベルアップしていきます！

えいえいおー
AWS RDSについてのメモ

## log

基本的にデフォルトで出力されるのはエラーログだけ。
スロークエリや一般ログを出力したいのであれば要設定変更
デフォルトではlogのアウトプットはテーブル。ダウンロードしたければlog_output=fileにする
インスタンス停止中はログは全てのログ(error,slow,多分generalも)が見れない

### エラーログ
[公式](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/USER_LogAccess.Concepts.MySQL.html)

まずmysql-error.logに書き込まれる。
５分間隔でmysql-error-running.logにflushされる。mysql-error.logは空になる。
mysql-error-running.logは1時間毎にローテートされる。
その後24時間経過にその時間のmysql-error-running.logは上書きされる。
ログは24時間でなくなってしまうため、それ以上保管したい場合は、awscliなどで定期的にダウンロードする

```
確認
aws rds describe-db-log-files --db-instance-identifier $ID

ダウンロード
aws rds download-db-log-file-portion \
--db-instance-identifier $ID\
--starting-token 0 \
--output text \
--log-file-name error/mysql-error-running.log.0 > errorlog.txt
```

### slowquery

下記を設定する
slow_query_log:1
long_query_time:2 #スロークエリに出力する秒数。デフォルト１０秒。個人的には大体２秒ぐらいにしておくといいかなと思う。クエリ終了時に書き込まれる。

### バイナリログ

他のログの様にawscliでは取得できない。
mysqlbinlogを使用して取得する。
Mac CatalinaでISOイメージファイルから書き込みできないとき

## 問題
FinderからISOイメージをDVDに書き込もうと思ったらエラーが出て書き込めませんでした。

こうしようとして、
![スクリーンショット 2020-01-27 21.10.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49555/b8139044-52d0-514c-868f-81a762c29825.png)

これが出ました。
![ss2020-01-27 21.07.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49555/4a90d2ba-fa10-87f0-d986-5a13e054e936.png)

## 原因

Appleコミュニティでも質問が上がってましたが、
回答の操作方法ではダメでした。
https://discussionsjapan.apple.com/thread/250750128

Catalinaでのバグかもしれません。

## 解消

Catalinaリリースからマイナーバージョンアップしていますが、一向に直りません。

```bash
$ sw_vers
ProductName:    Mac OS X
ProductVersion: 10.15.2
BuildVersion:   19C57
```

対処方法はCUIでやります。

```bash
$ hdiutil burn Win7_Ult_SP1_Japanese_x64.iso
ディスクに書き込むデータを準備中
セッションを開いています
トラックを開いています
トラックを書き込み中
.......................................................................
トラックを閉じています
.......................................................................
セッションを閉じています
.......................................................................
ディスクの作成を終了中
ディスク作成の検証中…
検証中
.......................................................................
ディスク作成が完了しました
.......................................................................
hdiutil: burn: completed
```
※書き込み先を明示する場合はオプションで指定できます。ぼくの環境では外付けのDVDドライブだけだったので、↑のコマンドで書き込みできました。

## 参考

- https://discussionsjapan.apple.com/thread/250750128
- https://beiznotes.org/failed-to-make-a-cdrom-disk-image-on-macos-catalina/
外付けSSDにmacOSをインストールしようとして"Unable to verify macOS"と出た場合

外付けSSDにmacOS Catalinaをインストールしようとした際に"Unable to verify macOS"というエラーメッセージが出てインストールが続行できず解決に時間がかかったのでまとめました。

# 結論
macOS復元を起動し、起動セキュリティユーティリティから`安全な起動`は`中程度のセキュリティ`に、`外部起動`は`外部メディアからの起動`にセキュリティレベルを下げる。
リカバリーモードでの起動は[こちら](https://support.apple.com/ja-jp/HT201314)を、起動セキュリティユーティリティについては[こちら](https://support.apple.com/ja-jp/HT208198)を確認してみてください。

# 解説
最近のMacではApple T2 セキュリティチップにより、ストレージの暗号化やセキュアブートなどセキュリティ機能が大幅に向上し、iOSと同程度の水準のセキュリティを確保できるようになりました。
[Apple T2 セキュリティチップについて](https://support.apple.com/ja-jp/HT208862)
[「安全な起動」について](https://support.apple.com/ja-jp/HT208330)
今回はこのセキュリティ機能が影響していました。"Unable to verify macOS"の表示だけだったので気づきませんでした…
ということで、少しだけレベルを下げてあげましょう。(当然その分セキュリティのレベルは下がりますのでご注意ください。)Mac本体のセキュリティを下げるにはmacOS復元にある起動セキュリティユーティリティを使用することで変更できます。
今回は`安全な起動`を`中程度のセキュリティ`に変更することでインストールと起動ができることを確認しました。もちろん外部メディアを使用するので合わせて`外部起動`も`外部メディアからの起動`に変更してください。

# あとがき
以前外付けHDDにインストールした際にはセキュリティのレベルを下げていたため問題なくインストールできていました。そのため今回インストールに失敗した際は非常に苦戦しました。この記事で救われる人がいれば幸いです。(そもそもそんなに需要はあるのだろうか…)
余談ですが外付けHDDよりも外付けSSDの方が圧倒的に速いです。
間違いなどがありましたら教えてください。:bow:

# Reference
https://apple.stackexchange.com/questions/374703/unable-to-verify-macos-when-i-try-installing-the-os-on-an-external-ssd
Q19.フォルダ内のファイルリストを表示するには？

今回は、特定のフォルダの中にあるファイルを一覧で表示するというマクロについて考えていきます。
例えば、ファイルの名前を一気にコピーしたいときとかに使えたりします。
それだけであれば、コマンドプロンプトから同じようなことができますし、そっちの方が手っ取り早かったりもします。

マクロで作る場合は、そこからさらに改良することもできます。
ファイル名と同等のフォルダを一気に作ったりだとか、ファイル名を一気にリネームしたりとか。

ただし、今回作るのはあくまでもファイルを一覧表示させるところまでです。



###■ポイント
ファイルの一覧を取得するには、Dir関数を使用するのが一般的です。
buf = Dir("C:\Sample\Book1.xls")
のように使います。
一致した場合は、一致したファイル名を返します。
この場合は、Book1.xlsを返します。

さらに、Dir関数ではワイルドカードを使ってファイル名をしていることができます。
buf = Dir("C:\Sample\*.xls")
とすると、Sampleフォルダ内にある.xlsを含むファイルをすべて返します。
ただし、一度にすべてを出力するわけではありません。

2回目以降は引数なしで使用することができます。
buf = Dir()といったように。
こうやって繰り返し利用することによって、2つ目以降のファイル名を取得することができます。
そして、最後は空文字を返します。

つまり、空文字を返すまでループすれば、一致したファイル名を全て取得することができるわけです。


と、文章で読んでもいまいちわかりにくいと思いますので、ぜひ回答を見て実際に試してみてください。


###■回答
```VB
Sub Q19_Answer()
    Dim buf As String, cnt As Long, Path As String
    With Application.FileDialog(msoFileDialogFolderPicker)
        If .Show = True Then
            Path = .SelectedItems(1)
        End If
    End With
    Range("E2").Value = Path
    cnt = 2
    buf = Dir(Path & "\")
    Do While buf <> ""
        cnt = cnt + 1
        Cells(cnt, 2) = buf
        buf = Dir()
    Loop
End Sub
```


###■解説
今回は前半部分で、フォルダを指定するダイアログを出力する処理を記述しています。
そして、そのフォルダ内にあるファイル一覧を取得しています。

前述したとおり、空文字を返すまでループ処理をしています。
この部分です。
    Do While buf <> ""
        cnt = cnt + 1
        Cells(cnt, 2) = buf
        buf = Dir()
    Loop

これで、最初に指定したフォルダにあるファイル一覧を取得することができます。


実行例は以下です。まずデスクトップに新しいフォルダーを作成し、その中に
テキストファイルを複数用意しました。

![Q19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/560479/31ef1c9e-6ee6-780f-5fca-6cf86eb1eb4b.png)



そして、マクロを上記のマクロを実行してみます。
すると、このようにファイル一覧を取得することができました。


![Q19-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/560479/28d1be45-3a02-e287-5e38-e106df6f341d.png)
BootstrapVueでモーダルの背景が真っ暗になる問題

BootstrapVueを愛用しているのですが、あるバージョン(2.0.0-rc28あたり)から、モーダル(b-modal)を開いたときに背景が真っ暗になる問題に悩まされました。

<img width="542" alt="SS 2020-01-27 20.16.41.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/472822/f9453eb8-ee0c-e40c-24f0-b37d998646ba.png">

本来なら下のように背景が透過するはずなんですよね。

<img width="542" alt="SS 2020-01-27 20.16.21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/472822/451b163c-9e5d-72af-e85e-390b75eb9b22.png">

コードに問題がないように、添付のスクショは[公式ドキュメントの最初のサンプル](https://bootstrap-vue.js.org/docs/components/modal)をそのまま使って再現しています。

```vuejs
<template>
  <div>
    <b-button v-b-modal.modal-1>Launch demo modal</b-button>

    <b-modal id="modal-1" title="BootstrapVue">
      <p class="my-4">Hello from modal!</p>
    </b-modal>
  </div>
</template>
```

## 真っ暗になる理由

本来はモーダル表示時の背景のかぶせ要素である`<div class="modal-backdrop"></div>`に、フェードイン時に`class="show"`が付与され、`class="show"`にopacity（規定値は0.5）が定義されていることで透過するはずなのですが、このクラスが何故か付与されていないことがわかりました。

<img width="468" alt="SS 2020-01-27 20.30.50.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/472822/c743c808-7573-6559-8939-b1bbac4fff24.png">

bootstrapのscss(_modal.scss)のコードはこちら。

```scss
// Modal background
.modal-backdrop {
  position: fixed;
  top: 0;
  left: 0;
  z-index: $zindex-modal-backdrop;
  width: 100vw;
  height: 100vh;
  background-color: $modal-backdrop-bg;

  // Fade for backdrop
  &.fade { opacity: 0; }
  &.show { opacity: $modal-backdrop-opacity; }
}
```

[こちら](https://github.com/bootstrap-vue/bootstrap-vue/issues/3438)にこの問題についてのイシューがあり、ワタシエイゴガヨメナクテヨクワカラナイのですが、Bootstrap4系ではコードのサイズを削減するために、トランジションのスタイルがvueと完全に互換性がないとかなんとか・・

## 最低限の解決方法

で、最低限以下のスタイルを追記すれば一応、冒頭のとおり真っ黒事象は解決できました。

```css
.modal-backdrop {
  opacity: 0.5;
}
```

トランジションを無視しており、正しい解決方法ではないことは承知ですが、真っ暗よりはマシですし、同じ問題に悩む私のような初心者もいるかもなあ・・と思って投稿しました。
Visual StudioでWindowsフォーム画面デザイン時の注意点

# ■概要

Visual Studioで「メインディスプレイのスケールは xxx% に設定されています。」という黄色いバーが出たら急いで保存せずに閉じてOSのDPIを100%にしましょう。
![vs2019_hdpi.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142879/e5f089b1-b4cb-1f12-67a1-4c45f9431c35.png)

キーワード：高DPI, Hi-DPI

# ■設定方法

## Windows 7の場合
1. デスクトップを右クリックし、[画面の解像度]を選択する
1. [テキストやその他の項目の大きさの変更]リンクを選択する
1. 100%を選択し、[適用]ボタンを押す
1. ログオフを求められたらログオフする

## Windows 8.1の場合
1. デスクトップを右クリックし、[画面の解像度]を選択する
1. [テキストやその他の項目の大きさの変更]リンクを選択する
1. [すべてのディスプレイで同じ拡大率を使用する]をチェック状態にする
1. 100%を選択し、[適用]ボタンを押す
1. サインアウトを求められたらサインアウトする

## Windows 10の場合
1. デスクトップを右クリックし、[ディスプレイ設定]を選択する
1. [テキスト、アプリ、その他の項目のサイズを変更する]で100%を選択
1. サインアウトを求められたらサインアウトする

# ■補足

これは高DPI環境でWindowsフォームデザイナーを開いたときに表示される「レイアウトが崩れるよ」警告です。注意を促してくれるのはVisual Studio 2017～ですが、それより前のVisual Studioでも問題は発生します。

対策方法はいくつかありますが、この方法が一番安全だと思います。
または高DPI環境で開発するときはWindowsフォームデザイナーを開かずに頑張るのも手です。
エラー文StaticPagesController#○○ is missing a template for request formats: text/htmlの解決法

## 結論：view内のファイル（今回ですとstatic_pages）の中にhtmlファイルを作る

○○の部分がアクション名とviewファイル名になります。


## エラー文

rails sでサーバーを立ち上げたら以下のエラーが出ました。


```Error:
StaticPagesControllerTest#test_should_get_about:
ActionController::MissingExactTemplate: StaticPagesController#about is missing a template for request formats: text/html
    test/controllers/static_pages_controller_test.rb:18:in `block in <class:StaticPagesControllerTest>' 
```


 aboutというhtmlファイルがstatic_pagesの中に作られていないという意味なのでstatic_pages内に`about_html.erb`を作成。





解決しました。
[jQuery]押下したボタンのページ内リンクに飛ぶ。

# 押下したボタンのページ内リンクに飛ぶ


ご覧いただきありがとうございます！
jQueryを使用してページ内リンクへ飛ぶソースコードについて解説していきます。

<br>
まず、全体のコードがこちらです。

```js
  $(function(){
    $('header a').click(function(){
      var id = $(this).attr('href');
      var position = $(id).offset().top;
      $('html, body').animate({'scrollTop':position},500);
      return false;
    };
  });
```
<br>

部分的に見ていきます。
まずはじめに、ボタンのクリックイベントを作る。

```js
  $('header a').click(function(){
```


<br>
次に、変数「id」にクリックされたボタンの'href'属性の値を設定します。


```js
   var id = $(this).attr('href');
```

<br>
そして、'href'の属性値が設定された「id」を使って画面Top〜ページ内のリンクまでの距離を変数「position」に、設定します。

```js
   var position = $(id).offset().top;
```

<br>
最後に、animateメソッドの引数①scrollTopプロパティに先ほどのposition変数(Topからページ内リンクまでの距離）を設定し、引数②に500（ms）を設定します。

```js
   $('html, body').animate({'scrollTop':position},500);
```

<br>
以上の流れで押下したボタンのページ内リンクに飛ぶことができます。

最後までご覧いただきありがとうございました！
Sim-to-Real: Learning Agile Locomotion For Quadruped Robots を読んでみた

# Sim-to-Real: Learning Agile Locomotion For Quadruped Robots について
url : https://arxiv.org/abs/1804.10332
2018,Google Brain,X,Google DeepMind

# どんなもの？
強化学習のロボティクス分野への応用として，制御プログラムの作成を自動化したいというものがある．
これは多くの場合，シミュレーション環境で方策を学習し，現実のロボットに方策を転移するという方法をとる．
現状この分野には，理想と現実のギャップ(reality gap)によりシミュレーション環境で学習された方策は現実世界ではうまく動作しないという問題がある．
このreality gapを狭めるための研究

# 先行研究と比べて何がすごい？
シミュレーション方策を現実のロボットに転移する際，手動によるチューニングや，現実世界での追加トレーニングなしで適用でき，エネルギー効率の良い歩行動作の獲得にも成功した．

# 技術の手法や肝は？
以下のような方法でロバストな学習を実現した

* 物理パラメータのランダム化
* ランダムな摂動の追加
* コンパクトなobservation space  

# どうやって有効だと判断した
実際にbaselineの手法と提案手法でシミュレーション方策を現実のロボットに転移し，得られる期待報酬で比較．

# 議論はある？
この論文の焦点は，現実世界に転移可能な移動方策の獲得にある．そのため，単純な報酬関数，単純な環境（平らな地面）を使用した．現実的なシナリオとしては，ロボットは環境を見て，速度や方向を変化させる必要がある．なので，速度と方向を動的に変更できる方策，視覚情報の追加など拡張していくと良さそうである．
シェルをzshに変えたらrailsコマンドが使えなくなった件

#### まずはじめに、、、
- 自分のメモ用に書き残しておきたく投稿しているので読みづらかったり間違えている箇所があるかもしれないのでその点につきましてはお許しください
- 間違えている箇所につきましてはコメントでご指摘していただけたら幸いです

---

### さて本題の問題について
macOSをcatalinaにしてからシェルをzshにせずにbashのままでいたらターミナルを開くたびに見慣れない英語がずらりと書かれていたのでその通りにシェルをzshに変更した後にrailsコマンドを使おうとしたら、、、

```
Rails is not currently installed on this system. To get the latest version, simply type:

    $ sudo gem install rails

You can then rerun your "rails" command.
```

この通りに実行しrailsコマンドをすると、、、

```
You must use Bundler 2 or greater with this lockfile. (Bundler::LockfileError)
```
今度はこんなエラーに:frowning2:

---

### 解決できた方法
シェルを変更したことによってrbenvのパスを通し直すことをすっかり忘れていたのが原因でした

```
export PATH="$HOME/.rbenv/shims:$PATH"
```
これでしっかりパスを通し直して一件落着でした！！！