OmniAICreator/Qiita-1.07M huggingface dataset:
Visual Studio CodeでサクッとPythonの環境を構築する

いつもと違うマシンや開発メンバーの間で環境差を少なくしたいからDocker使って開発環境を整えるのが自分の中でトレンドなので自分メモ。内容の精査はしてないです。

## 必須

利用してるのはWindows11。macOSでも一緒。Linuxはデスクトップで使ってないから不明だけど多分一緒。

- Visal Studio Code
    - Remote Containers
- Docker for Desktop

## Get Started

### 設定ファイル作成

任意のフォルダからVisual Studio Codeを起動し`Ctrl+Shift+p`でコマンドパレットを呼び出す。
そこから`Add Development Container Configuration Files...`を選択する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2396/2f9b16b8-474f-399d-38b6-8c103facef86.png)

一覧の中からPython 3を選択し、あとはすべてデフォルトでいいのでひたすらEnterを押す。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2396/300af2da-7bcc-b755-3980-26c6c2abe43d.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2396/c3bacef8-54f3-6007-31a7-841c88dddf74.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2396/df8186a9-d5da-64e0-589e-7f8ed1e77b10.png)


### イメージのビルドとコンテナ起動

設定ファイルが自動生成されたらコンテナで開くかを聞かれるので`Reopen in Container`ボタンをクリックしてコンテナを起動する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2396/a634555a-d735-7b33-dac4-8f5cb8f4b243.png)

するとVSCodeが別ウィンドウで開き直して下記画面左下のように「Dev Container: Python 3」と表示されたらコンテナ上でPython3の開発環境が作成完了。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2396/5c572e80-a33a-32cf-21fe-f7a23ef45e2c.png)

あとは普通にREADMEやらソースコードを作っていけばOK。

Pythonのライブラリをインストールするならrequirements.txtを用意してdevcontainer.jsonの`postCreateCommand`に指定しとけば起動時に自動でpipが走るので便利。開発用と利用するライブラリ用に分ける場合は`&&`でコマンドを繋げるといい。

もしPillowやpython-mecabのようにOSに追加インストールされたライブラリを利用するようなものがあれば、`.devcontainer/Dockerfile`でインストールコマンドを書いとく。
◇Windowsのバッチファイルで管理者権限の付与（空白名対応版）

# ◇管理者権限の付与（空白名対応版）
powershellを利用したテクニックは有名なのですが、引数の引き渡しに言及したものは見たことがありませんでした。
どうもファイル名、フォルダ名に空白を含むと誤動作をすることが原因だったようです。
私も指摘を受け空白が含まれているファイル名、フォルダ名に対応するものに作り直しました。
バグが残っている可能性はありますが掲載いたします。

:::note info
【 ポイント解説 】
以前からあるバージョンはバッチファイルを直接起動し自身はそのまま終了する方法で管理者権限を得ています。
新しいバージョンはコマンドプロンプトを管理者権限で新しく起動する方法で管理者権限を得ています。
エクスプローラーからのバッチファイルをダブルクリックや別のファイルをドラックアンドドロップして起動した場合は違いを感じることはほとんどありません。
しかし、コマンドプロンプトから起動した場合は新しくコマンドプロンプトを起動しているため「古いウィンドウをどうするか」という問題がでてしまいます。
以下のサンプルでは「[◇Windowsのバッチファイルで実行方法を判別する][]」の利用してエクスプローラーから起動した場合のみ古いウィンドウを閉じるようにしています。
```
echo %cmdcmdline%|find /i "%~f0">NUL
if %ERRORLEVEL% equ 0 (exit)
goto :eof
```
この三行を書き換えることで管理者権限へ移行時の処理を変更できます。
以下に変更候補の例を紹介します。
|記述|結果|
|:-|:-|
|goto :eof|バッチファイルを終了させます。|
|exit|コマンドプロンプトを閉じます。|
|Timeout /t 3 /nobreak|指定秒待機後、処理を続行します。上記と組み合わせて使用します。|

あくまで一例ですが、参考になれば幸いです。
:::

<details><summary>管理者権限付与（引数、空白対応版）</summary>

```bat
:: 遅延展開宣言 バグの原因になる場合があります;
setlocal enabledelayedexpansion


:: 管理者権限がない場合は管理者権限で実行し直す;
openfiles>NUL 2>&1
if %ERRORLEVEL% equ 0 (goto :Admin)
set ARGV=&&for %%a in (%*) do (set ARGV=!ARGV! \"%%a\")
powershell.exe -Command Start-Process %comspec% -ArgumentList "'/c, \"%~f0\", %ARGV%'" -Verb Runas
echo %cmdcmdline%|find /i "%~f0">NUL
if %ERRORLEVEL% equ 0 (exit)
goto :eof
:Admin
```
</details>

:::note info
サンプル中、引数を処理する部分にさらに手を加えた物を使用しています。
ここだけ抜粋して他へ応用できます。
:::

<details><summary>管理者権限付与の動作テストサンプル</summary>

```bat:ElevateAdmin.bat
@echo off


:: 遅延展開宣言 バグの原因になる場合があります;
setlocal enabledelayedexpansion


:: 管理者権限がない場合は管理者権限で実行し直す;
openfiles>NUL 2>&1
if %ERRORLEVEL% equ 0 (goto :Admin)
set ARGV=&&for %%a in (%*) do (set ARGV=!ARGV! \"%%a\")
powershell.exe -Command Start-Process %comspec% -ArgumentList "'/c, \"%~f0\", %ARGV%'" -Verb Runas
echo %cmdcmdline%|find /i "%~f0">NUL
if %ERRORLEVEL% equ 0 (exit)
goto :eof
:Admin


set ARGV=&&set ARGC=0
for %%a in (%*) do (set /a ARGC+=1&&set ARGV!ARGC!=%%a&&set ARGV=!ARGV! \"%%a\")

echo.
echo 0=%%0[%0]
echo %%*=[%*]
echo.
echo ARGC=[%ARGC%]
echo ARGV=[%ARGV%]
echo.
echo 1=%%1[%1], ARGV1[%ARGV1%]
echo 2=%%2[%2], ARGV2[%ARGV2%]
echo 3=%%3[%3], ARGV3[%ARGV3%]
echo 4=%%4[%4], ARGV4[%ARGV4%]
echo 5=%%5[%5], ARGV5[%ARGV5%]
echo.


:: 終了処理（エクスプローラーから起動されていた場合はPauseする）;
:EndProcess
echo %cmdcmdline%|find /i "%~f0">NUL
if %ERRORLEVEL% equ 0 (pause)
goto :eof
```
</details>

色々なバージョンがありますが参考に掲載します。

<details><summary>管理者権限付与（旧版）</summary>

```bat
:: 管理者権限で実行されていない場合、自分を管理者権限で実行し直す;
openfiles > NUL 2>&1
if %errorlevel% neq 0 (
powershell start-process %~0 -verb runas
goto :eof
)
```
</details>

[◇Windowsのバッチファイルで実行方法を判別する]: https://qiita.com/aromatibus/items/2057298fde81e84c39b1


# おわりに

他にも「[⧉Windowsのバッチファイルのテクニックをご紹介します][]」にてご紹介させて頂いております。
お時間ありましたら覗いてみてください
お粗末様でした。

https://github.com/Aromatibus/

[⧉Windowsのバッチファイルのテクニックをご紹介します]: https://qiita.com/aromatibus/items/12fa4775f38c9889a686
デューティ比がわかったからどうなのかという話

# はじめに
ラズパイでLチカに成功したのでどんどんいこう
でも早速「デューティ比」っていう言葉が現れて
何がうれしいのかわからないのでちょっと調べる

# デューティ比とは？
https://www.marutsu.co.jp/pc/static/large_order/zep/m-z-picoled-da1

の言葉を引用すると

```
ON時間をT_on，OFF時間をT_offと定義します．周期(T)は，T_onとT_offを足し合わせた時間です．
周期Tの逆数(1/T)は繰り返し周波数(f)です．
そして，周期(T)のうON時間が占める割り合いを「デューティ比」と呼びます．図9(b)に示す式で表されます．
```

なるほど。そういうもんなんですね。
だから、LEDをチカチカさせたいならディーティ比を変えたらいいよってことはわかった。
だからなんなのか。というところがピンと来てない。

# デューティ比がわかると実効電圧を調整させることができる
チカチカさせ具合を表すだけで用語になるわけないのでもうちょっと掘り下げよう。

https://dotstud.io/docs/pulse-width-modulation/

によると、「デューティー比を変えることで入力電圧を変えずに電圧を上げ下げさせることができる」そうだ。
急に専門的な感じになったぞ！

「実効電圧」という言葉がある。これは、見かけ上の電圧のことで、
実行電圧は電圧の最大値とデューティー比の積で表すことができるそうだ。

だから、最大２Vの電圧を持つを持つ電源で、１Vの電圧を与えたい場合は、デューティ比５０％でパルスを与えたら、機器に対して１Vの電圧を与えることができるそうだ。

これを「PWM制御」って呼ぶそうです。

# PWM制御を使ってLチカさせてみよう
従来のsleepを使って点滅させる方式のコードがこちら。
0.05秒ごとで点滅させた場合、
　周期＝T_on:0.05+T_off:0.05＝0.1秒
　周波数＝1/0.1=10Hz
　デューティ比は、T_on、T_offともに同じ時間なので50%
って計算になる。

```
import machine,utime
led = machine.Pin(25, machine.Pin.OUT)

duty=0.01

while True:
    led.value(1)
    utime.sleep(0.05)
    led.value(0)
    utime.sleep(0.05) 
```

一方、PWM制御を使って行う場合、T_on,T_offを計算しなくても
pwm.freq(10)って書けば、10Hzって設定できる。
更にデューティ比を調整するにはpwm.duty_u16()で行う。

()の中は16ビット(0～65535)の整数値を引数として入れてデューティ比を設定。
引数が0のときは0％，65535のときが100%となる。

なので、、、デューティ比50%とするには
pwm.duty_u16(int(65535*50/100))としてやる。
以上を踏まえたコードがこちら。

```
from machine import Pin,PWM

pwm = PWM(Pin(25))
pwm.freq(10)
duty = 50 #0~100
pwm.duty_u16(int(65535*duty/100))
```

画像で紹介できないのが残念だけども、実際にやってみたら全く同じ具合のLチカになった。
あと、 
***10Hzだと人間的にはチカチカ点滅して見えるけど、100Hzだと人間的にはわからなくなる***
そうです。実際にやってみたらそうだった。なるほどねぇ～。

# デューティ比を変えてみよう
話を戻すとデューティ比を変えると、実行電圧が変えることができる。
なので、デューティ比を100%にすると電圧100%で、50%にすると電圧50%になる。
これをLEDに当てはめると、デューティ比100%の方よりもデューティ比50%の方が暗くなる、という話。

激しく伝わりにくいけど、実際に試したコードがこちら。
今回はLチカさせずに100Hzで試してみたところ、確かに明るさが変わった

```
### duty比＝90%
from machine import Pin,PWM

pwm = PWM(Pin(25))
pwm.freq(100)
duty = 90 #0~100
pwm.duty_u16(int(65535*duty/100))

### duty比＝10%
from machine import Pin,PWM

pwm = PWM(Pin(25))
pwm.freq(100)
duty = 10 #0~100
pwm.duty_u16(int(65535*duty/100))
```

ちなみに。。。これをsleep使って再現しようとしたコードがこちら

```
### duty比＝90%
import machine,utime
led = machine.Pin(25, machine.Pin.OUT)

duty=0.01

while True:
    led.value(1)
    utime.sleep(0.009)
    led.value(0)
    utime.sleep(0.001) 

### duty比＝10%
import machine,utime
led = machine.Pin(25, machine.Pin.OUT)

duty=0.01

while True:
    led.value(1)
    utime.sleep(0.001)
    led.value(0)
    utime.sleep(0.009) 

```

結果は全く同じになった。すごいー。
なるほど、これがデューティ比。PWM制御。
◇Windowsのバッチファイルで複数行のコメントを書く

# ◇複数行のコメントについて
コメント記述は通常"[rem][]"ですが、そのほかに"::"が利用できます。
この:（コロン）を二つ重ねたものはラベルの記載方法を利用したもので公式のものではないテクニックとなるようですが、複数行に渡ってコメントをする方法が公式にあることはあまり知られていません。
方法は公式のマイクロソフトドキュメント「[rem][]」に記載されていますので抜粋します。

<details><summary>複数行のコメントのサンプル</summary>

```bat:Sample.bat
Rem/||(
    The REM statement evaluates to success,
    so these lines will never be executed.
    Keep in mind that you will need to escape closing parentheses
    within multi-line comment blocks like shown in this example. ^)
  )
```
</details>

### ・コメント行のバグについて
"Rem/||()"を使ったコメントは公式にしては色々と問題を起こします。
私自身それほど利用する機会はないため検証できていません。仕様と割り切るしかなさそうです。
"::"のコメントについても問題を起こすケースがありますが、こちらは行末に";"を付けることで回避できます。

:::note info
※2022/07/14
「[DOSバッチファイルの複数行のコメント][]」にバグ？について記載を見つけました。
「FORおよびIFコマンドは、解析されるため、閉じ括弧と無効な構文には注意する必要があります。」
とのことです。
:::

[rem]: https://docs.microsoft.com/ja-jp/windows-server/administration/windows-commands/rem
[DOSバッチファイルの複数行のコメント]: https://www.web-dev-qa-db-ja.com/ja/batch-file/dos%E3%83%90%E3%83%83%E3%83%81%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E8%A4%87%E6%95%B0%E8%A1%8C%E3%81%AE%E3%82%B3%E3%83%A1%E3%83%B3%E3%83%88/941134090/


# おわりに

他にも「[⧉Windowsのバッチファイルのテクニックをご紹介します][]」にてご紹介させて頂いております。
お時間ありましたら覗いてみてください
お粗末様でした。

https://github.com/Aromatibus/

[⧉Windowsのバッチファイルのテクニックをご紹介します]: https://qiita.com/aromatibus/items/12fa4775f38c9889a686
【初心者向け】さくらのクラウドでLAMP環境（レンタルサーバーの環境）を簡単に構築してみる

## 初めに
この前、さくらのクラウドを触る機会があったので、初心者向けにまとめます。（自分も初心者w）

## サーバー作成
まず、サーバーのダッシュボードに入ります。（https://secure.sakura.ad.jp/cloud/iaas/#!/server/list/）
なお、ログインした状態でお入りください。
するとこんな画面が表示されるはずです。
![7CED0AD8-E7C5-40EA-B5DB-ADB9E296C355.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2740290/17fa2b5c-396a-e9ac-1815-9c435e06824f.jpeg)

右上のチェックマークを押してサーバー作成に入ります。

### シンプルモードをオフ
デフォルトでは右上の「シンプルモード」にチェックが入っていると思うので、それを外してください。

### 以下のように設定
以下のように設定をしてください。
![8A4C8907-91A4-4918-AD2A-6DC7F5FE11E5.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2740290/d8f1b84d-7beb-1285-892f-970e0e36be28.jpeg)
![0CB28934-029D-4E0B-AAC5-7A7FA0EB64B1.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2740290/c8665ced-0706-05b1-3fd9-8236246641f6.jpeg)
ここ、「アーカイブを選択」というところで必ずCentOSを選択してください。
![26FE6E75-6D8E-4017-AC17-EEDE1FF7287B.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2740290/20d538d9-3fda-f044-600c-0116b6346557.jpeg)
![18D34BA2-4AC4-47B6-A5B8-FE4D44345E6B.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2740290/549314d8-0d7e-d908-5470-9c664a950477.jpeg)
パスワードはお好きなものを。
![89E7D30E-654A-47DC-86AE-71BE2DB1D4EC.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2740290/7ad47f10-4a9d-4317-5fe7-1b51570b77ef.jpeg)
はい、ここ一番重要です。
スタートアップスクリプトのshellを選択し、プルダウンメニューの中からLAMPを選択してください。
LAMPとは、Linux、Apache,MySQL,Perl、PHP、Pythonのこと。
これさえあれば大体のことはできます。
![20288F48-0A85-44F5-97C2-3836FD7DA477.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2740290/5e462093-286a-b738-0735-954898ecc2df.jpeg)
ここ、「インストールされいているパッケージをアップデートする」は、もしやりたければ選択していただいて構いません。
パスワードはご自由に〜
![7B7C72AF-5337-4C3D-B80A-109B3B470BF0.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2740290/fe668f5d-8302-8171-ea6b-12860b8d4572.jpeg)
サーバーの名前は「MyServer」にしました。
なんか親近感湧きません?
![BC19BFD9-FD9F-4B85-AF65-FF020E934AE8.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2740290/87d656b5-8200-cbf3-cb69-12697d06aa38.jpeg)

これで、作成をしてください。

### アクセスしてみる。
作成が終わったら、サーバーのダッシュボードに戻ってください。
![DEE248A9-B6FC-48C6-BE43-F6FF8DDEC054.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2740290/98016857-14cd-6a75-d38b-d40ccc9b57bc.jpeg)
NICのところにIPアドレスが表示されていると思うので、それをコピーANDブラウザにペースト、開いてみてください。
![E1256CAA-10FA-4191-9674-D75E09A64744.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2740290/e967dace-2bca-d51a-beab-f1b8737589b8.jpeg)
こんな感じの画面が出れば大成功。

### ssh接続してみる。
お手持ちのsshができるFTPクライアントを使用して、ssh接続をしてみましょう。
```
ホスト・IPアドレス
ユーザー名・root
パスワード・先ほど管理画面で設定したもの
```
うまくできるはずです。
ホームディレクトリは```/var/www/html/```ですので、
![58B0C9C3-BB87-4F00-9028-C6E3089AE996.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2740290/ba98031f-5ca7-2e37-e740-b1be0fbe324b.jpeg)
このように保存すると・・・

![0AE4580C-8A98-4850-A7B5-C2313C1D2F5A.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2740290/e7a734bc-d7e2-cedc-e77a-1cafeeda8929.jpeg)
こんなふうにブラウザで表示されると思います。
なお、phpやpythonなども使えると思いますので、ぜひ、お試しください。

## 追記
2023年6月22日現在、LAMPのスタートアップスクリプトが行方不明になっております。
そんな時は、こちらのリポジトリからダウンロードしてください。

https://github.com/sakura-internet/cloud-startupscripts
ABC249 B Dif:47 『AtCoder ABC226～250 ARC129～139 灰・茶・緑問題 超詳細解説』サンプル

この記事は **『AtCoder ABC226～250 ARC129～139 灰・茶・緑問題 超詳細解説』** のサンプルです。

値段：**300円(Kindle Unlimited対象)**
**【kindle】**
https://www.amazon.co.jp/dp/B0B7G13QMS

**【booth(pdf)】**
https://sano192.booth.pm/items/4025713

**ARC129～139の部分のみ抜粋した廉価版** もあります。
値段：**200円(Kindle Unlimited対象)**
**【kindle】**
https://www.amazon.co.jp/dp/B0B7G337YF

**【booth(pdf)】**
https://sano192.booth.pm/items/4025737

**【サンプル一覧】**
ABC228 A：https://qiita.com/sano192/private/f8f09ea769f2414a5733
ABC249 B：https://qiita.com/sano192/private/daf74d7c31bc698d33ce
ABC226 C：https://qiita.com/sano192/private/3aa26373ca6cfcb3ef0f
ABC246 D：https://qiita.com/sano192/private/a22aadde99945bfb01a8

「ものすごく丁寧でわかりやすいABC解説」シリーズをベースに【キーワード】【どう考える？】【別解】を追加し、【解説】と【実装のコツ】を分けることでよりわかりやすく、具体例や図もより豊富に全ての問題の解説を書き直しました！
さらにQiitaでは公開していないARC129～139の灰・茶・緑問題も解説しています！
緑を目指す灰・茶コーダーの方へおすすめ！

https://qiita.com/sano192/items/54accd04df62242b70f0

https://atcoder.jp/contests/abc249/tasks/abc249_b

**【キーワード】**
なし

**【どう考える？】**
大文字、小文字の確認はisupperまたはislowerを使えば簡単。これらを知らなくても「python 大文字 判定」等で検索すればすぐに出てくる。
重複がないかはそれぞれの文字について二重ループで確認する。

**【解説】**
まず「大文字があるか」「小文字があるか」を1文字ずつ確認する。それぞれあればTrueとなるような変数を用意しておけばいい。

重複の有無確認については(i,k)=(0,1),(0,2),(0,3),...,(1,2),(1,3),...についてSのi文字目とk文字目が違う文字になっているかを確認する。
※Sの左端を0文字目、次を1文字目、...と呼ぶ。

**【実装のコツ】**
**\<for x in (文字列)>**
for x in (文字列)と書くことで(文字列)の文字を1文字ずつ順にxへ格納しながら処理ができる。
便利な書き方なので是非覚えてほしい。

**\<isupper/islower>**
(文字).isupper()
と書くことで(文字)が大文字かどうかを確認できる。大文字ならTrue、小文字ならFalseが返ってくる。

**\<二重ループ>**
forの中にもう一つforを入れることを「二重ループ」という。競技プログラミングでは必須のテクニック。
具体的には以下のように書く。

```python:
# i=0~(N-1)
for i in range(N):
    # k=(i+1)~(N-1)
    for k in range(i+1,N):
```

こうすることで(i,k)は
(0,1)
(0,2)
(0,3)
...
(1,2)
(1,3)
(1,4)
…
(2,3)
(2,4)
...
(N-1,N-2)
という順番で格納され、処理ができる。

**【提出】**

```python:
# 入力の受け取り
S=input()

# 「大文字が存在するか？」を管理する変数
OmoziExist=False
# 「小文字が存在するか？」を管理する変数
KomoziExist=False

# x：Sの各文字
for x in S:
    # xが大文字なら
    if x.isupper()==True:
        # 「大文字が存在するか？」をTrueに
        OmoziExist=True
    # そうでない場合(xが小文字)
    else:
        # 「小文字が存在するか？」をTrueに
        KomoziExist=True

# 大文字が存在しない　または　小文字が存在しないならば
if OmoziExist==False or KomoziExist==False:
    # 「No」を出力
    print("No")
    # 途中終了
    exit()

# Sの文字数
N=len(S)

# i=0~(N-1)
for i in range(N):
    # k=(i+1)~(N-1)
    for k in range(i+1,N):
        # 重複⇔(Sのi文字目)=(Sのk文字目)
        if S[i]==S[k]:
            # 「No」を出力
            print("No")
            # 途中終了
            exit()

# 「Yes」を出力
print("Yes")
```

**【別解】**
(文字列).isupper()は(文字列)が全て大文字の場合のみTrueを返す(islowerも同様)。
また、重複があるかは重複した要素が入らないsetに一文字ずつ入れ直し、元の文字と長さを比較することで確認可能。

```python:
# 入力の受け取り
S=input()

ans="Yes"

# Sが全て大文字または小文字なら「No」
if S.isupper() or S.islower():ans="No"
# Sをsetに展開した長さとSの文字数が一致していなければ「No」
if len(set(S))!=len(S):ans="No"

print(ans)
```
実装がうまくいく時

## はじめに


実装がうまくいったな〜という時に、何を意識していたかメモします。

**逆に失敗する時は大体この中のどれかを忘れています。**

エンジニアやチームの個性によって上手くいくもの・いかないものがあると思いますが、参考になれば嬉しいです。


## 処理を言語化できている

どんなコードを書くのか、日本語で説明できます。

**自分が1番得意な言語は日本語なので、
日本語で説明できないことはコードに落とし込むこともできません。**

例えば「変数Aを引数に、メソッドAを呼んでid=>インスタンスAのマップを作る」といった感じでしょうか。

ただ全処理を詳細に言語化すると時間がかかりすぎるので、理解度が高い部分は言葉の粒度を荒くします。
※「サービスのメソッド呼んでマップ作る」など

**自分がこれからどんなコードを書くのか、言語化**すると手戻りも減って実装がうまくいきます。


## 必要なときに必要なものをつくる

必要にかられて初めて実装します。

**「後で使いそう、、」と思って必要性が低いコードを追加しても大体「使わない or 後で書き換える」からです。**

個人的によく失敗するパターンが
「リソースを節約しようとして、無駄に複雑なコードを書いてしまう」です。

<br>
<br>

自分がよく触るApexはリソース制限が厳しく「処理時間・クエリ発行回数・ヒープサイズ」などを常に意識するのですが、 
 
意識しすぎて最初から「この情報はマップのキーに持っておいて、2つ先のメソッドで使って、、」と複雑な処理を書きがちになってしまいます。

そして先読みして書いたコードは、
しばしば書き換えることになります。

<br>
<br>

初めから最適解を組める方もいるかもしれませんが、今の所自分には難しいなと。

先読みしすぎず、その時必要になったものを小さく作るようにします。


## 先に呼び出し側から書く

以下の順番でコードを書きます。  
  1. 呼び出し側  
  2. 呼び出される側

理由は以下です。

- 呼び出し側がゴールになるので、**ゴールから逆算しながらコードを書ける**

- 複雑な処理は呼び出される側で吸収するので、**できることが少ない呼び出し側を先に書いてあげる**

<br>

自分の場合は以下のような書き方になります。

- フロントもバックエンドも書く時

	- フロント（呼び出し側）を先に書いて、その後バックエンドを書く

- バックエンドだけ書く時

	- 1番最初に起動する関数（呼び出し側）を先に書いて、その後呼び出される側を書く
<br>

自分が言語化した通りに進められるのが理想ですが、
書いてるうちに「あ、これ考慮漏れてた」というのはどうしても起こります。

そんな時に呼び出し側から書いていると**考慮漏れに気づきやすくなり、直しやすくもなるな〜**というのが印象です。


## まとめ

皆さんの「自分はこうやると実装うまくいくよ」というのも教えていただけると嬉しいです。

最後まで読んでいただき、ありがとうございました。
第9回 UiPath Friends 全国 ～差がつく夏期講習2022に行ってきた

# はじめに
タイトルの通り、
昨日（2022/07/22）参加してきたイベントで特に勉強になった内容を
メモとして残そうと思います。

# イベントURL
https://www.youtube.com/watch?v=5E-oTQLCNsc

これに会場参加してきました。
YouTubeでも配信しているので、ぜひ見てみてください。

# 内容のアウトプット
会場で必死こいてメモとったので、
余裕がなく間違っている部分があるかもしれません。
何かあったら教えてください。。。

## Activity Creatorを使ってカスタムアクティビティを作る
### 簡単な内容まとめ 
Activity CreatorはVS（Visual Studio）にインストールする拡張機能。
インストールすると、アクティビティを開発するのに必要な最低限の参照も自動で入る。
IN/OUTの定義部分もわかりやすくコメントで教えてくれているので、ゼロベースの開発に比べて定義ミスが減る。
また、アイコン・ライセンスについてもVS上で設定ができるため非常に手間が省ける。

### 所感
VS上で完結できるのであれば、カスタムアクティビティ開発のハードルが下がるのではと思った。
現在自分もカスタムアクティビティを開発しているので、詳細に調査して自分の血肉としていきたい。

## エンジニアブログの書き方
### 簡単な内容まとめ 
調査～書き上げのタイミングでもやもやタイムに突入しがち。。。
突入した時は積極的に誰かにレビューしてもらうことで抜けるようにしている。

発信で大事にしていることは、
* 書いていて楽しいか
* 記事のターゲットを定めること
* 記事が読みやすいこと
* 環境に再現性があること
* 読みやすさだけでなく、血肉の通った文であるか（個性がでているか）

また、UiPathFrendsでもエンジニアブログ発信の環境ができているので、レビューしてもらうのにおすすめ。

### 所感
自分が発信するうえで、自分がこだわりたいことについて考えてみるのがいいかもしれないとのことだった。

…自分が発信するうえで大事にしていることは、
『人に伝わるかも大切だが、その前に発信した自分（特に未来の自分）が読んで理解できるか』

自分が理解しないと、人には伝えられないと思う。
何より自分自身がせっかく学んだことを身にできないのはふがいない。
忘れても、思い出せるように、思い出して人に伝えられるようにするために発信していきたい。

## RPA戦士の増やし方
### 簡単な内容まとめ 
内製化を進めるためには、RPAに興味を持ってもらうことが大切。

内製化のために重要な４つのポイント
* オリエンテーション
* 開発講習（レベル別）
* 教育コンテンツ配信/QA整備
* 管理職講習

### 所感
RPA戦士←これすき
今自分も内製化に携わっており、
ぜひ現場に持ち帰ってみんなで業務改善していきたいと思った。

# イベント中にこれいいな、と思ったこと
* みんなとても気さく。初めてでがちがちに緊張していたが、すぐにほぐれた。
* イベント中スクリーンが見えないことがあったのだが（視力的な意味で）、隣の人がYoutubeの配信を見ながらメモしているのを見て、次回は自分も真似しようと思った。

# おわりに
初めての参加でしたが、とても楽しかったです。
楽しいだけでなく、自身が学ぶためのきっかけも得ることができたので、
とても有意義な時間だったと思います。
また参加したいです。
【GitHub】Permissionがないよ～！

# はじめに

### やりたいこと

GitHubのアカウントを作成（２個目）

### 困ったこと

```sh
remote: Permission to {リモートユーザ名}/{リポジトリ名}.git denied to {ローカルユーザ名}.
```



# 設定方法

## 方法１：git remoteコマンドで設定

- リモートリポジトリ名にGitHubのユーザ名を明記
    - 実際に入力した後にCtrlキーを押下しながらURL部分をクリックして、ちゃんと意図したリポジトリが表示されるか確認するとよい

  ```sh
  git remote set-url origin https://<ユーザ名>@github.com/<ユーザ名>/<リポジトリ名>.git
  ```
  ```sh:例
  git remote set-url origin https://hoge@github.com/hoge/abc.git
  ```




- push

  ```sh
  git push origin main
  ```

### git remoteコマンド

- リモートリポジトリの名前を表示

  ```sh
  git remote
  ```

- リモートリポジトリの名前と場所（URL）を表示

  ```sh
  git remote -v
  ```

- 指定したリモートリポジトリの詳しい情報を表示

  ```sh
  git remote show [remote-name]
  ```

  ```sh:例
  git remote show origin
  ```

- 指定したリモートリポジトリに対して、ローカルリポジトリ側からの連携を解除する

  ※GitHub上のリモートリポジトリは削除されない

  ```sh
   git remote rm　[remote-name]
  ```

  ```sh:例
  git remote rm origin
  git remote rm upstream
  ```



## 方法２：設定ファイル編集

- 「.git/config」ファイルを修正

  （スコープはローカルなんだと思う）

  ```
   [remote "origin"]
      (修正前)  url = https://github.com/xxxx.git
      (修正後)  url = https://ユーザーネーム:パスワード@github.com/xxxx.git   #ユーザーネーム:パスワード（別アカウントの方）を追加
  ```

  引用元：https://hara-chan.com/it/programming/fatal-unable-to-access-https-github-com/

### Git 設定の 3 つのスコープ

|        | 適用範囲                             | 設定ファイルの場所                     | 設定コマンド（git config）のオプション |
| ------ | ------------------------------------ | -------------------------------------- | -------------------------------------- |
| system | システム上の全ユーザーの全リポジトリ | /etc/gitconfig                         | --system                               |
| global | 使用ユーザー                         | ~/.gitconfigまたは~/.config/git/config | --global                               |
| local  | 設定したリポジトリ                   | .git/config（設定したリポジトリ内）    | --localまたはなし                      |

引用元：https://qiita.com/C_HERO/items/c35e679f0b03a5f06469

# GitHubでhttpsのパスワード認証が廃止
エラー
  ```
   Support for password authentication was removed on August 13, 2021. Please use a personal access token instead.
  ```
対応はこちらの記事を参照
https://ios-docs.dev/20210813support-for-password/


# 参考にさせていただいたサイト

https://yama-weblog.com/can-not-push-to-remote-repo-using-git-command/

https://hara-chan.com/it/programming/fatal-unable-to-access-https-github-com/

https://qiita.com/C_HERO/items/c35e679f0b03a5f06469

https://ios-docs.dev/20210813support-for-password/
お名前.comで取得したドメイン名を使って、AWS Route53でDNSを設定する

# ホストゾーンを作成する
Route53のダッシュボードを表示してください。
「ホストゾーンの作成」をクリックしてください。
ホストゾーンの作成画面が表示されます。
お名前.comで取得したドメイン名を入力し、「ホストゾーンの作成」をクリックしてください。
![スクリーンショット 2022-07-23 9.31.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14202/6010d714-adc1-e3a7-b6ad-d1516eedb785.png)

# DNSの情報を調べる
EC2インスタンスにログインし、以下のコマンドを実行してください。
お名前.comのネームサーバが表示されます。

この時点では、お名前.comで取得したドメインはお名前.comのネームサーバーとなっています。
お名前.comのネームサーバにRoute53のネームサーバーを設定することで、hikotaro.work -> お名前.com -> Route53というルートに変わり、Route53からEC2インスタンスに割り当てたElasticIPアドレスが戻されるようになります。
```
$ dig hikotaro.work NS +short
dns2.onamae.com.
dns1.onamae.com.
```

# お名前.comのゾーンをRoute53に変更する
お名前.comのページからログインしてください。
「ネームサーバーの設定」-「ネームサーバーの設定」をクリックしてください。
![スクリーンショット 2022-07-23 9.41.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14202/e565de3f-5294-1c7f-5efc-16eb5d9311a0.png)

Route53で作成したホストゾーンのネームサーバーを確認してください。
![スクリーンショット 2022-07-23 9.43.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14202/c8a0371b-4d14-071a-58df-657864edaaa4.png)

お名前.comのネームサーバーの設定画面で、確認したネームサーバーを入力してください。
このとき、最後のピリオドは不要です。
入力が終わったら、「確認」をクリックしてください。
反映には最大24時間程度かかるようなので、しばらく待つ必要があります。
![スクリーンショット 2022-07-23 9.43.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14202/6603c6a7-e862-6f78-d886-de684b3d226a.png)

# Route53にドメイン名とIPアドレスを紐付けるAレコードを登録する
Route53のホストゾーンの画面で、「レコードの作成」をクリックしてください。
![スクリーンショット 2022-07-23 9.54.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14202/c38467a7-58bf-a6bb-f0de-088731e52af0.png)

レコードの作成画面が表示されます。
値にElastic IPアドレスを入力し、「作成」をクリックしてください。
![スクリーンショット 2022-07-23 10.00.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14202/9780f9a1-1516-0e91-626b-3149d659e7ca.png)

# DNSの情報を調べる
EC2インスタンスにログインし、以下のコマンドを実行してください。
Route53のネームサーバが表示されます。

```
$ dig hikotaro.work NS +short
ns-1317.awsdns-36.org.
ns-1707.awsdns-21.co.uk.
ns-54.awsdns-06.com.
ns-891.awsdns-47.net.
```
CoreMLToolsで"PyTorch convert function for op '_record_function_enter' not implemented."が出た時の解決法

# エラーが出て変換ができない（泣く）

CoreMLToolsでPytorchモデルをコンバートしていると、
表題のエラーに遭遇することがある。
必要なオペレーションがCoreMLToolsに用意されていないせいで、このモデルはコンバートできないんだ。。。

# 解決できる
そんなふうに思いきや、実は簡単に解決できる。
表題のエラーが出たモデルは、

torch.nn.DataParallel(module, device_ids=None, output_device=None, dim=0)

でラップされているのではないだろうか？
（もし違ったらこの解決方法は使えません、ごめんなさい）

これは、CPU、GPUでマルチプロセスできるようにするモジュールらしく、CoreMLへの変換時には必要がない。

なので、ラップしない元のモデルを変換すれば、表題のエラーは出なくなる。

```python
model = nn.DataParallel(my_model, [0])
model = model.module # Access to my_model.
model.eval()
ex_input = torch.randn([1,3,256,256])
traced = torch.jit.trace(model,ex_input)
mlmodel = ct.convert(traced,inputs=[ct.ImageType(shape=ex_input.shape,scale=1/255)])
```

どうでした？　コンバートできましたか？

🐣
****
フリーランスエンジニアです。
お仕事のご相談こちらまで
rockyshikoku@gmail.com

Core MLやARKitを使ったアプリを作っています。
機械学習／AR関連の情報を発信しています。

[Twitter](https://twitter.com/JackdeS11)
[Medium](https://medium.com/@rockyshikoku)
[GitHub](https://github.com/john-rocky)
Salesforceで最終更新日と最終活動日を比較して最新の日付を出す方法

Salesforceのレコードには
・最終更新日
・最終活動日

がございます。

最終更新日と最終活動日の詳細はこちらヘルプをご参照ください


[最終活動日] と [最終更新日] の違い
https://help.salesforce.com/s/articleView?id=000326119&type=1


活動をきちんとこなしていれば
「最終更新日と最終活動日を比較して最新の日付を表示」
という項目を作成すれば、その日付を確認すればどのレコードが最新に動いているのかが分かります。



この数式は以下の数式項目（データ型：日付）を作成すれば可能です

数式：
IF(
LastActivityDate >DATEVALUE(LastModifiedDate) ,
LastActivityDate,DATEVALUE(LastModifiedDate))


この数式の思想として
「最終活動日と最終更新日を比較し最新の日付を出す」

という数式です。
ぜひレコードの最新に動いているものを知りたいならば、この数式をご活用ください。
cscの作法 その252

# 概要
cscの作法、調べてみた。
マイナンバーのチェックデジットを計算してみた。

# 参考にしたページ

https://tokotoko-walk.net/2019-04-14_300


# サンプルコード


```

using System;
using System.Collections.Generic;
using System.Text;

namespace myNumber
{
	class Program {
		static internal bool myNumber(string target) {
			if (target.Length != 12)
			{
				return false;
			}
			bool b_hit = false;
			int[] i_calc = {
				6, 5, 4, 3, 2, 7, 6, 5, 4, 3, 2
			};
			int i_sum = 0;
			int i_remainder = -1;
			for (int i = 0; i < 11; i++)
			{
				i_sum += int.Parse(target[i].ToString()) * i_calc[i];
			}
			i_remainder = i_sum % 11;
			i_remainder = i_remainder < 2 ? 0 : 11 - i_remainder;
			if (int.Parse(target[11].ToString()) == i_remainder)
			{
				b_hit = true;
			}
			return b_hit;
		}
		static void Main(string[] args) {
			Console.WriteLine(myNumber("123456789010")); //=>False
			Console.WriteLine(myNumber("123456789011")); //=>False
			Console.WriteLine(myNumber("123456789012")); //=>False
			Console.WriteLine(myNumber("123456789013")); //=>False
			Console.WriteLine(myNumber("123456789014")); //=>False
			Console.WriteLine(myNumber("123456789015")); //=>False
			Console.WriteLine(myNumber("123456789016")); //=>False
			Console.WriteLine(myNumber("123456789017")); //=>False
			Console.WriteLine(myNumber("123456789018")); //=>True
			Console.WriteLine(myNumber("123456789019")); //=>False
			Console.WriteLine(myNumber("023456789013")); //=>True
		}
	}
}



```

# 実行結果

```
>my1
False
False
False
False
False
False
False
False
True
False
True

>
```

以上。
ブレース展開を使ったダミーデータの生成

シェルのブレース展開を使用したダミーデータの生成方法

## 環境
- OS
    - MacOS
- バージョン
```
% sw_vers
ProductName:	macOS
ProductVersion:	12.4
BuildVersion:	21F79
```

## ブレース展開を使ったダミーデータの生成
ブレース展開を使うと{}内に並べた語句の全組み合わせが出力されます。
trでスペースを改行に変換
```
% echo {ab,cd}.{ef,gh}@{ij,kl}.{jp,com} | tr ' ' '\n'
ab.ef@ij.jp
ab.ef@ij.com
ab.ef@kl.jp
ab.ef@kl.com
ab.gh@ij.jp
ab.gh@ij.com
ab.gh@kl.jp
ab.gh@kl.com
cd.ef@ij.jp
cd.ef@ij.com
cd.ef@kl.jp
cd.ef@kl.com
cd.gh@ij.jp
cd.gh@ij.com
cd.gh@kl.jp
cd.gh@kl.com
```

#### 4語以外のデータも作りたい
{}内に空の項目(カンマのみ)を記載します。
sedで余計なドット(.)を削除
```
% echo {ab,cd,}.{ef,gh}@{ij,kl}.{jp,com} | tr ' ' '\n' | sed 's/^\.//'
ab.ef@ij.jp
ab.ef@ij.com
ab.ef@kl.jp
ab.ef@kl.com
ab.gh@ij.jp
ab.gh@ij.com
ab.gh@kl.jp
ab.gh@kl.com
cd.ef@ij.jp
cd.ef@ij.com
cd.ef@kl.jp
cd.ef@kl.com
cd.gh@ij.jp
cd.gh@ij.com
cd.gh@kl.jp
cd.gh@kl.com
ef@ij.jp
ef@ij.com
ef@kl.jp
ef@kl.com
gh@ij.jp
gh@ij.com
gh@kl.jp
gh@kl.com
```

#### ランダムで並べたい
sortコマンドを-Rオプションで実行します。
```
% echo {ab,cd,}.{ef,gh}@{ij,kl}.{jp,com} | tr ' ' '\n' | sed 's/^\.//' | sort -R
cd.ef@ij.jp
cd.gh@kl.jp
ab.ef@ij.jp
ef@ij.com
gh@ij.com
ef@kl.com
ab.ef@kl.jp
cd.gh@ij.jp
cd.ef@kl.com
gh@kl.jp
ab.ef@ij.com
cd.gh@ij.com
gh@kl.com
cd.ef@ij.com
cd.ef@kl.jp
ab.gh@kl.com
ab.ef@kl.com
ef@ij.jp
ab.gh@ij.jp
ab.gh@ij.com
ef@kl.jp
gh@ij.jp
cd.gh@kl.com
ab.gh@kl.jp
```

#### もっと楽して色々な単語のドメインを含んだデータを作成したい
/usr/share/dict/wordsという英単語を含んだファイルがあり、これを使います。
```
% wc -l /usr/share/dict/words
  235886 /usr/share/dict/words
% head /usr/share/dict/words 
A
a
aa
aal
aalii
aam
Aani
aardvark
aardwolf
Aaron
```
`shuf -n1`でシャッフルした上で1つ選ぶようにして、seqで100回実行させます。
サブドメインが無いデータを作るためにわざわざ`noword.`を最後に削除しています。(もっとスマートにしたい:sweat:)
```
% seq -f 'echo $(shuf -n1 -e www api noword).$(cat /usr/share/dict/words|shuf -n1).$(shuf -n1 -e {com,org,{co.,ne.,}jp,net}) # %g' 100 | bash | sed 's/^noword\.//'
www.tulipomaniac.jp
api.headforemost.jp
margent.com
api.testiculate.jp
rah.org
protocorm.net
api.pathognomy.net
api.equiproportional.net
api.bellow.net
www.exosporium.org
```
2022-07-22 Git-bash を利用して、Windows 上でファイルのエンコーディングを確認する

<!-----

Yay, no errors, warnings, or alerts!

Conversion time: 0.354 seconds.


Using this Markdown file:

1. Paste this output into your source file.
2. See the notes and action items below regarding this conversion run.
3. Check the rendered output (headings, lists, code blocks, tables) for proper
   formatting and use a linkchecker before you publish this page.

Conversion notes:

* Docs to Markdown version 1.0β33
* Fri Jul 22 2022 02:04:41 GMT-0700 (PDT)
* Source doc: 2022-07-22 Git-bash を利用して、Windows 上でファイルのエンコーディングを確認する
* Tables are currently converted to HTML tables.
----->


## 環境


* Windows 10
* MinGW

```console
$ bash --version
GNU bash, version 4.4.23(1)-release (x86_64-pc-msys)
Copyright (C) 2016 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
```




## 方法

`file -i` コマンドを利用して確認する。


```console
$ file --help
Usage: file [OPTION...] [FILE...]
Determine type of FILEs.
...(中略)...
  -i, --mime                 output MIME type strings (--mime-type and
                               --mime-encoding)
      --apple                output the Apple CREATOR/TYPE
      --extension            output a slash-separated list of extensions
      --mime-type            output the MIME type
      --mime-encoding        output the MIME encoding
```


今回は、ファイルのエンコーディングが Shift JIS であることを確認したかった。

Shift JIS の場合は、 unknown-8bit と表示されるらしい。


```console
$ file -i ./Downloads/test.csv
./Downloads/test.csv: application/csv; charset=unknown-8bit
```
ilasmでstack machine その17

# 概要
ilasmでstack machineやってみた。
練習問題やってみた。

# 練習問題
sin波を表示せよ。

# サンプルコード

```


.assembly extern mscorlib {
}
.assembly sin {
}
.method static void main() {
.entrypoint
.locals init (float64 i)
	ldc.r8	1.0
	stloc	i
loop:
	ldloc	i
	ldc.r8	0.3
	add
	dup
	dup
	stloc	i
	call	float64 [mscorlib]System.Math::Cos(float64)
	ldc.r8	0.1
	div
	ldc.r8	20.0
	add
loop2:
	ldstr	 "  "
	call	void [mscorlib]System.Console::Write(string)
	ldc.r8	1.0
	sub
	dup
	ldc.r8	1.0
	bgt		loop2
	ldstr	 "*"
	call	void [mscorlib]System.Console::WriteLine(string)
	ldloc	i
	ldc.r8	10.0
	blt		loop
end:
	ret
}


```

# 実行結果


```
>isin
                                            *
                                      *
                                *
                            *
                      *
                    *
                    *
                    *
                      *
                          *
                              *
                                    *
                                          *
                                                *
                                                      *
                                                        *
                                                          *
                                                          *
                                                          *
                                                      *
                                                  *
                                            *
                                      *
                                *
                          *
                      *
                    *
                    *
                    *
                      *

>

```

以上。
ilasmでstack machine その16

# 概要
ilasmでstack machineやってみた。
練習問題やってみた。

# 練習問題
数9を4個つかって1から15までの数を表す式を実装せよ。

# サンプルコード

```
.assembly extern mscorlib {
}
.assembly i9999 {
}
.method static void main() {
.entrypoint
d1:
	ldc.i4	9
	ldc.i4	9
	sub
	ldc.i4	9
	ldc.i4	9
	div
	call	void [mscorlib] System.Console::WriteLine(int32)
d2:
	ldc.i4	9
	ldc.i4	9
	div
	ldc.i4	9
	ldc.i4	9
	div
	add
	call	void [mscorlib] System.Console::WriteLine(int32)
d3:
	ldc.i4	9
	ldc.i4	9
	add
	ldc.i4	9
	add
	ldc.i4	9
	div
	call	void [mscorlib] System.Console::WriteLine(int32)
d4:
	ldc.i4	9
	ldc.i4	9
	ldc.i4	9
	add
	ldc.i4	9
	div
	dup
	add
	call	void [mscorlib] System.Console::WriteLine(int32)
d5:
	ldc.i4	9
	ldc.i4	9
	ldc.i4	9
	add
	ldc.i4	9
	div
	dup
	add
	sub
	call	void [mscorlib] System.Console::WriteLine(int32)
d6:
	ldc.i4	9
	dup
	ldc.i4	9
	add
	ldc.i4	9
	add
	ldc.i4	9
	div
	sub
	call	void [mscorlib] System.Console::WriteLine(int32)
d7:
	ldc.i4	9
	ldc.i4	9
	ldc.i4	9
	add
	ldc.i4	9
	div
	sub
	call	void [mscorlib] System.Console::WriteLine(int32)
d8:
	ldc.i4	9
	ldc.i4	9
	ldc.i4	9
	ldc.i4	9
	div
	sub
	call	void [mscorlib] System.Console::WriteLine(int32)
d9:
	ldc.i4	9
	ldc.i4	9
	sub
	ldc.i4	9
	mul
	ldc.i4	9
	call	void [mscorlib] System.Console::WriteLine(int32)
d10:
	ldc.i4	9
	ldc.i4	9
	div
	ldc.i4	9
	dup
	ldc.i4	9
	div
	add
	call	void [mscorlib] System.Console::WriteLine(int32)
d11:
	ldc.i4	9
	ldc.i4	9
	ldc.i4	9
	add
	ldc.i4	9
	div
	add
	call	void [mscorlib] System.Console::WriteLine(int32)
d12:
	ldc.i4	9
	dup
	ldc.i4	9
	ldc.i4	9
	add
	add
	ldc.i4	9
	div
	add
	call	void [mscorlib] System.Console::WriteLine(int32)
d13:
	ldc.i4	9
	ldc.i4	9
	ldc.i4	9
	add
	ldc.i4	9
	div
	dup
	add
	add
	call	void [mscorlib] System.Console::WriteLine(int32)
d14:
	ldc.i4	9
	dup
	ldc.i4	9
	ldc.i4	9
	add
	ldc.i4	9
	div
	dup
	add
	sub
	add
	call	void [mscorlib] System.Console::WriteLine(int32)
d15:
	ldc.i4	9
	dup
	dup
	ldc.i4	9
	add
	ldc.i4	9
	add
	ldc.i4	9
	div
	sub
	add
	call	void [mscorlib] System.Console::WriteLine(int32)
	ret
}

```

# 実行結果

```
>i9999
1
2
3
4
5
6
7
8
9
10
11
12
13
14

>

```

以上。
視差遮蔽マッピング

# 環境
Unity2021.3.4f1

# 概要
視差遮蔽マッピング(ParallaxOcclusionMapping)です。

Depthを書き換えないシンプルなものです。

![](https://cdn-ak.f.st-hatena.com/images/fotolife/k/kenken5050/20220723/20220723093214.png)

視線方向からRayを進めてUVをずらす為、隣のピクセルとUVが連続していません。
そのため先にddx/ddyで傾きを取得しておき、tex2Dgradでテクスチャを参照します。

[ここ](https://kenken5050.hatenablog.com/entry/2022/07/23/073138)に全コード記載しています。
```hlsl
float2 dx, dy;
dx = ddx(i.texCoord);
dy = ddy(i.texCoord);

while (stepIndex < numSteps)
{
	texCurrentOffset -= texOffsetPerStep;
	prevHeight = currHeight;
	currHeight = tex2Dgrad(_HeightTex, texCurrentOffset, dx, dy).r;
	currentBound -= stepSize;
	stepIndex = (currHeight > currentBound) ? numSteps : stepIndex + 1;
}
```

![](https://cdn-ak.f.st-hatena.com/images/fotolife/k/kenken5050/20220723/20220723072645.png)
通常のtex2Dで行うとエッジ部分や遠景が汚くなりました。

# 参考

http://maverickproj.web.fc2.com/pg97.html
サイバーセキュリティお嬢様「ハクティビストってなんですの？」

# ある日
サイバーセキュリティお嬢様（以下CSお嬢様）「ねぇじいや」

じいや「なんですかなお嬢様」

CSお嬢様「**サイバー攻撃は、結局何者がどんな目的でやっているのか**教えてちょうだい」

じいや「じいやはお嬢様のやる気が感じられて嬉しいですぞい」
じいや「それでは早速クラッカーの種類を見ていきますぞー！」

# スクリプトキディとは
じいや「まずはスクリプトキディが挙げられますな」

CSお嬢様「なんだかキ○ィちゃんみたいで可愛らしいですわね」

じいや「スクリプトキディは、英語で書くと分かりやすいですぞ」
じいや「script kiddy、つまり」
じいや「クラッカーが開発したscript（ツール）を用いた、クラッキングのスキルとしてはkiddy（子ども）なクラッカーのことを指すのですぞい」
じいや「まあ自分でツールも作れないような幼稚なヤツ、という意味の蔑称です」

CSお嬢様「disり用語ですのね、全然可愛くなかったですわー！」

# ハクティビストとは
じいや「ハクティビストとは」
じいや「こちらも英語で表すとhacktivist、activism（積極行動主義）とhackを合わせてhacktivismと呼ぶのですが」
じいや「このhacktivismを行うクラッカーをハクティビストというのですぞ」

CSお嬢様「ハクティビズムってなんですの？」

じいや「**社会的・政治的な思想を持ってクラッキングを行う主義**のことですな」

CSお嬢様「TVでよく見る、アノニマス...とかもそうですの？」

じいや「まさに、アノニマスはハクティビストの代表例ですぞい」

# おわりに
じいや「どうでしたかな」

CSお嬢様「今回はたったこれだけですの？？」

じいや「じいやのリサーチ不足で」
じいや「今回はこれだけしか出てこなかったのですじゃ」
じいや「**これを追加した方がいい、というものがあればコメントしてほしいですぞ**」

じいや「まとめると」
じいや「**クラッカーにはクラッキングを悪戯目的で行うこともあれば**」
じいや「**社会的・政治的な目的を持って行うものもいる**のですぞい」

CSお嬢様「よく分かったわ、ありがとうじいや」

じいや「これからも少しずつセキュリティの知識を身につけて」
じいや「真のサイバーセキュリティお嬢様を目指すのですぞ」

CSお嬢様「わたくし頑張りましてよー！」

### 前回までのあらすじ

[サイバーセキュリティお嬢様「CIAってなんですの？」](https://qiita.com/choco_py3/items/51c04bdc8bfe25fe84f3)
[サイバーセキュリティお嬢様「しんせいせい...ってなんですの？」](https://qiita.com/choco_py3/items/0d05409534f267e40001)
[サイバーセキュリティお嬢様「き...脆弱性ってなんですの？」](https://qiita.com/choco_py3/items/15479e37b011c34abf36)
[サイバーセキュリティお嬢様「マルウェア...？スキーウェアのお仲間ですの？」](https://qiita.com/choco_py3/items/00af04f6906de4135b48)
[サイバーセキュリティお嬢様「クラッカー？何それ食べられますの？」](https://qiita.com/choco_py3/items/40fe5a27af3722daa654)

### 次回以降
[サイバーセキュリティお嬢様「F5攻撃（アタック）ってなんですの？」](https://qiita.com/choco_py3/items/f0164dedc7e4b761b25d)
[サイバーセキュリティお嬢様「SQLいんじぇくしょん...ってなんですの？」](https://qiita.com/choco_py3/items/4a597f25f0c3dbbea437)
[サイバーセキュリティお嬢様「クロスサイトスクリプティング？...美味しそうですわぁ！」](https://qiita.com/choco_py3/items/f3bb70ecf819bb55ad80)

# 宣伝
[技術書典13](https://techbookfest.org/event/tbf13)にサークル参加予定です。
良かったら[Twitter](https://twitter.com/choco_py3)フォローしてください！
はじめてのラズパイpicoとLチカ

# はじめに
元々ラズパイは気になってたけど
子供の親御さんがarduinoを趣味で始めたと知り、そこで火が付いたのでこの勢いを大切に
入門キットを買ったので遊んでみようと思う
と、そのまえにラズパイpicoが何者かわからなさすぎるので調べるところから始めることにしました。

# ラズパイpicoとは？
超基本的なところでここを抑える。
https://www.marutsu.co.jp/pc/static/large_order/zep/m-z-picoled-da1

# お値段は…？600円くらい
検索してみてみたらこんな感じ。安いね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416263/6ff02937-c39d-4e2d-8ad7-920de90dadcf.png)

# ラズパイとラズパイpicoの違い
OSがあるのがラズパイ。OSが無いのがラズパイpico。
なので、ラズパイpicoはarduinoと似ている。

# picoの動かし方
ざっくりこんな感じ。
1. （必要に応じて）picoで回路を作る
1. PCでIDE（Thonny)起動してプログラムを組む
1. PicoとPCをUSBケーブルで接続する
1. Thonnyを使ってpicoへプログラムをアップロードする
1. Thonnyを使ってpicoの起動スイッチを押す

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416263/d3434193-f3b0-748e-9411-36e50a9de992.png)

# とりあえず動かす（Lチカやる）
プログラムの基本はhello,worldだけど
picoの場合は、Lチカ（＝LEDを光らせる）が基本だそうです。なるほど。

Thonnyで以下のコードを入力

```
import machine,utime
led = machine.Pin(25, machine.Pin.OUT)

while True:
    led.value(1)
    utime.sleep(0.5)
    led.value(0)
    utime.sleep(0.5)
```

入力できたらSaveボタンクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416263/b417ba58-0bd3-5f9b-4261-f77082d2d5c8.png)

保存場所聞かれるので"Raspberry Pi Pico"をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416263/1190e61f-6961-7c98-3a4c-08008971abbf.png)

ファイル名を入力してOKクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416263/53b62035-3fb0-341c-ad33-853ccc8db68c.png)

起動ボタン　クリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416263/bb9dead7-6a65-4795-ebb6-5d10753e18ee.png)

大成功！
いい出だしだ。よかった。
【AWS】S3の特徴まとめ

# イレブンナイン
カタカナだといまいちピンとこない。。。Eleven Nine (99.999999999%)の**耐久性**。
可用性に関しては99.99%とのこと。

これも英語で考えよう。。。。
耐久性は「durability」で **「データを失わないことを保証するレベル」** のこと。
可用性は「availability」で **「システムが稼働し続けることを保証するレベル」** のこと。


# Webサイトホスティングとしての活用
S3自体は元々クラウドのストレージサービス（ファイル置き場）だが、静的ファイル（htmlや画像など）であればレンタルサーバーのようにウェブサイトを公開することが可能。従量課金性だがそんじゃそこらへんのレンタルサーバーよりも料金を低く抑えることが可能。

Route53を活用して独自ドメインを割り当てる場合は、バケット名とドメイン名を一致させる必要がある。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2665477/654f66ec-c9d0-06d6-af20-425cb1cab348.png)

>バケット名に先ほど取得したドメイン名を入力し、近いリージョンを指定します。「パブリックアクセスをすべてブロック」のチェックは外しておきます。

参考：[Route53でドメイン取得して静的ウェブサイトへルーティングする](https://dev.classmethod.jp/articles/route53-s3-website/)


# 署名付きURL
期間限定でアクセスを許可したい時に使う。
以下の記事の「既定ポリシー例」の箇所に具体例あり。

https://zenn.dev/mn87/articles/b447f9f4b11f7b

# データの暗号化手法
サーバサイド暗号化手法（SSE；Server Side Encryption）と
クライアントサイド暗号化手法（CSE；Client Side Encryption）がある。

サーバサイド暗号化にはさらにS3で管理された暗号化鍵によるサーバ側の暗号化（SSE-S3）と
KMSに保存されているカスタマーマスターキー（CMK）によるサーバー側の暗号化（SSE-KMS）の２種類に分けることができる。

SSE-S3とSSE-KMSの違いは[こちら](https://ktrysmt.github.io/blog/difference-between-sse-s3-and-sse-kms/)の記事が参考になる。
>結論言ってしまうとSSE-S3の場合は鍵を利用したかどうかの監査証跡が取れないことがネックになります。一方でSSE-S3は追加料金が発生せず、APIコールの制限を考慮する必要もないのがメリットです。


Customer Master Key （CMK） は下図の「KMS Key」でデータキーを暗号化するための鍵。
Customer Data Key （CDK）は下図の「Data Key」でデータを暗号化するための鍵。
KMS(Key Management Services)はそれらの仕組みの総称。
S3のデフォルトの設定ではSSE-S3になっている。（KMSを利用してCMKを管理するようになっていない）


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2665477/9e692e58-ce51-a779-9942-a5a0510c2c58.png)
画像引用：[AWS KMS concepts](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#enveloping)


# 参考

https://www.publickey1.jp/blog/10/amazon_s399999999999.html#:~:text=%E5%8F%AF%E7%94%A8%E6%80%A7%E3%81%AF%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%81%8C%E7%A8%BC%E5%83%8D,%E3%81%93%E3%81%A8%E3%80%81%E3%81%A8%E8%80%83%E3%81%88%E3%82%89%E3%82%8C%E3%81%BE%E3%81%99%E3%80%82


https://dev.classmethod.jp/articles/cloudfront-s3-customdomain/

https://dev.classmethod.jp/articles/route53-s3-website/
【C#】インターフェイスの利点

次の記事のメモがき
https://qiita.com/yutorisan/items/d28386f168f2f3ab166d

# ３種類のメリット
1. 疎結合を目的としたインターフェイス
2. クラスの機能を保証することを目的としたインターフェイス
3. クラスへの安全なアクセスを提供することを目的としたインターフェイス

# ない場合

QIITAへ投稿するとき、インターフェースがないと、次の行動の制限が難しい。

・自分の記事に自分でいいねを付ける
・削除（他人による削除）

記事閲覧用のIFと、投稿用のIFを作る事で解決できる。

# ３点

1. 疎結合を目的としたインターフェイス

クラスに直接アクセスさせず、I/F経由でユーザー（ライブラリ使用者）にアクセスさせる。

直接実装にアクセスさせると、修正がたいへん。

2. クラスの機能を保証することを目的としたインターフェイス。

IEnumerable、IDisposable,IObservable(UniRXでよく使う）　など。

読み方：　https://translate.google.co.jp/?hl=ja&sl=en&tl=ja&text=enumerator%20%20&op=translate

3. クラスへの安全なアクセスを提供することを目的としたインターフェイス

IReadOnlyList、IReadOnlyCollection
UbuntuでUnity Hubをインストールしようとしたら詰まった

# 環境
- Ubuntu 22.04 LTS
- AMD Ryzen 5 3500 6-core processor
- GeForce GTX 550 Ti

# 障害
Unityのサイト( https://unity3d.com/jp/get-unity/download )からUnityHubのAppImageをダウンロードして、起動しようとしたのだが次のようなエラーが出て起動することができなかった。  

```text
torichan@torichan-ubuntu:~/Downloads$ ./UnityHub.AppImage 
Checking for update
Update for version 2.4.6 is not available (latest version: 2.4.6, downgrade is disallowed).
Checking for update
Update for version 2.4.6 is not available (latest version: 2.4.6, downgrade is disallowed).
[8155:0723/090843.157721:FATAL:gpu_data_manager_impl_private.cc(892)] The display compositor is frequently crashing. Goodbye.
```

# 解決した方法

UnityHubはElectronを使用したアプリケーションのようで、うまく起動しなかったのはElectronにバンドルされているChromiumの問題のようであった。  
Electron.jsのサイト( https://www.electronjs.org/ja/docs/latest/tutorial/sandbox#chromium-%E3%81%AE%E3%82%B5%E3%83%B3%E3%83%89%E3%83%9C%E3%83%83%E3%82%AF%E3%82%B9%E3%82%92%E7%84%A1%E5%8A%B9%E3%81%AB%E3%81%99%E3%82%8B-%E3%83%86%E3%82%B9%E3%83%88%E3%81%AE%E3%81%BF )を参考に、`--no-sandbox`フラグをつけてやるととりあえず起動した。  
```bash
./UnityHub.AppImage --no-sandbox
```

# 参考リンク
https://qiita.com/apu4se/items/4220d51db1d9c0a69a8d
ノマドワーカーにおすすめしたい、Docomo回線を持っていなくても使える「d Wi-Fi」が最高すぎる

2022年2月8日をもって docomo Wi-Fi というサービスが終了し、その後継として出てきたのが [d Wi-Fi](https://www.docomo.ne.jp/service/d_wifi/) です。 すでにご存知の方も多いかもしれませんが、意外と d Wi-Fi に関する記事を見かけなかったのでご紹介します。
[公式サイト](https://www.docomo.ne.jp/service/d_wifi/)


# d Wi-Fi の優れているところ
- **無料で利用できる**
- **通信速度が高速かつ、定期的に繋ぎ直す必要がない**
- **ドコモ回線をもっていなくても利用できる**
- 1つのアカウントで5台まで同時接続可能
- 対応店舗がそこそこある
- セキュリティが公衆Wi-Fiよりは安全


# 無料で利用できる
d Wi-Fi を利用するには 「dアカウント発行」、「dポイントクラブ入会」、「dポイントカード利用登録」 が必要です。すべて無料でWEB上で行え、現物のカードの発行をしなくてもすぐに利用できます。My docomo のサイトが少し扱いにくいですが、普段からアカウントの作成をよく行っている方なら簡単にできます。


# 通信速度が高速かつ、定期的に繋ぎ直す必要がない
公衆Wi-Fiを使っていると通信速度が遅かったり、*定期的に接続が切断されるのでその度に繋ぎ直したり*、といったことにイライラした経験はありませんか。d Wi-Fi ならこれらの問題をすべて解決してくれます。
特に私は定期的に接続し直す必要がないという点が大変気に入っています。Wi-Fiの接続が切れる度に作業が中断され集中が途切れるということがなく快適に作業ができます。
そして、通信速度はとても高速です。お店による差もほとんどなくたいていのお店で画像ぐらいの速度はでます。
<img width="400" alt="img1" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/956073/10a32009-ff9b-b0b6-208c-caedf5606d42.png"><img width="400" alt="img2" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/956073/1f5a8ee0-ce7b-e6dc-033b-cfdaf9e194ba.png">


# ドコモ回線をもっていなくても利用できる
実際、私は楽天モバイルとLinemoを利用しドコモ回線は持っていませんが問題なく利用できています。経済圏構築のユーザーをとにかく増やす必要があるためでしょう。


# 1つのアカウントで5台まで同時接続可能
私は2つの端末しか利用していませんが最大5台まで同時接続可能らしいです。
ただ親機(?)である1台目のスマホのWi-Fi接続はSIM認証され自動で接続されますが、2台目以降は手動でSSIDを選択して、ブラウザからログインIDとパスワードを入力する必要があります。
また、一番面倒で混乱しやすいポイントとして、2台目以降のログインIDとパスワードは最初に登録したdアカウントの登録とは別に取得する必要があります。このあたりは d Wi-Fi 登録時に記載されているのでわからなくなったらQ&Aを見れば登録できると思います。


# 対応店舗がそこそこある
私がよく利用するのはマクドナルドですがその他にもスターバックスやタリーズ、プロントなどのカフェで利用できるようです。詳しくは[こちら](https://dwifi.mapion.co.jp/b/d_wifi/)で探して見てください。


# セキュリティが公衆Wi-Fiよりは安全
公衆Wi-Fi接続によく表示される「セキュリティ保護されていないネットワーク」の表示が d Wi-Fi なら表示されません。公式にも
> **あんしんのセキュリティ**
> 暗号化されていない公衆Wi-Fiスポットでは、通信が盗聴、のぞき見される危険性があります。ドコモの提供するWi-Fiサービスだから、無線区間のセキュリティを高めています。安全な通信をご利用になれます。

という記載があります。
もちろん完全に安全ということはなく、気をつけて利用するべきでしょうが、公衆Wi-Fiに比べると安心して利用できます。

--------------
最近では d Wi-Fi があるという条件を最優先してお店を探すほど私は気に入っています。いままで知らなかった方はこれを機に試してみてはいかがでしょうか。
GAE + Python(Flask)でHello Worldまの3ステップ

# GAE + Python(Flask)でHello Worldまの3ステップ
前提条件
・GAEをホストするプロジェクトが存在する
・請求先アカウント作成済み
・Cloud SDKインストール済み

## ①AppEngineアプリを初期化
### GCPコンソールで操作する場合
・リソースリストの中からAppEngineを選択する。
・アプリケーションを作成ボタンを押す。
・画面に従ってリージョンを選択する

### コマンドラインで操作する場合
・gcloud app create --project=[YOUR_PROJECT_ID]
を実行
・表示された指示に従ってリージョンを選択する

## ②ローカル環境でアプリを作成する
今回はPythonのフレームワークFlaskを使います。
以下のような構成で作成
root
│  .gcloudignore
│  app.yaml
│  main.py
│  requirements.txt
│          
└─templates
|  index.html

```app.yaml
#GAEの設定ファイル。
#インスタンスクラスとかスケーリングの条件などを記載する
#runtimeは必須パラメータ
runtime: python39
```
```main.py

from flask import Flask, render_template

app = Flask(__name__)

@app.route('/')
def root():
    return render_template('index.html', user_data=None, error_message=None)


if __name__ == '__main__':
    app.run(host='127.0.0.1', port=8080, debug=True)
```

```templates/index.html
<!doctype html>

<html>
<body>
<h1>Hello World</h1>
</body>
</html>
```
```requirements.txt
# サードパーティーモジュール
Flask==2.1.0
```


## ③アプリをデプロイ
・まずは、請求先アカウントをリンクする
・app.yamlのあるフォルダでコマンドプロンプトを開き以下のコマンドを実行
gcloud app deploy

GCPコンソール>App Engine>サービス
で、デプロイしたバージョンのトラフィックが100%になっていることを確認。

https://＜project_id＞.an.r.appspot.com/
にアクセスする

「Hello World」と表示される

終わり。


たった3ステップでアプリを公開できるなんて非常に簡単ですね。
(請求先アカウントを作成するときのクレジットカードの情報を入力するのが一番めんどくさい)

しかも、GAEは下回をはGoogleさんにお任せで良いので、アプリの開発に集中できるのがさらに便利です。
ifcOpenShell python のインストール方法

最近騒がれている BIM/CIM ですが、共通フォーマットの **.ifc** ファイルを扱わなければいけません
今回は python から ifc ファイルを扱うためのモジュール **ifcOpenShell** を 自分の環境にインストールする方法をメモしておきます

# ifcOpenShell python のインストール

## Step1 自分の環境を調べる

### ① python のバージョンを調べる

```
> python --version
Python 3.x.xx
```

### ② python のインストールフォルダを調べる

```
> python
>>> import sys
>>> sys.exec_prefix
'C:/Users/〇/〇'
```

### ③ ②のフォルダに site-packages フォルダ が存在することを確認する

例）`C:/Users/〇/〇/Lib/site-packages`

## Step2 ifcOpenShellファイルを自分の環境にコピーする

### ④ gitHub から ifcOpenShell のビルドを取得する

https://github.com/IfcOpenShell/IfcOpenShell/releases/

ここから  **①**のpythonバージョン にあった .zip をダウンロード

例) `blenderbim-220722-py39-win.zip`

### ⑤ ④の .zip を解答し以下のフォルダ/ファイルを③にコピー

- blenderbim-〇〇-win.zip/blenderbim/libs/site/packages/..
    - **cjio** (フォルダ)
    - **ifc4d** (フォルダ)
    - **ifc5d** (フォルダ)
    - **ifcopenshell** (フォルダ)
    - **cobie.py**
    - **ifccsv.py**
    - **get_maintainable_assets.py**

## 参考サイト

> https://www.youtube.com/watch?v=1g_nrGQO9Kc

# ifcOpenShell python のテスト

## テストコード

```
import ifcopenshell
from ifcopenshell import geom
```

```
ifc_path = "ifcファイルの名前"

ifc_file = ifcopenshell.open(ifc_path)
#settings = geom.settings()

wall = ifc_file.by_type("IfcWall")[0]

wall.Name
```
> 'Wall'

いけたっぽい

## 参考サイト

> http://blog.livedoor.jp/motoiyamaha/archives/51816543.html
【TypeScript】'Cannot redeclare block-scoped variable'  独自のスコープを持つファイルかグローバルスコープを持つファイルか？

TypeScriptの勉強中にあるエラーに遭遇した。

`Cannot redeclare block-scoped variable 'users'`

`「usersの変数は既に宣言されているので再宣言できないよ」`というエラーらしい。

今回は以下のような場合で発生した。

```ts:src/chapter-3/index.ts
const users = [];
```

```ts:src/capter-4/index.ts
const users = [{ name: 'jhon', age: 27 }];
```
※ちなみにディレクトリ構成はこんな感じ
```
.
├── README.md
├── dist
├── node_modules
├── package-lock.json
├── package.json
├── src
│   ├── chapter-3
│   │   └── index.ts
│   └── chapter-4
│       └── index.ts
└── tsconfig.json
```

あれ、同じファイル内でこのエラーが発生するならわかるんだけど、ディレクトリを跨いでいるファイルでもこのエラーは発生するのか。。

調べてみると・・・

まずこのエラーはEslintの`no-redeclare`が発しているエラーで、同じスコープ内で複数の宣言を持つ変数を排除することを目的としているエラー。

TypeScriptで新しいファイルを作成すると以下の2つに分類されるらしい。
・ファイルが独自のスコープを持つモジュールとして宣言されている。
・ファイルがグローバルスコープを共有するスクリプトとして宣言されている。

今回の場合は後者に分類されるため、users変数のスコープがグローバルとなっていて、ディレクトリを跨いでも同様の変数名で宣言した場合にエラーが発生したようだった。

なるほど。なのであればそれぞれのファイルを独自のスコープを持つモジュールとして宣言させる必要がある。
以下のように`export {};`をファイル内に記載するとファイルがモジュールとして認識されるみたい。
※今回はどちらかのファイルに記載すればエラー自体は解決するけどすべてのファイルをモジュールにしておきたいので両方に記載した。

```ts:src/chapter3/index.ts
export {};
const users = [];
```

```ts:src/capter4/index.ts
export {};
const users = [{ name: 'jhon', age: 27 }];
```
<br>

TypeScriptで新しいファイルを宣言した際に、以下のどちらかに分類されることは学びでした。
`ファイルが独自のスコープを持つモジュールとして宣言されている`
`ファイルがグローバルスコープを共有するスクリプトとして宣言されている`

<b>◆あとがき</b>
でもexport{}をすべてのファイルに書くのは面倒すぎる。。 今回は勉強用のファイルなので良いが実際のプロジェクトとなるとこれはよろしくない。
tsconfigの設定とかでどうにかできるものなのかなぁ。
あとフレームワークとかでプロジェクトを作成した際は、あんまり意識しないからその辺はフレームワークがうまく調整してくれているのかなぁと思っている。

コメントなどでなんでも教えていただけるととても喜びます！！！