OmniAICreator/Qiita-1.07M huggingface dataset:
【Java初心者】Wekaによる機械学習 05-Javaのコマンドラインでロジスティック回帰

# もっと簡単にロジスティック回帰できないか

前回の記事( https://qiita.com/SeijiMiwa/items/64ae3d7b96d1ecca8478 )では、wekaのAPIをJavaから呼び出して、ロジスティック回帰する方法を説明しました。

本当は、コマンドラインで実現したかったのですが、そのときは方法がわからず。
ただ、コマンドラインのヘルプで、「何となくこんな感じかな」というところまでたどり着きましたので、やってみます。間違っていたらご指摘をお願いします。

# データ

前回と同様、fukugyou.arff を教師データ。fukugyou-test.arff をテストデータとします。

# コマンドライン

今回も mini-wekaを使います

```
java -cp mini-weka-3.9.15955.jar:. weka.classifiers.functions.Logistic -t fukugyou.arff -d fukugyou.model
```

これで fukugyou.model にモデルが生成されます。

これを使って、テストデータを推測してみます。

```
java -cp jar/mini-weka-3.9.15955.jar:. weka.classifiers.functions.Logistic -T fukugyou-test.arff -l fukugyou.model -p 0
```

# 出力結果

```
=== Predictions on test data ===

    inst#     actual  predicted error prediction
        1        1:?        1:y       1 
        2        1:?        2:n       0.912
```

前回記事の値と似たような結果になりました。

つまり、1人め(年収740万)は、副業しているとみられ、その可能性は100%。2人め(年収490万)は、副業していないとみられ、その可能性は91.2%と出ました。
所定の文字列を瞬時にClipboardに登録するPowerShellスクリプト

# 0. 動機 (スクリプトのパスを通している前提)
Windowsキー + Rの「ファイル名を指定して実行」から、よく使う文字列(打つのちょっとめんどくさいやつ)をClipboardに登録してすぐにペーストできると楽だな、と思ったんで作ってみました。
<br>
ユーザー辞書登録する、という手もあるのですが、動的な内容(日付とか時間)とかの場合にはやり方が難しいと思うのでこのスクリプト使うと便利かなと思います。
<br>
一単語だけ登録するスクリプトと、複数語登録するスクリプトがあるのでそれぞれ解説します。


# 1. スクリプト概要・出力 (一単語版、複数語版共通)
* スクリプト起動 (Windows + r → スクリプトのショートカット名入力 → Enter)
* PSコンソールが立ち上がる (その後すぐ閉じる)
* クリップボードに指定した単語が登録される


<br>
* 出力例は下記画像参照 (上：一単語、下：複数単語)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343332/44f779fc-eb28-d6dd-363a-9fbadb1b6d00.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343332/a25048c3-a696-caae-92e9-f199233aea46.png)




# 2. スクリプト全体像・解説 (一単語版)
```PowerShell
#日付の取得(例:20230923という形式)
$dayNow = Get-Date -Format "yyyyMMdd"

#Clipboardに貼り付け
Set-Clipboard $dayNow
```

# 3. スクリプト全体像・解説 (複数単語版)
```PowerShell
#登録単語1: 今日の日付
$dayNow = Get-Date -Format "yyyyMMdd"

#登録単語2: 現在時刻
$timeNow = Get-Date -Format "HH:mm"

#登録単語3: 適当な文字列
$hoge = "hoge"

#配列へ各変数を格納
$array =@($dayNow, $timeNow, $hoge)

#各変数をClipboardに登録
foreach($i in $array){

 Set-Clipboard $i

 Start-Sleep -Milliseconds 300 #下記Note1参照
}
```


* <b>Note1</b>: foreachの最後にStart-Sleepを入れた理由は、このStart-Sleepが無いと登録が早すぎて最後の1語だけ登録されて見える状況(処理は3語してるのにClipboardには最後の1単語しか表示されない)になってしまうからです。色々やって300 MillSecondが一番短い待機時間かな、と思いました。

参考：[Set-Clipboardのヘルプ](https://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.management/set-clipboard?view=powershell-7.3)



# 3. おわりに
基本自分用メモですがどこかの誰かの役に立てば幸いです。Qiitaは編集しやすくていいですね。

私は非IT企業の非IT職種(専攻も非IT)の人間なのですが、PowerShellの件気軽に相談できる人が周り(社内)にいないこともあり、もし「こここうやってやるともっと楽だよ」とか「こういう改善加えてみました」みたいな意見もしあれば是非教えてください！


# 4. 余談

* PowerShellスクリプトをダブルクリックで実行できるようにしたい場合は下記参照

https://qiita.com/_Sasaki_/items/c8486e58df45333017d7

* パスを通してスクリプトをさらに素早く起動したい場合は下記参照

https://qiita.com/_Sasaki_/items/8384ba3eda0aa6fe6547
null合体演算子について理解する

# 目次
1. 背景
2. null合体演算子（？?）とは
3. ユースケース

# 1. 背景
null合体演算子(??)を片手に収まる回数しか使ったことがない為です。

# 2. null合体演算子（？?）とは
- 論理演算子の一種です。
- 左辺が null または undefined の場合に右の値を返し、それ以外の場合に左の値を返します。

    ```javascript
    const foo = null ?? 'default string';
    console.log(foo);
    // Expected output: "default string"
    
    const baz = 0 ?? 42;
    console.log(baz);
    // Expected output: 0
    ```

[論理OR演算子 (||)](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Logical_OR)と似てますが、こちらは[falsy](https://developer.mozilla.org/ja/docs/Glossary/Falsy)な値の場合に右の値を返し、それ以外の場合に左の値を返します。

# 3. ユースケース
undefied,null以外のfalsyな値も有効な値として解釈したい時です。
例えば0 や ''、falseです。

# 参考
- [mdn Null 合体演算子 (??)](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Nullish_coalescing)
- [Nullish coalescing operator '??'](https://javascript.info/nullish-coalescing-operator)
- [Nullish Coalescing Operator (??) In JavaScript - What Is It And How To Use It?](https://daily.dev/blog/nullish-coalescing-operator-in-javascript-what-is-it-and-how-to-use-it#:~:text=The%20Nullish%20Coalescing%20Operator%20is,one%20is%20undefined%20or%20null%20.)

# 参考になる記事を書いて下さった皆様に感謝致します!
ExcelVBAでカイ二乗検定を大量に行う

カイ二乗検定はとても使いやすい検定法で、Excelの関数としてもCHISQ.TEST関数が用意されています。実測値と期待値の範囲を引数として渡すのですが、期待値を実測値から計算することが多くあります。また、２×２の分割表の検定を大量に行いたい場合、元のデータが１行ごとになっていても、いちいち分割表の形に変換する必要があります。そこで、VBAで次のようなユーザ定義関数を作成します。
* 期待値の計算をVBAで行うことで、引数として実測値だけ渡せるようにする
* 2×2の分割表の検定については、４つの値を引数として渡せるようにする

使用イメージは下図のようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281116/12722de0-85ee-4f0b-09d2-bdef2353ae19.png)

次のコードを標準モジュールに貼り付けて利用してください。
```vb
Option Explicit

Function ChiSqTest22(v11 As Long, v12 As Long, v21 As Long, v22 As Long) As Double
'2*2分割表の４つの値からカイ二乗検定のP値を返す
    Dim mat(1 To 2, 1 To 2) As Long
    mat(1, 1) = v11: mat(1, 2) = v12: mat(2, 1) = v21: mat(2, 2) = v22
    ChiSqTest22 = ChiSquareTest(mat)
End Function

Function ChiSqTest(rg1 As Range) As Double
'観測値の範囲を受け取り、カイ二乗検定のP値を返す
    ChiSqTest = ChiSquareTest(rg1.Value)
End Function

Function ChiSquareTest(observedValues As Variant) As Double
' 観測値の2次元配列を受け取り、カイ二乗検定のＰ値を返す
    Dim numRows As Long
    Dim numCols As Long
    Dim chiSquareValue As Double
    
    ' 行数と列数を取得
    numRows = UBound(observedValues, 1)
    numCols = UBound(observedValues, 2)
        
    Dim rowSums() As Double
    ReDim rowSums(1 To numRows)
    Dim colSums() As Double
    ReDim colSums(1 To numCols)
    Dim totalSum As Double
    Dim i As Long, j As Long
    
    '各行、列、全体の合計を取得
    For i = 1 To numRows
        For j = 1 To numCols
            rowSums(i) = rowSums(i) + observedValues(i, j)
            colSums(j) = colSums(j) + observedValues(i, j)
            totalSum = totalSum + observedValues(i, j)
        Next j
    Next i
    
    ' 期待値を計算
    Dim expectedValues() As Variant
    ReDim expectedValues(1 To numRows, 1 To numCols)
    For i = 1 To numRows
        For j = 1 To numCols
            expectedValues(i, j) = (rowSums(i) * colSums(j)) / totalSum
        Next j
    Next i
    
    ' P値を計算して戻り値として返す
    ChiSquareTest = Application.WorksheetFunction.ChiSq_Test(observedValues, expectedValues)
End Function
```
Qiita CLIで公開しない設定を追加した話


こんにちは。
ご覧いただきありがとうございます。
先日，Qiita CLIへホストを設定できるプルリクがマージされました。
Qiitaの方には大変お世話になりました。

https://qiita.com/ikepu-tp/items/df4ebf43edd200e4597d

Qiita CLIでホストを設定できるようになり，Dockerでも使いやすくなりました。
その一方で記事を作成し，Githubにプッシュすると，どんなものでも自動で公開されることが執筆の悩みの種になっていました。
自分は一度，書いた後にしばらく寝かせて投稿するってこともあるのですが，現行では完成するまでGithubにプッシュできません。
複数のPCを使う身としては少し使いづらいのが正直なところでした。
ということで前回と同様にプルリクを送ることにしました。

## やりたかったこと

- `publish --all`コマンドで投稿しない設定を追加したい

## したこと

1. 設定項目を追加したコードをプルリク
2. レビューを受け，修正
3. マージ

### 設定項目を追加したコードをプルリク

設定項目を追加するために必要なのは

- 新規記事を作成する際に設定項目が含まれる
- `publish --all`において，設定項目がある場合は無視をする

の2点です。
これらが達成できるようにコードを追っかけ，修正しました。
なお，設定項目については当初は`draft`にしていたのですが，内部の他のパラメータと同じということで議論を重ねた結果，`ignorePublish`となりました。

https://github.com/increments/qiita-cli/pull/65

### レビューを受け，修正

前回と同様，Qiitaの担当の方がレビューをしてくださいました。
タイポがあったりと自分の確認不足もあり，ご迷惑をおかけしてしまいました汗
また，テストを書けなかったのが申し訳なかったです。

### マージ

無事にマージをしていただけました！！

## 感想

前回に続いて，OSSに貢献できて良かったです。
基本的には自分が困っていることを改善したいという自分本位な修正ではありますが，快く修正を受け入れてくださり，Qiitaの皆様に感謝です！！
また，全くIT系ではなく，ただの中学校の非常勤講師な自分の稚拙なコードにも関わらず，2度もマージしていただけて光栄です！！

## p.s.

`v1.3.0`として公開していただけました！

https://github.com/increments/qiita-cli/releases/tag/v1.3.0

> 試しに本記事も`ignorePublish: true`にして，Githubにプッシュしてみました。笑
> きちんと投稿されていなかったです！
CASE文をあるテーブルを参照しながら使用する方法とその注意点

# 導入
この記事はCASE文の条件をあるテーブルから引っ張ってきた際に陥ったミスについて記載しています。
同じミスに陥る人が多そうだと感じまとめました。
誰かの参考になれば幸いです。
# 環境
Bigquery
# 事象
「CASE文の中身が大量になってしまい、SQLの運用が難しくなっている。」
上記の問題を解決するために、CASE文の条件に必要なデータをスプレッドシートにまとめて、
それをBigquery上にインポートしてそこで作成されたテーブルをCASE文にしようするというの中で問題が発生しました。
# 問題

以下のテーブル(test)のb列の情報を使用してCASE文を作成
test
|a  |b  |
|---|---|
|1  |xxxxxx  |
|2  |yyyyyy  |
|3  |zzzzzz  |

sample
|id  |name  |
|---|---|
|a1  |xxxxxx  |
|a2  |yyyyyy  |
|a3  |zzzzzz  |

CASE文

```SQL
SELECT
  CASE 
    WHEN sample.name = test.b THEN test.a
    ELSE "-"
  END AS name
from sample, test
```

上記のようにSQLを作成したところ、以下の結果が取得できると想定していた。
|name  |
|---|
|1  |
|2  |
|3  |

しかし実際は以下の通りの結果になる。
|name  |
|---|
|1  |
|-  |
|-  |
|2  |
|-  |
|-  |
|3  |
|-  |
|-  |

テーブルからCASE文の条件を引っ張ってくるときは、条件になるテーブルすべてに対してCASE文が適用されるため注意しなければ想定していない結果が返ってくることがある。
# 対策
2つ対策はあり、
- ハードコーディング
- where句での絞り込み

である。

### ハードコーディング
以下のようにCASE文を作成することで対応可能

```SQL
SELECT
  CASE 
    WHEN sample.name = "xxxxxx" THEN "1"
    WHEN sample.name = "yyyyyy" THEN "2"
    WHEN sample.name = "zzzzzz" THEN "3"
    ELSE "-"
  END AS name
from sample, test
```

### where句での絞り込み
```SQL
WITH result AS (
  SELECT
    CASE 
      WHEN sample.name = "xxxxxx" THEN "1"
      WHEN sample.name = "yyyyyy" THEN "2"
      WHEN sample.name = "zzzzzz" THEN "3"
      ELSE "-"
    END AS name
  from sample, test
)
SELECT
  name
FROM result
WHERE name != "-"
```
サブクエリを組み合わせたりして欲しい結果をwhere句で絞り込みしてあげるのも対策の一つ
npxについて正しく理解する

# 目次
1. npxとは
2. ユースケース
3. 感想

# 1. npxとは
- Node Package eXecuteの略
- ### ローカルにインストールされたパッケージを検索し、実行可能ファイルを見つけて実行できる
  実行可能ファイルへのフルパスの入力を省略できるため、開発者は簡単かつ確実にパッケージを実行   できます。
　　　　
  ## 実行可能ファイルとは
  - node_modules/pacakge名/bin配下にあるファイルです。
  - ./node_modules/.bin配下にあるのは実行可能ファイルのシンボリックリンクです。
  - このシンボリックリンクはnpm install時に作成されます。
  - 実際にlsコマンドを実行すると、シンボリックリンクの場所や、それが指す実際の場所を確認できます。
      ```terminal
      ls node_modules/.bin/prettier
      node_modules/.bin/prettier
      ```
  
  例えば、以下のコマンドでローカルにインストールされたprettierを実行できます。

    ```terminal
    npx prettier .
    ```
  npxを使わない場合だと以下2つで実行できます。
  - ./node_modules/.bin/prettier(node_modules/bin/prettier.cjs)で直接実行
      ```terminal
      ./node_modules/.bin/prettier
      ```
  
  - npm run scriptsで実行
      自動的に./node_modules/.bin内のprettierを見つけて実行します。
      ```package.json
      "scripts": {
          "prettier": "npx prettier ."
      }
      ```

- ### ローカルになければリモートから取得して実行
  - パッケージをインストールしないので、マシン上のパッケージ汚染を気にしないで良いです。
  以下は[cosway](https://www.npmjs.com/package/cowsay)の例です。
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405182/fdd677e8-d70e-ec3c-09aa-06b252a729bd.png)
  installするか聞かれるのでy(yes)を入力する。
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405182/04717217-d197-458d-d894-a2ca4c53e9fe.png)
  npx実行後に、モジュールを実行しようとすると以下のようにアンインストールされいるのが確認できました。
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405182/fb0a0dd5-af48-e68c-944c-d932d56eb0d3.png)


# 2.ユースケース
  ### 一度だけ使う時
  例えばプロジェクトの初期化時です。
    npxの最も一般的なアプリケーションは、create-react-appコマンドです。
  ### GitHubのgistやリポジトリを直接実行したい時
    
  ## 動作の検証
  例えば異なるpackageのバージョンをtestしたい時です。

# 3 感想
npx,実行ファイルのパスを指定,npm run scriptsがpakcage.jsonに入り乱れていたのでユースケースを意識したいと思いました。

# 参考
- [npx](https://docs.npmjs.com/cli/v9/commands/npx?v=true)
- [【npmとnpxの違い】便利なnpxについて理解する](https://www.geeklibrary.jp/counter-attack/npx/)
- [npxでnodeモジュールを実行する](https://qiita.com/tatakahashiap/items/1c4ab221c4993e7c4ebf)
- [npm でローカルインストールしたパッケージを CLI でコマンド実行する方法（npm-srcipts, npx）](https://zenn.dev/ikuraikura/articles/6d583518a7e27289f6c7)
- [What is the purpose of .bin folder in node_modules?](https://stackoverflow.com/questions/25306168/what-is-the-purpose-of-bin-folder-in-node-modules)
- [Difference between NPM and NPX](https://www.codingninjas.com/studio/library/difference-between-npm-and-npx)
- [npm vs npx — What’s the Difference?](https://www.freecodecamp.org/news/npm-vs-npx-whats-the-difference/)
- [Understanding NPX: Use Cases, Benefits, and Drawbacks](https://peeyushjss.medium.com/understanding-npx-use-cases-benefits-and-drawbacks-e3c91d59a47f)
- [An introduction to npx, the npm package runner](https://medium.com/hackernoon/npx-npm-package-runner-7f6683e4304a)

# 参考になる記事を記事を書いて下さった皆様に感謝致します！
自然言語処理モデルBERTの事前学習手法:MLM

多くの自然言語処理の場合には、学習済みのBERTモデルを使用しますが、特定のデータに対して、適切な学習済みモデルがないか、または精度があまり良くない時に、手動で事前学習を行うこともあります。

事前学習の手法はいくつか存在しますが、一番使いやすいMLMを紹介したいと思います。

MLM（Masked Language Model）は、BERTに元々ついてる手法の一つです。
中身はすごいシンプルで、一つ文書中のある程度の単語をランダムに隠し（Mask）、
その隠された単語が何なのかを予測することで、モデルを学習させます。

単純なテキスト分類タスクであれば、下のhuggingfaceが提供したコードをそのまま実行できます。

興味がある方お試してみてください。
https://github.com/huggingface/transformers/blob/main/examples/pytorch/language-modeling/run_mlm.py
走向全球視野：國際學校學生的美國留學之路


在這個全球化進程不斷加速的時代，來自國際學校的學生往往擁有更為開放的世界觀和多元化的學術背景。他們渴望在更大的舞台上展示自己，而赴美留學是其中的一個優選。但從考取SAT到獲得美國簽證，每一步都充滿了挑戰。本文旨在探討這段獨特的學術旅程。

國際學校的多元培養

在[國際學校](https://www.apexcharity.org/news/3/82)接受教育，學生能夠接觸到多元文化和多語言的教學環境。這樣的背景讓他們在思想和視野上有了更廣的拓展，為未來[出國留學](https://www.apexcharity.org/news/3/83)打下了堅實的基礎。

SAT考試：竞争的开始

赴美留學的第一道關卡是SAT考試，它對學生的基礎知識和應試能力有著嚴格的要求。為了獲得理想的分數，很多學生會花費大量的時間和精力在準備SAT上，以期在眾多申請者中脫穎而出。

精心准备的申请材料

除了[SAT](https://www.apexcharity.org/news/3/84)分數，出色的申請材料也是吸引招生官眼球的重要因素。從個人陳述到推薦信，每一項都需要精心準備，以展示學生的獨特性和潛力。

[美國簽證](https://www.apexcharity.org/news/3/94)：梦想成真的关键

錄取通知書到手，接下來的挑戰是獲得美國的學生簽證。在這個階段，學生需要仔細檢查所有的申請材料，並做好充分的準備，以確保簽證面試的成功。

結語：赴美留學是每個國際學校學生夢寐以求的機會，但每一步都需要付出努力和決心。從SAT考試到簽證申請，每一個挑戰都是成長的契機，也是邁向成功的重要步驟。只有面對並勇敢跨越這些挑戰，學生們才能在美國的學術舞台上展翅翱翔，實現自己的夢想。
汎用性の高いUIが作りたい

# はじめに
この記事は汎用性が高いUIを作りたい記事です。同じ見た目のボタンをたくさん作りたいとき（アイテムスロットとか）に使えます。
先日開催された、historia様主催の第20回ぷちコンにて使用してします。

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


使用環境
Windows11
UnrealEngine5.2.1

# UIの汎用化

UnrealEngineではボタンやテキストボックスなど左側のタブに用意されているもののほかに自作したUIをUIの中に入れ子構造で入れることが可能になっています
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257391/efd3a0a3-a756-de09-ee74-8fec2967da1a.png)

基礎の形を用意します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257391/4932b9e8-f1a1-ed38-2b8c-7ebb18c107f4.png)
（例：PCのショートカットみたいなやつ）

Pre　Contexctで見た目を変更したいものを呼び出しセットします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257391/fe76e40f-4232-60b8-6d28-2e486e3d02ad.png)
見た目を変更したいもの（画像のBrushとかTextの文字列、Fontの文字サイズや色など）を変数にしてインスタンス編集可能にしておくことで表示するUMGに置いたときに個別に編集することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257391/38434ca8-d649-6044-2d65-0a7395e49ecc.png)

見た目の変数はGet+アピアランス下のタブの名前（この場合GetFontでフォントが呼べる）でBPで
編集可能です
![image.png](https://qiita-image-store.s3.ap-northeasしていますt-1.amazonaws.com/0/2257391/7202f699-1275-d23f-b45f-5383de4f7e1c.png)



OnClickなどの呼び出しはインターフェースで配置予定のUIに送信しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257391/035c7ae4-6043-62ba-91b5-647353c39e2e.png)
↑MainUI（配置場所）の取得
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257391/63ccb6c2-040d-7891-7d61-4753dd011470.png)
UMG側にインスタンス編集可にした任意の型の変数を作ってボタン判別用の内容を入れておき、インターフェースが呼び出された際にその変数を渡すことでボタンの判別ができます。

これにより、一つのUIにすべてのUIを乗せる、なんてことをしなくても機能別に切り分けてUIを作ることができます。

![スクリーンショット (20).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257391/f368cf46-4792-0e8e-3c5a-6d89fb327c6e.png)
↑MapフォルダーとGame.exeは全く同じUIを配置しています


これで一つのUMGにすべての機能を配置するのとはおさらばだ！！
【高先さんの電子工作】第22回：パッシブブザーで「私は最強」

# 概要

パッシブブザーを使ってONE PIECE FILM RED主題歌の「私は最強」のメロディを奏でています。

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

## 使っているもの
* Raspberry Pi Pico/Pico W
* 電圧ブザー（パッシブブザー）
* ボタン（なくても可）
* NPNトランジスタ
* 抵抗（1kΩ）

## ソースコード

melodyの部分を書き換えれば好きなメロディを鳴らすことができます。
BPMや音の周波数はChatGPTに聞けば教えてくれます。

```python:main.py
from machine import Pin, PWM
from utime import sleep

# NPNトランジスタのベース
buzzer = PWM(Pin(15))
# ボタンの入力
button = Pin(16, Pin.IN, Pin.PULL_DOWN)

# Beats Per Minute
BPM = 192
# 四分音符の長さ
BEAT = 60 / BPM
# 音の周波数
B4 = 494
Db5 = 554
E5 = 659
Gb5 = 740
Ab5 = 831
A5 = 880
B5 = 988
Db6 = 1109
Eb6 = 1245
E6 = 1319


def tone(frequency, duration):
    """
    パッシブブザーで音を鳴らす。

    Parameters:
        frequency(int): 周波数
        duration(float): 音の長さ
    """
    buzzer.freq(frequency)
    buzzer.duty_u16(30000)
    sleep(duration)
    buzzer.duty_u16(0)
    sleep(0.002)


def watashihasaikyo():
    melody = [
        [E5, 3*BEAT],[Gb5, BEAT],[A5, BEAT],[Ab5, BEAT],[E5, BEAT],[Db5, BEAT],[B4, 3*BEAT],
        [B4, BEAT/2],[B4, BEAT/2],[A5, BEAT],[Ab5, BEAT],[E5, BEAT],[Db5, BEAT],[E5, 3*BEAT],
        [B5, BEAT],[B5, BEAT],[A5, BEAT],[Ab5, BEAT],[Gb5, BEAT],[E5, 2*BEAT],
        [E5, BEAT],[A5, BEAT],[Ab5, BEAT/2],[Gb5, BEAT/2],[E5, BEAT/2],[Gb5, BEAT],[E5, BEAT/2],[Gb5, BEAT],
        [E5, 2*BEAT],[E5, BEAT],[E5, BEAT/2],[E5, BEAT/2],[E5, BEAT],[B5, BEAT],[B5, BEAT],[Db6, BEAT],[B5, 1.5*BEAT],
        [B4, BEAT/2],[B5, BEAT/2],[A5, BEAT/2],[Ab5, BEAT/2],[Gb5, BEAT/2],[E5, BEAT],[Db5, BEAT],[E5, BEAT],[A5, BEAT],[Ab5, 3*BEAT],
        [E6, BEAT/2],[E6, BEAT/2],[E6, BEAT],[Eb6, BEAT],[Db6,BEAT],[B5, BEAT],[E5, 2*BEAT],
        [E5, BEAT],[A5, BEAT],[Ab5, BEAT],[Gb5, BEAT],[E5, 2*BEAT],[E6, 3*BEAT]

    ]
    for m in melody:
        tone(m[0], m[1])

try:
    while True:
        if button.value() == 1:
            watashihasaikyo()
except:
    buzzer.duty_u16(0)

```
クローラーでの情報取得を苦手とするWEBページ

# 概要

前回、[クローラーを運用するための必要な知識](https://qiita.com/ishi720/items/ce14f30d23e5c58b9ee7) を説明しましたが、クロール運用している上で、情報を取得する際にクローラーが苦手なWEBページがいくつかあります。

いくつかピックアップして紹介しますので、「**クロールされたくない方**」や「**クローラーの運営者を困らせたい方**」は参考にしてみてくださいね！！

# クロールが苦手なサイト

## 1. HTMLの構造がページごとにバラバラ

クローラーは、HTMLの構造をパターンを見つけ出して情報を取得します。
HTMLの構造がページごとにバラバラだと、ページごとにレイアウトが違うとパターン化できないため、設定が大変で労力がかかります。

「ブログ」や「WordPressなどCMS」のエディタで作成されたページがそれにあたります。

## 2. レイアウト更新が多い

レイアウトの更新が多いと、HTMLの構造が変わってしまうため、クローラーのメンテナンスが必要となります。クローラー運用者は、ただただ仕事が増えてしまいます。


## 3. HTMLのId属性やclass属性が指定されていない

HTMLを解析するにあたって、CSSセレクタを用いる場合がほとんどです。
そのため、HTMLのId属性やclass属性が指定されていない場合は、**HTML要素の何番目にあるか指定する**必要があるのですが解析が結構面倒なのと、項目が増減する可能性があるので恐怖すら感じます。


```html:こんな感じの平坦なHTML
<div>
    <div>名前: - </div>
    <div>誕生日: - </div>
　　<div>連絡先: - </div>
    <div>身長: - </div>
    <div>体重: - </div>
    <div>ペット: - </div>
    <div>趣味: - </div>
    <div>好きな色: - </div>
    ︙
    ︙
    ︙
    <div>好きな調味料(第3位）: - </div>
</div>
```

## 4. WEBページのコンテンツが実は画像だった

タイトルや説明文や詳細情報などが1枚の画像となっている場合は、HTMLを解析では情報を抜き出すことができず、画像解析が必要となってしまうためです。

一昔前の古いページに多いのですが、クローラーにより情報を抜き取られないようにするには、かなり良い手段なのではないでしょうか。

# おわりに

ちょっと変わった観点かと思いますが、クローラーでの情報取得を苦手とするWEBページを4つ紹介しました。少しでも「そうなんだ」とか「面白いな」と思っていただけたら幸いです。

紹介した内容を実施すると、HTMLやCSSの管理が大変になったり、SEO対策ができなかったりと色々と弊害が起きる可能性がありますので、そこだけはご注意ください。

ここまで読んでいただきありがとうございました。
クリップボードから text/html 形式で取得する

<code>M-x yank-text-html</code> でクリップボードから text/html 形式の文字列を取得します。

```emacs-lisp:
(defun yank-text-html ()
  (interactive)
  (if (functionp 'gui-get-selection)
      (insert (gui-get-selection 'CLIPBOARD 'text/html))
    (yank)))
```
php aritisan serveを実行後→「Failed opening required '…/example-app/vendor/autoload.php' (include_path='.:') in /example-app/artisan on line 18」 

## 開発環境

- Mac OS Monterey（バージョン12..2.1）
- MacBook Air （M1）
- composer version 2.0.9
- Laravel Framework 10.10

Laravel環境を構築して、`php artisan serve`を実行した時のエラー

```jsx
Failed to open stream: No such file or directory in /example-app/artisan on line 18

Failed opening required '…/example-app/vendor/autoload.php' (include_path='.:') in /example-app/artisan on line 18
```

LaravelはURLにアクセスした時にエントリーポイントが参照（public/index.php）仕組みになっていて、その中で、オートロードファイルを読み込みアプリケーションの設定・実行が行われるため、本来設定されているはずのファイルが存在しないよって事らしい。
`/example-app/vendor/autoload.php`にファイルがないということ。

ネットで調べていたら、Qiitaに全く同じとこで詰まっていた人がいたのでその記事を参照

https://qiita.com/chimayu/items/82d9d457a056829b3b2e

僕の場合は、`composer install`もエラーが発生したためそれについての記事はこちら↓↓

https://qiita.com/KazukiITWeb1/items/966b04463ec1646a0ec3

どうやら、GitHubなどで他人のリモートリポジトリからクローンしてきたLaravelのプロジェクトフォルダは、/vendorフォルダがないことがあるんだとか。

## おまけ

vendorフォルダって何だろうと気になったので、調べるとどうやらライブラリが入っている場所らしい。この中にはcompser.jsonやcomposer.lockなどのライブラリに関連するファイルがあって、composer.lockファイルがあることで、ローカル環境と本番環境で、同じversionをインストールすることができるみたい。
heroku login：IP address mismatchエラーの解決方法

# heroku login
`heroku login`を実行すると、`IP address mismatch`というエラーがブラウザに出力されました。
![スクリーンショット 2023-09-23 12.56.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263017/a1ce073f-da00-f7fa-0afc-728ab5e023b0.png)

```sh
% heroku login
 ›   Warning: heroku update available from 8.4.0 to 8.4.3.
heroku: Press any key to open up the browser to login or q to exit:
Opening browser to https://cli-auth.heroku.com/auth/~~~~~~
heroku: Waiting for login... ⣻
```


# heroku login -i
`heroku login -i`を実行したところEmail、Passwordを求められたため、これでいける！と思いましたがエラーが発生。
```sh
% heroku login -i
 ›   Warning: heroku update available from 8.4.0 to 8.4.3.
heroku: Enter your login credentials
Email [test@gmail.com]:
Password: ********
Error: Your account has MFA enabled; API requests using basic authentication with email and password are not supported. Please generate an authorization token for API access.

Error ID: vaas_enrolled
```

# API Keyの設定
パスワードは、MFAが有効化されてる時、API Keyを設定する必要がある。
そのため、PasswordにAPI Keyをコピペしたところ成功しました。
```sh
% heroku login -i
 ›   Warning: heroku update available from 8.4.0 to 8.4.3.
heroku: Enter your login credentials
Email [test@gmail.com]:
Password: ************************************ ← API Keyを設定する
```

# API Keyの発行場所
![スクリーンショット 2023-09-23 12.55.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263017/d80c69a2-c68a-3581-dbc2-8dab6480eed3.png)
![スクリーンショット 2023-09-23 12.55.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263017/544ac3c7-b4dd-0738-2e76-9e2861918067.png)
Oracleが正式にPostgreSQLをサービス開始

オラクル、PostgreSQLのマネージドサービスをOracle Cloudで年内に正式サービス化

先日、Azure上でOracle RACのサービスが利用可能になると記事がありましたが、今度はOracleがPostgreSQLのマネージドサービスをOracle Cloudで年内に正式にサービス化するとのことです。

https://blogs.oracle.com/cloud-infrastructure/post/oci-database-postgres

1年前のOracle CloudWorld 2022で発表されてましたが、正式サービス化はOracle CloudWorld 2023
にて発表されました。

Oracleらしく（といって良いのか微妙ですが）、データベースは何を気を付けるべきか知っているため、クラスタはデータベースに最適化されたブロックストレージを共有していて、これによって高性能かつゼロRPOと低RTOを実現するとのことです。

また必要に応じてリードレプリカを追加することで、スケーラビリティを向上させることも可能だそうで、データベースに最適化されたストレージにより、通常のPostgreSQLよりも高い性能も実現するそうです。

なかなか楽しみですね。
Visual Studio Code Extension Memo

個人的なVS Codeの忘備録

## Key Board Short Cut

| key | 説明 |
|:-:|:-:|
|Ctrl+B |Close/Open side bar   |
|Ctrl+@ |Close/Open terminal   |
|F1 or Ctrl+Shift+P |Open command palette   |
|Ctrl+1 or 2 |Move focus   |
|Ctrl+Tab |Change current file   |
|Ctrl+W |ファイルを閉じる |
|Ctrl+N |ファイルを新規作成 |
|Ctrl+F |検索|
|Ctrl+Shift+F| 検索サイドバー表示|
|Ctrl+D      | 押すたびに選択している文字列と同じ文字列を選択|
|Ctrl+K Ctrl+D | 現在選択している文字列の選択を解除し、次の文字列を選択。上のショートカットと組み合わせて使うと便利。|
|Ctrl+Shift+L| 選択している文字列を全て選択|
|Ctrl+Shift+Alt+Arrow| 矩形選択|
|Ctrl+/ |Toggle line comment|
|Shift+Alt+A |Toggle block comment|
|F12 | タグジャンプ |
|Alt + <- | 戻る。若干微妙な動作になるけど、タグジャンプ後に元に戻るときに使える。 |

## 開発方法

[GET STARTED](https://code.visualstudio.com/api)

## node.js

## Angular

## [C/C++](https://marketplace.visualstudio.com/items?itemName=ms-vscode.cpptools)
[ここ](https://qiita.com/whim0321/items/ce7c1d8d203a21778a83)に使い方を書いているので、参考になれば。

## [Remote Development](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.vscode-remote-extensionpack)
下記の3個の拡張機能のセット。個別に入れても全然問題ない。

* [Remote - WSL](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-wsl)
* [Remote - Containers](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers)
* [Remote - SSH](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-ssh)
    * ローカルで起動したVS codeから、Linux等のsshで接続可能なホストに接続し、リモートホスト上で開発可能。[ここ](https://qiita.com/whim0321/items/ae72b2dd5fd41beaef04)に使い方を書いているので、参考になれば。

## [vscode-icons](https://marketplace.visualstudio.com/items?itemName=vscode-icons-team.vscode-icons)
アイコンセット。フォルダ、ファイル毎のアイコンが山盛り。

## [Thunder Client](https://marketplace.visualstudio.com/items?itemName=rangav.vscode-thunder-client)
VS CodeからHTTP requestを発行できる。Postman風で使いやすい。

## [HexEditor](https://marketplace.visualstudio.com/items?itemName=ms-vscode.hexeditor)
バイナリエディタ。編集もできる。

## [YAML](https://marketplace.visualstudio.com/items?itemName=redhat.vscode-yaml)
YAML編集用拡張機能。拡張機能の設定から、`Yaml: Schemas`から`settings.json`にschemaを設定することで、オートコンプリートでの候補表示を有効にできる。以下は、Kubernetesのyaml用設定。`kubernetes`を任意のschemaのURLにすることで、任意のschemaを適用することも可能。
なお、以下の設定をユーザ毎の設定にしてしまうと、全てのyamlファイルにKubernetes用のSchemaが適用されてしまうので、Workspace毎に設定したほうが良いと思う。

```json:settings.json
{
    "yaml.schemas": {
      "kubernetes": ["*.yaml"]
    }
}
```

`Ctrl+Space`でオートコンプリートの候補表示ができる。
Kotlin Serizalizationを使ってみた

業務アプリのjsonパーサーをmoshiからKotlin Serializationに置き換えました。（新規のAPIに対するものだけですが）
そのときのまとめです。
## 準備
gradle pluginを使います。
（アノテーションに必要なのかな？）
```kotlin:root/build.gradle
plugins {
    kotlin("plugin.serialization").version("1.9.0").apply(false)
}
```
```kotlin:module/build.gradle
plugins {
    kotlin("plugin.serialization")
}

```
ライブラリを入れます。
```kotlin:module/build.gradle
dependencies {
    implementation "org.jetbrains.kotlinx:kotlinx-serialization-json:1.6.0"
}
```
サンプルではバージョンカタログを使っている。

## jsonをkotlinクラスにパースするときのkotlinクラスを定義
```kotlin:hello.class
@Serializable
data class Hello (
    val hello: String,
    val hello2: String? = null
)

```

ここで役に立ったのはopen API。
swaggerのapiの仕様をコピー。
その後、bing AIにお願いすると、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1165483/a9f8987b-c742-492d-45df-3f7f2220f039.png)

画像はswaggerのyamlを貼っていますが、guiのビューをコピーでもいけます。
これ、ネストしたオブジェクトを内部クラスとして定義したりもできます。
数が多いと大変なので便利です。

## デコード
Androidではリソースにjsonを配置して扱えます。
```json:res/raw/test.json
{
  "hello": "world"
}
```

これをデコードして、ログ出力させます。
```kotlin:KotlinSerializationPlayground.class
class KotlinSerializationPlayground(val context: Context) {
    fun decodeTest() {
        val jsonFile = context.resources.openRawResource(R.raw.test)
        val json = Json { ignoreUnknownKeys = true}
        val value = json.decodeFromStream<Hello>(jsonFile)
        Log.d("tag", value.hello)
    }
}
```

これで出力されました。
もちろんretrofitとも使えます。


## json Builderの設定
上のignoreUnknownKeysとかのことです。
下記以外にもいろいろあります。
パースするときのルールみたいなものの設定ですね。

| プロパティ              | 説明                                                                                               |
|-----------------------|----------------------------------------------------------------------------------------------------|
| ignoreUnknownKeys     | defaultでfalse。入力JSON内の未知のプロパティに遭遇した場合に、無視するか、例外を発生させるかどうか。defaultだと、例外を発生させるということ。  |
| coerceInputValues     |不正なJSON値をデフォルトのプロパティ値に強制できるようにする                                |

## retrofitとの運用
あまり今回は踏み込みませんが、Retrofit.Builder()を作るときにmoshiとの違いが出るようです。
addConverterFactoryで適用するfactoryが違います。
そのときに上記JsonBuilderを使うようですね。

moshiとの違いを含めて[【Kotlin1\.4】kotlinx\.serializationとMoshiを比較してみた \- Qiita](https://qiita.com/sudo5in5k/items/d1f5f5bf0db51aae174a#retrofit%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6api%E3%81%8B%E3%82%89%E3%81%AEresponse%E3%82%92%E3%83%87%E3%83%BC%E3%82%BF%E3%82%AF%E3%83%A9%E3%82%B9%E3%81%AB%E5%A4%89%E6%8F%9B%E3%81%99%E3%82%8B%E5%A0%B4%E5%90%88) がわかりやすいです。


## moshiとの違い
jsonをデコードするdecodeFromStream関数による記述がかなりわかりやすくなっていると思います。
KMPの導入も見越してKotlin Serialization置き換える価値は高いと思いました。
composer install実行後→「Your requirements could not be resolved to an installable set of packages」

## 開発環境

- Mac OS Monterey（バージョン12..2.1）
- MacBook Air （M1）
- composer version 2.0.9
- Laravel Framework 10.10

`composr install` を実行しようとすると以下のエラーが出てきた。

```jsx
Your requirements could not be resolved to an installable set of packages.

  Problem 1
    - laravel/framework[v10.10.0, ..., v10.24.0] require composer-runtime-api ^2.2 -> found composer-runtime-api[2.0.0] but it does not match the constraint.
    - Root composer.json requires laravel/framework ^10.10 -> satisfiable by laravel/framework[v10.10.0, ..., v10.24.0].
```

エラー内容を簡単に翻訳すると以下のような意味。

`Your requirements could not be resolved to an installable set of packages.`
→要件をインストール可能なパッケージセットでは解決できませんでした。

つまり、composerのversionを確認した方がよさそう。

## 試したこと

今回は２つのことを試した。

- composer.lockファイルを削除
- composerのversionをアップデート

### composer.lockファイルを削除

これはlockファイルが、悪さしてるかもしれないということで、どうせcomposerインストールし直すので削除した。

### composerのversionをアップデート

`composer —version`　で確認。

```jsx
Composer version 2.0.9 2021-01-27 16:09:27
```

日付が割と古めなので、現行のversionではなさそう。（最新は、2.6.3みたい）

ということで、composerをアップデート

```jsx
composer self-update
```

すると、

```jsx
Composer version 2.6.3 2023-09-15 09:38:21
```

最新versionへの変更が完了。

再度、composer installを実行すると処理が走るようになった！
【ChatGPT無】に俳句を詠んでもらいます。


　どうも、カーブミラーです。

　今回は、ChatGPTさんに俳句を詠んでもらいます。ようやく暑い夏から、秋の気配が漂ってきていますからね。

:::note info
本記事は、ChatGPT（無料版）で
行なっております。GPT4での確認
はできておりません。あしからず。
:::

　まずは、俳句とはなんなのか。

　GoogleSGEに聞きました。

>俳句とは、五・七・五の三句十七音から成る、日本独自の定型詩です。季節を表す言葉「季語」を含まなければならないというルールがあります。﻿
>
>俳句は、俳諧の連歌の発句を基礎とし、それが独立して成立したものです。江戸時代には十七文字と呼称され、現代では十七音とも表記されます。﻿
>
>俳句は、日々目にする情景や、四季折々の自然に触れたり、いろいろな人間模様を目にしたりして心の中に湧き上がってきた喜怒哀楽の感情などを、五・七・五の十七文字で表す定型詩です。﻿
>
>俳句は、誰にでも詠みやすく、覚えやすく、そして季節や自然に親しめることが魅力のひとつです。

　では、これを踏まえて、
　　まずは、Promptから。
```Text:俳句の作成Prompt
# 目的
俳句を作成してください。

# 注意点
・俳句のルールに従ってください。
　a.季語を入れる。
　b.音節5-7-5を守る。
・盗作にならないように注意してください。
・作る上で、情報が必要ならば、聞いてください。

# 出力
作成した俳句
```

　盗作云々の部分は、
　　小林一茶の俳句が
　　　出てきたためです(汗)
***
　やり取りを
　　どうぞ。
***
***ChatGPT***
# 処理手順

1. 俳句を作成します。

2. 俳句の作成に関連する小さな問いを生成します。

3. それぞれの小さな問いに対して回答します。

# 俳句の作成
季語やテーマを教えていただけますか？

***User***
季語は任せます。秋をイメージしてください。

***ChatGPT***
了解しました。秋をイメージした俳句を作成します。﻿
***

　ここから先は
　　作品だけをいくつか
　　　見ていきます。

秋風に
黄葉舞い散る
静寂かな

秋風に
紅葉舞い散る
静寂かな

秋風に  
紅葉舞う木々  
静寂か

紅葉舞う
秋風に揺れ
心静か

紅葉の
枝に揺れる
秋の風

紅葉の
風に舞い散る
秋の日
***
　Regenerateだと、
　　どうしても、
　　　同じようなものが
　　　　出力されてしまいますね。

　今回は、
　　ここまで。
【TypeScript】型アノテーションと型アサーションの違い

TypeScriptの型アノテーションと型アサーション。どちらも名前が似ているし、変数の型情報を何やら操作するという点でも似ています。
混同を避けて正しく使用するためにも、両者の違いと注意点について整理してみました。
間違った点があれば指摘していただけると幸いです。

## 型アノテーション
「**型推論**を明示的に行う」
型推論とは、変数宣言時にコンパイラが文脈を読み取って自動的に型を推論してくれる機能のことである。
型アノテーションは、コンパイラの自動的な型推論に全て任せるのではなく、開発者が任意の型を指定して明示的に型推論を行うことである。
コンパイラに対して「**この変数に代入できる型はこの型だよ**」と伝えるようなイメージです。
したがって、型アノテーション後はコンパイラが変数代入時に指定した型の値かどうかを照合して、代入できない時はエラーを返してくれるようになる。

型アノテーションは、変数、定数、関数、引数の後ろに「**: 型名**」を記述することで明示的に型を指定することができる。

```ts
let age: number;  // 型アノテーション
age = 18;  // OK
age = "John"; // Error
```

## 型アサーション
「**型推論された型情報の上書き**を明示的に行う」
型アノテーションと異なるのは、「コンパイラによって型推論された変数の型情報を上書きする」という点。
これは、コンパイラに対して「型推論ではこの型だったけど、本当はこっちの型です。」と伝えるようなイメージです。

型アサーションは値の前に「**<型名>**」を記述するアングルブラケット構文と、値の後ろに「**as 型名**」を記述するas方法の２種類がある。
（ちなみに、Reactで使用されるJSX構文との混合を避けるために「as構文」の書き方が推奨されている。）

```ts
interface Person { age: number };
let john = {} as Person;  // 型アサーション
let bob = {};
john.age = 18;  // No Error
bob.age = 17;  // Error（Property 'age' does not exist on type '{}'）
```

## 型アサーションの注意点
型アサーションを用いる際の注意点は、**コンパイルエラーに気がつけない可能性がある**こと。
型アサーションの大きな特徴は、「**コンパイラによって型推論された変数の型情報を強制的に上書きする**」ということ。
つまり、**コンパイラによる型推論を上書きする**と、間違った型の値を代入しても**コンパイラがエラーを検出してくれない**ようになります。
（一方で、型アノテーションの場合は、**コンパイラによる型推論を開発者が明示的に指定する**ため、間違った型の値を代入した際にはコンパイラがエラーを報告してくれる。）

例えば、以下のようにオブジェクトを初期化する場合、型アサーションを用いる時はその型に必要なプロパティを全て満たしていなくてもコンパイラはエラーを返してくれません。
```ts
interface Person {
    name: string;
    age: number;
}
// 型アノテーション（Error: Type '{}' is missing the following properties from type 'Person': name, age）
const john: Person = {};  

// 型アサーション（No Error）
const bob = {} as Person;
```

オブジェクトが余分なプロパティを持っている時も同様に、型アサーションを用いた時はコンパイラはエラーを返しません。
```ts
interface Person {
    name: string;
    age: number;
}
// 型アノテーション（Error: Type '{ name: string; age: number; gender: string; }' is not assignable to type 'Person'.）
const john: Person = {
    name: 'john',
    age: 18,
    gender: 'male',
};  

// 型アサーション（No Error）
const bob = {
    name: 'bob',
    age: 17,
    gender: 'male',    
} as Person;
```

以上のように、型アサーションを用いるとエラーやバグに気づかずにプログラムを実行してしまう可能性があります。
そのため、開発者がコンパイラよりもその変数の型に詳しい・確証がある場合でなければ、型アサーションの使用を避けて型アノテーションで型推論を明示的に指定するのが良いと思います。

## まとめ
「**型推論を明示的に行う**」のが型アノテーション
「**型推論された型情報を上書きする**」のが型アサーション

型アサーションは、コンパイラによる型推論を強制的に上書きするので間違った型の値を代入してもコンパイラがエラーを検出してくれない（＝開発者自身で間違っているかどうか判別する必要がある）。
エラーやバグを事前に防ぐためにも、型情報に詳しい・確証がある場合は型アサーション、それ以外の何か特別な理由がなければ型アノテーションを使用する。

---
参考サイト
　- [型アサーション「as」(type assertion)](https://typescriptbook.jp/reference/values-types-variables/type-assertion-as)
　- [型宣言と型アサーション](https://zenn.dev/mrbabyyy/articles/0be002fedafef4)
いつもお世話になっているツールたち

## MindNode

https://apps.apple.com/jp/app/mindnode-mind-map-outline/id1289197285?mt=12

Mac用のマインドマップです。

### 気に入っている点

- デザインがシンプルで見やすい

- 動作が軽い

- TODO管理ができる

- ショートカットキーが使いやすい

### 作業ログとして使う

僕は実装含め、作業のログを取っています。

ログを取っていると、「自分今なにやってるんだっけ？」となった時にすぐ立ち返れますし、作業の中断にも強いです。

作業中に話しかけられでも、今やっていることはとりあえず忘れて、話に集中できます。

話が終わったら、ログの地点から再開すればいいのです。

### 画面共有してホワイトボード代わりに使う

リモートで会話をする時、マインドマップ上で話を整理しながら進められます。

思考の繋がりが伝わりやすく、レイアウトも自由が効くので、効率よく意思疎通ができます。

## Alfred

https://apps.apple.com/jp/app/alfred/id405843582?mt=12

Mac用のランチャーアプリです。
最近はRaycastも人気ですが、以下の理由から僕はAlfredを使っています。

- すでにPowerpack(買い切りの有料版のこと)を購入済み

- 自分の中でAlfredを使った作業手順が確立している

### Web Search

パラメータを指定して、好きなサイトを開けます

僕は以下のように使うことが多いです

	- Backlogの課題番号を打ち込んで一発で課題ページを開く

	- DocBaseで検索したい言葉を打ち込んで一発で検索結果ページを開く

### 電卓

ちょっとした計算に便利です

### 画面ロックなどのシステム操作

Lock(画面スリープ)をよく使います

### シェルコマンド実行

直接コマンドを打ち込めます

僕はVSCodeの起動にエイリアスをあてているので、パッとプロジェクトを立ち上げたい時に使います


### スニペット(有料)

スニペットをグループ分けしつつ登録できます

スラックでよく使う定型文などに使います

### クリップボード履歴(有料)

元々はPasteを使っていたのですが、勝手にローマ字入力に切り替わって履歴検索しづらいこともあり、Alfredの機能を使うようになりました。

### ワークフロー(有料)

- Copy URL

	- 今開いてるサイトのURLを貼り付けられます

	- 「タイトルだけ」や「マークダウン形式」でURLを取れるのがありがたいです

- Google Suggest

	- サジェストありでグーグル検索できます

- Reminders for Alfred

	- ```r today 22:00 リマインド内容```みたいに打てばMacのリマインドをセットできます

## AZIK

http://hp.vector.co.jp/authors/VA002116/azik/azikinfo.htm

カスタムされたローマ字入力です。キーを打つ回数を減らせます。

### 気に入っている入力

- ```;```→```っ```

- ```"```→```ー```

- ```ds```→```です```

- ```ms```→```ます```

- ```st```→```した```

- ```mn```→```もの```

- ```母音```＋```ん```を打ちたい時

	- [例）kz→かん（z＝a＋ん）](http://hp.vector.co.jp/authors/VA002116/azik/azikinfo.htm#:~:text=%E3%81%AB%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F%E3%80%82-,%E6%92%A5%E9%9F%B3%E6%8B%A1%E5%BC%B5,-%E3%80%8C%EF%BC%92%E6%96%87%E5%AD%97%E3%82%81)

- ```母音```＋```母音```を打ちたい時

	- [例）kp→こう（p＝o＋u）](http://hp.vector.co.jp/authors/VA002116/azik/azikinfo.htm#:~:text=%E6%A7%8B%E3%81%84%E3%81%BE%E3%81%9B%E3%82%93%E3%80%82-,5.2.2%20%E4%BA%8C%E9%87%8D%E6%AF%8D%E9%9F%B3%E6%8B%A1%E5%BC%B5,-%5Bai%5D%5Buu%5D%5Bei)

## be focused

https://apps.apple.com/jp/app/be-focused-focus-timer/id973130201

僕は仕事でもプライベートでもポモドーロを使っていて、以下の理由から15分作業・1分休憩、というスパンで作業しています。

- 会社で5分休みを挟むのは難しい

- 15分ごとに目を閉じて休憩することで、目の疲れが軽減できる(25分だと疲れやすい)

ただ、休憩を1分で設定できるアプリが意外と少なく、ショートカットキーも使いやすかったので、このアプリを使っています。

## (おまけ)A4用紙とボールペン

思考の粒度・形の綺麗さ(記録として残したいか)で以下のように使い分けています

- バックログ・スラック・mindnode・紙とペン

使い方はただ頭の中のことを書き出すだけです。

頭がパンクしなくなります。
Docker Composeとは

## Docker Composeとは

- Dockerをより便利にするツール

## Docker Composeでできること

- コンテナの一括操作
    - 起動
    - 停止
    - 再起動
    - 状態確認
- ボリューム・ネットワークなどを1つのファイルで管理できる
    - ymlファイルで処理内容を定義する
        - 設定項目については[こちら](https://qiita.com/xQIEBo4zFWKZ0ig/items/0f53694e01938eef77b0)
    - 分厚い起動手順書などはいらなくなる

## 参考文献

- [Docker Compose 概要 — Docker-docs-ja 24.0 ドキュメント](https://docs.docker.jp/compose/index.html)
【Vite】jQueryやVanilla JSでWebサイト制作をしたい人のためにボイラープレートを公開しました。

HMR（≒ホットリロード）やビルドが高速と巷で話題の Vite。
Webpackやgulpからの移行を考えている人も多いのではないでしょうか。

しかし、jQueryやVanilla JS（生のJS）を使って受託制作を行おうとすると、設定すべき項目が多く、ちゃんと使える状態までに時間がかかります。

そこで、受託のWebサイト制作者向けに「Viteボイラープレート」を公開しました。

ぜひ使ってみてください。

https://github.com/masa5714/vite-boilerplate

# 特徴

- 今すぐに制作を開始できる。
- HTMLパーツを共通化できる。（Handlebarsを使用）
- HMR（ファイル保存時に自動でブラウザをリロードするようなイメージ。）
- ベンダープレフィックスの自動付与。
- JSONファイルでmeta情報を管理できる。
- 【ビルド時】画像の最適化（圧縮）ができる。
- 【ビルド時】HTMLを自動整形してくれる。
- 【デプロイ時】HTMLを圧縮（minify）してくれる。
- 【デプロイ時】SSHによるデプロイの雛形が用意されている。（Github Actionsを利用）

# 誰に向けたものか？
- LPやコーポレートサイトなどの受託制作をする人。
- WordPress組み込み前に静的コーディングしたい人。
- jQuery または Vanilla JSを使ってサイト制作をしたい人。

# はじめかた

[こちらからzip形式でダウンロード](https://github.com/masa5714/vite-boilerplate/archive/refs/heads/main.zip)を行ってください。
展開後、任意の名前に変更して下記コマンドを実行します。

```bash:ターミナル／コマンドプロンプト
npm install
```

これで準備が整いました。

## ローカルサーバーを起動する

```bash:ターミナル／コマンドプロンプト
npm run dev
```

たったこれだけで完了です。
これはサイト制作を行う度に実行する必要があります。

## ビルドやデプロイについて

- [ビルドについて](https://github.com/masa5714/vite-boilerplate#%E4%BB%BB%E6%84%8F%E3%83%93%E3%83%AB%E3%83%89%E3%82%92%E3%81%99%E3%82%8B%E3%81%AB%E3%81%AF)
- [デプロイについて](https://github.com/masa5714/vite-boilerplate#%E4%BB%BB%E6%84%8F%E3%83%87%E3%83%97%E3%83%AD%E3%82%A4%E3%81%99%E3%82%8B%E3%81%AB%E3%81%AF)

https://github.com/masa5714/vite-boilerplate

※なお、TypeScriptは採用していません。短期的なWebサイト制作においては効果を発揮しにくいという考えによるものです。

# おわり

Viteならではのルールがいくつかあり、苦労した箇所もいくつかあります。（下層ページがビルド対象にならないことや、dev環境のaタグリンクでindex.htmlの省略の扱いなど。）

それらの面倒なことは先に僕が経験して README.md に集約しています。

ぜひお読み頂きご活用いただければと思います。

**フロント実装だけのお仕事募集中！
X（Twitter）のDMにてお気軽にご相談ください！**
- Webサイト制作（静的 / WordPress）
- Next.jsを用いた開発
- Shopify（OS2.0）のテーマを1から開発
- Playwrightを用いたWebスクレイピング


など。
wslでelixir その63

# 概要
wsl(wsl2じゃない)で、elixirやってみた。
練習問題、やってみた。

# 練習問題
Phoenixで、gen.jsonで作ったapiサーバをtitleで検索できる様にせよ。

# 方針
- ルーター書く。
- コントロラー書く。
- REPO書く。

# 手順

router.exに追加

```
	post "/urls/q", UrlController, :select

```

url_contllorer.exに追加

```
  def select(conn, %{"url" => url_params}) do
    url = Urls.get_by(url_params)
    render(conn, "show.json", url: url)
  end

```

urls.exに追加

```
  def get_by(%{"link" => link, "title" => title}), do: Repo.get_by(Url, title: title)
```

# 呼び出し方

```
function test1() {
	var endpoint1 = "http://localhost:4000/api/urls/q";
	var src = '{"url": {"link":"a", "title":"aa_aa"}}';
	var xhr = new XMLHttpRequest();
	xhr.onreadystatechange = function() {
		if (xhr.readyState == 4 && xhr.status == 200)
		{
			out.value = xhr.responseText;
		}
		else
		{
			//alert(xhr.readyState);
			//alert(xhr.status);
		}
	};
	xhr.open("POST", endpoint1, true);
	xhr.setRequestHeader('Content-Type', 'application/json');
	xhr.send(src);
}
```

# 成果物

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

以上。
Dockerのデフォルトネットワークとは

## Dockerの「ネットワーク機能」とは

- コンテナ間の通信を制御する機能

## デフォルトネットワークとは

- Dockerをインストールすると、自動で作成されるネットワーク

###  デフォルトネットワークの種類

- Bridge
    - ネットワークを指定せずにコンテナを立ち上げると、このネットワークに接続される
- None
    - 他のコンテナと通信できなくなる
- Host
    - ホストマシンのIPアドレス・ポートが使えるようになる


## 参考文献

- [Docker コンテナ・ネットワークの理解 — Docker-docs-ja 24.0 ドキュメント](https://docs.docker.jp/engine/userguide/networking/dockernetworks.html)
- [【Docker】hostネットワークとnoneネットワークについて - 自由気ままに書いちゃおう](https://www.guri2o1667.work/entry/2021/05/27/%E3%80%90Docker%E3%80%91host%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E3%81%A8none%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6)
UnityでSQL Serverに接続する

UnityでSQL Serverに接続する際、躓いた点をメモします。
※.NET Frameworkを使用する方法なのでWindows環境のみでの動作となり、マルチプラットフォームを考えられている方は不向きだと思います。

# ソースコード
接続に以下のような記述を用いました。
ヘッダ部分
```C#
using System.Data.SqlClient;
using System.Data;
```
SQL接続部分
```C#
DataTable dt = new DataTable();

try
{
    SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder();
    builder.DataSource = "IP";
    builder.UserID = "User";
    builder.Password = "Password";
    builder.InitialCatalog = "Table";

    using (SqlConnection connection = new SqlConnection(builder.ConnectionString))
    {
        connection.Open();

        using (var sqlCommand = connection.CreateCommand())
        {
            sqlCommand.CommandTimeout = 60000;
            
            //SQLを記述
            sqlCommand.CommandText = "";

            var adapter = new SqlDataAdapter(sqlCommand);
            adapter.Fill(dt);
        }
    }
}
catch (SqlException e)
{
    Debug.Log(e.ToString());
}
```
しかし、このままではエラーが出ます。どうやらSystem.DataのSqlClientが認識できていないようです。調べてみると、Unityで.NET Frameworkの機能を利用するためには特別な設定をしてやる必要があるようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2534961/033b1776-2765-bcd0-1445-424a1a629317.png)
```
error CS0234: The type or namespace name 'SqlClient' does not exist in the namespace 'System.Data' 
```

# 設定内容
①BuildSettingを開き、左下のPlayer Seggingsをクリックします。
![buildsettings.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2534961/f9113637-7b28-b4e6-6735-77312d7260b0.png)
②Playerの下部にあるConfigurationのApi Compatibility Levelを.NET Frameworkに変更します。（デフォルトで.NET Standard 2.1になっています。）
![playersettings.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2534961/4111f42b-70f4-57e7-2074-344f517ad83e.png)
③Unity Editorを再起動します。

これでエラーが消え、.NET Frameworkの機能を利用できるようになります。

# 最後に
Unityに互換性を選択できる項目があるのを初めて知りました。.NET FrameworkはWindows上のみでの動作なので、マルチプラットフォームのためにデフォルトはStandardになっているんでしょうか。このあたりの認識がかなり甘いので、どなたかツッコミいただければ嬉しいです。
React Native入門 プロジェクト作成まで

## はじめに
React Nativeの環境構築の手順や、基礎知識について、メモ代わりに書いていきます。

## React Nativeとは
以下の記事から抜粋しました。
https://vitalify.jp/app-lab/app-development/react-native/

React Nativeとは、Facebook社が開発したアプリケーションフレームワークでクロスプラットフォームのひとつです。React Nativeを用いることでiOS、Android、Windows、macOSなど、異なるプラットフォームのアプリを同時開発することができます。なお、React Nativeの開発言語にはJavaScriptが用いられています。

Reactは、UIを構築するためのJavaScriptライブラリで、2012年にFacebookのソフトウェア・エンジニアが開発したものになります。社内で開発された後には、Facebook.comやInstagram.com等にも導入されています。

つまり、React NativeはスマホアプリをReactの記法で開発できる、クロスプラットフォームというわけです。

## Expoについて
Expoは、モバイルアプリケーションの開発を簡素化し、高速化するためのフリーかつオープンソースのツールキットです。Expoを使用することで、React Nativeをベースにしたモバイルアプリケーションの開発プロセスをより容易にし、開発者がアプリケーションのコードに集中できるようになります。

## Expo Goをインストール
プロジェクトを作成する前に、「Expo Go」というアプリをインストールしておきます。
こちらのアプリは、開発を進めていくうえで、自分のスマホなどで、実際に画面を表示しながら進めることができます。
(ホットリロード)

以下のページからインストールできます。
https://expo.dev/client?utm_source=google&utm_medium=cpc&utm_content=performancemax&gclid=Cj0KCQjw06-oBhC6ARIsAGuzdw3Z7Sy9AxlswqgliozgKLzDlTTQ0e1rfsd26eYV_g-9bVdJjwWIUu8aAnCKEALw_wcB

## React Nativeプロジェクト作成

以下のコマンドでプロジェクトを作成します。
```
npx create-expo-app SampleProject
```

プロジェクトを起動するには以下のコマンドになります。
```
cd SampleProject
npx expo start
```

起動すると、ターミナルに以下のような表示がされます。
![スクリーンショット 2023-09-23 11.16.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2613586/57fe6f84-98a9-2f41-b85c-04ebd06f664f.png)



表示されたQRコードを読み込むと、Expo Goが起動し、開発中の画面がスマホ上で見られるようになります。
☟
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2613586/8be7569b-6094-16cc-eef4-d659ff9ed24b.png)

この画面はApp.jsファイルのコードが反映されています。
コードを変更してみると、ホットリロードで画面の表示が変更されます。

## ドキュメント一覧
以下が参考にしたドキュメント類になります。

https://reactnative.dev/docs/environment-setup

https://docs.expo.dev/get-started/installation/

## 最後に
他にも記事を書いているので、ぜひ読んでいってください。

https://qiita.com/hukuryo/items/97797a91d7e2ee0bcabc

https://qiita.com/hukuryo/items/265c676d17fe21e75242

https://qiita.com/hukuryo/items/ebeb26823f944f143b11
まるで詩のような日本語で書いたプログラム - 実際に動きます

# はじめに

日本語プログラミングの議論が続いていますが気分転換にこんな奇抜なプログラムはどうでしょうか。

# 経緯

木村 明さん [^1] の傑作かつ芸術的な日本語プログラムに「ポエム（Poem）」があります。
1986年に作られました。当時はPC-9801やFMRなどMS-DOS環境のPCが全盛で、このプログラムもPC-9801向けに書かれていました。プログラムは大変面白いのですが、そのような事情で現在では実際に動かすことはできず長いこと眠っていました。
一方で、Mindのほうは長らく開発していたGUI版が動き始め、Poemが使うグラフィック描画もできるようになったことから、Poem を実際に動かしてみたくなりました。9801グラフィックの互換処理を差し込むことでなんとか動かすことができました。動いたときは「ああ、こんなプログラムだったな」とちょっと感動しました。

# 公開について

氏の許可を得てソース修正と再公開をします。
Poemは当初フリーソフトとしてBBS、Mindサポート掲示板などにアップされたほか、書籍 [^2] の付録にも入っていました。実はソースファイルが作者さんにも私のところにも見つからず、書籍の中古をアマゾンで購入し付録の5インチFDから変換しました。


# ソースコードと実行画面

ソースプログラム後半の見どころは以下の部分です。

```mind:poem.src
～略～

メインは
　　愛は　夢　　恋は　夢　　幸福は　夢　　不幸は　夢
　　　　らんちき騒ぎのあとに
　　　　　　扉を開け
　　　　　　　２８日の　喜劇
　　　　　　　　明日から　３９５日　☆　愛に　酔う
　　　　　　　　　明日から　６３５日　☆　恋に　酔う
　　　　　　　　　　あさってから　７７日　☆　幸福に　酔う
　　　　　　　　　　 １日目から  ７日目まで　☆  着飾って
　　　　　　　　　　 　愛と　恋と  幸福の  タンゴを踊る
　　　　　　　　　　幸福を　２つに　割って　不幸に　入れ
　　　　　　　　　２１０日目から　３３０日目まで　眠る
　　　　　　　　黒を　着飾って
　　　　　　　愛と　恋と　不幸の　ワルツを踊る
　　　　　　愛と　幸福と　昨日に　グッバイと　言って
　　　　　愛に　酔う
　　　　恋が　不幸を　引きよせる
　　　恋に　酔う
　　不幸と　明日に　グッバイして
　 不幸に　酔う
　 愛が  今日から　３９９日間の  悪夢　でなければ　もう一度　…
　 恋が  今日から　６３９日間の  悪夢　ならば
　　愛と　恋と　不幸の　タンゴを踊る　…
　　　恋に　幸福を　加えれば　恋に　酔う
　　　　恋が　今日から　６３９日間の　悪夢　でなければ　もう一度　…
　　　　　愛と　恋と　不幸の　タンゴを踊りつつ　戸惑う
　　　　　　繰り返しくりかえしくりかえし
　　　　　　　扉を閉める。
```

ソースプログラムの全体、実行時の静止画・動画は末尾にリンクを張ります。

こんな変てこなソースであってもコンパイルが正しく通るだけでなく、正しい動作・・乱数を引いた座標にスマイルフェイスを次々と表示・・をします。実行時のスクリーンショットはこんな感じです。

<img src="https://www.scripts-lab.co.jp/demo/Poem-screen.png" width=100%>

# 解説

からくりを説明します。メイン冒頭の、

```
愛は　夢　　恋は　夢
```

という部分。実は「夢」はソースプログラム冒頭で以下のように定義された単語です。

`夢は　変数と　等価。`

したがって先の行は、

```
愛は　変数　　恋は　変数
```

と書くのと同じです。定義ごとに改行するなら、

```
愛は　変数
恋は　変数
```

となります。これならプログラムらしい表現かもしれません。

次に、

```
らんちき騒ぎのあとに
```

とあります。「らんちき騒ぎ」は本ソース冒頭で定義された語で乱数の種を初期化するものです。次のように定義されています。

```
らんちき騒ぎとは
　　　　日時を得て
　　　　日を　分けて　和む
　　　　きちがい星のうたに　酔う。
```

これも独特の表現なので訳が分かりませんが、乱数の種を初期化するのに日時を使っていることは分かります。

次に、

```
２８日の　喜劇
　　～略～
繰り返しくりかえしくりかえし
```

の部分。まず「２８日」の「日」ですが、助数詞は無視され単なる数値として評価されることを効果的に使っています。
また、「喜劇」は「回数指定」と等価定義なので結局、

```
２８を　回数指定し
　　～略～
繰り返し
```

と書くのと同じになり、これは繰り返し構文の始まりです。繰り返しブロックの末尾は「繰り返し」ですが、ここではオリジナルの「繰り返し」を使っています。ただ、「繰り返しくりかえしくりかえし」として余韻を残しています。Mindでは送り仮名は最終的に無視されるので、`繰り返しくりかえしくりかえし` は `繰り返し` と書くのと同じです。

次に、

```
明日から　３９５日　☆　愛に　酔う
```

の部分。まず `明日から　３９５日　☆` での「明日」は「５」として定義されています。「☆」は処理単語で簡易乱数発生をおこないます。つまり５から３９５の間の乱数を発生させることになります。
次に、乱数で得た値を `愛に　酔う` しています。「愛」は変数名で、「酔う」は「入れる」(代入処理)と等価定義されているので、結局上記は、

```
５から　３９５の　乱数を得て　愛に　入れる
```

と同じ効果となります。

## 参考情報

●[ソースファイル Poem.src](https://www.scripts-lab.co.jp/demo/Poem.src.txt)

> **Note**
> Mindのソースファイルの拡張子は src ですが、そのままではブラウザ環境によってはプレーンテキストとして扱われない可能性があるためあえて .txt を末尾に加えました

●[実行時の動画 - Youtube](https://www.youtube.com/watch?v=y8Ss8qxCrEA)


[^1]: 当時、MSA（マイクロソフトウェア・アソシエイツ）で日本語プログラミング言語 Mind のプロモーションをしていた方。劇団 SO2 を主宰。

[^2]: Mind活用入門 - Let's日本語プログラミング、相原 寛、学研、1993
【Rust】クロスコンパイル頻出コマンド

### クロスコンパイルとは

ホストマシンの実行環境(CPUアーキテクチャ)とは異なる実行環境向けにプログラムをコンパイルすること。Rustの場合、組み込み開発やWebAssemblyにコンパイルする場合によく用いる。

# ビルド

### コンパイルターゲットを指定してビルド

```c
cargo build --target=<target>
```

- デフォルトで実行環境がコンパイルターゲットになる
- rustupでインストール済みのtargetのみ指定可能

# rustup

### コンパイルターゲットの追加

```c
rustup target add <target>
```

### コンパイルターゲットの削除

```c
rustup target remove <target>
```

### コンパイルターゲット一覧を確認する

```c
rustup target list
```

- install済のターゲットは(installed)と表示される。
メモ用のwordファイルを瞬時に立ち上げるPowerShellスクリプト


# 0. 動機 (スクリプトのパスを通している前提)
Windowsキー + Rの「ファイル名を指定して実行」から、メモ用のファイル名に既に日付が入っているwordファイルを立ち上げたいな…と思ったこと。

メモ帳だとテキストのみだし、メールだと会社の設定で1年以上前のものは削除されるしな…、ということでwordにしました。

ファイル名に日付入れるの地味にめんどくさいのでそれもスクリプトに書きました。なので"winword"で立ち上げるプレーンのwordファイルとは若干差別化できると思います。


# 1. スクリプト概要・出力
* スクリプト起動
* 新規Wordファイル(.docx)を立ち上げる
* "ダウンロード"のフォルダに「本日の日付_Temp.docx」というファイル名で仮ファイルを保存
* wordファイル本文の冒頭には"Memo"という文字列を追加、
 ...で色々メモしたら適当な場所に「名前を付けて保存」

<br>
* 出力例は下記画像参照 (左：作成した仮ファイルの保存場所、右：作成した仮ファイル)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343332/e1ee8983-f77f-17db-420d-31c5674221a3.png)


# 2. スクリプト全体像・解説
```PowerShell
#wordファイルを立ち上げて画面に表示する
$wd = New-Object -ComObject Word.Application
$wd.Visible = $True
$doc = $wd.Documents.Add()

#workファイル本文に"Memo"という文字列を入れる
$doc.Content.Text = "Memo:"

#日付の取得(例:20230923という形式)
$dayNow = Get-Date -Format "yyyyMMdd"

#立ち上げたwordをダウンロードフォルダに保存する (※XXXXは各自のPCにより異なるので調整してください)
$doc.SaveAs("C:\Users\XXXX\Downloads\$dayNow" + "_Temp.docx") 

```

# 3. おわりに
基本自分用メモですがどこかの誰かの役に立てば幸いです。Qiitaは編集しやすくていいですね。

私は非IT企業の非IT職種(専攻も非IT)の人間なのですが、PowerShellの件気軽に相談できる人が周り(社内)にいないこともあり、もし「こここうやってやるともっと楽だよ」とか「こういう改善加えてみました」みたいな意見もしあれば是非教えてください！


# 4. 余談
* 初めてQiitaで記事書いてみましたがMarkdown方式が思ったより書きやすくてびっくりしました。スクリプトに関してはシンタックスハイライトもあるし、個人でメモ帳とかパワポ、wordなどにメモするより便利だなーと思いました。いいですね。

* 別途「ダウンロードフォルダ内のファイルを全削除する」スクリプトがあるといいと思います。いつの間にかすんごい色々溜まってて容量すごかったりするので…

* PowerShellスクリプトをダブルクリックで実行できるようにしたい場合は下記参照

https://qiita.com/_Sasaki_/items/c8486e58df45333017d7

* パスを通してスクリプトをさらに素早く起動したい場合は下記参照

https://qiita.com/_Sasaki_/items/8384ba3eda0aa6fe6547
Javaで「度の単位の角度をラジアン単位に変換する」の動作を確認してみた

# 概要

Javaで「度の単位の角度をラジアン単位に変換する」の動作を確認してみました。以下のページを参考にしました。

https://www.javadrive.jp/start/math/index10.html

# 実装

以下のファイルを作成しました。
```JSample10_1.java
class JSample10_1{
  public static void main(String[] args){
    double angdeg = 30;

    System.out.println(Math.PI / (180 / angdeg));
    System.out.println(Math.toRadians(angdeg));

    double angrad = Math.toRadians(angdeg);

    System.out.println(180 * angrad / Math.PI);
    System.out.println(Math.toDegrees(angrad));
  }
}
```

以下のコマンドを実行しました。
```
$ javac JSample10_1.java 
$ java JSample10_1 
0.5235987755982988
0.5235987755982988
29.999999999999996
29.999999999999996
```

# まとめ

何かの役に立てば。
stand.fmの楽曲利用申請を少し簡単にするために、楽曲利用申請アプリを作った話

#### stand.fmという音声配信アプリを使ってます。
* 今回stand.fm用楽曲利用申請アプリを作った理由
* stand.fmアプリで、歌を歌った場合、楽曲利用申請という作業をユーザーが実施します。
* JASRACやNexToneなどの権利管理団体から、歌った曲の作品番号、曲名、アーティスト名、作詞者、作曲者を調べて、楽曲利用申請をします。(この作業がおっくうなんです。)
*
* 【楽曲利用申請のステップ】
【ステップ1】　歌った歌の題名をJASRACやNexToneで調べる。
【ステップ2】　stand.fm側の画面から楽曲申請ボタンを押し、楽曲申請用googleフォームを呼び出す。
【ステップ3】　googleフォームで、メルアド、JASRACかNexToneの選択、作品番号、曲名、アーティスト名、作詞者、作曲者を入力して送信。この後、ロボットチェックが必ずある。（チェックボックスをクリックするタイプではなく、写真をクリックするやつ。　僕の知識ではシステム化が無理）

* 何度もやっていて、思っていたこと。　作品番号は1曲につき1つなので、作品番号が分かれば、曲名、アーティスト名、作詞者、作曲者は自動で入力できるはずだと思ってた。

* 使った技術 node.js playwright　(ヘッドレスChrome)

【アプリの概要】
* アプリに必要な情報は以下4点（歌った曲の作品番号は人間が予め調べておく。）
A. stand.fmのログインID
B. stand.fmのパスワード
C. 歌った曲の作品番号
D. stand.fmで曲を歌ったファイルがどこにあるかを示す番号 

【アプリの動作】
* 注意：セキュリティ周りがよく分からないので、コンソールに毎回ログインID/パスワードを入力して、サーバにデータが残らないようにする。
1. stand.fmにログインID/パスワーでログインする。（上記A,B）
2. 作品番号（上記C）から、JASRACかNexToneを判定し、JASRACならJASRAC用検索URLへ行き、曲名、アーティスト名、作詞者、作曲者を取得する。
3. stand.fmに戻り、自分のアーカイブが並んでいる画面を表示して、上記Dで指定した番号の画面を表示させ、楽曲申請画面（Googleフォーム）へ連携させる。
4. Googleフォームで、メルアド、JASRACかNexTone、作品番号、曲名、アーティスト名、作詞者、作曲者を入力し、自分宛にメールを送信するボタンを押し、最後に送信する。
（ここで大問題）ロボットチェックをする必要があり、人間系でチェックが必須！　だから、1曲づつロボットチェックが必要！：：：：これさえ無ければ、ほぼ自動なのに〜


次回は、アプリを記載予定
その次は、自分でこのアプリをインストールして実行するまでの手順
今のところ、パソコンがないと実行できない。（node.js playwright　(ヘッドレスChrome)をスマホで動かせないかな〜？）