OmniAICreator/Qiita-1.07M huggingface dataset:
QiitaAPIを使って指定タグの全記事リストを作る

# やりたいこと
気になったタグでのおすすめ記事がなかなか見つからないので、
特定タグでLGTMの多い記事を抽出できるようにする。

# 準備
linux上で、jqが使えること。

# 手順

例でタグは「新人プログラマ応援」としてます。
https://qiita.com/tags/%e6%96%b0%e4%ba%ba%e3%83%97%e3%83%ad%e3%82%b0%e3%83%a9%e3%83%9e%e5%bf%9c%e6%8f%b4?page=1

## step０ タグの記事数を確認
上記リンクより、2021/4/9時点、2609件
QiitaAPIの仕様で１００件が最大なので、取得処理が２７回必要そう。

## step1 ターミナル起動
## step2 シェル起動
```ターミナル上
./get_tags.sh
```

```get_tags.sh
#!/bin/zsh
# qiitaから対象タグの全記事一覧取得する
for (( i=1; i<=27 ;i++ ))
do
  ss="curl 'https://qiita.com/api/v2/tags/新人プログラマ応援/items?page=${i}&per_page=100' | jq '.[] | { likes_count: .likes_count, title: .title, url: .url}' >> tags_all.json"
  eval $ss
done 
# sort 降順
jq 'sort_by(.likes_count) | reverse' --slurp tags_all.json  > ranking_all.json
# end
```

## step３ ファイルをみる

```ranking_all.json
[
  {
    "likes_count": 9160,
    "title": "ロシアの天才ハッカーによる【新人エンジニアサバイバルガイド】",
    "url": "https://qiita.com/jacksuzuki/items/b2fa6b44962e73a53d08"
  },
  {
    "likes_count": 5731,
    "title": "AtCoder に登録したら次にやること ～ これだけ解けば十分闘える！過去問精選 10 問 ～",
    "url": "https://qiita.com/drken/items/fd4e5e3630d0f5859067"
  },
  {
    "likes_count": 4755,
    "title": "エンジニアの情報収集法まとめ",
    "url": "https://qiita.com/nesheep5/items/e7196ba496e59bb2aa28"
  },
 ...
  }
]
```

## Appendix LGTMの件数でフィルターをしたいとき
LGTM>100以上でフィルタの例

```
jq '.[] | select(.likes_count > 100)' ranking_all.json  > ranking_over100.json
```

## 修正版シェルスクリプト
1. 出力ファイル名にタグ名と日付(YYYY-MM-DDT形式)を追加
2. 投稿記事数から取得するページ数計算を追加 
 （認証なしだと、１時間あたり６０APIコールの制限にひっかかりやすくなってます＿φ(￣ー￣ )

```get_tags_v2.sh
#!/bin/zsh
# 出力ファイル名を設定
TAG_ID='新人プログラマ応援'
DATE_NOW=`date +%Y-%m-%dT`
TAGS_FILE="tags_${TAG_ID}_${DATE_NOW}.json"
RANKINGFILE="ranking_${TAG_ID}_${DATE_NOW}.json"
echo "TAGS_FILE=${TAGS_FILE}, RANKINGFILE=${RANKINGFILE}"

# qiitaから対象タグの記事数を取得する
curl "https://qiita.com/api/v2/tags/${TAG_ID}" | jq '.' > tags_detail.json
ITEM_COUNT=$(jq '. | .items_count'  tags_detail.json)
PAGE_COUNT=$(( $(( $ITEM_COUNT + 99 )) / 100 ))
echo "ITEM_COUNT=${ITEM_COUNT}, PAGE_COUNT=${PAGE_COUNT}"

# qiitaから対象タグの全記事一覧取得する
cp /dev/null ${TAGS_FILE}  # ファイルを空にしておく
for (( i=1; i<=${PAGE_COUNT} ;i++ ))
do
  ss="curl 'https://qiita.com/api/v2/tags/${TAG_ID}/items?page=${i}&per_page=100' | jq '.[] | { likes_count: .likes_count, title: .title, url: .url}' >> ${TAGS_FILE}"
  eval $ss
done 
# sort 降順
jq 'sort_by(.likes_count) | reverse' --slurp ${TAGS_FILE}  > ${RANKINGFILE}
# end
```
### githubレポジトリ 
https://github.com/YossyIto/qiita_tag_items

# 参照リンク
Qiita API v2の仕様
https://qiita.com/api/v2/docs

Qiita API v2の仕様(特定タグの記事リスト）
https://qiita.com/api/v2/docs#get-apiv2tagstag_iditems

jq(manual)
https://stedolan.github.io/jq/manual/

jq コマンドを使う日常のご紹介
https://qiita.com/takeshinoda@github/items/2dec7a72930ec1f658af

eval(man)
https://man7.org/linux/man-pages/man1/eval.1p.html

[メモ] Qiita: 投稿記事の閲覧数をコマンドラインで取得
https://qiita.com/mt08/items/57411d9618725d58a41f

PythonでQiita APIを叩いて初心者向け記事を一覧取得したあと、神記事たちを参拝していく
https://qiita.com/yaboxi_/items/97e78831741d02091e0d

---
Railsコマンド

###ターミナルで使うRailsコマンドをまとめました。  

####1. 新しいプロジェクトの作成
```$ rails new アプリ名　オプション```
このコマンド1つでアプリケーションの土台となるデータが一気に生成されます。
・主なオプション…
　-d mysql (DBをMySQLに指定)
　--skip-test(testを作成しない)
・Railsのバージョンを指定する場合
```$ rails _railsバージョン_ new アプリ名```  

####2. Gemのインストール
```$ bundle install```
Gemfileに追加されたGemをインストールします。  

####3. データベースの作成
```$ rails db:create```
【アプリ名_development】と【アプリ名_test】というデータベースが作成されます。  

####4. Modelの作成
例としてUserモデルを作成。※モデル名は大文字始まり単数形。
```$ rails g model User カラム名:データ型```
モデル名のモデルクラス、マイグレーションファイルが作成されます。
以下を実行して、テーブルを作成します。
```$ rails db:migrate```  

####5. カラムの追加、削除
例としてUserモデルにカラム名:content、データ型:textを追加
```$ rails g migration AddContentToUser content:text```
```$ rails db:migrate```  
例として上記追加カラムを削除
```$ rails g migration RemoveContentFromUser content:text ```
```$ rails db:migrate```  

####5. Controllerの作成
例としてUserコントローラを作成し、newとcreateアクションを追加します。
※コントローラ名は大文字始まり複数形。
```$ rails g controller Users new create```  

####6. Railsアプリをブラウザ表示
PCのWebブラウザでアプリを表示できます。
```$ rails s```  

####7. Rubyコードを実行
Railsの環境を読み込んだ状態でRubyコードを実行できます。
```$ rails c```  

他にもあれば随時追加していきます！
RailsでAPIを作成した時のテストコード

# APIのテストコードについて

今回初めてrailsでAPIの作成、そしてテストコードを実装しました。
以前アプリケーションを作成した時は、モデルの単体テストコードと結合テストコードを実装しました。
APIではリクエストとレスポンスのテストで想定するHTTPステータスコードとなるかをテストする為、また少し違ったやり方が必要との事だったので、まとめました。

今回テストするのはGET、POSTリクエストについてです。

#ステータスコード
今回出てきたHTTPリクエストです。

+ 200: リクエストが成功したことを示す
+ 201: POSTリクエストや、一部の PUT リクエストを送信した後のレスポンス
+ 404: 該当アドレスのページがない、またはそのサーバーが落ちている
+ 422: リクエストは適正だが、意味が誤っているために従うことができない


# 手順

#### ディレクトリの準備
テストはRSpecを使用します。
そしてspecディレクトリ直下にrequestsディレクトリ作成し、テストコードを実装していきます。

必要に応じてFactoryBot等の準備が必要ですが、ここでは省略します。

#### テストコードの実装(一部抜粋)  

```ruby:qiita.rb

JSON.parse(response.body)['errors']

```

リクエストでJSON形式でデータを送り、帰ったきたレスポンスもJSONで返ってくるAPIでのテストでよくある記述との事でした。
この記述がないとRubyが上手くデータを読み込めずにエラーが発生してしまいます。
['errors']の部分はエラーとして返されるかの確認する為に必要な記述


```ruby:qiita.rb

before do
  @search_categories = create_list(:category, 2)
  @ideas1 = create_list(:idea, 2, category_id: @search_categories[0].id)
  @ideas2 = create_list(:idea, 2, category_id: @search_categories[1].id)
end

```
今回は、入力した値を検索するテストをしたかった為、before_actionで予め値を用意しました。
create_listは、第一引数にファクトリの指定、第二引数で作成するインスタンスの数を指定します。
検索するカテゴリーを二つ、それに対応するアイデアを各２つ用意する内容です。
ideaには外部キー制約がある為、category_id:　@search_categories[0].idの記述が必要。

```ruby:qiita.rb

JSON.parse(response.body)['data']

```
GETリクエストを送った時に受け取ったresponse.bodyをJSON形式にして受け取る。

```ruby:qiita.rb
expect(data.length).to eq 2
```

受け取ったデータの数は２つ。

```ruby:qiita.rb
expect(data[0]['id']).to eq @ideas1[0].id
```
カテゴリー[０]には、@ideas1の[0]がちゃんと対応している

```ruby:qiita.rb
expect(response.status).to eq 200
```
今回はリクエスト、レスポンスのテストなので、HTTPステータスコードの確認
Javaでのプログラミングの手順

1.ソースコードを書き、ソースファイルとして保存
2.javacコマンドでコンパイルしてクラスファイルを作成
3.javaコマンドで実行

注意事項
大文字と小文字が違う文字として認識される
全角スペースを使わない
gem 'devise'導入時エラー

gemであるdeviseを導入しようとして初歩的なミスで起こりました。

ターミナルのアラートはこんな感じでした

```terminal
XXXXXXXXXXXXXXXXXXXX % rails g devise:install
Running via Spring preloader in process 18610
Could not find generator 'devise:install'. 
Run `rails generate --help` for more options.
```

次にエラー文にある「Sprin preloarder」について調べました
するとその人は
引用
>https://qiita.com/Hal_mai/items/350c400e8763ce0487a3

Gemfile内の記述を

```
gem 'devise'
```

を

```
gem 'device'
```

にしていたと気づいて訂正されたようです.

そこで私もGemfileを覗いてみると

なんと記載なし

記入がないのだからコマンドになっていない。
何をinstallするのやらあわてん坊な夕方でした
Rails 「redirect_to :back」 エラー解消

#【Rails 「redirect_to :back」 エラー解消】

Ruby on Rails 6で学習している際にこのエラーに遭遇。
自分なりの備忘録です。

##今回、エラーになった構文

ログイン機能を実装した際に、リダイレクトが出来なかった。

**「redirect_to :back」**で直前のページにリダイレクトしたかったが、エラーになった。
　→　Ruby on Rails 4以前のバージョンでの構文らしい。
　→　Ruby on Rails 6では使えないようだ。

```:Rails
　　redirect_to :back, flash: {
　　　　user: user,
　　　　error_messages: user.errors.full_messages
```

##エラーの対処法

Ruby on Rails 5以降では、下記のように変更する。
「redirect_back (fallback_location:)」が追加された。

自分は、下記のように変更した。
**「redirect_to :back」**→**「redirect_back fallback_location: root_path」**

[Railsガイド](https://railsguides.jp/5_0_release_notes.html#action-pack-%E9%9D%9E%E6%8E%A8%E5%A5%A8) 参照。「redirect_to :back」は非推奨である。


```:Rails
　　redirect_back fallback_location: root_path, flash: {
　　　　user: user,
　　　　error_messages: user.errors.full_messages
```

##おわりに

バージョンの違いでエラーに遭遇することがよくある。
エラーが出たら、Google検索などで冷静に対処していく。
自走力を身につけていこう。
イベントログのファイルを削除する方法

# 概要

ちょっと今Bluetoothを監視するアプリを作っていますが、そのためにイベントログを作成しました。
ただ、作成はできたものの、プログラム上からイベントログが消せないという問題に・・・。
今回はプログラムとかインフラとか全然違う話題です。メモですね。

## イベントログが消せない理由（想像）

想像ですが、イベントログはWindowsサービスの`Windows Event Log`がコントロールしているようです。
そのため、`Event Viewr`のプロパティでログのパスを得て、そこから管理者権限やセーフモードで消しても、削除時に拒否されるか、削除できても次の再起動時に復活します。（復活するのが不思議ですが、、、本当に復活します、、、）

## 削除手順

1. `EventViewr`で削除したいイベントソースのログパスを控えておいてください
1. Windowsサービスの`Windows Event Log`を`無効`にしてください
1. PCを再起動してください
1. `PowerShell`で`Get-EventLog -LogName "LogName" | Select-Object Source -Unique`を実行してください
1. `PowerShell`で`Remove-EventLog -LogName "LogName"`を実行してください
1. ログパスをもとにファイル`*.evtx`を削除してください
1. レジストリ`\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\EventLog`も削除
1. PCを再起動してください



うぇい
①クリックで要素を追加する ②追加した要素の和と、要素のすべてを配列的に表示する

```VB.NET
Public Class Form1
    '配列変数を宣言
    Dim arryNumber As New ArrayList

    '和を表示
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

        '和を計算
        Dim sum As Integer = 0

        '文字列として、空の変数を宣言
        Dim strMessage As String = ""
        For Each el As Integer In arryNumber
            sum = sum + el
            '宣言した変数strMessageに、追加した要素を連結する。それをループしていく
            strMessage = strMessage & CStr(el) & ", "
        Next

        '改めて、strMessageを「文字列の最後の文字を切り取って」宣言する
        '(こうすることで、不要なコンマを除ける→最後の", "を除いている)
        strMessage = strMessage.Substring(0, Len(strMessage) - 2)

        '結果を出力
        MessageBox.Show(strMessage & vbCrLf & sum)

    End Sub


    '要素を追加
    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click

        Dim Number As Integer = TextBox1.Text
        arryNumber.Add(Number)
        '→配列変数arryNumberに、追加した要素が入れられた

    End Sub

End Class


```
[Symbol Watcher]ノードの委任ハーベスターの変動をメールかSlackで通知する機能を追加しました

![スクリーンショット 2021-04-09 15.48.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42874/6e1c77bb-e8c7-9488-be4c-514a7f098ed1.png)

# はじめに
Symbolノーダーのみなさんこんにちわ

この間[ハーベストの通知機能](https://qiita.com/raharu0425/items/18bcbe261b734bc2054b)を作成したのですが、思いの外使っていただき、現在80アカウント程度の方が使ってくれています！
ありがとうございます！

前回はハーベストを行う全ての人にむけたツールだったのですが、今回はノードを建てた人（ノーダー）さん用のツールを作ってみました。

かくいう私もGCP上でSymbolノードを立てたのですが現在10人（内2人は自分）となかなか苦しい状況が続いておりますw
毎日unlockedaccountを確認して、増えてない事を確認していましたが、
そろそろ見るのが面倒になってきたのでツールを作成しました

良かったお使いください

ツールはこちら -> [SymbolWatcher](https://symbol-tool-sesp4y4epa-an.a.run.app/symbol/Node/notification)

# 使い方

## ノードと通知先を入力

使い方はすでにハーベストの通知機能を使ってくれている方であれば簡単です
![スクリーンショット_2021-04-09_15_48_24-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42874/bab34a47-7675-eae7-5f26-90e8d797a236.png)
自分のノードのIPアドレスかドメインを入力してください、
1メールアドレス or 1SlackURLに対して３つまでノードを登録することができます


## 通知先のメールアドレスかSlackURLに認証メッセージがとどきます

### メール認証
![スクリーンショット_2021-04-09_15_49_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42874/61124364-3b82-926e-6ee4-04673263de8f.png)

### Slack認証
![スクリーンショット_2021-04-09_15_49_20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42874/d493918e-a2e8-42d8-5cf2-41d463f32dfb.png)


## 認証完了画面
![スクリーンショット 2021-04-09 15.50.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42874/c37adb32-a402-d927-be85-ab359eeb2450.png)

これで通知が届くようになりました

## 通知

### メール通知
![スクリーンショット 2021-04-09 15.52.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42874/122a6f69-f068-0b01-7605-7294802251b3.png)

### Slack通知
![スクリーンショット_2021-04-09_15_54_24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42874/7655b2a8-48e8-badc-13de-929a264022b5.png)

通知内容は委任者数、増えたアカウント、減ったアカウントです
通知をとめたい場合はリンクをクリックしてください

# 最後に
私のノードは
GCP上に CPU 8コア RAM 32GB SSD 750GBとなかなかの高スペックで作成してあります！
バージョンも常に最新でHttps対応もしています！

ちなみに月3万位このサーバーを維持するのにかかります（笑
このままだと赤字なので委任者を大募集しています！！w

ドメイン: raharu-symbol-node-01.com
アカウント情報： https://raharu-symbol-node-01.com:3001/node/unlockedaccount
接続peer： https://raharu-symbol-node-01.com:3001/node/peers

リストに表示されないよ！とかありましたらご連絡ください
https://qiita.com/raharu0425/items/1f11654dee1f129337c2

ノーダーさんとSymbolの普及の一助になれば幸いですm(_ _)m
[2021年最新版]GitHubのリポジトリの公開範囲設定について

#はじめに
GitHubでは、今まで有料プランのみのオプションだったプライベートリポジトリの作成が2019年に無料となり、また2020年にはプライベートリポジトリへのコラボレーター招待も無制限に可能となりました。
古い記事だとこの辺の情報のアップデートができていないので自分の備忘録も兼ねて書き留めておきたいと思います。

#既存の公開リポジトリをプライベートに変更する
まず、既に作成してあるパブリック(公開)リポジトリをプライベート設定にする方法です。

1. 設定したいリポジトリのトップページを開く。
2. code, issues, pullreq...と並んでいる上のタブの右端にある*Settings*を開く。
3. *Options*の画面を一番下までスクロールし、赤い枠で囲われた*Danger Zone*の一番上にある*Cahnge repository visibility*から*Change visibility*ボタンを押す。
4. そして*Make private*を選択しconfirmする。

これでリポジトリがプライベート設定になりました。

#プライベートリポジトリに招待する
次に、上の手順で非公開にしたリポジトリへ他の人(特定のアカウント)を招待する方法です。

1. 上の手順の2までは同じ流れ。リポジトリの画面から*Settings*を開く。
2. 今度は左の欄から*Manage access*を選択し、*Invite a collaborator*のボタンを押す。
3. 招待したい(ソースコード等を共有したい)人のgithubアカウントを入力。

これで完了です。
初心者がまとめるオブジェクト指向

<p>プログラミングをやっているといると、良く耳にするオブジェクト指向というワードなんとなく理解していたが、アウトプットも兼ねて記事にまとめてみることにしました。</p>
<h2>オブジェクト指向とは</h2>
<p>プログラミングをわかりやすく、効率的に書く書き方と考えで、<font color="green">クラス</font>単位でコードを書くことです。</p>
<p>オブジェクト指向を最低限理解するのに必要なワードは''4つ''です</p>
<ul>
<li><font color="red">プロパティ</font></li>
 <li><font color="blue">メソッド</font></li> <li><font color="green">クラス</font></li>
  <li><font color="purple">インスタンス</font></li>
</ul>
<h2>ワード解説</h2>
<p><font color="red">プロパティ</font>(変数)とは、必要な値のこと<br>
<font color="blue">メソッド</font>(関数)は、必要な処理のことです。<br>
注:クラス内の変数と関数は、プロパティとメソッドと呼ばれます<br>
そして<font color="green">クラス</font>(設計図)は、プロパティとメソッドをまとめたものです。<br>
<font color="purple">インスタンス</font>は、物そのものです</p>
<p>ドラえもんで例えると<br>
ドラえもんの赤い鼻などのパーツが、<font color="red">プロパティ</font><br>
ドラえもんが秘密道具を出すや歩くなどの処理を、<font color="blue">メソッド</font><br>
それらをまとめた設計図を、<font color="green">クラス</font><br>
ドラえもんが<font color="purple">インスタンス</font>ということです</p>
<p>自分が勉強しているlaravelでも、オブジェクト指向の考えで書かなければいけません</p>
<pre>
class PhotoPostController extends Controller
{
 public function store(Request $request){
   $member = new Photo_post();
        $member->user_id = $request->user_id;
        $member->medical_factory_id = $request->medical_factory_id;
        $member->medical_subjects = $request->medical_subjects;
        $member->note = $request->note;
        $member->prescription_date = $request->prescription_date;
        $member->photo = $filename;
        $member->save();
        return redirect('/');
    }

}
</pre>
<h2>オブジェクト指向のメリット</h2>
<p>機能の追加・改善がしやすいことです。</p>
<p>たとえばLINEのタイムラインにBAD機能を追加するときは<br>
タイムラインの<font color="green">クラス</font>に、BAD数の<font color="red">プロパティ</font>を追加して<br>
BADを投稿する<font color="blue">メソッド</font>を書いてやれば動くことができます。</p>
<p>しかしオブジェクト指向じゃない考え方で書くと<br>
世界中のタイムラインに<br>BAD数とBADを投稿する機能を書いていく必要があり
非常に面倒になります。</p>
react-scripts: command not found

## 事象

```shell:Terminal
$ react-scripts start
/bin/sh: react-scripts: command not found
error Command failed with exit code 127.
```

## 対策1:
参考 : [急に yarn が使えなくなった!? react-scripts: command not found](https://qiita.com/kskumgk63/items/bde9178ec7f8d1880ecd)

```shell
cd プロジェクトのルートディレクトリ
rm -rf node_modules
npm install
```

## 対策2:
対策1で解決しなかった場合

```shell
cd プロジェクトのルートディレクトリ
npm i react-scripts 
```

or

```shell
cd プロジェクトのルートディレクトリ
yarn add react-scripts
```
PHP　SQLインジェクションについて　と　クロスサイトスクリプティング（XSS)　について

#似たようなイメージを持っていたがどう違うのか考察

##SQLインジェクションについて
####SQLインジェクション攻撃とは、SQLクエリの一部に不正なパラメーターを含めることで意図しない操作を実行させる攻撃手法のこと。
これによって起こる脅威

- 非公開の情報が閲覧される
- データの削除 / 改ざん / 停止
- 認証の回避による不正ログイン

などなど

###対策
####プリペアードステートメントを使用する
**プリペアードステートメント：準備された文という意味。SQLの一種のテンプレートのようなもの**
検索条件や更新する値のみが異なるようなSQL文を何度も実行する場合、その値をパラメータ化することで同じSQL文を繰り返し利用することが可能。
この時のpらメータは、プレースホルダとして指定する。

**プレースホルダ**
文字列の一部を他の文字列に置き換える機能
SQL文の一部のパラメータに可変の値として「？」や「:○○」といった特別な文字列を埋め込みSQL文の雛形を作成。実行の段階でパラメータを与えることで値をSQL文と切り離して安全活用できる。

###PHPで（PDO）でプリペアードステートメントを使用する方法

- prepare()メソッドによってクエリのパース（SQL文の準備）を行う。
上述の「？」や「:○○」を使用（この時にbindpram()やbindvalue()を使用する）

- execute()メソッドによってプレースホルダに代入すべき値を指定し、プリペアードステートメントを実行する。

##クロスサイトスクリプティング攻撃（XSS)について
###XSSとは悪意のあるユーザーがHTMLのタグやJavascriptを含むフォームデータをWebサーバーに送信することでWebサーバに意図しないページの生成や動作をさせるもの。
簡単な例）```<script>alert('hoge')</script>```などのタグをフォームに送信されるなど
###対策
ユーザーから送られたデータをそのまま処理しないよう以下の関数を実行する

- strip_tags()：文字列からHTMLタグを取り除く
- htmlentities() ：特別なHTML文字をエンコードする
- htmlspecialchars()
![スクリーンショット 2021-04-09 16.08.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/670884/ae5e0235-83e6-4820-8a58-512630a2497d.png)
Herokuでデプロイした際にApplication errorが出た　(本番環境でDB導入設定方法)

Herokuでデプロイしたら `Application error` になったので
 `$ heroku logs --tail` を実行してみると以下のエラーが表示されました。

```
 heroku[router]: at=error code=H10 
...
...
```

エラーの詳細内容を確かめるために以下を実行してHeroku上でコンソールを開きます。

```
$ heroku run rails c
```

すると一番下に以下が表示されました。

```
Cannot load database configuration: (RuntimeError)
Could not load database configuration. No such file - ["config/database.yml"]
```

herokuにアプリケーションをデプロイする時のDB導入設定をしていないからかもしれないと考え、DB導入設定をしてみました。

#DB導入設定方法

##本番環境でPostgleSQLを使用するよう設定する。
今回は、
開発環境では `mysql2`
本番環境では `PostgleSQL`
を使用するので以下のように `Gemfile` を書き換え、　`bundle install` します。


```:Gemfile
gem 'mysql2', group: [:development, :test]
gem 'pg', group: :production
```

##database.ymlを設定する。

```
$ heroku config
```

`DATABASE_URL` が表示されなければ以下のコマンドでアドオンを追加してから、 `heroku config` を実行します。

```
$ heroku addons:create heroku-postgresql:hobby-dev
```

次に、 `database.yml` に追記します。

```:database.yml
production:
  <<: *default
  adapter: postgresql
  database: db/production.postgresql
  url: <%= ENV['DATABASE_URL'] %>
```

##Herokuにデプロイする。

```
$ git push heroku master
```


##マイグレーションを実施する。

```
$ heroku run rake db:migrate
```

私の場合はこれで解決できました。
Tableau  タイムスタンプ型のデータから「10分ごと」の計算フィールドをつくる

Tableauでタイムスタンプ型の列をもつ時系列データに対し、以下のようなことをしたい、という場合の数式です。
0分から9分を0分、10分から19分を10分としてまとめる計算フィールドを作り、あとで可視化で使用します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1298486/f4783da7-71cd-20e1-d82a-f2bc808b10b7.png)

計算フィールド内で使用している項目は以下の通りです。
　「テスト時間」＝タイムスタンプ型フィールド
　「何分刻み？」＝整数型パラメータ（リストにして10か15か選択できる）

```
MAKEDATETIME(
    date([テスト時間]),
    MAKETIME(
        DATEPART("hour",[テスト時間]),(CEILING(([分]+1)/[何分刻み？])-1)*[何分刻み？],0
    )
)
```


これは検算用のシートですが、本来は地図上にマッピングするIoTデータを想定しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1298486/ca3b447e-0c97-c7c1-50fa-8312605f279c.png)


作成段階では一個ずつ「分を取る」「分とパラメータを使って10刻みにする」「日付とつなげる」等の計算フィールドを作って、それぞれを使って組み立てました。
一発で書こうとするとこんな感じですが、ご自身で作成されるときは順番に作っていくことをお勧めします。

分をまとめる、10分ごと、等のキーワードで検索すると、Excelだといくつかヒットしたのですが、Tableauでは全然ヒットしなかったので記事にしてみました。
【VBA】クリックしたセルの色を変える方法

今回は、クリックしたセルの色を変える方法です。

何に使えるの？？って感じですが、書いていきますw

↓実演動画
https://youtu.be/TNX0Du5tvKE

今回は、シート名の右クリックして、「コードの表示」をクリックしてください。
今回は、その中にコードを書いていきます。
![コードの表示.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1242278/9c9fa4ab-1f49-0073-7263-200fc9ab970f.png)


ソースコードは下記の通りです。

```

'ダブルクリックの処理
 Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
 
    Target.Interior.Color = vbRed
 
 End Sub
 
  '右クリックの処理
 Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
 
    Target.Interior.Color = vbGreen
 
 End Sub

'左クリックの処理
Private Sub Worksheet_SelectionChange(ByVal Target As Range)

    If Target.Column > 9 Then Exit Sub
    
    Select Case Target.Interior.ColorIndex
    Case Is = xlNone
        Target.Interior.ColorIndex = 5
    Case Else
        Target.Interior.ColorIndex = xlNone
    End Select

End Sub

```

詳細を説明します。

①ダブルクリックの判定

>Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)

ダブルクリックの判定には、「Worksheet_BeforeDoubleClick」プロシージャを使用します。

Worksheet_BeforeDoubleClickについては、下記のサイトが参考になると思います。
https://vbabeginner.net/detect-cell-double-clicks/

>Target.Interior.Color = vbRed

Targetには、ダブルクリックされたセルの位置が入っていますので、そのセルの色を赤色に変更しています。

②右クリックの判定

>Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)

右クリックの判定には、「Worksheet_BeforeRightClick」プロシージャを選択します。

Worksheet_BeforeRightClickについては、下記のサイトが参考になると思います。
https://vbabeginner.net/worksheet_beforerightclick/

>Target.Interior.Color = vbGreen

Targetには、右クリックされたセルの位置が入っていますので、そのセルの色を緑色に変更しています。

③左クリックの判定
>Private Sub Worksheet_SelectionChange(ByVal Target As Range)

左クリックの判定には、「Worksheet_SelectionChange」プロシージャを使用します。

Worksheet_SelectionChangeについては、下記のサイトが参考になると思います。
http://www.excel.studio-kazu.jp/mag2/backnumber/mm20040727.html

>If Target.Column > 9 Then Exit Sub

これは、反映する範囲を制御するために書いてます。
列の10行目以降のセルを選択した場合は、処理を終了しています。

```

Select Case Target.Interior.ColorIndex
    Case Is = xlNone
        Target.Interior.ColorIndex = 5
    Case Else
        Target.Interior.ColorIndex = xlNone
End Select

```

Case文で、クリックしたセルが塗りつぶし無しであれば、ColorIndexで番号を指定して色を変更し、それ以外であれば、塗りつぶし無しに変更しています。

以上が、クリックしたセルの色を変える方法でした。
サーバーとWeb API

https://qiita.com/akari_0618/items/89070d6bee478c8ada4c

![IMG_1142.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1033397/659140d9-8f5a-10ea-7bcc-87a65a879a83.jpeg)



#Webサーバーとは
AさんがWebサイトを作っていました。ただ、今Aさんが作っているWebサイトは、Aさんのパソコンの中だけの話になっていますので、それを見れるのはAさんだけになります。
AさんはそのWebサイトをみんなに見てほしいと思います。
そこで使うのが”サーバー”です。
サーバーは、頭がいい人が作ってくれたネットワークだと思おっていてください。
イメージとしては、自分で作った家を誰かに住んでもらうために土地を借りるような感じです。
なので、無料で借りられるものもありますが、月々使用料金を支払います。
AWSはクラウドというまた違う分類になります。
サーバーの種類はいくつかあります。.Apache,GoogleWeb Serverなどがあります。

そして、このサーバーの中にHTTPという規約のようなものがあります。
このHTTPに関してはあまり深い意味はないのですが、サーバーを作るための手段だと思ってください。（あるのかもしれないけど）

そしてこのサーバーの中でサーバーとクライアント（パソコン）のやり取りを行います。
この関係をクライアント・サーバーといいます。

クライアントが、クリックして画像を見せてってクリックしたとしましょう。これをHTTPリクエストといいます。そして、リクエストを受け取ったサイトはサーバーに情報を渡します。情報を受け取ったサーバーはこれかな？っと写真を取り出してクライアントに戻します。
ちょっとわかりにくいので最後図式化します。

で、HTTPの中には、その他にも様々なサービスがあります。ヤフー、Google、ユーチューブなどです。これらのサイトには便利なログイン機能などAPIがたくさんあります。この便利なAPIたちがHTTPを介して提供してもらえます。これをWebAPIといいます！！

とこんな感じでサーバーにアップします。
こうすることで、Aさんだけでなくみんなに公開されました。
GROUPING SETSの使い方

合計行を無くすとき等に使用



```SQL
SELECT CASE WHEN GROUPING(shohin_bunrui) = 1
            THEN '商品分類　合計'
            ELSE shohin_bunrui END AS shohin_bunrui,
       CASE WHEN GROUPING(torokubi) = 1
            THEN '登録日　合計'
            ELSE CAST(torokubi AS VARCHAR(16)) END AS torokubi,
       SUM(hanbai_tanka) AS sum_tanka
    FROM Shohin
GROUP BY GROUPING SETS (shohin_bunrui,torokubi);
```
Google Colaboratoryにて自作モジュールをインポートする

#概要
Google ColaboratoryでTwitterのBOT制作を勉強していた時に、自作モジュールが読み込めず沼ったので備忘録として残しておきます。

<d1>
<dt>そもそもやりたかったこと</dt>
<dd>
TwitterAPIのアクセストークンを別ファイルとして置いておき、importして使いたい。
<dd>
</d1>

######ディレクトリ構成
```
My Drive/
     └ my_projects/
               ├ main.ipynb
               └ config.py
```
ここでの**config.py**に、以下のような感じでアクセストークンに入れておきます。

```python:config.py
CONSUMER_KEY = "XXXXXXXXXXXXXXXXXXXX"
CONSUMER_SECRET="XXXXXXXXXXXXXXXXXXXXXXXXXX"
ACCESS_TOKEN="XXXXXXXXXXXXXXXXXXXXXX"
ACCESS_SECRET="XXXXXXXXXXXXXXXXXXXXXX"
```

#手順
###config.pyの生成
　Google Colaboratoryで開発するときには基本的に**.ipynb**でファイルが生成されますが、このままではimportできないみたいです。
　なので、Google Colaboratoryでモジュールを作っていた場合は
　　**ファイル>ダウンロード>.pyをダウンロード**で
　ダウンロードしてください。
　その後、先ほどと同じディレクトリにアップロードしてください。
###読み込ませる①
　ここからは**main.ipynb**に読み込ませていきます。
  　importの際に**sys.path()**を使ってパスを与えてあげます。

```python:main.ipynb

import sys
ROOTPATH ='drive/My Drive/my_projects/'
sys.path.append(ROOTPATH)

import my_projects
```
　ここではパスを別で設定していますが、ファイルのパスを **sys.path()** に直接入れてあげても大丈夫です。
　上記のようにフォルダのパスを設定しておくと、そのフォルダ内であれば別のモジュールも読み込めるようになるので便利です。

###読み込ませる②
　フォルダのパスまで来たので **config.py** を読み込ませます。

```python:main.ipynb
from my_projects import config
```
　上記のように**from [フォルダ名] import [ファイル名]** で読み込んでくれます。
　今回は各値を以下のように取り出しました。

```python:main.ipynb
CK = config.CONSUMER_KEY
CS = config.CONSUMER_SECRET
AT = config.ACCESS_TOKEN
ATS = config.ACCESS_SECRET
```
　これを使って

```python:main.ipynb
twitter = OAuth1Session(CK, CS, AT, ATS)
```
　みたいにすれば認証できます。
##読み込んでくれない時
　どうやら一発で読み込んでくれない時もあるみたいです。
　その時は
　　**ランタイム>ランタイムを出荷時にリセット**
　でGoogleDriveのマウントを外し、もう一度マウントを行うとうまくいくこともあるみたいです。
Rails 投稿画像保存(Carriewave&MiniMagic)

###【Rails】アイコン画像などをGemを使って保存
ユーザー登録などで画像を保存する方法です。
※該当のモデルにimageという名前でカラムを作成している前提です（データ型：string）

####1. Gemのインストール
Gemファイルに```carrierwave```(アップロードgem)と、```minimagick```(画像加工gem)をインストールする。


```ruby:Gemfile
gem 'mini_magick', '~> 4.8 ' #コメントアウト
gem 'carrierwave  #追加
```
ターミナルで```bundle install```  

####2. ImageMagickをインストール(Cloud9の場合)
minimagickを使うために必要なImageMagickをインストールします。
1.のbundle installで失敗したら、先にこちらのインストールが必要かもしれません。
ターミナルで以下操作をしてインストールします。
```sudo apt-get update```
```sudo apt-get install imagemagick```  

####3. 画像アップローダーの作成
画像のリサイズ設定や、開発環境・本番環境での設定を書くファイルを作成する。
ターミナル```rails g uploader image```
app/uploadersディレクトリ以下に```image_uploader.rb```が作成される。  

####4. 画像アップローダーを編集（用途に合わせて）

```rb:app/uploaders/image_uploader.rb
class ImageUploader < CarrierWave::Uploader::Base
  include CarrierWave::MiniMagick  #（共通）Minimagickをincludeする(関連モデルの取得)
  
  def store_dir  #ファイルの保存場所(デフォは/public/uploads)
    "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
  end

 def extension_allowlist  #(拡張子許可リスト)
    %w(jpg jpeg gif png)
  end

 def default_url(*args)  #デフォルト画像設定（assets/imagesにdefault.pngで保存）
   "/images/" + [version_name, "default.png"].compact.join('_')
  end

  process resize_to_fit: [200, 200]  #200x200にリサイズ
end
```  

####5. 画像アップローダーと関連モデルを関連付け
例としてUserモデルのimageカラムと関連付けします。

```rb:model/User.rb
class User < ApplicationRecord
  mount_uploader :image, ImageUploader
end
```  
####6. viewにフォームを設置

```erb:views/users/show
<%= form_with(model: @user, local: true) do |f| %>
  # name,emailなどのフォーム
  <%= f.label :image, 'アイコン画像' %>
  <%= f.file_field :image, class: 'form-control' %> #file_field：ファイル選択ボックス
  <%= f.submit '登録', class: 'btn btn-primary btn-block' %>
<% end %>
```  

####7. controllerで処理
他のカラムと同じでparamsで受取り、保存します。  

####8. 保存されたデータをviewで表示する
```erb
<%= image_tag @user.image.url %>
```  
####　完成です！

####おまけ(Amazon A3に保存する場合のimage_uploader.rb設定)
(Gemfile)

```
# production 環境専用の設定
group :production do
  gem 'pg', '>= 0.18', '< 2.0' #PostgreSQLデータベースにアクセスする
  gem 'rails_12factor', '0.0.2'  #RailsアプリケーションをHerokuで動作をさせる
  gem 'fog-aws'  #`fog`のモジュール(AWS用)
end
```
(app/uploaders/image_uploader.rb)

```rb
# CarrierWaveの設定呼び出し
require 'carrierwave/storage/abstract'
require 'carrierwave/storage/file'
require 'carrierwave/storage/fog'

if Rails.env.production? 
    storage :fog  #本番でＳ３に保存
    CarrierWave.configure do |config|
      config.fog_credentials = {
        # Amazon S3用の設定(環境変数ENV[]は.envに設定)
        :provider              => 'AWS',
        :region                => ENV['S3_REGION'],  # S3に設定したリージョン。
        :aws_access_key_id     => ENV['S3_ACCESS_KEY'],
        :aws_secret_access_key => ENV['S3_SECRET_KEY']
      }
      config.fog_directory     =  ENV['S3_BUCKET_KEY']
      config.fog_public = false
    end
  else
    storage :file  #開発時はlocalに保存
  end
``` 
S3の使い方については別の記事をご参考にしてください。
[UE4]指定した座標に一番近い、直線上の座標を求める(ベクトルの投影)

#【概要】
タイトルの通り、指定した座標に一番近い、直線上の座標を求めます。
今回は例として、下の画像のようにコーンから伸びる青い線上の、スフィアの座標に一番近い座標(赤い点の座標)を求めます。
尚、直線はただの方向ベクトルとして扱うので、終点は考慮していません。

※2021/05/21追記
相対座標への変換などを行わなくても、`UKismetMathLibrary::FindClosestPointOnLine`で同じ結果が得られるようです。

![gif.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/601695/84b3ab1f-7252-45cd-c5e5-ac780745edc1.gif)
環境はUE4.24を使用しています。

#【実装】
先に実装をお見せすると、以下のような形になります。
`ProjectVectorOnToVector`のノードを使うことにより、座標を線に投影することが出来ます。
引数のVにはコーンから見たスフィアの相対座標、TargetにはコーンのUpVector(尖っている方向)のベクトルを与えています。
ReturnValueは原点基準の座標になっているので、コーンの座標に足して最終的な座標としています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/601695/6ae75434-10fc-439e-fff8-fb7ea6680202.png)

#【解説】
折角なので`ProjectVectorOnToVector`の中身でやっていることを含め、見ていきたいと思います。

まず現状のActorの配置を図に表すと以下のようになります。
原点：ワールドの原点
A：コーンの座標
A'：コーンの座標にコーンのUpVectorを足した座標
B：スフィアの座標
P：求めたい座標
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/601695/cb03555f-09d2-a9be-d1d3-2333fa549c49.png)

このままだと計算し辛いので、コーンの座標を原点とします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/601695/27320039-6ec9-4e3b-eb9b-c3f72a7177a1.png)

点に一番近い直線上の座標を求めるには、正射影ベクトルの公式を使用します。
https://examist.jp/mathematics/planar-vector/seisyaei-vector/

この公式に今回の例を当てはめると以下のようになります。

```math
\vec{AP} = \vec{AA'}*((\vec{AA'}・\vec{AB})/(|\vec{AA'}|*|\vec{AA'}|))\\
```
ベクトルの内積は各成分同士を掛けて全部足すことで求められるので、以下のようになります。

```math
\vec{AP} = (1,0)*(((1*3)+(0*2)/(1*1))\\
=(3,0)
```

これでPの座標が(3,0)であることが分かりました。
最後に、原点基準で計算していたので、元の座標系に戻す為にコーンの座標を足して、最終的な座標は(6,3)になりました。

以上が実装のところでお見せしたBlueprintの詳細になります。
実際に`ProjectVectorOnToVector`の中を見ると、同じように正射影ベクトルの公式を使用していることが分かると思います。

```Vector.h
FORCEINLINE FVector FVector::ProjectOnTo(const FVector& A) const 
{ 
	return (A * ((*this | A) / (A | A))); 
}
```
割る値が公式のように|→a|の2乗ではないですが、同じベクトルの内積は大きさの2乗とイコールなので、同じ意味になります。
https://kou.benesse.co.jp/nigate/math/a13m1502.html
Krypton 101

[Krypton](https://krypt.co/)は通常のSmartPhoneをFIDO2に準拠したAuthenticatorとして利用することを可能にするSolutionです。この記事は初めてKrytonを試す方がFIDO2に準拠したより安全な認証方式を短時間でご体感頂くことを目的とした簡易チュートリアルです。

# シナリオ
GitHubにアクセスするためのSSH Key PairをSmartPhoneで管理してMacBookとAmazon Linuxの環境からシームレスにRepositoryにアクセスするケースを想定しています。以下、動作概略です。
<img src="https://i.imgur.com/HE0dBak.png" width=70%>


# 事前準備
この記事は下記の物品が調達済であることを前提としています。
- GitHubのアカウント
- MacBook、Amazon LinuxのEC2インスタンス
- iPhone

# iPhoneにKrypton Authenticatorをインストール
[Krypton Authenticator](https://apps.apple.com/us/app/krypton-authenticator/id1161494806?mt=8)をiPhoneにインストールします。

# MacBook/Amazon LinuxにKryptonをインストール
MacBookにHomeBrewをインストールします。詳細は割愛します。[こちら](https://qiita.com/zaburo/items/29fe23c1ceb6056109fd)が参考になるかと思います。

Kryptonをインストールします。

```console
$ brew install kryptco/tap/kr 
```
Amazon LinuxにログインしてKryptonをインストールします。

```console
$ sudo yum-config-manager --add-repo https://krypt.co/repo/kryptco.repo
$ sudo yum install kr -y 
```

# MacBook/Amazon LinuxとSmartPhoneをペアリング
MacBookの端末でkryptonを実行してQRコードを表示させます。

```console
$ kr pair
```

<img src="https://i.imgur.com/uc6zCZh.jpg" width=70%>

iPhoneでKrypton Authenticatiorを起動してQRコードをスキャンするアイコンをタップします。

<img src="https://i.imgur.com/xRRq8Y0.jpg" width=70%>

スキャンに成功すると"Pairしますか"と聞いてくるのでPairをタップします。User認証を求められるので認証します。認証に成功するとKrypton上にPrivate Keyが生成されます。
<img src="https://i.imgur.com/sW8pfrc.jpg" width=70%>

ペアリングに成功するとMacBookの~/.sshにKeyPairが生成されます。
<font color="DarkOrange">PrivateKeyはMacBookのTrusted Platform Module上に生成されてターミナルからは閲覧できないようになっています。</font>

```console
$ pwd
~/.ssh
$ ll
.rwx------   254 hyamaguc  9 Apr 14:43  config
.rwx------   731 hyamaguc  9 Apr 15:04  id_krypton.pub
```

同様の手順でAmazon LinuxとiPhoneをペアリングします。以下はペアリング完了後のKrypton Authenticatorです。
<img src="https://i.imgur.com/DCwNP6E.jpg" width=70%>



# GitHubのSSH Public Keyを作成
MacBookのターミナルでKryptonを実行してPublicKeyをクリップボードにコピーします。

```console
$ kr github
SSH public key copied to clipboard.
Press ENTER to open your web browser to GitHub. Then click "New SSH Key" and paste your public key.
```

GitHubの”SSH & GPG Keyps"の画面に誘導されるので右上の"New SSH key"をクリックしてPublicKeyを作成します。

<img src="https://i.imgur.com/7ZgvODt.jpg" width=70%>


# 任意のRepositoryをClone
MacBookのターミナルから任意のGitHub RepositoryをCloneします。Krypton Authenticatorに認証リクエストが届くので内容を確認して"Allow once"をタップします。認証に成功するとRepositoryがCloneされます。

```console
$ git clone git@github.com:kryptco/kr.git
Cloning into 'kr'...
Krypton ▶ Requesting SSH authentication from phone
Krypton ▶ Phone approval required. Respond using the Krypton app
Krypton ▶ Success. Request Allowed ✔
remote: Enumerating objects: 7003, done.
remote: Total 7003 (delta 0), reused 0 (delta 0), pack-reused 7003
Receiving objects: 100% (7003/7003), 22.36 MiB | 7.22 MiB/s, done.
Resolving deltas: 100% (3763/3763), done.
```

<img src="https://i.imgur.com/2KnG5cO.jpg" width=70%>

Amazon Linuxで同様の操作を行いKrypton Authenticatorにリクエストが届どけば成功です。


# おわりに
FIDO2はPassword不要でより安全な認証プロトコルですが、[YubiKey](https://www.yubico.com/)のような高額な専用Hardwareを配布したり管理しなければならない点がネックかと思います。Kryptonを利用することで、iPhoneのような一般市場に多く出回っている標準的なデバイスをFIDO2に準拠したAuthenticatorとして利用することで、高額な専用Hardwareの調達コストや管理コストを軽減できるかと思います。
Node.js(LTS)をnvmを使ってLinuxに導入する方法


#1. NVMの導入
以下を参照して最新のNVM(Node Version Manager)を導入する。
https://github.com/nvm-sh/nvm#installing-and-updating

```
# cat /etc/redhat-release
CentOS Linux release 7.9.2009 (Core)

# curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.38.0/install.sh | bash

# source ~/.bashrc

# nvm --version
0.38.0

#  which nvm
/usr/bin/which: no nvm in (/root/.nvm/versions/node/v14.16.1/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin)

# command -v nvm
nvm
```

#2. Node.jsの導入

```
# nvm ls-remote|grep Latest
         v4.9.1   (Latest LTS: Argon)
        v6.17.1   (Latest LTS: Boron)
        v8.17.0   (Latest LTS: Carbon)
       v10.24.1   (Latest LTS: Dubnium)
       v12.22.1   (Latest LTS: Erbium)
       v14.16.1   (Latest LTS: Fermium)

# nvm ls
            N/A
default -> stable (-> N/A)
iojs -> N/A (default)
node -> stable (-> N/A) (default)
unstable -> N/A (default)
lts/* -> lts/fermium (-> N/A)
lts/argon -> v4.9.1 (-> N/A)
lts/boron -> v6.17.1 (-> N/A)
lts/carbon -> v8.17.0 (-> N/A)
lts/dubnium -> v10.24.1 (-> N/A)
lts/erbium -> v12.22.1 (-> N/A)
lts/fermium -> v14.16.1 (-> N/A)

# nvm install --lts --latest-npm　（最新がv14.16.1なので、それを導入するのと同じ） 
# nvm install v12.22.1
```

#3. 切り替えテスト



```terminal:v12.22.1を利用
# nvm use v12.22.1
Now using node v12.22.1 (npm v6.14.12)

# nvm current
v12.22.1

# node -v
v12.22.1

# nvm ls
->     v12.22.1
       v14.16.1
default -> stable (-> v14.16.1)
iojs -> N/A (default)
unstable -> N/A (default)
node -> stable (-> v14.16.1) (default)
stable -> 14.16 (-> v14.16.1) (default)
lts/* -> lts/fermium (-> v14.16.1)
lts/argon -> v4.9.1 (-> N/A)
lts/boron -> v6.17.1 (-> N/A)
lts/carbon -> v8.17.0 (-> N/A)
lts/dubnium -> v10.24.1 (-> N/A)
lts/erbium -> v12.22.1
lts/fermium -> v14.16.1
```

```terminal:deactivate
# nvm deactivate
/root/.nvm/*/bin removed from ${PATH}

# nvm current
none

# node -v
-bash: node: コマンドが見つかりません

# nvm ls
       v12.22.1
       v14.16.1
default -> stable (-> v14.16.1)
iojs -> N/A (default)
unstable -> N/A (default)
node -> stable (-> v14.16.1) (default)
stable -> 14.16 (-> v14.16.1) (default)
lts/* -> lts/fermium (-> v14.16.1)
lts/argon -> v4.9.1 (-> N/A)
lts/boron -> v6.17.1 (-> N/A)
lts/carbon -> v8.17.0 (-> N/A)
lts/dubnium -> v10.24.1 (-> N/A)
lts/erbium -> v12.22.1
lts/fermium -> v14.16.1
```

```terminal:v14.16.1を利用
# nvm use v14.16.1
Now using node v14.16.1 (npm v7.9.0)

# nvm current
v14.16.1

# node -v
v14.16.1

# nvm ls
       v12.22.1
->     v14.16.1
default -> stable (-> v14.16.1)
iojs -> N/A (default)
unstable -> N/A (default)
node -> stable (-> v14.16.1) (default)
stable -> 14.16 (-> v14.16.1) (default)
lts/* -> lts/fermium (-> v14.16.1)
lts/argon -> v4.9.1 (-> N/A)
lts/boron -> v6.17.1 (-> N/A)
lts/carbon -> v8.17.0 (-> N/A)
lts/dubnium -> v10.24.1 (-> N/A)
lts/erbium -> v12.22.1
lts/fermium -> v14.16.1
```
mysql 8.0 複数インスタンス @ CentOS7 + systemctl

#### systemctl で制御できる mysql 複数だえもん

- MySQL Community Server 8.0 はインストールしたてでまっさらの状態

```
# cat /etc/redhat-release
CentOS Linux release 7.7.1908 (Core)
# mysql --version
mysql  Ver 8.0.19 for Linux on x86_64 (MySQL Community Server - GPL)
```

- SELinux で許可されてるmysqlのポートを確認

```
# semanage port -l | grep mysqld
mysqld_port_t                  tcp      1186, 3306, 63132-63164
```

- ポート3307とかでLISTENさせたい場合（[公式](https://dev.mysql.com/doc/refman/8.0/en/selinux-context-mysqld-tcp-port.html)）

```
# semanage port -a -t mysqld_port_t -p tcp 3307
# semanage port -l | grep mysqld
mysqld_port_t                  tcp      3307, 1186, 3306, 63132-63164
```

- [公式](https://dev.mysql.com/doc/refman/8.0/en/using-systemd.html)に従って、```/etc/my.cnf``` に複数インスタンスの設定を書く

```
# cat /etc/my.cnf
[mysqld]
port=3306
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

[mysqld@another]
port=3307
datadir=/home/my/mysqldata
socket=/home/my/mysql.sock
log-error=/home/my/mysql.log
pid-file=/home/my/mysqld.pid
```

- 無印mysqlデーモンを再起動、初期パスワードを確認、mysqlログイン、パスワード変更

```
# systemctl restart mysqld
# grep "temporary password" /var/log/mysqld.log
2021-04-09T02:54:27 [Server] A temporary password is generated for root@localhost: 1234;abcABC
# mysql -p
Enter password:
mysql> SET password for root@localhost='NewPassword';
mysql> FLUSH PRIVILEGES;
```

- 第二のmysqlデーモンを起動、初期パスワードを確認

```
# systemctl start mysqld@another
# grep "temporary password" /home/my/mysqld.log
- 省略 -
```

- ここで、ポート番号を利用してログインする時は、ホスト名として ```-h 127.0.0.1``` を指定すること
- mysql の ```localhost``` と ```127.0.0.1``` は振る舞いが違う（UNIX local socket, OR TCP/IP）
- ```-h``` オプションを省略すると、```-h localhost``` が採用される

```
# mysql -p -h 127.0.0.1 -P 3307
```

- あえて UNIX socket でもよし

```
# mysql -p -S /home/my/mysql.sock
```

- ログインしたらパスワードを変更しておく
- デーモンの状態はこんな感じ

```
# ps -ef | grep mysqld
mysql  36689    1  0 00:03   00:00:47 /usr/sbin/mysqld
mysql  37545    1  0 00:11   00:00:44 /usr/sbin/mysqld --defaults-group-suffix=@another
```

- 起動設定

``` 
# systemctl enable mysqld
# systemctl enable mysqld@another
```

- 外から接続させるなら、Firewall にポートを登録

```
# cp /usr/lib/firewalld/services/mysql.xml /etc/firewalld/services/
# cat /etc/firewalld/services/mysql.xml
<?xml version="1.0" encoding="utf-8"?>
<service>
  <short>MySQL</short>
  <description>MySQL Database Server</description>
  <port protocol="tcp" port="3306"/>
  <port protocol="tcp" port="3307"/>
</service>
# firewall-cmd --reload
```
SQLのCUBE演算子の使い方

CUBE演算子を使うと登録日ごとの合計額と、商品分類で分けてから、登録日ごとの合計と表示できる。


```SQL:SELECT文
SELECT CASE WHEN GROUPING(shohin_bunrui) = 1
            THEN '商品分類　合計'
            ELSE shohin_bunrui END AS shohin_bunrui,
       CASE WHEN GROUPING(torokubi) = 1
            THEN '登録日　合計'
            ELSE CAST(torokubi AS VARCHAR(16)) END AS torokubi,
       SUM(hanbai_tanka) AS sum_tanka
    FROM Shohin
GROUP BY CUBE (shohin_bunrui,torokubi);

```
バリデーションのformatヘルパー　の使い方

#目次
<b>①バリデーションヘルパーとは</b>
<b>②formatの使い方</b>

##①バリデーションヘルパーとは
Active Recordには、クラス定義の内側で直接使える定義済みのバリデーションヘルパーが多数用意されている。ヘルパーは、共通のバリデーションルールを提供をし、バリデーションが失敗するたびに、オブジェクトのerrorsコレクションにエラーメッセージが追加され、そのメッセージは、バリデーションが行われる属性に関連付けられる。


##②formatの使い方
formatヘルパーは、withオプションで与えられた正規表現と属性の値がマッチするかどうかのテストによる検証を行う。

```php:Userモデル
class User < ApplicationRecord
validates :email, presence: true, length: { maximum: 100 },
                    format: { with:/\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i , message: "は英文字のみが使えます", }
```

ちなみに「message:」はエラーが起きたい際にエラーメッセージとして表示されるものである。
Visual Studio 2019で .net 6 Preview 3を試す

Visual Studio で.net 6 Preview3を試してみた。
プレビュー機能を有効にしないと、使えないので注意。




#環境
Windows 10
Visual Studio 2019 Version 16.9.3
#手順
## SDK 6.0.100-preview.3をインストール
https://dotnet.microsoft.com/download/dotnet/6.0

## Visual Studioのプレビュー機能を有効にする
![クリップボード02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643531/9bbf6185-92d6-5bf2-a2d3-a5a89afee63c.png)

プレビュー機能でチェックつけないと、
・ターゲットフレームワークに表示されず
・以下のように.csprojを直接書き替えても、SDKがないと怒られる。

```c#:.csproj
<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <OutputType>WinExe</OutputType>
    <TargetFramework>net6.0-windows</TargetFramework>
    <UseWPF>true</UseWPF>
  </PropertyGroup>
</Project>
```
## ターゲットフレームワークを.NET 6にする
####新規にプロジェクトを作成する場合
![クリップボード01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643531/c31493f8-f056-6071-659a-42787e380728.png)
####既存のプロジェクトを変更する場合
![クリップボード03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643531/73a9ea30-492b-6c4d-af5a-8f7cfc8ea6f6.png)
【Python】TA-Libでテクニカル指標計算 Part 0. Windowsにインストール編（他の環境も少し）


投資分析用ライブラリTA-Libについて書いてきます．

TA-LibというPythonライブラリを用いれば，投資のテクニカル分析の幅が広がります．

しかしながらTA-LibのインストールはPCの環境によって方法が異なるため，他のPythonライブラリと違い，単なるpipだけではインストールすることができません．

インターネットで調べてみると，TA-Libのインストールで苦戦・挫折した人が結構いるようです．

Windowsでやってみたところ，TA-Libのインストールは割とあっさりできたので，今回はその方法を紹介します．

#TA-Libのインストール

##手順1.pythonのバージョンを調べる

まずは，お使いのPythonとその実行環境のバージョンを調べます．

```
>python
```

```
Python 3.8.1 (tags/v3.8.1:1b293b6, Dec 18 2019, 22:39:24) [MSC v.1916 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
```

この場合は，バージョン3.8のPythonが，32bitのWindows上でインストールされていることが分かりました．

この2つの数字を覚えておいてください．

##手順2.自分のPythonに合ったTA-Libのwhlファイルをダウンロード

次に，以下のダウンロードサイトからTA-Libをダウンロードします．

下記サイトからダウンロード
https://www.lfd.uci.edu/~gohlke/pythonlibs/#ta-lib

ダウンロードするファイルは，

Python 3.9，Windows 64bitなら「TA_Lib‑0.4.19‑cp39‑cp39‑win_amd64.whl」
Python 3.9，Windows 32bitなら「TA_Lib‑0.4.19‑cp39‑cp39‑win32.whl」
Python 3.8，Windows 64bitなら「TA_Lib‑0.4.19‑cp38‑cp38‑win_amd64.whl」
Python 3.8，Windows 32bitなら「TA_Lib‑0.4.19‑cp38‑cp38‑win32.whl」

という感じです．

##手順3.TA-Libをインストール

```
pip install whlファイル名
```

でインストールできます．

たとえば，

```
pip install TA_Lib‑0.4.19‑cp38‑cp38‑win32.whl
```

でできると思います．ここまでの内容のもう少し丁寧な解説は以下で行っています．

https://optrip.xyz/?p=2242

#他の環境でTA-Libをインストールする場合

##anaconda

```
conda install ta-lib
```

だけでできるようです．

##Google Colab
以下をセルで順次実行すればできました．

```
!curl -L http://prdownloads.sourceforge.net/ta-lib/ta-lib-0.4.0-src.tar.gz -O && tar xzvf ta-lib-0.4.0-src.tar.gz
```

```
!cd ta-lib && ./configure --prefix=/usr && make && make install && cd - && pip install ta-lib
```
参考：[Python：TA-Libでテクニカル分析、Plotlyでローソク足の描画](https://investment.abbamboo.com/programming/google-colab-install-ta-lib/)


#Linux,Mac

Linux,MacでのTA-Libのインストールに関しては，自分ではやっていないので以下の記事の紹介だけさせていただきます．

##Linux

https://qiita.com/ConnieWild/items/cb50f36425a683c914d2

##Mac

https://qiita.com/katakyo/items/f0f51f208f9d3ad0da43

#TA-Libで計算できるテクニカル指標と今後

ちなみに，TA-Libでは以下の例のようなテクニカル指標が簡単に計算できます．

MACD
ボリンジャーバンド
RSI
モメンタム
SMA（単純移動平均線）
EMA（指数平滑移動平均線）
KAMA（適応型移動平均）
MAMA（MESA 適応型移動平均）
パラボリック SAR
T3（3重指数移動平均）
WMA（重み付き移動平均）
ADX（平均方向性指数）
APO（アブソリュートプライス オシレーター）
MFI（マネーフローインデックス）

以下の記事で，いくつかの指標を試しています．

・RSI

https://qiita.com/Fujinoinvestor/items/852a19fd1a787b31371f

・ボリンジャーバンド

https://qiita.com/Fujinoinvestor/items/7eb56f8de0e90b3406e9

・SMA(単純移動平均線)

https://qiita.com/Fujinoinvestor/items/49dc284279c7e9217c30

・MACD

https://qiita.com/Fujinoinvestor/items/9314c404f591f8df53d4
Gravio LEDマトリックスを使ってCO2をサイネージで可視化する

GravioでCO2を可視化するシリーズ第5弾でございます。今回はちょっといつもと雰囲気が違います。
そういよいよGravio LEDマトリックスの出荷開始！それを記念してLEDマトリックスを使って可視化してみたいと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/06605380-3fc6-2265-5f91-d06dae4680e2.png)

過去4回はこちらをどうぞ。

* [Gravio 4とPower BIでCO2を可視化する](https://qiita.com/zrock/items/08148659ebf523f5c160)
* [Gravio 4からCO2データをAmbientに送って可視化する](https://qiita.com/zrock/items/8b78ad085025bf5e760a)
* [Gravio 4からCO2データをMachinistに送って可視化する](https://qiita.com/zrock/items/ab09c8a7a43d24e96596)
* [Gravio 4からCO2データをUnidotsに送って可視化する](https://qiita.com/zrock/items/4ed009153c916f61a6ee)

# 使用環境

* Raspberry Pi 4 Model B w/4GB RAM
* Ubuntu Server 20.04.2 LTS
* Gravio HubKit v4.2.0-6524
* Gravio Studio v4.2.4091.0
* Gravio CO2センサー (Gravio Standardの契約が必要)
* Gravio LEDマトリックス (Gravio Standardの契約が必要)


# 事前準備
* 「[Gravio 4とPower BIでCO2を可視化する](https://qiita.com/zrock/items/08148659ebf523f5c160)」を参考にCO2データを取得できるようにしておいてください。

# Gravio LEDマトリックス
最初にGravio LEDマトリックスを少し説明しておきます。
Gravio LEDマトリックスはGravioライトに続きレンタル開始された、Gravioブランドのディスプレイデバイスです。
Gravioのアクションからコントロールすることで、16x16のドットで、英数字、ビットマップなどを表示することができます。

大きさはこれくらい。左から、CDケース、Gravio LEDマトリックス、Gravio Hubです。Gravio Hubよりちょっと大きくて、CDほどではないくらい。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/eaa0e3d2-ab64-05aa-74bd-a95805c73f34.png)

電源はUSB給電です。GravioとはZigbeeで繋がりますので、Gravio Hubはそのまま、WidnowsやラズパイではZigbeeレシーバーが必要です。

# 手順
## Gravio LEDマトリックスをペアリング
まずは[Gravio LEDマトリックス利用方法のページ][Gravio-Matrix-Pairing]の手順に従ってペアリングします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/18529a8b-c636-b5e6-673b-7c618e9b1b48.png)

**GRAVIO MATRIX**というデバイスが表示されましたね。これでOKです。

## アクションの作成
それではアクションを作ります。

Gravio 4.2で新しく追加されたGravio Matrixコンポーネントを使います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/007510e8-7a0d-82c0-ad79-3215ae0bf2a2.png)

設定は簡単です。**テンプレート**に`テンプレート：CO2濃度`を選びます。で、**オン**にチェック。
値は**コンテンツ**で差し込みます。いつものように`tv.Data`をPre Mappingで設定します。

```
cp.Content = tv.Data
```

これで完了です。
実行するとこんな感じで表示されます。0ですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/ce436a73-65fd-823e-dbc9-53aa80b074f3.png)


## トリガーで連携
トリガーを作成し、有効化します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/51f83349-9d6d-731d-a30c-2320d551ed6f.png)

## 結果の確認
連携できました。

![co2-matrix.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/f75ebf36-5349-fca5-d6c2-9b208a0a7c72.gif)

# ポイント
* Gravio LEDマトリックスにはCO2を表示するためのテンプレートがある
* 表示するためにはGravio Matrixコンポーネントを使う

# 参考
* [Gravio][]
* [Gravio Matrixコンポーネント][Gravio-Matrix]
* [Gravio LEDマトリックスの利用方法][Gravio-Matrix-Pairing]
* [Pre Mappings / Post Mappingsでの式の記述の仕方][Gravio-Mappings]


[Gravio]:https://www.gravio.com/jp
[Gravio-Matrix]:https://doc.gravio.com/manuals/gravio4/1/ja/topic/gravio-matrix
[Gravio-Matrix-Pairing]:https://www.gravio.com/jp/sensor-setup-guide#Gravio-LED-Matrix
[Gravio-Mappings]:https://doc.gravio.com/manuals/gravio4/1/ja/topic/premappings-postmappings
Git pushで容量が大きくて失敗した際にしたこと

すぐ忘れそうなので、自分用のメモとして

# 参考にした記事

https://qiita.com/Spring_MT/items/f60c391b5dbf569a1d12

https://dskd.jp/archives/46.html


# 問題

かなり前に作ってGit管理など何もしていなかった状態のサイトを、サーバーの載せ替えをする際に起きた問題。

FTPでダウンロードしたファイルをすべてGit管理に放り込んでpushしたところ、容量が大きすぎてpushできないよと怒られました。

無駄に大きいPDFファイルなどを、`.gitignore` に書いて `git rm -rf --cached <ディレクトリorファイル>` してGit管理から外したのですが、それでも容量が大きいと怒られたので困っていました。


# 原因

重いファイルはGit管理を外したのに、何がそんなに重いのかと調べたら、 `.git/objects` がかなり重いようでした。

Gitで履歴をすべて記録しているので当たり前ですね。

まだリモートリポジトリにpushもしていなかったので、ローカルのリポジトリごと一旦消して作り直しても良かったのですが、なんとなくコミット履歴自体は残しておきたかったので、対処法を探してみました。


# 対処法

冒頭に貼った参考サイトが全てです。

`filter-branch` を使えばいいということはなんとなく分かったのですが、どうも使い方がよくわからなかったので、複数の記事で同じ方法を採っているのを見つけて、大丈夫だと思って実行しました（おい）

ちゃんとドキュメント読んで理解してから実行するのがベストなのですが、ちょっと時間がなかったので横着しました。

以下、コマンドのみまとめ

```
$ git filter-branch --index-filter "git rm -rf --cached --ignore-unmatch <ディレクトリorファイル>" --prune-empty -- --all

$ rm -rf .git/refs/original/

$ git reflog expire --expire=now --all

$ git gc --aggressive --prune=now
```

`reflog` や `gc` が何をしているのか、よく分かっていませんが、コマンド実行後、`.git` の容量が大幅に下がったので、履歴から大容量ファイルの削除に成功したようです。

これで、`push` したら上手く行ったので、無事完了です。


この記事は自分用のメモなので、同じ問題に直面している方は、参考元の記事の方を御覧ください。
Laravelでログイン後と新規登録後のリダイレクトを変更


こんにちは、JeffTechです。

# 説明
Laravelのデフォルトの機能で新規登録・ログイン機能を実装した時に、新規登録＆ログインをした後のリダイレクト先は`/home`になっているかと思います。
今回は、そちらを変更していこうと思います。

# この記事で実現できること
- 新規登録後のリダイレクト先変更
- ログイン後のリダイレクト先変更

# 開発環境
- MacOS Catalina
- Laravel:6.2
- PHP:7.3

# 実装の流れ
- RegisterControllerの変更
- LoginControllerの変更
- 余談

# 実装

## 新規登録後のリダイレクト先指定
実は実装自体はとても簡単で、新規登録後のリダイレクト先を指定するには、下記のように`app/Http/Controllers/Auth/RegisterController.php`のRegisterControllerクラスの一番下に、redirectPathメソッドを記述するだけです。
これを実装すると何が嬉しいかというと、新規登録後に投稿一覧画面に遷移させたり、ユーザー情報の詳細を登録させる画面に遷移させたりすることが自由にできるようになります。

```php:RegisterController.php
<?php

namespace App\Http\Controllers\Auth;

use App\Http\Controllers\Controller;
use App\Providers\RouteServiceProvider;
use Illuminate\Foundation\Auth\AuthenticatesUsers;

class LoginController extends Controller
{
    ーー省略ーー

    // ログイン後のリダイレクト先を記述
    public function redirectPath()
    {
        return 'リダイレクト先URL';
        例：return 'article/index';
    }
}
```

## ログイン後のリダイレクト先指定
新規登録後のリダイレクト先指定とほぼ同じで、下記のように`app/Http/Controllers/Auth/LoginController.php`のLoginControllerクラスの一番下に、redirectPathメソッドを記述するだけです。

```php:LoginController.php
<?php

namespace App\Http\Controllers\Auth;

use App\Http\Controllers\Controller;
use App\Providers\RouteServiceProvider;
use Illuminate\Foundation\Auth\AuthenticatesUsers;

class LoginController extends Controller
{
    ーー省略ーー

    // ログイン後のリダイレクト先を記述
    public function redirectPath()
    {
        return 'リダイレクト先URL';
        例：return 'article/index';
    }
}
```

### 余談
実は、`RegisterController.php`も`LoginController.php`も`vendor/laravel/framework/src/Illuminate/Foundation/Auth/AuthenticatesUsers.php`の`AuthenticatesUsersトレイト`をuseしており、その`AuthenticatesUsersトレイト`の中でさらに`vendor/laravel/framework/src/Illuminate/Foundation/Auth/RedirectsUsers.php`の`RedirectsUsersトレイト`をuseしています。
その中の`redirectPaht`メソッドの中にリダイレクト先の処理が書いてあります。
その処理を各コントローラで上書きすることで、上記のリダイレクト先指定を実装しています。


# 最後に
少しでも役に立った！という時は、いいねをポチッとして
フォローしてくださると嬉しいです、、、笑

役に立たなかった時は、怒らないでコメント頂けますと幸いです笑

Twitterもやってますので、よかったら見てみてくださいね！
https://twitter.com/jefftechsaku