OmniAICreator/Qiita-1.07M huggingface dataset:
IPアドレスを無限に自動で変更する【Android】

# adbをインストール

https://developer.android.com/studio/command-line/adb?hl=ja

# USBデバッグを有効化

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435735/6b1e2d18-9228-8768-ddf5-32aa983a724b.png)


# USBテザリングでパソコンとスマホを接続

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435735/adf03f97-5a5b-a5c2-2be3-5ae27e47f999.png)


# IPアドレスを自動で変更する



シェルスクリプトで自動化できます

```powershell
# wifiはオフにしておいてください
.\adb.exe shell svc wifi disable
# IPアドレスを自動で変更する
.\adb.exe shell "svc data disable && svc data enable"
# 以下でも可
#.\adb.exe shell "svc wifi disable && svc data disable && svc data enable"
```

https://stackoverflow.com/questions/23528824/is-there-an-adb-command-to-enable-disable-mobile-datarooted-device

https://android.stackexchange.com/questions/228469/how-to-switchnot-only-on-or-off-the-mobile-data-and-wifi-using-adb

https://stackoverflow.com/questions/30269950/adb-shell-running-multiple-commands-from-same-cmd-window

# IPアドレスが変更されたか確認

https://www.ugtop.com/spill.shtml

```powershell
# IP変更と確認
.\adb.exe shell "svc data disable && svc data enable && sleep 5 && ip -o a"

# 2回変更確認
.\adb.exe shell "svc data disable && svc data enable && sleep 5 && ip -o a && svc data disable && svc data enable && sleep 5 && ip -o a"
```
https://stackoverflow.com/questions/13169249/adb-command-for-getting-ip-address-assigned-by-operator
LeetCode: Two Sum

LeetCodeで取り組んだ問題の備忘録です。

# 問題
変数nums（リスト型、int）及び変数target（int）を入力し、2つの数の合計がtargetとなるnumsのインデックスを返す。

>（例）
Input: nums = [2,7,11,15], target = 9
Output: [0,1] 
理由：nums[0] + nums[1] == 9 であるので、Outputは[0,1]となる。

https://leetcode.com/problems/two-sum/

# 解法
Runtimeで66％、Memoryで36％の回答を上回った計算量$O^2$の解法を紹介する。
この問題は、targetとnumsリスト要素の差を前から順に求め、差をnumsリスト中から見つけること、そしてそのインデックスを求めることが出来れば解けそうだ。新しくdict型の変数を作りnumsの全要素を入れてしまいたくなるが、ここではそれをせず、下記のステップのイメージで解く。

0. dict型変数hashmapを定め、ハッシュマップを作る　
1.　targetとnumsリストの値の差を前から順に求める
2.　求めた差をhashmap中に探し、あればnums要素のインデックスを戻し、なければhashmapに当該nums要素を追加する

```solution.py
class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        hashmap = {}
        for i, n in enumerate(nums):
            diff = target - nums[i]
            if diff in hashmap:
                return [i, hashmap[diff]]
            hashmap[n] = i
```
RHEL8/9のカーネルソースを調査する方法

# 1. SRPMを入手
## YUMの場合
```bash
$ sudo yum install yum-utils
$ yumdownloader --source kernel
```

## DNFの場合
```bash
$ dnf download --source kernel
```

## RedHatカスタマーポータルサイトからダウンロード
RHELサイトにアカウントがある場合はログインしてsrc.rpmをダウンロードする方法もある。
https://access.redhat.com/
ダウンロード > RPM パッケージ検索 > [kernel]を検索 > Source Package - kernel-*.src.rpm をダウンロード。

# 2. SRPMの展開
インストールと同じ。

```bash
$ rpm -ivh kernel.src.rpm
```

ホームディレクトリにrpmbuildというディレクトリが作成され、その中にSPECSとSOURCESが展開されるはずだが、気になる場合は以下で確認できる。

```bash
$ rpm --showrc | grep _topdir
-13: _builddir  %{_topdir}/BUILD
-13: _buildrootdir      %{_topdir}/BUILDROOT
-13: _rpmdir    %{_topdir}/RPMS
-13: _sourcedir %{_topdir}/SOURCES
-13: _specdir   %{_topdir}/SPECS
-13: _srcrpmdir %{_topdir}/SRPMS
-13: _topdir    %{getenv:HOME}/rpmbuild
```

# 3. SPECSフォルダに移動
```bash
$ cd ${HOME}/rpmbuild/SPCES
```

# 4. rpmbuildコマンドを使ってソース展開とパッチ適用
```bash
$ rpmbuild -bp kernel.spec
```

 `pathfix.py command not found` のエラーが出る場合は以下パッケージをインストールで解決するかも。
 RHEL8の場合：yum install platform-python-devel
 RHEL9の場合：yum install python3-devel

${HOME}/rpmbuild/SOURCES 配下のソースをVSCodeなどで確認する。
3D Migotoの使い方（自分用メモ）

自分用の備忘録。毎回やり方を忘れるので。。

## 【はじめに】 Hunting Mode を有効にする(初回のみ)

ダウンロードしてきた3D Migotoフォルダの中にある `d3dx.ini` をテキストエディタで開いてください。
「hunting=」で検索し、「hunting=2」に変更してください。
また、「verbose_overlay」で検索し、「verbose_overlay = 1」に変更して、ファイルを保存してください。
Hunting Modeとは、ゲームのシェーダーを分析し、無効化したり、変更したりするためのデバッグモードみたいなものです。

## Step1. 必要なファイルを所定のフォルダに置く

ゲームの実行ファイルがある場所( `\Path\To\ProjectDir\{GameName}\Binaries\Win64\{GameName}.exe` )に、以下のファイルを置きます。
プロジェクトフォルダにあるゲームの実行ファイル( `\Path\To\ProjectDir\{GameName}.exe` )ではないことに注意してください。

```
d3d11.dll
d3dcompiler_46.dll
d3dx.ini
nvapi64.dll
```

ダウンロードしたときに最初から付属してたShaderFixesフォルダは入れないでください

## Step2. DirectX11でゲームを起動する

DX12ではHunting Modeが起動しないため。
ゲームの実行ファイル( `\Path\To\ProjectDir\{GameName}\Binaries\Win64\{GameName}.exe` )のショートカットを作成し、
右クリック→プロパティ→リンク先の末尾に「 `"~\{GameName}.exe" -dx11` 」をつければ良いです。
後は、そのショートカットをダブルクリックして実行してください。dx11モードでゲームが動きます。
ちなみに、dx12のままだと「ブドゥドゥン♪」みたいな不快な音が鳴って、「d3d11_log.txt」にエラーログが記録されます。

## Step3.  Hunting Mode を起動する

テクスチャを特定したい場面になったら、Num0キーを押します。
画面下部に Hunting Mode Enabled と緑色で表示されたら成功です。
出来る限り、背景がシンプルな場面で行うのが良いです。
背景が複雑な場所で起動すると、ゲームがクラッシュすることがあります。

以下の操作で、テクスチャを特定します。

### 1. PS(ピクセルシェーダー)の選択

一度Hunting Modeが起動すると、Num1とNum2キーを使用して、
現在のピクセルシェーダーの次と前のシェーダーを選択できます。
PS: 1/38 みたいな数字の部分です。

Num1とNum2を交互に押して、お目当てのシェーダーが特定できればNum3を押すことで、テクスチャを記録します。
お目当てのシェーダーのハッシュ値はメモしておくと良いです。
特定できなかった場合は次の手順に進みます

### 2. VS(頂点シェーダー)の選択

Num3とNum4キーを使用して、
現在の頂点シェーダーの次と前のシェーダーを選択できます。
VS: 1/24 みたいな数字の部分です。

Num3とNum4を交互に押して、お目当てのシェーダーが特定できればNum5を押すことで、テクスチャを記録します。
お目当てのシェーダーのハッシュ値はメモしておくと良いです。
特定できなかった場合は次の手順に進みます

### 3. IB(インデックスバッファ)の選択

Num7とNum8キーを使用して(ry Num9で記録します。

### 4. Hunting Mode の終了

Num0キーを再度押すことでHunting Modeを終了します。

## Step4. ShaderFixesの整理

`Binaries\Win64\` フォルダを確認すると、
`ShaderFixes` というフォルダが出来ていることがわかると思います。

この中に、`93dce535a374cb3d_vs_replace.txt` みたいなテキストファイルがいくつか生成されていると思います。
お目当てのシェーダーのハッシュ値以外のファイルは全削除してください。
お目当てのテクスチャを非表示にしたい場合は、このままの状態でゲームを再起動すれば、当該のテクスチャが非表示のままになるはずです。

テクスチャを改造したい場合は、ShaderFixesにあるテキストファイルを全削除して、
テキストファイルを適当な名前で新規作成し、
以下のようにhash値を定義して、handlingでオーバーライドしたい動作を記述します。
(handling=skip はテクスチャを無効化します)

```
[ShaderOverrideRemoveBlur]
hash=93dce535a374cb3d
handling=skip
```

ShaderOverrideの次の文章はご自身のしたい操作で読み替えてください。

以上。
C++のプログラムで無限ループ中のフラグが無視される

# あれ、無限ループ中のフラグ処理が無視されてる……。
環境はLinux。スレッドを複数使用し、各スレッドに共通のフラグを使ってスレッド内部で条件分岐をさせようとしたときの話です。

```
bool image_flag = false;

void* thread_1(){
    while(1){
        if(is_button_pushed()){
            image_flag = true;
        }    
    }
    
    return NULL;
}


void* thread_2(){
    if(image_flag){
        take_image();
        image_flag = false;    
    }
    return NULL;
}

```

上記のプログラムのようにスレッド1でカメラ撮影のフラグが立った場合に、スレッド2でカメラ撮影を行う関数を呼び出そうとしたのですが何故かimage_flagをtrueにしてもtake_image関数が呼び出されることはありませんでした。

# コンパイルで最適化を行うと処理がはぶかれることがある

下記のサイトに答えが示してありました。

https://uquest.tktk.co.jp/embedded/learning/lecture09.html

なるほど。。。今回の場合ですと、おそらくimage_flagが常にfalseであると認識して消してしまったみたいですね。
volatile識別子をつけると動きました。

ありがたや。。。
wslでUbuntuをインストールからdockerまで

管理者用のWindowsターミナルから

```
wsl --install
```

再起動！

dockerインストール

```
sudo apt-get remove docker docker-engine docker.io containerd runc
```
```
sudo apt-get update
```

```
sudo apt-get install -y \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg \
    lsb-release
```
```
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | \
   sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
```
```
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
```

```
sudo apt-get update
```
```
sudo apt-get install -y docker-ce docker-ce-cli containerd.io
```

```
docker --version
```

docker-compose インストール
```
$ sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
$ sudo chmod +x /usr/local/bin/docker-compose
$ docker-compose -v

```
【翻訳】Unstructured Concurrency With Detached Tasks in Swift

非同期タスクを理解することは、この記事を読むための必要条件です。
非同期タスクを理解していない場合は、この記事シリーズから
Unstructured Concurrency With Detached Tasks in Swift
(https://www.andyibanez.com/posts/unstructured-concurrency-with-detached-tasks-in-swift/)
を読むことができます。

この記事シリーズを通して、async/await が何であるかを探ってきました。
また、async letとGroup Tasksによる構造化された並行処理についても足を踏み入れました。
時には、構造化された並行処理は、良いものではありますが、すべてのケースをカバーすることはできないので、非構造化された並行処理の存在に言及し、
非構造化タスクを起動するためにTask {} ブロックを使用する方法を探りました。

この記事では、Swift 5.5 によって提供された最も柔軟な方法である、
Detached Tasksを使って、非構造化並行処理を実装する最後の方法を探ります。

## Detached Tasksの導入

新しいasync/awaitシステムで検討したすべての同時実行オプションの中で、
Detached Tasksは最も柔軟性があります。
どこからでも起動でき、ライフタイムがスコープされず、（Task.Handleを通して）手動でキャンセルして
待機させることができ、親タスクから何も継承しないタスクの一種です。
優先順位でもありません。それらはコンテクストから独立しています。

Detached tasksは、親タスクから完全に独立したタスクを実行する必要がある場合に便利です。
1つの例は、ネットワークから画像をダウンロードし、後でディスクにキャッシュすることです
（この例は、AppleがWWDC2021のExplore Structured Concurrency in Swift
https://developer.apple.com/videos/play/wwdc2021/10134/の講演で
　使用しています）。
一旦画像を手に入れたら、ダウンロードタスクのキャンセルがキャッシング操作のキャンセルを引き起こす理由はないので、キャッシング操作は切り離されたタスクで起こることができます。

```swift
func storeImageInDisk(image: UIImage) async {
    guard
        let imageData = image.pngData(),
        let cachesUrl = FileManager.default.urls(for: .cachesDirectory, in: .userDomainMask).first else { return }
    let imageUrl = cachesUrl.appendingPathComponent(UUID().uuidString)
    try? imageData.write(to: imageUrl)
}
```

```swift
func downloadImageAndMetadata(imageNumber: Int) async throws -> DetailedImage {
    let image = try await downloadImage(imageNumber: imageNumber)
    Task.detached(priority: .background) {
        await storeImageInDisk(image: image)
    }
    let metadata = try await downloadMetadata(for: imageNumber)
    return DetailedImage(image: image, metadata: metadata)
}
```

storeImageInDiskタスクを作成しました。
そして、downloadImageAndMetadataのTask.detached内でこのメソッドを呼び出します。
画像がダウンロードされた直後に、キャッシュを試みます。

Task{}を理解すれば、Task.detached {}を理解することができます。
detached taskを起動するときは、優先順位を指定できます。
私たちの場合は、高い優先度で終了する必要のあるユーザー・タスクではないので、
バックグラウンドを使っています。.userInitiatedは、ユーザーがそのタスクを気にかけていることを意味し、
高い優先度を持つ必要があります。

これらのタスクは構造化されていないので、
Task.detachedはいつでもTaskをキャンセルするために使えるTaskハンドルを返します。
Task.detachedはそれを起動したタスクから独立していますが、
その中で起動された他のすべてのタスクは依然としてTask.detachedに依存しています。
したがって、Task.detachedタスクをキャンセルすると、
Task.detachedの中で別のTask.detachedを実行する場合を除き、
その子タスクはすべてキャンセルされたとマークされます。

## 要約

Task.detachedは、Task {}を理解すればそれほど難しくありません。これらの動作はほとんど同じです。
主な違いは、Task.detachedは親コンテキストから何も継承しないということです。
どちらも手動でキャンセルできます。これらは、依存しないタスクをいつでも実行するのに適しています。

# 【翻訳元の記事】
Unstructured Concurrency With Detached Tasks in Swift
https://www.andyibanez.com/posts/unstructured-concurrency-with-detached-tasks-in-swift/
Splunk: 入力なしで実行ボタンを動作させる


###### 実施環境： Splunk Free 8.2.2

### やりたいこと

 Splunk の実行ボタンは、ドロップダウンやラジオボタンなどの入力に紐づけて使用するのが一般的です。
ですが場合によっては、そのような入力なしで実行ボタンを機能させたい場合があります。

そのようなとき、ちょっと困ったことがあります。
以下のように、1つのパネルと実行ボタン「だけ」をダッシュボードに追加してみます。

![WS000026.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/a10647a0-13dc-6d55-55d3-d767264fc960.jpeg "実行ボタン1")

この状態で保存すると、一見きちんと実行ボタンが作成されたように見えます。

![WS000027.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/2069e7fd-d3e9-670e-5406-e6b9f9cb30a0.jpeg "実行ボタン2")

ところが実は内部的にはこの実行ボタンは無かったことになっており、ページをリロードするとボタンは消えてしまいます。

![WS000028.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/ed0c6028-c713-2141-c8c0-c1235c80c654.jpeg "実行ボタン3")

ダッシュボード自体は XML なので JavaScript などを使えばできなくはないですが、できればもっと簡単に実現したいです。

### 実現方法

どうすればよいかというと、「ダミーの隠し入力」を作成すれば可能です。

今回は「時間」をダミーとして使用してみましょう。
以下のように「 input 」で適当なトークンを「 depends 」に指定すれば、入力を非表示にできます。

```XML:Splunk
    <input type="time" token="field1" depends="$aaa$">
```

さらに、パネルと入力を紐づけます。
今回は「時間」なので、検索期間の部分にトークン「 field1 」を適用します。

```XML:Splunk
          <earliest>$field1.earliest$</earliest>
          <latest>$field1.latest$</latest>
```

以上の内容をダッシュボードに適用します。

![WS000030.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/07382e3e-753e-a6d7-df97-d3ea967e38cd.jpeg "実行ボタン4")

```XML:Splunk
<form>
  <label>実行ボタンテスト</label>
  <fieldset submitButton="true">
    <input type="time" token="field1" depends="$aaa$">
      <label></label>
      <default>
        <earliest>-24h@h</earliest>
        <latest>now</latest>
      </default>
    </input>
  </fieldset>
  <row>
    <panel>
      <table>
        <search>
          <query>| makeresults</query>
          <earliest>$field1.earliest$</earliest>
          <latest>$field1.latest$</latest>
        </search>
        <option name="drilldown">none</option>
        <option name="refresh.display">progressbar</option>
      </table>
    </panel>
  </row>
</form>
```

すると、以下のように実行ボタンが動作するようになります。

![WS000031.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/c5c58138-a247-e2df-d06b-9cc6fa97b1c1.jpeg "実行ボタン5")

![WS000032.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/f6be9491-dc1a-a4a4-505f-249cef117e27.jpeg "実行ボタン6")
Google Apps Scriptを使用してQiita APIから記事情報を取得する方法

## Qiita APIへのアクセストークンの取得
1 Qiitaにログイン後、画面右上の自分のプロフィールアイコンをクリックし、ドロップダウンメニューから「設定」を選択します。

2 設定画面の左側にあるメニューから「アプリケーション」を選択します。

3 「新しくトークンを発行する」ボタンをクリックします。

表示されたトークンをコピーしてください。このトークンは一度しか表示されないので、紛失しないように注意してください。

4 ここで取得したトークンをスクリプトのアクセストークンの部分に置き換えてください。

![スクリーンショット 2023-07-16 0.08.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230985/2188c264-416c-7a2d-15c7-418cd5ba6f66.png)

## Google Apps Scriptプロジェクトの作成
Googleドライブにアクセスし、新しいスプレッドシートを作成します。次に、スプレッドシート内でGoogle Apps Scriptを作成します。

## Qiitaデータ取得用のスクリプトの作成

```js
function fetchQiitaData() {
  var YOUR_ACCESS_TOKEN = "自分のアクセストークンに置き換えてください";
  var apiUrl = 'https://qiita.com/api/v2/authenticated_user/items?per_page=100';
  var response = UrlFetchApp.fetch(apiUrl, {
    headers: {
      'Authorization': 'Bearer ' + YOUR_ACCESS_TOKEN
    }
  });
  var items = JSON.parse(response.getContentText());
  console.log(items);
  
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName('index'); // データを出力するスプレッドシート名に合わせて変更してください
  
  var data = [];
  var header = ['タイトル', 'いいね数', 'ストック数', '閲覧数', '非公開フラグ', '作成日'];
  data.push(header);
  
  for (var i = 0; i < items.length; i++) {
    var title = items[i].title;
    var likes = items[i].likes_count;
    var stocks = items[i].stocks_count;
    var views = items[i].page_views_count;
    var private_flg = items[i].private;
    var created_at = items[i].created_at;
    var row = [title, likes, stocks, views, private_flg, created_at];
    data.push(row);
  }
  
  sheet.getRange(1, 1, data.length, data[0].length).setValues(data);
}

```
【persistent_bottom_nav_bar】pushAndRemoveUntil で BottomNavigationBar を非表示にし画面遷移する方法

### 発生事象
下記 Flutter のパッケージ「persistent_bottom_nav_bar」を使用している状態で、pushAndRemoveUntil を使用し画面遷移を実施したが、BottomNavigationBar が非表示にならない

https://pub.dev/packages/persistent_bottom_nav_bar_v2

また、pushNewScreen メソッドにある withNavBar プロパティを使用することで BottomNavigationBar の制御を実施することができるが、pushNewScreen メソッドはページをスタックに追加するため、前の画面に戻れてしまう問題も発生しているため、pushNewScreen メソッドを使用することはできなかった

### 回避策
「rootNavigator: true」を使用することで回避可能

```dart
Navigator.of(context, rootNavigator: true).pushAndRemoveUntil(
    MaterialPageRoute(
        builder: (BuildContext context) {
        return LoginScreen();
        },
    ),
    (_) => false,
);
```

### 参考ドキュメント
https://stackoverflow.com/questions/65490977/flutter-persistent-bottom-navigation-bar-how-to-get-out

https://github.com/BilalShahid13/PersistentBottomNavBar/issues/70
Dear ImGuiで日本語入力時のIMEの位置をいい感じにする

## はじめに
詰まって時間を溶かしたので、メモです。

## バージョンとか
Windows 10
MSYS2/MinGW-w64
Dear ImGui 1.89.1

## 対象者
ImGuiでテキストボックスを作って、入力するとこうなる人
![スクリーンショット 2023-07-15 233516.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229908/beacbb3d-15ff-089d-f5e8-b2a93186e54e.png)


## 対処方法
imconfig.hの `IMGUI_ENABLE_WIN32_DEFAULT_IME_FUNCTIONS` のコメントを解除する。
IMGUI_ **ENABLE** _WIN32_DEFAULT_IME_FUNCTIONS なので注意
```cpp:imconfig.h（変更前）
//#define IMGUI_ENABLE_WIN32_DEFAULT_IME_FUNCTIONS
```
```cpp:imconfig.h（変更後）
#define IMGUI_ENABLE_WIN32_DEFAULT_IME_FUNCTIONS
```

あとは、imm32.libをリンクするだけ
```cmake:CMakeLists.txt
target_link_libraries(project_name PUBLIC imm32.lib)
```
```bash:または実行時に指定
g++ （たくさんのそーすふぁいる） -limm32
```


## 結果
こうなる
![スクリーンショット 2023-07-15 234246.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229908/8a615fe6-fdb6-e561-2baf-4eada1699a7a.png)

## さいごに
軽く調べてみてもいい感じの記事がなかったので書いてみた。
imconfig.hって自分で変更するファイルだったんだね……

## リンク
Dear ImGui (GitHub)
https://github.com/ocornut/imgui
競合なしでgitのコミットの順番を変更する(rebase -i, revert)

# 目的
例えば、コミットが A→B→C となっている時、Bのコミットを修正したい。
そのやり方は、以下の2つがすぐに思いつく。
1. Bの修正コミットB'を追加し(A→B→C→B')、
B'をBの後ろに移動し(A→B→B'→C)、
BとB'を結合する(A→B"→C)。
1. rebase -i でB直後のコミットに移動し、直接Bを修正する。

競合が発生しない場合はこれでよいが、競合が発生する場合は面倒になる。(競合解消のため、ソースの差分を判断する。)
そこで、上記の方法では競合が発生するような場合でも、競合なしでコミットの順番を変更する方法を示す。
それには git revert を利用する。

# 方法
目的で示したものと同じ例を用いて示す。
すなわち、コミットが A→B→C となっている時、Bのコミットを修正する方法を以下に示す。
\#ここで、C^はCのrevertを意味する。C^をrevertすることを再revertとする(C^^)が、これはCと同じである。
1. rebase -i でC直後に移動し、revert, 再revertを行う。(A→B→C→C^→C→B')
1. Bをrevertする。(A→B→C→C^→C→B'→B'^)
1. B'→B'^ を C→C^ の間に移動する。(A→B→C→B'→B'^→C^→C)
1. B→C→B' を結合(B")し、B'^→C^→C を結合(C")する。(A→B"→C")

以上。
聴覚障害のある方むけ：音量の大小を振動で伝えるしくみ

# 概要

聴覚障害のある方が音を強弱やリズムを感じることが難しいため、それをテクノロジーでサポートする仕組みを試作。

# 動画

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">聴覚障害のある方向けの装置の開発。<br>micro:bitのマイクの機能を使って音量を振動で伝える仕組み。<br><br>ミンミンゼミのリズムもきちんと振動で伝わってきた！ <a href="https://t.co/ugkdEhBTEK">pic.twitter.com/ugkdEhBTEK</a></p>&mdash; keicafeblack (@keicafeblack) <a href="https://twitter.com/keicafeblack/status/1680216090696368129?ref_src=twsrc%5Etfw">July 15, 2023</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

# 全体写真

![onnryou.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181708/5db6a25a-cf86-03f1-d5bb-1e0c91feb62d.jpeg)


# 処理のながれ

micro:bit　v2(内蔵のマイクで音量の大小を感知し、その値をモータードライバに回転数として渡す）
↓
micro:bit用拡張ボードKS0308（モータドライバー）
↓
振動モーター

# コード

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181708/f01cd066-3370-4173-0b89-6d2bbdb42a63.png)

```javascript:soundcheck.js
pins.digitalWritePin(DigitalPin.P14, 1)
basic.forever(function () {
    led.setBrightness(input.soundLevel())
    led.plotBarGraph(
    input.soundLevel(),
    255,
    true
    )
    pins.analogWritePin(AnalogPin.P1, Math.map(input.soundLevel(), 0, 255, 300, 1200))
    pins.digitalWritePin(DigitalPin.P13, 1)
    pins.digitalWritePin(DigitalPin.P12, 0)
})
```

■micro:bitのProject Link

https://makecode.microbit.org/S20131-67584-28560-12697


# 参考にしたサイト

[マイクロビット (micro:bit) v2 マイクの基本](https://docs.iftiny.com/jp/education/microbit/stand-alone/basic/microphone/)

[マイクロビット用のモータードライバ拡張ボード「ＫＳ０３０８」の使い方](https://yasurinori.com/microbit_app001/)
ABC310 B問題別解

問題
[B - Strictly Superior](https://atcoder.jp/contests/abc310/tasks/abc310_b)



本番で提出したABC310のB問題の解き方が[公式解答](https://atcoder.jp/contests/abc310/editorial/6782)と少し異なっていたようなので書いておきます。以下、提出コードです。
```abc310_c.cpp
#include <iostream>
#include <algorithm>
using namespace std;

int main() {
	int n, m;
	cin >> n >> m;
	vector<int> p(n);
	vector<int> c(n);
	vector<vector<int>> f;
	for (int i = 0; i < n; i++) {
		cin >> p[i] >> c[i];
		vector<int> f_;
		for (int j = 0; j < c[i]; j++) {
			int a; cin >> a;
			f_.push_back(a);
		}
		sort(f_.begin(), f_.end());
		f.push_back(f_);
	}

	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++) {
			if (i == j)continue;
			if (p[i] >= p[j]) {
				vector<int> vec;
				set_intersection(f[i].begin(), f[i].end(), f[j].begin(), f[j].end(), back_inserter(vec));
				if (vec == f[i]) {
					if (p[i] > p[j] || f[j].size() > vec.size()) {
						cout << "Yes";
						return 0;
					}
				}
			}
		}
	}
	cout << "No";
	return 0;
}

```

[問題文](https://atcoder.jp/contests/abc310/tasks/abc310_b)は割愛するので適宜参照してください。

私の実装では、2重ループで各組み合わせに対して以下の条件を満たすかどうかを判定しています。

>・P[i]>=P[j]である。
>・j番目の製品はi番目の製品が持つ機能をすべてもつ。
>・P[i]>P[j]であるか、j番目の製品はi番目の製品にない機能を1つ以上もつ。

この条件をif文で愚直に判定を行っています。3つのif文でtrueとなるときYesを出力してreturn 0;としています。

1つ目の条件について、式通りに実装しています。

2つ目の条件について、「j番目の製品はi番目の製品が持つ機能をすべてもつ。」=「j番目のvectorとi番目のvectorの積集合がi番目のvectorと一致する」と解釈しました。

その積集合は、`set_intersection(f[i].begin(), f[i].end(), f[j].begin(), f[j].end(), back_inserter(vec));`でvecに格納されています。
この関数を実行するためには、対象のvectorがsort済みである必要があるため、fに各vectorを挿入する時点で`sort(f_.begin(), f_.end());`という処理を行っています。
[こちら](https://zenn.dev/reputeless/books/standard-cpp-for-competitive-programming/viewer/library-algorithm#6.2-%E4%BA%8C%E3%81%A4%E3%81%AE%E9%9B%86%E5%90%88%E3%81%AE%E4%B8%A1%E6%96%B9%E3%81%AB%E5%AD%98%E5%9C%A8%E3%81%99%E3%82%8B%E8%A6%81%E7%B4%A0%E3%81%8B%E3%82%89%E3%81%AA%E3%82%8B%E9%9B%86%E5%90%88%EF%BC%88%E7%A9%8D%E9%9B%86%E5%90%88%EF%BC%89%E3%82%92%E5%BE%97%E3%82%8B)を参考にしました。

3つ目の条件について、P[i]>P[j]の判定はそのまま実装します。「j番目の製品はi番目の製品にない機能を1つ以上もつ」の部分について、これは「j番目のvectorがi番目のvector(あるいは積集合vec)のサイズより大きければいい」という解釈と等しいです。
すでに2番目の条件をクリアしている前提であるため、単純に各vectorの持つ整数の数を比較すれば適切な判定ができます。
【React】dialog要素でDialogコンポーネントを作成する

## 各ファイルの内容

```tsx:Dialog/index.tsx
import { RemoveScroll } from "react-remove-scroll";

export type Props = {
  dialogRef: React.RefObject<HTMLDialogElement>;
  isOpen: boolean;
  className?: string;
  onClose: () => void;
  onAnimationEnd?: () => void;
  children?: React.ReactNode;
};

export default function Dialog({
  dialogRef,
  isOpen,
  className,
  onClose,
  onAnimationEnd,
  children
}: Props) {
  return (
    <RemoveScroll enabled={isOpen}>
      <dialog
        ref={dialogRef}
        onClick={onClose}
        onAnimationEnd={onAnimationEnd}
        className={className}
      >
        <div onClick={(e) => e.stopPropagation()}>
          <div>{children}</div>
          <button onClick={onClose} autoFocus={true}>
            閉じる
          </button>
        </div>
      </dialog>
    </RemoveScroll>
  );
}
```

```ts:Dialog/useDialog.ts
import { useRef, useCallback } from "react";

export function useDialog() {
  const ref = useRef<HTMLDialogElement>(null);

  const showModal = useCallback(() => {
    if (ref.current) {
      ref.current.showModal();
    }
  }, []);

  const close = useCallback(() => {
    if (ref.current) {
      ref.current.close();
    }
  }, []);

  return { ref, showModal, close };
}

```

## CodeSandbox

https://codesandbox.io/embed/brave-shannon-2xrmtx?fontsize=14&hidenavigation=1&theme=dark&view=preview
"Javaポリモーフィズムの基本: オブジェクト指向プログラミングの鍵となる概念"

本記事は、javaのポリモーフィズムについて解説するページです。
私が初めてポリモーフィズムを調べた時に次のような説明がでてきました。

ポリモーフィズムとは、「多様性」や「多態性」とも訳される概念のことで、スーパークラスやインターフェイスをオーバーライドすることで異なる実装をするオブジェクト　指向言語の性質のことです。

んー、、？
どういうこと？
サンプルコードを見てみるとこんな感じでした。
下記のようなインターフェイスがあります。
```java:Sample.java
public interface Sample{
    void test(){}
}
```
そして、それをオーバーライドした下記のような実装があります。
```java:Test.java
public class Test implements sample{
    void test(){
        System.out.println("ポリモーフィズム");
    }
}
```
こんな感じの説明でした。ここまでのところで大枠は見えてきました。
実装のないクラスがあって、そのクラスにオーバーライドして機能を追加していく。
こんなイメージです。
ただ、ここで一つ疑問が生じます。
そう、なんのメリットがあるのか？ということです。

私が納得したのは業務で次のようなコードにあった瞬間でした。
そのコードは特定の処理がきちんと行われているのか監視している処理でした。
監視したい処理は複数あり、全て基礎となるクラスを継承していました。
それにより、それらの処理はまとまりがあり、保守性の高いコードとなっていました。
そして、そこに追加処理をつけ加えていくのですが、全ての基礎となる処理を継承さえすればあとはその監視したい処理独自の挙動に合わせてシステムを実装していくだけで簡単に実装できました。
その時はたとこれがポリモーフィズムのメリットなのだと気付かされました。

つまり、ポリモーフィズムを行う理由、それは一度共通部分を作ってしまうことで、それさえ継承させてしまえば何度も型を決めて処理を作る必要はないということだったのです。例えるならば、一つのコップをい作ることで、水を飲みたいときには水を注ぐことで水が飲め、ジュースが飲みたいときには、注ぐことでジュースが飲め、ビールが飲みたい時には、ビールを注ぐことができるということなのです。一回、一回、水用のコップ、ジュース用のコップ、ビール用のコップを作る必要はない。そういうことだったのです。
Iteratorインタフェース

## Iteratorインタフェース
Iteratorインタフェースは、Javaのコレクションフレームワークにおいて、コレクション内の要素に順番にアクセスするためのメソッドを提供するインタフェースです。
コレクションの要素に対して安全な反復処理: Iteratorはコレクション内の要素に対して安全な反復処理を行うことができます。Iteratorを使用することで、コレクション内の要素を逐一アクセスすることができます。これにより、コレクション内の要素に対して一貫した方法で反復処理を行うことができます。

### 主なメソッド
| メソッド| 意味 |
| --- | --- |
| hasNext |次の要素が存在するか判定する。あればtrue、なければfalse
| next | 次の要素を取得する |
|remove|現在の要素を削除する|

```java
public class hasNext {
    public static void main(String[] args) {
        ArrayList<String> animal = new ArrayList<String>();
        animal.add("猫");
        animal.add("犬");
        animal.add("象");
        animal.add("虎");
        Iterator<String> it = animal.iterator(); //iteratorを取得

        while (it.hasNext()) {
            String e = it.next();
            System.out.println(e); //猫,犬,象,虎
        }
    }

}
```
【SwiftUI】onChangeで2つの値を監視する

# はじめに
昨日に引き続き`onChange`に関する内容です。

# 実装
```swift
import SwiftUI

struct ContentView: View {
    @State private var text1 = ""
    @State private var text2 = ""
    var body: some View {
        VStack(spacing: 10) {
            TextField("", text: $text1, axis: .horizontal)
            
            TextField("", text: $text2, axis: .horizontal)
        }
        .onChange(of: [text1, text2]) { newValue in
            print("text1:", newValue[0])
            print("text2:", newValue[1])
        }
    }
}
```

# おわり
Combineの`combineLatest`を使わずとも複数の値を監視できるなんて、、、

# 参考記事
https://blog.code-candy.com/swiftui_onchange/#3
Rustのクロージャーtraitはこうやって理解しろ

Rustは非常に厳密かつ表現力が高いtraitというシステムを持っています。この中で特に初学者泣かせの項目が以下の3つのクロージャーtraitではないでしょうか？

- `FnOnce`
- `FnMut`
- `Fn`

クロージャーを受け取る関数を作る際にどれを利用すればいいのかわからないし、自分が作ったクロージャーがどれになるのかも最初はよくわかりません。詳細な説明等は公式docや例えば以下の記事

https://qiita.com/hiratasa/items/c1735dc4c7c78b0b55e9

などに書かれていますが、要は次のように理解すればいいです。

1. クロージャーを作る際には内部的にはキャプチャした変数を無名構造体としてまとめている
1. この構造体について一つだけメソッドが作られ、それのシグニチャを考えることでどのタイプのクロージャーになるかが決まる。
    1. `call(self)` -> selfがmoveされるため一度しかこのメソッドは利用できないので`FnOnce`
    1. `call(&mut self)` -> 複数回利用できるが、利用するたびに内部状態が変化するので`FnMut`
    1. `call(&self)` -> 複数回利用でき、内部状態も変化しないので`Fn`

これだけです。
【Tang Nano 9K】Windows 環境で Tang Nano 9K が openFPGALoader から認識できない問題とその解決

# 背景

秋月電商で Tang Nano 9K を購入したら付いてきた 「2500円ボードで始める FPGA開発」に従い、Lチカ bitstream を作成し openFPGALoader で書き込みしようとしたところ、以下のエラーが表示された。ボードを認識できていなさそう。

```
.\openFPGALoader.exe --detect
unable to open ftdi device: -4 (usb_open() failed)
JTAG init failed with: unable to open ftdi device
```

# 原因

Gowin FPGA Designer を install する際に FTDI のドライバも install するかどうか出るが、それを install した場合、openFPGALoader では認識できなくなる（？）のが原因ぽい。

# 解決方法

Windows 端末に USB 接続されているデバイスのドライバを WinUSB 等に変更してアクセスするのを助けるツール、[Zadig](https://zadig.akeo.ie/) を用いて、以下の手順でドライバを変更する。

1. [Options]>[List All Devices] にチェックを入れ、USB 接続されているデバイス全てを表示する
2. JTAG Debugger (Inteface 0)を選ぶ
3. （現在のドライバがFTDIになっているのを確認）
4. [Target Driver] を [WinUSB] に設定し、[Replace Driver]でドライバを変更
5. JTAG Debugger (Inteface 1)でも同様手順

```
.\openFPGALoader.exe --detect
Jtag frequency : requested 6.00MHz   -> real 6.00MHz
index 0:
        idcode 0x100481b
        manufacturer Gowin
        family GW1N
        model  GW1N(R)-9C
        irlength 8
```

# 所感

Xilinx ツールのありがたみが分かった......

Zadig の使い方すら分かっていなかったので、Port Zero さんの Tweet にマジで助けられました。感謝🙏

### 参考

- [Zadigによるドライバ入れ替え](https://scrapbox.io/uchan/Zadig%E3%81%AB%E3%82%88%E3%82%8B%E3%83%89%E3%83%A9%E3%82%A4%E3%83%90%E5%85%A5%E3%82%8C%E6%9B%BF%E3%81%88)
- [Port Zero さんの Tweet](https://twitter.com/peca_port0/status/1613416174850801664?s=20)
共同開発中　git　プルリクエスト

### :shamrock: プルを行う
:snowflake:プルとは、リモートリポジトリから最新の変更を取得してローカルのリポジトリに反映させることを指します。

:star: 自分が **bevelop** にいることを確認する
（＊がついているところが現在のブランチ）
```
 $ git branch
* develop
  main
```
:star:**develop**でなければ以下のコマンドで移動
```
 $ git checkout develop
```
:star:developブランチを最新の状態にする
```
$ git pull origin develop
```
:star: 念のため確認する
```
$ git status
On branch develop
nothing to commit, working tree clean
```
developブランチはコミットするものが無く、綺麗な状態だよと表示されました。

### :shamrock: 作業ブランチ作成
作業していくブランチを作成します。
今回はdevaiseブランチを作成します
```
$ git checkout -b devaise
```
::: note
ここで作業開始前までの行程は終了です。
ファイルの編集などを行います。
:::
### :shamrock: プルリクエストを行う
:star: 変更分をコミットする
(今回は全部のファイルを選択）
```
$ git add .
$ git commit -m"devaise 追加"
```
:star: プッシュを行う
```
$ git push origin devaise
```
:point_up:**ここまででプルリクエストができました。**

### :shamrock: Gitでのプルリクエスト作成
:star:``Pull requests``タブをクリックします。

:star:右側にある``New pull request``ボタンをクリックします。

:star:今回、「base:のところは「branch」にして、「compare:」のところで「devaise」ブランチを選択します。
(devaiseブランチからbranchにプルリクエストを送る）

:star:``Create pull request``ボタンを押します。

:star:タイトルとコメントを入力します。
書いたら``Create pull request``ボタンを押します。

:cherry_blossom:これでプルリクエストが作られました。

コードレビューを依頼する時は右側にある``Reviewers``を選択します。
(チームで開発する時にはここに、この人にお願いしますというのを選ぶ事ができます。)

:herb:**自分のブランチにdevelopの変更を取り込む**
```
$ git checkout develop    #  developブランチに移動する
$ git pull origin develop  # リモートの統合ブランチの最新版をプル、動作確認
$ git checkout 自分の作業ブランチ  # 自分の作業ブランチに移動する
$ git merge origin/develop # 動作が問題なければ、自分のブランチにも反映 
```

**参考**

https://phoeducation.work/entry/20210913/1631487480

https://phoeducation.work/entry/20210906/1630882680
slide share広告回避

以下でjsを実行
https://chrome.google.com/webstore/detail/scriptautorunner/gpgjofmpmjjopcogjgdldidobhmjmdbm?hl=ja

- page inclement
URL: image.slidesharecdn.com
```

document.onkeydown = function(e) {
    const remove_regex = /\?cb=[0-9]+/i;
    const url = location.href.replace(remove_regex, '');
    
    const regex = /(.+-)([0-9]+)(-[0-9]+\.jpg)$/i;
    const page_num = Number(url.replace(regex, '$2'));
    const pre_url = url.replace(regex, '$1');
    const suf_url = url.replace(regex, '$3');

    switch (e.keyCode) {
        case 37:
            if(page_num > 1) {
                const next_page_num = page_num - 1;
                window.location.href = pre_url + next_page_num + suf_url;
            }

            break;
        case 39:
            const next_page_num = page_num + 1;
            window.location.href = pre_url + next_page_num + suf_url;
            break;

    }


};



```

- page を開く
URL: slideshare.net
```
document.onkeydown = function(e) {
    const txt = document.documentElement.innerHTML;
    const regex = /https:\/\/image\.slidesharecdn\.com\/[^ ]+\/[^ ]*[0-9]*-1-[456789][0-9]+\.jpg\?cb=[0-9]+/i;
    const url = txt.match(regex);
    switch (e.keyCode) {
        case 13:
            if(url.length > 0)
            {
                window.open(url[0], '_blank');
            }
        
            break;
    }
};
```
コナーセンス(Connascence) コードの結合度を測る指標

## コナーセンス(Connascence) とは
コナーセンスとはコードの変更容易性に着目した結合度の測り方です
Meilir Page-Jones により提唱され、1995年に著書「What Every Programmer Should Know About Object-Oriented Design」で紹介されました
コナーセンスにはコードの結合性を評価する3つの尺度があり、強度、程度、局所性で表されます
3つの尺度について順に見ていきます
## コナーセンスの強度
コナーセンスにはいくつかのタイプがあります
強いコナーセンスは修正が難しかったり、コナーセンスの発見が難しかったりして、変更コストが高いものをいいます
以下にコナーセンスの弱い順からコナーセンスのタイプを並べてみます
順序は厳密なものではなく、目安となります
### 名前のコナーセンス
変数名やメソッド名などの名前による参照のことです
例としてメソッドを呼び出すコードがある時、メソッド名を変更した場合は、合わせて呼び出し元のコードを全て修正する必要があります
### 型のコナーセンス
型による結合のことです
静的な型を持つ変数を宣言して、代入操作を行うコードがあるとき、変数の型を変えると、代入部も変更する必要があります
### 意味のコナーセンス
特定なプリミティブの値に意味を持たせており、複数のコンポーネントで意味を共有している状態です
いわゆるマジックナンバーです
マジックナンバーの値を変えるのは変数名を変えるよりも変更コストが高いです
### 位置のコナーセンス
引数の位置を共有している状態です
メソッドを呼び出すときに、何番目にどう言った意味の情報が入っているかを知っている必要がある状態です
### アルゴリズムのコナーセンス
他のコンポーネントがどういうアルゴリズムを用いているか知っている必要がある状態です
エンコード、デコードのプログラムがある時、デコード側のプログラムがエンコード側のプログラムのアルゴリズムを知っている必要があるような状態を指します
### 実行順序のコナーセンス
他のコンポーネントの実行順序を知っている必要がある状態です
例えば createメソッドと save メソッドがあるときに、createメソッドを実行してからでないと save メソッドが実行できないというような場合を指し、順序関係に暗黙な依存があるという状態です
### タイミングのコナーセンス
他のコンポーネントの実行タイミングを知っている必要がある状態です
create メソッドと saveメソッドがあるときに、save メソッドは create メソッドを呼び出してから少なくとも10秒後以降でないと呼び出せないというような状態をさします
### 値のコナーセンス
### アイデンティティのコナーセンス

## コナーセンスの程度
関連するコンポーネントの数です
あるクラスを使用するクラスが10クラスの場合と、100クラスの場合とでは、100クラスの方がコナーセンスの程度が大きくなります

## コナーセンスの局所性
コナーセンスのある2つのコンポーネントが近い場所にあるか遠い場所にあるかということです
コナーセンスのある2つのコードが同じクラス内にある場合に比べ、別のクラス、別のプロジェクト内にある場合は、遠い場所にあるため、コナーセンスの局所性は大きくなります

## コナーセンスをプログラムにどう活用できるか?
コナーセンスの3つの軸の定義から、コナーセンスの強度が低い、程度が低い、局所性が小さいコードを目指せばいいことになります

### コナーセンスの強度を低くする
#### 意味のコナーセンス
マジックナンバーを避けるために、列挙型を定義してマジックナンバーを使用する複数のコードから参照することで、コナーセンスの強度を低くすることができます
#### 位置のコナーセンス
引数や配列の順番に特定の意味がある場合には、引数や配列の中身を構造体で定義して、プロパティを参照することにより、順序を知っている必要がなくなります

### コナーセンスの局所性を小さくする
関連する処理を一箇所にまとめるなどの設計上の考慮をすることで局所性を小さくすることができます

以上、コナーセンスについて調べてまとめてみました
コナーセンスの概念を活用して、結合度が低く、変更容易性の高いプログラムを書き、プログラムの品質を上げていきたいです

## 参考文献
- Meilir Page-Jones. What Every Programmer Should Know About Object-Oriented Design. 1995.  Dorset House
- [fujiharuka. 結合度の尺度「コナーセンス」とは何か.](https://qiita.com/fujiharuka/items/68fadefa6dad4cf33b4d)
- [snoozer05. Connascence：コードの結合度を測るもうひとつの指標.](https://snoozer05.hatenablog.jp/entry/2020/12/11/150913)
- [morifuji. コナーセンス(Connascence)について調べてみた.](https://blog.morifuji-is.ninja/post/2022-05-02/)
Rubymineの2023.1.xでdebugできない問題の対応


## 背景
Rubymineのバージョンを2023.1.xに上げて、Rubymin上でデバッグを実行しようとすると、debug用gemが入っていないというエラーが繰り返し表示される。
指示に従いインストールしても何もおきない。
既にリリースされてから、数ヶ月経っていますが、日本語での情報があまりなかったので、書いてみました。

## 環境
macOS 13.4(intel, m1)
ubuntu 22.04LTS
docker

<font color="Red">
Gemfileにdebaseとruby-debug-ideが入っている
</font>


## 原因
Gemfileにdebaseとruby-debug-ideを記載していると起きる模様
直接的な原因は深く調べきれていないのでご容赦ください。

## 対応策

### その１
rubymineのバージョンを旧バージョンに戻す
元も子もないですが、以前のバージョンで動いていた方は、旧バージョンに戻したら問題ないです。

https://www.jetbrains.com/ja-jp/ruby/download/other.html

### その２
Gemfileからdebaseとruby-debug-ideを削除して、この2つのgemは直接rubymineに管理させる

* Gemfileからdebaseとruby-debug-ideを削除
* この状況で再度、rubymine上でデバッグを起動すると、同様のdebug用のgemがないと警告がでるので、インストールする
一応、私はこれで乗り切っています。



もし、他に対応方法があるようでしたらコメントしていただけるとこの記事に追記します。
よろしくお願いします。
100台超のEC2自動停止をAIに聞いて3分で実装してみた！

EC2の自動停止(メンテ不要Version)
---

以前の執筆記事でLambdaでのEC2の自動停止について
ご紹介しました。
[EC2の自動停止について](https://qiita.com/fukuchan_milk/items/64c924f8fa3fd4342ba8)

上記は超入門編で、AWSを初めて利用する方でも
行えるように記載しました。

さて、前回のコードでは課題にも記載した通りEC2の数が増減した場合にLambdaコードの修正が必要となってしまうため管理が煩雑になっています。

今回はメンテナンスフリー(EC2が増減してもLambdaの修正が不要！)な
コードでEC2の自動停止を実現します。

今回もAIに質問しながらコードを実装しました。


Q1）東京リージョンで稼働するすべてのEC2を日本時間の午前1時に停止したいです。LambdaでPythonコードを書くとどうなりますか
---

A1）EC2インスタンスを停止するPythonコードをLambdaで実行することができます。以下のコードは、東京リージョンで稼働するすべてのEC2インスタンスを日本時間の午前1時に停止します。
```Python
import boto3
import datetime

def lambda_handler(event, context):
    ec2 = boto3.resource('ec2', region_name='ap-northeast-1')
    instances = ec2.instances.filter(
        Filters=[{'Name': 'instance-state-name', 'Values': ['running']}])
    for instance in instances:
        instance.stop()
    print('stopped instances: ' + str([instance.id for instance in instances]))
```

上記を素直にLambdaに実装してDeployしてテストします。

すると、あらら、停止したEC2のインスタンスIDが最後の1つ分しかログに出力されないではないですか！？

:::note info
Response
null

Function Logs
START RequestId: a53c70fb-3bdf-435e-84fa-cbfe7d9d8dfd Version: $LATEST
stopped instances: ['i-xxxxxxxxxxxxxxxxx']
END RequestId: a53c70fb-3bdf-435e-84fa-cbfe7d9d8dfd
REPORT RequestId: a53c70fb-3bdf-435e-84fa-cbfe7d9d8dfd	Duration: 4062.28 ms	Billed Duration: 4063 ms	Memory Size: 128 MB	Max Memory Used: 84 MB	Init Duration: 256.80 ms
:::


これでは、どのEC2を停止したのかログから追えませんので
AIに文句(笑)を言ってみました。

Q2）ありがとう。教えてくれたコードだと最後に停止処理を行ったインスタンスIDしかログに表示されないみたいだけど、停止処理を行ったすべてのインスタンスIDをログに出力するには、コードをどのように修正すればいいですか
---

A2）ログにすべての停止したインスタンスIDを表示するには、以下のようにコードを修正できます。

```Python
import boto3
import datetime

def lambda_handler(event, context):
    ec2 = boto3.resource('ec2', region_name='ap-northeast-1')
    instances = ec2.instances.filter(
        Filters=[{'Name': 'instance-state-name', 'Values': ['running']}])
    stopped_instances = []
    for instance in instances:
        instance.stop()
        stopped_instances.append(instance.id)
    print('stopped instances: ' + str(stopped_instances))
```

素直にコードをコピペしてDeployとテストを行います。
するとどうでしょう！？

いとも簡単にやりたいことが実現できました。

:::note info
Function Logs
START RequestId: a53c70fb-3bdf-435e-84fa-cbfe7d9d8dfd Version: $LATEST
stopped instances: ['i-xxxxxxxxxxxxxxxxx', 'i-xxxxxxxxxxxxxxxxx', 'i-xxxxxxxxxxxxxxxxx, 'i-xxxxxxxxxxxxxxxxx, 'i-xxxxxxxxxxxxxxxxx, 'i-xxxxxxxxxxxxxxxxx, 'i-xxxxxxxxxxxxxxxxx, 'i-xxxxxxxxxxxxxxxxx, 'i-xxxxxxxxxxxxxxxxx, 'i-xxxxxxxxxxxxxxxxx]
END RequestId: a53c70fb-3bdf-435e-84fa-cbfe7d9d8dfd
REPORT RequestId: a53c70fb-3bdf-435e-84fa-cbfe7d9d8dfd	Duration: 4062.28 ms	Billed Duration: 4063 ms	Memory Size: 128 MB	Max Memory Used: 84 MB	Init Duration: 256.80 ms
:::

ここまでの所要時間は3分です！

まとめ
---
今回学んだことは、コードの書き方を覚えるよりも

- いかにAIに正確な情報を与えられるか？
- テストした結果をAIにフィードバックして欲しい情報を導き出せるか

という点が重要になってくると筆者は確信しました！

皆さんはどのようなご意見でしょうか？
コメントやいいねをいただけると励みになりますのでお願いいたします。
[VSCode] rust-analyzerの有効化

**vscode*1上で時折、rust-analyzerが動かなくなる現象への対策**

- Code - Insiders > User > setting.json に、次の記述を追加すれば良い。
- "sysroot_src"には、自分の環境を参照し、適切なパスを記述すること。

```json:setting.json
    "rust-analyzer.linkedProjects": [
        {
            "sysroot_src": "/home/YourUserName/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library",
            "crates": [
              {
                "root_module": "src/main.rs",
                "edition": "2021",
                "deps": []
              }
            ]
        }  
    ]
```

*1: 正確にはvscode-insidersを使用している。
Salesforce Connectクロス組織を利用する時の制限事項のまとめ

Salesforce Connect を使用すると、ユーザは Salesforce 組織外に保存されているデータを表示、検索、変更できます。その中にSalesforce Connectクロス組織を使用すると、他Salesforceのデータを表示、検索、変更できます。
本文はSalesforce Connectクロス組織を利用する場合、各制限事項と注意すべきな事項をまとめます。
<b>前提事項：</b>
　①外部オブジェクトを利用する前提で制限事項、標準オブジェクトとカスタムオブジェクトの場合、該当制限がありません。
　②Salesforce Connectクロス組織のアダプタはOData 2.0なので、以下の一部の制限はOData 2.0限定の制限です。OData 4.0で制限該当しない場合、明記にしておきますので、ご注意ください。

#### ◆外部オブジェクトの設定関連の制限
<b>レイアウトに配置できる外部参照項目は最大５個</b>
　画面レイアウトに配置できる外部参照項目は最大５個、５個超えると、画面表示エラーになります。

<b>モバイル専用なレイアウト作成できない</b>
　外部オブジェクトのレコードページに「レコード詳細 - モバイル」がないため、モバイル専用なレイアウトを作成することができません。

<b>数式項目が作成できない</b>
外部オブジェクトに数式項目が作成できません。
※数式項目を作成したい場合、参照元Salesforce側で作成してください。

<b>レコードタイプの概念がない</b>
　外部オブジェクトにレコードタイプの概念がありません。レコードタイプ毎に異なるレイアウトで表示することはできません。
つまり、参照元Salesforceに１オブジェクトが複数のレコードタイプがあり、複数のページレイアウトがあっても、参照先の外部オブジェクトに１プロファイル毎に１ページレイアウトになります。

<b>多態的な項目サポートしない</b>
　Salesforceの標準オブジェクトに多態的な項目が存在しています。例えば、Eventオブジェクトの関連先項目のように、複数のオブジェクトに関連する参照項目があります。外部オブジェクトに多態的な項目はないため、例えば関連先項目が外部オブジェクトにする場合、データ型は取引先外部参照項目の多態の１つに固定になります。

<b>外部オブジェクトのデータ変更追跡できない</b>
　Salesforce Connect: クロス組織のアダプタはOData 2.0なので、外部変更データキャプチャが利用できないため、外部オブジェクトのデータ変更を追跡することができない
　※OData 4.0の場合、外部変更データキャプチャが利用できますが、Salesforce Connectクロス組織のアダプタはOData 2.0のみになります。

#### ◆外部オブジェクトのレポート関連の制限
<b>クロース条件サポートしない</b>
　外部オブジェクトはレポートのクロース条件として使えません。

<b>主＝外部オブジェクトの場合、取得件数制限２０,０００件</b>
　レポートの主オブジェクトが外部オブジェクトの場合、主オブジェクトのレコードが20,000件まで取得できますが、超える場合、レポートに何も返さなく、0件になります。

<b>外部参照項目の親項目をレポートに表示できない</b>
　通常の場合、カスタムレポートタイプ上で通常の参照関係項目から親の項目を追加して、レポートに表示することができますが、外部参照関係項目から親の項目を追加してレポートに表示する場合、エラーが発生します。
※Salesforceのバグかと思いますが、Salesforceに問合せすると、現状修正予定がありませんと言われました。
※この場合、親の外部オブジェクトを主オブジェクトとしてカスタムレポートタイプを作成して対応するしかないと思います。

#### ◆外部オブジェクトの開発関連の制限
<b>サブクエリ取得できる最大件数1,000件</b>
　外部オブジェクトが含まれるSOQLサブクエリを実行する場合、取得できるデータは、最大1,000行です。

<b>サブクエリ取得できる最大件数1,000件</b>
　外部オブジェクトが含まれるSOQLサブクエリを実行する場合、取得できるデータは、最大1,000行です。

<b>ORDER BY句をサポートしない</b>
　外部オブジェクトは、リレーションクエリの ORDER BY句をサポートしません。
※OData 2.0のみの制限です。

<b>SOQLクエリ内の結合オブジェクト数は最大４個</b>
　各 SOQL クエリ内の結合は、外部オブジェクトとその他の種別のオブジェクト全体で最大 4 個です。

<b>SOQL集計関数サポートしない</b>
　外部オブジェクトでは、ほとんどの集計関数と句をサポートしていません。
ただし、COUNT()のみサポートします。【COUNT(fieldName)関数がサポートしません】

<b>Database.getQueryLocator()利用できない</b>
　Database.getQueryLocator()に外部オブジェクトが含まれるSOQLがサポートしません。
　※OData 4.0の場合、サーバ駆動のページ設定、要求の行数をONにしていれば、利用可能です。

#### ◆まとめ
Salesforce connectを利用して、他Salesforceのデータを簡単にアクセスできますが、割りに色々な制限があります。上記に記載している内容は基本的Salesforceのヘルプドキュメントにあっちこっちに記載してありますが、今まで経験した内容をまとめて本文にまとめました。
SF Symbolsを使う時の注意点🚨

# はじめに
SF Symbolsを使う時の注意点を和訳とともににまとめました。

# 注意事項
## 原文
:::note warn
Be sure to understand the terms and conditions for using SF Symbols, including the prohibition against using symbols — or images that are confusingly similar — in app icons, logos, or any other trademarked use.
:::

## 和訳（Google翻訳を使用）
:::note warn
アプリのアイコン、ロゴ、またはその他の商標での使用におけるシンボルまたは紛らわしい類似の画像の使用の禁止を含む、SF シンボルの使用に関する利用規約を必ず理解してください。
:::

# 出典
https://developer.apple.com/design/human-interface-guidelines/sf-symbols

# おまけ
私がアプリのアイコンを作るときは、SF Symbolsを使いたい気持ちをぐっとこらえて、Keynoteの基本図形を組み合わせてアイコンを作成しています。
【ShellScript】ファイル名をリネームする


# はじめに
こんにちは！
今回はShellScriptでちょっとしたツールを作成したので、コピペで使えるコードについて書いていきたいと思います（ほんの一部修正する必要はありますが。。）。

# 作成したツール
作成したツールとしては、特定の文字列を削除してリネームするプログラムです。
例としては test_picture_1.png というファイルがあったとして test_ を削除したいなという時にプログラムを実行すると picture_1.png　にリネームしてくれるというツールになります。
使い方としてはshを実行して対象のファイル名をターミナルに入力するだけ（下記で言うと「対象ファイル」の部分を入力する必要がある）であとは特に何もしないでリネームしてくれます。ただshファイルを置く場所には注意してください！

```text: 実行結果
# Before　（実行前）
dir 
　┗　対象ファイル
　　　　　　　　　　　　┗　test
         ┗ test_picture_1.png
         ┗ test_picture_2.png
         ┗ test_picture_3.png
         ┗ test_picture_4.png
         ┗ test_picture_5.txt

　┗　test.sh(今回作成ファイル)

# After（実行後）
dir 
　┗　対象ファイル
　　　　　　　　　　　　┗　test
         ┗ picture_1.png
         ┗ picture_2.png
         ┗ picture_3.png
         ┗ picture_4.png
         ┗ test_picture_5.txt

　┗　test.sh(今回作成ファイル)
```
# 実際のコード
ということで以下がコードになります。
コメント部分に記載していますが、一部修正していただく必要があります。

```sh: shellScript
# プロンプトをechoを使って表示
echo フォルダ名を入力してください！！
# 入力を受付、その入力を「dir_name」に代入
read dir_name 
# 結果を表示
echo file name : $dir_name

# ファイルパスの取得
# testを入力していますが左記の場所を修正する必要がある path="./$dir_name/ここを修正する/*"
path="./$dir_name/test/*"
echo $path
# 今回はpngを指定していますが対象ファイルに合わせて修正してください .txt とか 
files=`find $path -maxdepth 0 -type f -name *.png`
echo start rename
for file in $files;
do
    # ファイル名のみに変換する
    before_pngfile="${file##*/}"
    echo before file name : $file
    # rename後のパスに変換する
    # 削除したい文字列の変更をしてください左記部分　after_pngfile=./$dir_name/test/${before_pngfile/ここの部分を削除したい文字列にする必要があります/""}
    after_pngfile=./$dir_name/test/${before_pngfile/test_/""}
    echo after file name : $after_pngfile
    # ファイル名を置換する
    mv ${file} ${after_pngfile}
done
echo file rename success!
```

# 最後に
これを元々作成した理由としてがファイル名を部分削除する必要がある作業がありすごーーくめんどくさくて時間をかけたくなかったために作成しました。ただ個人的に使っているだけのため若干手抜き感はあるかもしれないですが、まぁそう思ったら自分なりの改良をしてみるのもいいのかなと思います。
最後までご覧いただきありがとうございました！
勤怠自動

```var editTitle = "勤務データ編集"
var titleClassName = "htBlock-pageTitle"

var stillRecordId = "recording_type_code"
var recordedIdPrefix = stillRecordId + "_"
var timeIdPrefix = "recording_timestamp_time_"


var titleEls = document.getElementsByClassName(titleClassName);

var submitButtonId = "button_01"


var genRand10 =()=> Math.floor( 11 * Math.random() );
var rand0 = genRand10()
var rand1 = rand0 + genRand10()
var timeList = [0,1000 + rand0,1900+ rand1,1200,1300]


if(titleEls.length > 0 && titleEls[0].textContent.trim() == editTitle)
{
    var stillRecordCount = 0
    var stillRecordCount  = document.querySelectorAll("*[id='" + stillRecordId + "']").length
    var notRecordedCount = 4 - stillRecordCount
    for (let i = 1; i <= notRecordedCount; i++) {
        var select = document.getElementById(recordedIdPrefix + i)
        select.value = i + 4 - notRecordedCount
    }

    for (let i = 1; i <= notRecordedCount; i++) {

        var select = document.getElementById(timeIdPrefix  + i)
        var time = timeList[i + 4 - notRecordedCount].toString()
        select.value = time.substr( 0, 2 ) + ":" + time.substr( 2, 2 )
        select.click();
        select.focus();
        select.blur()
    }

    if (notRecordedCount > 0)
    {
        var button = document.getElementById(submitButtonId)
        button.click()
    }

}
```
PS4でシェアプレイ出来ない場合の対処法（エラーコード　NP-37666 8）

## 原因
シェアプレイをするときに、プレイを見る側が[**純正コントローラー**](https://www.bing.com/search?form=SKPBOT&q=%E7%B4%94%E6%AD%A3%E3%82%B3%E3%83%B3%E3%83%88%E3%83%AD%E3%83%BC%E3%83%A9%E3%83%BC)ではないと、接続ができないことがあります。

例　アーケードコントローラーやゲーム専用のコントローラーなど。

## 対処法
純正コントローラー以外を使ってシェアプレイを見に行く場合は、[**純正コントローラーに切り替える**]必要があります。

•  シェアプレイを見る側のPS4のホーム画面で、**設定**を選択します。

•  [**デバイス**]を選択します。

•  [**Bluetoothデバイス**]を選択します。

•  純正コントローラー以外のデバイスを選択して、[**オプションボタン**]を押します。

•  [**デバイスから切断する**]を選択します。

•  純正コントローラーでPSボタンを押して、コントローラーを使用するアカウントを選択し、シェアプレイに再接続します。
Xamarinのスプラッシュ画面

いまさらだけど、Visual Studio 2019 For MacでXamarin.FormsのXamarin.iOS側のスプラッシュ画面の設定が全然うまくいかなかった時の対処覚書

以下のサイト等でスプラッシュ画面はXcodeのストーリーボードを使ってやるってことが書いてあったけど、同じようにやってみたが、全然スプラッシュ画面表示されず。
https://learn.microsoft.com/ja-jp/xamarin/ios/app-fundamentals/images-icons/launch-screens?tabs=macos

ちょっと参考になったサンプル＆サイト
https://github.com/brminnick/DarkModeSplashScreen

https://codetraveler.io/2019/10/11/creating-a-dark-mode-splash-screen/

＜結論＞
1.Visual Studio がプロジェクト作成時に自動で用意してくれるLaunchScreen.storyboardのビルドアクションを「BundleResource」から「InterfaceDefinition」に変更する必要がある（ソリューションエクスプローラでLaunchScreen.storyboardを選択、右クリック→ビルドアクションで変更）

ただし、「InterfaceDefinition」に変更すると、VisualStudioからXcodeのストーリーボード編集画面が起動しないので、いちいち切り替えが必要。

2.Assets.xcassetsにイメージセットを追加することで、Xcodeのストーリーボード編集画面でImageViewに設定する画像リソースとして利用できる

以上

VisualStudioをバージョンアップしたらこんな問題解消するんだろうな。
DAY15-19 入院中にできたこと

# DAY15-19
230710-230714
プログラミングに関して入院中にできたことはほぼないです:thermometer_face:
熱と痛みで思ったよりしんどかったり、検査とか処置とかでできることも限られてました。
無理に今勉強するより回復を優先したほうがよさそう…と思い休んでました。ほぼずっと点滴もされてたしね。
スマホは使えたので、ちょっとだけ情報収集とかはしてました。
CSSを完全に理解したミームを見てました。
CSSを完全に理解したトロフィーをまだ完全に理解してないので、あのトロフィーを完全に理解できるようになるといいな。
まだ痛みと腫れはあるので、ぼちぼちやっていきます。

今までのプログラミング勉強日記を見直したりしたんですが、思っていたよりたくさんの方に見ていただけているようでうれしいです。:relaxed:
モチベーション上がりますね　ありがとうございます！
JuliaのOOP事情の備忘録

- Juliaは本来的にobject-orientedではない([資料1](https://discourse.julialang.org/t/classes-in-julia/24521))
- object-orientedなコーディングをしたいときに使えるJulia特有のツール・概念がある
 - Juliaは[multiple dispatch](https://en.wikipedia.org/wiki/Multiple_dispatch)(wikipedia)というパラダイムに属する言語である([資料1](https://discourse.julialang.org/t/classes-in-julia/24521),[資料2](https://docs.julialang.org/en/v1/manual/noteworthy-differences/))
 - mutable struct という構文を使うと、一般的なOOP言語のクラスや構造体と似たような振る舞いを出来る。中に定義されるものは全てdataであり、関数も登録できるが、メソッドという概念は無いらしい。
 - 単に連想配列を使いたいだけなら、「名前付きタプル」を使えば`x = (name="Tom",age=21,job="engineer"); x.name #->Tom`のように出来る。
- 典型的なOOP言語と似たような書き方をする方法もあるにはあり、色々な人が個別に研究している([資料3](https://dev.to/acmion/julia-object-oriented-programming-5dgh), [資料4](https://discourse.julialang.org/t/is-julias-way-of-oop-superior-to-c-python-why-julia-doesnt-use-class-based-oop/52058))
CSVファイルを開いてグラフ表示するGUIアプリを作ってみた！

PythonとTKinterを使い、CSVファイルをグラフ表示するGUIアプリを作ってみました。ファイルはダイアログで選択できるように作っています。

## アプリの機能

INPUTボタンを押すことで、CSVファイルを選択できます。

選択したCSVファイルをグラフで表示します。

画面下のボタンを押すことで、表示されたグラフの画像を保存できます。


## 用意するもの

サンプルとなるCSVファイルを作成し、ホームディレクトリに保存します。

```csv:sample.csv
名前,身長,体重
山田,170.2,56
吉川,158.7,89
佐藤,168.9,46
```

pandasをインストールしておきます。

```
pip install pandas
```




## アプリのコード

以下のコードを実行することで、INPUTボタンが表示され、CSVファイルを選択できるようになります。グラフは画像として、アプリとは別に表示されます。画像の画面を閉じることで、何度でもCSVファイルを選択し、グラフを表示できます。

※フォントはLinux Ubuntuで使われる「Noto Sans CJK JP」を指定してありますが、別のフォントに変更できます。

```python:csv-graph.py
# coding: utf-8

import os

# tkinterのインポート
import tkinter as tk

# CSVファイルのインポート
import csv

import tkinter.filedialog

import pandas as pd
import matplotlib.pyplot as plt

import seaborn as sns
sns.set(font=["Noto Sans CJK JP"])

# 関数の定義

def dialog():

    # ファイル選択ダイアログの表示
    file_path = tkinter.filedialog.askopenfilename()

    if len(file_path) != 0:
        # ファイルが選択された場合

        df = pd.read_csv(file_path)
        #print(df)
        df.plot.barh()
        plt.show()
    

### GUI ###
# ウインドウの作成
root = tk.Tk()
# ウインドウのサイズ指定
root.geometry("300x120")

# ボタン作成
run_button = tk.Button(root, text = "INPUT", command = dialog)

# ボタンの位置を指定
run_button.place(x = 110, y = 60)

# ウインドウ状態の維持
root.mainloop()

```


## グラフの種類を変える

今回作成したアプリでは、「横棒グラフ」（水平棒グラフ）で表示するように設定してありますが、グラフの種類はもちろん、変更可能です。変更方法は以下の通り。


### グラフを表示する・折れ線グラフにする

```
df.plot()
```

※何も設定しないと折れ線グラフになります。


### 横棒グラフにする
```
df.plot.barh()
```

### 縦棒グラフにする

```
df.plot.bar()
``` 


### 円グラフにする

```
pie.plot()
```

## その他のカスタマイズ

そのほか、グラフのタイトル、ラベル、フォント、フォントのサイズ、縦軸の範囲、カラーなどを変更できます。詳しくは以下のサイトを参考にしてください。

Python データ分析 グラフ http://www.dicre.com/python/graph.html

データフレームからのグラフ作成｜キータ@python/データ分析の修行 https://note.com/super_yes_man/n/nf2b61bc57f59

なお、今回CSVファイルをグラフ化するにあたって、**pandas** (matplotlib)を利用しています。より詳しくカスタマイズしたい人はpandasを検索して調べてみてください。

## データベース SQliteからグラフ表示する

データベース SQliteを利用してグラフを表示させることもできます。PythonとTKinterで作ったコードをそのまま利用します。

### 用意するもの

データベースのファイル

例：TEST.db

データベースのテーブル

例:persons (TEST.dbに作ったテーブルのデータ)

### アプリの機能

DATAボタンを押すと、指定したデータベースのテーブル データをグラフで表示します。

### アプリのコード

```python:data.py
# coding: utf-8

import sqlite3

import os

# tkinterのインポート
import tkinter as tk

# CSVファイルのインポート
import csv

import tkinter.filedialog

import pandas as pd
import matplotlib.pyplot as plt

import seaborn as sns
sns.set(font=["Noto Sans CJK JP"])

# データベースの情報
dbname = "TEST.db"
conn = sqlite3.connect(dbname)
cur = conn.cursor()

# 関数の定義
def database():
    df = pd.read_sql('SELECT * FROM persons', conn)
    #print(df)
    df.plot.barh()
    plt.show()

### GUI ###
# ウインドウの作成
root = tk.Tk()
# ウインドウのサイズ指定
root.geometry("300x120")

# ボタン作成
run_button = tk.Button(root, text = "DATA", command = database)

# ボタンの位置を指定
run_button.place(x = 110, y = 60)

# ウインドウ状態の維持
root.mainloop()

```