OmniAICreator/Qiita-1.07M huggingface dataset:
AndroidでStatusBarとNavigationBarを透過させつつ全画面表示する

# はじめに
ActionBar消してStatusBarとNavigationBarを透過させて全画面表示する方法です。
完成形は以下の通り。

|透過させる前|透過させた後|
|---|---|
|<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/383380/03e46150-8b85-1451-ed56-b3cfd335d262.png" width=300>|<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/383380/ffc734c5-20c3-7c83-51db-a4627345cd6b.png" width=300>|

# 消していきます 
Barを消したいActivityに以下を記述

```kotlin:MainActivity.kt
class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        supportActionBar?.hide() // ActionBarを消す
        hideSystemBars()
        setContentView(R.layout.activity_main)
    }

    // StatusBarとNavigationBarの範囲まで表示できるようにする
    private fun hideSystemBars() {
        // Android11とそれ未満で処理を分ける
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
            window.setDecorFitsSystemWindows(false)
            window.isNavigationBarContrastEnforced = false
        } else {
            window.addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS)
        }
    }
}
```
さらに消したいActivityに適用しているthemeでStatusBarとNavigationBarを透過させます。

```xml:themes.xml
<resources xmlns:tools="http://schemas.android.com/tools">
    <!-- Base application theme. -->
    <style name="Theme.TransparentSystemBar" parent="Theme.MaterialComponents.DayNight.DarkActionBar">
        ...
        <!-- StatuBarとNavigationBarの色を透過させる -->
        <item name="android:statusBarColor">@android:color/transparent</item>
        <item name="android:navigationBarColor">@android:color/transparent</item>
    </style>
</resources>
```
以上です。
Remote Desktopで接続した先のWindows上でPower Automateを使った場合にGUI操作が失敗する問題を解決

長いタイトル・・・。
# この記事について
Remote Desktopで接続した先のWindowsでPower AutomateでGUI操作自動化を行う場合、**フローの実行中にRemote Desktopを切断するとGUI操作に失敗する**。これは、リモート環境のWindowsでフローを[定期実行している場合](https://scrapbox.io/tsuchinaga/Power_Automate_Desktop%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6kabu%E3%82%B9%E3%83%86%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%92%E8%87%AA%E5%8B%95%E3%81%A7%E5%86%8D%E8%B5%B7%E5%8B%95%E3%81%99%E3%82%8B)に特に問題となる。
この記事ではその問題を解決する方法を示す。

# 解決策
次のようなPowershellスクリプトを用意する。
```powershell:discon.ps1
$session = query session | select-string "Active"
$str = $session.ToString() -replace "  *"," "
$array = $str.Split(" ")
$session_id = $array[2]

tscon $session_id /dest:console
```
管理者権限でこのスクリプトを実行するとリモートデスクトップから切断されるが、切断されてもPower Automateは問題なくGUI操作を行うことができる。

# 使いやすくする
毎回管理者権限でスクリプトを実行するのも面倒。また、ショートカットを作成して管理者権限で起動するよう設定しても、毎回UACが警告してくる。そこでボタン1つで切断できるようにする。
- 管理者権限で`discon.ps1`を起動するバッチファイルを用意
```bat: discon_task.bat
@powershell -Command "Start-Process powershell.exe -ArgumentList "C:\Users\ryohei\tool\discon.ps1","-WindowStyle","Hidden" -Verb runas
```

- タスクスケジューラにdiscon_task.batを登録
タスク名は`discon`としておく。
全般 > セキュリティオプション > 最上位の特権で実行するにチェック。
操作 > プログラム/スクリプト に`discon_task.bat`を指定。

- タスクを呼び出すバッチファイルを用意
```bat: discon.bat
schtasks.exe /run /tn discon
```
これでUACの確認画面なしで切断できる。`discon.bat`のショートカットを作成し、好きなアイコンを設定してタスクバーにピン留めしておくとよい。

# 参考文献
[AutoMate : やってはいけないこと](https://automate.sct.co.jp/knowledge/12109/)
[Disconnecting from Remote Desktop while executing automated tests](https://docs.testarchitect.com/user-guide/support/frequently-asked-questions/disconnecting-from-remote-desktop-while-executing-automated-tests/)
[管理者権限ダイアログを出さずにpowershellスクリプトを管理者権限で実行](https://qiita.com/kyamawaki/items/7125f33845315d81e4bb)
【Node】CloudFunctionsでincrement/decrementしたい

# はじめに
Firebase CloudFunctionsでフィールド値をインクリメントしようとしてちょいハマりかけたので備忘録


# 更新履歴
2022.8.27 初回投稿

# 環境
- macOS Monterey 12.5.1
- Node：v18.7.0
- npm：v8.18.0

# 参考にしたサイト
https://cloud.google.com/firestore/docs/samples/firestore-data-set-numeric-increment?hl=ja

https://www.codegrepper.com/code-examples/typescript/firestore.FieldValue.increment%281%29

https://stackoverflow.com/questions/51016210/increment-counter-with-cloud-functions-for-firebase


# やりたいこと
- Cloud FunctionsのFirestoreの特定のフィールドでincrement/decrementしたい

# サンプル
- incrementサンプル
```
const db = admin.firestore();
const userRef = db.collection('documents').doc('document_id');
const increment = admin.firestore.FieldValue.increment(1);//admin.firestore()ではない

userRef.update({ FieldToIncrease: increment });
```

- decrementサンプル
```
const db = admin.firestore();
const userRef = db.collection('documents').doc('document_id');
const increment = admin.firestore.FieldValue.increment(-1);//decrementは-をつける

userRef.update({ FieldToDecrease: increment });
```


以上
C#でDebounceしたかった

# Debounceとは？
イベントが発生した直後に同じイベントが発生した場合、最後に呼び出されたイベントのみ実行される仕組み。
短時間に大量にイベントが呼び出されるようなユースケースにおいて、処理を間引きすることでシステムの負荷を軽減する手法

## 例
一番良く見かけるのがTwitterなどの検索バーの入力支援
１文字入力されるごとに検索処理を走らせるととんでもない量のリクエストが発生してしまうので、
人間がタイピングする速度間で発生したイベントをいい感じに間引いている。

![inputsample.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/456434/6c8cc081-1587-759d-d01a-ae3f97b8731e.gif)

この場合だと`からおけ`という４文字を検索しているので４回検索が走りそうだが、`か`と`からおけ`の２回しか検索が走っていない。


## 定義側
```c#
public class DebounceDispatcher
    {
        //待機時間
        private int _debounceTime;
        //キャンセルトークン
        private CancellationTokenSource? _cancellationToken = null;
        public DebounceDispatcher(int debounceTime = 300)
        {
            _debounceTime = debounceTime;
        }

        public void Debounce(Action func)
        {
            {
                //進行中のTaskをキャンセル(初回はnullの可能性がある)
                _cancellationToken?.Cancel();
                _cancellationToken = new CancellationTokenSource();

                Task.Delay(_debounceTime, _cancellationToken.Token)
                    .ContinueWith(task =>
                    {
                        //taskが中断されずに実行されていたときのみコールバックを発火
                        if (task.IsCompletedSuccessfully)
                        {
                            func();
                        }
                    }, TaskScheduler.Default);
            };
        }
    }
}
```


## 使う側

```c#
<input @oninput="入力文字を遅れて大文字に変換する"/>
<p>@_convertedValue</p>

@code {
    private string? _convertedValue;
    //間引き間隔指定
    private DebounceDispatcher dd = new DebounceDispatcher(500);


    private void 入力文字を遅れて大文字に変換する(ChangeEventArgs e)
    {
        var rawValue = e.Value as string;

        //対象処理の呼び出し
        dd.Debounce(() =>
        {
            _convertedValue = rawValue?.ToUpper();
            StateHasChanged();
        });
    }
}
```

![blazorsample.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/456434/2eea6b0c-b44e-03b7-0a74-2628fd89cca9.gif)
ICML2022の枝刈り論文 (5)

# 概要

この記事では、[ICML2022](https://icml.cc/)の枝刈り論文を紹介します。[^1]

[その1](https://qiita.com/kyad/items/b32f38ae16ea47e5d517) [その2](https://qiita.com/kyad/items/938c808c20a90ce0d1ad) [その3](https://qiita.com/kyad/items/6fba160fa1ae43b1a686) [その4](https://qiita.com/kyad/items/11ce2d9354b09a2b6533)

[^1]: 画像や数式は論文から引用しています。


# Linearity Grafting: Relaxed Neuron Pruning Helps Certifiable Robustness

https://arxiv.org/abs/2206.07839

概要：Linearity Grafting. 敵対例に対するロバスト性を上げる方法。
研究機関：IBM
新規性：敵対例に対するロバスト性を上げる学習で、Certifiable lossを入れると精度が下がる課題を、不要なニューロンのReLUを線形にして傾きや切片を調整することによって解決する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2448931/c4ba904d-c7dc-bad5-24e6-4a608769d400.png)
キモ：不安定なニューロン(ReLUの入力値が正にも負にもなる)かつ重要度の低いニューロン(Activationが小さい等)はReLUを線形関数にする。これはえだがｒの緩和版とみなせる。
評価：MNIST, CIFAR, ResNetで実験した。


# The Combinatorial Brain Surgeon: Pruning Weights That Cancel One Another in Neural Networks

https://proceedings.mlr.press/v162/yu22f.html

概要：CBS. [Optimal Brain Damage](https://papers.nips.cc/paper/1989/hash/6c9882bbac1c7093bd25041881277658-Abstract.html)の改良
新規性：OBSで刈ると決めうちするチャネルの決め方を一般化して、2次混合整数計画問題として定式化した。
キモ：2次混合整数計画問題を近似的に解く方法として、Swappingを使うアルゴリズムを使った (Alg. 1)
評価：ResNet, CIFAR, MobileNet, ImageNetで実験した。


# SPDY: Accurate Pruning with Speedup Guarantees

https://proceedings.mlr.press/v162/frantar22a.html

概要：SPDY. 推論時間を保証する枝刈り。
新規性：レイヤ毎にsparsityを最適化するフレームワーク。
キモ：Sparsityが$s$の時の誤差の最小値$E(s)$を動的計画法で求める。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2448931/94131e81-9928-734e-b556-45cf0b65fbd2.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2448931/a87121ab-e338-e532-40bc-b166ca1a3790.png)
評価：MNIST, CIFAR10で実験した。


# おまけ： What is the State of Neural Network Pruning?

https://arxiv.org/abs/2003.03033

(MLsys2020)
概要：ShrinkBench. 枝刈りの統一的なベンチマーク
研究機関：MIT
新規性：枝刈りを81論文メタサーベイし、枝刈りの比較条件が統一されていない課題を指摘し、枝刈りベンチマークを作った。
キモ：同じモデルでも初期重みが違うと違う結果になるので、初期重みを同じにして評価する。
評価：CIFAR, VGG, Resnetで実験した。
TexTraの翻訳 APIをJavaScriptだけで取得する

**Web API の JavaScript での取得方法について** の質問があったので作ってみました。

https://mt-auto-minhon-mlt.ucri.jgn-x.jp/content/qa/detail/?q_qa_id=1790&t=1656590695

<p class="codepen" data-height="256" data-default-tab="result" data-slug-hash="mdxZyBP" data-user="04" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/04/pen/mdxZyBP">
  TexTra 翻訳 Demo</a> by John Doe (<a href="https://codepen.io/04">@04</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

```javascript
async function handle(e) {
  name = "extra";
  key = "5b37d68901799f71e8937f26add0fafd06309732b";
  secret = "71d1b17cfdc7e26e6232a9a750c038d2";
  text = e.target.value;

  const oauth = OAuth({
    consumer: { key, secret },
    signature_method: "HMAC-SHA1",
    hash_function(base_string, key) {
      return CryptoJS.HmacSHA1(base_string, key).toString(CryptoJS.enc.Base64);
    }
  });

  const options = {
    url: "https://mt-auto-minhon-mlt.ucri.jgn-x.jp/api/mt/generalNT_en_ja/",
    method: "POST",
    data: { text, name, key, type: "json" }
  };

  const cors_support = "https://corsproxy.io/?";
  const res = await fetch(cors_support + options.url, {
    method: options.method,
    body: new URLSearchParams(options.data),
    headers: oauth.toHeader(oauth.authorize(options))
  }).then((r) => r.json());
  document.all.output.value = res.resultset.result.text;
}
```

# Python

Pythonでもpipで簡単にインストールできるようにしてみました。

https://github.com/GitHub30/textra

```bash
pip install textra

trans 'I am a cat.'
私は猫です。
```
jenkins で aws コマンド実行

## 大枠
```
node {
    stage('check instance') {
        def resultArray = getInstanceInfoList()
        for (instance in resultArray) {
            if (instance.Status == "running") {
                // なにかする
            }
        }
    }
}
```

## インスタンス情報取得
指定環境のフィルターとインスタンスID、稼働状況、OS情報、ip、タグ名を取得するクエリ設定
```
def getInstanceInfoList(String env = "")
{
    String filter = ""
    if (env.isEmpty()) {
        filter = "Name=tag-key,Values=envName"
    } else {
        filter = "Name=tag:envName,Values=${env}"    
    }
    
    String query = "Reservations[*].Instances[].{InstanceID:InstanceId, Status:State.Name, PlatformDetails: PlatformDetails, PublicIpAddress:PublicIpAddress,Tags:Tags[?Key==`envName`].Value|[0]}"
    GString cmd = """
        aws ec2 describe-instances \
            --filters ${filter} \
            --query '${query}' \
            --output json
    """
    return exeAwsCmd(cmd)
}
```
Platform だと windows しか取れなかったので、 PlatformDetails を使いました
linux は Linux/UNIX が返ってくるので、 PlatformDetails.toLowerCase().contains("windows") で判定して使ってます

## aws コマンド実行
[プラグイン](https://plugins.jenkins.io/pipeline-aws/)を利用
returnStdout を true にし標準入力を受け取る
```
def exeAwsCmd(GString cmd)
{
    withAWS(credentials:'XXXXX', region:'ap-northeast-1') {
        def resultJson = sh (
                script: cmd,
                returnStdout: true
        )
        resultArray = readJSON text: resultJson
    }
    return resultArray
}
```
## その他
インスタンスの起動と停止
```
exeAwsCmd("aws ec2 start-instances --instance-ids ${instanceID}")
exeAwsCmd("aws ec2 stop-instances --instance-ids ${instanceID}")
```

パラメータを渡して他のジョブを実行
型string の env にタグ名を設定
```
build job: 'hogeJob', parameters: [
    [$class: 'StringParameterValue', name: 'env', value: instance.Tags]
]
```
Excelの右クリックメニューに独自処理を追加する方法

Excelのセル上にて右クリックした際に表示されるメニューに独自項目を追加し、任意のマクロを呼び出すアドオンを作成する。

まずはvbaのエディタを起動し、標準モジュールを作成し、以下のコードを記載する。
```vb:Module1.vb
Const MENU_1 As String = "test"

' アドインの追加を行った際に動く処理を定義
Sub addinInstall()

    ' cellの右クリックをした時のオブジェクトを取得
    Dim cbrCmd As CommandBar
    Set cbrCmd = Application.CommandBars("cell")
    
    Call addControl(cbrCmd, MENU_1)
    
    Set cbrCmd = Nothing

End Sub

' アドインの削除を行った際に動く処理を定義
Sub addinUninstall()

    ' cellの右クリックをした時のオブジェクトを取得
    Dim cbrCmd As CommandBar
    Set cbrCmd = Application.CommandBars("cell")
    
    Call deleteControl(cbrCmd, MENU_1)
    
    Set cbrCmd = Nothing

End Sub

' コントロールの追加
Function addControl(cbrCmd As CommandBar, caption As String)
    
    ' 同名のコントロールが存在しない場合
    If hasControls(cbrCmd, caption) = False Then
        ' ボタンを追加する。before:=1と指定することでメニューの一番上に追加となる。デフォルトは末尾に追加。
        With cbrCmd.Controls.Add(Type:=msoControlButton, Before:=1)
            ' ボタンの名称を指定
            .caption = caption
            ' ボタンを押下した際に動かすマクロ関数名を指定。ここではcaptionと同じとした。
            .OnAction = caption
        End With
    End If
    
End Function

' コントロールの削除
Function deleteControl(cbrCmd As CommandBar, caption As String)
        
    ' 指定されたコントロールが存在する場合
    If hasControls(cbrCmd, caption) Then
        ' コントロールを削除する
        cbrCmd.Controls(caption).Delete
    End If

End Function

' コントロールの存在チェック
Function hasControls(cbrCmd As CommandBar, caption As String) As Boolean
    For Each Control In cbrCmd.Controls
        If Control.caption = caption Then
            hasControls = True
            Exit Function
        End If
    Next
    hasControls = False
End Function

' 任意のマクロ処理
Sub test()
    MsgBox ("test")
End Sub
```

次にアドインの追加・削除をした際に、定義した内容が呼び出されるようにイベント設定をする。
```vb:ThisWorkBook
' アドイン追加時のイベント
Private Sub Workbook_AddinInstall()
    Call addinInstall
End Sub

' アドイン削除時のイベント
Private Sub Workbook_AddinUninstall()
    Call addinUninstall
End Sub
```

vbaエディタを閉じ、Bookを「Excelアドイン(*.xlam)」形式で保存する。

次にExcelのメニューからファイル→オプション→アドイン→設定を押下する。
参照から先ほど保存したアドインを指定し、一覧からチェックをする。
これでアドインが追加され、メニューに追加されるはず。
逆に一覧からチェックを外せばアドイン削除時のイベントが動き、メニューから削除されるはず。
【JavaScript】SessionStorageとは？ 

<h1>SessionStorageとは</h1>

SessionStorageは、データをセッション中保存できる仕組みのこと。

同一オリジンで、ブラウザ(タブ)が閉じられるまでは、データ保存が維持されます。
(ページの再読み込み(リロード)でも、データは消えない。)

※同一オリジンとは、
・http://www.abc.jp
・http://www.abc.jp/content
・http://www.abc.jp/login
上記は同一オリジンです。
・http://www.abc.jp
・https://www.abc.jp/content
・http://www.abd.jp/login
上記は同一オリジンではありません。


また、実装で好きなタイミングでSessionStorageを削除することができます。

<h1>実装を見る</h1>

概要：
フォーム画面を作成して、フォーム画面で入力したデータをtsファイルで取得します。
取得

```a.ts
storageUserId = "";

sessionStorageName(){ //userIdをセッションストレージへ保持
    this.storageUserId = this.loginForm.value.userId;
    sessionStorage.setItem("userId",this.storageUserId);//form入力値
}

```

```a.html
<form class="login-form" [formGroup]="loginForm" (ngSubmit)="onSubmit()" (ngSubmit)="sessionStorageName()">

  <input type="userId"  name="user_id" formControlName="userId" class="login-userId" autofocus="true" required="true" placeholder="UserId" />
  <input type="submit" name="button" value="Login" class="login-submit" id="login_submit" />
</form>

```

a.tsの、
「sessionStorage.setItem()」で、セッションストレージへデータ保存可能です。
![スクリーンショット 2022-08-27 11.27.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677104/ba902bf3-79ca-4df1-c947-6e69cb98b71c.png)


画面跨ぎでデータを使いたい場合の手段として使う場合は、

```b.ts
sessionStorage.getItem("userId");
```
とすれば、sessionStorageのuserId: owner1が取得できます。
Vue.jsを基本からまとめてみた【超入門】

## Vue.jsとは

公式サイト：[Vue.js](https://v3.ja.vuejs.org/)

JavaScriptのフレームワーク
##### ※ フレームワークとは、便利な機能が集まったツールのこと

## Vue.jsのメリットや特徴

①コンポーネント指向であること
- HTML要素を部品化出来る
- コピペの駆逐

②シンプルで拡張性が高いこと
- メンテナンスが楽になる

③学習コストが低い


## 環境構築

① CDN

```index.html
<head>
<script src="https://unpkg.com/vue@next"></script>
</head>
```
② NPM
※ Vue による大規模アプリケーションを構築するときには、npm を利用したインストールを推奨

```
// 最新安定版
npm install vue@next
```

## 記述

```sample.vue
<template>
 <!--- HTMLを記述する部分　-->
</template>

<script>
 // JSを記述する部分　//
</script>

<style scoped>
 /* CSSを記述する部分　*/
</style>
```
## WEB_WATCH アプリを作成

①ターミナルでvueアプリケーションを作成する。

```
npm create vite@latest <プロジェクト名> --template vue
npm install
npm run dev
```
## コンポーネント・ファイル構成

```
 src
  ├── components
        ├── ClockScreen.vue
  ├── App.vue
  ├── main.css
  └── main.js
```
### ■ data()とは

コンポーネント内で利用出来るデータを保持できるメソッドの事。
また、data()で保持しているデータが変更された場合、
再度、ページがレンダリングされる。

```sample.vue
data() {
 return {
  キー：値,
 }
}
```
### ■ computed()とは

data()で保持したデータを加工したい場合に利用するプロパティ。
再度、ページがレンダリングされる。

```sample.vue
computed() {
 プロパティ名() {
  処理
 }
}
```

### ■ methods()とは

template タグやscriptタグ内で呼び出せる関数を記載する場所。

```sample.vue
methods() {
 関数名() {
  処理
 }
}
```

### ■ mounted()とは

mounted()はマウントされた後に実行され、これ以降のライフサイクルからDOM要素に
アクセスが可能になる。

```sample.vue
mounted() {
  処理
},
```


## 参考サイト

[Vue.js入門講座【最新のバージョン3対応】基礎から学ぶVue js 3](https://www.youtube.com/watch?v=wlCwyouRbtE&t=1065s)
[【サクサク解説】Vue.jsってどんなフレームワーク？](https://www.youtube.com/watch?v=tqQAATfMQGs)
[【Vue.js入門＃1】Vue.jsが便利！環境設定と基礎知識解説/WEBアプリを作ろう！](https://www.youtube.com/watch?v=ournykvJwYA&t=17s)
[【Vue.js入門＃2】初心者でもできるWEB時計アプリを作ろう！前編](https://www.youtube.com/watch?v=1nbvI28cMyI)
Stable Diffusionの実行環境をpyenv-virtualenvで作る

# 概要

[Stable Diffusion](https://huggingface.co/spaces/stabilityai/stable-diffusion)を[手元のPC](https://qiita.com/kyad/items/a82490a7a47bd0ea47c2)で実行してみました。
公式手順ではAnacondaを使いますが、pyenv-virtualenvで動かしてみました。

https://huggingface.co/spaces/stabilityai/stable-diffusion


# 方法

```
git clone https://github.com/CompVis/stable-diffusion
cd stable-diffusion
vi requirements.txt
```
requrements.txtには、environment.yamlのpipの項目からコピーしたものを記入して、この場所に置きます。
```requirements.txt
albumentations==0.4.3
diffusers
opencv-python==4.1.2.30
pudb==2019.2
invisible-watermark
imageio==2.9.0
imageio-ffmpeg==0.4.2
pytorch-lightning==1.4.2
omegaconf==2.1.1
test-tube>=0.7.5
streamlit>=0.73.1
einops==0.3.0
torch-fidelity==0.3.0
transformers==4.19.2
torchmetrics==0.6.0
kornia==0.6
-e git+https://github.com/CompVis/taming-transformers.git@master#egg=taming-transformers
-e git+https://github.com/openai/CLIP.git@main#egg=clip
-e .
```
重みファイル sd-v1-4.ckpt を https://huggingface.co/CompVis/stable-diffusion-v-1-4-original からダウンロードしてこの場所に置きます。

```
pyenv install 3.8.5
pyenv virtualenv 3.8.5 ldm
pyenv local ldm
```
PyTorchをインストールします。Ubuntu 22.04で、CUDAは`sudo apt install nvidia-cuda-toolkit`で入れたものとします。
```
pip3 install torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cu116
pip install -r requirements.txt
```
実行します。
```
python scripts/txt2img.py --prompt "engineer" --plms --ckpt sd-v1-4.ckpt --n_samples 1
```
実行時間は50秒くらいでした。


# 参考URL
以下のURLを参考にさせていただきました。
https://zenn.dev/ettsu/articles/6a1e68cea8864b
AWS Systems Managerを使って外部から自宅のRaspberry Piにアクセスしてみる

# はじめに
以前、以下の記事でラズパイを使ってKubernetesクラスタを構築してみました。
[Raspberry Pi 4を使ってKubernetesクラスタを構築する](https://qiita.com/hato52/items/2d22a9a24299b2d0c904)

どうせなら外部からアクセスして管理できるようにしたいと思っていたのですが、自宅の環境的にポート開放することが難しい...。

どうにかポート開放すること無く外部からアクセスする方法が無いかと調べていたところ、AWSのSystems Managerで実現出来そうだったので、ラズパイに導入してみました。

# ハイブリッドアクティベーションの作成
AWS Systems Managerのページを開き、左側メニューからハイブリッドアクティベーションのページを開きます。
「アクティベーションを作成する」ボタンがあるので選択します。
![スクリーンショット 2022-08-17 0.36.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2744609/31253725-3e8d-339e-73aa-282117f77519.png)

入力項目が現れるので、設定内容を入力します。
| 項目 | 設定内容 |
|:-|:-|
| アクティベーションの説明 | My Activation |
| インスタンス制限 | 1 |
| IAMロール | システムによって作成されたデフォルトロール ※1 |
| デフォルトのインスタンス名 | RaspberryPi Manager |

※1 ... SSM用のカスタムロールを作成して使用したい場合は、既存のカスタムIAMロールを選択してください。
![スクリーンショット 2022-08-17 0.40.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2744609/f05e6258-5433-7809-9c7a-d0136f1afb24.png)

入力した上でアクティベーションを作成を選択すると、アクティベーションコードとアクティベーションIDが表示されます。
**この画面を閉じると確認できなくなるので、メモしておく必要があります。**
![スクリーンショット 2022-08-17 0.40.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2744609/63bde639-41d5-4920-5016-b5fa6808da2c.png)
以上でアクティベーションの作成は完了です。


# SSM Agentのインストール
続いて、管理対象のマシン(今回はRaspberry Pi)で作業をします。

以下のコマンドを入力してSSM Agentをインストールします。
```-code```には先ほどメモしたアクティベーションコードを、```-id```にはアクティベーションIDを指定します。
また、```-region```には```ap-northeast-1```を設定しました。

```shell:SSM Agentインストール
mkdir /tmp/ssm
sudo curl https://s3.amazonaws.com/ec2-downloads-windows/SSMAgent/latest/debian_arm/amazon-ssm-agent.deb -o /tmp/ssm/amazon-ssm-agent.deb
sudo dpkg -i /tmp/ssm/amazon-ssm-agent.deb
sudo service amazon-ssm-agent stop
sudo -E amazon-ssm-agent -register -code "activation-code" -id "activation-id" -region "region" 
sudo service amazon-ssm-agent start
```

再度AWSのコンソールに戻り、フリートマネージャーからSSM Agentが正常に動作しているかを確認します。
SSM AgentのpingがオンラインになっていればOKです。
![スクリーンショット 2022-08-17 1.10.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2744609/0f32245e-6547-7cb6-883e-54036bc4213c.png)


**※ curlのURLについて**
Raspberr Pi OSの場合はdebian_armとなりますが、管理対象のOSによってこの値が変わります。
[公式マニュアル](https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/sysman-install-managed-linux.html)に詳細が記載されているので、他OSを使用したい方は参考にしてみてください。

# アクセス方法
Session Managerを開き、「セッションの開始」を選択します。
![スクリーンショット 2022-08-17 1.12.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2744609/5770c65f-f9a2-361b-ef88-3fa802cd9add.png)

ターゲットインスタンスから先ほど作成したインスタンスを選択して「セッションを開始する」を選択します。
![スクリーンショット 2022-08-17 1.13.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2744609/a1f3b27e-7708-7e3b-9d7d-9de6bfc7e8fc.png)

ブラウザ上からラズパイにアクセス出来ました。
これでどこからでもラズパイを見守ることが出来ますね。
![スクリーンショット 2022-08-17 1.15.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2744609/c146a8cc-f903-6ed5-3dd0-096165faa967.png)

# 参考資料
* https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/systems-manager-managedinstances.html
* https://zenn.dev/daimatsu/articles/ef1ae49bb7816b
* https://qiita.com/moritalous/items/b3b194fe665aa5461ebc
`pbcopy > hoge.txt` でファイルの中身を吹っ飛ばした

# これはなに？

ファイルの中身をコピーしようと思って `pbcopy` コマンドを使ったら、ファイルの中身を全て削除してしまったので、自戒の記事。
復元方法ではなく、再発防止策について書いていく。

ちなみに、事前にバックアップをとっていれば復元可能なケースもあるようですが、そんなものは用意していなかったので、復元方法はなさそう。
もしあるのならば知りたい。。。

# 環境

- macOS Monterey: v12.5.1
- zsh

# やらかした内容

`hoge.txt` の内容をコピペしたい。

```shell
# まずはファイルの中身を確認する
$ cat hoge.txt
hoge
fuga
piyo

# 中身ヨシ👉
# `pbcopy` コマンドで中身コピー実行！

$ pbcopy > hoge.txt

# コマンド打ったらなかなか終わらないし、対話モードっぽいのに入ったからコマンド間違えたかな？
# とりあえず `⌃ C` で一回実行止めればヨシ👉（よくない）
^C
$ 
# リダイレクト `>` の向き先が逆だった……
# コマンド再実行！
$ pbcopy < hoge.txt
```

途中でコマンド間違えたけど、再実行したし `⌘ + v` でペーストしてみるか！
……できない。

ファイルの中身も入っていたはずなのになぜ？？
一応もう一回ファイルの中身確認しとくか……

```shell
$ cat hoge.txt
```

何も表示されない。
オワリ。

# 何が起こったか

まず、本来の「 `hoge.txt` の中身をクリップボードに書き込む」という目的を達成するのに適切なコマンドは下記だった。

```shell
$ pbcopy < hoge.txt
```

しかし、1回目コマンドでは上記とリダイレクト `>` の向き先が真逆だったため、
「無」を `hoge.txt` ファイルの中身に上書きされてしまったらしい。（※）
結果として、1回目コマンド実行した時点で `hoge.txt` の中身は全て吹っ飛んで空のファイルが出来上がり、
2回目に正しいコマンド実行しても空の内容がクリップボードにコピーされてしまった次第。

※補足
`pbcopy > hoge.txt` の正確な動作がどのようなものか、までは調べきれてない。
クリップボードの中身がファイルに書き込まれるのかなと思ったけど、そんなことはなかった。

# 再発防止策

というわけで、ここから本題。

そもそも今回のやらかし原因は、shellやリダイレクト `>` の知識不足というのもあるが、今後も誤操作する可能性は十分にある事象。
ということで、shell利用時に想定外にファイルの中身を上書きしてしまう危険性を排除するための対策を施す。

具体的には `.zshrc` に以下を追記。

```:.zshrc
set -o noclobber
```

参考記事は下記。

https://tech.withsin.net/2018/05/22/set-o-noclobber/

対策できたか試してみる。

`.zshrc` の内容を反映するために、ターミナル再起動もしくは `source .zshrc` を実行済みの状態。

```shell
# `hoge.txt` の中身を確認する
$ cat hoge.txt 
hoge
fuga
piyo

# 間違えたコマンドを実行してみる
$ pbcopy > hoge.txt
zsh: file exists: hoge.txt

# `hoge.txt` の中身を確認する
$ cat hoge.txt     
hoge
fuga
piyo
```

しっかり上書きが防止されている。
めでたしめでたし。（※）

※ちなみに、実際に吹っ飛ばした時に操作していたのはtxtファイルではなく、秘密鍵でした。
何もめでたくない。
オワリ。
Linux 通信プロトコル、IPv4とIPv6の違いについて（自分用メモ

●主な通信プロトコル

プロトコル名
・IP 機器（サーバー、ルータ、PCなど）へのアドレス付与によって機器やネットワークを識別したり、パケットの分割や統合を行い目的までパケットを届ける。インターネット通信の中核をなすプロトコル
・TCP パケットの再送、到達確認等の制御を行う信頼性の高いコネクション型のプロトコル。
・UDP コネクションレス型のプロトコル(OSI参照モデルの第4層に属する)。複雑な制御をしない文TCPと比べてデータ転送速度が速い。主に動画や音声などのマルチメディア通信に使われる。
・ICMP パケットが到達できなかった場合のエラーメッセージや、制御メッセージを通知するプロトコル。
・ARP IPアドレスからMACアドレスを求めるプロトコル。

●IPv4とIPv6

■IPv4
・10進数
・アドレス長　32ビット
・区切り　8ビット（３桁毎にドット）
・DHCP等の技術を併用し、アドレスの自動割り当て
・ループバックアドレス　127.0.0.0/8の範囲

■IPv6
・16進数（0-9とA-F）で表記
・アドレス長　128ビット表記による事実上無限のIPアドレス
・区切り　16ビット（4桁毎にコロン）
・自動割り当てを標準で実装
・暗号化通信(IPsec)を標準で実装
・IPアドレスの省略表記可能
・ループバックアドレス　0:0:0:0:0:0:0:1 または　::1　（各ブロックの先頭にある「0」は省略可能（連続した場合も同様））
・IPv4との互換性は無い（但し、機器にIPv4とIPv6の両方のアドレスを割り当てるデュアルスタックなどの仕組みで相互運用は可能）
・ブロードキャストが廃止され、一斉送信は全てマルチキャスト（特定グループ宛通信）で行われる
・「0000」は「0」に省略可能
・連続した「0000」のブロックは1回に限り「::」に省略可能


●サブネットプレフィックス

▲ユニキャスト(1:1通信)
・集約可能グローバルアドレス　2000::/3~、E000::/3　世界中で一意となるアドレス。IANAによって管理・割り当てされる。
・リンクローカルアドレス　FE80::/10　ホスト間で一意となるアドレス。
・ユニークローカルアドレス　FC00::/7　IPv4でのプライベートアドレスに似た、組織内で自由に使えるアドレス。

▲マルチキャストアドレス　FF00::/8　マルチキャスト(グループ宛送信)の宛先となるアドレス。

IPv6アドレスはIPv4での「クラス」の概念はなくなった代わりに、ユニキャスト（1対1通信）のアドレス割当時にはサブネットを表す前半64ビットと、ホストを表す後半64ビットでアドレス割り当てすることが推奨されています。前半64ビットを「サブネットプレフィックス」、後半64ビットを「インタフェース識別子（Interface-ID）」。
インタフェース識別子はデータリンク層のアドレスを用いて自動生成される。
複数選択を考える

# モチベーション

Electronの勉強のために[TaskTab](https://fiplab.com/apps/task-tab-for-mac)のクローンを作っていたら複数選択で行き詰まった

## 行き詰まった理由

- 一口に複数選択といってもOSやライブラリなどで仕様が異なる
- 直感的でない仕様がある
- 複数選択のライブラリはあるがテーブルと蜜結合していることが多く使い辛い（使いたかったのはリストのため）

# 仕様を考える

> 一口に複数選択といってもOSやライブラリなどで仕様が異なる

全ての仕様を網羅することはできないので、MacのファイルマネージャーであるFinder（≒Google Slide）の仕様を目指します。

Finderの複数選択は[ibash/better-multiselect](https://github.com/ibash/better-multiselect)でほぼ分析されていますが、一部足りない仕様があったため追記しています。

```diff_markdown:意訳
ルール

アンカー：選択を開始する位置
フォーカス：選択を終了する位置

...

1. クリック

    1. アンカー・フォーカスをクリックされた要素に移動する
    2. 選択範囲をクリックされた要素に置換する

2. コマンドクリック

    1. クリックされた要素が選択されていない

        1. アンカー・フォーカスをクリックされた要素に移動する
        2. 選択範囲にクリックされた要素を追加する

    2. クリックされた要素が既に選択されている

        1. アンカー・フォーカスを以下の優先順位で移動する

            1. クリックされた要素より後方の要素の中で最小の要素
            2. クリックされた要素より前方の要素の中で最大の要素
+           3. どちらもなければリストの先頭の要素

        2. 選択範囲からクリックされた要素を削除する

3. シフトクリック

-   1. 選択範囲からアンカーとフォーカス間の要素全てを削除する
+   1. 選択範囲からアンカーとフォーカス間の要素とそれらに連続する要素全てを削除する
    2. フォーカスをクリックされた要素に移動する
    3. 選択範囲にアンカーとフォーカスの間の要素を全て追加する

4. コマンドクリックはシフトクリックよりも優先される
```

## 追記内容について

`2.2.1.3`

クリックされた要素が既に選択されており、他に選択された要素がない場合のルールです。

`3.1`

主に2つの選択範囲を結合するような選択を行ったときに関連するルールです。
直感的には「アンカー・フォーカス間の要素」が削除されるかのように思いますが、実際は「アンカー・フォーカスが所属する連続した選択範囲の要素全て」が削除されます。


# 実装

https://codesandbox.io/s/2-vystm6

# おまけ

[前述のCodeSandboxのサンプル](https://codesandbox.io/s/2-vystm6
)ではレンダリングのパフォーマンス最適化は何も考えられておらず、選択範囲が変わるごとに全ての`List`が再レンダリングされています。
これを`useReducer`、`React.memo`を活用し、変更のあった要素のみを再レンダリングするようリファクタリングしたものが以下になります。

https://codesandbox.io/s/4-npc768

# 参考文献

- https://github.com/ibash/better-multiselect
- [リストの複数選択の挙動を「いい感じに」してみた](https://studist.tech/try-to-multi-select-with-keyboard-f4d5ab42d1a9)
- [useReducerの本質：良いパフォーマンスのためのロジックとコンポーネント設計](https://qiita.com/uhyo/items/cea1bd157453a85feebf)
Salesforce認定アドミニストレーター試験の公式練習問題を解説してみた-その005

こんにちは。本橋孝昭です。

Salesforce認定アドミニストレーター試験の公式練習問題があるのはご存じでしょうか。
Trailheadにフラッシュカードとして何度も解ける練習問題がございます。

今回はTrailhead
アドミニストレーター認定の準備: 構成、設定とオブジェクト
構成と設定の学習　にある練習問題5問目をご紹介します。
https://trailhead.salesforce.com/ja/content/learn/modules/administrator-certification-prep-setup-and-objects/study-up-on-org-setup

なお、こちらの内容はYouTubeでも公開しております
https://www.youtube.com/watch?v=LrkGLvQeqRE&t=1s

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


練習問題5問目はこちらです
![005.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/480785e2-eb7a-1548-4990-02bfe0ee25eb.png)


さあ、正解はどれでしょうか
今回の問題としては新規ユーザ作成時の注意点ですね。

正解はAとBですね
それでは解説を深堀ります。

Aについて
「すべてのユーザ名はすべての本番環境で一意にする必要がある」とのことですが、これはどういう意味でしょうか

これは「他のSalesforce環境にすでにユーザ名が同じものがあれば、別のSalesfroce環境でも同じユーザ名は認めませんよ」という意味です。

このルールはPlaygroundでも適応されます。
ぜひ２つのPlaygroundを作成し、環境は異なっていても全く同じユーザ名のユーザが作成できないことを確認してみてください

Bについて
ユーザ名はメールアドレスの形式 (xxxx@xxx.com) になっている必要がありますが、有効なメールアドレスである必要はありません。

つまり、@xxx.com のような形式にしなければならないのですが、架空のメールアドレスでユーザ作成することができる　ということですね

こちらのヘルプをご参考ください
https://help.salesforce.com/s/articleView?id=000325738&type=1


では、なぜCが間違っているのかご説明します
ユーザ名とメールアドレスは同じではなくても作成することが可能でので間違いです

Dが間違っているかをご説明します。
ユーザ名は会社のドメインは不要です。例えばgmail.comのようなユーザ名でも作成可能です


ユーザ作成についてそのほか学びたい人はこちらのTrailhead
「ユーザ管理」がおすすめです

https://trailhead.salesforce.com/ja/content/learn/modules/lex_implementation_user_setup_mgmt

今日の内容はここまでです。
皆さん楽しく元気にSalesforceを学びましょう！
SwiftUI: モーダルなSheetを使って別のViewを表示する

自分用の時刻表アプリを作ろう、という記事を書いた時に、乗り場をタップすると、その乗り場の地図を表示できたらいいなと思いました。

https://qiita.com/tnar-f/items/1a95429cf5e8547f0b2f

そういう時のViewの遷移に、モーダルなSheetが使えそうと思ったのでやってみました。モーダルな画面というのは、その画面での操作を終了しない限り、アプリのその他の操作ができない画面のことです。アラート画面のようなものですかね。アイディアとしては以下のようなものです。

![スクリーンショット 2022-08-27 9.32.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2517091/2c72c9cb-2c19-9f1b-4e09-6a5a16b7019d.png)

「モーダルなシートってなに？」ボタンをタップすると、

![スクリーンショット 2022-08-27 9.55.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2517091/fb83ee07-7fb3-bd5a-d046-8c52f259fd5d.png)

元の画面を「ほぼ」覆うようなかんじで、下から新しい画面がにゅるっと現れます。少し見えている元の画面の部分をタップしても何も起きません。この画面を消して、元の画面に戻るには「なるほど」ボタンをタップするか、下方向にスワイプします。

以下のようなコードでこれを実現します。

```Swift
struct ContentView: View {
    @State private var bShowSheet = false
    var body: some View {
        Button("モーダルなシートってなに？") {
                self.bShowSheet.toggle()
            }
            .sheet(isPresented: $bShowSheet) {
                SheetView()
        }
    }
}
struct SheetView: View {
    @Environment(\.dismiss) var byebye
    var body: some View {
        VStack {
            Text("こういうこと")
                .font(.largeTitle)
                .foregroundColor(.red)
            Button("なるほど") {
                byebye()
            }
        }
    }
}
```

以下の環境で、動作を確認しました。
MacOS Monterey 12.5.1
Xcode 13.4.1
Railsでアプリ作成時のMySQLエラーの解消方法

# 動作環境
M1 macboook pro
macOS Monterey ver.12.5

# 1. opensslの再設定

`rails new (アプリ名) -d mysql`を実行すると、以下のエラーが発生。
```
An error occurred while installing mysql2 (0.5.4), and Bundler cannot continue.
```

macOSのSierra以降は、opensslがデフォルトが変わっているようで、以下のように再度インストール。
```
% brew install openssl
% bundle config --local build.mysql2 "--with-ldflags=-L/usr/local/opt/openssl/lib"
```

そして、改めて`bundle install`を実行。
```
% bundle install
```

# 2. railsサーバが起動しない

opensslの設定後、今度は、`rails s`でサーバが起動せず、以下のエラーが発生。
```
=> Run `bin/rails server --help` for more startup options
Exiting
/Users/arakijun/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/gems/webpacker-5.4.3/lib/webpacker/configuration.rb:103:in `rescue in load': Webpacker configuration file not found /Users/arakijun/Desktop/rails6_mysql_app/config/webpacker.yml. Please run rails webpacker:install Error: No such file or directory @ rb_sysopen - /Users/arakijun/Desktop/rails6_mysql_app/config/webpacker.yml (RuntimeError)
```
エラー文の中に`Please run rails webpacker:install`とあるため、以下の通りに実行。
```
$ bundle exec rails webpacker:install
```
これでOKです！
Stable Diffusionを試す

# デモサイトで試す

どんな画像が生成されるのか、すぐに試せます。

https://huggingface.co/spaces/stabilityai/stable-diffusion

# Google Colabで試す

Pythonでいろいろ試してみたい場合は、Google Colab上で動かすのが簡単。

https://github.com/huggingface/diffusers

上記のREADMEから、手順だけ簡潔にまとめる。

1. Hugging Faceのアカウントを作成
https://huggingface.co/join
2. モデルへのアクセス規約に承諾(Access repositoryボタンを押す)
https://huggingface.co/CompVis/stable-diffusion-v1-4
3. アクセストークンの作成
https://huggingface.co/settings/tokens
4. ノートを立ち上げる
https://colab.research.google.com/github/huggingface/notebooks/blob/main/diffusers/stable_diffusion.ipynb

あとは上から順に実行するだけ。途中でログイン画面が表示されるので、3.のアクセストークンをペーストする。
適当に変更して試しましょう。
オリジナルのyoutubeページを作成してみました

# 概要
[「なつかしの曲(ポータル)」](https://tecoyan.blogspot.com/2020/05/0.html#btn_cntrl)は、[youtubeページ](https://www.youtube.com/watch?v=bFQyYwWV58M&t=106s)のオリジナルページです。
特長としては、国内、海外の昔なつかしい歌や曲を再生リストにして再生することができます。
再生リストはGoogleブログとサーバーのデータベースに保存しています。
このサイトのブログ記事を開くと月日別の投稿記事で再生リストの再生が始まります。
また、リスト選択でデータベースの再生リストを選択して再生できます。
# ページ詳細
このページは、基本要素とオプション要素から構成されています。以下、順に追って説明いたします。

## (1) 基本要素
このページの基本要素は、プレーヤーと再生リストです。
ページを開くと再生リストの先頭から再生がスタートします。あとは、ほったらかしにしておくと連続してリストを再生します。
イージーリスニングサイトをイメージしています。

## (2) オプション要素
主なオプション要素は、ブログの目次です。ブログのアーカイブを見やすくしたものです。目次でブログの再生リストを選択できます。
以下、個別のオプション要素をページの上から順に記述します
### ・今日のニュース
### ・メインコントロールボタン
　(1) ジャンル 
　(2) つぶやき
　(3) リスト選択
　(4) スペシャルリスト
　(5) リスト生成
### ・リストのステータス
### ・日付
### ・リストタイトル
### ・リスト記事
### ・動画タイトル
### ・サブコントロールボタン
### ・プレーヤー
### ・再生リスト
### ・サイドバー
　Googleブログのボタンの説明は省略します。オリジナル版で追加したボタン類は以下になります。
　　(1) 王冠マーク

　　　・追加
　　　・削除
　　　・再生
　　(2) アクセス履歴
　　(3) youtubeリスト再生(プラグインベース)
　　(4) youtubeリスト再生(ブログベース)
　　(5) 公開環境
　　(6) 検索・再生
　　(7) 人生の応援歌(目次)
### ・瞬間移動ボタン
![代替テキスト](https://common.tecoyan.net/images/top.png)プレーヤーの先頭へ移動します。
![代替テキスト](https://common.tecoyan.net/images/down.png)再生中のリストタグへ移動します。

### ・拡張プラグイン


# あとがき
徐々に補足追加して行きます。
GitHubActionsで通し番号（バージョン番号など）を利用したい時

# 概要
GitHubActionsでバージョン番号を管理したい時は **github.run_number** が便利です。
GooglePlayのバージョン管理、ビルドしたファイルのファイル名に通し番号をつけたりする時などに利用できそうです。
# 本文
 **github.run_number** はGitHubActionsでワークフローが実行される度に1ずつ数が増えていきます。（初めての実行時は1）

例えば以下のコードはKotlinのversionCodeを自動更新するものですが、 **${{github.run_number}}** の記述をすることで、カウントアップされる数字を当てはめることができます。

```yml
name: 'build product'

on: [workflow_dispatch]

jobs:
  manual_run:
    runs-on: ubuntu-latest
    steps:
    - name: checkout
      uses: actions/checkout@v3
    - name: set up JDK 11
      uses: actions/setup-java@v3
      with:
        java-version: '11'
        distribution: 'temurin'
        cache: gradle
    # https://github.com/marketplace/actions/increment-the-version-code-of-your-project
    - name: Bump version
      uses: chkfung/android-version-actions@v1.1
      with:
        gradlePath: app/build.gradle
        versionCode: ${{github.run_number}}
```
# 補足
**github.run_number** は1からスタートする数なので、もっと大きい数が欲しい時は以下のようにすると実現できます。(2022年8月現在 **github.run_number** は手動で変更することは出来ないようです)
```yml
    - name: echo message
      run: |
        echo $((${{github.run_number}}+23))
        echo "現在のバージョンは12.4.${{github.run_number}}です"
```

実行結果
![スクリーンショット 2022-08-28 15.59.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/fdb04706-a072-3500-ec30-3b280520f776.png)

# 補足2
**github.run_number** を1にリセットしたい時はyamlファイルのファイル名を変更します。(コード内のname:部分を変えるだけではリセットされません)

# 参考サイト
https://ryjkmr.com/shellscript-arg-as-number/
Houdiniを学習してみて(1週間経過)

学習しはじめて1週間
毎日仕事＋３時間やると疲労が蓄積していますが、習慣になりつつあります。

仕事はWeb系(PHP,java)のエンジニアですが、
かねてよりやりたかったデザイン系のお仕事へジョブチェンジします。

１週間学んでみた感想は、
**Houdiniがエンジニアと相性いいかもしれない？？**
でした。

教材や公式サイトを見ていると、
エンジニアで得た知識も全く無駄にはならなそうだなという印象を受けました。

例えば、
・相対パスや、演算子まわり
・[Houdiniで利用できるスクリプトのVEXの書き方](https://www.sidefx.com/ja/docs/houdini/vex/lang.html)
など

 VEXは型に厳しいそうなので、Javaと言語的に近かかったりしてと思い調べてみたら、
>VEXは制限の緩いC言語ベースですが、RenderManシェーディング言語と同様にC++の考え方を採用しています。([出典](https://www.sidefx.com/ja/docs/houdini/vex/))

とのことでした。
プログラミング言語の歴史をたどるとJavaはC言語やC++の系列ですし、近そうですね。
プログラミングで、2次元平面のある点の周囲の点の座標を表現する方法

## 内容
タイトルの通りで、
プログラミングで、ある座標の周囲にある8つの点(8方位の点)をXY座標でどのように表すかという内容です。

原典はAtCoderの問題の解説です。 個人的に、解説の理解に時間を要したので、わかりやすく噛み砕いて説明しようと思います。

## コード
```SurroundingCoordinates.java
public class SurroundingCoordinates {
    public static void main(String[] args) {
        int x = 0;
        int y = 0;

        // (1)
        int[] distances = {-1,0,1};
        int size = 0;

        // (2)
        for(int dx : distances){
            for(int dy : distances){
                if(dx == 0 && dy == 0) continue;

                int x2 = x + dx;
                int y2 = y + dy;

                size++;

                //座標の出力
                System.out.println("("+x2+","+y2+")");
            }
        }

        System.out.println("size : "+size);
    }
}
```

### 解説
#### (1) 変数の宣言
表現したい座標たちはこのようになります。

![8方位の座標.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2723412/c2516f0e-8e5e-a04d-541c-b3249b67da70.png)

この8つの座標には見ての通り法則があり、
すべてのXY座標は以下の性質を組み合わせることで表現することができます。
中心からみてx座標が1つ左 or 等しい or 1つ右
中心からみてy座標が1つ下 or 等しい or 1つ上

```SurroundingCoordinates.java
        int x = 0;
        int y = 0;

        //中心からみて座標が1つ下 or 等しい or 1つ上
        int[] distances = {-1,0,1};
```

#### (2) 処理
```SurroundingCoordinates.java
        for(int dx : distances){
            for(int dy : distances){
                if(dx == 0 && dy == 0) continue;

                int x2 = x + dx;
                int y2 = y + dy;
            }
        }
```
まず、中央の座標と同じ点は無視します。
```SurroundingCoordinates.java
                if(dx == 0 && dy == 0) continue;
```
そして、(1)のとおり、 x座標とy座標に加算する数の種類が3通りずつあるので 3×3 で 9通り の座標が出力されます。
3×3の場合のそれぞれについて処理を行うために、2重のfor文で処理しています。



#### (2) 出力
出力が(1)の画像と同じようになっていると思います。
```
(-1,-1)
(-1,0)
(-1,1)
(0,-1)
(0,1)
(1,-1)
(1,0)
(1,1)
size : 8
```

この処理を応用することで、複数の座標を処理することももちろん可能です。

## 参考文献
Minesweeper [AtCoder Beginner Contest 075 B] の解説 ↓

https://blog.hamayanhamayan.com/entry/2017/10/15/002216
Elasticsearchのもやもや:  minimum_should_matchのデフォルト値は?

### はじめに

Elasticsearchを使っていて、もやもやした内容を、
メモ書きレベルで、思うがまま書いてみます。

### `minimum_should_match`パラメータとは

複数キーワードを使って検索を行う際、
`最低何個以上のキーワードがマッチしたら検索ヒットとみなすか`
を指定するためのパラメータ。

この`minimum_should_match`のデフォルト値が、
クエリによって変わってしまうので、モヤモヤ感が。。。

※ [Elasticsearch 7.x以降のリファレンス](https://www.elastic.co/guide/en/elasticsearch/reference/7.17/query-dsl-bool-query.html#bool-min-should-match
)
```
If the bool query includes at least one should clause and no must or filter clauses,
the default value is 1. Otherwise, the default value is 0
```

### `minimum_should_match`のデフォルト値を確認してみた

- ドキュメントを登録

```
PUT /my_index/_doc/1
{
  "user_name": "太郎",
  "date": "2022-10-01T10:00:00",
  "message": "Hello, Elasticsearch"
}
```

- `bool`クエリに`should`句のみ含まれている場合
    - `minimum_should_match`のデフォルト値は`1`
    - いずれの検索ワードも含まれていないため、結果`ヒットしない`

```
GET /my_index/_search
{
  "query": {
    "bool": {
      "should": [
        {
          "match": {
            "message": "keyword1"
          }
        },
        {
          "match": {
            "message": "keyword2"
          }
        }
      ]
    }
  }
}
```


- `bool`クエリに、`must`句と`should`句が含まれている場合
    - `minimum_should_match`のデフォルト値は`0`
    - `should`でいずれの検索ワードも含まれていなくても、結果`ヒット`する

```
GET /my_index/_search
{
  "query": {
    "bool": {
      "must": {
        "match": {
          "message": "Elasticsearch"
        }
      },
      "should": [
        {
          "match": {
            "message": "keyword1"
          }
        },
        {
          "match": {
            "message": "keyword2"
          }
        }
      ]
    }
  }
}
```


### おわりに

`minimum_should_match`のデフォルト値についてでした。
Elasticsearchバージョンにより挙動が変わるので(7.0を境に)、
気を付けたいところです。
OneDrive直下のフォルダが同期されない

# TL;DR
OneDrive直下のフォルダは初期状態では同期されない。OneDriveの設定->アカウント->フォルダーの選択でチェックを入れると同期されるようになる。

# 本文
上記の通り。

# 付記
このルールを知らずにあれこれと的外れな対応をしてしまったのでメモしておく。
Docker 環境でrails db:migrateが出来ない件について

こんにちは。たにやんです。記事を見ていただきありがとうございます。
初歩的なエラーですがつい先日にも同じエラーでつまづき何回も同じエラーでつまづいては効率が悪いと思い、
記事を書くことにしました。


# やりたいこと
プロフィール編集のページを作ろうと思い、usersテーブルに新しくカラムを追加したい。
そこで以下を実行

```rails db:migrate```


# 結果


```
rails aborted!ActiveRecord::DatabaseConnectionError: There is an issue connecting with your hostname: db.

Please check your database configuration and ensure there is a valid connection to your database.


Caused by:
Mysql2::Error::ConnectionError: Unknown MySQL server host 'db' (8)
```




毎度おなじみのMysql関連の登場です。とりあえずエラー内容をコピペしてググってみると以下のサイトがヒットしました。

https://qiita.com/athlaliel/items/7064350a3d08f4c0cff1

こちらのサイトと同じで自分もローカル環境でコマンドを叩いていたためエラーが起こっていると判断。
そこで次はdocker環境上で

```
docker-compose exec web rails db:migrate
```

とし、これで解決！と思いきや。。。
　
```
OCI runtime exec failed: exec failed: unable to start container process: exec: "rails": executable file not found in $PATH: unknown
```

また違うエラーが発生しました。ナニコレ？

とりあえず落ち着いて再度ググってみることに。すると

https://qiita.com/kat0/items/98e38186161311f6b3e3

似たようなサイトがありました。こちらのサイトによるとrailsコマンドの前にはbundle execコマンドを付けるとのこと。
そうやったっけ？

そこで
```
docker-compose exec web bundle exec rails db:migrate
```
とすると

```
ERROR: No such service: bundle
```

またか。笑
さて腐らずググり倒してやりましょう！！

https://junblog11.com/docker%E3%81%A7error-no-such-service%E3%81%A8%E3%81%AA%E3%81%A3%E3%81%9F%E6%99%82%E3%81%AE%E5%AF%BE%E5%87%A6%E6%B3%95/


自分のdocker-compose.ymlの設定を見てみると

```docker-compose.yml(一部抜粋)
services:
  app:
    build:
      context: .
# =========ローカルと本番切り替え===========
    #command: bundle exec puma -C config/puma.rb -e production
    command: bundle exec puma -C config/puma.rb
# ======================================
```

そもそもサービス名はwebではなくappでした。

そこで次は
```
docker-compose exec app bundle exec rails db:migrate
```

これでどうや！！
ハイ、無事に追加したカラムを更新することが出来ました。
bundle execって何気に使っているけど今度ちゃんと調べてまた記事にしよかな。
Python,Ruby,PHP,Java,JavaScript,Perlの条件分岐の比較 | プログラミング言語比較

<a href="https://qiita.com/yuki_kimoto/items/f9c2454e7f9130ddb003">Qiita > プログラミング言語の比較</a>


プログラミング言語Python,Ruby,PHP,Java,JavaScript,Perlの条件分岐の比較

# Python

https://qiita.com/Morio/items/1e06e7ac768758af5ffe

# Ruby

https://qiita.com/sagawashu/items/0f08266d5f72229423d9

# PHP

https://qiita.com/Hashimoto-Noriaki/items/dfb76d440a64eccba95d

# Java

https://qiita.com/setonao/items/ebc341ddf6d95295c48e

# JavaScript

https://qiita.com/taiju_suzuki/items/e2bf11fcf1645623235f

# Perl

https://perlzemi.com/blog/20161023147731.html
rbenvのインストールで失敗する

# 動作環境
M1 macboook pro
macOS Monterey ver.12.5

# 解決方法
ターミナルで`brew install rbenv`を実行すると、以下のエラーが表示する。
```
==> Downloading https://ghcr.io/v2/homebrew/core/pkg-config/manifests/0.29.2_3
Already downloaded: /Users/arakijun/Library/Caches/Homebrew/downloads/ac691fc7ab8ecffba32a837e7197101d271474a3a84cfddcc30c9fd6763ab3c6--pkg-config-0.29.2_3.bottle_manifest.json
Error: rbenv: Failed to download resource "pkg-config_bottle_manifest"
The downloaded GitHub Packages manifest was corrupted or modified (it is not valid JSON): 
/Users/(ユーザーネーム)/Library/Caches/Homebrew/downloads/ac691fc7ab8ecffba32a837e7197101d271474a3a84cfddcc30c9fd6763ab3c6--pkg-config-0.29.2_3.bottle_manifest.json
```

これは、 homebrewのキャッシュが原因のようなので、以下のコマンドをそれぞれ実行する。
```
$ brew cleanup
$rm -rf /Users/myusername/Library/Caches/Homebrew/downloads/*
```
途中で本当にキャッシュをクリアにするか聞かれるので"y"を入力すると、成功する。

その後、再度`brew install rbenv`を実行すると、rbenvのインストールに成功する。
【Windows11】タスクスケジューラで起動したプロセスがスリープ時に強制終了する（0x8007042B）

# TL;DR
.batファイルを使って間接的にアプリケーションを起動することで、タスクスケジューラから強制終了されることなく動作させることが可能。

# 事象
Surface Go 3（Microsoft Windows バージョン21H2 OSビルド22000.856）で起動時に管理者権限を必要とするアプリケーション（.exe）をタスクスケジューラを用いてログインと同時に起動することを試みた。

起動は成功したが、その後Surface Go 3をスリープさせると対象アプリケーションのプロセスが必ず無言で終了してしまう。イベントビューアにApplication Errorのエントリは記載されない。また、起動したいアプリケーションをタスクスケジューラではなく手動で実行してスリープ状態にした場合、10回ほどの試行で強制終了することはないことを確認。よってアプリケーションの問題である可能性は低いと判断。

タスクスケジューラの実行結果には「プロセスを途中で強制終了しました（0x8007042B）」と記載されるため、終了させている主体はタスクスケジューラと推測。

# 原因
タスクスケジューラから直接アプリケーションを実行した場合、当該アプリケーションが終了するまで「タスクが実行中」と判断するようだ。タスクスケジューラを見るとステータスとして「タスクは実行中です」と表示されるのが分かる。

明確な根拠はないが、タスクスケジューラはタスクの実行中に「本体がスリープ状態になる」など何らかの条件を満たすと、タスクに対応するプロセスを強制終了させる仕組みがあるのではないかと推測する。

# 対処方法
タスクスケジューラから直接アプリケーションを起動するのではなく、以下のような.batファイルを使って間接的にアプリケーションを起動させる。

```hoge.bat
@echo off
start "" "C:\apps\xxx\hoge.exe"
```

タスクスケジューラから見るとhoge.batの実行完了をもって「タスクの完了」とみなすためか、hoge.batが`start`させたhoge.exeについては関知しない。この方法で起動させるとスリープさせてもアプリケーションが無言で強制終了することはなくなる。

# 付記
タスクスケジューラによる起動のタイミングや条件が同じ場合、hoge.batに複数の`start`を列挙して同時にアプリケーションを起動することも可能。

```hoge.bat
@echo off
start "" "C:\apps\xxx\hoge.exe"
start "" "C:\apps\zzz\foobar.exe"
```
木（ツリー）構造

ファイルシステムやインターネットのドメイン名などは、いずれも木構造を用いて管理されています。

# ２分木というデータ構造
p５６４の図をみる。
木構造は以下の各要素で構成されています。
* 根（ルート）
* 枝（ブランチ）
* 節（節点、ノード）
* 葉（リーフ）

こっちにも図が書いてある。

http://www2.toyo.ac.jp/~y-mizuno/Lang/appendix/tree_structure.pdf

節から伸びる枝が２本以下であるものを```２分木```という。
左右それぞれ```左部分木```、```右部分木```という。

# 完全２分木
葉以外の```節が全て２つの子を持ち```、根から葉までの```深さが一様に等しい```２分木のこと。
* 1つの```親に対して常に2つの子```を持ち、枝分かれの最初から最後までに挟む```要素の数が全部同じ```なツリー構造のこと
    出典 https://wa3.i-3-i.info/word14924.html
* 2分木の木構造のうち、頂点（根）から最底辺（葉）に至る```全てのノードが2つの子ノードを持ち```、また、すべての```葉が根から等しい距離```にある構造のことである。
完全2分木は、```左右のノードの数が等しい```、木構造の```深さをnとすればノードの数は2n```となる、あるいは、完全2分木を2分探索木として探索（検索）する場合、```深さの数だけ探索可能であることがあらかじめ保証```されている、といった特徴がある。
完全2分木においては、```全ての葉は根から同じ深さ（レベル）```にある。ただし例外的に、```深さが1だけ異なる葉が存在し、その1だけ深い葉が木全体の左側に詰めてある```タイプの2分木も、完全2分木とみなされる。
    出典 https://www.sophia-it.com/content/%E5%AE%8C%E5%85%A8%E4%BA%8C%E5%88%86%E6%9C%A8

# ２分探索木
親に対する左部分木と右部分木の関係が、「左の子＜親＜右の子」となる２分岐を２分探索木という。
子はその部分木に含む全ての節を指す。
「左の子＜親＜右の子」はデータ量を示す。
左の子より右の子の方がデータ量を多く持っている。

## 気づき
２分木探索木は少し難しい。
もう少し問題を解きたい。
vistaでandroid studio

# 概要
vistaでandroid studio 0.8.0やってみた。
ドライバーのインストールで嵌まった。

# 経緯

vistaにandroid studio 0.8.0入れてた。
androidが３台ある。
necとht-03cとnexus 7
ht-03cのドライバーを入れるため、android_winusb.infを書き換えた。
ht-03cで、「ドライバーが見つからない。」
nexus7も、「ドライバーが見つからない。」

# 結論
android_winusb.infを、いじっちゃダメ。
sdk managerで、usbドライバーを削除して、再度インストール。
nexus 7だけ、インストールOK。
nec, ht-03aは、あきらめる。

以上。
powershellでメール送信

自分用のテンプレ。明日休みたいときに。
雑多な内容が含まれていますがご了承ください。

※以下の記事を大いに参考にさせて頂きました。ありがとうございます！
https://miajimyu.com/docs/powershell/powershell-tips/how-to-create-outlook-mail/ 


```powershell:mail.ps1
# 明日の日付を取得
$tommorow = (Get-Date).AddDays(1)

# 年月日を取得。Get-Date | Get-Memberも参照。
$yyyy = $tommorow.Year # $tommorow.ToString("yy"), $tommorow.ToString("yyyy")でも可
$mm = $tommorow.Month # $tommorow.ToString("M"), $tommorow.ToString("MM")でも可
$dd = $tommorow.Day # $tommorow.ToString("d"), tommorow.ToString("dd")でも可
$DayOfWeek = $tommorow.ToString("ddd") # $tommorow.DayOfWeekにすると英語になってしまう...

# 現在のパスを取得
$scriptPath = $MyInvocation.MyCommand.Path
$scriptDir = $(Split-Path -Parent $scriptPath)

# メッセージを表示
function ShowMessage($message){
    Add-Type -Assembly System.Windows.Forms
    [System.Windows.Forms.MessageBox]::Show($message)
}

# 入力ボックスを表示
function GetInputFromInputBox(){
    [void][System.Reflection.Assembly]::Load("Microsoft.VisualBasic, Version=8.0.0.0, Culture=Neutral, PublicKeyToken=b03f5f7f11d50a3a")
    $inputFronInputBox = [Microsoft.VisualBasic.Interaction]::InputBox("一言コメントをどうぞ", "コメント入力","※理由：急に温泉に行きたくなったため。")
    return $inputFronInputBox
}

function CreateMailByOutlook {
    $Outlook = New-Object -ComObject Outlook.Application
    $Mail = $Outlook.CreateItem(0)
    $Mail.To = $To
    $Mail.CC = $CC
    $Mail.Subject = $Subject
    $Mail.Body = $Body
    $inspector = $Mail.GetInspector
    $inspector.Display() 
}
 
function Main {
    CreateMailByOutlook
}

#ここから ##################################

# メッセージを表示
ShowMessage "休暇取得メールを作成します"

# コメントを入力
$comment = GetInputFromInputBox

# メール本文
$To = "sample1@example.com"
$CC = "sample1@example.com; sample1@example.com"
$Subject = "[勤怠連絡]明日休みます"
$Body = @"
皆さま

お疲れ様です。XXです。
突然ですが、明日$mm/$dd($DayOfWeek)はお休みを頂きます。

$comment

お手数おかけしますが、何卒よろしくお願いいたします。
"@

Main
```
【メモ】TypeScriptのInterfaceにはアクセス修飾子のプロパティとしてreadonlyしか定義できない

TypeScriptのInterfaceではprivateなmethodを定義できないらしいとのこと。
[参考記事 ](https://bobbyhadz.com/blog/typescript-property-is-private-in-type-but-not-in-type)

下記のようにprivate methodを含むinterfaceを定義した場合にはエラーが出る。
`Property is private in type 'X' but not in type 'Y' in TS`
```ts
// インターフェース定義
export interface AuthServiceInterface {
  loginCustomerAdmin(email: string, password: string): Promise<TokenResponse>
  createToken(userId:string): Promise<TokenResponse> // Private methodを定義すると実装クラスでエラーが出る
}

// 実装
export class AuthService implements AuthServiceInterface {
  public async login(body: LoginCustomerAdminDto): Promise<{ token: string }> {
    return { token: '' }
  }

  private async createToken(userId: string): Promise<{ token: string }> {
    // Token生成の処理
    return { token }
  }
}
```

なんも知らずに愚直にやってたら1時間ぐらい時間潰れたので、同じ内容で困っている人の解決になれば幸いです。
【Docker逆引き】やりたいこと・知りたいこと記事まとめ

# この記事の目的・背景
[こちら](https://qiita.com/mido_jin/items/7d9a6adbb43cdb16b90b)のPython用の記事と同様に**Docker関係**のまとめ的なものとして、筆者が１度調べた物をどんどん追加していきます。
重複が無いようには記載しますが、細かな部分で紹介する内容が異なっているが大元の情報（〇〇の仕方、など）が同様になっている可能性はあります。

# Docker
- Dockerfileのベストプラクティス（ビルドコンテキストの理解、不要な特権を避ける等）
    - https://www.forcia.com/blog/002273.html


# Docker Compose
- コンテナの起動順序を制御する
    - https://zenn.dev/togana/articles/12c18869a4eb29#service_healthy-%E3%82%92%E5%88%A9%E7%94%A8%E3%81%97%E3%81%9F-docker-compose.yml-%E3%81%AE%E4%BE%8B
- DBの起動を待ってからWEBアプリを起動する
    - https://qiita.com/shiena/items/47437f4f7874bf70d664
- Dcokerのコンテキストについて
    - https://qiita.com/sam8helloworld/items/e7fffa9afc82aea68a7a