OmniAICreator/Qiita-1.07M huggingface dataset:
2022/2/13主にITとかセキュリティの記事

「盗んだデータを公開する」と恐喝、身代金ウイルスの被害急増…昨年１４６件で製造業が５５件(2/11)
https://www.yomiuri.co.jp/national/20220210-OYT1T50429/

サイバーセキュリティへの関心高まる--O'Reilly「2022年テクノロジートレンド」(2/11)
https://japan.zdnet.com/article/35183122/

シーメンス製品に緊急の脆弱性、アップデートを(2/10)
https://news.mynavi.jp/techplus/article/20220210-2270145/

JPCERT/CCの「Emotet感染有無確認ツールEmoCheck」を試した(2/10)
https://qiita.com/yasthon/items/81fcdcd43c649dd08e7e

キヤノンやLGも襲ったMaze、Egregor、Sekhmetランサムウェアの復号キーが公開される(2/11)
https://jp.techcrunch.com/2022/02/11/2022-02-10-maze-egregor-sekhmet-ransomware-decryption/

ウイルス感染で架空料金請求詐欺(2/11)
http://www.kenoh.com/mimi/pc/12610580.html

みずほ銀行ATM障害　メンテナンスで一時90拠点停止(2/11)
https://www.nikkei.com/article/DGXZQOUB111MR0R10C22A2000000/

「身代金」ウイルス被害１４６件＝前年から急増、病院５件―２１年、警察庁把握(2/10)
https://www.risktaisaku.com/articles/-/64876

格安をうたう家具や家電品などの模倣サイトにご注意！ ～注文した商品が届かない！～(2/10)
https://www.city.hino.lg.jp/kurashi/sumai/shohi/1018840.html

用語解説「10Gbpsのネットワークの帯域制御」(2/11)
https://japan.zdnet.com/release/30644896/

IOTサイバーセキュリティと各国法規（RE指令編）(2/10)
https://www.bureauveritas.jp/magazine/220210/005

GoogleのEATにおける、10の誤解を解く(2/10)
https://www.seojapan.com/blog/biggest-misconceptions

「これほど急速な変化は初」Web3.0への人材移動進む(2/11)
https://crypto-times.jp/web2-to-web3/

クラファンIndiegogoが信頼確保に向け正当なキャンペーン運営者に「信頼証明バッジ」発行へ(2/11)
https://jp.techcrunch.com/2022/02/11/2022-02-10-indiegogo-will-designate-legit-crowdfunders-with-a-trust-proven-badge/

マルチチェーン総合DeFiプラットフォーム「Sphynx」とは？特徴と仕組みを徹底解説！(2/10)
https://crypto-times.jp/sphynx-labs/

メタバース隆盛の陰で悪用リスクも。セキュリティ・法律の専門家が指摘する4つの懸念(2/11)
https://www.businessinsider.jp/post-250173

GitHubでファイル検索から変更履歴確認まで高速で行う(2/9)
https://qiita.com/darquro/items/cf64e76bbf848feefa32

【ケチるな危険！】 パスワード管理ソフトは絶対に「有料」がおススメな理由(2/11)
https://diamond.jp/articles/-/295925

【重要】迷惑メール（なりすましメール）に関するお詫びと注意喚起(2/10)
https://www.kokubu.co.jp/news/2022/detail/0210150000.html

近畿総通局など近畿・福井で関連イベントサイバーセキュリティ月間 中小企業も対策に本腰を(2/9)
https://dempa-digital.com/article/285122

愛知県PCR検査システムにランサムウェア攻撃　個人情報漏えいなど二次被害はなし(2/10)
https://news.nicovideo.jp/watch/nw10513216

「エモテット」県内で被害　最強のコンピューターウイルス(2/11)
https://www.yamagata-np.jp/news/202202/11/kj_2022021100347.php
Private DNS can only be enabled after the endpoint connection is accepted by the owner で VPC エンドポイントの作成に失敗する

**2022/2/13 時点のコンソールで操作した場合の情報です。今後仕様が変わる可能性がありますのでご注意ください。**

## 事象
新しい UI の VPC コンソールでその他のエンドポイントサービス用の VPC エンドポイントを作成しようとすると、以下のようなエラーが発生する。

```
Private DNS can only be enabled after the endpoint connection is accepted by the owner of com.amazonaws.vpce.<region>.vpce-svc-xxxxxxxxxxxxxxxxx
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/c4eb8479-4933-3e60-e16f-31626982875a.png)



## 原因と対応
新しい UI の場合、追加設定の「DNS 名を有効化」にデフォルトでチェックが入っているため。
接続先の VPC エンドポイントサービスが以下のいずれかに当てはまる場合、このチェックを外してエンドポイントを作成する必要がある。

* VPC エンドポイントサービス側でプライベート DNS 名を有効にしていない
* VPC エンドポイントサービス側でプライベート DNS 名を有効化し、エンドポイント承諾設定を有効にしている

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/e31377e6-4976-f6af-e394-1658045bec79.png)

## 補足 
前述の条件にあてはまる場合に DNS 名を有効化のチェックを外さなければいけない理由を補足します。

VPC エンドポイントサービス側でプライベート DNS 名を有効にしていない場合、当然ながらエンドポイント側でも有効にすることはできません。参考までに旧 UI では「サービスでサポートされていません」と表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/593a7fdd-0c82-e249-b8d9-4387e4459355.png)

VPC エンドポイントサービス側でプライベート DNS 名を有効化し、エンドポイント承諾設定を有効にしている場合は、エンドポイント接続リクエストが承諾されるまでエンドポイント側でプライベート DNS 名を有効にすることはできません。つまりエンドポイント作成時には有効化できません。参考までに旧 UI では以下のように表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/6983f232-bcd1-08a2-09cc-7adbab002e5d.png)

上記のように旧 UI ではいずれの場合もプライベート DNS 名が無効の状態でエンドポイントが作成されていたため、ユーザー側で設定値を意識する必要はありませんでした。しかし新しい UI ではデフォルトで DNS 名を有効化にチェックが入ってしまっているので注意する必要があります。

ちなみに接続先が以下の条件を満たす VPC エンドポイントサービスである場合のみ、「DNS 名を有効化」にチェックをいれた状態でエンドポイントを作成できます。

* VPC エンドポイントサービス側でプライベート DNS 名を有効化し、エンドポイント承諾設定を無効にしている

参考までに 旧 UI では以下のように表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/5ba9b334-b517-080c-3e98-4e03f5f91e61.png)


ただしこの条件に当てはまるケースの方が少ないのではないかと思います。個人的にはその他のエンドポイントサービスを選択した場合は、DNS 名を有効化のチェックはデフォルトでは外れているとありがたいかなと感じました。

またチェックボックスが追加設定として隠れている状態のため、最初はエラーの原因に気づくことができませんでした。
同じようにハマってしまった方に参考になれば幸いです。
eBPFでPIDを取得について(BCCの利用)

# PIDについて備忘録的な
色々あるので纏めてみた
task_sturct構造体とPID構造体とPID名前空間がごちゃごちゃにならないようにしないと…

## BCCのツールで直接取得

```c
data.e_pid = bpf_get_current_pid_tgid();
```
上位32ビット　TGID
下位32ビット　PID

の64ビットを返り値で渡してくれるヘルパー関数
u32に直接渡すと上位32ビットが破棄される

PIDだけ使うなら楽


## BCCでtask_struct構造体から取得する

```c
struct task_struct *task;
task = (struct task_struct *)bpf_get_current_task();
data.t_pid = task->tgid;
```
なるべく多くのデータにアクセス出来るtask_struct構造体からアクセス出来るように…
名前空間とか考えるとこっちがいいと思う


## 親のPIDを見てみる

```c
struct task_struct *task;
task = (struct task_struct *)bpf_get_current_task();
data.ppid = task->real_parent->tgid;
```
task_struct構造体には親のtask_struct構造体のポインタを持つのでそれを使う

```c
struct task_struct *task;
task = (struct task_struct *)bpf_get_current_task();
data.ppid = task->real_parent->tgid;
data.ppid2 = task->real_parent->real_parent->tgid;
```
real_parent型がtask_struct構造体なので、そのまま繋げれば親の親も見れる。

## 子供もみたい

```c
struct list_head *list = &(task->children);
    
get_child = list_entry(list,struct task_struct,children);
data.child_pid = get_child->tgid;

```


container_of(ptr, type, member)がエラーで…

error: cannot call non-static helper function

スタティックじゃないって言われた…

他のツール見て使ってる所なかったからどうなんだろ…←要検証

## コンテナ上でのPIDに変換したい…
コンテナ上で見てるPIDも確認出来るようにしたいので、、、

```c
data.h_pid = bpf_get_current_pid_tgid();//ホスト側
if (task->thread_pid->level ==1){
    data.c_pid = task->thread_pid->numbers[1].nr;//コンテナ側
}

```

levelが深くなった際にloopが使えないから探索していくのが難しい…



# 参考文献
https://wiki.bit-hive.com/north/pg/%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9ID%E3%81%AE%E5%8F%96%E5%BE%97

https://totofuga.hateblo.jp/entry/2017/06/24/103521

https://elixir.bootlin.com/linux/latest/source/include/linux/sched.h#L1075

https://elixir.bootlin.com/linux/latest/source/include/linux/pid.h#L59

https://elixir.bootlin.com/linux/latest/source/include/linux/pid_namespace.h
AWSサービスを使って Lambda関数 の CI/CD を実現する方法を調査してみた

# はじめに
LambdaのCI/CDを実現したい！と思ったのですが、社内ルール的にAWS SAMを利用した開発はアクセスキーの発行が難しいため選択しにくく、一体どのような手段を取ればLambdaのCI/CDを実現できるか整理してみました。

**調査にかなり苦戦しています。**どうか皆さんのご意見をいただければ幸いです。


# 事前調査
名前から安易に「AWS CodeDeployがあればデプロイの自動化が出来る！」と思って調査していますが、
基本的にLambdaのデプロイはSAMを利用することを前提としている予感...
（※CodeDeploy Lambdaなどで検索しても[SAMを前提とした記事](https://docs.aws.amazon.com/ja_jp/codedeploy/latest/userguide/tutorial-lambda-sam.html)がヒットしてしまう）

CodeDeployの[BlackBelt](https://d1.awsstatic.com/webinars/jp/pdf/services/20210126_BlackBelt_CodeDeploy.pdf)(動画も見ました...）を確認していますが、CanaryやLinerのようなデプロイ戦略については触れられますが、直接的なLambdaのデプロイに関する言及が少なく、この辺自分には難しかったです...

# 調査方法
- AWS 公式ドキュメント・チュートリアル
- Qiita記事（優秀な先達の記事をたくさん参考にさせていただいております）
- その他Web検索

# 調査結果
LambdaのDeploy方法の候補としては以下の通り?
3が出来そうにだけ見えてやる方法が見つからず、現状2が最適解のような気持ち悪さ...

1. AWS SAMを用いてローカル(またはCloud9などのEC2インスタンス)からDeployコマンドを発行
    - ローカルからやりたい場合はアクセスキーの発行が必要（なはずであり、となるとベストプラクティス的には...）
    - `git push`によるリポジトリの変更をフックとするのではなく、あくまで人の`sam deploy`コマンドがフックとなる
2. CodeBuildでbuildspec.yamlのcommands欄から`aws cloudformation package`,`aws cloudformation deploy`コマンドを発行しzip化、その後CodeDeployではなくcFnでデプロイを実行する
    - [いしだろぐさんの記事](https://ishidalog.com/?p=475)が大変参考になりました。天才です。突然のリンク失礼します..
3. CodeDeployでLambda関数のデプロイをする
    - **これが出来そうで調べているのに詳細な情報やハンズオン記事が見つからず気持ち悪い...**

# CodeDeployを用いてLambdaのデプロイができる（だろう）と判断した根拠
- そもそもCodeDeployのコンピューティングプラットフォームの欄にLambdaがある
    - https://docs.aws.amazon.com/ja_jp/codedeploy/latest/userguide/deployment-steps-lambda.html#deployment-process-workflow-lambda
    - `Amazon S3 に AppSpec ファイルを配置するか、コンソールまたは AWS CLI に直接入力します。`という記載もあるので、適切なAppSpec.ymlを記載すればできるか?
- そもそも公式のドキュメントにも`[Compute platform (コンピューティングプラットフォーム)] で [AWS Lambda] を選択します。`などと言って説明している欄がある
    - https://docs.aws.amazon.com/ja_jp/codedeploy/latest/userguide/applications-create-lambda.html

- しかしながら2020年段階の @akihiro-moriwaki さんの[記事](https://qiita.com/akihiro-moriwaki/items/40547ff36d7744148822)では無理だったことが明言（こちらも大変参考になりました...大感謝）
- Qiitaをざっと見たところ、CodeDeploy + Lambda + SAM不使用 の記事が見付けられず...

# まとめ
- CodeDeployの機能を見る限りLambdaのデプロイが出来そうであるが、デプロイ戦略についてのドキュメントばかりで具体的なデプロイ方法がよく分からない
- 先達たちはcFnを使用することで自動デプロイを実現している
- **CodeDeployで設定項目もあるし名前的にDeployできそうなのに詳しい方法も実際にやっている人の記事も見つからなくて気持ち悪い！！**


以上になります。悩みを書き連ねてすみません。。是非皆さんのコメントを頂ければと思います。

ちなみに、近いうちにCodeStarを使用してみようと思っています。
ここでテンプレ選んでよしなにやってもらうのが最適解になりそうな予感がしていますが、結局じゃあCodeDeployのLambdaに関する設定は何なのっていう気持ち悪さは残りそうです。
何かわかり次第更新していきます。（最終更新：2022/02/13）
[Android]Android Studioで利用するNDKバージョンを指定

#概要
AndroidでNDKビルドを行うときに複数バージョンのNDKをインストール済みの場合に
ビルドするバージョンを指定する方法

#環境
Windows 10
Android Studio Arctick Fox | 2020.3.1 Patch 4

#課題
複数バージョンのNDKをインストール済みで特定のバージョンを使用してビルドを実行したかったです。

#対策

###Gradleに使用したいNDKバージョンを設定する

```gradle
android {
    // 省略
    defaultConfig {
        // 省略
        ndkVersion "23.1.7779620"
    }
    // 省略
}
```

###インストールされているNDKバージョンの確認

インストールされているバージョンが不明な場合は
Android Studioから確認する方法とダウンロード先から確認する方法のいずれかの方法で確認できます。

####1. Android Studioから確認する方法
######1-1. Android Studio上で以下に移動します。
File > Settings > Appearance & Behavior > Android SDK > Android Tools

######1-2. 右下の「Show Package Details」にチェックを入れます。
バージョン別にインストール状態が表示されます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487320/bd5fc57a-79e0-3260-c31b-c9f97d50b3fd.png" width=500>

####2. ダウンロード先から確認する方法
以下の配下に作成されているディレクトリがバージョン名です。
C:\Users\ <ユーザ名>\AppData\Local\Android\sdk\ndk

####2. ダウンロード先から確認する方法（古いバージョン）
Android Studioからダウンロードしてきた場合には、
あらかじめバージョニンングされたディレクトリが作成されるため
「2. ダウンロード先から確認する方法」の手順で確認できます。
しかし、手動でダウンロードしてきた場合にはバージョン名がわからないので確認する必要があります。

ダウンロードしてきたNDKディレクトリ内のsource.propertiesを参照します。

```source.properties
Pkg.Revision = 23.1.7779620
```
上記バージョンで以下にディレクトリを作成します。
C:\Users\ <ユーザ名>\AppData\Local\Android\sdk\ndk

#備考
ndkVersionは以下のようにメジャーバージョン.マイナーバージョン.ビルド番号の形式で指定しない場合には警告が出ます。

```gradle
ndkVersion "major.minor.build"
```

#最後に
改めて調べたら公式に載ってました。
参考文献に記載しておきます。

#参考文献
[プロジェクトで特定バージョンの NDK を構成する](https://developer.android.com/studio/projects/install-ndk?hl=ja#apply-specific-version)
renderにおけるオプション

インターンで実務に入っていた時にcollectionとlocalsについて理解が浅かったので、まとめようとおもいます。
以下のような例を見てみましょう

## localsオプション
```books_controller.rb
def index
 @book = Book.find(params[:id])
end
```
```index.html.erb
<%= render partial: "form", locals: { book: @book } %>
```

```_form.html.erb
<p>本のタイトルは、<%= book.title %>です。</p>
<p>本の内容は、<%= book.content %>です。</p>
```

```locals: { book: @book }```の部分は、
index.html.erbファイル内の```@book```を部分テンプレート先でbookという名前で使えるようにするよ、というのがlocalsオプションです。
実際に、```_form.html.erb```内では、bookという名前で使われていますね。

## collectionオプション
```books_controller.rb
def index
 @books = Books.all
end
```
```index.html.erb
<%= render partial: "form", collection: @books %>
```
```_form.html.erb
<p>本のタイトルは、<%= book.title %>です。</p>
<p>本の内容は、<%= book.content %>です。</p>
```

collectionオプションは、部分テンプレート先でeach処理があるときに使えるオプションです。
上記のように書くことで、collectionオプションに指定されている変数の要素分だけ部分テンプレートが繰り返し表示されます。
もしcollectionオプションを使わなかったら
```_form.html.erb
@books.each do |book|
 <p>本のタイトルは、<%= book.title %>です。</p>
 <p>本の内容は、<%= book.content %>です。</p>
end
```
collectionを使うことで、スッキリ書けますし、collectionオプションを使う方が、each文より処理が高速なんです。

以上です。何か間違いがございましたら、ご教示いただけますと幸いです。

【参考資料】

https://railsguides.jp/layouts_and_rendering.html

https://pikawaka.com/rails/partial_template
M1 Proチップ搭載MacBook ProでPower BI Desktop。MacBook Airで１時間半かかった処理がProでは？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1143963/9c80a927-bc6b-b9c2-004d-559d61106519.png)

## 10Mバイトのcsv

**「Power BI Desktop」** で処理の重いデータを更新することがあります。
**M1Proチップ搭載MacBook Pro**で初めて動かしました。

使ったデータは、

* データ提供元：ジョンズ・ホプキンス大学
* サイト：[COVID-19 Dashboard
](https://gisanddata.maps.arcgis.com/apps/dashboards/bda7594740fd40299423467b48e9ecf6)

https://gisanddata.maps.arcgis.com/apps/dashboards/bda7594740fd40299423467b48e9ecf6

* ファイルサイズ：10.4Mバイト（2022年2月12日時点）
* ファイルタイプ：csv（毎日更新）

です。
サイズが大きいことに加え、Power Query エディターで色々と加工したり、クイックメジャーの計算式を加えたりしているので、更新に時間がかかるデータになっています。

## MacBook Air計測時間

まず、**M1**チップ搭載**MacBook Air**（13インチ）で更新した場合の結果です。
**「Parallels Desktop 17 for Mac」** をインストールした **「MacBook Air」** で **開発者向けプレビュー版の **Windows 11**を 動かしています。

* チップ:	Apple M1
* コアの総数:	8
* Windows 11への割り当て：2 　※Parallels Desktopの推奨設定
* メモリ:	8 GB
* Windows 11への割り当て：2 G 　※Parallels Desktopの推奨設定

| 状態 | 時間 |
|:-:|:-:|
| Power BI Desktop起動（更新前のグラフ表示）  | 約７分  |
| グラフ更新（約3週間分）  | 約1時間25分  |

## MacBook Pro計測

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1143963/b73dce12-8be0-8143-18cf-f67ff284495e.png)

まず、**M1 Pro**チップ搭載**MacBook Pro**（14インチ）で更新した場合の結果です。

* チップ:	Apple M1 Pro
* コアの総数:	10
* Windows 11への割り当て：4 　※Parallels Desktopの推奨設定
* メモリ:	16 GB
* Windows 11への割り当て：6 G 　※Parallels Desktopの推奨設定

| 状態 | 時間 |
|:-:|:-:|
| Power BI Desktop起動（更新前のグラフ表示）  | 約1分40秒  |
| グラフ更新（約3週間分）  | 約30分10秒  |

## Core i5 ノートPC計測

Windows 10搭載ノートPCでは、こうなりました。
Power BI Desktopはx86/x64系アプリなので、最新のインテル系CPUではないとはいえ、やはりこちらの方が速いです。
ARM版のWindows 11とPower BI Desktopの登場を待ち望みます。

* チップ:	Intel Core i5 1.6GHz
* コアの総数:	4
* メモリ:	8 GB

| 状態 | 時間 |
|:-:|:-:|
| Power BI Desktop起動（更新前のグラフ表示）  | 約50秒  |
| グラフ更新（約3週間分）  | 約6分40秒  |

## MacBook Pro計測（割り当てメモリー変更）

最後に、Parallels Desktopの推奨設定を変更して計測しました。
現在持っているParallels Desktopでは、これ以上コアの割り当てを増やせないので、メモリを最大値（8G）に変更しました。

* チップ:	Apple M1 Pro
* コアの総数:	10
* Windows 11への割り当て：4 　※Parallels Desktopの推奨設定
* メモリ:	16 GB
* Windows 11への割り当て：8 G 　※Parallels Desktopの推奨設定

| 状態 | 時間 |
|:-:|:-:|
| Power BI Desktop起動（更新前のグラフ表示）  | 50秒  |
| グラフ更新（約3週間分）  | 約11分40秒  |

開発者向けプレビュー版のWindows 11やParallels Desktopアップデートでもう少し早くなれば、と期待したくなリます。

**了**
S3の権限を限定したIAMを使いWinSCPするときの注意点

WinSCPはバージョン5.13からS3への接続にも対応するようになっているが。

アクセスできるバケットを制限したIAMでWinSCPで利用しようとしたらエラーになったのでメモ。

## 今回利用した環境

- Windows 10 21H1
- WinSCP 5.19.5

## 今回起こった事象

下記のような指定されたバケットのみ、list,put,get,deleteができるようなポリシーを持ったIAMユーザの資格情報でWinSCPで接続しようとしたらエラーになった

```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "s3:ListBucket",
            "Resource": "arn:aws:s3:::バケット名"
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:GetObject",
                "s3:DeleteObject"
            ],
            "Resource": [
                "arn:aws:s3:::バケット名/*"
            ]
        }
    ]
}
```

アクセスキーとシークレットキーを入力してログインしようとした所

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/687dfd0a-e119-fdde-282d-a4b431367d50.png)

エラーが発生

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/c26d98a0-9e80-d437-e5a6-9108d88992e8.png)

なんとなく実行する前から、バケットをリストできないけどどう動作するの？　って感じがありましたが。
案の定エラー。

WinSCPのドキュメントを確認した所、下記ページに記載がありました。

[Connecting to Amazon S3 service](https://winscp.net/eng/docs/guide_amazon_s3)

IAMにバケットをリストする権限がない場合では、リモートディレクトリの設定でバケットを指定する必要がありそうです。

## リモートディレクトリにバケット名を指定

リモードディレクトリにバケット名を指定して、アクセスするバケットを指定します。

設定を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/c882e91d-b5f6-8ab3-4b30-e5aedb44f312.png)

環境　ー＞　ディレクトリ　ー＞　リモートディレクトリにバケット名を設定して　OK選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/fa1a2f30-89b5-cf8f-00ff-50a908dfb87b.png)

リモートディレクトリにバケット名を指定した状態であらためてログインをしてみると、先程のエラーが解消された事を確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/3ae34bc8-537e-c713-10f2-16aeb4911bbc.png)

## 総評

ガイドを見るとそのものズバリのケースについて記載がありました。
WSLへの権限追加 (Permission denied (os error 13))

## 1. 経緯

WSL で Rust を使うため、cargo をインストールしようとしたら以下のエラーが表示された。

```linux
error: could not create bin directory: '/home/usr/.cargo/bin': Permission denied (os error 13)
```

## 2. 対応

ls -l 　で確認してみた。

```linux
drwxr-xr-x 10 root root 4096 Aug  5  2021 others
drwxr-xr-x  2 root root 4096 Feb 13 00:06 user
```

mkdir も Parmission denied、 sudo を付けても同様だった。そこで権限の追加を色々調べて試していたら、以下のコマンドで解決した。

```linux
/home$ sudo chmod o+x <username>
```

ポイントは、例えば上のように home ディレクトリにいる場合、権限を付与したいディレクトリ名を相対パスで記述する。

chmod (change mode)は権限を追加・解除の変更コマンド、o は他の(other)ユーザー、x は実行(execute)を表す。x の箇所を r や w にしてその他の権限を追加できる。 反対に+のところを-にすれば権限の解除が可能。

結果:

```linux
drwxr-xr-x 2 root      root      4096 Oct  3 16:51 Program
d------rwx 6 user_name user_name 4096 Feb 13 00:46 usr
```
ddコマンドでファイルを作成しようとしたらメモリが足りなくてプロセスkillされた

ファイルを作成するコマンドの一つにddコマンドがある。

ddコマンドを用いて\tmpに1GBのファイルを作成しようとしたところ、以下のようになった。

[root@concentrate tmp]# dd bs=1000000000 count=1 if=/dev/zero of=file2
Killed
[root@concentrate tmp]#

Killed(プロセスkill)が発生している。
容量の問題化と思い、容量を確認したが、容量は5.8GB空いている。

[root@concentrate tmp]# df -h
Filesystem      Size  Used Avail Use% Mounted on
devtmpfs        475M     0  475M   0% /dev
tmpfs           483M     0  483M   0% /dev/shm
tmpfs           483M  468K  483M   1% /run
tmpfs           483M     0  483M   0% /sys/fs/cgroup
/dev/xvda1      8.0G  2.3G  5.8G  29% /
tmpfs            97M     0   97M   0% /run/user/1000
[root@concentrate tmp]#


メモリに原因があると思ったので、vmstatコマンドを裏で実行させながら再度コマンドを実行したところ、
vmstatの出力が以下のようになった。


procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 1  0      0 853328      0  45940    0    0     0     0   47   96  0  1 99  0  0
 2  1      0 282916      0  17324    0    0  3492   132  266  311  0 30 35  1 34　←この直後にkilled
 0  0      0 868240      0  32648    0    0 13245     0  225  966  1  2 86 10  1



つまり、ファイルを作成する際、一時的にメモリに書き出して、作成し終わった段階でファイルとして保存しているような動きをしていることが分かった。(今更)
接続中の複数のAndroidデバイスに一括でadb installするコマンド

# 経緯
接続中の複数のAndroidデバイスに、同一のapkを一括でインストールしたい際にStack　Overflowの以下の記事の

java - How can I adb install an apk to multiple connected devices? - Stack Overflow
https://stackoverflow.com/questions/8610733/how-can-i-adb-install-an-apk-to-multiple-connected-devices
この回答のワンライナーで元気に暮らしていたのですが
https://stackoverflow.com/a/8610829/2227705

Android 11以降で `adb pair` コマンドで接続したデバイスはSerial Numberが長いせいか（詳細不明）xargsまわりが正常に動作してくれなくなりました。

Wi-Fi 経由でデバイスに接続する（Android 11 以降）
https://developer.android.com/studio/command-line/adb?hl=ja#connect-to-a-device-over-wi-fi-android-11+

# 修正
そんなわけで、tmpなファイルにいったん出力して、それを読み込むように修正しました。

- xargsの文字列長制限あたりにひっかかったと思われるためtmpファイルに出力して読み出すように変更
- offlineやunauthorizedを除外するために、"device"でgrepして有効なデバイスに限定
- `~/.bash_profile` あたりに設定しておき、`$ adb-devices` や `$ adb-installs hoge.apk` のように使います
- 妙に長くなってしまってイマイチ感はあります


```sh
# adb devicesからserial numberを抽出してmodel名を取得
function adb-devices() {
  adb devices | tail -n +2 | grep "device" | cut -sf 1 > /tmp/serials
  for SERIAL in `cat /tmp/serials`; do
    echo -n "$SERIAL " && adb -s $SERIAL shell getprop ro.product.model
  done
}

# adb devicesからserial numberを抽出してmodel名を取得しつつ引数1のapkをadb install
function adb-installs() {
  adb devices | tail -n +2 | grep "device" | cut -sf 1 > /tmp/serials
  for SERIAL in `cat /tmp/serials`; do
    echo -n "$SERIAL " && adb -s $SERIAL shell getprop ro.product.model && adb -s $SERIAL install -r -d -t $1
  done
}
```
ROCm 5.0 で RDNA2 GPU がサポートされたようです

もともと ROCm 4.5 で RDNA2 一応動いていましたが, 正式対応？になったようです.

https://www.phoronix.com/scan.php?page=news_item&px=Radeon-ROCm-5.0

https://rocmdocs.amd.com/en/latest/Current_Release_Notes/Current-Release-Notes.html

リリースでは workstation 系とありますが, 民生品(e.g. RX6800)も対応しています.

あとは細かいところでは rocm-smi などが Radeon VII などでやっとまともに動くなっています
(いままでは sensor 読み出しエラーとかでていた)

amdgpu 21.40 で RDNA2 で HIP(CUDA っぽいの)が動くようになりました(experimental)
https://qiita.com/syoyo/items/5e6f4cc056a94060329e

OpenGL とか通常利用用のドライバ(amdgpu)の統合もすすみ, より CUDA のように民生品構成の PC 環境でも普通に使える感じになってきました.

Windows での ROCm 対応ももうすぐっぽい?(夏の Blender 3.2 リリースと同時?)ようですので, やっと CUDA と同等になってきた感じでしょうか.
React MUI - PC画面で表示するエリアはMobileで非表示表示の切り替え


##背景

ResponsiveデザインはGridシステムを利用すれば簡単にできる。

ただ、Responsiveしつつ、PC画面ではデフォルトで表示するエリアをMobileではデフォルトで表示せず、ボタンなどのトリガーで表示させたいと思った。結果的に、ロジックは難しくないが、頭の回転が遅くて考えるのに時間がちょっとかかった。

##対策

```page.js
<Grid item xs={12} sm={4}>
   <Box sx={{
      display: { xs: 'block', sm: 'none' },
   }}>
    
     <Button color="secondary" onClick={() => this.showform(this.state.xsState)}>Show/Hide Image Upload Form</Button>
                                
   </Box>
   <Box sx={{ display: { xs: `${this.state.xsState}`, sm: 'block' } }}>
       <UploadForm />
   </Box>
</Grid>
```

Boxのxsの値を動的に変更します。

```page.js
    showform = (currentState) => {
        if (currentState == 'none'){
            this.setState({ xsState: 'block'})
        } else {
            this.setState({ xsState: 'none'})
        }
    }
```

はい、簡単でした。
【npm】npmコマンド一覧

## はじめに
　本記事は、プログラミング初学者が、学習を進めていて疑問に思った点について調べた結果を備忘録も兼ねてまとめたものです。
　そのため、記事の内容に誤りが含まれている可能性があります。ご容赦ください。
　間違いを見つけた方は、お手数ですが、ご指摘いただけますと幸いです。

## npmコマンド一覧

### 初期設定

```:ターミナル
  $ npm init
```
 package.json ファイルが生成されます。

### パッケージのインストール

```:ターミナル
 $ npm install パッケージ名
```

上記の代わりに以下のように記述することも可能です。

```:ターミナル
 $ npm i パッケージ
 $ npm add パッケージ
```

また、バージョンを指定してインストールする場合は以下の通りパッケージ名の後に`@バージョン`を記述します。

```:ターミナル
 $ npm install パッケージ名@バージョン
```

以下のように記述することでグローバルインストールすることができます。
グローバルインストールをすることで、PC上のどのディレクトリからもコマンドが実行できる場所にインストールされます。
しかし、グローバルインストールをするとpackage.jsonにパッケージの情報が記載されず、他の人package.json渡して、npm install　してもらっても開発環境が出来ないため、コマンドラインツールとして使用したいものなどに限ってグローバルインストールするようにした方が良いようです。

```:ターミナル
 $ npm install -g パッケージ名
```

package.jsonへの依存関係の追記に関するオプションは以下の通りです。

```:ターミナル
package.jsonへ書き込みをしない場合
 $ npm install パッケージ名 --no-save

package.jsonへ書き込みをする場合（npm v5以降はデフォルトで--saveするため記述する必要なし）
 $ npm install パッケージ名 --save

package.jsonのoptionalDependenciesに依存するが必須ではないパッケージとして追記
 $ npm install パッケージ --save-optional

package.jsonのdevDependenciesに開発に使用するパッケージとして追記
 $ npm install パッケージ名　--save-dev

```

package.jsonに記述されたパッケージをインストールするには以下の通り記述します。

```:ターミナル
 $ npm install
```

### インストール済みパッケージ情報の表示
インストール済みのパッケージ一覧を表示します。

```:ターミナル
 $ npm list
```

上記の代わりに以下のようにように記述することが出来ます。

```:ターミナル
 $ npm ls
 $ npm la
 $ npm ll
```

グローバルインストール済みのパッケージ一覧を表示するには以下の通りです。

```:ターミナル
 $ npm list -g
```

第一階層のみのパッケージを表示するには以下の通りです。

```:ターミナル
 $ npm list --depth=0
```

### パッケージのアップデート
package.jsonに記述されたパッケージをアップデート

```:ターミナル
 $ npm update
```

指定したパッケージをアップデート

　```:ターミナル
 $ npm update パッケージ名
 $ npm update パッケージ名 -g
```

インストール済みのパッケージに最新バージョンがあるか確認する
　
```:ターミナル
 $ npm outdated
 $ npm outdated -g
```

### パッケージのアンインストール

```:ターミナル
 $ npm uninstall パッケージ名
 $ npm uninstall パッケージ名 -g
```

上記の記述の代わりに以下のように記述することも可能です。

```:ターミナル
 $ npm un パッケージ名
 $ npm unlink パッケージ名
 $ npm remove パッケージ名
 $ npm rm パッケージ名
 $ npm r パッケージ名
```

package.jsonにアンインストールしたパッケージ情報を反映するには以下のように記述します。

```:ターミナル
 $ npm uninstall --save
 $ npm uninstall --save-optional
 $ npm uninstall --save-dev
```

### 未使用のパッケージを削除
package.jsonに記述されていないnode_modules内のパッケージを全て削除

```:ターミナル
 $ npm prune
```

### npmリポジトリからパッケージ情報を表示
キーワードに関連するパッケージを検索

```:ターミナル
 $ npm search パッケージ名
```

パッケージの詳細情報を表示

```:ターミナル
 $ npm view パッケージ名
```

上記の記述の代わりに以下のように記述することも可能です。

```:ターミナル
 $ npm v パッケージ名
 $ npm info パッケージ名
 $ npm show パッケージ名
```

### パッケージのインストールパスを表示

```:ターミナル
 $ npm root
 $ npm root -g
```

パッケージのコマンドパスを表示

```:ターミナル
 $ npm bin
 $ npm bin -g
```
１分でわかる匿名クラス　JavaGold取得への道（内部クラス編）

徹底攻略Java SE 11 Gold問題集（黒本）を読んで最初にぶち当たる壁「内部クラス」ついて、４つの記事に分けてまとめました。
僕のようなJava初心者や、JavaGoldの資格取得に向けて、勉強をしている方にこの記事がお役に立てれば幸いです。
#はじめに
内部クラスには４種類あります。
今回はその中の匿名クラスについて解説していきます。

 ・[インナークラス](https://qiita.com/110shun/items/882699c71db9dccea7a8)
  [・staticインナークラス](https://qiita.com/110shun/items/ee2c3383b4817751ba7b)
 ・[ローカルクラス](https://qiita.com/110shun/items/da476b32117f904ea4d4)
 ・匿名クラス👈

##匿名インナークラスとは？
一言で表すと、インターフェースを実現したクラスなどそのクラスとして名前のないクラスを宣言したものです。
そのクラスがどのようなフィールドやメソッドを持つべきかクラスの実装内容を定義できます。

__要するにインスタンス化するインターフェイスに実装がなくても、インスタンス化する時に実装できてしまう__

:::note warn
匿名クラスは名前が無いためコンストラクターは定義できません。
:::
#どのように使うの？
###定義方法
下記のコードのようにコンストラクタを呼び出しの後ろに中カッコで作ったものを定義するだけです。

```Human.java
public interface Human {

}
```

```Main.java
public class Main{
 public static void main (String[] args){
	var human = new Human(){
	  public void run(){
	   System.out.println("走れ！！");
	  }
	};
  human.run();
 }
}
```

```
結果
走れ！!
```
:::note info
JavaSE10以降からはvarを使った変数宣言が可能です。
:::
#まとめ
・インターフェースを実現したクラスなどそのクラスとして名前のないクラスを宣言したもの
##参考文献
・徹底攻略Java SE 11 Gold問題集
・[Javaの匿名クラス（無名クラス）の使い方【初心者向け】](https://techacademy.jp/magazine/19027)
テストで使っているツールやドキュメントなどを、まとめ


##テストで使っているツールやドキュメントなどを、まとめ
何か思い出しましたら、追記していきたいと思います。


##拡張機能
・サイト内の、色が確認出来ます。
https://chrome.google.com/webstore/detail/colorzilla/bhlhnicpbhignbdhedgjhgdocnmhomnp?hl=ja
https://chrome.google.com/webstore/detail/colorpick-eyedropper/ohcpnigalekghcmgcdcenkpelffpdolg

・サイト内の、サイズや、位置を確認出来ます。
https://chrome.google.com/webstore/detail/page-ruler-redux/giejhjebcalaheckengmchjekofhhmal/related?hl=ja&

・サイト内にあります、画像を一括で落とせます。
https://chrome.google.com/webstore/detail/image-downloader/cnpniohnfphhjihaiiggeabnkjhpaldj?hl=ja&

・サイト内の、タイトルやALTが確認出来ます。
https://chrome.google.com/webstore/detail/seo-meta-in-1-click/bjogjfinolnhfhkbipphpdlldadpnmhc?hl=ja

・サイト内の、リンク切れが確認出来ます。
https://chrome.google.com/webstore/detail/check-my-links/ojkcdipcgfaekbeaelaapakgnjflfglf

・サイト内の、誤字脱字が確認出来ます。
https://chrome.google.com/webstore/detail/%E6%96%87%E7%AB%A0%E6%A0%A1%E6%AD%A3%E3%81%A8%E8%A1%A8%E8%A8%98%E3%82%86%E3%82%8C%E3%83%81%E3%82%A7%E3%83%83%E3%82%AF%E3%83%84%E3%83%BC%E3%83%AB/melcjmapbnbppalonglljkadkemjajjf



##ブラウザのバージョン確認する方法
下記サイトへアクセスする。
https://aprico-media.com/ua

ブラウザの設定から確認する。
https://www.surugabank.co.jp/surugabank/kojin/direct/internet_mobile/goriyou_kakunin.html


##拡張機能使い方
拡張機能のサイトへアクセスする。
↓
ボタン押してインストールする。
![Screenshot from 2022-02-12 23-10-21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148394/c82fa8d5-020f-f411-3057-261b00803814.png)
![Screenshot from 2022-02-12 23-10-26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148394/a8cc769a-44d7-8bce-e506-0bd7ef682631.png)
↓
ピンで止めると見れて便利！
![Screenshot from 2022-02-12 23-06-57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148394/a8685d31-84b9-da1f-8d80-ba050e74e582.png)

![Screenshot from 2022-02-12 23-06-12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148394/50a966c1-f03f-b469-3c3f-cabd353108ce.png)

![Screenshot from 2022-02-12 23-06-18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148394/6f9b4a61-8a10-16e3-c150-2a038039a633.png)


使えなくなったり、サイト内へ別途設定必要なこともありますので、ご注意💁‍♀️
ブラウザのバージョン新しくなると吹き飛んじゃったりします(´；ω；｀)



##ドキュメント
・基本的な規約。
https://datatracker.ietf.org/
https://www.w3.org/
https://developer.mozilla.org/en-US/docs/Web/HTTP
https://www.ietf.org/rfc/

・テスト自動化。
https://testcafe.io/

#では
よいテストライフを〜（？）
資料紹介「圏論的な<ものの見方・考え方>入門」

## はじめに
「圏論」について興味を持ちながらもどんな記事や書籍に目を通してみてもまったく理解できなかった自分が、この資料のおかげでやっと入口に立てた気がします。
特に興味深かったに内容を抜粋しますので、興味を持たれた方はぜひ原本をご一読ください。

## 出典
[圏論的な<ものの見方・考え方>入門](https://www.jstage.jst.go.jp/article/jcss/28/1/28_2020.075/_pdf/-char/ja) (西郷 甲矢人)

## 抜粋
### 数学とは何か、数学とは「矢印」を引くことである

### 圏論とは、ある数学分野を全体的に書き直す暴挙だった(だがのちに有効性が明らかにもなる）
>「伝説的な数学者グロタンディーク」は代数幾何学という分野を圏論を用いて全体的に書き直すという「暴挙」に出ました。
考えてみてください、皆さんが習ってきた高校数学を、全部矢印で書き直されたらどんな気持ちになりますか。
こんなお風な大掛かりなことをやられたので、多くの数学者たちはもうわーっとなったんです。
のちにはその有効性が明らかになりましたが。

#### 事例「ジャイアントケルプの減少」(「昆布 ウニ ラッコ」→ 「合成 結合律 関数」)

#### 数というのは全て働きと見做すことができる。2という数は「2倍するという働き」とみることができる
> 「数値で示せ」とかよく言われるが、数って「現実」なのか。「数はものではないし、また重さや体積といった量そのものでもない
> ★そうではなく、数というのは量と量をつなぐ「働き」
> 特に「1」はとても大事。これは「逆」ということを考えるために「何もしない」を定義しておかないといけないというのが大きい

#### 線型代数というのは、多次元の量を多次元の量に変換することを考える
> 「線型性」という性質を満たすものを「線型写像」と言う
> 線型写像というのは簡単に言えば多次元の量の正比例関数
> 線形写像というのは行列というもので表現でき、行列の算法はきわめて役立つ
> 行列というのは、世の中でこれほど役に立つものはないんじゃないかというくらい役に立つ

#### パン工場というのは一つの行列みたいなものと考えることもできる
> 小麦粉何キロ、水何リットル、と入力を並べると、その日に作るパンの量が出てくる

#### 線型写像、とくに行列からなる圏の研究が線形代数であると言うことができる

> 「順序を交換できる」という意味で「可換」と呼ぶ
> 圏において何らかの可換図式があるとき、それはとても重要な情報になる

### 「関手」という概念について
#### 「モルというのは米原駅みたいなもの」
> 「モルを考ええることに何の意味があるのかというと、体積と原子の個数をつなげるいいポイントにあるということ
> 「行き方」を矢印、「行き方をつなげること」を合成、「動かないという『行き方』を恒等射とみなせば、
> 交通ネットワークも「圏」として考えられる

#### 「比喩」とは一体なにか
>  この二つの圏のなかで、モルと米原駅は、どう似ているのか
> ★ものが似ているのではない。関係性が似ている

#### こうした圏どうしの対応付けを「関手」と言う。圏の構造を保った変換が「関手」

> 図形の世界の話を、量の世界の話に持ってくるものがホモロジー関手

#### 「円周は整数の如し、円板はゼロの如し」

####「ブラウワーの不動点定理」
> 桶の中の砂金をかき混ぜるとき、少なくとも一粒、結果としてその場を動いていない砂金が必ずあることを証明する
> 証明は「そういう点」すなわち「不動点」がなかったとしたら、ありえないことが実現できてしまうということを明らかにすることによってなされる

####「比喩・類推(アナロジー)」の数学版が、関手という概念。

####「よい(good)数学者はアナロジーがわかる。偉大な(great)数学者はアナロジーの間のアナロジーがわかる」

#### ★関手どうしを比較することは「自然変換」と言い、実はこれを考えようとしたことが圏論の歴史的起源
> 関手と関手のアナロジーが自然変換である

> 相対性理論においては、互いに等速直線運動している観測者の座標系(「慣性系」)どうしで空間座標のみならず時間の値までも変わってくるということで「相対性」というが、
> みんなそれぞれ違うというだけではなく、互いに別な座標系での見え方のあいだに変換が存在する
>「ローレンツ変換」も、さまざまな表現のあいだの「変換」の一例
> 自然変換というのは、こうした「見方の転換」のようなものを非常に一般化して定式化したものと思ってもらえればよい。

#### 座標を定めると、その座標についての表現がでるが、これが「関手」に一般化され、関手のあいだの変換関係が一般化されたものが自然変換
> 詳しいことは「圏論の道案内 (西郷 甲矢人・能美 十三)」

#### グロタンディークが矢印には「何も仮定しない」と言った

#### プログラムも矢印と思ってよい。

#### 脳の中で起きている「連想」というプロセスも矢印とみなせるかもしれない
> 生態学の教科書を見ますと、矢印だらけ。
> 代謝経路のネットワーク、これは普通はネットワークサイエンスと呼ばれるもので、圏論の領域とは違うと考えられていますが、数学的には近いもの。

#### では、世の中はなぜこんなに矢印だらけなのか、
> ジョージ・レイコフという認知言語学を創始した人物の一人が「数学とは何か」という問いに対して、
> 圏論の創始者の一人であるソンダース・マックレーンの見解を踏まえたうえでこう言っています。
> 「数学とは、人が自分の経験を理解し理路を辿るために使う構造の研究である。
> その構造は、概念以前の身体的経験に内在し、比喩(メタファー)を通じて抽象化される」

#### 例えば「てにおは」というのは日本語を学ぶ人にとって難しい
> 日本語を現に使える人がいるということは、そこにはきっちり論理構造があるはずで、
> それは圏論的な方法によって抽出されるかもしれない。

#### 「小耳に挟む」という言葉があります
> 「横車を押す」「粗熱を取る」
> よく考えてみると不思議なこういう言い回しの背後にある構造を「範疇文法」というやつ
> で理解しようという話。この範疇文法というのはある種の圏論的構造として理解できて
> 現に圏論の専門家たちが重要な貢献をしているようです。

#### 「命題の間の矢印」
> 推論というものには根源的に圏の構造が見出しうる

#### 「章立ての構造・基づけの関係」
> 「第一章なしに第二章はない」という関係
> 「AならばB」ではなくて「AでないならBでない」という関係
> 現象学なら「基づけの関係」という
> 時間的な順序を込めてより一般的な言葉でいえば「因果」

#### 「因果の論理」
> 「これをなくせばこれがなくなる」というのは医学や疫学にも通底する論理と言えます

#### 圏論的な見方・考え方は分野横断的に役立つ
> 量子論「EPRパラドックス」一見相対論に反しそうに見えても実際には反しない
> 「なぜ反しないのか」ということを明晰に理解するときにも「因果とは何か」というものをしっかり
> 考えることが大事

#### 相対論の本質は因果のネットワークの構造として宇宙を捉えることにあり
Linuxのカーネルモジュール(モジュール)をロードしてみる

Linuxにおけるモジュールを自分なりに調べてみた。  

(前提)モジュールとは
カーネルモジュールとは、オペレーティングシステム（OS）の中核部分であるカーネルに機能を追加するよう設計されたソフトウェア部品のこと。単にカーネルモジュールといった場合はLinuxカーネルに追加できるプログラムを指すことが多い。

(参考)https://e-words.jp/w/%E3%82%AB%E3%83%BC%E3%83%8D%E3%83%AB%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB.html


というわけで、モジュール=カーネルに追加するプログラムのことである。

ちなみに、モジュールは「/lib/modules」配下に「.ko」という拡張子で格納されている。

[ec2-user@concentrate 5.10.82-83.359.amzn2.x86_64]$ ls -lR | grep .ko | wc -l
959
[ec2-user@concentrate 5.10.82-83.359.amzn2.x86_64]$

「/lib/modules」配下に「.ko」の拡張子のファイルは959個存在した。



●現在有効のモジュールを確認してみる(lsmodコマンド)

[ec2-user@concentrate 5.10.82-83.359.amzn2.x86_64]$ lsmod
Module                  Size  Used by
sunrpc                667648  1
dm_mirror              28672  0
dm_region_hash         24576  1 dm_mirror
dm_log                 20480  2 dm_region_hash,dm_mirror
dm_mod                159744  2 dm_log,dm_mirror
dax                   106496  1 dm_mod
crc32_pclmul           16384  0
ghash_clmulni_intel    16384  0
aesni_intel           372736  0
crypto_simd            16384  1 aesni_intel
cryptd                 28672  2 crypto_simd,ghash_clmulni_intel
glue_helper            16384  1 aesni_intel
mousedev               24576  0
ata_piix               40960  0
libata                303104  1 ata_piix
scsi_mod              270336  1 libata
psmouse                36864  0
button                 24576  0
ena                   139264  0
crc32c_intel           24576  0
[ec2-user@concentrate 5.10.82-83.359.amzn2.x86_64]$

詳細は以下。
Module：モジュール名
Size：モジュールのサイズ
Used by：依存しているモジュールの数と依存モジュール名
※どのモジュールが何かはよくわからないのでスルー。



●実機(Amazon Linux)でモジュールを追加してみる。
基本的にモジュールの追加・削除(ロード・アンロード)はコマンド実行により自動的に行ってくれる。

①depmodコマンドを実行して、依存関係を更新する
　モジュールどうしは互いに依存しているものがあり、それらの関係性を更新する作業から始める。
　※依存関係は「modules.dep」ファイルで確認可能。

[root@concentrate ~]# cat /usr/lib/modules/5.10.82-83.359.amzn2.x86_64/modules.dep | head
kernel/arch/x86/crypto/glue_helper.ko:
kernel/arch/x86/crypto/twofish-x86_64.ko: kernel/crypto/twofish_common.ko
kernel/arch/x86/crypto/twofish-x86_64-3way.ko: kernel/arch/x86/crypto/twofish-x86_64.ko kernel/crypto/twofish_common.ko kernel/arch/x86/crypto/glue_helper.ko
…

このような感じで依存関係が記載されている。

[root@concentrate ~]# depmod
[root@concentrate ~]#

特に何もなくコマンドが終了した。


②modprobeコマンドでモジュールをロードしてみる。
コマンドの書式は以下
modprobe モジュール

今回は-vオプションで詳細を表示させつつ、「tcp_lp」というモジュールをロードする。

[root@concentrate 5.10.82-83.359.amzn2.x86_64]# modprobe -v tcp_lp
insmod /lib/modules/5.10.82-83.359.amzn2.x86_64/extra/net/ipv4/tcp_lp.ko
[root@concentrate 5.10.82-83.359.amzn2.x86_64]#

insmodが表示され、正常終了した。





結論：モジュールを一つロードしただけではよくわからなかった。
ただ、モジュールのロードに使用するコマンドや順序、ファイルの場所などは理解できた。
今後意図的にモジュールをロードする機会があったときに再度リベンジしたい
【JavaScript関数ドリル】を毎日やる【勉強用】その４




#【JavaScript関数ドリル】初級編のtakeRight関数の実装のアウトプット

       
```javascript:takeRight関数の挙動
_.takeRight([1, 2, 3]);
// => [3]
 
_.takeRight([1, 2, 3], 2);
// => [2, 3]
 
_.takeRight([1, 2, 3], 5);
// => [1, 2, 3]
 
_.takeRight([1, 2, 3], 0);
// => []

```

配列から第2引数分だけ末尾から抽出する。第2引数がない場合は末尾を、０の時は空配列を出力する。
##takeRight関数の課題内容

https://youtu.be/nxI082IC7Xs

##takeRight関数に取り組む前の状態
- 引数なしのパターンに応じるにはif,elseを使えばよさそう
- 少し検索すればできそう

##takeRight関数に取り組んだ後の状態
- ifの柔軟な使い方が理解できた
- returnの位置などの理解がまだまだ足りないと感じた
- 解答コードのような発想は全く思い付かなかった
- 検索せずに取り組んでみた時は、全く見当違いのことをやっていた


##takeRight関数の実装コード

```javascript:
const takeRight = (array, num) => {
    let newArray = [];
    if (num === 0) {
        return newArray;
    }
    if (num > 1) {
        const popNumber = num;
        newArray = array.slice(-popNumber);
    } else {
        newArray = array.slice(-1);
    }
    return newArray;
};

console.log(takeRight([1, 2, 3, 4, 5, 6], 3));
//[4,5,6]
console.log(takeRight([1, 2, 3, 4, 5, 6]));
//[6]
console.log(takeRight([1, 2, 3, 4, 5, 6], 8));
//[1,2,3,4,5,6]
console.log(takeRight([1, 2, 3, 4, 5, 6], 0));
//[]
```



##takeRight関数の解答コード

```javascript:
function takeRight(array, n = 1) {
  if(n === 0) {
    return [];
  }
  if(n > array.length) {
    return [...array];
  }

  const takenArray = [];
  for(let i = 0; i < n; i++) {
    // array [1, 2, 3]
    // 1 + i => 1, 2, 3
    // array.length =>
    //   3 - (1 + 0) = 2,
    //   3 - (1 + 1) = 1
    //   3 - (1 + 2) = 0
    const indexFromRight = array.length - (1 + i)
    takenArray.unshift( array[indexFromRight] );
  }

  return takenArray;
}

console.log( takeRight([1, 2, 3]) );
// => [3]

console.log( takeRight([1, 2, 3], 2) );
// => [2, 3]

console.log( takeRight([1, 2, 3], 5) );
// => [1, 2, 3]

console.log( takeRight([1, 2, 3], 0) ) ;
// => []
```
１分でわかるローカルクラス　JavaGold取得への道（内部クラス編）

徹底攻略Java SE 11 Gold問題集（黒本）を読んで最初にぶち当たる壁「内部クラス」ついて、４つの記事に分けてまとめました。
僕のようなJava初心者や、JavaGoldの資格取得に向けて、勉強をしている方にこの記事がお役に立てれば幸いです。
#はじめに
内部クラスには４種類あります。
今回はその中のローカルクラスについて解説していきます。

 [・インナークラス](https://qiita.com/110shun/items/882699c71db9dccea7a8)
 [・staticインナークラス](https://qiita.com/110shun/items/ee2c3383b4817751ba7b)
 ・ローカルクラス👈
 [・匿名クラス](https://qiita.com/110shun/items/e912bab6c55982f50494)

##ローカルクラスとは？
一言で表すと、メソッドの中にクラスを定義したクラスのことを指します。
メソッドごとに実装内容を変えることできます。
知っておいて頂きたいルールが２点ごさます.
　__・ローカルクラスが参照するローカル変数はローカルクラスの定義よりも前に定義される__
　__・ローカルクラスから参照するローカル変数は実質的にfinalでなければいけない__
この２点が守れないとコンパイルエラーになります。
###ローカルクラスとアクセス修飾子の関係
下記の表はローカルクラスとアクセス修飾子の関係を表しています。

| public | protected | private | abstract |　final　| static |
|:-:|:-:|:-:|:-:|:-:|:-:|
| × | × |  ×|  ○ |○  |　× |

:::note warn
上記の表で×のアクセス修飾子を定義するとコンパイルエラーになるので注意してください。
:::
##どの場面で必要か？
そこそこ複雑な初期化や、処理を持つもののコンラクター内でしか必要のないクラスが出てるくる場合がよくあります。
そういった場合匿名クラスを実装すると、可読性に欠けるので、そういった時にローカルクラスを利用します。


#どのように使うの？
###定義方法
下記のコードのようにメソッドの中にクラスを定義するだけです。
インスタンスの生成方法は同じメソッド内でローカルクラスのインスタンスを生成します。
下記のコードの例だとexcuteメソッドのスコープ内で定義をします。

```Outer.java
public class Outer{
  public void execute(){
   class LocalClass{
     void localExecute(){
       System.out.println("ローカルクラスのメソッドです。");
     }
   }
  //ローカルクラスをインスタンス化
  LocalClass local = new LocalClass();
  local.localExecute();
  }
 }
```


##実装結果
```main.java
public class Main{
 public void main (String[] args){
  Outer.outer = new Outer.();
  outer.execute();
  }
}
```
```
結果
ローカルクラスのメソッドです。
```

#まとめ
・ローカルクラスとは、メソッド内で定義したクラスのこと
・インスタンスの生成方法は同じメソッド内でローカルクラスのインスタンスを生成します。
##参考文献
・徹底攻略Java SE 11 Gold問題集
[・あなたの知らない、4つのマニアックなJava文法](https://atmarkit.itmedia.co.jp/ait/articles/1007/27/news103_3.html#06)
[・JAVA インナークラス・ローカルクラス](https://qiita.com/icelandnono/items/808a3658f0481288f764)
terraform applyの内部実装

※この記事はあくまで僕の備忘録であり、内容の整合性を保証するものではありません。

# モチベーション
terraform applyの内部実装を調べたことがなかった。Go言語で実装されているので、コードを読んだ。
なお、今回読んだコードは、[hashicorp/terraform](https://github.com/hashicorp/terraform)である。

# 1.コマンド
各コマンドは、[commands.go](https://github.com/hashicorp/terraform/blob/main/commands.go#L51-L409)で設定されている。

すべてのコマンドを網羅的に調べるのはしんどいので、以下ではapplyに絞ってコードを読む。なお、applyはこのように設定されている。

```go
	Commands = map[string]cli.CommandFactory{
		"apply": func() (cli.Command, error) {
			return &command.ApplyCommand{
				Meta: meta,
			}, nil
		},
```

# 2.terraform apply
terraform applyの挙動は[internal/command/apply.go](https://github.com/hashicorp/terraform/blob/main/internal/command/apply.go)に書いてある。
実際にresourceの変更を行うのは、恐らくRunOperationである。

```go
	op, err := c.RunOperation(be, opReq)
	if err != nil {
		diags = diags.Append(err)
		view.Diagnostics(diags)
		return 1
	}
```

# 3.RunOperation
RunOperationは、[internal/command/meta.go](https://github.com/hashicorp/terraform/blob/main/internal/command/meta.go#L384-L440)で定義されている。RunOperationのうち、実際にリソース変更などを行うのは、b.Operationである。

```go

func (m *Meta) RunOperation(b backend.Enhanced, opReq *backend.Operation) (*backend.RunningOperation, error) {
	if opReq.View == nil {
		panic("RunOperation called with nil View")
	}
	if opReq.ConfigDir != "" {
		opReq.ConfigDir = m.normalizePath(opReq.ConfigDir)
	}

	op, err := b.Operation(context.Background(), opReq)
	if err != nil {
		return nil, fmt.Errorf("error starting operation: %s", err)
	}

```

# 4.backend.Enhanced.Operation
backend.Enhanced.Operationは、interfaceとして[internal/backend/backend.go](https://github.com/hashicorp/terraform/blob/main/internal/backend/backend.go#L135)で定義されている。
あくまでinterfaceとして定義しているだけなので、具体的にAWSやGCPに対してどのような操作を行っているのかを知りたい場合は、プロバイダを実装している他レポジトリを調べる必要がある。

# 最後に
今回は、hashicorp/terraformを読んだが、このレポジトリ内で完結していないため、不明点が多い。次回はhashicorp/hclを読もうと思う。
SASS で画面幅によって切り替わるスタイルをいい感じに管理する ( MediaQuery )

# MediaQuery を mixin で簡単に使えるようにする

シンプルな例です。

今回は 2サイズしか想定していないので愚直に書いていますが、複数のサイズのバリエーションに対応したい場合は、map を組み合わせて使うと全パターン書き連ねるようなことにならず、しかもメンテナンス性も向上するので嬉しいことになります。
この辺は if や switch 文を減らす考え方と似てます。

```scss
// 768px 未満
@mixin is-small-screen() {
  @media screen and (max-width: 767px) {
    @content;
  }
}

// 768px 以上
@mixin is-large-screen() {
  @media screen and (min-width: 768px) {
    @content;
  }
}
```

`is-なんとか-screen` という名前が長ったらしくて使いにくいという話は一旦その辺に置いといてください。

# 用意した mixin の利用例

mixin の名前とかはテキトーです。

```scss
// 実際にあてたいスタイルの実装 (implements)
// 引数で受け取った文字サイズを元に、値を設定する
// …の例
@mixin sizing-impl($font-size) {
  height: $font-size * 1.5;
  font-size: $font-size;
  line-height: $font-size * 1.5;
}

// (※1)
@mixin sizing($base) {
  // 通常はベースの数値を rem に変換して設定する
  @include sizing-impl($base * 1rem);

  // 小さい画面幅ではベースの数値を vw に変換して設定する
  // …これで、"小さい画面の場合は画面幅に対して相対的な文字サイズ"
  //  みたいなことを実現できる
  @include is-small-screen() {
    @include sizing-impl($base * 10vw);
  }
}

.text {
  display: block;

  &.small {
    // 768px 以上は 1rem、未満は 10vw
    @include sizing(1)
  }

  &.medium {
    // 768px 以上は 2rem、未満は 20vw
    @include sizing(2)
  }

  &.large {
    // 768px 以上は 3rem、未満は 30vw
    @include sizing(3)
  }
}
```

- (※1) "画面幅によってスタイルを変える" というロジック部分を切り出しておくと、各要素のスタイル指定箇所で毎回 mixin を呼ばなくてよくなるのでオススメです。

# 出力CSS

```css
.text {
  display: block; }
  .text.small {
    height: 1.5rem;
    font-size: 1rem;
    line-height: 1.5rem; }
    @media screen and (max-width: 767px) {
      .text.small {
        height: 15vw;
        font-size: 10vw;
        line-height: 15vw; } }
  .text.medium {
    height: 3rem;
    font-size: 2rem;
    line-height: 3rem; }
    @media screen and (max-width: 767px) {
      .text.medium {
        height: 30vw;
        font-size: 20vw;
        line-height: 30vw; } }
  .text.large {
    height: 4.5rem;
    font-size: 3rem;
    line-height: 4.5rem; }
    @media screen and (max-width: 767px) {
      .text.large {
        height: 45vw;
        font-size: 30vw;
        line-height: 45vw; } }
```

　　終
制作・著作
━━━━━
　ⓁⓈⓅ
【初心者向け】3分でgolang + docker(docker-compose)環境を構築する！

# はじめに
皆さんはgolangを利用していますか？

プログラミングを始めたての皆さんは、
golangに関わらず、プログラミング言語の学習や利用するときには、その言語の環境構築に苦戦するのではないのでしょうか。

私も、環境構築に苦戦して、プログラミング言語の学習を断念することが何度もありました。

しかし、これらの環境構築の問題を解決してくれるツールがあるのです。
それが、Dockerというツールになります。
Dockerでは環境構築を行うためのコマンド群などをコード化することで、どんな人でも同じ環境をすぐに構築することが可能です。

> ※環境構築が容易になるという以外にも色々なメリットがあるのですが、今回は割愛します。


では、早速環境構築手順をみていきましょう。

# 前提
- DockerをPCにインストールしていること
    - インストール方法は[こちら](https://docs.docker.com/get-docker/)を参考にしてください

# 環境構築手順
環境手順は以下の通りです。
1. [必要なファイル群を用意する](#必要なファイル群を用意する)
1. [環境(コンテナ環境)を起動する](#コンテナ環境を起動する)


## 必要なファイル群を用意する
今回の環境構築に必要なファイル群は以下のとおりです。

- Dockerfile, docker-compose.yml
    - Dockerを利用したコンテナ環境を構築するために利用します
- main.go
    - golangで実行するためのファイルです

```dir:ディレクトリ構成
.
├── Dockerfile
├── docker-compose.yml
├── main.go
```
```shell: 必要なファイル群の作成コマンド
$ touch Dockerfile docker-compose.yml main.go
```

ファイルの中身は以下の通りです。
今回、golangのファイルは `Hello World`　を出力するコードです。

```Dockerfile:Dockerfile
FROM golang:1.17.1-alpine3.13 as builder

WORKDIR /go/src
COPY . .

RUN go build main.go
```

```yml:docker-compose.yml
version: "3"
services: 
  golang:
    build: .
    volumes: 
      - ./:/go/src
    tty: true
```

```golang: main.go
package main

import "fmt"

func main() {
  fmt.Printf("Hello World\n")
}
```


## コンテナ環境を起動する
dockerを利用した環境を作成＆起動するために以下のコマンドを実行します。

```shell
$ docker-compose up -d --build
```

起動が完了しているかどうかを `docker-compose ps`コマンドで確認を行います。
statusがUpになっていれば成功です。

```shell: 環境が起動しているか確認する
$ docker-compose ps
                Name                   Command   State   Ports
--------------------------------------------------------------
<ディレクトリ名>_golang-demo_1   　　　　　/bin/sh   Up
```

これで、環境構築は完了です。

# コードを実行してみる

環境構築が終了したら、実際にコードを実行してみます。
実行方法は以下の通りです。

```shell
$ docker-compose exec golang sh
# コンテナ内で、以下のコマンドを実行する
go run main.go

Hello World
```

Hello World と表示されれば成功です。


## 開発の進め方
開発はいつもと同じように勧めていただいてかまいません。
修正したコードは[こちら](#コードを実行してみる)で実行します。



## 終わりに

今回はdocker,docker-compose.ymlを利用して,golangの環境構築方法と実行方法を記載しました。

なにか不明点などありましたら、コメントお願いします。
Centos7+PHP8.1+Laravel9+Dockerで動かした個人的なメモ

# 前置き

今後使う事があるだろうなと思ったので試してみた

## 構成

- Windows上でエディタを使って開発
- VirtualBoxやAWS EC2とかで使う
    - apacheにSetEnvを入れているので小規模の本番用に切り換えが一応できる…<br>
(DBは別に用意したり、docker-compose.ymlを分ける等ゴニョゴニョが必要)
- Centosをよく使う
- DockerとDocker-composeはインストールされている前提

## 注意

- **力技**
- **個人的なメモなのでコメントが雑だったり、コメントアウトされてるものがある**
- laravel9は現時点でBetaの為、laravel配下は変わる可能性がある
- 開発環境、本番環境等で切替えられるようにapacheのSetEnvが書いてある
- VMやサーバとDockerコンテナ内のユーザのユーザ名とユーザーIDを同じにする必要がある
- IDEから参照するライブラリ類はVMからダウンロードする必要がある
    - 一度vendorをマウントした状態でdocker-compose upしてインストールする必要がある
- remiリポジトリを利用している

## 置き場所

[centos-laravel9-docker](https://github.com/reddish-moon/centos-laravel9-docker)

##
jsclasses と fancyhdrで章扉のヘッダ・フッタを統一

# 結論
```tex
\fancypagestyle{plainhead}{}
\fancypagestyle{plainfoot}{}
```

# ことはじめ
一般的に，LaTeX でヘッダ・フッタをカスタマイズしたいときには `fancyhdr` パッケージを使う．章扉についても同様であり，公式ドキュメントでは

> To customize even such pages you must redefine the plain page style.
> 
> （Texdoc 3.2.1 における fancyhdr.pdf の P.11 より引用）

とある．訳すと，「そのようなページ（章扉など）をカスタマイズしたい場合には，`plain` スタイルを再定義しなければならない」ということだ．具体的には，

```tex
\fancypagestyle{plain}{
  \fancyhead[L]{左のヘッダ}
  \fancyfoot[C]{中央のフッタ}
}
```

とすれば，`plain` スタイルが上書きされる．あるいは，

```tex
\fancypagestyle{plain}{}
```

とすれば，ドキュメント全体に適用されているページスタイルを踏襲することになる．すなわち，文書全体でヘッダ・フッタのスタイルを統一できる．

# 問題
LaTeX で日本語の文書を作る場合，奥村先生の `jsclasses` を使わない人は殆どいないだろう．そこで，`jsclasses` でも `plain` スタイルを再定義すべく，上記コマンドを打ち込み，組版してみる．

すると，期待とは裏腹に，章扉のスタイルは全く変化しない．なぜだろうか？

# 原因
`jsclasses` の公式ドキュメントを覗いてみよう．すると，

> 章の最初のページスタイルは，全体が empty でなければ plain にします。
> (中略)
> `\plainifnotempty`

と書かれている．さらにこの `\plainifnotempty` を追ってみると

```tex
\def\plainifnotempty{%
  \ifx \@oddhead \@empty
    \ifx \@oddfoot \@empty
    \else
      \thispagestyle{plainfoot}%
    \fi
  \else
    \thispagestyle{plainhead}%
\fi}
```

と定義されている．ここで `\thispagestyle{plain****}` の部分に注目しよう．このページのスタイルは `plainfoot` もしくは `plainhead` になるというのである．すなわち，`jsclasses` の章扉は，`plain` スタイルではなく，`plainfoot` もしくは `plainhead` というスタイルになるのだ．

したがって，いくら `plain` スタイルを再定義しても暖簾に腕押しなのである．

# 解決
原因がわかれば解決も簡単で，`plainfoot` や `plainhead` を再定義してやればよい．

```tex
\fancypagestyle{plainhead}{}
\fancypagestyle{plainfoot}{}
```

# 余談
`\plainifnotempty` は `jsclasses` 独自のコマンドである．従来の `\chapter` コマンドでは同コマンドの代わりに

```tex
\thispagestyle{plain}
```

を用いている．なぜ独自のコマンドが必要になったのかは公式ドキュメントに記載されている．

> 従来の標準クラスでは，文書全体のページスタイルを empty にしても表題のあるペー ジだけ plain になってしまうことがありました。これは \maketitle の定義中に \thispagestyle{plain} が入っているためです。この問題を解決するために，「全体の ページスタイルが empty でないならこのページのスタイルを plain にする」という次の命令を作ることにします。
>
>（Texdoc 3.2.1 における jsclasses.pdf の P.42 より引用）
サーバー上でプロセス実行する際に、`nohup`を使いバックグラウンド実行したときのlogrotationについてメモ

サーバー上でプロセス実行する際に、`nohup`を使いバックグラウンド実行することが多い

```
$ nohup do.sh &
...
```

この場合`nohup.out`にログ出力されるが、ログサイズが大きくなる事がある。

```shell
$ ls -lh
total 560M
-rw------- 1 ubuntu ubuntu 560M Feb 11 15:47 nohup.out
```

`500MB`ほどであれば直ちに問題ないが、今後ストレージがあふれるとまずいので、logrotateする。
`/etc/logrotate.conf`を更新する。

```/etc/logrotate.conf
# system-specific logs may be also be configured here.                                                                                                                                                    
/home/ubuntu/xxx/log/nohup.out {
    size 250M        # 1MBを超えたらローテートさせる(この#以降は実際には削除する) 
    su ubuntu ubuntu # ローテートさせるユーザーとグループ(この#以降は実際には削除する)
    rotate 4         # 残す世代(この#以降は実際には削除する)
}
```

`dry-run(テスト実行)`するには以下

```shell
＄ sudo logrotate -d /etc/logrotate.conf

# エラーがあるとこんなログが出る。この場合は"#"を付けてたのでエラーだったので、、"#"を消しました
error: found error in /home/ubuntu/xxx/log/nohup.out , skipping
```

実行

```shell
$ sudo logrotate /etc/logrotate.conf
```

`-v`オプションを付けるとログ詳細がでる

```shell
$ sudo logrotate -v /etc/logrotate.conf

rotating pattern: /home/ubuntu/xxx/log/nohup.out  262144000 bytes (4 rotations)
empty log files are rotated, old logs are removed
switching euid to 1000 and egid to 1000
considering log /home/ubuntu/xxx/log/nohup.out
  Now: 2022-02-11 16:24
  Last rotated at 2022-02-11 16:24
  log does not need rotating (log size is below the 'size' threshold)
switching euid to 0 and egid to 0
```


## そもそもログ出力したくない場合...

`/dev/null`にリダイレクトすると良いかも

> [nohupでコマンド実行時にログ出力をしたくない場合は/dev/nullにリダイレクトすると良い](https://qiita.com/seigot/items/43d005636b056bcf8eef)
> nohup some_command >/dev/null 2>&1 &

# 参考
[nohupコマンド利用時のログローテーション](https://shishou-eng.com/blog/engineering/25)
[任意のログをlogrotateを使って管理する](https://qiita.com/Esfahan/items/a8058f1eb593170855a1)
Elastic Cloudで独自のTwitterトレンドを表示してみた

Elastic社が提供するマネージドサービスであるElastic Cloudを利用してTwitterから検索したツイートでトレンドを作成してみました。

# できたもの
kibanaの機能を利用して、収集したツイートから各種グラフを作成してみました。
今回は「雪」で検索したので、トレンド1位はそのままでちょうど北京2022オリンピック競技大会中でしたので、スノーボードのツイートが多くそれが反映される結果となりました。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2515654/9b28b47a-751c-c6d8-458c-168716d2cfd6.png" width=90%>

# 作成手順
中継サーバ(GCPのGCE)にてTwitterからツイートを収集し、それをElastic Cloudに上げる構成。

## Elastic Cloudデプロイ
Elastic CloudにてElastic関連サービスをデプロイしていく。ライセンスはスタンダードで十分。
今回は最新のv8.0.0を利用。作成後、Elasticsearchのエンドポイントをコピーしておく。

## 中継サーバデプロイ
GCPにてGCEをデプロイ。

SSHでログイン後root化、パッケージのアップデート、Javaをインストールする。
logstashをサービスとしてインストールする。作業時の最新の8.Xを利用。

```
apt-get install -y wget
wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
sudo apt-get install apt-transport-https
echo "deb https://artifacts.elastic.co/packages/8.x/apt stable main" | sudo tee -a /etc/apt/sources.list.d/elastic-8.x.list
apt-get update && sudo apt-get install logstash
```

logstashが使用するコンフィグファイルを作成する。
サービスとしてインストールした場合は以下に作成する。
/etc/logstash/conf.d/test.conf 

今回は「雪」という単語を検索対象とする。

```
input {
 twitter {
   consumer_key => '（Twitter Developerから取得）'
   consumer_secret => '（Twitter Developerから取得）'
   keywords => [ '雪' ]
   full_tweet => true
 }
}
filter {
}
output {
   elasticsearch {
       hosts => ['（Elastic CloudのElasticsearchのエンドポイント）']
       user => 'elastic'
       password => '（デプロイ時に表示されたパスワード）'
       index => "twitter-trend"
   }
}
```

## Kibana設定

編集が終わったらサービスを起動する。すると、GCE上のlogstashサービスが随時Twitterからツイート検索結果をElastic Cloud上のElasticsearchに投入していく。
Elastic CloudのKibanaのスタック管理のデータビューにて、インデックス「twitter-trend」のビューを作成すると、Discoverで収集されたツイートが検索できるようになる。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2515654/0f1599ea-9753-72ab-ded2-4676b2fd9c55.png" width=90%>

ダッシュボードでお好きなグラフを作成することで完成。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2515654/9b28b47a-751c-c6d8-458c-168716d2cfd6.png" width=90%>
nohupでコマンド実行時にログ出力をしたくない場合は/dev/nullにリダイレクトすると良い

nohupでコマンド実行時にログ出力をしたくない場合は/dev/nullにリダイレクトすると良い
ログサイズが大きくなる場合は解決策になり得る。

```
nohup some_command >/dev/null 2>&1 &
```

`bash do.sh`を実行する場合の例

```
nohup bash do.sh >/dev/null 2>&1 &
```

# 参考
[nohupコマンドでnohup.outではなく標準出力に出力する方法](https://www.greptips.com/posts/433/#:~:text=nohup%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%82%92%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B%E3%81%A8,%E3%81%97%E3%81%A6%E3%81%82%E3%81%92%E3%82%8C%E3%81%B0%E3%81%84%E3%81%84%E3%80%82)