OmniAICreator/Qiita-1.07M huggingface dataset:
島田商業高校　Vtuberを作ろう！！

#目次
[１．作成について](#1作成について)
[２．作成した動画について](#2作成した動画について)
[３．作成場所とテーマ](#3作成場所とテーマ)
[４．その他](#4その他)
[５．試行](#5試行)

#1．作成について
まず、バーチャルYouTuberとはどのような存在なのでしょうか。
一言でまとめるなら、主に「2Dまたは3Dのアバターを使って活動しているYouTuber」のこと。キャラクターの姿で、YouTube上で動画を投稿したりライブ配信をしたりしている人たちを指して、「バーチャルYouTuber（VTuber）」と呼んでいます。
代表的なバーチャルYouTuberとしては、「キズナアイ」さんが有名ですね。
『サンデージャポン』にコメンテーターとして出演したほか、『news zero』『ZIP!』『スッキリ』『ヒルナンデス！』など数々のテレビ番組にも登場。その他にもさまざまなメディアで取り上げられているので、一度は見たことがある人も多いのではないでしょうか。
※参照　https://join.biglobe.ne.jp/mobile/sim/gurashi/vtuber/　

そこで、静岡県立島田商業高等学校では授業の中でVtuberを授業の中で作成し、さらに島田市のキャラクターとして認知されていければと思い作成しました。科目名は（課題研究：デジタルソリューション）で週３時間で２学期から実施をした。
※アイデアから作成まではかなりの時間がかかりました。

#2．作成した動画について
動画については地元のことを知らないことも多いのでブレーンストーミングから項目をあげ、その後島田市にはどんなコンテンツがあったらいいのか？ということをテーマに動画作成をしました。完成度が低い点などもあるかもしれませんがすみません。
作成経過などに関してもリンク先から各自作成のまとめてしてアップしてあるのでご覧ください。

#3．作成場所とテーマ
<font color="red">タイトル名からQiita・内容からYoutubeにリンクがあります。高校生が作った作品ですので不具合などありましたらご連絡ください。すぐに削除します。</font>

||タイトル名|内容|
|---|---|---|
|1|[蛇口からお茶が出る水道][link-1]|[島田市「蛇口からお茶が出る水道」のPR動画作成過程][link-12]|
|2|[１分半でわかる！学校紹介～島田商業編～][link-2]|[島田商業高等学校の紹介動画ができるまで][link-13]|
|3|[めえめえカフェの動画を作るまで][link-3]|[藤枝市にあるめえめえカフェのヤギミルクスイーツPR動画作成の過程][link-14]|
|4|[島田市PR動画ができるまで　公園編][link-4]|[島田市PR動画：公園編　動画製作を簡単に紹介][link-15]
|5|[島田市のカフェ紹介動画制作過程について][link-5]|[「島田市のおすすめカフェをkanadeが紹介！」の制作過程について][link-16]|
|6|[島田市防災説明動画制作過程][link-6]|[島田市の防災説明動画の制作過程][link-17]|
|7|[ばらの丘公園PR動画][link-7]|[島田市の「ばらの丘公園」PR動画の作り方。][link-18]|
|8|[Vtuberで学校紹介！][link-8]|[動画を作るために使用したソフトやキャラクターの作成についての説明][link-19]|
|9|[島田観光地紹介！！][link-9]|[島田市大井川鉄道の紹介動画作成の過程について][link-20]|
|10|[ペットと一緒に遊ぼう！！][link-10]|[島田市ペット施設紹介動画の作成過程について][link-21]|

[link-1]:https://qiita.com/mukoujima/private/dcf3381f1a24a6f4da2d
[link-2]:https://qiita.com/t-tsan/private/4e79dbb3e3c03d473555
[link-3]:https://qiita.com/daiki-mori/private/55870201f27c6ea993a5
[link-4]:https://qiita.com/sora-yamada/private/0e7c241cda9e70d6ed3d
[link-5]:https://qiita.com/sato_imo/private/f657b56382eabf5db614
[link-6]:https://qiita.com/yuuga01/private/f0de43f27fd20551c034
[link-7]:https://qiita.com/kokoa01suzuki/private/70210e75263d0a566fcb
[link-8]:https://qiita.com/knightjack/private/f98b6676e056588b1388
[link-9]:https://qiita.com/riko01cyousokabe/private/d81aefe0648478273237
[link-10]:https://qiita.com/harashina/private/290c188d96fdbb087a3c

[link-12]:https://youtu.be/6cqn9jiLPq4
[link-13]:https://youtu.be/NB7xxCBoi_A
[link-14]:https://youtu.be/bMcsOw9opH4
[link-15]:https://youtu.be/2qV4fVNEUIs
[link-16]:https://youtu.be/rRxF9vZfp4E 
[link-17]:https://youtu.be/_xolNJXpFnA
[link-18]:https://youtu.be/BgV0Yj_LBOE
[link-19]:https://youtu.be/Ah3kDdeoWEs
[link-20]:https://youtu.be/R00ncxe60wI
[link-21]:https://youtu.be/HT-kyeLTh8E



#4．その他

静岡県立島田商業高校　こちら[クリック][link-11]
[link-11]:http://www.edu.pref.shizuoka.jp/shimada-ch/home.nsf/IndexFormView?OpenView
【javascript】コールバック関数と非同期処理

# case

以下の順番でコンソールに出力したいができない。
1. `fn a done`
2. `task1 done`
3. `fn b done`

```js

function a() {
  setTimeout(function task1() { 
    console.log('task1 done');
  });

  console.log('fn a done');
}

function b() {
  console.log('fn b done');
}

a();

b();

//出力結果
>>> fn a done
>>> fn b done
>>> task1 done
```

なぜできないのか？

* 関数aに登録されているsetTimeoutは非同期処理となるため、タスクキューに登録される。
* 関数aコンテキストが終了後にコールスタックに関数bが登録される。
* よってコールスタックに登録されている、関数a内の`fn a done`と関数bの`fn b done`が実行されてからタスクキューからコールスタックに登録される。すなわち最後に出力されることになる。
* ※ちなみに、setTimeoutの第二引数に時間を設定していないが、非同期処理となるため、自動的にコールスタック後に出力されることになる。

### ソリューション

* 関数aにsetTimeoutのtask1関数ないで関数bを登録することで解決できる。

```js
function a() {
  setTimeout(function task1() { 
    console.log('task1 done');
    b();
  });

  console.log('fn a done');
}

function b() {
  console.log('fn b done');
}

a();

>>> fn a done
>>> task1 done
>>> fn b done
```


#### tips
このような処理をすることで、特定の非同期処理の後に任意の処理を追加することができる。
【JavaScript】モジュール①　import と export


#はじめに

Udemyの[【JS】ガチで学びたい人のためのJavaScriptメカニズム](https://www.udemy.com/course/javascript-essence/)の講座の振り返りです。

前回の記事

https://qiita.com/nao0725/items/d93f67db6fab4b195bbe


#目的

* モジュールについての理解を深める

#本題
###1. ES Modules と CommonJS

**モジュール**とはソースコードを機能ごとに分割して、メンテナンスしやすくする仕組み。
→ 代表的なものにES Modules（ESM）と CommonJS（CJS）がある

####CommonJS

* Node.js上でモジュールを管理する仕組み
* requireやexportsというキーワードをつかってモジュールを読み込み、外部サイトへの露出を行う
* 拡張子は.cjs

####ES Modules

* ブラウザ上でECMAScriptを元にモジュールを管理する
* import, exportを使って読み込み、外部サイトへの露出を行う
* .mjsという拡張子を使う

###2.import と export

import:モジュールの読み込みに使用

export:モジュールの露出に使用

####例1

**前提**
index.htmlファイルでmoduleBを読み込んでいる状態

````index.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        const span = document.createElement('span');
        span.textContent = decodeURI(window.location.pathname);
        document.body.appendChild(span);
    </script>
    <h1>編集用ファイル</h1>
    <a href="../end" style="font-weight: 600; color: red;">
        完成ファイルへ
    </a>

    <div>
        <a href="../../" style="margin-right: 10px;">
            セクションへ
        </a>
    
        <a href="../../../">
            コースへ
        </a>
    </div>
    <script type="module" src="moduleB.js"></script>
</body>
</html>
`````

moduleAにmoduleBで使う変数や関数を定義する

````moduleA.js
// 変数publicValは0と定義
export let publicVal = 0;
// 関数publicFnを定義
export function publicFn(){
  console.log(`publicFn called: `)
}
````

上記内容をmoduleBで使用する

`````moduleB.js
// moduleAの読み込みを行う
// from以下で読み込むファイルを指定する
import { publicVal, publicFn } from "./moduleA.js";
// 0と出力される
console.log(publicVal);
// publicFn calledと出力される
publicFn();
`````

####例2

読み込み先で名前を変更
moduleAは変わらず

````moduleB.js
// asを使用してこのファイル内でのみ使用できる名前にする
import { publicVal as val, publicFn as fn } from "./moduleA.js";
// asに合わせて名前を変更
console.log(val);
fn();
// 出力結果は変わらない
````

####例3

defaultを使って書く場合

````moduleA.js
export let publicVal = 0;
export function publicFn(){
  console.log(`publicFn called: `)
}
// defaultを露出
export default 1;
````

```moduleB.js
// defaultを使って書く場合は{}をつけない
// defaultを使う場合は変数をimportの後に準備
import defaultVal, 
{ publicVal as val, publicFn as fn } from "./moduleA.js";
console.log(val);
// 出力結果は1となる
console.log(defaultVal);
fn();
``````

####例4

moduleAを全体取得した場合

moduleBを変更する

````moduleB.js
// *をつけるとmoduleAの変数関数がexportされる
import * as moduleA from "./moduleA.js";
console.log(moduleA);

// 上記のようにすると以下の出力結果からmoduleAがファイルの内容を取得していることがわかる
// default: (...)
// publicFn: (...)
// publicVal: (...)
``````



今日はここまで！

#参考にさせて頂いた記事

* [【JS】ガチで学びたい人のためのJavaScriptメカニズム](https://www.udemy.com/course/javascript-essence/)
* [Let'sプログラミング JavaScript入門](https://www.javadrive.jp/javascript/)
PowerShellで一行が長いので見通しを良くする

PowerShellでなんか書くとどんどん一行が長くなって右へ突き抜けていく。必須パラメータを２つ３つ書いただけで軽く120文字突破してウガーである。
目が滑るし直しづらいし３日後見たとき発狂するので、見通しを良くしたい。

この記事で使うために書いたコード自体の参考元はこちらの記事。
[Elasticsearchのバックアップ方法について解説します。（スナップショット、リストア）](https://kohei.life/elasticsearch-backup/)



# 何のコードか
Elasticsearchのバックアップ設定のため、まずバックアップ先を指定する手順。APIへJSONを投げ設定する。


# いろんな書き方

## ワンライナー
ワンライナーだとこんなの。読みづらいですね。コピペもコピペ改変もしづらい。

```powershell:ワンライナーで
# スナップショットリポジトリ登録
Invoke-RestMethod -Method Post -ContentType "application/json" -Uri "http://localhost:9200/_snapshot/my_backup" -Body '{"type":"fs","settings":{"location":"my_backup_location","compress":"true"}}'
```



## ヒアドキュメント

Bodyパラメータ（JSON）をヒアドキュメントにする。Curlでよく書くやつと似た感じになる。
後から見たり変えたりするのは主にBodyで、Method・ContentTypeを変えることはあんまないだろうから、簡単なのはこの書き方。ワンライナーと記述順変わらないからわかりやすいし。

```powershell:ヒアドキュメントで
# スナップショットリポジトリ登録
Invoke-RestMethod -Method Post -ContentType "application/json" -Uri "http://localhost:9200/_snapshot/my_backup" -Body @'
{
    "type": "fs",
    "settings": {
        "location": "my_backup_location",
        "compress": "true"
    }
}
'@
```

## スプラッティング

スプラッティング(Splatting)による書き方。
パラメータを連想配列にしてコマンドレットに渡す。
詳細については MS docs の about_Splatting を読め。
一番好きな書き方はこれ。

```powershell:スプラッティングで
# スナップショットリポジトリ登録
$Json = @'
{
    "type": "fs",
    "settings": {
        "location": "my_backup_location",
        "compress": "true"
    }
}
'@

$Api = "http://localhost:9200/_snapshot/my_backup"

$Param = @{
  Method      = "Post"
  ContentType = "application/json"
  Uri         = $Api
  Body        = $Json
}

Invoke-RestMethod @Param
```

この書き方の欠点は、エディタの支援を受けづらいこと。最初からこれで書こうとするとPowerShell ISE も VSCode も支援してくれない（できない）。書いてからスプラッティングに変える手間がかかってしまう。あれこれ模索する段階ではやらず、形になってから（後々メンテする自分のために）形を変えるようにしている。

また、記述がデータやパラメータから始まるので、一見したときどこから何が始まっているのかわかりづらいことも欠点。適切にコメントをつけて1年後に読む自分に親切にしたい。

## 改行文字 ` を使う

使える箇所と使えない箇所のルールがよくわからない。不可解なことが多いので使わないことにしている。
A.CSVファイル読み込みの文字化けを防ぐ

# 回答編の前に

さて，よくあるcsvファイル読み込みのバグを防ぐ方法ですが，まず読み込む前に確認すべきことは「ファイルがあるかどうか」です。
アホみたいなことをいうな，と思うかもしれませんが，その段階で質問されることも少なくありません。

```
file(filename, "r", encoding = encoding) でエラー:
   コネクションを開くことができません
 追加情報:  警告メッセージ:
 file(filename, "r", encoding = encoding) で:
   ファイル 'foo.csv' を開くことができません: No such file or directory
```

確認すべきは，「プロジェクトを開いているか」，「プロジェクトフォルダの中に当該ファイルはあるか」，「ファイル名のミススペルはないか」です。
**プロジェクトってなんだ**という人は，RStudioの基本のキですから，ググってそこはなんとかしてくださいw
説明してくれるサイトも色々あるので，それはそちらを参照してもらうとして。

要するに，Rが今見ているフォルダの場所を固定する方法です。プロジェクトを開くと，プロジェクトフォルダが「今見ているフォルダ（ワーキングディレクトリ）」になりますので，その中のファイルを参照することになります。

# 関数の種類に注意

csvファイルを読み込む関数といえば，`read.csv`だろう，という人もいると思いますが，私はtidyverseパッケージを積極的に使っていきたいので，`read_csv`関数をおすすめしています。
よく見てね。ピリオドで区切っているのと，アンダースコアで区切っているという違いがあるからね。

## read_csvを使っている場合

`read_csv`関数は，tidyverseパッケージの呼び込むreadrパッケージが，csvファイルの読み込みに一役買っています。
文字化けの原因は，たとえばUTF-8形式で提供されているファイルを，Windows標準のCP932形式で読み込もうとする，という文字コードの不一致です。
ですからそれをオプションで指定してあげればOK.

localeオプションで，locale関数のencodingを明示的にUTF-8としてやれば，文字化けなく読み込めると思います。

```R:
read_csv("foo.csv", locale=locale(encoding = "UTF-8"))
```

## read.csvを使っている場合

`read.csv`関数は，Rの基本関数なので特別なパッケージを読み込まなくても使えるという意味で，便利で普遍的なのかもしれません。
文字化けが起きるとき，その原因は同じですから，文字コードをオプションで指定してあげればOK.

```R:
read.csv("foo.csv",fileEncoding="UTF-8")
```
とすれば読み込めます。



こんな感じで，自分のTips,こんなバグをこうやって解決したよ，というような話を，よろしければ皆さんもお寄せください。
[出題編はこちらです。](https://qiita.com/advent-calendar/2021/r_tips_attack25_q)
あるいは「こちらの解法のほうが美しいぞ」というのがありましたら，コメントいただけると幸いです。
MySQL CONCATでNULLがあると結合できない

##前置き
仕事である特定の文言をあるカラムに追加してほしいと言われ、
大量にデータがあったため、UPDATE文でアップデートすることに。

そのカラムには既に文言が入っている場合もあり、文言が入っていた場合は活かしてほしいとのことだったので、
CONCATを使って文字を結合することで対応をしました。

##CONCATの使い方
```SQL
UPDATE テーブル名 SET カラム名 = CONCAT('追加する文言' , カラム名) WHERE id = 1;
```
※CONCAT()内のカラム名は既に入っている文言を引っ張ることができます。

このSQLでテーブルは下記のように更新されます。

|id|カラム名|
|:|:|
|1|'追加する文言''元々入っている文言'|
<br>
分かりやすく説明すると、
例えば、ある人がランチで食べたメニューのデータベースがあるとします。

|日付|メニュー|
|:|:|
|11/15|ラーメン|
|11/18|ラーメン|
|11/19|ラーメン|
|11/24|ラーメン|

やっぱり何のラーメンか付けておけばよかった～という時、
下記のようにCONCATを使えば、何のラーメンだったか追加することが出来ます。

```SQL
UPDATE ランチメニュー SET メニュー = CONCAT('醤油' , メニュー) WHERE 日付 = '11/15';
UPDATE ランチメニュー SET メニュー = CONCAT('二郎系' , メニュー) WHERE 日付 = '11/18';
UPDATE ランチメニュー SET メニュー = CONCAT('塩' , メニュー) WHERE 日付 = '11/19';
UPDATE ランチメニュー SET メニュー = CONCAT('家系' , メニュー) WHERE 日付 = '11/24';
```

|日付|メニュー|
|:|:|
|11/15|醤油ラーメン|
|11/18|二郎系ラーメン|
|11/19|塩ラーメン|
|11/24|家系ラーメン|

二郎系の翌日はさっぱりとした塩に限りますね。。



##カラムがNULLだった場合は…？
話は戻りますが、
今回、私はUPDATEしたいカラムがNULLだった場合を考慮せずUPDATEかけたところ、
NULLだったカラムには追加する文言が入るどころか、NULLのままになってました。

CONCATは引数のどちらかにNULLが入っていた場合はNULLを返すようです。

__やっちまったぜ__
<br>
そんな時はCOALESCE を使ってNULLを空文字に変換すれば文字の結合が可能です！

##COALESCEの使い方
```sql
UPDATE テーブル名 SET カラム名 = CONCAT('追加する文言' , COALESCE(カラム名, '')) WHERE id = 1;
```

これでカラムがNULLの場合は、空文字を返し文字を結合するため、追加したい文言だけ追加される形となります。
Reactでモーダル背景固定用CustomHooks

# モーダルで背景を固定したい時のCustomHooks

## CustomHook

```react
import { useEffect, useState } from "react";

export const useScrollLock = (isLock: boolean): void => {
  const [scrollY, setScrollY] = useState(0);

  useEffect(() => {
    if (isLock) {
      const y = window.scrollY;
      setScrollY(y);
      document.body.style.position = "fixed";
      document.body.style.top = `-${y}px`;
      document.body.style.height = "auto";
    } else {
      document.body.style.position = "";
      document.body.style.top = "";
      document.body.style.height = "";
      window.scrollTo(0, scrollY);
    }
  }, [isLock]);
};
```

## 使用例

```react
export const Modal = (props: Props) => {
  useScrollLock(props.isOpen);

  // 省略
}
```
Argo workflowのpodspecpatchを使ってコンテナのリソースを変数化した



# podspecpatch
> PodSpecPatch holds strategic merge patch to apply against the pod spec. Allows parameterization of container fields which are not strings (e.g. resource limits).

https://argoproj.github.io/argo-workflows/fields/

使い方はここを参考にするとよさそう


https://github.com/argoproj/argo-workflows/blob/master/examples/pod-spec-patch-wf-tmpl.yaml

# やりたいこと
podごとにリソースを指定して実行したい。

# どうやったか
```
①workflow.yaml
└②dag-template.yaml
  └③container.yaml
```
私はこんなかんじで、①ワークフロー部、②dagを管理するテンプレート、③コンテナのテンプレートの3つにyamlを分けています。

③のcontainer.yamlから説明します。
spec.templates.podSpecPatchにこのように記述します。その際にinputs.parametersも記述するのも忘れずに。

```yaml:③container.yaml
apiVersion: argoproj.io/v1alpha1
kind: WorkflowTemplate
metadata:
  name: pod-spec-patch-whalesay
spec:
  templates:
  - name: whalesay
    inputs:
      parameters:
      - name: MEMORY
      - name: CPU
      - name: MESSAGE
    podSpecPatch: |
      containers:
      - name: main
        resources:
          limits:
            memory: "{{inputs.parameters.MEMORY}}"
            cpu: "{{inputs.parameters.CPU}}"
    container:
      image: docker/whalesay:latest
      command: [cowsay]
      args: ["{{inputs.parameters.MESSAGE}}"]
```

②dag-template.yamlは③のcontainer.yamlにあるpod-spec-patch-whalesayのテンプレートを呼びだして、MEMORY・CPU・MESSAGEの変数を渡します。

```yaml:②dag-template.yaml
apiVersion: argoproj.io/v1alpha1
kind: WorkflowTemplate
metadata:
  name: dag-whalesay
spec:
  templates:
  - name: diamond
    dag:
      tasks:
      - name: whalesay
        templateRef:
          name: pod-spec-patch-whalesay
          template: whalesay
        arguments:
          parameters:
          - { name: MEMORY,  value: "{{item.MEMORY}}" }
          - { name: CPU,     value: "{{item.CPU}}" }
          - { name: MESSAGE, value: "{{item.MESSAGE}}" }
        withItems:
        - { MEMORY: 100Mi, CPU: 100m, MESSAGE: 'hello1'}
        - { MEMORY: 200Mi, CPU: 200m, MESSAGE: 'hello2'}
        - { MEMORY: 500Mi, CPU: 500m, MESSAGE: 'hello3'}
```


あとはdagを呼び出すだけ。

```yaml:①workflow.yaml
apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:
  generateName: dag-whalesay-
spec:
  entrypoint: diamond
  workflowTemplateRef:
    name: dag-whalesay
```

実行結果とかは特にのせませんが、これでpodごとのリソースを細かく指定できました。sprigとかと組み合わせるのもありですね。
Q.CSVファイル読み込みの文字化けを防ぐ

# 文字化け問題！

たぶん私が今年，学生から受けた質問の中で一番多かったのがこれです。
授業でR/Rstudioを使っているのですが，データファイルを提供しても読み込みの段階で文字化けする，という質問が一番多かったです。
それのせいで，私はWindowsマシンが大嫌いになりました。

だってそうですよね，こちらはスタンダードなUTF-8形式でデータは提供しているんですから。

おっと，いきなり愚痴のようになってしまった。
さて，このトラブル・質問にどのように対応・回答すれば良いでしょうか。

[解答編はこちら。](https://qiita.com/advent-calendar/2021/r_tips_attack25_ans)
rbenv global を出力してもversionが切り替わらない！

##背景
AWSへのデプロイ中に
EDITOR=vim bin/rails credentials:editをしたらversionが古いと言われたので

```
bundle install 
```

を実行すると

```
ERROR:  While executing gem ... (Gem::FilePermissionError)
    You don't have write permissions for the /Library/Ruby/Gems/2.3.0 directory.
```

訳: 許可がありません（ざっくり）
と言われました。

https://qiita.com/iron-smri/items/9300ccd5a59dc0fdf0ae


↑の記事を見ると、これが起こる原因はrbenvのversionがデフォルトのシステムを使っていて権限がないからエラーになると聞いたので、確かめてみるとシステムのversionを使っていました。

そこでGemfileに記載されているrubyのversion3.0.2をセットしようと

```
rbenv global 3.0.2
```

を実行したが、できず、rubyの参照先や実行パスを通してみたもののversionを切り替えることができなかった。

##いきなり結論

```
rbenv local 3.0.2
```
と出力すると、すんなりversion切り替えができました。
rbenv globalとrbenv localの違いは、rbenvが開発する時のデフォルトのrubyのversionを指定するのがglobalであり、特定のディレクトリ下のみのrubyのversionを指定するのがlocalでした。覚えてないですが、おそらく以前にlocalでversionを指定しまったのでしょう…。
nvm: install v14 failed!

## 環境
m1
maxOS Monterey 12.0.1
## 課題

```
nvm i v14
```
をしたら

```
nvm: install v14 failed!
```
というエラーが出た。

## 解決方法

```
nvm i v15
```

Apple siliconは v14以下だとエラーになるらしいので、v15以上をインストールする

https://github.com/nvm-sh/nvm/issues/2350
【javascript】非同期処理/タスクキューとコールスタック

#コールスタック
* 実行中のコードがたどってきたコンテキストの積み重ね。
* スタックの仕組みを「後入れ先出し」という。
    * 英語：LIFO（Last In, First out）

## case

```js

function a() {
}
function b() {
    a();
}
function c() {
    b();
}
c();
```

上記のケースでどのようにコンテキストが生成され積み重なるのか見てみる。


* コールスタック(コンテキストの積み重ね。)
    * a関数コンテキスト =>実行中コンテキスト
    * b関数コンテキスト
    * c関数コンテキスト
    * グローバルコンテキスト（関数が呼ばれるまえに生成される。）
* **※一番上に積み重ねられているのが実行中のコンテキストになる。**
* 実行されたものからcall Stackからなくなっていく。
* **今回のケースはa()関数が最後に入り、最初に出ていくことになる。**
* **すなわち「後入れ先出し」。**

※画面右下のCall Stackに注目。

* anonymousはグローバルコンテキストのこと。
![ezgif.com-gif-maker (2).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/378066/11c06722-5312-8e7f-182b-4e023824fd4e.gif)


# タスクキュー

* **実行待ち**の非同期処理の行列。
* 以下のようなキューの仕組みを「先入れ先出し」という。
    * 英語：FIFO(First In, First Out)
    * キューに入ってきたものから処理を進めていく。


```
タスクE
↓
タスクをキューの中で非同期処理の実行順を管理している。
ーーーーーーーー　　　　　　
| キュー      |
|   タスクD   |
|   タスクC   |
|   タスクB   |
ーーーーーーーー
↓
タスクA
```

## case

```js

const btn = document.querySelector('button');
btn.addEventListener('click', function task2() {
    console.log('task2 done');
});

function a() {
    setTimeout(function task1() {
        console.log('task1 done');
    }, 4000);

    const startTime = new Date();
    while (new Date() - startTime < 5000);

    console.log('fn a done');
}

a();

```
### 上記のコードの説明
* a関数を実行
    * するとwhile文がメインスレッドを５秒間占有する。

```js
while (new Date() - startTime < 5000);
```

* その間にクリックイベントを発火させる。

```js
btn.addEventListener('click', function task2() {
    console.log('task2 done');
```

* 5秒後にa関数の`fn a done`　が表示され
* クリックイベントの`task2 done`が表示され
* 最後にa関数内のsetTimeoutの`task1 done`が表示される仕組みになっている。

### タスクキューとコールスタックの関係はどうなっているのか？
※テキストで読みずらいいと思います。時間がある時に図解にします。

* 登場人物
    * コールスタック
    * タスクキュー
    * イベントループ
        * イベントループはコールスタックにコンテキストが積まれているかを監視をして、タスクキューに伝えている。


1. コールスタック
    1. グローバルコンテキストが設置される。
        1. グローバルコンテキストにはのちに実行される非同期処理のクリックイベント（task2）が準備されている。
    1. その後a関数がコンテキストに追加され5秒間メインスレッドを占有する。
        1. a関数にはのちに実行される非同期処理のsetTimeout（task1 done）が準備されている。
1. イベントループはこの時、「コールスタックは埋まっている」ことをタスクキューに伝えている。
1. タスクキュー
    1. クリックイベントである、`task2 done`をセット
    1. a関数内の`setTimeout（task1 done）`をセット
1. コールスタック
    1. a関数コンテキストが終了しコールスタックから削除
    1. グローバルコンテキストが終了しコールスタックから削除
1. イベントループ
    1. コールスタックが空になったことをタスクキューに通知
1. タスクキュー
    1. セットされていた、クリックイベント、setTimeoutを登録した順番でコールスタックにセットする。

![ezgif.com-gif-maker (3).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/378066/ed1513b2-b2cd-0640-3aef-6f2d2f973fd7.gif)
【図解解説】JOI2021-2022 一次予選 第3回 問題3 運動会

## 図解解説シリーズ
競技プログラミングを始めたばかりでAtCoderの解説やJOIの解説ではいまいちピンと来ない…という人向けに、図解を用いて解説を行います。

## 問題文
### 情報オリンピック日本委員会に掲載されている問題

https://www.ioi-jp.org/joi/2021/2022-yo1/2022-yo1c-t3.html

### AtCoderに掲載されている問題
入出力など実際に確認して自分の作成したプログラムを採点することができます。

https://atcoder.jp/contests/joi2022yo1c/tasks/joi2022_yo1c_c

## 図解解説
今年度の一次予選のC問題は、以下の４つのスキルを確認する問題になっています。
１．入力・出力を正しく利用できる
２．算術演算子を正しく利用できる
３．条件分岐（if）を正しく利用できる
４．繰り返し処理を正しく利用できる

問題文を整理するために、具体的な数字を用いて、図示して考えてみます。
![スライド1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2211017/bc9a8fc4-ed91-d557-407e-be30f7014003.png)
Pythonでの文字列は、1文字ごとに先頭から0,1,2,3,…と番号が割り当てられています。したがって、先頭の文字は「変数名[0]」と指定して取り出すことができます。この仕組みを利用して、文字列の先頭から1文字ずつ順番にRと一致するか確認し、Rの個数を数え上げていきます。

最終的にRの個数が、赤組の人数と一致するかどうか確認し、一致する場合は赤組の枠が全部埋まっているので葵さんは白組、一致しない場合は赤組の枠が余っているので葵さんは赤組になります。

## 解答例
### 解説で説明した解答例

```c1.py
N = int(input())
K = int(input())
S = str(input())
#赤組を示すRの個数を数えるための変数(aka)を用意して、文字列(S)の先頭からRの個数を数えます
#文字列Sの長さはN-1（葵さんの組み分けデータがないため）である点に注意が必要です
aka = 0
for i in range(N-1):
  if S[i]=='R':
    aka += 1
#赤組の個数(aka)と赤組の人数(K)が同じだったら葵さんは白組、違ったら赤組を表示します
if aka==K:
  print('W')
else:
  print('R')
```
[採点サイトに提出したプログラム](https://atcoder.jp/contests/joi2022yo1c/submissions/27495519)

### Pythonの機能を使った例
効果的に機能を活用すると、アルゴリズムを簡単にすることができます。

```c2.py
N = int(input())
K = int(input())
S = str(input())
#文字列Sの中に含まれる赤組Rの数を数え、
#赤組の人数(K)と同じだったら葵さんは白組、違ったら赤組を表示します
if S.count('R')==K:
  print('W')
else:
  print('R')
```
[採点サイトに提出したプログラム](https://atcoder.jp/contests/joi2022yo1c/submissions/27495547)

## イラスト
スライド内で使用しているイラストはすべて「[いらすとや](https://www.irasutoya.com/)」の素材を利用しています。
AWS SAAの個人的な勉強方法

AWS SAAを昨年3月に取得しました。その際の勉強方法について記載します。
クラウドを知りたいと思い、1年位だらだらと勉強はしていたのですが2回の不合格を経験し、一念発起して取り組みました。
結果3ヶ月で過去の1年間を無かったことにするくらいの知識を身につけられました。

# 勉強教材リスト
## **Udemy**

[AWS 認定ソリューションアーキテクト アソシエイト模擬試験問題集（6回分390問）](https://www.udemy.com/course/aws-knan/)
ブラックフライデーセール時に1,200円くらいで購入しました。
この問題集は特に難しくSAPの範囲も余裕で出てくるし、複数選択問題の割合が多く不正解になりやすいです。初回は正解率30%位しか取れませんでした。
しかし、演習テストをしていくうちに問題の勘所や何が足りないのかを掴めていけるので、めちゃくちゃ力が付きます。演習テストは全6回あり、それぞれ3周ぐらいしたところで、正解率がほぼ75%超えることが出来ました。
実際の試験もこの問題集レベルが出てくると思っていたのに、出てこず逆にこれでいいの？となるくらいでした。
実務ではSAA試験範囲外の仕事を振られることも多くあるので、やっておいて損はないです。
私は実務中に "これUdemyでやったとこだ" ってなってました。

## 対策本

[徹底攻略 AWS認定 ソリューションアーキテクト − アソシエイト教科書](https://www.amazon.co.jp/dp/4295010650/ref=cm_sw_em_r_mt_dp_NKSP0FZKEZE7WYNVB5ZB)
試験受けるぞと思った時に購入しました。1通り読んで、付属の模擬問題を解いてました。模擬問題は実際の試験よりも優しい印象です。この本だけだと試験時に分からない単語が出てくると思います。

## AWS BlackBelt

[AWS サービス別資料](https://aws.amazon.com/jp/aws-jp-introduction/aws-jp-webinar-service-cut/)
試験要項を読みSAA対象サービスのスライドを読みました。電車通勤時は立ちっぱで、本が出せないのでスマホにPDFを入れて読んでました。（2021/11/26現在: 徹底攻略の電子書籍版も出ているようです）
サービスの概要だけでなく最新のアップデートもあり情報収集にも役立ちました。

# やったこと

●勉強時間にコストをかける
家での勉強だとすぐにスマホに手が伸びてしまうので、無駄な時間ばかり過ごしてました。なので、家では勉強しないと割り切り、外で勉強するようにしました。その際、必ず飲み物を購入してました。
購入＝コスト＝財布ダメージとなるので、時間に対する費用を無意識に刻み、集中力にブーストをかけてました。
昨今のウイルス事情で外出が難しいときもありますが、個人的にはめちゃくちゃおすすめです。

●紙とペン
私は読むだけではすぐに抜けてしまうので、手を動かして勉強しています。また、問題文が無駄に長いので要約の練習にもなりました。
手書きゆえに1問にかける時間がかかってしまいますが、個人的にはベストな方法でした。

●1問でも取り組めたら最強
自分を徹底的に甘やかします。仕事の帰りが遅い時、子どもがなかなか寝てくれない時、家事が溜まっている時、etc... 勉強時間が取れないことはよくあります。しかし、継続は力なりです。毎日1問もしくは問題を読むだけでも確実に力はついて行きます。辞めなければ正義です。

●合格記事は見ない
Twitter、Qiita、etc...には "勉強○日で合格" とか "〜に合格して○冠達成" みたいな投稿があります。私はこういう投稿を見ると "自分がもっと出来たる人だったら" とネガティブに考えてしまうので、シャットダウンするようにしています。不合格時は特にすごく落ち込むので普段から切り離しておくのがベターです。

# おわりに
たとえ不合格となっても正解率分の知識は身についています。継続は力なりです！
頑張りましょう！

# 参考
コーヒー代
- マクドナルド: Sサイズ 100円
- ドトールコーヒー: ホットS 224円
- スターバックス: ドリップ Short 319円
- ペットボトル(自販機): 160円
[JavaScript] HTMLを動的に作成する方法

JavaScriptからHTML要素を動的に生成する方法についてまとめておく。

# HTMLを動的に作成する方法
HTMLを動的に作成するには、```createElement()```を使用する。これを使用することで、任意のタグのHTML要素を作成することができる。
```createElement()```からは新しいElementが返される。```createElement()```の書き方は以下となる。

```javascript
const element = document.createElement(<タグ>)

// imgタグを生成する場合
const element = document.createElement("img")
```
次に作成したHTML要素を任意の場所に追加するためには、```appendChild()```を使用する。
```appendChild()```は、指定された親要素の中に作成した要素を追加する。

```javascript
<親要素>.appendChild(<作成したHTML要素>)
```

# 実装
JavaScriptからHTMLのimgタグを動的に作成する場合は以下のように書ける。

```javascript
// 親要素の取得
const parentElement = document.getElementById("image");
// 新しいHTML要素の作成
const newElement = document.createElement("img");
newElement.src = "./sample.png";
// 作成したHTML要素を追加
parentElement.appendChild(newElement)
```
【ポケモンBDSP】ポケッチの電卓をWebアプリで再現しようとしたら、バグまで再現してしまった話

# ポケッチの電卓でバグ！？

この記事を書いた1週間前の2021年11月19日に、『ポケットモンスター ブリリアントダイヤモンド・シャイニングパール』(ポケモンBDSP)が発売されました！このゲームは特にバグが多い作品として盛り上がっていて、連日様々なバグ発見のツイートを見てきました。

そんな中、以下のツイートを見つけました。

https://twitter.com/ThePrawn101/status/1462165614064136196

ゲーム内に登場するスマートウォッチのようなアイテム「ポケッチ」の電卓アプリで計算をしている様子の動画ですが、
なんと**9＋10＝21**となっています。

※これが本当にバグなのか、動画を編集したフェイクなのかは分かりません。

電卓を作るのはそこまで難しいイメージはなく、バグが出るのはかなり意外だったので、電卓の作り方に興味が湧いてきました。
私は今までカウンターやタイマー等のWebアプリを作ってきましたが、電卓を作ったことがなかったので一度作ってみようと思いました。

# 自分で電卓を作ってみた

今回はポケッチの電卓と同じような動作をする簡単なWebアプリを作ってみました。
小数点の入力と四則演算ができます。(「*」と「/」はそれぞれ「×」と「÷」として扱います)

使用技術はNext.js(React) + TypeScriptです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1183281/cec2c3d5-d38a-4b19-8be7-2c3d594a56ec.png)

↓こちらからアクセスできます

http://simple-calculator-phi.vercel.app/

↓ソースコードはこちらです

https://github.com/ToshihiroWatanabe/simple-calculator

ゲーム内のポケッチの電卓では、数値は10桁[^1]までしか表示できないため、計算結果が99億9999万9999を超える場合は、「??????????」と表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1183281/1a860143-accb-a572-9eac-9110f8a593bc.png)

私の電卓でもこれを再現するために、10桁を超える数値を表示しようとすると、代わりに「??????????」と表示されるようにしています。

```tsx:index.tsx(数値の表示部分)
<input
          type="text"
          defaultValue={
            String(outputValue).length > MAX_DIGIT ? "??????????" : outputValue
          }
          size={10}
          style={{ textAlign: "right" }}
        ></input>
```

他人の電卓のコードを参考にせずに自分で考えながら作ったので、制作に2時間くらいかかりました。

# 新たなバグの判明

自分で電卓を作った翌日に、以下の記事を見つけました。

https://pk-mn.com/n/pokemon-diamond-pearl-remake-dentaku-bug-9-10-21-neta/

https://automaton-media.com/articles/newsjp/20211125-183624/

記事によると、ポケモンBDSPをドイツ語またはフランス語でプレイしている際に、ポケッチの電卓の挙動がおかしくなるそうです。
その例として、[510÷252の計算結果が「??????????」になる](https://www.twitch.tv/maitrearmand/clip/EagerOddPidgeonNotATK-a6TgalAe5tTtYIii)というものがあります。

まさかとは思い、自分の電卓でも510÷252を試してみると...

![510÷252.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1183281/6e3031f5-e699-1268-c491-11cdf6ddca39.gif)

「??????????」が表示されてしまいました😨

510÷252の正確な答えは「2.0238095238095...」で、割り切れない循環小数になります。
したがって、1÷3=0.3333...も同様に「??????????」と表示されてしまいます。

本来「??????????」が表示されるパターンとしては、計算結果が大きすぎる数(100億以上)、あるいは小さすぎる(負が大きい)数(-10億以下)になった場合が想定されていたと思います。
しかし、ポケモンBDSPのドイツ語・フランス語のポケッチの電卓と私の電卓では、計算結果が大きすぎたり小さすぎたりしなくても、小数点以下を含めた桁数が多いと「??????????」と表示されてしまっています。

ちなみにポケモンBDSPにはリメイク前の作品『ポケットモンスター ダイヤモンド・パール』がありますが、そちらの日本語版のポケッチの電卓では510÷252の計算結果が「2.02380952」と表示されていて、10桁になるように小数第九位の「3」以下が切り捨てられていることが分かります。

よって、この不具合の対策としては、計算結果が小数の場合に、10桁で表示できるように小数を切り捨てる処理を入れるべきでした。

また、上記のAUTOMATONの記事によると、ドイツ語とフランス語では小数点表記にピリオド(.)ではなくカンマ(,)が使われることが原因ではないかと考察した人がいるそうです。

これらを踏まえてポケモンBDSPの電卓のバグの原因を詳細に考察すると、
「**計算結果が小数の場合は10桁以下になるように切り捨てられるはずだが、計算結果が小数かどうかはピリオド（.）の有無で判定しているため、小数点がカンマ（,）であるドイツ語やフランス語では小数切り捨ての処理が行われない**」
と考えられます。

[^1]: 正確には10桁ではなく10文字。マイナス記号や小数点も1文字としてカウントされる。
tqdmのプログレスバー長すぎィ！！（長さ変更）

# 長すぎるだろ…
![too_long_tqdm.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/580613/9a20c26e-7bf2-238f-1b9b-00fa58d230b0.png)

# 短くします
[参考：GitHub Issue #585](https://github.com/tqdm/tqdm/issues/585)

```python
for file_name in tqdm(files):
    # 何らかの処理
```

↓

```python
# tqdm's bar_format
short_progress_bar="{l_bar}{bar:10}{r_bar}{bar:-10b}"

for file_name in tqdm(files, bar_format=short_progress_bar):
    # 何らかの処理
```

# 結果
Yeah! That's exactly what I've been wanting PROGRESS BAR!!!
![shot_tqdm.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/580613/bebc18e4-8851-e70a-c6b3-6ae991771b3b.png)
【Python】プライバシーエラー'NET::ERR_CERT_DATE_INVALID'が表示されるサイトをWebスクレイピングする方法

#概要

2021/10/1以降，古いMac環境 (OS X 10.11 El Capitan以前) やWindows 7以前にてWebサイトにアクセスした際，SSL証明書『Let's Encrypt』を利用したサイトにおいて以下の画像の様なSSL証明書のプライバシーエラー`NET::ERR_CERT_DATE_INVALID`が表示されるようになった．

何らかの事情により古い環境でスクレイピングを行わなければならない場合，エラーが発生してしまうので対処法を記述する．

![ssl_error.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478088/191da3ab-9bf9-26f6-6a47-fa9ef05226d4.png)

# urllibを使用してWebスクレイピングする場合の対処法

スクリプト内に下記のコードを追記する．

```python
import ssl
ssl._create_default_https_context = ssl._create_unverified_context
```

# Seleniumを使用してWebスクレイピングする場合の対処法1

スクリプト内`options.add_argument('--headless')`の次の行に下記のコードを追記する．

```python
# SSLエラーを許容するオプション
options.add_argument('--ignore-certificate-errors')
```

# Seleniumを使用してWebスクレイピングする場合の対処法2 (スマートでないため非推奨)

スクリプト内`driver.get(url)`の次に行に下記のコードを追記する．

```python
# エラー画面内のエラー文字列をXPathで取得
disp = driver.find_element(By.XPATH, '//*[@id="error-code"]').text
errcode = 'NET::ERR_CERT_DATE_INVALID'

# 強引にクリックしてエラー画面を突破
if disp == errcode:
    driver.find_element(By.XPATH, '//*[@id="details-button"]').click()
    driver.find_element(By.XPATH, '//*[@id="proceed-link"]').click()
```
Java の乱数発生器

# これは何？

[Javaの乱数生成器について速度面から調査してみる](https://qiita.com/penguinsan/items/52a7b76e5570f7cf7e15)
という記事を見て、Java の乱数にも色々あるんだなと思い。

速度面以外を軽く調べた。

# 調べた

## java.util.Random

Knuth 先生の有名なアルゴリズムを使っている。
有名だけど、メルセンヌ・ツイスタなんかと比べるとバラケ具合がしょぼいこともよく知られている。

## java.util.concurrent.ThreadLocalRandom

内部状態は

```java:java
long rnd;
```

の一個、64bit だけ。定数が

```java:java
long multiplier = 0x5DEECE66DL;
long addend = 0xBL;
long mask = (1L << 48) - 1;
```

と用意されていて計算は

```java:java
int next(int bits) {
    rnd = (rnd * multiplier + addend) & mask;
    return (int) (rnd >>> (48-bits));
}
```

これだけ。bits はほしいビット数なので気分としては 32固定だと思っていいと思う。

実用的には困らない場面も多いとは思うけど、バラケ具合はあまり良くないと思う。

## L??X??MixRandom

[L32X64MixRandom のソースコードらしきもの](https://github.com/openjdk/jdk/blob/master/src/jdk.random/share/classes/jdk/random/L32X64MixRandom.java) を見ると

LXM ファミリの一員らしい。

`M` は、`0xadb4a92d` という値。
`a` は、コンストラクタで決まる奇数で。

xoroshiro64 で作られた乱数 x0 と、と $s=Ms+a$ で作られる系列 `s` の値を足したものを

```java:java
public static int mixLea32(int z) {
    z = (z ^ (z >>> 16)) * 0xd36d884b;
    z = (z ^ (z >>> 16)) * 0xd36d884b;
    return z ^ (z >>> 16);
}
```

で混ぜたものらしい。 

単なる xoroshiro64 だと弱いので別の乱数を混ぜた感じかな。

## Xoroshiro128PlusPlus

中身は見てないけど、Xoroshiro128++ なんだろう。
Xoroshiro シリーズは https://prng.di.unimi.it/ を読むとなんだか分かる。

## Xoshiro256PlusPlus

中身は見てないけど、Xoshiro256++ なんだろう。
Xoroshiro シリーズと同様、 https://prng.di.unimi.it/ を読むとなんだか分かる。

# 感想

メルセンヌ・ツイスタが無いのがちょっと意外。

最初に上げた記事では

> 個人的には、暗号やセッションキーの生成等ではSecureRandom。それ以外は通常ThreadLocalRandom。

となっているけど、私なら

* 予測不能性が必要ない場面なら基本 `Xoroshiro128PlusPlus` または `Xoshiro256PlusPlus`。どっちか速い方。どっちが速いか知らない今調べずに使うなら `Xoshiro256PlusPlus` かな。
* $2^{256}$ より長い周期が必要になったら LXM ファミリから選ぶ

かな。

とはいえ。
Java を使う機会自体がないのであった。
【WordPress】Ajaxでデータを送信する方法

WordPressに対してajaxでデータを送信する方法を、ご紹介したいと思います。
POSTで送信する方法を例に挙げて書いていますが、GETでも同じことが可能です。

## 環境
WordPress 4.9.18
PHP 7.0.27
jQuery 2.2.4

## 受け取り側の実装
まず、WordPressがajaxリクエストを受け入れるために任意のaction名を名前の末尾にもつアクションフックに、リクエストを受け取った時に実行されるコールバック関数を登録する必要があります。
アクションフック名の書き方は「wp_ajax_action名」または「wp_ajax_nopriv_action名」となります。
これら二つのアクションフックの違いは、前者がログインユーザー、後者の方は未ログインユーザーからのajaxリクエストを受け入れるものになります。
両ユーザーからのリクエストを受け入れる必要がある時は両方書く必要があります。

コードとしては以下のようになります。

``` function.php
function ajax_sample () {
    $data = $_POST;
    echo $data['name']PHP_EOL;
    echo $data['age']PHP_EOL;
    wp_die();
}

add_action('wp_ajax_my_ajax', 'ajax_sample');
add_action('wp_ajax_nopriv_my_ajax', 'ajax_sample');

```

上記の例ではaction名を「my_ajax」としています。

コールバック関数「ajax_sample」の内容としては受け取ったデータを項目ごとに出力する簡単なものです。

次に、WordPressに対してajax通信を行うための送信先(エンドポイント)である「サイトURL/wp-admin/admin-ajax.php」をJavaScriptのパラメータに出力します。
今回URLは共通ヘッダーに出力したいので、function.phpに以下のコードを追記しておきます。(もちろんURLを個々のJavaScriptのコードに直接描いても構いません)

``` function.php
function generate_js_params() {
?>
    <script>
      let ajaxUrl = '<?php echo esc_html(admin_url( 'admin-ajax.php')); ?>';
    </script>
<?php
}
add_action('wp_head', 'generate_js_params');
```


## 送信側の実装
送信側の処理をJavaScript(jQuery)で書いていきます。
この時、PHPのコードでアクションフックを記述した際に使用したaction名を送信するデータのパラメータに付与する必要があります。
もし付与せずに送信してしまうと400 Bad Requestが返されてしまいます。

``` main.js
$('.button').click(function (e) { 
  e.preventDefault();
  let data = {
    action: 'my_ajax',
    name: "太郎",
    age: 25
  }
  
  $.ajax({
      type: "post",
      url: ajaxUrl,
      data: data
  }).done(function (data) {
      console.log("ajax成功");
      console.log(data);
  }).fail(function (XMLHttpRequest, status, e) {
      console.log("ajax失敗: " + status + XMLHttpRequest);
      console.log(e);
  });
  
}
```

このように送信するオブジェクトの中にactionプロパティを他のパラメータと一緒にセットします。
こうすることでajaxを受け取ったWordPress内部で処理が通り、コールバック関数に記述した内容が実行されます。

その時にconsoleに出力される内容は以下の通りです。

```
ajax成功
太郎
25
```
  
## 参考文献
https://haniwaman.com/wordpress-ajax/
http://semooh.jp/jquery/api/ajax/jQuery.ajax/options/
pythonでjsonpathを試す

# 前書き
最近AWSの仕事が多く、aws-cliでdescribe系のコマンドを打ってます。
表示させるだけならシンプルですが、複雑な処理をさせたいので、pythonで個人用のラッパーツールを作りました。

作成中にdescribe系のメソッドで取得したjsonに対して何らかの方法でフィルターしたいと探したところ
jsonpathなるものをKode Kloudで発見したので試してみました。


# 参考にした記事、サイト
https://github.com/h2non/jsonpath-ng
https://qiita.com/takkii1010/items/0ce1c834d3a73496ccef
https://www.sukerou.com/2018/12/python-jsonxpathjsonpath.html
https://kodekloud.com/topic/lab-json-path-wild-cards/

jsonpathの使い方は上記のサイトかkodekloudの練習問題やればわかると思います。

# 本記事の内容
この投稿では上記サイトの内容を踏まえたうえで
実際に使った時に私がやりたかった事に対して、正解がすぐ出なかった点をメモしておきます。

- [前書き](#前書き)
- [参考にした記事、サイト](#参考にした記事サイト)
- [本記事の内容](#本記事の内容)
- [サンプルのjson](#サンプルのjson)
- [検証した事](#検証した事)
  - [最下層の要素でマッチさせて親の要素を取りたい](#最下層の要素でマッチさせて親の要素を取りたい)
  - [マッチさせる条件を変数にしたい](#マッチさせる条件を変数にしたい)

# サンプルのjson
※AWSのELBの取得結果を参考にサンプルとして記載しています。


```
samplejson = { "LoadBalancers": 
    [
        {
            "LoadBalancerArn": "hogeARN", 
            "DNSName": "hugaDNSname", 
            "State": {
                "Code": "active"
            }, 
            "AvailabilityZones": [
                {
                    "ZoneName": "hoge-region1", 
                    "SubnetId": "hoge-subnet1", 
                    "LoadBalancerAddresses": [100]
                },
                {
                    "ZoneName": "hoge-region2", 
                    "SubnetId": "fuga-subnet2", 
                    "LoadBalancerAddresses": [200]
                }
            ]
        },
        {
            "LoadBalancerArn": "hogeARN2", 
            "DNSName": "hugaDNSname2", 
            "State": {
                "Code": "active2"
            }, 
            "AvailabilityZones": [
                {
                    "ZoneName": "hoge-regionc3", 
                    "SubnetId": "hoge-subnet3", 
                    "LoadBalancerAddresses": [300]
                },
                {
                    "ZoneName": "hoge-regiona4", 
                    "SubnetId": "fuga-subnet4", 
                    "LoadBalancerAddresses": [400]
                }
            ]
        }
    ]
}
```

# 検証した事

## 最下層の要素でマッチさせて親の要素を取りたい
例えば、StateのCodeがactiveであることを条件にマッチさせたいとき、下記のような形でアクセスすると思います。
result = parse("$.LoadBalancers[?State.[*].Code == 'active']").find(samplejson)

```
list(result)[0].value
{'LoadBalancerArn': 'hogeARN', 'DNSName': 'hugaDNSname', 'State': {'Code': 'active'}, 'AvailabilityZones': [{...}, {...}]}
```


    ※$を条件式の前に書けば行けるかと思いましたが、取得できませんでした。
    parse("$[?LoadBalancers.State.[*].Code =~ 'active']").find(samplejson)
    []
    

ただ、このアクセスの仕方だと取得したデータから最上位のLoadBalancersの要素が抜けてしまいます。
LoadBalancersの要素まで残した状態でデータが欲しければ`parent`を使うそうです。

```
result = parse("$.LoadBalancers[?State.[*].Code == 'active'].`parent`.`parent`").find(samplejson)
list(result)[0].value
{'LoadBalancers': [{...}, {...}]}
```



## マッチさせる条件を変数にしたい
これはpythonの変数展開になりますが、記載しておきます。

先ほどのStateがactiveになっている要素を取得する例だと、以下のような記載になります。

```
variable = "match_word"
result = parse("$.LoadBalancers[?State.[*].Code == '%s'].`parent`.`parent`" % (variable )).find(samplejson)
```
pythonの変数展開は他にもやり方がありましたが、これで通ったからまぁいいかなと・・
シェルを含まないコンテナのファイルを確認する

## はじめに
昨今、セキュリティ強化や軽量化の目的で、シェルを含まない [distroless](https://github.com/GoogleContainerTools/distroless) などの最小のベースイメージが使われることが増えてきました。一方、コンテナイメージに含まれるファイルをさっと確認したいと思ったときなど、シェルがなくて困ることがあります。この記事では、Docker 単体でシェルを含まないコンテナのファイルにアクセスする方法を紹介します。

## シェル (busybox) をボリュームとしてマウントする (コンテナ起動時)
シェル (busybox) のバイナリをボリュームとしてマウントして利用する方法です。

事前に任意のボリュームを作成し、busybox のバイナリをコピーしておきます。この作業は一度だけで大丈夫です。ボリューム名や busybox のバージョンは適宜変更してください。

```console
docker volume create busybox
docker run --rm -v busybox:/bb/ busybox:1.34.1 sh -c "cp /bin/* /bb/"
```

この busybox のボリュームをマウントして、シェルなしのコンテナイメージを起動します。コンテナ内のファイルと被らないように、別のディレクトリ (`/bb`) にマウントして、PATH を通しています。以下の例ではシェルの入っていないイメージ `k8s.gcr.io/pause-amd64:3.3` で busybox をのシェルを起動する例です。

```console
docker run --rm -v busybox:/bb/ --entrypoint /bb/sh -e PATH=/bb/ -it \
    k8s.gcr.io/pause-amd64:3.3
```

起動後は busybox のシェルでコンテナのファイルにアクセスできます。:tada:

```
/ # ls /
bb     dev    etc    pause  proc   sys
```

## ホストから /proc/$PID/root でアクセスする (コンテナ起動中)
起動中のコンテナの場合は、コンテナプロセスの PID を調べて、`/proc/$PID/root` からコンテナのファイルシステムにアクセスできます。また、Kubernetes でも、Pod の[コンテナ間でプロセス名前空間を共有](https://kubernetes.io/ja/docs/tasks/configure-pod-container/share-process-namespace/) (`shareProcessNamespace: true`)すれば、この方法でサイドカーからシェルの無いコンテナのファイルにアクセスできます。

コンテナプロセスの PID は、`docker ps` でコンテナ ID を調べた後、以下のように `docker inspect` で確認できます。

```
docker inspect -f '{{.State.Pid}}' <CONTAINER_ID>
```

ここで確認した PID を使って `/proc/$PID/root` にアクセスすると、コンテナプロセスのルートファイルシステムにアクセスできます。 :tada:

```
$ sudo ls /proc/8032/root
dev  etc  pause  proc  sys
```

## おわりに
distroless などの最小のベースイメージを使った場合でも、 前述の方法でコンテナのファイルシステムにアクセスが可能です。[攻撃対象領域](https://ja.wikipedia.org/wiki/%E6%94%BB%E6%92%83%E5%AF%BE%E8%B1%A1%E9%A0%98%E5%9F%9F)を小さくするためにも、積極的に最小のベースイメージを使っていきましょう。
dynamodb-localにGUIでアクセスする


dynamodb-localにGUIでアクセスしたい。

しかし公式のClientはアクセス先にlocalhost:8000しか設定できない。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20634/d3162650-10c6-9780-d013-0c30310bccc9.png)

なので、[dynamodb-admin](https://github.com/aaronshaf/dynamodb-admin)を使う

### dynamodb-localの注意

dynamodb-localは、```-sharedDb```オプションを使わないとアクセスキーごとにDBができる。
つまり、何らかのクライアントを使うときは環境変数でアクセスキーを指定する必要がある。

>If you omit -sharedDb, the database file is named myaccesskeyid_region.db, with the AWS access key ID and AWS Region as they appear in your application configuration. If you delete the file, you lose any data that you have stored in it.

https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DynamoDBLocal.UsageNotes.html

### 接続まで

npm install

```shell
$ npm install -g dynamodb-admin
```

dynamodb-adminでアクセス

```
$ AWS_ACCESS_KEY_ID=XXX \
  AWS_SECRET_ACCESS_KEY=YYY \
  DYNAMO_ENDPOINT=http://<実際のホスト>:<実際のポート> dynamodb-admin
```

- http://localhost:8001/ にアクセスするとテーブル一覧が確認できる
【図解解説】JOI2021-2022 一次予選 第3回 問題2 アイスクリーム

## 図解解説シリーズ
競技プログラミングを始めたばかりでAtCoderの解説やJOIの解説ではいまいちピンと来ない…という人向けに、図解を用いて解説を行います。

## 問題文
### 情報オリンピック日本委員会に掲載されている問題

https://www.ioi-jp.org/joi/2021/2022-yo1/2022-yo1c-t2.html

### AtCoderに掲載されている問題
入出力など実際に確認して自分の作成したプログラムを採点することができます。

https://atcoder.jp/contests/joi2022yo1c/tasks/joi2022_yo1c_b

## 図解解説
今年度の一次予選のB問題は、以下の３つのスキルを確認する問題になっています。
１．入力・出力を正しく利用できる
２．算術演算子を正しく利用できる
３．条件分岐（if）を正しく利用できる
（４．繰り返し処理を正しく利用できる）

問題文を整理するために、具体的な数字を用いて、図示して考えてみます。
![スライド1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2211017/32ad4a60-024e-9cd1-9731-6f95c876555e.png)
入力例１を使って考えてみます。

28cm以上のアイスクリームタワーを作成します。ベースとなるアイスクリームは20cmです。希望の高さに足りませんので、追加のアイスクリーム（5cm）を重ねます。１つ重ねると25cm、２つ重ねると30cmとなり、28cmを超えます。したがって、250+100+100=450円が求める答えになります。このように、ベースとなるアイスクリームに追加のアイスクリームを加え続け、最終的に希望するアイスクリームタワーの高さ以上になったら終了するという戦略をとることができます。

一方、計算から求める方法もあります。28cm以上のアイスクリームタワーを作成します。ベースとなるアイスクリームは20cmですので、足りないのはあと8cm（28cm-20cm）です。追加のアイスクリームは5cmですので、不足分の8cmを使って8cm÷5cmを計算すると1.6となります。したがって、1個では足りず、2個追加すると28cmを超えることが計算からわかります。

![スライド2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2211017/f290034f-a7f7-bd50-3791-a88c7f680360.png)
条件分岐について、不安がある場合には上のスライドを参考にしてみてください。

## 解答例
### 戦略：ベースとなるアイスに追加のアイスを加え続ける

```b1.py
S = int(input())
A = int(input())
B = int(input())
#ベースだけでアイスクリームタワーが完成する場合は250を出力
if S<=A:
  print(250)
else:
  #ベースだけで完成しない場合について考える
  #高さ(tall)の初期値をベースの高さ(A)、金額(amt)の初期値をベースの金額(250)に設定
  tall = A
  amt = 250
  #最大100個追加できるので100回繰り返す
  for i in range(100):
    #高さ(tall)に追加のアイスクリームの高さ(B)を1回追加
    #金額(amt)に追加のアイスクリームの金額100円を追加
    tall = tall + B
    amt = amt + 100
    #高さ(tall)がアイスクリームタワーの高さ(S)以上になったら終了(break)し、金額(amt)を出力
    if S<=tall:
      break
  print(amt)
```
[採点サイトに提出したプログラム](https://atcoder.jp/contests/joi2022yo1c/submissions/27494500)

### 戦略：計算から求める

```b2.py
S = int(input())
A = int(input())
B = int(input())
#ベースだけでアイスクリームタワーが完成する場合は250を出力
if S<=A:
  print(250)
else:
  #アイスクリームタワーの高さ(S)からベースの高さ(A)を引いた値(S-A)について考える
  #追加のアイスクリームの高さ(B)で割り切れるとき追加で購入するアイスクリームの数は、(S-A)//Bとなる
  #追加のアイスクリームの高さ(B)で割り切れないときは、(S-A)//B + 1 が追加で購入するアイスクリームの数となる
  tuika = (S-A)//B
  if (S-A)%B==0:
    print(250+100*tuika)
  else:
    print(250+100*(tuika+1))
```
[採点サイトに提出したプログラム](https://atcoder.jp/contests/joi2022yo1c/submissions/27494592)

## イラスト
スライド内で使用しているイラストはすべて「[いらすとや](https://www.irasutoya.com/)」の素材を利用しています。
Scala : 再帰

## 再帰
メソッドや関数の中で、自分自身を処理を行う技法。

## 末尾再帰
再帰関数において、最後の処理で自分自身を呼び出している形。
Scalaのコンパイラは、末尾再帰をwhileループへ最適化する。
それにより、処理速度が向上し、スタックオーバーフローも回避できる。　

## Code Sample
### 再帰
```Scala
    // Basic recursion functions
    def factorial(n: BigInt): BigInt = {
        if (n <= 1) 1
        else n * factorial(n - 1)
    }

    val num1 = 100
    val num2 = 100000

    println("Factorial of " + num1 + " : = " + factorial(num1)) // Factorial of 100 : = 9332621544394415......
    // If the number of digits is too large, StackOverflow will occur.
    println("Factorial of " + num2 + " : = " + factorial(num2)) // Exception in thread "main" java.lang.StackOverflowError
```
### 末尾再帰
```Scala
    // Recursive function of tail recursion
    def factorial(n: BigInt): BigInt = {
        def factorialAcc(acc: BigInt, n: BigInt): BigInt = {
            if (n <= 1) acc
            else factorialAcc(n * acc, n - 1)
        }
        factorialAcc(1, n)
    }

    val num1 = 100
    val num2 = 100000

    println("Factorial of " + num1 + " : = " + factorial(num1)) // Factorial of 100 : = 9332621544394415......
    // StackOverflow is not generated by compiling to while.
    println("Factorial of " + num2 + " : = " + factorial(num2)) // Factorial of 100000 : = 2824229407960347......
```

## GitHub
https://github.com/GL-Kageyama/Scala_Recursion/tree/main
OpenSSL コマンドでサーバー上で直接 .htpasswd に ID & パスワードを追加する



サーバーに OpenSSL プログラムが大抵入っているので、コマンドで ID＆パスワードを追加できます。


```
sudo sh -c "echo -n 'ユーザー名:$(openssl passwd -apr1 パスワード)' >> [パス]/.htpasswd"
```

or sudo 無しなら

```
echo -n 'ユーザー名:$(openssl passwd -apr1 パスワード)' >> [パス]/.htpasswd
```


`sudo` : 必要に応じて、sudo 無し、sudo -u ユーザー指定で実行する
`-apr1` : パスワード形式。もっと強固なもに
`>>` : 既存のテキストファイルに、追記する


参考
https://qiita.com/STSynthe/items/5387bc33e7be315ae338
イテレーター(ES6)

# イテレーターとは

イテレーターとは配列に対して関数を適用し、スマートな書き方で
コーディングできるメソッドです。

###使用例

```React:イテレーター
const array = ["鈴木くん", "佐々木くん", "田中さん"]
let students = ''
array.forEach((v) => {students = students + `<td>${v}</td>`})

console.log("<table><tr>" + students + "</tr></table>")
```


### 特徴

* JSX等で配列を加工して使う際に利用できる。
* 人によって可読性が変わるので、コード規約等で統一できると良い
Ginza の使い方

[GiNZA - Japanese NLP Library](https://megagonlabs.github.io/ginza/)
の使い方です。

インストール

```bash
pip install -U ginza ja-ginza
```

パスを通す

```bash
export PATH=$PATH:/home/uchida/.local/bin
```

固有名詞の抽出を行いました。
こちらと同じプログラムです。
[ubuntu 21.10 に mecab をインストール](https://qiita.com/ekzemplaro/items/c98c7f6698f130b55d53)

```py:pickup_propn.py
#! /usr/bin/python
#
#	pickup_propn.py
#					Nov/26/2021
#
import spacy
nlp = spacy.load('ja_ginza')
text_in = "特急はくたかで富山に向かいます。それから、金沢に行って、兼六園に行きます。"
doc = nlp(text_in)
for sent in doc.sents:
	for token in sent:
		if token.pos_ == "PROPN":
			print(token.orth_, token.tag_)
#
```

実行結果

```text
$ ./pickup_propn.py 
富山 名詞-固有名詞-地名-一般
金沢 名詞-固有名詞-地名-一般
```
CakePHP Code Snifferのversion指定

CakePHP3系をつかっているプロジェクトの話です。
cakephp-codesnifferをstable指定(`"cakephp/cakephp-codesniffer": "@stable"`)で使っていたのですが、どこかのタイミングで[cakephp-codesniffer](https://github.com/cakephp/cakephp-codesniffer) のversionが4系を使うようになっていました。けっこうルールが変わっていていて警告がいくつか出るようになっていたので、今回はCakePHPとcakephp-codesnifferは同じメジャーバージョンを揃えることにしました。

今後意図しないタイミングでの変更を防ぐために `"cakephp/cakephp-codesniffer": "^3.0"` としました。

https://github.com/cakephp/cakephp-codesniffer/wiki



> Often you can use higher versions of the sniffer even if you are not yet at the recommended CakePHP minimum version.


ただ、CakePHPのversionよりsnifferが高いversionを使うことはできそうなので、警告への対応ができる場合はあげても良いかもしれません。
「編集(E)」で自分の好きなエディタを起動する

#ペイントはいけ好かない
Windowのエクスプローラで画像ファイルを右クリックしたときには、コンテキストメニューには「編集(E)」というメニューが含まれています。
これはデフォルトでWindowsアクセサリの「ペイント」で画像ファイルを開くものです。
しかし、ペイントでの画像編集に満足できない人には不便でしょう。

#レジストリを書き換えてしまえ
そこでレジストリを書き換えて強制的にその挙動を変えてしまおうというわけです。
`コンピューター\HKEY_CLASSES_ROOT\SystemFileAssociations\image\shell\edit\command`
にデフォルトで
`"%systemroot%\system32\mspaint.exe" "%1"`
が入っています。
この`%systemroot%\system32\mspaint.exe`の部分を自分の好きなエディタのパスに置き換えてください。
簡単に言ってくれますけどね…　～トランザクション処理とコミット処理～

アドベントカレンダー参加記事です。社内で推薦してもらったのですが、社外向けに書こうとすると、社内向け以上に長くなりました。ご了承ください(汗)。

弊社のパッケージでは、給与計算を実行することができます。

一連の処理を実行して、計算結果が固まったら、「締め処理」というものを実行して翌月に進みます。

■矛盾のない計算結果を作成する一連の処理：トランザクション処理
■締め処理：コミット処理

…という考え方なのですが、「間違って締め処理を実行してしまいました」という事故が起きることがあります。

「何故、締め処理を戻せる機能を作らないの？注意しろとか言ってくるけど、間違いは起きるのだから、それを想定してシステムを作らないとダメでしょ」と言われたり、言われないけど明らかに思っているな、ということがあります。

これまで、システム的に判断できる点は、ワーニング、またはエラーを出す機能を追加してきました。例えば、給与明細の作成処理がされていない社員がいたら、画面実行ならワーニング、スケジュール実行ならエラーになるような機能です。

しかし、システム的に何の異常もなくても、入力データが漏れていた、だから戻したい、ということもあります。「制御とかじゃなくてさ…戻せるようにさ…」という生の声や、心の声が聞こえてきます。

簡単に言ってくれますけどね…。

システムは、トランザクション処理とコミット処理の積み重ねで成り立っています。トランザクション処理の中でデータの整合性を保ち、コミット処理でそれを固めます。そして、また新たなトランザクション処理を進められるようにします。

締め処理は、大型のコミット処理です。中身としては、累積テーブルにデータを移したり、累計値を作ったり、ということを多数、実行しています。月が変わるところでコミット処理を入れることで、また翌月の処理、新たなトランザクション処理を進めていけるのです。

締め処理をした瞬間、まだ新たなトランザクション処理が何も動いていないタイミングに限れば、基本的に戻せるであろうスクリプト、手順というのも、実は用意しています。でも、新たなトランザクション処理が進んでいたら？機能化するとしたら、どこまでを想定するのか。例えば、「締め処理直後なら戻せます」という機能を出すと、締め処理のハードルが下がり、次は翌月の開始処理まで進めてしまうケースが出てきます(※今もあるのですが)。

別視点のアイディアもあって、例えば、締め処理についてシステム的に承認操作を強いるようにすれば良いのでは？というものがあります。しかし、これはスケジュール実行との相性が非常に悪いです。

また、さらに制御を追加することも考えられますが、制御が強過ぎると、今度は止めなくて良い状況で処理が止まって、特にスケジュール実行の場合は業務上、大きな問題になり得ます。また、制御が強いからといってオプション化して出すと、今度はそのオプション設定ができていませんでした、ということになったりします。

そもそもスケジュール実行を禁止すれば、という発想もありますが、スケジュール実行自体、お客様としてはミスを防ぐために組んでいます。

これは、強い実感も含めてのことなので、この文章だけで伝わるか分からないのですが、要はいたちごっこなところがあります。だから私は、如何に「戻せるようにさ…」という声が聞こえても、締め処理の持つ重みを軽んじられることだけはないよう、振る舞っています。

もちろん、開発部門に属する人間としての思いは別です。

昔、弊社の採用インターンシップで、お題に沿ってシステムを作りなさい、という課題が出たことがありました。これに対して、画面の真ん中に「業務」というボタンを配置し、押すと「業務が完了しました」というShowMessageが表示されるシステムを開発して、プレゼン込みで奇跡の合格を果たした者がいました(※今やったら多分落ちますが)。

開発として目指すべきところは、こういうところなのかな、とは思います(※もちろん、中でちゃんと処理が動いて)。

が、以前ユーザーサポートをやっていた身として、これを開発の問題だけで済ませてはいけないとも思うのです。

プロダクトを持っている会社では、何かと、「プロダクトで解決し得る問題=プロダクトが悪い」ということになり勝ちと思います。それで済ませようとすれば、全ての問題がそうなります。仮にユーザーサポート側がそういうスタンスなら、間違っています。ユーザーサポートと開発が、お互いにできることをやって、前進すべきです。
大量の画像を一斉にリネームする方法

　デザイナーとして業務をする最中で、大量な画像の作成・リネームを必要とする場面が多々出てくると思います。今回はそんな面倒臭かった業務を少しでも短縮するため、大量生成及びリネームを一括で行う方法をナレッジとして書き留めることにしました。こういった記事を書くことに慣れていないため説明が不十分にならないように気をつけて書いていきます。
※今回はmacでのやり方になりますが、windowsでも応用出来ます。

##はじめに
ある案件で、UI上で管理してる個別データ毎の画像を以下のパターンで書き出す依頼をいただきました。
ディレクターの方に頂いた素材リストを確認してみると、セルの行数が1235......
####※実際に頂いた素材リストのキャプション画像です![test.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2324229/29f8db78-843d-7f0a-5c5d-7c3d629646fb.png)
嫌と言っても逃げれない状況です、楽して終わらせたいし確認作業は極力減らしたい。
なので以下の方法を使い対応を試みました。


##01.Photoshopで各画像を用意
photoshopでは、フォルダやファイルの末尾に ```.png``` ```.jpg``` と言った拡張子を記入することで命名した子要素を自動で書き出す機能があります。
上記を用いて、フォルダを「Group Layer Renaming」等のplusginを使って書き出しフォルダを一斉に命名・作成を行いました。
![testimage.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2324229/a968fe99-3a57-60bb-4c88-b136c7f2fc83.jpeg)
%n 等で連番でフォルダを作成できます。

![test.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2324229/345956ae-049c-e4df-a362-ce40c3f2226e.png)
フォルダは以下のルートをルールとしました。
####例　
>01~50（50個区切りを想定）
>L 　01~50/%n_np.png（透過25%指定）
>　L　01~50/%n.p.png
>　　L 書き出したい画像などのファイル

####上記の用意する上で下記が注意点となります。
- 約1200という膨大の数を書き出すため、レイヤーの移動を楽にするために50区切りでフォルダを仕分け
- 通常・透過25%と2種の画像を書き出すため、```01~50/%n_np.png（2階層目）``` ```01~50/%n.p.png（3階層目）```2種のフォルダの中に書き出し画像を格納
- 通常・透過の画像が混じらないように、```01~50/%n_np.png（2階層目）```のフォルダを「透明度 25%」に指定しておく

###フォルダ作成が終われば...
このフォルダ作成作業が終われば、後は必要画像を各フォルダにどんどん入れていきます。
※ここが一番辛いです
![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2324229/b8371ff1-0251-7a02-fd21-8dffe8db4785.png)
なんとか各画像の用意も終わり、自動生成もちゃんと成功してくれました。

##02.リネームを一斉に終わらすためのシートを用意する

これから```連番通り書き出した画像を、指定の名前にリネーム```するための下準備をしていきます。
連番にした理由としては、頂いた素材リストの順番通り画像をリネームするためでした。
今回は「ターミナル」を用いて```.sh```ファイルで一斉にリネームをしていくため下記画像のように、元画像と返還後をまとめたリストを作成します。
※今回は、画像が2種類(通常・透過25%）あるため、シートを分けて別々私は作成しました。

![test.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2324229/84bc8bf9-0ef9-3916-9105-4d1dd84bcdaa.png)
順番として、```ファイル名``` ```変換後のファイル名前``` ```コマンド```をしています。
コマンドの内容ですが、ターミナルで
```[ディレクトリ名] mv [元ファイル名前] [変換後の名前]```と記述し実行すると、
書いた内容に該当するファイルを一斉に置換してくれるので、```コマンド```にそれらが反映される様に設定していきましょう。

##03. re-name.sh ファイルを作成する
ここまで来たら後少しです。
テキストエディタにて先ほどの「コマンド」の内容をペーストし、```re-name.sh```として保存してください。
![test.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2324229/920c9e11-4303-1db6-09c3-9845d34069ed.png)

.shファイルを作成したら、序盤に作成した画像と同じフォルダに格納してあげてください。
![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2324229/5ffb0d80-30f1-2544-b9de-b576406d0c79.png)



##04. ターミナルを使って一斉リネーム
後は先ほどの.shファイルを起動させるだけです。
ターミナルを開き、.shファイルの入ったディレクトリパスに移動しましょう。
あとはsh re-name.shをコマンドを打つと、シートに記入した名前順で連番画像を勝手にリネームしてくれます。
![terminal.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2324229/51464aa4-0a2d-1f8a-6c0d-ad894ba45295.png)

##おわりに
かなり手短な説明にはなりましたが、大量の画像を誰でも簡単に一括りネームする方法を共有してみました。
難しいコマンドを必要とせず誰でもやれるので機会があったら是非試してみてください。