OmniAICreator/Qiita-1.07M huggingface dataset:
Railsのテスト用設定（Rails Tutorial 3.6）

# Railsチュートリアルのテスト用設定

Railsチュートリアルを進めていて、メモしておきたいテスト用設定があったので、[Railsチュートリアル 3.6](https://railstutorial.jp/chapters/static_pages?version=5.1#sec-advanced_testing_setup)から引用。

なお、いずれもmasterブランチで行う必要あり。

## minitest reporters

Railsのデフォルトのテストで red や green を表示するために以下を**追加**

```test/test_helper.rb
~
require "minitest/reporters"
Minitest::Reporters.use!
~
```

## Guard

ファイルなどを変更すると自動的にテストを実行してくれるツール

### gemの取り込み
チュートリアル内でGemfileは追加済みのため割愛

### 初期化
`$ bundle exec guard init`

### tmuxのインストール（Cloud9利用時のみ）
Guardの通知を有効にするために必要
`$ sudo yum install -y tmux`

### 生成されたGuardfileの編集

Guardfileを以下の内容で上書き

```
# Guardのマッチング規則を定義
guard :minitest, spring: "bin/rails test", all_on_start: false do
  watch(%r{^test/(.*)/?(.*)_test\.rb$})
  watch('test/test_helper.rb') { 'test' }
  watch('config/routes.rb')    { integration_tests }
  watch(%r{^app/models/(.*?)\.rb$}) do |matches|
    "test/models/#{matches[1]}_test.rb"
  end
  watch(%r{^app/controllers/(.*?)_controller\.rb$}) do |matches|
    resource_tests(matches[1])
  end
  watch(%r{^app/views/([^/]*?)/.*\.html\.erb$}) do |matches|
    ["test/controllers/#{matches[1]}_controller_test.rb"] +
    integration_tests(matches[1])
  end
  watch(%r{^app/helpers/(.*?)_helper\.rb$}) do |matches|
    integration_tests(matches[1])
  end
  watch('app/views/layouts/application.html.erb') do
    'test/integration/site_layout_test.rb'
  end
  watch('app/helpers/sessions_helper.rb') do
    integration_tests << 'test/helpers/sessions_helper_test.rb'
  end
  watch('app/controllers/sessions_controller.rb') do
    ['test/controllers/sessions_controller_test.rb',
     'test/integration/users_login_test.rb']
  end
  watch('app/controllers/account_activations_controller.rb') do
    'test/integration/users_signup_test.rb'
  end
  watch(%r{app/views/users/*}) do
    resource_tests('users') +
    ['test/integration/microposts_interface_test.rb']
  end
end

# 与えられたリソースに対応する統合テストを返す
def integration_tests(resource = :all)
  if resource == :all
    Dir["test/integration/*"]  else
    Dir["test/integration/#{resource}_*.rb"]
  end
end

# 与えられたリソースに対応するコントローラのテストを返す
def controller_test(resource)
  "test/controllers/#{resource}_controller_test.rb"
end

# 与えられたリソースに対応するすべてのテストを返す
def resource_tests(resource)
  integration_tests(resource) << controller_test(resource)
end
```

### gitignoreファイルへの追記

Guard使用時のSpringとGitの競合を防ぐために、.gitignoreファイルにspring/ディレクトリを追加
(cloud9の場合、.gitignoreファイルはhiddenファイルとなっている)

```
# Ignore Spring files.
/spring/*.pid
```
### Guard実行、完了

新しいターミナルで以下コマンドを実行
`$ bundle exec guard`

### その他

Spring killなどの解説もあったが、少し難しいため必要に駆られた際に確認することとした。
バッチファイルからPowerShellのスクリプトを起動する


環境　Windows10
　　　PowerShell5.1

```bat:callpowershell.bat

rem Start:batの窓を閉じる,-Windowstyle powershellの窓を閉じる,-NoProfile PowerShellの窓を閉じるのが早くなる
rem -ExecutionPolicy:スクリプト実行のため実行ポリシー変更
Start Powershell -Windowstyle Hidden -NoProfile -ExecutionPolicy Unrestricted -File .\test.ps1
```
#概要
　私が職場でPowerShellスクリプトを配布するときに、一緒に添付している起動用バッチファイルです。
　「二つとも同じフォルダ階層に入れた上で、歯車アイコンの方を起動してください」と伝えています。
　バッチファイルのコメントに書かれているのが全てですが、以下詳細。

#実行ポリシー変更について
-ExecutionPolicy Unrestricted 
RemoteSignedではデジタル証明書がないとインターネット経由で入手したファイルが実行できません。
　メール配布で実行できるよう、Unrestrictedにしています。

https://docs.microsoft.com/ja-jp/powershell/module/Microsoft.PowerShell.Core/About/about_execution_policies?view=powershell-5.1
（Microsoft公式・英語）
#起動時に開かれる窓について
　とにかく気になるのがこれだと思います。
・コマンドプロンプトの黒窓
・PowerShellの紺窓
　このバッチファイルだと、両方とも順次表示されますが、どちらもスクリプトの実行前には閉じます。

　個人的に、配布するPowerShellはユーザーフォームを使うことが多いので、ユーザーフォームを隠さないため、窓を残したくない。ドラッグ＆ドロップが必要なときは尚更です。

　startでPowerShellを起動すると、コマンドプロンプトの黒窓が閉じ、PowerShellの紺窓に移行するようです。
 startなしで黒窓が閉じるときもあるのですが、安定せず、しかも文字化けを表示していたずらにユーザーの不安をあおることがあるのでstartを使用しています。

　その後、-Windowstyle Hidden で紺窓を隠しています。Minimizedだと、窓が小さくなる動作があり、ちょっとカッコ悪かったのでHiddenにしています。
https://docs.microsoft.com/ja-jp/powershell/module/Microsoft.PowerShell.Core/About/about_PowerShell_exe?view=powershell-5.1
（Microsoft公式・英語）


　また、プロファイルがないときは-NoProfileのパラメータを付けるとMicrosoft公式でも言っているのですが、これで紺窓が閉じるのがかなり早くなります。起動自体が早まっているはずですから、つけることをお勧めします。 
https://docs.microsoft.com/ja-jp/windows-server/administration/windows-commands/powershell
（Microsoft公式）

#パスの指定
　相対パスの方が起動トラブルが起きにくいです。
　PowerShellのスクリプトと同じフォルダ階層に入れて起動するよう伝えていることもあって、相対パスで指定しています。
ファイル名の前に「.\」を付けることで同じ階層のファイルにアクセスしています。
Windows版Visual Studio CodeとWSLの連携手順について

## 概要
- Windows版のVSCodeでWSLをシームレスに連携する手順の記事です
- もはやmacOSと差がなさそう、Windowsでもストレスフリーに開発出来る

## はじめに
プログラミングと言えばmacOSだと思っていましたが、どうやら最近は違うようで、WSLというのが誕生しWindowsでもLinuxシェルが使えると。
具体的にmacOSがプログラミング向きである理由は正直よくわからんというところですが、確かに同じシェルが使えれば開発環境として問題なさそうです。
VSCodeと組み合わせられればもうWindowsだけでよくなっちゃうな、ということで試した手順をまとめました。

## 前提
- Pythonスクリプトをよく書きます、あとフロントでVueを書いたりします、そんなエンジニア目線の記事です
- 他所で紹介されている手順だと、ストアのものとはと別のWSLと連携していたりしますが、本手順なら、ストアのものと同一のWSLをVSCodeでシームレスに使えるようになります

## VSCodeとWSL連携
- アプリストアでubuntuをダウンロード・インストール
- VSCodeの左下の歯車からSettingsを開き Terminal › Integrated › Automation Shell: Windows などから開けるsettings.jsonに以下の行を追加し保存する

> "terminal.integrated.shellArgs.windows": ["wsl"],
こちらは非推奨になりました

```json
"terminal.integrated.defaultProfile.windows": "Ubuntu-18.04 (WSL)",
```

インストールしているubuntuのバージョンによって記述が変化するはず（不正な入力ならGUIで注釈が出ます）

## おわりに
以上の手順で、VSCodeのシェルを起動すると自動的にWSLが立ち上がるようになりました。カレントディレクトリもよしなに初期設定してくれます。これが実現したので、もはや開発環境においてmacOSの優位性というのはあるのかどうなのか。
【PHP】送信先のフォーム情報をブラウザにキャッシュさせない方法

#【PHP】送信先のフォーム情報をブラウザにキャッシュさせない方法

送信後のフォーム（テストページ）のレイアウト調整で、CSSが反映されず、いちいちブラウザの設定からキャッシュを消すという作業が煩わしいのでその対処法メモ。

#対処法
送信先ページのヘッダーに３行追加するだけ。

```
  <meta http-equiv="Pragma" content="no-cache">
  <meta http-equiv="cache-control" content="no-cache">
  <meta http-equiv="expires" content="0">
```

実に簡単。これだけでページがキャッシュされなくなる。



<br>
#対処法②
formタグのaction属性で送信先ページのURLをパラメータにすればキャッシュされなくなる。

```
  <form action="confirm.php?=test" method="post">
```

こちらの方法も簡単。

パラメータ付きページはページの内容が変わるため、ブラウザがキャッシュしなくなるらしい。
DockerでPython 3.8用のpsutilをインストールしてみた

# 動機
ことの始まりはとある先輩からのオーダー。。。
「最新のpyhon3系で動かしているlambdaのメモリ容量取得するようなコードかいてよ。」

よっしわかったよ。
クソ野郎やってやろうじゃないかと意気込んでLambdaの最新のpython3系のランタイムをみたら、、、
python3.8.....になってた。えっ、、、いつのまに3.8に。。。。

ということでpyrhon3.8かつamazonlinux2(Lambdaの実行環境がamazonlinuxとのことなので)で
インストールした外部ライブラリが必要になった。。。

# Dockerファイル
さくっとPython外部ライブラリを準備したかったのでDocker使いました。
Docker for Macです。

python3.8をインストールするために作成したDockerファイルは下記の通り

```Dockerfile
FROM amazonlinux:2
  
RUN yum -y update
RUN yum -y install gcc openssl-devel bzip2-devel libffi-devel
RUN yum -y install wget
RUN yum -y install tar
RUN yum -y install gzip
RUN yum -y install make
RUN wget https://www.python.org/ftp/python/3.8.1/Python-3.8.1.tgz
RUN tar xzf Python-3.8.1.tgz
RUN cd Python-3.8.1
RUN  ./Python-3.8.1/configure --enable-optimizations
RUN make altinstall
RUN python3.8 --version
RUN mkdir /home/deploy
```
※もっとこう書けるよってのがあったら教えて下さい！

#docker-compose.yml

さっきのDockerfileでpython3.8系はインストールできたので、外部ライブラリをpipでおとすためのdocker-compose.ymlは下記の通り

```docker-compose.yml
version: '2'
services:
  app:
    build: .
    volumes:
     - './deploy:/home/deploy'
    command: pip3.8 install -r /home/deploy/requirements.txt -t /home/deploy/dist
```

requirements.txtにはpsutilを書いてます。

※ちなみにディレクトリ構成はこんな感じ

```ディレクトリ構成
.
├── docker-compose.yml
├── deploy
│   ├── requirements.txt
│   └── dist
└── Dockerfile
```

# 結論
こうやって落とした外部ライブラリとpythonのソースをzipで固めて、Lambdaにアップロードしたら正常にうごきました！
(外部ライブラリを使うときはランタイムと実行元のOSを使っておとした物を使わないといけないのが手間オブ手間s・・・)

以上！
AtCoder Beginners SelectionでRuby学習【PracticeA】標準入力

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

## 問題
整数a,b,cと、文字列sが与えられます。 
a+b+cの計算結果と、文字列sを並べて表示しなさい。

制約
1≤a,b,c≤1,000
1≤|s|≤100

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

```ruby
a
b c
s

# 例
1
2 3
test
```
a+b+cとsを空白区切りで1行に出力せよ。

```ruby
出力例
# 上記例の場合
6 test
```

## 解答例
```ruby

a = gets.to_i
b,c = gets.chomp.split("").map(&:to_i) 
s = gets.chomp

print("#{a+b+c} #{s}\n")
```
ここで使われている標準入力に関わるメソッドを一つ一つ見ていきます。

## getsメソッド
rubyにおいて標準入力を受け取るにはgetsメソッドを使います。
ただ、getsメソッドで標準入力を受け取る際には以下の2点に注意します。
①標準入力を文字列で受け取る
②文字列を受け取る場合は末尾に改行コード\nが付いて来る。

```ruby
#入力 3
a = gets
print a
=> "3\n"  
```
## to_iメソッド
文字列を整数にして返すメソッドです。
getsメソッドのみでは、整数ですら文字列として受け取ってしまうため、
整数を整数として扱いたい場合は、to_iメソッドを使って整数に戻してあげる必要があります。

```ruby
#入力 3
a = gets.to_i
print a
=> 3  
```
この場合、改行コードも消してくれます。

## chompメソッド
getsメソッドで文字列を受け取る際の改行コード問題。
これを解決してくれるのがchompメソッドです。末尾の改行コードを取り除いてくれます。
この改行コードの存在をそのままにすると、これだけで誤答判定される場合もあるようなので注意が必要です。

```ruby
#入力 test
s = gets.chomp
print s
=> "test"  
```
ちなみに
to_iメソッドの部分でも述べましたが、整数に変換した後は使う必要はありません。
必要ない場合にchompメソッドを付けてしまうと処理速度の低下に繋がるので注意。

## splitメソッド
文字列を分割して配列にしてくれるメソッドです。
区切り文字を「split("区切り文字")」の形で指定することで、区切り部分を指定できます。
解答例では、bとcの間のスペースを区切り文字として指定しています。

```ruby
# 段階的に見ていきます。

#入力 3 4
a = gets
print a
=> "3 4\n"

b = a.chomp
print b
=> "3 4"

c = b.split(" ")
print c
=> ["3", "4"]

# まとめて書くと 

#入力 3 4
d = gets.chomp.split(" ")
print d
=> ["3", "4"]
```

## mapメソッド
配列の要素の数だけ繰り返し処理を行ってくれます。
今回の解答で用いている「map(&:to_i)」では、
繰り返し処理の引数として「to_iメソッド」を「&」を使うことで渡せる状態にしています。
このことについては、詳しく書くと長くなる内容なので…
とりあえず、下記の記事が詳しく書いて下さっているので、こちらを覗いてみられるといいかと。

[["1", "2", "3"].map(&:to_i) とは何か。](https://qiita.com/snyt45/items/7beb719ab0c4a25aa585)

近いうちに自分でも記事にしてみようと思います。

```ruby
# splitメソッドの続きから

#入力 3 4
d = gets.chomp.split(" ")
print d
=> ["3", "4"]

e = d.map(&:to_i)
print e
=> [3, 4]
```

## 最後に
以上、AtCoder Beginners SelectionでRuby学習【PracticeA】で学ぶ標準入力でした。
mapメソッドの部分で課題は残りましたが、
ここもしっかり理解して自分の力にしていきたいと思います。
間違いなどありましたら、ご指摘いただけると嬉しいです。
hamlの導入方法

今回はhamlを導入し、erbをhamlに変換する方法を紹介していきます。

#手順

1.Gemfileに以下を記述

```ruby

gem 'haml-rails'
```

2.bundle install

```
bundle install
```


3.ターミナルで以下のコマンドを実行し、拡張子がerbのファイルをhamlに変換する。

```
$ rails haml:erb2haml
```

※Would you like to delete the original .erb files? (This is not recommended unless you are under version control.) (y/n)
と聞かれるため、yと入力するとデフォルトで作成されたerbファイルはHamlに変換される。

以上
Markdeep + livereload で Markdown テキストをブラウザでインタラクティブ Render する 

## 背景

* VSCode とか Markdown のプレビューが合って便利ですね.
* Markdeep でカスタムテンプレートでプレビューしたい
  * VSCode 使わずに VIM とかでテキスト編集したい
  * テーブルデータとか, プレビューしないとわかりづらいものがある.
* ポータブルかつ軽量にやりたい
  * まずは nodes.js でモジュールを 100 個くらいインストールして〜, サーバのコードを書いて〜 とかやりたくない. 

ファイルの変更をみて, ページをリロードするような add-on でもいいのかもしれませんが, 今回は livereload を使ってみます.

Linux(Ubuntu) を想定します.

こんな感じでできました.

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">ありがとう Markdeep + livereload で Markdown text の live loading html preview! 🎉🎉🎉🎉🎉🎉😍😍😍😍😍😍😍😍✌️✌️✌️✌️✌️✌️💪💪💪💪💪💪 <a href="https://t.co/GxoBhFVg59">pic.twitter.com/GxoBhFVg59</a></p>&mdash; Syoyo Fujita 🌸 レイトラ 🐯 2 周年 🎉 (@syoyo) <a href="https://twitter.com/syoyo/status/1260871783609073665?ref_src=twsrc%5Etfw">May 14, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 

## Markdeep

言わずと知れた, casual-effects(モーガン先生)謹製の, .js をインクルードするだけで Markdown を html レンダーしてくれるライブラリ

https://casual-effects.com/markdeep/

## livereload

LiveReloadが便利すぎる
https://qiita.com/martini3oz/items/7b9b73a5298d4e97b32a

ありがとうございます.

## 手順

node.js が入っているものとします.

ブラウザ(e.g. Firefox)に, Livereload add-on を入れます.

livereload サーバを入れます.
いくつか派生があるようですが, 今回は livereloadx を使いました.

https://nitoyon.github.io/livereloadx/

```
$ npm install livereloadx
```

Ubuntu だと apt で python3-liveread があるので, そちらも使えるかもです.


Markdeep ファイルを, index.md.html とかにしておきます.
最後のほうに,

```
<!-- Markdeep: --><style class="fallback">body{visibility:hidden;white-space:pre;font-family:monospace}</style><script src="markdeep.min.js" charset="utf-8"></script><script src="https://casual-effects.com/markdeep/latest/markdeep.min.js?" charset="utf-8"></script><script>window.alreadyProcessedMarkdeep||(document.body.style.visibility="visible")</script>

<!-- livereload.js -->
<script src="http://localhost:35729/livereload.js"></script>
```

のような感じで markdeep と livereload.js を指定します.

あとはサーバーを起動するだけです. `-s` で static site モードでないと動かなかったので注意です!

```
$ livereloadx -s <path/to/dir>
```

ブラウザで

```
http://localhost:35729/index.md.html
```

あたりにアクセスします.

これで, Markdown ファイルを編集するとブラウザでインタラクティブレンダーされます!
Happy Markdown editing!

## 問題点, TODO

* [ ] ブラウザでは full reload + 描画されるので, 一回描画が真っ白になります. 
  * [ ] livereload あたりの機能で, 再描画をスムースに遷移させる方法があるか調べる. 
* [ ] Markdeep テンプレートを使うので, うまくいくか試す
AtCoderBeginnerContest166復習＆まとめ（前半）

# AtCoder ABC166
2020-05-03(日)に行われたAtCoderBeginnerContest166の問題をA問題から順に考察も踏まえてまとめたものとなります．
前半ではABCまでの問題を扱います．
問題は引用して記載していますが，詳しくはコンテストページの方で確認してください．
[コンテストページはこちら](https://atcoder.jp/contests/abc166)
[公式解説PDF](https://img.atcoder.jp/abc166/editorial.pdf)

## A問題　Registration
> 問題文
> AtCoder 社は、毎週土曜日にコンテストを開催しています。
> コンテストには ABC と ARC の$2$つの種類があり、毎週どちらか一方が開催されます。
> ABC が開催された次の週には ARC が開催され、ARC が行われた次の週には ABC が開催されます。
> 先週開催されたコンテストを表す文字列$S$が与えられるので、今週開催されるコンテストを表す文字列を出力してください。

このあたりは，特に悩むことなく解けるかなと思います．
受けとった文字列が ABC と ARC のどちらであるかをif文で判定すれば終わりです．

```python:abc166a.py
s = input()
if s == "ABC":
    print("ARC")
else:
    print("ABC")
```

## B問題　Trick or Treat
> 問題文
> ある街に、$N$人のすぬけ君(すぬけ君$1$、すぬけ君$2$、...、すぬけ君$N$)が住んでいます。
> この街には、$K$種類のお菓子(お菓子$1$、お菓子$2$ 、....、お菓子$K$)が売られています。お菓子$i$を持っているのは、すぬけ君$A_{i,1},A_{i,2},⋯,A_{i,d_i}$の計$d_i$人です。
> 高橋君は今からこの街を回り、お菓子を$1$つも持っていないすぬけ君にいたずらをします。このとき、何人のすぬけ君がいたずらを受けるでしょうか。

いたずらを受けるすぬけ君を記録しておくリスト`kun_list`を作ります．
最初にお菓子の情報を与えない場合，全員がお菓子を持ってないことになるので，全すぬけ君はいたずらを受けることになります．
なので，そこに与えられたお菓子の情報を使って，お菓子を持っているすぬけ君をいたずらリストから外していけば，最終的にお菓子を持ってない，いたずらされるすぬけ君がリストに残るので，人数を数えることで解けます．

```python:abc166b.py
n, k = map(int, input().split())
kun_list = [1] * n
for i in range(0, k):
    d = int(input())
    a_list = list(map(int, input().split()))
    for a in a_list:
        kun_list[a-1] = 0
print(sum(kun_list))
```

## C問題　Peaks
> 問題文
> AtCoder丘陵には$N$個の展望台があり、展望台$i$の標高は$H_i$です。 また、異なる展望台どうしを結ぶ$M$本の道があり、道$j$は展望台$A_j$と展望台$B_j$を結んでいます。
> 展望台$i$が良い展望台であるとは、展望台$i$から一本の道を使って辿り着けるどの展望台よりも展望台$i$の方が標高が高いことをいいます。 展望台$i$から一本の道を使って辿り着ける展望台が存在しない場合も、展望台$i$は良い展望台であるといいます。
> 良い展望台がいくつあるか求めてください。

解説では，展望台$i$から一本の道でいける（隣接する）展望台の最大の高さ$maxH_i$を各展望台で求めて，$H_i > maxH_i$であれば，良い展望台であるためその数を数える方法をとっていました．
自分は，全ての展望台をとりあえず良い展望台として，`ten_list`という展望台のリストを作りました．
道の情報が一つ与えられることにより，どちらか or 両方の展望台が良い展望台ではなくなっていくため，高さを比較して，`ten_list`を更新していきました（両方の展望台が良い展望台でなくなるのは高さが等しいとき）．
最後に，残った良い展望台の数を数えればOKです．

```python:abc166c.py
n, m = map(int, input().split())
h_list = list(map(int, input().split()))
ten_list = [1] * n
for i in range(0, m):
    a, b = map(int, input().split())
    if h_list[a - 1] <= h_list[b - 1]:
        ten_list[a - 1] = 0
    if h_list[a - 1] >= h_list[b - 1]:
        ten_list[b - 1] = 0
print(sum(ten_list))
```

前半はここまでとなります．
後半はDEF問題の解説となります．
C問題がB問題とほとんど同じような感じで解ける問題だったので，コンテスト時，少し不安でしたが詰まることなくここまでは解けました．
しかし，今回のコンテストもABCまで解いた後，行き詰まり，試行錯誤しましたが結局"AC"は出せずに終わってしまい，C問題までの短距離走の速さ比べになってしまい反省しています．
確かC問題通したのが開始14分ごろだった．
やっぱり，難しい問題を一問くらいは通して，徒競走から抜け出したいと思っています．
とりあえず前半の最後まで読んでいただきありがとうございました．
[後半に続く](https://qiita.com/takaito0423/items/a26630975b4ae54ad57c)．
bootstrapの導入方法

#bootstrapってなに？

RubyのフレームワークはRuby on Railsで言うところの、
boootstrapとはCSSのフレームワークみたいなものです。

bootstrapを学べば、効率的にビューを実装できるので知っておいて損はないです。。

#導入方法

1.Gemfileに以下を記述する。

```ruby

gem "sass-rails","~>5.0"
gem "bootstrap-sass","~>3.3.6"
gem "jquery-rails"
gem "jquery-ui-rails"
```

2.bundle updateする

```
 $ bundle update
```


3.appcation.cssを.scssに拡張してから下記を記述する。

```ruby
　@import "bootstrap-sprockets";
　@import "bootstrap";
```

4.appcation.jsの中に下記を記述。

```  
//= require jquery　//= require~と書いてる部分の一番上に記述
//= require bootstrap-sprockets //= require~と書いてる部分の一番下に記述
```

以上
Python系のpdfチートシートたち

# チートシートを手元におきたい

使いながら随時更新しますが、pdfのチートシートたちを集めておきます。さくっと印刷できるので、手元にない時はこいつらを印刷しておくと便利かもしれません。

基本はもちろんAnaconda
これがないと始まりません。
https://docs.conda.io/projects/conda/en/4.6.0/_downloads/52a95608c49671267e40c689e0bc00ca/conda-cheatsheet.pdf

それからPython3
PythonのリストはNumpyとかと挙動が違って、忘れがちです。手元にあると楽そう。
https://perso.limsi.fr/pointal/_media/python:cours:mementopython3-english.pdf

Numpy
Numpyは大規模な三次元以上のデータの処理に便利ですが、忘れて調べることもしばしば。
https://s3.amazonaws.com/assets.datacamp.com/blog_assets/Numpy_Python_Cheat_Sheet.pdf

Pandas
こちらは絵つきでわかりやすいですが、個々のメソッドの使い方についての情報量は少なめかも。いいのがあればアップデートします。
https://pandas.pydata.org/Pandas_Cheat_Sheet.pdf

おまけで、VimとLatexのチートシートも置いておきます。
https://www.math.brown.edu/~jhs/ReferenceCards/TeXRefCard.v1.5.pdf
https://www.cs.cmu.edu/~15131/f17/topics/vim/vim-cheatsheet.pdf

それでは良いチートライフを！
[Docker] [drone] Drone基本安裝

#目的
這是一次安裝經驗紀錄,當我們需要自己架設 `CICD` 環境時,我們挑選了Drone作為本次的安裝的對象

但因為他登入採用版本控款的第三方登入所以也需要搭配一個版本控管環境,我們就以Gitlab為例


預先準備環境:Docker


#安裝Drone

1.設定Gitlab Application
callbackurl 依照你得drone版本不同可能要更改 新版的是用 `/login `, 舊版本可能要用 `/authorize`
![drone1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176166/66672dee-7a68-8b9a-5cf1-9723f200e193.png)


2 . 安裝Drone

```
 docker run \
  --volume=/var/lib/drone:/data \
  --env=DRONE_GITLAB_SERVER=http://192.168.10.2:8888 \ 
  --env=DRONE_GITLAB_CLIENT_ID=fdfdfvbfbfgfdgfdgfdbvdfbfdgfdgdfgfdgfd \ 
  --env=DRONE_GITLAB_CLIENT_SECRET=dfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdffd \ 
  --env=DRONE_RPC_SECRET=54E921B198DA2BB4E4F9366F7F4AB \  
  --env=DRONE_SERVER_HOST=192.168.10.2:9999 \ 
  --env=DRONE_SERVER_PROTO=http  \  
  --publish=9999:80 \   
  --publish=9998:443 \  
  --restart=always \
  --detach=true \
  --name=drone \
  drone/drone:1
```
- DRONE_GITLAB_SERVER 是你對應Gitlab的網址,我是架設在內網,依照你的版本控管位置設定
- DRONE_GITLAB_CLIENT_ID 這個在Gitlab UserSettings/Application 中產生
- DRONE_GITLAB_CLIENT_SECRET 這個在Gitlab UserSettings/Application 中產生
- DRONE_SERVER_HOST drone 安裝位置的url
- DRONE_SERVER_PROTO依照drone使用http還是https
- 9999(外部監聽Port):80(Docker 內部對應Port)
- 9998(外部監聽Port):443(Docker 內部對應Port)

3.登入drone

![drone2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176166/bf43d013-b2d1-de0e-fcab-3d772895056f.png)


這樣就完成了,之後有空再補上drone 使用方式
【Nuxt.js】vue-js-modalの導入方法

## 概要

Nuxtに[vue-js-modal](https://github.com/euvl/vue-js-modal)を導入するのに少しハマった部分があったので、導入方法を残しておきます。

## 導入

### インストール

yarnを使ってインストール

```sh
$ yarn add vue-js-modal
```

### vue-js-modal.jsを作成

`plugins`ディレクトリ内に`vue-js-modal.js`ファイルを作成します。

```plugins/vue-js-modal.js
import Vue from "vue"
import VModal from "vue-js-modal"

Vue.use(VModal)
```

### nuxt.config.js

以下ハマり部分。

`nuxt.config.js`を変更していきます。

```nuxt.config.js
export default {
  plugins: [
    "~/plugins/vue-js-modal",
  ]
}
```

とやれば導入出来るはずだったのですが、私の環境では動かず、以下のようにすることで動きました。

```nuxt.config.js
export default {
  plugins: [
    { src: "~/plugins/vue-js-modal", ssr: false },
  ]
}
```

明示的にssrをfalseにすることでコンポーネント内でmodalを使用することが出来ました。
[Ruby]GraphQLで認証を実装する

# はじめに
最近、graphql-rubyを勉強中です。認証周りを実装してみたので忘備録です。
ただ、この方法が正解かどうかは模索中です。

# やりたいこと
あるmutationなりqueryはログインユーザしか発行できないけど、ユーザに関係ないquery等はログインしてなくても発行できるようにしたい。でも全てのqueryとかでログインしてるかどうかのコードを追加するのはめんどくさい。

# まずは通常の認証
graphql_controller.rbのexcute内でuserの認証を行い、contextにcurrent_userを保持させます。

```graphql_controller.rb
def excute
  current_user = User.auth_user(params)
  context: { current_user: current_user }
# その後の処理↓
...
end
```

上の例だと、auth_userメソッドで認証して、userオブジェクトをもらっています。
contextに引き渡すと、resolver内等でcontext[:current_user]で取得できます。

# ひと工夫
さて、この場合だと、resolver内でいちいちcontext[:current_user]が存在するかどうかを確認しないといけません。かといって、excute内で弾くと全てのqueryがログインしていないと発行できません。
そこで、base_query.rbに以下のような処理を書いてやることにしました。

```base_query.rb
  class BaseQuery < GraphQL::Schema::Resolver
    def current_user
      context[:current_user].presence || raise(GraphQL::ExecutionError, 'Permissions deny, Please login again')
    end
  end
```
queryはbase_query.rbを継承していますので、current_userを使うときにこのメソッドを呼び出してやれば良いですね。
# もう少し細かくやる場合
今回はuserと紐づくかどうかで、判断しましたがもう少し細かく設定する場合には返すObjectタイプごとに指定できるようです。こっちも試してみたら記事を書こうと思います。
https://graphql-ruby.org/authorization/authorization.html
他にもっと良い方法あるよって方は教えてもらえると幸いです。
ラムダ式とMakefileマクロ

Makefile のマクロでラムダ式っぽいことができることに気付いたのでメモしておきます。

# ループ

Node.js でカレントディレクトリのファイルを列挙する例です。

```javascript:test1.js
const fs = require("fs");
for (let f of fs.readdirSync(".")) console.log(f);
```

これと同じことを Makefile で書きます。

```makefile:test1.mk
all:
	for f in ./*; do echo $$f; done
```

※ Makefile の変数と区別するため、`$` を `$$` にエスケープする必要があります。

# ラムダ式とマクロ

Node.js を `forEach` で書き直します。

```javascript:test2.js
const fs = require("fs");
fs.readdirSync(".").forEach(f => console.log(f));
```

これと同じようなことを Makefile のマクロで書きます。

```makefile:test2.mk
define forEach
for $1 in $2; do $3; done
endef

all:
	$(call forEach,f,./*,echo $$f)
```
```text:実行結果
$ make -f test2.mk
for f in ./*; do echo $f; done
./test1.js
./test1.mk
（略）
```

※ `@` で抑制していないためマクロの展開結果が確認できます。

ただのループなのであまり嬉しさはありませんが、もう少し複雑な処理に応用すると便利かもしれません。

なお、JavaScript の `forEach` はコールバックに引数を3つ渡す仕様のため、ポイントフリースタイルで書くと実行結果が変わります。

```javascript:test2a.js
const fs = require("fs");
fs.readdirSync(".").forEach(console.log);
```
```text:実行結果
test1.js 0 [ 'test1.js', 'test1.mk', （略） ]
test1.mk 1 [ 'test1.js', 'test1.mk', （略） ]
（略）
```

# フィルター

Node.js の API ではワイルドカードが使えないため、フィルターを挟む必要があります。

```javascript:test3.js
const fs = require("fs");
fs.readdirSync(".").filter(f => f.endsWith(".js")).forEach(f => console.log(f));
```

Makefile は中に書いているのはシェルのコマンドなのでワイルドカードが使えますが、敢えてフィルターを書いてみます。

```makefile:test3.mk
define forEach
for $1 in $2; do $3; done
endef
define filter_
if $1; then $2; fi
endef
define endsWith
[ "`echo $1 | sed 's/.*$2$$/ok/'`" = "ok" ]
endef

all:
	$(call forEach,f,./*,$(call filter_,$(call endsWith,$$f,\.js),echo $$f))
```

※ 組み込み関数 `filter` と名前が被るため、マクロは `filter_` にしています。

```text:実行結果
$ make -f test3.mk
for f in ./*; do if [ "`echo $f | sed 's/.*\.js$/ok/'`" = "ok" ]; then echo $f; fi; done
./test1.js
（略）
```

実用性はともかく、ちょっと面白いと思いました。

# 参考

マクロの使い方は以下の記事を参考にしました。

* [Make覚書](https://qiita.com/Shigets/items/27170827707e5136ee89)
【簡潔】Brakeman導入方法-Rails-

###Brakeman導入方法
####Brakemanとは
Brakemanとはアプリケーションを開発した際にセキュリティ検査ができるgemの一つです。
Railsでは元からセキュリティについては比較的維持できるものですが、私が開発した際に補助的にこのようなツールを使ってみました。ちなみにBrakemanは静的なツールです。

####導入方法


作成中のプロジェクトの`Gemfile`内の`group :development do`と`end`の間に`gem 'brakeman', require: false`を追記します。

```Gemfile

group :development do
  gem 'brakeman', require: false
end
```

次にターミナルの作成中アプリのディレクトリで`brakeman`と叩けばBrakemanでのセキュリティチェックが始まります。

```ターミナル
 % brakeman
```
出力はこんな感じです。

```ターミナル
== Brakeman Report ==

Application Path: /Users/UserName/FolderName/AppName
Rails Version: 5.2.4.2
Brakeman Version: 4.8.2
Scan Date: 0000-00-00 00:00:0 +0000
Duration: 0.290167 seconds
Checks Run: BasicAuth, BasicAuthTimingAttack, ContentTag, CookieSerialization, CreateWith, CrossSiteScripting, DefaultRoutes, Deserialize, DetailedExceptions, DigestDoS, DynamicFinders, EscapeFunction, Evaluation, Execute, FileAccess, FileDisclosure, FilterSkipping, ForgerySetting, HeaderDoS, I18nXSS, JRubyXML, JSONEncoding, JSONEntityEscape, JSONParsing, LinkTo, LinkToHref, MailTo, MassAssignment, MimeTypeDoS, ModelAttrAccessible, ModelAttributes, ModelSerialize, NestedAttributes, NestedAttributesBypass, NumberToCurrency, PageCachingCVE, PermitAttributes, QuoteTableName, Redirect, RegexDoS, Render, RenderDoS, RenderInline, ResponseSplitting, RouteDoS, SQL, SQLCVEs, SSLVerify, SafeBufferManipulation, SanitizeMethods, SelectTag, SelectVulnerability, Send, SendFile, SessionManipulation, SessionSettings, SimpleFormat, SingleQuotes, SkipBeforeFilter, SprocketsPathTraversal, StripTags, SymbolDoSCVE, TranslateBug, UnsafeReflection, ValidationRegex, WithoutProtection, XMLDoS, YAMLParsing

== Overview ==

Controllers: 2
Models: 3
Templates: 34
Errors: 0
Security Warnings: 0

== Warning Types ==


No warnings found


```


セキュリティチェック完了です。



この記事を読んでいただきありがとうございました。
CurrentBranchにMasterBranchの情報を反映させたい

#背景

チーム開発において自分の作業ブランチにマスターブランチの情報をもってきたい!!
だけどどうすればいいかわからない、、、

そんなときの解決策を今回は紹介します。

以下の4つのコマンド実行するだけです。

コマンドを実行する前の注意点として、編集途中のファイル等がある場合は、一度コミット&プッシュして何もない状態にしておきましょう。

```

<!-- 開発中ブランチからmasterブランチへ移動 -->
$ git checkout master

<!-- リモートのmasterを反映 -->
$ git pull origin master

<!-- masterブランチから開発中のブランチへ移動 -->
$ git checkout 開発中のブランチ名

<!-- maserの内容を開発中ブランチに取り込む -->
$ git merge origin master

```

以上
rails db:createからのCould not find a JavaScript runtime. See https://github.com/rails/execjs for a list of available runtimes.について

スクールでの必修アプリ作成し終わったので今から個人でwebアプリケーションを作成！

お見苦しいところがあると思いますが、その議事録みたいな形で書いていこうと思います！

まずは開発からの環境設定から…

早速つまづく！！

rails db:createを実行したら

```rails aborted!
ExecJS::RuntimeUnavailable: Could not find a JavaScript runtime. See https://github.com/rails/execjs for a list of available runtimes. ```

調べたら、Javascriptのランタイムがインストールされていないとの事で親切丁寧に、GithubのURLを添えていただき、exec.jsをインストール進めてきました！

がこちらを参考に見ていくとどうやらnodejsがいいそうだ！
https://qiita.com/azusanakano/items/771dc9919f347de061d7
どうやらスクール必須アプリの作成中に要らぬことをしてnodejsが消えてしまったらしいので改めてHomebrewを用いてインストール！

```$ brew install nodejs```

無事インストールされたか
```$ node -v```
で確認！
無事インストールされたので改めてrails db:createを実行すると無事にデータベースが作成されました！
PyCaretで主成分分析ハンズオン【正規化+可視化(plotly)】メモ

# 概要
* PyCaretでPCAを行いました。（ハイパーパラメータ等の最適化はしていません）
* とある電力量データでPCAを行いました。

# ソースコード
* 自前のデータ整形ソースコード（汚い）:13行

```python:自前のデータ整形コード
import pandas as pd
def load_sampledata():
    data = pd.read_csv(r'pycaret_sample.csv',
            encoding='shift-jis',
            engine='python',
            index_col=[0],
            parse_dates=[0])

    data = data.resample('h').sum()
    data['hour'] = data.index.hour
    data['date'] = data.index.strftime('%Y-%m-%d (%a)')
    dataset = data.pivot(index='hour',columns='date',values='電力量')
    dataset = dataset.T.reset_index()
    return dataset

```

* PyCaretのセットアップ:2行

```python:setup
from pycaret.clustering import * 
clu = setup(data = load_sampledata(),normalize=True)

```

* setupした内容を確認できる  
![create_setup.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148213/a618d791-6493-8d9f-43d6-79c94055bfdc.jpeg)


* PyCaretのモデル作成+プロット作成:2行

```python:create_model&plot
# creating a model
hclust = create_model('hclust')
# plotting a model
plot_model(hclust,plot='cluster',feature='date')
```

* 2行でPCAと可視化までできる。
![pycaret_createplot.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148213/671eeee9-9a23-860a-0728-67ba50514280.gif)


# まとめ
* PyCaretすごい。
* これで書き始めるとラッパーなしで書けなくなりそう。
* チューニングもできるし、すごい早さで書ける。すごい。
devise導入したときのカラムの増やし方

#悩み事

devise導入したらデフィルトでemailとpasswordしか入ってないじゃん、、、、
usersテーブルにnameやaddressカラムとかも追加したいのにどうすればいいかわからない！！

ってこと一度はありますよね。

今回はそのお悩み解決いたします！！

#1.usersテーブルにカラムを追加

今回はnameカラムを追加してみようと思うので、
以下のようにターミナルでコマンドを実行しましょう。

```
$ rails g migration AddNameToUsers name:string

$ rails db:migrate
```

#2.application_controller.rbを編集

application_controller.rbを以下のように編集しましょう。
これでユーザー登録時にnameカラムが保存されるようになります。

```app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
  before_action :configure_permitted_parameters, if: :devise_controller?

  protected
  def configure_permitted_parameters
    devise_parameter_sanitizer.permit(:sign_up, keys: [:name])
  end
end
```

今の状態でuser情報を登録するとnameカラムも追加されてるしいい感じだ！！
と安堵するのはまだ早いのです。。。

今のままでは登録時にしかnameカラムが入っていないので、編集でnameを変更しても変更されません。
不完全な状態です。

#3.完全感覚dreamer

じゃあ編集時に追加したカラムの編集もしっかりとできるようにしましょう！
とはいえとても簡単です。

```app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
  before_action :configure_permitted_parameters, if: :devise_controller?

  protected
  def configure_permitted_parameters
    devise_parameter_sanitizer.permit(:sign_up, keys: [:name])
    <!-- 以下のように編集時の対応する記述も追加してあげましょう -->
    devise_parameter_sanitizer.permit(:account_update, keys: [:name])
  end
end
```

これでバッチリです！！
以上！
Ubuntu 20.04LTS 内蔵HDDをマウントした際のトラブル

#トラブル内容
fdiskでパーティションを作成し直しマウント試みるもエラー。

```bash
$ sudo mount /dev/sdb1 /sub
mount: /sub: wrong fs type, bad option, bad superblock on /dev/sdb1, 
missing codepage or helper program, or other error.
```

#対処
下記ブログを参考にgdiskにてパーティションし直し。無事マウントできることを確認。

http://www.nemotos.net/?p=3132

次に自動マウントを設定する。
まず以下のコマンドでUUIDを確認。

```bash
$ sudo blkid /dev/sdb1
```

次に/etc/fstabに自動マウントするHDDとマウントする場所を追記
以下のコマンドでfstabを立ち上げ起動時のマウント設定を追記する。

```bash
$ vi /etc/fstab
```
最終列に以下の情報を追記。
UUID マウントポイント ファイルシステム マウント時オプション ファイルシステムdump要否 fsckチェック要否
例:UUID=xxx-xxxx-xxxxx /mnt/hdd ext4 defaults 0 0

rebootしてdfコマンドでマウントできているかを確認し終了。
参考まで。
GitHub のタグを削除する方法

GitHub の画面からタグ削除できないが、コマンドからは削除できます。
`:` を `refs` 前に付くことで、タグを削除できる、ちょっとややこしい。。。

```sh:リモートタグ削除
git push origin :refs/tags/v1.0.0
```

```sh:リモートタグ追加
git push origin refs/tags/v1.0.0
```
Node.js のバージョン管理ツール nvm for Windowsを導入

# 導入背景
ローカル環境とデプロイ先の環境でNode.jsのバージョンに差異があり、その管理を行うため。


# nvm for Windowsをインストール
nvm-setup.zipをダウンロードし、インストール
[公式からダウンロード](https://github.com/coreybutler/nvm-windows/releases)
# nvm for Windows のコマンド
- インストール可能なバージョンリストを表示

```
>nvm list available

|   CURRENT    |     LTS      |  OLD STABLE  | OLD UNSTABLE |
|--------------|--------------|--------------|--------------|
|    14.2.0    |   12.16.3    |   0.12.18    |   0.11.16    |
|    14.1.0    |   12.16.2    |   0.12.17    |   0.11.15    |
|    14.0.0    |   12.16.1    |   0.12.16    |   0.11.14    |
|   13.14.0    |   12.16.0    |   0.12.15    |   0.11.13    |
|   13.13.0    |   12.15.0    |   0.12.14    |   0.11.12    |
|   13.12.0    |   12.14.1    |   0.12.13    |   0.11.11    |
|   13.11.0    |   12.14.0    |   0.12.12    |   0.11.10    |
|   13.10.1    |   12.13.1    |   0.12.11    |    0.11.9    |
|   13.10.0    |   12.13.0    |   0.12.10    |    0.11.8    |
|    13.9.0    |   10.20.1    |    0.12.9    |    0.11.7    |
|    13.8.0    |   10.20.0    |    0.12.8    |    0.11.6    |
|    13.7.0    |   10.19.0    |    0.12.7    |    0.11.5    |
|    13.6.0    |   10.18.1    |    0.12.6    |    0.11.4    |
|    13.5.0    |   10.18.0    |    0.12.5    |    0.11.3    |
|    13.4.0    |   10.17.0    |    0.12.4    |    0.11.2    |
|    13.3.0    |   10.16.3    |    0.12.3    |    0.11.1    |
|    13.2.0    |   10.16.2    |    0.12.2    |    0.11.0    |
|    13.1.0    |   10.16.1    |    0.12.1    |    0.9.12    |
|    13.0.1    |   10.16.0    |    0.12.0    |    0.9.11    |
|    13.0.0    |   10.15.3    |   0.10.48    |    0.9.10    |
```

- 特定のバージョンの node をインストール

```
>nvm install 10.20.1
Downloading node.js version 10.20.1 (64-bit)...
Complete
```


- インストール済みのバージョンリストを表示

```
>nvm list
  * 12.16.3 (Currently using 64-bit executable)
    10.20.1
```

-  使用するバージョンを指定する

```
>nvm use 10.20.1
Now using node v10.20.1 (64-bit)
```
DBMSについて色々調べてみた件（２）

どうも初めまして！　

最近基本情報技術者の資格取得に向けて勉強中な駆け出しエンジニアのワカです。

#■この記事を書こうと思ったきっかけ
最近書籍を購入して勉強しているのですが、暗記ばかりでなかなか身にならないと思いました。

そこで基本情報に書かれている内容を自分なりに解釈したものをここに備忘録として書き残すことにしました。
そうすれば手も動かせるし人にみられると思うとその分責任感出ますしね！

あと個人的に今自作PCを作りたいとも考えているのでこの機会に詳しくなっとこうと思ったのも理由の一つです笑

もしかすると間違っている点などあるかもしれませんので、その時は指摘していただけると嬉しいです。

#◼️正規化
正規化の目的・・・「**データに矛盾や定額を発生させないこと**」 

正規化のイメージ・・・業務で使われる帳票類（例えば受注伝票とか社員のスキルシートとか）これをデータベースで管理するためにはどんな表が最適か？を整理して行く感じと理解してもらっていいでしょう。

##非正規形
正規化されていない表のこと＝繰り返し部分を持つ表、各レコードの長さがバラバラで素直な二次元の表なっていないもの
関係データベースではこのような表は管理できない。

##関数従属、部分関数従属
表の中における列と列との関係を表したものです。主キーに対するその項目がどんな関係にあるかを表す言葉だと思っていいでしょう

###関数従属
主キー が決まれば列の値が一意に決まる関係 

###部分関数従属
複合キーの一部の項目だけで列の値が一意に決まる関係。主キーの一部分に対して関数従属する項目

|  正規形 | 特徴 |
|:-:|:--|
| 第一正規形  |非正規形の表から 繰り返し部分を取り除いたもの。<br>取り除いたデータはまた独立したレコードに挿入する   |
| 第二正規形  |正規形の表から部分関数従属している列を 切り出したものが第2 正規形 となります   |
| 第三正規形  | 第2正規形の表から 主キー 以外の 列に関数従属している列を切り出したものが第3正規形になります  |


#◼️SQL（Structured Quality language)
DBMSに指示を伝えるための言語
 
SQL には様々な命令文を用意されておりそれらの命令は
・**データ定義言語 DDL**・・・「スキーマの定義や表の作成といった定義を担当」
・**データ操作言語 dml**・・・「データの抽出や挿入更新削除といった操作を担当」


データというのはただ溜め込んだだけではあまり意味を持ちません。何らかの条件付けを行って抽出することで初めてデータに意味がくっついてくるわけです。

※ここではコマンドについては説明しません。

#■最後に

ここまで長々と読んでくださりありがとうございました！
少し説明がわかりにくかった部分があるかと思いますが、もしわからないところがあればコメントしていただけると嬉しいです。

では！次の記事にて！
CentOS: sudo yum upgradeでSSHのポート設定が初期化された


ssh接続できんわー
なんでやー

原因： OSのクリーンナップをしたかった。

```shell:クリーンナップ
#Syncthingのために作っていた余分なユーザーを削除
userdel -r {ユーザー名} #ユーザーフォルダ等も削除
#root直下に作成していたバックアップフォルダを削除
rm -rf {アプリの使用するフォルダ}/
#Syncthingのアンインストール
rm -rf ~/.config/syncthing/
#firewalldからサービスの削除
sudo firewall-cmd --remove-service=syncthing
#開けていたfirewalldのポートを削除（--permanentで恒久的）
sudo firewalld-cmd --remove-port=8384/tcp --permanent
#確認
sudo firewalld-cmd --list-all
#ついでにアップデート
sudo yum upgrade
```

###ssh周りが初期化され変更したポートから接続できなくなった
***yum upgradeが原因***

```shell:sshポートの復活
#デフォルトをコピーして
sudo cp /usr/lib/firewalld/services/ssh.xml /etc/firewalld/services/ssh.xml
#編集
sudo vi /etc/firewalld/services/ssh.xml
-  <port protocol="tcp" port="22"/>
+  <port protocol="tcp" port="{変更後port}"/>
#反映
sudo firewall-cmd --reload
#無事開通！！
```
今回のアップグレードでの変化は、
OSバージョンが7.8に。
Mirakurunには影響なし。
画像処理100ノック　Q.6. 減色処理　解説

[画像処理100ノック](https://github.com/yoyoyo-yo/Gasyori100knock/tree/master/Question_01_10)Q.6. 減色処理についての解説記事です。

減色処理は、R(赤),G(緑),B(青)それぞれのとりうる値の種類を限定します。それにより、表現できる色が減ります。

本題ではR,G,Bが各256種類の値(0~255)を取れていたものを、各4種類の値(32,96,160,224)に減らすように指示されています。

元記事ではこちらの処理によって、減色処理を行っています。（下記）

```python
def dicrease_color(img):
    out = img.copy()
    out = out // 64 * 64 + 32
    return out
```
思っていたより処理が少なくてびっくりしました。この関数の下記の部分のコードで減色処理を行っています。

```python
out = out // 64 * 64 + 32
```
この64と言う数字は256(0~255)を4で割った値です。

つまり、`out // 64`とは256を4分割した際のどのクラス(0, 1, 2, 3と言う風に4クラスあるものとする)に属するかを調べていることになります。

そして`* 64 + 32`とすることでそのクラスの定められた値にしています。（クラス0なら32、クラス1なら96、クラス2なら160、クラス3なら224と定められています。）今回はそのクラス内の中央付近の値にしているようです。(クラス0に属する値は0~63で、その中央は32と33)
例えば`out // 64`が2だった場合(クラス2)、つまり`out`が128~191だった場合は、`out // 64`で2となり、`* 64 + 32`とすることでクラス2の定められた値(160)としています。

以上のことが理解できれば各2値や各6値、8値など思うように減色
処理を行うことができます。以下参考までにコードを提示しておきます。(※Google Colaboratoryを使用しています。画像の読み込みなどに少し処理が必要です。私は[Google Colabでcv2.imshow() を利用する方法](https://qiita.com/ITF_katoyu/items/115528c98d2e558c6fc6)を参考にしました。)

```python
# サポートパッチのインポート
from google.colab.patches import cv2_imshow

# 画像のインポート
!curl -o logo.png https://colab.research.google.com/img/colab_favicon_256px.png
import cv2

# 画像を読み込み、imgに格納
img = cv2.imread("imori.jpg", cv2.IMREAD_UNCHANGED)

# imと言う変数にimgをコピー
im = img.copy()

# 画像を表示
cv2_imshow(im)
```
![ダウンロード (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634062/65d9fe9b-a1ce-f984-84bf-9103392eefdb.png)


## 各2値に分類

```python
sample = im // 128 * 128 + 64
cv2_imshow(sample)
```
![ダウンロード (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634062/437a7dfa-03d5-14e9-d077-5ea7cccde4dc.png)
## 各3値に分類

```python
sample = im // 85 * 85 + 42
cv2_imshow(sample)
```
![ダウンロード (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634062/4a561c82-dc51-fb66-91b5-9e92b29e902e.png)

## 各4値に分類(元記事通り)

```python
sample = im // 64 * 64 + 32
cv2_imshow(sample)
```
![ダウンロード (4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634062/69945e50-49a5-0adf-e5e2-8e96f647c872.png)
## 各6値に分類

```python
sample = im // 43 * 43 + 22
cv2_imshow(sample)
```
![ダウンロード (5).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634062/1882b2ec-0d2e-0eca-d0e1-f26482691465.png)
## 各8値に分類

```python
sample = im // 32 * 32 + 16
cv2_imshow(sample)
```
![ダウンロード (6).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634062/addfeed6-c1d4-02bb-ae17-4c2b1c25c45d.png)
各8値まで表現できるだけで、かなり画質が良いと言うのは驚きですね。

以上です。引き続き画像処理100ノックに取り組みましょう。
Windows10のPCで最初に行うことメモ

# はじめに
今回は初投稿ということもあり、会社で支給されたPCに対して最初に行う設定を自分用にメモしました。
至らない点あるかもしれませんが、多めにみてやってください。
追加でこんな設定すればいいよみたいなものあれば教えてください。

# 前提
- 現場が変わるとPCも変わることを想定しています。  
- 最近会社から個人用PCを支給されたので、上記前提は崩れるかも。。

# 作業用フォルダ作成
1. 全体作業用フォルダを１つ作成する  
大体は以下に作業用フォルダを作成します。  
できるだけそこで作業すればPC返却時に自分の痕跡が消しやすいと思います。  
`C://Users/username/work`
1. work配下のフォルダ名を固定化する  
私はいつも以下の形にしています。(それ以外はその時々に合わせる)

```
C://Users/username/work
├ 10_documents
├ 90_program_files
├ 91_program_data
└ 99_settings
　└ 99_shortcuts
```

# ショートカット格納フォルダの環境変数登録
- 先ほど作成した99_settings/99_shortcutsフォルダを環境変数PATHに登録します。  
これによってツールを自分流ショートカットで起動できるようになります**(超大事！)**

# エクスプローラの起動フォルダを変更
- エクスプローラのデフォルトがクイックアクセスになってしまっているので変更します。  
エクスプローラ > 表示 > オプション > 全般 > エクスプローラで開く を`クイックアクセス`から`PC`に変更

# タスクビューの非表示化
- Windowsキー + 矢印キーでウィンドウの整理をする際に表示されるタスクビューがうっとうしいため、表示しないようにします。  
設定 > システム > マルチタスク > ウィンドウをスナップしたときに横に配置できるものを表示する のチェックボックスをオフにします。

# 終わりに
閲覧いただいた方、ありがとうございました。
わかりにくい点などあればご教示ください。
できるだけ直します！
【rails】active_hash セレクトボックス作り方

# 目的
active_hashを使うと
セレクトボックスの選択肢を作る上で…
DBを使わずに、使うことができる。
![e45d5968e89b3a236c6a55a3f25b2777.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628336/873419f5-fab3-9ce1-e647-aa5bb5ac1569.gif)

# 準備


1.Gemfileに以下を記述する。

```
gem 'active_hash'
```

下記と合わせてサーバの再起動も行う

```
$ bundle install
```

準備はこれだけ

# 実装例
itemsテーブルにregion_idカラムを用意して、itemの登録の時にregion(発送元の地域)をアクティブハッシュから選択する。(下のgifのようなイメージ)
![e45d5968e89b3a236c6a55a3f25b2777.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628336/873419f5-fab3-9ce1-e647-aa5bb5ac1569.gif)


## 1.早速下記コマンドでitemsテーブルにregion_idカラムを用意

```ruby:コンソール
rails g model Item region_id:integer name:string
rake db:migrate
```


## 2.Active_Hash::Baseを継承しているモデルを作成する。(app/modelsの中にファイル作成)

```app/models/region.rb

class Region < ActiveHash::Base
 include ActiveHash::Associations
  has_many :items
  self.data = [
    {id: 1, name: '北海道'}, {id: 2, name: '青森県'}, {id: 3, name: '岩手県'},
    {id: 4, name: '宮城県'}, {id: 5, name: '秋田県'}, {id: 6, name: '山形県'},
    {id: 7, name: '福島県'}, {id: 8, name: '茨城県'}, {id: 9, name: '栃木県'},
    {id: 10, name: '群馬県'}, {id: 11, name: '埼玉県'}, {id: 12, name: '千葉県'},
    {id: 13, name: '東京都'}, {id: 14, name: '神奈川県'}, {id: 15, name: '新潟県'},
    {id: 16, name: '富山県'}, {id: 17, name: '石川県'}, {id: 18, name: '福井県'},
    {id: 19, name: '山梨県'}, {id: 20, name: '長野県'}, {id: 21, name: '岐阜県'},
    {id: 22, name: '静岡県'}, {id: 23, name: '愛知県'}, {id: 24, name: '三重県'},
    {id: 25, name: '滋賀県'}, {id: 26, name: '京都府'}, {id: 27, name: '大阪府'},
    {id: 28, name: '兵庫県'}, {id: 29, name: '奈良県'}, {id: 30, name: '和歌山県'},
    {id: 31, name: '鳥取県'}, {id: 32, name: '島根県'}, {id: 33, name: '岡山県'},
    {id: 34, name: '広島県'}, {id: 35, name: '山口県'}, {id: 36, name: '徳島県'},
    {id: 37, name: '香川県'}, {id: 38, name: '愛媛県'}, {id: 39, name: '高知県'},
    {id: 40, name: '福岡県'}, {id: 41, name: '佐賀県'}, {id: 42, name: '長崎県'},
    {id: 43, name: '熊本県'}, {id: 44, name: '大分県'}, {id: 45, name: '宮崎県'},
    {id: 46, name: '鹿児島県'}, {id: 47, name: '沖縄県'}
]
end
```
##3.Itemモデルに記述

```item.rb
class Item < ApplicationRecord
  # アクティブハッシュ
  extend ActiveHash::Associations::ActiveRecordExtensions
  belongs_to_active_hash :region
end
```
##4.フォーム例(ビュー作成)

```_form.html.haml
= form_for @item do |f|
  .new-wrapper__main__title.spacing
    発送元の地域
    %span.require 必須
   = f.collection_select :region_id, Region.all, :id, :name,{prompt: "選択してください"}, {class: "new-wrapper__main__input-select"}
```

# 参考文献
https://qiita.com/YJ2222/items/c2eaada06c99c051e151
https://qiita.com/Toman1223/items/8633142312bfa886d50b
Kubernetes基礎(2)：VM vs Container

#VM vs Container
###1. VMとContainer仮想化ソリューションの種類
<img width="960" alt="vm_container.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519254/7d501f23-f2bc-12c3-225f-0284075322bf.png">
Containerを仮想化させてくれるソリューションの中ではDockerを最も多く使用している。
###2. Container仮想化
<img width="960" alt="vm_container2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519254/d42d7afc-246d-897c-d948-588544a27059.png">
DockerがContainerを作ってくれる。
Linux6、7のようにバージョンによって、デフォルトでインストールされるライブラリが違う。
Linux6で開発完了したシステムをLinux7で起動をさせると、バージョンの違い等による問題が発生するだろう。
Linux6にDockerをインストールしてA Serviceのイメージを作ることができる。
イメージには、A Serviceとそのサービスが実行されるために必要なライブラリが一緒に入っている。
Linux7のバージョンに、DockerがインストールされていればLinux6環境のA ServiceのイメージからContainerの作成ができ、A Serviceの実行ができる。
A Serviceは自分の環境の中にあるOpenStack Library等を使うため、Linux7の環境でもシステムを実行することができる。
###3. Container資源隔離技術
<img width="960" alt="vm_container3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519254/30367010-a3ca-1520-59de-08449821a748.png">
Dockerは、複数のContainer間でホストのリソースを分離して使えるようにしてくれる。
Linux技術の「cgroup」と「namespace」を使うことで可能になった。
・namespace：カーネルに関連した領域を分離をしてくれる。
・cgroup：リソースの領域を分離をしてくれる。

DockerのようなContainer仮想化ソリューションは、OSが提供するリソースの分離技術を利用してContainerという単位でサービスを分離できるようにしてくれる。
これを使うとContainer仮想化ソリューションがインストールされているOSでは、開発環境を気にせずにDeployが可能になる。
###3. メリット&デメリット
<img width="960" alt="vm_container4.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519254/03fbabc4-f43a-0be3-29e0-70c5daccdece.png">
<b>処理速度</b>
　Containerのメリットはシステム構造的に、単一のOSを共有する概念であり、VMはそれぞれのOSを立ち上げるため、
　Containerのほうが速い。
　デメリットは、VMはWindowsを使っていてもGuest OSにLinuxをインストールして使うことができる。
　Containerは、Linuxの上にWindowを使うことができない。
<b>Security</b>
　SecurityのほうもVMは1つのGuest OSに問題が発生しても、他のGuest OSやHost OSとは完全に分離されているので、
　影響はないが、Containerは、1つのContainerに問題が発生してOSの領域に不正アクセスされてしまうと、
　他のContainerにも影響が及ぶ。
salesforceのフローでレコードの複数一括作成方法(forループ作成)

フローにはコレクションループはあるのですがforループのようなループ要素がないため
Aオブジェクトのレコードが更新されたときにBオブジェクトのレコードを今月は何件作るというような
動的に件数を指定してレコードを作ることが若干難しい気がします。

たまに使うたびに決定要素と割り当て要素で構築していますが備忘として以下にまとめておきます

###全体像
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387742/6db1411b-e03f-7008-2b7b-7e1281aa7b8c.png)

流れとしては
①で実行回数を決定して変数に格納
②でループが何回処理されたかを確認して
==①で指定した回数以下であれば
③でループを実行した回数を変数に設定（カウント）
④でループの中で実行したい処理（例えばレコード変数の作成など）を実行
②に戻ります
==①で指定した回数実行していた場合
⑤でループ後の処理を実行（例えばレコードの作成要素を実行）
といった感じです


各要素
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387742/93995e3d-a75d-5e80-1dbb-cb0a0535248a.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387742/9299e177-e39c-2b4c-1b53-e6fea4fed392.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387742/5913a16d-0816-a42d-7c79-aebe44eb0113.png)


作成した変数
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387742/108a1c00-5fd1-8d23-d677-8d3f305e7082.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387742/90d0305a-b036-a4cb-70fe-1c47dc084aea.png)



レコード作成だとこんな感じです
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387742/e8025fa1-c11f-a35a-e1fb-3a758c11649b.png)
railsでsidekiq-schedulerを動かす

[公式](https://github.com/moove-it/sidekiq-scheduler)のUsageはrailsで動かす前提じゃなかったので、railsで動かす場合のUsage的な何か。

* 0. ばーじょん

```ruby:Gemfile.lock
    rails (6.0.1) 
    sidekiq (6.0.7)
    sidekiq-scheduler (3.0.1)
```
* 1. Gemfile書く

```ruby:Gemfile
gem 'sidekiq-scheduler'
gem 'sinatra', require: false # ダッシュボードいらない場合はいらない
```
* 2. 初期設定を書く

[herokuで動かす場合は環境変数に設定しておくこともできる](https://github.com/mperham/sidekiq/wiki/Using-Redis#using-an-env-variable)ので、その場合はなくても構わない、多分。

```ruby:config/initializers/sidekiq.rb
Sidekiq.configure_server do |config|
  config.redis = { url: ENV.fetch('REDIS_URL') { 'redis://localhost:6379' } }
end

Sidekiq.configure_client do |config|
  config.redis = { url: ENV.fetch('REDIS_URL') { 'redis://localhost:6379' } }
end
```
* 3. ジョブを作る

`app/jobs/`内に作る。`ApplicationJob`を継承していれば自動的に`sidekiq-scheduler`がジョブとして認識してくれる。[ここ参照](https://github.com/moove-it/sidekiq-scheduler#activejob-integration)

```ruby:app/jobs/hello_world_job.rb
class HelloWorldJob < ApplicationJob
  def perform
    puts 'test'
  end
end
```

* 4. ジョブを登録する

こっちの拡張子は`yml`ですよ。

```ruby:config/sidekiq.yml
:schedule:
  hello_world:
    every: '1m'
    class: HelloWorldJob
```

* 5. ダッシュボード見れるようにする

```ruby:config/routes.rb
require 'sidekiq/web'
require 'sidekiq-scheduler/web'

Rails.application.routes.draw do
  mount Sidekiq::Web, at: "/sidekiq"
end
```

これで http://localhost:3000/sidekiq のURLでsidekiqのダッシュボードが見れるようになる。

* 6. sidekiq動かす

`rails s`とは別プロセスで動かす必要がある。

```sh
$ bundle exec sidekiq
```

こんな感じで見れたら成功。

<img width="1439" alt="_DEVELOPMENT__Sidekiq.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/157051/c3c5b5ed-402d-9236-e039-454d4c4ee0f8.png">
ミライシードの答えを開示するやつ

# すること
ミライシードっていうベネッセが学校に無料開放しているやつを改造してみた
具体的には，ドリルパークの国語以外で答えが見られるようになる．
# Tampermonkeyの導入
面倒くさいので下の記事を参照してください
http://kbtools.web.fc2.com/gm_install.htm
※古いですがChrome以外のブラウザも乗っているのでわかりやすいです
# コード
```
// ==UserScript==
// @name         miraiseed open the answer
// @namespace    http://tampermonkey.net/
// @version      0.4
// @description  try to take over the world!
// @author       Tom1022
// @match        https://miraiseed.benesse.ne.jp/seed/*/drill
// @match        https://miraiseed.benesse.ne.jp/seed/*/drillResume
// @match        https://miraiseed.benesse.ne.jp/seed/*/restart
// @grant        none
// ==/UserScript==

for (let i = 0; i < $('div.main_cont')[0].children[0].children[0].children.length - 2; i++) {
	toggleExpound(i);
}
```
# 解説
2～5行目はこのコードの説明的なやつ
6～8行目は特定のページで動くようにする設定
for文のところで問題数を取り出す
`toggleExpound(i);`のところでcssのやつの関数を呼び出す．
# リンク
https://greasyfork.org/ja/scripts/403275-miraiseed-open-the-answer
Ubuntu 20.04のNginxでバーチャルホスト設定

Nginxの一台で複数のドメインのバーチャルホストを設定する方法を説明します。
今回は例として設定対象ドメインは[fx.askbox.net](https://fx.askbox.net)と[stocks.askbox.net](https://stocks.askbox.net)とします。

# Ubuntu 20.04にnginxをインストール
```sh
$ sudo apt update
$ sudo apt upgrade
$ sudo apt install nginx
```

# nginxのバージョンの確認
```sh
$ nginx -v
nginx version: nginx/1.17.10 (Ubuntu)
```

# NginxでBasic認証
```sh
$ sudo printf "user_name:$(openssl passwd -crypt password)\n" >> /etc/nginx/.htpasswd
```

# fx.askbox.netドメイン設定ファイルの確認
```sh
$ sudo cat /etc/nginx/sites-available/fx.askbox.net
server {
        listen 80;
        listen [::]:80;

        server_name fx.askbox.net;

        access_log  /var/log/nginx/fx.askbox.net-access.log;
        error_log  /var/log/nginx/fx.askbox.net-error.log;

        root /var/www/fx.askbox.net;
        index index.html;


        # 認証領域の説明(名前)
        auth_basic "Only Member";
        # Basic認証のユーザー・パスワードのファイル
        auth_basic_user_file /etc/nginx/.htpasswd;

        location / {
                try_files $uri $uri/ =404;
        }
}
```

# stocks.askbox.netドメイン設定ファイルの確認
```sh
$ sudo cat /etc/nginx/sites-available/stocks.askbox.net
server {
        listen 80;
        listen [::]:80;

        server_name stocks.askbox.net;

        access_log  /var/log/nginx/stocks.askbox.net-access.log;
        error_log  /var/log/nginx/stocks.askbox.net-error.log;

        root /var/www/stocks.askbox.net;
        index index.html;

        location / {
                try_files $uri $uri/ =404;
        }
}
```

# バーチャルホスト設定の有効化
作成した2ドメインの設定ファイルのシンボリックリンクをsites-enabledディレクトリに張ります。

```sh
$ sudo ln -s /etc/nginx/sites-available/fx.askbox.net /etc/nginx/sites-enabled/fx.askbox.net
$ sudo ln -s /etc/nginx/sites-available/stocks.askbox.net /etc/nginx/sites-enabled/stocks.askbox.net
```

# 設定ファイルのシンタックスチェック
```sh
$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
```

# サービスのリロード
```sh
$ sudo systemctl reload nginx
```

# ログファイルの確認
```sh
$ sudo tree /var/log/nginx/
/var/log/nginx/
├── access.log
├── fx.askbox.net-access.log
├── fx.askbox.net-error.log
├── error.log
├── stocks.askbox.net-access.log
└── stocks.askbox.net-error.log

0 directories, 6 files
```


# Ubuntuのバージョンの確認
```sh

$ uname -a
Linux ip-172-31-8-191 5.4.0-1009-aws #9-Ubuntu SMP Sun Apr 12 19:46:01 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux

$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=20.04
DISTRIB_CODENAME=focal
DISTRIB_DESCRIPTION="Ubuntu 20.04 LTS"

$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 20.04 LTS
Release:        20.04
Codename:       focal
```