OmniAICreator/Qiita-1.07M huggingface dataset:
Reduxを使った認証処理の実装

### 今回は、Reduxを利用して、login画面と、認証通過後のhome画面の実装を行っていきます。<br>今回は、reduxプロジェクトを新規で作成し、実装していきます。


それぞれのバージョンは以下
パッケージ名|インストールバージョン|機能
---|---|---
react-redux|8.0.2|状態管理ツール
react-router-dom|6.3.0|ルーティング機能
axios|1.1.2|

## 実装
#### １．Reduxのプロジェクト作成
先ずは、以下のコマンドを実行し、reduxのプロジェクトを作成します。
```
$  npx create-react-app reduxtest --templete redux-typescript
```
最後に「Happy hacking!」と表示されていれば、正常にプロジェクトが作成されたことになります。

#### ２．interfaceの実装
先ずは、前準備として、interfaceの実装を行います。<br>
```authTypes.ts
/* ログインする際のユーザ名とPWを格納するためのデータ型 */
export interface LOGIN_CREDENTIAL{
    username: string;
    password: string;
}
```


#### ２．Sliceの実装
次に、Sliceを実装していきます。
Sliceには、大きく分けてActionとReducerという2つの処理を実装していきます。概要は以下。
処理名|概要
---|---
Acion|呼び出された際、どういう振る舞いをするか記載
Reducer|実装されているActionの結果の処理内容を記載

①Authenticationフォルダ内に、「authSlice.tsx」ファイルを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/196226/eb0da83a-e2ad-9f77-17f3-da49371e7830.png)

②Actionの実装
先ずは、Sliceの中に、Actionを記載していきます。<br>Actionは、呼び出されされた際の振る舞いをどうするか？を記載します。<br>今回は、「fetchAsyncLogin」が呼び出されたら、「LOGIN_CREDENTIAL」に格納されているされている値をURLへ送るという処理を行っています。
```authSlice.ts
/* 認証のための非同期関数（Action） */
export const fetchAsyncLogin = createAsyncThunk(
    "auth/authentication",
    async (auth: LOGIN_CREDENTIAL) => {
        const res = await axios.post<Boolean>(
            /* サーバサイドのAPIを呼び出すためのURL */
            `http://127.0.0.1:8000/api/auth/authentication`,
            /* サーバサイドのAPIに渡す値を格納した引数 */
            auth,
            {
                /* APIを呼び出す際のヘッダ情報を記載 */
                headers: {
                    "Content-Type": "application/json"
                },
            }
        );
        return res.data;
    }
);
```

③Reducerの実装
Reducerは、②で実装したActionを実行した結果、どういった振る舞いを行うか？を記載しています。<br>今回は、②で実装した、「サーバサイドへ処理の依頼を行う」の結果、「/home」のURLへアクセスする処理の実装となります。
```authSlice.ts
export const authSlice = createSlice({
    /* Reducer名 */
    name: "auth",
    initialState: false,
    reducers: {},
    extraReducers: (builder) => {
        /* fetchAsyncLoginが成功した場合の処理 */
        builder.addCase(
            fetchAsyncLogin.fulfilled,
            () => {
                /* /homeのリンクにアクセスする。 */
                window.location.href = "/home";
            }
        )
    }
});
```
④Reducerの登録
Reducerを実装したら、Storeが実装したReducerを利用できるようにする必要があります。<br>ここでは、Storeに、実装したReducerを登録します。
```store.ts
export const store = configureStore({
  reducer: {
    /* authSlice内で実装したReducerをstoreで利用可能にする。 */
    auth: authReducer,
  },
});
```

⑤Home.tsxの実装
一応、簡単な遷移先のhome画面も作成しておきます。<br>ただのHomeと表示させるだけの簡単な内容となります。
```Home.tsx
function Home() {
    return (
        <div>
            <h4>Home</h4>
        </div>
    )
}

export {Home}
```


## 動作検証
①ログイン画面に、ユーザIDとパスワードを入力してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/196226/46c97ec1-0ec7-8d53-6bdb-470b30af1001.png)

②サインインボタンをクリックしてみます。<br>Home画面に移行したことが確認できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/196226/bc26f576-aef2-7210-a6b2-e0c852c08d54.png)

今回作成した全コードは、以下のURLへ上げておきます。
https://github.com/NoriStock1983/redux_auth


以上
MySQLのテーブルのデータをJson形式で出力（エクスポート）する

MySQLのテーブルのデータをJSONで出したくなり、その際に作ったスクリプトを紹介します。

Node.jsで書きます。

```bash
root
|- docker-compose.yml
|- node-script/
   |- package.json
   |- export-mysql-data.js
   |- db.js

```

まずは docker-compose ファイルを用意して、環境を整える。

```yml:docker-compose.yml
version: "3"
services:
  # #######################################
  # # Script
  # #######################################
  script:
    image: node:16
    working_dir: /usr/src/app
    volumes:
      - ./node-script/:/usr/src/app
    tty: true

  # #######################################
  # # Database (MySQL v8)
  # #######################################
  db:
    image: mysql:8.0
    command: --default-authentication-plugin=mysql_native_password
    environment:
      MYSQL_ROOT_PASSWORD: example
    ports:
      - "3306:3306"

```

以下のコマンドを実行
```bash
docker-compose up script db # script と db コンテナを起動
docker-compose exec script bash # script コンテナにログイン
```

以下のファイルを用意します。

```javascript:node-script/package.json
{
  "name": "app",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "mysql": "^2.18.1"
  }
}
```

```javascript:node-script/db.js
const mysql = require('mysql');

const localserver = mysql.createConnection({
    host: "db", //  ← DBコンテナの名前にする
    user: "root",
    password: "example",
    database: "データベース名",
});

localserver.connect(function (err) {
    if (err) throw err;
    console.log('Database Connection Ok');
});
module.exports = localserver;
```

```javascript:node-script/export-mysql-data.js
const dbConn = require("./db");
const fs = require("fs").promises;

// 引数の sql を実行し、結果を { results } に入れて返す関数
const usePromiseQuery = ({ sql, data }) => {
  return new Promise((resolve, reject) => {
    dbConn.query(sql, data, (err, results, fields) => {
      if (err) {
        console.log("err: ", err);
        reject({ err });
      }
      resolve({ results, fields });
    });
  });
};

const run = async () => {
  console.log("start run function.");

  const { results } = await usePromiseQuery({
    sql: `SELECT * FROM sample_table`,
    data: [],
  });

  try {
    await fs.writeFile("export.json", JSON.stringify(results));
    console.log("export.json が作成されました");
  } catch (err) {
    console.log(err.toString());
  }
};

run();
```

ファイルの作成が完了したら、スクリプトを実行します。

```bash
node export-mysql-data.js
```

エラーが無ければ、
`export.json` が出力されるはずです。
ネットワーク構築 #9 (Syslog設定)

# 今回の内容
各ルーターのログをSyslogサーバーに送る

実施日:2022/10/08～2022/10/10

# 設定
Syslogサーバー側の設定(準備中)

各ルーターへの設定は以下の通り
```
(config)#service timestamps debug datetime msec localtime show-timezone
(config)#service timestamps log datetime msec localtime show-timezone
(config)#service sequence-numbers
(config)#clock timezone JST 9
(config)#ntp server ntpサーバーのIPアドレス
(config)#logging buffered 512000
(config)#logging host SyslogサーバーのIPアドレス
(config)#logging trap informational
(config)#logging facility local 6
```
ルーターの設定は上記のものだけです。
後はSyslogサーバーの設定を済ませれば、ルーターのログはサーバーに届きます。
時刻表示をしないと、日本時間の表示になりませんので、ログを採取しても時間がずれているとログ確認の前に時間確認が必要になります。

バッファサイズのデフォルトは4096だったと思いますが、Ciscoの推奨設定値は512000であったと思いましたので変更。
ログの採取レベルは確認したいレベルからを設定しました。

今回はここまで。
Laravelでプロジェクトを作成する

# PHPのLaravelでプロジェクトを作成する手順

事前確認：
1. 自分のPCのPHPが入っていることを確認（今回はXHAMPを使用）
    ``` shell
    $ php -v
    PHP 8.1.6 (cli) (built: May 11 2022 08:55:59) (ZTS Visual C++ 2019 x64)
    Copyright (c) The PHP Group
    Zend Engine v4.1.6, Copyright (c) Zend Technologies
    ```
1. 同じくLaraveleインストールされていることを確認
    ``` shell
    $ laravel --version
    Laravel Installer 4.2.16
    ```
    もしインストールされていない場合は、以下のコマンドを実施
    ``` shell
    $ composer global require laravel/installer
    ```
    そもそもcomposerがインストールされていなかったら、以下のWEBサイトからインストール
    https://getcomposer.org/


### プロジェクトを作成
以下のコマンドを実行
``` shell
$ laravel new testapp
```

### アプリケーションを実行
``` shell
$ cd testapp
$ php artisan serve
```
Android12 ビルドエラー

Android　Studioでのビルドエラー：

android:exported needs to be explicitly specified for <activity>. Apps targeting Android 12 and higher are required to specify an explicit value for `android:exported` when the corresponding component has an intent filter defined. See https://developer.android.com/guide/topics/manifest/activity-element#exported for details.

原因
・Android１２になった場合、AndroidManifest.xmlに追記しているAcitivityなどに、明確に「android:exported="true｜false"」を設定しないといけません。

・利用中のライブラリにも、「android:exported="true|false"」の設定も必要です。


<activity　
android:name=".MainActivity"　　
android:exported="true"/>
ラズベリーパイ上のdockerでPrismaを動かすメモ

# 概要

基本以下の通り、prisma-enginesを持ってくる必要あり。
https://github.com/pantharshit00/prisma-rpi-builds

環境変数の記載はなんでもよさそうだが、以下参考でうまくいった。
https://github.com/pantharshit00/prisma-rpi-builds/issues/2

prisma、prisma/clientのバージョンは3.9でないと動かないらしい
3.9.2.でprisma generateまで確認できた。
https://zenn.dev/ishiki/articles/nest-prisma-docker-m1


# ラズパイの型等
気が向いたら描くかも
3BでOSはRaspbianの何か
Vue.jsで文字列をBase64に変換する方法

## 概要
- Fitbitのアクセストークンを更新する際に `client_id:client secret` をBase64に変換する必要があったので、やり方を備忘録として残します。

**Fitbitの公式ドキュメント**
[Fitbit Developer - Refresh Token](https://dev.fitbit.com/build/reference/web-api/authorization/refresh-token/)

## 環境
Windows10
Vue.js 3

## やり方
#### 1. ターミナルでnpm install ####
```terminal:powershell
npm install buffer
```

#### 2. 変換コード ####
```javascript:Sample.vue
import { Buffer } from 'buffer'

// base64にエンコード
const beforeText = "HogeTaro:example"
const afterText = Buffer.from(beforeText).toString('base64')
console.log("beforeText -> "+beforeText)
console.log("afterText -> "+afterText)
```

```:実行結果
beforeText -> HogeTaro:example
afterText -> SG9nZVRhcm86ZXhhbXBsZQ==
```


## 参考

このサイトで変換結果が正しいか検証可能です
[base64エンコード/デコードツール](https://www.en-pc.jp/tech/base64.php)
Docker で Mojolicious 9 を動かす

Docker を使った Mojolicious 9 開発環境の構築手順の備忘録

# 検証環境

```
Windows10 Home Edition (version 21H2)
VirtualBox 6.1.38
vagrant 2.3.1

# Docker Host OS
ubuntu 20.04.3 LTS (Focal Fossa)

Docker version 20.10.8, build 3967b7d
docker-compose version 1.29.2, build 5becea4c
```

# ディレクトリ構成

```
mojo
├── Dockerfile
├── app
│   └── cpanfile
└── docker-compose.yml
```

# 各種設定ファイル

`mojobase` で perl の設定などのスタティックな部分のイメージを作成し、 `mojoapp` で変更の多いソースコードを追加するかたちをとることでイメージのビルドが最小限になるようにしています

```dockerfile:Dockerfile
FROM perl:5.36.0 AS mojobase
LABEL maintainer "takaya030"

WORKDIR /tmp

RUN apt-get update -y && \
    apt-get clean && \
    rm -fr /var/lib/apt/lists/*

# install carton
RUN cpanm Carton

# create appuser
RUN groupadd -g 1000 appuser && \
	useradd -d /home/appuser -m -s /bin/bash -u 1000 -g 1000 appuser

USER 1000

RUN mkdir -p /home/appuser/app
WORKDIR /home/appuser/app

CMD ["true"]


FROM mojobase AS mojoapp
LABEL maintainer "takaya030"

COPY ./app /home/appuser/app

EXPOSE 8080

CMD ["carton","exec","plackup","-p","8080","myapp.pl"]
```

```yaml:docker-compose.yml
version: "3.4"
services:
  base: 
    build:
      context: .
      dockerfile: ./Dockerfile
      target: mojobase
    image: "takaya030/mojobase"
    volumes:
      - ./app:/home/appuser/app
  app: 
    build:
      context: .
      dockerfile: ./Dockerfile
      target: mojoapp
    image: "takaya030/mojoapp"
    volumes:
      - ./app:/home/appuser/app
    ports: 
      - "8080:8080"
```

```perl:app/cpanfile
requires 'Plack', '1.0050';
requires 'Mojolicious', '9.27';
```

# mojobase イメージのビルド

最初に `mojobase` のイメージを作成します

```bash
$ cd mojo
$ docker-compose build base
```

# Mojolicious と Plack のインストール

`mojobase` イメージを使って `app` フォルダに Mojolicious と Plack をインストールします

```bash
$ docker-compose run --rm base carton install
```

# Mojolicious のアプリケーション作成

以下のコマンドでサンプルアプリケーションを作成します

```bash
$ docker-compose run --rm base carton exec -- mojo generate lite_app myapp.pl
```

# mojoapp イメージのビルド

サンプルアプリケーションを動作させるためのイメージをビルドします

```bash
$ docker-compose build app
```

# 動作確認

以下のコマンドで Plack サーバーが起動します

```bash
$ docker-compose up
```

web ブラウザで http://Dockerホスト:8080 にアクセスして以下の画面が表示されれば成功です

![welcom_to_mojo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321059/18f440df-47d2-080c-6675-af9902ad65cf.png)
Flutter セットアップ備忘録

# マックの環境構築

## Android toolchain
エラーが出ている場合。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2729656/cfd6a3d9-4ebd-cb65-53dd-d39abafb4cf2.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2729656/093d5e91-92dd-8d24-3905-f8466418e5e6.png)

まずは、SDK Platformを何か入れましょう。
Android SDKのSDK Toolsタブから何か入れる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2729656/63cf9ffe-bebe-7a48-4109-e22a3c82a2b9.png)
次にSDK Toolsタブから入れてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2729656/bdb372a2-448d-850d-dcfb-119e10e43e32.png)
入れたらコマンドを実行したら完了。
```
flutter doctor --android-licenses
```

## Xcode
エラーが出ている場合。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2729656/dd8207ac-8dd3-e4f3-2be1-51c100bc429a.png)

このコマンドで入ると書いてあるが入らない。
```
sudo gem install cocoapods
```

パッケージインストールツールがあるらしい。これが brew というツール。
[Homebrew](https://brew.sh/index_ja)
このコマンドを実効すると brew がインストールされます。
```
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
```
簡単に入りました。
```
brew install cocoapods
```
でもこれは、MacBook Pro 2013の場合で、最新のmacOSが入らないし、XCodeが最新が入らないのでiOS16が対象外。最近買ったMac miniでは入った。

でもでもXCodeでiPhoneをターゲットにするとimport Flutterではエラーとなってしまう。いったんこのサイトを、備忘録として載せる。

https://pursue.fun/tech-beginner/programming-coding/ios/about-cocoapods/


参考サイト
https://docs.flutter.dev/get-started/install/macos#install-xcode
https://zenn.dev/kboy/books/ca6a9c93fd23f3/viewer/5232dc
https://b1san-blog.com/post/flutter/flutter-setup/
`a ||= 10` は `a = a || 10` じゃないよ

## はじめに
Rubyを触り始めて結構長いのですが、今更ながら`||=`についての理解を間違えていることに気がついたため、この記事で理解を深めようと思います。

## `||=` とは
自己代入の一種です。
例えば、`a ||= 10`という式は `a || (a = 10)`と解釈され、`aが偽もしくは未定義であれば10を代入する`という意味になります。
変数を初期化する際のイディオムの一種です。

## 何を間違えていたのか
`a = a || 10`と解釈されると勘違いしていました。
`a += 10`や`a -= 10`などは`a = a + 10`、`a = a - 10`と解釈されるため、それと同じと思い込んでいました。

## どう違うのか
再代入されるかどうかが違ってきます。
`a || (a = 10)`の場合、`a`が真であれば再代入されませんが、`a = a || 10`の場合、`a`が真であっても再代入が行われます。

そのため、例えば以下のような、ある属性に代入した数を数えるようなコードがあったとすると、結果が違ってきます。

#### コード
```ruby
class Sample
  attr_reader :assign_num, :value
    
  def value=(v)
    @value = v
    @assign_num = @assign_num.to_i + 1 # 代入された回数を保持する
  end
end

a = Sample.new
5.times do
  a.value = a.value || 10 # この場合は再代入される。
end
puts "a.assign_num: #{a.assign_num} a.value: #{a.value}"

b = Sample.new
5.times do
  b.value ||= 10 # この場合は b.value || (b.value = 10) と解釈されるため再代入されない
end
puts "b.assign_num: #{b.assign_num} b.value: #{b.value}"
```

#### 出力結果
```
a.assign_num: 5 a.value: 10
b.assign_num: 1 b.value: 10
```

代入がトリガーになるようなプログラムの場合、挙動を理解しておかないと想定した動きにならないかもしれません。

## まとめ
- `a ||= 10` は `a = a || 10` ではなく、 `a || (a = 10)` と解釈される。
- 上記の違いは再代入が行われるかどうか。
- 代入がトリガーになるようなプログラムの場合は挙動に注意が必要。

もう5年くらい触っている気がしますが、ここにきて知った事実でした。

## 参考
https://docs.ruby-lang.org/ja/latest/doc/spec=2foperator.html#selfassign
Hype-VのUbuntu20にGPUを直結してネイティブに使いたかった

# やりたかった事

Hyper-Vで動作しているUbuntuにGPUを直接見せて、GPUを使えるようにする。
方法は以下のURLにある。

https://learn.microsoft.com/en-us/windows-server/virtualization/hyper-v/plan/plan-for-deploying-devices-using-discrete-device-assignment

# 結果

SR-IOVをBIOSがサポートしているマシーンでないとダメ。
対象のHostにWindows11が入ってない（SR-IOVが対応のハードでも動かないかも？）。

ハードウエアの制約があったとは。
BIOS(UEFI)の画面みてみたけど、項目もなかった。残念。

ハードウエアが対応していれば、できると思うので、対応してる方、試して見てください。

# 調査時のメモ

SurveyDDA.ps1を実行した結果

```powershell
curl -o SurveyDDA.ps1 https://raw.githubusercontent.com/MicrosoftDocs/Virtualization-Documentation/live/hyperv-tools/DiscreteDeviceAssignment/SurveyDDA.ps1
.\SurveyDDA.ps1
```
実効結果

```
PS C:\Users\masat> Set-ExecutionPolicy -Scope Process -ExecutionPolicy RemoteSigned -Force
PS C:\Users\masat> .\SurveyDDA.ps1
Executing SurveyDDA.ps1, revision 1
Generating a list of PCI Express endpoint devices

～～～省略～～～

Unfortunately, this machine doesn't support using them in a VM.

SR-IOV はこのシステムで使用できません。PCI Express ハードウェアでは、どのルート ポートでもアクセス制御サービス (ACS) を サポートしません。詳細については、システム ベンダーに問い合わせてください。
```


参考
https://www.techtarget.com/searchvirtualdesktop/tip/Running-GPU-passthrough-for-a-virtual-desktop-with-Hyper-V
hiveでcsvやtsvをテーブル化する


# はじめに
hiveでサクっとcsvやtsvをテーブル化したい！という時にみる記事です。

# 目次
- csv,tsvの準備
- create tableする
- hdfsにデータを投下
- 備考

# csv,tsvの準備

データを準備します。

```bash csv,tsv
cat data.csv

id,name,age
1,tarou,31
2,jirou,28
3,saburou,25

cat data.tsv

id	name	age
1	tarou	31
2	jirou	28
3	saburou	25

```

# create tableする
locationをhdfsの任意のフォルダに指定して、createします。区切り文字の設定は投下するデータに合わせて変えましょう。
(FIELDS TERMINATED BY ...の箇所を変更しているのみです。)

csvを入れるテーブルの場合
```sql
CREATE TABLE testdb.testtable_csv 
( id INT,
  name STRING,
  age INT
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n'
STORED AS TEXTFILE
LOCATION '/testfolder/testtable_csv/'
--任意のhdfs上のフォルダを指定(存在しないフォルダの場合、自動生成されます。)
TBLPROPERTIES
("skip.header.line.count"="1",
"serialization.null.format"="NULL")
;
```
tsvを入れるテーブルの場合


```sql
CREATE TABLE testdb.testtable_tsv 
( id INT,
  name STRING,
  age INT
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t'
LINES TERMINATED BY '\n'
STORED AS TEXTFILE
LOCATION '/testfolder/testtable_tsv/'
--任意のhdfs上のフォルダを指定(存在しないフォルダの場合、自動生成されます。)
TBLPROPERTIES
("skip.header.line.count"="1",
"serialization.null.format"="NULL")
;
```
# hdfsにデータを投下
先程createしたテーブルのlocationにデータを入れます。

```bash
hdfs dfs -put ./data.csv /testfolder/testtable_csv 
hdfs dfs -put ./data.tsv /testfolder/testtable_tsv 
```

データを追加する場合も、そのままputで同じロケーションに入れればOKです。

```bash
hdfs dfs -put ./data2.csv /testfolder/testtable_csv 
hdfs dfs -put ./data2.tsv /testfolder/testtable_tsv 
```

既存データを別データに置換したい場合、-fオプションを使い、パス名に置換したいファイル名を指定してputします。
（こちらでは、data.csv、data.tsvをdata3.csv、data3.tsvに置換しています。）

```bash
hdfs dfs -put -f ./data3.csv /testfolder/testtable_csv/data.csv
hdfs dfs -put -f ./data3.tsv /testfolder/testtable_tsv/data.tsv
```

# 確認
selectなどでテーブルにデータが追加されているか確認します。
```
hive> select * from testdb.testtable_csv limit 10;
```

# 備考
データのファイル容量が大きい場合、hdfs dfs -putコマンドの実行にかなり時間がかかってしまうので、大きいデータを扱う際はLOAD文を使ったり、ファイルをsplitコマンドで分割してシェルスクリプトなどで順次投下したら良いかもと思いました。
metpy.unitsをxarray.DataArrayに適用するワンライナー

# はじめに

[MetPy](https://unidata.github.io/MetPy/latest/index.html)は，[xarray](https://docs.xarray.dev/en/stable/)（多次元データ解析ライブラリ）と[pint](https://pint.readthedocs.io/en/stable/)（単位の概念を付与するライブラリ）を組み合わせた，気象系計算ツールの豊富な大変ありがたいPythonライブラリである．
xarrayに基づいているので，netcdfとの相性はとても良く，使いやすい．

事前処理として，次元のある変数には単位（metpy.units.units）を定義する仕様となっているが，単一変数であってもxarray.Datasetには単位を定義できない，という落とし穴？がある．（複数変数を保持しうるので，考えれば当たり前のこと，，）


``` python3
import xarray as xr
from metpy.units import units

f = 'file_name.nc'
v = 'variable'
u = 'unit'

# xarray.open_dataset()を使う場合
v = xr.open_dataset(f)[v] * units(u)

# xarray.open_dataarray()を使う場合
v = xr.open_dataarray(f) * units(u)
```

例えば，`'vaiable'`に`'temperature'`，`'unit'`に`'kelvin'`などを入れる．

## [xarray.open_dataset()](https://docs.xarray.dev/en/stable/generated/xarray.open_dataset.html)を使う場合

そのままだとxarray.Datasetを返すので，`['variable']`を右につけることで，xarray.DataArrayを取り出す．
さらに右に`units('unit')`もしくは`units.unit`を掛けることでmetpy.unitsを適用する．

## [xarray.open_dataarray()](https://docs.xarray.dev/en/stable/generated/xarray.open_dataarray.html)を使う場合

もし単一変数のnetcdfを読み込んだ場合に限り，open_dataarray()を使える．もちろんxarray.DataArrayが返ってくるので，そのままmetpy.unitsを適用できる．

## [xr.DataArray.metpy.quantify](https://unidata.github.io/MetPy/latest/tutorials/xarray_tutorial.html)を使う場合

自分は使ったことがないが，チュートリアルにはnetcdfのattrsからうまいこと単位を読み込める，ようなことが書いてある．
（骨の髄からunit-awareの精神でデータ整備すれば幸せになれる．．？）
【Java】インクリメントとデクリメントの挙動

## はじめに


インクリメントとデクリメントの挙動について、ちゃんと理解できていなかったので、備忘録として残しておく。

## 答えはいくつ？


みなさん、特に私のような初学者の方は下記のコードの実行結果がぱっと思い浮かびますか？  
（私はダメでした…）

```java: Sample.java
public class Sample {

    public static void main(String args[]) {
        
        int a = 10;
        int result = a++ - a + a++ + a-- + --a - a++;
        System.out.println(result);

    }
}
```


そもそもこんなわかりづらいコードに遭遇することはないと思いますが、  
インクリメントとデクリメントが他の演算子と組み合わせて使われていた場合の挙動は理解しておく必要があるかと思います。

## インクリメント演算子「++」、デクリメント演算子「—」


変数に1加算したり、減算したりするための演算子。

### 前置インクリメントと後置インクリメント


インクリメント演算子には、前置と後置があります。

```java
int a = 10;
a++ // a = 10 + 1と同じ
++a // a = 11 + 1と同じ
```


単体で使う分には何も問題ありません。

しかし、下記のように他の演算子と組み合わせて使用すると…

```java
int a = 10;        
int b = a++; //10
int c = ++a; //12
```


挙動が異なりました。  
前置すると「aに1を加算してから代入」をし、後置すると「代入してからaに1を加算」しています。

これだけなんですけど、理解せずに使うと予期しない動作につながりますよね。

（Swiftでは、たしか紛らわしくて廃止されてたと思いますし、参考書にも他の演算子使わないほうが良いと記載されていた気がします。）

## 冒頭のコードの出力結果


ここまでの内容を踏まえて、冒頭の答え合わせ。

```java: Sample.java
public class Sample {

    public static void main(String args[]) {
        
        int a = 10;
        
        int result = a++ - a + a++ + a-- + --a - a++; //10 - 11 + 11 + 12 + 10 - 10
        
        System.out.println(result); //22
    }
}
```


## さいごに


インクリメントの挙動について復習、まとめてみました。  
誰かのお役に立てれば幸いです。

## 参考書籍

https://book.impress.co.jp/books/1118101186
Ubuntu20.04にMySQLを導入

ゼミの研究にあたり、UbuntuにMySQLを導入するのに少しつまづいたため備忘録として記事を書きます。

# 環境

- Ubuntu 20.04.4 LTS
- MySQL Ver 8.0.30-0ubuntu0.20.04.2 for Linux on x86_64 ((Ubuntu))
- Windows10 Home

# 環境構築

それではここから環境構築の手順を記述していきます。

## ライブラリのインストール

```bash
$ sudo apt update
$ sudo apt install mysql-server
```

## Socketファイルのパス指定

MySQLを一旦止めます。

```bash
$ sudo service mysql stop
```

Socketファイルのパスを取得します。

```bash
$ mysql_config --socket
```

そして、my.cnfに取得したSocketファイルのパスを指定します。

```bash
$ sudo vi /etc/my.cnf
```

```my.cnf
[mysqld]
socket=socketファイルのパス
```

サーバーを再起動します。

```bash
$ sudo service mysql start
```

## rootユーザーのパスワード設定

```bash
$ sudo mysql -u root
```

パスワードポリシーの設定を下げます。

```sql
set global validate_password.policy = "LOW";
```

rootユーザーのパスワードを設定します。

```
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password by 'パスワード';
```

## mysql_secure_installationの実行

最後にMySQLの初期設定を行います。

```bash
$ sudo mysql_secure_installation

# 先ほど設定したパスワードを入力
Enter password for user root:

# 何も入力せずEnterを押す
Change the password for root ? ((Press y|Y for Yes, any other key for No) :

 ... skipping.
By default, a MySQL installation has an anonymous user,
allowing anyone to log into MySQL without having to have
a user account created for them. This is intended only for
testing, and to make the installation go a bit smoother.
You should remove them before moving into a production
environment.

Remove anonymous users? (Press y|Y for Yes, any other key for No) : y
Success.


Normally, root should only be allowed to connect from
'localhost'. This ensures that someone cannot guess at
the root password from the network.

Disallow root login remotely? (Press y|Y for Yes, any other key for No) : y
Success.

By default, MySQL comes with a database named 'test' that
anyone can access. This is also intended only for testing,
and should be removed before moving into a production
environment.


Remove test database and access to it? (Press y|Y for Yes, any other key for No) : y
 - Dropping test database...
Success.

 - Removing privileges on test database...
Success.

Reloading the privilege tables will ensure that all changes
made so far will take effect immediately.

Reload privilege tables now? (Press y|Y for Yes, any other key for No) : y
Success.

All done!
```

## 自動起動

MySQLのサーバーはUbuntuを閉じてしまうと停止するため、Ubuntu起動時に自動でMySQLのサーバーを起動するように設定しましょう。

```bash
$ sudo update-rc.d mysql defaults
```

以上で設定は完了です。

# mysql-serverの環境を完全削除

途中で予期せぬエラー等が発生した場合、以下のコマンドを打ってmysql-serverの環境をリセットしてください。

```bash
$ sudo apt-get remove --purge mysql-server* mysql-common 
$ sudo apt-get autoremove --purge 
$ sudo rm -r /etc/mysql
$ sudo rm -r /var/lib/mysql
```

いかがだったでしょうか？

なんだかんだでDockerでMySQLの環境構築を行うことが多かったため少し手こずりました。

なにはともあれ無事環境構築できてよかったです。

ご不明店頭あればコメントにてご質問ください。

Thank you for reading
積分「22年 岩手大 理工 3(2)」をwolframAlphaとAI_Programmerでやってみたい。

曲線y=√(3x-9)とx軸および直線x=6で囲まれた図形の面積を求めよ．

オリジナル

https://kamelink.com/blog/2022/10/10/15-5-22-iwatedai-rikou-3-2/

上と同じです。大学入試数学問題集成＞【3】(2)

https://mathexamtest.web.fc2.com/2022/202210061/2022100610100mj.html#top-0106

# wolframAlphaで
3から6の範囲で√(3x-9)を積分

https://ja.wolframalpha.com/input?i=3%E3%81%8B%E3%82%896%E3%81%AE%E7%AF%84%E5%9B%B2%E3%81%A7%E2%88%9A%283x-9%29%E3%82%92%E7%A9%8D%E5%88%86

Integrate[√(3x-9),{x,3,6}]

https://www.wolframalpha.com/input?i=Integrate%5B%E2%88%9A%283x-9%29%2C%7Bx%2C3%2C6%7D%5D&lang=ja

# AI_Programmerで、あと一歩でした。
プロトタイプとして無償公開
「コードを生成」を複数回クリックの場合があります。

https://forest.watch.impress.co.jp/docs/serial/yajiuma/1444554.html

https://aiprogrammer.hashlab.jp/

Python
曲線y=√(3x-9)とx軸および直線x=6で囲まれた図形の面積を求めよ．

```python
y=math.sqrt(3*x-9)
x=6
A=math.sqrt(3*x-9)*x
print(A)
```
Python
曲線y=√(3x-9)とx軸および直線x=6で囲まれた図形の面積を求めよ．

```python
from math import *

def f(x):
    return sqrt(3*x-9)

a = 6

S = integral(f, 0, a)
```
Flutterのタブの幅を完全にコントロールする

タブの幅を完全に制御したいことがあると思います。

その場合`Tab > child`にContainerを指定したりすると思います。
しかし表示されるタブの幅とこのchildに指定したContainerの間に余白があるため、意図した見た目になってくれないことがあります。
たとえば画面3等分にしてタブを表示したいのに、Containerのwidthに画面幅/3を指定してもうまくいきません。

↓こうしたい
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18273/6dd7cc43-6f24-3f0d-4f9a-865e053d685c.png)


この余白はTabBarのコードを見ると以下のように16とベタ打ちで定義されているようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18273/92645ff1-0507-c99e-81b0-5d8a4d9f93e3.png)

この16を考慮してContainerの幅を指定することで意図した見た目にすることができます。
余白自体の調整はできませんが、タブの幅自体は画面3等分になります。

3等分するコード例はこちら
```dart
  @override
  Widget build(BuildContext context) {
    double screenWidth = MediaQuery.of(context).size.width;
    // TabBarで設定されるTabの左右の余白(tabs.dartのadjustedPaddingより推測)
    final double tabContentPadding = 16;
    final tabCount = 3;
    final tabWidth =
        (screenWidth - tabCount * 2 * tabContentPadding) / tabCount;
    return DefaultTabController(
        length: tabCount,
        child: Scaffold(
          body: SafeArea(
            child: Column(
              children: [
                TabBar(tabs: [
                  Tab(
                    child: Container(
                      width: tabWidth,
                      color: Colors.pink,
                    ),
                  ),
                  Tab(
                    child: Container(
                      width: tabWidth,
                      color: Colors.amber,
                    ),
                  ),
                  Tab(
                    child: Container(
                      width: tabWidth,
                      color: Colors.cyan,
                    ),
                  ),
                ]),
              ],
            ),
          ),
        ));
  }

```
docker上でAPIサーバーを動かす　with nginx-golang-mariadb

<h2>動機と目的</h2>
dockerとgoを触ってみたい！<br>
じゃあ一緒にやっちゃおう！ということでAPIサーバーをローカルで動かしてみました。
<br/>
curlしてデータベースから値を取ってくるのがゴールです。

<h2>前提</h2>
<ul>
    <li>windows os</li>
    <li>dbクライアントはDBeaverを使用</li>
    <li>docker,docker desktop インストール済み</li>
    <li>githubのアカウント作成済み</li>
</ul>

<h2>やってみる</h2>
<h3>・環境構築</h3>
<p>dockerの恩恵を味わう。環境構築はgit cloneで済ませます。</p>
https://github.com/docker/awesome-compose/tree/master/nginx-golang-mysql

<h3>・DBeaverの接続</h3>

<p>今回、特段必要ではないのですが、一応書いてみる</p>


```javascript

db:
    # We use a mariadb image which supports both amd64 & arm64 architecture
    image: mariadb:10-focal
    # If you really want to use MySQL, uncomment the following line
    #image: mysql:8
    command: '--default-authentication-plugin=mysql_native_password'
    restart: always
    healthcheck:
      test: ['CMD-SHELL', 'mysqladmin ping -h 127.0.0.1 --password="$$(cat /run/secrets/db-password)" --silent']
      interval: 3s
      retries: 5
      start_period: 30s
    secrets:
      - db-password
    volumes:
      - db-data:/var/lib/mysql
    environment:
      - MYSQL_DATABASE=example
      - MYSQL_ROOT_PASSWORD_FILE=/run/secrets/db-password
    ports:
      - 3306:3306
    expose:
      - 3306

```
<p>portsを追加して接続します</p>
<p>せっかくなのでDBをちょっと書き換えました。</p>

<h3>・apiをたたいてみる!</h3>

```javascript
docker compose build --no-cache
docker compose up -d
curl.exe http://localhost:80
["Gopher","Tux"]
```

<p>おおー</p>

<h2>感想</h2>
<p>環境構築は簡単だけど、いちいちコマンド打つのがちょっとめんどくさいかな．．．<br/>
</p>
Laravelでの共通データの扱い方

私がでデスクトップアプリ開発者からWeb開発案件に携わっていたことでつまずいたことを記載します。

Laravelでの共通データの扱い方について、
あるマスタ画面の一覧表示•登録•変更処理を同じController内で実装しようとして
一覧表示で取得した変数を登録・変更メソッドを使い回すために
下記サイトを参考にコンストラクタを実装したのですが、
一覧表示の処理を通る前だけでなく、登録・変更処理の前にもコンストラクタを通ってしまい
私の意図通りに動かないことに気づきました。。

https://nextat.co.jp/staff/archives/141

Web開発の経験者の方に聞いたところ、Laravelはデーモン（※) として起動しないのでデータをメモリに保持させることができないとのこと。

（※) デーモンの説明
https://wa3.i-3-i.info/word11000.html

そのため、データを他メソッド等でも使用したい場合は、
・HTTPリクエスを通してデータを引き継がせるか、
・プログラムの外にデータを一時的に退避させるか
     - クッキー・セッション
     - ファイル
     - データベース
方法をとる必要があるということです。
４０代おっさんPythonを勉強する（データ構造と組み込み関数③）

## 本記事について

この記事はプログラミング初学者の私が学んでいく中でわからない単語や概要を分かりやすくまとめたものです。
もし不正などありましたらコメントにてお知らせいただければ幸いです。

## データ構造と組み込み関数

前回の記事
<https://qiita.com/kou1121/items/4c3beb902e72fdd3b8d2>
<https://qiita.com/kou1121/items/1bce9187dc6fa94d3ed1>

### リスト内包表記

- リスト内包表記はPythonの特有な構文
- [式 for 任意の変数名 in range()など]

```python
sep = [i for i in range(10)]
print(sep)
```

- if-elseの条件分岐構文を使ってもよい

```python
sep = [i for i in range(10) if i%2 == 0]
print(sep)
sep = [i if i%2 == 0 else None for i in range(10) ]
print(sep)
```

- 計算式を使っても良い

```python
sep = [i*i for i in range(10) ]
print(sep)
```

- 関数を使っても良い

```python
sep = [abs(i) for i in range(-5, 5) ]
print(sep)
```

- zip関数で2つのリストを同時に扱える

```python
list1 = [1,2,3]
list2 = [4,5,6]
ziplist = list(zip(list1, list2))
print(ziplist)
sep = [x * y for x, y in zip(list1, list2)]
print(sep)
```

- 二重forも使える

```python
sep = [(x, y) for x in range(3) for y in range(3)]
print(sep)
```

- 2次元配列から1次元配列に展開

```python
vec = [[1,2,3],[4,5,6],[7,8,9]]
sep = [num for elem in vec for num in elem]
print(sep)
```

- 順番を並び替える関数
  - 組み込み関数としてsortedと、リスト内関数のsortがある
  
```python
namelist = ['としき', 'あっきー','たろう', 'じろう', 'さぶろう']
numlist = [2,5,3,15,9,1,7,20,10,8]

#  sorted関数でリストをソートして新しいリストを返す
sored_ne = sorted(namelist)
print('new sorted list', sored_ne)
sored_nl = sorted(numlist)
print('new sorted list', sored_nl)

#  もともとのリストはかわらない
print('namelist', namelist)
print('numlist', numlist)

# リスト内のメソッドのsortではリスト内のリストをソースする
namelist.sort()
numlist.sort()
print('namelist', namelist)
print('numlist', numlist)
```

## 参考

https://www.kitakyu-u.ac.jp/news/2022/08/003215.html
wordpress(kusanagi)のドメイン名の変更手順

# 本記事の内容
wordpressのドメイン名移行の手順をまとめてみました。
以下の手順で設定すれば、wpのドメインの移行は多分！問題ないです。

なお、wordpress(kusanagi)でドメイン名を移行する方法
wp-cliが入っていてたら、結構移行が簡単である。

本記事は自分がDNSサーバーの移行する際に使ったコマンドのまとめです。
EC2の中で行いました。

## 実行コマンドや内容

``` linux
0. 移行するDNS設定

1. databaseのバックアップを取っておく

2. $ vi wp-configでmysqlのログイン情報を取得する

3. データベースのdumpファイル取得 
$ mysqldump --no-tablespaces -u wordpress -p wordpress > /tmp/mysqldump_wordpress.sql

4.KUSANAGIの設定変更
$ kusanagi setting --fqdn sample.example.com [profile_name]

5.SSL証明書の設定変更
$ kusanagi ssl --email sample@example.com

6.wp_optionsを書き換える(など、データベース上のurlの情報変更する)
$ wp search-replace [old] [new]
ex)$ wp search-replace 'http://wordpress.local' 'http://example.local'

7.既存のconfファイルをコピーし、新しいドメインのconfファイル作成
$ cp wordpress_http.conf wordpress_http_copy.conf
$ cp wordpress_ssl.conf wordpress_ssl_copy.conf
confファイルの中の古いconfファイルの中のドメイン名を新しいドメイン名に変更し
新しいconfファイルにはリダイレクト文を作成する(rewrite~~~~)

8.$ nginx -t

9.$ nginx -s reload

***
documentRootのフォルダーの中に.htaccessがあるか気をつけるべき、
中にベタ書きで、リダイレクトの処理が書いてあるかもしれないので、このファイルがあれば修正確認するべきです。 
***
```

もし、間違えてる部分があれば、指摘お願いします。
いつでもフィードバックは歓迎しております。
他に質問がある方は連絡ください。
連絡先 : syisdreaming@gmail.com
非工学系の人間が応用情報処理技術者試験を受験しました

合格発表まで温めたら存在を忘れる気がしたのでアップすることにします。

# お気持ちパート
## 筆者プロファイル
特筆ない限り受験当時の内容です

- 大学の獣医学科5年生
- 約3年間Pythonによる開発業務に従事（アルバイト）
    - 業務自動化（画像、スプシ編集など）、Webアプリ開発（Djangoメイン）などなど
    - 学生主体かつ小規模だが要件定義〜実装〜検証＋テストまで手広く担当
    - 代表的なライブラリは大抵使用経験があり、（調べながらであれば）自力実装できる（と思う）
- 大学の（他学部開講の）データサイエンス・セキュリティ系の科目をいくつか履修
    - 機械学習の概要や、ネットワーク関連の知識は少しだけ理解している

## 応用情報を受けようと思った理由

周りの情報系学科（$+\alpha$）の友人たちが受験して一発合格していて、「自分は学部で勉強はしていないけど、普通の学生以上には開発経験があるし基礎知識もあるからいけるのでは？？」という傲慢な考えを抱いたのが最初のきっかけです。

就活という社会性フィルターを目前に控え、自分の知識や経験を非情報系の人間に対して示せるものがほしい、というのもありましたが、まあ後付けですね……。

# お勉強パート

基本的な試験範囲や試験情報の説明は公式HPに譲り、対策の流れについて書き連ねていきます。

https://www.jitec.ipa.go.jp/1_11seido/ap.html

## 知識の詰め込み
1年前に先んじて応用情報に合格した後輩から参考書を拝借しました。 @cubinglover ありがとう。

https://www.amazon.co.jp/dp/429712467X/ref=cm_sw_em_r_mt_dp_GB53QE7NY012SFKVJM6S

彼のときの最新版なので令和3年版で、リンク先は令和4年版ですが、その年の最新版をお買い求めいただくのが良いと思います。お礼に彼の記事を貼っておきます。

https://cubinglover.hatenablog.com/entry/2021/04/18/173002

私は試験範囲を字面でしか把握していなかったので、とりあえず参考書の説明パートを片っ端から目を通しました。2周くらい。あとは問題演習した後に知識の補充をするための辞書として使っていました。
自分が経験あるのは主にソフトウェアとかアプリケーションレベルの領域だったので、OSとかプロセスとかのハードに近い領域は本当にちんぷんかんぷんでした。今でも自信はなく……。

## 問題演習
### 午前試験

大学受験当時から私は手を動かして覚えるタイプだったので、ひたすら過去問をやることにしました。
ノー勉で4割くらいしか取れずさすがに危機感を持ちましたが、本を読んだだけで6割は超えたので、いける気がしてきました。

その後は主に過去問道場でひたすら1問1答し続けました。会員登録していないので正確な記録は残っていませんが、最終的には4〜500問くらいやって、正答率はトータルで60〜70％をふらふらしていました。間違えた問題のポイントになる概念のほとんどは上にあげた参考書に載っていたし、マネジメント・ストラテジは基礎レベルでもしょっちゅう間違えたので、もっと参考書の読み込みをすべきだったと思います。

https://www.ap-siken.com/apkakomon.php

150分で80問なので時間に追われることもないし、ペーパー試験は各種入試模試で慣れっこだったので、特に形式ばった演習もしていません。

### 午後試験
10月に入ってから午後試験の勉強を全くしていないことに気づき、直近4回分くらいの問題をiPadに書き込みながら演習しました。テクノロジ系は実務に近いテーマになっていて、私にとってはとっつきやすいものが多かったので、主にテクノロジ系の問題をローラーしました（4回分しかやってないけど）。

午後試験は実施回ごとに大問間の難易度の差が割と激しくて、たとえばデータベースで複雑なクエリを書かせる問題が出る時はネットワークが簡単だったり、ネットワークで記述問題がたくさん出る時はアーキテクチャが記号問題ばかりだったり……。特定4問に絞ると事故死のリスクが高まるし、広くやると得点率が渋くなるので、5〜6問にメドをつけて集中対策すると良いと思います。

# 感想パート
## 受験結果
午前試験の自己採点（公式解答基準）は53/80(66.3%)でした。テクノロジは8割近くとれましたがストラテジとマネジメントで半分くらいしか取れませんでした。応用情報以外の試験からの過去問が増えているらしく、確かに見かけなかった設問がほとんどでした。
午後試験は3,4,5,7を選択しました。それぞれプログラム、アーキ、ネットワーク、組み込みですね。どれも比較的簡単だったので全部埋まりました（セキュリティ？必須？知らない子ですね……）。組み込みもアーキも記述問題がほぼ問題文コピペの日本語問題でアタリだなあと思いました。データベースはテーブル定義が書けなかったので途中まで捨てました。

5.5問解いて90分くらいだったので、軽く見直しして退出しました。適当に書いた設問はセキュリティくらいでしか発生しなかったので、80％超えてないかなあという期待を抱いています。

## 感想
実際の業務で習得した知識・経験は午後試験ではかなり武器になりましたが、午前試験に関しては未知が多くて覚えるのが大変でした。単体での対策勉強時間は20〜30時間くらいだと思いますが、もっと過去問ぶん回していれば余裕だったかもしれない。

受験会場の周りにコンビニしかなかったのでお昼持ち込みして午前は退出しなかったのですが、途中退出率が高くて人々はどこにいくのだろう……と見送りながらぼーっとしていました。お昼は箸を忘れたので少しだけ悲惨でした。

### 結果
(22/12/22加筆)
合格でした。割と自分の想定通りの点数で、あんまりコンテンツ力がない。

![8C791B66-A7D3-40F9-8F88-EF0A8098C02E_4_5005_c.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614520/514c4eb5-b41d-961d-82ba-0c00485f567d.jpeg)



次に受けるとしたら数人からお勧めされているデスペかセキスペを受けようかと思っています。就活がうまくいけばの話ですが……。
【CloudFront】オブジェクト指定でキャッシュ削除したがキャッシュ削除されない


AWS CloudFrontのコンソール上でディストリビューションのキャッシュ削除をする際にオブジェクトを指定してキャッシュ削除。
> /index.html
> /img/hoge.jpg

その後キャッシュ削除ステータスが「完了」となったがCDNにキャッシュされたままサイトが更新されない現象が発生。


## 前提
### 構成
・ドキュメントルート直下にindex.htmlを配置、画像などのリソースは/img/に配置
・https://example.com/ にリクエストしたら、index.htmlを表示させる構成
・ブラウザキャッシュはさせず、CloudFrontにキャッシュさせる

■更新したいファイル（=キャッシュ削除したいファイル）
・/index.html
・/img/hoge.jpg


## 解決
CloudFrontはクライアントからのリクエストパスでそのままキャッシュされる。
言い換えると/へのリクエストは/でキャッシュされ、/index.htmlは/index.htmlでキャッシュされる。
なので今回の場合、
> /index.html
> /img/hoge.jpg

でキャッシュ削除するのではなく

> /
> /img/hoge.jpg

でキャッシュ削除するのが正しかったようです。

サイトのファイル数とアクセス数が多く、極力オリジンへのリクエスト負荷を減らしたかったためオブジェクト指定でキャッシュ削除していました。
オリジンへの負荷を気にしなければ/*でキャッシュ削除で十分かもしれません。
Jupyter notebook起動中にすでにimportした自作モジュールの変更を反映させる方法

# 結論
notebookの最初に以下を実行しておけばOK。

```python
%load_ext autoreload
%autoreload 2
```

# そもそも何が問題？
例えばmymoduleという自作のモジュールをimportしたとします。

```python
import mymodule
```

そのあとmymoduleを編集した場合、もう一度上記セルを実行するだけでは変更は反映されません。

反映させるには一旦カーネルを再起動してからimportしなければなりません。

面倒ですし、メモリに保持しておきたいものがあったら再起動したくないですよね。

# ざっくり解説
問題解決のために以下を事前に実行しておくことでmoduleをreloadしてくれるようになります。

```python
%load_ext autoreload
%autoreload 2
```

1行目は autoreload というextensionを読み込んでいます。

2行目は 読み込んだautoreloadを実行しています。
autoreloadのオプションの2はモジュールを実行する度にreloadするという設定です。

もしそのほかのオプションについて興味ありましたら以下公式ドキュメントへ。

https://ipython.readthedocs.io/en/stable/config/extensions/autoreload.html
Windows時刻同期設定（コマンドプロンプト）

# コマンドで実行したい
ふつうはインターネット時刻設定から設定できる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2729656/e89b84e2-b492-dd62-8761-965eed90ec1a.png)

まずはNTPサーバの設定コマンドは下記で行う。
```
w32tm /config /update /manualpeerlist:"time.windows.com,0x9" /syncfromflags:manual
```
気になるのは上記の設定の「0x9」ですが、これは「同期モード」の値になってます。
下記の値の論理和で指定ができる。
|値 |説明 |
|-|-|
|0x1|Symmetric Activeモードで同期／Windowsで実装した一定間隔での同期|
|0x2|Symmetric Activeモードで同期／フォールバック時に利用するNTPサーバを指定|
|0x4|Symmetric Activeモードで同期／RFC1305に準拠した間隔での同期|
|0x8|Clientモードで同期／RFC1305に準拠した間隔での同期|

動機コマンドは下記で行う。
```
w32tm /resync
```
強制もあるけど。
```
w32tm /resync /force
```

# 忘れてた
サービス起動してくださいね。
インターネット時刻設定で行うと、勝手に起動するけど、コマンドプロンプトの場合はサービスを立ち上げてからね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2729656/47f88ebd-e78f-4710-b6ec-52d2af41034d.png)
Scoop で Ruby をインストールしてみる

# はじめに
`Windows`で`Ruby`のインストールと言えば`RubyInstaller`ですが、

https://rubyinstaller.org/

`Scoop`でインストールする方法もある様ですので、試してみました。

https://scoop.sh/

ここでは、次の記事を参照しています。

https://qiita.com/mainy/items/c51fc3bc4ab01da27c6f
# Scoop のインストール
```powershell:powershell
Set-ExecutionPolicy RemoteSigned -Scope CurrentUser -Force
iwr -useb get.scoop.sh | iex
scoop -v
# v0.2.4 - Released as 2022-08-08

scoop install git
scoop bucket add extras
scoop bucket add versions
```
コマンドラインのみでサクサクと進められます。
# Ruby のインストール
```powershell:powershell
scoop search ruby
```

Ruby関連では次のアプリがインストール可能です。
|Name|Version|Source|Binaries|
|:--|:--|:--|:--|
|rubymine|2022.2.3-222.4345.14|extras||
|jruby|9.3.8.0|main||
|ruby|3.1.2-1|main||
|ruby19|1.9.3-p551|versions||
|ruby24|2.4.10-1|versions||
|ruby25|2.5.9-1|versions||
|ruby26|2.6.10-1|versions||
|ruby27|2.7.6-1|versions||
|ruby30|3.0.4-1|versions||
|rubymine-eap|2022.3-223.4884.72|versions||

```powershell:powershell
scoop install ruby ruby27

ruby -v
# ruby 2.7.6p219 (2022-04-12 revision c9c2245c0a) [x64-mingw32]
```
とりあえず、最新版とAtcoder用にver2.7をインストールしますが、2.7しか呼び出せない。
そこで、`ridk`を使用します。

```powershell:powershell
scoop install msys2
msys2
$exit
ridk use
Select ruby version to enable: 
```
あれっ、いつものあれが出ない。

https://qiita.com/superrino130/items/c49947028bcba1efe6e0#%E5%AE%9F%E3%81%AFruby%E3%81%AE%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3%E3%82%92%E5%88%87%E3%82%8A%E6%9B%BF%E3%81%88%E3%82%8B%E3%81%93%E3%81%A8%E3%81%8C%E3%81%A7%E3%81%8D%E3%82%8B

そこで、次の記事を参照し**rubies.yml**を編集します。

https://qiita.com/denkiuo604/items/5098f46cb37712f715c5

```powershell:powershell
ridk use update
# Update C:/Users/XXX/scoop/apps/ruby27/current/ridk_use/rubies.yml
```

**rubies.yml**を編集
```rubies.yml
---
- C:\Users\XXX\scoop\apps\ruby\3.1.2-1
- C:\Users\XXX\scoop\apps\ruby27\2.7.6-1
```
```powershell:powershell
ridk use
1 - C:/Users/XXX/scoop/apps/ruby/3.1.2-1       ruby 3.1.2p20 (2022-04-12 revision 4491bb740a) [x64-mingw-ucrt]
2 - C:/Users/XXX/scoop/apps/ruby27/2.7.6-1     ruby 2.7.6p219 (2022-04-12 revision c9c2245c0a) [x64-mingw32]
Select ruby version to enable: 1
ruby -v
# ruby 3.1.2p20 (2022-04-12 revision 4491bb740a) [x64-mingw-ucrt]
```
おお、大勝利。
（rubies.ymlの編集はインストールしたrubyの回数が必要です）
# まとめ
+ scoop による ruby のインストールを行った
+ ridk に詳しくなった
+ @mainy さん、ありがとう
+ @denkiuo604 さん、ありがとう
Larave9＋React＋Vite＋Breeze（Inertia） sailを使って環境構築してみた

## はじめに
初めての投稿です。
Larave9＋React＋Vite＋Inertiaの構成でアプリを作ろうと思い、テストがてらsailを使って環境構築してみました。何度もエラーが出て苦戦したので、同じような構成でアプリを作ろうとしている方の参考になればと思い投稿してみました。


php8.0.24
Laravel 9.33.0
React 18.2.0
vite 3.1.4
※今回の環境構築ではmacOS Catalina10.15.7で行いました。 

参考記事
[Laravel sail を使って Laravel9 の環境構築を行う](https://qiita.com/hinako_n/items/45a7232b0b0ed16bffc8)
[Laravel Sail 導入時に発生したエラーと解決方法](https://qiita.com/kuma15/items/ef4ea1a2088f8894e03e)

## 1.Laravel のプロジェクトを作成する


```bash
$ curl -s https://laravel.build/laravel-example | bash

# laravel-exampleの部分は任意のプロジェクト名
```
#### ※私の場合、ここで以下のコマンドを打たないとエラーが出ました。
```bash
$　export DOCKER_CONTENT_TRUST=0
```

## 2.エイリアスの設定

```bash
$ alias sail='[ -f sail ] && bash sail || bash vendor/bin/sail'
```
これで
```bash
$ sail up -d
```
だけでsailを起動することができます。

## 3.envの設定

以下の行を.envに追加します。
```.env
APP_SERVICE="laravel.test"

# docker-compose.ymlのコンテナ名と合わせる必要がある

WWWUSER=1000
WWWGROUP=1000
```

## 4.docker-compose.ymlの書き換え（phpのバージョンを変える場合）

```docker-compose.yml
version: "3"
services:
    laravel.test:
        build:
            context: ./vendor/laravel/sail/runtimes/8.0 # 8.1から8.0に変更
            dockerfile: Dockerfile
            args:
                WWWGROUP: "${WWWGROUP}"
        image: sail-8.0/app　# 8.1から8.0に変更
        extra_hosts:
            - "host.docker.internal:host-gateway"
        ports:
            - "${APP_PORT:-80}:80"
            - "${VITE_PORT:-5173}:${VITE_PORT:-5173}"
        environment:
            WWWUSER: "${WWWUSER}"
            LARAVEL_SAIL: 1
            XDEBUG_MODE: "${SAIL_XDEBUG_MODE:-off}"
            XDEBUG_CONFIG: "${SAIL_XDEBUG_CONFIG:-client_host=host.docker.internal}"
        volumes:
            - ".:/var/www/html"
        networks:
            - sail
        depends_on:
            - mysql
            - redis
            - meilisearch
            - mailhog
            - selenium
  
    〜以下略〜

```
phpのバージョンを変更した場合、composerのバージョンも変更する必要がある。
```bash
$ sail up -d
$ sail shell
$ composer config platform.php 8.0.24 # 今回のバージョンの場合
$ composer update
```

## 5.変更したファイルの反映
ここで以下のコマンドを打つ。
※参考記事　https://laracasts.com/discuss/channels/laravel/groupadd-invalid-group-id-sail
```bash
$ sail down --rmi all  
$ sail up
```

## 6.Breezeのインストール

```bash
$ sail composer require laravel/breeze --dev
$ sail php artisan breeze:install react
$ sail npm install 
$ sail npm run dev
```


#### おまけ
phpmyadminをインストール
```docker-compose.yml
〜略〜
phpmyadmin:
        image: phpmyadmin/phpmyadmin
        links:
            - mysql:mysql
        ports:
            - 8080:80
        environment:
            #PMA_USER: "${DB_USERNAME}"
            #PMA_PASSWORD: "${DB_PASSWORD}"
            PMA_HOST: mysql
        networks:
            - sail
〜略〜
```

### 最後に
本記事を読んでいただきありがとうございます。自分のための備忘録的な記事になってしまいましたが、何かひとつでもお役に立てていれば幸いです。
Qiitaで記事を書くのは初めてのことだったのですが、楽しんで書くことができました。なにか学びがあったときはまた投稿したいと思います。
【Unity】ScriptableObjectを作成した時「No script asset for クラス名. Check that the definition is in a file of the same name and that it compiles properly.」と警告が出てうまく作成できない

こんにちは、ユーゴです。
今回は、ScriptableObjectを作成した時に発生した問題を紹介します。
原因は、超シンプルです。

# 想定読者
ScirptableObjectの生成の仕方はわかる人
Unity初心者〜

# 問題
ScirptableObjectを生成すると、「No script asset for LocalVariableData. Check that the definition is in a file of the same name and that it compiles properly.」という警告が出る。
![スクリーンショット 2022-10-10 12.52.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2607452/506d65b7-49bf-164a-5513-6d8f8585668a.png)
また、ScriptableObjectが検索から除外されたり、プログラムでNullReferenceなど正しい挙動をしない。
![スクリーンショット 2022-10-10 12.56.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2607452/0483756b-653b-5be6-8556-83328d4b0137.png)

# 原因＆解決
超シンプル。ファイルのクラス名と、スクリプトのクラス名が一致してない。
![スクリーンショット 2022-10-10 12.58.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2607452/bc9afbfc-0c98-3f0a-9fd7-1a73e186732e.png)
![スクリーンショット 2022-10-10 12.58.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2607452/28f68bc7-f468-32da-33c5-e4e461f6a485.png)
ファイル名が「LoacalVariableData」になっている。圧倒的typo。
同じ名前にしましょう。

# まとめ
いかがだったでしょうか。今回は、かなり初歩的なミスを紹介しました。これで小一時間悩んでいた方の手助けになれば幸いです。
このように、Unityの初歩的な解説から、エディタ拡張など上級者向けの内容も発信しています。

もし気に入っていただけましたら、評価・フォローの方よろしくお願いします。
【Vue.js】親コンポーネントである処理が終了してから子コンポーネントを呼び出す方法

# はじめに
今回は、Vue.jsで親コンポーネントで、ある処理が終わったタイミングで子コンポーネントを有効にする方法を備忘録も兼ねてまとめます。

もっと良い方法があるよって方はぜひコメント欄で教えていただけると幸いです。

## 実現したいこと
1. 親コンポーネントでmounted内で非同期処理を用いてデータを取得
2. 取得したデータをmounted内で子コンポーネントにpropsで渡し、親コンポーネントとともに子コンポーネントを表示する

## 結論
v-ifを用いて親コンポーネントでの処理が終わったら、子コンポーネントを有効にすることで実現できました。


```vuejs:Parent.vue
<template>
    <ChildComponent v-if="ready" />
</template>

<script>
export defaul {
    name: 'parent',
    data: () => {
        return {
            ready: false,
            result: {},
        },
    },
    async mounted() {
        this.result = await ... // 非同期処理
        this.ready = true // 非同期処理が終わった後に子コンポーネントが有効になる
    },
}
</script>

```

v-showはv-ifと違い、子コンポーネントは表示されないもののDOMは生成されています。
なので親コンポーネントの非同期処理が終了したタイミングで、取得したデータを子コンポーネントにpropsで渡し、
親コンポーネントとともに子コンポーネントを表示するという今回の要件には合いませんでした。
PADでExcel(URL一覧)読み取り→ブラウザ操作してデータ書き出し その①

# 概要と動機
・SharePointにユーザー向けのコンテンツを移行したい
・Webページ上のコンテンツのリンクに共有リンクを載せたい(詳細は省く) 
・ExcelでSharePointのリンク一覧をエクスポートしている(共有リンクではない)
・リンク一覧はある為、そこから共有リンクを一斉に払い出せるか調べる　
　~~共有リンクってSharePointで複数出せないんですか?~~

要はSharePoint上の各それぞれの共有リンクを自動で取れないか考えた。

PADを初めて触ったので備忘録替わりに書いておこうと思い残しておく。

# PAD全体
ざっと処理について記入
①Excelを開く、URLの一覧を読み取る。
②ブラウザを開く。M365にサインインする必要があるが今回は別ウインドウで365にサインインしておく。
③URLを開いてブラウザ自動操作→SharePointの共有URLを取得しクリップボードにコピー
④Excelの一覧表の対応する部分に取得したURLを書き込む。→ブラウザのタブを閉じる
⑤一覧表の次のURLを読み取り、③~⑤をループする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265454/037b498d-7ffd-2859-8b8c-7466caf2e993.png)
パカパカとブラウザのタブを開いて、操作、閉じる、Excelに記入を繰り返していく、
上から順に説明を記入していく。

# Excel起動と読み取り
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265454/106cb5dd-85b1-d713-b774-d2d8c2f2f6c4.png)

仮用に作成したExcel中身はこんな感じ、シート名は"WEBサイト"としておく。
※URLは適宜読み替えてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265454/8f7eb6f3-4751-a43e-3a9d-5131dfefd9bf.png)

・Excelの起動
　起動するExcelを選択する、"ExcelInstance"という変数が生成される。
　各パラメータは読んだ通りで良い。

・Excelワークシートから最初の行や列を取得
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265454/5408a385-6331-67d5-4607-461af22d1f44.png)
　"アクション"のExcelから選択する。

　このアクションはExcelファイルのアクティブなシートの使用範囲から
　"最初の空白列"、"最初の空白行"がどこにあるか?何列目で何行目かを特定してくれる。

　生成される変数で"FirstFreeColumn"と"FirstFreeRow"が入る。
　先ほどのExcelの中身は、B列の28行まで使用しており、
　FirstFreeColumn = 3 ("最初の空白列")
　FirstFreeRow = 29 ("最初の空白行")
　となる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265454/54460c51-228d-377b-4cfe-0d0be8bb1420.png)


・Excelワークシートから読み取り
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265454/d7df1c43-d13c-251b-5221-3b04660ed577.png)

Excelのインスタンスは自動で入っている。
今回は"取得:"を"セル範囲の値"に変更する。
そうすると、設定項目に先頭列、先頭行、最終列最終行を設定できる。
表の先頭はA1セルなので、先頭列、行ともに1を設定。
最終行と最終列は本番では増えるため、先ほど取得した
FirstFreeColumnとFirstFreeRowを使って設定する。

FirstFreeColumnとFirstFreeRowをそのまま指定すると、
　FirstFreeColumn = 3
　FirstFreeRow = 29
なので、A,B,C列と29行目まで含んでしまう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265454/2aad99dc-4f3a-4277-4ddc-17995e8e50db.png)
これでは困る為、
　FirstFreeColumn = 3
　FirstFreeRow = 29
↑の各変数をパラメーター設定枠内で操作する。

最終列と最終行を
%FirstFreeColumn – 1%　
%FirstFreeRow – 1%
に変更する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265454/5277c2d5-78ba-36d3-3451-544dff231d96.png)

これでそれぞれの変数がマイナス1され、2と28になる。
詳細を展開し、"範囲の最初の行に列名が含まれています"を有効にする。
※これで列を番号ではなく"列名"で取得できる、今回はいらんかも。

ExcelDataという変数にセルの範囲の値が保存される。

# 次回
ここまでできると7割ぐらい完成か、
Excelの読み取りの処理でどうやんの?という
疑問が初見であったので覚えておきたい。

次はループ処理を記入する、一発で終わると思いきや前後半に分ける事に。
次回はブラウザ操作からループ処理まで記入し完了とする。
[PADでExcel(URL一覧)読み取り→ブラウザ操作してデータ書き出し その②](https://qiita.com/raveny/items/addfd251ae9f22f1cb2c)

見て頂いてありがとうございます。
ご指摘等ありましたら、是非お聞かせ頂けると幸いです。
IMAPとPOP3の違い

どちらもメール受信用
IMAPはPCなど端末にダウンロードせず、メールサーバーから端末へ読み込む（スマホ）143
POPはメールサーバーから端末へダウンロードして、読み込む。110

https://fctv.mitene.jp/mail/which.html
How to chage your default python version from 2 to 3 on Mac?

Entry the following command on your console.

sudo ln -nfs /usr/local/bin/idle3 /usr/local/bin/idle
sudo ln -nfs /usr/local/bin/pydoc3 /usr/local/bin/pydoc
sudo ln -nfs /usr/local/bin/python3 /usr/local/bin/python
sudo ln -nfs /usr/local/bin/python3-config /usr/local/bin/python-config
sudo ln -nfs /usr/local/bin/pip3 /usr/local/bin/pip

Finally, udpate your profile:

source ~/.bash_profies
暗号化方式まとめ

# 公開鍵

**データ受信者**が秘密と公開の2種類の鍵を作成。送信者が公開鍵で暗号。受信者が秘密鍵で復号。安全性が高いが、処理速度が遅い。電子署名だと逆。

RSA(素因数分解)

RSAホスト鍵の長さは360～4096

SSHバージョン2を有効にする場合は、768ビット以上

# 共通鍵

家の鍵と同じ。送信側が1つ作成。処理速度は早いが管理面倒。

AES（Advanced Encryption Standard）

### ハイブリッド

データを共通鍵暗号方式。共通鍵を公開鍵暗号方式。

# 電子署名

1. **データ送信者(身分証明したい側)**は以下の３つを送信する。
    - 元のデータ(上記のいずれかの暗号方式で暗号化、公開鍵で暗号化してるものとか)
    - メッセージダイジェスト(元のデータをハッシュ化したもの)を自身の**秘密鍵**で暗号化したもの
    - 秘密鍵とペアになる公開鍵
2. 受信者は受信したメッセージダイジェスト公開鍵で暗号文を復号する。
3. 受信者は受信した元のデータをハッシュ化し、手順２で得たメッセージダイジェストと比較する。

ペアの鍵を作った身分証明したい側がモノホンである前提。

# 認証局(CA)

電子署名で「そもそも鍵を作った**身分証明したい側が偽物じゃないことを証明する機構**」

デジタル証明書付きの公開鍵を身分証明したい側にくれる。

秘密鍵をなくしたり、盗まれたら、CRL(証明書失効リスト)に乗る。

OCSP(Online Certificate Status Protocol)でCRLに乗ってないか確認してくれる。

ハッシュ化したメッセージダイジェストを暗号化せず、そのまま送ればいいじゃんと思ったが、それが本物かどうかは、わからないよな。その証明がデジタル署名付きの公開鍵ってことね。

# ハッシュ化のアルゴリズム

- MD5(1990年に確立、脆弱性あり)
- scrypt
- SHA-1(2005年に突破、脆弱性あり)
- SHA-2(現状最強？)

[ハッシュ化とは？暗号化との違いや利用シーンを詳しく解説！｜ITトレンド](https://it-trend.jp/encryption/article/64-0065)

# 認証

psk

sae

aaaサーバー認証

# 暗号化方式

TKIP

CCMP

# ワイヤレスセキュリティ規格

## WEP

暗号化アルゴリズム：RC4

暗号方式：WEP

## WPA

暗号化アルゴリズム：RC4

暗号方式：TKIP

メッセージ改ざん検知：データ部分にMICというフィールドを付加

## WPA2

暗号化アルゴリズム：AES

暗号方式：CCMP

メッセージ改ざん検知：CBC-MACという仕組みを使用

### WPAは「TKIPの実装を義務化、CCMPの実装を任意」だが、WPA2は「TKIPの実装は任意、CCMPの実装は義務化」

## WPA3

KRACKへの対策を施す**SAE**（Simultaneous Authenticationof Equals）という新しいハンドシェイクの手順を実装

一定回数のログイン失敗をした場合には、ブロックする機能が追加（辞書攻撃に対応）

# WPA2とCCMP？

AESという計算方式を使って、無線LAN用に調整したプロトコルが、CCMP

WPA2は、CCMPの方式に乗っ取っていること**も**、規格としている。
他にも認証方式とかもある（PSK認証とか IEEE802.1X認証とか）