OmniAICreator/Qiita-1.07M huggingface dataset:
Laravel　学習メモ

#関数など
##{{ route('ルートの名前') }}
web.phpを参照して、該当のルートに繋げる。

`route('ルートの名前', $post->id)`とすると、
そのルート先のControllerに引数が渡される。

##{{ asset('cssやイメージ') }}
publicを参照して、そこをドキュメントルートとして該当のファイルを読み込む。
例えば、public/css/layout.cssというファイルを読み込む際には、
`{{ asset('css/layout.css') }}`
という記載にする。

##store('public/image')
画像を保存する際に用いられることが多い。
`storage/app`を参照して、引数のディレクトリにファイルが保存される。
なお、`public/image`はこの関数を実行することで自動で作成される。

##with('key', 'value')
別のリンクへリダイレクトを行う際に、

```php
return redirect('/')->with('flash_message', '投稿が完了しました');
```

と記載するとリダイレクトされるとともに、セッションデータを作成してくれる。
第一引数がセッションのキーで、第二引数がそのキーの値となる。

#各設定
##バリデーションを日本語に変更する
confing/app.phpの`local`が`en`になっていて、これは
`resources/lang/en`のバリデーション使用しているという意味。
`resources/lang/ja`のディレクトリを作成して、その中に日本語に変更しているファイルを作成して、`local`を`ja`に変更することで日本語のバリデーションに変更される。

#リレーション
##マイグレーションファイルの編集の段階

```php
$table->bigInteger('user_id')->unsigned();
$table->foreign('外部キー')->references('主キー')->on('主キーのテーブル名')–>onDelete('cascade');
```

まず、foreignキーを使用するには、
子キーとなるものには必ず、`unsigned()`が必要で、
また型は、`bigInteger`を指定する。

`foreign`　:　外部キーを設定する
`references`　:　主キーを指定（別のテーブルの）
`on`　:　主キーのあるテーブルを指定
`onDelete`　:　主キーが削除されたら自動的に関連したレコードも削除される指定

##blongsTo()で他のテーブルのレコードを引っ張り出す
主テーブル：category　ローカルキー：id
従テーブル：posts　外部キー:category_id

```php:Post.php(モデル)
//Categoryモデルと結びつける
//関数名は必ず結びつける先のモデル名にすること
public function category(){
        return $this->belongsTo('\App\Category');
    }
```

```php:PostController.php(コントローラー)
//index()の中に追加する
        $posts->load('category');
```

```php:index.blade.php(ビュー)
//＄postからさきほど作成したcategoryメソッドでその中のcategory_nameを取り出している
{{ $post->category->category_name }}
```

##Authのバリデーションを日本語にする
プロジェクト直下でコマンドを打つ


```
php -r "copy('https://readouble.com/laravel/5.8/ja/install-ja-lang-files.php', 'install-ja-lang.php');"
php -f install-ja-lang.php
php -r "unlink('install-ja-lang.php');"
```

これでOK

##別のコントローラのメソッドを使用する

```php:コントローラー
$home_controller = app()->make('App\Http\Controllers\HomeController');
$deliveries = $home_controller->show_reserve_delivery();
$items = $home_controller->show_reserve_item();
```

##フラッシュメッセージ

```php:controller
return redirect('/')->with('flash_message', '投稿が完了しました');
```

```php:blade
 <!-- フラッシュメッセージ -->
@if (session('flash_message'))
    <div class="flash_message">
        {{ session('flash_message') }}
    </div>
@endif
```
:observer.start()するとクラッシュしてしまう

![スクリーンショット 2021-02-20 10.14.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1789/573db274-e26d-f9ea-63b7-45de3ddb533f.png)

https://github.com/asdf-vm/asdf-erlang/issues/183#issuecomment-762113618

原因は、おそらくwxwidget3.0はBig Surを完全にサポートしておらず、3.1からサポートしているが、brewでインストールできるwxmacのバージョンが3.0であるためではないかとのこと

```
asdf uninstall erlang 23.2.5
brew uninstall wxmac
```

```
brew install cdalvaro/tap/wxmac
brew edit cdalvaro/tap/wxmac
```

kiteというvim系のエディタが起動するので、
bottle do句のところを削る（削らないとコンパイルせずダウンロードしてしまう）
install句のargに"--enable-compat28"を追加する（erlangのコンパイラがオプションが必要という）

再インストールする

```
brew reinstall cdalvaro/tap/wxmac
```

erlangも再インストールする

```
asdf install erlang 23.2.5
```

んー、ダークモード
![スクリーンショット 2021-02-20 11.01.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1789/46d57f42-6a6d-8285-6acd-d9ba777d9b7d.png)
ソースコードの行数を調べてヒストグラムを作成するワンライナー

## 準備
[bitly/data_hacks](https://github.com/bitly/data_hacks) を使うと簡単にヒストグラムが出力できる。

それをあらかじめインストールしておく(※Python2.x系でしか動かないっぽい)

```
pip install data_hacks
```

## ワンライナー

以下のワンライナーでデータを収集してヒストグラムの出力ができる。

```
find ./app -name *.rb |xargs wc -l | sed '$d' | awk '{ print $1 }' | histogram.py 
```

出力結果

```
# NumSamples = 1359; Min = 1.00; Max = 746.00
# Mean = 61.732156; Variance = 6981.429363; SD = 83.554948; Median 34.000000
# each ∎ represents a count of 13
    1.0000 -    75.5000 [  1047]: ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
   75.5000 -   150.0000 [   183]: ∎∎∎∎∎∎∎∎∎∎∎∎∎∎
  150.0000 -   224.5000 [    65]: ∎∎∎∎∎
  224.5000 -   299.0000 [    34]: ∎∎
  299.0000 -   373.5000 [     9]:
  373.5000 -   448.0000 [     6]:
  448.0000 -   522.5000 [     6]:
  522.5000 -   597.0000 [     6]:
  597.0000 -   671.5000 [     2]:
  671.5000 -   746.0000 [     1]:
```


## やってること

個々のコマンドでやっていること書いておく

### ファイルを抽出

`vendor/bundle` とか含めると邪魔なので `./app` 配下の `*.rb` ファイルだけに絞り込んでいる。

```
find ./app -name *.rb
```

### ファイルの行数を調べる

`find` の結果、出力された個々のファイルに対して `wc` コマンドを実行して行数を求める

```
xargs wc -l
```

### 最終行(total)を取り除く

`sed` コマンドで最終行を取り除く

```
sed '$d'
```

### 行数の部分を取り除く

上記までだと、行ごとに `175 ./app/hoge/fuga.rb` のような出力になっているので、これの行数を表す数字部分だけを抽出する。

```
awk '{ print $1 }'
```

### ヒストグラムを作成する

```
histogram.py
```
できあがり

## さいごに

`sed` や `awk` の使い方、いつもググって出てきたのを参考にしているので、もっとちゃんとした使い方がありそう。
Raspberry Pi IotボードMCP3004 ver. GPIO割付け一覧

![IoT20210124.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162127/ba3880cb-7af2-b45b-33ba-c3720cd8b482.png)

####Raspberry Pi

|GPIO#|Parts|function|assign/memo|
|--:|:-:|:-:|:-:|
|GPIO7   |MCP3004   |C̅S̅|SPI|
|GPIO9   |MCP3004   |DOUT |SPI|
|GPIO10   |MCP3004   |DIN |SPI|
|GPIO11   |MCP3004   |CLK |SPI|
|GPIO14|SW1|汎用   |押すとLOW *1|
|GPIO15   |SW2|汎用   |押すとLOW *1|
|GPIO20   |Sensor#0-Power|3.3V|*2|
|GPIO21   |Sensor#1-Power|3.3V|*2|
|GPIO22   |Sensor#2-Power|3.3V|*2|
|GPIO23   |Sensor#3-Power|3.3V|*2|
|GPIO27   |ブザー|||

*1 プルアップしていない(ソフトウェアでプルアップ必要)
*2 Highにするとセンサーに3.3Vが供給される

####[MCP3004]((https://akizukidenshi.com/catalog/g/gI-11987/)) (10bit 4ch ADコンバータ)

|Function| 2 | 3 |
|:-:|:-:|:-:|
|ADC0|センサ入力#0|GPIO20で電源供給|
|ADC1|センサ入力#1|GPIO21で電源供給|
|ADC2|センサ入力#2|GPIO22で電源供給|
|ADC3|センサ入力#3またはサーミスタ|センサ入力時はGPIO23で電源供給|

![2021-02-20_10-42-50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162127/3d8faf08-3c27-1083-b906-cf1af416d35f.png)


###ADC-CON

|Pin|Function |Memo|
|:-:|:-:|:-:|
|1  |GND   | |
|2  |GPIO20| |
|3  |ADC0  |MCP3004   |
|4  |GND   | |
|5  |GPIO21| |
|6  |ADC1  |MCP3004   |
|7  |GND   | |
|8  |GPIO22| |
|9  |ADC2  |MCP3004   |
|10 |GND   | |
|11 |GPIO23/バッテリー電圧|BAT-DELECTで切り替え |
|12 |ADC3/サーミスタ  |ADC3/NTC-SELECTで切り替え   |

###[サーミスタ](https://akizukidenshi.com/catalog/g/gP-05252/) NCP18XH103F03RB

投稿メモ
2021/2/20 初版・・・これからプログラムを作るので検証していない状態
【Rails】特定のカラムのオプションだけを変更したい

Rails6.0.0でアプリを作っていて、既に作成済みのテーブルのカラムにオプションの制約をつけ忘れていた。
なので、特定のカラムのオプションだけを追加で設定する方法をまとめる。
## 現状
現状のマイグレーションファイルは以下のように「null:false」オプションを付け忘れているカラムがある。

```ruby
class CreateItems < ActiveRecord::Migration[6.0]
  def change
    create_table :items do |t|
      t.string     :name
      t.text       :explain
      t.integer    :price
      t.references :user,            null: false, foreign_key: true
      t.integer    :category_id,     null: false
      t.integer    :item_status_id,  null: false
      t.integer    :shipping_fee_id, null: false
      t.integer    :prefecture_id,   null: false
      t.integer    :delivery_id,     null: false
      t.timestamps
    end
  end
end

```

## 手順
#### ①新しいマイグレーションファイルを作る。
「rails g migration ChangeColumnOfItems」とコマンドを打つ（アッパーキャメル）。
コマンドの意味は「Itemsテーブルのカラムを変更せよ」という感じ。

```ruby
terashimatakaya@MacBook-Air furima-34501 % rails g migration ChangeColumnOfItems
Running via Spring preloader in process 8220
      invoke  active_record
      create    db/migrate/20210220012237_change_column_of_items.rb
```

#### ②マイグレーションファイルを自分で修正する。
「Railsガイドv6.1」のマイグレーションの章を参考に、以下のように記述した。
意味としては、「itemsテーブルのnameカラムにnull:falseのオプションを追加してね」という感じ。

```ruby
class ChangeColumnOfItems < ActiveRecord::Migration[6.0]
  def change
    change_column_null :items, :name, false
    change_column_null :items, :explain, false
    change_column_null :items, :price, false
  end
end

```

#### ③マイグレーションを実行
「rails db:migrate」を実行。
slack spaceから機密情報を暴いてやる！！

# はじめに
最近、CTFに絶賛ハマり中の@fumiyan_proproです。解いている問題で面白そうなのを見つけたのでそのことについてお話したいと思いました。今回は、[picoCTF](https://www.picoctf.org/)に出てきた問題です。

# 目次
1. slack space
2. slack spaceからデータの復元
3. さいごに

# slack space
slack spaceの話の前に一度デバイスドライバについてお話します。デバイスドライバは記憶保存領域になります。ファイルのデータなどを保存する場所と思って頂いて構いません。デバイスドライバの単位としてよく使用されるのがクラスタになります。OSが読み書きで管理している単位になります。デバイスドライバの最小単位となるのがセクタになります。セクタが512バイトでクラスタがセクタ8個分の4096バイト使用するなどがあります。
表にすると下記になります。

|名前|単位|
|:---|:---|
|セクタ|512バイト|
|クラスタ|4096バイト|

※クラスタはOSによって扱っているバイトが異なります。

これをもとにslack spaceとは何かというと

> 
スラックスペースとは、コンピュータファイルがオペレーティングシステムによって割り当てられたすべてのスペースを必要としない場合に、コンピュータのハードディスクドライブ上に存在する残りのストレージのことです。
>> WhatIs.com slack space(DeepL翻訳)

上記の内容では、まだピンとこないかもしれないので具体的な内容としては、前提条件がセクタ512バイトで考えてみます。保存される単位はクラスタ単位で保存されます。今回はセクタ3つ分の1536バイトです。

1280バイトのファイルを保存しました。ファイルを保存した時にデバイスドライバ(記憶領域)に割り当てます。割り当てられる単位はクラスタ単位になるので3つ分のセクタ領域を使用しました。この時に、クラスタは1536バイトになるのでそこから1280バイト分引くと、256バイト未使用の領域が出てしまいます。この時の未使用の領域のことをslack spaceといいます。

```
1536 - 1280 = 256 <-- この256がslack space
```

# slack spaceからデータの復元
次にslack spaceからデータを復元することが可能なのです。先ほど使用したクラスタに割り当てているファイルの内容を消したとします。その次に新しいファイルの内容で保存した時に、そのクラスタに1080バイト分データが割り当てられたとします。この時に200バイト分、前のslack spaceに足されるので456バイト分のslack spaceになりました。
ここでなんと、先ほどの200バイト分のデータの中に前のデータが残っている場合がありそこの部分から削除したファイルを復元することが出来るのです！！

```
1536 - 1080 = 456 <--今回のslack space
456 - 256 = 200 <-- 前回のslack spaceから今回のslack spaceを引いた値
200 <-- このslack spaceの中に前のデータが残っている可能性がある
```

データの復元などは、[Autopsy](https://www.autopsy.com/)などのtoolを使用すると出来ます。

# さいごに
>2016年、連邦捜査局（FBI）は、ヒラリー・クリントン前国務長官の個人サーバーが機密情報を不適切に保存・送信したかどうかを判断するために、ヒラリー・クリントン前国務長官の個人サーバーのたるみ空間に常駐していた数百万通の電子メールの断片を見直していたことを明らかにした。
>>WhatIs.com slack space(DeepL翻訳)

上記の様に実際の事例でも使用されています。
この手の分野は、フォレンジックの分野になっており事件などでも使用されています。

# 参考文献

https://whatis.techtarget.com/definition/slack-space-file-slack-space
https://www.autopsy.com/
https://zarat.hatenablog.com/entry/2020/04/03/230926
Spring Boot + Flywayで複数のDatasourceにそれぞれ別のmigrationを実行する

# やりたいこと
* Spring Bootアプリケーションで複数のDataSourceを作成する
* Flywayでマイグレーションをする
* 複数のDataSourceに対してそれぞれ別のマイグレーションを実行する

# 環境
* OpenJDK 11
* Spring Boot 2.4.3
* Flyway 7.1.1
* (Kotlin 1.4.30)

# ポイント
* Springに複数のDataSourceを作成する
* そのうちの1つを `@Primary` に設定することで、こちらへのマイグレーションは自動で実行させる
* それ以外のDataSourceへのマイグレーションは手動で設定してあげる

# 設定方法

## 前提

データベースは2つ作成済み。それぞれ「origin」と「dest」と呼び分ける。

## datasourceの設定

### application.ymlで複数のデータソースを設定する
application.ymlで以下のようにoriginとdestの複数のデータソースを設定してあげます

```yaml:application.yml
spring:
  datasource:
    origin:
      url: jdbc:mysql://127.0.0.1:3316/main_db
      username: scott
      password: tiger
    dest:
      url: jdbc:mysql://127.0.0.1:3317/main_db
      username: scott
      password: tiger
```

### Spring boot側のDataSourceの設定

適当な場所にOriginとDestのDataSourceのBeanをそれぞれ定義してあげます。
ポイントは、<b>どちらか一つ(今回の場合ではOrigin)を `@Primary` として設定する</b>ことです。
これをやることでPrimary側のDatasourceへのマイグレーションに関しては特別な設定に必要なく動作します。

```kotlin

@Component
@ConfigurationProperties(prefix = "spring.datasource.origin")
class OriginConfiguration {
    lateinit var url: String
    lateinit var username: String
    lateinit var password: String

    @Bean(name = ["origin"])
    @Primary // <= これ大事
    fun dateSource(): DataSource =
        DataSourceBuilder
            .create()
            .url(url)
            .username(username)
            .password(password)
            .build()
}
```

```kotlin
@Component
@ConfigurationProperties(prefix = "spring.datasource.dest")
class DestConfiguration {
    lateinit var url: String
    lateinit var username: String
    lateinit var password: String

    @Bean(name = ["dest"])
    fun dateSource(): DataSource =
        DataSourceBuilder
            .create()
            .url(url)
            .username(username)
            .password(password)
            .build()
}
```

## Flywayの設定

### migrationファイルの置き場
以下のようにdb.migrationをdistとoriginに分けています。
![スクリーンショット 2021-02-20 10.12.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66904/99fea556-bcc2-a1e3-7145-82eec774c61f.png)

### Origin(Primary)側のmigrationの設定
上述の通りこちらに関しては設定クラスを作成する必要はありませんが、migrationファイルのロケーションだけapplication.ymlで明示してあげる必要があります。
デフォルトではdb/migrationになっているので、これをdb/migration/originに変更します。

```yaml:application.yml
spring:
  datasource:
    origin:
      url: jdbc:mysql://127.0.0.1:3316/main_db
      username: scott
      password: tiger
    dest:
      url: jdbc:mysql://127.0.0.1:3317/main_db
      username: scott
      password: tiger
  flyway:
    locations: "classpath:db/migration/origin" # <= 追記
```

### Dest側のmigrationの設定
最後に、Destに対するmigrationの設定クラスを作成します。

```kotlin

@Configuration
class FlywayMigrationConfiguration(
    @Qualifier("dest")
    private val destDataSource: DataSource
) {
    @PostConstruct
    fun migrateFlyWay() {
        Flyway
            .configure()
            .dataSource(destDataSource)
            .locations("db.migration.dest")
            .target(MigrationVersion.LATEST)
            .load()
            .migrate()
    }
}
```

## 実行
上記の状態でアプリケーションを起動すると、意図通りにdestとoriginにそれぞれmigrationが実行されます。
pod install実行時に`target overrides the OTHER_SWIFT_FLAGS build setting defined`が表示され、追加したライブラリがロードできない

## 環境
Xcode Version 12.4
MacOS BigSur 11.2.1

## 発生した問題
プロジェクトのPodfileにSnapKitを追記し、`pod install`を実行したところ、
`Cannot load underlying module for ‘SnapKit'`という問題が発生しました。
追加したライブラリのインポートはできるがロードができていない様子。

```
$ pod install

Analyzing dependencies
Downloading dependencies
Installing SnapKit (5.0.1)
Generating Pods project
Integrating client project
Pod installation complete! There are 12 dependencies from the Podfile and 22 total pods installed.

[!] The `MySampleApp [Debug]` target overrides the `OTHER_SWIFT_FLAGS` build setting defined in `Pods/Target Support Files/Pods-MySampleApp/Pods-MySampleApp.debug.xcconfig'. This can lead to problems with the CocoaPods installation
    - Use the `$(inherited)` flag, or
    - Remove the build settings from the target.
```

![error.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406531/e4653700-fd18-37b5-60fb-c8e145d739e4.png)

## 解決方法
`[!]`の案内通り、対象の設定に`$(inherited)`を追加する。

### 手順
xcodeproj → TARGETS → Build Settings → 右上の検索窓でother_swiftとかで検索すると下のような項目がでる。
※ 特に設定してない場合は画像と違って空欄になっているはず

![koumoku.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406531/6ddeae31-30a5-1419-afb6-b7fc3db34ac2.png)

対象スキームの右側の欄をダブルクリックすると下のような画面が開くので、
`+`アイコンをクリックして`$(inherited)`を項目に追加
![inhe.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406531/d61002cd-6d02-fa2d-2382-6bd2d4511493.png)

これで設定は完了。
再度`pod install`するとメッセージが消えて、ライブラリがロードできるようになっていました。

## 説明
設定ファイルの内容を継承(`inherited`)して上書きしていく必要があるそうですが、
今回の場合はその継承関係が途中で切れていたため、正常に反映できていなかったようです。
参考: [XCodeのBuild Settingsで、値が決まっていくルール -Qiita](https://qiita.com/paming/items/34f94a829c09eddfee95)
MAX30102のデータシート読んでみた-3

以前から続きます。

# Detail Description
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137182/91a06c81-349a-8e18-e310-3d1621be0add.png)

```
The MAX30102 is a complete pulse oximetry and heart-rate
sensor system solution module designed for the demanding
requirements of wearable devices. The device maintains a
very small solution size without sacrificing optical or electrical
performance. Minimal external hardware components are
required for integration into a wearable system.

MAX30102は、完全なパルスオキシメトリと心拍数です。
要求の厳しい人のために設計されたセンサーシステムソリューションモジュールウェアラブルデバイスの要件。
デバイスは光学的または電気的を犠牲にすることなく、非常に小さなソリューションサイズ
パフォーマンス。最小限の外部ハードウェアコンポーネントはウェアラブルシステムへの統合に必要です。
```

```

The MAX30102 is fully adjustable through software registers,
and the digital output data can be stored in a 32-deep
FIFO within the IC. The FIFO allows the MAX30102 to be
connected to a microcontroller or processor on a shared
bus, where the data is not being read continuously from
the MAX30102’s registers.

MAX30102は、ソフトウェアレジスタを介して完全に調整可能です。
そしてデジタル出力データはIC内のFIFOの深さに保存することができます。
FIFOにより、MAX30102は共有上のマイクロコントローラーまたはプロセッサーに接続
バス、MAX30102のレジスタのデータから継続的に読み取られていません？

```


## SpO2 Subsystem

```

The SpO2 subsystem of the MAX30102 contains ambient
light cancellation (ALC), a continuous-time sigma-delta
ADC, and a proprietary discrete time filter. The ALC has
an internal Track/Hold circuit to cancel ambient light and
increase the effective dynamic range. The SpO2 ADC has
programmable full-scale ranges from 2µA to 16µA. The
ALC can cancel up to 200µA of ambient current.

MAX30102のSpO2サブシステムにはアンビエント ライトキャンセル（ALC）、連続時間シグマデルタ
ADC、および独自の離散時間フィルター。が含まれています。。
ALCには周囲光をキャンセルするための内部トラック/ホールド回路と
有効ダイナミックレンジを増やします。 SpO2ADCには
プログラム可能なフルスケールの範囲は2µAから16µAです。
ALCは、最大200µAの周囲電流をキャンセルできます。
```



```
The internal ADC is a continuous time oversampling
sigma-delta converter with 18-bit resolution. The ADC
sampling rate is 10.24MHz. The ADC output data rate
can be programmed from 50sps (samples per second) to
3200sps.

内部ADCは18ビット分解能のシグマデルタコンバータの連続時間オーバーサンプリングです。
ADCのサンプリングレートは10.24MHzです。
ADC出力データレート50sps（サンプル/秒）から3200spsです。
```
Amazon MQ とは？

## 勉強前イメージ

メッセージ送る系のなにかのサービスかな？

## 調査

### Amazon MQ とは？

Apache ActiveMQ向けのマネージド型メッセージブローカーサービスです

### そもそも メッセージブローカーとは？

異なるシステム間でメッセージのやり取りの際に、直接データのやり取りを行うのではなく
中間システムとしてメッセージ格納領域を管理する機能のことになります。

### メッセージキューイング とは？

サービス名にもある `MQ` はメッセージキューイングのことを指しており、
メッセージの送信元・送信先とは別に第三者を介することで、送受信のタイミングを図らずとも処理を行うことが出来ます。
`メッセージキューイングシステムを行う際の中間システムを担うのがメッセージブローカーになります。`

![メッセージブローカーAWS MQとは？ - diagrams.net - Google Chrome 2021-02-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/c8cfaeea-663b-e85f-00e0-c2e8eb4252ef.png)

### AWS MQ を使用するメリット

- 迅速な移行

業界標準APIやメッセージング用プロトコルを使用しているため
アプリケーションを簡単に Amazon MQ に接続することができます

- 運用上の責任を軽減

ソフトウェアをインストールして管理したりする必要はなく、
MQがソフトウェアのアップグレードやセキュリティの更新、障害の検出と回復などのタスクを自動的に管理します

- 耐久性のあるメッセージングを簡単に実現

リージョン内の複数のAZにメッセージを冗長的に保存しているので、
障害が発生した場合でも利用することが出来ます

## 勉強後イメージ

メッセージキューを中間的に管理するシステム...
実際に触ったことないからイメージつかめないけど、全体像はなんとなくイメージついた

## 参考

- [メッセージキューイング 【MQ】 Message Queueing](https://e-words.jp/w/%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8%E3%82%AD%E3%83%A5%E3%83%BC%E3%82%A4%E3%83%B3%E3%82%B0.html)
- [Amazon MQ](https://aws.amazon.com/jp/amazon-mq/?amazon-mq.sort-by=item.additionalFields.postDateTime&amazon-mq.sort-order=desc)
- [https://www.acrovision.jp/service/aws/?p=1040](https://www.acrovision.jp/service/aws/?p=1040)
第八回Try English LT! for engineers 発表資料まとめ

# Try English LT! for engineersとは？

エンジニア向けの英語のみのLTイベントを行なっています！
発表テーマはエンジニア向けの内容であれば自由です。
英語でLTをやるとなると、中々ハードルが高く、 参加者が海外の人ばかりだと、なおさら難しく感じると思います。
ちょっと自信はないけど、 英語のLTにチャレンジしてみたいという人にぜひ発表してもらいたいです。
英語が好きなエンジニア同士で交流できるイベント運営ができればと思っています。

第八回イベントページ
https://try-english-lt.connpass.com/event/201124/

## 発表資料
・Henry さん 
Ways to be more efficient with the keyboard
https://docs.google.com/presentation/d/16QjZn62jz2B7wGOtmd4IDU5OxEXh0Sc5s1Y0C7Nv9K4/edit#slide=id.g1f87997393_0_782

・Nobu 
A story about developing an accounting application using Laravel, React, and TypeScript.
Laravel、React、TypeScriptで会計アプリを開発した話
https://docs.google.com/presentation/d/1NNLAF2XdfB3Jx3yOGfzzH5pz5ACZwjxp_jUC2jlslX8/edit?usp=sharing

・canonno さん
if takashi-kun runs from Hokkaido to Okinawa at 10 km an hour
たかしくんが時速10kmで日本全国を走ったら
https://speakerdeck.com/canonno/try-english-lt

・1ft-seabass. jp さん
A talk about developing Node-RED node communicating with IODATA Qwatch internet camera device API.
IODATA Qwatch というインターネットカメラデバイスAPIとやりとりできる Node-RED ノードを作った話
https://speakerdeck.com/1ftseabass/20210207-try-english-lt-for-engineers

・かきそふと さん
A hidden trap in DNS
DNSに潜む罠
https://kakisoft.github.io/slide/a-hidden-trap-in-DNS/export/index.html#/

・szskr さん
On Yacc
https://drive.google.com/file/d/184R2KepyaGR1HvFuLNX5U2BetRLcRpKg/view?usp=sharing
M5Stack Core Ink をmacOS Big Surで動かしたときのメモ


https://m5stack.com/products/m5stack-esp32-core-ink-development-kit1-54-elnk-display
https://docs.m5stack.com/#/en/core/coreink?id=tutorialampquick-start

https://github.com/m5stack/M5-CoreInk

# board definition

Arduino IDE Additional Boards Manager URLsに追加

```
https://m5stack.oss-cn-shenzhen.aliyuncs.com/resource/arduino/package_m5stack_index.json
```

Boards Manager でM5Stack公式のboard definitionをインストール

# library

Library Manager から M5-CoreInkをインストール
で良いと思ったらインストールされるライブラリのバージョンが1.0
GitHubには1.1が上がっていて、sleep関連は1.1でないとだめ。
https://github.com/m5stack/M5-CoreInk
からzipでダウンロードしてインストール。


# コンパイルして書き込んで見る

Exampleから M5-CoreInk HelloWorld を開いて Upload.

なんかエラーが出る。
esptool.pyを実行したときに No module named serialだと。

どのPythonが呼ばれているのだろう？
Big SurのPythonにPySerialはインストールされているのか？

/usr/local/bin/python3 にはPySerialがインストールされているらしいのでこれを呼び出すようにすれば良さそう。

/Users/username/Library/Arduino15/packages/m5stack/tools/esptool_py/3.0.0/esptool.py

の１行目を変更
```
 #!/usr/local/bin/python3
```

あとはDeveloper Toolsもインストールしないといけなかった。

# 参考になるURL

https://www.gwendesign.ch/kb/m5stack/m5coreink/
https://github.com/m5stack/M5-CoreInk/pull/6
https://github.com/hpsaturn/m5coreink-ntp-clock/blob/master/src/main.cpp
https://twitter.com/ksasao/status/1328488468557664256?lang=en
https://twitter.com/tnkmasayuki/status/1328657806723956736?lang=en
https://github.com/ksasao/ImageToCoreInk
https://qiita.com/coppercele/items/75e18dfbb23436f73268
https://note.com/rasen/n/n33a46bca11b5
https://github.com/m5stack/M5-CoreInk/issues/8
[Android]ViewBindingを使いたい！

###ViewBindingを使いたい理由
xmlファイルでViewに指定したidを用いてアクティビティやフラグメントを書く際、findViewByIdを逐一書かなくて良きなのと、型安全なので記述ミスがなくなる。数か月くらい前に、話題になりましたが、まだ使えてない！時代のビックウェーブに乗り遅れた！という人向けに書いてみました。実装は、簡単です！
https://developer.android.com/topic/libraries/view-binding

```gradle
// モジュールの方ね！書けたらSync now!
android {
    ...
    buildFeatures {
        viewBinding true
    }
}

```

適当に、Viewを配置して…

```xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">
        <TextView
            android:id="@+id/text1"
            android:layout_margin="10dp"
            android:textSize="20sp"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="0"/>
        <TextView
            android:id="@+id/text2"
            android:layout_margin="10dp"
            android:textSize="20sp"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="0"/>
</LinearLayout>
```

```kotlin
class MainActivity : AppCompatActivity() {
    // ここで、召喚！
    private lateinit var binding: ActivityMainBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        binding = ActivityMainBinding.inflate(layoutInflater)

        //bindigを付ければ、操作できる！
        binding.text1.text = "小鳥ん"
        binding.text2.text = "小鳥ん"
```

#####おまけ
スコープ関数を使うと毎回bindinを書かなくて良くなり、Viewが増えた時に楽。

```kotlin
class MainActivity : AppCompatActivity() {


    // ここで、召喚！
    private lateinit var binding: ActivityMainBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        binding = ActivityMainBinding.inflate(layoutInflater)
        binding.run {
             text1.text = "小鳥ん"
             text2.text = "小鳥ん"
        }
```
Node.js製サーバの起動方法をforeverからsystemdに移行する

foreverで起動していたExpressのサーバをOS再起動時に自動起動させたかったのでSystemd管理に移行します。
initd向けにforeverの自動起動の仕組みを提供する`initd-forever`というパッケージもあったり、forever自体を起動する方向もアリですが、Systemdでは自動再起動の制御が細かくなっているなど、foreverに期待していた役割自体も担えそうでしたのでシンプルにSystemd → Nodeにしました。
最低限の設定をイメージしてこんな感じになりました。

```:/etc/systemd/system/mydaemon.service
[Unit]
Description=My Node.js Daemon

[Service]
User=myuser
Group=mygroup
#Environment="NODE_ENV=production"
WorkingDirectory=/path/to/
ExecStart=/usr/bin/node app.js
Restart=always

[Install]
WantedBy=multi-user.target
```

あとは
`systemctl enable mydaemon.service` で自動起動有効化し、
`systemctl start mydaemon.service` で起動します。

`User`/`Group`は指定しなければrootになってしまうため指定しています。
`Environment`は今回不要でしたがExpressで使う機会が多そうなのでコメントアウト状態でサンプルとして入れています。
対象のスクリプトは`node app.js`で起動して、Ctrl+Cで終了させるような動きになっている必要があります。
`Restart=always`によってプロセスが落ちても自動的に復帰させます。
デフォルトで10秒に5回の再起動に制限されますが`StartLimitInterval` `StartLimitBurst` で調整できます。

foreverの`watch`に対応する機能は無さそうですが今回の目的には不要でした。
DatadogでAWSイベントを定期監視する

金曜の夜に見たくないアラートが。

![Screen_Shot_2021-02-20_at_8_40_26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27454/9c6e6074-de4b-268d-e3b7-95447cfa08d7.png)

続いて複数プロダクトで強制シャットダウン祭り。

![Screen Shot 2021-02-20 at 8.08.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27454/b56fffc9-1f15-b66a-63c5-2972e4faa4ff.png)

DatadogでAWSイベントを監視していたのでアラートは飛んできたけど、全てのイベントが通知されてないことに気付いた。8イベント中、最初と最後の2件しかきてない。

![Screen Shot 2021-02-20 at 8.04.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27454/2eccf7f8-744b-6a92-039e-8d942d7ec9b2.png)

これよく考えたら当前で、障害自体は5時間近く続いた1イベントなので、障害中のイベントは一切飛んでこない。

![Screen Shot 2021-02-20 at 8.22.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27454/eb267e6c-9e36-218e-4675-89096a311125.png)

中間イベントも送信したかったら監視モニターにある「automatically resolve...」なんちゃらのオプションを有効化しておけば良い。例えば1時間後にアラートを自働で閉じて、その後も障害が続く場合は続報も飛ばしてくれるようになる。

![Screen_Shot_2021-02-20_at_8_10_58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27454/2b0930b2-b487-a05c-00a7-01a484461261.png)

Terraformならこんな感じ。

```
resource "datadog_monitor" "aws_service_check" {
  name                = "AWS service check"
  type                = "service check"
  message             = local.message
  query               = "'aws.status'.over('region:ap-northeast-1').by('region','service').last(2).count_by_status()"
  renotify_interval = 60

  thresholds = {
    critical = var.aws_service_check["thresholds.critical"]
  }

  tags = ["aws"]
}
```

朝6時にようやく落ち着いた。寝る。

![Screen_Shot_2021-02-20_at_8_52_18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27454/1ae1468e-5d33-4ae5-cfb7-1b7f2d884ab5.png)
要件定義でよく出てくる「要望」「要求」「要件」の違いについて

システム開発において避けることのできない「要件定義」。
でも、システム開発をしていると「要望」やら「要求」やら「要件」やら、似たような単語が出てくる上に、プロジェクトメンバー同士で、それぞれの単語に対する認識にずれが生じることも多いですよね。

今回はそんな「要望」「要求」「要件」について、言葉の定義の違いについて、まとめたので、ぜひご参照ください。

※なお、この定義については、各書籍ごとで異なることが多いため、必ずしも業界で統一化された定義とは限りません。
言葉の定義を使用する際には、必ずプロジェクトメンバーと認識のすり合わせをするようお願いいたします。

## 概要
「要望」「要求」「要件」の定義はざっくり下記のとおりです。

- 要望
    - システム利用者からヒアリングした内容をそのままリストアップしたもの
- 要求
    - 「要望」を整理して、システム利用者の業務や利用シーンの背景を深堀りした上でまとめたもの
- 要件
    - 「要求」を詳細化して、開発するシステムを定義したもの

つまり「要望」「要求」「要件」の関係を示すと下記のようになります。

```
「要望」を整理、構造化したものが「要求」
「要求」を詳細化し、優先順位付けしたものが「要件」
```

## 要望とは？
システムを利用する人(またはシステムを利用する予定の人)が「こうなったらいいな」と思う機能のこと。
営業のメンバーや経営のメンバーがユーザーにヒアリングしてリストアップしたものはここに当たります。
ユーザーはシステム開発の専門家ではなく、あくまで利用している段階で不満に思ったことがそのまま、要望としてあがっているだけなので、体系化もされておらず、「本当に必要なのか」という観点も抜けていることが多いです。
ですが、次の「要求」や「要件」をまとめる上で材料として必要になってくるので、あくまで「要望」であることをベースにしてリストアップすることの価値はあります。

要望をまとめる際には、「誰が」「何を要望しているのか」の２点だけ押さえていれば十分です。
内容の精査や深堀りは次の要求整理の段階で行います。

## 要求とは？
ユーザーから直接、ないし営業メンバーを経由して上がってきた「要求」を構造化して、整理したものが「要求」になります。
要望のときには、ユーザーからヒアリングした事項をそのままリストアップしただけですが、「要求」として整理する際には、ユーザーが「そもそもなぜその機能がほしいのか」「具体的には何を望んでいるのか」といったWhyの部分に踏み込んで分析します。
その後、深堀りした要求は似たようなもの同士でグルーピングを行い、その背景に応じて優先順位付けをしていきます。

## 要件とは？
最後に「要件」とは、上記で整理した「要求」を満たすための、システムのあるべき形をまとめたものになります。
- システムにはどのような画面があるのか
- ユーザーはシステムをどのように使用するのか(ユースケースはなにか)
- システムで取り扱う「データ」は何か？

## ※要件と設計の違い
「要件定義」では、「何を作るのか」にフォーカスを当てるため、「どのように実現するのか」には焦点を当てません。
下記のような「どのように実現するのか」については、「設計フェーズ」の領域に当たります。
- プログラミング言語は何を採用するのか
- どのアプリケーションフレームワークを採用するのか
- データベースは何を採用するのか
- インフラの構成はどうするのか
- クラウドにするとしたらどのサービスを利用するのか
- システムアーキテクチャの構成はどうするのか

エンジニアが「要件」の話をするとき、つい上記のような細かい「設計」の話をしてしまい、要件定義をするビジネスサイドの人とのコミュニケーションミスが発生してしまうので、注意しましょう。

## まとめ
最初に補足で説明したとおり、上記の「要望」「要求」「要件」の意味はプロジェクトごとによっても使用されているところの意味が違うことがあります。
大事なのは、関係するステークホルダー間(要件定義者、エンジニア、営業など)で、意味の認識のすり合わせを行うことです。
[Unity]キャラクターへスムーズにカメラを向ける

#概要
Quaternion.LookRotationでプレイヤーが対象物を向く角度を得て、Quaternion.Lerpで回転運動の補間をしています。
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">Qiita用 : キャラクターへスムーズにカメラを向ける<a href="https://twitter.com/hashtag/Unity?src=hash&amp;ref_src=twsrc%5Etfw">#Unity</a> <a href="https://twitter.com/hashtag/Qiita?src=hash&amp;ref_src=twsrc%5Etfw">#Qiita</a> <a href="https://t.co/BSTBPagYNZ">pic.twitter.com/BSTBPagYNZ</a></p>&mdash; kazuma (@kazuma_f) <a href="https://twitter.com/kazuma_f/status/1362896020737196033?ref_src=twsrc%5Etfw">February 19, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

#コードの内容
```cs
using UnityEngine;

public class LookAtGameObject : MonoBehaviour
{
    public Transform[] position;
    int targetNumber = 0;
    float rotatePosition = 0f;
    float rotateSpeed = 0.1f;
    Vector3 direction;

    private void Update() {
        if (Input.GetMouseButtonDown(0)) {
            targetNumber++;
            if (targetNumber >= position.Length) targetNumber = 0;
            direction = position[targetNumber].position - transform.position;
            rotatePosition = 0f;
        }

        if (rotatePosition < 1f) {
            rotatePosition += rotateSpeed * Time.deltaTime;
            transform.rotation = Quaternion.Lerp(transform.rotation, Quaternion.LookRotation(direction), rotatePosition);
        }
    }
}
```

#設定
![スクリーンショット (1805).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/27855c43-2a10-fedd-0dd8-847ec19e140e.png)
MainCameraをPlayerに持たせます。（MainCameraのTransform各種を0にしてください）

LookAtGameObjectをPlayerに貼り付けてInspector内のpositionにカメラを向けたいオブジェクトをドラッグアンドドロップします。

#実行
画面をクリックするたびにカメラが対象を次々映し続けます
iOSアプリケーションにキーボードショートカットのサポートを追加（UIKitとSwiftUI両方で）

この短い記事では、アプリケーションにキーボードショートカット (keyboardShortcut, UIKeyCommand) 機能を加える方法について説明します。これは、ユーザーがiPadにキーボードを接続した状態でアプリを実行している場合に便利です。

多くの人はiPad用のキーボードカバーを購入しているので、アプリケーションにキーボードショートカットを実装しておくと便利になるでしょう。実装はほんの数分で完了します。

アプリケーションが提供するすべてのショートカットを表示するには、iPadキーボードのコマンド ⌘ キーを長押しします。それにより提供されているショートカット一覧のメニューが表示されます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635330/7645aa50-1792-4bff-423b-fd510ec20959.png">

# SwiftUIのアプリケーションに

修飾キー `keyboardShortcut` を使うことで、SwiftUIのインタラクティブなUI要素に、ショートカットキーを簡単に追加できます。

```swift
public func keyboardShortcut(_ key: KeyEquivalent, modifiers: EventModifiers = .command) -> some View
```

例えば、ボタンにキーボードショートカットを追加するには:

```swift
Button(action: {
    counter += 1
}, label: {
    Text("+1")
})
.keyboardShortcut("a", modifiers: [.command])
```

## 修飾キーについて

修飾キーを1つ以上設定することができます。 `capsLock`, `shift`, `control`, `option`, `command`, `numericPad`, and `function`.

ユーザーは、アクションを実行するために、修飾キーとあなたが定義した文字キーを押す必要があります。

例えば、キーボードショートカットを `.keyboardShortcut("a", modifiers: [.command])` に設定した場合、ユーザーはコマンドキーと文字 `a` キーを同時に押す必要があります。

キーボードショートカットを `.keyboardShortcut("r", modifiers: [.command, .option])` に設定した場合、ユーザーはコマンドキー、オプションキー、文字 `r` キーを同時に押す必要があります。

## キーボードのショートカットを追加できるUI要素

ボタンやスイッチ（トグル）にキーボードのショートカットを追加できます。

# UIKitのアプリケーションに

UIKitを使ったアプリケーションの場合、`UIKeyCommand` オブジェクトを作成し、与えられた一連のキーボードショートカットで`keyCommands` プロパティをオーバーライドできます。

```swift
class ViewController: UIViewController {
    
    override var keyCommands: [UIKeyCommand]? {
        return [
            .init(title: "新しいメモを作成する", action: #selector(self.actionCreate), input: "n", modifierFlags: [.command])
        ]
    }
    
    @objc func actionCreate() {
        print("create")
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
    }

}
```

<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635330/d52636c4-df47-3049-c76a-b8ebabf19693.png">

タイトル、画像、実行するアクション、修飾フラグなどを指定できます。これがドキュメンテーションに記載されている関数のコードです。

```swift
public convenience init(title: String = "", image: UIImage? = nil, action: Selector, input: String, modifierFlags: UIKeyModifierFlags = [], propertyList: Any? = nil, alternates: [UICommandAlternate] = [], discoverabilityTitle: String? = nil, attributes: UIMenuElement.Attributes = [], state: UIMenuElement.State = .off)
```

---

:relaxed: [Twitter @MszPro](https://twitter.com/MszPro)

:sunny: [私の公開されているQiita記事のリストをカテゴリー別にご覧いただけます。](http://mszpro.com/ioskiji/)
<img width="150" src="https://cdn.mszmagic.com/static-web-content/AppClipImage_small.png">
QiitaのMarkdown、ご存じないかもな 8記法☺＿。

#[0]ページ内リンクは、難しすぎるので、書き方は以下の記事（本人）参照。

[Markdownのページ内リンクは、HTMLのソース表示でidを確認して記載するのが一番楽！！](https://qiita.com/enoughspacefor/items/9e52de81de2ab8eaf866)

#[1]斜体(イタリック）は、あんまり、斜めになりません。

```
*斜体*は、あんまり、*斜め*になりません。
```
*斜体*は、あんまり、*斜め*になりません。

↓　実際の画像で表示。Windowsパソコンの方は、たぶん、斜めにならないと思います。
 (ワタシのパソコンの表示の例です。キャプチャ画像↓↓。）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342207/ce224faa-c847-fa6d-b026-8f12a027893e.png)


#[2]番号付きリスト

微妙。**番号振り直し機能？**

(ワタシが知っている範囲では、**redmineとかのMarkdownでは、番号付けなくても、番号付きになった気が。。。**）

1. 「1.」と書きました。
2. 「2.」と書きました。
5. 「5.」と間違って書きました。
 10. 「10.」から、小項目始めました。
 11. 「10.」を、誤って、２つ書きました。  


```
1. 「1.」と書きました。
2. 「2.」と書きました。
5. 「5.」と間違って書きました。
 10. 「10.」から、小項目始めました。
 10. 「10.」を、誤って、２つ書きました。 
```


#[3]画像の大きさを調整したいときがあるはず。(Markdownじゃなくなります。）

![dinosaur_allosaurus.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342207/be735f22-f96c-6612-f7cb-90313ca6959c.png)
![dog_pomeranian.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342207/b5fdf1f0-3156-880e-18d0-b1c2402643b4.png)

↓　**恐竜との関係**で、これぐらいの大きさで表示したいかも。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342207/b5fdf1f0-3156-880e-18d0-b1c2402643b4.png" width=100>

`html`で`width=100`とかで指定する。

```
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342207/b5fdf1f0-3156-880e-18d0-b1c2402643b4.png" width=100>
```

#[4]文字に色をつける(Markdownじゃなくなります。）

<font color="orange">文字に色をつけてみます。</font>これも、Markdownじゃなくなります。しかし、これは、個人的には、いらないかも。Markdownの範囲でいいような気が。。。

```
<font color="orange">文字に色をつけてみます。</font>これも、Markdownじゃなくなります。しかし、これは、個人的には、いらないかも。Markdownの範囲でいいような気が。。。

```

#[5]インラインコード（単に、ワタシが知りませんでした。）

この表示、`inline code`、見やすいかも。

```
この表示、`inline code`、見やすいかも。
```

#[6]注釈（これも、単に、ワタシが知りませんでした。これ、カッコいいですよね。）

そうか、注釈がつけられるんだ[^1]。

[^1]: これを使うと、すっきりした記事になる気がします。


```
そうか、注釈がつけられるんだ[^1]。
\[^1]: これを使うと、すっきりした記事になる気がします。
```
（↑表示都合で、スラッシュ1個、余分に入れてます。実際は、いりません。）

#[7]文章に枠をつけて目立たせる。（少し、邪道かも。。。）

例）

つまるところ、大切なことは、以下。

|記事が（後に見たときに）何かの役に立つものであること。|
|:---:|


```
|記事が（後に見たときに）何かの役に立つものであること。|
|:---:|
```

邪。。道かも。。。。
この場合、太文字になります。**図に枠をつける**のに、このやり方を提示されている方も、ときどき、おられます。
pCloudで不可視ファイルが見えるように修正する方法(プログラムで一括修正)

- Title(Eng): How to reveal the hidden(invisible) files on MacOS(OSX)

# Cause(原因)
1. MacOSのNDF形式の文字がそのままpCloudのStorageに書き込まれると、その後MacOSのpCloudClientであっても不可視になってしまう。(WebUIでは見える)
1. 対象は、文字コード様式がNFCであるファイルシステムHFS+(MacOS ver10系？)である。

## NDFとは
MacOS(OSX)の濁点処理の問題。通常、「だ」といった濁点文字をNFCであ1文字として扱うのですが、NDFでは「た」と「゛」と別に扱う。そのために一見、同じフォルダ名、ファイル名に見えても別となる。

1. 例
    2. ファイル名
    3. フォルダ名
    4. PDF化された文字列 


# Solution(解決方法)
1. Ownerを修正
    2. Finderでファイルが表示されないフォルダで右クリックからOwnerを修正
2. groupを修正
3. フォルダ名から日本語の濁点を取り除く。
    4. 例: だ → Da。

# 参考
- 他の解決方法
    - https://qiita.com/knaka/items/48e1799b56d520af6a09

----------
# 追加の解決方法 (2022.03.05)
- 2022.03.05現在、一部仕様変更されてNFCは消えた？統合された？が、NFC様式のファイルはまだ残っていた。
- 消されたのなら最悪であるが...

## 方法概要
1. pCloudCC（pCloud CLIクライアントソフト）を用いると、NDF不可視ファイル/フォルダも見える。よって、このソフトを使ってファイルをアクセスできる状態にして、プログラムで一括修正(NDF->NFC)にする。
1. pCloudCCは暗号化ファイルも閲覧できる。

## 方法手順 
### ploudCCのインストール
1. [pcloudcom/console-client](https://github.com/pcloudcom/console-client)
1. Linuxにしか対応してない(??)。
1. 私はLinuxを使っていたので省略。Linux以外の方はDockerで使ってLinux(Ubuntu18.04例)を構築してください。
### マウント
- `/usr/local/bin/pcloudcc -u あなたのpcloudのID(mail) -d -m ~/pCloudDrive/`
    - `-d`はデーモン化。動作確認には`-d`をはずそう。
    - `-c`: 暗号化フォルダをUnCryptしたい時用。

### NDF->NFC(KFKC)を直すコード
- ※一方、MacOS側でファイル名をHFS+用（＝濁点は別の文字コードNDF)にするには"NFKD"と変えて、MacOS上で実行する。
下記を要実行。
```python
import unicodedata
from pathlib import Path

pcloud_path_str = "/home/あなたのアカウント/pCloudDrive/" #上記のPATHを指定

p_pcloud = Path(pcloud_path_str)

for a_path in p_pcloud.glob('**/*'):
    old_path = a_path
    print(f"old:{old_path.as_posix()}")
    new_path = a_path.with_name(unicodedata.normalize('NFC', a_path.name))
    # print(f"new:{new_path.as_posix()}")
    if old_path.as_posix() != new_path.as_posix():
        a_path.rename(new_path)
        print(f"Renamed:{old_path.as_posix()} -> {new_path.as_posix()}")
```
【unity2D】animation 画面 キー メモリ調整

拡大、縮小で変わります。(マウスくりくり)

![unity_animation.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260698/c63e5929-83c2-432f-5b4b-1926b23643b0.png)
Qiita Daily Survey memo 2021.02.20

# Qiita Daily Survey memo 2021.02.20
Qiita の記事を可能な限り毎日読むために、読んだmemoを公開することでモチベーションを維持しようという試み。
連続5日目かしら…？
コメントいただけてうれしいです！

## [Webエンジニアが勉強できるGit Repository 10選](https://qiita.com/hedrall/items/177eb850c4c054146321)
hedrall さんの記事。
タイトルの通り、Webエンジニアの方が勉強に使うことができる Git Repository を 10個 ピックアップして紹介してくださっている記事です。
他人のコードを読むことが勉強になるのは分かっていても、Git のどれを読めば…と思っていたので列挙していただいてありがたいです！
また、リンク先を見てみましたが、ただコードが載っているだけでなく図で説明してくれているものもあり分かりやすい…！
用途は業務ですぐ使うと言うよりは、タイトルの通り勉強用のものが多そうなイメージです。


## [『Rust Design Patterns』を翻訳してみました（Idiom 編）](https://qiita.com/Yappii_111/items/4ccc3a8461cdd4035651)
Yappii_111 さんの記事。
Rust というプログラミング言語のデザインパターンの記事（？）の翻訳記事です。
Rust のデザインパターンとありますが、多くのデザインパターン・アンチデザインパターンは言語に依存するものではなく、考え方のイメージが強いので、1回やっておくとっょっょになれるイメージがあります。
シングルトンデザインパターンの命題を読んだ時の「いや、無理でしょ」という直感と、それを裏切る美しい実装は今でも記憶に残っています。

ただ、本記事はその中でも Rust に寄ったデザインパターンの記事の印象を受けました。（違っていたらすみません…）


## [Elixirでディープラーニング①：革新的ライブラリ「Nx」の導入](https://qiita.com/piacerex/items/db33fbe80751fdd30e48)
piacerex さんの記事。
Elixir（エリクサー）という言語の、機械学習/ディープラーニング用の Nx というライブラリの記事...と理解しました。
Elixir という言語を初めて耳にしましたが、記事にある通り Advent Calendar のプログラミング言語カテゴリで 2位 （1位は上記の Rust）だそうです。流行りに疎いのは致命的と理解はしているのですが、なかなか追いかけておらず…この活動を続けて流行りをキャッチしていきたいです。
記事内では Nx を使ってみるところまで紹介されていて、タイトルに1とある通り、続きを執筆されるご様子。そちらも楽しみにしたいと思います。

python で時が止まっているので、各言語のストロングポイントやその実装など、時代の流れを追いかけてみようと思いました。


## [VscodeでPythonを始めるなら知っておきたい単語](https://qiita.com/ShortArrow/items/f29e4d0df7d836eec770)
さぼっ たろう(ShortArrow) さんの記事。
タイトルの通り、VSCode を使って Python を書く場合に知っておいたほうが良いことを列挙しておいてくださっている記事です。
VSCode を使って Python を書いていますが、半分くらい知りませんでした…ﾋｴｯ…。
特に何順で並んでいるのかの記載がありませんが、おそらく上位の方が重要なものだとすると、上の方全然わからないので試してみたいと思いました。
このリストの中では Pylint に特にお世話になっていて、コレがないともうコード書きたくないくらいお世話になっています。
そのレベルのものが並んでいるとしたら、とても幸せな未来が見えるので、それぞれ調べてみたいと思いました…！


## [[solafune] 夜間光データから土地価格を予測ベースモデル](https://qiita.com/cha_kabu/items/679ff02f6386f8e3034a)
cha_kabu さんの記事。
データ分析をしてみた系の記事ですが、加えてデータ分析コンペサイトのコンペが開かれているよ、というお知らせも含む記事でした。
「こういうのやってみたかった！」という記事なので、とても興味深く読ませていただきました。
また、中盤以降では可視化も含めていろいろなデータの見方を示してくれていて勉強になりました。
実際に追いかけて触ってみたと思います。
kaggle に参加してみたいと思っていましたがなかなか踏ん切りがつかず…でも、こういったコンペをやってますよ、という記事があると参加してみようかな…？と思っちゃいますね！
JQuery Ajax まとめ

```Javascript
//ページ取得(GET)

$(document).on('submit', '.フォーム名', function (event) {

    let form = event.currentTarget;

    //パラメータ全て
    //let queryParam = $(form).serialize();

    //パラメータ指定
    //let queryParam = new URLSearchParams;
    //queryParam.append('パラメータ名', 'パラメータ値');

    const url = `コントローラ名/メソッド名?${queryParam.toString()}`;

    $.ajax({
        url: url,
        type: 'GET',
        timeout: 20000,
    }).done(function (data) {
        $('.追加対象').append(data);
    }).fail(function (error) {
        if (error.status.toString().length <= 4) {
            console.log(`${error.status}:通信エラー`);
        }
        else {
            console.log(`${error.status}:${error.responseText}`);
        }
    }).always(function () {

    });
    return false;
});


//ページ取得(POST)
//FromData

$(document).on('submit', '.フォーム名', function (event) {

    let form = event.currentTarget;

    //全て
    //let requestArray = $(form).serializeArray();
    //var fromData = {};
    //$(requestArray).each(function (index, obj) {
    //    fromData[obj.name] = obj.value;
    //});

    //指定
    //let fromData = {
    //    'キー名': 'バリュー値',
    //    'キー名': 'バリュー値'
    //};

    const url = `home/privacy`;

    $.ajax({
        url: url,
        type: 'POST',
        data: fromData,
        timeout: 20000,
    }).done(function (data) {
        $('.追加対象').append(data);
    }).fail(function (error) {
        if (error.status.toString().length <= 4) {

        }
        else {

        }
    }).always(function () {

    });
    return false;
});




//ページ取得(POST)
//Json

$(document).on('submit', '.フォーム名', function (event) {

    let form = event.currentTarget;

    //全て
    //let requestArray = $(form).serializeArray();
    //var jsonParam = {};
    //$(requestArray).each(function (index, obj) {
    //    jsonParam[obj.name] = obj.value;
    //});

    //指定
    //let jsonParam = {
    //    'キー名': 'バリュー値',
    //    'キー名': 'バリュー値'
    //};

    const url = `home/privacy`;

    $.ajax({
        url: url,
        type: 'POST',
        contentType: 'application/json',
        data: JSON.stringify(jsonParam),
        timeout: 20000,
    }).done(function (data) {
        $('.追加対象').append(data);
    }).fail(function (error) {
        if (error.status.toString().length <= 4) {

        }
        else {

        }
    }).always(function () {

    });
    return false;
});


```
お名前.comで見事にお金を取られた話

先に言っておくと最悪！とか言いたい訳ではなく、ちゃんと確認しないといけないよ！気を付けてね！という記録。

ドメインの取得の練習で【ドメイン登録料金国内最安値】のお名前ドットコムに登録してみた話。練習にはもってこいだ～:blush:と思い、適当に登録。
https://www.onamae.com/?btn_id=onamae_header_logo


すると気が付かなかった･･･<font color="OrangeRed">レンタルサーバーは月額料金取られること･･･</font>

2021年2月20日現在のサイトだと
スタンダードなレンタルサーバー
https://www.onamae.com/server/rs/campaign/simulregist_hpop_drs/?_ga=2.45564004.1106321040.1613748278-268871018.1613748278&_bdld=1WLjpR.nuWV9dD.1613759616

Microsoft 365メールプランのレンタルサーバー
https://www.onamae.com/server/rs/campaign/simulregist_exoop_drs/?_ga=2.46041060.1106321040.1613748278-268871018.1613748278&_bdld=1WLjpR.nuWV9dD.1613760301

ホームページ作成ツール付きレンタルサーバー
https://www.onamae.com/server/rs/campaign/simulregist_hpop_drs/?_ga=2.37545696.1106321040.1613748278-268871018.1613748278&_bdld=1WLjpR.nuWV9dD.1613760285

どれも3か月解約できない縛りで2か月レンタルサーバー代0円との記載。
<font color="Red">つまり1ヶ月分はどうやってもかかる！(現在は1,300円+税)</font>
更にプランによってホームページエディター月額料金で月900円+税かExchange Online月額料金として月430円+税のどちらかがかかる(みたい)。

やべえ！と思って解約しようとしても3か月後からでないと解約できないサイト仕様になっており、自動更新機能もストップ出来ず、忘れてしまうと永遠に1,300円+税～取られる仕様になっているわけですね･･･。ドメイン「は」実質無料！永久無料！と書いてありました、なぜこんなにデカデカと書いてあるのに見逃したのか･･･ううっ。

怠け癖の私には恐ろしい事態。ちゃんと見なかった私が悪いので仕方がありませんが･･･
おそらく独自ドメインを得るにはお得なのでしょう。しかし、練習でやってみようと登録される方などは気を付けてくださいっ！

なおこちらは2021年2月20日現在の情報ですので、変更になる場合がございます。ご利用の際には変更点などをご確認ください。記事と違った！となっても責任は負いかねますm(_ _)m
live!ヘタフェ vs ベティス 生.放送

ラ・リーガ　レアル・ベティスvsヘタフェ　2021年2月19日

#[ライブ中継🔴📺📲👉 ヘタフェ vs ベティス](https://hdsports247.net/soccerjp/)
#[ライブ中継🔴📺📲👉 ヘタフェ vs ベティス](https://hdsports247.net/soccerjp/)



【ラ・リーガ　レアル・ベティスvsヘタフェ　2021年2月19日（金曜日、日本時間29:00キックオフ）】

【動画】前節ヘタフェ戦　67分に久保は個人技でDFをかわしクチョ・エルナンデスにクロスを送る

　2試合連続でベンチスタートになってしまった久保建英。チームが結果を出せていない中で、先発復帰となるだろうか。

■『対戦相手情報』
　7位のベティスはここまで10勝3分10敗。昨シーズンの勝ち星に早くも並び、5位に与えられるヨーロッパリーグの出場権を狙っている。

　リーガで最も引き分けが少ないチームだ。6位のビジャレアルは8勝12分3敗、5位のレアル・ソシエダは10勝8分5敗となっており、負けが増えても勝ち点3を積み上げることが大切か、あるいは負けずに引き分けて勝ち点1を得ることが大切か、というEL争いは興味深いものになっている。

　監督は攻撃的なサッカーを得意とするマヌエル・ペジェグリーニ。ビジャレアル、レアル・マドリード、マンチェスター・シティなどの指揮を執った名将だ。

　日本人に馴染みのある選手は、ボルシア・ドルトムントで香川真司とチームメイトだったマルク・バルトラ、そして39歳になったホアキン・サンチェスがいるが、両者ともプレーする可能性は低そうだ。

　注目は背番号10のセルヒオ・カナレス。かつて天才と言われレアル・マドリードに引き抜かれたが、出場機会を得られないままマドリードを去ることになった。現在は当時よりも運動量のある選手としてチームをまとめ上げている。リーガで生き残るために自身を変えた選手であり、様々な未来があり得る久保にとって教材になる存在だ。

■『ヘタフェの状況』
　降格圏との勝ち点差は3。いよいよ1試合で追いつかれる状況になってしまった。

　ホセ・ボルダラス監督が解任されるのではないか、という報道が多かったが、アンヘル・トーレス会長は監督を支持することを表明した。ボルダラス監督が近年のヘタフェで最も成功を収めた人物であること、そしてクラブには違約金を払う余裕がないことが理由とされている。

　なんとか指揮を執り続けられそうなボルダラス監督だが、前節退席処分になったことでこの試合ではベンチには入れない。オーナーの気が変わる前に結果を出したいところだったが、命運はコーチのパトリシオ・モレノと選手に託された。

　メンバーではセンターバックのジェネが出場停止から復帰する。セビージャ戦で試合を壊してしまったキャプテンは、チームを勝たせる意欲に満ち溢れている。

　今シーズンの1度目の対戦では3-0で勝利している。そして、ボルダラス監督はベティスのホームスタジアムのビジャマリンで負けたことがない。過去のことは関係ないとはいえ、結果がほしい今のヘタフェにとっては縁起の良いデータだ。
[Android]Action BarとUINavigationの連携がうまくいかない

#連携？
UpボタンがDestinationの遷移時に自動的に表示されたり、labelが自動的にタイトルに設定されたりすることです。

#原因
初期化処理を
onCreate(savedInstanceState: Bundle?)
ではなく、
onCreate(savedInstanceState: Bundle?, persistentState: PersistableBundle?)
で行っていたことが原因でした。

ブレークポイントを設定してデバッグすればもっと早く見つかったかもしれません。
sp_executesqlを使用してエスケープ処理を行った

## テスト中に画面でエラーが発生してしまった。
調査の結果以下のような原因だった。

* 検索条件に'(シングルクオーテーション)が含まれていてストアドプロシージャでエラーになっているようだ。

使用しているストアドでは動的sql※1(呼び方がわからないので以下このように呼びます。）を使用していた。

## 解決方法

以下の解決法が選択肢として上がりました。

* ストアドプロシージャに渡すパラメータはすべてエスケープ処理を行う（SQLServerの場合はシングルクオーテーションをもう一つつける)
* sp_executesqlの使用を検討する

検討の結果後者のsp_executesqlを使用することにしました。

実際にどのようなエラーだったか、
テストソースで解説します。

``` java:呼び出し元Java

 public static void callProcedure() throws SQLException {

		CallableStatement  cs = null;
		try (Connection con= DriverManager.getConnection(sqlcall.calltest())){
			cs = con.prepareCall("{? = call dbo.sp_TESTA(?)}");
			cs.registerOutParameter(1, java.sql.Types.INTEGER);
			cs.setString(2, "ff'ffff");
			cs.execute();
			ResultSet rs = cs.getResultSet();

			while(rs.next()) {
				System.out.println(rs.getString(1));
			}
			System.out.println("calltest"+ cs.getInt(1));

		}catch(SQLException e){
			e.printStackTrace();

		}
	}

```

testTableのデータ

|Test1  |
|:------|
|ff'ffff|

```SQL:動的SQL※1


CREATE PROCEDURE [dbo].[sp_TESTA] 
	@TESTA nvarchar(40)
AS
BEGIN try
	-- SET NOCOUNT ON added to prevent extra result sets from
	SET NOCOUNT ON;

	DECLARE @query nvarchar(MAX) = '';
	DECLARE @parameters nvarchar(max) = '';

	

	SET @query = N' SELECT Test1 '
	SET @query = @query + N' FROM dbo.testTable '
	SET @query = @query + N' where Test1 = '''+ @TESTA+''''

	execute ( @query);

	return 0;

END try
begin catch

	SELECT   
        ERROR_NUMBER() AS ErrorNumber  
       ,ERROR_MESSAGE() AS ErrorMessage; 
	return  -1

end catch
GO


```

`'ffff' 付近に不適切な構文があります。
calltest-1`
文字内にある'(シングルクオーテーション)が文字の区切りとして認識され、後ろ4文字が文字として認識されませんでした。

これを以下のようにsp_executesqlを使用するように修正しました。

```SQL:sp_executesql

CREATE PROCEDURE [dbo].[sp_TESTA] 
	-- Add the parameters for the stored procedure here
	@TESTA nvarchar(40)
AS
BEGIN try
	-- SET NOCOUNT ON added to prevent extra result sets from
	-- interfering with SELECT statements.
	SET NOCOUNT ON;

	DECLARE @query nvarchar(MAX) = '';
	DECLARE @parameters nvarchar(max) = '';

	
	SET @query = N' SELECT Test1 '
	SET @query = @query + N' FROM dbo.testTable '
	SET @query = @query + N' where Test1 = @Test1 '
	
	set @parameters = N'@Test1 nvarchar(40) '

	
	execute sp_executesql @query,@parameters, @Test1 = @TESTA
		
	return 0;

END try
begin catch

	SELECT   
        ERROR_MESSAGE() AS ErrorMessage; 
	return  -1

end catch
GO



```

`ff'ffff
calltest0`

無事文字として認識され正常に検索条件として反映されました。


## まとめ
画面で渡された値を使用する場合にはsp_executesqlをなるべく使うこと。インジェクション対策にもつながるので、sp_executesqlで仕様を実装できるかを確認したほうが良い


## 参考
[Microsoft SQLドキュメント sp_executesql (Transact-sql)](https://docs.microsoft.com/ja-jp/sql/relational-databases/system-stored-procedures/sp-executesql-transact-sql?view=sql-server-ver15)
Project Euler 問題8 「13桁の数字の積の最大値」

## 問題
以下の1000桁の数字の中に存在する13桁の数字の積の最大値を求めよ。

> The four adjacent digits in the 1000-digit number that have the greatest product are 9 × 9 × 8 × 9 = 5832.

> 73167176531330624919225119674426574742355349194934
96983520312774506326239578318016984801869478851843
85861560789112949495459501737958331952853208805511
12540698747158523863050715693290963295227443043557
66896648950445244523161731856403098711121722383113
62229893423380308135336276614282806444486645238749
30358907296290491560440772390713810515859307960866
70172427121883998797908792274921901699720888093776
65727333001053367881220235421809751254540594752243
52584907711670556013604839586446706324415722155397
53697817977846174064955149290862569321978468622482
83972241375657056057490261407972968652414535100474
82166370484403199890008895243450658541227588666881
16427171479924442928230863465674813919123162824586
17866458359124566529476545682848912883142607690042
24219022671055626321111109370544217506941658960408
07198403850962455444362981230987879927244284909188
84580156166097919133875499200524063689912560717606
05886116467109405077541002256983155200055935729725
71636269561882670428252483600823257530420752963450

> Find the thirteen adjacent digits in the 1000-digit number that have the greatest product. What is the value of this product?

## コード(Python)

```python
string = '7316717653133062491922511967442657474235534919493496983520312774506326239578318016984801869478851843858615607891129494954595017379583319528532088055111254069874715852386305071569329096329522744304355766896648950445244523161731856403098711121722383113622298934233803081353362766142828064444866452387493035890729629049156044077239071381051585930796086670172427121883998797908792274921901699720888093776657273330010533678812202354218097512545405947522435258490771167055601360483958644670632441572215539753697817977846174064955149290862569321978468622482839722413756570560574902614079729686524145351004748216637048440319989000889524345065854122758866688116427171479924442928230863465674813919123162824586178664583591245665294765456828489128831426076900422421902267105562632111110937054421750694165896040807198403850962455444362981230987879927244284909188845801561660979191338754992005240636899125607176060588611646710940507754100225698315520005593572972571636269561882670428252483600823257530420752963450'

max = 0
for i in range(len(string) - 12):
    digits = string[i : i+13]
    
    if '0' in digits:
        continue
    
    product = 1
    for j in digits:
        product *= int(j)
    
    if max < product:
        max = product
print(max)
```