OmniAICreator/Qiita-1.07M huggingface dataset:
Livet 別画面を表示する方法

#はじめに
WPF学習中のため自分用に記載していきます。
間違い、不足などありましたらコメントをよろしくお願いします。

#●別画面の表示方法
ViewModelからViewを開きたいときはMessengerを送ることで実現する。

>Livet.Behaviors.Messaging 名前空間には Livet の Messenger などから送られたメッセージを受け取ることの出来る Action が用意されています。この Action は Messenger からメッセージを受け取るだけではなく、EventTrigger などから Action を起動することが出来るようになっています。

※引用元：(https://github.com/runceel/Livet)

#View側のソース
InteractionMessageTriggerを設定してActionを指定する。
TransitionInteractionMessageActionで別画面を起動する。
　Mode(画面の表示方法)
　　　　 Normal：別画面を表示中に他の画面の操作が可能
　　　　 Modal：別画面を表示中は他の画面の操作が不可能

```xml
<behaviors:Interaction.Triggers>
    <l:InteractionMessageTrigger MessageKey="OpenMessageKey" Messenger="{Binding Messenger}">
        <l:TransitionInteractionMessageAction WindowType="{x:Type v:SubWindow}" Mode="Normal"/>
    </l:InteractionMessageTrigger>
</behaviors:Interaction.Triggers>

<Grid>
    <StackPanel VerticalAlignment="Center" >
        <TextBox Text="{Binding Text}" />
        <Button Content="Open" Command="{Binding OpenCommand}" />
    </StackPanel>
</Grid>
```

#ViewModel側のソース
Messengerを使用してメッセージを送る。
ViewModel側で指定したメッセージキーが一致するInteractionMessageTriggerが実行される。

```ViewModel.cs
private string text;
public string Text { get => text; set => RaisePropertyChangedIfSet(ref text, value); }

private ViewModelCommand openCommand;
public ViewModelCommand OpenCommand => openCommand ??= new ViewModelCommand(ShowDetailWindow);
private void ShowDetailWindow()
{
    Messenger.Raise(new TransitionMessage(new SubWindowViewModel(text), "OpenMessageKey"));
}

```


<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/454547/e1fb9740-5e55-930d-59ef-9fad16a79f6e.png">　<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/454547/edb0b2dc-7d51-cbf5-b568-718d4b843828.png">


***

#・環境
VisualStudio2019
.Net Core3.0
Livet v3.2.1



#・参照
[GitHub Livet]
(https://github.com/runceel/Livet)
【Vue3】refとreactiveの使い分けについて

Vue3系やCompositionAPIからは`data()`が廃止される代わりに監視したい値を`ref`や`reactive`を使用することで値の変更を監視することができるようになりました。

逆にいうと`ref`でも`reactive`でも値の変更を監視することができるわけですから、どっち使ったらいいの？っていう疑問が出てくるかと思います。

## refの使用シーン
> 独立したプリミティブ値(例えば文字列)があって、それをリアクティブにしたい場合を想像してみてください。もちろん、同じ値の文字列を単一のプロパティとして持つオブジェクトを作成して reactive に渡すこともできます。Vue にはこれと同じことをしてくれる ref メソッドがあります

vue公式より引用したrefの紹介です。
refには一つの値を監視することができます。

refの値には`value`という名前のプロパティが含まれているため、値を変更するには下記のようにします。


```javascript
import { ref } from 'vue'

const conter = ref<number>(0)

counter.value++
```

`ref`の使用シーンとして、単一のプロパティを監視したい時に使用します

## reactiveの使用シーン

逆に`reactive`は複数のプロパティを監視することができます。
vue2系までの`data`のように使用することができますね。

```javascript
import { reactive } from 'vue'

interface FormState {
  email: string
  password: string
}

const formState = reactive<FormState>({
  email: '',
  password: ''
})
```

例えば上記のように、ユーザー作成ページのようなformオブジェクトの中に、一つの変数で値を監視したいときに使用する時に結構便利な機能となっております。

もちろん下記のように書いても機能します。

```javascript
import { ref } from 'vue'

const email = ref<string>('')
const password = ref<string>('')
```

### 最後に
この記事でご紹介する以外に、明確な使い分けっていうのがあったらコメント欄で教えていただけると幸いです

### 参考
https://v3.ja.vuejs.org/guide/reactivity-fundamentals.html
KotlinでAndroidアプリを作成する時の備忘録

いつも書き方を忘れてしまうので，備忘録と勉強を兼ねて書いていく．

##logの残し方
アプリを作っていると途中でpriint('hogehoge')とか書いて動作を確認できないので困る．
そのためにAndroidにはLogという機能があって，たとえば

```
Log.i("foo", "bar")
```

と書いておくと，Logcastに

```
2021-05-23 18:25:29.942 2814-2814/? I/foo: bar
```
![スクリーンショット 2021-05-23 17.57.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/391711/425dfd69-8dc1-cda7-6757-e1d81e3f73a9.png)
と言った感じで表示される．
表示する内容によってLog.iとかLog.Eとかを設定できる．
書き方としては[logcat を使用してログを書き込み、表示する](https://developer.android.com/studio/debug/am-logcat?hl=ja)を読むこと．

##トースト（小さなポップアップ）を表示させる方法

詳細は[トーストの概要]([https://developer.android.com/guide/topics/ui/notifiers/toasts?hl=ja)から．
>
トーストは、操作に関する簡単なフィードバックを小さなポップアップに表示します。
トーストでは、メッセージの表示に必要なスペースのみを使用します。現在のアクティビティは表示されたままになり、引き続き操作できます。トーストはタイムアウト後に自動的に消えます。

画面下部に小さなポップアップトーストを表示させるためには以下のように書く．

```
Toast.makeText(applicationContext, "ほげほげ", Toast.LENGTH_SHORT).show()
```
こんな感じに出力される．
![スクリーンショット 2021-05-23 18.25.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/391711/f4718411-c453-17a6-0568-85a1301c7627.png)
[AWS_20]EC2インスタンスの複製

##環境
AWS


##前準備
冗長化後に障害試験を行なう際、どっちのWEBサーバにアクセスしているか分かるように、EC2にSSH接続してindex.phpを編集しておく。

```console:Linux
sudo su -
cd /var/www/html

vi index.php
```
`define( 'WP_USE_THEMES', true);`の下に以下を挿入
`echo '<p>web server 1</p>';`
このあと新規EC2インスタンス複製するが、その後に新規インスタンスの方は`web server2`とする。

##実作業
1. 既存EC2インスタンスの停止<br>
`インスタンスの状態　＞　インスタンスの停止`をクリックする。
1. 既存EC2インスタンスからイメージの作成<br>
`アクション　＞　イメージとテンプレート　＞　イメージの作成`をクリックする。<br>
イメージ名: WebServer<br>
イメージの説明: WebServer<br>
`イメージを作成`をクリックする。
1. AMIが使用可能になるのを待つ<br>
`イメージ　＞　AMI`をクリックして、作成したAMIがAvailableになっていることを確認する。
1. 新規インスタンスの起動<br>
`インスタンス　＞　インスタンスを起動`をクリックする。<br>
ステップ1:`マイAMI　＞　WebServer`<br>
ステップ2:`t2.micro`<br>
ステップ3:ネットワーク：`MyVPC1`<br>
　 　 　 　サブネット：`PublicSubnet2 | ap-northeast-1c`<br>
　 　 　 　自動割り当てパブリックIP：`有効`<br>
ステップ4:
ステップ5:キー：`Name`<br>
　 　 　 　値：WebServer2
ステップ6:セキュリティグループ：Web-SG-1(既存)
キーペアは既存のキーペアを選択して、インスタンスを作成する。
1. 既存EC2インスタンスを起動
![構成図06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/758644/dd4a1391-7ca4-0b8b-b196-f1c74230b1d7.png)
rbenv 導入時の ruby のバージョンの変更メモ（Mac前提）

# Mac内のRubyバージョンの変更
OSがCatalina以降
echo 'eval "$(rbenv init -)"' >> ~/.zshrc をターミナルで実行して source ~/.zshrc で再読み込み

## Rails
Gemfile のrubyバージョンを導入したRubyのバージョンに変更して bundle install

## RubyMine
RubyMineを再起動して 環境設定→言語＆フレームワーク→RubySDKおよびGem の一覧に導入したRubyバージョンが表示されているので選択
Spring Cloud Contract メモ - Getting Startedでの気付き

## 1. やったこと

- Spring Cloud Contractのサンプルを実装して動かした
- 下記のガイドを参考に実装した
  - https://spring.pleiades.io/guides/gs/contract-rest/
- Artifactをローカルリポジトリに配置して、Consumer側からアクセスできることを確認した
- Githubリポジトリに生成されたStubを配置して、Consumer側からアクセスできることを確認した
- 実装したサンプルは下記リポジトリ
  - https://github.com/ShigeoTejima/spring-cloud-contract-demo

## 2. バージョンなど

- Java 11
  - AdoptOpenJDK-11.0.11+9
- Spring Boot 2.4.6
- Spring Cloud Contract 2.2.7.RELEASE
- Spring Cloud Contract 3.0.2

## 3. 気づき

### 3.1. Githubリポジトリにssh接続の場合にエラーになった

#### 3.1.1. 事象

- エラーメッセージに下記のように出力された
  - `Caused by: com.jcraft.jsch.JSchException: Auth fail`

#### 3.1.2. 原因

- GithubリポジトリにSSHでアクセスするためにはSSH鍵の登録が必要
- 以下の原因が想定される
  - Github側にSSH鍵の登録を忘れた or 誤っている
  - .ssh/configにSSH鍵の設定を忘れた or 誤っている

#### 3.1.3. 解決

- GithubにSSH鍵を登録する
  - https://docs.github.com/ja/github/authenticating-to-github/connecting-to-github-with-ssh
- .ssh/configにSSH鍵の設定をする  

```
# .ssh/config例
Host github.com
  IdentityFile ~/.ssh/id_rsa
  User git
```

### 3.2. GithubにSSH鍵を設定したのにエラーになった

#### 3.2.1. 事象

- エラーメッセージに下記のように出力された
  - `Caused by: com.jcraft.jsch.JSchException: invalid privatekey: [B@3946075`

#### 3.2.2. 原因

- 使用できるSSH鍵は、RSA、かつPEMフォーマット
- Githubのページの通りにするとED25519だったり、OPENSSHフォーマットになってるかも
  - https://docs.github.com/ja/github/authenticating-to-github/connecting-to-github-with-ssh

#### 3.2.3. 解決

- SSH鍵を作成する時に以下のようなコマンドで作成した
  - `ssh-keygen -m PEM -t rsa -b 4096 -C "your_email@example.com" `
  - SSH鍵の先頭が`-----BEGIN RSA PRIVATE KEY-----`になっていることを確認した

### 3.3. テストは成功したけど、Github接続するところでエラーが出ている

- 以下のようなエラーメッセージが出力されたと思ったが、出なくなったのでスキップ(エラーメッセージは記憶なので間違いあるかも)
  - `Caused by: com.jcraft.jsch.agentproxyAgentProxyException: java.io.IOException: failed to fctrl usocket: -1`
- ssh-agentを起動したらエラーが出なくなった、ような気がした
- ここでエラーになっても接続はできるようなので無視しても良いかも

### 3.4. Githubリポジトリのブランチ名がmasterじゃない

#### 3.4.1. 事象

- エラーメッセージに下記のように出力された
  - `Caused by: org.eclipse.jgit.api.errors.RefNotFoundException: Ref master cannot be resolved`

#### 3.4.2. 原因

- デフォルトでmasterブランチを参照するようになっているため

#### 3.4.3. 解決

以下のいずれかで対応できる

- (1) AutoConfigureStubRunnerなどの設定で、`git.branch`にブランチ名を指定したpropertiesを設定する

```
@AutoConfigureStubRunner(
    repositoryRoot = "git://git@github.com:ShigeoTejima/spring-cloud-contract-demo.git",
    ids = {"com.example:cdc-producer-demo:+::8100"},
    stubsMode = StubRunnerProperties.StubsMode.REMOTE,
    properties = {"git.branch=main"})
```

- (2) 環境変数もしくはシステムプロパティでブランチ名を設定して実行する
  - https://cloud.spring.io/spring-cloud-contract/reference/html/appendix.html#additional-application-properties
  - この場合は、AutoConfigureStubRunnerなどで`git.branch`を指定しない

```
% env STUBRUNNER_PROPERTIES_GIT_BRANCH=main ./mvnw clean test
or
% ./mvnw -Dstubrunner.properties.git.branch=main clean test
```

---

おわり。
【検証】nginxに触れてみた　インストール編

近々現場でnginxのインストール作業を実施を予定しているので、事前に少し触れておこうと思いましたので、今回はnginxのインストールを行います。
nginxには色々な機能が備わっていますので、次回以降に機能ごとに触れてみたいと思います。

#nginxとは
nginxは、高速で軽量なフリーのwebサーバーです。
基本的なwebサーバーとしての機能だけではなく、リバースプロキシやロードバランサ等の機能も備わっています。
動作で使用するリソースが少ないので、サーバー内でnginxを利用する他のサービスと相乗りも可能なようです。

#nginxのインストール
nginxのインストールは比較的簡単に行えます。
まずは事前準備として、yumリポジトリ情報の追加を行います。

```
vi /etc/yum.repos.d/nginx.repo
↓以下の内容を記載
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=0
enabled=1
```

リポジトリ情報を追加しましたら、インストールを実施します。

```
yum install -y nginx
```

インストール完了後、Firewallの設定を追加します。

```
firewall-cmd --add-service=http --zone=public --permanent
firewall-cmd --reload
```

Firewallの設定が完了しましたらサービス起動します。

```
systemctl start nginx
systemctl enable nginx
```

サービス起動後、`http://<サーバーのIP>`へアクセスします。
以下の画面が表示されていれば正常に起動出来ています。

![ngx01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/858317/b6346c75-002f-c2ab-cad9-e8537b1aef6e.png)

インストールは以上で完了です。

#nginxのインストール(バージョンを指定する場合)
利用する環境等によってはインストールするnginxのバージョンを指定する必要がある場合もあると思います。
その場合は以下の方法でインストールします。

リポジトリ情報の追加後、以下のコマンドで利用可能なnginxのバージョンを調べます。

```
yum --showduplicates list nginx
～コマンド結果途中省略～
利用可能なパッケージ
nginx.x86_64                     1:1.8.0-1.el7.ngx                         nginx
nginx.x86_64                     1:1.8.1-1.el7.ngx                         nginx
nginx.x86_64                     1:1.10.0-1.el7.ngx                        nginx
nginx.x86_64                     1:1.10.1-1.el7.ngx                        nginx
nginx.x86_64                     1:1.10.2-1.el7.ngx                        nginx
nginx.x86_64                     1:1.10.3-1.el7.ngx                        nginx
nginx.x86_64                     1:1.12.0-1.el7.ngx                        nginx
nginx.x86_64                     1:1.12.1-1.el7.ngx                        nginx
nginx.x86_64                     1:1.12.2-1.el7_4.ngx                      nginx
nginx.x86_64                     1:1.14.0-1.el7_4.ngx                      nginx
nginx.x86_64                     1:1.14.1-1.el7_4.ngx                      nginx
nginx.x86_64                     1:1.14.2-1.el7_4.ngx                      nginx
nginx.x86_64                     1:1.16.0-1.el7.ngx                        nginx
nginx.x86_64                     1:1.16.1-1.el7.ngx                        nginx
nginx.x86_64                     1:1.18.0-1.el7.ngx                        nginx
nginx.x86_64                     1:1.18.0-2.el7.ngx                        nginx
nginx.x86_64                     1:1.20.0-1.el7.ngx                        nginx
```

上記バージョンの中から、例えば`1.12.0`を使用したい場合は、インストールコマンドを実行する際に以下のように指定して実行します。

```
yum install -y nginx-1.12.0
```

特に弾かれずにインストールが完了し、以下のバージョン確認コマンドを実行して想定通りのバージョンがインストールされている事を確認できれば完了です。

```
nginx -v
nginx version: nginx/1.12.0
```

今回は以上です。
An error occurred while installing racc (1.5.2), and Bundler cannot continue. / You don't have write permissions for the /Library/Ruby/Gems/2.6.0 directory.


問題
--
rails newしたさいに以下のエラー

```
An error occurred while installing racc (1.5.2), and Bundler cannot continue.
```

以下を実行してみる

```
gem install racc -v '1.5.2' --source 'https://rubygems.org/'
```

なんか権限系のエラーがでた :thinking: 

```
You don't have write permissions for the /Library/Ruby/Gems/2.6.0 directory.
```

いろいろ調べてたら、rbenvでインストールしたrubyではなく、systemのrubyを使っていると出たりするらしい。
systemのrubyを使ってる場合は`which ruby`と実行すると、`/usr/bin/ruby`とかえるそうだ。
ただ自分の場合、`/Users/ユーザ名/.rbenv/shims/ruby`とかえることから、すでにrbenvでrubyを管理していた。うーむ謎 :thinking: 


解決策
--
結論、rbenvでrubyを管理してたけど、指定しているrubyがsystemのものになっているという状態だった。

```
rbenv versions
* system (set by /Users/ユーザ名/.rbenv/version)
  2.5.3
  2.5.8
  2.6.6
  2.7.1
```

なので、rbenvでインストールしたrubyを選択しましょう！

```
rbenv local 2.7.1
```

これでgemインストールできない問題も解決しました。
Flutterの sound null safety 対応でやったこと

## これは何？

Flutterの sound null safety で対応した時にやったことをまとめたもの

## アプリの構成

- 状態管理
  - Riverpod
  - StateNotifier
  - freezed

## 対応の流れ

公式がまとめてくれているのでまずはこちらを読むのが良い

https://dart.dev/null-safety/migration-guide

### 1. 使っているライブラリが対応しているかの確認

趣味プロダクトでどう対応するか調査している面もあったので、定期的に使っているライブラリが対応しているかの確認した

```bash
dart pub outdated --mode=null-safety
```

### 2. 自動マイグレーションを実行する

```bash
dart migrate
```

※ 今回の構成だとこのコマンドで単純にマイグレーションできなかったので 3. の手動対応で行った

### 3. マイグレーションできなかった箇所を手動対応する

#### Riverbed

https://riverpod.dev/docs/migration/0.13.0_to_0.14.0/

##### StateNotifierProviderの書き方が変わったので対応

状態もジェネリクスで追加で指定する必要がある

Before:

```dart
final provider = StateNotifierProvider<MyStateNotifier>((ref) {
  return MyStateNotifier();
});
```

After:

```dart
final provider = StateNotifierProvider<MyStateNotifier, MyModel>((ref) {
  return MyStateNotifier();
});
```


##### StateNotifierの取得方法、StateNotiferの状態を取得する方法が変更された

```dart
// 今まで
Widget build(BuildContext context, ScopedReader watch) {
  StateNotifier notifier = watch(provider);
}

Widget build(BuildContext context, ScopedReader watch) {
  State state = watch(provider.state);
}

// 今後
Widget build(BuildContext context, ScopedReader watch) {
  StateNotifier notifier = watch(provider.notifier);
}

Widget build(BuildContext context, ScopedReader watch) {
  State state = watch(provider.state);
}
```

Riverpodはマイグレーションツールが提供されている

https://riverpod.dev/docs/migration/0.13.0_to_0.14.0/#using-the-migration-tool-to-automatically-upgrade-your-projects-to-the-new-syntax


#### freezed

- 初期値がないフィールドは nullableにする
- 必須のフィールドは `@require` から `required` に書き換える
- `@late` を `late` に書き換える

```dart
@freezed
abstract class Sample with _$Sample {
  factory Sample({
    @required String value1,
    String value2,
  }) = _Sample;

  Sample._();

  @late
  String get value3 => value1 + (value2 ?? '');
}

@freezed
abstract class Sample with _$Sample {
  factory Sample({
    required String value1,
    String? value2,
  }) = _Sample;

  Sample._();

  late final String value3 = value1 + (value2 ?? '');
}
```

## まとめ

- Null Safety 対応のライブラリも増えてきておりそろそろ対応できるようになってきた
- マイグレーションコマンドは用意されているが使っているライブラリによっては利用できなくなる
- 各ライブラリごとに対応方法のドキュメントは書かれているので参考にすると良い
AWSでcrontabを使用する手順

#概要
あるshellスクリプトを定期実行するため、AWSでcrontabを使いました。
一つハマりポイントがあるので、記録として残しておきます。

#手順
####１　実行権限の付与

```shell
sudo chmod +x hoge
```

sudo をつけずに実行してもエラーが出ませんが、実行権限は付与されません。
緑色になっていることを確認しましょう。

####２　パスの修正
実行はホームディレクトリから行われると考えます。
パスはすべて絶対パスにしておくか、
以下のような一文を各シェルスクリプトに追加する工夫をします。

```shell
cd `dirname $0`
```

https://www.qoosky.io/techs/927115250f

####３ 　設定ファイルの作成
ツールでの作成をおすすめします。

http://scrap.php.xdomain.jp/create_tool/cron_setting_tool/

また、設定は``crontab -e`` で変更できますが、
ファイルを別に作成し、それを上書きした方が、バックアップが残せ、消去してしまったり、
誤動作があった場合でも対応できるため、多くの人が推奨しています。

例）毎分実行する場合

```crontab.txt 
* * * * 0 /home/ec2-user/environment/実行ファイル1.sh
* * * * 0 /home/ec2-user/environment/実行ファイル2.sh
* * * * 0 /home/ec2-user/environment/実行ファイル3.sh
```


####４　crontabへの登録 


```shell
crontab crontab.txt 
```

####５　実行の確認（デバック）
ターミナルを使用していると、実行結果がメールで届いたとの通知（``You have new mail in ディレクトリのパス``）がくるので、正常に実行できているか確認しましょう。

```shell
cat ディレクトリのパス
```
#ハマりポイント
AWSの認証の都合上、ルートユーザーが一定の期間ごとにログインしないと、エラーが起きて自動実行されません。
ルートユーザーがログインする以外で解決策分かる人いたら教えてください。

```shell
The provided token has expired
```

https://www.bioerrorlog.work/entry/cloud9-expired-token
Rubyの繰り返しstepについて

Rubyの学習においてstepというものを学習したので
備忘録を兼ねて書いておきます。

nからmまで数値をxずつ増やしながら何らかの処理を実行したいときに利用します。

構文は
`開始式.step(上限式,一度に増減する大きさ)`
のように書きます。

例
1から10まで２ずつ増やしたい時

```ruby
1.step(10, 2) { |n| puts n}
```
出力結果

`1
3
5
7
9
`

10から1まで２ずつ減らしたい時

```ruby
10.step(1, -2) { |n| puts n}
```

出力結果

`10
8
6
4
2
`
[Flutter]Containerの幅をいじる方法

```example.dart
class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        backgroundColor: Colors.teal,
        body: SafeArea(
          child: Column(
            //リストの順序を変更するやりかた
            //verticalDirection: VerticalDirection.up,
            children: <Widget>[
              Container(
                child: Icon(Icons.arrow_back),
                width: double.infinity,
                height: 100,
                color: Colors.white,
              ),
              SizedBox(
                height: 250
              ),
              Container(
                child: Icon(Icons.adb),
                width: double.maxFinite,
                height: 100,
                color: Colors.blue,
              ),
              SizedBox(
                  height: 90
              ),
              Container(
                child: Icon(Icons.arrow_back_ios_new),
                width: double.maxFinite,
                height: 100,
                color: Colors.yellow,
              )
            ],
          ),
        ),
      ),
    );
  }
}
```

![Screenshot_1621759250.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/586415/b964b4a6-4596-bfe6-6e58-ba15866deae4.png)


`SizedBox`のheightを決めることでContainer間の幅を決めることが出来る。

また
`verticalDirection: VerticalDirection.up`のup部分をdownにするなどして画面に表示される
Listの順番を入れ替えることが出来る。
ViewModel作成時に「java.lang.RuntimeException: Cannot create an instance of class 」のエラーになる時やったこと

ViewModel作成時に「java.lang.RuntimeException: Cannot create an instance of class 」のエラーになる時やったこと

#参考
[ViewModel作成時に「java.lang.RuntimeException: Cannot create an instance of class 」のエラーになる](https://teratail.com/questions/325174)

#エラー(Caused by)をたどる
Teratailにてhoshi-takanoriさんに教えて頂いたことですが、
「Caused by」をたどると、発生原因に近い内容を把握することができます。
M1 Mac mini がやって来た！【利用5か月目編】

　さて今回私がご紹介するのは、昨年2020年11月に発表された初のAppleシリコンとなる「M1」を搭載した新型Mac miniの*利用5か月目における使用感の感想文*となります。
　実はMac触ったことない（iPadとiPhoneは保有している）著者が、勢いで流行りものに飛びついてみた訳なのですが、これから購入する皆さんの参考になればと、徒然なるままにそこはかとなく書き作ろうと思います。
　ちなみに、2021年1月に、[【購入・セットアップ編】][1]も書いていますので、よろしかったらコチラもご参照ください。

[1]:https://qiita.com/takeC74/items/ccee069ca6f3894228aa

#▼初めてのMac。ズバリ感想

　Windows歴は25年以上ありますが、今回初めてMacなるものを触りました。5か月目といっても週末に何度か数時間触るくらいしか使っていませんが、先ず利用してみて感じた率直な感想を書きます。

##・イケてる点
###iPhone、Apple Watchとの連動
　iPhone、Apple Watchユーザなのですが、同じApple IDで利用すると、iphoneに入れているアプリ（Mailとか趣味のアプリとか）がMac上でも動かせます。<br>（Macでも動作するアプリは）
　これは意外と便利。感動したのが、Apple Watch連携。Apple Watchを身に着けて、Macのある席に戻ると、[自動的にロック解除するように出来る][2]るんです。
　会社の制約でオシゴト用には会社支給のWindowsを使っていますが、使用頻度の多い会社業務でMacを使いたいくらいです。
　あと、iPadとも同様な連携が出来るんだと思います。iPadは息子に占有されてしまっているので使っていませんが。

[2]:https://support.apple.com/ja-jp/HT206995
##・困った点
###文字変換・キーボード配列
　違うＯＳだから、そりゃそうだなんですが、Windowsとキーボード配列が違っていて、文字の変換とか方法とか違和感がありました。
　これはもう慣れるしかありませんね。[設定でWindowsと同じ使い方が出来る][3]みたいですが、それは邪道かと思い日々鍛錬してます。
　その他のＵＩとかも若干違うところがありますが、文字変換以外はそんなに迷う事がなく、気になりませんでした。
[3]:https://apple-no-kajirikata.com/1140/
##・性能、スペック
　購入したMiniは、メモリだけ8GB⇒16GBにカスタマイズアップしたものとなりますが、冒頭に述べました通り、まだそんなに使いこなしていないので特にスペックに不満を感じる点は出てきていません。
　気になったのは、けっこう頻繁に重めのアップデート（2、3GBある）が走るなってくらいですが、新機種だし、たまにしか起動していないからかもしれません。
　ちなみに、いま、Macで追加でインストールし、利用しているアプリは以下となります。
　　　　・[Inkscape][4]Inkscape（お絵描きソフト）
　　　　・[Blender][5]（3DCG）
　　　　・[VRoid Studio][6]VRoid Studio（3Dアバター）
[4]:https://inkscape.org/ja/
[5]:https://www.blender.org/
[6]:https://vroid.com/
#▼いつの間にか解消していた？Logicool無線キーボードの謎挙動。
　前回の記事で書かせていただいた通り、キーボードは、ロジクール社の３デバイス対応の[K375S][7]にしたのですが、しばらく使用していると、スペースキーが勝手に入りっぱなしの状態となり、カーソルが右にどんどん移動していく謎現象が発生しました。
　発生したのは今年2月か3月ごろでしょうか？Windows、Mac両方ともに発生し、キーボードのドライバ等を最新にアップデートしても、エアブラシで埃をはらっても、分解して清掃しても直りませんでした。
　ネットで[同様な事象][8]を起こされている方を確認しましたが、解決策は見つからず。
　Windowsの方は仕事にならないので、PC標準のキーボードに切り替えました。Macはというと、しばらくたったら事象は勝手に収まってしまいました。<br>（何かしらのアップデートで修復した？）
[7]:https://www.logicool.co.jp/ja-jp/product/k370s-k375s-multidevice-keyboard?crid=27
[8]:https://bbs.kakaku.com/bbs/K0000921543/SortID=22196321/
#▼DPケーブルの謎現象。画面がチカチカ切り替わる？？
　MACにはDPケーブル経由で接続していたのですが、こちらもしばらくすると、画面がチカチカ点滅するようになりました。<br>　これも[いろいろググった][9]のですが現象は解消せずでした。
　あきらめてMAC側にもHDMIケーブルで接続しなおしました。<br>　MAC、Windowsの画面切り替えが自動識別しなくなりましたが、モニタの切り替えボタンを何度か押すだけなので、そんなに苦ではないです。
[9]:https://www.amazon.co.jp/gp/customer-reviews/R3S2EZH299I8P6/ref=cm_cr_arp_d_rvw_ttl?ie=UTF8&ASIN=B00OLFM79C　　　
#▼で、現在のデスク（コクピット）外観。
　こんな感じです。<br>　当初WindowsPC（Dell社ノートPC）は、机のサイドデスク（写真手前側。映っていない）にカメラをこちらに向けてカメラとして使っていたのですが、無線キーボードの調子が悪いので27インチモニタの真下に置き、ニンテンドーDSみたいなダブルスクリーンで利用しています。Mac触る時だけ無線キーボードを取り出しています。
　Mac本体は机のサイドデスク（写真奥のメタルラック）に収納しています。
　Mac触るとき、ノートPCがちょっと邪魔なので、ノートPCを閉じて、何かしらモニタの奥に収納できる方法が出来ないか今模索中です。![desk1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/656547/d1c0209c-22a1-eeba-fec0-04a63f42ca6d.jpeg)![desk2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/656547/b635913b-5ccb-7e33-7a48-d22960b0318e.jpeg)　
　
#M1 Mac mini がやって来た！【利用5か月目編】は以上です
皆さん、いかがでしたでしょうか？　少しでも皆さんのご参考になれば幸いです。まだそんなに使いこなせていないのですが、また使ってみて気づきなど出てきましたら書いてみたいと思います。<br>
以上、最後までお読みいただきありがとうございました。
URLとURIの違い（「住んでいるのは河川敷」は間違い？）

# URLとURIの違い

URLは言わずと知れたサイトの住所などを表すもの。
URIは？と言われると、「ウッ・・」となる。
簡単に言うと、URIは「何かを特定する情報」。

#### URLでの会話

* 質問「あなたが住む住所は？」
* 返答「日本国大阪府堺市堺区AA区BB丁1-1-1」
* 質問「あなたが今いる座標は？」
* 返答「北緯34°東経135°」

#### URIでの会話

* 質問「あなたが住むところは？」
* 返答「大和川の河川敷」→ 正解
* 返答「日本国大阪府堺市堺区AA区BB丁1-1-1」 → これも正解

# URI (Uniform Resource Identifier)

URIには2種類ある。まず、これを知ると一気に理解しやすい。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224453/a8fa5f81-234d-65f5-e529-ba8b4fc2a325.png)


これがURLがURIの一部と言われるゆえん。
"一部"という表現がよくないんじゃないかな。
"一種"と言えばよかったんじゃない？

URIはURLもURNも包括しているので、
URIを教えてと言われてURLを答えてもOK。

# URL (Uniform Resource Locator)

URLとはリソースの場所のことで、URIの特定の表現タイプ。
Webサイトの住所を表すだけではない。

> \<scheme> ":" \<syntax for each scheme>

例)

* http://・・・サイトの住所
* https://・・・サイトの住所
* mailto://・・・メールアドレス
* svn://・・・SVNというバージョン管理システムのリソース場所
* file://・・・ファイルの場所
* ftp://・・・ファイル送受信時のファイルの場所

# URN(Uniform Resource Name)

ISBNを使って書籍を識別したり、国際標準視聴覚番号を使って映画を特定できるなどリソースの名前やそのもの自体を識別する。

> <URN> ::= "urn:" <NID> ":" <NSS>

例)

* urn:ISBN:1234567890・・・書籍
* urn:isan:000-0000-12345-1A2B・・・映画
Ubuntu 20.04でのOpenPose環境構築で困ったことがあった件について

# やろうと思ったこと
2021/5/23 現在でUbuntu 20.04 環境でOpenPoseが動く環境を構築しようとした

# 起こった問題
無事ビルドが完了したと思ってデモを動かしても人が認識されない
で、ビルドのログを眺めていると...
caffeeの学習済みモデルのダウンロード時にhash値が違うやらなんやらでダウンロードが失敗している模様
しかも、用意されているopenpose/models/のshファイルを実行して落とそうとしても失敗するというオチ
その上curlからでもできないという結果
# 原因と解決法
原因は以下のURLで語られていました。
'https://github.com/CMU-Perceptual-Computing-Lab/openpose/issues/1602'　
(OpenPoseのGitHubのissueの一つ)
にあるように、コロナの関係でサーバーの管理が現地でできない関係で修正ができない模様です。
（かれこれ半年か１年立ちますがまだ修正するためにサーバーに入れないようです）
ので、このURLの中にあるGoogle Driveから直接モデルを落としてOpenPoseのmodelsと置き換えましょう
これでOK
git commit時のチェック処理を無効化したい

git commit時にhuskey等を使って、事前にチェックをしている処理なんかがあると思います。
そちらの制約に引っかかって、うまくgit commitできないケースがあると思います。

一時的にチェック処理を外したい場合は--no-verifyオプションを使用します。


## 例えばこんなケース

`package.json`にこうした記述があると、`git commit`時に`yarn`の処理が走って、こちらのケースだとeslintのチェックが入ります。（huskyも入っているハズ）

```json:package.json
"lint-staged": {
    "**/*.js": [
      "yarn run eslint --fix hoge/*.jsx",
      "git add"
    ]
  }
```

## 無視するには

もちろんチェックすることは良い事ではあると思いますが、一時的に無視したい場合は、`git commit`時に`--no-verify`のオプションをつけると無視することが出来ます。

```bash
git commit --no-verify
```
【kintone】VSCodeから直接操作でデバッグ効率アップ

kintoneカスタマイズのデバッグに，なにを使っていますか？

大多数の方が，ブラウザのデベロッパーツールと答えるかと思います．
手順は，「デベロッパーツールを確認 -> コード書き換え -> ページ更新してデベロッパーツールを確認 -> コード書き換え -> ...」ですよね．

ブラウザとエディタを何度も行き来する動作，辛くないですか？

この記事では，エディタ(VSCode)の操作だけでデバッグするちょい技を紹介します．

## デモ

左がブラウザ(Chrome)，右がエディタ (VSCode)です．
VSCode側で，ページリロード，コンソールの表示，ステップ実行ができちゃいます．

![デモ.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/528077/6dfb1e30-dc4e-d897-8cc5-b24532a7da84.gif)
(↑カスタマイズでボタンを表示しようとして苦戦している様子です)

デモではわざわさボタンを押していますが，
デバッグ開始: F5
ページリロード: Cmd + Shift + F5
リジューム実行: F5
のように，ショートカットキーでの操作も可能です．

ソースマップさえ作成すれば，コンパイル・バンドル前のファイルにブレークポイントを設定することもできます．

## 利用するツール

下記ツールをインストールします．
Live ServerとDebugger for Chromeは，VSCodeの拡張機能なので，VSCodeにインストールします．

- [Visual Studio Code](https://code.visualstudio.com/)
 - [Live Server](https://marketplace.visualstudio.com/items?itemName=ritwickdey.LiveServer)
 - [Debugger for Chrome](https://marketplace.visualstudio.com/items?itemName=msjsdiag.debugger-for-chrome)
- [mkcert](https://github.com/FiloSottile/mkcert)
- [Google Chrome](https://www.google.co.jp/chrome/)

## 設定手順

### 1. Live Serverで配信したJSファイルをkintoneで読み込む

下記通りに設定すればOKです．
これさえ終われば半分以上終わったようなものなので頑張ってください．

https://developer.cybozu.io/hc/ja/articles/360026502091

### 2. 「/.vscode/launch.json」を作成する

プロジェクトルートに，.vscodeディレクトリを作成し，その中にlaunch.jsonを作成します．

```/.vscode/launch.json
{
  "version": "0.2.0",
  "configurations": [
    {
      "name": "kintone",
      "type": "chrome",
      "request": "attach",
      "urlFilter": "https://*.cybozu.com/k/*",
      "webRoot": "${workspaceRoot}/",
      "port": 9222,
      "sourceMaps": true,
      "trace": true
    }
  ]
}
```

### 3. リモートデバッグをオンにしてChromeを起動する

下記コマンドで，リモートデバッグをオンにしてChromeを起動します．

Mac

```bash
/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --remote-debugging-port=9222
```


Windows

```bash
<path to chrome>/chrome.exe --remote-debugging-port=9222
```

### 4. 起動したChromeでデバッグするkintoneアプリを開く

3で起動したChromeでデバッグするkintoneアプリを開きます．
あとは，VSCodeの操作でデバッグができます．

## 参考文献

- https://developer.cybozu.io/hc/ja/articles/360026502091
- https://marketplace.visualstudio.com/items?itemName=msjsdiag.debugger-for-chrome#attach
Roomの処理をAcitivtyでしようとして「Cannot access database on the main thread since it may potentially lock the UI for a long period of time.」と出た時やったこと

Roomの処理をAcitivtyでしようとして「Cannot access database on the main thread since it may potentially lock the UI for a long period of time.」と出た時やったこと

#参考
[Kotlin で Room を使う際に詰まったところをまとめる](https://qiita.com/toastkidjp/items/49ad3035a6df525ce040#cannot-access-database-on-the-main-thread-since-it-may-potentially-lock-the-ui-for-a-long-period-of-time)
[非同期処理のCoroutine(コルーチン)を始めてみよう ...](https://101010.fun/programming/android-kotlin-coroutine.html)
(上記のonDestroyでコルーチンのJobキャンセルし忘れがなくなり、記述も簡潔に書けるようになるとの記述がとても参考になりました。)

#結果
ScopedAppActivityを作成し各々のActivityにて継承してコルーチンを使用することにしました。

```kotlin

open class ScopedAppActivity: AppCompatActivity(), CoroutineScope by MainScope() {
    
    override fun onDestroy() {
        super.onDestroy()
        cancel()
    }
}
```
BigSurでpyenv installでのPythonアップグレードを諦めた件

MacOS BigSur環境でPython3.8.xのアップグレードができませんでした...
ってただそんな記事です。

##ハマったこと

brewに入っているpyenv

```bash
brew ls
... ... ... pyenv
... ... ...
```

pyenvでアップグレードをやってみたところ、次のエラーとなりました。

```python
pyenv install 3.8.7

python-build: use openssl@1.1 from homebrew
python-build: use readline from homebrew
Downloading Python-3.8.7.tar.xz...
-> https://www.python.org/ftp/python/3.8.7/Python-3.8.7.tar.xz
Installing Python-3.8.7...
python-build: use readline from homebrew
python-build: use zlib from xcode sdk

BUILD FAILED (OS X 11.2.3 using python-build 20180424)

Inspect or clean up the working tree at /var/folders/dm/w2kc18ms6ts9wnpn_jk2h5qc0000gn/T/python-build.20210523165537.58334
Results logged to /var/folders/dm/w2kc18ms6ts9wnpn_jk2h5qc0000gn/T/python-build.20210523165537.58334.log

Last 10 log lines:
checking for python3... python3
checking for --enable-universalsdk... no
checking for --with-universal-archs... no
checking MACHDEP... "darwin"
checking for gcc... clang
checking whether the C compiler works... no
configure: error: in `/var/folders/dm/w2kc18ms6ts9wnpn_jk2h5qc0000gn/T/python-build.20210523165537.58334/Python-3.8.7':
configure: error: C compiler cannot create executables
See `config.log' for more details
make: *** No targets specified and no makefile found.  Stop.
```

`configure: error: C compiler cannot create executables`
このエラーメッセージ、同じようにハマっている人がネットで見られました。

Big Surの環境だとXCodeのCコンパイラのバージョンがついていけてない？ような問題で上手くインストールできないような状況のようです。


## 対処方法

結論から行くと、Pythonのオフィシャルから最新版のPython3をインストールし直すのが1番早く、私はそちらで一旦バージョンアップを行いました。

https://www.python.org/downloads/

Xcodeのベータ版をインストールするとか、（上記のエラーだとちょっと違うようですが）zlibをインストールして対処する手順なんかもあるようですが...私の場合はうまくいきませんでした。

普通にMac版のPythonインストーラをダウンロードし、インストールしたところ、うまくバージョンアップできました。

```python
python3 -V
Python 3.9.5
```

## やりたかったこと

`pipenv install`を行いたかったのですが、こちらは3.8.x以降しかサポートされていないようです。
バージョンアップ後もちょっとハマったのでメモ書きですが、`pipenv install`するときはきちんと該当バージョンのpythonのPATHを指定する必要があります。

```python
which python3
/Library/Frameworks/Python.framework/Versions/3.9/bin/python3

pipenv install --python=/Library/Frameworks/Python.framework/Versions/3.9/bin/python3
```

こちらで`pipenv install`がうまくいきました。
※PATHじゃなくて、バージョンを指定することもできるようです。
OptunaでLightGBMを使おうとしたらmodule 'optuna.integration.lightgbm' has no attribute 'train'がでたので対処する。

# はじめに

データ分析の勉強をおろそかにしていたため、コンペを通して実践的に学ぼうと取り組んでいます。
そんな中、`LightGBM`を`Optuna`でハイパーパラメータチューニングしようとしたときに問題が起きたので、この記事を書きました。

また、このエラーがほぼネットに解決法がなかったです。しかし、起きることがありそうなので早く解決する手助けになればと思います。

# 環境
- Windows
- Docker
- Python3
- JupyterNotebook

今回の環境は[こちら](https://amalog.hateblo.jp/entry/data-analysis-docker)を参考にほぼ同じように作成しています。

あとで詳細は書きますが、これが原因となっていました。

# 問題

JupyterNotebookで以下のコードでハイパラチューニングをしました。

```model.py
import lightgbm as lgb
import lightgbm
import optuna.integration.lightgbm as lgbo


trains = lgb.Dataset(train_x, train_y)
valids = lgb.Dataset(val_x, val_y)

params = {'objective': 'regression',
          'metric': 'mae'
         } 

gbm_o = lgbo.train(params,
                    trains,
                    valid_sets=valids,
                    early_stopping_rounds=100,
                    num_boost_round = 1000,
                    verbose_eval=200,)
```

すると以下のエラーが出ます。

```
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-47-4c0b4b7f1bdb> in <module>()
      7 import optuna.integration.lightgbm as lgbo
      8 
----> 9 opt=lgbo.train(
     10     opt_params,
     11     trains,

AttributeError: module 'optuna.integration.lightgbm' has no attribute 'train'
```

optuna.integration.lightgbmにtrainはないよとエラーになっています。
ライブラリは読み込まれているようなので、なぜだろうとなりました。

# 解決方法

DOckerfileで利用しているイメージが古いのが原因でした。
いまのOptunaで利用されているライブラリを利用しているので、昔のイメージ(ライブラリ)では対応していませんでした。

[こちら](https://amalog.hateblo.jp/entry/data-analysis-docker)を全く同じく利用していたため、古いimageでバージョンが固定されています。

```Dockerfile
# kaggleのpython環境をベースにする
FROM gcr.io/kaggle-images/python:v56
(以下省略)
```

ですので、最新版にDockerfileで利用しているイメージを変更します。

```Dockerfile
# kaggleのpython環境をベースにする
FROM gcr.io/kaggle-images/python:latest
(以下省略)
```

こちらで無事動くようになりました。

# おわりに

データ分析をいざやってみようとするとわからないことばかり(知識ばかり)で、実際やってみるとやることはわかるがコードを動かせないという壁に当たってしまいます。

これは毎日ひたすらやっていくしかないなと思いました。
がんばります。

# 参考サイト

https://amalog.hateblo.jp/entry/data-analysis-docker
dCTF 2021 writeup

なんか書いてたんですが、少し放置していました。
供養します。

# Misc

## Encrypted the flag I have
画像からflagを読み取る問題。

括弧にあたる部分が左右で対応してそうだったのでSF的なアルファベットが由来かと推測。
「fictional alphabet」などと検索したところ、スターウォーズのアルファベットであることが判明。

認知度ォ

`dctf)mastercodebreaker(`

丸括弧、誤字じゃなかったです

## Don't let it run
PDFに仕組まれたコードがヒント。
Acrobatで何が出来るか見てたら`Javascript`との項目があったのでチェック。
`…` > `すべてのJavascript` のコードの中にflagを発見。

`dctf{pdf_1nj3ct3d}`

## Powerpoint Programming
PowerPointで実装されたログイン画面を突破するためのパスワードがflag。
マクロではない。

ファイルを直接開かず、PowerPointから選択することで編集画面を見ることが出来る。
アニメーションタブを開くといっぱいアニメーションが設定されており、上から順番に辿ると `DCTF` と要素がハイライトされることからflagの文字列が読み取れるとわかる。
`⚡` は要素の左側に表示されていることに注意。

`DCTF{PPT_1SNT_V3RY_S3CUR3_1S_1T}`

## Show us your ID
PDFのオブジェクトについて知識があるといい世みたいな話があってバイナリエディタとウェブの記事とにらめっこしていたが、面倒臭くなって`strings`でidっぽいものをエンコードしていったら見つかった。
バイナリが混ざってても割と読めるのでPDFと少し仲良くなれた。

`dctf{3b0ba4}`

# Crypto

## Julius' ancient script
シーザー暗号っぽかったが、通常のASCIIコードではうまくいかなかった気がする。
自分で文字の表を作ってうまく行けた感じのやつを提出。

`dctf{th3_d13_h4s_b33n_c4st}`

```python
import os

with open(f'{os.path.dirname(__file__)}/flag.txt', 'r') as file:
    char_list = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'
    text = file.read()

    d = ord(text[0]) - ord('d')
    for char in text:
        if char in char_list:
            index = (char_list.index(char) - d) % len(char_list)
            print(char_list[index], end='')
        else:
            print(char, end='')
```

# Web

## Simple web
通常ではNot Authorizedとはじかれてしまうフォームからflagを手に入れる問題。

ソースコードを除くと `hidden` 属性が指定された要素があることがわかるので、開発者ツールで `value=1` に書き換えた上でチェックボックスもマークし送信してflagをゲット。

`dctf{w3b_c4n_b3_fun_r1ght?}`

## Very secure website
ハッシュ値で認証するログイン画面を突破する問題。

ユーザーネームはadminであったためハッシュ値は既知。
パスワードの方は暫くわからなかったが、ハッシュ値が数字で始まっていること、`==`の弱い比較で照合を行っていることから、暗黙の型変換を利用して突破するのでは？？と当たりを付ける。
PHPでは`(int) "10fugahoge"` === `10`なので。。。

自身で探索を試みたものの、終わらなさそうなので「php 0e」で調べたところ「Magic Hashes」という脆弱性であることが分かった。
`0+e\d+` に該当する文字列同士の比較は 0の累乗(= 0) 同士として真と評価されるらしい。

該当する数値をパスワードとして送信してflagをゲット。

🧔🏻🔪 `==`

`dctf{It's_magic._I_ain't_gotta_explain_shit.}`

参考: https://www.whitehatsec.com/blog/magic-hashes/

## DevOps vs SecOps
他の問題のヒントを求めてdctf主催チームのGitHubを見たところ、[DCTF-chall-devops-vs-secops](https://github.com/DragonSecSI/DCTF1-chall-devops-vs-secops)というリポジトリをたまたま発見。

CI/CDの話が合ったのでActionsの中を探したところ、「Create ctfd.yml」の中でflagが出力されていた。
ちなみに、`challenge.yml`の中に`flags`という項目があったが関係なかった。
つらい。

`dctf{H3ll0_fr0m_1T_guy}`

# Welcome

## Sanity Check
トップページに記載されている。
ユーザー登録の際に求められるのかと思ったが、問題として設定されている。

`dctf{welc0m3_t0_dCTF}`
Javaでグラフを描画する（SpringBoot）

日次で資産運用のグラフを管理していますが、エクセルだとブログに簡単に貼れないので自作しようと思います。WEBサービスでよくある、インターネット上にデータを保管するようなものではなく、入力欄にエクセルからデータを貼り付けて、グラフ画像を作るだけのプログラムを考えています。（データを管理するとコストがかかるので・・・）

### 現時点の資産運用グラフ
https://zees.link/entry/2021/05/21/203654

上記のグラフと推移が一致するグラフ画像をプログラムで作ります。今日はまず分割線とチャートです。

**実際にプログラムで出力したチャート画像**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1535669/8ad1daa8-fce7-f4b8-f0d0-0e30a2d896eb.png)
**プログラム**
https://github.com/jamcookjapan/grapy/commit/567f8b2f444b1ef4a89e622babf3a4930cd897ae

Y軸との相関が怪しいですが、静的なデータを投入して描画して、一致する推移を描けました。JavaのdrawLineだと線の描画が滑らかではないので、丸いオブジェクトを推移に沿って配置することで滑らかに表示できるので修正していきたい。また、ブログの背景が白なので画像に黒枠を自動でつけるように修正します。対応が終われば、入力画面を作ってプログラムを運用始めます。

以上、よろしくお願いいたします。
「脳と計算機　（著ジョン・フォン・ノイマン）」まとめ

# 「脳と計算機　（著ジョン・フォン・ノイマン）」まとめ

本を読んだのでそのまとめ。
特に脳と計算機について比較があったのでそれを表にしたかった。
本では具体的な数字があったが、当時（1950年代)と現在ではコンピュータの性能に相当の違いがあるので定性的なもののみをまとめる

## 本の簡単な感想

本を通して、
計算機は直列方式で精度が高く、速度の速い計算、
脳は並列方式で精度は10^3程度で、速度も1ms程度のオーダーの計算
をするということが強調されていた。

これは現代の人工知能がGPUを用いて並列計算を多く用いていることを考えるととても興味深い考察に思える。

## 脳と計算機の比較


| | 計算機 | 脳 |
|---|---|---|
| 計算方式 | 直列（スパコンやGPUは並列） | 並列 |
| 速度 | 速い | 遅い |
| 数 | 少ない（現在は人間の脳には及ばないが、ラットの脳くらいの数はある） | 多い |
| 省エネ性 | 低い | 高い　|
| 同期性 | 同期が必須 | ゆとりがある |
| 論理的な安全性 | ソフトウェア的に保守しないと１つのエラーが致命的 | 周波数を使用するため１つのエラーの影響は小さい |

計算機はその直列式ゆえ、算術的深度、論理的深度が深い問題を解くことができるが、エラーが増幅してしまうため、精度がかなり必要。
一方、脳波そのような深度の深い問題は解けないが、深度が浅いためエラーが増幅しにくく、精度はそこまで必要ではない。
（１つの神経細胞がだせる周波数の幅が5~220程度（当時わかっていた範囲）であることから、脳の１つの神経細胞での計算精度は10^3以下と見積もっていた。）
Rubyアルゴリズム（Array Partition I）

## 問題

Given an integer array nums of 2n integers, group these integers into n pairs (a1, b1), (a2, b2), ..., (an, bn) such that the sum of min(ai, bi) for all i is maximized. Return the maximized sum.

 
```
Example 1:

Input: nums = [1,4,3,2]
Output: 4
Explanation: All possible pairings (ignoring the ordering of elements) are:
1. (1, 4), (2, 3) -> min(1, 4) + min(2, 3) = 1 + 2 = 3
2. (1, 3), (2, 4) -> min(1, 3) + min(2, 4) = 1 + 2 = 3
3. (1, 2), (3, 4) -> min(1, 2) + min(3, 4) = 1 + 3 = 4
So the maximum possible sum is 4.
```

```
Example 2:

Input: nums = [6,2,6,5,1,2]
Output: 9
Explanation: The optimal pairing is (2, 1), (2, 5), (6, 6). min(2, 1) + min(2, 5) + min(6, 6) = 1 + 2 + 6 = 9.
 ```

Constraints:

1 <= n <= 104
nums.length == 2 * n
-104 <= nums[i] <= 104

##  私の回答

```ruby
def array_pair_sum(nums)
    array = nums.sort.each_slice(2).to_a
    small_array = []
    array.each do |ary|
        small_array << ary.min
    end
    return small_array.sum
end
```
なんかごちゃっとしている気もするけど無事Accepted!!

やったことを書いていきます。

この問題は大きな配列に入っている数値を小さい数値順に並べ直し、2つずつペアにしていきますが
解き方に関しては数学の話なので省略して、コードについて以下に書いていきます。

まずここ

```ruby
    array = nums.sort.each_slice(2).to_a
```
小さい順番に並び替えます。

```ruby
    nums = [2, 4, 1, 3]
    array = nums.sort # => [1, 2, 3, 4]
```
2個ずつ数値の入った配列へsliceしていきます。

```ruby
    array = nums.sort.each_slice(2).to_a # => [[1, 2], [3, 4]]
```
空の配列を作り、そこに上で作った小さな配列のうち小さい方の数値を入れていきます。

```ruby
    small_array = []
    array.each do |ary|
        small_array << ary.min
    end
```
最後にそれらを足したものを返り値として返して終了。

```ruby
    return small_array.sum
```

**無事Accepted!!**
しかしなんだかごちゃごちゃしているような気がする。
もっと綺麗な方法がありそう。
Spring 案件ソルーション3 Validation 手順書フォルダ

#背景　
Springの機能を確認したかった。
特にValidationを一旦なんとかしておきたいなと思っています。
#やって見て・・・
9 Spring Security → 一旦パス
10 Spring Test→ テスト強化の時にやりたいと思います。
#リソース
Spring Boot 2 入門: 基礎から実演まで   原田 けいと https://www.amazon.co.jp/dp/B0893LQ5KY/ref=cm_sw_r_tw_dp_BV9D710FBKGWDJJJ3NF9

#TakeAway
## ちゃんと想定通りのJavaバージョンになっているか。
Javaの環境設定
コンパイラー
## lombokの設定
1.サイトからlombok.jarをダウンロードする。

2.⁨⁨/Applications/SpringToolSuite4.app/Contents/Eclipse/へlombok.jarを配置する。

3./Applications/SpringToolSuite4.app/Contents/Eclipse/SpringToolSuite4.iniへ下記を追記する。
-javaagent:/Applications/SpringToolSuite4.app/Contents/Eclipse/lombok.jar
4.STSを再起動する
##Validation
###1stStep
まずはここから
https://itsakura.com/java-springboot-validate
公式
https://spring.pleiades.io/guides/gs/validating-form-input/
###2ndStep
####主要クラス・ファイル
WebConfig
SignupController
GroupOrder
ValidGroup1 
ValidGroup2
ValidGroup3
SignupForm
signup.html
messages.properties
pom.xml
##ログについて
###ログ設定
lombok 設定必要
@Slf4j
→ アノテーション必要。
###ログのレベルを変えたい。→
application.properties に
logging.level.<パッケージ名>や<クラス名>を追加
logging.level.com.example.demo=trace
###パスの指定
logging.file.path=./log
###ファイル名の指定
logging.file.name=./log/application.log
参考アドレス
https://github.com/noikedan/SpringSample/tree/master/SpringSample
参考書籍　
https://www.amazon.co.jp/dp/B07H6XLXD7/ref=cm_sw_r_tw_dp_9RV3PNQ8RNPWFZ0Y1QJM 
参考アドレス
https://docs.jboss.org/hibernate/validator/6.1/reference/en-US/html_single/#validator-defineconstraints-spec
##AOP
参考アドレス
https://qiita.com/daisuzz/items/de937816a5d7c9210469
https://github.com/noikedan/search

##Testのやり方
@SpringBootTest・・・SpringBootの機能を有効にします。
@Transactional・・・テスト開始から終了までを、トランザクション処理にします。これを付けると、各テスト後に、データが初期化（ロールバック）されます。
##自作サービス
https://github.com/noikedan/search
Automation 360を使っていて探した部分

#はじめに
https://qiita.com/etoootak/items/a26fd05af4ec4677079e
の続編です。
Automation Anywhere V11からAutomation 360に変えて結構たつのですが、まだ慣れていません。Automaion 360を使っていて、これどうやるんだっけ？？
と探し回ったネタを備忘として書いておきます。


#グローバル変数を自分用に書き換えたい
グルーバル変数をBotの中で書き換えるのは、できません。
修正したいときは、コントロールルームのBot==>グローバル値で書き換える事で個人用の共通変数とする。

#Botの名称を変更したい
Botの編集画面で左上のBot名の近くにマウスをもって行くと鉛筆マークが出ます。
鉛筆マークを押すと「TaskBotを編集」になるので、そこで名前の変更ができます。
![rename.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/632535/b431868b-4cda-9a0b-9680-3186e83136a3.jpeg)


#Botファイルを別のフォルダに移動したい
これも同じく、Botの編集画面で左上のBot名の近くにマウスをもって行き、鉛筆マークを押すと「TaskBotを編集」を出す。
ここで「フォルダ」の右に「選択」があるので移動したいフォルダを選んで、更新。

# ２つのBot間で処理をコピーしたい
「共有クリップボード」というものを経由します。
詳しくは以下に。
https://qiita.com/etoootak/items/a4cbe8a446a6101b7106

# データテーブルを作るときに列のタイプを文字列以外にする
「テーブルの編集」の"--"を押して「列タイプ」を選択します。
![tabledata001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/632535/5da8a73e-eefc-da4c-ee9c-04657c636b3d.png)


#Bot Insightで日々の処理値をグラフにしたい
Bot Insightのビジネスダッシュボードで「分析を入れたBot」で設定した日々の処理値をグラフにしたい。
Community Edition（Creator端末）ではできない。
そのとき動かした１回の値は表示できる。

#おわりに
使っていて悩んだら、追加していきます。
AWSとWordPressを使ってWebサイトを構築しよう⑪

<h2>■プライベートサブネットの作成</h2>
今回はプライベートサブネットを作成していきます。
プライベートサブネットにはデータベースを持つDBサーバーを配置します。
よって悪意ある者からデータベースにアクセスされて情報を抜かれたりしないように、インターネットから接続できないようにしてセキュリティを高めた構築をします。

まずは下記の画像を見て全体のイメージを理解しましょう。
Webサーバーと違いインターネットゲートウェイに接続しておらず、インターネットとの接続ができないようになっています。
![スクリーンショット 2021-05-22 11.38.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1159544/4db15fbc-ff8b-c22b-f52e-d8dab7087c32.png)

#目次
[1.プライベートサブネットを作成する](#1-プライベートサブネットを作成する)

#1. プライベートサブネットを作成する
まずプライベートサブネットを作成する前に現在パブリックサブネットがどこのアベイラビリティゾーンで構成されているか確認します。
（サブネットは別々のアベイラビリティゾーン同士でも接続はできますが、接続するアベイラビリティゾーンが異なるとアベイラビリティゾーンが配置されている距離の問題で通信の遅延(とはいえ高速専用線で接続されているので遅延は数ミリ秒に抑えられている)が増加したり、アベイラビリティゾーン間の通信費用が発生するため今回はパフォーマンス面・コスト面から同じアベイラビリティゾーンで構築していきます。）

VPCの画面へ移行し左メニューから「サブネット」を選択し、作成した「Public_subnet」を選択し画面下に表示される「アベイラビリティゾーン：ap-northeast-1a」を確認してください。

今回はap-northeast-1aで作成されていますが、どこのアベイラビリティゾーンで作成されているかは環境によって異なるのでご自身のアベイラビリティゾーンを確認してください。
![スクリーンショット 2021-05-23 15.48.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1159544/348e6f50-c45f-c310-c112-f4b7d283649a.png)


アベイラビリティゾーンが確認できたらプライベートサブネットを作成していきましょう。

VPCの画面へ移動し左メニューから「サブネット」を選択し、右上にある「サブネットを作成」をクリックしてください。
![スクリーンショット 2021-05-22 11.56.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1159544/7b2a43f7-e5cd-371c-9761-11ea7054776b.png)

「サブネットの作成」画面へ移行するので下記のように入力してください。
<b>・VPC ID：作成したVPCを選択</b>
<b>・サブネット名：「Private_subnet」と入力</b>
<b>・アベイラビリティゾーン：ご自身で作成したPublic_subnetと同じアベイラビリティゾーンを選択</b>
→今回は「アジアパシフィック(東京)/ap-northeast-1a」を選択
<b>・IPv4 CIDRブロック：「10.0.2.0/24」と入力</b>
※「キー」と「値」はサブネット名を入力すれば勝手に入力されます。

全て入力できたら右下にある「サブネットの作成」をクリックしてください。
![スクリーンショット 2021-05-23 15.55.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1159544/6bab8eb5-6800-d967-1e9d-81b074aa8503.png)
![スクリーンショット 2021-05-23 15.56.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1159544/0b5f2c81-44c7-dd0f-3268-dfdc09e3ba40.png)

作成できたか確認するためもう一度左メニューから「サブネット」を選択してください。
すると「Private_subnet」が作成されているのが分かります。
またPublic_subnetを作成した時にはインターネットとの接続用にルートテーブルを設定しましたが、Private_subnetはインターネットと接続しないので下記画像のようにデフォルトのルートテーブル設定のままでOKです。
![スクリーンショット 2021-05-23 16.08.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1159544/ac499792-0dd2-fc64-bd40-e9189647e049.png)

</br>
今回はここまで。
次回は作成したプライベートサブネットにサーバーを構築していきます。

次の記事はただいま執筆中です！
UITapGestureRecognizer どこでもTap swift

#■UITapGestureRecognizer　とは
指定した場所でTapActionを行えるようにするもの

これによりbutton以外の場所でもTapを行えるようにする事ができる。

以下のようなアクションに対応させることが可能

■ピンチ
■パン (ドラックのこと)
■スワイプ
■ローテート（回転）
■ロングプレス（長押し）
■エッジ　(スワイプで前の画面へ)

今回は基本的なタップでの処理をご紹介します。

#まず全体のコードはこちら

■準備
今回はstoryboardにviewを一つ作りview1として繋げます。

``` swift
import UIKit

class ViewController: UIViewController {

    @IBOutlet private weak var view1: UIView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        view1.backgroundColor = .green
        let tapAction = UITapGestureRecognizer(target: self, action: #selector(viewTap(sender:)))
        view1.addGestureRecognizer(tapAction)
    }
    
    @objc private func viewTap(sender: UITapGestureRecognizer) {
        
        if view1.backgroundColor == UIColor.green {
            view1.backgroundColor = .blue
        } else {
            view1.backgroundColor = .green
        }
    }
}
```

#コードの説明
``` swift
let tapAction = UITapGestureRecognizer(target: self, action: #selector(viewTap(sender:)))
```
tap処理としてUITapGestureRecognizerを書きtargetをselfにしてactionにメソッドを書く
tapしたらそのメソッドを発動するよ

``` swift
view1.addGestureRecognizer(tapAction)
```
view1にtapActionを登録

``` swift
 @objc private func viewTap(sender: UITapGestureRecognizer) {

        if view1.backgroundColor == UIColor.green {
            view1.backgroundColor = .blue
        } else {
            view1.backgroundColor = .green
        }
    }
```
tapされたタイミングでメソッドの中身が発動
view1が緑なら青に
view1が緑意外なら緑に

#結果
buttonを使わずにコードでtapActionを行えるようになりました。
UITapGestureRecognizerを使えば好きな場所でbuttonを使わずにtapActionを行えますね！！

![UItap.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1099804/86475fd0-4964-5806-aee1-8aa32f201e25.gif)
１年間プログラミングを学習してきて感じた10の気づき

#はじめに

私は2020年のGWから機械学習を目的にPythonを独学で始めました。
その後、自力での学習に限界を感じた結果、
その年の8月からいわゆる『公文式』のプログラミングスクールに通いました。
やがて、本格的にプログラミングを学んで就職したいという思いが強くなり、
現在は**G's Academy Tokyo**という起業家・エンジニア養成スクールに通っています。

今回はプログラミング学習を始めて1年経過したことを踏まえ、
学習してきた中で感じたことやこれから継続していきたいことを
この記事にまとめました。

駄文ですが、お付き合いのほどよろしくお願いいたします。

#学習してきた言語
Python（pandasによるデータ処理・scikit-learnによる機械学習・DjangoによるWebアプリケーション作成)
HTML・CSS・JavaScript（jQuery含む）
（以下、少し触れた程度）
PHP・SQL・React

#10の気づき
インプット・アウトプット・エラー・その他に分けて書きます。

###インプット編
####1.全体観を把握してから学習を始める
プログラミングの学習教材は分厚いものや量が多いものが多いので
『1日数ページ進める』としたくなる人が多いかもしれませんが、
やめておいた方がいいです。
早いうちに全体像を把握し、
**『どういう記述をすればいいのか』『何ができるのか』**などといったこと
を確認した方がいいです。
とりあえずProgateやりましょう。
ちなみに自分はPythonも機械学習も何も分かっていなかった状態から、
GWを使ってUdemyのデータサイエンス講座を1週間で強引に見終わりました。
記憶に定着させるという点では微妙でしたが、
機械学習の概略やデータの扱い方を
知ることができ、その後の学習方針を立てる上で大いに役立ちました。

####2.実践を重視する
アウトプットと重複しますが、
一通り言語の基礎学習が終了したら、
**どんどん手を動かして作ってしまいましょう。**
実際に物を作ることで必要な技術がわかり、
習得が早くなります。
私が今通っているスクールは毎週アプリを作成する課題が出される
スパルタスクールです。
プログラムを書いて、プロダクトを作ることで
否でも応でも実力が付きます。

作りたいものがないのであれば、
既存のサイトやアプリを真似したり、
UdemyやTechpitで教材を購入して
ガンガン手を動かしましょう。
その際にオリジナリティを加えると◯です。

####3.量を確保する
プログラミングはとにかく手を動かすことが大事です。
**同じものを作り直したり、
同じようなレベルの他の教材に取り組みましょう。**
私が前所属していたスクールでは
一回の教材を5回やり直さないと次のコースに進めない
形式でしたが、初めは手が立たない内容でも、
何回も繰り返すうちに何も見なくてもコードを書いたり、
他人が描いているコードの内容が理解できるようになりました。

###アウトプット編
####4.言語化・視覚化する
手を動かすことは大切ですが、
プログラムを書き始める前に自分が作成したいものを
**言語化・視覚化**しましょう。
プログラムは上から下へ流れて行くので、
事前にどのような手順で動かしたいのかを
しっかりと整理しておきましょう。


####5.分割する
**分割して考えましょう。**
例えば、作成している課題にjQueryのプラグインを入れたい時、
いきなり自分が作成しているコードに入れてしまうと、
上手く稼働しなかった時にコードを
修正する手間がかかり面倒です。
まずはそのプラグインが単体で自分の環境で動作するか確認し、
確認できて始めて作成しているコードに
組み入れるという方法がよいと思います。

####6.コードが汚くてもいいのでとにかく動かす
とにかく書き上げましょう。
同じ手順を何回も繰り返すから、
関数化しようとか、
別の手段を考えようとすると余計に時間がかかります。
まずは書いたコードで動くかどうかを
**実際に目で確認することが重要です。**

###エラー編
####7.とりあえずコピペ→ググる
エラーが出てきたら、
とりあえず**コピー＆ペーストして検索**しましょう。
他の方も同じようなエラーに直面している可能性が
高いので検索すれば、
解決策が見出せることが多いです。
また、単純にググるのではなく、
QiitaやTeratail、Stack Overflowで
直接検索すると良い結果が得られやすいです。
ちなみにこれはエラーに限らず、
普段の学習で詰まったら、検索しましょう。
『自走力』が大切です。

####8.手を動かして原因を探る
エラーの内容を把握したら、
**自分の手でエラーの原因を確認しましょう。**
JavaScriptであればalertやconsole.logを、
Pythonであればprintでエラーの原因を探りましょう。
例えばボタンをクリックした時反応しないということであれば、
ボタンの動作の一番初めにalert関数を入れることで
jQueryに問題があるか、それとも
中の関数に問題があるかを把握できます。

####9.質問する
自分で試行錯誤して
解決できない場合は
質問しましょう。
これに関しては次の記事が詳しいです。
https://qiita.com/seki_uk/items/4001423b3cd3db0dada7

また、**質問するために現状を言語化することで、
自力で問題が解決することもあります。**

###その他
####10.知識は共有する
現在のスクールに入って思うことは、
『複数人の力ってすごい』ということです。
スクールの他の方の素晴らしい課題を見ることができる上に、
自分が手間をかけることなく、
使った技術を学ぶことができます。
また、色々な情報が入ってきます。
これはエンジニア全体に言えることです。
Github経由で無料で素晴らしいプログラムを入手することができますし、
このQiitaのように様々な経験知に容易にアクセスすることができます。

私はずっと独学で学習してきたので、
この考え方に少し抵抗がありましたが、
一度慣れると**『共有って素晴らしい！』**と思えるようになりました。

#おわりに
プログラミング学習を1年間継続してきましたが、
自分はまだまだ未熟者です。
こうしてQiitaに投稿することに非常に抵抗を感じていましたが、
一番最後に述べた考えに基づいて投稿しました。
私の経験が少しでも力になれば幸いです。
ここまで読んでくださり、ありがとうございました！
Raspberry Pi Pico C/C++ SDKのタイマ用関数のまとめ 

#概要

Raspberry Pi Pico C/C++ SDKのタイマ用関数のメモ
公式ドキュメントの[Raspberry Pi Pico C/C++ SDK](https://datasheets.raspberrypi.org/pico/raspberry-pi-pico-c-sdk.pdf)「4.1.22. hardware_timer」「4.2.12. repeating_timer」の中から
とりあえずよく使うフリーランニングタイマ、周期タイマ関係のみ抜粋。よくわからない部分が多いです。

#フリーランタイマ
##関数

```C
static uint32_t time_us_32 (void)
引数：なし
戻り値：1カウント1us,32bitタイマのカウント値
機能：1カウント1us,32bitタイマのカウント値を取得
     ※64bitタイマの下位32bitを読みだしている
```


```C
uint64_t time_us_64 (void)
引数：なし
戻り値：1カウント1us,64bitタイマのカウント値
機能：1カウント1us,64bitタイマのカウント値を取得
     ※内部的にはまず上位32bitを読み出し,その後下位32bit読み出しているため
      タイミングによっては上位,下位の同期が取れない可能性があり一致待ちのループをしている
      特に必要がない限りtime_us_32を使った方がよさそう
```


```C
void busy_wait_us_32 (uint32_t delay_us)
引数：uint32_t delay_us 待ちたい時間[us]
戻り値：なし
機能：時間経過するまで無限ループ
```


```C
void busy_wait_us (uint64_t delay_us)
引数：uint32_t delay_us 待ちたい時間[us]
戻り値：なし
機能：時間経過するまで無限ループ
```

```C
void busy_wait_until (absolute_time_t t)
引数：absolute_time_t t 1カウント1us,64bitタイマカウント値の構造体
戻り値：なし
機能：64bitタイマカウント値が指定された値になるまで無限ループ
     電源投入からXXus待ちたいときに使う?
```

```C
static bool time_reached (absolute_time_t t)
引数：absolute_time_t t 1カウント1us,64bitタイマカウント値の構造体
戻り値：タイマカウント値が指定した値に到達したか?
機能：タイマカウント値が指定した値に到達したかを判定する
     電源投入からXXus経過したか判定したいときに使う?
```

#周期タイマ

##関数
```C
static bool alarm_pool_add_repeating_timer_ms (alarm_pool_t *pool, int32_t delay_ms, repeating_timer_callback_t
callback, void *user_data, repeating_timer_t *out)
引数：alarm_pool_t *pool (よくわからない.アラームの設定情報?)
     int32_t delay_ms タイマ周期[ms]
                       ※>0の場合はコールバック処理終了→コールバック処理開始間の時間
                         <0の場合はコールバック処理開始→コールバック処理開始間の時間
                         =0の場合は1us
     repeating_timer_callback_t callback コールバック関数(割り込み関数)
     void *user_data (よくわからない)
     repeating_timer_t *out 周期タイマの設定情報
戻り値：設定成功したか?
機能：1ms単位周期タイマを設定する。
```

```C
bool alarm_pool_add_repeating_timer_us (alarm_pool_t *pool, int64_t delay_us, repeating_timer_callback_t callback,
void *user_data, repeating_timer_t *out)
    alarm_pool_add_repeating_timer_msのus版
```

```C
static bool add_repeating_timer_ms (int32_t delay_ms, repeating_timer_callback_t callback, void *user_data,
repeating_timer_t *out)
    alarm_pool_add_repeating_timer_msのデフォルトpool使用版
```
```C
static bool add_repeating_timer_us (int64_t delay_us, repeating_timer_callback_t callback, void *user_data,
repeating_timer_t *out)
    alarm_pool_add_repeating_timer_usのデフォルトpool使用版
```

```C
bool cancel_repeating_timer (repeating_timer_t *timer)
引数：repeating_timer_t *timer 無効にしたい周期タイマ
戻り値：成功したか?
機能：周期タイマを無効にする
```