OmniAICreator/Qiita-1.07M huggingface dataset:
picoCTF 2024 interencdec write-upと所感

# はじめに
[picoCTF][1] 2024は米カーネギーメロン大学の主催するオンラインCTFイベントで、2024年3月13日～26日（日本時間）に亘って開催された。
当記事では、その中で出題されたCryptoジャンルの問題「interencdec」のwrite-up を述べ、所感を添える。
なお、write-upを読む前に問題を思い出したい、試したい、あるいは元の問題を知らない読者の皆様は、過去問を実際に解くことのできる公式アーカイブ[picoGym][2]を訪れて戴きたい。（要アカウント登録）

# interencdec write-up
1. 与えられた文字列を観察する
```YidkM0JxZGtwQlRYdHFhR3g2YUhsZmF6TnFlVGwzWVROclgyMHdNakV5TnpVNGZRPT0nCg==```
1. 末尾が=でパディングされるのはbaseXX系のエンコーディングの特徴なので、片っ端から確認する
最も有名であろうbase64より確認すると、デコード結果は次の通り。
```b'd3BqdkpBTXtqaGx6aHlfazNqeTl3YTNrX20wMjEyNzU4fQ=='```
その他、base64以外のものでデコードするも、asciiには見えない何らかのバイナリに化ける。
（ここで相当悩んでしまう）
1. シングルクォート'はbase64のデコード結果に含まれない文字列、ということに気付き、「b」とシングルクォートに囲まれた文字列とに分ける
```d3BqdkpBTXtqaGx6aHlfazNqeTl3YTNrX20wMjEyNzU4fQ==```
1. 改めて見てみれば、末尾が=でパディングされているため、再度base64でデコードする
```wpjvJAM{jhlzhy_k3jy9wa3k_m0212758}```
1. 謎の文字列に見えるが、
```xxxxXXX{blablabla...} ```
の形であり、これがフラグ形式の
```picoCTF{foobar...}```
と形が似ており、何らかの換字がなされていると予想
先頭の文字が「p」と仮定して、'p'-'w'=-7
中括弧{}を除いてすべての文字列を-7だけシフトさせて
```picoCTF{caesar_d3cr9pt3d_f0212758}```
# 所感
途中で長考した、b'(実際のペイロード)'の部分など、エンコードした側の人間にとっては覚えて起きやすいちょっとした加工でも、それを読み解く側にとってはそれなりの気付きを要してしまった。
一般家庭などで使われる錠前などもそうで、絶対に破られない錠前はなく、窓を割るなどバイパスもある中で、普段それを利用する本来の住人が鍵で簡単に開けられて、それ以外の人にとってはそれほど簡単ではない、そのギャップを身をもって体験した。
REDT的発想でいえば、ペイロードを送り込む際、既成の難読化ツールやパッカー等で隠しても、それが機械的である限り検知する側も逆操作を簡単にできてしまうが、思わぬ内容を一つ加えるだけでも検知されずに送り込める可能性が高くなるのではないか。

[1]:https://picoctf.org/
[2]:https://play.picoctf.org/practice
npmでorgにパッケージをpublishする時にちょっとハマった

今日はじめてorgでパッケージ公開しようとしてちょっとハマったやつ

普通にnpm loginしてpublicでscoped packageをpublishしようと以下を実行したらエラーがでた

```sh
npm publish --access public
```

エラー

```
npm ERR! code E403
npm ERR! 403 403 Forbidden - PUT https://npm.pkg.github.com/@org-name/package-name - Permission permission_denied: The token provided does not match expected scopes.
npm ERR! 403 In most cases, you or one of your dependencies are requesting
npm ERR! 403 a package version that is forbidden by your security policy, or
npm ERR! 403 on a server you do not have access to.

npm ERR! A complete log of this run can be found in: /Users/xxxxx/.npm/_logs/xxxx-debug-0.log
```

loginアカウントはorgに所属していてmember権限を持ってたので公開できるはずじゃん、なんで...ってなってpublishとかloginコマンドのhelp見てたら以下を発見した

```
$ npm help login
...
   scope

       •   Default: the scope of the current project, if any, or ""

       •   Type: String


       Associate an operation with a scope for a scoped registry.

       Useful when logging in to or out of a private registry:

         # log in, linking the scope to the custom registry
         npm login --scope=@mycorp --registry=https://registry.mycorp.com

         # log out, removing the link and the auth token
         npm logout --scope=@mycorp

       This will cause @mycorp to be mapped to the registry for future installation of packages specified according to the pattern @mycorp/package.

       This will also cause npm init to create a scoped package.

         # accept all defaults, and create a package named "@foo/whatever",
         # instead of just named "whatever"
         npm init --scope=@foo --yes
```

ログインの時にスコープ指定できるらしい。

確かに1つのアカウントが複数のorgと紐づいてることもあるし、どのorgのレジストリにpublishするか知る必要あるのであたりまえといえばあたりまえだった。

なぜか見つけるまで気づかなかったが

というわけでログインをやり直して無事解決した

```sh
npm login --scope=@org-name
```
Salesforceで入力規則を作成しよう～一度設定した特定の選択リストの値を更新させない方法

こんにちは
本橋孝昭です

今回はSalesforce入力規則で
・選択リストにおいて特定の選択リスト値になった場合、その選択リストの値は変更させない

という入力規則作成方法をお伝えします

この入力規則を作成することにより
・通常選択リストは値の変更が可能
・特定の選択リストの値で更新された場合、他の値に更新したらエラーが発生し更新不可になる
・（他の項目はもちろん更新可能）
となります

この入力規則を説明するために、例として
・キャンペーンメンバーの「状況」項目が「送信」で更新された場合、状況項目の値の更新ができない（送信のまま）
の設定を行いました


入力規則の数式はこちらです
>AND(ISCHANGED(Status),
NOT(ISPICKVAL(Status, "送信")))

![入力規則１.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/87e44f26-31af-d0c4-607c-684654e6ec16.png)

このような入力規則をキャンペーンメンバーに設定し有効化すると

・状況の選択リストは値の変更が可能
・状況が「送信」選択リストの値で更新された場合、他の値に更新したらエラーが発生し更新不可になる
・（他の項目はもちろん更新可能）

という設定になります
![入力規則2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/b6483d0e-78f6-ddf0-1908-8eaad1af7e80.png)


これで選択リストの値が変更されることが防げますね
ぜひ試してみてください
RSpecによるRailsテスト入門を読んで

# はじめに
今回はRSpecによるRailsテスト入門という本を読んだので、そちらの感想を書いていこうと思います！

今回読んだ本はこちらです。

https://leanpub.com/everydayrailsrspec-jp


# 良かったところ
RailsやRubyの書籍はたくさん存在していますが、自動テスト（RSpec）についての日本語の書籍はなかなか見たことがありませんでした。よくRailsの書籍の最後の方に少しだけのっていたり、動画の中で少し触れていたりというものはありますが、ガッツリテストの本って見かけないのでテストの学習をしたい方にはとても良いと思いました。

# 悪かったところ
テストって結構簡単に書けると思われているのか、Railsなどの書籍に載っている部分だけの印象だったので、かなりのボリュームに圧倒しました。
そして、購入は海外のサイトなので、ドルでの支払いでした。最近は円安が続いているので、ちょっと高くつくなーって思ってしまいました。（必要なものなので、即決で買いましたが笑）
値段がその時々によってかなり異なってくること。支払い方法が限られているのでその辺も注意が必要です。
内容に関してはとても良かったので、購入して良かったと思っています。

# 学んだこと
#### 3.モデルスペック
- 期待する結果は能動形で明示的に記述すること。exampleの結果がどうなるかを動詞を使って説明すること。チェックする結果はexample1つにつき1個だけにする。
- 起きてほしいことと、起きてほしくないことをテストすること。exampleを書く時は両方のパスを考え、その考えにそってテストを書くこと。
- 境界値テストをすること。もし、パスワードのバリデーションが4文字以上10文字以下なら、4文字と10文字、そして3文字と11文字もテストすることが良いケースになっている。
- 可読性を上げるためにスペックを整理すること。describeとcontextはよく似たexampleを分類してアウトライン化する。beforeブロックとafterブロックは重複を取り除く。テストの場合はDRYであることよりも読みやすいことの方が重要になる。

#### 4.意味のあるテストデータの作成
- Factory Botというgemを使用することで、データを作成する際の柔軟性を上げることができ、リアルなシナリオをテストしやすくなる。

#### 5.コントローラースペック
- コントローラーのテストは簡単に追加していくことができるが、すぐに大きくなって手に負えなくなることもよくある。
- コントローラーのテストは、RailsやRSpecから完全になくなっていないものの、最近では時代遅れのテストになってしまっている。その理由はコントローラーのテストに限界があるためである。
- コントローラーのテストは対象となる機能の単体テストとして最も有効活用できる時だけ使うのがよい。

#### 6.システムスペックでUIをテストする
- システムスペックは受入テスト、統合テストとも呼ばれている。
- Webブラウザを起動し操作をシュミレートするために必要なステップが簡単にわかり、Capybaraを使ってそのステップを再現すれば済む。

#### 7.リクエストスペックでAPIをテストする
- Railsで作成したAPIをテストすることの重要性は徐々に上がってきている。最近ではアプリケーション同士がやり取りする機会が増えてきているため。

#### 8.スペックをDRYに保つ
- テスト内や複数のテストファイルにまたがるコードの重複を減らし、テストコードをDRYすることも重要だが必須ではない。しかし、賢く適用すれば、長い目で見た時に、保守しやすいテストになる。

#### 9.速くテストを書き、速いテストを書く
- モック、スタブ、ファクトリを使うことで、テストする際にさまざまな方法を選択肢として選べるようになる。

#### 10.その他のテスト
- メールやファイルアップロード、webサービス、バックグラウンドプロセスといった機能もテストすることができる。このような機能はアプリケーションの中では些細な機能かもしれないが、必要に応じてその機能をテストする時間も作る必要がある。

#### 11.テスト駆動開発に向けて
- 新機能を実装する際にテストを書いて早期にリファクタリングすれば、時間をかなり節約できる。テスト駆動開発により、結果的に時間の節約に繋がる。


# 難しかったこと
RSpecの記述方法がRailsのコードの構文とは少し異なった書き方をするため、構文を覚えるのがとても大変に感じます。また、多数のgemなどが出てくるのでその使い方もマスターしていかないといけないところも難しいと感じました。テストコードが書けるようになるには時間がかかりそうだと感じます。


# さいごに
今回も実際にコードを実装しながら進めていきましたが、なかなかコードの理解をするのが難しいところが多数ありました。たくさんテストを書く練習をしてマスターしていきたいと思います。
ワードのヘッダーとフッターを出力する

ワードのヘッダーとフッターを出力する
```

Sub CopyWordHeaderFooterToExcel()
    Dim wdApp As Object ' Word.Application
    Dim wdDoc As Object ' Word.Document
    Dim xlApp As Excel.Application
    Dim xlWB As Excel.Workbook
    Dim xlWS As Excel.Worksheet
    Dim i As Integer
    Dim wordFilePath As String
    
    ' ワードファイルを選択
    wordFilePath = Application.GetOpenFilename("Word files (*.doc; *.docx), *.doc; *.docx", , "Select Word file")
    If wordFilePath = "False" Then
        MsgBox "No file selected.", vbExclamation
        Exit Sub
    End If
    
    ' エクセルアプリケーションの起動
    Set xlApp = New Excel.Application
    xlApp.Visible = True ' エクセルを表示するかどうか
    
    ' 新しいワークブックを作成
    Set xlWB = xlApp.Workbooks.Add
    
    ' 新しいワークシートを取得
    Set xlWS = xlWB.Sheets(1)
    
    ' Wordアプリケーションの起動
    On Error Resume Next
    Set wdApp = GetObject(, "Word.Application")
    If wdApp Is Nothing Then
        Set wdApp = CreateObject("Word.Application")
    End If
    On Error GoTo 0
    
    ' Wordドキュメントを開く
    Set wdDoc = wdApp.Documents.Open(wordFilePath)
    
    ' ヘッダーをコピー
    For i = 1 To wdDoc.Sections(1).Headers.Count
        With wdDoc.Sections(1).Headers(i)
            CopyTextToExcel .Range, xlWS.Cells(i, 1)
        End With
    Next i
    
    ' フッターをコピー
    For i = 1 To wdDoc.Sections(1).Footers.Count
        With wdDoc.Sections(1).Footers(i)
            CopyTextToExcel .Range, xlWS.Cells(i + wdDoc.Sections(1).Headers.Count, 1)
        End With
    Next i
    
    ' 後処理
    wdDoc.Close False
    Set wdDoc = Nothing
    Set wdApp = Nothing
    Set xlWS = Nothing
    Set xlWB = Nothing
    Set xlApp = Nothing
    
    MsgBox "Word header and footer contents have been copied to Excel successfully.", vbInformation
End Sub

Sub CopyTextToExcel(rngSource As Object, rngDestination As Object)
    ' テキストをエクセルにコピーする補助関数
    rngDestination.Value = rngSource.Text
End Sub

```
EBSのボリュームタイプ

## 初めに
本日は、EBSのボリュームタイプに関して書かせて頂きたいと思います。

## 種類
| ボリュームタイプ|使用用途      |
|:-----------:|:------------:|
| 汎用SSD(gp2,gp3)|EC2インスタンスのルートボリューム　|
| プロビジョンドIOPS SSD(io1)　　　|高いI/O性能が必要なシステム　|
| プロビジョンドIOPS SSD(io2)|io1よりも高性能|
| スループット最適化 HDD(st1)|シーケンシャルアクセスを行うDBやビックデータ|
| Cold HDD(sc1)|ログやバックアップなど、使用頻度の低いデータ|

## 用語解説
・IOPS→ストレージが1秒あたりに処理できる(書き込み・読み込み)アクセスすの数
HDDは低く、SSDは高い

・スループット→一定時間にどれだけデータを転送できるか。単位時間あたりでどれぐらいの仕事能力があるのか

## 選択基準
①IOPSとスループットのどちらが重要なのかを検討する。
【IOPSの場合】
・汎用SSDもしくはプロビジョンドSSD

【スループットの場合】
・スループット最適化HDDもしくはCold HDD

②その中でも重要する指標は？
【コスト】
・汎用SSD(IOPS)
・Cold HDD(スループット)

【パフォーマンス】
・プロビジョンドSSD(IOPS)
・スループット最適化HDD(スループット)
![スクリーンショット 2024-03-28 15.12.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3744656/158169f9-9ef0-07e8-9b55-aabd35b02b1c.png)

## 最後に
IOPSもしくはスループットのどちらを重要視するかによって選ぶタイプが変わってきます。数字を覚えるのも大切ですが、まずは、どんな状況の時に適しているのかで覚えるといいかもしれませんね。
laravelのプロジェクトをapacheのdocumentroot以外に配置したら動かない

laravelをデプロイした際に、apacheのdocumentroot以外に配置したらURLが通らない。

以下を試したら動いた。

```bash:bash
sudo chown -R apache:apache /var/laravel/project/path
```
所有者をapacheに変更。

```bash:bash
sudo find -R apache:apache /var/laravel/project/path -type d -exec chmod 755 {}\;
```
権限を変更。

そして、下記のURLを参考に、apacheのhttpd.confの末尾に追加したら
(https://zenn.dev/kn64872/articles/08c307fc8651c0)

あとは
```bash:bash
composer dump-autolad
```
動作した。
RaspberryPiでnmcliコマンドを使う

参考 nmcliコマンド説明・英文
https://www.freedesktop.org/software/ModemManager/man/1.14.0/mmcli.1.html
### 備忘
状態を参照
```
$ nmcli connection show
NAME                UUID                                  TYPE      DEVICE
eth0-s              d24efc82-c622-4a25-afe1-9b11832ad2ed  ethernet  eth0
lo                  700f3868-a17f-452f-b4cb-611708033401  loopback  lo
wifi-wlan0          056ee7a8-3a00-4bfc-902a-7534472d479c  wifi      wlan0
Wired connection 1  e28a7cca-8daf-3c89-9286-fe736ca0432b  ethernet  --

$ nmcli connection show eth0-s
connection.id:                          eth0-s
connection.uuid:                        d24efc82-c622-4a25-afe1-9b11832ad2ed
connection.stable-id:                   --
connection.type:                        802-3-ethernet
以下略

$ nmcli device
DEVICE         TYPE      STATE                   CONNECTION
eth0           ethernet  connected               eth0-s
lo             loopback  connected (externally)  lo
wlan0          wifi      connected               wifi-wlan0
p2p-dev-wlan0  wifi-p2p  disconnected            --

$ nmcli device show eth0
GENERAL.DEVICE:                         eth0
GENERAL.TYPE:                           ethernet
GENERAL.HWADDR:                         B8:27:EB:C8:15:09
GENERAL.MTU:                            1500
GENERAL.STATE:                          100 (connected)
GENERAL.CONNECTION:                     eth0-s
GENERAL.CON-PATH:                       /org/freedesktop/NetworkManager/ActiveConnection/4
WIRED-PROPERTIES.CARRIER:               on
IP4.ADDRESS[1]:                         192.168.213.81/24
IP4.GATEWAY:                            --
IP4.ROUTE[1]:                           dst = 192.168.213.0/24, nh = 0.0.0.0, mt = 100
IP6.ADDRESS[1]:                         2402:6b00:de24:3700:2b5d:1bc9:46ea:3701/64
IP6.ADDRESS[2]:                         fe80::a319:8e72:547:7b81/64
IP6.GATEWAY:                            fe80::1266:82ff:fec0:3404
IP6.ROUTE[1]:                           dst = fe80::/64, nh = ::, mt = 1024
IP6.ROUTE[2]:                           dst = 2402:6b00:de24:3700::/64, nh = ::, mt = 100
IP6.ROUTE[3]:                           dst = ::/0, nh = fe80::1266:82ff:fec0:3404, mt = 100
IP6.DNS[1]:                             2402:6b00:de24:3700:1266:82ff:fec0:3404
```
接続設定を有効化
```
sudo nmcli connection reload 
sudo nmcli connection up 接続名
```
接続を停止
```
sudo nmcli connection down 接続名
```
接続設定を削除
```
sudo nmcli connection delete 接続名
```
### リンク
https://qiita.com/Saito5656/items/51502ff6b15a0411452c
https://densan-hoshigumi.com/server/centos-nmcli-operation
https://milestone-of-se.nesuke.com/sv-basic/linux-basic/nmcli/
https://qiita.com/tatsuya-k_net/items/e37fa463e51d1726a60c
https://endy-tech.hatenablog.jp/entry/2019/01/14/012743
https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/7/html/networking_guide/sec-configuring_ip_networking_with_nmcli
https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/9/html/configuring_basic_system_settings/configuring-an-ethernet-connection-by-using-nmcli_assembly_configuring-and-managing-network-access
https://raspida.com/networkmanager-wifi-ap
PowerAutomateDesktopでFirefoxにアドオンをねじ込む作業を自動化してみる

# 前提

FirefoxではChromeやEdgeとはことなり、パッケージ化されていないアドオンを読み込んだ場合、Firefoxを完全に終了させると、次回起動時には跡形もなく読み込まれません。このため、Firefoxをクリーン起動するたびに読み込み直す必要があります。

`about:debugging#/runtime/this-firefox`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94177/b9131004-bf62-6d8e-0190-2dab16d8025c.png)

# 問題

1つくらいならともかく、3つも4つも読み込ませるとなると面倒です。

せっかくの便利なアドオンが面倒だからと使われないのはもったいないですよね。

# 自動化する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94177/435f1a56-b0b1-7bdb-8097-bce3380a638d.png)

<details>
<summary>ソースコード</summary>

```
Variables.CreateNewList List=> manifest_path_list
Variables.AddItemToList Item: $'''C:\\msys64\\home\\path\\to\\somewhare''' List: manifest_path_list
System.RunApplication.RunApplication ApplicationPath: $'''\"C:\\Program Files\\Mozilla Firefox\\firefox.exe\"''' WindowStyle: System.ProcessWindowStyle.Normal ProcessId=> AppProcessId
WAIT 3
UIAutomation.GetWindow.GetForegroundWindow WindowTitle=> WindowTitle WindowInstance=> AutomationWindow
MouseAndKeyboard.SendKeys.FocusAndSendKeysByInstanceOrHandle WindowInstance: AutomationWindow TextToSend: $'''{Control}({T})''' DelayBetweenKeystrokes: 10 SendTextAsHardwareKeys: False
WAIT 2
MouseAndKeyboard.SendKeys.FocusAndSendKeysByInstanceOrHandle WindowInstance: AutomationWindow TextToSend: $'''about:debugging#/runtime/this-firefox{Return}''' DelayBetweenKeystrokes: 10 SendTextAsHardwareKeys: False
WAIT 3
MouseAndKeyboard.SendKeys.FocusAndSendKeysByInstanceOrHandle WindowInstance: AutomationWindow TextToSend: $'''{Tab}{Tab}{Tab}{Tab}{Tab}}{Tab}''' DelayBetweenKeystrokes: 10 SendTextAsHardwareKeys: False
LOOP FOREACH manifest_path IN manifest_path_list
    MouseAndKeyboard.SendKeys.FocusAndSendKeysByInstanceOrHandle WindowInstance: AutomationWindow TextToSend: $'''{Space}''' DelayBetweenKeystrokes: 10 SendTextAsHardwareKeys: False
    WAIT 3
    MouseAndKeyboard.SendKeys.FocusAndSendKeysByInstanceOrHandle WindowInstance: AutomationWindow TextToSend: $'''manifest.json{F4}{LControlKey}({A}){Back}%manifest_path%{Return}''' DelayBetweenKeystrokes: 10 SendTextAsHardwareKeys: False
    WAIT 2
    MouseAndKeyboard.SendKeys.FocusAndSendKeysByInstanceOrHandle WindowInstance: AutomationWindow TextToSend: $'''{Alt}({O})''' DelayBetweenKeystrokes: 10 SendTextAsHardwareKeys: False
    WAIT 3
END
UIAutomation.CloseWindow.CloseByInstanceOrHandle WindowInstance: AutomationWindow
```

</details>

マウス操作は一切使わずキー送信だけで実装しています。これは個人的にPowerAutomateのマウス操作が信用ならないからです。マウスが刺さってないときやRDPされている時の挙動が安定しない傾向にあるように思えます。

`manifest.json`を選択する画面では、最初にファイル名をいれる場所にフォーカスがあたっているのでまず`manifest.json`と記入してから、 <kbd>F4</kbd> キーでアドレスバーにフォーカスを当てて指定のパスに移動して、<kbd>Alt + O</kbd>で読み込ませてます。
Xcode15でImageLiteralが使えない

Swiftを使った開発経験は全くないが、メモとしてここに残しておく。

### 環境
Xcode 15.3

### やりたかったこと
``` swift
import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var diceeImageView1: UIImageView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        goriraImage.image = imageLiteral
    }


}
```

``goriraImage.image = imageLiteral`` こんな感じでimageLiteralというものをつかって画像を参照したかったがXcodeのversionによっては使用することができないらしい。

### どうするか
``` swift
goriraImage.image = #imageLitera(
```
とすることで使用することができた。
リサイクルマーク無し 3.7Vリチウムイオンポリマー電池の捨て方（解決済）

## [結論] 梅田のヨドバシカメラで引き取ってもらえた
家から行ける範囲にヨドバシカメラが無い人はまわれ右

#### 詳しい経緯↓
ある日片付けをしていたら、電子工作用に買ったEEMB製のリチウムイオンポリマー電池を発掘しました。捨てたいのですが、このとおりリサイクルマークがありません・・・
膨らんでいないのが幸いですが、さてどうしましょう。

<img width="200" alt="でんち.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855006/f2fa2362-20cb-c2fb-13ae-fa87d785c3e6.png">
<img width="150" alt="おもて.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855006/df423ba8-f6fe-5497-c53d-492c35bbbb31.png">
<img width="150" alt="うら.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855006/38a32f64-7597-58be-9c9e-364724b74975.png">

#### まずは住んでいる自治体に電話
 ⇒ そもそもリチウムイオンバッテリの回収自体していないので、近隣の電気屋さんに相談してくださいと言われる

#### 言われた通り家電量販店に片っ端から電話
 ⇒ 近所のジョーシン、エディオン、ケーズデンキ、ヤマダ電機に電話するも、<INS>リサイクルマークのないものは回収できない</INS>とはっきり言われる
 
 (´・ω・`) 
（ここで困ってる人けっこういるんじゃないかと思う・・・）

#### 詰んだので再度 自治体に相談して産廃業者を紹介してもらう
 ⇒ 回収はできるがバッテリーの個数に関わらず１回捨てるのに３万円くらいかかると言われ泣く
#### まだヨドバシカメラが残っていることに気付き、ダメ元でヨドバシ梅田店へ電話する
 ⇒ 電話でリサイクルマークがないことを伝えたところ、とりあえず持ってきて！と言われ、梅田(大阪)の店舗に持ち込む。
 梅田店は15階くらいあってクソでかいので誰に言えばいいか分からず、とりあえず2階のレジのお兄さんを捕まえる。リチウムイオンバッテリーを捨てたいがリサイクルマークが無くて・・・と物を見せながら云々言うと、「回収できますよー！」とあっさり回収。拍子抜け。
ちなみにバッテリーは10個くらいあってそのうち半分は箱も無かったのですが、全部回収してもらえました。
#### 神様～(´；ω；`)
プラモ用の塗料いっぱい買って帰りました。


#### [まとめ] リチウムイオンポリマー電池を捨てる時の検討順としては、

<INS>バッテリー本体にリサイクルマークがある場合</INS>は、自治体に相談するか、家電量販店に電話して持ち込み。

<INS>バッテリー本体にリサイクルマークが無い場合</INS>は、
まず自治体に相談。
（最近は、リサイクルマーク無しでも回収してくれる自治体が僅かながらあるようです。）
自治体がダメなら期待薄ながら家電量販店に片っ端から連絡。行ける範囲にあるならヨドバシ持ち込みになるかなと思います。


以上、ご参考までに～
資本主義社会の目的変数を「幸せ」にするには？

こんにちは、[Figurout](https://figurout.co.jp/)  の中村です。
弊社では、「資本主義のアップデート」をパーパスとして、企業と投資家をつなぐ領域のSaaSをつくっています！

# 資本主義の課題は？
今の資本主義社会は、「人（消費者・従業員・経営者・投資家）」と「企業」が、「財務を目的変数とした最適化」を行っている社会といえると思っています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3757050/fa2f8801-82d1-7c0e-f0cf-77fe2306ab4a.png)

それにより、個人は財産を築き、企業は利益と企業価値を高め、社会は経済発展をする。

でも、この最適化を進めると、「財務」に寄与しないパラメータは毀損されてしまいます。
・環境破壊
・ブラック企業
・アンフェアトレード
・品質偽装や消費者軽視
・経済格差
といった社会問題は、この「財務のみの最適化」をぶん回すと必然的に起こる問題です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3757050/f14e7135-385e-b26b-679b-99a5dac5e451.png)

 ## 「お金だけで選ぶのか」 

消費者として「財務だけの最適化」を行うとどうなるでしょうか？
これは、食べ放題のお店で、原価が高いものだけを注文するようなものです。

労働者としての「財務だけの最適化」は、給与だけを見て就職先を選ぶ行動。

これらが幸せにつながらないことは明らかです。
好きでもない高価な食べ物を無駄に消費する行為は、もったいないとすらいえるかもしれません。

 **自分の満足度（非財務価値）と、コスト（財務価値）という異なるパラメータをバランスを取りながら最大化する行動が、人として幸せに生きる1つのコツ** だと言えます。

経済活動となりにくい人と人とのかかわりあいなどは、財務価値部分がゼロに近い、非財務価値同士の取引といえそうです。

消費者として、労働者として、社会（人同士）の他社と財務価値と非財務価値をやり取りする行動については誰もが直感的に「自分が幸せになる取引」を不器用ながらも選びながら生きています。


「道徳無き経済は犯罪であり、経済無き道徳は寝言である」という二宮尊徳の言葉や、「論語と算盤」の渋沢栄一、「三方良し」の近江商人など、「財務価値と非財務価値」の両方を最大化させるような取り組みでなければ、持続可能ではないというのは人間社会で歴史から培われてきた人類の智慧のはずが、「投資」と「企業活動」においては、**財務価値だけを最適化するような行動が主流となってきてしまっているのが現在の資本主義の課題**だと言えそうです。

## 投資を通じて得られる非財務価値に目を向けよう

多くの成功者は、経済的成功のもとお金で手に入るものを一通り楽しんだあと、お金では買えないものへと関心を向けるようになります。

これは、「お金を多く持つ」ということ"自体"に本質的な価値はないということ。
（お金は、本質的に価値のあることを行うためのケイパビリティとしてのみ重要である）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3757050/88bc284e-e527-c019-6e65-191d3db95a9e.png)


一方、現在の資本主義において「投資を通じて得られる"非財務価値" 」が微々たるものである、というのもまたその通りです。
クラファンとかは非財務価値に重きをおいた投資の1つと言えるかもしれませんし、「推し」も消費行動というよりは非財務を軸とした投資行動と呼べるかもしれません。

まだこうした価値の最適化が回るエコシステムはないですが、そうした「社会というエコシステム」に対して、一企業体というパーツで非財務価値が投資市場へ流れるようにすることで、最終的には資本主義社会が **「財務＋非財務を最適化できるような "システム"」** になることが、資本主義社会の次のフェーズなんじゃないかなーと考えて、企業と投資家の間のエンゲージメントを作るような事業を行っています。


### 具体的にやっていること

* 企業価値を高めるためのIR-DX SaaS
* SRM（CRMの投資家バージョン）
* 非財務企業価値を可視化するモデルづくり（事業内容のテキストマイニングデータでPBRを説明するモデルとか）

### 今後やろうとしていること
* 投資家版 LinkedIn のようなプラットフォームづくり




## エンジニア向け勉強会やります！
以下のようなテーマでLTしたりワイワイお酒飲みながら上記のような課題について話したりするようなイベントを実施予定です！


* 企業価値を評価するモデルづくり
* 開示情報（XBRL）のデータ化の取り組みのポイント
* 機関投資家の保持銘柄リストを活用したデータサイエンス

[![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3757050/b54f3a7f-ee24-81a9-d410-14ebc9b12acb.png)](https://figuraout001.connpass.com/event/313955/)
https://figuraout001.connpass.com/event/313955/


興味あるかたぜひどうぞー！

 **社会をコード以外のものでできた「システム」ととらえ、その最適化に興味あるぜ！ってかた、是非お話ししましょうー！**
iOS TestFlightについて

# 前提
使用言語：ReactNative (プラットフォーム：expo)
DB：firebase
認証機能：clerk
※デプロイが完了しipaファイルがDLできているものとする

# 手順

１、App Store Connectで新規App作成
My  app → App+
・＋マークより新規appを作成
（SKUはバンドルIDの後半にあるcom.XXX.XXXXXで良いみたいです）

２、左上の「iOS App+」からバージョン情報の追加
※私はこの工程求められませんでした
※求められた場合 app.json ファイル内の expo のバージョンにあわせる
※私の場合は[1.0.0]

３、AppStoreから[Transporter]というアプリをインストールして、そこにipaファイルをアップロードする

４、App Store Connectで審査に提出(審査には出さずにテストできます)

・[ビルド＋]→ビルドを追加→完了→保存
※スクショなどの細かい設定はせずにこのままTestFlight

５、TestFlightにてテスターを招待して終了！

【参考にした資料(有料)】
https://www.udemy.com/share/102vgU3@BIeBsVAoUZ-p8LVBhAzJs6KkjtyV0nDpkvsm_UJdqu8GWhjAtQPXpDUblla8f2DSAw==/
Step FunctionsのペイロードJSON理解した

# はじめに
Step Functions（sfn）をふと触ってみました。
lambdaをコールする際のinputとなるペイロードJSONの記法にやや戸惑ったので、アウトプットしてみます。

# ペイロードJSONの記法
ペイロードJSONとは、sfnの中で実行されるlambdahandlerの第一引数にあたるオブジェクトです。

![cap1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3654730/23e035ff-b09c-1668-c200-6310556ccefd.png)

これです。

![cap2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3654730/c13364e3-6f93-0105-58af-9e69e9c5f74f.png)

sfnコンソールでの設定箇所です。

![cap3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3654730/461e3bff-4e74-9c48-5cad-8df68071aaeb.png)

簡単ですが、eventオブジェクトへのマッピングの動作確認ができました。

lambdaで参照したいものは大きく二つあると思います。
sfnのinputと、sfn全体のcontextをです。

それぞれについて整理します。

### （参考）sfnの特殊なJSONPath記法について
JSONPathによってvalueが動的に定義されるkeyは、末尾に".$"を付ける必要があることに注意です。
https://docs.aws.amazon.com/step-functions/latest/dg/input-output-inputpath-params.html#input-output-parameters

## inputを参照したい場合
以下の要領で記載します。
```"input.$": "$"```

![cap4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3654730/a08a7264-d15a-0b92-40b9-c5006d72492f.png)

![cap5.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3654730/1a57c478-5f3d-b22d-1111-58842e94635b.png)

```{"Comment": "テスト"}```をinputにsfnを実行してみます。

![cap6.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3654730/8bf99866-35e0-adbb-592b-8de79ddfdf66.png)

```"input.$": "$"```で取得できていることが確認できます。

### （参考）inputとは？
sfnにおいては、「①ワークフローが実行された最初の入力値」および、「②直前のstateの出力値」です。

![cap7.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3654730/f7a02f70-305f-9da3-11a9-efd2e568daa9.png)

LambdaAのinputは①ワークフローが実行された最初の入力値となります。
LambdaBのinputは②直前のstateの出力値＝LambdaAのoutputとなります。

## contextを参照したい場合
以下の要領で記載します。
```"context.$": "$$"```

![cap9.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3654730/b30f839d-7eb9-d5ba-8b0a-592745dd31cf.png)

![cap8.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3654730/3fcc66ce-1b8c-e7a4-22ee-91b9aa653841.png)


取得できていることが確認できます。

### （参考）contextとは？

https://docs.aws.amazon.com/step-functions/latest/dg/input-output-contextobject.html

sfn全体の情報を持つオブジェクトです。
sfnのIDや、TaskTokenなどを保持しています。

# おわりに
そもそもJSONpathが理解できていなかったため最初は戸惑いましたが、整理してみれば単純な記法に思いました。

ばりばりsfnでマイクロサービスを結合させていきたいです。
AWSでRAG試してみました。

昨日、会社でAWSの生成AIハンズオン勉強会を参加しました。
そこでは、AWS上で生成AIの配置やRAGの使い方について学びました。非常に簡単で使いやすいと感じました。

AWSでRAG使う流れとしては大体⇩の通りです。
①AWS Bedrockでモデルを選定
②AWS CDK（Amazon CloudShell、Amazon Cloud9）で新しいアプリケーションを構築
③RAG用データをアップロード（Amazon S3でアップロード、Amazon Kendraで同期）

AWSのRAGは、この"Kendra"を使ってインデックス化、埋め込み、検索までを一括して行っています。

KendraのRAG検索を少し試しました。
使用したモデルはClaude-3で、テストデータは日立が公開された最適化データです。
使われたモデルはClaude3で、試すデータは
一個テキストベースの質問を投げました。実行されたら以下のようになります。

![3-28-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3556459/0684cf32-72ac-e991-b51b-6d816bcbe0f1.png)

回答は以下となります。（正解です）

![3-28-4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3556459/9f998d9f-766a-656b-a309-4f2a5413d2ce.png)

RAGでうまく対応できていない表データと画像データはどうなるか試してみましたが、間違いました。表データの位置関係はやはり理解できないですね。（正解は”料金体系決定”）

![3-28-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3556459/fb6f97a6-c051-9af3-0369-76927a9120aa.png)


![3-28-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3556459/65d26b68-ab8f-e300-c1c7-5535b8d61cb6.png)


他にも色々試しまして、結果としては悪くはないのですが、やはり表データや画像に対しては弱くて、正確に回答するのは難しいようです。

⇩でも試せますので、興味ある方：

https://catalog.workshops.aws/generative-ai-use-cases-jp/ja-JP
BacklogとGitでソースバージョンコントロール

## 要件
バックログとGitでVersionのControlをしたい

## 案
コマンドでの場合
①ローカルのgitとBacklogのgitをつなぐ
プロジェクトの直下
・ git remote add origin https://xxxx.backlog.com/git/SAN_POWER/san_power.git
・ git pull
※　初回目に認証画面が出る（backlogのid,passwordを入れ）
・ Branchの確認
$ git branch -a
remotes/origin/develop
remotes/origin/master
・ 作業ブランチを作成
git checkout -b develop origin/develop
※　初回目にローカルと矛盾のファイルがある場合、ローカルファイルを削除する

②作業したソースをコミットする
・ 開発環境と繋ぎ、修正テストを行い
・ 修正完了あとにGitに追加する
例 Consignment.page
　git add force-app/main/default/pages/Consignment.page
※バックスラッシュ
　コミットするとき、課題Noをメンションする
　git commit -m "modified for SAN_POWER-458 "

③BacklogのgitにPush
git push origin develop
※ローカルBranch名とリモートBranch名が不一致の場合、git push origin localBranch:remoteBranch

結果確認：
今回のサンプルページConsignment.pageが自動的に課題のコメントに追加されて、差分も見れます。
https://xxx.backlog.com/view/SAN_POWER-458#comment-217440069
Next.jsでのGA4(Google Analytics 4)設定

## はじめに

この記事では、Next.js 14でGoogle Tag Manager (GTM) 経由でGoogle Analytics 4 (GA4) を導入する手順を紹介します。

## 実施内容

Next.jsアプリケーションにGTMとGA4を統合し、ユーザーのページビューやイベントを追跡します。GA4の新機能を活用し、より詳細なユーザー分析を行いたいと考えています。
ありがたいことに、Next.js14からは楽ちんに設定できるように用意されてます。

## 準備

- Google Analytics 4プロパティの作成
- Google Tag Managerアカウントのセットアップ
- Next.js 14プロジェクト

## 実装手順

1. **Google Analyticsの設定**:

   - Google Analyticsにログインし、新しいGA4プロパティを作成します。
   - 設定で「測定ID」を取得します。

2. **Google Tag Managerの設定**:

   - GTMにログインし、新しいコンテナを作成します。
   - GA4のタグを新しいトリガー「All Pages」で設定します。

3. **Next.jsでのGTM統合**:

   - 必要なライブラリをインストールし、GTMコンポーネントを作成します。
       - 手順はこちら公式を[参照](https://nextjs.org/docs/pages/building-your-application/optimizing/third-party-libraries#getting-started)

   ```bash
   npm install @next/third-parties@latest next@latest
   ```

   - ページコンポーネントまたは`_app.js`にGTMコンポーネントを追加します。

    ```jsx
    import { GoogleTagManager } from '@next/third-parties/google'
 
    export default function MyApp({ Component, pageProps }) {
      return (
        <>
          <Component {...pageProps} />
          <GoogleTagManager gtmId="GTM-XYZ" />
        </>
      )
    }
    ```

4. **デプロイとテスト**:

   - 変更をデプロイし、GTMプレビューモードでタグが正しく発火することを確認。

## 結果

設定後、リアルタイムレポートにてユーザーのページビューが正確に表示されることが確認できました。
※一応キャッシュで判定されないことあるかもなので、プライバシーモードでサイトアクセスしてリアルタイムレポートで確認したほうがいいかもです！

## 参考

- [Next.js Documentation](https://nextjs.org/docs/pages/building-your-application/optimizing/third-party-libraries#getting-started)
- [Google Analytics Help Center](https://support.google.com/analytics)
- [Google Tag Manager Help Center](https://support.google.com/tagmanager)
elifの使い道について ～スイカ割りゲーム～

スイカ割りゲーム作成時の失敗
東西南北以外を入力すると怒られるようにしたい。
if文のみを使った場合

```py
import random
suikaido = random.randint(1,9)
suikakeido = random.randint(1,9)
hitoido = random.randint(1,9)
hitokeido = random.randint(1,9)
suikaichi = (suikaido,suikakeido)
hitoichi = (hitoido,hitokeido)
kyori = abs(hitoido-suikaido) + abs(hitokeido - suikakeido)
print("スイカ割りゲームへようこそ!")
print("現在地は",hitoichi,"だよ!")
print("スイカまでの距離は",kyori,"だよ!")
while suikaichi != hitoichi:
  dousa = input("東西南北どれかを入力してね!")
  if dousa == "北":
    if hitoido < 9:
      hitoido = hitoido + 1
    else:
      print("これ以上北には行けないよ!")
  if dousa == "西":
    if hitokeido > 0:
      hitokeido = hitokeido -1
    else:
      print("これ以上西には行けないよ!")
  if dousa == "南":
    if hitoido > 0:
      hitoido = hitoido -1    
    else:
      print("これ以上南には行けないよ!")
  if dousa == "東":
    if hitokeido < 9:
      hitokeido = hitokeido +1 
    else:
      print("これ以上東には行けないよ!")
  else:
    print("東西南北どれかにせい言うたやろ!")      

  hitoichi = (hitoido,hitokeido)
  kyori = abs(hitoido-suikaido) + abs(hitokeido - suikakeido)
  print("現在地",hitoichi)
  print("スイカまでの距離",kyori)

print("スイカを割ったよ!おめでとう!")
```
print("東西南北どれかにせい言うたやろ!")    　部分のelseが東のifにしか対応しておらず、北西南を入力したときにも東でないという理由で怒られる。
北より後ろのifをelifに変えることで東西南北のifを連結させ、elseを意図した通りに作用させる。

elif使ったver
```py
import random
suikaido = random.randint(1,9)
suikakeido = random.randint(1,9)
hitoido = random.randint(1,9)
hitokeido = random.randint(1,9)
suikaichi = (suikaido,suikakeido)
hitoichi = (hitoido,hitokeido)
kyori = abs(hitoido-suikaido) + abs(hitokeido - suikakeido)
print("スイカ割りゲームへようこそ!")
print("現在地は",hitoichi,"だよ!")
print("スイカまでの距離は",kyori,"だよ!")
while suikaichi != hitoichi:
  dousa = input("東西南北どれかを入力してね!")
  if dousa == "北":
    if hitoido < 9:
      hitoido = hitoido + 1
    else:
      print("これ以上北には行けないよ!")
  elif dousa == "西":
    if hitokeido > 0:
      hitokeido = hitokeido -1
    else:
      print("これ以上西には行けないよ!")
  elif dousa == "南":
    if hitoido > 0:
      hitoido = hitoido -1    
    else:
      print("これ以上南には行けないよ!")
  elif dousa == "東":
    if hitokeido < 9:
      hitokeido = hitokeido +1 
    else:
      print("これ以上東には行けないよ!")
  else:
    print("東西南北どれかにせい言うたやろ!")      

  hitoichi = (hitoido,hitokeido)
  kyori = abs(hitoido-suikaido) + abs(hitokeido - suikakeido)
  print("現在地",hitoichi)
  print("スイカまでの距離",kyori)

print("スイカを割ったよ!おめでとう!")
```
wslで、最小のカーネルをコンパイル その32

# 概要
wslで、kernel.elfのコンパイル、やってみた。
さらに、上のkernel見つけたので、コンパイルしてみた。
zundoko、やってみた。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/c3f19490-3bc4-8a24-e852-77a299604312.png)

# サンプルコード

```
#include "apilib.h"
#include "stdlibc.h"

void HariMain(void) {
	char str[30];
	int i,
		j,
		k;
	i = 0;
	while (i < 4)
	{
		if (_rand() % 8 < 4)
		{
			api_putstr0("zun ");
			i++;
		}
		else
		{
			api_putstr0("doko ");
			i = 0;
		}
	}
	api_putstr0("doko kiyosi!!");
	api_end();
}


```

以上。
gcp から aws s3 に オブジェクトストレージを移動させるには？


参考

https://aws.amazon.com/jp/blogs/news/migrating-google-cloud-storage-to-amazon-s3-using-aws-datasync/

にやり方が書いてあるのだが、意味がわからない。


gcloud を利用してファイルをダウンロードし、手動でs3にアップする
という手段が一番わかりやすいと考える。

# gcs からファイルをダウンロードするには？

管理画面からダウンロードしようとしてもブラウザ経由なので負担がかかる。
よって、gcloudを使おう

# gcloud をインスコ

gcloudをインスコ
https://cloud.google.com/sdk/docs/install?hl=ja

ダウンロードし、インストールすると自動でログイン画面に行く。

ログイン後、あんたどこの人？と聞かれるので

```
[32] asia-northeast1-b
[33] asia-northeast1-c
[34] asia-northeast1-a
```

のどれかを適当に選択しよう。

ここまででインスコ完了。

gs...のurlは以下から確認しよう

![名称未設定-5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31338/99ffebac-f03e-f9bd-d3b9-504378873ffd.png)



# ファイルの一覧を取得

```
gcloud storage ls gs://uranaibako.com
```

# アップロード

```
gcloud storage cp C:\Users\h\OneDrive\デスクトップ\写真素材\00022-2555406120.png gs://uranaibako.com
```

# ダウンロード

```
gcloud storage cp gs://uranaibako.com/0I9A6766ISUMI_TP_V.jpg C:\Users\h\OneDrive\デスクトップ\hoge\hoge.jpg
```

# すべてのファイルを一括でダウンロード

```
gcloud storage cp gs://uranaibako.com/** C:\Users\h\OneDrive\デスクトップ\hoge\
```

で一括ダウンロードができる。
wslで、最小のカーネルをコンパイル その31

# 概要
wslで、kernel.elfのコンパイル、やってみた。
さらに、上のkernel見つけたので、コンパイルしてみた。
fizzbuzz、やってみた。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/9c78d7fc-0b8d-065c-d29a-d6d87cb62544.png)

# サンプルコード

```
#include "apilib.h"
#include "stdlibc.h"

void HariMain(void) {
	char str[30];
	int i,
		j,
		k;
	for (i = 1; i < 101; i++)
	{
		if (i % 15 == 0)
		{
			api_putstr0("FizzBuzz ");
		}
		else if (i % 3 == 0)
		{
			api_putstr0("Fizz ");
		}
		else if (i % 5 == 0)
		{
			api_putstr0("Buzz ");
		}
		else
		{
			_sprintf(str, "%d ", i);
			api_putstr0(str);
		}
	}
	api_end();
}





```

以上。
value domainでドメインを購入してみた

Value-Domain様のユーザーサポートでサイトの画像の利用許可を頂きました。
(2024-03-28)

ドメインを100円/1年で購入できるので購入してみた

![1.top.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106311/21ff5b8a-97d6-179c-58f8-75331cc8bbdf.png)


# ドメイン名を検索する
1. ドメインを入力する
1. 検索ボタンをクリックする
![2.search.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106311/4a5413a2-f512-9725-1450-134d16280186.png)

# 検索結果から購入したいドメインをクリックする
1. 取得をクリックする
![3.serch-result.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106311/65e43a50-d4ee-c833-e984-88fd88ea8831.png)


# 申し込み内容を確認する
1. ドメインのみ申し込むをクリックする
1. 次へ進むをクリックする
1. このままドメインのみ申し込むをクリックする
![4.apply1mod.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106311/1852197a-1de5-9e48-d2bc-716162a6df85.png)

![5.apply2-pop.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106311/34037373-cbf8-1290-5df6-6bbcb768d058.png)

# ログインする
1. ユーザー名 / パスワードを入力する
1. お支払いに進むをクリックする
![4-1.login.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106311/c51bd505-4514-7e2f-d511-dac7f4ea27f4.png)

# 申し込みを確定する
1. 支払方法を選択する
1. 利用規約に同意する
1. 申し込み確定をクリックする
![6.payment.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106311/0dd83739-ee9c-47c5-cd32-086c7c5f9da1.png)


この後支払いを完了すればドメインが購入できる
【学習メモ：Flutter入門編】BottomNavigationBarについて

これから「Flutter」を勉強していこうと思っている人向けには「メモ」程度で参照してみてください。

■ 本編の内容に関係がない前置きの情報として
「Flutter」のバグで、**画面が真っ白になって何も表示されなくなる事象が発生する可能性がある** みたいです。
※ 主に古い「Flutter」を利用されている方が対象のようなので、最新版（2024/3/28 時点の物）を利用していたら大丈夫という情報。

【解消方法として】
コマンド入力で以下の順番に実行する事で解消されるとのこと。

1. 「flutter upgrade」で最新版に更新
2. 実行アプリのフォルダ上で「flutter clean」を実行する事でごみ掃除が可能

■ 「BottomNavigationBar（ボトムナビゲーションバー）」とは？
呼び名として「下タブ切替」という機能。

考え方として、メニューがの左側からインデックス番号（index）として「0,1,2,3,4 ..」が定義されている。
※ 「index」番号の最大値はメニューの数によって可変となる。

■ 「BottomNavigationBarItem（ボトムナビゲーションバーアイテム）」
「BottomNavigationBar」に設定するアイテム用に、専用のWidgetを「Flutter」側で用意されており、
「BottomNavigationBarItem」を定義する事で活用可能。

【サンプルコード】
```
const items = [
  BottomNavigationBarItem(
    icon: Icon(Icons.list),
    label: '一覧',
  ),
  BottomNavigationBarItem(
    icon: Icon(Icons.face),
    label: '会員',
  ),
  BottomNavigationBarItem(
    icon: Icon(Icons.settings),
    label: '設定',
  ),
];
```

■ 「BottomNavigationBar」の項目説明
主な設定項目として以下が存在する。

* items：定義した「BottomNavigationBarItem」の配列を設定
* backgroundColor：バーの色（背景色）
* selectedItemColor：選択されたアイテムの色
* unselectedItemColor：選択されていないアイテムの色
* currentIndex：現在のインデックス（選択したインデックス）
* onTap：主な処理として **「状態管理」** として、選択（タップ）したインデックス番号を変更（保持）する必要がある

実際に表示される画面イメージは以下のようになる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3755252/6b104727-b204-7acf-160b-2cb2c9da7dcc.png)

■ 状態管理の仕組みについて
前回の学習で「Riverpodの使い方」という学習メモをまとめてみましたが、事前定義で「ProviderScope」を設定しておく必要があります。

```diff
void main() {
  const app = MaterialApp(home: Root());
+  const scope = ProviderScope(child: app);
  runApp(scope);
}
```

https://qiita.com/shimizu-m1127/items/016bd7b7cfd0c42dc190


# 最後に
Flutter（Dart言語）に関する最低限の情報を「学習メモ」としてまとめてみました。
内容に誤りがありそうであれば、遠慮なくご指摘いただけますと幸いです。

【学習の参考にした動画】
素敵な解説動画の作成ありがとうございます。
本記事の内容より。動画を見た方が解りやすいと思います。

https://www.youtube.com/watch?v=BYOra__jR9g&list=PLY1cxwSQf6nz6zo2Y_UJlDjGOpASAO4hd&index=13
環境移行しつつXCode14からXCode15に移行したらエラー出過ぎて詰みかけた話

## 開発環境
Xcode 15.3
MacBook Air M3


## 環境移行
今まで使用していたMacだと審査に出せなくなってしまう為、新しくMacを購入してもらい環境移行しようとしたら、下記の見慣れぬメッセージが…
<font color="Red">
`
Building for 'iOS-simulator', but linking in object file (/path/.a[arm64][3](alloc.o)) built for 'iOS'
Linker command failed with exit code 1 (use -v to see invocation)
`
</font>
とりあえず、Product->Clean Build Folder を行い、ビルドをかけてみるが解決せず。
意味を調べてみると、
`
iOS シミュレータ」用にビルドされていますが、「iOS」用にビルドされたオブジェクト ファイル (/path/.a[arm64][3](alloc.o)) にリンクされています。
リンカー コマンドが終了コード 1 で失敗しました (呼び出しを確認するには -v を使用します)
`
なるほど、分からん。

とりあえずエラーで調べてみると、同じ物は出てこなかったが似たような物だとM1チップになった際にシミュレータが対応していないのが原因との事。

## 対処法① arm64ビルドをシミュレータから除外してみる
![SS.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224528/970955e5-9279-961c-d7ea-3fdafa8a437b.png)
`PROJECT->TARGET->Build Setting->Architectures->Excluded Architectrues->Debug->Any iOS Simulator SDK`
にarm64を追加する事によってarm64でのビルドを回避するらしいが、下記エラーが出る。
特にmodulemapのエラーは大量発生。
<font color="Red">
`
Command SwiftCompile failed with a nonzero exit code
`
`
Module map file 'path/ライブラリ.modulemap' not found
`
</font>

## 対処法② module map file のエラーを解決する
![SS2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224528/2fd83e88-6a4c-4ba6-bcc9-d63cb7c54bdf.png)

Pods側の
`PROJECT->Architectures->Build Active Architecture Only->Debug
`
をNoにする。

エラーが消えたのでClean Build Folderを行い、ビルドしたところ無事シミュレータの起動を確認。

## 問題解決
今回やった事としては、
メインのPROJCET側でarm64ビルドを除外し、Pods側は非アクティブでもビルドしますよって事らしい。
翻訳かけながら片っ端から記事を読みまくり、CocoaPodsでPodsを再インストールしたりupdateしたりProfile.lock消したりして環境破壊しまくった数日ではありましたが、最終的に私の環境だと上記の対処法のみで問題なかったです。
書籍『Everyday Rails』 で学ぶテストファーストプログラミング

## はじめに
参画予定の案件でRspecを使う機会がありそうなので、予習も兼ねて書籍で基礎から勉強してみました。
本書では、**11章 テスト駆動開発(TDD)に向けて**にて、テストファーストプログラミングを実践できる部分がありました。これが興味深かったので紹介と、今までの開発サイクルと比較してみます。

## 書籍について
#### 学習に使用した書籍
[Everyday Rails - RSpecによるRailsテスト入門](https://leanpub.com/everydayrailsrspec-jp)

#### 書籍詳細
12章で構成されていて、RSpecの基礎知識から学べるような書籍でした。
章を進めるにつれてリファクタリングもしていく感じでした。

<details><summary>目次</summary>

```
1. イントロダクション
2.  RSpec のセットアップ
3. モデルスペック
4. 意味のあるテストデータの作成
5. コントローラスペック
6. システムスペックで UI をテストする
7. リクエストスペックで API をテストする
8. スペックを DRY に保つ
9. 速くテストを書き、速いテストを書く
10. その他のテスト
11. テスト駆動開発に向けて
12. 最後のアドバイス
```
</details>

:::note info
Rails 7.1  RSpec Rails 6.1に対応
2024/01/09にアップデートされたばかりのようです。
:::

## テスト駆動開発について
テスト駆動開発(TDD)は人によって概念や定義が異なることがあるそうです。

今回は、[テスト駆動開発](https://www.amazon.co.jp/%E3%83%86%E3%82%B9%E3%83%88%E9%A7%86%E5%8B%95%E9%96%8B%E7%99%BA-Kent-Beck/dp/4274217884)の翻訳者をされている和田 卓人さんのブログ、[【翻訳】テスト駆動開発の定義](https://t-wada.hatenablog.jp/entry/canon-tdd-by-kent-beck)を参考に記載します。

### テスト稼働開発(TDD)の定義
開始条件と終了条件があり、条件分岐と状態遷移の組み合わせによって構成されたプログラミング手順、ワークフローのこと

### テスト駆動開発を構成する技術プラクティス
<dl>
  <dt>自動テスト</dt>
  <dd>テスティングフレームワークを使ってテストコードを書くこと（あるいは、書かれたテストコードそのもの）</dd><br>
  <dt>開発テスト</dt>  
  <dd>開発者が自分でテストコードを書くこと、開発者自身が自動テストを書きながら開発すること</dd><br>
  <dt>テストファースト</dt>
  <dd>テストコードを実装よりも前に書くこと</dd><br>
</dl>

この記事のおかげで、初学者の自分でも少し区別しやすくなりました。

:::note warn
これらを考慮した上で、今回学習したものを**テストファースト**の分類と認識した上で話を進めることにします。
:::

## 比較してみる
テストファーストを初めて実践したので、今まで自分が経験した開発手法と比較してみます。

### 今までの開発
#### サイクル
```
実装 → テスト → リファクタリング
```
#### メリット
- 時間をかけすぎず実装できる
- 実装の自由度が高い

#### デメリット
- テストに抜け漏れがあると、不具合の発覚が遅れる
- リファクタリングに気力が必要

### テストファースト
#### サイクル
```
テスト → 実装 → リファクタリング
```

#### メリット
- テストから先に書き始めることによって、コードがどのように振る舞うのかを考えることができる
- テストが失敗することで次に作業するべきゴールがわかる
- 品質が上がる

#### デメリット
- 要件を満たすテストコードを書くために、時間が必要


## 比較してみて自分が感じたこと

現在は上司にレビューをいただける環境にいるので、レビュワーの負担にならないように心がけています。
だからこそ、テストファーストのメリットにある、**早い段階で実装漏れがないかを確認できる**点に魅力を感じました。

また、直近ではボリュームが大きいissueを任せていただくこともあるため、テストファーストを採用することで、**切り分けがしやすくなり作業を効率的に進めることができそう**です。

(ただ、今の自分に合っているサイクルで言うと、今までの開発なのかもしれません。)

作業内容やプロジェクトによってどちらのサイクルで進めるのが良いかの判断をして、使い分けることができるようになるのがベストに感じました。

## おわりに
RSpecを学習する目的で購入した書籍でしたが、一番興味深かったので記事にしてみました。

これまで、自分はテスト駆動開発(TDD)とテストファーストを同じものと認識していました。
違いに気付くことができたのは、記事を書くにあたり、社内のエンジニア数名にレビューをいただけたことがきっかけでした。

その中でも、記事内の[テスト駆動開発について](#テスト駆動開発について)に記載したブログは、とある方にいただいたフィードバックでご教示いただきました。

このフィードバックをくださった方はZennで記事を投稿されています。ぜひ併せてご覧ください↓
[AHAスタックでTODOアプリを作った](https://zenn.dev/gigooo_blog/articles/20240209gigoo_aha-stack)

この記事を書くために使用しているマークダウン記法も、実はインターン初日に「これ使えるようになると便利だよ」と声をかけてくださった方のおかげで今こうして自然に使えるようになっています。

業務以外のことでも、このようにレビューをしてくださる方々がいて、新しいことでもまずはやってみることができて、日々学びがあり楽しいです。

また新しいことを学んだ時には、不定期で投稿するようにします。
wslで、最小のカーネルをコンパイル その30

# 概要
wslで、kernel.elfのコンパイル、やってみた。
さらに、上のkernel見つけたので、コンパイルしてみた。
九九、やってみた。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/33e51241-09a7-4924-e425-6cd36bee1278.png)

# サンプルコード

```
#include "apilib.h"
#include "stdlibc.h"

void HariMain(void) {
	char str[30];
	int i,
		j,
		k;
	for (i = 1; i < 10; i++)
	{
		for (j = 1; j < 10; j++)
		{
			k = i * j;
			_sprintf(str, "%d ", k);
			api_putstr0(str);
		}
		api_putstr0("\n");
	}
	api_end();
}




```

以上。
Accessのフォームを解像度に合わせてサイズ変更する方法

```vb
Declare Function GetSystemMetrics32 Lib "user32" Alias "GetSystemMetrics" (ByVal nIndex As Long) As Long

' 画面の幅と高さを取得するための定数
Const SM_CXSCREEN = 0
Const SM_CYSCREEN = 1
'フォームのサイズを調整する次に、フォームのLoadイベントまたはOpenイベント内で、以下のようなコードを使用してフォームのサイズを調整します。
Private Sub Form_Load()
    Dim screenWidth As Long
    Dim screenHeight As Long
    
    ' 画面の解像度を取得
    screenWidth = GetSystemMetrics32(SM_CXSCREEN)
    screenHeight = GetSystemMetrics32(SM_CYSCREEN)
    
    ' フォームのサイズを画面解像度に合わせて調整
    Me.Move 0, 0, screenWidth, screenHeight
End Sub
```
@testing-library/reactでboolean型のstateのテスト

## 概要
@testing-library/reactを使ったことがあまりないのでメモとして残しておきます。

内容としては、useStateを使ってcheckboxの値を管理した実装のテストの記述です。

### 実装コード
```.jsx
import { useState } from 'react';

export const Checkbox = () => {
  const [isChecked, setIsChecked] = useState(false);
  return (
    <div>
      <input type="checkbox" checked={isChecked} onChange={(e) => {setIsChecked(e.target.checked)}} />
      テスト
    </div>
  );
}

```

### テストコード
```.jsx
import { fireEvent } from '@testing-library/react';
import { render } from '@testing-library/react';

describe('checkbox', () => {
  it('checkboxのstate更新チェック', async () => {
    const checkbox = render(<Checkbox />);
    const target = checkbox.getByRole('checkbox');

    // 初期値はfalse
    expect(target.checked).toStrictEqual(false);

    // チェックボックスを押し、stateの更新をする
    fireEvent.click(target);
    expect(target.checked).toStrictEqual(true);
  });
});
```

getByRoleでcheckboxというエレメントを取得し、fireEvent.clickで要素をクリックする
PHP ファイル操作の基本(ファイル名型) 振り返り

# テキストファイルの読み込み


#### ファイル名型 (ファイルを丸ごと操作する方法)
- PHPの標準関数 `file_get_contents`関数を使用してみる

参考: [file_get_contents](https://www.php.net/manual/ja/function.file-get-contents)

`.contact.dat`ファイルを作成及び編集 `txt`でもよい

```dat:contact.dat
あああ
いいい
ううう
```

`test.php`を作成及び編集

```php:test.php
<?php

$contactFile = '.contact.dat';

// ファイル名型 (file_get_contents)
$fileContents = file_get_contents($contactFile);

echo $fileContents;
```

`test.php`にアクセスすると `.contact.dat`の内容がブラウザに表示される。

# ファイルへの書き込み

#### ファイル名型: テキストファイルに書き込みをする(上書きの場合)
- PHPの標準関数 `file_put_contents`関数を使用してみる

参考: [file_put_contents](https://www.php.net/manual/ja/function.file-put-contents)

`test.php`を編集

```php:test.php
<?php

$contactFile = '.contact.dat';

// ファイルに書き込む(上書き)
file_put_contents($contactFile, '上書きされました');
```

`test.php`にアクセスすると `file_put_contents`関数が実行され、`.contact.dat`ファイルの中身を確認すると以下のように上書きされている。

```dat:contact.dat
上書きされました
```

#### ファイル名型: テキストファイルに書き込みをする(追記の場合)
PHPの標準関数 同じく`file_put_contents`関数を使用するが、
第三引数に `FILE_APPEND`というオプションを付ける。

`.contact.dat`を編集

```dat:.contact.dat
ABC
DEF
GHI
```

```php:test.php
<?php

$contactFile = '.contact.dat';

file_put_contents($contactFile, 'JKL', FILE_APPEND);
```

`.contact.dat`ファイルを確認すると以下のように書き込まれる

```dat:.contact.dat
ABC
DEF
GHIJKL
```

- 改行したい場合

`.contact.dat`ファイルを編集

```dat:.contact.dat
ABC
DEF
GHI

```

```php:test.php
<?php

$contactFile = '.contact.dat';

$addText = 'JKL' . "\n"; // "\n" は改行

// ファイルに書き込み(追記)
file_put_contents($contactFile, $addText, FILE_APPEND);
```

`test.php`にアクセスすると`.contact.dat`ファイルの中身は以下のようになる

```dat:.contact.dat
ABC
DEF
GHI
JKL

```

# CSVファイルから読み込む

- 配列で取得するために `file`関数を使用
- コンマごとに区切る `explode`関数を使用
- 配列の表示には `foreach`関数を使用

`contact.csv`ファイルを作成及び編集

```csv:contact.csv
タイトル1,本文1,日付1,カテゴリ1
タイトル2,本文2,日付2,カテゴリ2
タイトル3,本文3,日付3,カテゴリ3
```

`test.php`を編集

```php:test.php
<?php

$contactFile = '.contact.csv';

// 配列: file関数 コンマごとに区切る: explode関数, 配列の表示: foreach関数
$allData = file($contactFile);

foreach ($allData as $lineData) {
    $lines = explode(',', $lineData);
    // echo '<pre>';
    // echo var_dump($lines);
    // echo '</pre>';
    echo $lines[0] . '<br>';
    echo $lines[1] . '<br>';
    echo $lines[2] . '<br>';
}
```

`test.php`にアクセスするとブラウザにcsvファイルの中身が表示される。
wslで、最小のカーネルをコンパイル その29

# 概要
wslで、kernel.elfのコンパイル、やってみた。
さらに、上のkernel見つけたので、コンパイルしてみた。
コンソールが小さいので、大きくしてみた。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/aa5260b7-9d55-77a3-86d9-aba444cfb5f3.png)

# サンプルコード

```
struct SHEET * open_console(struct SHTCTL * shtctl, unsigned int memtotal) {
	struct MEMMAN * memman = (struct MEMMAN *) MEMMAN_ADDR;
	struct SHEET * sht;
	unsigned char * buf;
	sht = sheet_alloc(shtctl);
	buf = (unsigned char *) memman_alloc_4k(memman, 256 * 365);
	sheet_setbuf(sht, buf, 256, 365, -1);
	make_window8(buf, 256, 365, "console", 0);
	make_textbox8(sht, 8, 28, 240, 328, COL8_000000);
	sht->task = open_constask(sht, memtotal);
	sht->flags |= 0x20;
	return sht;
}


void cons_newline(struct CONSOLE * cons) {
	int x,
		y;
	struct SHEET * sheet = cons->sht;
	struct TASK * task = task_now();
	if (cons->cur_y < 28 + 320)
		cons->cur_y += 16;
	else
	{
		if (cons->sht != 0)
		{
			for (y = 28; y < 28 + 320; y++)
			{
				for (x = 8; x < 8 + 240; x++)
					sheet->buf[x + y * sheet->bxsize] = sheet->buf[x + (y + 16) * sheet->bxsize];
			}
			for (y = 28 + 320; y < 28 + 336; y++)
			{
				for (x = 8; x < 8 + 240; x++)
					sheet->buf[x + y * sheet->bxsize] = COL8_000000;
			}
			sheet_refresh(sheet, 8, 28, 8 + 240, 28 + 336);
		}
	}
	cons->cur_x = 8;
	if (task->langmode == 1 && task->langbyte1 != 0)
		cons->cur_x += 8;
}


```

以上。
VBA　Oracle　検索クエリ

<pre>
<code>
Sub searchOracle()
Dim conn As Object
Dim rs As Object
Dim strConn As String
Dim strSql As String
Dim DATA_SOURCE As String
Dim USER_ID As String
Dim Password As String
Dim colOffset As Long
Dim retPiont As Range 'スタート　セール

DATA_SOURCE = Empty　'10.10.10.1:1521/AAA.BBB.COM"
USER_ID = Empty
Password = Empty

'DB情報を取得
Call getDBInfo(DATA_SOURCE, USER_ID, Password)

If DATA_SOURCE = "" Or USER_ID = "" Or Password = "" Then
    　MsgBox "DB情報を取得することができません"
    　Exit Sub
End If

strConn = "Driver=" & "{Oracle in Oraclient12home1}" _
                        & ";Dbq=" & DATA_SOURCE _
                        & ";Uid=" & USER_ID _
                        & ";Pwd=" & Password
                        
strSql = ""

Call clearOldRET  '古いデータを削除
Call getSql(strSql)  'クエリ文字列を取得

Set conn = CreateObject("ADODB.Connection")
On Error GoTo ErrorHandler2
conn.Open strConn '

Set rs = CreateObject("ADODB.Recordset")
rs.Open strSql, conn

'『結果』を載せる位置を取得,
Set retPiont = getStartRange("結果：", 1, 1)

colOffset = 0

'タイトル
 For Each Field In rs.Fields
    retPiont.Offset(0, colOffset).Value = Field.Name
    colOffset = colOffset + 1
 Next Field
 
 'データを読み込む
 rs.MoveFirst
 retPiont.Offset(1, 0).CopyFromRecordset rs

ErrorHandler2:
If conn.State = 1 Then
   　If rs.State = 0 Then
        　　retPiont.Offset(-1, 0) = "SQLは間違い"
    　Else
    　　rs.Close
   　End If
   　conn.Close

End If
Set conn = Nothing

End Sub
</code>
</pre>
'完了
[M5stack Core2] ワイがつまづいたことリスト(解決済) 

初心者のワイがM5stack Core2をいじいじする上で、つまづいて解決したことを書き残していきます。

### ① 画面の明るさを調節したいんだけど、M5.Lcd.setBrightness() が機能しないよ～!!
[解決策] M5.Axp.SetLcdVoltage(v); で画面の明るさを調節できます。（vには2500～3300の値を入れる）
STEP: 1 アイドルグループ

今週前半はAWSの試験があり、直前だったので一旦お休みしてました。

https://paiza.jp/works/mondai/query_primer/query_primer__idle_group

```py
N,K = map(int,input().split())
A = {input() for i in range(N)}
for _ in range(K):
    command = input().split()
    if command[0] == 'handshake':
        for name in sorted(A):
            print(name)
    elif command[0] == 'leave':
        A.remove(command[1])
    else:
        A.add(command[1])

```
久しぶりだったのでちょっとど忘れしたりして長引いてしまいました。

キー無しの辞書は{}でできて、
削除や追加はremove,addでできる。
順序はもちろんsortedで。