OmniAICreator/Qiita-1.07M huggingface dataset:
Linuxディストリビューション

個人メモなので例えがアレです。

# 1.ディストリビューションとは


- [ディストリビューション【distribution】](https://www.weblio.jp/content/%E3%83%87%E3%82%A3%E3%82%B9%E3%83%88%E3%83%AA%E3%83%93%E3%83%A5%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3)

> - １ 分配。配送。流通。また、分配された物。配布物。ディストロ。
> - ２ 複数のソフトウエアをひとまとめにしたもの。特に、Linux(リナックス)ディストリビューションのこと。ディストロ。

Linuxが配布される形態のことをディストリビューションと言う。

## 1-1.狭義のLinux

「Linux」は本来、OSのコアである「 **Linuxカーネル** 」のことを指す。（ **狭義のLinux** ）
カーネルとは、OSの本来の役割であるハードウェアの制御、ファイル・ソフトウェアの実行、リソース等の管理を行う部分のこと。
カーネルだけではOSとして起動したりコマンド実行したりすることはできない。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/e5f8ec49-b973-febc-e9e4-bba5410b2044.png)

人間でいうと「脳」のようなイメージ。脳だけでは人間として機能できない。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/2b183012-255e-d37c-e6cd-51b19f855c23.png)


## 1-2.広義のLinux

そこでLinuxを利用しやすいようにアプリケーションやソフトなどをパッケージにしてすぐに使える状態にしたものを「 **ディストリビューション** 」と言う。（ **広義のLinux** ）
通常Linuxを利用する場合、カーネル以外にも様々なソフトウェアが組み合わされた状態で利用する。
普段ユーザがカーネルの動作を目にすることはなく、実際にユーザが目にする部分はアプリケーションであったり、OSの管理機能を利用するユーティリティソフトであったりする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/b5bfbe62-421a-ad80-98b7-665e0e94450a.png)

人間でいうと「手足」「臓器」のようなイメージ(?)。すべてそろって人間として機能する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/2c7a7bd7-db30-47bc-0dd7-e02a51905352.png)


# 2.代表的なLinuxディストリビューション
様々なディストリビューションが存在するが、Linuxカーネルを使っている点は同一。
異なる点は、Linuxカーネルと組み合わせるアプリケーション、インストール形式、パッケージの管理方法、システム構成など。
ディストリビューションはそのベースとなるものによって大きく分けて3つの系統に分類できる。

## ◆Slackware系

-  **Slackware** 
   - 最もシンプル。多くのアプリケーションに対応しており、インストール時に実行するスクリプト、ソースコード、解説ファイルしかない。パッケージ管理システムがなく初心者向けではないが、カスタマイズ性に優れている。
-  **Plamo** 
-  **SLAX** 

等


## ◆Redhat（rpm）系

- **Red Hat Enterprise Linux (RHEL)**
  - アメリカのRedHat社が開発した商用向けのLinuxディストリビューション。大規模システムのサーバに利用される。有償サポートがある。
- **Fedora**
  - RedHat社が支援しているディストリビューション。RHELは商用向けで有料なのに対しFedoraは無料で使うことができる。Fedoraは次世代のRHEL向け検証用ディストリビューションとしての役割がある。
- **CentOS**
  - RHELのクローン（複製）OSで、RHELの商用部分を取り除いたもの。FedoraのようにRHELの実験的要素を含んだOSとは異なり、安定性も比較的高く、商用で使われる機会も多い。
- **SUSE**
  - SUSE Linux Enterprise Server（SLES）は、ミッションクリティカルシステムや高可用性が求められる商用として利用されるLinuxディストリビューション。サーバ・メインフレーム用に設計されているがデスクトップにもインストール可能。openSUSE（無償）とSLESは異なる。

等


## ◆Debian系

- **Debian/GNU Linux**
  - ボランティアの技術者の手によって開発・運営が行われているLinuxディストリビューション。さまざまなCPU上での動作サポートと、数万にもおよぶ膨大なアプリケーション数が特徴で、多くの企業のシステムに採用されている。
- **Ubuntu**
  - Debianをベースに作られたディストリビューション。使いやすいデスクトップで初心者にも抵抗なく使える。Debianと同じく多くの企業のシステムにも使われている。

等

# 3.補足

ディストリビューションによって操作自体が大きく変わることはないが、コマンドが少し違う。
ベースとなる技術はすべてのディストリビューションで共通。
ユーザの目的やサポート体制などによりディストリビューションを選択する。
ディストリビューションの多さは他のOSにはないLinuxの特徴。


# 参考
https://www.linuxacademy.ne.jp/lablog/infrastructure/266/

https://lpi.or.jp/lpic_all/linux/intro/intro02.shtml

https://wa3.i-3-i.info/word12473.html

https://qiita.com/ayatokura/items/6419bb984bbd663be3c0
FreeBSDのサウンドドライバ調査編

ディスクリプターのリングを作りDMAが動くようになったのですが、割り込みでchn_intr()を呼び出すと、DMAがunder runしてしまいます。

割り込みはDMAでバッファが空になり、再充填のために呼ばれます。

いろいろデバッグライトを入れて、確認したところ割り込みでchn_intr()で1つバッファを埋めてる間に3つ空になっています。これでは間に合うわけがありません。

chn_intr()はsys/dev/sound/pcm/channel.cにあります。

chnで始まる関数はchannel.cでsndbufで始まる関数はbuffer.cにあります。pcmインターフェースは名前の付け方に一貫性がない感じがします。

処理は

chn_intr() -> chn_wrfeed() -> sndbuf_feed()

と行われます。sndbuf_feed()の中の、

```c
        do {
                cnt = FEEDER_FEED(feeder, channel, to->tmpbuf,
                    min(count, maxfeed), from);
                if (cnt == 0)
                        break;
                sndbuf_acquire(to, to->tmpbuf, cnt);
                count -= cnt;
#ifdef SND_DIAGNOSTIC
                cycle++;
#endif
        } while (count != 0);
```

FEEDER_FEEDで大きく時間を使ってしまっているようです。FEEDER_FREEDはkobj interfaceでCore AudioでいうところのAudio Unitのようなもので、フォーマット変換などをしているようです。

小言ですがFEEDER_FEEDも馬から落ちて落馬してみたいで、センス悪いですね。

なんか回避策ないかな。。。

よくよく考えてみると、割込みハンドラの中でフォーマット変換するってありえない。

以下でログが出るようになります。

```
% sudo sysctl hw.snd.verbose=4
```

/dev/sndstatにも情報が追加されます。
Arduinoの勉強　第７弾：デジタル通信方式 (3) - UART通信方式

# #UART通信方式
##はじめに
ハードウェアの勉強のためにArduinoを復習も兼ねて参考教材に沿って，勉強する．細かな部分の理解までして，自在に扱えるようになることが目的である．その第7弾として，「UART通信方式」を扱う．

## UARTとは
![slide1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/951300/6330ad72-99bd-6c74-5d72-8164c2add7f3.png)
![slide2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/951300/dfd2a70f-aeb5-1c90-1989-d95225396417.png)

## 注意事項
![slide3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/951300/23ad0f66-8e5b-eb62-c40b-a5737ebc2654.png)

## ソフトウェアシリアル通信
![slide4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/951300/64aae7f4-817a-e6d3-057c-1fb1c720a0af.png)

## 感想
一対一での通信で，同期も必要とせず，仕組みとしては非常に単純で分かりやすい通信方式であるという印象を受けた．通信速度は特別速いわけではないので，ほかとの通信に比べた強みがよくわからないが，おそらく同期も必要としない単純さが強みの一つなのかなと思った．参考文献的には，いよいよ実践となるが，その前によく耳にするCAN通信だけは触れておきたいと考えている．

## 参考文献
- 電子部品ごとの制御を学べる！Arduino電子工作実践講座 改訂第2版 福田和宏 著 ソーテック社
kintoneカスタマイズでフィールドコード扱う際は【ブラケット記法】にしましょうって話

# はじめに

kintoneカスタマイズのTipsを見ていると、オブジェクト内のフィールドコードの書き方が「ドット記法」だったり「ブラケット記法」だったり記事によってバラバラだったので、

**（勝手に） これがデファクトスタンダードだ！**

ってことで記事化してみました。

※ あくまでBB個人の解釈です。でも割と筋は通っている気がします。

# （前提） ドット記法、ブラケット記法とは

JavaScriptではオブジェクトのプロパティを参照する際の書き方が大きく2種類あります。

```JavaScript
const obj = {
  record: {
    text: {
      value: '文字列だよ'
    }
  }
};
```

- ドット記法
    - ドットでつなぐ

```JavaScript
const text = obj.record.text.value;
```

- ブラケット記法
    - 角括弧[]でつなぐ

```JavaScript
const text = obj['record']['text']['value'];
```

## 特徴

- ドット記法
    - シンプル
- ブラケット記法
    - 変数が扱える
        - `obj['record'][HENSU]['value'];` // 「HENSU」って変数が使える

# （個人的な） 結論

**基本はドット記法で書くが、フィールドコードだけはブラケット記法にする**

## 理由①日本語が直接つながっているの気持ち悪い

kintoneのフィールドコードは日本語OKなので、ドット記法で書くとこうなります。

```JavaScript
kintone.events.on('app.record.create.show', (event) => {
  const text = event.record.文字列.value;
```

ちなみに、日本語以外もいけますw
![スクリーンショット 2021-11-23 0.10.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/153051/4bd7d1ef-3ec9-db34-3ec6-5fbad60d21f5.png)
うん、気持ち悪い。

### 一方、ブラケット記法なら

```JavaScript
kintone.events.on('app.record.create.show', (event) => {
  const text = event.record['文字列'].value;

// ~~~

rec.record['문자열'].value
```

`'文字列'`だから仕方ない、って割り切れる！

## 理由②どこがフィールドコード（可変部分）かわからない

仮に①対策としてフィールドコードをローマ字にしたとしても、今度はフィールドコードがどこかわかりにくくなります。
→ kintoneのフィールドコードはユーザーが簡単に変更できるため、変更対応する場合探すのが大変！

```JavaScript
kintone.events.on('app.record.create.show', (event) => {
  const num = event.record.number.value;
```

### 一方、ブラケット記法なら

```JavaScript
kintone.events.on('app.record.create.show', (event) => {
  const num = event.record['number'].value;
```

角括弧が目印になるからわかりやすい！

## ③基本的にフィールドコードは最初に変数に入れる派

①②を書いたあとであれですが、ユーザーが（勝手に）変更することを考慮して最初に変数に入れておくことのほうが多いです笑

- ユーザーが`number`を`number1`に変えたら・・・

```JavaScript
kintone.events.on('app.record.create.show', (event) => {
  const num = event.record.number.value;

  // 〜〜〜
  event.record.number.value = ~~~;
  
  // 〜〜〜
  const rec = kintone.app.record.get();
  const recNum = rec.record.number.value;

```

3箇所も変更が必要になります。(コードがもっと複雑だったら・・・orz)

### 一方、変数化（ブラケット記法）なら

```JavaScript
const fieldCode = {
  number: 'number'
};

kintone.events.on('app.record.create.show', (event) => {
  const num = event.record[fieldCode.number].value;

  // 〜〜〜
  event.record[fieldCode.number].value = ~~~;
  
  // 〜〜〜
  const rec = kintone.app.record.get();
  const recNum = rec.record[fieldCode.number].value;
```

変数定義部分の1箇所だけ変えればOK！
変数を使う場合はブラケット記法一択なので、ブラケット記法で書くしかない！

# 余談

ごく稀に`record`とか`value`部分もブラケット記法で書かれているTipsを見かけますが、
recordやvalueって文字列はkintoneのAPI仕様が変更されない限りは変わらないのでブラケット記法にする必要はないと思ってます。

```JavaScript
kintone.events.on('app.record.create.show', (event) => {
  const num = event['record']['number']['value'];
```

そして、その仕様変更は影響範囲が大きすぎるのでおそらくありえないかなと。

# おわりに

こういう細かいところから統一していけると、初学者にとっては「統一感あってわかりやすい」ですし、ベテラン勢にとっても「なんだこのコード！？」ってならないので良いですね。

それでは！≧(+･` ཀ･´)≦
Githubと新しいレポジトリの連携（恥ずかし）[Github]

### 追記
なお本来は`git clone`にて、Github上で作成したリポジトリをローカルに入れ込む管理の方が良い。

### 目的
久しぶりにGithubに新しいリポジトリを作成しました。が、色々忘れていて少し調べたので、次はスムーズに進められるようまとめておきます。

### Github連携

```bash
# 1. Githubにディレクトリ作成

# 2. ローカルのgitを初期化
cd ~/repository/repository2 # 該当のディレクトリへ
git init
git add. 
git commit -m 'initialize'

# 3. リモートのリポジトリを登録（SSH接続）
git remote add origin git@github.com:useer_name/repository_name

# 4. リモートにpush
git push origin master
```

### おわり
初歩的すぎて、、
RTX30系ノートPCでUbuntuを使うのに苦労した記録(18/20系）


RTX GPU内蔵のゲーミングノートPCにUbuntu入れてみました。

##参考にさせていただいた記事
筆者の方々に陰ながらお礼申し上げます。
・@IGURA　さんの記事
[NVIDIA RTX3070のDriverインストール (3/17追記)](https://qiita.com/IGURA/items/877e12032368eb70e6cc)

・@chari　さんの記事
[GPU搭載ゲーミングノートへのUbuntu18.04デュアルブート時のグラフィックドライバの処理](https://qiita.com/chari/items/a4372b7a382a0930b34a)

##解決までの格闘
1．素直にUbuntuインストールディスクを作成し、インストール(18.04）
  ・RTXが出てきません！ひたすらドライバーやCUDAやらインストール。
  ・セキュアブートも散々文句を言われたのでUEFIで無効にしました。　
  →nvidia-smi コマンドをたたいても怒られ、撃沈(No devices were found.)。

2．Google先生に相談し、まずは@IGURA　さんの記事を発見！
  ・おそらくほとんどの方であればこの記事通りの手順で解決するはず・・・
　→nvidia-smi コマンドをたたいても怒られ、撃沈(同上)。

3．@chari　さんの記事を参考に再インストール　
  ・CUIでnvidia-smiをたたくと正常に表示されますが、GUIではちゃんとでない・・・！？
  →これらの有用な情報を整理してみる。

##起動するまで
1.まずは普通にUbuntuをインストール
・カーネルのバージョンをRTX30系対応のバージョンかつ、安定性のたかいもの（参考にする）を導入。
-私も[Kernel Ubuntuサイト](https://kernel.ubuntu.com/~kernel-ppa/mainline/)より、
　5.11.6-051106のdebファイルをダウンロード。ダウンロードしたフォルダに4ファイルをまとめて

```
sudo dpkg --install *.deb

```
ほかのdebファイルと混ざらないようにサブフォルダを作ってそこで作業するといいです。

2．rebootコマンドで再起動し、カーネルバージョンを確認

```
uname -r

5.11.6-051106-generic
```
ちなみに私の環境は5.4xxxでした。

3.ドライバーのインストール
※特に18.04では最新の無線LANアダプタのドライバがないようなので手動でインストールする場合があります。
ちなみに無線だけでなく有線（Realtek）も私の環境はドライバが必要でした(例示します)。
ダウンロード元等はコンソール出るものを検索の上、取得してください。

```
sudo update-initramfs -u

/lib/firmware/rtl_nic/
sudo cp 必要ファーム名　/コピー先フォルダ/必要ファーム名

```
4．さらにドライバを追加していきます

```
sudo apt update && sudo apt upgrade
sudo add-apt-repository ppa:graphics-drivers/ppa

```

6. @chari　さんの記事より、nouveauドライバを無効化します。

```
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
をに変更
GRUB_CMDLINE_LINUX_DEFAULT="nouveau.runpm=0"

設定ファイルを更新保存
sudo update-grub

``` 
7．推奨のドライバをインストールしてみます。

```
sudo apt install nvidia-driver-460

```

##ようやく成功
リブート後、ようやくnvidia-smiでnvidiaドライバが認識され、UbuntuのDetail表示も
RTXになりました。（ホッ）
**個人的な都合で460ドライバの表示は割愛させていただきます　**

## 参考リンク

https://www.kernel.org/

Linuxのカーネルです。必要に応じて参照してください。

:::note info
インフォメーション
- ubuntu-drivers devices でそのOSにあったドライバーを使います。
- open　ってついているのは使わないですね。
:::

```Ubuntu:terminal
ubuntu-drivers devices

```

```Ubuntu:ターミナル画面
ubuntu-drivers devices

model    : GA102 [GeForce RTX 3090]
driver   : nvidia-driver-470-server - distro non-free
driver   : nvidia-driver-470 - distro non-free
driver   : nvidia-driver-535-server-open - distro non-free
driver   : nvidia-driver-545-open - distro non-free
driver   : nvidia-driver-535 - distro non-free
driver   : nvidia-driver-550 - distro non-free recommended
driver   : nvidia-driver-535-server - distro non-free
driver   : nvidia-driver-535-open - distro non-free
driver   : nvidia-driver-545 - third-party non-free
driver   : nvidia-driver-550-open - distro non-free
driver   : xserver-xorg-video-nouveau - distro free builtin

```
無事に動きますように
【C#】本物の関数ポインタの使い方と関数アドレスの取り方

## 歴史
C#9でひっそり関数ポインタがC#に追加されました。
別に関数ポインタ自体は新しい機能ではなく、大昔からあります。ただし、C#から扱う構文が追加されたのがC#9です。

C#の関数には、`static`な関数と、非`static`な関数(いわゆるメソッド)があります。
これらは、似て非なるものです。

```CS
class Program()
{
   public static void Hoge()
   {

   }

   public void Fuga()
   {

   }
}
```

上記の例では、`Hoge`と`Fuga`はどちらも同じ引数の関数のように見えます。
しかし、実際には(低レベルには)`Fuga`関数は`Program`のインスタンスを引数として(暗黙的に)取っているのです。
よって、`Fuga`関数を呼び出すには、関数ポインタの他に、`Program`のインスタンスが必要です。
実際にILレベルでは、非静的関数を呼び出すにはスタック上にインスタンス=マネージドポインタを積まなければなりません。

```il:疑似ILコード
ldc.i4.0
stloc.0
ldloca.s 0
call System.Int32.ToString
pop
```

```cs
0.ToString();
```

C#では、これらの違いを意識することなく使えるような関数ポインタに相当する機能として、`delegate`が導入されました。
`delegate`は、内部的に関数ポインタと、その関数を呼び出す上で必要な引数への参照を保持しています。
これにより、`delegate`は、インスタンスメソッドが存在し、さらにGCのために参照を管理しなければならないC#における「安全な関数ポインタ」としての役割を果たすのです。

ところが、`delegate`は主にインスタンスメソッドの呼び出しの方に最適化されており、静的関数の呼び出しが遅いです。
本来なら余分な処理が入って複雑なインスタンスメソッドの呼び出しより、静的関数の呼び出しのほうが遅いです。
このあたりはすでに記事が出ているので詳細は譲るとして、これでは不便だという声も出てきました。

IL的には、関数のアドレスをスタックにロードする`ldftn`命令と、スタック上の関数ポインタを介して関数を呼び出す`calli`命令があり
対応するC#構文さえあれば、`delegate`でない本当の関数ポインタを使用するのは可能でした。
(実際、C#9以前もILを手打ちすれば可能。)

## 構文
新しく関数ポインタ型が導入されました。型名は
`delegate* <TArg0,TArg1...,TResult>`
です。TArgには引数の型を順番に、TResultは戻り値の型に置き換えてください。
関数ポインタもポインタですので、`unsafe`キーワードとコンパイルオプションが必須です。

キーワードを使い回していますが、`delegate`でもジェネリック型でもなく、ただのポインタです。
そのため、`void*`や`nint`(`IntPtr`)へのキャストが可能です。

関数のアドレスは、`&(関数)`で取れます。例えば

```CS
delegate* <double,double> sin = &Math.Sin;
```

のように使います。前述したように、インスタンスメソッドの呼び出しは単純ではないので、今回の関数ポインタ構文では`static`な関数のアドレスしか取得できません。そもそも関数ポインタが欲しかったのが静的メソッド用ですから、いい妥協点でしょう。
呼び出しは関数ポインタ型の変数に`({引数})`です。

```CS
var result = sin(0.5);
```

先ほどの例で作成した関数ポインタを呼び出す場合は上記のようになります。

## リフレクションから関数ポインタ
リフレクションで取得したMethodInfoからも関数のアドレスが取得できます。

```cs
static void Hoge<T0,T1,T2,TRes>()
{
    Assembly asm = typeof(Microsoft.JSInterop.WebAssembly.WebAssemblyJSRuntime).Assembly;
    var method = asm.GetType("WebAssembly.JSInterop.InternalCalls")?.GetMethod("InvokeJS", BindingFlags.Public | BindingFlags.Static);
            
    var del = (delegate*<IntPtr, IntPtr, T0, T1, T2, TRes>)methodInfo.MakeGenericMethod(typeof(T0), typeof(T1), typeof(T2), typeof(TRes))
                    .MethodHandle.GetFunctionPointer();
}
```

この例では、`internal`なクラスに定義されていて通常アクセスできない関数への関数ポインタを無理やり作成しています。
`MethodInfo`の`MethodHandle`プロパティから`MethodHandle`を取得し、さらに`GetFunctionPointer`メソッドを呼ぶことで関数のアドレスが取れます。ジェネリックメソッドの場合はあらかじめ`MakeGenericMethod`しないとエラーになります。
その後、アドレスをキャスト演算子でキャストすれば目的の関数ポインタが得られます。
最初に関数ポインタさえとってしまえば、そのあとの呼び出しのコストが最小限に抑えらえるので、静的関数がターゲットならば実用的ではないでしょうか。
git github

#gitについて
・gitとは、バージョン管理にことを言う
※バージョン管理とは、誰がいつどこでコードを修正したかを可視化すること
-・githubとは、オンライン上で管理すること。
※gitはローカルで管理、githubはオンライン上で管理
#git hubについて
・githubとは、オンライン上で管理すること。

#git githubの実行手順　

(Gitコマンド１)
・git init (gitリポジトリーの作成　最初だけ)　
・git remote add origin <URL> (GitHubのURLを登録)
・git switch -c <ブランチ名>　(ブランチを作成して切り替える)
※リポジトリーとは、フォルダーやファイルなどの記録する場所

(Gitコマンド２)
・git add . (変更内容をステージングに追加)
・git commit -M (git commit -m "メッセージ")
・git push origin <ブランチ名> (GitHubにプッシュ)

(Gitコマンド３)
・git switch <ブランチ名> (ブランチを切り替える)
・git pull origin <ブランチ名> (GitHubの変更内容を取り込む)

github メールアドレス ユーザーネーム
・git config —global user.name “jojo232”
・git config —global user.email yuya90360@icloud.com
・git config —global merge.ff false
・git config —global pull.rebase merges
・git config —list (確認する)

![IMG_1888.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1495496/0f583994-c4da-eb19-02a0-fbed2477a442.png)



#README.md 意味
"https://code-ship-blog.wemotion.co.jp/class-diary/%E3%80%90%E4%BB%8A%E6%97%A5%E3%81%AEqa%E3%80%91readme-md%E3%81%A3%E3%81%A6%EF%BC%9F%E3%80%90github%E3%80%91/#:~:text=GitHub%E3%81%AEREADME.md%E3%81%A3,%E4%B8%8B%E3%81%AB%E8%A1%A8%E7%A4%BA%E3%81%95%E3%82%8C%E3%81%BE%E3%81%99%E3%80%82"
progreesViewを縦にして、太さも変更する

UIProgressViewを回転させると、太さを変更したのにそれが適用されないみたいな事が起こりました。

ちなみに太さは

```php
YourProgressView.transform = CGAffineTransform(scaleX:任意の値,y:任意の値)
```
で変更できるのですが、そこでもし、「よし、回転させたい」ってなった時に、

```php
YourProgressView.transform = CGAffineTransform(rotationAngle:CGFloat(90*CGFloat.pi / -180))
```
を記述して回転させると、まあちゃんと回転はするのですが、逆に「変更したはずの太さが変更されてなかった」という事が起こってしまいした。

<h1>解決策</h1>
そこで、どうすれば太さを維持したまま回転させる事が出来るのか模索した結果、CGAffineTransformが持つconcatenating(文字列結合)というメソッドを用いれば良い事がわかりました。
記述するとこんな感じです。

```php
import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var YourProgressView: UIProgressView!
    
    override func viewDidLoad() {
        super.viewDidLoad()

        let changeScale = CGAffineTransform(scaleX: 1.0, y: 3.0)//太さ変更
        
        let changeRotate = CGAffineTransform(rotationAngle: CGFloat(90*CGFloat.pi / -180))//回転
        
     　　　 let concatenatingTransform = changeScale.concatenating(changeRotate)//二つのTransformを結合
        
        YourProgressView.transform = concatenatedTransform
        
    }


}
```
これでちゃんと出来るようになります。
では！
メールによるスパムはもう古い！今はSlackでスパム！

メールによるスパムはもう古い。Gmailなどではスパム対策機能があるたにスパムメールを送っても遮断されて届かなくなりました。また、メールよりもSlackを使う方が多い。それでスパムするならばSlackで行おう！SlackにはAPIも豊富なので効率的にスパムを行えます。
Slackでスパムする利点には次なようものがある。
1. 競争相手の作業を邪魔して優位にたつ
1. 業務を効率化しているようである
1. 仕事をしているように見せさせることができる
1. 技術があるように見える
1. Slackフィッシングして他人のPCに侵入できる
1. 社交辞令としてSlackチャネルから脱退する人は少ない

##手段
次ぎの手順で簡単にSlackスパムを始めることができます。
1. 仕事の連絡を行うためを理由に新規にSlackチャネルを作成する
1. 作成したSlackチャンネルのWebhookを作成する
1. 相手に通知するようにメッセージを作成する。内容は適当が良い
1. 必要に応じてフィッシングサイトのURLをメッセージに含む
1. Slack Workflowを作成して多くの人に通知を送る
1. 脱退したら再び通知し続ける
1. 一つだけではなく複数のチャネルを作成して自動送信する

##遮断対策
通知を受けないように設定されている人もいます。
例えば次のように設定されている人がいます：
1. ステータスを「離席中」に設定<br/>https://slack.com/intl/ja-jp/help/articles/201864558-Slack-%E3%81%AE%E3%82%B9%E3%83%86%E3%83%BC%E3%82%BF%E3%82%B9%E3%81%A8%E3%83%AD%E3%82%B0%E3%82%A4%E3%83%B3%E7%8A%B6%E6%85%8B%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%99%E3%82%8B
1. 通知を一時停止:<br/>https://slack.com/intl/ja-jp/help/articles/214908388-%E3%81%8A%E3%82%84%E3%81%99%E3%81%BF%E3%83%A2%E3%83%BC%E3%83%89%E3%81%AB%E3%82%88%E3%82%8B%E9%80%9A%E7%9F%A5%E3%81%AE%E4%B8%80%E6%99%82%E5%81%9C%E6%AD%A2
1. 環境設定の通知設定を行っている。特定のチャンネルのもかの通知を受け取るように設定されている。また通知を受け取る時間を「なし」に設定されている。<br/>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698027/75c1ccfa-a0f6-7f9f-6b8f-537908878c44.png)<br/>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698027/68243df6-157e-338e-fcc8-3ef7d231b0d9.png)
そのような場合でも通知を強制的に送るようにする。

##より高度なスパム
Webhookだけでは足りない場合はSlack botやSlack Workflowを作成して@hereにメッセージを送ることもできます。質問をされた人だけにメッセージを送るようにするのではなく無理矢理招待してユーザ全員に送ることが良いスパムのポイントです。
https://api.slack.com/bot-users#:~:text=A%20bot%20is%20a%20type,a%20Slack%20App%20can%20do.

##課題
スパムメールを見なくて済むようにスクリプトで指定したチャネル以外チャネルのメッセージを既読している人もいる。そのようなユーザをスパムする方法を考える必要がある。
Slackはより簡単にスパム出来る機能が増えているため定期的に新機能をチェックして新しいスパムのやり方を継続して改善して行く必要がある。

##最後に
海外ではSlackスパムによる生産性の低下は課題とされている。日本国内ではまだ聞いたことがなく、反対にスパムが増えているように感じる。

以上
話題の「AWSコンテナ設計・構築 本格入門」ハンズオンやってみた（その1）

発売前から各所で話題のこいつ。実は後半が本格的なハンズオンになっている。

https://www.amazon.co.jp/dp/B09DKZC1ZH/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1

![スクリーンショット 2021-11-25 22.43.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/d30cc01e-0ba2-0a59-b872-e15886f4b089.png)

# 環境準備
- 作業端末：Macbook
- AWSアカウント：自社で勉強用に用意していたものを利用。
    - IAMユーザー：個人ユーザーを作成しAdminAccessを付与。

# 4-2章 ネットワークの構築
初めにCIDRブロックの割り当てを考えておく。
特に今回利用するアカウントは他のメンバーと共用のため、設定例にあるような10.台だと既存VPCと被る可能性大。

指定可能なCIDRのアドレス範囲ってどれだっけ、というのをこれで参照。
https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/VPC_Subnets.html

東京リージョンの既存VPC見ると`10.100.0.0/16`が空いていたので採用。
以降、書籍の設定例の第2オクテットを0→100に読み替える形で設定する。

リソース作成はCFnテンプレートがDL提供されている。URLはこちら。
https://www.sbcr.jp/support/4815609994/

CFnテンプレート内にCIDR設定も記述されているので、VSCodeで先に修正しておく。
![スクリーンショット 2021-11-23 17.16.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/355b57c2-95ac-83f8-c3c8-f1fd4d8a9790.png)

AWSマネコンからCFnサービス画面を起動。
「スタックの作成」から修正したyamlファイルを指定する。

…ところがyamlのアップロードが終わらない。AWSのバグ？を踏んだ模様。
https://stackoverflow.com/questions/58125181/cloud-formation-cant-upload-template-file

回避策としてS3バケット経由での読み込みを試みたところ成功。
※バケットはパブリックアクセス有効にしたうえ、S3 URIではなくオブジェクトURLを指定する必要あり。

CFnスタック名など、基本的にパラメーター類は本書記載の設定例どおりに指定（忘れるので）
グローバルで一意にする必要あるもの等のみユニークな値をつど決めることとする。
![スクリーンショット 2021-11-23 17.19.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/1b7e174f-ae03-54b9-a281-34134d9e2b29.png)

「Create complete」ステータスになったので念のため実物も確認。
たしかにVPCが作成されていた。
![スクリーンショット 2021-11-23 17.25.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/6e6938c3-7583-139d-4032-ad81a4e65f48.png)

# 4-3章 アプリケーションの構築
マネコンからCloud9を起動。「Create environment」する。
（Cloud9はコンソール英語なのね）

環境が立ち上がったらCFnで作ったセキュリティグループを追加。
Cloud9の実態はEC2インスタンスなので、そいつにSGを追加アタッチする。

ここからはCloud9のコンソール操作。
サンプルアプリをGitHubの著者リポジトリからクローンしてくる。
![img.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/3d5194e6-2dc0-8bcd-53b8-5a6649854323.png)


クローンしたフォルダーに移動し、Git操作を開始。
helloworld用コードが格納されているブランチへスイッチ。
（Cloud9、gitコマンドのTab補完に対応してる！便利）

そのあとNode.jsとYarnを仕込んでおく。
最後にバックエンド用アプリもcloneすれば、本章は完了！

# その1あとがき
Mac版Kindle、なんでページめくりこんなに重いんだろう…。
これがなければもっとサクサクハンズオン出来たのにな〜。

→ 追記：この記事を参考にKindle for Mac再インスコしたら重さ改善した！
https://note.com/yn047/n/nba318c9819d2
[flutter] Error in BuiltValueGenerator for abstract class GGetUserReq implements Built<GGetUserReq, dynamic>, OperationRequest<dynamic, GGetUserVars>.

# エラー
flutter でbuild error。

```
$ flutter pub run build_runner build --delete-conflicting-outputs

...

Bad state: No element
[INFO] 2.7s elapsed, 4/5 actions completed.
[SEVERE] built_value_generator:built_value on lib/graphql/queries/user.req.gql.dart:
Error in BuiltValueGenerator for abstract class GGetUserReq implements Built<GGetUserReq, dynamic>, OperationRequest<dynamic, GGetUserVars>.
Please make the following changes to use BuiltValue:

1. Make field optimisticResponse have non-dynamic type. If you are already specifying a type, please make sure the type is correctly imported.
[INFO] Running build completed, took 3.0s
```

# 原因
graphqlファイルで、存在しないカラム名（fcsToken）を指定していた。
built_value_generatorでエラーが出ていて、エラーわかりにくい、、

```dart:user.graphqls
query GetUser {
    currentUser {
        id
        firebaseUID
        // ↓ここタイポ
        fcsToken
        name
        iconUrl
        createdAt
        updatedAt
    }
}
```

タイポを修正した。

```dart:user.graphqls
query GetUser {
    currentUser {
        id
        firebaseUID
        // ↓ここ直した
        fcmToken
        name
        iconUrl
        createdAt
        updatedAt
    }
}
```

再度、build_runnerを実行して解決。

```zsh
$ flutter pub run build_runner build --delete-conflicting-outputs
[INFO] Generating build script...
[INFO] Generating build script completed, took 427ms

[INFO] Initializing inputs
[INFO] FlutterGen Loading ... pubspec.yaml
[INFO] Reading cached asset graph...
[INFO] Generated: /Users/hayashikengo/ghq/github.com/hkengo/kakeibo_mobile/lib/gen/assets.gen.dart
[INFO] FlutterGen finished.
[INFO] Reading cached asset graph completed, took 246ms

[INFO] Checking for updates since last build...
[INFO] Checking for updates since last build completed, took 730ms

[INFO] Running build...
[INFO] 2.1s elapsed, 4/6 actions completed.
[INFO] Running build completed, took 2.8s

[INFO] Caching finalized dependency graph...
[INFO] Caching finalized dependency graph completed, took 51ms

[INFO] Succeeded after 2.9s with 9 outputs (11 actions)
```
テスト54

```vb

'Wordファイルが保護ビューで表示されてしまった時の対策
'以下のコードを指定のWordファイルの必要な場所に仕込む
Public Declare Function MessageBox Lib "user32.dll" Alias "MessageBoxA" (ByVal hWnd As Long, ByVal lpText As String, ByVal lpCaption As String, ByVal uType As Long) As Long

'OKボタンを保有するフラグ
Public Const MB_OK = &H0

'最前面フラグ
Public Const MB_TOPMOST = &H40000


Sub Memo()
'ｃ⌒っﾟωﾟ)っφ　ﾒﾓﾒﾓ...
Back:

If Application.ProtectedViewWindows.Count > 0 Then
    '通常のMsgBoxを使うとメッセージボックス以外操作できなくなるので、MessageBoxを使う
    MessageBox 0, "Wordファイルに保護ビューが設定されています。「編集を有効にする」を押した後、再度OKボタンを押してください", _
    lpCaption, MB_OK Or MB_TOPMOST
    GoTo Back

End If

End Sub

'--------------------------------------------------
'別の方法
'Normalプロジェクトの標準プロシージャにAutoOpenプロシージャで記述することで機能することを確認
'(2021/11/29)
Sub AutoOpen()

If Not Application.ActiveProtectedViewWindow Is Nothing Then
　　'保護ビュー(「編集を有効にする」ボタンが表示されている時)になっていたら編集できる状態にする
    Application.ActiveProtectedViewWindow.Edit

End If

End Sub
ScratchAPIが便利すぎる件について

# はじめに
皆さ～ん！ScratchAPIって知ってますか？(唐突)

# ScratchAPIとは
普通のAPIって、APIキーとか認証とかが必要になってくるんですよ。
ですが、このScratchAPIは認証いらずで手軽に誰でも使えます！
> ただし、GET系のAPIしか使えません。

# 使ってみよう
ScratchAPIはいくつかURLがあります。
### 素材(画像とかサウンドとか)
~~~
http://assets.scratch.mit.edu/任意
~~~
### ベーシックなAPI
~~~
http://api.scratch.mit.edu/任意
~~~
### プロジェクトの詳細(内容ブロックなど)
~~~
http://projects.scratch.mit.edu/任意
~~~

# 使ってみよう！
実際にPHPで使ってみましょ～ね～

~~~php:main.php
<?php
$json = file_get_contents("http://api.scratch.mit.edu/users/".$_GET["q"]."messages/count");
$json = json_decode($json, true);

echo $_GET["q"]."の現在のメッセージ数は～...[".$json["count"]."]個だよ！";
?>
~~~

はい。URLパラメータの[q]で入力されたユザネを取得し、ソイツのめっさげ数を見るっていうやつですね。
結構Easyですよね(そもそもする事がEasyなのは気にしない☆彡)
他にもいろいろやることはあります。
詳しくは[この記事](https://ja.scratch-wiki.info/wiki/Scratch_API_(2.0))を見てみてください！

# 終わりに
結構簡単だったでしょ？
ではでは～☆彡
WAS設計その12 HTTP管理サーバーの構成に関して

https://www.ibm.com/docs/ja/was-nd/8.5.5?topic=icwspi-configuring-web-server-application-server-separate-machines-remote

なんで必要なのか毎回忘れる。
※正直この製品に心から興味がないんだろう(笑)

必要な場合は
IHSとWASが同一筐体（同一のサーバにいないとき）
※Webサーバとアプリケーションサーバをサーバで分離するとき必要。

理由
プラグインの伝搬するときにこのプロセスが起動していないとプラグインの伝搬が失敗する。

あと
IHSとWASが分離している構成の場合、当然その間にFWが存在するので、8008（デフォルト）を開けること。
※ポート番号更新。

今回の件とは異なりますが
ND→IHSのリッスンポート（たいていの構成では80番ポート）も解放してください。
理由：NDがIHSのポートを監視するため。
※正直WASの管理コンソールから赤×がついているのを気にしないのであれば閉じておいてもよいはず。IHSが起動していても緑色の矢印ステータスに変更しないので。
portainerを起動させるスクリプト

PortainerはDocker上でportainerコンテナを作ってDocker全体を管理するタイプのツールです。

> 参考
> https://qiita.com/polarbear08/items/931fe04ec228fad13092
> https://stackoverflow.com/questions/394230/how-to-detect-the-os-from-a-bash-script

![image001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76058/afaf53d5-fbae-ac3d-8285-481edbb4ca04.png)


起動させるのがめんどくさいので自分用にちょっと便利にしたスクリプトを作成しました。(ただしwindowsは非対応)

### スクリプト内容

Docker起動後に以下の内容が記載されたファイルを実行することでPortainerを実行させます。

例えば`.zprofile`や`.bash_profile`等に`/bin/sh ファイルパス.sh`といった感じに追記してターミナル起動時に起動させることが出来ます（起動したらブラウザを開く）。既に起動している場合は`portainer running. URL `が表示されるだけです。

portainerに設定した内容はDocker Volumeの`portainer_setting_data`に格納されます。

ターミナル起動時毎に実行され、dockeとportainerrが起動しているか等を判定するので、ターミナルの起動時間が気になる人は`cron`とか使ったりして対応するか、このスクリプト自体使わない方が良いかもしれません。

```bash
#/bin/bash
# コンソール表示用の環境変数
PORTAINER_URL=http://docker.local
# ホスト側のポート番号
PORTAINER_PORT1=8000
PORTAINER_PORT2=9000
if [ "$(docker stats --no-stream)" ]; then
if [ "$(docker ps -qf name=portainer -f status=running)" ]; then
# portainer動作中
echo "portainer running. ${PORTAINER_URL}:${PORTAINER_PORT1}"
elif [ "$(docker ps -qf name=portainer -f status=exited)" ]; then
# portainerコンテナはあるが動作していない場合
docker start portainer
echo "portainer start. ${PORTAINER_URL}:${PORTAINER_PORT2}"
# URLを開く
if [[ "$OSTYPE" == "linux-gnu"* ]]; then
# Linux
echo "open linux"
xdg-open ${PORTAINER_URL}:${PORTAINER_PORT2}
elif [[ "$OSTYPE" == "darwin"* ]]; then
# Mac OSX
open ${PORTAINER_URL}:${PORTAINER_PORT2}
fi
elif [ ! "$(docker ps -aqf name=portainer)" ]; then
# portainerコンテナが存在していない場合
docker run \
    --detach \
    --publish ${PORTAINER_PORT1}:8000 \
    --publish ${PORTAINER_PORT2}:9000 \
    --name portainer \
    --restart always \
    --volume /var/run/docker.sock:/var/run/docker.sock \
    --volume portainer_setting_data:/data \
    portainer/portainer-ce
echo "portainer create. ${PORTAINER_URL}:${PORTAINER_PORT2}"
# URLを開く
if [[ "$OSTYPE" == "linux-gnu"* ]]; then
# Linux
echo "open linux"
xdg-open ${PORTAINER_URL}:${PORTAINER_PORT2}
elif [[ "$OSTYPE" == "darwin"* ]]; then
# Mac OSX
open ${PORTAINER_URL}:${PORTAINER_PORT2}
fi
fi
fi
```

### portainer削除

上記スクリプトのファイルを削除してから下記を実行することでコンテナとボリュームをそれぞれ削除出来ます。

#### コンテナを停止して削除

```bash
docker stop $(docker ps -aqf "name=portainer") && docker rm $(docker ps -aqf "name=portainer")
```

#### 設定が入ったボリュームを削除

```bash
docker volume rm portainer_setting_data
```
WAS設計その11 停止時にパスワードを聞かれないための対応

ちょっと設計とは違いますが
必ずWAS担当者が行うこと。
停止時にユーザ名とパスワードを聞かれないようにする作業。
ファイル名：soap.client.props

参考URL
http://glasses-se-note.com/2021/02/

手順は後日記載予定。
C#とコンポーネントを使用してExcel文書をHTMLに変換する方法

#C#とコンポーネントを使用してExcel文書をHTMLに変換する方法

##背景

作業には、財務を対象として処理する場合、大量のデータを計算したり統計したりすることがあります。皆さんの知ってるとおり、Excelファイルは非常に人気があり、データ処理の分野で広く使用されています。Excelを使用すると、保存されているデータに対して数学的な計算を実行できますが、データを表示する場合、Excelを直接使用することは特に適切ではありません。他の形式で表示されたいなら、HTMLはいい選択かもしれません。故に無料のコンポーネント、**[Spire.XLS for .NET](https://www.e-iceblue.com/Download/download-excel-for-net-now.html)**を見つけてその変換を実現しました。では詳細を紹介します。

##Spire.XLS for .NETとは？
**[Spire.XLS for .NET](https://www.e-iceblue.com/Introduce/excel-for-net-introduce.html#.YW9_P_l1NmI)**は、開発者がC#やVB.NETプラットホームでExcelの文書ファイルを迅速かつ高品質で作成・編集・変換・印刷するために設計された専門的な Excelライブラリです。

中には、無料版の**[Free Spire.XLS for .NET](https://www.e-iceblue.com/Introduce/free-xls-component.html#.YW9_bPl1NmI)**と商用版の**[Spire.XLS for .NET](https://www.e-iceblue.com/Introduce/excel-for-net-introduce.html#.YW9_P_l1NmI)**がありますが、基本的な機能を搭載しているので、無料試用でも日常の仕事には結構だと思います。

##コード一覧：
1 まずはWorkbookのインスタンスを作成します。WorkbookはExcel文書を展示できます
```Workbook workbook = new Workbook();```
2 最初のSheetを取得します
```Worksheet sheet = workbook.Worksheets[0];```
3 最初のSheetのセルA1を「TEXT」に設定します
```sheet.Range["A1"].Text = "TEST";```
4 最後は文書を保存します
```workbook.SaveToFile("result.xlsx", FileFormat.Version2010);```

このライブラリを使用してExcelファイルを開いて作成すると非常に便利です。以下の生成されたファイルのスクリーンショットを見てください。
![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/6ba64164-b51e-5f9f-0087-1d20c190a907.png)



##HTMLに変換する

よし、既にExcel文書を作成した以上、これからはExcelをHTMLに変換します。
1 先ずはWorkbookのインスタンスを作成し、Excel文書を表示します。
```Workbook workbook = new Workbook();```
2 サンプルファイルをロードします
```workbook.LoadFromFile("sample.xlsx");
Worksheet sheet = workbook.Worksheets[0];```
3 一ページ目のテーブルをHTMLに変換します
```sheet.SaveToHtml("result.html");```
元ファイル：
![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/a642c80b-63f3-f84a-12e6-85326f0144cd.png)
作成されたHTMLファイル：
![03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/b36b4711-37df-d5fe-2505-95f275691f65.png)

以上です、最後まで読んでいただきありがとうございます！
【初級者向けUnityテスト】コマンドバトル

##問題
ポケモンみたいなターン制バトルを作ろう！

![Nov-23-2021 16-57-51.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/722227/ead406e6-4f1c-95b9-2772-aa62effabeb1.gif)

##準備
UnityPackageをダウンロードしてください。

https://drive.google.com/file/d/1WqAIk1HQQoxo8sS2BKV6sqDjnNC4kXQ1/view?usp=sharing

ダウンロードの場所↓
![スクリーンショット 2021-11-30 14.42.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/722227/e9c0bb3a-893b-2710-1aed-4d8b20cdc7b1.png)

プロジェクトを新規作成して、インポートしましょう。
※推奨バージョン：2020.2.7（多少違っても問題ないとは思います）

まず、Mainシーンを開いて再生し、プレイヤーが十字キーで動かせるか確認しましょう。

##作るもの
☆
・Hitbox（ライオンについてる）にぶつかったらBattleシーンに移動する（Playerスクリプトに書く）

・HPはPlayerもEnemyも100からスタート（ここからBattleScriptに書く）
・バトルシーンが開いたらすぐ「PlayerHP:100」と「EnemyHp:100」とコンソールに表示する
☆☆
・こうげきボタンを押したら
　　→相手のHP-10（さらに、EnemyHP:〇〇とコンソールに表示する）
　　→自分のHP-5（さらに、PlayerHP:〇〇とコンソールに表示する）
・かいふくボタンを押したら→自分のHP+20
（さらに、PlayerHP:〇〇とコンソールに表示する）
☆☆☆
・プレイヤーのHPが0になったら「負け」敵のHPが0になったら「勝ち」とコンソールに表示する
☆☆☆☆
・アイテムボタンを押したら→プレイヤーの攻撃力が1.5倍になる


発展問題
・どうすればもっといいゲームになるか考えてみよう
・HPの数値をゲーム画面にテキストとして反映する
・敵の攻撃力（相手のHP-10）の数値を、-5 から -30の間でランダムにする
・かいふくボタンを押して回復した時も、相手のターンとして自分のHPをマイナスする

解説↓

https://qiita.com/miomm/items/eb9cdaa669b3e7ce8b83
$ npm run devでコンパイルしようとしたらSintax error

# ＜エラー概要＞
◉LaravelMix学習
表題の通り、上記コマンドでエラー発生

:::note warn
SyntaxError: Identifier 'mix' has already been declared
:::

#＜仮説＞
◉コードを書き換える際に余分なコードを記載してしまった。
◉エラー文よりすでに定義された変数や定数が再定義されている

#＜解決方法＞
```webpack.mix.js
const mix = require('laravel-mix');
```
こちらのコードがなぜか二行書いてしまっており一行削除し解決に至りました。
エラー文の通り、 すでに定義mixという変数が再定義されているということでした。

# ＜感想＞
今回のエラーはエラー分をじっくり読めば解決できるものでした。
引き続き頑張ります！
補足アドバイスがあれば是非お願いいたします。
<br>
Vue.js 備忘録

# はじめに
* （投稿した現時点において）Vueでのフロントエンド開発が主流となっていることを感じる
* 今回はVue3に関する知識的なことと、環境構築（mac）部分について記載する
    * 知識的なことはいくつかサイトを閲覧して纏めたものになる
    * 環境構築については手順を記載したものになる

# フロントエンド開発のトレンド
* フロント市場ではReactに次ぐ2番目に人気がある
* Vue.jsが伸びてきている

## 参考URL
https://fastcoding.jp/blog/all/info/state-of-frontend-2020-1/#no1

# Vue.jsについて

## Vue.jsとは？
* フロントエンド開発のUI（ユーザーインターフェイス）を構築するための、人気のある OSS JavaScriptフレームワーク

## Vue.jsの特徴
### 学習コストが低い
* 他のJSフレームワーク（React/Angular等）と比較すると従う必要のあるルールが少なく、シンプルに作られている
    * そのため、JS/HTML/CSSの基礎知識があれば既存知識を活用できる
* 一方でルールが少ないため大規模での開発で利用する場合は、Nuxt.jsなどVue.jsを拡張したフレームワークを利用する必要がある

### 開発スピードが早められる
* Directive（ディレクティブ）という、Viewの要素に付加できる独自属性がある
* ディレクティブを利用することでDOM操作ができ、HTML要素の表示・非表示などを柔軟に変化させることができる
* 日本語での技術ブログや記事も充実している

### 作業の簡素化が可能
* Vue.jsはコンポーネント指向のフレームワークであるため、画面の部品を一つまたは複数のコンポーネントとして作成することができる
    * ボタンや入力欄など、複数の画面で使用するものを“コンポーネント”という単位で区切ることができる
    * 再利用性が高くなり、デザインと技術の共同作業の簡易化でき、開発スピードの向上につながる

## 他のJSフレームワークとの比較について（参考URL）
https://career.levtech.jp/guide/knowhow/article/388/

https://jp.vuejs.org/v2/guide/comparison.html

# Vue3について
* Vue3は、Vue2からメジャーバージョンアップされたもの
* 2020年9月に正式リリース
* Vue2とVue3とでは全く別物
    * Vue2から基本的な部分から変わっている
    * Vue2のプログラムはほぼVue3で動かない
* 本格的な開発を行うためにはNode.jsをインストールする必要がある
    * 「ないとVue3は使えない」ということはない

## Vue.js devtoolsについて
* Chromeで用意されている機能拡張を設定する（Vue.js devtools）
* 開発者ツールのVueタグ押下により、Vue3によってどの部分にどのデータが表示されているか分かるようになる

# 環境構築の前に
* まずは環境構築しなくても、htmlに `<script>`タグを追加してVue3を使える方法を試す

~~~Vue
<!DOCTYPE html>
<html>
  <head>
    <title>Vue app</title>
    <script src="https://unpkg.com/vue@next"></script>
  </head>

  <body>
    <div id = "message">
      {{ message }}
    </div>

    <script>
    const adddata = {
      data() {
        return {
          message: 'Hello World!'
        }
      }
    }
    Vue.createApp(adddata).mount('#message')
    </script>
  </body>
</html>
~~~

* プラウザで `Hello World!` が表示された

# Vue3の環境構築（mac）
## Node.jsのインストール
* https://nodejs.org/ja/ から推奨版をダウンロードする
* ダウンロードしたpkgをダブルクリックしてインストールを行う
* 「ようこそNode.jsインストーラへ」からウィザードに従ってインストールを進める
* インストールが完了したら、ターミナルを起動しバージョンを確認する

~~~
$ node -v
v14.17.6
~~~

* 上記バージョン確認できたらインストールは完了

## Vue CLIのインストール
* 以下コマンドを実行する
    * エラーとなったため、[【備忘録】npm -g install に失敗する](https://qiita.com/NaokiIshimura/items/cc07441939b226e779c6) の記事を参考にして解決した

~~~
$ npm install -g @vue/cli
~~~

## プロジェクト作成（その１）
* ターミナルから以下コマンドを実行する

~~~
$ vue create #プロジェクト名#
~~~

* プリセット`Defalut (Vue 3 Preview) ([Vue 3] babel, eslimt)`を選択する
* プロジェクトの作成が開始され、少し待つと作成が完了する
* プロジェクトの実行は以下コマンドを実行する

~~~
$ npm run serve
~~~

* http://localhost:8080/ にアクセスすると、デフォルトで用意されているWebページが表示される

## プロジェクト作成（その２：Vite）
* ターミナルから以下コマンドを実行する

~~~
$ npm init vite-app #プロジェクト名#
$ cd 指定したプロジェクトのパス
$ npm install  -> 必要なパッケージのインストール
$ npm run dev  -> 実行
~~~

* http://localhost:3000/ にアクセスすると、作成したプロジェクトが表示される
* Vue3に関しては、プロジェクトの生成や実行、ビルドといった作業は「Vite」で行うのが基本らしい

## プロジェクト作成（その３：GUI）
* `$ vue ui` コマンド実行により、GUIでプロジェクト作成ができる

# さいごに
* 簡単な実装関連については次回投稿できたらと思います
pythonで作る数当てゲーム

1~100のランダムな数字を当てるゲームです。


```python:kazuate.py
import random
count = 1
answer = random.randint(1,100)

while True:
    number = input('1~100の間で数字を入力してください >> ')
    if number.isdecimal():
        number = int(number)
    else:
        print('間違った入力がされました。\n'
              'もう一度数字の入力をお願いします。')
        continue

    if answer == number:
        print(f'正解です。正解は{answer}。')
        print(f'{count}回目のチャレンジで正解しました。')
        break
    elif answer > number:
        print(f'入力された数字は{number}。それより大きい数です。')
        count += 1
    else:
        print(f'入力された数字は{number}。それより小さい数です。')
        count += 1
```

動作のスクリーンショットなど
![スクリーンショット 2021-11-23 171757.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1936609/ceef971c-0c6b-ee73-9612-48dc83aae46a.png)
WAS設計その10 データソース設計

データソース設計は
範囲：セル、ノード、クラスタ
※仮にセルで作っても、同じ名前でクラスタで作ったら、クラスタ側の値が有効になる。
※ADのグループポリシーも確か同じような動き。
※小さい範囲のほうが優先！！

接続先データベースのユーザ情報
※データベース担当者から教えてもらう。

接続先データベース名（Oracleの場合は表領域名）

タイムアウト
※ロードバランサー、IHS、アプリケーションサーバ含めトータルで考えることが重要

最大プール数

最小プール数

※これ結構重要。データベースが障害で切り替わった場合、
※回避方法。
※ただ、回避方法を使うと全体へのパフォーマンスへの影響があるので、アクセスが少ないシステムなら使用してもOK？

リープ時間等を今後追加予定。
Windows10でパスを追加する

# 背景
コマンドプロンプトなどから実行ファイルを起動したいとき、実行ファイルによってはパスの追加が必要になる。Rを例にパスの追加方法を記載する。
![コマンド プロンプト 2021-11-23 15.40.36_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363491/f2ce6781-3732-bbb2-e73e-2db2eb095843.png)
Rがインストールされていてもパスが追加されていなければ、コマンドプロンプトからは実行できない。

# 環境
OS: Windows 10 Pro (10.0.19043)
R: 4.1.2 (2021-11-01)

# 方法
### 1. 実行ファイルのパスの確認
ショートカットアイコンや検索バーにて実行ファイルを選択し、右クリック→ファイルの場所を開く→プロパティで実行ファイルのパスを確認できる。

![検索 2021-11-23 16.25.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363491/aba8b093-891b-a067-6b2c-8faf3aad2b7a.png)
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363491/35309ae4-df21-f711-64cd-cac9fe7c3cad.png)

実行ファイルが含まれるフォルダのパスをコピーする（図の場合は「C:\Program Files\R\R-4.1.2\bin\x64\」）。
![R x64 4.1.2のプロパティ 2021-11-23 16.35.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363491/f86169d7-24e2-85aa-ee23-3dec4b2d09c9.png)

### 2. パスの追加
「設定」の検索バーに「path」と入力し「環境変数を編集」をクリックする。
![設定 2021-11-23 16.40.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363491/30805d10-cd41-362e-4998-3d31623b94ba.png)
「ユーザー環境変数」のPathを選択し「編集」をクリック
※システム環境変数はコンピュータの全ユーザーに影響するため、基本的にはユーザー環境変数を編集する方が無難です。
![環境変数 2021-11-23 16.42.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363491/9ac1d7c8-35d7-faa7-f990-54d1bac17df7.png)

新しくパスを追加する場合は「新規」をクリック。
![環境変数名の編集 2021-11-23 16.47.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363491/95bec5a3-9652-5900-fe57-7043aa908c27.png)

先ほどコピーしたRの実行ファイルのパスを貼り付ける。OKをクリック。
![環境変数名の編集 2021-11-23 16.48.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363491/3c7b4231-cdc6-d760-a887-590c75fe3c4c.png)

# 結果
コマンドプロンプトを再起動し「R」と打つとRが起動する。plot関数による作図はポップアップで表示される。
このように、RやRstudioを起動せずともコマンドプロンプト上でRスクリプトから計算や作図を行うことができます。

※コマンドプロンプトやターミナルからRスクリプトを実行する方法は下記の記事を参照してください（記事内ではmacのターミナルで実行していますがWindowsでもほぼ同様のはず）。
![Rterm (64-bit) 2021-11-23 16.55.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363491/b32b3109-8248-2fa5-8cf5-8f270553d5b1.png)

https://qiita.com/otsukimi200624/items/84826238b469e528d41e
Webの勉強はじめてみた その1

N予備校で「プログラミング入門 Webアプリ」の受講を始めました。
個人的に気付いた点とか諸々を、ここでは少しずつ書いていきたいと思います。

<h2>今日やったこと</h2>

:::note
1. Chromeのデベロッパーツールでjavascriptの実行。
2. VS code を使ったhtmlファイルの作成。
:::



<h2>気付いたこと</h2>

<h3>1. Chromeのデベロッパーツールでjavascriptの実行。</h3>
alert みたいなダイアログで、日本語を書いたときに、「;」を全角にしてエラーになることがある。

:::note warn
alert("こんにちは")；
alert("こんにちは");
:::

多分「こんにちは」の後に;を打つからこうなる。癖？

<h3>2. VS code を使ったhtmlファイルの作成。</h3>
VS codeで「html:5」でタブを押すとひな形ができる。
知らなかった。
で、テンプレートで作られる`<meta>`の中ってよくわからない単語を見かけることが多い気がする。
何がしたいのかっていう。

`<meta http-equiv="X-UA-Compatible" content="IE=edge">`

ここが端的でわかりやすかったです。
https://www.creativevillage.ne.jp/2819



あと、`<html lang="ja">`
langを書かないとどうなるのか。
https://www.tohoho-web.com/html/attr/lang.htm


<h2>まとめ</h2>
とりあえず初日はこんな感じ。
もしかしたら解説動画だけで進めてもいいかもしれない。
これからゆっくり進めていきます。
【環境構築】rbenvで指定バージョンのRubyにダウングレード【mac】

Macでrbenvを使用して指定バージョンのrubyにダウングレードしようと思ったのでメモ:writing_hand_tone2:
ちなみにHomebrewでrbenvは既にインストール済み。

チュートリアルのバージョンと自分の開発環境のバージョンを一致させたくて今回のダウングレードを実施することにしました。

（~~キャッチアップの際、色々エラーが出てきて、本来の主目的以外のところで時間をとられるのが面倒だなと思ってたので、「もうチュートリアルと一緒のバージョンに下げちゃえ」と思ったので、やむをえずダウングレードすることに~~）最善策ではないと思うので、良い子はマネしないでね:runner_tone5:

# 実行環境
* Homebrew 3.3.2
* ruby 2.6.8 → 2.5.0 にダウングレード

# 現在のRubyバージョンを確認
```
$ ruby -v 
ruby 2.6.8p205 (2021-07-07 revision 67951) [universal.x86_64-darwin21]
```

# 指定バージョンをインストール
```
$ rbenv install 2.5.0
```

# インストールされたか確認
```
$ rbenv versions
* system
  2.5.0 (set by /Users/user/.rbenv/version) 
```
とりあえずインストールは、されたっぽい。

# 切り替え可能にする
```
$ rbenv rehash 
```
環境によっては、要らないかもです。
私の環境だと必要でした！

# Rubyバージョンを切り替える
```
$ rbenv global 2.5.0
```

# Rubyバージョン切り替わったか確認
```
$ rbenv versions
  system
* 2.5.0 (set by /Users/user/.rbenv/version) 
```

設定できた:ok_hand_tone1:

# 参考記事
[rbenvでバージョンがうまく切り替わらなかった時にやったこと](https://qiita.com/akatsuki174/items/c0384b9903b4b5cbbdaf)
Gradle + Kotlinで実行可能な.jarファイルを出力する

## 環境

- Gradle 7.3
- Kotlin 1.6.0
- JDK 11

## 結論

以下の設定をbuild.gradleに書いておけば問題ないはず。

- メインメソッドの在処
- kotlin-stdlibを.jarファイルに含める

あとは以下のコマンドで実行できる。

```
$ ./gradlew jar
$ java -jar build/libs/YOUR_PROJECT_NAME.jar
```

## メインメソッドの在処

これが出来ていないと `$ java -jar ...` の結果以下のように怒られる。

```
build/libs/YOUR_PROJECT_NAME.jarにメイン・マニフェスト属性がありません
```

散々言われてそうだけど、build.gradleに以下の記述を追加すればOK。

```groovy
jar {
    manifest {
        attributes 'Main-Class': 'mainメソッドを定義しているクラス名'
    }
}
```

ちなみにパッケージ直下にmainメソッドを定義している場合、mainメソッドを所有しているクラスの名前はファイル名 + "Kt"になる。例えばファイル名が"Entrypoint.kt"だった場合は、"EntrypointKt"になる。

## kotlin-stdlibを.jarファイルに含める

いきなり話が逸れるけど、いつからか依存にkotlin-stdlibを書かなくても、Gradleプラグインにkotlinを指定するだけでKotlinが有効になり、IDEで実行可能になっている。

が、これは単にIDE上での話っぽく、.jarファイルで実行するには依然必要である。もし適切に設定していないと、 `$ java -jar ...` の結果以下のように怒られる。

```
Exception in thread "main" java.lang.NoClassDefFoundError: kotlin/jvm/internal/Intrinsics
	at MainKt.main(Main.kt)
Caused by: java.lang.ClassNotFoundException: kotlin.jvm.internal.Intrinsics
	at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:581)
	at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
	at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522)
	... 1 more
```

これを解決するにはbuild.gradleに以下の記述を追加する。

```groovy
dependencies {
    implementation 'org.jetbrains.kotlin:kotlin-stdlib' // コンパイル時に使用
}

jar {
    from {
        configurations.compileClasspath.collect { // .jarファイルに含める
            it.isDirectory() ? it : zipTree(it)
        }
    }
}
```
コンピューターシステムについて考察してみた

#初めに(前書き)

今回はヒマを持て余していたので、
(今更ですが、)コンピューターシステムについて(実装時・開発時の観点から)考察してみました。
正直なところ、私見が多く入っているので、どこまで読者様の参考になるかわかりませんが・・・。



#本題(本文)

コンピューターシステムは現実社会・現実世界の様々なところで、様々に使われていますが、
おおむね、人間になんらかの便益や利得をもたらすという意味では、文脈上では、「サービス」と同義だと思われます。

ここで、コンピューターシステム(以降、単に「システム」)の内訳・構成について説明させていただきます。
システムは、大きく分けると、「フレームワーク」と「ライブラリ」によって構成されますが、(わたしの勝手な私見・解釈に過ぎませんが、)これらの二つのものは、ともにミドルウェアとして分類され、これらに「OS」と「OS固有のAPI」が加わります。
※あくまでもソフトウェア的な観点からの説明なので、ここではハードウェアについては考えないこととします。

さらにこれらに、外部システムとの連携機能(＝ブリッジ・プロトコル、はたまたWebAPI等)や、サードパーティー製の外部拡張機能(＝プラグイン・ライブラリ等)が加わります。
※ビルド後(≒実行時)にシステムに追加される機能のことは、「プラグイン」以外には、「アドイン・アドオン・エクステンション」とも呼ばれます。



#終わりに(後書き)
以上、コンピューターシステムについて考察してみました。
この記事が読者様のお役に立てれば幸いです。
それではまた～。
【Python】東証上場銘柄の株価データを取得する（その１）

## はじめに

[【Python】Pandas で株価データを取得する（その４）](https://qiita.com/tnozoo/items/9effeac19b782a5fae94)ではExcelファイルに書かれた銘柄の株価データを取得した

自分の保有銘柄だけを分析したい場合は自分の保有銘柄を書いたExcelファイルを用意すればよいが，
分析対象を幅広く東証上場銘柄に広げようと思うと，自分でExcelファイルを用意するのは面倒だ

[日本取引所グループ](https://www.jpx.co.jp/markets/statistics-equities/misc/01.html)には，東証上場銘柄の一覧がExcelファイルで用意されている
これを使わない手はない

## Excel を使って東証上場銘柄一覧ファイルの確認

さっそく，[日本取引所グループ](https://www.jpx.co.jp/markets/statistics-equities/misc/01.html)から東証上場銘柄一覧ファイル（data_j.xls）をダウンロードして開いてみる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/385512/82148530-1d76-0c7d-52e9-31f261b68cd0.png)
東証上場銘柄一覧ファイルは，次の10列からできており，
全部で，4133銘柄（2021年10月末）ある

- 日付
- コード
- 銘柄名
- 市場・商品区分
- 33業種コード
- 33業種区分
- 17業種コード
- 17業種区分
- 規模コード
- 規模区分

業種で絞るには「業種区分」列，株価指数で絞るには「規模区分」列がよさそうだ

「規模区分」は5つあり，次のようになっている

|名称|構成銘柄|
|---|---|
TOPIX Core30 | 時価総額と流動性の特に高い30銘柄
TOPIX Large70 | Topix Core 30についで，時価総額と流動性の高い70銘柄
TOPIX Mid400 | Topix Core30，Topix Large70 についで，時価総額と流動性の高い400銘柄
TOPIX Small 1 | TOPIX Small の構成銘柄のうち TOPIX 1000 及び TOPIX Small500 の構成銘柄に該当する銘柄
TOPIX Small 2 | TOPIX Small の構成銘柄のうち TOPIX 1000 及び TOPIX Small500 の構成銘柄には該当しない銘柄

## Pandas を使って東証上場銘柄一覧ファイルの確認

まずは，Pandas で東証上場銘柄一覧ファイルを読み込む

```python
>>> import pandas as pd
>>> df = pd.read_excel('data_j.xls', dtype = str)
```

どんな列があるか

```python
>>> df.columns
Index(['日付', 'コード', '銘柄名', '市場・商品区分', '33業種コード', '33業種区分', '17業種コード', '17業種区分',
       '規模コード', '規模区分'],
      dtype='object')
```

銘柄数は

```python
>>> len(df)
4133
```

規模区分とは，どんな区分か

```python
>>> df['規模区分'].unique()
array(['TOPIX Small 2', '-', 'TOPIX Mid400', 'TOPIX Small 1',
       'TOPIX Large70', 'TOPIX Core30'], dtype=object)
```

17業種区分とは，どんな区分か

```python
>>> df['17業種区分'].unique()
array(['食品 ', '-', '商社・卸売 ', '建設・資材 ', '鉄鋼・非鉄 ', 'エネルギー資源 ',
       '情報通信・サービスその他 ', '機械 ', '医薬品 ', '不動産 ', '運輸・物流 ', '金融（除く銀行） ',
       '小売 ', '素材・化学 ', '電機・精密 ', '自動車・輸送機 ', '銀行 ', '電力・ガス '],
      dtype=object)
```

## Pandas を使って東証上場銘柄一覧ファイルの銘柄抽出

東証上場銘柄一覧ファイルが確認できたところで，銘柄の抽出を行ってみる

17業種区分が銀行の銘柄は

```python
>>> df[(df['17業種区分']=='銀行')]
Empty DataFrame
Columns: [日付, コード, 銘柄名, 市場・商品区分, 33業種コード, 33業種区分, 17業種コード, 17業種区分, 規模コード, 規模区分]
Index: []
```

あれ空だ

17業種区分の値をよく見ると，'銀行 'のように後ろに空白が入っているので

str.rstrip() を使って，末尾の空白を削除する必要があった

```python
>>> df[(df['17業種区分'].str.rstrip()=='銀行')]
```

81行が抽出された

TOPIX Core30 の条件をつけると3メガ銀が抽出される

```python
>>> df[(df['17業種区分'].str.rstrip()=='銀行') & (df['規模区分']=='TOPIX Core30')]['銘柄名']
3510    三菱ＵＦＪフィナンシャル・グループ
3513      三井住友フィナンシャルグループ
3554       みずほフィナンシャルグループ
Name: 銘柄名, dtype: object
```

TOPIX Core30 または TOPIX Large70 の条件にすると5大銀が抽出される

```python
>>> df[(df['17業種区分'].str.rstrip()=='銀行') & ((df['規模区分']=='TOPIX Core30') | (df['規模区分']=='TOPIX Large70'))]['銘柄名']
3510    三菱ＵＦＪフィナンシャル・グループ
3511          りそなホールディングス
3512    三井住友トラスト・ホールディングス
3513      三井住友フィナンシャルグループ
3554       みずほフィナンシャルグループ
Name: 銘柄名, dtype: object
```

## おわりに

今回はここまでで次回は，[【Python】Pandas で株価データを取得する（その４）](https://qiita.com/tnozoo/items/9effeac19b782a5fae94)で書いた
pandas_datareader を使って，直近の株価データを取得してみることにしよう
JavaScript関連で出たエラーのメモ。

Vue.jsの勉強がてらのアプリ製作中に出たエラーを備忘録としてここにまとめます。エラー内容は多種多様。同じエラーが出た方がいれば参考にしてみてね(^_-)-☆
随時更新します。

#1. Chart.jsを使っていた時。
<font color="Red">『 “export ‘default’ (imported as ‘Chart’) was not found in ‘chart.js’』</font>というエラーが出た。
Chart.jsのバージョンが原因。最新のものだとうまく動かないとのこと。
↓↓のこちら記事で解説あり。

https://yukkiblo.com/chartjs-error-solved/

なので、インストールし直せばOK。

```
$ npm uninstall vue-chartjs
$ npm uninstall chart.js

$ npm install chart.js@2.8
$ npm install vue-chartjs@3.4.2
```

#2. forEachを使おうとした時。
<font color="Red">『TypeError\: _this.data.forEach is not a function』</font>というエラーが出た。
これはajaxを使っている時だったが、戻ってくるデータが配列になっていなかったのが原因。
↓↓のようなコントローラーで、（バックエンドLaravel使ってました、）『return[]』とするとオブジェクトで返ってきてしまうので、そこを『return response()->json($products);』と書き換えれば、配列で返ってきて問題解決した。

```
    public function index()
    {
        $products = Product::orderByDesc('year')->get();
        // return ['products' => $products];
        return response()->json($products);
    }
```

#3. Vue.jsでimgのsrc属性にv-forを使おうとした時。
2021/12/14追記。
Vue.jsでimgタグのsrc属性にローカルのjsonファイルのURLを指定したかった時です。
結論から言うと、以下のようにするとうまくいきました。HTMLでtable使ってます。

```
<tr v-for="(song, index) in songs" :key="id">
　<th>{{ song.id }}</th>
　<td>{{ song.title }}</td>
　<td>{{ song.artist }}</td>
　<td><img :src="song.src" /></td>
</tr>
```
調べてみると、Vue.jsでimgタグのsrc属性の書き方はちょっと気をつけなければいけないみたいで、require()を使うとか、publicフォルダにおいて絶対パス指定するとかあったんです。
それを参考に、
\<img :src="{{ song.src }}" /> とか、\<img :src="require({{ song.src }})" /> とか、\<img :src="require("song.src")" /> とか色々書いていたけど、全部エラーになったよね。うーむ。なんかjsonファイルからの読み込みにはシンプルに\<img :src="song.src" /> と書けばよかったようです。
Microsoftパッチ情報の整理手順

1. 以下URLにアクセスし、調査対象月のセキュリティ更新プログラムへのリンクへ進む。
　https://msrc.microsoft.com/update-guide/releaseNote

2. 段落「FAQ、緩和策、回避策」に注目し、CVEの一覧を情報取得する。

3. 各CVEの詳細ページへのリンクをクリックする、または[CVE番号]を元に、URL「https://msrc.microsoft.com/update-guide/ja-jp/vulnerability/[CVE番号]」に進む。

4. ページタイトルから、CVEの日本語タイトルを情報取得する。

5. 段落「セキュリティ更新プログラム」のタブ「更新プログラム」内の表から列「深刻度」を情報取得する。
　ただし複数行が記載されている場合は、最も高い深刻度を採用する。

6. 「深刻度」が「Critical」だったCVEについて、その詳細を以下の観点で調査、情報取得する。
・攻撃者が脆弱性を悪用するための条件
・脆弱性が悪用された場合の想定される被害

####2021 年 10 月のセキュリティ更新プログラム
>
CVE-2020-1971,OpenSSL: CVE-2020-1971 EDIPARTYNAME NULL pointer de-reference,Important,悪用される可能性は低い,Microsoft Visual Studio によって使用される OpenSSL
CVE-2021-26427,Microsoft Exchange Server のリモートでコードが実行される脆弱性,Important,隣接,Exchange サーバー内で変更が加えられる可能性
CVE-2021-26441,,Important,,
CVE-2021-3449,,Important,,
CVE-2021-3450,,Important,,
CVE-2021-37974,,-,,
CVE-2021-37975,,-,,
CVE-2021-37976,,-,,
CVE-2021-38662,,Important,,
CVE-2021-38663,,Important,,
CVE-2021-38672,Windows Hyper-V のリモートでコードが実行される脆弱性,Critical,隣接,ゲストからホストへの VM エスケープに使用される可能性
CVE-2021-40454,,Important,,
CVE-2021-40456,,Important,,
CVE-2021-40457,,Important,,
CVE-2021-40460,,Important,,
CVE-2021-40468,,Important,,
CVE-2021-40469,,Important,,
CVE-2021-40471,,Important,,
CVE-2021-40472,,Important,,
CVE-2021-40473,,Important,,
CVE-2021-40474,,Important,,
CVE-2021-40475,,Important,,
CVE-2021-40479,,Important,,
CVE-2021-40480,,Important,,
CVE-2021-40481,,Important,,
CVE-2021-40482,,Important,,
CVE-2021-40485,,Important,,
CVE-2021-40486,,Critical,,
CVE-2021-40487,,Important,,
CVE-2021-40489,,Important,,
CVE-2021-41332,,Important,,
CVE-2021-41336,,Important,,
CVE-2021-41337,,Important,,
CVE-2021-41342,,Important,,
CVE-2021-41343,,Important,,
CVE-2021-41352,,Important,,
CVE-2021-41355,,Important,,
CVE-2021-41361,,Important,,
CVE-2021-41363,,Important,,
【Ruby のまずいコード】数字を削除

# お題

引数として与えられた文字列中の半角数字を削除した文字列を返すメソッドを定義してください。

# コード

```rb
def delete_digits(str)
  str.gsub(/\d/, "")
end
```

# 改善

このコードは特別まずいというほどではありませんが，決まった文字を削除するなら専用のメソッド [String#delete](https://docs.ruby-lang.org/ja/3.0.0/method/String/i/delete.html) があります。
これを用いると

```rb
def delete_digits(str)
  str.delete("0-9")
end
```

と書けます。こちらのほうがシンプルですし，速度もかなり上です。

なお，数字**以外**を削除する場合は `delete("^0-9")` と書けます。
AWS - CloudWatch Logs Insightsで日付の期間指定する場合はAbsoluteを選択

AWS - CloudWatch Logs Insightsで日付の期間指定する場合はAbsoluteを選択すべし。
クライアントで --start-time --end-timeを指定する方法はよく見かけたけど、コンソール版はあまり見かけなかった。常識なのかな。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2203726/25231e76-edc9-aed2-b7be-1a78036bc4a9.png)