OmniAICreator/Qiita-1.07M huggingface dataset:
InDesign スクリプト 索引の項目（見出し）を全て削除

索引の項目（見出し）を全て削除するスクリプトは、これで良いのかな・・・？

~~~JavaScript
/*
更新 2021/010/19
*/

// アプリ指定
#target "indesign";

// スクリプト名
var scriptName = "索引の項目（見出し）を全て削除";

//スクリプトの動作指定（一つのアンドゥ履歴にする、及び、アンドゥ名）
app.doScript(function(){

    // ダイアログ
    var dialogueFlg = confirm("アクティブドキュメントの索引の項目（見出し）を全て削除します。","", scriptName);

    // Noの場合
    if (dialogueFlg == false) {

        // 終了
        exit();
    }

    // 結果用
    var number = 0;

    // 索引の項目（見出し）の数だけ繰り返す
    for(var i = app.activeDocument.indexes.firstItem().topics.count() - 1; i >= 0; i--){
        
        // 見出しを削除
        app.activeDocument.indexes.firstItem().topics.item(i).remove();
        
        // 増やす
        number++;
    }

    // 結果表示
    alert("削除数 " + number);

//スクリプトの動作指定の続き
}, ScriptLanguage.JAVASCRIPT, [scriptName], UndoModes.ENTIRE_SCRIPT, scriptName);
~~~
Windows Server2019 に Chocolatey を使って git とPython3 などをインストールする

メモです。
Windows Server2019  環境に `git` や　`Python3` をインストールする必要ができたのですが、インストーラーを使うのが面倒なので調べた所、`Chocolatey` を使うと楽に出来るということでやってみました。

# Chocolatey とは

Linux の `yum` などのようにパッケージを PowerShell などからインストールするものと言う理解です

[chocolatey](https://chocolatey.org/)

>THE PACKAGE MANAGER FOR WINDOWS

# 使ってみる

自分は `PowerShell` を使って検証しました

## インストールする

以下にあるコマンドをコピペして `choco` をインストールする

[INSTALLING CHOCOLATEY](https://chocolatey.org/install)

成功すれば `choco` コマンドが使える

```
PS C:\Users\Administrator> choco --version
0.11.2
```

## パッケージをインストールしてみる

`git` をインストール。

```
choco install -y git
```

成功したものの、PowerShell 上でコマンドを認識しない。

[Chocolateyでのインストール直後にPATH変更を反映する](https://qiita.com/k1tajima/items/f7e02e3795963d34e635)
[How to refresh the environment of a PowerShell session after a Chocolatey install without needing to open a new session - Stack Overflow](https://stackoverflow.com/questions/46758437/how-to-refresh-the-environment-of-a-powershell-session-after-a-chocolatey-instal))

上記を参考に以下を実行

```
$env:ChocolateyInstall = Convert-Path "$((Get-Command choco).path)\..\.."
Import-Module "$env:ChocolateyInstall\helpers\chocolateyProfile.psm1"
refreshenv
```

これで `git` コマンドが PowerShell 上でも認識された

```
PS C:\Users\Administrator> git --version
git version 2.33.1.windows.1
```

Python についても同じ要領でインストールできた。

パッケージは以下から探せそうなのでここにあるものは `choco` コマンドを使うと楽にインストールできそう

[https://community.chocolatey.org/packages](https://community.chocolatey.org/packages)
【Swift】郵便番号が実在するかしないか確認するバリデーション

Swiftで郵便番号が実在するかしないか確認するバリデーション

他のAPIを使う必要がないのでやりやすいです。

```swift
//郵便番号のバリデーション
CLGeocoder().geocodeAddressString("0000000", completionHandler: {(placemarks, error) -> Void in
    //存在しない郵便番号
    if((error) != nil){
        print("存在しない郵便番号です")
    }
    else{
        //入力がすべて正しい
        print("成功")
    }
})

```

CLGeocoderを使ってエラーが出るか出ないかで判別。

入力する郵便番号はハイフン無しで文字列型なので注意が必要。

## おすすめ情報

https://wagtechblog.com/programing/swift-iphone-application-school

https://wagtechblog.com/programing/swift-textbook.html
Flutter_GenでSVGの画像を生成する方法 


今回は、Flutter_GenでSVGの画像を生成する方法を書いていきます。

# めっちゃ基礎

ちなみに、SVGとは、

```
Scalable Vector Graphics //大きさを変えられるベクター画像
```

だそうです。僕は全く知りませんでした。。。。



##　〇〇〇.svgの画像を生成できるようにしよう


今回は、svgの画像を生成する方法を書くので、初めから「flutter_gen」を使う方は、このリンクをお勧めします。


https://qiita.com/iseruuuuu/items/95c3026eb9342e0a9960



## ①「flutter_svg」を追加する。


この後の続きを記載していきます。
dart_packageにある「flutter_svg」を入れる必要があります。詳しくはこちら

https://pub.dev/packages/flutter_svg/install


とりあえず、ターミナルで以下のコマンドを打っていきましょう。

```
flutter pub add flutter_svg
```

```dart
dependencies:
  flutter_svg: ^0.23.0+1　 #最新のバージョン
```




## ②pubspec.yamlに色々と追加していく


```dart:pubspec.yaml

  # image
  flutter_svg: ^0.23.0+1

#この３行が必要！！
flutter_gen:
  integrations:
    flutter_svg: true　　　 #ここ！！！

dev_dependencies:
  flutter_test:
    sdk: flutter
  flutter_lints: ^1.0.0
  build_runner: ^2.1.4
  flutter_gen_runner:

flutter:
  uses-material-design: true
  assets:
    - assets/images/

```


前回使ったものもついでに入れておきました。


これが追加できたら、また、ターミナルでコマンドを打ちましょう。

```
flutter packages pub run build_runner build
```

# ③ 使ってみよう


svgの使い方ですが、最後に`svg()`を追加するだけで使えます。

```
Assets.images.~~~.image.svg();
```


とりあえず、完成？です。
【Swift】Firebaseでログアウトするコード

SwiftでFirebaseからログアウトするコード（メモ）

```swift
Auth.auth().signOut()
```

エラーを検出したい時は以下の通り。

```swift
do {
    try Auth.auth().signOut()
}
catch let error as NSError {
    print(error)
}

```

https://firebase.google.com/docs/auth/ios/custom-auth?hl=ja

## Swiftのお役立ち情報

https://wagtechblog.com/programing/swift-iphone-application-school

https://wagtechblog.com/programing/swift-textbook.html
Rails5技術者認定ベーシック試験に落ちてきた！

Rails5 ベーシック試験普通に落ちました。。やったこととか、この箇所がテストに出てきたなとか覚えている限りでメモします。

結果 21/40 = 51%くらい？　

合格まで、あと 7 問足りませんでした。

ちなみに Rails5 の試験って模擬試験とか問題集なくて、仕方なく Rails4 ブロンズの模擬試験回してたんですけど、こちらで 5 回連続 900 点台とかとってもダメダメでした。
[Rails4 技術者認定ブロンズ模擬試験サイト](https://diver.diveintocode.jp/dive_into_exam)

テスト内容としては、これ分かる！ というような基本的な部分も割と出ています。
多分そういうところで得点を稼いでいます。

分かったか怪しいところとしては

- action や model や job の先祖のどこが何を継承しているのか。(::Base 付くんだっけ？　とか[正解はこちら](https://Railsguides.jp/upgrading_ruby_on_Rails.html#Rails-4-2%E3%81%8B%E3%82%89Rails-5-0%E3%81%B8%[…]83%E3%83%97%E3%82%B0%E3%83%AC%E3%83%BC%E3%83%89)）

- test DB の drop コマンド（rails db:test:drop を選んでしまったけど違う気がする。。ほかの選択肢は思い出せない）

- バリデーションの問題

- 使ったことのないメソッド（思い出せない。。）

- test 結果で pass と出る spec 内の文章

- ActionCable と ActiveJob（コールバック 2,3 問くらい出た気がします）

思い出せるだけ書いてこんなところです。。
受験した感想としては、Rails を体系的に学びなおそう！　という意識ができて、勉強も多少できて良かったです。
けれど、模擬試験や問題集もなく、公式からの情報も止まっている感じで、1 万という安くない受験料を払う価値があるのか？です。
ので、次受けても受かるかわかりませんし、Rails ベーシックの勉強はひとまず終わりにしようと思います。
Macのパスに関する備忘録

## パスを通しても元に戻ってしまう
とあるツールをインストールし「さてパス通すか！」と以下を実行。

```
echo 'export PATH=$PATH:/Documents/tool/bin' >> ~/.bash_profile
source ~/.bash_profile
```
※パスは例です

コンソールを再度立ち上げてパスを確認。

```
echo $PATH
/opt/homebrew/bin:/opt/homebrew/sbin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
```

無いやん。。。
シェルを確認する。

```
echo $SHELL
/bin/zsh
```
bashじゃないやん。。。
ということで

```
echo 'export PATH=$PATH:/Documents/tool/bin' >> ~/.zprofile
source ~/.zprofile
```
bash_profileではなくzprofileに書き込んで解決。
【ＰＨＰ】高等技術なコントロールブレイク

```PHP
<?php

$res = [
    ['name' => '田中',  '国語の点数' => 777],
    ['name' => '渡部',  '国語の点数' => 62],
    ['name' => '品川',  '国語の点数' => 23],
    ['name' => '品川',  '国語の点数' => 4343],
    ['name' => '滝谷',  '国語の点数' => 93],
    ['name' => '川原田','国語の点数' => 55],
    ['name' => '一色',  '国語の点数' => 27],
    ['name' => '一色',  '国語の点数' => 89],
    ['name' => '高橋',  '国語の点数' => 555],
    ['name' => '高橋',  '国語の点数' => 9999],
];


foreach ($res as $val) {
    $name = $val['name'];
    $abc = (int)$val['国語の点数'];
    if(empty($data[$name]['国語の点数'][$abc])){
        $data[$name]['国語の点数'][$abc] = $abc;
    }
}

var_dump($data);

```

#結果
```
array(7) {
  ["田中"]=>
  array(1) {
    ["国語の点数"]=>
    array(1) {
      [777]=>
      int(777)
    }
  }
  ["渡部"]=>
  array(1) {
    ["国語の点数"]=>
    array(1) {
      [62]=>
      int(62)
    }
  }
  ["品川"]=>
  array(1) {
    ["国語の点数"]=>
    array(2) {
      [23]=>
      int(23)
      [4343]=>
      int(4343)
    }
  }
  ["滝谷"]=>
  array(1) {
    ["国語の点数"]=>
    array(1) {
      [93]=>
      int(93)
    }
  }
  ["川原田"]=>
  array(1) {
    ["国語の点数"]=>
    array(1) {
      [55]=>
      int(55)
    }
  }
  ["一色"]=>
  array(1) {
    ["国語の点数"]=>
    array(2) {
      [27]=>
      int(27)
      [89]=>
      int(89)
    }
  }
  ["高橋"]=>
  array(1) {
    ["国語の点数"]=>
    array(2) {
      [555]=>
      int(555)
      [9999]=>
      int(9999)
    }
  }
}

```
睡蓮花のBigをBigにするブックマークレット

## 背景
https://togetter.com/li/1789992

## スクリプト

```javascript
javascript:(function(){var a = document.querySelector("#left > div > section > section:nth-child(2) > div.contents_box.mb40 > div > div > article > div > div > p");a.innerHTML = a.innerHTML.replaceAll("＜", "<");})()
```

上記をお気に入り追加して、 https://music.oricon.co.jp/php/lyrics/LyricsDisp.php?music=61783 を開いて実行すれば、砂浜 big Wave!
IBMCloud NetScaler SSL証明書更新ダウンタイム

##目的
IBM Citrix Netscaler VPXを利用した際のSSL証明書更新時に通信断がどの程度発生するか確認してみた。

##環境
* ローカル端末：macOS BigSur 11.6 1台
* プラットフォーム:IBMCloud
    * ロードバランサ:Citrix NetScalerVPX NS11.1: Build 64.14.nc 1サービス
    * DNSサービス:IBMCloud DNS 1サービス
    * 接続先サーバ:CentOS 7.7.1908(Virtual Server for Classic) 2台

###概要構成図
![kou検証_日々更新.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/3f73061c-eff8-06ea-29a3-fc9b4c672164.png)

[疎通確認先]
①代表サービス(https)
→WebSV01
→WebSV11

###疎通確認方法
```
スクリプトで延々curlさせた状態で、プライマリをリブート

#!/bin/sh

URL="https://vpx.xcloudyx.com"; #接続先
HEAD="Content-Type:text/xml"; #リクエストヘッダー

for i in {0..10000}
do
    SETDT=`date "+%Y%m%d%H%M%S"`
    curl -w "gettime:%{time_total}\n " -H $HEAD $URL;
    sleep 0;
done

```

###結果
Webサービスへのダウンタイムはなし
また、vpx管理IPなどへのダウンも特に発生しなかった。

```
gettime:0.078819 sv01
gettime:0.081968 sv11
gettime:0.084828 sv01
gettime:0.078648 sv11
gettime:0.096067 sv01
gettime:0.083189 sv11
gettime:0.074361 sv01
gettime:0.070263 sv11
gettime:0.077303 sv01
gettime:0.067488 sv11
gettime:0.076169 sv01
gettime:0.068474 sv11
gettime:0.074911 sv01
gettime:0.074682 sv11
gettime:0.073917 sv01
gettime:0.071079 sv11
```
Slack：スレッドにおけるメッセージの親子関係をSlack APIで判別するには

SlackのスレッドのメッセージをSlack API取得するには、 `conversations.replies` (https://slack.com/api/conversations.replies) メソッドを利用します。 

このメソッドを利用することで、親メッセージに関連するスレッド内の子メッセージを取得することや、子メッセージに対応する親メッセージのメッセージID（ `thread_ts` ）を取得することができます。

また、指定されたメッセージがスレッドの親であるのか、子であるのか、あるいはスレッドではない独立したメッセージあるのかを判断することができます。今回は、そのメッセージがスレッドであるか・スレッドではないかと、スレッドの親メッセージであるか・スレッドの子メッセージではないかをSlack APIで判別できるか確認してみました。

## スレッドではない（単一メッセージ）の場合

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/a6a312ef-8995-2448-88bd-43c24783ef8c.png)


当該メッセージのメッセージID（ `ts` ）をクエリ引数にセットすることで、結果を取得することができます。

この場合、スレッドではないため `thread_ts` は出力されません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/91762308-5a4f-2b19-3951-72a538598c4d.png)


## スレッドの親メッセージの場合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/c6ed61e3-0f1b-142b-003c-8f36c75954b3.png)



スレッドの親メッセージのメッセージID（ `ts` ）をクエリ引数にセットすることで、結果を取得することができます。

親メッセージもスレッドの一部であるため、スレッド親メッセージに`thread_ts` が出力されます。また、 `thread_ts` と `ts` の値は同一となりますので、これによりスレッドの親メッセージあることを判別することができます。

また、スレッドの子メッセージもあわせて取得されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/35d0cca2-f303-f974-68aa-01db10f38d11.png)

## スレッドの子メッセージの場合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/6424c6e9-c4bd-efe4-b4a4-da12b9e84dfb.png)

スレッドの子メッセージのメッセージID（ `ts` ）をクエリ引数にセットすることで、結果を取得することができます。

親メッセージのメッセージIDは、 `thread_ts` として出力されます。また、親メッセージとは異なり `thread_ts` と `ts` は一致しませんので、これによりスレッドの子メッセージであることを判別することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/21c8b8e7-8df1-0a27-374f-76dc98f9bf70.png)


# 参考

https://api.slack.com/methods/conversations.replies
DOTween導入時にアセンブリ参照エラーが起きたときの解決時メモ

#環境
Unity:Unity2019.4.29f1
OS:Windows10Pro
DoTween:DOTween_1_2_632

# 発生事象

```
The type 'TweenerCore<,,>' is defined in an assembly that is not referenced. You must add a reference to assembly 'DOTween, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'. [Assembly-CSharp]
```

UnityPackageManagerから導入したら上記エラーが発生


# 解決手法
UnityPackageManagerの使用をやめて直接[ダウンロード](http://dotween.demigiant.com/download.php)した。
次に`DOTween_1_2_632.zip`がダウンロードされるので解凍する。
解凍されると`DOTween_1_2_632`が展開されるので中にある`DOTween`を確認する。
UnityPackageManagerだと直接/pluginsディレクトリに展開されるが手作業で/Assets直下に`DOTween`フォルダごとドラッグアンドドロップする

極めて簡単な手法だけどPackageManagerから直接展開してこれにハマると相当パニックになるので忘備録も兼ねてメモ


# 参考
https://github.com/Demigiant/dotween/issues/480

先人に感謝
なでしこで2DRPGを作ろう! #1 メインウィンドウ作成

# はじめに
最近、「中学の教科書になでしこが採用された」というニュースを聞きまして、なでしこでこんなことができるよって感じでこの記事を書いてます。

# なでしこで2DRPGを作ろう!
- <a href="https://qiita.com/naoki-iso/items/060bfa9dca4ef263d33c">#0 環境作成</a>
- <a href="">#1 メインウィンドウ作成</a>

# 準備
まず、作業フォルダから作成します。場所はどこでもいいのですが、今回は作業しやすいように、デスクトップに作成します。![#1-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647752/8244e3a0-1735-fa17-ec27-8a1442bb9811.png)
フォルダ名は適当に、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647752/1069247c-0709-0b09-7c2a-7d6039d28fc2.png)

# メインウィンドウ作成
今回は、図のように32bitのドット絵を縦15マス×横17マスに配置します。また、なでしこでは、メインウィンドウを母艦と表現します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647752/4fac5562-666d-cfb5-1c6f-4fb147ffaa87.png)
これが、母艦を作成するプログラムです。

```
# 母艦
母艦のタイトルは、｢simpleRpg｣
## 母艦のサイズ
母艦の高さは、519
母艦の幅は、560
## 母艦の位置
母艦のXは、(デスクトップW - 母艦の幅)/2
母艦のYは、(デスクトップH - 母艦の幅)/2
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647752/b19e133a-5aef-a3f4-53c8-2edcda4f8d90.png)

このファイルを先ほど作成したフォルダに保存します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647752/deb14a6d-d4de-8f40-2a89-5b9e2901e561.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647752/0db8d7b2-1c7d-a345-1127-b7f277c13a0b.png)

保存出来たら実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647752/a263a66c-3810-f902-c9f7-78121968836c.png)

このような画面が出てきたら成功です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647752/7445288f-5e25-ea3f-94d3-4afb6018760b.png)

## プログラム解説
#### 1行目
`# 母艦`
これは、コメントと言って、#の後ろはプログラムに認識されません。

#### 2行目
`母艦のタイトルは、｢sample rpg｣`
「〇は、△」は、〇という変数（箱みたいなもの）に△というものを入れる（代入する）という構文です。つまり、`母艦のタイトルは、｢sample rpg｣`は、「母艦のタイトル」という変数（厳密には違いますが）に、「sample rpg」という値を代入しています。

#### 3行目
`## 母艦のサイズ`
1行目と同じ、コメントです。

#### 4行目
`母艦の高さは、519`
母艦の高さを519に設定します。

#### 5行目
`母艦の幅は、560`
母艦の幅を560に設定します。

#### 6行目
`## 母艦の位置`
1行目、3行目と同じ、コメントです。

#### 7行目
`母艦のXは、(デスクトップW - 母艦の幅)/2`
母艦のX軸（横）の位置を調整しています。デスクトップWは、現在表示しているディスプレイの幅を取得しています。

#### 8行目
`母艦のYは、(デスクトップH - 母艦の幅)/2`
母艦のY軸（縦）の位置を調整しています。デスクトップHは、現在表示しているディスプレイの高さを取得しています。

# 更新履歴
2021/10/19 公開

# おわりに
今回は、メインウィンドウの作成をしました。次回はタイトル画面の作成や、マップの作成などをやりたいな、と考えていますが、いつ公開するか未定なので気長に待ってくれたらなと思います。最後に、誤字脱字やおかしな点があったらコメント欄で指摘してくれたらうれしいです。
MariaDBで日本語入力を行う

EC２インスタンスで、MariaDBをダウンロードした後、データベースに日本語のデータを入れたかったのですが、その際にすべて？？？で表記されるということが起こりました。その際に対処したコマンドと内容を載せておきます。

```
export LC_ALL=ja_JP.UTF-8

export LANG=ja_JP.UTF-8

cd /etc/my.cnf.d/

cp server.cnf server.cnf.org

vi server.cnf

------------------------------
[mysqld]
character-set-server=utf8
------------------------------

systemctl restart mariadb
```
この設定をすれば、日本語入力の文字化けが解消されるかと思います。
[Qiita 様依頼事項]なぜ Qiita を選んだか

# なぜ Qiita を選んだか

|   | Qiita | Blogger | はてな | Zenn | Codoc | note |
|---|---|---|---|---|---|---|
| ***セキュリティ***  | ○  | ◎  | △ | ○  | ○  | △  |
|  集客性 | ◎  |  ○ | ○  | △  | △  | ◎  |
|  記事の対象 | △（エンジニア）  | ◎（何でも）  | ◎（何でも）  | △（技術）  | △（技術）  | ◎（何でも）  |
|  性能 | ○  |  ◎ | ○  | ○  | ○  | △  |
|  マネタイズ | ×  | ◎  | △  | ○  | ○  | ◎  |
| 独自ドメイン  | ×  | ◎ | ◎  |  × | ×  |  △（ほぼ法人向けの価格設定 |
| デザイン（テーマ）  |  △ | ◎  | ◎  |  ○ | ○  | ○  |
|  自由さ（スクリプトの実行可能性等） | ×  | ◎  | ◎  |  分からない | ○  | 分からない  |

セキュリティ->集客性->記事の対象... と私の中の優先順位を基に評価して、技術系のブログなら Qiita が一番と結論付けた。
vistaでstm32duino その15

#概要

vistaでstm32duinoやってみた。
rgbled、やってみた。

#サンプルコード

```
#define G0			12
#define R0			0
#define B0			0
#define L_NUM 		7
char l[L_NUM * 3];

void bit_off() {
	digitalWrite(PC13, HIGH);
	digitalWrite(PC13, LOW);
	digitalWrite(PC13, LOW);
}

void bit_on() {
	digitalWrite(PC13, HIGH);
	digitalWrite(PC13, HIGH);
	digitalWrite(PC13, LOW);
}

void ws_led() {
	for (char ii = 0; ii < (L_NUM * 3); ii++)
	{
		if (l[ii] & 0b10000000)
		{
			bit_on();
		}
		else
		{
			bit_off();
		}
		if (l[ii] & 0b01000000)
		{
			bit_on();
		}
		else
		{
			bit_off();
		}
		if (l[ii] & 0b00100000)
		{
			bit_on();
		}
		else
		{
			bit_off();
		}
		if (l[ii] & 0b00010000)
		{
			bit_on();
		}
		else
		{
			bit_off();
		}
		if (l[ii] & 0b00001000)
		{
			bit_on();
		}
		else
		{
			bit_off();
		}
		if (l[ii] & 0b00000100)
		{
			bit_on();
		}
		else
		{
			bit_off();
		}
		if (l[ii] & 0b00000010)
		{
			bit_on();
		}
		else
		{
			bit_off();
		}
		if (l[ii] & 0b00000001)
		{
			bit_on();
		}
		else
		{
			bit_off();
		}
	}
}
void ws_led_cl() {
	for (char ii = 0; ii < (L_NUM * 3); ii++)
	{
		bit_off();
		bit_off();
		bit_off();
		bit_off();
		bit_off();
		bit_off();
		bit_off();
		bit_off();
	}
}
void setup() {
	pinMode(PC13, OUTPUT);
	pinMode(PA0, INPUT_PULLUP);
	for (char ii = 0; ii < L_NUM; ii++)
	{
		l[(ii * 3) + 0] = G0;
		l[(ii * 3) + 1] = R0;
		l[(ii * 3) + 2] = B0;
	}
}
void loop() {
	if (digitalRead(PA0) == 0)
	{
		ws_led_cl();
	}
	else
	{
		ws_led();
	}
	delay(100);
}





```

#配線

vdd - 3.3v
gnd -gnd
data - PC13

以上。
アノテーションツール：CVAT導入法

# 実行環境
windows10

# LabelImgと比較したときのCVATの評価
###メリット
・１つサーバを立ててしまえば、URLにアクセスするだけなので、共同作業の進捗管理がしやすい
・Autoannotationができる。自作のモデルや標準装備モデルの選択をすることで、かなり効率が上がることが期待される。

###デメリット
多機能ゆえに覚えることや邪魔なものが少々ある。

# 作業環境
CVATにはWEB版とアプリケーション版がある。
下記以降で、アプリケーション版は試してみたが、windowsではautomatic annotationができなかった。
特にこだわりがなければ、WEB版でいいと思う。というか、アプリ版のメリット何だ。

https://cvat.org/


# CVATインストール手順
###1. WSL2をインストールする。
```powershell:cmd
wsl --install -d ubuntu
```
https://docs.microsoft.com/ja-jp/windows/wsl/install


###2. Docker for windowsをインストールする。
インストールして起動しておく。
起動しようとすると、グループに入っていないと怒られた場合、
[画面左下windowsマーク右クリ]>[コンピュータの管理]>[ローカル　ユーザとグループ]>[グループ]>[docker-users]>[追加]>[ユーザ名入力]>[適用]>[再起動]>[docker for win起動確認]

https://docs.docker.com/desktop/windows/install/

###3. Gitをインストールする。
↓クリックして実行
https://github.com/git-for-windows/git/releases/download/v2.21.0.windows.1/Git-2.21.0-64-bit.exe


###4. GoogleCromeをインストールする。
https://www.google.com/chrome/


###5. コマンド打ちまくる
ここからGitBash
[windowsマーク 右クリ]>[GitBash]

```powershell:GitBash

# Clone CVAT source code
git clone https://github.com/opencv/cvat
cd cvat

# Run docker containers
docker-compose -f docker-compose.yml -f docker-compose.dev.yml build
docker-compose up -d

# create superuser
winpty docker exec -it cvat bash -ic 'python3 ~/manage.py createsuperuser'

```

### 6.ブラウザからアクセス
http://localhost:8080/

https://openvinotoolkit.github.io/cvat/docs/manual/

### 7.taskの作成
taskタブから作成できれば環境構築成功！

# 次回以降の起動

```powershell:GitBash
# cvatディレクトリに移動
cd cvat
# サーバー起動
docker-compose up -d
```
アクセス　http://localhost:8080/

# 注意事項
```powershell:GitBash
# 変更なし時の起動
docker-compose -f docker-compose.yml -f components/serverless/docker-compose.serverless.yml up -d

# 変更してたら、ビルドして起動
docker-compose -f docker-compose.yml -f components/serverless/docker-compose.serverless.yml up -d　-build

# サーバダウン
docker-compose -f docker-compose.yml -f components/serverless/docker-compose.serverless.yml down
```


# automatic annotationの機能の追加に挑戦（失敗）
サーバ落ちてることを確認


nuclioをPCへインストール
（cvatディレクトリに置いておいた）
https://github.com/nuclio/nuclio/releases/tag/1.5.16


バージョンが一致していることを確認
cvatディレクトリを確認
cvat/components/serverless/docker-compose.serverless.yml


この先からうまく動きませんでした。この順番にコマンドをうつらしいけど、そもそもwindowsでsudoは反応しない。Linux前提かな
sudo chmod +x nuctl-<version>-linux-amd64
sudo ln -sf $(pwd)/nuctl-<version>-linux-amd64 /usr/local/bin/nuctl

nuctl create project cvat
EC2インスタンスにFFFTPからアプリケーションをアップロード

自身のローカル（自分のパソコン）においてあるアプリケーションをEC２インスタンスにアップロードする際の設定方法について紹介したいと思います。

1.インスタンスにFTPサーバを構築
下記コマンドを入力しFTPサーバを構築します。

```
useradd ftp-user
passwd ftp-user
mkdir -p /var/www/ftp_dir
chown ftp-user /var/www/ftp_dir
chmod 755 /var/www/ftp_dir
yum install vsftpd -y
cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.org
```
vi /etc/vsftpd/vsftpd.conf
追記・編集

```
------------------------------------------全体の設定
anonymous_enable=YES
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
chroot_local_user=no
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list
listen=YES　　　　　　　　
listen_ipv6=NO　　　　　　
pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES
pasv_enable=YES
pasv_address=グローバルIPアドレス
pasv_min_port=60001
pasv_max_port=60010
force_dot_files=YES
use_localtime=YES
user_config_dir=/etc/vsftpd/user_conf
allow_writeable_chroot=YES
-----------------------------------------------
```
特に、下記の設定をしておかないとFFFTPからFTPサーバに入ることができません。
私はこれが分からず、１時間くらいFTPサーバに費やしてしまいました。

```
listen=YES
ipv6listen=NO
```

FTPの接続用にユーザの登録
vi /etc/vsftpd/chroot_list
追記

```
ftp-user
```

ユーザの設定ファイルを作成します

```
mkdir /etc/vsftpd/user_conf

vi /etc/vsftpd/user_conf/ftp-user
#追記
-----------------------------------------------
local_root=/var/www/ftp_dir
-----------------------------------------------
```

サービスを起動させていきます。

```
systemctl start vsftpd
systemctl enable vsftpd
```

FTPがlocalhostでログインすることができるかどうか確認します。

```
yum install lftp
touch ftp_test
lftp ftp-user2@localhost
```

以上のコマンドを入力して、
＞
のマークが出てきていたらOKです。


続いてローカルからアップロードするために、FFFTPをダウンロードします。
↓のさいとから64bitのFFFTPをダウンロードします。
https://forest.watch.impress.co.jp/library/software/ffftp/

ホスト一覧の新規ホストをクリックし下記を設定していきます。

・ホストの設定名は自由に入力
・ホスト名（アドレス）部分はEC2インスタンスのグローバルIPアドレスを指定
・ユーザ名は自身で作成したFTPサーバのユーザ名を登録（ftp-user)
・パスワードはFTPサーバのユーザのパスワード

あとはローカルからアップロードしたいファイルを選択して、右側にドラッグすればアップロードをすることができます。
アップロードが完了した際には、

```
lftp ftp-user@localhost
get ファイル名
```

で、ftpサーバに接続し、localhostにファイルをダウンロードすることができます。
この時の注意なのですが＜FFFTPで複数のファイルが入ったフォルダをアップロードしてしまうと、ダウンロードすることができません。複数のファイルをアップロードするには、必ずフォルダをzipファイルなど、圧縮してからアップロードするようにしましょう。

参考記事
https://qiita.com/yoshiokaCB/items/313fa290832a0afa4544
vistaでstm32duino その14

#概要

vistaでstm32duinoやってみた。
ニューラルネット、やってみた。

#サンプルコード

```
double w1[12] = {0.6203325, -1.027319, 1.8841791, -3.2817535, 1.2214272, 0.9679314, 1.4196726, 7.171823, 1.3714954, 3.7268815, 0.0598045, 1.1944624};
double b1[12] = {1.1656082, -2.0180476, -6.9387307, 3.3653135, -1.7032033, -2.8969588, 0.0565524, -9.5316219, -5.7146306, -2.8060255, -0.3085915, -6.3642092};
double w2[12] = {-1.2655445, -1.0401167, 0.2071615, -0.4695872, -2.6633599, -0.5835096, 1.2490041, 1.2825323, -1.5088843, 0.6767025, 0.0224434, 1.6849496};
double b2 = -0.2928229;
int i;

double tanh(double x) {
	if (x > 20)
		return 1.0;
	else if (x < -20)
		return -1.0;
	else
	{
		double a = exp(x);
		double b = exp(-x);
		return (a - b) / (a + b);
	}
}

void setup() {
	Serial.begin(9600);
	i = 0;
}
void loop() {
	int j;
	i++;
	if (i > 20)
		i = 0;
	double x = i / 3.0;
	double sum = 0;
	double d[12] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
	for (j = 0; j < 12; j++)
	{
		d[j] += w1[j] * x + b1[j];
	}
	for (j = 0; j < 12; j++)
	{
		d[j] = tanh(d[j]);
	}
	for (j = 0; j < 12; j++)
	{
		sum += w2[j] * d[j];
	}
	sum += b2;
	sum = tanh(sum);
	Serial.println(sum);
}





```

#結果

![sin.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/d309797d-db95-c1d9-280e-8aadf156758b.jpeg)


以上。
vistaでstm32duino その13

#概要

vistaでstm32duinoやってみた。
timer、やってみた。

#サンプルコード

```

uint8_t toggle = 0;

void handler(void) {
	toggle ^= 1;
	digitalWrite(PC13, toggle);
}

void setup() {
	TIM_TypeDef * Instance = TIM1;
	HardwareTimer * MyTim = new HardwareTimer(Instance);
	pinMode(PC13, OUTPUT);
	MyTim->setOverflow(10, HERTZ_FORMAT);
	MyTim->attachInterrupt(handler);
	MyTim->resume();
}

void loop() {

}




```

以上。
【誰でも簡単に】Win11の右クリックメニューをWin10の仕様に戻す方法


![Snipaste_2021-10-19_10-58-44.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147688/87aa8d11-a596-282b-980d-155d5a2494af.jpeg)

Windows 11は右クリックしたときに表示されるコンテキストメニューの刷新もあるんですが、

「`その他のオプションを表示`」をクリックすると以前のコンテキストメニューがそのまま出てくる二度手間仕様...

これを誰でも簡単にWin10とWin11のコンテキストメニューを切り替えする方法を紹介します。

## 設定方法

#### Step 1 

以下のコマンドはメモ帳で保存して、ファイル名は「切り替え.bat」とします。

```cmd

@echo off

:start

cls

echo,

echo 右クリックメニュー切り替え

echo,

echo 0 現状のまま

echo,

echo 1 Windows 10バージョン

echo,

echo 2 Windows 11バージョン

echo,

echo,

choice /c:120 /n /m:"切り替え番号を入力してください（1/2/0）："

if %errorlevel%==0 exit

if %errorlevel%==2 goto cmd2

if %errorlevel%==1 goto cmd1

exit

:cmd1

reg.exe add "HKCU\Software\Classes\CLSID\{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}\InprocServer32" /f /ve

shutdown -l

exit

:cmd2

reg.exe delete "HKCU\Software\Classes\CLSID\{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}" /f

shutdown -l

exit
```

#### Step 2

管理者権限で保存された「切り替え.bat」を実行します。

#### Step 3
![Snipaste_2021-10-19_11-15-25.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147688/180feeac-ad3d-42be-237e-d9a1722d5311.jpeg)

指示通りに希望の番号を入力すると、自動的にサインアウトします。

再ログインしたら、コンテキストメニューは希望通りに変更すると思います。

何かしらお役に立てれば幸いです。
vistaでstm32duino その12

#概要

vistaでstm32duinoやってみた。
attachInterrupt、やってみた。

#サンプルコード

```

uint8_t toggle = 0;

void blink() {
	toggle ^= 1;
	digitalWrite(PC13, toggle);
}

void setup() {
	pinMode(PC13, OUTPUT);
	pinMode(PA0, INPUT_PULLUP);
	attachInterrupt(PA0, blink, CHANGE);
}

void loop() {
}

```

以上。
Spring Framework 学習資料

![0_Q8ax33ctjsEfRRlg.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2173896/73e5e745-2f95-03df-dd45-44b6b81249d1.png)

## 概要
Spring Frameworkを学ぶための、環境構築方法までを含めた学習資料です。
資料はPDF化されていて、サンプルコードもセットになっています。
Springの基本である、DI(Dependency Injection)やAOP(Aspect Oriented Programming)はもちろん、他に押さえておくべき基本的なポイントは網羅されています。
これからSpringを学びたい方にとっては、ぴったりな教材だと思います。

## 資料の保存先
https://github.com/GL-Kageyama/Spring_Boot_Learning_Collection

※適宜、ダウンロードなどを行ってください。

## 内容

### 第１章 Eclipse環境構築
Eclipse環境構築 in Spring Boot.pdf

### 第2章 SpringBoot基本学習
SampleCode
Spring Boot 基本学習.pdf

### 第3章 データベース連携
SampleCode
データベース連携 in Spring Boot.pdf

### 第4章 アスペクト指向プログラミング
SampleCode
アスペクト指向プログラミング in Spring Boot.pdf

### 第5章 DIコンテナ
SampleCode
DIコンテナ in Spring Boot.pdf

### 第6章 MyBatis
SampleCode
MyBatis in Spring Boot.pdf

### 第7章 JUnit+Mockito
SampleCode
JUnit + Mockito in Spring Boot.pdf

### 第8章 REST API
SampleCode
REST API in Spring Boot.pdf

### 第9章 Appendix
Spring Tool Suite 環境構築.pdf
【Docker 】app_1 | Could not find (gem.lock名) エラーの解決方法

# 概要

docker　×　railsでdokcker compose upした際に**「Could not find (gem.lock名)〜」**というエラーが発生した。
bundle install　時にgemのインストールが失敗しているとのこと。

別の人の環境では動いたので、記述は間違ってない。
dockerのvolumeを削除してみる。

# 環境
・MacOS Apple M1 バージョン11.4
・Docker 20.10.7
・Ruby 2.5.9
・Rails 5.2.6

# volumeとは
ボリュームとは、データを永続化できる場所のこと。
**「名前付きボリューム」**と**「匿名ボリューム」**があり、名前付きボリュームの場合は Docker ホスト内で名前解決できるため、アクセスしやすい。
匿名ボリュームは適当にハッシュ値が振られる。
他のプロセスからはさわれないので安全。基本はこれを使うのがよい。

## dockerのvolumeの中身を見る

```
% docker volume ls
```

```
DRIVER    VOLUME NAME
local     3af7cc07ae15f717d55dcea4dc3５6c19247e3d72a4f347b41eca2050578569bf
local     02abf414f65facb0cc4538c873818５68de2134dec2bcdcb9cbec13f3d017e8a3
local     5c6f637deeb7377eb7b4f1c9f839bc4５10037089a778d813ddb6bcdd0d6fd856
local     4ec65427bac8ab1ca050e4e32819755５34d99ae7aa587c0c0c661269751519b8
local     8ff3d7837fab59bcf5ad35e2d6957５30832476256acafc4cd1823ad7b079323e
local     9674a4ab5a4ba4389a15f6c9cbcd2a9410c68d0e7af9f863b21e721787beae53
local     8413aaeaef3255be669cf５a34db05cdaeae94f770e1875b95232b8700b7a0e38
local     be4abc0053855dd62de3adb3e5304e7f0a81af9b020e6451５b98951fc29dc215
local     ce84c2d173df0b00b５f59179b2d37c4c92b14ed1e79f4da6f6ced2aab5a39548
local     db2896426db9f403５82487693a7f844940f99ce1e9a8732b07087a4b776b0a27
local     fbe080cb2f3b6d923f80d1ce29171c2979f5a5df9df５b38d77b13f50fe9d8f96
local     ffa7b0f82a588661c0109b39a1b82015359a42５49f6cc236276bbb812c50072b
local     gaa48f5287da42614b2259ab6310c8c５f2c438a318ad29a272881146bcd46479
local     gb9a6e857ca8e828ec80a872c9e934323c0５04ac7ac18b8f8d848a2ac8eae5d2
local     gc5f79f016bad0e1d33992ac6５049c1cc2fddc70e1dc6c192ae7e37ccac48b79
local     g9b4706c13fe06e327fe2b５b8b121a0c110ecdc49304196737f5725f14c2aa99
local     g76d2e4d4fbb3312５1b380c67fc9581d275305f66ce979cffc8d176dbce23f18
local     h357cd3c0f3dd302ddd66f7d898e8eb54715cb4f8b864f37ee５6dc80deaeb2f3
local     (ファイル名)_bundle
local     (ファイル名)_node_modules
local     (ファイル名)_rails_cache
```
このようにvolumeの中身が見れました。

自身の開いているファイルのvolumeをそれぞれ削除していきます。

## それぞれvolumeを削除する

```yml:docker-compose.yml
volumes:
  rails_cache:
  node_modules:
  bundle:
```

volumeの中身とdocker-compose.ymlを見たときにそれぞれ同じものが３つあるので、それぞれ削除していきます。

```
% docker volume rm (ファイル名)_bundle
```
```
% docker volume rm (ファイル名)_node_modules
```
```
% docker volume rm (ファイル名)_rails_cache
```

これでvolumeをそれぞれ削除できました。

## Buildする

buildすることでvolumeは再度新しく生成されるため、再度buildします。

```
% docker-compose build 
```

## upする
```
% docker-compose up
```

これで直りました。

他にもエラーがあれば都度更新します。

# 参考文献
・[公式ドキュメント](https://matsuand.github.io/docs.docker.jp.onthefly/storage/)
・[Docker、ボリューム(Volume)について真面目に調べた](https://qiita.com/gounx2/items/23b0dc8b8b95cc629f32)
vistaでstm32duino その10

#概要

vistaでstm32duinoやってみた。
高速gpio、やってみた。

#サンプルコード

```
unsigned long startTime;
unsigned long endTime;

void setup() {
	pinMode(LED_BUILTIN, OUTPUT);
	Serial.begin(9600);
}

void loop() {
	delay(1000);
	startTime = micros();
	GPIOA->BSRR = 0b0010000000000000;
	GPIOA->BSRR = 0b0010000000000000;
	GPIOA->BSRR = 0b0010000000000000;
	GPIOA->BSRR = 0b0010000000000000;
	GPIOA->BSRR = 0b0010000000000000;
	GPIOA->BSRR = 0b0010000000000000;
	GPIOA->BSRR = 0b0010000000000000;
	GPIOA->BSRR = 0b0010000000000000;
	GPIOA->BSRR = 0b0010000000000000;
	GPIOA->BSRR = 0b0010000000000000;
	endTime = micros();
	Serial.println(endTime - startTime);
}

```

#結果

```
1
1
1
1
1
1
1
1
1

```

以上。
Docker Desktopをやめたときのメモ

MacOSにてDocker Desktopを辞めたときのメモ



## 概要

docker-machineを用いてVirtualBoxの仮想マシン上に、Docker Engine (=Dockerサーバ)を構築する。
MacOSにdockerクライアントをインストールし、そこに接続する。

## 環境

* MacOS Big Sur 11.5.2
* Virtual Box 6.1.26
* docker クライアント (Docker version 20.10.9, build c2ea9bc90)
* docker-machine (docker-machine version 0.16.2, build bd45ab1)

## 手順

### １．Docker Desktopのアンインストール

説明省略

### ２．docker-machineのインストール

```
$ brew install docker-machine
```

### ３．Virtual Boxのインストール

普通にVirtual Boxインストールしうまく行ったと思ったが、仮想マシンを起動すると `Kernel driver not installed (rc=-1908)` のエラーが出た

巷のブログでは、Security & Privancy で許可すればよいと言われているが、私の環境ではそもそもSecurity & Privancyで Oracle America, Inc をブロックしたメッセージが出てこなかったため、許可できずにハマっていた

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33447/8794e419-5925-b3c9-2367-f6ee3778765f.png)

調べていくと、このブログ https://engineering.mobalab.net/2019/05/16/workaround-for-virtualbox-installation-failure-on-mac/ に解決策が載っていた


具体的にはMacOSのリカバリーモードで以下を実行する。

```
$ spctl kext-consent add VB5E2TV963
```

これで仮想マシンが起動できるようになった。

### ４．dockerクライアントのインストール

```
$ brew install docker
```

### ５．docker-machineを使ってVirtual Box上でDocker Engineを動かす

```
$ docker-machine create --driver virtualbox default
```
vistaでstm32duino その9

#概要

vistaでstm32duinoやってみた。
digitalwrite、やってみた。

#サンプルコード

```
unsigned long startTime;
unsigned long endTime;

void setup() {
	pinMode(LED_BUILTIN, OUTPUT);
	Serial.begin(9600);
}

void loop() {
	delay(1000);
	startTime = micros();
	digitalWrite(LED_BUILTIN, LOW);
	digitalWrite(LED_BUILTIN, LOW);
	digitalWrite(LED_BUILTIN, LOW);
	digitalWrite(LED_BUILTIN, LOW);
	digitalWrite(LED_BUILTIN, LOW);
	digitalWrite(LED_BUILTIN, LOW);
	digitalWrite(LED_BUILTIN, LOW);
	digitalWrite(LED_BUILTIN, LOW);
	digitalWrite(LED_BUILTIN, LOW);
	digitalWrite(LED_BUILTIN, LOW);
	endTime = micros();
	Serial.println(endTime - startTime);
}

```

#結果

```
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4




```


以上。
Raspberry Pi で cron を使用して繰り返し処理を行う

## Raspberry Pi を利用して繰り返し処理を行いたい
### 1. 環境

| ソフト・ハード | バージョン |
|:-|:-|
| Raspberry Pi  | Raspberry Pi 3 Model B+  |
| Raspbian  | 10.11  |
| Kernel  | 5.10  |
| Python  | 3.7.3  |

### 2. コマンド

| コマンド | 内容 |
|:-|:-|
| sudo apt-get install chkconfig  | チェック用モジュールインストール？  |
| chkconfig cron  | cronが動作確認  |
| systemctl enable cron  | cron off のとき、ON にする  |
| sudo /etc/init.d/cron start  | cronの起動  |
| sudo service cron restart  | cronサービスの再起動  |
| sudo /etc/init.d/cron stop  | cronの停止  |
| sudo crontab -e  | エディタ立ち上げ  |
| Ctrl + O  | エディタ書き込み  |
| Ctrl + X  | エディタ終了  |
| crontab -l  | 設定されてるcronを表示する  |
| crontab -r  | cronは削除する  |

### 3. crontab 内容
基本

```Python:crontab
*  *  *  *  * command
分 時 日 月 曜日
```
|   | 分 | 時 | 日 | 月 | 曜 |
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
| 範囲  | 0-59  | 0-23  | 1-31  | 1-12  | 0-7（0と7はSunday）  |

コマンド

| コマンド  | 内容 |
|:-:|:-:|
| [*]  | 毎時  |
| [ , ]  | and  |
| [ / ]  | ステップ数  |
| [ - ]  | 範囲指定  |

例

| 記述  | 実行内容 |
|:-|:-|
| * * * * *  | 1分毎に実行  |
| 32 02 * * *  | 02:32に実行  |
| */10 * * * *   | 10分毎に実行  |
| 0 */4 * * *  | 4時間毎に実行  |
| 0-10 20 * * *  | 20:00から20:10まで 1分毎に実行  |
| 0,30 20 * * 2,4  | 毎週,火,木曜の 20:00と 20:30に実行  |
| * 20 * * *  | 20:00から 20:59まで 1分おきに実行  |
| 0 1 * * *  | 1:00に実行  |
| 0 * * * *  | 毎時 0分に 1時間おきに実行  |
| 2 8-20/3 * * *  | 8:02,11:02,14:02,17:02,20:02に実行  |
| 10 3 1 * *  | 毎月1日の 3:10分 に実行  |
| 0 12 * * 0  | 毎週日曜日 12:00 に実行  |      

### 参考にさせて頂いたサイト
https://torisky.com/%E3%83%A9%E3%82%BA%E3%83%91%E3%82%A4%EF%BC%9Acrontab%E3%82%92%E5%86%8D%E8%AA%AD%E3%81%BF%E8%BE%BC%E3%81%BF%E3%81%99%E3%82%8B/

https://inakita-monolab.com/iot-200510/

https://qiita.com/gdate/items/bdf6c620404679063211

https://thr3a.hatenablog.com/entry/20160529/1464533589

https://min117.hatenablog.com/entry/2017/06/25/103621

https://tamulapin.hatenablog.com/entry/2015/01/16/181207

https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q14164390719

https://tanuhack.com/cron/

https://note.com/tokitky/n/nf99ffa77aae2

https://qiita.com/saira/items/76a5538a6b2556f6b339

http://x68000.q-e-d.net/~68user/unix/pickup?crontab
vistaでstm32duino その8

#概要

vistaでstm32duinoやってみた。
serial、やってみた。

#写真

![DSCN0547.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/5f4487e2-6588-3373-0ae0-793e1edbe844.jpeg)


#サンプルコード

```
void setup() {
	Serial.begin(9600);
}
void loop() {
  	Serial.println("hello stm32duino");
  	delay(1000);
}

```

#serial

PA9,PA10

以上。
vistaでstm32duino その7

#概要

vistaでstm32duinoやってみた。
analogread、やってみた。

#サンプルコード

```
int val[10];
unsigned long startTime;
unsigned long endTime;

void setup() {
	pinMode(PA0, INPUT_ANALOG);
	Serial.begin(9600);
}

void loop() {
	delay(1000);
	startTime = micros();
	val[0] = analogRead(PA0);
	val[1] = analogRead(PA0);
	val[2] = analogRead(PA0);
	val[3] = analogRead(PA0);
	val[4] = analogRead(PA0);
	val[5] = analogRead(PA0);
	val[6] = analogRead(PA0);
	val[7] = analogRead(PA0);
	val[8] = analogRead(PA0);
	val[9] = analogRead(PA0);
	endTime = micros();
	Serial.println(endTime - startTime);
}

```

#結果

```
557
557
557
557
557
557
557
557
557
557
557
557
557
557
557
557
```

以上。
AWS Configのログ配信先S3バケットをKMS暗号化する


## はじめに

2021年2月からAWS Config で使用される S3 バケットでの KMS での暗号化がサポートされたとのことです。

S3バケット側でKMSでの暗号化設定をしていても、オブジェクト単位ではデフォルトでS3 マネージド暗号化キー (SSE-S3)で暗号化されています。
こちらの記載通りに設定することでKMS暗号化できたので、手順を残します。
https://aws.amazon.com/about-aws/whats-new/2021/02/support-for-kms-encryption-on-s3-buckets-used-by-aws-config/?nc1=h_ls


## 手順

### KMSキーのキーポリシーを設定する

Configからアクセスできるよう、S3バケット暗号化に使用するKMSキーのキーポリシーをKMSの管理画面から設定します。
通常のIAMロールを用いた場合か「サービスにリンクされたロール」の場合に応じて下記に例がありますので、適切な方を選んで設定してください。

https://docs.aws.amazon.com/config/latest/developerguide/s3-kms-key-policy.html

今回は「サービスにリンクされたロール」を用いている場合とし、下記の例で設定していきます。

```json
{
    "Id": "Policy_ID",
    "Statement": [
        {
            "Sid": "AWSConfigKMSPolicy",
            "Effect": "Allow",
            "Principal": {
                "Service": "config.amazonaws.com"
            },
            "Action": [
                "kms:Decrypt",
                "kms:GenerateDataKey"
            ],
            "Resource": "arn:aws:kms:ap-northeast-1:111122223333:key/abcdefgh-hijk-lmno-pqrs-tuvwxyz12345"
        }
    ]
}
```

### put-delivery-channel APIでKMSキーのARNをConfigに登録する

AWS CLIを用いて設定します。

#### 現状の設定の確認をする

`describe-delivery-channels`コマンドで変更前の状況を確認しておきます。

https://awscli.amazonaws.com/v2/documentation/api/latest/reference/configservice/describe-delivery-channels.html

```shell:
aws configservice describe-delivery-channels
```

```json:レスポンス
{
    "DeliveryChannels": [
        {
            "name": "default",
            "s3BucketName": "your-bucket-name",
            "snsTopicARN": "arn:aws:sns:ap-northeast-1:111122223333:your-topic-name"
        }
    ]
}
```

#### KMSキーのARNをConfigに登録する

`put-delivery-channel`コマンドでS3バケットの暗号化に使用するKMSキーのARNをConfigに登録します。
`s3KmsKeyArn`にKMSキーのARNを設定します。

https://awscli.amazonaws.com/v2/documentation/api/latest/reference/configservice/put-delivery-channel.html

```shell:
aws configservice put-delivery-channel --delivery-channel name=default,s3BucketName=your-bucket-name,s3KmsKeyArn=arn:aws:kms:ap-northeast-1:111122223333:key/abcdefgh-hijk-lmno-pqrs-tuvwxyz12345,snsTopicARN=arn:aws:sns:ap-northeast-1:111122223333:your-topic-name
```

登録されたか再度確認してみます。

```shell:
aws configservice describe-delivery-channels
```

```json:レスポンス
{
    "DeliveryChannels": [
        {
            "name": "default",
            "s3BucketName": "your-bucket-name",
            "s3KmsKeyArn": "arn:aws:kms:ap-northeast-1:111122223333:key/abcdefgh-hijk-lmno-pqrs-tuvwxyz12345",
            "snsTopicARN": "arn:aws:sns:ap-northeast-1:111122223333:your-topic-name"
        }
    ]
}
```

`s3KmsKeyArn`がちゃんと登録されたようです。

この後、Configから配信されたオブジェクトがKMSで暗号化されていることを確認できました！
vistaでstm32duino その6


#概要

vistaでstm32duinoやってみた。
hid keyboard、やってみた。

#サンプルコード

keyを押すと動作

```
#include "Keyboard.h"

const int buttonPin = 4;
int previousButtonState = HIGH;
int counter = 0;

void setup() {
	pinMode(buttonPin, INPUT);
	Keyboard.begin();
}

void loop() {
	int buttonState = digitalRead(buttonPin);
	if ((buttonState != previousButtonState) && (buttonState == HIGH)) 
	{
		counter++;
		Keyboard.print("You pressed the button ");
		Keyboard.print(counter);
		Keyboard.println(" times.");
	}
	previousButtonState = buttonState;
}


```

#基板上のKEY

PA0


以上。
typescriptに正規表現の型をつける方法

#### これでできる

```
type StartDate =`${number}${number}${number}${number}-${number}${number}-${number}${number}`

let startDate: StartDate = "2021-9-19" -> error
let startDate: StartDate = "2021-09-19" -> OK
```

##### 参照
https://stackoverflow.com/questions/51445767/how-to-define-a-regex-matched-string-type-in-typescript
vistaでstm32duino その5

#概要

vistaでstm32duinoやってみた。
Lチカ、やってみた。

♯サンプルコード

```
void setup() {
	pinMode(LED_BUILTIN, OUTPUT);
}

void loop() {
	digitalWrite(LED_BUILTIN, HIGH);
	delay(1000);
	digitalWrite(LED_BUILTIN, LOW);
	delay(1000);
}


```

#最初に、USBにつなぐと

HIDとなる。

#BOOT0を押しながら、RESETすると

DFUとなる。

#コンパイルエラー

```
STM32_Programmer_CLI.exe not found.
Please install it or add <STM32CubeProgrammer path>\bin' to your PATH environment:
https://www.st.com/en/development-tools/stm32cubeprog.html
Aborting!
スケッチの書き込み中にエラーが発生しました



```
path通した。

C:\Program Files\STMicroelectronics\STM32Cube\STM32CubeProgrammer\bin

#LED_BUILTIN

PC13 
HIGHでLED消灯、LOWでLED点灯。

#arduino ideの設定。

![ide.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/163f524a-3ead-19c8-89ec-15eed4dfffc8.jpeg)



以上。
ABC215 C - One More aab aba baa から学んだ

https://atcoder.jp/contests/abc215/tasks/abc215_c

![abc215_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/737344/b41fb707-5d2c-a6ae-63a4-497f92945054.png)
![abc215_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/737344/3a9edfdc-687d-a19b-2d8a-76323c5092d8.png)

重複なし並び替えを実行して K 番目を出力する。
ただし、重複する文言が出てくるので set する

```abc215c.py
from itertools import permutations
S,K = input().split()
K = int(K)
lis=[]
for i in permutations(range(len(S)),len(S)):
    nums = list(i)
    s =""
    for j in range(len(S)):
        s += S[nums[j]]
    lis.append(s)
lis = sorted( list(set(lis)) )
#print(lis)
print(lis[K-1])
```

解答を眺めると、S そのものを permutation で
リストするやり方もあって、面白かった。

```abc215c_r1.py
from itertools import permutations
S,K = input().split()
K = int(K)
lis=["".join(i) for i in permutations(S,len(S))]
lis = sorted(list(set(lis)))

print(lis[K-1])
```
Redux + TypeScriptで複数Reducerを結合したRootReducerの型を取得する方法

# Redux + TypeScriptで複数Reducerを結合したRootReducerの型を取得する方法

Reduxを使用したプロジェクトで複数のreducerをcombineReducerを使って結合した場合に生成されるRootReducerの型が分からず困ったため、良い方法はないかと公式ドキュメントを探っていたら一発で取得できる方法が紹介されていたので邦訳の意味を込めて紹介する。

### やり方
次の方法で取得できる。

```ts
export type RootState = ReturnType<typeof store.getstate>;
```

### この方法を使う文脈
こんな場合に使える。(※ReduxToolKitを使った実装の前提)

```ts
// reducerの結合
const reducers = combineReducers({
  user: userSlice.reducer,
  hoge: hogeSlice.reducer
});

// storeとreducersを紐付け
const store = configureStore({
  reducer: reducers
});

export default store;

// 結合したreducerのstateTree全体の型を取得する
export type RootState = ReturnType<typeof store.getstate>;
```

### 取得した型を活用できる場面
この方法で取得した型を活用する1つのケースとして、useSelectorで値を取得する際にRootReducerの型を指定する必要がある場合などが挙げられる。

```ts
useSelector<RootState, userState>((state)=> state.users);
```
アノテーションツール：Vottとは？

#Vottとは
Microsoftが提供しているオープンソフトウェアのアノテーションツール。


#バージョンによって多種多様
現在大きく分けて、v1とv2がリリースされている。
特に自分の目に留まったバージョンとその機能を紹介する。

###v2
機能一覧をいかに示す。
・動画対応フレーム間隔の設定
・タグ登録簡単
・タグロック
・ポリゴンを描ける
・プロジェクトの進行度を確認できる。タグのそれぞれの枚数が円グラフ。
・見た画像もカウントされ、出力を限定できる。
・オートアノテーション

自分の環境での不具合も示しておく。
・undo/zoomin/zoomoutが使えるらしいが機能しない。


###v1.0.6
かなり前にリリースされたものではあるが、トラッキング機能が優れている！
AIモデルを用いて、自動化するv2に対してこちらは、前画像の情報をもとに対象物の位置を推定してくれる。
モデルを用意せずにできるのはありがたい。


#参考文献
https://github.com/microsoft/VoTT
ABC205 C - POW を解いた

https://atcoder.jp/contests/abc205/tasks/abc205_c

![abc205_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/737344/d93bf038-c32f-b1b0-b51f-13b5fc0272eb.png)
![abc205_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/737344/aeef0509-9a97-2882-abef-14ccba3d2e08.png)

A,B はマイナスだったり、プラスだったりする。
C が偶数なら 2 乗、奇数なら 3 乗で大小比較すれば十分だと思った。

```abc205c.py
A,B,C = map(int,input().split())

if C%2 == 0:
    ans1 = A**2
    ans2 = B**2
else:
    ans1 = A**3
    ans2 = B**3

if ans1 == ans2:
    print("=")
elif ans1 < ans2:
    print("<")
else:
    print(">")
```
Javascript オブジェクト内の短縮型メソッド定義


## 経緯

Reactのコードを読んでいると以下のようなコードがあり、少し読み方に躓いたので備忘録として残します。

```javascript
const mapDispatchToProps = dispatch => ({
  onMount(categoryId){
    dispatch(actions.fetchRanking(categoryId))
  },
  onUpdate(categoryId){
    dispatch(actions.fetchRanking(categoryId))
  }
})
```

書き換えると以下のようになります。

```javascript
var obj = {
  onMount(categoryId){
    dispatch(actions.fetchRanking(categoryId))
  },
  onUpdate(categoryId){
    dispatch(actions.fetchRanking(categoryId))
  }
}

const mapDispatchToProps = function(dispatch){return obj}
```

言葉に表すと、「objを返す無名関数を定数mapDispatchToPropsに代入している」ということになります。

ここでobjをみると`omMount(){}`と`onUpdate(){}`が設定されていますが、
`key:value`の形式じゃないの？と疑問に思いました。
（rubyのHashの形式だと思い、先入観が走りました。。）

terminalで対話形式でnodeを動かしてみると

```javascript
> obj = { test(hoge){ return hoge } }
{ test: [Function: test] }
```

お、どうやら関数として定義できたみいです。
関数として呼び出してみました。

```javascript
> obj.test
[Function: test]
> obj.test('aaaaa')
'aaaaa'
```


調べたところ、ECMAScript 2015で導入された短縮形のメソッド定義の構文でした。

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Functions/Method_definitions

```javascript
var obj = {
  foo() {
    /* コード */
  },
  bar() {
    /* コード */
  }
};
```

jsは短縮形を把握していないと少し躓くなと思いました。
Databricks機械学習・ディープラーニング環境のセットアップガイド

[Machine learning and deep learning environment setup guide \| Databricks on AWS](https://docs.databricks.com/applications/machine-learning/environment-setup.html) [2021/6/16時点]の翻訳です。

[Databricks機械学習ランタイム](https://qiita.com/taka_yayoi/items/824b507019d3ade7eedc)(Databricks Runtime ML)は、機械学習、データサイエンスに最適化されたすぐに利用できる環境です。Databricks Runtime MLには、TensorFlow、PyTorch、Horovod、scikit-learn、XGBoostを含む外部ライブラリが多く含まれており、[XGBoost](https://docs.databricks.com/applications/machine-learning/train-model/xgboost.html)におけるGPUアクセラレーション、[HorovodRunner](https://docs.databricks.com/applications/machine-learning/train-model/distributed-training/horovod-runner.html)による分散ディープラーニング、[Databricks File System \(DBFS\) FUSE mount](https://docs.databricks.com/applications/machine-learning/load-data/index.html#store-files-for-data-loading-and-model-checkpointing)を用いたモデルのチェックポイントのような性能改善のための拡張が行われています。

Databricks Runtime MLを使用するには、[クラスターを作成](https://qiita.com/taka_yayoi/items/d36a469a1e0c0cebaf1b)する際にMLバージョンのランタイムを選択します。

# 追加ライブラリのインストール

お使いのノートブックやクラスターでカスタムの環境を作成するために、追加の[ライブラリ](https://qiita.com/taka_yayoi/items/d3a46efdc1ad01a581d0)をインストールすることができます。

- クラスターで実行する全てのノートブックで利用できるライブラリを作成するために、[クラスターライブラリを作成](https://qiita.com/taka_yayoi/items/d3a46efdc1ad01a581d0#2-%E3%82%AF%E3%83%A9%E3%82%B9%E3%82%BF%E3%83%BC%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA)します。クラスター作成時にライブラリをインストールするために、[init script](https://docs.databricks.com/clusters/init-scripts.html#cluster-scoped-init-script)を使用することもできます。
- 特定のノートブックセッションでのみ利用できるライブラリをインストールするには、[ノートブックスコープのPythonライブラリ](https://qiita.com/taka_yayoi/items/d3a46efdc1ad01a581d0#3-%E3%83%8E%E3%83%BC%E3%83%88%E3%83%96%E3%83%83%E3%82%AF%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%97%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA)を使用します。

# GPU有効化クラスターの作成

ディープラーニングタスクを高速化するために、GPUが有効化されたクラスターを作成することができます。GPUが有効化されたDatabricksクラスターを作成するには、[GPU\-enabled clusters](https://docs.databricks.com/clusters/gpu.html#gpu-clusters)を参照ください。Databricks機械学習ランタイムには、GPUハードウェアドライバーとCUDAのようなNVIDIAライブラリが含まれています。

### Databricks 無料トライアル

[Databricks 無料トライアル](https://databricks.com/jp/try-databricks)
リードコンバージョンタブに[商談]列がありません



[My lead conversion tab is missing Opportunity column](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000DcgxKSAR)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/fee5d165-b8ca-058c-93bb-ad0bad5cfab4.png)


リードの設定を確認し、[リードの変換ウィンドウの商談セクションを非表示] チェックボックスがオンになっているかどうかを確認します。チェックの場合はチェックを外します。詳細については、スクリーンショットを参照してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/ab47b72a-3133-8b79-17f3-a755f4d67c10.png)
GitHub Enterprise内のR Libraryをインストールするのに困った話 

## GitHub Enterpriseでインストールするなら
```{R}
devtools::install_github('userName/repoName',
                          host = 'githuEnterpriseUrl/api/v3',
                          auth_token=ifNecessary)
```
# GitHub環境
自社では自社用R Libraryがいくつかあり、それらはgithub enterprise上で稼働している。

## GitHub Libraryの今までのインストール方法
今までは
`devtools::devtools::install_github()`
で`host=githuEnterpriseUrl`でやっていたためうまく行かず,tar.gzファイルを解凍して利用していた。
Docker環境にいくつかLibraryを入れる必要があったため今までの方法ではうまく行かず、install_githubコマンドで入れたいニーズがあり調べる必要があった。

## 詳しくは公式のREST API参照
`GitHub Enterprise ServerのAPIにアクセスするためにhttp(s)://[hostname]/api/v3を使ってください。`
https://docs.github.com/ja/enterprise-server@2.22/rest/guides/getting-started-with-the-rest-api
最後の「.」の後の出力文字を検索する式

[Answersで回答する時に使う情報のまとめに戻る](https://qiita.com/Keiji_otsubo/items/9e6e0e946826133eddc7)


[Formula to locate to Output Characters after the Last "."](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000Bsqv7SAB)

```
MID(
    MID(
    (MID(Username__c, FIND('@', Username__c)+1, 100)),
    (Find (".",(MID(Username__c, FIND('@', Username__c)+1, 100))))+1,
    100),
    FIND(".",
    MID(
    (MID(Username__c, FIND('@', Username__c)+1, 100)),
    (Find (".",(MID(Username__c, FIND('@', Username__c)+1, 100))))+1,
    100))+1,
    100
)
```
予約可能と予約不可で色分けをする

[1.はじめに](#1-はじめに)
[2.予約画面のイメージ](#2-予約画面のイメージ)
[3.実装](#3-実装)
[4.コード](#4-コード)
[5.おわりに](#5-おわりに)

#1. はじめに
予約可能と予約不可で処理を分けたいと考えましたが、思った通りに行かなかったのと、検索しても記事が少なかったのでまとめます。
前提として、sheetの座席はマスターデータとしてDBに保存してあります。
予約テーブル(Reservations)と、座席テーブル(Sheet)が関連づけられています
予約テーブルは座席テーブルにidをsheet_idとして保持します。

|Reservations| Sheet       |
|:-----------|------------:|
| sheet_id       |   id        |
|  　　　・     | row     |
| 　　　・      |column        |


#2. 予約画面のイメージ
予約できる場合はオレンジ、予約不可の場合は色を暗くして視覚的にわかりやすくしています。
今回は映画館がモデルです。応用すれば美容院や旅行サイトなどのように取得したカレンダーや日付で、○やxを使って視覚的に分かりやすく予約画面を作ることもできると思います。
![スクリーンショット 2021-10-19 8.22.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641519/a74e187c-ffc8-39f7-01ec-cac9a64d4e7b.png)


#3.実装
**今回はhelperを使用して作成します**。
heleperはView内で行いたい処理を書く時に便利です。なぜなら、helperで作成したものは``<%= ヘルパー名 %>``とすることで簡単に呼び出すこともできますし、Viewがスッキリするので可読性も上がります。
ちょっとした複雑な処理をViewで行いたい場合に便利です。


以下の手順で処理を行います。

① Reservationのshee_idカラムにsheetがあるか検索する
② Reservationのshee_idカラムにsheetがある場合は（予約あり）色を暗くする、ない場合は色をオレンジ（予約可能）

#4. コード
helpe


```rb

  def reservation_list(sheet)
      Reservation.exists?(sheet_id: "#{sheet}")
  end

```

View

```html

      <% @sheets.each do |sheet|%>
          <% if reservation_list(sheet.id) %>

            <div class="unavailable">
              <p><%= sheet.row %><%= sheet.column %></p>
            </div>
          <% else %>

        <%= link_to xxxxxx do %>

            <div class="available">
              <p><%= sheet.row %><%= sheet.column %></p>
            </div>

          <% end %>
        <% end %>
      <% end %>

```

**helper**

ヘルパーにある``exists?``メソッドは対象の値があるか検索してくれます。今回は``sheet_id``を引数の``sheet``で検索してくれています。


**View**
①マスターデータの``sheet``は``controller``で``Sheet.all``をしています。座席の文字にある アルファベットが``row``、数字が``column``です。
それはeachで取り出しています。``<% @sheets.each do |sheet|%>``

② ``<% if reservation_list(sheet.id) %>``は``helper``で作成したメソッドです。引数に``sheet``の``id``入れることでidを検索します。

③ ``else``を使用して``Reservationsテーブル``の``sheet_id``に値があった場合となかった場合で処理を分けています。値がない場合にだけリンクを追加しています。

④``sheet``の出力結果にCSSクラスを追加していますが、これで色を調整します。

#5. おわりに

existsなんて便利なメソッドがあるのは知らなかった。。勉強になりました。