OmniAICreator/Qiita-1.07M huggingface dataset:
Anacondaを利用したPyTorchのインストール（GPU利用）

PyTorchでGPUを利用するための環境構築メモ
Windows 10（64 bit）で実行

## Python, anacondaのアップデート
* Pythonのアップデート

```
conda update python
```

* Anaconda本体のアップデート

```
conda update -n base conda
```

## PyTorchでGPUを利用するために必要なCUDAのインストール
ここでは、安定版であるPyTorch 1.12.0をインストールする。そのためには、CUDA11.3.0をインストールしておく必要がある。どのバージョンが必要かはPyTorchのウェブサイトから確認できる。
https://pytorch.org/get-started/locally/

CUDAはnvidiaのウェブサイトからダウンロードできる。11.3.0をインストール。
https://developer.nvidia.com/cuda-11.3.0-download-archive

## Pytorchのインストール
https://pytorch.org/get-started/locally/
ここの下部に示されたコマンドをAnaconda Promptから実行。

## PyTorchのインストールが成功したかの確認
jupyter notebookを開いて以下のコマンドを実行。

```
import torch
```

今回、なぜかエラーが発生。
dllファイルに関するエラーだったため、表示されたdllファイルを削除。
このエラーは何度か起きたため、全て削除。削除したファイルは以下のフォルダ内のdllファイルだった。
C:\ProgramData\Anaconda3\Lib\site-packages\torch\lib

削除すると一応動くようになった。
dataプロパティのアロー関数での書き方

Vue.js初心者の備忘録です。


## 疑問

Vue.js3におけるdataプロパティを定義するときの記載方法でわからないことがあった。

### dataプロパティの記載（省略記法ver）

dataプロパティを定義するときに、下記のように書ける。アロー関数で書かれた省略記法であることはわかるが、なぜ( )が必要なのか。
```javascript:main.js
const app = Vue.createApp({
    data: () => ({
        //    
    })
});
app.mount('#app');
```
### 省略しないver.
```javascript:main.js
const app = Vue.createApp({
    data: function(){    
    return {}
    }
});
app.mount('#app');
```

## 結論
戻り値がオブジェクトの場合、戻り値のオブジェクトリテラルを( )で囲む必要がある。アロー関数の本文を囲む{ }と区別するため。
TypeScriptで条件分岐時の可読性の高い変数設定

# 本記事を対象とする人
- TS,JSで極力letではなくconstを使うべきと思っている人

# 結論 ts-patternが便利
- https://github.com/gvergnaud/ts-pattern

# 解説
何かのオブジェクトを参照して場合分けして、変数を定義したい場合があると思います
### 例
```ts
  let platform = '';
  if (game.name === 'ff3') {
    platform = 'fc';
  } else if (game.name === 'ff4') {
    platform = 'sfc';
  }
```

このケースでletは使いたくないため、こうする
```ts
  const platform = (() => {
    if (game.name === 'ff3') {
      return 'fc';
    } else if (game.name === 'ff4') {
      return 'sfc';
    }
    return '';
  })();
//---or
  const platform = (() => {
    switch (game.name) {
      case 'ff3':
        return 'fc';
      case 'ff4':
        return 'sfc';
    }
    return '';
  })();
```

このようなケースの場合、nameの一つの変数だけ参照すればよいためまあよいか、となるが
2つ変数の参照が必要になった場合一気に可読性が悪くなる
```ts
  const gameName = (() => {
    if (game.genre === 'rpg') {
      if (game.company === 'enix') {
        return 'dq1';
      } else if (game.company === 'nintendo') {
        return 'pokemon';
      }
      return 'ff1';
    } else if (game.genre === 'simulation') {
      if (game.company === 'maxis') {
        return 'simcity';
      }
      return '';
    }
    return '';
  })();
```

### ts-patternを使う
ぱっと見でwithで何を判定して何を返すかわかりやすくなり
かつ、constにできました。

```ts
  const gameName = match(game)
    .with({ genre: 'rpg', company: 'enix' }, () => 'dq1')
    .with({ genre: 'rpg', company: 'nintendo' }, () => 'pokemon')
    .with({ genre: 'rpg' }, () => 'ff1')
    .with({ genre: 'simulation', company: 'maxis' }, () => 'simcity')
    .otherwise(() => '');
```

ということで、分岐して変数を設定する場合にはts-patternを積極的に活用していこうかと考えています。
ファーミング とは

## 勉強前イメージ

DNS関連系？

## 調査

### ファーミング とは

Pharming と書き、フィッシングに続き登場した詐欺の手口になります。
farming に由来して、フィッシングは餌(メール等)を利用するのに対してファーミングは種まき(DNSに仕掛け)をしておくことでこう呼ばれています。
どちらもユーザを騙して個人情報等を流出させる点では同様ですが、フィッシングより一段階進化した形になります。

ファーミングで行われることは
サーバ側ではドメインと紐付けられたIPアドレスを不正に書き換えることでDNSを利用してwebサイトへアクセスしてきたユーザを偽のwebサイトに尤度し
ID・パスワードを入力させて個人情報を盗み取る手法になります。
クライアント側ではhostsファイルやDNSキャッシュの改ざんをすることで同様のことを行うことが可能です。
ユーザからはwebサイトへは正しい経路で正規のURLが表示されているので見極めるのが難しいものになります。
しかし多くがSSL化の対応がされていないことが多いため、もしhttp通信を行っていたら注意が必要です。

## 勉強後イメージ

確かに普通にアクセスしてSSL化対応されてたらわからないかもしれないなぁ・・・

## 参考

- [ファーミング（Pharming）](https://eset-info.canon-its.jp/malware_info/term/detail/00147.html)
- [ファーミング](https://www.sophia-it.com/content/pharming)
- [【3分ITキーワード】 ファーミング(Pharming)](https://www.pentasecurity.co.jp/pentapro/entry/%E3%83%95%E3%82%A1%E3%83%BC%E3%83%9F%E3%83%B3%E3%82%B0)
WSL2でAlmaLinuxサーバー3台用意  

## はじめに

検証環境を構築するため、サーバー3台用意します。

## 今回の目標

WindowsのWSL2を使って、AlmaLinuxのサーバー3台を用意します。

## WSL2にAlmaLinuxを導入する手順

### WSL2をインストール

- スタートボタンを右クリックし、Windows PowerShell(管理者)を起動

- インストールコマンド実行
    - デフォルトのディストリビューションUbuntuがインストールされる

```powershell
wsl --install
```

- Windowsを再起動

### AlmaLinuxをインストール

- Microsoft Storeから、`AlmaLinux 8 WSL`を検索

- AlmaLinux 8をインストールし、起動

- AlmaLinuxのユーザーとパスワードを設定
    - ここでは、ユーザー名をuserとする
    - sudoなど管理者権限が必要な操作でパスワード入力が求められる

- パッケージをアップデート
```shell
sudo dnf update -y
cat /etc/redhat-release
  AlmaLinux release 8.x
```

- Windowsドライブは、AlmaLinuxの`/mnt/c`ディレクトリにマウントされる
```shell
ls -l /mnt/c/
```

### AlmaLinuxでsystemctlコマンドを使用可能にする

- インストール直後、systemctlを実行すると以下のエラー発生
```
System has not been booted with systemd as init system (PID 1). Can't operate.
Failed to connect to bus: Host is down
```

- 対策としてgenieをインストール
```shell
sudo dnf install epel-release
wget https://github.com/arkane-systems/genie/releases/download/v2.3/genie-2.3-1.fc34.x86_64.rpm
sudo dnf install genie-2.3-1.fc34.x86_64.rpm
```

- Pythonをバージョン3.9にアップグレード
```shell
python3 --version
sudo dnf install python39
sudo ln -sf /usr/bin/python3.9 /usr/bin/python3
sudo ln -sf /usr/bin/pip3.9 /usr/bin/pip3
sudo ln -sf /usr/bin/pip-3.9 /usr/bin/pip-3
sudo python3 -m pip install psutil
```

- genieを起動(以降OS再起動時に起動しておく必要あり)
```shell
sudo genie -s
sudo systemctl status
```

### AlmaLinuxを日本語化する

- ロケールとキーマップを設定
```shell
sudo dnf install -y glibc-langpack-ja
sudo localectl set-locale LANG=ja_JP.utf8
sudo localectl set-keymap jp106
```

- タイムゾーンを設定
```shell
sudo timedatectl set-timezone Asia/Tokyo
```

- 日本語言語パッケージをインストール
```shell
sudo dnf install -y langpacks-ja

grep LANG ~/.bash_profile
export LANG=ja_JP.utf8
```

## AlmaLinuxディストリビューションを複製

- PowerShellで、AlmaLinuxディストリビューションを確認

```powershell
wsl.exe -l -v
  NAME                   STATE           VERSION
* AlmaLinux-8            Running         2
```

- AlmaLinux-8ディストリビューションをエクスポート

```powershell
wsl.exe --export AlmaLinux-8 $Env:USERPROFILE\wsl\AlmaLinux-8.tar
```

- 新規ディストリビューションを作成

エクスポートしたデータをインポートし、AlmaLinux8-1ディストリビューションを作成

```powershell
wsl.exe --import AlmaLinux8-1 $Env:USERPROFILE\wsl\AlmaLinux8-1 $Env:USERPROFILE\wsl\AlmaLinux-8.tar
```

- ディストリビューションを起動

AlmaLinux8-1ディストリビューションをユーザuserで起動

```powershell
wsl.exe -d AlmaLinux8-1 -u user
```

AlmaLinuxで、genieの起動も忘れず
```shell
sudo genie -s
```

## さらにAlmaLinuxディストリビューションを複製

- AlmaLinuxディストリビューションをもう二つ複製

```powershell
wsl.exe --import AlmaLinux8-2 $Env:USERPROFILE\wsl\AlmaLinux8-2 $Env:USERPROFILE\wsl\AlmaLinux-8.tar
wsl.exe --import AlmaLinux8-3 $Env:USERPROFILE\wsl\AlmaLinux8-3 $Env:USERPROFILE\wsl\AlmaLinux-8.tar
```

これで、サーバー3台構築できました。
```
wsl.exe -l -v
  NAME                   STATE           VERSION
* AlmaLinux-8            Stopped         2
  AlmaLinux8-1           Running         2
  AlmaLinux8-2           Stopped         2
  AlmaLinux8-3           Stopped         2
```

## おわりに

検証用にサーバー3台を構築しました。
次回も続きます。お楽しみに。
Spring boot学習手順

# Spring とSpting boot、 どちらを学習すれば良いか?
最初に学習を始める際にSpringとSpringBootのどちらから始めたら良いか分からなかったのでその点に触れておこうと思います。
### 違いは?
Springは2004年にリリースされたJavaの古いマークですがSpring bootはプロジェクトの初期設定やライブラリの管理を簡単にするものです


### 結論 : SpringBootからはじめる
英語で情報検索してる時もSpringよりもSpringBootの方が情報が多い感覚があるので初学者の方はSpringBootから学習されるとよいと思います。

上司の話からも、｢Springを使う｣と言うより｢SpringBootを使う｣ことが多いということなのでスプリングブートを中心に学習していきました。

# 学習期間
基礎 : 2週間
その後実践

# 使用教材
1. IntelliJ ではじめる Spring Boot：課題管理アプリを作って学ぶWebアプリケーション開発の基礎
1. Spring Framework超入門 ~やさしくわかるWebアプリ開発

https://www.udemy.com/course/intellij-spring-boot/

## IntelliJ ではじめる Spring Boot：課題管理アプリを作って学ぶWebアプリケーション開発の基礎
### 使用方法
#### 1. 動画に沿って真似
動画を見ながら動画で扱っているアプリを、同じ手順で自分も作成しました。
#### 2. 学習ノートの作成 
基本文法などに関する学習ノートをつくりました。

springboot学習ノート1
![springboot学習ノート1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2723412/e93f0a46-1f0f-4aa2-043e-fe791e345061.png)
springboot学習ノート2
![springboot学習ノート2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2723412/360890ef-4ec3-942a-520b-8bb3b5bdd278.png)

## Spring Framework超入門 ~やさしくわかるWebアプリ開発
### 使用方法
#### 1. 教材内容に沿って真似
この教材でも書籍の中に示されているサンプルを実際にEclipseでつくりました。
#### 2. 学習ノートの作成 
この教材でも使用例が豊富に書かれていたので自分で検索したウェブサイトを参考にしながら基本文法等と使用例をつけたノートを作成していきました
このノートが後々実践で役立ちました

書籍のメモ(SpringBoot)
![spring boot, 書籍のメモ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2723412/315980c4-2568-3dc6-281f-57412ec4df96.png)
書籍のメモ(thymeleaf)
![thymeleaf, 書籍のメモ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2723412/5c5d1334-f900-7dd9-8295-7e29b44f738e.png)


# まとめ
教材を使用する部分は本当に基礎の部分です。
基礎を終えた後は、 簡単なアプリケーションを実際に作ってみることで理解が深まり技術が向上すると考えています。
未経験から転職してエンジニアになり、３ヶ月前後が経った君たちへ【燃え尽き症候群】

## はじめに
未経験からエンジニアに転職して、４ヶ月ほど経つエンジニアです。

今回は、エンジニア転職をしてから３ヶ月前後が経過した方々向けに、
**燃え尽き症候群との向き合い方をポエムします。**

## 対象読書
**・エンジニアになって３ヶ月前後の方**
・エンジニアになりたいと思っている方
　　エンジニアになってからの心境を知れるかと思います
・経験の浅いエンジニアを指導する立場の方
　　経験の浅いエンジニアの心境を知って、指導に生かせるかもしれません

## 結論
燃え尽き症候群的な状態は必ず来る
燃え尽き症候群は成長するための壁であることを認識する
壁を打破するには今まで通りコツコツやるしかない
コツコツやるには習慣化するしかない


## 燃え尽き症候群的な状態は必ず来る
エンジニアになって３ヶ月前後と書いていますが、期間は目安です。
人によって燃え尽き症候群的な状態になるタイミングは様々でしょう。

さらに言えば、燃え尽きるのはエンジニアになったばかりの人だけではないですよね。
何かに向かって努力をしてきた人が一定の成果を上げて燃え尽きます。
あるいは、成果を上げる前に燃えます。
![スクリーンショット 2022-08-02 7.43.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/916052/f28bee83-73db-9270-9cfb-993f97dc413f.png)

あなたが燃え尽きたのは、一定の成果を上げることができたからです。
あなたはじゅうぶんに頑張ったのです。


## 燃え尽き症候群は成長するための壁であることを認識する
じゅうぶんに頑張ったあなたが、さらに成長しようと努力しようとします。
しかし、突然やる気がなくなったり倦怠感が襲ってきます。
それも１日だけでなく、しばらく続きます。

そこで多くの人は自分が「燃え尽きている」ことに気がつきます。

ここで具体例です。
タイトルを「未経験から転職してエンジニアになり、３ヶ月前後が経った君たちへ」としています。

未経験からエンジニアになるまでにたくさんの努力をされてきたと思います。
技術系の学校に行っていない完全に未経験で、年齢も30歳を超えていたりすると、
さらに多くの努力が必要だったでしょう。
（エンジニアになる前に燃え尽きる（挫折する）人が多いのも納得です）

その壁を越えてみたら、今度は実務のプログラムの難しさに圧倒されます。
大きな壁を越えてみたらさらに大きな壁が出てきたイメージですね。

![clique-images-hSB2HmJYaTo-unsplash.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/916052/1ad16d73-4e19-5d57-e1fc-dfca806b7735.jpeg)

実務をして３ヶ月くらい経つと、少しずつ慣れてきて気持ち的にも安定してくるはずです。
次の壁も突破したということですね！

**しかし、このタイミングは危険です！
ここで燃え尽き症候群が発生するのではないでしょうか？**

なぜなら、
エンジニアになることができた
エンジニアとして自分のタスクはある程度こなせるようになってきた
この嬉しい成長が、あなたに次なる壁（目標）を遠ざけてしますからです。

ここから先、どんなエンジニアになろうと迷うはずです。
新しい言語を身につける？
フルスタックになる？
インフラもやりたい？
他の趣味も楽しみたい？
などなど、、、
ここから先は選択肢が多く、自由度も高くなってきます。

![jonny-gios-Lez3X-wihUA-unsplash.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/916052/c1f2bc5b-b2a9-5608-7425-2f2a7ef9eb1c.jpeg)

そうなってくると、
「まあ、ある程度努力して当面の目標も達成できた。しばらくはゆったりとしたペースでもいいかな、、」
なんて燃え尽き症候群的な状態に陥りがちではないですか？
![christian-erfurt-sxQz2VfoFBE-unsplash.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/916052/2b7d913b-fbe1-6823-7356-04133f42b2b4.jpeg)

::: note warn
燃え尽き症候群は下記が原因と認識しましょう。
・次の壁（目標）が明確ではない
・次の壁（目標）が大きすぎる
上記のために起きる精神的なブロックにすぎません。
:::

## 壁を打破するには今まで通りコツコツやるしかない
さらに成長して、
・自分の目指すエンジニア
・自分の価値観に合った生き方をしていくためには
当たり前ですが、今まで通りコツコツと努力していくいかないです。

次の壁を明確にしましょう。
新しい言語の勉強をしても良いです。
業務にフルコミットしても良いです。
筋トレを始めても良いです。
アウトプットの記事を定期的に書いても良いです。
明確な壁（目標）を決めましょう。

だんだんとリズムが生まれて、再燃焼していくことができるはずです。

## コツコツやるには習慣化するしかない
リズムが生まれてもまたもや燃え尽きる可能性はかなりあります。
人間は楽をして生きたい脳です。
壁に挑戦しない道を選ぼうとするかもしれません。

コツコツ努力することを習慣にしましょう。
習慣化のメソッドはたくさんあります。
エンジニアに転職するために努力してきた方は、すでにスペシャルな習慣をもっているのではないでしょうか。

具体例として、私自身の習慣を紹介します。
個人のスキル向上のための習慣は、下記です。
「朝の勉強時間を確保する」
シンプルですね。

習慣化するには、
すでにある習慣とセットにするとか、
if-thenプランニングをするとか
色々あります。
これは調べればすぐに出てきます。（エラーを解決するより簡単です）

## まとめ
燃え尽き症候群的な状態はだれにでもある
燃え尽き症候群は壁（目標）を達成する前後に発生する
燃え尽きを打破するには、コツコツやっていくしかない


ここまで努力してきたあなたなら大丈夫です。
また大きな目標に向かって継続して努力できます。
[ Font Awesome ]  HTMLにFont Awesomeのアイコンを追加する

`X.html`

HTMLファイルの`head`タグに下記の`link`タグを挿入する。
```HTML
<head>
<link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/font-awesome/4.3.0/css/font-awesome.min.css">
</head>
```
Font Awesomeで検索したアイコンの値(fa fa-facebook)を指定すればOK

```HTML
<a href="#" class="btn facebook">
<span class="fa fa-facebook"></span>
Sign up with Facebook
</a>
```
【Linux】重複した行を削除する

## 重複した行を削除する方法

## `uniq`と`sort`で削除
`uniq`コマンドと`sort`コマンドを使用して重複した行を削除できます。

```:ターミナル
$ sort 対象ファイル | uniq
```

`uniq`コマンドのオプションは以下のとおりです。
|オプション|説明|
|:---:|:---|
|-c, --count|各行の前に重複回数を出力する|
|-u, --unique|重複していない行だけを出力する|
|-d, --repeated|重複した行だけを出力する|
|-D, --all-repeated|重複した行を全て出力する|
|-i, --ignore-case|比較時に大文字と小文字の違いを無視する|
|-w N, --check-chars=N|行の比較を最初のN文字で行う|
|-s N, --skip-chars=N|最初のN文字を比較しない|
|-f N, --skip-fields=N|最初のN個のフィールドを比較しない|
|-z, --zero-terminated|最後にNULL文字を出力する|

## `sort`で削除
`sort`コマンドのみでも削除できます。
```:ターミナル
$ sort -u 対象ファイル
```

また以下のようにすることで対象ファイルを上書きできます。

```:ターミナル
$ sort -u 対象ファイル -o 対象ファイル
```
Ubuntu 20.04(WSL2)にPython 3.9.13 をインストールする

# 概要
掲題の通り。

# 環境
```console
$ uname -a
Linux PC 5.10.16.3-microsoft-standard-WSL2 #1 SMP Fri Apr 2 22:23:49 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux
```

```console
$ cat /etc/issue
Ubuntu 20.04.4 LTS \n \l
```

# 方法
## 依存関係をインストール
Python のビルドに必要な依存関係をインストールする。
```
sudo apt update
```
```
sudo apt install build-essential zlib1g-dev libncurses5-dev libgdbm-dev libnss3-dev libssl-dev libreadline-dev libffi-dev libsqlite3-dev wget libbz2-dev
```

## ソース コードをダウンロード
以下のページで対象のソースコード（のダウンロードリンク）を探して`wget`でダウンロードする。

https://www.python.org/downloads/source/

```
wget https://www.python.org/ftp/python/3.9.13/Python-3.9.13.tgz
```

## 展開
ダウンロードが完了したら gzip アーカイブを展開する。
```
tar -xf Python-3.9.13.tgz
```

## `configure`を実行
ディレクトリを切り替えて、`configure`を実行します。
```
cd Python-3.9.13/
```
```
./configure --enable-optimizations
```

## ビルド
Python 3.9 ビルド プロセスを開始する。
```
make -j 8
```
:::note info
`nproc`を実行すると自環境のプロセッサのコア数を確認できる。
:::

## インストール
Python バイナリをインストールする。
```
sudo make altinstall
```

## 完了
バージョンを確認する。
```
python3.9 --version
```

```shell:Output
Python 3.9.13
```
3の倍数だけLTになる勉強会

先週の土日に会社の同期と**3の倍数だけLTになる勉強会**をやりました！
今回は、**3の倍数だけLTになる勉強会**とは何かを説明します

## LTとは？
**Lightning Talks**（ライトニングトーク）の略です
簡単に説明すると、**短いプレゼンテーション**のこと

## 3の倍数だけLTになる勉強会とは？
まずは、各自で勉強します
**3時間ごと**（具体的には9,12,15,18時）に参加者で集まって勉強したことを**5分程度で発表**します
発表後にコメントや質問を参加者同士で行います

## メリット
* LTすることで、学習したことの**理解度が増す**
    * 上手く説明できない部分は理解が足りていない
* みんなで一緒に勉強するので、**孤独感を感じない**
* 3時間ごとにLTがあるので**ダレない**
    * 参加人数が2人とかであれば、2時間ごとでもいいかも
* 他人の勉強した**知識を得る**ことができる

## デメリット
* 雑談が始まる
    * LTの時間を区切るなど工夫が必要
* すごい人のLTを聞いて劣等感を感じる
    * たくさん話を聞いて知識を吸収しましょう
flutterfire configureが失敗する

# flutterfire configure
FlutterプロジェクトをFirebaseに登録する際のコマンド。
これを実行すると簡単にFirebaseに登録を行えるはず、、、なのだが、下記エラーが発生してなかなか成功しなかった。

```
Flutterプロジェクトフォルダ>flutterfire configure
⠹ Fetching available Firebase projects...
Unhandled exception:
FormatException: Unexpected end of input (at character 1)

^

#0      _ChunkedJsonParser.fail (dart:convert-patch/convert_patch.dart:1383:5)
#1      _ChunkedJsonParser.close (dart:convert-patch/convert_patch.dart:501:7)
#2      _parseJson (dart:convert-patch/convert_patch.dart:36:10)
#3      JsonDecoder.convert (dart:convert/json.dart:612:36)
#4      runFirebaseCommand (package:flutterfire_cli/src/firebase.dart:95:25)
<asynchronous suspension>
#5      getProjects (package:flutterfire_cli/src/firebase.dart:114:20)
<asynchronous suspension>
#6      ConfigCommand._selectFirebaseProject (package:flutterfire_cli/src/commands/config.dart:278:24)
<asynchronous suspension>
#7      ConfigCommand.run (package:flutterfire_cli/src/commands/config.dart:368:37)
<asynchronous suspension>
#8      CommandRunner.runCommand (package:args/command_runner.dart:209:13)
<asynchronous suspension>
#9      main (file:///C:/Users/gjoin/AppData/Roaming/Pub/Cache/hosted/pub.dartlang.org/flutterfire_cli-0.2.4/bin/flutterfire.dart:57:5)
```

# 解決方法
## firebase-toolsの再インストール
1. `npm uninstall -g firebase-tools`
2. `npm install -g firebase-tools`

色々調べると、Firebaseへの再ログインやflutterfire_cliの再アクティベーションなどを書いてくれている方がいましたが、自分はそれでは解決せず。
上記のfirebase-toolsの再インストールで解決しました。
明確な原因は不明ですが、心当たりとしては、
以前からfirebase-toolsはインストール済みであったが、しばらく触っていなかったため、今回アップデートしました。
もしかすると古いバージョンからアップデートした場合はうまく動かないのかも？しれない。（元のバージョンはメモしていない。。。）

ひとまず先に進めて良かったです。

# 参考
https://qiita.com/luxsophia/items/563bcaa9c0fa01b70c77

https://github.com/firebase/flutterfire/issues/7693

https://github.com/invertase/flutterfire_cli/issues/27
AWSのオンプレ向けサーバーエージェント一覧

AWSのサービスの中には、エージェントをインストールすることで、オンプレのサーバーとも連携できるものがある。そういったサービスを一覧した。他にもあったかな？

# SystemsManager
https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/ssm-agent.html

サーバーを一括管理するサービス。個別にSSHでログインせずに、コマンドを実行したり（Run Command）、OSアップデートをしたり（Patch Manager）できる。

他のエージェントをインストールすることもできるので、SystemsManagerは最初にインストールしておくのが良さそう。

なお、EC2の新しめAMIでは最初からインストールされているはず。


# CodeDeploy

https://docs.aws.amazon.com/codedeploy/latest/userguide/codedeploy-agent-operations-install.html

デプロイ作業サービス。個別にSSHログインしなくて良いし、ロールバックがしやすくなる。全サーバーに一気にデプロイするだけでなく、一部のサーバーから順にデプロイすることができる（カナリアデプロイ、線形デプロイ）。CodePipelineなどの他サービスと連携して、継続的インテグレーション・継続的デプロイ（CI/CD）ができる。


# CloudWatch

https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/Install-CloudWatch-Agent.html

ログ管理サービス。個別にSSHログインしなくても（略）。fluentdに比べて集約サーバーの管理などの手間が少ない。AWSコンソールの中にログ検索画面もある。

# Kinesis Data Streams

https://docs.aws.amazon.com/ja_jp/streams/latest/dev/writing-with-agents.html

リアルタイムデータ処理サービス。サーバーログ用のCloudWatchに対し、KinesisはIoTなどの多ソース・高頻度・大量のログを処理するためのサービス。ストリームに流したログをLambdaで処理して、S3、Redshift、GCP BigQueryなどに投入するのがよくある使い方。

# S3

S3をファイルシステムとしてマウントするツールは複数ある。しかし、いずれも公式推奨ではないはず。

- goofys: https://github.com/kahing/goofys
- s3fs: https://s3fs.readthedocs.io/en/latest/
- s3fs-fuse: https://github.com/s3fs-fuse/s3fs-fuse

単にS3にファイルをアップロードしたいだけなら aws-cli の `aws s3 cp` や `aws s3 sync` コマンドを使うのが面倒が少ない。

また、オンプレ内にS3へのゲートウェイとなるサーバーを立てる、S3ファイルゲートウェイがある。プロトコルはNFSとSMB。また、ゲートウェイは、AWS公式のイメージから仮想マシンを作る方法と、ハードウェアアプライアンスを購入する方法がある。

https://docs.aws.amazon.com/filegateway/latest/files3/what-is-file-s3.html

よく似た機能にストレージゲートウェイがある。こちらは、プロトコルがiSCSIで、ファイルシステムではなくボリュームレベルでS3に保存する。

https://docs.aws.amazon.com/storagegateway/latest/vgw/WhatIsStorageGateway.html

# MGN（Application Migration Service）

https://docs.aws.amazon.com/ja_jp/mgn/latest/ug/what-is-application-migration-service.html

オンプレサーバーをEC2に移行するサービス。オンプレサーバーに Replication Agent をインストールし、ファイルを随時ミラーリングしながら移行する。

なお、移行の方法としては、VM Importで仮想マシンを移行したり、Docker化しECSに移行したり、そもそも移行しないで廃止したりするなど、複数の選択肢がある。

まず、[AWS Migration Hub](https://aws.amazon.com/jp/migration-hub/)に現状を登録し、[AWS Application Discovery Service](https://aws.amazon.com/jp/application-discovery/)で現状分析するところから始める。
viewファイルを分割して外部化する（@yield）

# 外部化とは
ヘッダーやフッター、グローバルナビゲーションの部分などの
`共通する部分を部品化すること`を指します

これによって大掛かりなプロジェクトなどで何千ページのWEBサイトを作成する際には
共通する部分は呼び出すだけで済むため、`作業の効率化につながります`

## @yieldとは

- @sectionの内容を呼び出します。

### @sectionとは

まずは実際の例をご覧ください
``` php
@yield('content')

@section('content')
  <p>ここにブログやニュース記事、企業情報、コンテンツ情報を記述します</p>
 
@endsection

```
- @sectionと@endsectionで囲まれた内容を@yieldで呼び出すことができます
- @sectionで囲まれた部分は@yieldで呼び出さない限り表示されません
- @sectionに任意の名前を付けることで@yieldによりその名前の@sectionを呼び出すことができます 


## 実際の使い方
headタグやmetaタグなど共通要素を記述した`親となるテンプレートファイル`を作成します
例：resources/views/layouts/template.blade.php

- titleタグには @yield で 後述のtitleの引数を呼び出しするよう記述しておきます
- bodyタグには @yield で 後述のcontent の内容を呼び出しするよう記述しておきます

```php
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>@yield('title')</title>
</head>
<body>
  @yield('content')
</body>
</html>
```

### 親テンプレートは他のbladeファイルで呼び出して使います

#### 外部化ファイルの作り方
1. 共通テンプレート（親）を呼び出すbladeファイルを作成します
`resources/views/contents/index.blade.php`

2. bladeファイルへ親テンプレートを継承する@extendsを記述します
3. bladeファイルに親テンプレートが読み込まれます
4. 親テンプレートの@yieldからsectionが呼び出されます

```php
{{-- layoutsフォルダのapp.blade.phpを継承 --}}
@extends('layouts.template')

{{-- @yield('title')へtitleタグの値を代入されブラウザのタイトルが変更される --}}
@section('title', '記事一覧')

{{-- 呼び出された親要素の@yield('content')に以下のレイアウトを代入される --}}
@section('content')
  <p>ここにブログやニュース記事、企業情報、コンテンツ情報を記述します</p>
@endsection
```


- 親テンプレートを継承したのでbladeファイルには@yield('content')が継承されています
- @yieldより@section('content')が呼び出されるため、ここで初めてブラウザに表示されます
52週の予測値を曜日重みで日毎に割り戻す(SPSS Modeler データ加工逆引き1-8)

# 52週の予測値を曜日重みで日毎に割り戻す（予測値の按分）

![スクリーンショット 2022-07-25 8.55.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/7498eb5f-fd23-5b05-6c4e-60795ef260bc.png)

## 1.想定される利用目的

・来店客数や呼量を週次で予測し、日毎に按分（週のトレンドと曜日重みが安定している場合など）
・エリアでSKU発注量を予測して実績重みで按分（ストア単位でバラつく場合など）

## 2.サンプルストリームのダウンロード

https://github.com/yoichiro0903n/blue/blob/main/52weeks_distribution.str?raw=true

## 3.サンプルストリームの説明

![スクリーンショット 2022-07-25 8.32.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/ad0e5470-9fe2-aca3-7248-f1157737ce07.png)

a.入力するデータは以下の通りです。
![スクリーンショット 2022-07-25 8.35.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/a5f56927-5dd1-c116-c0ba-521e5106e71d.png)

b.[バランス]ノードを編集します。不均衡データを補正する目的で利用されますが、この設定で単純増幅が可能です。
![スクリーンショット 2022-07-25 8.36.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/6eae2a46-e4b9-6611-dc36-12b55b83cb24.png)

[プレビュー]します。52レコードを7倍に複製しました。
![スクリーンショット 2022-07-25 8.36.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/3ae5c4a5-f9b2-1d59-f2ec-a13d5a58f464.png)

c.[フィールド作成]ノードを編集します。[派生]モードを[カウント]にしてカウントアップするための条件を記述します。[@&#xFFF0;OFFSET（開始日,1)]は開始日の1行上を参照する関数です。開始日が1行上と一致するとカウントアップして、異なったらリセットします。
![スクリーンショット 2022-07-25 8.37.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/f328a565-52e7-1788-dd1a-438616be803b.png)

式ビルダーのライブラリから@&#xFFF0;関数を探すと簡単に入力できます。
![スクリーンショット 2022-07-25 8.38.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/d18ab9e2-3156-cf0a-9aab-2b07b0d097db.png)

[プレビュー]します。1が日曜日を、7が土曜日を意味します。
![スクリーンショット 2022-07-25 8.38.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/4207b1b1-307b-b664-f091-98f914d94fda.png)

曜日のラベルをつける場合には以下を参考にしてください。

https://qiita.com/416nishimaki/items/1c9f1e1ebe7f14f6f79f

d.[フィールド作成]ノードを編集します。週の開始日に整数の曜日を利用して該当する日付を作成しています。
![スクリーンショット 2022-07-25 8.39.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/a3e40287-e245-b3fb-2ea0-2f9796870dbc.png)

ある日付のN日先の日付を作る方法は以下を参考にしてください。

https://qiita.com/416nishimaki/items/85d42d7e54a42d426f3e

e.[フィールド作成]ノードを編集します。土曜日か日曜日の場合には値を0.25倍しそれ以外の平日は0.1倍しています。

![スクリーンショット 2022-07-25 8.39.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/352a4baa-547e-478d-8fd0-7357f4fec190.png)


#### 注意事項

ひとつ上位の粒度で予測して按分する方法は、モデル作成の煩雑さを抑えて安定的に精度確保ができる方法です。ただし相応のボリューム（今回のサンプルでは値）や要因データが期待できる場合には本来の粒度でトライするべきです。

## 4.参考情報

#### よく使う「日付と時間」関数

https://qiita.com/Makimaki2020/items/72e3b774039327fa4ac4

#### バランスノード

https://qiita.com/416nishimaki/items/a873ffd1eb14a13296be

#### SPSS Modeler ノードリファレンス目次

https://qiita.com/416nishimaki/private/503037195081d3323eee

#### SPSS Modeler 逆引きストリーム集（データ加工）

https://qiita.com/416nishimaki/private/4bf813e6cba84b2a1008
DevOps Center



# "Cannot determine files available to pull" error

["Cannot determine files available to pull" error](https://trailhead.salesforce.com/en/trailblazer-community/feed/0D54S00000HEaw2SAD)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/ad21c535-96f8-6742-f1c2-2da6a08f9e20.png)
「AWS Step FunctionsとAmazon MWAA両方使ったので比較してみた」を見て、参考にした色々


https://www.youtube.com/watch?v=UBxwwG4MXrc&list=PLL6J8djFsPBVSke_shu2O7hVuRiSizZx8

https://dev.classmethod.jp/articles/devio2022-stepfunctions-mwaa-cmp/

<script async class="speakerdeck-embed" data-slide="1" data-id="2291a04bc5174863b7f9c9581c29075e" data-ratio="1.77777777777778" src="//speakerdeck.com/assets/embed.js"></script>



> 結論は達成したいゴールや目的によって選びましょうということでしたが、迷った場合どうするか。迷った場合はStep Functionsをお勧めします。パフォーマンスとコスト面で大きな失敗はないと思われます。

### 対象
- バッチシステムを運用している
- バッチシステムの情報を集めている

### Step Functionsの概要と特徴

- ビジュアルワークフローサービス
- ローコード

- メリット
    - サーバーレス
    - 高パフォーマンス
    - Workflow Studio、ビジュアルツールでワークフロー構築
    - IaC管理など考慮は必要
- デメリット
    - タスク単位の再実行不可
    - 処理待ちはwait loopをステートマシンレベルで自前定義
- 実行履歴にハードリミットあり
- タスクがエラーになると全体が停止する
- 実行履歴の保持は90日間

### MWAAの概要

- Amazon Managed Workflows for Apache Airflow
- Pythonスクリプトで定義を作れる

- メリット
    - Airflowの資産および開発・運用経験を生かせる
    - IAMと統合された管理画面
    - タスク単位の再実行が可能
    - 既存のMWAA環境があるならほぼ0コスト
- デメリット
    - DAG(有向非巡回グラフ)
    - タスクの状態遷移に時間がかかる


### まとめ

- Step Functionsはコスパ、実行性能ともに良い。AWSに習熟しているなら有力
- MWAAの強みは既存エコシステムの再利用
- どちらを採用しても [冪等性](https://qiita.com/suin/items/316cb8aaf8dfcf11abae) の考慮は必須


## ほか参考

[スタートアップでもバッチワークフローの使い分けはあり　Amazon MWAAからの一元管理で安心感のある運用を - ログミーTech](https://logmi.jp/tech/articles/324551)
[Step Functions を利用して感じた Airflow との比較 | フューチャー技術ブログ](https://future-architect.github.io/articles/20220111a/)


ということで、
関連: [バッチサーバーFargate化プロジェクトのまとめ - Qiita](https://qiita.com/e99h2121/items/38cb0e004d51dffd2716)
以上です～
2022/8/2主にITとかセキュリティの記事

メタップスP、改善措置の報告書を提出 - 役員人事など発表
https://www.security-next.com/138579

「Samba」に複数の脆弱性 - ドメインを乗っ取られるおそれも
https://www.security-next.com/138563

アウトドアブームに便乗？　有名ブランドの偽サイトに注意
https://www.security-next.com/138567

フィッシングサイトの約4割が「三菱UFJニコス」を悪用 - 偽NHKにも注意
https://www.security-next.com/138561

北朝鮮のハッカーが米国の医療機関をターゲットにする理由(7/31)
https://forbesjapan.com/articles/detail/49219

新規マルウェアのサンプル数、Windowsが圧倒的に多いがLinuxは650%近く急増(7/30)
https://gunosy.com/articles/e25b0

［社説］KDDI大規模障害の教訓(7/31)
https://www.nikkei.com/article/DGXZQODK29D7Q0Z20C22A7000000/

Samsung、バックアップや初期化不要で個人情報隠せる「修理モード」発表(7/30)
https://iphone-mania.jp/news-472677/

VBAマクロ封じられたサイバー犯罪者次の一手、LNKファイル悪用が1,675%増加(7/31)
https://news.mynavi.jp/techplus/article/20220731-2411465/

モバイル決済アプリを危険にさらす10の詐欺に注意(7/30)
https://news.mynavi.jp/techplus/article/20220730-2410283/

ジャック・ドーシーらが提唱する「Web5.0」とは｜ビットコイン研究所寄稿(7/30)
https://coinpost.jp/?p=371950

エルサルバドルのビットコインは機能している、と財務大臣は言います(7/30)
https://portalcripto.com.br/ja/%E3%82%A8%E3%83%AB%E3%82%B5%E3%83%AB%E3%83%90%E3%83%89%E3%83%AB%E3%81%AE%E3%83%93%E3%83%83%E3%83%88%E3%82%B3%E3%82%A4%E3%83%B3%E3%81%8C%E6%A9%9F%E8%83%BD%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B%E3%81%A8%E8%B2%A1%E5%8B%99%E5%A4%A7%E8%87%A3%E3%81%AF%E8%A8%80%E3%81%86/

米シークレットサービス、iMessageの使用禁止を検討(7/31)
https://iphone-mania.jp/news-472884/

立教大学とNTTデータ、DX人材育成プログラム開発へ(7/31)
https://univ-journal.jp/175444/

インドネシアがYahoo・PayPal・Steamなどへのアクセスを禁止(7/31)
https://news.livedoor.com/article/detail/22594522/

半田病院報告書に学ぶ　セキュリティー向上策(8/1)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/020600014/071900122/

防衛省が手本にした米セキュリティー基準の「SP800-171」、気になる5つの疑問(8/1)
https://xtech.nikkei.com/atcl/nxt/column/18/02143/072800002/

スマホやスマートスピーカーを使って自宅の防犯対策、「Ring」とは(8/1)
https://xtech.nikkei.com/atcl/nxt/column/18/01679/063000066/

差分プライバシー（Differential Privacy）(8/1)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/020600009/072200120/

21年度PCサーバー出荷台数37万台　8.4％減、3年連続で減らす(8/1)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/020600010/072200120/

半年先までの出荷計画　新基盤で調達先と共有、関係強化
富士フイルムホールディングス(8/1)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/020600004/072500109/

アプリがブロックチェーンで動き　集中から分散へ転換(8/1)
https://xtech.nikkei.com/atcl/nxt/mag/nnw/18/071500140/071500001/

トークンやウォレットなどWeb3に必要な技術を理解する(8/1)
https://xtech.nikkei.com/atcl/nxt/mag/nnw/18/071500140/071500002/

ISPはどこにつながっているの？(8/1)
https://xtech.nikkei.com/atcl/nxt/mag/nnw/18/041800014/071500060/
Intel MacでRustの環境構築をしてみた

Intel MacでRustの環境構築してみたときのメモです。

自分のpc：

```
$ sw_vers
ProductName:	macOS
ProductVersion:	11.4
BuildVersion:	20F71
```

Xcode command line toolsはもうすでに入っている。

以下でインストールしてみた。

```
brew install rustup-init
```

以下のコマンドを走らせていろいろインストールしてみる。デフォルトオプションで進む。

```
$ rustup-init
...
1) Proceed with installation (default)
2) Customize installation
3) Cancel installation
>1
```

これでターミナルを再起動して以下のコマンドを走らせる。

```
$ rustup --version
rustup 1.24.3 (2021-05-31)
info: This is the version for the rustup toolchain manager, not the rustc compiler.
info: The currently active `rustc` version is `rustc 1.61.0 (fe5b13d68 2022-05-18)`

$ rustc --version
rustc 1.61.0 (fe5b13d68 2022-05-18)

$ cargo --version
cargo 1.61.0 (a028ae42f 2022-04-29)
```
【Rails】Userがいいねした投稿一覧作成

# はじめに
ユーザーがいいねをした投稿の一覧を見れるようにしたい。
しかし、users_path（indexアクション）は別の用途で使用している。
そこで、routesに新しいルーティングを追加し、専用のページを作成する。
**完成図**
![favorited_posts.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2684787/9d49289d-01ee-3f42-cb9b-6ad0d272478d.gif)


# 前提
使用環境は以下の通りである。
| No |    項目     |   内容    |
|---:|-------------|------------|
| 1  |      OS       |   Mac     |
| 2  |       Ruby      |   2.6.3   |
| 3  |       rails      |      6.0.4 |
| 4  |       Kaminari      |  1.2.2 |
| 5  |      bootstrap-sass     | 3.4.1 |
| 6  |      sass-rails      |  5.1.0 |

# ルーティングの設定をする
```routes.rb
  resources :users do
  # memberだと、 users/:id/following, collectionだと users/following 
    member do
      # GET request, favorited_posts action, favorited_posts_user_path(:id)
      get :favorited_posts
    end
  end
```

```言語名:ターミナル
$ rails routes
favorited_posts_user GET    /users/:id/favorited_posts(.:format)      users#favorited_posts
```
# コントローラーの設定をする
```users_controller.rb
  def favorited_posts
    @user = User.find(params[:id])
    posts = @user.favorited_posts
    @posts = Kaminari.paginate_array(posts).page(params[:page]).per(10)
    render 'show_favorited_posts'
  end
```

# テンプレートを作っていく![favorited_posts.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2684787/7179a6bc-d0a2-7794-ea13-5c730d562e39.gif)

users_controllersでfavorited_postsアクションが実行された時、レンダリングされるページをtouchコマンド等で作成する。
Kaminari gemでpaginateもしていく。そのためにcontrollersでKaminariモデル上に@postsを作成した。
```app/views/users/show_favorited_posts.html.erb
<% provide(:title, 'Favorited Post') %>
<h1>Favorited Post</h1>
<%= paginate @posts %>
<ul class="posts">
  <%= render @posts %>
</ul>
<%= paginate @posts %>
```
リンクを埋め込みたいテンプレートに追加していく。
今回はhomeページに追加する。
```home.html.erb
    <aside class="col-md-2">
      <section class="user_info">
        <%= render 'shared/user_info' %>
      </section>
# 下記の部分を追加する。
      <section class="favorited_posts">
        <%= render 'shared/favorited_posts' %>
      </section>

      <section class="stats">
        <%= render 'shared/stats' %>
      </section>
    </aside>
```

favorited_postsパーシャルを作成する。
```app/views/shared/_favorited_posts.html.erb
<% @user ||= current_user %>
<div class="favorited_posts">
  <a href="<%= favorited_posts_user_path(@user) %>">
    <strong id="favorited_posts" class="favorited_posts">
      <%=  @user.favorited_posts.count %>
    </strong>
    favorited posts
  </a>
</div>
```
テンプレートを整える。
今回は、statsクラス（follow, followerの表示する部分）と同じようなデザインに統一する。
```custom.scss
.favorited_posts, .stats {
  overflow: auto;
  margin-top: 0;
  padding: 0;
  a {
    float: left;
    padding: 0 5px;
    border-left: 1px solid $gray-lighter;
    color: gray;
    &:first-child {
      padding-left: 0;
      border: 0;
    }
    &:hover {
      text-decoration: none;
      color: blue;
    }
  }
  strong {
    display: block;
  }
}
```

# おわりに
実装完了した。
知っていて当たり前-04　出力形式

# 知っていて当たり前-04 出力形式

## 1.　書式付き出力　`@printf`


```julia
using Printf
@printf("n = %05d, x = %.7f", 11, sqrt(2))
```

    n = 00011, x = 1.4142136


```julia
@printf("t = %.7g, df = %.7g, p-value = %.7g\n", 2.321, 14, 0.32456)
```

    t = 2.321, df = 14, p-value = 0.32456


## 2.　書式付文字列　`@sprintf`


```julia
x = sqrt(2)
@sprintf("n = %05d, x = %.7f", 11, x)
```




    "n = 00011, x = 1.4142136"




```julia
@sprintf("pi = %.15g", pi)
```




    "pi = 3.14159265358979"



## 3.　書式付文字列，出力　`format()`


```julia
# import Pkg; Pkg.add("Formatting")
using Formatting

n = 123
format("n = {:05d} pi = {:.7e}", n, pi)
```




    "n = 00123 pi = 3.1415927e+00"




```julia
print(format("n = {:05d} pi = {:.7e}", n, pi))
```

    n = 00123 pi = 3.1415927e+00

## 4.　補間演算子　`$`

特定の場合 `$変数`，一般の場合 `$(式)`

変数，式の評価結果を表示する。


```julia
println("x = $x, x^2 = $(x^2)")
```

    x = 1.4142135623730951, x^2 = 2.0000000000000004
PowerShellでUNIX timeをあつかってみる

`PowerShell`で`datetime`をから`UNIX time`に変換したり、`Unix time`から`datetime`に変換したり。

## Convert to UNIX time from Date

### Get-DateコマンドレットのUFormatオプション

`Get-Date`コマンドレットの`UFormat`で出力の形式を設定する事ができ、ドキュメントには`%s`を指定すると`Seconds elapsed since January 1, 1970 00:00:00`と記載されており`UnixTime（秒）`で表示してくれます。

[Get-Date/UFormat/notes](https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/get-date?view=powershell-7.2#notes)

```PowerShell:Get-DateのUFormatオプションを利用して変換
# 1992年7月6日(日本時間)をUnixTimeに変換
# 今回実行している端末のタイムゾーンは`Tokyo Standard Time`なので日本時間
Get-Date -Date "1992/07/06 00:00:00" -UFormat "%s"
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/a2f248ad-f4f1-9fe8-8577-ab364bca42f1.png)

### .NetのDateTimeOffsetを利用する

.Netの`DateTimeOffset`に`ToUnixTimeSeconds`が用意されているので、こちらを利用すれば変換できます。

[DateTimeOffset.ToUnixTimeSeconds メソッド](https://docs.microsoft.com/ja-jp/dotnet/api/system.datetimeoffset.tounixtimeseconds?view=net-6.0)

```PowerShell:DateTimeOffsetのToUnixTimeSecondsを利用して変換
# 1992年7月6日(日本時間)をUnixTimeに変換
# 今回実行している端末のタイムゾーンは`Tokyo Standard Time`なので日本時間
$dateTime = Get-Date -Date "1992/07/06 00:00:00"

([datetimeoffset]$dateTime).ToUnixTimeSeconds()
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/746ca445-6169-5e10-ea89-0a4b6c4986b9.png)

## Convert to Date from Unix Time

### UnixTimeSecondsオプションを利用する（PowerShell 7.1以上）

`PowerShell 7.1`から `Get-Date`コマンドレットに`UnixTimeSeconds`オプションが追加されているためこのオプションを利用すれば`UnixTime（秒）`を`Date`に変換してくれます。

```PowerShell:Get-DateのUnixTimeSecondsオプションを利用して変kん
# 1992年7月6日(日本時間)をUnixTimeに変換
# 今回実行している端末のタイムゾーンは`Tokyo Standard Time`なので日本時間$unixTime = $unixTime = Get-Date -Date "1992/07/06 00:00:00" -UFormat "%s"
# UnixTimeSecondsオプションを利用して変換
Get-Date -UnixTimeSeconds $unixTime
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/97305e53-bc31-0db3-ccfa-d3902beb0adf.png)

### .NetのDateTimeOffsetを利用する

.Netの`DateTimeOffset`に`FromUnixTimeSeconds`が用意されているので、こちらを利用すれば変換できます。

[DateTimeOffset.FromUnixTimeSeconds(Int64) メソッド](https://docs.microsoft.com/ja-jp/dotnet/api/system.datetimeoffset.fromunixtimeseconds?view=net-6.0)

```PowerShell:DateTimeOffsetのFromUnixTimeSecondsを利用して変換
# 1992年7月6日(日本時間)をUnixTimeに変換
# 今回実行している端末のタイムゾーンは`Tokyo Standard Time`なので日本時間$unixTime = $unixTime = Get-Date -Date "1992/07/06 00:00:00" -UFormat "%s"

# PowerShellでunix時間変換（.NetのdatetimeoffsetのFromUnixTimeMillisecondsメソッドを利用）
[datetimeoffset]::FromUnixTimeSeconds($unixTime)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/7f5a1a7e-fb6c-d82b-9444-cd27b6517e3b.png)

## 総評

`PowerShell`で`UNIX Time`を扱うには、`.Net`の`DateTimeOffSet`を利用すれば便利に扱えますが。

`PowerShell 7.1`からは`Get-Date`コマンドレットに`UnixTimeSeconds`が追加されており、`Get-Date`コマンドレットだけでも`UNIX Time`との相互変換ができました。
iOS 16から追加されたデベロッパモードが表示されない

# 困りごと
iOS 16から、Androidと同じように開発者向けのデベロッパーモードが追加され、これをONにしないと開発中アプリの実行やデバッグができなくなった。
↓公式ドキュメント
https://developer.apple.com/documentation/xcode/enabling-developer-mode-on-a-device

ドキュメントでは、
「設定」→「プライバシーとセキュリティ」に「デベロッパモード」という項目があるからこれをONにしてね。
と書いてあるのに**そんなものは見当たらなくて困った**。

# 解決法
一度MacとiPhoneを繋いでXcode上でアプリの実行ボタンを押し、以下のポップアップを表示させる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574728/edc1b2a1-c63a-4743-031f-1d078754c461.png)

※MacとiPhoneの接続時に以下のポップアップで「信頼」を選択するのを忘れないこと。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574728/955db03e-0f87-43f9-f033-9c0ace09e69e.png)

# 最後に
スマホアプリエンジニアは毎年のOSアップデートに振り回されるのが辛いですね。

Twitter→[@ruemura3](https://twitter.com/ruemura3)
【kintone】目指せ！JavaScriptカスタマイズ中級者（３） 〜自動で一括ファイルアップロード編〜の通りにやっても自動アップロードできない

https://developer.cybozu.io/hc/ja/articles/900001933483

以上の記事でハマっている人が多そうなので、個人的に使用しているものをリポジトリに公開していますので、こちらのリポジトリを使用すれば、以上の記事でやりたいことができると思います。

# リポジトリ
https://github.com/hiromu-ikeda/kintone-sample
# 少しだけ解説
https://github.com/cybozudevnet/sample-kintone-webpack-for-intermediate

記事の一覧には、以上のリポジトリを使用するよう指示が出ていて、実際.envを設定するとコマンドでビルドとアップロードを行なってくれます。

ところが、タイトルにもある通り、（3）にて自動で一括ファイルアップロードができるという記事があり、ハンズオン形式でやってみると、最後の

```
npx webpack --watch --mode development --upload
```
このコマンドを叩くと、自動ビルドまでは行なってくれるのですが、アップロードまでいってくれません。

原因はWebpack.config.jsにあって、今回はそちらを修正しました。
分かりやすくautoUpload.jsにファイル分割しているので、よければコードの中身まで見てみてください。

目指せkintoneカスタマイズマスター！
[OutSystems]モバイルアプリケーションの画面を操作中にスリープさせない

個人的なペットプロジェクトで作っているToDoアプリのために、アプリケーションを表示しているうちは画面スリープさせない機能が欲しくなった。
（入力内容を考えている間にロックされないように）
Forgeにあるプラグインで実現できたのでメモ。

以下の情報は2022/8頭頃のもの。

# 履歴
2022/08/22 OnApplicationReadyでKeepAwakeを追記

# 環境
Personal Environment(Version 11.16.0 (Build 35766))
Service Studio(Version 11.53.7)
Insomnia Plugin (Version 1.0.0)
Android (機種名 SH-M08 Android バージョン 10)

今回はiOSの開発用ライセンスが切れてしまったのでAndroidのみで確認。


# Forgeコンポーネント
## 評価と選択
この機能を実現するプラグインは、（見つけた範囲では）Forgeに2つ登録されていた。
KeepAwake PluginとInsomnia Plugin。
実体は、

- 同じCordovaの同じバージョンをラップしている
- 提供するAction構成が同じ
    - 内部的に呼んでいるCordova PluginのAPIも同じ
- 使い方も同じ
- OutSystems 10向けに作られたかなり古いモジュールである点も同じ

とほぼ同じモジュールといってもよい。

- License Blockを含んでいる
- User Provider moduleの設定がおかしくない
- Common Pluginへの参照を含んでいない

という点で、Insomniaの方が良さそうなのでこちらで実装を確認してみる。


## KeepAwake Plugin
URL
　https://www.outsystems.com/forge/component-overview/1743/keepawake-plugin
最終更新
　2016/12/23 
Version
　1.0.1
オリジナルのプラグイン
　https://github.com/EddyVerbruggen/Insomnia-PhoneGap-Plugin#4.2.0
　MITライセンス
注意点
　Common PluginのError Structureを参照しているため、インストール時にNot compatibleになる。
　User Provider moduleとして(Current eSpace)を指定してあるのは多分間違い。
　最終更新の日付からも明らかなようにOutSystems 10で作られたモジュール。
　License Blockを含まない。

## Insomnia Plugin
URL
　https://www.outsystems.com/forge/component-overview/1740/insomnia-plugin
最終更新
　2016/12/22 
Version
　1.0.0
オリジナルのプラグイン
　https://github.com/EddyVerbruggen/Insomnia-PhoneGap-Plugin#4.2.0
　KeepAwakeと同じ。
注意点
　最終更新の日付からも明らかなようにOutSystems 10で作られたモジュール。

# 使い方
## 参照
Consumerとなるモバイルアプリケーションから、Insomnia Pluginの全要素を参照する。

## 実装
スリープさせないようにしたいScreenのOnInitializeで以下のように実装する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/a1f45e75-fbea-bb42-c233-05554a0c9b89.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/017fd0f8-c45a-8cd9-e064-17d0ce06cd02.png)

KeepAwake Actionを読んだ時点から、アプリケーションの操作中はスリープしなくなる。
再びスリープさせたいときは、AllowSleepAgain Actionを呼べば良い。
実験したところ、どうもKeepAwakeは特定の画面のみに聞くわけではなさそう。スリープさせたい画面があるときは、AllowSleepAgainを忘れずに呼ぶ必要がありそう。

License ScreenのPlaceholderにPluginに含まれるLicense Blockを配置する。

## （追記）OnApplicationReadyでKeepAwake
書き忘れていたので追記。
アプリケーション全体で、使用中はスリープさせたくない場合は、System EventのOn Application ReadyのタイミングでKeepAwake Actionを実行するのが自然。

On Application Readyのタイミングで動作するActionを作るには、Client Actionsフォルダを右クリック　→　Add System Event　→　On Application Readyを選ぶ。

# 注意
オリジナルのCordova PluginのQuirksの項に

> on iOS the app would fall asleep after the Camera has been used, even if you previously called keepAwake. A similar issue on Android where the photo library was accessed during app usage.

というのがあるので注意。
(iOSではカメラを使ったあとで、Androidではフォトライブラリにアクセスした後で、再びSleepするようになる現象がある、という意味）。
こういうイベントが起こったあとは、再びKeepAwakeを呼ぶように気をつける。
【GAS】シート名をセルから入力する

# はじめに
スプレッドシートにて、シート内にシート名を入力するセルがあり、そのセルの値を変更した際にシート名も自動で変えたかったので、方法をメモ。

# 内容
以前、シートを編集した際に更新日時を自動で更新する方法を記載したが、その方法と似ている。
（参考）[【GAS】シートの最終更新日を自動入力する](https://zenn.dev/murimuriko/articles/21b9b74128471b)

```c#:シート名の自動更新
function getUpdateTime(e){
  const range = e.range;
  const sheet = range.getSheet();

  if(range.getRow() == 3 && range.getColumn() == 11){
    sheet.getRange('K5').setValue(Utilities.formatDate(new Date(), "Asia/Tokyo", "yyyy-MM-dd"));
    sheet.setName(sheet.getRange('K3').getValue());
  }
}
```

# 詳細
まず、セルを編集した際に呼ばれる関数を適当に作成する。
その関数にて、編集したセルの位置が指定したセルに一致したなら、シート名を`sheet.setName()`にて設定する。

1つ注意しておきたいのは、この関数が呼ばれるのはどうやらセルを編集した後らしいので、編集したシート名が特定のシート名と一致したなら、～のような条件をif文の条件に含めてしまうとif文に入らなくなってしまうことだ。

# まとめ
まとめると、セル編集時に`sheet.setName()`を呼ぶことでシート名を変更できる。
セルに入力するだけで自動で何かを更新できるようになると、ユーザにとっては便利になることが多いはずなので、今後も調べつつメモしていこうかと思う。
QMKでのImportErrorの解決メモ

# QMKコマンドがエラーで通らない

qmkコマンドを打つと以下のエラーが出てしまう状況。```qmk --help```でも```qmk compile```でも同じエラーが出る。
```
% qmk
Error: %s: %s ('ImportError', ImportError('dlopen(/usr/local/Cellar/qmk/1.1.0/libexec/lib/python3.9/site-packages/PIL/_imaging.cpython-39-darwin.so, 2): Library not loaded: /usr/local/opt/jpeg/lib/libjpeg.9.dylib\n  Referenced from: /usr/local/Cellar/qmk/1.1.0/libexec/lib/python3.9/site-packages/PIL/_imaging.cpython-39-darwin.so\n  Reason: image not found'))
Traceback (most recent call last):
  File "/usr/local/Cellar/qmk/1.1.0/libexec/lib/python3.9/site-packages/qmk_cli/script_qmk.py", line 76, in main
    import qmk.cli  # noqa
  File "/Users/yuta/qmk_firmware/lib/python/qmk/cli/__init__.py", line 238, in <module>
    __import__(subcommand)
  File "/Users/yuta/qmk_firmware/lib/python/qmk/cli/painter/__init__.py", line 1, in <module>
    from . import convert_graphics
  File "/Users/yuta/qmk_firmware/lib/python/qmk/cli/painter/convert_graphics.py", line 7, in <module>
    from qmk.painter import render_header, render_source, render_license, render_bytes, valid_formats
  File "/Users/yuta/qmk_firmware/lib/python/qmk/painter.py", line 6, in <module>
    from PIL import Image, ImageOps
  File "/usr/local/Cellar/qmk/1.1.0/libexec/lib/python3.9/site-packages/PIL/Image.py", line 132, in <module>
    from . import _imaging as core
ImportError: dlopen(/usr/local/Cellar/qmk/1.1.0/libexec/lib/python3.9/site-packages/PIL/_imaging.cpython-39-darwin.so, 2): Library not loaded: /usr/local/opt/jpeg/lib/libjpeg.9.dylib
  Referenced from: /usr/local/Cellar/qmk/1.1.0/libexec/lib/python3.9/site-packages/PIL/_imaging.cpython-39-darwin.so
  Reason: image not found
```

# 環境
macOS Catalina
バージョン 10.15.7
qmkのインストールは公式のチュートリアル通り```brew install qmk/qmk/qmk```にて実施した。

# 解決方法
以下コマンドでlibjpegをインストールしたらエラーが出なくなった。
```
% brew install libjpeg
```

エラーのここがポイントだったようで、libjpegをインストールする前は当該パスが存在していなかった。
```
2): Library not loaded: /usr/local/opt/jpeg/lib/libjpeg.9.dylib\n
```

libjpegをインストールしようと思ったきっかけは、近しい課題が以下にあったかた。こちらを参考に上記の解決策に至った。
https://stackoverflow.com/questions/50273061/dyld-library-not-loaded-usr-local-opt-jpeg-lib-libjpeg-9-dylib-opencv-c-mac

# 余談
最初はPillowが読み込めないエラーだと思い、```pip install pillow```や```pip3 install pillow```など試していたが全然間違ってた。```python```コマンドでpython2が動くようになっており、python2にはpillowがインストールされていなかったので、aliasでpythonでpython3を読み出すようにもしたがそれも意味はなかった。やっぱりエラーをちゃんと読むのは大事だなと痛感した。
Scrapyでファイルのダウンロード

# Scrapyでファイルをダウンロード

## はじめに

Scrapyでファイルをダウンロードしてみようと思ったのですが、調べてみると記事がほとんどなく手順整理もあわせてポイントを絞って書いてみます。

- [Scrapyドキュメント](https://doc-ja-scrapy.readthedocs.io/ja/latest/topics/media-pipeline.html)
- [Scrapyのクローラーでファイルをダウンロードして保存する](https://www.nullpo.io/2020/05/09/python-scrapy-filedownload/)

の2つを参考にしました。

## 対象者
- Scrapyを使ってみたことがある人
- ベーシックテンプレートやクロールテンプレートの基本操作を試してみたのでファイルの取得をしてみたい人

## 設定　
プロジェクトやspidersの作成方法は同じです。
基本的な設定は省略します。

```spidersファイル.py
#ファイル取得部分
item = downloadItem() #items.pyのクラス
item['title'] = response.xpath('xxxx').get() #ファイル名にしたい元のファイル名 
item['file_urls'] = [response.xpath('yyyy').get()] #file_urlsはアレンジ不可
yield item
```

```items.py
class downloadItem(scrapy.Item):
    title = scrapy.Field() 
    file_urls = scrapy.Field() 
    files = scrapy.Field() #file_urlsからDL・filesはアレンジ不可

```


```pipelines.py
#DLするファイルのurlを使ってファイルを変更
class downloadPipeline(FilesPipeline):
    def file_path(self, request, response=None, info=None):
        file_paths = request.url.split("aaaa") #適当に
        return file_name
```

```settings.py
#デフォルト CONCURRENT_REQUESTS = 32 
CONCURRENT_REQUESTS = 1 #同時リクエストを１に設定

#以下は追加
FILES_STORE = 'download' #ファイルダウンロード先　プロジェクトフォルダ内に作成される。
ITEM_PIPELINES = {
    '[プロジェクト名].pipelines.downloadPipeline': 1,
    }
#DOWNLOAD_DELAYの設定も忘れずに
```

## 実行
```
scrapy crawl [spidersファイル名] 
```


## 参考
- [Scrapyドキュメント](https://doc-ja-scrapy.readthedocs.io/ja/latest/topics/media-pipeline.html)
- [Scrapyのクローラーでファイルをダウンロードして保存する](https://www.nullpo.io/2020/05/09/python-scrapy-filedownload/)
[next.js] next-pwaが動かない。。

導入の参考

https://qiita.com/NozomuTsuruta/items/8991707ff549b1552e78

# ディレクトリ構成
```bash
.
├── README.md
├── next-env.d.ts
├── next.config.js
├── node_modules
├── out
├── package-lock.json
├── package.json
├── public
├── src
└── tsconfig.json
```

# エラーとやったこと
.next/sw.jsができるのでpathが通らず読み込めない。
public/にできてほしいがなぜかできない。以下導入手順

### 1. next-pwa install
`npm i next-pwa`
next-pwa: v.5.5がインストールされた。

### 2. next.config.jsを修正
```next.config.js
/** @type {import('next').NextConfig} */

const withPWA = require('next-pwa')

const nextConfig = withPWA({
  pwa: {
    dest: 'public',
  },
  reactStrictMode: true,
  trailingSlash: true,
})

module.exports = nextConfig
```

### 3. icon作成 & 配置
iconを作成して/public/に配置
https://ao-system.net/favicongenerator/

### 4. 読み込み
```_document.tsx
      <Head>
        <meta name="theme-color" content="#fff" />
        <link
          rel="icon"
          type="image/png"
          sizes="48x48"
          href="/icon-48x48.png"
        />
        <link
          rel="icon"
          type="image/png"
          sizes="32x32"
          href="/icon-32x32.png"
        />
        <link
          rel="icon"
          type="image/png"
          sizes="16x16"
          href="/icon-16x16.png"
        />
        <link rel="manifest" href="/manifest.json" />
        <link rel="apple-touch-icon" href="/apple-touch-icon.png"></link>
      </Head>
```
### 5. npm run build
```bash
...
> [PWA] Service worker: .../.next/sw.js
> [PWA]   url: /sw.js
```
なぜか.next/にできる。/sw.jsでアクセスしたときにこれでは読み込めずエラーになる。

# 解決法
version下げるとpublic/に作ってくれるようになった。うーん。。。
`npm i next-pwa@~5.4`



*こういうエラーも一緒に解決した
```js
Uncaught (in promise) bad-precaching-response: bad-precaching-response :: [{"url":"https://domain/_next/server/middleware-build-manifest.js","status":404}]
```

一応gitのissues
https://github.com/shadowwalker/next-pwa/issues/288
ESXi ovftoolを使って仮想マシンをエクスポート

## 概要
自宅サーバに新しくUbuntu22.04をインストールしたいけれど、ディスク容量がいっぱいのため、仮想マシン(Ubuntu18.04)をovftoolを使ってエクスポートしてから削除することにしました。エクスポート先は開発用PCのDドライブにします。
環境は6.7.0 Update 3、Windows10 Pro(開発用PC)です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2744334/f400ae43-6b3d-cc8a-36d0-8f09dc002806.png)

こちらの記事を参考にさせていただきました。
https://qiita.com/Raccoon_/items/48680ef33f354d1bfbe7
公式のページも参考にさせていただきました。
https://kb.vmware.com/s/article/1038709?lang=ja

## エクスポート
管理者権限でコマンドプロンプトを開いて、以下のコマンドを入力しました。仮想マシンはシャットダウンしておきました。仮想マシン名が「Ubuntu 18.04 LTS」だと、半角スペースやコンマの影響でコマンドがうまく実行できなかったので、事前に「Ubuntu1804LTS」に変更しておきました。コマンドのIPアドレスは仮想マシンのIPアドレスではなく、ESXiのIPアドレスを入力します。ユーザ名、パスワードもESXiのものを入力します。
```
cd C:\Program Files (x86)\VMware\VMware Player\OVFTool
```
```
ovftool --X:logFile=ovftool.log --X:logLevel=verbose --noImageFiles vi://root:password@192.168.88.11/Ubuntu1804LTS D:\VMBackup
```
実行するとフィンガープリントを追加するかと聞かれたのでyesにしておきました。だいたい5分くらいでエクスポートできました。サイズは3GBくらいでした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2744334/f9169cd8-e4f3-5531-c715-85b56bb829f0.png)
ちゃんと設定したところに出力されていました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2744334/e1ed8339-3e08-91f2-07e2-f05917ad7cb8.png)
Airflow資料抄訳(19)：変数（Variables）

恥ずかしながら最近になって知ったワークフローエンジン [Apache Airflow](https://airflow.apache.org/)。日本語の紹介記事もちらほら出てきていますが、[公式ドキュメント](https://airflow.apache.org/docs/)をちょっとずつ抄訳しながら読んでいこうと思います。

19目の今回は[変数](https://airflow.apache.org/docs/apache-airflow/stable/concepts/variables.html)（Variables）。
バージョン2.3.3時点のものです。

---

# 変数（Variables）

変数（variables）はAriflowのランタイムに設定情報を供給するための仕組みです。それは一般的なキー／バリュー・ストアであり、グローバル・スコープを持ち、タスクのコードから問い合わせることができ、Web UIから簡単に指定で可能です。JSONファイルのアップロードによる一括指定も可能です。

変数を使うには、`Variable`モジュールをインポートして、`get`メソッドを呼び出します：

```py
from airflow.models import Variable

# 通常の呼び出し
foo = Variable.get("foo")

# JSON値の自動デシリアライズ
bar = Variable.get("bar", deserialize_json=True)

# 変数が設定されていない場合、default_varの値（None）を返す
baz = Variable.get("baz", default_var=None)
```

[テンプレート]( https://airflow.apache.org/docs/apache-airflow/stable/concepts/operators.html#concepts-jinja-templating)から呼び出すこともできます：

```jinja
# 生の値
echo {{ var.value.<variable_name> }}

# JSON値の自動デシリアライズ
echo {{ var.json.<variable_name> }}
```

変数はグローバル・スコープを持ちます。そしてシステム全体に適用される設定情報のために利用されるべきです。タスクないしオペレーター同士のデータのやり取りには[XComs](https://airflow.apache.org/docs/apache-airflow/stable/concepts/xcoms.html)を利用すべきです。

加えて、ほとんどの設定情報は（グローバル・スコープではなく）DAGファイルのスコープ内に留めておくことをお勧めします。DAGファイルであればバージョン管理ツールで管理できます。変数は本当にランタイムに固有の値を管理するためにのみ利用すべきです。

変数の設定と管理について詳しくは[変数を管理する]( https://airflow.apache.org/docs/apache-airflow/stable/howto/variable.html)をご覧ください。

---

バッチを運用していると、ランタイムに固有の、ランタイムに依存する、実行の都度変える、実行のまさにそのときに指定する値というのが必要になることは、たしかにしばしばあります。
ただここで注意されているように、ごくごく限られたケースでのみ、明確な運用設計ができているときのみ、この「変数」の機能を使うべきでしょう。
知っていて当たり前-02　コマンドライン関数

# コマンドラインと同じ機能を持つ関数

```Julia
cd("/Users/foo/Desktop/Julia")
pwd() # "/Users/foo/Desktop/Julia"
mv()
rm()
touch()
mkdir()
tempdir()
... その他
```

# コマンドを実行

```Julia
run(`ls`)
run(`date`) # 2022年 8月 1日 月曜日 23時00分14秒 JST
```

# コマンドの実行結果を（改行コードを含む）文字列として捕捉

```Julia
result = read(`ls -ltr`, String)
print(result)
```