OmniAICreator/Qiita-1.07M huggingface dataset:
VSCode起動時に複数Terminalウインドウを自動配置する方法

## 結論

[Terminals Manager Plugin](https://marketplace.visualstudio.com/items?itemName=fabiospampinato.vscode-terminals)をインストールすると、VSCode起動時に自動で複数Terminalウインドウを開くことができて便利ですよ。


![demo.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510218/46992708-9897-4fe6-9e01-9c6845ff1f5a.gif)


## 背景

Mono Repoで開発しているのですが、複数のプロジェクトを同時に実行/編集することが多々あり、
毎回Terminal開いたり、実行するのが面倒くさいなぁと思ってました。
調べてみると便利なPluginがあったので紹介します。


## 導入手順

### 1. [Terminals Manager Plugin](https://marketplace.visualstudio.com/items?itemName=fabiospampinato.vscode-terminals)をインストール

### 2. 設定ファイルを作成

下記の通り、`Terminals: Edit Configuration`を選択し、設定ファイルを開きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510218/2d709ebe-51fe-0ad3-e4a0-7259307f0631.png)


以下のようなディレクトリ構成であることを想定し、

```shell
10:56:28  mono-repo on  master [?]
➜ tree -I node_modules
.
├── projectA
│   ├── LICENSE
│   ├── README.md
│   ├── jest.config.js
│   ├── jest.debug.config.js
│   ├── package-lock.json
│   ├── package.json
│   ├── src
│   │   └── index.ts
│   └── tsconfig.json
├── projectB
│   ├── LICENSE
│   ├── README.md
│   ├── jest.config.js
│   ├── jest.debug.config.js
│   ├── package-lock.json
│   ├── package.json
│   ├── src
│   │   └── index.ts
│   └── tsconfig.json
└── projectC
    ├── LICENSE
    ├── README.md
    ├── jest.config.js
    ├── jest.debug.config.js
    ├── package-lock.json
    ├── package.json
    ├── src
    │   └── index.ts
    └── tsconfig.json
```

設定ファイルを作成してみました。

```json
{
    "autorun": true,
    "terminals": [
        {
            "name": "Work Space",
            "focus": true,
            "command": "echo \"Let's start working\""
        },
        {
            "name": "Project A",
            "commands": ["cd projectA", "npm install", "npm start"]
        },
        {
            "name": "Project B",
            "commands": ["cd projectB", "npm install", "npm start"]
        },
        {
            "name": "Project C",
            "commands": ["cd projectC", "npm install", "npm start"]
        }
    ]
}
```

### 3. 手動で複数ターミナルを起動

下記の通り、`Terminals: Run`を選択し、複数ターミナルが開けることを確認します。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510218/20a45440-2fd7-be50-aa77-412466fdc43c.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510218/7de4d725-7a1f-9b5e-ab40-beeac85d4d3b.png)


### 4.自動で複数ターミナルを起動
VSCodeを完全に閉じ、起動時に自動でターミナルが起動してくることを確認します。

```
11:00:35  mono-repo on  master [?]
➜ code .
```
【SharePoint Online】共有リンクを作成すると親の権限継承がきれて固有の権限になる

リストやライブラリで共有リンクを作成すると親の権限継承がきれて固有の権限になります。

# 権限の初期設定

リストを作成した際のデフォルト設定は、親であるサイトの権限を継承しています。

![image-20210707100129363-1625623442789.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111975/ee38a6c3-65b5-d1d3-9cc8-b7db3c3380c1.png)

# 共有リンクを作成する

1. 登録したアイテムの共有を選択します。  
   ![image-20210707102530462.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111975/af73cd7e-b560-333c-afaa-73fd5a1dd059.png)
1. リンクを知っているユーザーが編集 or 表示できる共有リンクを作成します。  
   ![image-20210707101831183.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111975/23c5a4e0-2f9f-ff67-5594-248bc72197c3.png)
1. 親からの権限継承が切れて固有の権限になります。  
   ![image-20210707102142887.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111975/5558f05e-dd94-21af-8050-62693a1a0f6e.png)


所有者、メンバー、閲覧者 の SharePoint グループの権限を確認すると、共有リンクを作成したアイテムの固有権限が割り当てられているのがわかります。

![image-20210707105353971.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111975/9b38ebc0-28a5-24b9-db38-ceb3bf5dc66d.png)

固有の権限を削除して、親の権限を継承するように変更すると、共有リンクは使用できなくなります。

![image-20210706170005369.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111975/5dee027b-a465-4172-42ab-0b16ea6d3733.png)

# アクセス権を持っているユーザー向けのリンク

「既存のアクセス権を持つユーザーが使用できます」を選択した場合は、個別の権限にはなりません。

![image-20210707101152092.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111975/65b322f4-66a2-52ed-1ee3-d6096b78865c.png)
【チート対策】Epic Online ServiceのEasy Anti-Cheatをお試しで実装してみる

# Summary
Epic Online Service(EOS)で配布されているAnti-Cheatを使ってEasy Anti-Cheat(EAC)経由でゲームを起動する方法をまとめました。

# 環境
・Unity 2020.3.4f1(UnityじゃなくてもOK)
・Windows 10 21H1

# 1.ゲームの作成
・今回はゲームプログラム側でEOSSDKを使わず、ただ、EAC経由でゲームを起動させるだけなのでエンジンは何でも大丈夫です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/701723/97b0728c-fd59-eb8f-0efb-3674c41a54b8.png)
作れたら実行可能ファイルとしてEXEを出力しておきます。

# 2. デベロッパーポータルから必要なものをダウンロード
[ここ](https://dev.epicgames.com/ja/home)から、事前にデベロッパー登録を済ませておきます
できたら適当なProductを作って、
「プレイヤーモデレーション」→「アンチチート」の中のダウンロードをクリックします
「product_<プロダクトID>.zip」がダウンロードされるので解凍します。

デベロッパーポータルトップページに戻ってSDKをクリックし、SDKをダウンロードします。
このとき、SDKのバージョンを指定しますが、中のツールだけ使うので何でも良いです。
SDKを解凍し、
`SDK/Tools/EOS_AntiCheatTools-win32-x64-x.x.x.zip`を更に解凍します。
その中にある`devtools`フォルダを開き、アンチチートのところでダウンロードしたzipの中の
`base_private.key`と、`base_public.cer`を`devtools`のルートディレクトリに配置します。

*__プライベートキーは必ず安全な場所に保管してください__*

一番下の製品の設定から`製品ID`と`サンドボックスID`をメモしておいてください
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/701723/29e5482c-eb29-da1f-167b-c46162bc3f6f.png)


# 3.ファイル適合性ツールの設定
`anticheat_integritytool.cfg`をお好きなエディタで開きます。
変更する箇所は、
`working_directory`をゲームプログラムがあるフォルダにしてください。
　・例えば`D:\MyGame\bin`なら`working_directory = "D:\\MyGame\\bin"`のように`\`にもう一つ`\`を付け加えてください

最低限の設定はこれだけですが、他にもたくさん設定できることろがあります(コンフィグのコメント参照)

`devtools`フォルダをコマンドプロンプトやPowershellで開いて、
`anticheat_integritytool.exe -productid <製品ID>`
と入力します。
これでファイル適合性ツールの設定は完了です。

# 4.Anti-Cheat Bootstrapper の設定
さっきの`devtools`からフォルダを1つ上がって、distフォルダの中身をゲームプログラムのルートディレクトリにすべてコピーします。
`EasyAntiCheat/Settings.json`を開きます。
変更する箇所は、
「productid」→製品ID
「sandboxid」→サンドボックスID
「title」→EACのタイトル(お好みで)
「executable」→ゲームプログラムの実行可能ファイル
これらが変更できたら、セーブします

`settings.json`と同じ場所にある`SplashScreen.png`はEACが起動するときに表示されるスプラッシュスクリーンの画像ファイルです。
変えてみても面白いかも・・・？

`EasyAntiCheat/EasyAntiCheat_EOS_Setup.exe`のプロパティを開き、
「互換性」→「管理者としてこのプログラムを実行する」にチェックを入れます。

`EasyAntiCheat`ディレクトリをコマンドプロンプトorPowershellで開き、
「EasyAntiCheat_EOS_Setup.exe install <製品ID>」を実行します。
そうするとEACのサービスがWindowsに登録されます。

# 5.起動
`start_protected_game.exe`をダブルクリックで起動してみましょう。
FortniteやApex LegendsでよくみるEACの起動画面が出て、ロードが終わった後に、ゲームが起動するはずです。

お疲れ様でした

# 6.SDKについて
今回は導入がめんどくさくてやらなかったですが、EOSSDKを使うことによって保護状態などがゲーム側で取得できるようになるっぽいので、
本格的に導入する場合はSDKの導入もほぼ必須になります
(この記事の方法だとゲームプログラムを直接起動すればEACを回避することができてしまうため)

# 7.参考
[Anti-Cheat インターフェースを使用する|Epic Online Service ドキュメンテーション](https://dev.epicgames.com/docs/services/ja/PlayerModeration/AntiCheat/UsingAntiCheat/index.html)
[Rails] uniquness バリデーションの警告

# 開発環境

macOS: Big Sur
Rubyバージョン: 2.7.2
Railsバージョン: 6.0.3.7

# 目的

Rubocop が uniqueness バリデーションに対して出す次の警告を無くす。

## 警告

```
Rails/UniqueValidationWithoutIndex: Uniqueness validation should be with a unique index.
```

## バリデーション定義

```ruby:user.rb
class User < ApplicationRecord
  validates :name, uniqueness: true
end
```

# 解決策

name カラムに対して `` unique index `` をつける。

```
 t.index ["name"], unique: true
```

なぜ `` unique index `` が必要なのか。１つ目も理由は、確実にレコードをユニークにするためです。 Active Recordのバリデーションだけではレコードはユニークになりません。2つ目はパフォーマンス上の問題です。 indexがない状態でActive Recordのuniquenessバリデーションを使用するとパフォーマンスが悪化する恐れがあります。

# 最後に

以上で Rubocop の警告は無くなりました。
下手な説明ですが、読んでいただきありがとうございました。
Rails.logger の出力先を確認する

# logger がどこのファイルに出力しているかを確認

```ruby
Rails.logger.instance_variable_get(:@logdev).instance_variable_get(:@dev)
```

Loggerが持っているインスタンス変数を参照すればとりあえずはわかる。

```irb
[1] pry(main)> Rails.logger
=> #<ActiveSupport::Logger:0x0000559ee3bd8238
 @default_formatter=#<Logger::Formatter:0x0000559ee3bd8170 @datetime_format=nil>,
 @formatter=#<ActiveSupport::Logger::SimpleFormatter:0x0000559ee06c9178 @datetime_format=nil>,
 @level=0,
 @local_levels=#<Concurrent::Map:0x0000559ee3bd8030 entries=0 default_proc=nil>,
 @logdev=
  #<Logger::LogDevice:0x0000559ee3bd8120
   @dev=#<File:/home/vagrant/ultra-man/spacium/log/development.log>,
   @filename=nil,
   @mon_count=0,
   @mon_mutex=#<Thread::Mutex:0x0000559ee3bd80d0>,
   @mon_mutex_owner_object_id=47070457020560,
   @mon_owner=nil,
   @shift_age=nil,
   @shift_period_suffix=nil,
   @shift_size=nil>,
 @progname=nil>
```

rails console だとよく分かる。
【初学者向け】【Rails】RoutingError時の処理を書く

#はじめに
読者対象はプログラミング初学者とします。
googleで「エラーハンドリング routes」と検索しても、良いページが見つからなかったので書きました。
#注意
エラーハンドリングはコピペで済まさず、熟考した上で実装してください。
エラー処理の考え方について、[この伊藤淳一さんの記事](https://qiita.com/jnchito/items/3ef95ea144ed15df3637)を一読することをオススメします。
#本題
とはいえ、ユーザーがURLをタイポした際、「URLがまちがってまっせ」という表示をすることはユーザーフレンドリーな仕様だし、実装したい。
ということで、RailsでRoutingError時の処理を以下に書いていきます。
##HTTP　404
config/routesに記載されたルーティングのいずれも当てはまらないHTTPリクエストがRailsアプリケーションに届いた際、
例外ActionController::RoutingErrorが発生します。
HTTPステータスコード　**404**となります。
##rescue_fromは使わない
例外ActionController::RoutingErrorを捕捉したいですね。
安易にコピペしてよく使うrescue_fromメソッドがあります。
rescue_fromはアクションで発生した例外の補足するためのものなので、**ルーティングの処理の段階で発生する例外を捕捉できません。**

##config.exceptions_appで例外を捕捉する
config.exceptions_appで例外を捕捉します。
まだ勉強不足でなんとなくの理解で、詳しいことは分かりません。
以下引用です。
>Rack Middleware のActionDispatch::ShowExceptionsは、config.exceptions_appに指定したオブジェクトに対して#callを呼び出して例外を捕捉する仕組みです

##config/initializer/で新たにファイルを作ろう
ともあれ、config.exceptions_appをいじればいいと分かりました。
実践です。
config/initializerディレクトリに新たなファイルを作ります。
exceptions_app.rbとします。

```ruby
Rails.application.configure do
  config.exceptions_app = ->(env) do
    request = ActionDispatch::Request.new(env)

    action =
      case request.path_info
      when '/404' then :not_found
      else; :internal_server_error
      end

    ErrorsController.action(action).call(env)
  end
end

```
受け取ったリクエストのpathが/404なら、
errorsコントローラーのnot_foundアクションを実行してね。
という処理です。
errorsコントローラー作成します

```
rails g controller errors
```
errorsコントローラーにはこのような処理を書きます

```ruby
class ErrorsController < ApplicationController
 
  def not_found
    render status: 404
  end

  def internal_server_error
    render status: 500
  end
end
```
上記の処理で以下のファイルの内容が表示されます
view/errors/not_found.html.erb

```erb
<div id="error">
  <h1>404 Not Found</h1>
  <p>指定されたページは見つかりません。</p>
  <p class="url"><%= request.env["REQUEST_URI"] %></p>
</div>
```
#rescue_from Exceptionとの違い
追記です。
**NoMemoryError**など深刻なエラーが発生した際、どうなるか不安だったので確認しました。
開発環境はそのまま**NoMemoryError**と出力されたので一安心です。
ちなみに超危険な書き方、**rescue_from Exception**も確認しみてた。
NoMemoryErrorなど発生させても、**常に500 Internal Server Error　と表示されるんですね。**
勉強になりました。
#参考文献
[Rails6実践ガイド](https://book.impress.co.jp/books/1118101134)
[Railsアプリの例外ハンドリングとエラーページの表示についてまとめてみた](https://qiita.com/upinetree/items/273ae574f1c021d24c37)
[Railsアプリケーションにおけるエラー処理（例外設計）の考え方](https://qiita.com/jnchito/items/3ef95ea144ed15df3637)
LPICレベル1を勉強しているあなたへ - 論理ボリュームを作成するまでの手順 -

pvcreate, vgcreate, lvcreate

・物理ボリューム(PV)の作成
pvcreateコマンドを使用して作成します。

・ボリュームグループ(VG)の作成
vgcreateコマンドを使用して作成します。

・論理ボリューム(LV)の作成
lvcreateコマンドを使用して作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1600293/fdf26797-d744-1686-bb1c-9b5663909ebd.png)

引用元：https://mondai.ping-t.com/question_subjects/31/question_sessions/4236831/progressing_questions/65045113?result=true
hack the boxにwindowsあるんだ。

#概要

hack the boxにwindowsあるんだ。

#Active

https://qiita.com/v_avenger/items/48db7d54791c4d10663b

#Netmon

https://qiita.com/yukitsukai47/items/398d9026a8e4eac26c21

#Worker

https://qiita.com/v_avenger/items/dbf6d810283d70351a08

#Forest

https://qiita.com/zunil2_test/items/817c36f899b4fc3bf7bb

https://qiita.com/v_avenger/items/43014e5e34fe491764c8

https://qiita.com/mr-wacker/items/e165102bd5f1a4a6d22e

https://qiita.com/MarshMallow_sh/items/000650e63faeb2b8f266

#Starting Point

https://qiita.com/YuasaJunki/items/400e50eadb00d1b970b0

#Remote

https://qiita.com/v_avenger/items/d59b84eea17faa0eea2b

#Buff

https://qiita.com/v_avenger/items/30253cba937a22a1b9b4

#Legacy

https://qiita.com/v_avenger/items/fc61a3ad6b5f9d3a6ca8

https://qiita.com/yukitsukai47/items/a7a8a8e0a3875cd8a4d7

#Omni

https://qiita.com/v_avenger/items/6e82c1b8975aac909c33

#Granny

https://qiita.com/yukitsukai47/items/28580ce1d20261a90d34

#Bounty

https://qiita.com/yukitsukai47/items/ec7c2301e3873537a68c

#Blue

https://qiita.com/kash1064/items/7639dbff17bc4a0d9f4f

以上。
Compose Navigationで使えるNavBackStackEntryのlifecycleとは？

例えばComposeで動画再生したいけどonStopで止めたいときとかありますよね？
先日、ComposeのNavigationで画面単位で取得できるNavBackStackEntryにlifecycleがあることを知りました。これはAndroid JetpackのいわゆるArchitecture ComponentのLifecycleです。
https://github.com/DroidKaigi/conference-app-2021/blob/4868675fd7d8dee8711ee5a4d1c564c1b86eab97/uicomponent-compose/main/src/main/java/io/github/droidkaigi/feeder/AppContent.kt#L94

このlifecycleはどのようになっているのでしょうか？
以下のようにNavBackStackEntryで保持されていて、

```kotlin
private var lifecycle = LifecycleRegistry(this)
public override fun getLifecycle(): Lifecycle {
        return lifecycle
    }
```

以下のメソッドでそのlifecycleの状態が変更されます。

```kotlin
    public fun updateState() {
        if (hostLifecycleState.ordinal < maxLifecycle.ordinal) {
            lifecycle.currentState = hostLifecycleState
        } else {
            lifecycle.currentState = maxLifecycle
        }
    }
```

ordinalはDESTROYEDが最小値でRESUMEDが最大になるようで、最小になる方が使われています。

```kotlin
    public enum State {
        DESTROYED,
        INITIALIZED,
        CREATED,
        STARTED,
        RESUMED;
```

hostLifecycleStateは外側のActivityやFragmentのライフサイクルの状態で、
maxLifecycleはnavigation側で管理するdestinationごと(ページごと)のライフサイクルの状態のようです。
つまり両方の値のminを取るような実装になっているようです。

これはつまり外側のActivityやFragmentなどのライフサイクルの状態を見て、外側のActivityやFragmentがonStop状態になっていればこのNavBackStackEntryのlifecycleはCREATED状態になってくれていそうにみえます。

これによって、ちゃんとComposeのページごとのライフサイクルだけでなく、外側のライフサイクルも見ることができるため、ComposeでonStopになったときに動画を止めるなどの動画再生状態の管理やログ送信なども行っていけるのではと思いました。
Typescriptにおけるわかりにくいtypeofの挙動

型定義と実行時で`typeof` の挙動が違うので注意が必要。

```typescript
$ ts-node
> 
'use strict'
> const hoge = 'hoge'
undefined
> hoge
'hoge'
> typeof hoge // 当然 'string'
'string'


> type Hoge = hoge  // type Hoge = 'hoge'を期待していたがthrowされる
[eval].ts:4:13 - error TS2749: 'hoge' refers to a value, but is being used as a type here. Did you mean 'typeof hoge'?

4 type Hoge = hoge
              ~~~~
undefined
> type Hoge = typeof hoge // この場合は type Hoge = 'hoge' と同じ
undefined
> .type _ as Hoge // 型確認
type Hoge = "hoge"
```
LPICレベル1を勉強しているあなたへ - スワップ領域の推奨値 -

スワップ領域とは、
物理メモリ（実メモリ、RAM）に収まらなかった情報を
一時的に格納する為の、
通常ハードディスク上に作成する領域です。

Red Hat Enterprise Linux 8での
スワップ領域の推奨値は以下です。

RAMが2GB未満の場合：RAMの2倍
RAMが2GB～8GBの場合：RAMと同量
RAMが8GB～64GBの場合：4GBからRAMの0.5倍
RAMが64GB以上：負荷に依存するが、少なくとも4GB

引用元：https://mondai.ping-t.com/question_subjects/31/question_sessions/4236831/progressing_questions/65045111?result=true
Vagrant 2.2.16はboxファイルの追加コマンドが従来と異なる

新人向けに環境構築をしていた時に確認できた現象
`2.2.14`や`2.2.15`では従来通りの挙動なので、そちらを使うように気を付ける

# 現象

触ったことがある人なら何となく知っているこのコマンド
vagrantに自作したboxファイルを取り込ませるが...

```
$ vagrant box add kankyo package.box
==> box: Box file was not detected as metadata. Adding it directly...
==> box: Adding box 'kankyo' (v0) for provider:
box: Unpacking necessary files from: file://C/User/arukuishi/vagrant_work/test/package.box

box:
An error occurred while downloading the remote file. The error
message, if any, is reproduced below. Please fix this error and try
again.

URL using bad/illegal format or missing URL
```

`vagrant 2.2.16`にすると上のコマンドが動かなくなる

# 対処方法

`package.box`の位置を絶対パスで指定しないといけなくなったのが原因

```
$ vagrant box add kankyo C:/User/arukuishi/vagrant_work/test/package.box
```

面倒くさいことになった

---

今回は発生していないが、`vagrant-vbguest`関連でもエラーが発生したり
VirtualBoxが`6.1.22`だと動かないことがあったり、といろいろ起きているらしい

当分の間は`2.2.14`か`2.2.15`を使う方がよさそう

# 参考サイト

[今回の件について記載されてあるGithub issue](https://github.com/hashicorp/vagrant/issues/12340)
[vagrant-「2-2-16」にアップデートしたらエラーとなる](http://blog.tylyq.com/2021/06/07/vagrant-「2-2-16」にアップデートしたらエラーとなる/)
unofficialSF.org　のまとめ

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

# エラー

+ [ Apex Action error: apex://DatatableController: No apex action available for ers_DatatableController.getReturnResults  ](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000Jdr3HSAR)
Nuxt.js【Vue.js】で別タブ（別ページ）で開く方法

Nuxt.js【Vue.js】で別タブ（別ページ）で開く方法になります。

## target="_blank"を付与する

```vue
<template>
  <div>
    <!-- Nuxt -->
    <nuxt-link to="/demo" target="_blank">ボタン</nuxt-link>　

    <!-- Vue -->
    <router-link to="/demo" target="_blank">ボタン</router-link>
  </div>
</template>
```

`target="_blank"`を付与することで、別タブで開くことができます。

## methodsなどで別タブ（別ページ）で開く方法

```vue
<template>
  <div>
    <button @click="open">ボタン</button>
  </div>
</template>

<script lang="ts">
import Vue from 'vue'

export default Vue.extend({
  methods: {
    open() {
      const url = '/demo'
      window.open(url, '_blank')
    }
  }
})
</script>
```
`window.open`を使用することで、`methods`などからも別タブで開くことができます。
（続）アプリ開発経験がない自分が色々すっ飛ばしてiPhoneアプリをとりあえず作ってみました

#概要
Firebaseのサーバアプリ（iPhoneアプリ）をとりあえず作ってみました。

#背景
地元の財団法人に在宅で勤めることになり、Web開発経験が一切ない自分（４４歳）が、時空を超えてサーバレスアプリに挑戦しました。これから何かを始めるオッサン達を勇気づける話です。
コーディング規約等は一切無視しているため、ソースコードの見本としては参考にしないでください。

#詳細
細かい話は抜きにして、ソースコードを貼り付けます（一旦、UIViewControllerクラスのみ）。

### [説明]
swiftでデータベース（Firebase）から読み出したデータをグラフ表示させました

### [個人的に感動したこと]
* ネットワークの知識が一切必要ない（サーバに接続している感じがない）
* swiftの知識も必要がない（コピペでできる）
* サーバレスアプリの知識も必要ない（難しい知識はいらない）
* 何も必要ない（手ぶらでできる。ただし、PCは必要）

~~~swift
import UIKit
import Firebase
import Charts

class ViewController: UIViewController {

    @IBOutlet var data:UITextView!
    @IBOutlet weak var linechart: LineChartView!
    
    var db:Firestore!
    var WeightReports:CollectionReference!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        self.db = Firestore.firestore()
        db.collection("WeightReports").getDocuments() { (querySnapshot, err) in
            if let err = err {
                print("Error getting documents: \(err)")
            } else {
                
                //display the text(test code)
                var res:String = ""
                var weight:[String] = []
                for document in querySnapshot!.documents {
                    let times = document.get("utime") as! [Timestamp]
                    weight = document.get("weight") as! [String]
                    for i in (0 ..< 10) {
                        let formatter1 = DateFormatter()
                        formatter1.dateStyle = .long
                        res += formatter1.string(from: times[i].dateValue()) + ":" + weight[i] + "\n"
                    }
                }
                self.data.text = res
                
                //display the chart of weight
                var entry = [ChartDataEntry]()
                let weight2:[Int]? = weight.map{Int($0)!}
                var skip = 0
                for (i,d) in weight2!.enumerated(){
                    if(skip%80 == 0)
                    {
                        entry.append(ChartDataEntry(x: Double(i),y: Double(d)))
                    }
                    skip = skip + 1
                }
                let dataset = LineChartDataSet(entries: entry,label: "Weight")
                dataset.mode = .cubicBezier
                dataset.lineWidth = 1.0
                self.linechart.legend.enabled = false
                self.linechart.leftAxis.axisMaximum = 100
                self.linechart.leftAxis.axisMinimum = 0
                self.linechart.data = LineChartData(dataSet: dataset)
                self.linechart.chartDescription?.text = "Weight Chart"

            }
        }
    }
    
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
    }
    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
    }

}

~~~

#結果
![iphone3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423321/8d724d69-a9db-3edb-62a6-5ea5120f07e7.jpeg)
セキュリティブログ検索、作った。

#概要

セキュリティブログ検索、作った。


#参考にしたページ

https://qiita.com/HirMtsd/items/7e5f7e93c694b6980860

#成果物

https://embed.plnkr.co/plunk/tFnJRIUc3xecDgWe

以上。
【Google Cloud Day'21】「データ サイエンティストとナレッジが支える DX 社会の実現」を視聴して

データ サイエンティストとナレッジが支える DX 社会の実現
https://cloudonair.withgoogle.com/events/google-cloud-day-digital-21/watch?talk=d3-pl-24
"日立では、安心安全な人々の暮らしや、サスティナブルな社会の実現に向けて、あらゆる分野での DX 推進に取り組んでいます。
ここで鍵となるのが、AI やクラウドなどの最先端技術を使う人の力です。スピーディに、適切に課題解決していくには、優秀なデータ サイエンティストが欠かせず、その育成が急務となっています。日立におけるデータ サイエンティストの育成と多くの実績に基づくナレッジ蓄積の取り組み、クラウド活用例をご紹介します。"

人材育成の内容のみで、事例についてはほとんどありませんでした。

<table>
	<tr>
		<th>切り口</th>
		<th>内容</th>
	</tr>
	<tr>
		<th>会社概要</th>
		<td></td>
	</tr>
	<tr>
		<th>紹介する事例</th>
		<td></td>
	</tr>
	<tr>
		<th>事例概要</th>
		<td></td>
	</tr>
	<tr>
		<th>データサイエンティストの育成</th>
		<td></td>
	</tr>
	<tr>
		<th>データサイエンティストの位置づけ</th>
		<td></td>
	</tr>
	<tr>
		<th>データサイエンティストが活躍できるプラットフォームも整える</th>
		<td></td>
	</tr>
</table>

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/d5cb72e8-d9a0-8659-7c9b-cc1aca0d9edf.png)
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/46d36c3d-41f4-d932-7dcc-8af28fe0efa1.png)
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/9ddebdf5-948e-2531-7d1f-1d0af725ff85.png)
![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/11a0833d-b879-7e24-a05d-cd53499aaa7d.png)
![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/0922e2ee-0a26-e71e-2cc3-d8a752751b50.png)
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/2f810026-6634-6372-5bd5-6fdc8d054a43.png)
![7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/75665448-6668-7fb5-6d1d-68c235d33a5d.png)
![8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/72ba00bc-5128-4743-6bb1-dacc656e4182.png)
![9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/09d94082-51ee-f39b-7ed0-790dffb762be.png)
![10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/abeeb6fc-3401-a096-bbe2-2c330376c389.png)
Nuxt.js(Vue.js)でhistory backする方法

Nuxt.js(Vue.js)でhistory backする方法になります。

## $router.goを使用する
Nuxt.js(Vue.js)でhistory backする際は、`$router.go`を使用できます。

```vue
<template>
  <div>
    <button @click="$router.go(-1)">ボタン</button>
  </div>
</template>
```
`$router.go(-1)`とすることで、一つ前に戻ることができます。

### $router.goの例

```js
// 1つレコードを進める。history.forward() と同じ
$router.go(1)

// 1つレコードを戻す。history.back() と同じ
$router.go(-1)

// 3つレコードを戻す
$router.go(-3)
```
https://router.vuejs.org/ja/guide/essentials/navigation.html

## methodsなどでhistory backする方法

```vue
<template>
  <div>
    <button @click="returnPage">ボタン</button>
  </div>
</template>

<script lang="ts">
import Vue from 'vue'

export default Vue.extend({
  methods: {
    returnPage() {
      this.$router.go(-1)
    }
  }
})
</script>

```

`methods`などでhistory backする場合は、`this`をつけることで使用できます。
beego ORMで構造体にマッピングされずハマったこと

# はじめに
goのwebframeworkである<a href="https://beego.me/" about="_blank">beego</a>にはORMの機能がついています。
これを使ってDBのテーブルから取得した値を構造体にマッピングしようとしたときに
マッピングされず小一時間ハマったことを共有します。
DBはSQLiteです。

# 前提条件
以下のようなテーブル（AUTH_MASTER）を構造体（AuthMaster）にマッピングするとします。

DBテーブルの定義。
AUTH_MASTER

|列名|型|
|:--|:--
|AUTH_ID|integer
|USER_ID|integer
|LOGIN_CODE|text
|CREATED_DATE|text
|CREATED_USER_ID|integer
|UPDATED_DATE|text
|UPDATED_USER_ID|integer
|ROW_VERSION|integer

構造体の定義。
AuthMasterはCommonModelを埋め込んでいます。

```go:authMaster.go
package models

import (
	_ "github.com/astaxie/beego/orm"
)

//AuthMaster comment
type AuthMaster struct {
	CommonModel
	AuthId int32 `orm:";pk"`
	UserId int32
	LoginCode string
	PasswordToken string
	EffectiveStartDate string
	ExpirationDate string
}
```

```go:common.go
package models

import (
	"github.com/astaxie/beego/orm"
	_ "time"
)

//CommonModel comment
type CommonModel struct {
	CreatedDate   string
	CreatedUserId int32
	UpdatedDate   string
	UpdatedUserId int32
	RowVersion int32
}
```


beegoのormはデフォルトでスネークケースのDB列をアッパーキャメルケースの
構造体メンバにマッピングしてくれる仕様なので
https://beego.me/docs/mvc/model/models.md
AUTH_ID→AuthId
にマッピングしてくれるはず。
実行してみましょう。

# マッピングされず
![q1.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1734544/72244070-47c4-b16e-8597-c2a9d029f9d3.jpeg)


左の変数を見てもらうとわかりますが、構造体には何も入っていません。
（goはintegerの場合初期値0となります）
明らかにマッピングされていませんが、エラーも出ていない状態です。
なぜでしょうか・・・小一時間悩みました。

# 原因

**DB列は小文字じゃないとマッピングされない！**

beegoの仕様に落とし穴がありました。
仕様を見直すと

>beegoのORMはデフォルトでスネークケースのDB列をアッパーキャメルケースの
>構造体メンバにマッピングしてくれる

このスネークケースというのがポイントでした。
アッパースネークケースをマッピングするとは言ってない・・・！

AUTH_ID→アッパースネークケースだったのでマッピングされない、というのが真相です。
というわけでDBテーブルの定義を以下に修正してみましょう。

auth_master

|列名|型|
|:--|:--
|auth_id|integer
|user_id|integer
|login_code|text
|created_date|text
|created_user_id|integer
|updated_date|text
|updated_user_id|integer
|row_version|integer

すると

![q2.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1734544/735087bc-dd05-b14a-d68d-885993f06cc4.jpeg)

**無事マッピングされました！**


# 別の回避方法

DBの列定義を変えたくないという場合は構造体の中でマッピングする列名を
明示的に書いてあげることでも回避可能です。

```go:authMaster.go
package models

import (
	_ "github.com/astaxie/beego/orm"
)

//AuthMaster comment
type AuthMaster struct {
	CommonModel
	AuthId int32 `orm:";pk;column(AUTH_ID)"`
	UserId int32 `orm:"column(USER_ID)"`
	LoginCode string `orm:"column(LOGIN_CODE)"`
	PasswordToken string  `orm:"column(PASSWORD_TOKEN)"`
	EffectiveStartDate string  `orm:"column(EFFECTIVE_START_DATE)"`
	ExpirationDate string `orm:"column(EXPIRATION_DATE)"`
}
```

# まとめ

スネークケースとアッパースネークケースは盲点でした。
両方ごっちゃになっていたという点とどちらもマッピングされるだろうという思い込み。
＋DB定義はアッパースネークケースで定義するもの、という思い込みもありました。
思い込みダメ絶対。
LPICレベル1を勉強しているあなたへ - LVMができること -

LVM では、
物理的な記憶デバイスの領域（物理ボリューム）をまとめ、
論理的なひとつの大きな記憶デバイス（ボリュームグループ）を
作りそれを切り出して仮想的なパーティション（論理ボリューム）を
作ることができます。

これにより、

・論理ボリュームを動的にリサイズすることができる

・ボリュームグループは、
物理ボリュームを集めて構成された仮想的な領域である

・ボリュームグループに対し、
後から物理ボリュームを加えたり、削除したりできる

・スナップショットを取得することができる

が可能です。

引用元：https://mondai.ping-t.com/question_subjects/31/question_sessions/4236831/progressing_questions/65045107?result=true
JMXでatomikosのコネクションプールサイズを取得できなかった原因が単純だった話

アプリケーション内で以下のようにMbeanを登録してJMXで取得できるようにした際に
Mbeanへの登録は出来ているのに実際のコネクションプールの値が取得できないことがあった。（ソースは若干省き、例外処理とかちゃんと書こうね）

```java:RegisterClass
Context context = new InitialContext();
AtomikosDataSourceBean dataSource= (AtomikosDataSourceBean) context.lookup("java:/comp/env/dataSourceName");
MBean mbean = new Mbean(dataSource);
ObjectName mbeanName = new ObjectName("mbeanName");

MBeanServer mbeanServer = ManagementFactory.getPlatformMBeanServer();
mbeanServer.registerMBean(mbean,mbeanName);
```

```java:MBeanClass
AtomikosDataSourceBean dataSource = null;

public MBean(AtomikosDataSourceBean dataSource){
    this.dataSource= dataSource;
}

public int getAvailbleSize() {
    return (this.dataSource).poolAvailableSize();
}

public int getTotalSize() {
    return (this.dataSource).poolTotalSize();
}
```
取得できなかった原因はアプリケーション内で一度もコネクションが取得されておらず、AtomikosDataSourceBeanが持つConnectionPoolインスタンスが生成されていないことにあった。
そのためConnectionPool.poolAvailableSize();を呼び出した際にヌルポが発生していた。

アプリケーション内で一度でも以下のようにDBにアクセスしていれば以降は値が取得できた。

```java
Connection conn = dataSource.getConnection();
```

アプリちゃんと動かしてないとコネクションプールは取れないよって話。
第 8 回 Power Platform ガバナンス

みなさま、こんにちは！日本マイクロソフトでカスタマーサクセスマネージャーをしております澤本です。今回は、Teamsをプラットフォームとして活用していくための組織と統制作り、ガバナンスについてお話したいと思います。

多くの企業様でお聞きすることがあるのですが、各部門で作成されたアプリやマクロなどが担当者が辞めてしまったなどの理由によりメンテナンスが継続出来なくなり、仕方なくIT部門に頼って来ることなどのケースを時々お聞きします。設計図なども十分にないアプリをいきなり管理してくれと頼られても、エラーが多かったり運用のプロセスが把握できなかったりと、IT部門としても簡単に受け入れることも出来ないことで苦労されているとお聞きします。

TeamsとPower Platformを活用し現場のDX化を進めて行くためのガバナンス作りは、現場のデジタル化を推し進める上でとても重要な取り組みと言えます。現場によって考察するポイントは異なりますが、一般的にこの様な課題があります。

> アプリ構築環境を開放する際のガバナンスの課題
> • 部門が勝手に外部のアプリ(サービス)の契約してしまう > シャドーIT化
> • 正しい知識もないままアプリを構築して業務で利用してしまう > IT部門への負荷
> • 業務アプリの構築の仕方が分からない > DXに乗り遅れテクノロジーを使いこなせない 
> • アプリがモニタリングされておらず、全体管理が出来ない > アプリの管理が出来ない

マイクロソフトでは、こういった課題感に対しCenter of Excellenceなるデジタルを使いこなすフレームワークを提案しデジタルを現場で活用していくための組織構築を推奨しています。

![8.1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1549581/ae4e2d40-6d4b-f1e3-b70d-e9287a44733e.jpeg)

Center of Excellenceでは、運用から教育、セキュリティ、そして現場での活用を踏まえ、複数の組織で構成されることが望まれます。例えば、上記の様にIT運用、IT利活用、セキュリティ、そして事業部門の様な混合のチームで利用者を支援します。

こういった組織作りが、前回にご紹介したデジタルフィードバックループをサポートし、最新のテクノロジーを業務に取り込み、自動化、アプリ化を実現できるのです。そして自社に必要なテクノロジーの良いところをビジネスの取り込み最適化を実現できるのです。

因みにこのCenter of Excellenceですが、Power Platformをご利用頂く組織でこのガバナンス観点を含めた運用がご利用頂けるようベースとなるスターターキットが用意されておりますので、どんな運用が出来るのかご興味がある方はこちらもご参照ください。

[Microsoft Power Platform Center of Excellence (CoE) スターター キット](https://docs.microsoft.com/ja-jp/power-platform/guidance/coe/starter-kit)

これからの時代は、更に多くのことがデジタル化されて行きます。テクノロジーの継続的な学習と活用は、これからのデジタル化の中で大変重要な要素となってきます。 マイクロソフトのCEOを務めるSatya Nadellaは、これを**<u>Tech Intensity</u>**と言う言葉で表現しています。 要約すると、**<u>デジタルテクノロジーの活用とそれを使いこなす強さ</u>**といったところです。是非、みなさまにも一層早いデジタル化の適用を求めてデジタルガバナンス出来る環境を構築頂ければと思います。

![8.2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1549581/c3aeee40-7323-9680-3bf0-2b93cf00ca1c.jpeg)

[マイクロソフトの 2020 年に向けた取り組み: お客様とパートナーの Tech Intensity 向上を支援 - News Center Japan (microsoft.com)](https://news.microsoft.com/ja-jp/2019/12/23/191223-microsofts-2020-initiative-helping-customers-and-partners-increase-tech-intensity/)

さて次回は、誰でも簡単に活用できるPower Automateについて、簡単な活用例や仕組みについてご紹介したいと思います。

(本記事は2021年5月時点の情報に基づきます）

**[-- 目次に戻る --](https://qiita.com/Masa_Sawamoto/items/72cc8679a9b2ea812d70)**
FlutterでATT(App Tracking Transparency)をサクッと対応

# FlutterでATT(App Tracking Transparency)をサクッと対応

タイトル通りです。
ATTっていうのはこいつのことですね。
![](https://github.com/deniza/app_tracking_transparency/raw/master/images/dialog.png)

iOSでユーザーの情報と収集する際には出す必要があります。
収集しているのにこれがないと審査で「これ追加してね☆」ってリジェクトされます。
また、iOS14.5以上ではこいつで許可されないとIDFAが使用できないとのことで広告を使ってる方々は対応必須でしょう。

iOS独自のものだからFlutterでの実装は結構面倒なのでは？
となりそうなところですが、すでに[app_traking_transparency](https://pub.dev/packages/app_tracking_transparency)というパッケージを作ってくださっているのでこちらを使ってサクッと実装していきます。


## インストール
まずは上のパッケージをインストールしていきます。

```shell
$ flutter pub add app_tracking_transparency
```

## Info.plistを編集
### 直接編集する場合
次に`ios/Runner/Info.plist`を編集していきます。
VSCodeなどで`Info.plist`を直接開き、以下のように編集します。

```xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<!-- 略 -->
    <key>NSUserTrackingUsageDescription</key>
    <string>表示する広告を適切に選択するために使用します。</string>
</dict>
</plist>
```

### XCodeを使って編集する場合
もしくは、XCodeでiOSプロジェクトを開き、その中の`Info.plist`を編集することもできます。著者はこっちの方がわかりやすいのでもっぱらXCodeでやっています。

XCodeで設定する場合は、Info.plistのアイテムをホバーした際に出るプラスボタンをクリック。
![図1](https://i.imgur.com/a1rAaxY.png)

そして、`Key`の欄に`Privacy - Tracking Usage Description`を入力します。(それか一覧が出るので選択する。)
あとは、Valueの欄に何かしらトラッキングする際の用途や説明などの文言を記入すればOKです。
![](https://i.imgur.com/Eeb2dR4.png)

ちなむと、ここの説明が不十分だったり不明瞭だったりすると審査に落とされるので注意です。
著者が最近作ったアプリでは「表示する広告を適切に選択するために使用します。」で審査に通りました。
まあ参考程度くらいにしておいてください。

## 実装
ようやく実装です。といっても大したことはしません。関数を一つ定義するだけです。

```dart
class _MyHomePageState extends State<MyHomePage> {
  // 略
  
  Future<void> initPlugin() async {
    final status = await AppTrackingTransparency.trackingAuthorizationStatus;
    if (status == TrackingStatus.notDetermined) {
      await Future.delayed(const Duration(milliseconds: 200));
      await AppTrackingTransparency.requestTrackingAuthorization();
    }
  }
  
  // 略
}
```

一処理ずつ解説していくと、まず

```dart
final status = await AppTrackingTransparency.trackingAuthorizationStatus;
```

で現在のトラッキングのステータスを取得してきています。

```dart
if (status == TrackingStatus.notDetermined) {
  await Future.delayed(const Duration(milliseconds: 200));
  await AppTrackingTransparency.requestTrackingAuthorization();
}
```

そして、そのステータスがまだ未定義(=トラッキングについての許可がまだ決定されていない)の場合のみにATTのダイアログを代用な処理になっています。

この関数を呼び出すのは`initState`で呼び出します。

```dart
@override
void initState() {
  super.initState();
  // Can't show a dialog in initState, delaying initialization
  WidgetsBinding.instance?.addPostFrameCallback((_) => initPlugin());
}
```
  
`WidgetsBinding.instance.addPostFrameCallback`が何かと簡単にいうとBuild後に呼び出されるコールバックを渡せる関数です。
こいつに`initPlugin`関数を渡すことでBuild後に確認のダイアログが出てくれるようになるわけですね。

著者は[splashscreen](https://pub.dev/packages/splashscreen)というパッケージを併用していたので、ここの`navigateAfterFuture`に`initPlugin`関数を渡していましたが問題なくできました。


ここまでで完成です！
実際にビルドしてみると最初にこんな感じの画面がでてくれば成功です。
![](https://i.imgur.com/pXE2Cuv.jpg)


# 終わりに
最初リジェクトされた時は対応めんどくさ。。。と思っていたのですが割とサクッとできたので助かりました。
セキュリティ関係の情報を得たいときに、怪しいサイトのURLやFQDN、IPアドレスを入力したり、捕まえた検体をアップロードすると良さげに調べてくれる無料サイト(編集中)

セキュリティ関係の情報を得たいときに、怪しいサイトのURLやFQDN、IPアドレスを入力したり、捕まえた検体をアップロードすると良さげに調べてくれる無料サイト(編集中)

* https://www.virustotal.com/gui/ (有名サイト)
* https://www.hybrid-analysis.com/
* https://www.malwares.com/ (マルウェア解析専門のようだ)
* https://www.threatminer.org
* https://www.fortiguard.com (Fortinet)
* https://urlfiltering.paloaltonetworks.com/query/ (PaloAlto)
* https://www.brightcloud.com/tools/url-ip-lookup.php
* https://urlcat.checkpoint.com/urlcat/main.htm (要アカウント登録)
* https://global.sitesafety.trendmicro.com/index.php
* https://csi.forcepoint.com/
* ~~https://cfssupport.sonicwall.com/Support/servlet/CFSSupportServlet/viewRating~~
* https://talosintelligence.com/
* https://exchange.xforce.ibmcloud.com/
Server Reflectionを使う【gRPC】【Golang】

# 背景
```zsh
$ grpcurl -plaintext localhost:10000 list
Failed to list services: server does not support the reflection API
```
grpcurlを使おうとしたら「サーバーがreflection APIをサポートしてないよ」って言われた


# Reflection APIとは？

> Server Reflectionという機能は端的に説明すると、protocコマンドでサーバを生成する際に利用していた.protoファイルと同等のものを返してくれるAPIです。これにより手元に.protoファイルがなくてもエンコードを行うことができます。

[Server Reflectionが実装されていないgRPCサーバーでも簡単に叩けるCLIを作る](https://www.wantedly.com/companies/wantedly/post_articles/310167)

# Reflection APIを有効にする

数行追加するだけでできた

```golang
import (
	// ============= 省略 ============= //
+	"google.golang.org/grpc/reflection"
 	// ============= 省略 ============= //
)

// ============= 省略 ============= //

func main() {
 	// ============= 省略 ============= //
        // gRPCサーバーのインスタンスを作成.
	grpcServer := grpc.NewServer(opts...)

	// サービスの実装をgRPCサーバに登録.
	chat.RegisterChatServer(grpcServer, newServer())

+	// reflection serviceをgRPCサーバーに登録.
+	reflection.Register(grpcServer)

	// サーバーのServe()をポートの詳細とともに呼び出す.
	// プロセスがキルされるかStop()が呼ばれるまでブロッキング待機.
	grpcServer.Serve(lis)
}

```

# できた
```zsh
$ grpcurl -plaintext localhost:10000 list
chat.Chat
grpc.reflection.v1alpha.ServerReflection
```
GitHubにリポジトリを作成して、ローカルのVSCodeで操作する

#はじめに

これからVue.jsを学ぼうと思い、ソースコードを管理するためにGitHubを使用します。
エディタはVimやAtom、SublimeTextなど多数あります。
個人的にはVSCodeがおすすめですので、こちらについて手順を記します。


#GitHubに新しくリポジトリを作成する
![スクリーンショット 2021-06-19 6.57.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533960/07654ebc-9698-4ef8-239b-04f6c9cdc266.png)
Githubのトップページ右上の＋からNew repositoryを選択する。
***

![スクリーンショット 2021-06-19 6.59.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533960/1a688294-b248-1030-f6bc-e9d0469a1e02.png)

1. Repository nameを記入する
1. Add a README fileのチェックボックスを入れる。
1. Add .gitgnoreにチェックボックスを入れ、templateをNodeにする。

***
![スクリーンショット 2021-06-19 7.15.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533960/ffe69d13-e2c2-046b-ea53-a52e630f2697.png)


CodeからHTTPSのURLをコピーする。

#VSCodeからGitHubリポジトリを操作する。

![スクリーンショット 2021-06-19 7.18.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533960/18923323-0366-8b36-0f5c-6b2767b97b84.png)

1. VSCodeを起動する
1. EXPLORERからClone Repositoryをクリックしする。
1. 先程コピーしたURLを貼り付けてた後、Enterを押下する。

※ターミナルからgitコマンドでも可能です。

以上です。
CakePHP4のコンポーネントからコントローラーとリクエストを利用するメモ

CakePHP4でコンポーネントからコントローラーとリクエストを呼び出せなくて、悩んだのでメモ

## 結論
以下のように書く。

```php
class SampleComponent extends Component {

  private $controller;
  private $request;

  public function beforeFilter()
  {
      $this->controller = $this->getController();
      $this->request = $this->controller->getRequest();
  }
}
```

ちなみに以下は、ダメだった

```php
class SampleComponent extends Component {

  private $controller;
  private $request;

  public function beforeFilter()
  {
      $this->controller = $this->getController();
      // Controllerクラスの$requestプロパティはproctedなので、アクセスできない
      $this->request = $this->controller->request;
  }
}
```


## 補足
公式ドキュメントには書いてなかったので、ちょっと苦労した、、

CakePHP4ので入っている[RequestHandlerComponentのソースコード](https://github.com/cakephp/cakephp/blob/master/src/Controller/Component/RequestHandlerComponent.php)を読んだらわかった。ソースコードをちゃんと読むのは大切ですね。

## 参考
- [【CakePHP】自作コンポーネント - Qiita](https://qiita.com/kazu56/items/d9bff2291f65d11222ef)
- [コンポーネント - 4.x](https://book.cakephp.org/4/ja/controllers/components.html)
- [cakephp/RequestHandlerComponent.php at master · cakephp/cakephp](https://github.com/cakephp/cakephp/blob/master/src/Controller/Component/RequestHandlerComponent.php)
- [php - Reaching CakeRequest object from CakePHP component - Stack Overflow](https://stackoverflow.com/questions/13996527/reaching-cakerequest-object-from-cakephp-component)
Progate PHPⅠ簡単なまとめ

# 配列の書き方

~~~php
$colors = array('赤','青','黄');
    echo $colors[0];
    $colors[] = '白';
    echo $colors[3]; 
~~~
配列を変数に入れるときは`array()`
最後尾に値を入れるときは`$変数[] = 値`

# foreach文の書き方

~~~php
$scores = array('数学' => 70, '英語' => 90, '国語' => 80);

    foreach($scores as $key => $value){
      echo "{$key}は{$value}点です。";
    }
~~~
`foreach($配列 as キー変数 => 値変数)`もしくは
`foreach($配列 as 値変数)`で配列の中身を回す
イメージとしては数学という箱に70という情報があるとすると、key(キー変数)が箱の名前、value(値変数)が箱の中身。今回は箱の名前が数学で中身が70。
【OpenVINO】MYRIAD X 複数接続 & 使用方法


# はじめに

OpenVINO をラズパイなどの低スペックPCにて使用する際に、処理速度がネックになることが多いかと思います。
その対策として、MYRIAD を複数本使用する方法があります。

C++ で MYRIAD を複数本使用する方法はまとまっているのを見つけたことがありますが、
python で MYRIAD を複数本使用する方法がなかったので、この記事にてまとめたいと思います。


# 利用可能プロセッサ確認方法

以下のコードで、利用可能なプロセッサの確認ができます。

```python
from openvino.inference_engine import IECore

ie = IECore()
available_processor = ie.available_devices
print(available_processor)  
# ['CPU', 'MYRIAD.1.1-ma2480', 'MYRIAD.1.2-ma2480', 'MYRIAD.1.3-ma2480', 'MYRIAD.1.4-ma2480']
```


# 共有部分

基本は以下のコードで、```device_name```を変えていくことで複数本の MYRIAD を使用することができます。

```python
from openvino.inference_engine import IECore

ie = IECore()
# パスは各自のものに変更をお願いします。
model_path =   '~/intel/face-detection-retail-0004/FP16/face-detection-retail-0004.xml'
weights_path = '~/intel/face-detection-retail-0004/FP16/face-detection-retail-0004.bin'
net = iecore.read_network(model=model_path, weights=weights_path)

# device_name を変えることによって、MYRIAD の使用本数などを変更できる
exec_net = iecore.load_network(network=net, device_name=device_name)
```

# 1本使用

```python
device_name = 'MYRIAD'
# プロセッサによっては以下のような形で指定する必要があります。
# device_name = 'MYRIAD.1.1-ma2480'

# 1本使用
exec_net = iecore.load_network(network=net, device_name=device_name)
```

# 4本一括使用

```python
device_name = 'MULTI:MYRIAD.1.1-ma2480, MYRIAD.1.2-ma2480, MYRIAD.1.3-ma2480, MYRIAD.1.4-ma2480'

# 4本一括使用
exec_net = iecore.load_network(network=net, device_name=device_name)
```

# まとめ

これだけで段違いに高速化することは難しいのですが、多少は改善することができますので、参考にしてみてください。

非同期処理・マルチスレッドを導入することによって高速化することができるので、それはまた別の機会に書きたいと思います。



# 参考
* Multi-Device Plugin
    * https://docs.openvinotoolkit.org/latest/openvino_docs_IE_DG_supported_plugins_MULTI.html

---
### 会社紹介

**株式会社 Mosaica**  
最先端テクノロジーで社会課題を解決し、持続可能な未来を創造する IT カンパニー。
AI ソリューション、クラウド統合、DX 推進、経営コンサルティングなど包括的なサービスでビジネス変革を支援しています。  

詳しくは [公式サイト](https://mosaica.co.jp/) までお気軽にご相談ください。
公式サイト： https://mosaica.co.jp/
Proxmox 7

* Debian 11 ベースになった。

## Download

https://www.proxmox.com/en/downloads/category/iso-images-pve

## 掲示板

https://forum.proxmox.com/threads/proxmox-ve-7-0-released.92007/

## Upgrade 6.4 to 7

https://pve.proxmox.com/wiki/Upgrade_from_6.x_to_7.0

```sh
pve6to7
pve6to7 --full
```

```sh
sed -i 's/buster\/updates/bullseye-security/g;s/buster/bullseye/g' \
  /etc/apt/sources.list

sed -i 's/buster/bullseye/g' /etc/apt/sources.list.d/pve-enterprise.list

apt update
apt dist-upgrade
```


> W: (pve-apt-hook) !! ATTENTION !!
> W: (pve-apt-hook) You are attempting to upgrade from proxmox-ve '6.4-1' to proxmox-ve '7.0-2'. Please make sure to read the Upgrade notes at
> W: (pve-apt-hook)       https://pve.proxmox.com/wiki/Upgrade_from_6.x_to_7.0
> W: (pve-apt-hook) before proceeding with this operation.
> W: (pve-apt-hook)
> W: (pve-apt-hook) Press enter to continue, or C^c to abort.


```sh
reboot

pveversion
```

## Ansibleについて

* Proxmox 6.4のころとはAnsibleのバージョンが異なるため、Deprecateな書き方は廃止されて利用できないものがあった。(aptパッケージをwithで複数しているあたりの書き方。)


## macmini へのインストールについて

* Mac Mini A1347 (2014) i5-4308U 2.80GHz 

の場合、Proxmox 8.3をインストールすると`loading initial ramdisk`から進まなかった。
Proxmox 7.4だと起動した。
PHPのデータベース接続方法

<?php

try {



    // データベースに接続
    $pdo = new PDO(
        'mysql:dbname=testdb;host=localhost;charset=utf8mb4',
        'root',
        '',
        [
            PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
            PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
        ]
    );

    /* データベースから値を取ってきたり， データを挿入したりする処理 */

} catch (PDOException $e) {

    // エラーが発生した場合は「500 Internal Server Error」でテキストとして表示して終了する
    // - もし手抜きしたくない場合は普通にHTMLの表示を継続する
    // - ここではエラー内容を表示しているが， 実際の商用環境ではログファイルに記録して， Webブラウザには出さないほうが望ましい
    header('Content-Type: text/plain; charset=UTF-8', true, 500);
    exit($e->getMessage()); 

}

// Webブラウザにこれから表示するものがUTF-8で書かれたHTMLであることを伝えるため

header('Content-Type: text/html; charset=utf-8');

?>
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>Example</title>
    </head>
    <body>
   
    </body>
</html>
【Angular】@ViewChildを使用した際のコンパイルエラー


Angularにて、下記記事で紹介されているようなファイル選択ボタンを作りたかった。

https://qiita.com/daikiojm/items/d744d63300915b2d8c4b

### 環境
- Angular: 12.0.5
- TypeScript: 4.2.4
- エディタ： VSCode



### 修正前

```html:app.component.html
<button
    mat-raised-button
    color="primary"
    (click)="onClick()">
    <mat-icon>attach_file</mat-icon>
    ファイルを選択
</button>
<input #fileInput type="file" style="display:none;">
```

```ts:app.component.ts
import { Component, ElementRef, ViewChild } from '@angular/core';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent {
  @ViewChild('fileInput') fileInput: ElementRef;

  onClick(): void {
    this.fileInput.nativeElement.click();
  }
}
```

こちらで保存すると、コンパイルエラー（VSCode上でもエラーが出る）

```
error TS2564: Property 'fileInput' has no initializer and is not definitely
 assigned in the constructor.

10   @ViewChild('fileInput') fileInput: ElementRef;
                             ~~~~~~~~~
```

fileInputに初期化子がなく、コンストラクターで明確に割り当てられていない・・・


### 解決策

https://lacolaco.hatenablog.com/entry/2018/06/27/125101

こちらの記事によれば、
TypeScript 2.7 からクラスプロパティの初期化をチェックする`strictPropertyInitialization`オプションが導入され、

>`tsconfig`の`strictPropertyInitialization`オプションを有効にすると、`undefined`を許容していないプロパティがプロパティ宣言時あるいはコンストラクタで初期化されていないときにコンパイルエラーになる。

とのこと。そして
>`@ViewChild`や`@ContentChildren`などは、クラスの初期化時ではなくコンポーネントのビューツリーの解決時に初期化されるので、`strictPropertyInitialization`がうまく噛み合わなくなる。

これがコンパイルエラーの原因。

>`@ViewChild`や`@ContentChild`はオプショナルプロパティとして扱うべし

これに言及してくれている記事がほとんどなく解決に苦労しました。ありがとうございます:raised_hands:


### 修正後

というわけで、修正後のコードはこちら。

```ts:app.component.ts
import { Component, ElementRef, ViewChild } from '@angular/core';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent {
  @ViewChild('fileInput') fileInput?: ElementRef;  // オプショナルプロパティに

  onClick(): void {
    if (this.fileInput !== undefined) {  // 追加
      this.fileInput.nativeElement.click();
    }
  }
}
```
「いつまでにならできますか？」に対抗する、少しでも自信を持って見積もるための知恵

https://qiita.com/e99h2121/items/bb9e22af744dec95caa0

の続編のようなポエム。

「できるかできないかわからない状態」の物事に対して「いつまでにならできますか？」という質問を受けることがある（非開発者含む）が最上級に難しい質問であることをとりあえず知ってほしい、というのは愚痴。

多分相手は単純に、「抱えているのは量の問題だ」という感覚があって、明日までにできないっすと答えた私に対して「なら来週月曜までにならできますか？」（えっそれ営業日で1日も伸びてねえ）とか（むしろ、期限を延長してくれたかのように）返してくれているのだと思っている。

違うんだよそれ以前なんだよな～、と思いつつ、そう簡単にその気持ちが伝わるわけはないのでそういうときにどうするべきなのかを考える。

## 見積もりはむずかしい

https://qiita.com/yuno_miyako/items/8678cd542fbb7050e40e#%E5%89%8D%E6%9B%B8%E3%81%8D

「なぜ見積もりは難しいのか？それはあまりにも不確実性が多いからだ。」。不確実性を減らすには

https://qiita.com/hirokidaichi/items/5a204a57a200569f755d#%E3%81%BE%E3%81%A8%E3%82%81

だが、下から上への情報の透明性

https://qiita.com/hirokidaichi/items/5d8c4294083d85654a04#%E4%B8%8B%E3%81%8B%E3%82%89%E4%B8%8A%E3%81%B8%E3%81%AE%E6%83%85%E5%A0%B1%E3%81%AE%E9%80%8F%E6%98%8E%E6%80%A7

なんてものもあるし、ともかく「距離」のある場合に冒頭の質問はなかなか説明しがたい。

## わかりません = 放棄？

こういうとき私は割と「わかりません」と言ってしまうほうなのだが、結果、むせきにんだなコイツと思われているかもしれないなと思うこともある。よくない。

https://qiita.com/TsukasaGR/items/59a79473b2f40f95fea1
> 「できません」を伝える際に確認しておきたいチェックシート
> 
> 1. 相手の言い分の意図を受け入れていることを伝えようとしているか
2. 「できない理由」でなく、「どうすればできるか」から始まっているか
3. 口頭だけでなく、可視化された文章も添えているか
4. 代替案をセットで提示しているか
5. 相手に求める回答形式を選択式にしているか


## 知恵

できませんを伝えるためにも、もちろんどうできるか考えるためにも、「細分化」が大事だと思う。

https://qiita.com/hirossyi73/items/7785cdd367c774da43df

> 細分化の能力が無いと、ここでだいたい詰まる。「ググっても出てこない。オワタ！」となってしまう。それまでの練習問題では、直接的にググっても大体出てきたけど、実務だと出てこない。出来ない。オワタ。となってしまうのである。
なので、細分化が必要になってくる。「何をする必要があるのか？」ということを、冷静に分析していく。それが必要になってくる。

https://qiita.com/e99h2121/items/84f9b97df07e3f943176

> 第1ステップ：What to do by When. やること & 期限 
第2ステップ：How and with Whom. そのための資料と、助けてくれる人
第3ステップ：Now. 1, 2を活用することで自分の現在地 

https://jp.quora.com/%E5%87%BA%E6%9D%A5%E3%82%8B%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E%E3%83%BC%E3%82%84%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%AE%E6%96%B9%E3%81%A7%E3%82%82-%E4%BD%95%E3%82%92%E3%82%84%E3%81%A3

> まずは試してみて動かすこと、次に概念を体系的に理解すること、それから実例と利用できる資源を網羅的に把握すること、最後に実践の機会を作って体得することです。

## まとめ

一番簡単に「いつまでに」に対処するには

- 少しやってみることを約束する。相手にいつでも、また聞いてもらう。
- 後戻りの効かない最終締め切りよりは、ちょっと前にまた聞いてもらう。

くらいが、とても簡単で気楽で誰も苦しまない見積もりだと思っている。もう一度、良いタイミングで、「どのくらいまでできているか」を聞いてもらうこと。それが小さな単位の、「不確実性を少しでも減らす努力」として実務的にできることだとおもう。

というか普段からその「距離」をとらない努力をコツコツと種としてまいておきたいなとおもう。いつでも聞いて欲しい。結果、あ、この人常に忙しいわ、と認識してもらえるようになったりして、それはそれでどうなのという気持ちにはなるんだが。

https://twitter.com/popeetheclown/status/1408961414342004738?s=20

追記: こんなツイートも教えてもらったので書いておく。
追記2: ここでも「不確実性コーン」の話。

https://tech.unifa-e.com/entry/2021/07/16/130205

追記3: 
[[B! 管理] ひさてるさん on Twitter: "ソフトウェア開発で「正確な工数見積はできない」というのは、新規なんてやってみるまで何ひとつわからないという怠慢の肯定ではなくて、過去の経験からだいたいカンでこれぐらいかなと予測した数字は出せるけど、そんなものの足し算で長期計画のケツを約束する愚行をやめようという意味なのよね"](https://b.hatena.ne.jp/entry/s/twitter.com/tanakahisateru/status/1566467377357012992)

以上見積もりの知恵、ごった集めでした。参考になればさいわいです。
CloudFrontのエラー「The certificate that is attached to your distribution～」

## エラーメッセージ

```
InvalidViewerCertificate: The certificate that is attached to your distribution doesn't cover the alternate domain name (CNAME) that you're trying to add. For more details
```

## 対処方法
- 有効な証明書を割り当てないといけない
- ワイルドカード証明書でもダメな場合がある
- 次のように割り当てる
    - aaa.vamdemic.com → *.vamdemic.com
    - vamdemic.com → vamdemic.com
- vamdemic.comでCNAMEAliaseを作ろうとしていたけど、ワイルドカード証明書を指定していたのでエラーになっていたい
UE4の Pixel2D買ってみたよ (Part4)　タイルマップのアニメション

というわけで続き！
下書きで記事ちょっとためてるけど反応あるほうがモチベーションって出るよね
ということで続いてこちらの動画

https://www.youtube.com/watch?v=b9vo9Raap7s

Creating 2D games with Unreal Engine using Pixel 2D - Part 4 - Animated Tiles

#マップの見栄えをよくしてる(0:00)
　前回と同じようにマップを作っているだけ。

#アニメーション画像を準備する(4:00)
前回同様素材を利用
`C:\Program Files\Epic Games\UE_4.26\Engine\Plugins\Marketplace\Pixel2D\TemplateProjects/Source Files.zip`
解凍した中身のここに入っている画像↓こいつを
` Files\Animated`
![2021-07-07_00h02_37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270619/5c2e5d43-7d65-3b28-d21c-5bec3536526f.png)

前回同様取り込んで設定
![2021-06-27_21h46_55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270619/d5b48b32-0377-25f4-dfc0-e34eb0091846.png)

パラパラ漫画用にバラバラにした素材を準備
![2021-06-27_22h10_10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270619/2f262ec0-d9fc-bbf9-aae1-4c9789575ecd.png)

ファイルいっぱいできた！
Shift＋Clickで全選択して保存しておいてね
![4.1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270619/edc1b75d-83e6-6de8-fc34-27b442c49797.png)


５個を選択してフリップブックを選択するとアニメーションができる。
![2021-06-27_22h31_21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270619/2d8778f0-7c35-09d4-572e-a8b0a73caeac.png)

んでできたやつはわかりやすいようにfb*****(フリップブック****)みたいな名前にしとく
※アニメーション速度が速い場合は調整すること。
![4.2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270619/7c87ccbd-ae9c-5f34-14fd-0d7b1e82f1dc.gif)

#マップにアニメーションを反映させる準備をする。(7:30)

んで今回はこのAssetが用意したBluePrintを利用する。
![2021-06-28_00h21_18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270619/8f7c15a1-10d4-221e-9b96-66850453c746.png)

TileMapを開くとタイルに番号がついていることがわかる
（この場合3070）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270619/212f2a5b-b309-27ae-6bb0-c6f56a6a3a47.png)

このファイルを設定すると指定したタイルがそのFlipBookに代わるというもの
![4.5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270619/ca94007f-7e9b-0b2e-9106-8fc077ff61f7.png)

これで設定ができたので
#TileMapを置きなおすよ(11:00)
そのままだと反映されないので
![4.6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270619/ac09ad43-94cb-cf04-bc08-c61282771a1f.png)

出来たオブジェクトを個別に動かしたいときはグループ化されているから解除すれば動くよ

次回はキャラクターの動きに関してだよ！