OmniAICreator/Qiita-1.07M huggingface dataset:
【RSpec】画面ごと CSSのテストができるGem「rspec-css」の使い方

# この記事は

CSSの比較ができる [rspec-css](https://bitbucket.org/smapira/rspec-css) を作ったメモ

# やりたかったこと

すぐ壊れるCSSのテスト

# やり方

## インストール方法

gem 'rspec-css'

## CSSの記録

```ruby
Capybara.default_driver = :selenium_chrome_headless
Capybara.app = Rack::File.new('spec/fixtures/files/')

visit 'sample.html'
files_path = 'spec/fixtures/files/sample.yml'
RSpec::CSS.print_silk(files_path, page) unless File.exist? files_path
```

## 比較
```ruby
css_file = File.open files_path, 'r'
expect(page).to eq_screen_css(css_file.read)
```

## 結果
```
(compared using ==)

Diff:
@@ -17,7 +17,7 @@
  animation-timing-function: ease
  appearance: ''
  azimuth: ''
-  backface-visibility: hidden
+  backface-visibility: visible
  background: rgba(0, 0, 0, 0) none repeat scroll 0% 0% / auto padding-box border-box
  background-attachment: scroll
  background-blend-mode: normal
```

# 技術的ポイント

きっかけは「VCR便利だな」って軽い気持ちだったのが、RSpecは気軽に触れちゃいけないものだという畏怖の気持ちに変わり、Qiitaの記事とか参考になんとか出来たって感じなので、オープンソースは人々の協力によって支えられているのだ、という今の感謝の気持ちを心に留めてRailsを利用したい。
最近、Unityでよく使うショートカット 

<h2>シーンにゲームオブジェクトを置き過ぎてしまった</h2>
Unityでゲームを作るのが楽しくて、シーンにたくさんゲームオブジェクトやらスクリプトやらを置いていたら、再生ボタンを押してから動作するのに30秒ぐらいかかるようになってしまいました。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/633612/5ea5875e-d2a0-9b1f-85d6-32d10c08e079.png" width="600">



<h2>シーンのヒエラルキーにあるオブジェクトが画面のどこにあるのかわからない時</h2>
それはさておき、シーンを作りこんでいたり、Prefabだらけだったり、何年も前に制作したシーンだったりするとどこに何を置いたのか、それが画面のどこに表示されるのか分からなくなってしまうことがあります。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/633612/3c9cb79f-b90a-7e6e-68f6-286356173128.png" width="500">


<h2>もっと便利な方法があるのかもしれないけど・・・</h2>
そんな時、ヒエラルキー上のゲームオブジェクトを選択してから、SHIFT+Fを押すと、そのゲームオブジェクトが中心に表示されるようにシーンが移動してくれます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/633612/4e3c7b40-c8dc-f1df-f297-e34371b41210.png" width="500">


これでマウスのホイールを行ったり来たりしてシーン上のオブジェクトを探すことがなくなりました。
五月雨(satsukiame)と五月雨(samidare)

本日の東京は久しぶりの本降りですね。

記述は同じなのに、読み方が違うって日本語ってほんとおもしろいですよね。
どちらも昔の暦の5月ま末に降る長雨、つまり梅雨のことを指すそうです。
先週、奄美の方が梅雨入りということで我が家は東京ですが湿気対策を行いました。

さて今日のBGMはメガテラゼロさんの[レイニーレイニー](https://www.youtube.com/watch?v=w4dCGaAON9U)で作業していきましょうか。

引き続きドワンゴ様の[研修資料](https://scala-text.github.io/scala_text/control-syntax.html)でscala基礎を学んでいきます。

## while式
while式の記述

```scala
while '('条件式')' 本体式
```
条件はBoolean型である必要があります。
while式は条件式がtrueの間、本体式を評価し続ける。
なお、while式も式なので値
を返すが、while式には適切な返り値がないのでUnit型の値()が返る。

while式で1から10までの数字を出力をする

```scala
object Main extends App {
  var i = 1
  while (i < 11) {
    println(i)
    i = i + 1
  }
}
```

可変の変数iを定義
while式の条件としてiが11より小さいなら、
iの標準出力とi + 1を実行を繰り返すようにしています。
これにより1から10の標準出力を実現できる。

do while式というのも存在する。
Javaで存在していたbreak文やcontinue文に相当する言語機能はない。
しかし、適切に使用すればbreak文やcontinue文は必要ない。

### while練習問題
do while式を使用して上記と同じ出力を表現する。

```scala
  var i = 1
  do {
    println(i)
    i = i + 1
  } while (i < 11)
```
do while式は先に本文式を実行して、条件式がtrueならその動作を再び実行する記述になっている。
虫の頭でCoffeeScriptを理解しようとしてみる。クラス文

クラス宣言勉強。要するにカテゴライズするもの。例えば虫というカテゴリをcoffeeに伝える

```coffeescript:musi.coffee
class 虫
```

  虫というクラスの中にカマキリという分野(プロパティ)があることをcoffeeに伝える。プロパティには変数と同じくデータ格納が可能

```coffeescript:musi.coffee
カマキリ:"カマキリだよ"
```

新種の虫オオカマキリさんを発見したのでcoffeeに「新しい虫クラスに属するもの見つけたよ」と伝える

```coffeescript:musi.coffee
オオカマキリ=new 虫
```

オオカマキリさんは「カマキリだよ」とログに出力したいので、オオカマキリさんにプロパティ「カマキリ」をくっつけてconsole.logする

```coffeescript:musi.coffee
console.log(オオカマキリ.カマキリ)
```
【Laravel】.env.testingの使用方法と注意点

LaravelでPHPUnitを使うときにテスト用の`.env｀を設定するのにハマったので記事にしました。

# 環境
Docker 19.03.8
PHP 7.3.16
Laravel 6.18.3


# .env.testingの設定方法

本番DBを汚さないようにPHPUnitを実行する時のみテスト用のDBを使うようなことはよくあると思います。

その方法の一つとして`.env.testing`を作成し、phpunitにその設定値を読み込ませるやり方があります。

`.env.example`をコピーして`.env.testing`を作成し、以下の箇所を変更します。

```.env.testing
APP_ENV=testing // testingに変更
APP_KEY= // 空にしておく

// 接続したいDBの情報を設定する
DB_CONNECTION=mysql
DB_HOST=db
DB_PORT=3306
DB_DATABASE=test_database
DB_USERNAME=root
DB_PASSWORD=
```

そうしたら`phpunit.xml`を開き、`APP_ENV`の値をtestingに変更します。

```phpunit.xml
<php>
    <env name="APP_ENV" value="testing" force="true"/>
    <env name="DB_CONNECTION" value="mysql"/>
    <env name="BCRYPT_ROUNDS" value="4"/>
    <env name="CACHE_DRIVER" value="array"/>
    <env name="MAIL_DRIVER" value="array"/>
    <env name="QUEUE_CONNECTION" value="sync"/>
    <env name="SESSION_DRIVER" value="array"/>
</php>
```

最後に`.env.testing`に新規にアプリケーションキーを設定したら完了です。
これをしないと`.env`の`APP_KEY`を参照しに行ってしまい、本番用のDBのデータが全部飛ぶので注意しましょう。

```
php artisan key:generate --env=testing
```


# ハマったポイント

docker-compose.ymlなどで環境変数に`APP_ENV`や`DB_DATABASE`などの設定をしている場合、注意しなくてはいけない点があります。
`phpunit.xml`で環境変数を上書きする際に、デフォルトだと`<server>`タグになっていますが、これを`<env>`タグに変更する必要があります。

```phpunit.xml
<php>
    <server name="APP_ENV" value="testing" force="true"/>
    <server name="DB_CONNECTION" value="mysql"/>
    ...
</php>
```

```phpunit.xml
<php>
    <env name="APP_ENV" value="testing" force="true"/>
    <env name="DB_CONNECTION" value="mysql"/>
    ...
</php>
```

`<server>`タグと`<env>`タグは以下のような違いになっています。

```php:
$_SERVER['APP_ENV'] = 'testing'; // <server>
$_ENV['APP_ENV'] = 'testing'; // <env>
```

今回は`docker-compose.yml`で環境変数として`APP_ENV`などを定義していたので、さらにそれを上書きする必要がありました。


## 参考文献
[Laravel 7.x テスト: テストの準備](https://readouble.com/laravel/7.x/ja/testing.html)
[Laravel × Docker でテスト用のデータベースコンテナを使う](https://qiita.com/ucan-lab/items/0f7100f08a062e892c52)
AndroidStudioで辞書登録を共有する

# はじめに
プロジェクト特有の言葉（日本語やビジネス用語）を使うときにAndroidStudioでは
丁寧に警告を出してくれるんですが、ミスリードなので警告を回避して、
チームで共有する方法を整理しました。

ちなみに、[開発プロジェクトでスペルチェック用辞書を共有する方法](https://qiita.com/beyondseeker/items/7e63e6a22d6ba3f9f2bd#fn1) が
すごく丁寧に書いてくれています。この記事は主に自身の備忘録にあたります...

# やったこと

1 typo対象外にしたいワードをAndroidStudioで辞書登録する
<img width="907" alt="スクリーンショット 2020-05-17 19.37.56.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/384422/1492e77c-79ac-1b9b-5e40-09be1a5ff77b.png">


2 辞書ファイルはOSユーザー名で作成されるため、プロジェクトで共有できるファイル名に変更する
<img width="593" alt="スクリーンショット 2020-05-17 19.38.32.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/384422/061c1ae7-0a96-ca38-65b1-1af170f89f63.png">

`<dictionary name="os_user">` の name を変更するとファイル名自体も勝手に変更してくれるので便利です


3 (必要であれば).gitignoreを編集してGitで共有できるようにする

<img width="497" alt="スクリーンショット 2020-05-17 19.53.44.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/384422/38382ca7-e8c5-4b1a-c530-42d8bf7536b4.png">

プロジェクトで共有するファイルはgit登録、それ以外の辞書ファイルは無視する設定とかにしておくといいかもしれません。
あとは、GitにPushして終了です。

# まとめ
コーディングに集中しているときは後回しにしがちなのでチームで開発するときの環境整備として
早めにできているといいと思いました。
プロジェクトで共有できるファイル名にしておくことで、個別の設定も各自でできるので有用かなと..
（個別の設定は必要に応じてマージしてもらわないといけないですが..）
TECH CAMP 6週目

さて、5月19日の報告会に向けての個人アプリ開発。幼稚園の出席簿アプリを開発中です。機能的には応用カリキュラムの復習も兼ねて、作成したChat-spaceと同様の機能＋αといったところです。転職に使用するポートフォリオはこれと、あとは随時開発して増やしていこうと考えています。
また、報告会後に残りの機能実装、テスト、デプロイを実施予定です。ちなみに、個人アプリはメンターへの質問禁止です。

【学習内容】
・復習
（データベース設計、Haml、Sassでのマークアップ、deviseを使用したユーザー管理機能、メッセージ送信機能）
・CSV出力機能

ちなみに個人で開発しますが、Githubを使用し機能毎にブランチを切り替えながら進めていきました。Git、Githubの使い方に早く慣れよう‥と思った矢先にまたも事件が発生‥。

**・復習**
進め方はほとんどChat-spaceと同じなので、ほぼほぼスムーズにいきました。しかし、構想や設計の甘さがあり、開発途中でそれをまたゼロから作ることになり、さらに再開発中もデータベースのカラムを追加したりと反省点が多く浮き彫りになりました。
今後は構想の段階から細かい仕様を詰める必要がありますね。

〈機能説明〉
お子さんが休みの場合はこちらのフォームに入力し送信。
<img width="950" alt="スクリーンショット 2020-05-17 16.02.10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620703/29f1f039-5e21-b4a2-a9bf-5df90d9db3fe.png">
そしてこちらが一覧表示されます。日付が新しいものが上にきます。
<img width="907" alt="スクリーンショット 2020-05-17 16.09.03のコピー.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620703/3d8ca211-8721-6d62-5ac1-0ed8401b1b5c.png">

幼稚園の先生はこちらを使用し出席管理。名前は一応あいうえお順ですが、自分はアルファベットなので先頭になっちゃってます（笑）
<img width="318" alt="スクリーンショット 2020-05-17 16.14.33.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620703/c0c13517-7c45-a27d-03b5-6a370c7b4b54.png">





**・CSV出力機能**
今回新たに学んだのはこれ。データベースの内容をスプレットシートに出力し、パソコン内へ保存します。またその中で、別のテーブルの内容を持ってくる必要がある為、.joins()でテーブルの結合も合わせて実施しました。

viewフォルダ内にファイルを作成。

```view/messages/index.html.ruby
require "csv"

CSV.generate do |csv|
  @messages = Message.joins(:user)
  column_names = ["日付","名前", "内容", "事由"]
  csv << column_names
  @messages.each do |message|
    column_values = [message.dayname, message.user.name, message.absence, message.body]
    csv << column_values
  end
end
```

アイコンをクリックしたら出力できるようにhamlを編集。

```view/messages/index.html.haml
=link_to messages_path(format: :csv) do
        = icon('fas','download')
```

〈機能説明〉
クリックすると‥
<img width="176" alt="スクリーンショット 2020-05-17 15.51.00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620703/6d39d2ef-6e5f-e083-cb9b-1077d01f729c.png">

スプレットシートに出力され保存が可能！
<img width="830" alt="スクリーンショット 2020-05-17 15.52.23.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620703/1f21f4d8-7061-fc42-917e-f07e8aebabbf.png">

ちなみに上記欠席内容のデータと、下記のように出席データも可能。
<img width="834" alt="スクリーンショット 2020-05-17 15.57.33.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620703/ae93baf5-a920-2993-790e-c98daf496a1a.png">

これでペーパーの出席簿はいらないですね！
これ以外にも実装したい内容はありましたが、自分のスキルが足りなくて悔しい思いをしています。
あと事件というのは、Githubでコミットする前に間違えてブランチを切り替えてしまい、その前日に作った分が全て消えた事です。ショックでしたけど、その分CSVをまたやる事になり良い復習になりました！

## 参考
・[【簡単3ステップ】RailsでCSV出力する方法](https://qiita.com/ngron/items/60915083cb2bc3622c79)
・[Rails における内部結合、外部結合まとめ](https://qiita.com/yuyasat/items/c2ad37b5a24a58ee3d30)
変数(Swift)

##この記事について
プログラミングの勉強をしています。
勉強の過程で得た知識を、忘れないようまとめておくのと共に、誰かの助けになればと思います。

##Swiftにおける変数
Swiftでの変数の定義は

```
var 変数名:データ型 = 初期値
```


定数の場合は

```
let 定数名:データ型 = 初期値
```
で行う。

var(変数)の場合は、後から代入などで値を変更できるが、
let(定数)の場合は、最初に入れた値を変更できない。

データ型を省略して、

```
var 変数名 = 初期値
let 定数名 = 初期値
```
でも大丈夫。
【開発ログ⑮】外部リンクやPDFリンクをつけたい

# 前提について
はじめまして、 プログラミングスクールに通ういりふねと申します。この記事は、スクールの課題である個人アプリの開発の記録を書くことで、自身のアウトプットに利用しています。もし、読んでいただけた方がいましたら、フィードバックをしていただけたら嬉しいです。

開発するのは「有給休暇管理ツール」です。仕様は[過去記事](https://qiita.com/iczo32/items/97ad7d4baa985b3b99ca)をどうぞ。

アプリはデプロイまで行いますが、サービスとして提供するものではありません。あくまでも自学習の一環ですので、ご理解下さい。では本題へどうぞ。

# 今回の実施内容
今回は厚生労働省のリンクや有給休暇の届出のPDFのリンクを付けたいと思います。おまけ機能的なものですね。実際には以下の手順で実施します。

- 厚生労働省のリンクを実装
- 新しいタブで開くを実装
- google driveの共有設定
- 有給休暇の届出のリンクを実装

#厚生労働省のリンクを実装
<img width="640" alt="スクリーンショット 2020-05-17 19.19.29.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614723/0c7a589d-34ce-67c6-fb2a-ee8e2a5ee918.png">

ページ左下の関連サイトのボタンに設置します。こちらは、link_toにURLを入力するだけなので、とっても簡単です。

```haml:branches/_side.html.haml
〜中略〜
    .links
      = link_to '#' do
        有給休暇届
      = link_to "https://www.mhlw.go.jp/shingi/2004/04/s0428-7b2a.html", class: "link" do
        関連サイト
```

# 新しいタブで開くを実装
実際にリンクをクリックすると、現在開いている有給休暇管理ツールのページから厚生労働省のページに遷移します。これでは、いちいち戻るボタンを押す必要があるので、新しいタブにリンク先が表示されるようにします。

```haml:branches/_side.html.haml
〜中略〜
    .links
      = link_to '#' do
        有給休暇届
      = link_to "https://www.mhlw.go.jp/shingi/2004/04/s0428-7b2a.html", target: :_blank, class: "link" do
        関連サイト
```

追加したのは、「target: :_blank」の部分です。これで、新しいタブで開くようになりました。
<img width="482" alt="スクリーンショット 2020-05-17 19.28.07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614723/b74ff89e-3768-1d2a-4262-5679150c60c5.png">

# google driveの共有設定
次にPDFの文書「年次有給休暇届」のリンクを実装します。有給休暇の申請を紙ベースで管理している会社の方が多いと思いますので、有給休暇管理ツールに見本があれば、すぐにプリントアウトして社員さんに渡してあげることができます。
今回は、google driveの共有設定を利用してリンクを取得します。
<img width="731" alt="スクリーンショット 2020-05-17 19.32.12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614723/80c4052f-3d1e-8f79-f1c0-f87717d67883.png">
まずは、自身のdriveにPDFファイルを保存します。保存はドラッグ＆ドロップでOKです。次に共有したいファイルを右クリックして、「共有」を押します。出てきたメニューの下側にリンクを取得があるので、その中の「リンクを知っている全員に変更」をクリック、「リンクをコピー」をクリックします。
<img width="658" alt="スクリーンショット 2020-05-17 19.39.17.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614723/c75f6dca-ae04-62ff-7a34-4f9bf8cd6ccf.png">
参考にさせていただいた記事[「Google ドライブのファイルを共有する」](https://support.google.com/drive/answer/2494822?co=GENIE.Platform%3DDesktop&hl=ja)

# 有給休暇の届出のリンクを実装
最後に取得したリンクをrailsのlink_toに反映させます。

```haml:branches/_side.html.haml
〜中略〜
    .links
      = link_to "https://drive.google.com/file/d/1NXmC35ZbmCOAqu7oGyCOc2LqipHDGDJj/view?usp=sharing", target: :_blank, class: "link" do
        有給休暇届
      = link_to "https://www.mhlw.go.jp/shingi/2004/04/s0428-7b2a.html", target: :_blank, class: "link" do
        関連サイト
```

こちらの方法は、手軽にできますが、開いたリンクにアカウント名やメールアドレスが表示されるので、きちんとサービスとして実施する際には、専用のgoogleアカウントを用意するか、別の方法が良いかも知れません。

# 今日の振り返り
個人発表会が近くなってきました。有休の付与と消化を手入力で行うという意味ではだいぶ形になってきましたが、大切な付与計算などは省いているので、5月19日以降も継続してアプリケーションを作っていこうと思います。
Windows10 「rails s」を起動できない。localhost:3000にアクセスできない

初学者です。初歩的な質問だと思いますが、環境構築のところで躓いてしまったのでご教示頂けたら助かります。
Windows10環境下でRails serverを起動しようとトライしています。

コマンドプロンプトから

ruby -vで実行すると、
ruby 2.3.3p222 (2016-11-21 revision 56859) [i386-mingw32]

rails -vで実行すると
Rails 5.1.7

と返ってきています。アプリケーション名を「book」にする予定だったので、

rails new book

と実行し、C:\Users\81804の中に「book」というフォルダが生成されました。

cmdから「cd book」と実行し、bookディレクトリまで移動し、そこで「rails s」と実行したところ以下のようなエラーが表示されました。


Could not find gem 'turbolinks (~> 5) x86-mingw32' in any of the gem sources listed in your Gemfile.
Run `bundle install` to install missing gems.
ここで「bundle install」とコマンドプロンプトで実行してみました。するとしばらく文字列が綴られ、テキスト下部のほうを読んでみると、エラーを起こしていることがわかりました。エラーメッセージはこのような内容でした。


An error occurred while installing sqlite3 (1.4.2), and Bundler cannot continue.
Make sure that `gem install sqlite3 -v '1.4.2' --source 'https://rubygems.org/'`
succeeds before bundling.

In Gemfile:
  sqlite3
このような内容でした。エラー文から
gem install sqlite3 -v '1.4.2' --source 'https://rubygems.org/
とコマンドプロンプトで実行すればいいのか？と解釈し、こちらを入力してみると


Gem files will remain installed in C:/RailsInstaller/Ruby2.3.3/lib/ruby/gems/2.3.0/gems/sqlite3-1.4.2 for inspection.
Results logged to C:/RailsInstaller/Ruby2.3.3/lib/ruby/gems/2.3.0/extensions/x86-mingw32/2.3.0/sqlite3-1.4.2/gem_make.out
と書かれ、何やら成功しているようにみえるのですが、いざ改めて「rails s」を実行してみると


Could not find gem 'turbolinks (~> 5) x86-mingw32' in any of the gem sources listed in your Gemfile.
Run `bundle install` to install missing gems.
また同じエラーが発生する、という状況に陥ってます。
関係ないかもしれませんが、ウイルスバスターは無効にしてあります。

どなたかご助言いただけないでしょうか。

使用PC環境は以下の通りです。
・Windows10 Home
・Intel Corei7-8550U CPU 1.80GHz 1.99GHz
・実装メモリ16.0GB
・64ビットオペレーティングシステム,×64ベースプロセッサ

https://teratail.com/questions/176355
こちらのご質問内容に非常に近しかったので早速トライしてみました。有効と思われる回答↓
「sqlite3の1.4.0と言うバージョンはrailsと相性が悪く、使えません。Gemfile内で以下のようにバージョンを指定してください」


gem 'sqlite3', '~> 1.3.6'

私には「gemfile」が何なのかわからなかったのですが、新たに生成したディレクトリ内に「Gemfile」という2KBくらいのファイルがあったので、これをVS Codeで開き、

gem 'sqlite3'　と書かれていたところを
→gem 'sqlite3', '~> 1.3.6'
に書き換えて上書き保存してみました。

そして、もう一度コマンドプロンプトで、こちらのディレクトリまで移動し「Rails s」と実行してみましたが、やはり


Could not find gem 'turbolinks (~> 5) x86-mingw32' in any of the gem sources listed in your Gemfile.
Run `bundle install` to install missing gems.
というエラーが返ってきてしまいます...。
Virtual Boxで変更不可のVMを変更したい

Virtual Boxで怪しいサイトにアクセスしたり、ハニーポットで受けた攻撃を分析する用の解析VMを作りました。マルウェアに感染することもありうるので、ぶっ壊れる前提の環境にする必要があります。Virtual  Boxは、シャットダウンするだけで元の環境に戻せる機能がありますので、それを使います。

# ディスクのタイプを「変更不可」にするだけ
自分がよく使うツールの導入や設定が済んだ時点でディスクの設定を「変更不可」にします。これによりVMをシャットダウンするだけで初期状態に戻るため安全安心です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155700/fc515f63-ec9a-6af4-9dab-dfe9f467839c.png)

しかし、環境を作り終わったあとでも新しいツールを入れたくなったり、ブックマークを追加するなど、変更箇所はどうしても出てきてしまうものです。
Virtual Boxでは「変更不可」の状態から、書き込みができる「Normal」に変えても「変更不可」の状態からなぜか抜け出せません。「Normal」の状態でいくら設定変更しても、シャットダウンをすると「変更不可」の時点に強制的に戻ってしまうのです。
わたしは「VMのWin10のスタートメニューにサクラエディタをピン留めする」という、ものすごく小さな変更をしたかったのですが、どうしても「変更不可」の設定をした時点に戻ってしまうので途方に暮れていました。

# ディスクのクローンを作ろう
結局、既存ディスクのコピーすることで解決しました。コピーしたディスクは「Normal」の状態で作成されます。そこから任意の変更をし、設定ができたら改めて「変更不可」にすればよいのです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155700/90deea72-c1a0-db8f-a17e-9104bda12c84.png)

コピーを作成したら古いディスクは不要です。以下画像の赤枠のイメージとともに削除しても問題ありません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155700/35290250-5340-ecc7-5e7f-24ea461e4e15.png)

小さい変更ひとつするにしてもこれらのオペレーションが必要になるため若干面倒ですね。タイプの変更だけで切り替えられると楽なのですが。
blocklyでobjectを動かす。その15


#概要

blocklyでobjectを動かして見る。
音声合成をやってみた。

#ステージを作る。


```
var msg = new SpeechSynthesisUtterance();
msg.lang = 'ja-JP';
msg.rate = 1.0;  
msg.pitch = 0.8;
```

#フローを書く。
![image](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/e2be161c-c8db-38f9-0c00-d807cc6f755b.png)


#objectを書く。


```

Blockly.JavaScript.text_print = function(a) {
    return "msg.text = " + (Blockly.JavaScript.valueToCode(a, "TEXT", Blockly.JavaScript.ORDER_NONE) || "''") + ";\nwindow.speechSynthesis.speak(msg);\n";
};
```

#成果物

https://embed.plnkr.co/plunk/OcX7JgsctcrOiCew

以上。
EC2を再起動するのに必要なコマンド自分用


```
$  sudo service nginx restart
$  sudo systemctl restart  postgresql
$  ps -ef | grep unicorn | grep -v grep
$  bundle exec unicorn_rails -c /var/www/rails/Portfolio/config/unicorn.conf.rb -D -E production
```

データベースを再起動する必要があるのは忘れがち。
たとえ```sudo systemctl status postgresql```で動いていても、データベースの再起動はするべき。
サーバー構築経験がほぼゼロな自分でも Micorosoft Azureにハニーポットを建てられた話 ～その3 T-Pot編～

[前回記事はこちら](https://note.com/believe_in_beer/n/na55bc4327410)

# T-Pot インストール
いよいよ T-Pot のインストールです。その前にとりあえず update と upgrade をしておきます。また、Debian 9 Strech には git が入っていないので git を入れます。

```Bash
sudo apt upgrade -y
sudo apt update -y
sudo apt install git -y
```

git から T-Pot をダウンロード & インストールします。

```Bash
git clone https://github.com/dtag-dev-sec/tpotce
cd tpotce/iso/installer/
sudo ./install.sh --type=user
```

少し画面が進むと、以下の画面になります。これは「22番ポートが開いてて、ハニーポットのサービスとかぶるかもしれないけどいいですか？」と聞いています。気にせず Y を押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155700/a4253a65-e9c7-c416-6654-65e7f72a71ff.png)

T-Pot のインストールタイプを選択します。選択するタイプによってインストールするアプリケーションが異なります。ここでは、Standard を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155700/5e075053-bffa-5ae0-001d-4846e159fbf8.png)

ハニーポットの画面を確認する際のユーザーを作成します。インスタンスを作ったときのユーザーとは別のユーザー名にしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155700/3e896650-83d6-c8c4-c7cb-3d1f649c4cb5.png)

パスワードは2回入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155700/5eccaa6d-6487-7ff4-e3d6-ceefc6e832b7.png)

インストールが始まります。ここは少し時間がかかるので、お茶でも飲んでひと休みしましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155700/c6435cdd-4b02-6d8e-cee8-5585232e3d63.png)

インストールが正常に完了すると、SSH 接続が強制終了します。T-Pot のインストールによって**SSH のポートは 22 番から 64295 番に変更されています。**TeraTerm で接続する際は、64295 番に変更して接続してください。

# ポート開放
ハニーポットを運用するからには、たくさん攻撃が来てもらいたいものです。ですので、現在ポートは 22 番しか開けていませんが T-Pot 管理画面以外のポート(0-64000)をすべて開放します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155700/8d0a02f2-31ae-cc72-e5ff-d33907f97b6b.png)

64001-65535 は、T-Pot の攻撃状況を確認する画面（Kibana：ポート 64297）やシステムの状態を確認する画面（Cokpit：ポート 64294）など、さまざまなサービスが稼働しているポートです。このレンジは、自分が契約しているISPのIPレンジにするなど、信頼できる接続元からのみ許可するのが良いでしょう。

# T-Pot 起動
T-Pot のアドレスは、以下になります。こちらをブラウザのアドレスバーに貼り付けてください。

https://パブリックIPアドレス:64297

接続すると、以下の警告が表示されますが、気にせず「詳細設定」「xxx.xxx.xxx.xxx にアクセスする（安全ではありません）」を押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155700/52e2918b-d348-6c92-ba0c-10bb8cabb0ad.png)

アカウントを入力するフォームが表示されます。T-Pot インストール時に作成したユーザー情報を入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155700/38a68e16-4057-33fa-0298-033f0f0e4fc7.png)

正常にログインできると、様々なハニーポットの検知状況が見られるダッシュボードの詰め合わせセットの画面が表示されます。手始めに、T-Pot を押してみてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155700/15c3deca-8435-6332-dac3-4e86ee5d883f.png)

ハニーポットが攻撃を検知しているのが見られると思います。攻撃が来ていない場合は、ポートの開放状況を確認してみてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155700/c64f9702-d430-6890-c980-4bfbed7d105a.png)

これで、T-Pot のインストールは完了です。ハニーポットで観察ができるようになりましたので、いろいろ分析してみてください！
ゼロから始めるLeetCode Day28「198. House Robber」

#概要
海外ではエンジニアの面接においてコーディングテストというものが行われるらしく、多くの場合、特定の関数やクラスをお題に沿って実装するという物がメインである。

その対策としてLeetCodeなるサイトで対策を行うようだ。

早い話が本場でも行われているようなコーディングテストに耐えうるようなアルゴリズム力を鍛えるサイト。

せっかくだし人並みのアルゴリズム力くらいは持っておいた方がいいだろうということで不定期に問題を解いてその時に考えたやり方をメモ的に書いていこうかと思います。

[Leetcode](https://leetcode.com/)

[ゼロから始めるLeetCode 目次](https://qiita.com/KueharX/items/6ee2502c3b620c795b70)

前回
[ゼロから始めるLeetCode Day27「101. Symmetric Tree」](https://qiita.com/KueharX/items/05d78e039e53c1b67bf3)

基本的にeasyのacceptanceが高い順から解いていこうかと思います。

[Twitter](https://twitter.com/kueharx)やってます。

# 問題 
[198. House Robber](https://leetcode.com/problems/house-robber/submissions/)
難易度はeasy。
Top 100 Liked Questionsからの抜粋です。


あなたは通り沿いの家から泥棒することを計画している泥棒です。各家には一定のお金が隠されています。各家からの強盗を防ぐ唯一の制約は、それぞれ隣接する家にセキュリティシステムが接続されており、隣接する2つの家が同じ夜に侵入された場合に自動的に警察に通報されることです。

各家庭の金額を表す負ではない整数のリストを考慮して、警察に警告されずに今夜奪うことができる最大金額を求めましょう。

説明を元に問題を見てみましょう。

>Example 1:

>Input: [1,2,3,1]
Output: 4
Explanation: Rob house 1 (money = 1) and then rob house 3 (money = 3).
             Total amount you can rob = 1 + 3 = 4.

この例の場合、1つめの家と3つめの家から奪った場合の金額が最大になるため、4が返されます。


>Example 2:

>Input: [2,7,9,3,1]
Output: 12
Explanation: Rob house 1 (money = 2), rob house 3 (money = 9) and rob house 5 (money = 1).
             Total amount you can rob = 2 + 9 + 1 = 12.

この例の場合、1つめの家と3つめの家と5つめの家から奪った場合の金額が最大になるため、12が返されます。


# 解法



```Python
class Solution:
    def rob(self, nums: List[int]) -> int:
        pre = cur = 0
        for i in nums:
            pre,cur = cur,max(pre+i,cur)
        return cur
# Runtime: 20 ms, faster than 98.32% of Python3 online submissions for House Robber.
# Memory Usage: 14.1 MB, less than 9.09% of Python3 online submissions for House Robber.
```


リストを前から舐めていき、`pre`に`cur`を`cur`には`pre+i`と`cur`の大きい方を代入する、ということを行えば完走できると思います。

例えば。例の`[1,2,3,1]`の場合は

`pre` = 0,1,2,4
`cur` = 1,2,4,4

の順で推移し、最終的に正答である4が返されます。

下手に難しく考えずに、前から舐めていく場合はどのように操作すれば上手く動作するかという点に重点を置いた方が上手く解ける問題かと思います。


良さげな解答があれば追記します。
cloudfirestore 複数ドキュメント 取得でnot equalを使う方法

#not equalがない
firestoreにはnot equalがないようです。
whereでlessthanとgraterthanを組み合わせればいけると書いてあったのですが
文字列の場合だといけなかった。。。のでfilterを使って対処


```swift
struct UserData{
    let uuid:String
    let userName:String
    let nowLatitude: Double
    let nowLongitude: Double
    let updatedAt: Timestamp

    init(uuid:String,userName:String,nowLatitude: Double, nowLongitude: Double, updatedAt: Timestamp) {
        self.uuid = uuid
        self.userName = userName
        self.nowLatitude = nowLatitude
        self.nowLongitude = nowLongitude
        self.updatedAt = updatedAt
    }

    init(document: [String: Any]) {
        uuid = document["uuid"] as? String ?? ""
        userName = document["user_name"] as? String ?? ""
        nowLatitude = document["now_latitude"] as? Double ?? 0
        nowLongitude = document["now_longitude"] as? Double ?? 0
        updatedAt = document["updated_at"] as? Timestamp ?? Timestamp()
    }
}
```

てなかんじで辞書を作っていれば
以下のようにフィルターをかけてあげればできる

```swift

db.collection("users")
            .addSnapshotListener { querySnapshot, error in
            guard let documents = querySnapshot?.documents else {
                print("Error fetching documents: \(error!)")
                return
            }
            print("userDateReload")
            self.usersList = documents
                .filter{UserData(document:$0.data()).uuid != self.AppDelegateDatas.UUID }
                .map { UserData(document: $0.data()) }
                print(self.usersList)
        }

```
ローカルパッケージをシンボリックリンクでインストールしたらTypeScriptの型定義がコンフリクトして困った

npmやyarnには、依存先のパッケージをシンボリックリンクとして`node_modules`内にインストールする手法があります。

```shell
npm link
```

が代表的な例です。しかしながら、多くの場合この状況となるのは`package.json`に

```json:package.json
{
  "dependencies": {
    "bando-commons": "file:path/to/directory"
  }
}
```

のように指定がなされている場合です[^1]。

この時、指定されたディレクトリが`node_modules`配下にシンボリックリンクされますが、この時**指定されたディレクトリ内にあるnode_moduleが紛れ込んでしまう**ことに注意が必要です。

```
project
├─ package.json
├─ node_modules
│ ├─ linked_project (symlink)
│ │ ├─ node_modules
```

のような感じです。通常の方法でインストールした場合はnpm自体の依存関係解決機能により１つのパッケージのみしかインストールされないため大丈夫なのですが。

この構成がTypeScriptの型定義ファイルに悪影響を及ぼす場合があります。具体的にはインストール先とインストール元で異なるバージョンのパッケージを使っていた場合です。この時、異なる内容の`declare module`宣言が重複するため、TypeScriptはどちらを使ってよいか判断できず困るという具合です。

解決方法としては簡単で、双方の依存先のパッケージのバージョンをそろえるだけです。`package-lock.json`や`yarn.lock`の内容を確認しましょう。yarnでの手法については[こちら](https://qiita.com/uasi/items/ca440a750a77ca62321b)が参考になります。

なお、[関連する話題のissue](https://github.com/Microsoft/typescript/issues/6496)がありますので併せて確認すると良いと思います。

[^1]: [npmの場合](https://docs.npmjs.com/files/package.json#local-paths)は`file:path/to/directory`ですが、[yarnの場合](https://classic.yarnpkg.com/ja/docs/cli/add/)は`file:path/to/directory`です。
Python3でよく調べちゃう記法のTips

#はじめに
こちらのページで作ったTipsのPython版を作ってみました。
https://qiita.com/osashimi_lover/items/529e97ca1c13259a921b

Pythonの場合はライブラリをどんどん活用したほうがええやろ感がありますが、
とりあえず基本的なところを本ページでは記録していこうと思います。:raising_hand:
ご指摘などがあれば、ぜひよろしくお願いします。
※Versionは 3.6.8 を使用しています。

#文字列操作
```py
# 入力文字列を受けて分割する
str_arr = input().split(' ')

# 文字列比較
if str == "string1":
    ~
elif str == "string2":
    ~

# 先頭・末尾の空白を削除
str.strip()

# 数値→文字列
str(x)
```

#数値操作
```py
# 文字列→数値変換
int(str)

# 絶対値を求める
abs(num)

# 四捨五入
from decimal import Decimal, ROUND_HALF_UP
# 対象の値でDecimalオブジェクトを作って、
# quantizeメソッドに第一引数として四捨五入する桁数を、第二引数に四捨五入を示す定数を渡す
x = int(Decimal(str(float_x)).quantize(Decimal('0'), rounding=ROUND_HALF_UP))
```

#ループ操作
```python

# 指定した範囲のループ
for i in range(num):
    ~

# 配列要素でのループ
# 文字列を文字に分解してループ
for num in arr:
    ~
```

#配列操作
```python

# 初期化
# 一次元配列
arr1 = []

# 二次元配列 y行x列の二次元配列を0で初期化
arr2 = [[0] * x for i in range(y)]
# (参考)numpy使用バージョン
import numpy as np
arr2 = np.zeros((y, x))

# データの追加
arr.append(x)
# データの挿入 iに-1を指定すると、最後の要素の一つ前に挿入
arr.insert(i, x)

# 条件にあった要素に配列を更新
arr = [i for i in arr if (条件)]

# 配列要素のカウント
len(arr)

# ソート
# オプションでreverse=Trueを追加すると降順
arr = sorted(arr) 
arr = sorted(arr, reverse=True)
```

#参考文献
[Python3リファレンス](https://docs.python.org/ja/3.6/reference/index.html)
[numpyリファレンス](https://numpy.org/doc/stable/reference/)
サーバー構築経験がほぼゼロな自分でも Micorosoft Azureにハニーポットを建てられた話 ～その1 イントロ編～

# はじめに

かねてよりハニーポットには興味があったのですが、サーバー構築経験が無い私にとってはハードルが高く、メンテナンスができるかなどに不安がありました。しかし、実際やってみたところ意外とあっさりと構築できてしまい、それなりに運用できるようになりました。このブログでは、ハニーポットには興味があるけど構築の面で不安がある方向けに、できるだけ丁寧に解説していきたいと思います。

# ハニーポットって？


Wikipediaによるとこのように書いてあります。

> ハニーポット (英語: Honeypot) は、コンピュータセキュリティ用語としては、不正アクセスを受けることに価値を持つシステムのことを指す。


簡単に言うとわざとサイバー攻撃を受けるシステムで、どのような攻撃をしてくるのか、攻撃の手順はどのようなものなのか、世の中的にどのような攻撃が流行っているのかなどを観測するというシステムです。観測して得られた結果から、自分の本当に守りたい環境に対して対策を施すという使い方をします(私の場合は、本当に守りたい環境というのはないので完全に趣味です。攻撃を受けてニヤニヤするだけです)。

ハニーポットのソフトには、観測したい内容に応じて色々な種類がありますが、ここではT-Potというハニーポットを使います。

# T-Potって？

ドイツの電気通信事業者であるドイツテレコム社が作ったハニーポットです。異なる特徴を持つハニーポットがパックになっており、インストールするだけで利用可能です。また、Elastic Search、Kibana なども含まれており、簡単に解析・可視化ができます。ハニーポットや Kibana など分析環境などが Docker コンテナ上で動いているのが一つの特徴です。

[T-Pot 公式サイト](http://dtag-dev-sec.github.io/mediator/feature/2017/11/07/t-pot-17.10.html)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155700/8a644f34-1ba5-8366-a1f2-980e4ad9788a.png)


# Azureって？

Microsoft が作ったクラウドサービスです。クラウドサービスとしては AWS よりも後発ですが、Office365 や Active Directoryなど、Microsoft の機能やサービスをクラウド環境で包括的に利用できるため利用者数が増えてきています。個人でもビジネスでも使えます。

[Microsoft Azure - Wikipedia](https://ja.wikipedia.org/wiki/Microsoft_Azure)


# お値段は？

クラウドサービスを利用するにあたって気になるのはお値段です。Azure は従量課金制なので、高いスペックの環境を長い時間使っていると高額になってしまうので、T-Pot が動くギリギリのスペックで動かしたいところです。T-Pot の推奨スペックを見てみましょう。

> 4 GB のメモリ (6-8 GB 推奨)
> 64 GB の SSD (128 GB SSD 推奨)
> DHCP環境
> Proxyを経由しないインターネット接続環境


自前のPCやオンプレ環境であれば簡単にクリアできる程度のスペックです。では次に、Azure の価格表を見てみましょう。(2019/10/25現在)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155700/327e2c67-c526-82a7-541b-51ff2e696f46.png)

T-Pot の要件と照らし合わせると、B2S が最低と言ったところでしょうか。月額にすると約5000円程度(6.9888 × 24 × 30 )ですね。これを高いと見るか安いと見るかの判断は人によって異なると思いますが、ハニーポット初心者の私は、簡単にサーバーを作ったり環境を作り直したりできるのは非常にありがたかったです。(かれこれ10回くらいは作り直しました。Linuxのインストールなど10回もやってられないですね)。

B1MS や B1S など低いスペックの環境でも試しましたが、コンソールが全く反応しなかったり、インストールにものすごく時間がかかったりなど、実用に耐えませんでした。

という訳でスペックは B2S の前提で話を勧めます。次回は、インスタンスの作り方、T-Potのインストール方法について書いていこうと思います。

次回記事はこちら。
SpaceVim で .bashrc に定義した alias を使用する方法

## やりたかったこと

- SpaceVim の `:!` から .bashrc に定義した alias や function を使いたかった

## 設定方法

* `$HOME/.SpaceVim/init.vim` か `$HOME/.SpaceVim/vimrc` に  `$BASH_ENV` を定義し、読み込ませる

`$HOME/.SpaceVim/init.vim || $HOME/.SpaceVim/vimrc`

```vim
let $BASH_ENV = '~/.bashrc_vim'
```

`$HOME/.bashrc_vim`

```bash
shopt -s expand_aliases # alias を展開するため、この行が必要
alias g='git'
```

以上の設定で .bashrc_vim に定義した alias が使えるようになるはず。
AtCoder Beginners SelectionでRuby学習【Some Sums】使えるメソッドを増やす

## はじめに
Ruby学習の一環として「競技プログラミング（競プロ）」に挑戦します。
そのための学習の中で学んだことをアウトプットしていきます。
今回は「AtCoder Beginners Selection」の六問目（Some Sums）より。
https://atcoder.jp/contests/abs

## 問題
1以上N以下の整数のうち、
10進法でA以上B以下であるものの総和を求めなさい。

制約
1 ≤ N ≤ 10,000
1 ≤ A ≤ B ≤ 36
入力は全て整数である

入力は以下の形で与えられる。

```ruby
N A B

# 例
20 2 5
```


```ruby
出力例
# 上記例の場合
=> 84
```
20以下の整数のうち、各桁の和が2以上5以下なのは
2,3,4,5,11,12,13,14,20です。これらの合計である84を出力します。


## 解答①
まずは僕の解答から。

```ruby
n, a, b = gets.split(" ").map(&:to_i)
r = 0
(1..n).each do |i|
  r += i if i.to_s.split("").map(&:to_i).inject(:+).between?(a, b)
end
print r
```
この解答をする中で学んだメソッドを以下にまとめていきます。

### splitメソッド
入力を受け取る時によく使ってましたが、
今回のeach文の中での使用で、改めてStringクラスのメソッドだと認識出来ました。
解答では一度String型に変換した上でsplitメソッドを使い、またInteger型に戻すということをしています。

```ruby
#例
print "1234".split("")
=> ["1", "2", "3", "4"]
```


### between?メソッド

```ruby
self.between?(min, max)
#selfがminからmaxの間（min,max含む）であった場合、trueを返す

#例
print 6.between?(1, 5) 
=> false
```
最小値と最大値を指定し、selfがその範囲内だった場合はtrueを返すこのメソッドを使って、
各桁の和がa以上b以下の範囲内かを判定しています。

## 解答②
他の方の解答を見てみます。

```ruby
n, a, b = gets.split.map(&:to_i)
puts (1..n).select{|e|(a..b).include?(e.to_s.chars.map(&:to_i).inject(&:+))}.inject(&:+)
```
入力を受け取るところまでは、解答①とほぼ同じですね。その後の流れを見てみると、
① 整数の各桁の和がa以上b以下であるかとinclude?メソッドで判定する
② ①を通過した整数は、selectメソッドで新しい配列を生成し、その中に追加する
③ 条件に合う整数が出そろったところで、最後尾のinjectメソッドで整数の総和を求め、出力する

ここで使われているメソッドについて簡単にまとめます。

### include?メソッド（Rangeクラス）
オブジェクトが範囲内に含まれている時、trueを返します。

```ruby
#例
print (1..5).include?(4)
=> true
```

### selectメソッド
条件に一致した要素を取得して、新しい配列として返します。

```ruby
#例
print [1,2,3,4,5].select { |num| num > 3 }
=> [4, 5]
```


## 最後に
以上、AtCoder Beginners Selection【Some Sums】を解く中で学んだメソッドをご紹介しました。

もし間違いなどございましたら、ご指摘いただけると嬉しいです。
windows10にJupyterLabをインストールしたらはまった話

# Windows10にJupyterLabをインストールする
　元々は、自社の勉強会でGithubの使い方を自習するはずだったのに、途中で大幅脱線してしまったので記録を残します。
　尚、本文中にできてくる項目の詳細はお手数ですが各自でご確認ください。
#####　経緯
1. Githubのアカウントを取ろう。
2. Githubのプロジェクトを作ろう。
3. Githubにファイルを送ろう。←ここが脱線点

ローカルPCにPython環境とGit環境が全く入っていなかったので思いつきで構築しようと思った。それもGitアプリをインストールするのではなく、最近イベントで小耳にはさんだ「Jupyter Lab がさらに使いやすくなったよ」との情報からさらに、
　　　Jupyter LabからGithubの連携もできるみたい → 入れてみよう！
と脱線の被害が拡大したことになった。 
　Githubはブラウザ上からでもファイルを保存したり更新できたりするのですが、今回は手を付けずに終わっています。

### 実施した脱線の手順
　以下に脱線した時の手順を記載します。※真似しないでください。
1. Pythonのインストール
　　= windows Store から Python3.8 をインストール
2. Pythonでpipの更新
　　= python -m pip install --upgrade pip
3. jupyterlabのインストール
　　= pip install jupyterlab
4．jupyterlabの実行
　　= jupyter lab
5．ブラウザで確認
　　= ファイルが無いエラー
　　= コンソールに表示しているアドレスを使うと表示できる。
■問題点
上記4で実行した際、自動でブラウザが開きファイルを開こうとするがファイルが無い。
開こうとするファイルは以下のファイル。

    file:///C:/Users/<Me>/AppData/Roaming/jupyter/runtime/nbserver-1100-open.html

ところが ”jupyter” のフォルダが存在していないのでファイルもなかった。
実際は以下のフォルダに存在した。

    C:\Users\<Me>\AppData\Local\Microsoft\WindowsApps\PythonSoftwareFoundation.Python.3.8_qbz5n2kfra8p0\jupyter/runtime/nbserver-1100-open.html

■調査
　インターネットで情報を検索すると次の情報にたどり着く。
[20200110: Microsoft Store 版 Python と vscode で jupyter notebook編集する](https://seesaawiki.jp/w/kou1okada/d/20200110%3A%20Microsoft%20Store%20%C8%C7%20Python%20%A4%C8%20vscode%20%A4%C7%20jupyter%20notebook)
[jupyter notebookで、なぜかimportが通らない問題](https://qiita.com/verdy89/items/14b232d1bdb474bd6fc9)
 要するに、windows store から入れたPythonでは、環境変数の設定値が違うと判明。

■結果
　Python公式サイトからWindows用をインストールしましょう。

#### 脱線の修復
1. Windows store の pythonを削除
2. Python公式サイトのイメージをダウンロード<BR>
　　今回は、python-3.8.3-amd64-webinstall.exe を使った。
3. 次のサイトを参考に JupyterLabをインストール。<BR>
　　[Jupyter Lab 2.0の導入（2020年3月）](https://dev.infohub.cc/setup-jupyterlab-v200/)<br>
   jupyter Labが期待通りに動作することを確認した。
4. jupyterLabにGithub拡張を設定する。<BR>
　　node.jsが必要なので公式サイトからインストールする。<BR>
　　次のコマンドを実行する。<BR>
    
     jupyter labextension install @jupyterlab/git
     pip install jupyterlab-git
     jupyter serverextension enable --py jupyterlab_git
    
5. ファイルをGithubにpushする。

　　ここで、結局Githubにpushできませんでした。
　　恥ずかしながら、jupyterLabの使い方が良くわかっていません。
　　

ということで、本来のGithubの学習にもどります。

### 結論
 Python は公式からインストールした方が良いかも。


以上でした。
ControllerからViewへの変数受け渡し

# 概要
Laravelの諸機能について忘れないようにアウトプットする自分用メモ。

## ControllerからViewへの変数受け渡し
参考：https://qiita.com/ryo2132/items/63ced19601b3fa30e6de
参考：https://qiita.com/_Mizuki/items/df3a62fbe18bbbbc9ced
参考：http://blog.tojiru.net/article/230164798.html

Controllerからviewに値を渡す場合、ベターな方法が複数あるらしいので調べた。

## phpのcompact関数
viewに値を渡す際、compact関数を使用する方法がわりとベターらしい。
compact関数の理解が怪しかったので確認した。
公式の解説では**変数名とその値から配列を作成する。**とのこと。

公式の例

```php
<?php
$city  = "San Francisco";
$state = "CA";
$event = "SIGGRAPH";

$location_vars = array("city", "state");

$result = compact("event", $location_vars);
print_r($result);
?>

// result 
Array
(
    [event] => SIGGRAPH
    [city] => San Francisco
    [state] => CA
)
```

良くわからん...。
自分なりに分かりやすかった例。

```php
$arr = array(
  'apple' => $apple,
  'orange' => $orange,
  'lemon' => $lemon,
);
// ↑
// 同じ意味
// ↓
$arr = compact('apple', 'orange', 'lemon');
```

連想配列のkeyと変数名を勝手に紐付けてくれるらしい。

## Controllerからviewへの変数の受け渡し
viewに値を渡すときにcompact関数を使用する場合は以下のようにするといい。

```php
public function fruit()
{

  $apple  = 'apple';
  $orange = 'orange';
  $lemon  = 'lemon';

  return view('fruit', compact('apple', 'orange', 'lemon'));
}
```

Laravel独自のコレクションなのかと思ってたけど、そういうワケじゃないんですね...。
そもそもviewヘルパ関数がどんなだったっけと思って見直した。

* https://readouble.com/laravel/7.x/ja/views.html

第二引数に連想配列渡すだけなんだ。それを作りやすいからcompact使っているだけ。
つまりこの書き方でも一緒です。

```php
public function fruit()
{
    $apple  = 'apple';
    $orange = 'orange';
    $lemon  = 'lemon';
    $fruit = ['apple'=>$apple, 'orange'=>$orange, 'lemon'=>$lemon];

    return view('fruit', $fruit);
}
```


### withメソッド
Controllerからviewへの受け渡しにwithメソッドを使用する場合。

```php
public function fruit()
{
    $apple  = 'apple';
    $orange = 'orange';
    $lemon  = 'lemon';

    return view('fruit')->with('apple', $apple)->with('orange', $orange)->with('lemon', $lemon);
}
```
もしくはこう

```php
public function fruit()
{
    $apple  = 'apple';
    $orange = 'orange';
    $lemon  = 'lemon';

    return view('fruit')->with([
        "apple"  => $apple,
        "orange" => $orange,
        'lemon'  => $lemon,
     ]);
}
```
ちょっと可読性悪いですね。
### 個人的ベスト
* 配列を渡す

状況にもよりますが、配列作って渡してあげる方法が一番好きです。
viewヘルパ関数の第二引数が大きくなるのはあまり好きではない。

```php
// 画面にフルーツを渡す
public function fruit()
{
    $fruit = $this->returnfruit();

    return view('fruit', $fruit);
}

// フルーツの配列を返す
private function returnfruit()
{
    $apple  = 'apple';
    $orange = 'orange';
    $lemon  = 'lemon';

    return compact('apple', 'orange', 'lemon');
}
```
Dr.Sum 新機能「DS Script」をはじめて使ってみた

#1. はじめに

2020/06/01 にリリースされた Dr.Sum Ver. 5.5 で、新機能「DS Script」が追加されました！

データを Dr.Sum データベースに投入する際、BAT ファイルや SQL 文が複雑になってしまいがち でしたが、「DS Script」を使えば、1 つのスクリプトとし、簡単に構築・運用することができるようになります。

さっそく、新機能「DS Script」を使ってみました。

#2. Dr.Sum とは

[Dr.Sum](https://www.wingarc.com/product/dr_sum/index.html) とは、ウイングアーク１ｓｔ株式会社が提供する、企業内の基幹データベースの情報を高速に集計できる BI ツールです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630903/ab600167-5d07-826e-4ea5-ab2ba8004ac7.png)

※キャプチャはウイングアーク1st社のホームページより抜粋
https://www.wingarc.com/product/dr_sum/

Dr.Sum では次のようなことができます。

- 企業内のデータを高速に集計できます
    - 企業内の大容量のデータをインポートして、高速に集計できます。インメモリにも対応しているので、さらに高速な集計も可能です。
- 操作性の高いユーザーインターフェイスが課題発見をサポートします
    - Microsoft Excel や Web ブラウザーを利用して、手軽なレポート出力、課題発見に向けた情報分析ができます。

#3. Dr.Sum「DS Script」とは

DS Script とは、Dr.Sum のデータ準備作業で実施するバッチ処理やデータ加工処理（前処理）を支援するためのスクリプト言語です。
また、それを扱う統合開発環境 Script Editor を提供されています。

#4. Dr.Sum DS Script で、Dr.Sum 内にテーブルを作成する

##(1) Script Editor を起動する

Dr.Sum の管理ツール Enterprise Manager から Script Editor を起動します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630903/7edf569d-cb53-1c64-89c5-0bf0060dade9.png)

##(2) ブロックモードでスクリプトを作成する

コマンドブロックから、必要な処理をドラッグ＆ドロップ操作で配置します。
今回は、Dr.Sum のデータベースに接続する「CONNECT」コマンドと、SQL 文を実行する「SQL」コマンドを配置します。

![DSScript_01.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630903/6030ce06-0581-1dbb-f661-8ee67bccfaf2.gif)

##(3) テキストモードでスクリプトを編集する

ブロックモードとテキストモードを切り替えることができます。
今回は、スクリプトの先頭に「はじめての DS Script」というコメントを入れています。

![DSScript_02.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630903/191c6b26-53e6-51ce-202b-e24eadc98989.gif)

##(4) スクリプトを実行する

作成したスクリプトを実行した結果、table1 というテーブルが作成されたことが確認できます。

![DSScript_03.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630903/8643f9e2-ae63-3c89-9a99-8d06fa9400ab.gif)

#まとめ

DS Script を使って、とても簡単に Dr.Sum にテーブルを作成するスクリプトを作成することができました。
DS Script を利用すると、Dr.Sum にデータを投入する処理を、かなり効率化することができそうですね！

#参考

本記事で作成したスクリプトの内容を記載しておきます。

```DS_Script_Sample01.dhn
//はじめての DS Script
CONNECT("ds_script_db") {
}

SQL($_SQL_AUTO_COMMIT_ON) {
    CREATE TABLE table1( col1 INT, col2 VARCHAR(20) );
}
```
unzip 文字化け

# 現象
unzipしようとすると文字化けで困ります。

```
$ unzip hoge.zip 
 Archive: hoge.zip
 [hoge.zip] �yENG0000504547�z�X�L���V�[�g.xls 
 password:  
   inflating: �yENG0000504547�z�X�L���V�[�g.xls  
```

# 解決
```
$ unzip --help
 ...
  -O CHARSET  specify a character encoding for DOS, Windows and OS/2 archives
  -I CHARSET  specify a character encoding for UNIX and other archives
```

文字コードを指定すれば解決です。

```
$ unzip -I sjis hoge.zip 
 Archive:  hoge.zip
 [hoge.zip] 【ENG0000504547】スキルシート.xls password: 
   inflating: 【ENG0000504547】スキルシート.xls  
```

# おまけ
unzipしたファイルが開けないので壊れてるのかと思うことがありますが、権限が無いだけだったりするのでご確認ください。

```
$ ls -l
 -rw-rw-r-- 1 user user     9912 May 17 18:00  hoge.zip
 ---------- 1 user user    28672 May 15 17:53  【ENG0000504547】スキルシート.xls
```
Node-RED * Slackのチャットボットでポスト機能を実装する

#ポスト機能を実装する。

##slackのポストとは？
![スクリーンショット 2020-05-17 18.21.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142235/3eb67c91-8edb-2d8c-c6b4-2130231d5ea0.png)


##実装環境
* IBM Cloud上のNode-REDを使用する。
* Node-REDの以下のライブラリを使用する。
https://flows.nodered.org/node/node-red-contrib-slack
* すでにNode-REDを使用したチャットボットがslack上で使用できる環境が前提。
* Slack APIは使用せず、これまでのSlack Botを使用している。

##手順
1. slack-web-outノードの前に以下の内容が記載されているfunctionノードを定義する。

```

const contentmd=msg.payload <- msg.payloadを他の一時的な変数に保管しておく。

msg.topic="files.upload";
msg.payload={
"channels":msg.user,
"content":contentmd, <- 一時的に避難した内容を代入する
"initial_commnet":xxxx, <- ポスト文の前に記載する、ポストとともにチャットボットで
"title":xxxx, <- ポストに記載するタイトルを設定する
"filetype":post <- ここにポストと指定する
}
return msg;

```

![node.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142235/5bcf3d62-f52e-8851-7396-18205144cd99.png)


##この内容について
この内容は、会社の先輩の[@shuari4](https://twitter.com/shuari4)さんに教えていただいた内容です。
いつもありがとうございます。
Flutterでワイヤレスデバッグ

# 環境
- Mac OS 10.15
- Android Studio 3.6.1
- Pixel 3a Android 10
 
# 手順
1. MacとAndroidが同じWi-Fiに接続されていることを確認。  
 
2. ~/Library/Android/sdk/の中にplatform-toolsがあることを確認。
なければ https://developer.android.com/studio/releases/platform-tools.html からダウンロード。  

3. platform-toolsにパスを通す。
`$ echo ‘export PATH=$PATH:~/Library/Android/sdk/platform-tools/’ >> ~/.zshrc`

4. シェルを更新。
`$ source ~/.zshrc`

5. adbコマンドが使えることを確認。
`$ adb`

6. 接続済みデバイス一覧を表示。
`$ adb devices`
何も接続していなければ、List of devices attachedとだけ表示されるはず。

7. AndroidをMacにUSB接続して、接続済みデバイス一覧を表示。
`$ adb devices`
接続がうまく行っていれば、List of devices attachedのあとに文字列が表示されるはず。

8. ポートを作成。
`$ adb tcpip 5555`

9. Android上で、設定 > デバイス情報 と行くと、端末のIPアドレスが分かるので、メモする。
( xxx.xx.xx.xx のようなやつ。xは何らかの数字。)

10. ポートに接続。
`$ adb connect <さっきメモしたIPアドレス>:5555`

11. AndroidとMacのUSB接続を切っても接続状態が続いてるか確認。
`$ adb devices`

12. 接続状態になっていれば、Android Studioのデバッグ端末の選択肢にAndroid端末が表示されるはずです。一応、デバッグが終わったら接続を切っておきましょう。
`$ adb kill-server` 

# 終わりに
Flutterで開発中にワイヤレスデバッグをしたいと思って行き着いた手順でしたが、普通のAndroidアプリ開発の手順でFlutterでもワイヤレスデバッグできる、って感じらしいですね。
# 参考
https://techieblossom.com/wireless-debugging-for-mac/
https://medium.com/@yash_dev/flutter-wireless-debugging-over-wi-fi-eee23c92e438
HTMLエスケープ文字列のデコード用関数にしっくりくるものが無かったので、自分で作ってみた

# HTMLデコード
```javascript
function decodeHTML(str) {
  return str.replace(/&(?:([a-z]+?)|#(\d+?));/g, function(m, c, d) {
    return c ? ({
      "amp": "&",
      "lt": "<",
      "gt": ">",
      "quot": '"',
      "nbsp": " "
    }[c] || m) : d ? String.fromCharCode(d) : m;
  });
}

decodeHTML("&lt;a onclick=&quot;hoge(&#039;fuga&#039;)&quot;&gt;")
// <a onclick="hoge('fuga')">
```
【Django】Modelに定義したForeignKeyで発生する循環Importを解決する

# 概要
ハマったのでメモ。

## 構成
### books/models.py
下記のように、ForeignKeyの引数にクラスを指定している場合です。

```
from accounts.models import User

class Book(models.Model):
    ....
    user = models.ForeignKey(User, on_delete=models.PROTECT)
    ....
```

### accounts/models.py
```
from books.models import Book

class User(AbstractUser):
    ....
    favorite_book = models.ForeignKey(Book, on_delete=models.PROTECT)
    ....
```

<code><span style="color: #d32f2f">books/models.py</span></code>で<code><span style="color: #d32f2f">accounts/models.py</span></code>の中身をimportしており、<code><span style="color: #d32f2f">accounts/models.py</span></code>でも<code><span style="color: #d32f2f">books/models.py</span></code>でimportしています。  

## エラー
循環importです。
importした先でimportが起き、またそこで逆のimportが起きてという感じです。
下記ようなエラーが発生します。

```
ImportError: cannot import name 'Book' from 'accounts.models' (/myproject/accounts/models.py)
```

## 解決方法
DjangoのForeignKeyで指定するモデルは、クラスを文字列指定で書くことができます。
そのため、下記のように指定すればimport宣言が必要とならず、循環Importが解決できます。  
### books/models.py
```
class Book(models.Model):
    ....
    user = models.ForeignKey('accounts.User', on_delete=models.PROTECT)
    ....
```

### accounts/models.py
```
from books.models import Book

class User(AbstractUser):
    ....
    favorite_book = models.ForeignKey('books.Book', on_delete=models.PROTECT)
    ....
```

根本的な解決としてはクラス設計を再考する必要がありそうです...

## 最後に
DjangoのModelに定義したForeignKeyが原因となって発生する、循環Importを解決する方法をまとめました。  
エラーで悩んでいる方は是非ご参考にしてください。
selectタグには疑似要素が指定できない。

## 結論
selectタグには疑似要素が指定できないのでdivタグでラップしました。

## 背景
selectタグを使用したときにデフォルトで表示される上下矢印ボタンをモダンな感じにしたかったのですが
<img width="679" alt="Screen Shot 2020-05-17 at 10.25.13.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/560945/8d9b7dcb-a3cf-b7a7-7e3f-6379d584114b.png">
デフォルトのボタンを消して、:before疑似要素で何とかしようとしていて詰まってしまいました。

## 解決方法
　こちらのサイト「[フォームのセレクトボックスとチェックボックス・ラジオボタンをCSSで装飾する](https://www.willstyle.co.jp/blog/303/)」にたどり着き、selectタグには疑似要素が指定できないことがわかりました。
　上記サイトでは、divタグで囲んでdivタブの疑似要素で表示させれば良いこともわかりましたので、次のサンプルコードを書きました。

```scss:sample.scss
    &__selectWrapper {
      position: relative;

      .select-form {
        -webkit-appearance: none;
        background-color: #fff;
        width: 100%;
        height: 46px;
        padding: 0 30px 0 15px;
        border-color: rgb(187, 187, 187);
      }
      &::before {
        content: '';
        position: absolute;
        right: 15px;
        top: 8px;
        width: 30px;
        height: 30px;
        background-color: red;
    }
```

　これでセレクトボックスの右側に赤い四角を表示させることができるようになりました。
<img width="681" alt="Screen Shot 2020-05-17 at 10.53.27.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/560945/45e3616b-d786-3f8f-7574-754298ebd126.png">
　あとは良しなにfontawesomeなり画像ファイルなりに変更しましょう。
C++でAtCoderをする最低限環境構築の仕方

#前振り
AtCoderを始めて、ずっとコードテストを使っていたのですが、[AtCoder Beginner Contest 165の解説動画](https://www.youtube.com/watch?v=C5_NnCp1CRI&feature=youtu.be5)を見て、「え、C++ってWindowsじゃなくても実行できるの？！」と驚き、最低限の環境を作ってみました。

##前提
- [AtCoderのC++入門](https://atcoder.jp/contests/APG4b)で

```
#include <bits/stdc++.h>
```

を使うのでgcc系のコンパイラを入れます。

-  PCはMacです。
- テキストエディタとしてATOMを使用します。
- 最低限の環境なので使いやすさなどは考慮しておらず、macでAtCoderのC++コードを実現することを目標としています。


#gccを入れる
Macのターミナルを開いて、homebrew(パッケージ管理システム)でコンパイラであるgccをインストールします。

```:terminal
$ brew install gcc
```


##pathを変更する
gccを入れた状態では、

- /usr/bin/g++ (clang)
- /usr/local/bin/g++-9 (gcc)

の二つのコンパイラが存在していて、この状態でg++コマンドを打ってもclangが呼び出される。
/usr/local/bin/にg++(gcc)のシンボリックリンクを作成し、g++コマンでgccを実行するようにする。

```:terminal
$ ln -s /usr/local/bin/g++-9 /usr/local/bin/g++
```


#stdc++.hを使えるようにする
gccをインストールすると、/usr/local/下の奥にstdc++.hがあり、コンパイラが認識出来る場所に配置する必要がある。
そこで、/usr/local/下にフォルダを作成し、stdc++.hファイルをコピーして配置する。

```:terminal
$ cd /usr/local/
$ mkdir /usr/local/include/bits
$ cp ./Cellar/gcc/9.2.0/include/c++/9.2.0/x86_64-apple-darwin18/bits/stdc++.h /usr/local/include/bits/
```


#実行手順
##1. ファイル作成
ファイル保存場所に移動し、空ファイルを作成する。

```terminal
$ cd Desktop/
$ atom hello.cpp
```

##2. プログラム記述
今回は簡単に以下のプログラムを記述しました。

```cpp:hello.cpp
#include <bits/stdc++.h>
using namespace std;

int main(void)
{
     cout << "hello world" << endl;
    return 0;
}
```

##3. コンパイル・実行
ファイル名を指定しなければ a.out というファイルがコンパイルによって作成される。
a.out を実行する。

```:terminal
$ g++ hello.cpp
$ ./a.out
hell world
```

ファイル名を指定したい場合は以下のようにコンパイルすればよい。

```:terminal
$ g++ hello.cpp -o world.out
```


#参考
[C/C++ 開発環境のインストール](http://www.isc.meiji.ac.jp/~be00085/ctips/install_xcode/)
[Visual studio codeで競プロ環境構築[Mac OS]](https://qiita.com/EngTks/items/ffa2a7b4d264e7a052c6)
Dockerでdocker-compose upができないエラーについて

# 環境
Docker 19.03.8
MacOS 10.15.4

# なぜかdocker-compose upでエラーになってしまう場合
下記のような絵ラーが出てしまった場合

```
$ docker-compose up

#(省略)

ERROR: for recipegram_web_1  Cannot start service web: driver failed programming external connectivity on endpoint recipegram_web_1 (2114b3f64e45c6f24835b0b49c1aac852d41b5f6c952181dc7b660f9105b79c6): Bind for 0.0.0.0:3000 failed: port is already allocated

ERROR: for web  Cannot start service web: driver failed programming external connectivity on endpoint recipegram_web_1 (2114b3f64e45c6f24835b0b49c1aac852d41b5f6c952181dc7b660f9105b79c6): Bind for 0.0.0.0:3000 failed: port is already allocated
ERROR: Encountered errors while bringing up the project.
```
いつもはできてるバズなのにおかしなぁ...と思ってよく読んでみると「接続に失敗し、立ち上げ中にエラーが発生しました」という内容が出てきました...
おかしいなぁ...と思い。考えてみると他のアプリをDockerで立ち上げていたことに気がつきます！

なので起動中のアプリのディレクトリに移動して```$ docker-compose stop```をして完了です。単純なエラーでした^_^;
form_withメソッドについて

Railsでモデルと関連付けたフォームを作成する場合、form_withメソッドを使用すると便利です。

```ruby:_form.html.erb
<%= form_with(model: モデルのインスタンス) do |form| %>
//省略
<% end %>
```

form_withとは、ビューヘルパーの一種です。
ビューヘルパーはRailsに用意された、HTMLを生成するためのメソッドです。
以下のようなHTMLは、

![497CE109-C38B-4111-8DCE-68366FDAA1B1_4_5005_c.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613801/c72ad008-2799-9a07-594a-f73f5a4a0241.jpeg)

```ruby

<form action="/tasks" accept-charset="UTF-8" data-remote="true" method="post"><input name="utf8" type="hidden" value="✓"><input type="hidden" name="authenticity_token" value="qbu8RFLhyCuAElg1qr7MLYDEdiEINJdEe1JLQFLr7kyWPFiHCEZKszOrvwON33s9CqGz7njGpBasOzrpYkb8/w==">
  <div class="task_name">
    <label for="task_name">タスク名</label>
    <input type="text" name="task[task_name]">
  </div>
  <div class="task_content">
    <label for="task_content">内容</label>
    <input type="text" name="task[content]">
  </div>
//省略
  <input type="submit" name="commit" value="Create Blog" data-disable-with="Create Task">
</form>
```

ビューヘルパーを使用することで、以下のように記述できます。

```ruby:_form.html.erb
<%= form_with(model: @task, local: true) do |form| %>
  <div class="task_name">
    <%= form.label :タスク名 %>
    <%= form.text_field :task_name %>
  </div>
  <div class="task_content">
    <%= form.label :内容 %>
    <%= form.text_field :content %>
  </div>
  <%= form.submit %>
<% end %>
```

form_withメソッドにはmodelオプションの引数として、モデルクラスのインスタンスを渡す必要があります。
form_withは、モデルのインスタンスを元に、「formを送信すると、どのようなリクエストを送るか」を決定します。

今回の例でいうと、
`<%= form_with(model: Task.new) %>`という記述により、
form_withはHTTPメソッドがPOSTで/tasksというURLを流すためのhtmlのフォームを自動で生成します。
このTask.newは、コントローラー内で`@task = Task.new`などといったような形でインスタンス変数に入れられるので、form_withでは`<%= form_with(model: @task) %>`という使用方法が一般的です。
また、form_withメソッドは、デフォルトではhtmlではなくJavaScriptのリソースを取得しようとしてしまうので、
local: trueとすることで、HTML用のリクエストを発行するようにします。
formタグとして出力させるので、form_withメソッドは`<%= %>`で囲う必要があります。

**フォームパーツ**
`form.label`は、HTMLのlabelタグを作成するメソッドです。
`form.text_field`は、
属性(type)をtextに指定した、HTMLのinputタグ(自由入力欄)を作成するメソッドです。
`form.submit`は、
属性(type)をsubmitに指定した、HTMLのinputタグ(送信ボタン)を作成するメソッドです。
それぞれdivタグで囲んでいるのは、改行するためです。divタグ、brタグで囲わないと横一列になります。
P5.js 日本語リファレンス(noiseSeed)

このページでは[「P5.js 日本語リファレンス」] (https://qiita.com/bit0101/items/91818244dc26c767a0fe) の noiseSeed関数を説明します。

## noiseSeed() 

### 説明文

noise() のシード値を設定します。デフォルトでは、プログラムが実行されるたびに noise() は異なる結果を生成します。実行するたびに同じ結果を生成するには seed に定数を設定します。

### 構文

noiseSeed(seed)

### パラメタ

- seed  
Number：シード値

### 例

```javascript
// 実行する度に同じ動きになります。
let xoff = 0.0;

function setup() {
  createCanvas(200, 200);
  noiseSeed(15);
}

function draw() {
  background(204);
  xoff = xoff + 0.01;
  let n = noise(xoff) * width;
  line(n, 0, n, height);
}

```

### 実行結果
https://editor.p5js.org/bit0101/sketches/wPkhWNGut



### 著作権

p5.js was created by Lauren McCarthy and is developed by a community of collaborators, with support from the Processing Foundation and NYU ITP. Identity and graphic design by Jerel Johnson.

### ライセンス

Creative Commons(CC BY-NC-SA 4.0) に従います。