OmniAICreator/Qiita-1.07M huggingface dataset:
Holon

## 動作

Java (JRE8)上で動く。
最新版version 5.5.0
2020/7で更新が止まっている

## GitHub

### 開発者１ Riccardo Righi

https://twitter.com/riccardorighi

https://github.com/rrighi

### 開発者２ axholo

https://github.com/axholo
PHPの便利な関数(4)


# 概要

* PHPが用意している便利な関数について、忘備録として記載していく。
* また、PHP7系を前提とする。
* 右記
[PHPの便利な関数一覧](https://qiita.com/andota05/items/fc80d2210810a36ec156)
に他の関数について記載した一覧を作成しています。

# ラインナップ

* array_key_exists( )
* sprintf( )
* empty( )
* isset( )
* is_array( )

## array_key_exists( )

* 指定したキーまたは添字が配列にあるかどうかを調べる
* 存在すれば true を返す
* 存在しなければ false を返す

https://www.php.net/manual/ja/function.array-key-exists.php

```test.php
// keyを持った連想配列を定義する
$array = [
    'id' => 1,
    'name' => 'Taro'
];

// keyに存在するname,存在しないcityを指定してみる
var_dump(array_key_exists('name', $array));
var_dump(array_key_exists('city', $array));
```

```
php ./test.php
bool(true)
bool(false)
```

## sprintf( )

* フォーマットされた文字列を返す
* フォーマットの中で「%s」のような記載を「指定子」という
* 指定子が設定された箇所に値の代入が可能
* データ型によって指定子が異なる (例：%sで文字列、%dで数値)

https://www.php.net/manual/ja/function.sprintf.php

```test.php
// フォーマットを直接
echo sprintf('日本で%d番標高の高い山は、%sです。', 1, '富士山');
echo "\n"; // 出力結果が分かりやすいよう改行

// フォーマットを別で定義し代入
$format = '日本で%d番標高の高い山は、%sです。';
echo sprintf($format, 1, '富士山');
echo "\n";

// %(引数)$ で引数の順番を指定
$format = '日本で%2$d番標高の高い山は、%1$sです。';
echo sprintf($format, '富士山', 1);
echo "\n";
```
```
php ./test.php
日本で1番標高の高い山は、富士山です。
日本で1番標高の高い山は、富士山です。
日本で1番標高の高い山は、富士山です。
```

## empty( )
* 変数が空であるかどうかを検査
* 空の場合、trueが返される
* 空でなかった場合、falseが返される
* 空であるとみなされるのは、「変数が存在しない場合」や 「変数の値が false に等しい」場合

https://www.php.net/manual/ja/function.empty.php

```test.php
// 各種定義
$tmp_var;
$empty_var = "";
$null_var = null;
$false_var = false;
$true_var = true;
$num_var = 123;
$str_var =  "testtest";

// 結果の確認
var_dump(empty($not_var)); // 存在しない変数
var_dump(empty($tmp_var));
var_dump(empty($empty_var));
var_dump(empty($null_var));
var_dump(empty($false_var));
var_dump(empty($true_var));
var_dump(empty($num_var));
var_dump(empty($str_var));
```

```
php ./test.php
bool(true)
bool(true)
bool(true)
bool(true)
bool(true)
bool(false)
bool(false)
bool(false)
```

## isset( )
* 変数が宣言されていることをチェックする
* また、値がnullではないことをチェックする
* 変数が宣言されているかつ、値がnullではない場合、trueが返される
* 変数が宣言されていない、宣言されているが値がnullの場合、falseが返される

```test.php
// 各種設定
$tmp_var = "test";
$null_var = null;

// 結果の確認
var_dump(isset($tmp_var));
var_dump(isset($num_var));
var_dump(isset($not_var)); // 存在しない変数
```

```
php ./test.php
bool(true)
bool(false)
bool(false)
```

## is_array( )

* 変数が配列かどうかチェックする
* 配列であった場合、trueが返される
* 配列でなかった場合、falseが返される


https://www.php.net/manual/ja/function.is-array

```test.php
// 配列、非配列を定義
$array = array('test1', 'test2');
$no_array = 'test3';

// 結果の確認
var_dump(is_array($array));
var_dump(is_array($no_array));
```
```
php ./test.php
bool(true)
bool(false)
```
Swift で Bellman-Ford Algorithm (ベルマンフォード法）使ってSSSP：Single Source Shortest Path（単一始点最短経路問題）


備忘用メモ

- Time Complexity: O(VE) (V: number of vertexes, E: number of edges)

```swift
// List starts from 1-index not zero-index.
func bellmanford (_ N: Int, _ graph: [Edge], _ start: Int) -> Int {
    var dist = [Int](repeating: Int.max, count: N+1)
    dist[start] = 0
    for i in 1...N { // O(V)
        var updated = false
        for e in graph { // O(E)
            if dist[e.from] == Int.max { continue }
            if dist[e.to] > dist[e.from] + e.weight {
                dist[e.to] = dist[e.from] + e.weight
                updated = true
            }
        }
        if !updated { break } // quick return: no more update
        if i==N && updated { return -1 } // graph has negative cycle.
    }
    return dist[N]
}


struct Edge {
    let from: Int
    let to: Int
    let weight: Int
}
```
Node.js: docxをhtmlにするMammoth

## Mammoth .docx to HTML converter

https://github.com/mwilliamson/mammoth.js

## 導入
`npm --save-dev install mammoth`

## お試し
`npx mammoth sample.docx output2.html`

### Before
＊[テンプレート](https://template.k-solution.info/2017/05/18084425.html)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/f217e190-7973-bb3e-09c9-a6d61fe5471c.png)

### After
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/fe1f337a-90f3-17f4-6e76-42bd8ae13d04.png)


## まとめ
https://qiita.com/sky_y/items/80bcd0f353ef5b8980ee

Pandoc でない簡単な選択肢の１。
Pythonでも。

https://github.com/mwilliamson/python-mammoth

https://github.com/erezlife/html2docx

https://github.com/bradmontgomery/word2html

ということで、触ってみた記録でした。参考になればさいわいです。
チャタリングの解消方法について

ある日突然チャタリングという現象が発生して、解決したので、、、

チャタリングは同じ文字が連続して入力されてしまう現象で、私の場合はキー押下してない場合でも発生しました。

環境はbluetooth接続とbluetooth接続のマウスを使用していました。

bluetoothの接続チャネルが関係しているらしいのですが、その辺は門外漢なのでググって見たら色々でてきます。

実行した内容は

1. 接続を削除して、再接続

2. 電池交換

3. キーボードをエアダスターで掃除

掃除したら改善したので、まさかファミコンじゃないんだからと思ったのですが、

何回か接続と削除を繰り返していたので、そのタイミングでチャンネルがうまいこと変わったのかもしれません。
型キャスト（as, as!, as?）について

Swiftの勉強をしていて、asが出て来ることが多いので、自分なりに調べてまとめてみました。

参考記事
・https://fukatsu.tech/swift-cast
・https://qiita.com/entry909/items/3c4c9a20bce0c903dc39
・http://blog.andgenie.jp/articles/803

##キャストについて
キャストとは、asという演算子を用いて変数や定数を具体的な型にはめ込むことです。

## asについて

asは、演算子の一種で２種類の変換を実行することができます。

1. 保証変換
1. 強制変換


### 保証変換
保証変換とは、別の型に変換するときに、コンパイラ可能な場合キャストの成功が保証されるような変換です。
例えば、アップキャストというのがあって、クラスの継承やプロトコルの準拠などの階層関係がある型同士においてキャストを行うものです。

```swift
let str = "アイウエオ"
let any = str as Any
```

### 強制変換


強制変換とは、変換するときにコンパイラで安全性が保証できないので実行時にエラーを引き起こす可能性があるキャストのことです。この強制変換では、ダウンキャストというものがあります。

### ダウンキャストとは

ダウンキャストとは、as!、as?のに種類があって、as!は強制的にコンパイラの安全性を無視してキャストを行います。

```swift
let any: Any = "アイウエオ"
let str = any as! String   //String型"アイウエオ"
let num = any as! Int      //Int型にキャスト失敗（実行時エラー）
```

as?は、キャスト自体が成功するかわからない時に使います。
成功時はOptional型になり、失敗時はnil型になります。

```swift
let any: Any = "アイウエオ"
let str = any as? String   //Optional("アイウエオ")
let num = any as? Int      //nil
```
rails g controller 実行時にDeprecation Warningになった。その対処法。

# 結論
 Gemfile内の `thor` のバージョンを 0.19.1に指定した。

# 背景
　涼しくなってきたのでようやくキーボードを触れるようになった。Railsの個人開発を再開した。`rails g controller ...`　とコントローラーを作ったら、以下のエラー文章が出た。

```
$rails g controller plans

Running via Spring preloader in process 1645
Deprecation warning: Expected string default value for '--template-engine'; got false (boolean).
This will be rejected in the future unless you explicitly pass the options `check_default_type: false` or call `allow_incompatible_default_type!` in your code
You can silence deprecations warning by setting the environment variable THOR_SILENCE_DEPRECATION.
```

なんだこれは。一応このメッセージの後にファイルは生成されているようだが、この警告は気になる。少し調べると、海外のサイトがあたった。

[Meaning of "Expected string default value for ..." on Ruby on Rails](https://stackoverflow.com/questions/40986923/meaning-of-expected-string-default-value-for-on-ruby-on-rails) 


> It has nothing to do with either Rails or Ruby, but was instead caused by the upgrade of the thor gem (which is a dependency of jquery-rails, among others) from 0.19.1 to 0.19.4.

なるほど。thorというGemが関連しているらしい。そういえばrailsガイドにも何か書いてあった。

[初めてジェネレータを作成する-Railsガイド](https://railsguides.jp/generators.html#%E5%88%9D%E3%82%81%E3%81%A6%E3%82%B8%E3%82%A7%E3%83%8D%E3%83%AC%E3%83%BC%E3%82%BF%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B)

> Rails 3.0以降のジェネレータはThorの上に構築されています。Thorは強力な解析オプションと優れたファイル操作APIを提供しています。

rails g はthorの上にあるので、thorがエラーを吐けばこいつもうまく動かなくなるらしい。


もうちょっと探るとGithubのissueにも書いてあった。2017年からあった問題らしい。

[Rails generating error after gem update #538](https://github.com/rails/thor/issues/538)

# やっていこう

Gemfileに記載しよう。

```:Gemfile
# rails gのときの Deprecation warning 対策
gem 'thor', '0.19.1'
```

これだけだとGemfile.lockと異なる！というエラーが出るので、Gemfile.lockの内容を修正する。thorが書いてある行を削除する。

```:Gemfile.lock
  → 削除    thor (>= 0.20.3, < 2.0)
...
  → 削除    thor (1.1.0)
```

　あとは`bundle update thor` を実行した。　

できるようになった。

# おわり

よかった。
zabbixによるプロセス監視

バージョンは4系

今回のポイント

```
対象環境のEC2インスタンスについて、特定プロセス監視の追加。
例えばこんな感じ
inotifywait -e CLOSE_WRITE,DELETE -mrq /var/www/html/hoge/huga
```

inotifywaitでディレクトリの変更を監視しつつそれをzabbixに飛ばしてそこからslack通知なりなんなり便利に使ってみましょうという流れ。

https://ameblo.jp/itboy/entry-10172179452.html


今回困ったこと

1. プロセスの引数がいっぱいあってどうやって指定するのかわからん
2. プロセスの引数にオプション指定ある
3. プロセスの引数の中にカンマがある

ここに書いてあるように

https://tsunokawa.hatenablog.com/entry/2017/11/01/015813

https://qiita.com/manabuishiirb/items/221f57f3f1352cd72bf8

```
proc.num[]
```

[]の中は引数が四つある

```
第一引数 [name]
プロセス名（ps -e の出力結果）

第二引数[user]
プロセスの実行ユーザ名

第三引数[state]
監視するプロセスの状態を指定

第四引数[cmdline]
フィルタする文字列（ps -ef の出力結果から文字を選べる）
```

今回書いたのは一と四


```:name
$ ps -e | grep inotifywait
22375 ?        00:00:00 inotifywait
```

```:cmdline
$ ps -ef | grep inotifywait
ec2-user   822   725  0 16:03 pts/4    00:00:00 grep --color=auto inotifywait
root     22375 22374  0 13:21 ?        00:00:00 inotifywait -e CLOSE_WRITE,DELETE -mrq /var/www/html/hoge/huga
```


```:正解
proc.num[inotifywait,,,“-e CLOSE_WRITE.DELETE -mrq /var/www/html/hoge/huga”]
```

コマンドの引数は第四引数の位置に書いてあげる
カッコ[]内のカンマ“,”はドット“.”で代用できる
検索文字列内の ***ハイフン“-”*** を文字列として認識させたい時は ***ダブルクォーテーションで括る “”*** 

この形が作れたらproxyでzabbix_getを投げて値が返ってくるかどうか確認
OKだったらitemとtrigger作ってseverityをinfoで確認
OKだったら第四引数の文字列を適当に変えてinfoが発砲するか確認

今回のzabbix_getはこれ

```
$ zabbix_get -s <ip address> -k proc.num[inotifywait,,,“-e CLOSE_WRITE.DELETE -mrq /var/www/html/hoge/huga”]
1
```

1が返ってくる事を正常と判断して設定

以下備忘

```
-s
監視対象のIP
対象自体にzabbix_getが入ってたら127.0.0.1でおｋ

-k
key 監視したい項目を入れる
```
zabbixによるURL監視の備忘録

zabbix触り始めて割と最初の頃に躓いた時のメモ
バージョンは4系

対象はALB配下のwebサーバー

## Hosts作成のあれこれ

zabbix-web上での設定

Agent interfacesは厄介
ELB配下のURLについてはDNS設定が出来ない(当然ELBいるから)
-> というそもそもコンテナで稼働しているzabbixサーバーはport 10050 をlistenしている
-> ELBでそんなport開いてるわけ無いでしょ
-> しかしuser agentを設定しないわけにも行かないので自分のローカルIPを設定すれば結果的におｋ

IPを選択して、127.0.0.1 / port 10050
※zabbixサーバー自身のローカルを指定してる(ELB配下じゃなかったら監視対象のDNSを指定したい所)

Groupsは監視対象次第(EC2とかRDSとか)で適宜
VisibleNameはそのまんまhost名になるので、パット見でわかりやすい名前や、既存の設定に合わせて命名しましょう。

##・Triggersについて
既に環境をクライアントに引き渡している場合、アラート通知設定済みの環境であれば即通知が行ってしまう。
--->ミスっていないか確認する為、通知はWarningからInformationに変えておきましょう。安牌大事

・Web scenarios(シナリオ)についての勘所さん
ここのエラーが解決できなくて、当時頭を抱えてた所

{$REQUIRED_STRING}　とは
※REQUIRED -> 必須

監視対象のURLにアクセスした時に、そのwebページ上の特定の文字列を取得する。
ここの設定は必須では無いが、Monitoring Webの項目はなんかしら絶対取得できる文字列を設定すると◎

-> 例えばhogehoge社のwebページなら「hogehoge」って単語はどこかしらに必ずあるでしょっていう文字列を設定
-> もしくは、「Macros」で{$REQUIRED_STRING} のValueを「空欄」にしちゃって結果的におｋにしてしまう方法もあるがちょっとナンセンス

これでひとしきりおｋ
Main.storyboardの名前を変更する

# はじめに
Xcodeではプロジェクトを生成したときに、StoryboardはデフォルトではMain.storyboardという名前で生成されます。

ただStoryboardの名前を変更しただけでは、いくつか参照されている箇所があるので、エラーになり落ちてしまいます。

# 変更方法

![Screen Shot 2021-09-07 at 1.54.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300780/f14fc685-3b00-2bad-79e4-0df137497923.png)

まずstoryboardを任意の名前に変更します。

![Screen Shot 2021-09-07 at 1.57.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300780/419aba1d-ed8e-f561-f206-6d501298b300.png)

次にinfo.plistを開き、`Main storyboard file base name`と`Application Scene Manifest`の最下層にある`Storyboard Name`を変更します。

`Storyboard Name`は結構深いところにあるので、見落としがちです。
以上の作業でStoryboardの名前を変更することができました。
A tour of goで"no required module provides package golang.org/x/tour/"が出て困った

めっちゃ初歩的で恥ずかしいんですが、めっちゃ詰まってました笑

## バージョン

```zsh
go version
go version go1.17 darwin/arm64
```

##　事象

以下のように、`golang.org/x/tour/`の下のパッケージを`import`するようなファイルが実行できない。

https://go-tour-jp.appspot.com/moretypes/18

`go run ./exercise-images.go`で実行したときのエラーは以下。
exercise-images.go:7:5: no required module provides package golang.org/x/tour/pic: go.mod file not found in current directory or any parent directory; see 'go help modules'


## 解決

モジュール化したいルートディレクトリに遷移して以下コマンドを実行します。

```zsh
go mod init <モジュール名>
```

そうすると、再度`go run`をすると

```
exercise-images.go:7:5: no required module provides package golang.org/x/tour/pic; to add it:
        go get golang.org/x/tour/pic
```

と表示されるので、
`go get golang.org/x/tour/pic`にて実行できました。

## 解説

Goの1.16のリリースから`GO111MODULE`の規定値が変更されているみたいです。
このリリースが2021年2月で、比較的新しいのであまり探しても解決策が出なかったようです。。

https://golang.org/doc/go1.16#go-command

### 解決策その1

Goの1.16以前の設定に戻して実行する方法です。
環境変数の`GO111MODULE=auto`に設定すればOK。
`go env -w GO111MODULE=auto`

### 解決策その2(上に書いた方法)

`go mod init`でモジュール化する方法。

### 何が違うの？

正直自分より詳しい人たちが書いた記事あるので、自分の簡単な理解を書いておきます。。
前者はGOPATHモードと言って、パッケージを全てGOPATH配下で管理するモードという理解です。
バージョンは1つしか管理しないため、異なるバージョンを使いたいときに困る。

後者はモジュールモードと言って、モジュールごとにパッケージを管理するモードです。
1.16からデフォルトでこちらを使用するようになったので、公式推奨です。
`go.mod`ファイルの中でモジュール間の依存関係を記述します。このとき、バージョン込みで管理できるので、GOPATHモードのときのような問題は起こらなくなります。

以上
Discord bot を作ってみる(Discord.js,Visual Studio Code)

Discordのbotを入れるならVSCodeが一番でしょう。
自分は、低スペックパソコンを使っていますが、新しいパソコンを使ったらbot専用パソコンにしようかなと思ったり...
そこで、botを自作してみようと思います。

ネット上からかき集めたものを独自に作ります。わかったら読み進めて

①自動でつぶやく機能

時刻をとるか(7,10,12,15,18,21時)
過疎してるかをとるか(2回/min以下)

それによって変わってきます。

僕は、過疎ってるほうをとります。

botの作成
https://discord.com/developers/applications/
VSCode
https://azure.microsoft.com/ja-jp/products/visual-studio-code/
それぞれ作業してください。

botは「NewApp...」っていうところをクリック、好きな名前、青いとこをクリック、
botタブに行き、add Botヲクリック
Yes,do it

oauth2タブにて
真ん中のbotにチェック、
Administerをクリック、(管理権限与えれば設定省ける)
URLをコピペし、サーバーに参加させる。

ここからが本番といいたいところだが、ちょっと下調べをするため今日はここらへんで終わり。
次回も見てね

ばいばい
WSL2でElixirLS拡張が動かないときの対処法

fukuoka.exに所属してElxiir書いてるkoyoです。
Elixirも最近また盛り上がってきましたね:+1:

## ElixirLS拡張便利
VscodeでElixir書くときはこちらのLanguage Serverが便利です。モジュールの関数サジェストしてくれたり定義ジャンプを提供してくれます。

https://marketplace.visualstudio.com/items?itemName=JakeBecker.elixir-ls

WSL2で使ってると `ElixirLS server has crashed 5 times in 3 minutes.` というメッセージが出て動かなく、困ったので備忘録がてら書きます。

## ElixirLS server has crashed 5 times in 3 minutes.
以下が回答なのでこちら参照。

https://elixirforum.com/t/elixirls-vscode-plugin-crashing/30735/9

Elixirの公式ドキュメントにもあるように `sudo apt install esl-erlang` を実行すれば治りました。wgetとapt updateも忘れずに。
自分は [asdf](http://asdf-vm.com/guide/getting-started.html#_1-install-dependencies) 経由でダウンロードしてたのでこちら抜けてましたね。
スプレッドシート内のボタンをクリックしてGASを実行する方法

スプレッドシート内のボタンをクリックして関数を実行する方法をご紹介します。

# 1. 図形（ボタン）の準備
まずはスプレッドシートの[挿入] ＞ [図形描画]から、任意の図形を作成しましょう。
今回はボタンをクリックするとその日の日付をセルに貼り付ける関数を実行するため、ボタンに「日付入力」と書いています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1955768/3ea46c33-842d-fb37-4f92-9ca73b4e695f.png)

# 2. 日付を貼り付ける関数を作成
概要は省略します。

```gas:pushBtn.gs
function pushBtn() {
  // 現在のシートを取得
  const Sheet = SpreadsheetApp.getActiveSheet();

  // 今日の日付
  const DateObj = new Date();
  const Today = Utilities.formatDate(DateObj, 'Asia/Tokyo', 'yyyy年MM月dd日');

  // スプレッドシートへ貼り付け
  Sheet.getRange("A5").setValue(Today);
}

```

# 3. ボタンにスクリプトを割り当てる
ボタンにカーソルを合わせると右上に黒ぽちが表示されるので、それをクリックして「スクリプトを割り当て」をクリックする。
「どのスクリプトを割り当てますか？」と聞かれたら、実行したい関数名を入力する。
※今回の場合は「pushBtn」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1955768/4be8dd2c-4407-947d-8295-959800457ca9.png)

# 4. 実行してみる
ボタンをクリックすることで、先ほど作成した関数が実行されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1955768/f0f8e8bf-ebdc-6c37-17b7-de7919e301db.png)

# 5. 誤クリックを防ぐために
スプレッドシートを操作していると、間違ってボタンをクリックしてしまうこともあるかと思います。
その場合はボタンクリック後にメッセージボックスを表示してみると良いかもしれません。

```gas:pushBtnMsg.gs
function pushBtnMsg() {
  // 現在のシートを取得
  const Sheet = SpreadsheetApp.getActiveSheet();

  // 今日の日付
  const DateObj = new Date();
  const Today = Utilities.formatDate(DateObj, 'Asia/Tokyo', 'yyyy年MM月dd日');

  const MsgBox = Browser.msgBox("日付を入力しますか？", Browser.Buttons.OK_CANCEL);
  if (MsgBox == "cancel") {
    Browser.msgBox("日付の入力を中止しました");
  } else {
    // スプレッドシートへ貼り付け
    Sheet.getRange("A5").setValue(Today);
    Browser.msgBox("日付の入力が完了しました");
  }
}
```

実行するとこんな感じになります。
私は確認すら面倒くさいと感じてしまうので、メッセージボックスは使いませんが、分岐処理をする分には便利かもしれませんね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1955768/8b232749-cb46-d533-f021-c674a7fbb54a.png)
LinuxでChromeリモートデスクトップが動作しない問題の解決法

#はじめに
2021年のいずれかの時点で、Linux環境にChromeリモートデスクトップをインストールしても起動せず、リモートアクセスされる端末として動作しない問題が起こるようになったため、解決法を示す。

#1.検証環境
KDE neon 5.22 User Edition
Ubuntu 21.04
Zorin OS 16 Core

#2.問題の所在
インストールまたは起動の過程で行われるべき手順が正常に行われていないこと。
問題の所在を突き止めるにあたって、/opt/google/chrome-remote-desktop/chrome-remote-desktopの以下の記述を参考にした。

```
CHROME_REMOTING_GROUP_NAME = "chrome-remote-desktop"

HOME_DIR = os.environ["HOME"]
CONFIG_DIR = os.path.join(HOME_DIR, ".config/chrome-remote-desktop")
SESSION_FILE_PATH = os.path.join(HOME_DIR, ".chrome-remote-desktop-session")
SYSTEM_SESSION_FILE_PATH = "/etc/chrome-remote-desktop-session"
SYSTEM_PRE_SESSION_FILE_PATH = "/etc/chrome-remote-desktop-pre-session"
```
本来はインストール後、chrome-remote-desktopグループの作成と当該グループへのユーザーの追加、およびいくつかのフォルダ、ファイルの作成が行われているはずであるが、それらが作成されていなかったため、これを手動で行う必要がある。

#3.解決方法
[Chrome リモートデスクトップ on Ubuntu](https://qiita.com/ninose14/items/473369d76814174dd58f)

上掲の記事で示されているデフォルトのセッションを利用するための設定を行う。

なお、2021年9月現在、/opt/google/chrome-remote-desktop/chrome-remote-desktopの内容が変更されているので、launch_sessionの設定については以下のようにする。

```py
  def launch_session(self, x_args):
    self._init_child_env()
    self._setup_pulseaudio()
    self._setup_gnubby()
    self._launch_x_server(x_args)
    if not self._launch_pre_session():
      # If there was no pre-session script, launch the session immediately.
      self.launch_x_session()
```
↓

```py
  def launch_session(self, x_args):
    self._init_child_env()
    self._setup_pulseaudio()
    self._setup_gnubby()
    # self._launch_x_server(x_args)
    # if not self._launch_pre_session():
      # If there was no pre-session script, launch the session immediately.
      # self.launch_x_session()
    display = self.get_unused_display_number()
    self.child_env["DISPLAY"] = ":%d" % display
```

その後、以下の手順を行う。
なお、本来はデフォルトのセッションを利用する設定を行わずとも、以下の手順を行うのみで動作するものと考えられるが、筆者の環境では以下の手順のみを行っても起動しなかった。

```
cd ~
touch .chrome-remote-desktop-session

cd ~/.config
mkdir chrome-remote-dektop

sudo addgroup chrome-remote-desktop
sudo usermod -a -G chrome-remote-desktop ${USERNAME}

cd /etc
sudo touch chrome-remote-desktop-session
sudo touch chrome-remote-desktop-pre-session
```
正規化について

***2021/9月。DB設計をする必要があるので改めてDB設計に関して再学習している***
備忘録として自分の言葉でまとめておく。
#正規化
DBを扱う際に必要な設計の考え方。
シンプルに一言でいうならデータを効率よく使えるように分割する事。
正規化はすべて***可逆性（第一⇔第二⇔第三）***がある。

##第一正規化
***テーブルを一つのセルごとに分割する事。***
###メリット
一つの主キーに一つの値を割り当てることが出来るようになる。
一つの枠の事を「***スカラ値***」と呼ぶ。
下の画像のような、一枠がセル
![seru.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1803173/7cf1764e-a2a9-1847-ec52-3e783a05a507.jpeg)

##第二正規化
***テーブルを分割する事***
###メリット
主キーを別々にすることで細かい単位で管理ができるようになる。
テーブルを分けることで誤った入力を防ぐことが出来る（***外部キーなどが該当する***）

（例）***会社と、社員***のような分割できる***部品***で分けること。
![kuruma.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1803173/30993423-1487-1c3e-becc-8166847cd808.png)
![hito.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1803173/fd637cc1-f52a-6fd5-2304-7f8c340e0a73.png)

##第三正規化
***推移的関数従属な関係が存在する際に不都合なく動くテーブルまで分割してあげること。***
###メリット
第2正規化では届かなかったより細かい単位での情報管理が可能になる。

***要するにどこにデータを入れたくても不都合なく動くようにしたいって話であり第二正規化と根本的な考え方はおなじである。***


##推移的関数従属
テーブルの関係性に段階があること。
砕いた言い方をすると、***OOがあるからXXがある。***というような依存性のある階層関係

##複合キー
主キーが複数あるテーブル。
###メリット
主キー一つでは絞ることが難しい場合にしようすることでテーブルを管理しやすくなる。
個人的な感想だが複合キーは絶対悪ではないと2021/9月時点では思っている。
***ただ、なるべくシンプルに。主キーは一つであることがベスト。***

##最後に
良い設計をして、良いシステムを提供したい。

##学習用参考書
https://www.amazon.co.jp/%E9%81%94%E4%BA%BA%E3%81%AB%E5%AD%A6%E3%81%B6DB%E8%A8%AD%E8%A8%88-%E5%BE%B9%E5%BA%95%E6%8C%87%E5%8D%97%E6%9B%B8-%E5%88%9D%E7%B4%9A%E8%80%85%E3%81%A7%E7%B5%82%E3%82%8F%E3%82%8A%E3%81%9F%E3%81%8F%E3%81%AA%E3%81%84%E3%81%82%E3%81%AA%E3%81%9F%E3%81%B8-%E3%83%9F%E3%83%83%E3%82%AF/dp/4798124702
(Mac) AutomatorとVisual Studio Codeを使って100個のC言語のプログラム実行結果の取得を自動化した話

# 目次
<!-- タイトルとアンカー名を編集 -->
1. [はじめに](#はじめに)
1. [前提条件](#前提条件)
1. [自動化するための手順](#自動化するための手順)
1. [おわりに](#おわりに)

# はじめに
アルバイトとして大学のプログラミング講義で学生から提出されたプログラム課題の採点業務を担当しています。

約100人×数個の課題分だけプログラムの実行結果を見て採点を行う必要があるのですが、手作業でプログラムの実行確認を行うことはとても大変です。

調べてみたところ、プログラムの実行結果の取得をAutomatorによって自動化することができたので、その方法を記録として残します。

100個のC言語のプログラム実行結果を自動的に取得している画面の録画は以下のYouTube動画へアップロードしています。
https://youtu.be/GzCoYjB-FCM
本来は学生から提出された100個のプログラムを実行するのですが、動画では同じサンプルプログラム100個を実行しています。

MacのAutomatorをうまく使えば、大学のプログラミング課題の実行結果の取得を自動化するだけでなく、他のことにも応用できそうです。(ただ、使い勝手が難しいところもありました…。)

# 前提条件
パソコン： Mac OS Big Sur 11.5.2 (MacのAutomatorを使えるのであれば、他のバージョンでも問題ないと思います。WindowsではAutomatorが使えないので、今回の記事は参考になりません。)

プログラムの実行環境：Visual Studio Code (他のエディターでも対応できると思いますが、Automatorの自動化の際に、マウスのクリックが記録されないエディターがある可能性があるので注意が必要です。)

プログラミング課題の内容：今回はC言語の課題ですが、他の言語でも対応できると思います。出力結果の確認は、学生ごとにスペースの位置や改行などが微妙に異なっているため、目視で正しいかを判断します。(この作業は大変なので改善が必要ですね。)プログラムの実行結果のみを見て採点する方法です。

# 自動化するための手順

Visual Studio Codeで採点したいプログラムを開きます。今回は100個のC言語のプログラムを開きました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/572997/7ae226c8-35be-2ebd-d689-67ed4befb601.png)

100個のC言語のプログラム実行結果をVisual Studio Codeのターミナルで表示されるログに出力するのですが、出力した行数が1000を超えると上から順番に消されてしまうため、以下のサイトを参考に
「"terminal.integrated.scrollback": 10000,」と変更し、表示されるログの行数を10000などに変更します。

https://blog.aiandrox.com/posts/tech/2021/04/09/

Automatorでは、「Visual Studio Codeのウィンドウをマウスでクリックする」ことの記録ができない(？)ため、Visual Studio Code上でプログラムを実行する・実行するプログラムを切り替えることなどを全てキー入力で行い、Automatorに記録させる必要があります。

MacのVisual Studio Codeでは、「Control + Shift + @」でエディタとターミナルを切り替えることができるのですが、Automatorの「Control + @」で別のショートカットキーが起動してしまい、キー入力の記録を受け付けてくれませんでした。

そこで以下の記事を参考に、エディタからターミナルを切り替えるショートカットキーを例えば「Control + Shift + 0」など他のショートカットキーと重ならない適当なキー入力に置き換えます。

https://qiita.com/Shun141/items/fbed88abd4518f6d4039

以下の記事を参考に、Automatorでワークフローを作成します。

https://alwayscrazy.me/mac-autoplay-tips/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/572997/24a8e64e-2b85-6c4f-18a8-18179329b803.png)


ワークフローは上記の画像のとおりになりました。
1つずつ操作の意味を簡単に説明します。

Option + Control + N：C言語のプログラムを実行します。

Shift + Control + 0：以前の手順で登録した「エディタからターミナルにフォーカスを切り替える」ショートカットキーです。

Command + V：C言語のプログラムを実行する際に入力として必要な文字列をペーストします。

Return：入力として必要な文字列を確定させ、C言語のプログラム上のfgetsで読み込ませます。

Shift + Control + 0：ターミナルからエディタにフォーカスを切り替えます。

Command + W：実行したC言語のプログラムを閉じます。

以上のワークフローを実行することによって、Visual Studio Codeのターミナル上に実行ログが追記されていきます。

#おわりに
自動化によって、以下の画像のキー入力を行ってプログラムの実行結果を取得する作業を自動化することができました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/572997/e4ae00d8-3e06-1a23-a85c-6c2fded59c56.png)

Automatorを実際に利用すると分かるのですが、思ったとおりに動いてくれないことが多く、なかなか大変です。

Visual Studio Codeで100個のC言語のプログラム実行結果を取得する方法は、他にあるかもしれないです。ご存じでしたら教えていただけると助かります！
OpenJDKのインストール（mac）

# はじめに
最近PCを入替えたので備忘を兼ねてメモ
最新版だけ入れておけばいいんだけど、レガシーなシステムだといまだに
JDK8 を使っていたりするので、OpenJDK いれて切り替えができるまでの手順を残しておく


# やりたいこと
1. OpenJDK のインストール
2. バージョンの切替ができること

# 環境情報

```
% sw_vers
ProductName:	Mac OS X
ProductVersion:	10.15.7
BuildVersion:	19H1323
```

# やったこと
1. homebrew で OpenJDK のインストール
2. バージョンの切替

# 1.homebrew で OpenJDK のインストール
adoptopenjdk の OpenJDK をインストールします。
今回は、8, 11 のインストールを行います

```
# JDK 8 のインストール
% brew install adoptopenjdk8 --cask
🍺  adoptopenjdk8 was successfully installed!

# JDK 11 のインストール
% brew install adoptopenjd11 --cask
🍺  adoptopenjdk11 was successfully installed!

```
無事、インストールできました。
※そういえばいつのまにか「cask」コマンドの使い方が変わっていたんですね
※「brew cask install xxx」 →　「brew install xxx --cask」


ここまでで、インストールされた OpenJDK のバージョンを確認しておきます

```
% /usr/libexec/java_home -V
Matching Java Virtual Machines (2):
    11.0.11, x86_64:	"AdoptOpenJDK 11"	/Library/Java/JavaVirtualMachines/adoptopenjdk-11.jdk/Contents/Home
    1.8.0_292, x86_64:	"AdoptOpenJDK 8"	/Library/Java/JavaVirtualMachines/adoptopenjdk-8.jdk/Contents/Home

```
ちゃんと、 8, 11 が入ってますね
また、この時点時点では、 OpenJDK11 が有効化されているようです

```
java -version
openjdk version "11.0.11" 2021-04-20
OpenJDK Runtime Environment AdoptOpenJDK-11.0.11+9 (build 11.0.11+9)
OpenJDK 64-Bit Server VM AdoptOpenJDK-11.0.11+9 (build 11.0.11+9, mixed mode)
```


# 2.バージョンの切替
では、バージョンの切替をやっていきます。
やることとしては、`JAVA_HOME`にパスを通しておけばOKですね

現在 OpenJDK 11 が有効になっているので、これを 8 に切り替えます

```
% export JAVA_HOME=`/usr/libexec/java_home -v 1.8`
% java -version                                   
openjdk version "1.8.0_292"
OpenJDK Runtime Environment (AdoptOpenJDK)(build 1.8.0_292-b10)
OpenJDK 64-Bit Server VM (AdoptOpenJDK)(build 25.292-b10, mixed mode)
```

できました。
同様に、11 にしたいときは、

```
% export JAVA_HOME=`/usr/libexec/java_home -v 11`
% java -version                                  
openjdk version "11.0.11" 2021-04-20
OpenJDK Runtime Environment AdoptOpenJDK-11.0.11+9 (build 11.0.11+9)
OpenJDK 64-Bit Server VM AdoptOpenJDK-11.0.11+9 (build 11.0.11+9, mixed mode)```
```
とすればOKです。
【Atcoder】JavaScriptでもC++のSTLが使いたい！

## はじめに
競プロではC++の利用者が圧倒的に多い中、私はJavaScriptでAtCoderのコンテストに参加しています。理由は、競プロを始めようと思ったときに、新しくC++を勉強するよりも、使い慣れた言語で手っ取り早く競プロを始めたかったからです。JavaScriptはC++と比べると実行速度が遅い言語ではありますが、適切に実装すれば、大半の問題では制限時間を超えてしまうことはないと感じています。しかし、ときどきC++との大きな差を感じざるを得ない場面もあります。

## C++のSTLが使いたくなるとき
JavaScriptにはArray・Set・Mapなどのデータの集合を扱うためのクラスが用意されていますが、C++のSTLに比べると種類や機能が貧弱です。例えば、JavaScriptでキューを使いたいときはArrayで代替することになりますが、先頭の要素を取り出す`Array#shift`は計算量が`O(n)`のためかなり低速です<sup>[[1]](https://wass80.hateblo.jp/entry/2020/04/14/JS%E3%81%AEArray%23shift%E3%81%8C%E9%81%85%E3%81%84%E3%81%AE%E3%81%A7%E3%82%AD%E3%83%A5%E3%83%BC%E3%82%92%E9%A0%91%E5%BC%B5%E3%82%8B%EF%BC%8E%E7%B5%90%E6%9E%9Cwasm%E3%81%AF%E9%80%9F%E3%81%84%EF%BC%8E)[[2]](http://tatamo.81.la/blog/2018/02/09/competitive-programming-using-js-and-ts-02/)</sup>。また、C++の`std::set`のように要素が常にソートされているクラスも用意されていません。もし、STLにあってJavaScriptにはないクラスが必要になったら、自前で実装しなければなりませんが、それはかなり大変です。

## tstlとは
JavaScriptでやるのもそろそろ限界かと思いながら、いろいろと調べていると、AtCoderのTypeScript環境には`tstl`というライブラリがインストールされていることに気が付きます<sup>[[3]](https://atcoder.jp/contests/language-test-202001)</sup>。`tstl`はC++のSTLをTypeScriptに移植したライブラリとのことで、これは非常にありがたいです。JavaScriptでSTLにあるものと同等のクラスを使うことができれば、上記の問題は解決できます。
【リポジトリ】https://github.com/samchon/tstl
【API一覧】https://tstl.dev/api/modules/std.html

## tstlを使うときの注意点
`tstl`はTypeScript環境にしかインストールされていないため、JavaScriptユーザーが`tstl`を使う場合は、提出言語をTypeScriptに指定する必要があります。また、リポジトリのREADMEではデフォルトインポートが使用されていますが、AtCoderがインストールしている`tstl`のバージョンではデフォルトインポートに対応していないようなので、名前付きインポートを使用します。

```js
import * as std from 'tstl'; // すべての名前つきエクスポートをまとめてインポートする
```
【ABAP】VBKDとVBPAからのデータ抽出

#やること
VBKD（販売伝票:ビジネスデータ）や、VBPA(販売伝票:取引先)のように、ヘッダデータと明細データが同じテーブルに格納されている場合のデータ抽出について。

こちらのテーブルから明細に関する情報を取得する場合は、①明細データが存在したら明細データを、②存在しなかったらヘッダデータを取得する必要があります。

いままで、明細＆ヘッダのデータを抽出してからREAD TABLEで、とか、SELECT CASEとかやりましたが、SELECT **COALESCE** でスッキリ書けたので、サンプルを書いておきます。

#参考
COALESCEに関するSAP HELPは[こちら](https://help.sap.com/doc/abapdocu_latest_index_htm/latest/en-US/abensql_coalesce.htm)

#サンプル
以下、VBKDの請求日(FKDAT)を取得する場合

```ABAP:SELECT_VBKD.abap
SELECT
  FROM VBAP
    INNER JOIN VBKD AS HEADER       "ヘッダデータ
       ON VBAP~VBELN = HEADER~VBELN
      AND HEADER~POSNR IS INITIAL
    LEFT OUTER JOIN VBKD AS DETAIL  "明細データ
       ON VBAP~VBELN = DETAIL~VBELN
      AND VBAP~POSNR = DETAIL~POSNR
  FIELDS
    VBAP~VBELN,
    VBAP~POSNR,
    COALESCE( DETAIL~FKDAT, HEADER~FKDAT ) AS FKDAT, "明細が存在すれば明細、なければヘッダ
    DETAIL~FKDAT AS D, "明細
    HEADER~FKDAT AS H  "ヘッダ
  INTO TABLE @DATA(RESULT).

CL_DEMO_OUTPUT=>DISPLAY( RESULT ).
```
コアウェブバイタル CLS対策コーディング

## そもそもCLSとは？
2021年5月にGoogle検索結果のランキング要素に新たなページエクスペリエンスが追加されました。
評価の対象としてコアウェブバイタルという３つの指標が定められました。
3つの指標とは、LCP（速度）、FID（応答性）、CLS（視覚要素安定性）です。

その中で、おそらくマークアップ手法で最も影響を受けやすいものがCumulative Layout Shift、略してCLSです。
従来のコーディングだと今までどちらでもできた表現が、はっきり良否が分かれるため逆にやりがいを感じるかもしれません。

https://web.dev/vitals/#core-web-vitals

## 改善のきっかけ
アクセス解析担当者から、サーチコンソール上のエラー報告を受けCLSの存在を知りました。
フロント部分の原因と知り調査を開始しました。
改善前の私のコーディングはレスポンシブサイトを意識した常にレイアウトが伸び縮みするようなCLSエラーを代表するような悪い例でした・・・

## 実装例
ここからは実際にエラーの解消に役立った具体的なコーディング手法をいくつか紹介します。
基本的には、HTMLとCSSの書き方を気をつけるだけで改善できます。

### 画像の処理
画像の読み込みは遅れて行われるため、widthとheightを指定しないと画像の大きさのままに表示領域を変えてしまいます。
imgタグにwidth属性とheight属性を指定していきます。

```
<img src="hoge.jpg" width="200" height="100">
```

モバイルやタブレットはCSSで対応しましょう。

```
@media screen and (max-width: 767px) {
	img {
		width: 100px;
		height: 50px;
	}
}
```

タブレットは、現状では評価の対象外なので意識する必要は無さそうです。
また対策として、CSSをインラインで書いた方が良いという声もありますが、通常の外部ファイル化でもエラー解消出来たので問題ないです。

デスクトップもCSSで対処できますが、width属性とheight属性を指定しなかった場合に別の警告が出てしまうので必ず指定しましょう。

### モジュール
幅や高さを固定しても問題なさそうな要素はなるべくwidthやheight指定しましょう。
領域を確保した親コンテンツがある状態で中身をレイアウトしていくのが理想です。

以下は、ボタンのスタイル例の一部です。
しっかりとwidthとheightで領域を確保した上で中央寄せします。
良くない例で言えば、paddingやmax-widthなどの可変してしまうプロパティのみでの構築です、要素が可変するものはレイアウトシフトの原因になります。

```
	display: flex;
	justify-content: center;
	align-items: center;
	widht: 200px;	
	height: 100px;
```

### 追従ヘッダー
Webサイトでよく使用されているスクロールしてもついてくる追従ヘッダーです、初めからposition: fixedで置いてしまうと高さがないためレイアウトシフトの原因になります。
スクロール後に固定されるように工夫が必要です、JSなどを使用し読み込み後の固定にすると良いです。

### Webフォント
結論から言いますと、きちんと扱えばWebフォントは使っても大丈夫です。
中にはフォントの読み込みに時間がかかり、レイアウトシフトしてしまうこともあるので注意は必要です。

## 検証方法とツール

### PageSpeed Insights
Google公式の検証ツールです、スコアの表示に加え実際のズレが発生している箇所を知らせてくれるので、基本的にはこちらを確認しながら進めます。

https://developers.google.com/speed/pagespeed/insights/?hl=ja

### Google Chromeデベロッパーツール
デベロッパーツールを開いたら、Performanceタブに移動します。
リロードの矢印アイコンをクリックして、ページの読み込みが終わったらStopを押します。
ものすごく細かな静止画で、レイアウトシフトをしている箇所を確認することができます。

### Web Vitals
Chrome拡張機能です。
検証が非常に楽でページのCumulative Layout Shiftスコアを一瞬で表示してくれます。

https://chrome.google.com/webstore/detail/web-vitals/ahfhijdlegdabablpippeagghigmibma?hl=ja

以上となります、最後までご覧戴きありがとうございました。
【メモ】React Native + Expo + TypeScript で使える(使えてる)npmパッケージまとめ

# はじめに

元々SwiftでiOSアプリを作ってプログラミングを始めたのですが、web開発をやるにつれ、ネイティブアプリをTypeScriptで書きたいと思うようになり、React Nativeに手を出しました。

また、CocoaPodsだのあーだこーだをよしなにやってくれるExpoを使うようにします。

ただ、Expoで動くnpmパッケージが限られており、またTypeScript環境で型定義ファイルを用意してくれているnpmパッケージも限られています。

なので、Expo + TypeScriptで使えるな〜と思ったnpmパッケージを随時追記していきます。

# npmパッケージ一覧

## react-native-dotenv, @types/react-native-dotenv

このパッケージで環境変数が使えます。

参考URL: https://dev.to/bhatvikrant/how-to-add-environment-variables-in-a-react-native-project-with-ts-2ne5

型定義ファイルのパッケージも提供されています。

## react-native-storage

これでlocalStorage的なものが使えます。セキュリティ的に問題ないデータをとりあえず端末に保存できます。

参考URL: https://zenn.dev/nekoniki/articles/b295b0d123f7b1

## expo-secure-store

このパッケージでsecureなlocalStorage的なものが使えます。keychain的な？

参考URL: https://docs.expo.dev/versions/latest/sdk/securestore/

## tailwind-rn

このパッケージでReact Nativeでもcssパッケージのtailwindが使えます。

参考URL: https://zenn.dev/shon0/articles/3157650d9b3cb1b0eb41

参考URLの手順を踏むと、途中で

```
Cannot find module 'tailwindcss'
```

とか怒られるかもしれませんが、普通に

```
expo install tailwindcss
```

とすれば、問題なく使えます。

[tailwind-rnのgithub](https://github.com/vadimdemedes/tailwind-rn) の `Supported Utilities` でクラス名の一覧がまとめられてます。

# 最後に

これからどんどん追記していくと思います。
まだまだReact Native触りたてなので、なんかあったら遠慮なくコメントください
【初心者】 M1 mac でTensorflow分析環境が壊れたので再度やり直しました

Qiita初投稿です。

## 環境
- macOS Big Sur 11.6
- Mac mini (M1, 2021)

## 事象
- 新たにconda createで作成した仮想環境でpythonが起動せず、ターミナルで"killed: 9"が頻発
- base環境にてconda update --allを行ったところ、全てが壊れる（３年ぶり２回目）

## 結論
下記の公式ページの手順に則ってやったら上手くいきました。
https://github.com/apple/tensorflow_macos/issues/153

1. Xcodeを再インストール（先のエラーはXcodeが原因だったっぽい）
2. 下記サイトからMiniforge3ーMacOSX-arm64.shをダウンロード。
    https://github.com/conda-forge/miniforge

3. miniforgeをインストール
    $ bash Miniforge3ーMacOSX-arm64.sh

4. 公式ページにあるymlファイルをダウンロード
    https://raw.githubusercontent.com/mwidjaja1/DSOnMacARM/main/environment.yml

5. 仮想環境をymlファイルを使って作成
    $ conda env create --file==environment.yml --name=new_env

6. 公式ページにあるコマンドでtensorflowをインストール
    $ pip install --upgrade --force --no-dependencies https://github.com/apple/tensorflow_macos/releases/download/v0.1alpha3/tensorflow_macos-0.1a3-cp38-cp38-macosx_11_0_arm64.whl https://github.com/apple/tensorflow_macos/releases/download/v0.1alpha3/tensorflow_addons_macos-0.1a3-cp38-cp38-macosx_11_0_arm64.whl


## 失敗パターン
- tensorflow-depsを入れてからtensorflow-macosを入れる
    - 下記サイトを参照したが、pip install tensorflow-macos の段階でうまくいかず。
    https://caffeinedev.medium.com/how-to-install-tensorflow-on-m1-mac-8e9b91d93706
    - grpcioのところでコケており、/usr/bin/python3 -m pip install tensorflow-macosもうまくいかず。
- パッケージのいくつかをDowngradeする
    - StackoverflowにSetuptoolsをダウングレードしたらいいよ等のコメントがあったため試すもうまくいかず。
    - python3.8のバージョンをpython3.8.5など古めのやつに直したりもしたが意味なし。

## 備考
- なんとかtesnsorflowが実行可能になったが、これまで出なかった警告が出るように。。。初心者のためここで終わりにします。。

    WARNING:tensorflow:AutoGraph could not transform
YahooのHackday2021で姿勢監視アプリ作ってきた

## 背景
リモートワークで気付いたら猫背になっているということが多くなってきたので、姿勢が崩れたら教えてくれるサービスを作りたいな、と思っていたらYahooのHackdayが開催されるという情報が出ていたので作るかーとなって同僚と参加してきた。

## 実現したい事
自分の姿勢が崩れていたら教えてくれる

### 実装方法
- Androidアプリで一定間隔で写真を撮りサーバーに送信
- Pythonサーバーでリクエストを受け取りHRNetを使って解析
- Androidアプリに結果を返して、姿勢が悪い場合は通知

## 使用技術
![Screen Shot 2021-09-26 at 23.01.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1031136/42ace277-6a17-6eaf-cdf4-0b6501cf112e.png)
### Client-Android
#### HttpClient
https://ktor.io/
ktor(ケイターというらしい)を使用。Androidだけではなく、iOSでも使えるらしい。
簡潔な記法で書けるのでとてもよかった。
### Server-Python
#### HttpServer
画像を受け取って結果を返すだけだったのでFlaskやDjangoは使用せず標準のHttpServerを使用。そこまで複雑ではないだろうと思って使ってみたが、bodyを読み取るまでにcontent-lengthを取得しそのlength分rfile.readを行い、bodyをdecodeして…という本質ではないボイラープレートだらけになってしまい後悔。サーバーでシンプルな処理をするだけならFlaskが良いのだろうか。最近Python触っていないので流行りも分からず。
#### HRNet
姿勢推定APIと呼ばれているもの。身体の部位16箇所を推定して返してくれるライブラリ。学習済みモデルを組み込めばお手軽に使えるようだったので試してみた。tensorflowの辺りのlibraryのインストールあたりで少し手間取ったが下記のHRNetをお手軽に使えるリポジトリを使用すると簡単に出来た。
https://github.com/stefanopini/simple-HRNet

デモ動画
https://www.youtube.com/watch?v=TZzOChs9hvs&ab_channel=%E6%A9%8B%E6%9C%AC%E6%99%B6

## 感想
Python久しぶりに触ってみたけど型がないとHttp通信周り書くの結構しんどい…
Hackdayは3回目だけど、2人で参加したのは初めて、やることが多くスライド作りもプレゼンも準備不足で時間足らないなーと感じた。直前なのに参加了承してくれた同僚には感謝しかない。
作りたいものを作っただけなので入賞できなかったのは仕方ない感はあったが次参加するときはスライドやプレゼンの対策もできる状態にしておきたい所。
アイデア出しも力入れるべきだったが、今回は作りたいものが作れたのでヨシ。ただ負けて悔しかったので、次回は勝つためのアイデア出しをするぞ！！！
UIViewの角を指定して丸くする

#今回の内容

* 指定した角だけ`.cornerRadius`を適用させる。


#コードと簡単解説

* `.layer.maskedCorners = .layerMinXMinYCorner`で`左上`だけを丸くします。

* `.layer.maskedCorners = .layerMaxXMinYCorner`で`右上`だけを丸くします。

* `.layer.maskedCorners = .layerMinXMaxYCorner`で`左下`だけを丸くします。

* `.layer.maskedCorners = .layerMaxXMaxYCorner`で`右下`だけを丸くします。

```Swift:
import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var systemIndigoView: UIView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        systemIndigoView.layer.cornerRadius = 30.0
        systemIndigoView.layer.maskedCorners = .layerMinXMinYCorner 
        systemIndigoView.layer.maskedCorners = .layerMaxXMinYCorner 
        systemIndigoView.layer.maskedCorners = .layerMinXMaxYCorner 
        systemIndigoView.layer.maskedCorners = .layerMaxXMaxYCorner  
    } 
}
```

#複数指定して角を丸くする

```Swift:例  
systemIndigoView.layer.maskedCorners = [.layerMinXMinYCorner,.layerMaxXMinYCorner,.layerMaxXMaxYCorner]
```

#終わり
ご指摘、ご質問などありましたら、コメントまでお願い致します。
久々にROS melodicで`catkin build`したらビルドエラー（Could not find a package configuration file provided by "tf" ）

久々にROS melodicで`catkin build`したらビルドエラー（Could not find a package configuration file provided by "tf" ）

```
$ catkin build
...
CMake Error at /opt/ros/melodic/share/catkin/cmake/catkinConfig.cmake:83 (find_package):
  Could not find a package configuration file provided by "tf" with any of
  the following names:

    tfConfig.cmake
    tf-config.cmake
...
```

とにかく色々なパッケージを再インストールしていたら解決した。
いくつか更新パッケージがあったのでそれが効いたのかもしれない。。

```
sudo apt install \
 ros-melodic-turtlebot3 ros-melodic-turtlebot3-msgs  ros-melodic-turtlebot3-simulations \
 ros-melodic-teleop-twist-keyboard ros-melodic-amcl ros-melodic-map-server \
 ros-melodic-move-base ros-melodic-urdf ros-melodic-xacro \
 ros-melodic-compressed-image-transport ros-melodic-rqt-image-view \
 ros-melodic-gmapping ros-melodic-navigation ros-melodic-interactive-markers \
 ros-melodic-hector-gazebo-plugins 
```

# 追記
他にも色々動かなかったので更新


```
CMake Error at /opt/ros/melodic/share/catkin/cmake/catkinConfig.cmake:83 (find_package):
  Could not find a package configuration file provided by "rviz" with any of
  the following names:

    rvizConfig.cmake
    rviz-config.cmake
```

上記の対策

```
sudo apt-get install ros-melodic-rviz
```

---

```
CMake Error at /opt/ros/melodic/share/catkin/cmake/catkinConfig.cmake:83 (find_package):
  Could not find a package configuration file provided by "costmap_converter"
  with any of the following names:

    costmap_converterConfig.cmake
    costmap_converter-config.cmake
```

上記の対策

```
sudo apt-get install ros-melodic-costmap-converter
sudo apt-get install ros-melodic-mbf-costmap-core
```

---

```
ModuleNotFoundError: No module named 'yaml'
```

上記の対策

```
pip install pyyaml
```
【Java初心者】初心者用語まとめ１


#初心者に必要であると考えられる用語をまとめてみた。

<h1>用語と説明</h1>
<p><b>・JRE(Java Runtime Enviroment)</b></p>
<p>　Javaのプログラムを動かすために必要なソフトウェアのこと。
　<br>　コンパイルはできないのだが、.classファイルを読み込むことができる。　</p>

<p><b>・JavaSE(Java Standard Edition)</b></p>
<p>  　JREの機能に加えてJavaのAPIやパッケージなどソフトウェア開発するのに必要な基本機能が集まったもの</p>

<p><b>・JavaEE(Java Enterprise Edition)</b></p>
<p>　JavaSEに拡張機能を追加したもの。
<br>　企業向けのシステムやWebサイトなどを開発するのに必要なAPIが集まったもの</p>

<p><b>・結合テスト</b></p>
<p>　複数のモジュールを結合させて動作をさせた時、設計書どおりに動作するかを確認するテスト。</p>

<p><b>・JSON(JavaScript Object Notstion)</b>
<br>　異なるプログラム間でデータのやり取りをするための共通のデータ記述形式のこと。</p>

<p><b>・アクセス修飾子でPrivateを指定する理由</b>
<br>　変数を守るために使用する。
<br>　変数を変更できない（setter()）ようにして、変数を参照できる(getter())ようにする。
<br>　変更したくない変数が存在するときに指定をする。</p>
AtCoder ABC220 挑戦！ (Python)

茶色コーダーを目指して、ABC220に、コンテスト2回目の挑戦です。

```ruby:ABC220A
A, B, C=map(int, input().split())
Flag=False #倍数が見つかるかどうかのフラグ
for i in range(1001):
    if A<=C*i<=B:
        print(C*i)
        Flag=True
        break
    else:
        pass

if Flag==False:
    print('-1')
else:
    pass
```
A問題にしては、記述量が多かった気がする。

```ruby:ABC220B
K=int(input())
#K進法表記のA, B
A, B=map(int, input().split())
# print(K, A, B)

# K進法から、10進法への変換
# int関数の2つ目の引数に整数を指定すると、基数を指定できる。
# print(int(str(A), K))
# print(int(str(B), K))
A_K_10=int(str(A), K)
B_K_10=int(str(B), K)

print(A_K_10*B_K_10)
```

B問題は、K進法から、10進法への変換の問題。
int()の2つ目の引数に基数を指定すれば、10進数に戻せる。
本当は、int()関数じゃなくて、自分で導出することを意図した問題な気はする。本などで別途アルゴリズム勉強するので、今回は勘弁勘弁。

```ruby:ABC220C
N=int(input())
A_list=list(map(int, input().split()))
X=int(input())

#繰り返し単位Aの合計を求めておく
A_list_sum=sum(A_list)

#求めたい答えは、XをAの合計で割った商*Nと足りない分の項目数なので、
#整数除算で商を求める。
quotient_X=X//A_list_sum #商: quotient 
#余り
mod_X=X % A_list_sum

k=0 #項目数のカウンター。初期化
sum_k=0 #kまでの合計。 初期化

#余りを、越えるまで、項目数を数えていく。
for i in range(N):
    sum_k+=A_list[i] #i番目を足していく
    k+=1 #項目のカウント
    if mod_X<sum_k:
        break
    else:
        pass
print(quotient_X*N+k)
```

肝心のC問題。今回は、前回に比べると、だいぶ簡単だった。
ポイントは、まずあらかじめXをA_listの合計で割って商を出しておいて、その余りについて、超えるまで、項目数を数えること。

ここまでで、40分ほど。

時間が1時間ほど余ったので、欲をかいてD問題に突入してみた。
問題の意味は理解でき、操作F, Gは実装できたが、なぜか途中のエラーが取り除けず、タイムアップ。
Dについては、他の人の回答見て勉強させてもらおう。bit全探索とか使いそうやなーと思ったけどどうなんだろうか。

今回も、C問題までACすることができてよかった。
反省としては、B問題で、int()を使ってしまったので、基本のn進数の変換については、勉強して自分で実装できるようにしたいと思う。

下記の本で勉強していく予定。
Pythonではじめるアルゴリズム入門 (翔泳社)

https://www.shoeisha.co.jp/book/detail/9784798163239

来週も頑張りましょう。お疲れさまでした。
tailwindcssとgithub-pagesでポートフォリオを作成し公開するまで

# はじめに
エンジニアに就職していますが<strong>htmlやcssを業務で触ったことは一切ありません。</strong>自身の職歴や興味のあるトピックをまとめる目的で今回ポートフォリオを作成しました。また、静的Webサイトの作成がgithub-pagesで簡易にできると調べて分かったため、今回はgithub-pagesで公開しています。cssも初めて触るためCSSフレームワークについて調査したところ<strong>tailwindcss</strong>というユーティリティーファーストなcssフレームワークが流行っているということで採用しました。<br>本記事ではtailwindcssとgithub-pagesでポートフォリオを公開するまでの手順をまとめています。
# 作成物
作成したポートフォリオは以下で公開しています。この記事を最後まで読んで作成できるクオリティです。※就職活動用ではないため一部、技術以外の内容も記載があります
気になる点は多々あると思いますが追々修正していきます。htmlやcssに詳しい方でデザインにアドバイスのある有識者の方はぜひ私のgitに修正を投げてください。よろしくお願いします！
ポートフォリオ -> [Portfolio@seamcarving](https://seamcarving.github.io/)
# github-pages
Githubのアカウントを作成すればそのユーザ名で静的サイトを公開できます。
以下にサイト公開までの手順が記載されています。gitを扱う必要があるので知識のない方は時間がかかるかも知れません。
[【初心者向け】Github pagesでwebページを公開する方法](https://qiita.com/sota_mikami/items/c6038cf13fd84b519a61)

# tailwindcss
tailwindCSSとはcssのフレームワーク名です。2018年頃登場した最新のcssフレームワークです。
主なポイントは<strong>ユーティリティーファースト</strong>でありコンポーネントで用意されているcssフレームワークよりも<strong>デザインのカスタマイズを詳細に決められる</strong>点です。つまり独自のデザインに装飾しやすくなります。また、業務で使用する場合などは保守の観点から見ても違いがあるようです。
こちらの記事に他のcssフレームワークとの違いをコードから説明しています。
[TailwindCSSって何？なんで流行ってるの？](https://fixel.co.jp/blog/tailwindcss/)

## 導入
[TailwindCSSを初めてインストールするときのメモ](https://qiita.com/Masahiro111/items/62a4927be42a8c06bc79)
CDN経由で使用しています。上記コードを`<head>`内にペーストすれば完了です。

```
<link href="https://unpkg.com/tailwindcss@^2/dist/tailwind.min.css" rel="stylesheet">
```
## チートシート
tailwindcssで実際に装飾するにあたり以下のチートシートを参考にしました。
ドキュメントから大量のクラスを調べる必要があり学習コストがかかります。もっと簡単に作成したい方は下のコンポーネントサンプルのページから実際にコードをコピペしてみると直感的に理解できると思います。
https://tailwindcomponents.com/cheatsheet/

## コンポーネントサンプル
今回一番css作成時に参考にしたサイトです。
tailwindcssのサンプルがコンポーネントとして公開されています。
~~tailwindcssのポイントでデザインのカスタマイズを詳細に決められるって言ってたのに公開されてるデザイン使うんかよ~~
[A free repository for community components using TailwindCSS](https://tailwindcomponents.com/)
以下、参考にさせていただいたコンポーネントです。実際のコードを参考にして独自のデザインに変えていきましょう。
<ul>
<li>プロフィールカードのデザイン枠
[Profile card](https://tailwindcomponents.com/component/profile-card-13)</li>
<li>ドロップダウン
[Simple dropdown](https://tailwindcomponents.com/component/simple-dropdown)</li>
<li>テーブルデザイン
[Striped Table](https://tailwindcomponents.com/component/striped-table)</li>
</ul>

# その他html、css参考資料
その他、レーダーチャート表示やアイコン表示の際に参考にしたサイトです。<strong>コピペ最強！x3</strong>

[コピペで使える URL を書くだけでアイコンが表示される SNS フォローボタン5種](https://moonnote.hateblo.jp/entry/2015/12/03/200718)
[コピペで！「Chart.js」を使ってレーダーチャートを表示する](https://ayaito.net/webtips/other/16137/)
[スクロールすると出てくる「トップへ戻る」ボタンの作り方](https://cotodama.co/pagetop/)
# 終わりに
本記事はtailwindcssとgithub-pagesでポートフォリオを作成し公開するまでの手順をまとめました。Git周りについては触れていないためgitの経験がない方には分かりにくい場合がありますが参考のサイトを見てもらえば理解できると思います。htmlやcssの理解はほぼないため、有識者の方がいればぜひgitのリクエストを下さい。知識0からでもチャレンジできる内容になっているので興味がある方はぜひ作ってみてください。最後まで読んでいただいてありがとうございました。良ければLGTMもお願いします。
CPUについて　[レジスタ]

#アドレスの指定方法

###レジスタの種類

レジスタには種類があり、それぞれの役割を持ち記憶する

◯プログラムカウンタ
　　→実行するアドレスを記憶する

◯命令レジスタ
　　→取り出した命令を記憶

◯インデックスレジスタ
　　→連続したデータの取り出しに使う

◯ベースレジスタ
　　→プログラムの先頭アドレスを持つ

◯アキュムレータ
　　→演算する値や結果を記憶

◯汎用レジスタ
　　→特に使用する決まりはない

###命令レジスタ

命令レジスタには
**命令部とオペランド部がある**

<font color="red">オペランド部はアドレスを記憶し、引っ張ってきた命令は命令部に記憶される</font>

つまり<font color="red">”何を（オペランド部）どうしろ（命令部）”</font>という文章ができる
もちろん機械語（２進数）で


###アドレス指定方式

◯即値アドレス指定方式
　　　→オペランド部にデータそのものが入っているパターン

◯直接アドレス指定方式
　　→オペランド部に指定されたアドレスに入っているデータをそのまま使えるパターン

◯間接アドレス指定方式
　　→指定されたアドレスの中にデータが入っているアドレスが入っているパターン
　　要は２重で飛ばないといけない

◯インデックスアドレス方式
　　→インデックスレジスタに入っているアドレスのデータをオペランド部のデータに足すパターン

◯ベースアドレス指定方式
　　→プログラムがメモリにロードされたとき、連続データの先頭を記すベースレジスタにオペランド部を足すパターン
  先頭から〜個目という指定ができる

◯相対アドレス指定方式
　　→プログラムカウンタとオペランド部のデータを足すパターン
　　　　　指定数値から〜個目という指定ができる

>参考書籍
>>きたみりゅうじ　『キタミ式　イラストIT塾　基本情報技術者　令和０３年』 技術評論社 2020年
未来の自分へ。今何をしていますか？

## 10年後の自分へ
＊まだ初めて5か月ぐらいのプログラミング初心者のうわごとをお聞きください。技術系ではないかもしれません。キャンペーン参加もかねて一筆

キャンペーンはこちら→　https://qiita.com/official-events/12fc7bacec894d33a981
### 最初に
これは独り言です。十年後の自分は上に回答してから以下を読んでくださいー今の高校生などがどのような感じでプログラミングに対して考えてるかわかると思います。ですが、個人の意見であることを忘れないでください。

ちょっとトレンドに関して追記します。9/27

###### 自己紹介

高校二年生。時間と戦っています。高校入学後、あれこれ考えているうちに高校二年生。受験も待っている中、勉強だけでは無能な人間になってしまうことに気づいた。役に立てるような人間になれるよう、 Chromium (Brave) 系のブラウザ開発をしています。日本では初の模様。

#### 僕にとってのソフトウェア作成
最初に始めたのが HTML と CSS で今は C++ をしています。最初はただの学校の勉強と一緒だと思っていた。でも、全然違うんですね。学校の勉強は周りの人の声を聴く必要はなく、答えを出すだけ。回答があってれば正解。だけど、ソフトウェア開発にはユーザの意見の反映、答えがないなど。随分難易度が高い。僕にとってソフトウェア開発とは人間形成の一つの方法だと思った。なぜなら、自分の考えたことがすべて反映されるから。作ったソフトウェアをどれだけよりよくできるだろうか。全ては自分次第。

#### 今勉強しておきたい技術

| 言語/スキル | 理由 | 学習進度 |
| :---: | :---: | :---: |
| C++ | Chromium のコードを読む、追記するために必須。<br>これがないとお話しにならない。将来必ず役に立つ。C# とどっちがいいのだろうか。 | 基礎のみ理解している状態。これだけでは将来役に立ちませんね。<br>軽めのソフトであれば作れる |
| JavaScript | 汎用性が高い。ウェブ開発やアプリケーション作成 <br> Electron を利用してアプリケーションも作れるなど便利。 | Electron でアプリを作れるレベルには使えるようにはなった。chromiumでは必須。|
|Chromium| 5ヶ月以上ソースコードと睨み合いをしても全然理解できない。ただ、大は小を兼ねるといわれているところから、ほかに応用できるとこは間違いない。|Brave のソースもほぼ同じ構造なので Chromium を学習しない手はない。|
|HTML / CSS|Chromium のページは基本的に特殊な形の HTML と CSS で実装されるため、これがないと意味がない。|学校の先生に学校のサイトより良いといわれるほど技術は上がったのであまり学習つもりはないが、復習は怠りたくない。|
|統率・管理|共同開発では人と人のコミュニケーションは避けられない。| Ablaze というチームの管理者。正直、甘々なので気を引き締めたい。ただ、1 ~ 10 を全部やろうとする癖を直したい。
___________

### 目標と将来流行するであろう言語

ゴールがないとスタートができないので決めます。

BraveSoftware または Microsoft の開発者なりたい。Braveブラウザはオープンソースなのでコミットを誰でもすることができる。スタートはここから。さらには C++ や JS などをマスターし優秀になりたい。いや、、、人並みになりたい。つまらない人生を送りたくない。

トレンドになりそうな言語。
・c♯の台頭でc＋＋は消えるかもしれませんが、古き良き大きなソフトウェアで残ると予想。
・ElectronはWeb開発に支えられて残りそう。HTMLとCSSの他にJavaScriptもセットになるんですかね、、、初心者なのでわかりません。LinuxはメインOSとして使っているのでよくわかりますが、完成度はWindowsよりLinuxの方が高いと思っています。トレンドを読むのは難しいですね。

この記事への回答を待っています。未来の自分。
BCPコマンドのメモ

#概要
BCPコマンドを利用してテーブルのレコードをCSVファイルに出力及びテーブルへ登録するコマンドのメモです。

#BCPとは？
b ulk c opy p rogram ユーティリティ (bcp) は、Microsoft SQL Server のインスタンスと、ユーザー指定の形式のデータ ファイルとの間でデータの一括コピーを行います。 bcp ユーティリティを使うと、多数の新規行を SQL Server テーブルにインポートしたり、データをテーブルからデータ ファイルにエクスポートしたりできます。 このユーティリティでは Transact-SQL の知識は必要ありません。ただし、 queryout オプションと同時に使う場合はその知識が必要になります。 データをテーブルにインポートするには、そのテーブル用に作成されたフォーマット ファイルを使用するか、テーブルの構造およびテーブルの列に有効なデータの型を理解しておく必要があります。

・参照サイト
https://docs.microsoft.com/ja-jp/sql/tools/bcp-utility?view=sql-server-ver15


#bcpによる一括エクスポート
次のコマンドでテーブルのレコードをtsvファイルに保存することが確認できます。

~~~
#-d [DB SCHEMA NAME]の指定がない場合
C:\temp>cmd /c "bcp DEV.dbo.members out .\members.tsv -w -S XXX.XXX.XXX.XXX -U userid -P userpw

Starting copy...

2 rows copied.
Network packet size (bytes): 4096
Clock Time (ms.) Total     : 15     Average : (133.33 rows per sec.)

#-d [DB SCHEMA NAME]を指定した場合
C:\temp>bcp dbo.members OUT C:\temp\members.tsv -c -t\t -r\n -S XXX.XXX.XXX.XXX -U userid -P userpw -d DEV

Starting copy...

2 rows copied.
Network packet size (bytes): 4096
Clock Time (ms.) Total     : 16     Average : (125.00 rows per sec.)
~~~

■テーブルのレコード情報
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162336/e8b0ba14-965e-f499-0de8-4e9c5bc54f45.png)

■TSVファイルに保存された内容
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162336/563a37b3-2374-8813-271b-a5952f115620.png)

■TSVファイルの内容を変更
次の内容にレコード情報を変更します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162336/9187f465-d446-881b-259f-43d0c2896f0c.png)


#bcpによる一括インポート
次のコマンドを利用してTSVファイルの内容をテーブルに登録ができることを確認します。

~~~
C:\temp>bcp dbo.members IN C:\temp\members.tsv -c -t\t -r\n -S XXX.XXX.XXX.XXX -U userid -P userpw -d DEV

Starting copy...

2 rows copied.
Network packet size (bytes): 4096
Clock Time (ms.) Total     : 16     Average : (125.00 rows per sec.)

C:\temp>
~~~

■登録されたテーブルのレコードを確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162336/51db9f35-f20d-18ee-0dd1-304435b94336.png)

#終わりに
今までCSV、TSVファイルをサーバに配置してからインポートする認識でしたが、このBCPコマンドを利用するとサーバへファイルを配置しなくてもローカルからサーバへ直接インポートできた認識です。
大量のレコードをBCPコマンドからインポートする場合、
列が何個でレコード数何件、TSVファイルはXXXMB,XGBに対してどのくらいかかるか比較もしてみたいですね。
とりあえず今回はBCPコマンドでテーブルのレコードをエクスポートとインポートを確認ができました。

#参照サイト
・bcp を使用した一括データのインポートおよびエクスポート (SQL Server)
https://docs.microsoft.com/ja-jp/sql/relational-databases/import-export/import-and-export-bulk-data-by-using-the-bcp-utility-sql-server?redirectedfrom=MSDN&view=sql-server-ver15

・フォーマット ファイルの作成 (SQL Server)
https://docs.microsoft.com/ja-jp/sql/relational-databases/import-export/create-a-format-file-sql-server?view=sql-server-ver15
Frameworkとは

iOSDC2021の[Daiki Matsudate](https://twitter.com/d_date)さんの発表を聞いて今までなんとなく理解していたFrameworkのことがXCFrameworkとSPMとの関連を含めかなり理解が進んだのでその復習がてら知識の整理をしようと思います。この発表ではMulti ModulesやMulti Projectsについても非常に素晴らしい内容が含まれていますがここではFrameworkのみにフォーカスしてまとめようと思います。

## Frameworkとは
* Build TargetとLinkする実行可能なバイナリ
* FrameworkはBuild Targetに設定することができる
* Linkの仕方には２種類ある

### Static Link
* **ビルド時**にObject Code(.oファイル)をひとつのFrameworkにまとめアプリとLinkしひとつのバイナリにまとめる
* よって起動時間は**短く**なる
* このLink方法のFrameworkを**Static Framework**という

### Dynamic Link
* ビルド時にObject Code(.oファイル)をひとつのFrameworkにまとめアプリとは別にバイナリを生成し、**アプリ実行時**にLinkしメモリに保持する
* よって起動時間は**長く**なる
* このLink方法のFrameworkを**Dynamic Framework**という

### Linkの仕方
Linkは一度にすべてのObject Codeに対して行うのではなくModule単位で.oファイルを生成しさらにまとめていってFrameworkやアプリのバイナリにまとめている

### Moduleとは
importできる単位のこと
すなわちソースコードにimportをかけるものはModuleとして生成されている

```Swift
import Resource
import Styles
import SwiftUI
```

生成物はDerived Dataに.swiftmodleというBundleとして置かれている

### Bundleとは
ディレクトリ構造を持つがファイルのように振る舞うもの
ソースコードがコンパイルまでされると利用可能になる
ex) Xcodeのプロジェクト - ファイルとして扱えるのでダブルクリックで実行できる

### LibraryとFramework
一番の大きな違いはBundleを保持しているかいないか
LibraryはBundleを保持していない
詳しくは [ライブラリのインポートとリンクの仕組み完全解説 - フレームワークとライブラリの違い](https://youtu.be/FZoYyAEPJ8w?t=1037)

## XCFrameworkとは
* 配布可能なBundle形式のFramework
* 以下のような複数のBuild環境で動くFramework（ビルド済みバイナリ）を含むことができる
    * Platform(iOS/macOS/tvOS/watchOS)
    * Simulator/Device
    * Static/Dynamic
    * Build Architecture(x86_64,arm64,...)

## Swift Package Manager(SPM)とは
一言でいうとCarthageやCocoaPodsと同様パッケージ管理ツール

### メリット
* Swiftに同梱されている（特にCIの面で効力発揮）
    * rubyのセットアップやCarhageそのものを落とす必要がない
* Xcodeに統合されている
    * 開発しながらパッケージの更新を同じIDE上で行える（=コマンドラインツール不要）
* macOS/Linux両対応
* 自動で依存関係の解決、更新

### デメリット
* Xcode11以降のみが対応（これ以前を使ってることはあまり考えられないが）

### SPMにおけるXCFrameworkの立ち位置
* SPMでバイナリ提供のSDKを使いたい場合（広告SDKやAnalyticsなど**ソースコードを開示したくない場合**）XCFrameworkでないといけない
* targetに.binaryTargetを使う
* 指定urlはローカルでもリモートでもいいがリモートの場合はchecksumが必要

### 補足1: その他特徴
3rd party ライブラリを管理するだけではない

* ModuleやFrameworkを自在に構成することができる（=Multi Modules）
    * Multi Moduleにすることでビルド時間を短縮できる
    * ビルドはModule毎に行われるため、Moduleに変更がなければキャッシュを使うようになっている
    * そのためインクリメンタルビルドが高速で行われる
* プロジェクトファイルのダイエットができる(=Multi Projects)

### 補足2: SPMに対応していない場合
* Package.swiftがない
    * ソースコードが公開されていればビルド可能なためPRでPackage.swiftを追加してもらうかForkして追加
* ソースコード非公開かつXCFrameworkもない（Frameworkしかない）
    * CocoaPodsで代用するのが手っ取り早い