OmniAICreator/Qiita-1.07M huggingface dataset:
AzureADで作成したユーザのパスワード期限を無期限にする方法

# はじめに
　AzureADで作成したユーザは規定値でパスワード有効期限が90日で作成されます。
　MFAなどを使用する場合、有効期限は無期限の方がなにかと運用がしやすいためここでは
　パスワードを無期限にする方法を記載します。

# パスワードを無期限にする方法

　残念ながらGUIでは変更できず、PowerShellを使用して変更する必要があります。
#### ▢PowerShellでAzureADにグローバル管理者アカウントでサインイン
 
  ```
  Connect-AzureAD
  ```

  :::note info
　初回接続時は以下のモジュールをimportしてから行う必要があります
　install-module azuread
　import-module azuread
  :::
 
#### ▢パスワードポリシーを無期限に変更
  ```
  Set-AzureADUser -ObjectId <user ID> -PasswordPolicies DisablePasswordExpiration
  ```
#### ▢パスワードポリシーの確認

  ```
  Get-AzureADUser -ObjectId <user ID> | Select-Object @{N="PasswordNeverExpires";E={$_.PasswordPolicies -contains "DisablePasswordExpiration"}}
  ```

上記で出力される結果が「True」となっていればパスワードは無期限に設定されています。
  
# 補足
・Azure AD connectでオンプレADから同期されたアカウントは無期限で作成されます。
　これはオンプレADのパスワードポリシーを優先する設計のためです。

・Microsoft365管理センターで作成したユーザは規定値90日で作成されますが、
　Microsoft365管理センターのパスワードポリシーが優先され、規定値は<font color="Red">無期限</font>となります。
　

# 参考
　[Azure Active Directory のパスワード ポリシーとアカウント制限](https://docs.microsoft.com/ja-jp/azure/active-directory/authentication/concept-sspr-policy)
HAVING句を使って集合を切り分けることで、NULLを含まない集合の探し方 〜 COUNT(*)とCOUNT(列名)の違い 〜 (Vol.1)

## はじめに

HAVING句を使って集合を切り分けることで、NULLを含まない集合の探し方を紹介します。

実行結果はこちらで確認できます。

https://www.db-fiddle.com/

## 例題

「はじめに」を読んだだけではどんな記事かいまいちピンとこないかなと思います。

タイトルにもありますが、COUNT(*)とCOUNT(列名)の違いとして

- パフォーマンス
- NULLのカウント
    - `COUNT(*)`NULLをカウントする
    - `COUNT(列名)`NULLをカウントしない

両者の違いは、NULLしか含まないテーブルのSELECT文で顕著です。

Schema (MySQL v8.0)

```sql
CREATE TABLE members (
   id INT NOT NULL PRIMARY KEY auto_increment,
   name TEXT
);

INSERT INTO members VALUES (1, null), (2, null), (3, null);
```

Query

```sql
SELECT COUNT(*), COUNT(name) FROM members;
```

Results

| COUNT(*) | COUNT(name) |
| -------- | ----------- |
| 3        | 0           |

この性質を利用すると、ある条件をクリアしたグループの抽出ができます。

この違い（性質）を次のようなケースの場合、利用できます。

## お題

以下に、学校のクラスごとのメンバーのテーブルがあるとします。
このテーブルには、仮に、ある宿題の提出日があるとします。
宿題を提出したら`submit_date`に提出日が入るとします。

この時、各グループの全てのメンバーが提出済みなグループだけを抽出したい時、クエリではどう表現しますか？

## Schema (MySQL v8.0)

```sql
 CREATE TABLE members (
   id INT NOT NULL PRIMARY KEY auto_increment,
   class TEXT,
   submit_date DATETIME
);

INSERT INTO members VALUES
   (1, 'A', '2021-12-18'),
   (2, 'A', '2021-12-19'),
   (3, 'B', null),
   (4, 'B', '2021-12-20'),
   (5, 'B', '2021-12-21'),
   (6, 'C', null),
   (7, 'D', '2021-12-22');
```

目視すると、グループAとグループDに所属の全メンバーが全員提出済みです。

このグループAとDの集合だけ抽出できる条件は、どんなものが考えられるでしょうか。

## Query

ヒントというか、答えは

**COUNT(*) と COUNT(submit_date) が一致する**という性質です。

各グループの、COUNT(*) と COUNT(submit_date) をみてみると

- グループAの
    - COUNT(*)： 2
    - COUNT(submit_date)： 2
- グループBの
    - COUNT(*)： 3
    - COUNT(submit_date)： 2
- グループCの
    - COUNT(*)： 1
    - COUNT(submit_date)： 0
- グループDの
    - COUNT(*)： 1
    - COUNT(submit_date)： 1

という感じになります。

```sql
SELECT class
FROM members
GROUP BY class
HAVING COUNT(*) = COUNT(submit_date)
```

なので、このクエリだと、AとDがTRUEになることが分かりますよね。

## Results

| class |
| ----- |
| A     |
| D     |

本日は以上です。

次は、この条件をCASE式を使って求めてみます。

## 参照

https://www.amazon.co.jp/dp/4798157821/

114 - 116p

## アウトプット100本ノック実施中

https://qiita.com/ryosuketter/items/713474dbd009870e4103
C#のバイナンスの仮想通貨のライブラリを使ってみる

### 前回のおさらい
前回、[Node.jsのバイナンスのAPIとC#を連携](https://qiita.com/iota_11/items/24ab2db7f2ee758f715c)して取得したが、１秒単位で情報を取得していくとなるとレスポンスが遅く機能的に難しい、システム構成や環境も複雑で煩雑で開発や保守に時間がかかる。他のPCに持って行った時に設定しづらい。アプリをバイナリ一つにコンパクトにまとめて、他のPCに持っていった時に簡単に利用できるのが望ましい。
### C#のバイナンスのライブラリを使用する

C#のバイナンスのライブラリがあったので使用することにした。

https://github.com/JKorf/Binance.Net

NugetからBinance.Netで取得できます。

```
Install-Package Binance.Net 
```

```csharp
using System;
using System.Threading.Tasks;
using Binance.Net;
using Binance.Net.Objects;
using Binance.Net.Objects.Spot.MarketData;

namespace Bainance2
{
    class Program
    {
         static async Task Main(string[] args)
        {

            var client = new BinanceClient(new BinanceClientOptions(){
                // Specify options for the client
            });

            var callResult = await client.Spot.Market.GetBookPriceAsync("BTCUSDT");

            if(!callResult.Success)
            {

            }
            else
            {
                BinanceBookPrice data = callResult.Data;
                Console.WriteLine(data.BestAskPrice);
            }

        }
    }
}

```

サンプルファイルがあります

https://github.com/JKorf/Binance.Net/tree/master/Examples


#### Node.jsとC#連携の感想
Node.jsとC#連携では環境の構築の面倒くささ、TypeScriptのパスの煩雑、アプリを一つフォルダにまとめられない、インターフェースクラスをC#側とNode側に用意が必要など、システムが複雑で煩雑になってしまい、よい設計開発ではないとわかりました。

[ここから登録することで取引手数料が１０％割引きになります](https://www.binance.com/ja?ref=TK4QGRCX)
<a href="https://www.binance.com/ja?ref=TK4QGRCX" target="_blank"><img width="350" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182324/8960c90e-e297-5fe8-5896-ee00dad5b151.png" src="https://www.binance.com/ja?ref=TK4QGRCX"></a>

１ケ月前にリリースされた軽量のライブラリ

https://github.com/binance/binance-connector-dotnet

[Gtk3アプリ 常駐アプリを作る](https://qiita.com/iota_11/items/af288b38056b7b7db965)へ続く
PaketoのBuildpackでLaravel8の起動が失敗する問題のワークアラウンド

ビルド対象アプリケーションのルートディレクトリに下記内容の`.profile`を作成する。

```bash:.profile
#!/bin/bash
ln -s /workspace/app /layers/paketo-buildpacks_php-composer/php-composer-packages/app
```

## ビルド実行

```bash
pack build イメージ名 \
  --buildpack gcr.io/paketo-buildpacks/php \
  --builder paketobuildpacks/builder:full
```

## 起動

docker run -e PORT=8080 -p 8088:8080 イメージ名

## 参考 buildpack.yaml

```yaml:buildpack.yaml
# buildpack.yml
composer:
  vendor_directory: vendor
php:
  # directory where web app code is stored
  # default: htdocs
  webdirectory: public
```



## 参照

[Buildpack support for Laravel 8 · Issue #366 · paketo-buildpacks/php](https://github.com/paketo-buildpacks/php/issues/366)
rustで関数内で呼び出し元にある変数の中身を書き換えるには

#main関数で存在する変数を別の関数内で書き換え
どうやってやるのかわかんなかった
教科書の最初の1ページにかかれてそうではあるが。

結論からいうと以下

```rust
fn add(a:&mut usize,b:usize){
    *a = *a + b
}

fn main() {
let mut a = 2;  
 add(&mut a,2);
println!("{:?}",a)
}
```

可変参照として渡してあげればよいようだ。
ちなみに引数のところのaは　mut a として挙げても普通に動く。
一応ベクタの中身書き換えのやり方も。これで3,4,5のベクタが出てくる。

```rust
fn add(mut a:&mut Vec<usize>,b:usize){

    for i in a{
        *i = *i + b;
    }
}

fn main() {
let mut a = vec![1,2,3];  
 add(&mut a,2);
println!("{:?}",a)
}
```

ここまでやって書きたかったのは変数として渡さないグローバル的なやり方だったことを思い出した。
まあいいか
CSVを0落ちしないでExcelで開く方法（手動）

# 課題

こんなファイルをダブルクリックして、開いたら
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215956/ff12007e-0602-0986-c6fd-72830a9b9237.png)

↓こうなってしまった。「これは次に保存すると壊れるぞ」というケースを手操作でなんとかします。　
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215956/f0559482-11be-f6fd-f85b-76a5fba64b6c.png)

(自動化する場合については、このページの最後にリンクを付けます。)

# 対処方法のまえにおことわり
筆者は Excel2019を使っています。もし、より新しいExcelではこんなことをする必要がないということでしたら、ごめんなさい。

# 対処方法

とりあえず、開いちゃったExcelは、上書き保存せず、そっと閉じます。
<b>そして、ごめんなさい！</b>

まず、ファイルの拡張子が 「.csv」である限り、いかんともできません。

Excelの仕様なので、「.csv」ファイルであることは、いったんあきらめて、エクスプローラで 拡張子を 「.txt」に変更してください。

もし、こんな感じで拡張子が非表示だったら
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215956/76c4fc82-2bb7-3037-691a-47020a4f4b6d.png)

エクスプローラで「表示」タブの「ファイル名拡張子」にチェックを入れます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215956/df148404-5f93-a47c-a99b-5d4c0c362039.png)

拡張子を.txtに変更します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215956/d15863cb-073a-c6de-a531-35c3d9ff0540.png)

次に WindowsのスタートメニューからExcelを起動します。
(「スタートメニューから」は実際には重要ではないです。要は、新規ブックを作るときと同じ要領でExcelを起動します。)

Excelの「開く」→「参照」で「ファイル名」の隣のファイルの種類のドロップダウンを
「テキストファイル (\*.prn;\*.txt;\*.csv)」 にして、目的のファイルを選択して、「開く」を押します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215956/c73825d5-a51c-9d4c-991e-cc825e4924a9.png)

そうすると、こんな画面が表示されます。
(拡張子が.csvだと次の画面は表示されず、いきなりcsvが開いてしまいます。
 それを避けることが拡張子を変えた目的です。)

表示された画面で、「次へ」をクリックします。
（データのファイル形式は「コンマやタブなどの」のままにすることが重要です。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215956/516eb248-d32a-ecb2-a259-48f771464538.png)

「タブ」にチェックが入っているので、このチェックを外し
「カンマ」にチェックを入れて、「次へ」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215956/ebc606b9-d207-dcd7-38f5-021d02d8f32e.png)

列の属性を決める画面が表示されます。すべての列がデフォルトでは「G/標準」となっています。これが0落ちをさせています。　問題となる列をクリックして、「文字列」を選んで、「文字列」属性に変更します。　そして、「完了」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215956/9496434a-745e-0bb6-f70d-08c2927477fa.png)

無事に、このように0落ちせずに開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215956/60a5c390-c250-584e-7df9-1ea2757dd511.png)

保存するときは、「名前を付けて保存」でファイルの種類を「CSV (\*.csv)」としてください。その際、ファイルの拡張子は、強制的に.csvになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215956/e6ca902e-a26c-7ad3-1f04-fa4e7a2f2364.png)

保存したファイルを開くときは、やはり、また開く前にファイルの拡張子を変えてください。

# これでは面倒なので自動化

こちらに別記事としてご用意しました。

[csvを0落ちしないで、ANSIだろうがUTF-8だろうが、一発でExcelで開きたい](https://qiita.com/yamashiroakihito/items/c96374b4a839205b57bb)
Dockerコンテナ上でcronを動かす

# はじめに
Dockerコンテナ上でcronを動かす方法について、備忘録として残しておきます。

## そもそもcronとは
> cronとは、ジョブ（スクリプト）を自動実行するためのデーモンプロセスです。そして、Linuxシステムの管理を行なう場合、ログのローテートや、バックアップなど、定期的に自動実行したいジョブが数多くあります。（中略）定期的に実行されるジョブは、crondというデーモンによって、　自動的に行なうように管理することができます。[^1]

[^1]: https://www.express.nec.co.jp/linux/distributions/knowledge/system/crond.html

cronはUNIX系のOS（Linux, macOS などなど）で動く、
指定した時間に、指定したプログラムを動かしてくれる、便利なプログラムです。
今回は、`Ubuntu 20.04 LTS` をインストールしたノートPCのDocker上でcronを使って、
毎時0分（00:00, 1:00, 2:00, ..., 23:00）にAPIを叩く方法をまとめます。

# cronを動かすシェル

```sh:execron.sh
#!/bin/sh
printenv | awk '{print "export " $1}' > /env.sh
/usr/sbin/cron -f
```

シェルスクリプトなどで見かける、おまじないのような `#!` で始まる行のことを `Shebang` と呼ぶらしく、インタプリタ（ソースコードを逐次解釈しながら実行するプログラム）を指定しているそうです。
> シバンまたはシェバン（英: shebang）とはUNIXのスクリプトの#!から始まる1行目のこと。起動してスクリプトを読み込むインタプリタを指定する。[^2]

[^2]: https://ja.wikipedia.org/wiki/%E3%82%B7%E3%83%90%E3%83%B3_(Unix)#:~:text=%E3%82%B7%E3%83%90%E3%83%B3%E3%81%BE%E3%81%9F%E3%81%AF%E3%82%B7%E3%82%A7%E3%83%90%E3%83%B3%20(%E8%8B%B1%3A%20shebang,%E7%9A%84%E3%81%8B%E3%81%A4%E7%B0%A1%E7%B4%A0%E3%81%A7%E3%81%82%E3%82%8B%E3%80%82

`awk` コマンドは入力として受け取った文字列に対して処理を行うためのコマンドです。


# Dockerfile

```dockerfile:Dockerfile
FROM python:3
USER root

RUN apt-get update \
  && apt-get -y install locales \
  && localedef -f UTF-8 -i ja_JP ja_JP.UTF-8
ENV LANG ja_JP.UTF-8
ENV LANGUAGE ja_JP:ja
ENV LC_ALL ja_JP.UTF-8
ENV TZ JST-9
ENV TERM xterm

COPY execron.sh .

RUN apt-get install -y vim less cron
RUN pip install --upgrade pip setuptools requests schedule

RUN echo "0 * * * * . /env.sh && /usr/local/bin/python3 /src/api.py >> /src/log.txt 2>&1" > crontab.txt \
&& crontab crontab.txt

CMD ["/bin/bash", "/execron.sh"]
```

`. /env.sh` は、シェルスクリプトの実行を表します。sourceコマンドを使って、`source /env.sh` と書くこともできます。
LINE Notifyを使いたい

# はじめに
LINE Notifyを活用してほしいと思っただけです。
とっさの思い付きってやつです。

# TOKEN

### TOKENとは
LINE Notifyを使うにはTOKENという、いわばキーのようなものが必要です。

### TOKEN発行方法
まずはLINE Notifyにアクセスして、右上の`ログイン`を押します。

https://notify-bot.line.me/ja/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1107984/bf9c282f-4bf6-e540-e338-f127d2b6ad21.png)

メールアドレスとパスワードを入れたり、アプリ経由とかでログインしてください。
先ほど`ログイン`だったところが自分のLINEのユーザー名になってると思います。
そこを押して`マイページ`を開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1107984/07cb0a2b-f0a5-24da-f0f5-d42b202d01aa.png)

`アクセストークンの発行(開発者向け)`というところがあると思うので、そこの`トークンを発行する`を押してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1107984/8f5e9998-60a0-1dea-9c8a-af1fe5382cd0.png)

`トークンを発行する`というモーダルが開くと思うので、トークン名を20文字以内で入力します。
**自分自身**にメッセージを送信する(受信する)場合は`1:1でLINE Notifyから通知を受け取る`を押します。
**グループLINE**の場合は、その下のグループを選択します。
選択が終了したら下の`発行する`を押してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1107984/8acdbbcb-2113-ad0b-3b43-157bbd8a6225.png)

`発行したトークンはこちらです。`というメッセージと共にトークンが表示されます。
このトークンは一度閉じると再度表示されない仕様になっているため、必ずメモ帳とかに張り付けたことを確認してから閉じましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1107984/a4f74501-868f-b24f-5911-1453fc2faddb.png)

トークン発行と同時に、ログインしたLINEアカウントにメッセージが飛んできますのでそこに張り付けてもいいと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1107984/5d3396a1-a1b8-e38b-0e26-793b1d7544f0.png)

これでLINE Notifyのトークンが発行されました。

### TOKENの削除方法
一応書いておかないとね...？
トークンが発行されると先ほどのページに`連携中サービス`として表示されます。
削除したいトークン（連携サービス）の`解除`を押すだけです。
解除の確認が表示されますのでもう一度`解除`を押すと解除されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1107984/e6fd4560-1812-5e03-2ebf-675ed87ec9b1.png)

# 実際にメッセージを送ってみよう
HTTPでPOSTすると出来るらしいです。
[LINE Notify API Document](https://notify-bot.line.me/doc/ja/)にサンプルが載っていたのでその通りにやってみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1107984/61581eeb-c302-68dd-7463-c31de2fe1494.png)

```sh:実行するコマンド
curl -X POST -H 'Authorization: Bearer [トークン]' -F 'message=[メッセージ本文]' https://notify-api.line.me/api/notify
```

トークンが正常なら`{"status":200,"message":"ok"}`という出力と共に、LINE Notifyからメッセージが送られると思います。

# おわりに
Qiita初投稿&メモ代わりな記事なので、まぁ...忘れてもかまいません:wink:
ユーザフォルダのパスを取得するVBScript

Windowsのユーザフォルダのパスは、コマンドプロンプトで

```bat:BAT
echo %USERPROFILE%
```

と入力すれば取得できる。（ USERPROFILE は小文字でもおｋ）

この **%USERPROFILE%** を VBScript で使うには、

```vb:VBScript
Msgbox CreateObject("WScript.Shell").ExpandEnvironmentStrings("%USERPROFILE%")
```

でおｋ。
第１回　HTMLのコードを書いてHello Worldを表示させよう

#はじめに
HTML言語を全く触ったことがない超初心者が、学校で学んだことを忘れないようにすることを目的に作成しています。
HTMLとはどういったものなのか、結局何ができるのかを一緒に学んで行きましょう。
##注意事項
Qiitaの投稿はこれがはじめてになります。それ故、Qiitaの使い方を知るという目的もあるため今回は少し短めの投稿にしようと考えております。
ド素人ゆえ間違った記載(独自の解釈をしている)場合があるかもしれませんがご容赦ください。
説明に関しては図を用いてわかりやすく作成していこうと思います。
コードの変更を行う度に上書き保存とChromeの更新をすることで変更内容が反映されます。

#目次
1.使用するブラウザの準備
2.HTML、CSSとは
3.htmlでHellow Worldを表示させよう

#1.使用するブラウザの準備
今回使用するのは
Google Chrome
Visual Studio Code
の2点になります。

#2.HTML、CSSとは
HTMLとはHyperText Markup Languageと呼ばれており、ウェブページを作成するために開発された言語のことです。 インターネット上で公開されてるウェブページのほとんどは、HTMLで作成されています。簡単に言うと**内容を書く言語**のことです。

CSSは**スタイルシート**と呼ばれウェブページのスタイルを指定するための言語のことです。
**HTMLがウェブページ内の各要素の意味や情報構造を定義する**のに対して、CSSではそれらをどのように装飾するかを指定します。例えば、ウェブページがスクリーンに表示される際の色・サイズ・レイアウトなどの表示スタイルや、 プリンタなどの機器で印刷・出力される際の出力スタイルなど、 **ウェブページをどのようなスタイルで表示・出力・再生するかについて指定する**ことができます。
#3.htmlでHellow Worldを表示させよう
###まずはHTMLのフォルダーを作っていきましょう
デスクトップで右クリック→新規作成→フォルダーを作っていきましょう。
＊ファイルの名前はsampleとします。
![スクリーンショット (66).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2416548/78c5727e-adfc-af11-448f-9b72b3c73e5e.png)
次にファイルを開いて、テキストドキュメントを作成します。
＊名前はindex,拡張子は**html**としてください。
![スクリーンショット (70).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2416548/d85c5557-6866-81d4-6192-f03fa22fae5d.png)
![スクリーンショット (68).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2416548/cfeed5e0-9bd7-d547-44c7-7defec841d2e.png)
このとき注意書きが表示されますが「はい」を押してもらって大丈夫です。
###HTMLファイルにコードを書いていこう
ファイルをテキストエディタ(今回はVisual Studio Code)に左クリックで読み込ませていきます。
![スクリーンショット (71)_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2416548/2ef06573-2a3b-0c42-5c04-819580599311.jpeg)

##コードの説明
先ずはこちらのコードを書いてください

```html:
<html>
    <head>
        
    </head>
    <body>
        <h1>Hello World</h1>
    </body>
</html>
```
HTMLは基本的に開始タグと終了タグが1セットになっており、ソースコードはhtmlと/htmlの間に入ることになります。**つまり、命令としてはhtmlから開始し、/htmlで終了するということです。**次にheadタグについて、かなり簡単に説明すると**ホームページの必要な情報を書く場所**に対して、bodyは**ホームページの内容を書く場所**という認識でOKです。ではコードの方が書けたら一度保存してください。これで完成です。
**Hello Worldを囲っているhタグについては次回紹介させていただきます。**

####最後にGoogle Chromeを立ち上げて、index.htmlを読み込まして見ましょう。
![スクリーンショット (72)_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2416548/758a7e09-4fda-21dc-6e06-71ce8b5c52b2.jpeg)
どうでしょうか、初投稿と言うことで至らない部分も多いと思いますが、お役に立てていれば幸いです。それでは皆さん、お疲れ様でした。
MacのPCでADBを使えるようにする方法



今回は自分は良くパソコンをお借りして仕事することがあり、その度にADBを入れているのですが、毎回調べている為、ここにまとめておこうと思いました。

# ADBとは

Android Debug Bridge（ADB） の略称です。
android開発をする際に便利な機能を使えるようになります。

# 始めに
今回はMacのパソコンで、AndroidStudioを既にインストールしてある状態から始めます。

# Android SDK locationのファイルパスを確認する
AndroidStudioを開いてPreferencesを開きます。

![スクリーンショット 2021-12-26 15.34.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274615/bd5f376e-cd7d-87f7-3c12-e8df6cf60af2.png)

SDKと検索するとAndroid SDKが出てきます。

![スクリーンショット 2021-12-26 15.44.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274615/7165121c-826b-a6d5-6951-a46673155ee2.png)

Android SDKを開くとAndroid SDK locationのファイルパスがあるのでこちらをコピーしておきます。

![スクリーンショット 2021-12-26 15.35.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274615/5439ae13-0c7c-e6ba-4ccb-e609d02769ce.png)

# ターミナル操作

下記コマンドをターミナルで実行して.bash_profileを開きます。

```
vi ~/.bash_profile
```


zshの場合

```
vi ~/.zshrc
```



```
export PATH=$PATH:先ほどコピーしておいたSDKのファイルパス/platform-tools
```

 Esc キーでコマンドモードに戻り

```
:wq
```
すると保存・編集完了

.bash_profileを読み込む

```
source ~/.bash_profile
```

zshの場合

.zshrcを読み込む

```
source ~/.zshrc
```

以上で完了です！

```
adb
```
adbとターミナルで実行し、adb command not foundとならなければ成功です！


※コメントを頂き、zshの場合も追記いたしました。

以上で終わりです。
Railsのget formでパラメータを送信してもURLに表示されない

## やりたいこと
検索のパラメータをURLに表示させたい。

## やること
### formの作成
[Rails ガイド](https://railsguides.jp/form_helpers.html#%E4%B8%80%E8%88%AC%E7%9A%84%E3%81%AA%E6%A4%9C%E7%B4%A2%E3%83%95%E3%82%A9%E3%83%BC%E3%83%A0)の通りにformを作成する

```
<%= form_with url: "/search", method: :get do |form| %>
  <%= form.label :query, "Search for:" %>
  <%= form.text_field :query %>
  <%= form.submit "Search" %>
<% end %>
```

このままだとコントローラの `params[:query]` でデータを取れるがURLには何も表示されない。

### local: true オプションの追加

```
<%= form_with url: "/search", method: :get, local: true do |form| %>
  <%= form.label :query, "Search for:" %>
  <%= form.text_field :query %>
  <%= form.submit "Search" %>
<% end %>
```

URLにもクエリパラメータが追加されるようになる。

## 参考サイト
- <a href="https://railsguides.jp/form_helpers.html">Action View フォームヘルパー - Railsガイド</a>
- <a href="https://qiita.com/hayulu/items/5bf26656d7433d406ede">local: true</a>
【RockyLinux】Linuxインストールする時のパーティションどうすんねん問題

# Linuxをインストールして遊んだ話
開発環境構築したくてRockyLinuxをインストールしたり、最新トレンドが知りたくてFedoraをインストールしたりしたのでその時の話。

**インストールする時のパーティション設定どうすんねん。**

VMwareとか仮想環境でインスコする時は良しなにしてくれるので全然意識してなかった。
個人的にはパーティションは切らない派なのでなるべくストレージは1つにまとめたい。
このあたり諸説あるので各々の好みに合わせて設定頂きたい。

# Linuxのパーティションってどんなのがあるの？
本家本元、RedHat公式リファレンスを読んでみる。

>9.15.5.1. x86、 AMD64、 および Intel 64 のシステム
>x86、 AMD64、 および Intel 64 のシステムには次のパーティションを作成することを推奨しています。

>- swap パーティション
>- /boot パーティション
>- / パーティション
>- home パーティション
>- /boot/efi パーティション (EFI システムパーティション) - UEFIファームウェアを搭載するシステムの場合のみ


RedHat公式リファレンス:
https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/6/html/installation_guide/s2-diskpartrecommend-x86

それぞれのパーティションの意味を読みといてみよう。

- swap パーティション
    - 仮想メモリ用のパーティション。
      <br>
      現行のMacとかWindowsを使ってると仮想メモリ自体をあまり意識しないかもしれない。
      <br>
      古のMacOSではアプリ毎に仮想メモリを割当てたりしてた。懐かしい。

- /boot パーティション
    - 後述する`/boot/efi`との二択。OSを起動するのに必要なパーティション。
      <br>
      BIOSを使ってるレガシーなマシンにインスコする場合はこちらを選択。

- / パーティション
    - システムディレクトリとかユーザーディレクトリとか用のパーティション。
      <br>
      Windowsで言うところのCドライブ。

- home パーティション
    - ユーザーディレクトリをシステムパーティションと分けたい場合に作成する。

- /boot/efi パーティション
    - 前述の`/boot パーティション`との二択。
      <br>
      UEFIを使ってる新しめなマシンにインスコする場合はこちらを選択。

# 俺的ベストパーティション
RedHat公式リファレンスには推奨するパーティションサイズも記載されてる。親切。
ただし、Kernelを複数Versionインストールすることも考慮したい。
以上を踏まえて私のベストパーティション設定を下記する。

- /boot/efi パーティション (512MB)
- / パーティション (残り全部)

`swapパーティション`は敢えて作らない。
swapをパーティションで作る事をRedHat公式では推奨されているが、リサイズし辛いというデメリットがある。
なのでOSインストール後`swapfile`を作成しswapfileを仮想メモリとして使用する方法を私は推奨する。

# swapfileを作成して有効化する
RedHat公式リファレンスではswap領域を以下のサイズで作成することを推奨している。

|  システムの RAM の容量  |  推奨 swap 領域  |  ハイバネートを許可する場合の推奨 swap 領域  |
| ---- | ---- | ---- |
|  2GB 以下の RAM  |  RAM 容量の 2 倍  |  RAM 容量の 3 倍  |
|  2GB から 8GB の RAM  |  RAM 容量と同じ  |  RAM 容量の 2 倍  |
|  8GB から 64GB の RAM  |  最低 4GB  |  RAM 容量の 1.5 倍  |
|  64GB 以上の RAM  |  最低 4GB  |  ハイバネートは推奨しません  |

例として今回RockyLinuxをインストールした私のマシンは`RAM 8GB`なので、swapも8GBとした。

実際の手順を下記する

1. OSを起動してBash起動。

2. /swapfile に8GBのswapfileを作成する。

    ```bash
    $ dd if=/dev/zero of=/swapfile bs=1M count=8192
    $ mkswap /swapfile
    $ chmod 600 /swapfile
    ```

3. 作成したswapfileを有効化する。

    ```bash
    $ swapon /swapfile
    $ swapon -s
    ファイル名				タイプ		サイズ	使用済み	優先順位
    /swapfile                              	file    	8388604	256	-2
    ```

4. 起動時にswapfileが有効になるように`fstab`に設定する。

    ```bash
    $ vim /etc/fstab
    # 以下を追記する。
    /swapfile               swap                   swap    defaults        0 0
    ```

5. 念の為、再起動してシステムモニター等でswapが有効化されているか確認する。
![swap確認.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1396975/232c79ed-0807-f6d6-5577-ba5878d24592.png)

以上で設定完了。
良いLinuxライフを！！
nuxt-basic-auth-moduleで任意ページの認証を外す

# はじめに
Nuxtで[nuxt-basic-auth-module](https://github.com/potato4d/nuxt-basic-auth-module)を使ってBasic認証を実装。
このときApplication Load Balancerのヘルスチェックを通すため、一部のページのみ認証を外す必要があったのでやり方をメモ。
※[現時点でALBのヘルスチェックにheader情報の設定をすることはできない](https://stackoverflow.com/questions/62230458/aws-load-balancer-health-check-with-api-key)ため、ヘルスチェック自体に認証情報を設定することはできない。

# やりかた
`match`プロパティで認証を外したいページのpathを設定する。正規表現も可能とのこと。

```nuxt.config.js
export default {
  modules: [
    'nuxt-basic-auth-module',
  ],
  basic: {
    name: 'name',
    pass: 'pass',
    enabled: true,
    match: (req) => req.originalUrl !== '/healthcheck', //←これだけ
  }
}
```

↓一応、ALBの設定も書いておく。

```cloudformation.yml
  TargetGroup:
    Type: AWS::ElasticLoadBalancingV2::TargetGroup
    DependsOn: PublicLoadBalancer
    Properties:
      HealthCheckIntervalSeconds: 30
      HealthCheckPath: /healthcheck #←ここにヘルスチェック先を設定
      HealthCheckProtocol: HTTP
      HealthCheckTimeoutSeconds: 10
      HealthyThresholdCount: 2
      TargetType: ip
      Name: !Ref 'EcsServiceName'
      Port: !Ref 'ContainerPort'
      Protocol: HTTP
      UnhealthyThresholdCount: 2
      VpcId: !Ref VpcId
```
# 参考
https://qiita.com/potato4d/items/e37d9acf320d7c1b327c
vscode+TypeScript F5キー押して実行する際、自動的にトランスパイルを行う

# vscode+TypeScript F5キー押して実行する際、自動的にトランスパイルを行う

## 前提
[vscodeでF5キー押してTypeScriptデバッグ実行](https://qiita.com/nsym7372/items/986e290fef3f4e158c96) できる状態であること

- tscでtsファイルをトランスパイルして、jsファイルを出力できること
- トランスパイル時、js.mapを出力してtsファイルのデバッグ実行ができること

## すること
vscodeでF5キーを押して（デバッグ）実行を行う際に、自動的にトランスパイルを行いたい
＝「コマンドラインでトランスパイルした後にデバッグ実行を行う」のは面倒なので、なんとかしたい

## しないこと
- tsconfig.jsonカスタマイズ
- packages.jsonカスタマイズ

## 1. 手順

### 1-1. tasks.json作成
コマンドパレット (shift+ctrl+p) を開き、「タスクの構成」を選ぶ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631214/8f1df102-ea80-a27d-4854-ae9d56815a20.png)


「テンプレートからtasks.jsonを生成」を選ぶ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631214/31487169-2db0-bfce-90ef-d08582fea701.png)


「Others」を選ぶ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631214/5a39aeb7-18ef-6c4c-9281-0e040be08bb2.png)

プロジェクトのフォルダ以下に、.vscode/tasks.json が作成されたことを確認

### 1-2. tasks.json編集
- commandにtscのパスを指定
- lavelに分かり易い名前 (ここではtypescript_build) に変更

```tasks.json
{
    // See https://go.microsoft.com/fwlink/?LinkId=733558
    // for the documentation about the tasks.json format
    "version": "2.0.0",
    "tasks": [
        {
            "label": "typescript_build",
            "type": "shell",
            "command": "node_modules/.bin/tsc"
        }
    ]
}

```

### 1-3. launch.json作成

実行とデバッグを開き、「launch.jsonファイルを作成します。」を押す

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631214/812bf306-c145-ca98-ff97-d9c076bee33c.png)

「環境の選択」で、Node.jsを選ぶ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631214/87efd736-9db2-21fd-d45f-1ec4abe3c0f2.png)

.vscode/launch.jsonファイルが作成されたことを確認

### 1-4. launch.json変更

launch.jsonにpreLaunchTaskを追加。値には、tasks.jsonでlavelに記載したものを記載。

```launch.json
{
    // IntelliSense を使用して利用可能な属性を学べます。
    // 既存の属性の説明をホバーして表示します。
    // 詳細情報は次を確認してください: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "type": "pwa-node",
            "request": "launch",
            "name": "Launch Program",
            "skipFiles": ["<node_internals>/**"],
            "program": "${file}",
            "outFiles": ["${workspaceFolder}/**/*.js"],   //末尾にカンマ追加
            "preLaunchTask": "typescript_build"    //追加
        }
    ]
}

```

### 1-5. デバッグ実行
tsファイルを開いてブレイクポイントを設定後、F5キーを押してデバッグ実行開始
js、js.mapファイルが作成された後、デバッグ実行が開始されることを確認
[JavaScript] 正規表現とsplitを使って特定の文字列を置換する

ある文字列から、特定の文字列を除いて新たな文字列を作成するために
正規表現を使ったので、覚えておくために記事にしました。
同じようなことを実装するときに、この記事が少しでもお役に立てれば幸いです。

## 文字列を分割する
ある特定の文字の後ろで文字列を分割します。

```javascript
  const str ='ラジオ体操第一'
  const regex = /(?<=体操)/;
  const words = str.split(regex); //   [ 'ラジオ体操', '第一' ]
```

あとは配列の要素を置換するか、削除することで、目的の文字列を得ることができます。

配列の操作は、置換や削除、追加といろいろ使える`splice`を使いました。

最後に配列の要素をつなげて文字列にする`join`を使います。


```javascript
  words.splice(1,1) 
  console.log(words.join()) // 'ラジオ体操'
```

文字列の置換を行う場合、`replace`を使う方法もありますが、

大量の文字列を扱い、特定の文字以降が同じ文字列ではない場合などは、使えるのではないかと思います。


## 参考にしたサイト
https://note.affi-sapo-sv.com/js-split.php

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/String/split

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/splice
Django勉強シリーズ（１）Formクラスを使う

##1.Djangoでフォームを作成する方法
djangoでHTMLファイルにフォームを作成する方法はいくつかある。
####①テンプレートに直接inputタグを記述して作成する
####②forms.pyにforms.Formクラスを継承したフォームクラスを作成し利用
####③forms.pyにモデル(forms.ModelForm）を利用したフォームクラスを作成し利用

今回は②の方法を用いてフォームを作成してみた

##2.データをソートするためのプルダウンフォーム作成
###①アプリケーションフォルダ内にデフォルトではforms.pyは作成されないのでまずはforms.pyを作り、その中に作りたいフォームのクラスを作成する
####→forms.pyに記入することで細かな設定をすることができる
```python:app/forms.py
from django import forms
```
###フォームのフィールドの型はいくつか用意されている<br>
[フィールド一覧で参照したページ](https://office54.net/python/django/forms-field-argument#section2)

####今回はChoiceFieldを使ってみる<br> ChoiceFieldは画面上にプルダウンメニューを表示させることができる
```python:app/forms.py
from django import forms

class SortForm(forms.Form): #forms.Formクラスを継承
  CHOICES = (('normal', 'ソート順選択'), ('maxtrophy', '最高トロ'),('position', '役職')) #プルダウン用の選択肢（key,value)

  choice = forms.fields.ChoiceField(
    choices = CHOICES,
    required = True,
    label = 'ソート順'
  )
```

###②views.pyでテンプレートにフォームクラスを渡す
```python:app/views.py
from django.shortcuts import render
from .forms import SortForm #先程作成したSortFormクラスをimport
from .models import UserModel #自分で作成したモデル（ソート対象のデータ、カラムにmaxtrophy,positionを持つ）

def mainfunc(request):
  object_list = UserModel.objects.all()
  if request.method == 'POST': #ソートが実行された場合
    sort_method = request.POST['choice']
    if sort_method != 'normal':
      object_list = UserModel.objects.order_by(sort_method).reverse()
    return render(request, 'app/main.html', {'object_list':object_list, 'form': SortForm()}) #Sortフォームを受け渡す
  else:
    return render(request, 'app/main.html', {'object_list':object_list, 'form': SortForm()}) #Sortフォームを受け渡す

```
###③テンプレート（htmlファイル）の作成
```html:templates/app/main.html
{% extends 'base.html' %}

{% block header %}
<div class="alert alert-primary" role="alert">
  <h3>メイン画面</h3>
</div>
{% endblock header %}

{% block content %}

<p><h2>メンバー</h2></p>

<form method="POST" action="">
  <input type="submit" value="ソートする">　
!-- 選択された項目を送るためのボタン作成 -->
  {% for field in form %} <!-- views.pyからのSortFormクラスを受け取り順番に選択肢ごとにfor文を回す -->
  {{ field }}
  {% endfor %}
  {% csrf_token %}　　　　　<!-- formを作成する際には必ず必要 -->
</form>

<!-- 以下ソート用のデータを表にまとめる -->
<div class="container">
  <table class="table">
    <thead>
      <tr>
        <th scope="col">#</th>
        <th scope="col">名前</th>
        <th scope="col">最多トロフィー</th>
        <th scope="col">役職</th>
      </tr>
    </thead>
    <tbody>
      {% for item in object_list %}
      <tr>
        <th scope="row">{{ forloop.counter }}</th>
        <td>{{ item.username }}</td>
        <td>{{ item.maxtrophy }}</td>
        <td>{{ item.position }}</td>
      </tr>
      {% endfor %}
    </tbody>
  </table>
</div>

{% endblock content  %}

```

出来上がりイメージ
![スクリーンショット 2021-12-26 14.38.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1151910/469747ae-e851-e5b7-f8af-94aeea720966.png)

今回はデータをソートするためのソート方法項目をまとめたプルダウンフォームを作成してみました。
まだまだDjango初心者ですが新たな学びはメモとしてまとめていこうと思います。
指定したIPアドレスに接続されているか確認するVBScript


```vb:GetPingStatus.vbs
'// GetPingStatus("IPアドレス")か、GetPingStatus("コンピュータ名")で、
'// Trueが返ってくれば疎通OK

Function GetPingStatus(ByVal ip_address)

    Dim query, wmi

	query = "SELECT * FROM Win32_PingStatus WHERE Address = '" & ip_address & "'"

	GetPingStatus = False
	For Each wmi In GetObject("winmgmts:\\.\root\cimv2").ExecQuery(query, , &H30)
	    If wmi.StatusCode = 0 Then GetPingStatus = True: Exit For
	Next

End Function
```

```vb
'// テスト結果
If GetPingStatus("192.168.20.11") Then
	Msgbox "接続されています。"
Else
	Msgbox "接続されていません。"
End If
```
'AmplifySignOut' is not exported from '@aws-amplify/ui-react' エラー対応

AWSでReactアプリケーションを構築するチュートリアルをしているときにエラーが出ててこずったのでメモしておきます。

https://aws.amazon.com/jp/getting-started/hands-on/build-react-app-amplify-graphql/module-three/?e=gs2020&p=build-a-react-app-two

aws-amplifyの認証機能を使ってreactプロジェクトを動かしたところ、以下のエラーが発生。

```
export 'AmplifySignOut' is not exported from '@aws-amplify/ui-react'...
```

いろいろ調べたところ、AmplifySignOutはui-react1.2.5以下でしか提供されていないらしく、package.jsonを書き換えて対応しました。

```:package.json
"dependencies":{
    "@aws-amplify/ui-react": "^1.2.5",
    ...
}
```

Amazonにはチュートリアルを書き換えて欲しいところです。。。

<<参考>>

https://stackoverflow.com/questions/70036160/amplifysignout-is-not-exported-from-aws-amplify-ui-react
git switch後のファイル追加・削除・編集の引継ぎについて確かめる

#この記事は何か？
本記事は「`git switch`しても、コミットしない限りは、ワークツリーやインデックスにおけるファイルの追加・削除は引き継がれるよね？」ということを自分の目で確かめて安心するための記事です。

#使用したgitコマンド
インデックスのエントリを表示する。

```bash:git_ls-files
$ git ls-files --stage
100644 95cf52bf4d6ad11ee7b8f1635ea0aa35eae2265b 0       main.c
```

BLOBオブジェクトのファイルコンテンツを表示する。

```bash:git_cat-file
$ git cat-file -p 95cf52bf4d6ad11ee7b8f1635ea0aa35eae2265b
int main(void)
{
        printf("Hello, world!\n");

        return 0;
}

```

#表の凡例
新規ファイルの追加、共通ファイルの削除

* ○　…　ワークツリーの場合、ワークツリーにファイルが**存在する**。インデックスの場合、インデックスにファイルのエントリが**存在する**。
* ×　…　ワークツリーの場合、ワークツリーにファイルが**存在しない**。インデックスの場合、インデックスにファイルのエントリが**存在しない**。

共通ファイルの編集

* ○　…　ワークツリーの場合、ワークツリーのファイルの内容が**編集後**の内容である。インデックスの場合、インデックスのファイルのハッシュ値が**編集後**ファイルのハッシュ値である。
* ×　…　ワークツリーの場合、ワークツリーにファイルの内容が**編集前**の内容である。インデックスの場合、インデックスのファイルのハッシュ値が**編集前**ファイルのハッシュ値である。

#実験結果
##新規ファイルの追加

ブランチAで（ブランチBに存在しない）新規ファイルを追加し、ブランチBに切り替えた後の、ワークツリーとインデックス上のファイルの有無について確認した。


|#|タイミング|Aのワークツリー|Aのインデックス|Bのワークツリー|Bのインデックス|
|:-:|:-:|:-:|:-:|:-:|:-:|
|1|Aで新規ファイル追加後|○|×|-|-|
|2|Aでswitch B後|-|-|○|×|
|3|Bでswitch A後|○|×|-|-|
|4|Aでadd後|○|○|-|-|
|5|Aでswitch B後|-|-|○|○|
|6|Bでswitch A後|○|○|-|-|
|7|Aでcommit後|○|○|-|-|
|8|Aでswitch B後|-|-|×|×|
|9|Bでswitch A後|○|○|-|-|

コミットしない限りは、`git switch`しても新規ファイル追加は引き継がれるようですね。

##共通ファイルの削除

ブランチAで（ブランチBにも存在する）ファイルを削除し、ブランチBに切り替えた後の、ワークツリーとインデックス上のファイルの有無について確認した。

|#|タイミング|Aのワークツリー|Aのインデックス|Bのワークツリー|Bのインデックス|
|:-:|:-:|:-:|:-:|:-:|:-:|
|1|Aでファイル削除後|×|○|-|-|
|2|Aでswitch B後|-|-|×|○|
|3|Bでswitch A後|×|○|-|-|
|4|Aでadd後|×|×|-|-|
|5|Aでswitch B後|-|-|×|×|
|6|Bでswitch A後|×|×|-|-|
|7|Aでcommit後|×|×|-|-|
|8|Aでswitch B後|-|-|○|○|
|9|Bでswitch A後|×|×|-|-|

コミットしない限りは、`git switch`してもファイル削除は引き継がれるようですね。

##共通ファイルの編集

ブランチAで（ブランチBにも存在する）ファイルを編集し、ブランチBに切り替えた後の、ワークツリーとインデックス上のファイルの内容について確認した。

|#|タイミング|Aのワークツリー|Aのインデックス|Bのワークツリー|Bのインデックス|
|:-:|:-:|:-:|:-:|:-:|:-:|
|1|Aでファイル編集後|○|×|-|-|
|2|Aでswitch B後|-|-|○|×|
|3|Bでswitch A後|○|×|-|-|
|4|Aでadd後|○|○|-|-|
|5|Aでswitch B後|-|-|○|○|
|6|Bでswitch A後|○|○|-|-|
|7|Aでcommit後|○|○|-|-|
|8|Aでswitch B後|-|-|×|×|
|9|Bでswitch A後|○|○|-|-|

コミットしない限りは、`git switch`しても編集後のファイルは引き継がれるようですね。

#結論

思った通りで安心しました。
【Docker】ポートエラーが出て自分だけコンテナを起動できない…涙

なぜか自分のMacだけポートエラーが出て、
Dockerが起動できず困ったので、メモ。


「なんで.......?????　なんで、「環境構築時短」のためのDockerのエラーでこんなにも時間を取られなきゃなんないんですか ???? ねぇ、なんでですか????」
「ねぇ、なんのためにDockerはあるんですか ????!?!」


* * *
と、疑問に感じている人のお役に立てられたら幸いです。


# ポートエラーの原因
まずは「docker-compose up -d」で起動してみる。

```
$ docker-compose up -d
Creating network "sample_default" with the default driver
Creating sample-db ... done
Creating sample-web ... error
ERROR: for sample-web  Cannot start service sample-web: Ports are not available: listen tcp 0.0.0.0:88: bind: address already in use
```
>　available: listen tcp 0.0.0.0:88: bind: address already in use

自分のMacのプロセスが既に 88番ポート を使用しており、
衝突してしまうため、起動できなかったようだ。

# プロセスを確認する
88を使用しているプロセスを確認する。

```
$ sudo lsof -i -P | grep "LISTEN"
kdc        151           root    5u  IPv6 0xxxxxxxxxxxxxxxxx      0t0    TCP *:88 (LISTEN)
kdc        151           root    7u  IPv4 0xxxxxxxxxxxxxxxxx      0t0    TCP *:88 (LISTEN)
```
「kdc」というMacのプロセスが、
88番ポートを使用していた犯人のよう。

通常、このプロセスをkillできれば話が早いのだが、
必ずしもkillして良いプロセスとは限らなかったりもする。

# kill しても良いプロセスなのか？
しかも、kdcは認証周りのプロセスらしいので、killすることで
Mac 本体に何か影響があるのも正直怖い。

ちなみにkdcについてはこちらの記事、
[【Docker】ポートエラーが出て自分だけコンテナを起動できない…涙](https://takeda-no-nao.net/programming/docker/port-errors-and-why-containers-cannot-be-started/)を参照。

# 解決）自分のローカルだけポート番号を変更する

結論、これで解決できた。

```docker-compose.yml
ports:
  - "88:3000"

# こう↓
ports:
  - "8888:3000"
```


ただ、この方法だと、毎回ブランチを変える度に自分用にポート番号を書き換えるのが面倒ではある。だから、根本解決する方法があれば良いのだが...。


何か良い方法をご存知でしたら、コメントでご教示くださると幸いです。

# 参考
[【Docker】ポートエラーが出て自分だけコンテナを起動できない…涙](https://takeda-no-nao.net/programming/ruby/port-errors-and-why-containers-cannot-be-started/)
Goutteを使ってスクレイピングをしてみる

#Goutteを使ってスクレイピングをするにあたって参考にしたサイトをまとめています。



###エラー時の処理に関して参考になりました。
https://designhack.slashlab.net/note-for-make-full-use-of-goutte-php-web-scraper/

###Laravelでのスクレイピングをする際に参考になりました。
https://melloblo.com/laravel-scraping/
OAuth2.0を図書館で例えてみる

# OAuth2.0ってなに
サードパーティアプリケーションによるHTTPサービスへの限定的なアクセスを可能にする認可フレームワーク
# OAuth2.0があるとなぜ嬉しいのか
- OAuthを使えば、ユーザーはサードパーティアプリにHHPサービスのユーザー名、パスワードを教える必要がない
- 権限を限定できる
- アクセスを制御できる
- アクセストークンには有効期限があるので、漏洩しても影響は限定的

# OAuth認証を図書館に例えてみる
厳密に言うとケースによっては少し違う部分もあるのだが、イメージしやすい題材としてはこれがいい。
細かいところは利用する時に調べればいい。
## ①図書館の設定
> 図書館は、市営の図書館で管轄は市であるとする。
また、利用できるのは市内の住民のみである。
図書館に入ったり、本を借りたりするには、図書カードが必要。
図書カードは図書館で貰えるが、図書カードを貰うためには市と手続きする必要がある。

## ②図書カードを貰うための市からの許可をもらう手続き。（認可コードリクエスト）
1. 市に、Aさんが市内の住民であることを証明するための本人確認書とともに申請。（***認証***）
1. 市での手続きが終了し、Aさんに「本を読む権限」と「本を借りる権限」を与える。（***認可***）
1. 市からOKが出たという証明書をもらう。（***認可コード付与***）
1. 証明書と一緒に図書カードのもらい方の説明書をもらう（***リダイレクト***）

## ③証明書を持って、図書カードを貰いに行く。（アクセストークンリクエスト）
1. Aさんは図書館のスタッフに証明書を渡し、図書カード発行のお願いをする。
1. 図書館のスタッフは、Aさんからもらった証明書と市のIDとSecretをもとに市へ図書カード発行の申請を出す。（市のIDとSecretは、市が管轄する図書館しか知らない機密情報）
1. 市から図書カードが発行され、Aさんに渡される。（図書カードには有効期限がある）

## ④図書カードを持って、本を借りる。（アクセストークン検証リクエスト）
1. 借りたい本を持っていって図書カードを出すと、無事に本を借りることができる。

## ⑤図書カードの有効期限が切れた時の再発行（リフレッシュトークンによるアクセストークンリクエスト）
1.有効期限が切れた図書カードを持って図書館に再発行依頼をすると、図書カードの情報にある再発行コードが③で使用した証明書と同じ効力を発揮し、新しい図書カードが発行される。
AtCoder 茶色になりました（色変記事）


# はじめに

AtCoderを始めて2ヶ月、11回目のABC(AtCoder Beginner Contest)で入茶いたしました。

![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2349889/ec60623d-bff7-0b10-5050-a8b36ffd8268.png)

https://atcoder.jp/users/akikuno

まだいろいろと試行錯誤中のため、「いま色変記事を書いても時期尚早かな」とも思ったのですが、次回はいつ色変記事を書けるのかわからないのでこの機会に執筆することにいたしました。

ご笑覧いただければ幸いです。

# 入茶までの取り組み

これまで試した中で効果があったと実感したものになります。

## Twitter

**間違いなく一番やってよかったと思うことです。**

普段SNSをやらないのではじめは不安でしたが、競技プログラミングの方々はとても温かく、尊敬できる方ばかりです。

とくに毎回のABCの後は喜怒哀楽が入り乱れるなかでお互いに励まし合っていく雰囲気があり、しばらくTwitterを見て次回への活力をもらっています。

感謝の気持ちでいっぱいです。

## B,C問題埋め

こちらも効果を感じました。

だいたい**自力ACの割合が5-7割くらいの難易度がちょうどよい**と思っています。

ACをすると嬉しく、解けなくても解説を読むとわかるレベルだと思います。

私ははじめB問題に取り組み、その後C問題はDiffが小さい順に埋めていきました。

いまはC問題が自力ACが7割くらいなので、これから徐々にD問題に挑戦していこうと思っています。

## AtCoder ProbmlemsのRecommendation

AtCoder Problemsにはレートに応じて推薦問題を提示するRecommendationという機能があります。

https://kenkoooo.com/atcoder/#/user/akikuno?userPageTab=Recommendation

問題を自分で探す必要がなく、とても役に立ちました。

ただ注意点として、こちらの問題にはABCだけでなくARCやAGCなどの問題もあります。

同じようなDiffでもABCに比べて他のコンテストの問題は難しい印象で、かつ解説も簡潔なため学習が難しいです。

そのため**ABCの問題を選んで精進するほうが良い**と感じました。

## アルゴ式

**全人類におすすめします。**

https://algo-method.com/

問題もさることながら、とくにすべての解説が秀逸です。

わかりやすいのはもちろんのこと、別解があることが多く、自分の思考以外の視点から問題を見ることを教えてくれます。

## 受験問題集

競技プログラミングを楽しむためには数学が必須のため、受験数学の問題集をはじめました。

旺文社の標準問題精講シリーズのうち、整数と場合の数・確率の2冊に取り組んでいます。

https://www.obunsha.co.jp/product/series/c001

まったく解けなくて悲しいのですが、忘れていた知識が戻ってきたり、頭の体操になったりして楽しんでいます。

気長に勉強を続けていこうと思います。

## うにだよさんQiita記事

毎回のABCについて丁寧な考察とコードを解説してくださっています。

https://qiita.com/u2dayo

**公式解説がわからずに途方に暮れていたときに、なんど助けられたかわかりません。**

## かつっぱさんYouTube

毎回のABCについて実況解説をアップしてくださっています。

https://www.youtube.com/channel/UCqqeYOh1gk_TJ16sxazWhUg?reload=9

**多くの動画では本番と同じタイミングで取り組まれているため、本番中にどんなことを考えているのかがわかります。**

ひとつひとつの考察が素早く明晰で、すべての動画が勉強になります。

## コンテストに可能な限り参加する

**コンテストに参加することが何よりも重要です。**

初心者は伸びしろしかないので、あまりパフォーマンスやレートに注目する必要はないように思います。

それよりも「WAなしにA,B問題が解けた」「C問題が解けなかったけれど勉強になった」など、**各コンテストの内容を記録と記憶に残しておく**ほうが重要だと思います。

## そのほか

### 競技プログラミングにかける時間

3歳と1歳の子どもがいるので、子どもたちが寝ている朝5時から7時までの2時間を競技プログラミングに当てています。

ABCが21時-22時40分なので翌日はかなりキツイですが、なるべくルーティーンを維持するように早起きしています。

**なお平日の昼休憩中に競技プログラミングをやったときには、問題が頭に残ってしまって明らかに午後の生産性が下がりました。**

仕事中の競技プログラミングはおすすめできません。。。


### 業務との関係

本業は業務プログラミングですが、競技プログラミングが活かせた経験はいまのところありません。

今後もない可能性が高いですが、競技プログラミングはあくまで趣味ということで割り切っています。

### 興味の幅が広がった

競技プログラミングを始めて、数学や論理パズルをおもしろいと感じるようになりました。

**鈴木貫太郎さん**や**そらの暇つぶしch**さんの動画を見て楽しんでいます。

https://www.youtube.com/c/%E9%88%B4%E6%9C%A8%E8%B2%AB%E5%A4%AA%E9%83%8E1966

https://www.youtube.com/c/%E3%81%9D%E3%82%89%E3%81%AE%E6%9A%87%E3%81%A4%E3%81%B6%E3%81%97ch_killingtime

競技プログラミングで数学を学び直さなかったらきっと知ることがなかった世界です。


# これから

これからは**D問題埋め**と**数学問題集**を中心に勉強していこうと思います。

来年こそ**ABCのD問題を解く**ことを目標にしています。

# おわりに

入茶はひとつの目標だったため素直に嬉しかったです。

しかし、まだまだ伸びしろしかないとも感じておりますので、今後もとくにレートを目標とはいたしません。


それよりも各コンテストを記憶に留めることに意識して、取り組んでいこうと思います。

**最後までご覧いただき、誠にありがとうございました！**
【Haskell】アラビア数字をマヤ数字にする

マヤ数字って何？って人は[ココ](https://ja.wikipedia.org/wiki/%E3%83%9E%E3%83%A4%E6%95%B0%E5%AD%97)を参照。大まかにいうと、20進法を採用している数字の体系です。


# 方針
1. 入力値を10進法から20進法に変換する
1. 各桁ごとにマヤ数字表記にする
1. スペースを置いて可読性を高めた上で出力する


# 頑張るとこうなる
```Haskell
enmaya :: Int -> String
enmaya n = unwords $ map enmaya1 $ vig n

vig :: Int -> [Int]
vig x
    | x < 0 = error "never put such numbers"
    | x < 20 = [x]
    | otherwise = vig (x `div` 20) ++ [mod x 20]

enmaya1 :: Int -> String
enmaya1 0 = "O"
enmaya1 1 = "."
enmaya1 5 = "_"
enmaya1 m
    | m < 5  = enmaya1 (m - 1) ++ "."
    | m < 20 = enmaya1 (m - 5) ++ "_"
```

マヤ数字の話で盛り上がったので書きました。たのしかった(๑˃̵ᴗ˂̵)
rails7から`ActiveRecord::RecordNotFound`のメッセージでモデル名に加えてSQLも出力される様になった

# メモ

`ActiveRecord::RecordNotFound`は`ActiveRecord::Base.find`メソッドなど参照したデータが存在しない時に発生する例外です。

```ruby
User.find(1)
```

このエラーが発生したときに出力されるメッセージがrails7から変更されていました。

```ruby
# Before
$ User.find(1)
=> ActiveRecord::RecordNotFound: Couldn't find User with 'id'=100
Caused by ActiveRecord::RecordNotFound: Couldn't find User

# After
$ User.find(1)
=> ActiveRecord::RecordNotFound: Couldn't find User with 'id'=100
Caused by ActiveRecord::RecordNotFound: Couldn't find User with [WHERE `users`.`id` IS NULL]
```
AI系企業でインターンを始めた理由

#AI系企業でインターンを始めた理由
初めまして。私は2021年12月から[ボスアーキテクト株式会社](https://bossarchitect.co.jp/)でインターン生として働いています。インターンを始めた動機やインターンってどんな感じ？などについて、簡単にまとめようと思います。
##目次
- [1. そもそもだれ] (#1-そもそもだれ)
- [2. 何でインターンを始めたの？] (#2-何でインターンを始めたの？)
- [3. 学校とインターンって大変そう] (#3-学校とインターンって大変そう)
- [4. 最後に] (#4-最後に)

##1. そもそもだれ
私は某私立大学の情報系学科に通ってる大学3年生です。弊学科では3年生になると研究室に配属され、私はデータ圧縮とか機械学習をやっています。バイトは塾講師と飲食業をやったことがあって、インターンは弊社が初めてです。
##2. 何でインターンを始めたの？
エンジニアになりたいなと思ってインターンを始めました。でも、インターンを始める前はバイトかインターンで悩みました。インターンをやればスキルが身に付いて業界を詳しく知れる一方、人生に幅が無いなと思いました。研究室では機械学習をやって、学校の授業ではIT周りの勉強、それに仕事でもIT系ってなると”ずっと同じことやってるじゃん”って考えました。 
とても悩みました。でも悩んでても仕方がないので、そもそも"エンジニアってどんな仕事？"っていうのを調べました。エンジニアの種類、働き方、年収などなど。たくさんのことを調べて気づいたのは、
”エンジニアって言ってもたくさん種類あるんだな”
"働き方も割と自由で楽しそうだな"
"スキルに応じて年収が変わるのか"
です。特にお金の話が決め手になったと思います。お金を稼ぐためにスキルを向上させたい、勉強をする環境は整っている、よしインターンやるか、って感じでインターンを始めることを決断しました。
ちなみにインターンの求人を見つけるためにwantedlyを使いました。またAI系の仕事をしたいと思い、AI系の企業に絞って探しました。
##3. 学校とインターンって大変そう　
まだ初めて間も無いですが、正直大変だと思います。学校では課題や論文に追われ、インターンでは仕事が割り振られます。忙しくなるのは当たり前ですよね。でも、日々学ぶことが多くて自分のできることが増えたり、成長を実感できるので楽しいです。
##4. 最後に
自分がインターンを始めた理由について簡単に書いてみました。自分の成長、キャリアアップに繋がるためインターンを始めて良かったと思います。インターンを始めるかどうか迷っている方の参考になれば幸いです。
【備忘録】【エラー解決】ModuleNotFoundError: No module named 'todos,'

DjangoとReactの開発環境を完全に独立させたTodoアプリを作っています。
migrationファイルを作成しようとして下記を実行した結果、

```Django:仮想環境上のターミナル
python manage.py makemigrations todos
```

このように、エラーが返ってきました。

```
Traceback (most recent call last):
  File "manage.py", line 22, in <module>
    main()
  File "manage.py", line 18, in main
    execute_from_command_line(sys.argv)
  File "/Users/asamitakaoka/Desktop/todo-react/lib/python3.8/site-packages/django/core/management/__init__.py", line 425, in execute_from_command_line
    utility.execute()
  File "/Users/asamitakaoka/Desktop/todo-react/lib/python3.8/site-packages/django/core/management/__init__.py", line 401, in execute
    django.setup()
  File "/Users/asamitakaoka/Desktop/todo-react/lib/python3.8/site-packages/django/__init__.py", line 24, in setup
    apps.populate(settings.INSTALLED_APPS)
  File "/Users/asamitakaoka/Desktop/todo-react/lib/python3.8/site-packages/django/apps/registry.py", line 91, in populate
    app_config = AppConfig.create(entry)
  File "/Users/asamitakaoka/Desktop/todo-react/lib/python3.8/site-packages/django/apps/config.py", line 223, in create
    import_module(entry)
  File "/Users/asamitakaoka/.pyenv/versions/3.8.2/lib/python3.8/importlib/__init__.py", line 127, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 1014, in _gcd_import
  File "<frozen importlib._bootstrap>", line 991, in _find_and_load
  File "<frozen importlib._bootstrap>", line 973, in _find_and_load_unlocked
ModuleNotFoundError: No module named 'todos,'
```


# 原因として考えられること
・プロジェクトにアプリを作ってない (プロジェクトディレクトリに todo というディレクトリがあるはず)
・settings.py の INSTALLED_APPS に todo を追加していない
・todo 内のアプリ構成に何か問題がある


# 解決策
settings.py の INSTALLED_APPS をよく見てみたところ、
'todos,' と記述していました。
正しくは、

```
'todos', 
```

でした。カンマの位置が違っていました。

# 参考記事

https://forum.freecodecamp.org/t/modulenotfounderror-no-module-named-todo/460438
Swiftで列挙型を学ぶ

こんにちわ

Swift初学者です。

今回は、列挙型を学んだ事をできるだけ忘れたくないので、備忘録として記事に乗せていこうと思います！

#列挙型とは

**列挙型とは、関連する値に型を定義してまとめた物になります。**

独自で型を設定して、関連する値を列挙型でまとめる事で、列挙型の中にある値を安心して使うことができます。

#使い方

使い方としては以下のコードで書きました。

````example.swift
enum Family {
    case Father
    case Mother
    case Brother
    case Sister
}
````

enumを定義した後に、任意の定数名を記入します。

その後、{}の中にcaseと値を記入します。

出力方法は以下の通りです。

````example.swift
print(Family.Father)//Father
````

これが基本的な形です。

#値の指定方法

列挙型の中にある値を設定する方法は主に3つあります。

##通常
普通の列挙型にある値は、名前がそのまま値になります。

````example.swift
enum Family {
    case Father
    case Mother
    case Brother
    case Sister
}

print(Family.Father)//Father
print(Family.Mother)//Mother
````

##Raw Value
Raw Valueは、値を設定できる列挙型です。

````example.swift
enum Family:String {
    case Father = "naoki"
    case Mother = "arisa"
    case Brother = "riku"
    case Sister = "yumi"
}

print(Family.Father.rawValue)//naoki
print(Family.Mother.rawValue)//arisa
````

##Associated Value

Associated Valueは、列挙型の中にあるメンバー(case Fatherなど)に様々な型を指定することができます。

````example.swift

enum Personal {
    case Name(name:String)
    case From(from:String)
    case Age(age:Int)
}

var Myname = Personal.Name(name: "naoki")

var Myfrom = Personal.From(from: "okinawa")

var Myage = Personal.Age(age: 30)

````


#まとめ
自分の無知さを知った。
【Nuxt.js】componentsディレクト内でネストされたコンポーネントをimportせずに使う方法


# はじめに
nuxt.js超初心者です。
nuxt.jsを勉強していて、layoutsディレクトリやpagesディレクトリでcomponentsディレクトリのコンポーネントを使う場合はimportなどの設定なしで使えると思うのですが、atomsディレクトリやmoleculesディレクトリに分けると使えなくなったので解決方法を調べました。
#解決方法
調べてみると解決方法は下記の2つがありました。
・コンポーネント呼び出すときにコンポーネント名にディレクトリ名を足す
・nuxt.config.jsファイルにコンポーネントの記載を足す

#コンポーネント呼び出すときにコンポーネント名にディレクトリ名をたす
下のようなcomponents/moleculesディレクトリ下にContentコンポーネントがあるとします。

```vue:~components/molecules/Content.vue
<template>
 <div>
  ゆっくり目を開き　目にするものをよォく見てみなさい
  敵の群を敵の顔を　そして味方の顔を　天を地を
  これが将軍の見る景色です
 </div>
</template>
```
このContentコンポーネントを下記のようにpages/index.vue呼び出すとします。

```vue:~/pages/index.vue
<template>
 <div>
  <Content />
 </div>
</template>
```
これでは呼び出せません。
しかし下記のようにディレクトリ名を足すと呼び出すことができます。

```vue:~/pages/index.vue
<template>
 <div>
  <MoleculesContent />
 </div>
</template>
```

\<Content />をそのまま使いたい場合は次の「nuxt.config.jsファイルにコンポーネントの記載を足す」方法を使っていただければと思います。

#nuxt.config.jsファイルにコンポーネントの記載を足す
タイトルの通りです。

```ls:nuxt.config.js
~~~省略~~~

components: {
    dirs: [
      '~/components',
      '~/components/atoms',
      '~/components/molecules',
      '~/components/organisms'
    ]
},

~~~省略~~~
```
上記のように設定を書き足すことでどこでもimportなしで\<Conten />をそのまま呼び出すことができます。

```vue:~/pages/index.vue
<template>
 <div>
  <Content />
 </div>
</template>
```
以上です！！！！！
言語化って難しい…
【完全保存版】Flutter（フラッター）の環境構築をする方法「windows編」

Flutter（フラッター）プログラミングをはじめるには


どうも、Kpapaです。




プログラミングをはじめるために一番はじめにやることは、ズバリ、環境構築です。




環境構築とはプログラミングをはじめるためのアプリをインストールしたり設定したりプログラミングを開始する準備することです。




以外にも、一番初めのこの段階が面倒なので私はここで１度挫折しました（汗）、でも、ゆっくり焦らずやれば大丈夫ですので一緒に進めていきましょう。




それではいってみよう！

https://seaseven.net/?p=3045




リンク
Git for Windowsをダウンロード


https://gitforwindows.org/からダウンロードします。

Git for Windowsをインストール

ダウンロードファイルをクリックして、この画面がでたらあとはひたすら、「Next」をクリックしてインストールします。

Flutter SDKをダウンロード

１）https://Flutter.dev/docs/get-started/install　画面の赤枠のwindowsを選択

２）https://Flutter.dev/docs/get-started/install/windows　画面の赤枠のFlutter_windows_2.2.1-stable.zip　を選択

Flutter SDKをインストール

１）ダウンロードした　Flutter_windows_2.2.1-stable.zip　ファイルをクリックすると、ファイルが解凍されてデスクトップ画面に「Flutterフォルダ」が表示されます。

２）「Flutterフォルダ」を「C:\src\Flutter\Flutter」に配置します。（私はここでつまづいたので下に配置方法を詳しく解説します。）

３）ローカルディスク（C）の中に「srcフォルダ」を新規作成します。

４）新規作成した「srcフォルダ」の中に「Flutter」フォルダを新規作成します。

５）新規作成した「Flutterフォルダ」の中に、デスクトップに解凍した「Flutter」フォルダを移動します。

これで、無事に配置完了です。

Flutter SDKの環境変数PATH設定方法

このFlutter sdkにPATHを通してどこからでも実行させられるように環境変数のPATHに追加します。

１）Windowsの「スタート」から「Windows システムツール」にある「コントロールパネル」を開きます。

２）「システム」を開く



３）「システムの詳細設定」を開く

４）「システムのプロパティ」の「詳細設定」タグの下の「環境変数（N)…」を開く


５）ユーザー環境変数のPathを選び、編集を開く



７）環境変数名の編集の 新規（N）を選び「C:\src\Flutter\Flutter\bin」のパスを新規で追加

Android Studioのダウンロード
１）https://developer.android.com/studio/index.html?hl=ja　画面の
「Download Android Studio」を選択（Windows 64bit 用）


２）利用規約を読み、同意して左下にチェックを入れるとダウンロードボタンが有効になります。
Android Studioのインストール

１）ダウンロードした、android-studio-ide-xxx.xxxxx-windows.exe をクリック

２）「Next」をクリック

３）「Next」をクリック

４）「Next」をクリック

４）「Install」をクリック

５）「Next」をクリック

6）「Finish」をクリック

７）androidstudio の画面がでて起動できれば成功です。

みなさん、プログラミング楽しいからチャレンジしてみてね

それでは、また！

https://seaseven.net/
vscodeでF5キー押してTypeScriptデバッグ実行するまでのメモ

# vscodeでF5キー押してTypeScriptデバッグ実行するまでのメモ

## やりたいこと
- vscodeでTypeScript開発環境構築
- F5 (F5 + Ctrl)を押して、デバッグ実行(実行)できること

## やらないこと
- TypeScriptトランスパイルのカスタマイズ。但し、デバッグ実行に関係する物は除く。
- デバッグ実行などのカスタマイズ
    - tasks.json, settings.json, launch.json作成
- eslint, prettier導入

## 前提
- windows上で実施
- vscodeをインストールしていること
- node.jsをインストールしていること
    - node.jsのインストールは [Windows での NodeJS のインストール](https://docs.microsoft.com/ja-jp/windows/dev-environment/javascript/nodejs-on-windows) 参照

## バージョン
vscodeのバージョンは 1.63.2

```
node --version
v16.13.1
```


## 手順
### 1. コマンドラインでトランスパイルしてnodeつかって実行する
#### 1-1. 適当なフォルダを作ってvscodeで開く
ここではproject_folderを作成

#### 1-2. tscインストール
```
PS C:\project_folder> npm install typescript
```
実行後、project_folder以下にnode_moduleフォルダが作成されることを確認

#### 1-3. tscがインストールできたことを確認
```
PS C:\project_folder> .\node_modules\.bin\tsc --version
Version 4.5.4
```

#### 1-4. 適当なコードを書く

project_folder以下にファイル作って、適当なコードを書く (ここでは「hello.ts」ファイルを作成)

``` hello.ts
class User {
    private name: string;
    constructor(name: string) {
        this.name = name;
    }

    public SayHello = () => {
        console.log("Hello,", this.name);
    };
}

const u = new User("やまだたろう");
u.SayHello();
```
#### 1-5. トランスパイル
```
PS project_folder> .\node_modules\.bin\tsc ./hello.ts
```

実行後、hello.tsと同じフォルダにhello.jsが作成されることを確認。

#### 1-6. nodeで実行
```
PS project_folder> node hello.js
Hello, やまだたろう
```



### 2. F5(F5+Ctrl)を使ってデバッグ実行(実行)する
#### 2-1. tsconfig.json作成
トランスパイル時、デバッグ実行に必要なSourceMapを出力するため
実行後、project_folder以下にtsconfig.jsonが作成されることを確認

```
PS project_folder> .\node_modules\.bin\tsc --init

Created a new tsconfig.json with:                                                                                       
                                                                                                                     TS 
  target: es2016
  module: commonjs
  strict: true
  esModuleInterop: true
  skipLibCheck: true
  forceConsistentCasingInFileNames: true


You can learn more at https://aka.ms/tsconfig.json
```

#### 2-2. tsconfig.json 修正
"sourceMap"から始まる行のコメントを外す

```
//修正前
    //"sourceMap": true,  
//修正後
    "sourceMap": true,  
```

#### 2-3. トランスパイル
tscコマンドでファイルを指定するとtsconfig.jsonが読み込まれない様子なので、以下コマンドで実行
実行後、project_folder以下にhello.jsファイルとhello.js.mapファイルが作成されることを確認

```
PS project_folder> .\node_modules\.bin\tsc -p tsconfig.json
```

#### 2-4. デバッグ実行
hello.tsを開く
hello.tsの適当な場所にブレークポイントを設定してF5キーを押下する
「環境の選択」が表示された場合はnode.jsを選ぶ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631214/7f9e7882-505f-0d80-f325-9fc4f3c33e35.png)


## この後の進め方
トランスパイル時にjsファイル出力先を変えたい など → tsconfig.json変更
[実行前に自動的にトランスパイルしたい](https://qiita.com/nsym7372/items/e01cbda1a7773bd57025) → launch.json, tasks.json作成、変更
実行のカスタマイズをしたい など → setting.json作成、変更
コードの整形をしたい など → prettier, eslint導入