OmniAICreator/Qiita-1.07M huggingface dataset:
[Houdini学習3,4日目]Shelfツールとノードの違い

一般的にはShelfツールよりノードがモデリングで使用されるらしいが、どんな違いがあるのか調べてみた。

## 作り方の違い（例：Box）
**Shelfツールの場合**
アイコン押下のみ。
アイコンだけで、新しくGeometry Containerオブジェクト作成＋その中にBoxノードを作成してくれる。
![2022-08-24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2797498/69f56613-e857-7dbc-bdd5-0b7d1966688f.png)
**ノードの場合**
Scene Viewまたは、Network viewでTabキー押下。
ノード名を入力し、選択する。
![2022-08-24 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2797498/175b43dc-1fbb-80eb-0e62-bc54d0c71319.png)

## そもそもShelfツールとは、ノードとは
**Shelfツール**
使用頻度の高い機能を簡単に作成できる（自動的にノード作成）
**ノード**
個々の要素(物体、形状に対してアプローチ（ex:面取り)など)のこと。

つまり、ノードにすべての機能があり、Shelfツールはその中でも特に使うものがまとまっているということ。

## ノードにしかない機能はどれか
調べたところ
なんと、ノードは2000個以上で、Shelfツールになっているものは、200程度だった。
あまりにも差分が多すぎるのでここで列挙するのはやめておく。

ノードにどういったものがあるのかは、下記を参照。
https://www.sidefx.com/ja/docs/houdini/nodes/index.html

## 例えばどんな機能がノードにしかなかったか
Foreach
https://www.sidefx.com/ja/docs/houdini/nodes/chop/foreach.html
日本語のファイル名

mpg123でネットラジオもいいですが、ローカルのファイルの再生も試してみました。

iBook DualUSB Mac OS X 10.4のiTunesで取り込んだCDデータがあるのですが、m4aなのでmp3に変換します。

iTunesで変換設定を変えると、すでに取り込んである、m4aからmp3が作れました。CDの取り込みと同じ設定なので、分かりにくかったです。

実行してみると、さすがにPowerPC G3だけあって、結構時間かかりました。また取り込んであるものを、再変換すると二重にiTunesに登録されてしまうので、後で整理が必要です。

変換されファイルをUSBメモリにコピーします。USB 1.0なのでこれまた遅いです。

USBメモリをFreeBSDでマウントしてみます。

```
# mount -t msdos -r /dev/da0s1 /mnt
```

マウントされたディレクトリを見ると日本語が文字化けしてアクセスできません。FreeBSDではiconvをカーネルに入れると日本語のディレクトリ名やファイル名も処理できるみたいですが、そんな余裕はありません。

しかたがないのでAppleScriptでファイル名をトラック番号だけにするスクリプトを書いてみました。

```applescript
on open theDroppedItems
	repeat with a from 1 to count of theDroppedItems
		set theCurrentItem to item a of theDroppedItems
		tell application "Finder"
			set folderContents to every item of theCurrentItem
			repeat with theFile in folderContents
				set oldName to name of theFile
				set newName to my tracknoName(oldName)
				--display dialog newName
				set name of theFile to newName
			end repeat
		end tell
	end repeat
end open

on tracknoName(str)
	set str to str as string
	set sppos to offset in str of " "
	set sppos to sppos - 1
	set tc to characters 1 thru sppos of str as text
	return {tc & ".mp3"} as string
end tracknoName
```

AppleScriptを書くのは10年ぶりくらいで、いろいろ手抜きしてます。スクリプトはEl Capitanで書きましたが、10.4でも実行できました。

アプリケーションで、保存してそのアイコンにフォルダーをドラッグすると中にあるファイルのファイル名が変更されます。

![スクリーンショット 2022-08-24 11.01.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/e460f526-7328-1586-13ac-5b81a66928e9.png)

![スクリーンショット 2022-08-24 11.01.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/3ffcc414-a776-4dc2-96aa-1aadcd10f560.png)

フォルダー名も適当にasciiにするとマウントして問題なく開ける様になります。

# Ver. 2

AppleScriptでscpしてその時に名前を変えるようにしました。読み込んだフォルダーをドラッグするとコピーされて、元のファイルは変更しません。

```applescript
on open theDroppedItems
        set mp3Server to "10.0.1.41"
 
        repeat with a from 1 to count of theDroppedItems
                set theCurrentItem to item a of theDroppedItems
                display dialog "dirctory name" default answer "test"
                set dirName to text returned of result
                do shell script ("ssh " & mp3Server & " 'mkdir -p " & dirName & "'")
                tell application "Finder"
                        set folderContents to every item of theCurrentItem
                        set thePath to POSIX path of theCurrentItem
                        repeat with theFile in folderContents
                                set oldName to name of theFile
                                set newName to my tracknoName(oldName)
                                --display dialog thePath & oldName
                                --set name of theFile to newName
                                do shell script ("scp \"" & thePath & oldName & "\" " & mp3Server & ":" & dirName & "/" & newName)
                        end repeat
                end tell
        end repeat
end open

on tracknoName(str)
        set str to str as string
        set sppos to offset in str of " "
        set sppos to sppos - 1
        set tc to characters 1 thru sppos of str as text
        return {tc & ".mp3"} as string
end tracknoName
```

POSIXのファイル名で使えない/などが入っているとエラーになります。
`comtypes`の追加機能 - GUIDのみでモジュール生成が可能に

## 論旨
`Python`でCOMオブジェクトを操作する[`comtypes`](https://github.com/enthought/comtypes)へコントリビュートを行い、私が追加した機能を含むものがバージョン`1.1.13`で最近リリースされたのでその紹介です。

## 追加機能概要
`client.GetModule(("{ライブラリのGUID}",))`でモジュールが生成・取得できるようになります。

### GUIDとは
`Globally Unique Identifier`「グローバル一意識別子」のこと。  
`{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}`(xは16進数)で表現されます。  
COMオブジェクトやCOM型ライブラリは、(レジストリに登録されていれば)この一意のIDから呼び出すことが可能です。  
https://ja.wikipedia.org/wiki/GUID

### Examples
```py
from comtypes.client import GetModule
GetModule(("{00020813-0000-0000-C000-000000000046}",))  # Excel
GetModule(("{00020905-0000-0000-C000-000000000046}",))  # Word
```

### 従来機能との違い
これまでも`GetModule`に様々な引数を渡すことでCOM型ライブラリからPythonのモジュールを生成/呼び出すことは可能でした。
```py
# `(GUID, メジャーバージョン, マイナーバージョン)`のタプル
GetModule(("{00020813-0000-0000-C000-000000000046}", 1, 9))  # Excel
# 型ライブラリ情報があるファイルのフルパス
GetModule("C:\\Program Files\\Microsoft Office\\Root\\Office16\\EXCEL.EXE")  # Excel
# 環境変数にアサインされたDLL(TLB)名
GetModule("UIAutomationCore.dll")  # UIAutomationClient
GetModule("stdole2.tlb")  # stdole
# GetModule("EXCEL.EXE")  # これは(デフォルトで)環境変数にアサインされていないため不可
```
ですが、環境によってライブラリのメジャーバージョンやマイナーバージョン、型ライブラリファイルのフルパスは異なります。  
`client.CreateObject("Excel.Application")`のようにオブジェクトの生成は環境が違ってもクラス名文字列(`VersionIndependentProgID`)のみでバージョン情報が不要だったのに対し、`client.GetModule`によるモジュールの生成はバージョン情報の指定が必要でした。  
今回の機能追加によって、ライブラリGUIDのみのタプルが渡された場合には`client.GetModule`関数内部でレジストリを調べて規定値のバージョンを取得してモジュールを生成できるようになります。  

## 新機能がどう役立つか
私が参画しているプロジェクトでは、`comtypes`でExcelを操作する際に`comtypes.gen.Excel`モジュールが環境内で確実に存在する必要がある実装をしているスクリプトがあります。 
そのためにスクリプト実行前に`client.CreateObject("Excel.Application")`でアプリケーションオブジェクトを生成して、その副作用によって`comtypes.gen.Excel`モジュールが作成されるようにしていました。  
しかし、**オブジェクトを操作したいわけでもないのにオブジェクトを生成している**ことは不健全です。
- オブジェクトの生成に時間がかかります(手元環境で31.79秒)
- ユーザーがスクリプトの本処理が始まらないことに焦れて途中で処理を終了させると、`comtypes.gen.Excel`モジュールの作成に失敗して、一度`gen`フォルダを消さない限り何度再実行してもスクリプトが異常終了し続けることがあります

代わりに、`client.GetModule(("{00020813-0000-0000-C000-000000000046}",))`を使うことで、オブジェクトを生成することなくモジュールが生成できるため
- 時間がかからない(手元環境で3.33秒)
- ユーザーが焦れる要因が少なくなる
- 後続処理を早く進める

ことが可能となります。

## 今後
現在、私は`comtypes`へのコントリビュートを続けています。  
機能追加の計画やバグフィックスなど最新の情報は[リポジトリ](https://github.com/enthought/comtypes)をご覧ください。  
**みなさんのコントリビュートもお待ちしております。**
基礎からのPHP  CHAPTER01 要約

※2013年出版の本です。PHP初心者の僕にとっては学ぶことだらけなので要約しました。購入ページ→https://www.amazon.co.jp/基礎からのPHP-基礎からシリーズ-西沢-夢路-ebook/dp/B00M939YIU/ref=sr_1_5?__mk_ja_JP=カタカナ&keywords=PHP&qid=1659143084&s=digital-text&sr=1-5

# PHPの概要

## 01Webアプリケーションとは何か

### Webページはどうして表示できるのか

Webページは世界中のどこかのWebサーバーの中に保存されている。

![Datacenter-telecom.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284832/004b6868-a79b-5e1f-e461-c3e85fe20d33.jpeg)
↑サーバー

__サーバーは色々なサービスを提供するコンピューター。__
サービスの例：
- Webサーバー：Webページを提供
- SMTPサーバー：メールを送信
- IMAP/POPサーバー：メールを受信
- FTPサーバー：FTPでファイルを送受信

__クライアント__はサービスを受ける側、つまりWebページを見るのに使う一般ユーザーのPCやスマホのこと。

Webブラウザの上にあるアドレスバーにカタカタとURLを入力したり、ハイパーリンクをクリックすると、何が起こるでしょう？

→WebサーバーにWebページを送ってよ！とWebサーバーにお願いできるんです。（__HTTPリクエスト__）すると何が起こるでしょう？

→WebサーバーがWebページ、つまりテキストや画像をクライアントに送ってくる。（__HTTPレスポンス__）すると何が起こるでしょう？

→ブラウザが表示してくれる。

### HTTPとは
インターネットでのコンピュータ同士のやりとりには決まりがあります。（__プロトコル__）
例えばHTTP。つまり僕らのスマホ・PC（クライアント）がWebページを要求して、WebサーバーがWebページを送る一連のやりとりは __HTTP(Hypertext Transfer Protocol)__ というプロトコルを守っているわけです。

WebページのURLはhttp://・・・と書きますが、これはHTTPプロトコルで通信するよ、と宣言しているのです。

近年ではhttps://・・・と書きますけどね。HTTPを暗号化してセキュリティ強化したのがHTTPSです。

### ApacheとWebサーバー
Webサーバーを構築するソフトウェアはたくさんありますが、有名なのは __Nginx__ (エンジンエックス) , __Apache__（アパッチ）です。ApacheはLinux, Windows, Macなど色々なOSに対応してます。

## 02PHPとは何か

### スクリプトとは

Webページの正体とは、HTMLという規則に従って記述されたテキストファイルです。テキストファイルとは文字だけでできているファイルです。つまりWebページを構成するHTMLファイルは全て文字なんですね。

メモ帳のようなエディタ、ホームページビルダーのようなWebページ作成ソフト、Webページを作ってくれる言語（PHPなど）を使って作ろうが、全部HTMLファイルが出来上がるので、クライアントで表示できます。


相手が〇〇のリンクをクリックしたら＄＄のページを表示する。こういう場合このページはあらかじめ出来上がってるページだから、 __静的なWebページ__ と言います。静的なページは完成されてるから変化しない、つまり静的なわけです。

一方、「相手が〜と入力したら〇〇のWebページを表示」される場合、プログラムがその場でWebページを作ってるわけじゃないですか。このページを __動的なWebページ__ と言います。動的なページは未完成なテンプレートの中に、例えばユーザーの検索キーワードに応じた検索結果をはめ込むわけですよ。つまりページがコロコロ変わるから動的なわけです。

ということは、動的なWebページを作るには、クライアントから送られたデータを解析・処理する必要があるでしょう？ではこの問題をどう解決するか？

→PHPのような言語で、データーを解析・処理するプログラムを書くわけです。このプログラムを __スクリプト__ と言ったりします。

スクリプトにはクライアント側で動作するものと、Webサーバー側で動作するものの２種類に分かれます？何と何でしょう？

→クライアントサイドスクリプト
要は __Webブラウザ側で実行されるスクリプトです。（JavaScriptなど）__ Webサーバー側枯らしたら楽チンです。仕事をWebブラウザに振ることができるので。Webブラウザの表示や動作を簡単に制御してくれます。ブラウザの種類によって動作が異なったり、動作しないことが起こる可能性もありますがね。。。

→サーバーサイドスクリプト
一方、 __Webサーバー側で実行されるスクリプトです。（PHPなど）__ Webサーバーが仕事をするので、このスクリプトに関してはブラウザの種類がどうのこうの・・・なんて機にする必要はありません。リクエストの数だけサーバーに負荷がかかります。Webページ送ってよ！（リクエスト１回目）→Webページについてる画像も送ってよ！（リクエスト２回目）みたいな感じでサーバーが一度にあれやこれや仕事をしています。

### PHPの特徴

- 動作が早い
- HTMLの中に書き込める
- サーバー側で動作する
- オープンソース（無料で使えるし、一定の条件をクリアすれば編集もできます）
- いろんなDBが使える
- 開発・修正が早い

処理モジュール（小単位のプログラム）はWebサーバーにあり、これをスクリプトの命令によって動作させるため、一般的に動作は軽快です。

PHPはNginxやApacheなどいくつかのWebサーバーに対応し、MySQLなど沢山のDBをサポートしてます。
Stable Diffusion v1.4をGoogle Colabで始めた時に遭遇したエラーの解決メモ

# 背景

https://note.com/npaka/n/ndd549d2ce556#fab3cac6-613b-4ac3-8ab6-2705fea977bc

こちらのnoteを参考にGoogle Colabを作業していくと


```python
from diffusers import StableDiffusionPipeline

# StableDiffusionパイプラインの準備
pipe = StableDiffusionPipeline.from_pretrained("CompVis/stable-diffusion-v1-4", use_auth_token=YOUR_TOKEN)
pipe.to("cuda")
```

このコードの実行で次のようなエラー

```
Access to model CompVis/stable-diffusion-v1-4 is restricted and you are not in the authorized list. 
Visit https://huggingface.co/CompVis/stable-diffusion-v1-4 to ask for access.
```

うーんこまった

# 解決方法

エラー文の通りに

- https://huggingface.co/CompVis/stable-diffusion-v1-4

にアクセス

すると

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96970/35d48fc4-0f01-925b-c887-15a12d9d2ab4.png)

と出てくるので
ライセンスに同意して「Access repository」をクリック。

これで解決！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96970/6e26870d-3fe0-0db1-5378-cfa99a9d9f65.png)


「japanese_cat_skipping」で生成された画像がこちらです。
![japanese_cat_skipping.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96970/7fc3d7b2-852e-c76f-f2dc-4c9977a4fe86.png)
Salesforce 画像をレコード内に表示

# 初めに
項目の値によって画像を表示させる方法。  
色々とネットを見れば情報は出てくるが、やろうとした時にうまく動かない場合もあるし（アップデートのせい？）
そもそもいつも忘れるので、現時点で動いた方法をメモ。

## 画像の登録
1. 設定 → 静的リソースに登録しましょう  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/484310/21f679f6-6cf5-6f09-5265-6e53eb904cd6.png)
2. ファイルを表示をクリック
3. 右クリックで画像のURLをコピー

## カスタム項目＆数式作成
1. 画像を表示させたいオブジェクトにカスタム項目（数式 → テキスト）を作成  
2. ロジックに合わせて数式を作成する
   例では、チェックボックスに合わせて画像を表示させる  

```
IF(checkBoxTest__c,
IMAGE("/resource/CheckIcon?","Assigned",30,30), 
IMAGE("/resource/CloseIcon?","Unassigned",30,30)
)
```
特に静的リソースから取得した画像URLは何も変える必要はありません。

`IMAGE()`関数の引数は、`IMAGE(image_url, alternate_text [, height, width])`となっています。

# フローでの画像表示
静的リソースに登録した画像名を "表示画像"コンポーネント内の画像名に指定してあげるだけ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/484310/0c1e0457-c74a-4894-eb49-9a2c4ed8c803.png)
ミルクボーイ『Twitter』

エンジニアとして要件や技術要素を分析するにあたり、その対象がどのようなモノであるかを明確にイメージすることが大切です。  
モノの特徴を表すにあたり、ミルクボーイのネタは有効ではないかと考え、練習がてらに初めて取り組んでみました。  
特に目新しい情報はありませんが、予めご了承ください。  
今回、[テンプレート](#参考)を参考にさせていただきました。ありがとうございました。    

## ミルクボーイ『Twitter』

どうもミルクボーイです。お願いします。  

>ありがとうございます。  
>今、**mineoのパケットギフト 3GB分**をいただきましたけどもね。  

ありがとうございます。  

>こんなん、家の外でネットに繋ぐ時、なんぼあってもいいですからね。  

ゆうとりますけれどね。   
うちのおかんがね、好きなSNSがあるらしいんやけど。  

>そうなんや。  
 
その名前を忘れたらしいねん。  

>好きなSNSの名前忘れてまうってどうなってんねん。  
 
いろいろ聞くんやけどな、全然わからへんねん。  
 
>ほんだら俺がね、おかんの好きなSNS一緒に考えてあげるから、どんな特徴言うてたかとか教えてみてよ。    

「140字迄の短いメッセージをツイートするやつや」って言うてた。  

>**Twitter**やないかい？   
>その特徴は、もう完全に**Twitter**やがな。すぐわかったよ。こんなもん。  
 
俺も**Twitter**やと思てんけどな、おかんが言うには、「使い始めるまでのハードルが高い」って言うねんな。  

>**Twitter**と違うか！  
>**Twitter**はね、アカウントさえ作れば誰でも無料で利用できるねん。あれは。  
>**Twitter**ってそういうもんやから。  
>ほな、**Twitter**ちゃうがなそれ。  
>もうちょっと詳しく教えてくれる？  

なんでもニュースよりも速く現地の情報を得られることもあるらしい。  

>**Twitter**やないかい！  
>有志がツイートしてくれたら、その場の情報は、すぐに得られるんやから！  
>情報が錯綜することもあるけど、事故とか電車遅延の情報は、ものすごく速いんやから！  
>俺はなんでもオミトオシやねんから！  
>**Twitter**やそんなもんは！  
 
わかれへんねん、でも。  
 
>何がわかれへんねん。

俺も**Twitter**やと思てんけどな、おかんが言うには、「使っている人が少なくて寂しい」言うてた。  

>ほな、**Twitter**ちゃうやないかい！  
>**Twitter**はね、日本国内では、**Facebook**や**Instagram**を抑え、トップクラスの利用者数やねん！  
>自分でツイートするかはさておき、スマホ持っている人に聞いてみたら、大体入ってんねん。  
>好きな有名人や友達やら、たくさんフォローして、ツイートを楽しみにしてんねん。  
>もうちょっとなんか言ってなかった？  
 
アメリカの本社が、買収されるやらされへんやらでゴタゴタしてるらしい。  

>**Twitter**やがな。  
>大富豪のイーロン・マスクが、株式を大量保有して買収仕掛けたり、やっぱり止めるとかでゴタゴタしてるんや。  
>買収契約の実行どうするかで裁判でも揉めてるわ。株価も乱高下したりで大変やわ。    
>**Twitter**やそんなもん。  

わかれへんねん。
 
>なんでわかれへんのそれで。
 
俺も**Twitter**や思てんけどな、おかんが言うには、「パソコンでしか使えへん」って言っててん。  

>**Twitter**ちゃうやないか！
>**Twitter**はね、パソコンを含む各種プラットフォームで使えるし、主な利用スタイルはスマホや！  
>あれ、どこにいてもすぐにツイートできることが大きなメリットやねん。  
>**Twitter**ちゃうやないか。もうちょっとなんか言ってなかったか？  

青い鳥のアイコンが目印らしい。    

>**Twitter**やないか！  
>**Twitter**は、青い鳥のアイコンと、白抜きのアイコンも有るけど、ブランドカラーは青やねん！  
>あの鳥は、先代が『ラリー・バード』、二代目は、『Twitterバード』。  
>正式名称はいまいち浸透してないけど、「青い鳥のアイコン」って言っとけば、**Twitter**やな、って大体通じるねん。   
>**Twitter**にきまり！  
 
わからへん。  

>わからへんことない！おかんの好きなSNSは、**Twitter**！  
 
おかんが言うには、「**Twitter**ではない」って言うてた。  

>ほな、**Twitter**ちゃうやないか！  
>おかんが**Twitter**ではないと言えば**Twitter**ちゃうがな！  

そうやねん。  

>先言えよ！俺が、わざわざ先代の鳥の名前の話までしてたとき、どう思てたん？  

申し訳ないなと思って。  

>ほんまにわかれへんがな、それどうなってんねん。  

おとんが言うには、[Thunderbird](https://www.thunderbird.net/ja/)ちゃうかって。  

>いや、絶対ちゃうやろ！  
 
もうええわ。どうもありがとうございました。  

## 参考

[ありそうで無いようなミルクボーイのテンプレート](https://manaveemath.hatenablog.com/entry/2020/01/02/031947)
[ツイッターの鳥、改名していた　Twitterバード、先代の名は…](https://withnews.jp/article/f0150212002qq000000000000000W00o0901qq000011410A)
[【最新Excel配布中】日本・世界のSNSユーザー数まとめ(Facebook,Twitter,Instagram,YouTube,LINE,TikTok)](https://find-model.jp/insta-lab/sns-users/)
pyenvとvenvでPythonの仮想環境を作ろう！（Windows11）

# はじめに
venvで仮想環境を作ろうとした際に「使用するPythonのVersionも指定出来たらいいな」と思い調べてみたところ、pyenvでPythonのVersionが切り替えられることを知りました。
せっかくなので備忘録としてまとめておきたい...

そこで今回は「**新規プロジェクト用に、指定したVersionのPythonの仮想環境を構築する**」というストーリーをイメージしながら実践します！


# 目次
* 事前知識
    * pyenvとは
    * venvとは
* 実践
    * ステップ① pyenvで使用するPythonのバージョンを指定
    * ステップ② venvで仮想環境を作成する
* 最後に
* 参考文献

# 事前知識
ここで使用する「pyenv」と「venv」がそれぞれどういう役割を持つのかまとめます。
※名前がそっくりでなのでここで違いをはっきりさせます。

## pyenvとは
>pyenv lets you easily switch between multiple versions of Python.
>訳：**pyenvを使用することで複数のバージョンのPythonを切り替えることができる。**

**使用したいPythonのバージョンにすぐに切り替えられる**便利な代物がpyenvです。
詳細は[公式](https://github.com/pyenv/pyenv)を確認していただければと思いますが、簡単にpyenvでできることをまとめておきます。
* ユーザーごとにglobalのPythonのバージョンを変更できる。
* **プロジェクトごとにPythonのバージョンを設定できる。**
* 環境変数にPythonのバージョンを上書きできる。
* 複数のバージョンのPythonから一度にコマンドを検索できる。

:::note info
今回はプロジェクトごとにPythonのバージョンを設定するためにpyenvを使用します。
:::


## venvとは
>The venv module provides support for creating lightweight “virtual environments” with their own site directories, optionally isolated from system site directories.
>訳：venvモジュールを使用することでシステムのsiteディレクトリと切り離された独自のsiteディレクトリをもつ、軽量な「仮想環境」を作ることができる。

**Global環境に依存しない、プロジェクト専用の環境を作成するためのモジュール**です。
プロジェクトごとに違うバージョンのライブラリを使いたいとき、ありますよね！
仮想環境を作成することで、**プロジェクトごとにライブラリをインストール**することができます。


:::note warn
venvで仮想環境を作成する際に使用したPythonのバージョンが、仮想環境のPythonのバージョンとして設定されます。そこで**pyenvでプロジェクトで使用するPythonのバージョンを事前に指定してから、venvで仮想環境を作成します。**
:::

# 実践

:::note info
事前にpyenvをインストールしておく必要があります。[公式](https://github.com/pyenv-win/pyenv-win)に従ってインストールしてください。

:::

## ステップ① pyenvで使用するPythonのバージョンを指定
まず、使いたいバージョンのPythonをインストールします。
```
pyenv install 3.10.6
```

インストールが完了したらご自身のプロジェクトディレクトリに移動してください。
**※以降の内容はすべてプロジェクトディレクトリで実行してください。**
```
cd C:\Users\ユーザー名\project
```

切り替える前のバージョンを確認します。
以下を実行するとGlobal環境のPythonのバージョンが表示されるかと思います。
```
python -V
```

次に以下のコマンドを実行してプロジェクトで使用するPythonのバージョンを指定します。
（バージョンはお好きなもので）

```
pyenv local 3.10.6
```

正しくバージョンを指定できたか確認します。

```
python -V
```

ご自身が指定したバージョンに切り替わっていればOKです！

## ステップ② venvで仮想環境を作成する
ではカレントディレクトリはプロジェクトディレクトリのまま仮想環境を作っていきましょう！
```
python -m venv 仮想環境名
```
これを実行するとカレントディレクトリ内に「仮想環境名」のディレクトリが新たに作成されると思います。

これで完成と思ってしまいますが、**venvで作成した仮想環境を使用するためには「Activate」、中断するときは「Deactivate」する必要があります。**
```
仮想環境名\Scripts\activate
```
:::note info
仮想環境が起動するとパスの先頭に「**(仮想環境名) C:～**」が表示されます。
:::

**このようにプロジェクトを使用するときは毎度仮想環境をActivateすればOKです！**

念のため仮想環境がGlobal環境と切り離されていることを確認しましょう。
```
pip list
```
ライブラリがほとんど入っていないことが確認できます。


最後に作業を中断するときは仮想環境を閉じましょう。
```
deactivate
```

# 最後に
これで準備OKです！
**あとはいつも通り「pip install」で使いたいライブラリをインストールして、ご自身のカスタム環境を作成してください！**
以上で指定したPythonのバージョンが使用できる仮想環境の作成はおしまいです。
お読みいただきありがとうございました。

誤り等ございましたら、ご指摘いただけますと幸いです。

# 参考文献
[pyenv公式](https://github.com/pyenv/pyenv#windows)
[venv公式](https://docs.python.org/ja/3/library/venv.html)
@HyunwookParkさん：[pyenv + venvを使ったpython仮想環境（Windows向け）](https://qiita.com/HyunwookPark/items/9f46524b69da75d3fba3)
@KRiver1さん：[pyenv、pyenv-virtualenv、venv、Anaconda、Pipenv。私はPipenvを使う。](https://qiita.com/KRiver1/items/c1788e616b77a9bad4dd)

# 追記（自分用メモ）
・pyenvでpythonのバージョンを変更できるが、Visual Studio Codeで使用するPythonのバージョンは手動で変更しなければならない。
（変更先はプロジェクトディレクトリのvenvの中にあるpython）
plunkerで「chaplus api」

# 概要
plunkerで「chaplus api」叩いてみた。
練習問題やってみた。

# 練習問題
人工無脳とchatせよ。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/0573469c-777f-cd21-dd84-8d6550268784.png)


# サンプルコード

```
var endpoint = "https://ohiapp0.herokuapp.com/chaplus?q=";

function send(msg) {
	var xhr = new XMLHttpRequest();
	xhr.onreadystatechange = function() {
		if (xhr.readyState == 4 && xhr.status == 200)
		{
			showMessage(xhr.responseText);
		}
		else
		{
			//alert(xhr.readyState);
			//alert(xhr.status);
			//alert(xhr.responseText);
		}
	};
  var uri = endpoint + msg;
	xhr.open("GET", uri, true);
	xhr.send();
	//alert("ok");
}

document.forms.publish.onsubmit = function() {
  let outgoingMessage = this.message.value;
  showMessage(outgoingMessage);
  send(outgoingMessage);
  this.message.value = '';
  return false;
};

function showMessage(message) {
  let messageElem = document.createElement('div');
  messageElem.textContent = message;
  document.getElementById('messages').appendChild(messageElem);
}
showMessage("start");



```
# フロー

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/3f450411-7c48-b9a9-433f-3c2c36cef30a.png)


# 成果物

https://embed.plnkr.co/plunk/LQRMw8WhvWPrjavs

以上。
基本情報技術者試験の変更点まとめ

基本情報技術者試験が変更されるようなのでまとめてみました。
変更後の試験は2023年4月から開始予定のようです。

# 受験期間
変更前：年2回（上期・下期の一定期間）
変更後：通年（受験者が都合の良い日時を選択して受験）

# 出題形式
**午前試験**
|/| 変更前 | 変更後 |
|:-: |:-:|:-:|
|試験時間| 150分   |  90分 |
|出題数 | 80問  |  60問 |

**午後試験**
|/| 変更前 | 変更後 |
|:-: |:-:|:-:|
|試験時間| 150分   |  100分 |
|出題数 | 11問  |  20問 |
|解答数 | 5問<br>選択問題あり  |  20問<br>選択問題なし(全問必須) |

# 出題範囲
**午前試験**
変更なし

**午後試験**
・変更前
    必須解答の問題と選択の個別プログラム言語（C、Java、Python、アセンブラ言語、表計算ソフト）

・変更後
    選択の個別プログラム言語は廃止され、「情報セキュリティ」と「データ構造及びアルゴリズム（擬似言語）」を中心にした構成に変更
Django Settings.py 備忘

## Django Settings.py 備忘

　いつも新規プロジェクトの時、設定を忘れてしまうので備忘を兼ねて共有

----
> ##### セッションタイムアウトの設定(秒で指定)
> SESSION_COOKIE_AGE = 600

> ##### 1リクエストごとにセッション情報を更新
> SESSION_SAVE_EVERY_REQUEST = True

> ##### ブラウザを閉じたらセッションを終了
> SESSION_EXPIRE_AT_BROWSER_CLOSE = True

> ##### 受信ファイルサイズ変更(1GBの時)
> DATA_UPLOAD_MAX_MEMORY_SIZE = 1024 * 1024 * 1024

> ##### 管理者のログイン機能を通常のログイン機能として使う
> LOGIN_URL='admin:login'
> LOGOUT_REDIRECT_URL='/'
Linux シェルの主な特殊変数とシェルスクリプトについて（自分用メモ

●シェルの主な特殊変数

・$? 直前に実行されたコマンドの終了ステータス(exit値)
・$n シェルスクリプトに渡されたn番目の引数。(１０個目以降は${10}のように指定)
・$* 全ての引数。ダブルクォーテーションで”$*”とした場合、全ての引数がまとめられて１つの文字列となる
・$@ 全ての引数。ダブルクォーテーションで”$@”とした場合、それぞれの引数が個々の文字列となる
・$$ 現在のシェルのPID(プロセスID)
・$# 実行時に指定された引数の数

特殊変数「$?」には、コマンドが正常終了した場合は「0」、異常終了した場合は0以外の数値が格納される。

●shiftコマンド
shiftコマンドは指定した数の分、引数の位置を番号の小さい方にずらすコマンド。

shift [n]

nを指定しない場合は、引数を1つずつ左にずらす。


●シェルスクリプトは一連の処理をシェル上で実行できるよう記述されたもので、ファイルにコマンドを記述するだけで作成できる。


ただし、原則スクリプトファイルの1行目にはそのシェルスクリプトがどのインタープリタ（シェル）で実行されるかを記述。この「#!」は「シバン」または「シェバング」（shebang）と呼ばれるもので、ここに記述されたインタープリタは、次の行からのスクリプトを解釈して実行。

#!インタープリタ

シェルスクリプトを実行するには主に以下の方法がある。

●sourceコマンドを使用
指定したシェルスクリプトを読み込み、現在のシェルで実行するコマンド。シェルスクリプトに実行権が無い場合でも実行できるが、実行するシェルスクリプトに読み取り権と、シェルスクリプトが存在するディレクトリに検索権が必要（ディレクトリに設定されたパーミッション「x」 は実行権ではなく検索権と呼ぶ）。なお、sourceコマンドは「.(ドット)」で代用できる。

●sh、bashコマンドを使用

●コマンドとして実行


※シェルスクリプトのファイルを実行できる権限は「所有ユーザ」（ファイルの所有ユーザ）、「所有グループ」（ファイルの所有グループ）、「その他のユーザ」（所有ユーザ、所有グループ以外のユーザ）のそれぞれに対して設定できる。


●コマンド置換
bashでコマンドの実行結果を文字列として扱う

・`実行コマンド`（バッククォート、日本語キーボードではSHIFT+@）
・$(実行コマンド)
C++勉強メモ

ここにメモ表記失礼します。

継承(C++) - 超初心者向けプログラミング入門 https://programming.pc-note.net/cpp/inheritance.html

C++ 動的配列クラス std::vector 入門 http://vivi.dyndns.org/tech/cpp/vector.html

C++でのクラス初期化方法まとめ - livlea blog https://blog.livlea.com/entry/2018/08/cpp-class-init

C++の基礎 : アクセス制限 http://www.s-cradle.com/developer/sophiaframework/tutorial/Cpp/access.html

【C言語入門】文字列を比較する方法（strcmp、strncmp） | 侍エンジニアブログ https://www.sejuku.net/blog/25303

【C++入門】compare関数を使って文字列を比較する方法 | 侍エンジニアブログ https://www.sejuku.net/blog/62561

基本入出力 http://wisdom.sakura.ne.jp/programming/cpp/cpp2.html

Ken Kobayashi CPP3 https://www.asahi-net.or.jp/~yf8k-kbys/newcpp3.html

c++のexplicit指定子の使い方まとめ | コウモリのちょーおんぱ https://komorinfo.com/blog/cpp-explicit-specifier/

リファレンス
basic_string - cpprefjp C++日本語リファレンス https://cpprefjp.github.io/reference/string/basic_string.html
basic_string::operator[] - cpprefjp C++日本語リファレンス https://cpprefjp.github.io/reference/string/basic_string/op_at.html
vector::コンストラクタ - cpprefjp C++日本語リファレンス https://cpprefjp.github.io/reference/vector/vector/op_constructor.html
参加レポート『LiveView JP#9：Elixir生誕10周年記念！納涼LiveView何でも会』

『LiveView JP#9：Elixir生誕10周年記念！納涼LiveView何でも会』に参加してきたので、レポートをします:laughing:

https://liveviewjp.connpass.com/event/257934/

## タイムテーブル順に

### イントロ

司会者のtakutoさんがLiveViewの画面を追加し、動く様子を見せてくれました。

```
mix archive.install hex phx_new
mix phx.new basic
cd basic
code -r .

mix phx.gen.live Blogs Blog blogs title:string body:text
mix ecto.create
mix ecto.migrate
mix phx.server
```

LiveViewを始めるにあたり、どういうコマンドを実行し、Phoenixアプリが起動した後はどのような画面が表示されるのか分かります。

### Liveviewで打ち上げるNeosの花火

最初のLTは @t-yamanashi さん。
LiveViewで花火をトリガーし、NeosVR内で花火が打ち上がる仕組みを実装されました！

こちらはLTの様子。

https://twitter.com/piacere_ex/status/1562033750565089280

実装にかかったのは、LiveView側で２時間、NeosVR側で１時間とのことで、びっくりしました。

夏、花火…すごく派手で雰囲気がありました。

### ElixirDesktop iOS R&D苦労話

2番目のLTは @the_haigo さん。
ElixirDesktopでAndroid、iOSアプリを作成されました！

下記は当日の資料です。

https://speakerdeck.com/thehaigo/elixirdesktop-r-and-d-ku-lao-hua

ElixirDesktopはPhoenixでマルチプラットフォーム開発ができるライブラリ郡とのことです。
デスクトップ（Windows、Mac）でも、スマホ（Android、iOS）でも動きます。

LTでアツかったのは、iOSで外部通信しようとするとクラッシュするという不具合をthe_haigoさんが見つけ、前日までiOSでの実戦投入は難しいと考えていましたが、
the_haigoさんがiOSだけ外部通信できない旨を作者さんに報告したところ、ネットワーク周りの不具合に対応してくださり、LTまでにiOSの動作を確認できるようになったことです！

また、READMEとおりに環境構築しても動かないなど、最初にハマるところが多そうな印象を受けました。

![スクリーンショット 2022-08-24 9.41.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109744/94da90e9-4d92-1b04-47bc-095853718d80.png)

ですが、Phoenixの開発テクニックをアプリに流用できるのは素晴らしいです。
ElixirDesktopはこれからもっと発展していくでしょうし、注目です！

### piyopiyo.exで作ったLiveView感想投稿 ＆ Phoenix＋vrm-threeで3Dモデルを動かす

こちら私のLTです。タイムテーブルは20分ですが、時間的に間に合いそうだったので２本させていただきました。

#### piyopiyo.exで作ったLiveView感想投稿

Phoenix/Elixir初心者コミュニティpiyopiyo.exを共同主催しているのですが、
そこで仕様書作成、実装（モブプロ）、Tailwind CSS+daisyUIでデコって、Gigalixirにデプロイという内容を5回に分けてイベント開催した話をしました。

5回参加すると、サービスリリースまで体験できるという欲張り企画です:slight_smile:

https://qiita.com/nako_sleep_9h/items/0bb06fa05988c9ecea7d

#### Phoenix＋vrm-threeで3Dモデルを動かす

https://github.com/pixiv/three-vrm

Three.jsというVRM（3Dアバターデータ）ファイルを動かすことができるライブラリがあるのですが、
それをLiveViewに持ち込んでみる、という内容です。

![スクリーンショット 2022-08-21 23.59.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109744/b5ef105d-b770-07bf-19ff-2ad6c7e93fd2.png)

[Three.js](https://github.com/pixiv/three-vrm) にはサンプルコードが充実しています。
DBを使わないLiveViewページを作り、そこにサンプルコードを持ち込みました。

LTの時点ではLiveViewっぽい機能を使うところまで実装できなかったので、今後ちょっとずつ機能を追加していきたいと思います。

イベント内で、LiveView内でJSライブラリを使うならJS Hookを使うことをおすすめいただきました。
また、ボタンを追加して何かしら機能が発火するようになると良い、とも。とても参考になりました:blush:

https://qiita.com/the_haigo/items/f2035a086f4753537237

## 動画

今回のElixir JP#9本編を録画したものがYou Tubeから視聴できます。
イベントに参加できなかった方はこちらを見ましょう:sunglasses:

https://www.youtube.com/watch?v=tbR6T3J8X28

## Elixirイベントに興味がある方へ

@koga1020 さんが作成されたElixirイベントカレンダーがあります。
一度にElixirイベントをチェックできるのでおすすめです。

https://elixir-jp-calendar.fly.dev/
cscの作法 その268

# 概要
cscの作法、調べてみた。
unvell.ReoGrid.dll使って、みた。
練習問題やってみた。

# 練習問題
reogridに、csvを読み込め。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/55bce6b1-aa00-4afd-91dc-29b8d40644be.png)

# サンプルコード

```
using System;
using System.Windows.Forms;
using System.Drawing;
using unvell.ReoGrid;

class form1: Form {
	ReoGridControl grid;
	form1() {
		Text = "ReoGrid";
		ClientSize = new Size(800, 500);
		grid = new ReoGridControl() {
			Dock = DockStyle.Fill,
		};
		this.Controls.Add(grid);
		grid.Load("test3.csv");
	}
	[STAThread]
	public static void Main() {
		Application.Run(new form1());
	}
}

```

以上。
過去の自分のコードを修正してみる - PHP カレンダー編②

# 前回のおさらい
[前回](https://qiita.com/kei_0_f/items/61d20d691cb02a84e2eb)は、これを

```php

<?php
// $t…その段のなかでいくつ目の月なのか的な変数だと思う[後付けコメント]
if ($t == 0) {
  print "<table border='0' width='100%' align='center' class='calender_gyou'>\n<tr>\n<td>\n<div style='float:left;margin-right:20px;margin-bottom:8px;'>";
  $t++;
}

```

こうした

```php

<?php
if ($t == 0) {
?>
  <table class="calender_gyou first-table">
    <tr>
      <td>
        <div class="div-of-first-table">
<?php
  $t++;
}

```

```css

.first-table {
  border-style: none;
  width:        100%;
  text-align:   center; 
}
.div-of-first-table {
   float:       left;
   margin-right:20px;
   margin-bottom:8px;
}

```

# 範囲を広げる

```php

<?php
if ($t == 0) {
  print "<table border='0' width='100%' align='center' class='calender_gyou'>\n<tr>\n<td>\n<div style='float:left;margin-right:20px;margin-bottom:8px;'>";
  $t++;
} elseif (($t == 1) or ($t == 2)) {
  print "<div style='float:left;margin-right:20px;margin-bottom:8px;'>";
  $t++;
} else {
  print "<div style='float:left;margin-right:20px;margin-bottom:8px;'>";
  $t = 0; //次の段へ
}

```

# 前回同様に、簡単に整えてみる

```php

<?php
if ($t == 0) {
?>
  <table class="calender_gyou first-table">
    <tr>
      <td>
        <div class="div-of-first-table">
<?php
  $t++;
} elseif (($t == 1) or ($t == 2)) {
?>
  <div style="div-of-month">
<?php
  $t++;
} else {
?>
  <div style="div-of-month">
<?php
  $t = 0;
}

```

```css

.first-table {
  border-style:  none;
  width:         100%;
  text-align:    center; 
}
.div-of-first-table {
   float:        left;
   margin-right: 20px;
   margin-bottom:8px;
}
.div-of-month {
   float:        right;
   margin-right: 20px;
   margin-bottom:8px;
}

```

いや、同じ処理や同じ記述がとっちらかっててモヤモヤする
あと昨日は疲れててスルーしてたけど緩やかな比較なのもモヤモヤする

# 処理をまとめる

```php

if ($t === 0) :
?>
  <table class="calender_gyou first-table">
    <tr>
      <td>
<?php
endif;
?>
  <div class="<?php echo $t === 0 ? 'div-of-first-table' : 'div-of-month' ?>">
<?php
// 段の最後まで印字したら$tを0に戻して次の段にする…んだけど、
// 三項演算子で書いてみたら思ったより伝わらなさそうだったので普通にif文にする
// $t = $t > 2 ?  0 : $t++;
if ($t > 2) {
  $t = 0;
} else {
  $t++;
}
?>

```

```css

.first-table {
  border-style:  none;
  width:         100%;
  text-align:    center; 
}
.div-of-first-table {
   float:        left;
   margin-right: 20px;
   margin-bottom:8px;
}
.div-of-month {
   float:        right;
   margin-right: 20px;
   margin-bottom:8px;
}

```

次回はもう少し観測範囲を広げてみます
cssのところは、現状がいいのか分離してクラス増やすのがいいのか理解しきれていないので空き時間にでも確認しておきます
【Swift/SwiftUI】 シンプルなカウントダウンタイマー作ってみた。

筋トレが趣味なんですけど、 種目間の休憩時間をタイマー管理して一定にしたい。 
たくさんの種目を何セットもやるとなると、その度に「アレクサ！●分のタイマーセット！」って何回もいうのめんどくさい。
すでにあるアプリでばっちり自分のニーズにハマるタイマーを探すのもめんどくさい。

複雑な機能はいらない。 
とにかく最低限の機能かつ最低限の操作で筋トレ中でもカンタンに触れるアプリが欲しい。
というわけで、Swiftのお勉強を兼ねて自分で作ってみることにしました。

## 開発環境
MacOS Monterey 12.2.1
Xcode Version 13.4.1
Swift Version 5

## 画面イメージ
タイマー開始前
<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126315/9510d494-c556-a029-d47a-35330e164e07.png">

タイマー作動中
<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126315/3b56da37-eee6-d6f0-4a1d-691d1fecc215.png">

- カウントダウンの時間を分単位で指定
- タイマーはスタート→ストップ(リセット)→再度スタート
※一時停止→再開機能はあえて実装せず

## コード

#### コード全文(Github)
コード全文はこちらを参照下さい。

https://github.com/yuta-yama-1123/TestIntervalTimer

#### 実装要素（個人的な実装ポイント）
- ボタン押下によるイベント発火
- Combineを利用した繰り返しタイマー処理
- 音声ファイルの再生
- タイマーと連動したプログレスバーの表示

#### コード内容
#### ボタン押下時のイベント発火
```swift
            Button(action: {
                if(timerController.timer == nil){
                    intervalSecond = intervalMinute * 60
                    timerController.start(Double(intervalSecond))
                }else{
                    timerController.stop()
                }
            }){
                Text("\((timerController.timer != nil) ? "Stop" : "(Re)Start")")
```

画面中央のストップ／スタートボタン押下時に、指定された分単位のタイマーを開始・中断を交互に行うようタイマーが動いているかどうかで判定し切り替えを行なっています。
（ボタン上の文言も同様）

```swift
    @Published var timer: AnyCancellable!

    ...

        // タイマー定義
        timer = Timer
            .publish(
                every: interval, // タイマー処理実行間隔
                on: .main,       // 実行場所(.main:メインスレッドでの実行)
                in: .common
            )
            .autoconnect() // 繰り返し処理の実行
            .receive(
                on: DispatchQueue.main
            )
            .sink(
                receiveValue: (
                    {_ in
                        // 設定した時間ごとに呼ばれる
                        ...
                    }
                )
            )
```

タイマー定義としては単純に繰り返し処理が行えるように定義しているのみです。

#### 音声ファイルの再生
```swift
    // アラーム音声ファイル読み込み
    private let shining_star = try!  AVAudioPlayer(data: NSDataAsset(name: "shining_star")!.data)

    // 音声ファイル再生
    private func shiningStar() {
        shining_star.stop()             // 停止
        shining_star.currentTime = 0.0  // 頭出し※最初から再生するため
        shining_star.play()             // 再生
    }
    // 音声ファイル再生停止
    private func stopShiningStar() {
        shining_star.stop()             // 停止
        shining_star.currentTime = 0.0  // 頭出し※最初から再生するため
    }
```

事前準備としてAssetにファイルを取り込んでおく必要はありますが、
再生、停止自体は簡単に記述できました。
コードにコメントでも記載していますが、確実に最初から再生されるようにするため、
停止→頭出し→再生　という順番で処理を行なっています。

<font color="DarkGray">※function名がshiningStarなのは、フリー音源でお馴染みのシャイニングスターを使わせて貰ったからです。</font>

#### タイマーと連動したプログレスバーの表示
```swift
                ProgressView(
                    value: timerController.remaining,
                    total: Double(intervalSecond)
                )
                .accentColor(Color.green)
                .scaleEffect(x: 1, y: 15, anchor: .center)
```

こちらはSwiftUIの部品を使ってみただけですが。
デフォルトだとバーの高さが物足りないので`.scaleEffect()`でボリュームを出しています。

以上
エンジニアにおすすめのGoogle Chrome拡張機能

## はじめに
エンジニアにおすすめのGoogle Chrome拡張機能を紹介します。

### JSONVue
JSON形式のレスポンスに色をつけたり、構造をわかりやすくしたりする拡張機能です。

https://chrome.google.com/webstore/detail/jsonvue/chklaanhfefbnpoihckbnefhakgolnmc/related?hl=ja

### WhatFont
Webページのフォントの種類、サイズ、太さ等の詳細情報を表示してくれる拡張機能です。

https://chrome.google.com/webstore/detail/whatfont/jabopobgcpjmedljpbcaablpmlmfcogm?hl=ja

### ColorPick Eyedropper
Webページの色のカラーコードが分かる拡張機能です。

https://chrome.google.com/webstore/detail/colorpick-eyedropper/ohcpnigalekghcmgcdcenkpelffpdolg

### EditThisCookie
Chromeに保存されているCookieの表示や手動での編集、追加、削除ができる拡張機能です。

https://chrome.google.com/webstore/detail/editthiscookie/fngmhnnpilhplaeedifhccceomclgfbg?hl=ja

### FireShot
Webページ全体のスクリーンショットを取得できる拡張機能です。

https://chrome.google.com/webstore/detail/take-webpage-screenshots/mcbpblocgmgfnpjjppndjkmgjaogfceg?hl=ja

### OneTab
タブをリスト化して整理できる拡張機能です。
メモリ使用量を減少させることができます。

https://chrome.google.com/webstore/detail/onetab/chphlpgkkbolifaimnlloiipkdnihall?hl=ja

### Vue.js devtools
Vue.jsで開発するアプリケーションのアプリケーションのデータをリアルタイムで確認できたり、コンポーネントの構成を確認できる拡張機能です。

https://chrome.google.com/webstore/detail/vuejs-devtools/nhdogjmejiglipccpnnnanhbledajbpd?hl=ja

### React Developer Tools
Reactで開発するアプリケーションのアプリケーションのデータをリアルタイムで確認できたり、コンポーネントの構成を確認できる拡張機能です。

https://chrome.google.com/webstore/detail/react-developer-tools/fmkadmapgofadopljbjfkapdkoienihi/related?hl=ja

## おわりに
拡張機能を入れることで開発を効率化できます。
この記事で紹介した拡張機能が参考になったら幸いです
アイランドアーキテクチャ(Islands Architecture)とは何なのか

# はじめに
アイランドアーキテクチャは2019年にEtsyのフロントエンドアーキテクトである[Katie Sylor-Miller](https://twitter.com/ksylor)氏によって考案され、Preact作者の[Jason Miller](https://twitter.com/_developit)氏の[Blog](https://jasonformat.com/islands-architecture/)によって広められました。

現在、アイランドアーキテクチャは[Astro](https://astro.build/)、[Fresh](https://fresh.deno.dev/) などのWebフレームワークが採用しています。

# アイランドアーキテクチャとは
ページ内でサーバー側でレンダリングされる静的な部分とインタラクティブなアプリの部分をそれぞれ独立して表示させる手法です。
静的な部分を海に見立てて、その海に浮かぶそれぞれが独立した島(インタラクティブなアプリ)というイメージでアイランドアーキテクチャと名付けられているようです。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217487/b4b71385-2b28-6dc1-514b-94855ab7e7bf.png" width="500">

# メリット
１番のメリットはパフォーマンスです。
ページのほとんどの部分は静的なHTMLで構成され、JavaScriptが必要としない部分にはJavaScriptが読み込まれず、動的なアプリの部分のみJavaScriptが読み込まれます。
アイランドアーキテクチャを採用しているフレームワークを活用するとコンポーネントをインタラクティブにするタイミングを指定することができ、[上の図の例](#アイランドアーキテクチャとは)にある画像のカルーセルはインタラクティブにする優先度が低いので読み込みを後回しにして、インタラクティブにする優先度が高い、ヘッダー部分を優先的に読み込むことでブロッキングを軽減することができます。

# デメリット
デメリットとしてあげられるのはアイランドアーキテクチャはそれぞれのページが独立したMPAに該当するのでSPAと比較すると、ルーティングの体験がやや悪いということでしょうか。
Svelteの作者である、Rich Harris氏のツイートでその差を見ることができます。

<blockquote class="twitter-tweet"><p lang="en" dir="ltr">As the person doing the clicking, it felt very obvious to me. If we slow it down and add timecodes, you can see the delay from click event registering to page updating. One of these is well below the 100ms threshold to feel &#39;instant&#39;; the other isn&#39;t. This was very consistent: <a href="https://t.co/KwlUuFYm8Y">pic.twitter.com/KwlUuFYm8Y</a></p>&mdash; Rich Harris (@Rich_Harris) <a href="https://twitter.com/Rich_Harris/status/1539207486560952321?ref_src=twsrc%5Etfw">June 21, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

注意点としてMPAとSPAはトレードオフです。どちらが優れていてどちらが悪いということではありません。
MPAとSPAの比較はAstroの[ドキュメント](https://docs.astro.build/en/concepts/mpa-vs-spa/)が分かりやすいです。

# おわりに
アイランドアーキテクチャはAstroを筆頭に新しいWebフレームワークで採用されていっていますので今後流行っていくアーキテクチャだと思います。
最近[Astro 1.0](https://astro.build/blog/astro-1/)もリリースされましたし、そろそろ触っていってもいい頃合いなのかなと感じてます。
配列のループは、基本のfor of loopでも、for loopでも書ける！

JAVASCRIPTのforループを整理するための記事です。

この記事を見るとわかること：
配列のループfor of loopでかける配列のループは、for loop でもかけるよ


＜書きたいもの＞
仮引数：数値型の要素を持つ配列
返り値；与えられた配列のすべての数字の合計

actual = sumArray([1, 2, 3, 4]);
expected = 10;


その１　for of loop　を使う
（配列の各要素にアクセスする）

function sumArray(numbers) {
         
    let result = 0
    for (const number of numbers){
       
        result = number + result
       
    }
    return result;
}


その２　for loop　を使う
（配列の要素、オブジェクトのキー、一つ一つに同じ処理を繰り返したいとき）




function sumArray(numbers) {
   
　  let result = 0
    for (let i = 0; i < numbers.length; i ++){

    result = numbers[i]  + result;
    
    }
    return result;

}
Lightning Knowledge Feedbackというアプリ


+ 先にKnowledgeを有効化してないとインストールはエラーななります。
+ 使う場合にはページレイアウトにこのコンポーネントを追加する必要があります。Newボタンではレコードを作成できません。

[Lightning Knowledge Feedback](https://appexchange.salesforce.com/appxListingDetail?listingId=a0N3A00000FP1A8UAL)

インストール手順
1. Get It Now をクリックします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/ff653afc-5895-a581-e7b9-799839a42480.png)

2.　以下をクリックする(プレイグランド本番環境と同じログイン先です)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/9bdabe99-8367-8084-26d5-56ab59b7bca6.png)


3.以下をチェックして、ボタンをクリックします

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/477e3c92-80d7-3314-5147-3576bd6d4988.png)

4. そのまま少し待ちます。１回目は動いてないと思ってここで×をしたらインストールされませんでした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/70b11594-216f-8b44-454c-aae2f8a974c7.png)

5.　インストール先の環境を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/ed77c03d-f4db-f40c-ab3d-66032b049569.png)

6. とりあえず管理者だけを選んでボタンをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/f031dd0d-9a65-d76f-2b8d-bf42743e2e20.png)

7.　無事インストール完了です

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/458490f8-b37e-2bc7-6ed9-90f3de33e191.png)


# 関連リストが表示されない

+ [Article Feedback from App Exchange - View current user feedback only](https://trailhead.salesforce.com/en/trailblazer-community/feed/0D54S00000HEjum)

ページを編集して関連リストを追加すると表示できました。変な画面だな。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/1ad879b0-18e2-214d-9dc3-5396239371d0.png)

しかし、不思議なことがあって組織のデフォルトでは有効化できません。　なんだこりゃ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/562a211e-165d-4744-b789-f05f7acf601b.png)

# アップグレードできない？

+ [Upgrading Lightning Knowledge Feedback app from v1.5 to current v1.13.0. Getting an error re: flexipage.](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007clLPWSA2)

:::note alert
his app can't be upgraded.

There are problems that prevent this package from being installed.

The component must implement at least one of flexipage:availableForAllPageTypes, flexipage:availableForRecordHome interface.

afl_Article_Thumb_Vote: The component must implement at least one of flexipage:availableForAllPageTypes, flexipage:availableForRecordHome interface.
:::
アジャイル検定Lv1 に合格しました

アジャイル検定Lv.1に合格しました。
100点中92点(合格は80点以上) でした。

 ### 受けた試験
 - アジャイルソフトウエア開発技術者検定試験Lv.1
 - 概要：すべてのアジャイル開発に必要なスキルの認定
   https://agilecert.org/about/
 - 試験時間および出題形式：60分、多肢選択式 (四肢択一)60問
 - 合格基準：80％以上合格
 - 受験料：10,000円(税別)
 - 過去問は非公開

 ### この資格を選んだ理由
 - アジャイル検定Lv.2の受験条件だったため

 ### 勉強したこと
 - 「アジャイル検定公式テキスト」「カイゼン・ジャーニー」「アジャイルサムライ」を読む
 - アジャイルソフトウェア開発宣言と、宣言の背景にある原則を覚える
 - アジャイルとスクラムの用語を整理する
 - 受験前日に公式テキストをざっくり読み直し、受験当日に電車の中で『4章 開発チームの運営』と『5章 アジャイル開発の各種手法』を読み直す

 ### その他
 - アジャイルのアも知らない状態からの挑戦だった。
 - 合格者のブログを探すとよく見つかる、「過去問がないから勉強しにくい」「公式テキストをカバーできれば合格できる」がまさに当てはまる試験だった。
 - 宣言と原則は暗記する必要はないものの、暗記すると公式テキストやその他書籍の内容が読みやすくなってメリットがあると感じる。日本語だけでなく英語でも確認すると、英単語の意味も踏まえて理解できてよかった。
 - 従来の開発方法(ウォーターフォール)は、建築や料理に似ていて、現実で「モノをつくる」イメージに当てはめて理解しやすい。その考え方が定着した中でアジャイルの考え方を提唱し、世界共通の認識として確立したケント・ベックさんに興味が出る。"アジャイル"は考え方で、実際のやり方はXPやスクラムなどに分かれていくけど、アジャイル宣言を出した17人の最初にいるのがケント・ベックさんで、XPを提唱したのもケント・ベックさんで、スクラムが採用している「ペアプログラミング」「テスト駆動開発」「リファクタリング」「常時結合」は全部XPつまりケント・ベックさんがまとめたもの、と理解している。
Salesforce認定アドミニストレーター試験の公式練習問題を解説してみた-その002

こんにちは。本橋孝昭です。

Salesfroce認定アドミニストレーター試験の公式練習問題があるのはご存じでしょうか。
Trailheadにフラッシュカードとして何度も解ける練習問題がございます。

今回はTrailhead
アドミニストレーター認定の準備: 構成、設定とオブジェクト
構成と設定の学習　にある練習問題2問目をご紹介します。
https://trailhead.salesforce.com/ja/content/learn/modules/administrator-certification-prep-setup-and-objects/study-up-on-org-setup


なお、こちらの内容はYou Tubeでも公開しています
https://www.youtube.com/watch?v=eE5esrjoadU

<iframe width="560" height="315" src="https://www.youtube.com/embed/eE5esrjoadU?start=2" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

問題はこちらです

![問題02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/c578a399-56ed-27a7-9046-1ff23798637b.png)

ロケール設定＝地域の設定　だと思います。
問題の内容としては
・「地域の設定」を変更すると変更される部分はどこか？を問われている問題ですね。


それでは、解説について深堀りしていきましょう

Salesforce の地域の設定は、日時、ユーザーの名前、住所、数値のカンマとピリオドの表示を決定します。


![参考01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/c39ceca6-9d00-a53a-ae40-9f03a3504f55.png)



例えば地域の設定が「日本語」なら「姓、名」となります

しかし地域の設定が「英語」なら「名、姓」となります

今回の場合、
B　時間と数値
C　名、姓と日付
は地域の設定によるものなので正解です。


なお、Aの営業時間と休日は「営業時間」から設定するので間違いです
![営業時間.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/705e885d-ce7c-0b97-d848-005e799b21ba.png)


Dの通貨の形式は「地域の設定」ではなく「通貨設定」から設定するので間違いです
![通貨設定01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/3b8b318a-1a92-f19b-deed-3c06774d3c12.png)


いかがでしたでしょうか。

地域設定の概要について他の設定を詳しく知りたい場合、
Trailhead
「会社全体の組織設定」
https://trailhead.salesforce.com/ja/content/learn/modules/company_wide_org_settings
の
「地域設定の概要」で勉強することをおすすめします
https://trailhead.salesforce.com/ja/content/learn/modules/company_wide_org_settings/org_settings_regional?locale=ja


今日の内容はここまでです。
皆さん楽しく元気にSalesforceを学びましょう！
他人の書いたコードがわからない

すでにある程度完成しているプロダクトの開発にたずさわるとき、たいていは「コードを書く」ではなく「コードを読む」から仕事を始めることになります。

このとき「コードが読めない」「コードがいい感じに理解できない」と悩むのは、それほど珍しくないでしょう。

この記事では、コードが読めないときにどう対応すればよいかを考えてみました。

## コードの美しさは気にしない

まず重要なのは、**コードがどれだけキレイに書かれていようが読めないものは読めない**、と割り切ることです。とくにエンジニアになりたての人や自分を責めやすい人にとっては、この考えが大切だと感じます。

コードがどれだけ美しくても、**自分で書いていないコードは必然的に理解しづらい**ものです。[^1]

というのは、あるコード（文章）をただ読むだけで理解するのは難しいからです。社会の教科書を一度読むだけですべてを記憶できた人はいないはずです。（この理論が正しいことを前提としたいので、記憶できていた人はそっとブラウザを閉じてください。）

この点をおさえると、対処法も見えてきます。

## 自分のことばで表してみる

なにかを理解しようと思った場合、**「読む」ことよりも「書く」ことが重要になる**。という考えがあります。

> 何かを長いあいだ学びつづけたければ、内容を書き留める必要があります。そして、何かを本当の意味で理解したいなら、自分の言葉に直さなければなりません。メモのポイントは、自分の言葉で書くことです。[^2]

たとえばあるコードのまとまりに自分のことばでコメントをつける。これはシンプルかつ効果的な作戦でしょう。

publicなメソッドにJavaDocがなければ、まずこれを埋めてみるのも良さそうです。他の人にも伝わる内容を書けたときはPRにすると、それだけでも一定の貢献になります。

## 無責任な「試行リファクタリング」をためす

自分のことばで「コメントを書く」以外には、自分のことばで「コードを書く」方法もあります。

**『良いコード／悪いコードで学ぶ設計入門』** では、これを **試行リファクタリング** と呼んでいます。

> これ〔試行リファクタリング〕は正式にリファクタリングするのではなく、ロジックの意味や構造を分析するためにお試しでリファクタリングするものです。[^3]

コミットしないことを前提にコードを書き換える。これはコードが汚い場合にとくに効果を発揮します。

多少の間違いがあっても気にせず、テストコードも書きません。ネストを小さくしてみたり、一部の処理を関数化してみたり、適当なクラスをつくってみたり。

とにかく既存のコードを自分のコードに染める感覚で、無責任にリファクタリングを進めます。

ある程度コードを書いた頃には、処理の内容が以前より把握できているでしょう。その後実際にリファクタリングを行うつもりなら、その設計も進んでいるはずです。

## まとめ

「コードを読む」という業務はよく発生します。

エンジニアによっては、業務のほとんどがコードを読む時間にあてられるかもしれません。

もし困ることがあれば、自分を責めずに **「自分のことば・コードで書く」** という方法を試してみることをオススメします。

## 参照

- [TAKE NOTES!メモで、あなただけのアウトプットが自然にできるようになる](https://amzn.to/3C0NzOd)
- [良いコード／悪いコードで学ぶ設計入門―保守しやすい　成長し続けるコードの書き方](https://amzn.to/3SS7oNM)

## 備考

この記事では「ファイル単位のコードを読む」ことを主なテーマにしています。

もっと全体的なコードの把握（機能の理解）をする場合は、下記を参照するとよいと思います。

- [コードリーディングのコツは極力コードを読まないこと｜牛尾　剛｜note](https://note.com/simplearchitect/n/n8cd219056536)

[^1]: 自分の書いたコードですら、ある程度の時間が経てば「他人化」するでしょう。

[^2]: ズンク・アーレンス. TAKE NOTES!メモで、あなただけのアウトプットが自然にできるようになる (Japanese Edition) (p. 52). Kindle Edition. 

[^3]: 良いコード／悪いコードで学ぶ設計入門―保守しやすい　成長し続けるコードの書き方 p.310
Falco Ruleを紹介するシリーズ - create_files_below_dev

本シリーズでは、ランタイム脅威検知のデファクトスタンダードである<a href=https://falco.org/ target=new>Falco</a>の検知Ruleを、１つの記事で１つ簡単に紹介していきます。
ランタイムセキュリティやFalco自体の概要を知りたい方は<a href=https://sysdig.jp/blog/intro-runtime-security-falco/ target=new>こちらのブログ記事</a>をご参照ください。
今回ご紹介する検知Ruleは<b>「create_files_below_dev」</b>です。
# Rule記述
```
- rule: Create files below dev
  desc: creating any files below /dev other than known programs that manage devices. Some rootkits hide files in /dev.
  condition: >
    fd.directory = /dev and
    (evt.type = creat or (evt.type in (open,openat,openat2) and evt.arg.flags contains O_CREAT))
    and not proc.name in (dev_creation_binaries)
    and not fd.name in (allowed_dev_files)
    and not fd.name startswith /dev/tty
    and not user_known_create_files_below_dev_activities
  output: "File created below /dev by untrusted program (user=%user.name user_loginuid=%user.loginuid command=%proc.cmdline file=%fd.name container_id=%container.id image=%container.image.repository)"
  priority: ERROR
  tags: [filesystem, mitre_persistence]
```
# Rule概要
/devディレクトリ配下に、ファイルが作成されたことを検知します。
/devはLinuxのデバイスファイルが配置されているディレクトリで、一般的にデバイス管理を行うプログラム以外によってファイルが作成されることはありません。
通常使用時には滅多にユーザーがアクセスしないディレクトリであるため、rootkitなどがファイルの隠し場所として利用することがありますが、このRuleを使うことで検知可能です。

# Condition（条件）
`fd.directory = /dev`
/devディレクトリで、

`and (evt.type = creat or (evt.type in (open,openat,openat2) and evt.arg.flags contains O_CREAT))`
ファイルが作成、もしくはファイルが存在しない場合には作成する条件付きでオープンされ、

かつ

`and not proc.name in (dev_creation_binaries)`
プロセス名がデバイスを作成するバイナリーではなく、

`and not fd.name in (allowed_dev_files)`
ファイル名が許可されたデバイスファイル名ではなく、

`and not fd.name startswith /dev/tty`
ファイル名が/dev/ttyから始まらず、

`and not user_known_create_files_below_dev_activities`
/dev配下でのファイル作成の既知の条件にも合致しない場合

# Output（出力）
信頼されていないプログラムによって/dev配下にファイルが作成されました。

`%user.name`
ユーザー名

`%user.loginuid`
ユーザーのログインUID

`%proc.cmdline`
コマンドライン

`%fd.name`
ファイル名

`%container.id`
コンテナID

`%container.image.repository`
コンテナイメージリポジトリ
ALB/NLBアクセスログが出力できない時の注意点

# はじめに
ALB/NLBのアクセスログ出力設定時によくあるエラーとして、
以下例の通り出力先バケットの権限エラー(**Please check S3bucket permission**)が挙げられるかと思います。

本記事はバケット権限エラーに直面した際の確認観点を共有させていただき、同様のエラー対応に悩んでいるかたの救いになれば幸いです。

例）出力先バケットの権限エラー
![2022-08-13_10h54_44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1764568/f2fde6f6-7bbd-b847-c35f-a493d9a26f5c.png)


# エラー発生時の確認観点

### ①S3バケットポリシーを付与しているか
アクセスログを出力するためには、出力先S3バケットポリシーを付与する必要があります。
※S3のバケットポリシーは[こちら](https://docs.aws.amazon.com/ja_jp/elasticloadbalancing/latest/application/load-balancer-access-logs.html#access-logging-bucket-permissions)を参考。

```json:s3バケットポリシー(例)
{
	"Version": "2012-10-17",
	"Statement": [
		{
			"Effect": "Allow",
			"Principal": {
				"AWS": "arn:aws:iam::<elb-account-id(AWS公式指定のアカウント)>:root"
			},
			"Action": "s3:PutObject",
			"Resource": "arn:aws:s3:::<出力先S3バケット名>/AWSLogs/<自分のアカウント>/*"
		}
	]
}
```
※AWS公式指定の他アカウントを指定しているが、○○につき
閉域網であるプライベートサブネット内でも出力可能である。

### ②S3暗号化キーがタイプがSSE-KMSになっていないか
2022年8月現在、ALB/NLBのアクセスログ出力先バケットがKMS暗号化を行っていた場合、
直接的な出力が不可能である。
※[本リンク](https://docs.aws.amazon.com/ja_jp/elasticloadbalancing/latest/application/load-balancer-access-logs.html#access-logging-bucket-permissions)に「Amazon S3 が管理する暗号化キー (SSE-S3) を使用して、Amazon S3 アクセスログバケットに対してサーバー側の暗号化を有効にできます。」との記載あり。SSE-KMS暗号化が利用できないと明記されてはいないが、AWSサポートに確認したところ使用できないとのこと。
そのため、「暗号化の無効化」もしくは、「Amazon S3 マネージドキー (SSE-S3)」で暗号する必要がある。
![2022-08-13_11h24_27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1764568/f8ed51c9-05f5-4dc1-c849-92db0fe335ea.png)

# 最後に
上記２つの観点を確認すれば、ひとまず「Please check S3bucket permission」は解消できるかと思います
「オブジェクト脳のつくり方」の感想

 ### 読んだ本
 - オブジェクト脳のつくり方―Java・UML・EJBをマスターするための究極の基礎講座  
 - 著者：牛尾 剛
 - 初版発行：22003年7月2日
 - Amazonの紹介ページは[こちら](https://www.amazon.co.jp/%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E8%84%B3%E3%81%AE%E3%81%A4%E3%81%8F%E3%82%8A%E6%96%B9%E2%80%95Java%E3%83%BBUML%E3%83%BBEJB%E3%82%92%E3%83%9E%E3%82%B9%E3%82%BF%E3%83%BC%E3%81%99%E3%82%8B%E3%81%9F%E3%82%81%E3%81%AE%E7%A9%B6%E6%A5%B5%E3%81%AE%E5%9F%BA%E7%A4%8E%E8%AC%9B%E5%BA%A7-%E7%89%9B%E5%B0%BE-%E5%89%9B/dp/4798104183)  

 ### この本を選んだ理由
 - 新人のときに、同期に「オブジェクト指向を理解するのにおススメだよ」と勧められて  
 - アジャイル検定Lv.1の勉強からちょっと逃避もあって

 ### 学んだこと、気づいたこと
 - 「オブジェクト指向とは？」は、この1冊を読めば十分理解できると思う。
 - 自分ではオブジェクト指向を分かったつもりでいたけど、自分の言葉で説明できるか？となったら説明できなかった。「クラスとは何か？」ですら、文章にならなかった。
 - 「オブジェクト指向とは？」だけでなく、かなり具体的に業務(コード)に反映する流れが説明されていたり、オブジェクト指向を周りに伝えるテクニックの記載もあって、最後はバーチャル業務プロジェクトでイテレーション2回分の開発を体験できる。内容が厚い。
 
 ### 雑感
 - 20年近く前の本なのに、アジャイルの考え方がもう前提にあって驚く。でもこの本を買った新人当時の自分はC言語の組み込み業務をやっていて、アジャイルのアの字も理解できずに終わってしまった。もったいなかった。  
(実は新人当時は、2章以降は難しくて寝落ちして読み切れなかった。)
祝日マスタを日付で割り当て休日フラグを作成する(SPSS Modeler データ加工逆引き1-12)

# 祝日マスタを日付で割り当て休日フラグを作成

![スクリーンショット 2022-08-08 18.06.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/323d7d18-1bf6-046a-82db-49ff175668d9.png)

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

・売上/在庫予測のための特徴量作成
・価格弾力性分析のための特徴量作成

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

https://github.com/yoichiro0903n/blue/raw/main/holiday_master2024.str

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

![スクリーンショット 2022-08-09 7.23.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/d5c07f34-0984-289a-1961-a70d4c4dd082.png)

a.対象にするデータは以下の通りです。2012年1月1日から2023年12月31日までの11年の日毎データです。
![スクリーンショット 2022-08-09 7.25.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/296ac3b5-4ae4-a9ce-af52-aa90670924db.png)

b.祝日マスタを確認します。
![スクリーンショット 2022-08-09 7.26.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/7bd703d3-fb08-5851-87bd-19b448091e21.png)

c.[レコード結合]ノードを編集します。[レコード結合方式]を[キー]にして[日付]で部分外部結合します。
![スクリーンショット 2022-08-09 7.27.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/b44bad2c-22d5-82fe-b444-4c5b561e1a92.png)

d.[置換]ノードを編集します。レコード結合時にできるNULL（欠損値）を空白に置換します。
![スクリーンショット 2022-08-09 7.29.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/321a0cba-0100-f69a-e754-561ce2b5218e.png)

e.[フィールド作成]ノードを編集します。土曜日または日曜日または空白ではない条件で休日フラグを作成します。
![スクリーンショット 2022-08-09 7.28.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/db8cc6ce-a13b-74f1-49e4-8b3a4f0f8c67.png)

[プレビュー]します。
![スクリーンショット 2022-08-09 7.30.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/c699f3e2-0a2b-37e4-fea1-87758105a959.png)

#### 注意事項

2012年以前と2024年以降が必要な場合にはマスタに情報を追加してお使いください。

## 4.参考情報

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

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

https://qiita.com/kawada2017/items/c41f443e5246d331bea1

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

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

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

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