OmniAICreator/Qiita-1.07M huggingface dataset:
マルチスレッドで動作するマイクラサーバーがあるというので試してみる

[Chiyogami](https://github.com/Be4rJP/Chiyogami)という、[Paper](https://github.com/PaperMC/Paper)をフォークしたマルチスレッドに対応するサーバーソフトがあるというので試してみました。

#ビルド
サーバーのjarファイルはそのまま落とせず、各自ビルドして利用するようになっています。
https://github.com/Be4rJP/Chiyogami にて日本語による解説があるのでそちらを参考に。

### 利用するサーバーのバージョンに対応したBranchを選ぶ

現在は[1.15.2](https://github.com/Be4rJP/Chiyogami/tree/ver/1.15.2)、[1.16.5](https://github.com/Be4rJP/Chiyogami/tree/ver/1.16.5)、[1.17.1]
(https://github.com/Be4rJP/Chiyogami/tree/ver/1.17.1)の3つが用意されています。
今回は1.17.1を選択。

### 必要ライブラリ等の導入

1.17.1の場合はgit、jdk16が、それ以外の場合はgit、maven、jdk8が必要です。
説明すると長いので各自で導入されてください。

### ビルド

BranchのREADMEにあるダウンロードリンクもしくはリポジトリをダウンロードします。
解凍後そのディレクトリでWinidowsの場合はgit-bash、linuxもしくはMacの場合はターミナルを開き`./buildChiyogami.sh`を実行します。

自分の環境だと始めビルドに失敗しましたが、2，3回ほど`./buildChiyogami.sh`を実行し、そのフォルダを削除してもう一度解凍からやり直したところ成功しました。
####追記(2021/09/11)
gitでは予めアカウントとのリンクが必要となります。

```
git config --global user.email "githubに登録しているメールアドレス"
git config --global user.name "githubに登録しているユーザー名"
```
ない場合はエラーを吐かれてビルドに失敗します。

## テスト

いよいよビルドも完了したので起動していきます。
ビルドによってできたChiyogami-1.1x.x（ビルドしたバージョン）.jarを適当な新規フォルダに移し（しなくても良さそうだけど一応）、適当に実行します。

:::note info
ビルドされたjarファイルはbuildChiyogami.shなどがある解凍した階層に生成されます。
:::
通常のものと同様最初はEULAで弾かれるので、EULA=trueにして再実行。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1648552/62cfcb59-c12d-e939-de5c-fa9a54d53e28.png)
…？
はい。実はこれ現時点ではtimingsが有効化されていると起動に失敗するようです。

### timingsの無効化

調べたところ、paper.ymlを変更する模様。

```paper.yml（80行目ぐらい）
timings:
  enabled: true -> ここをfalseに
```

これでいざもう一度。
これで起動するかと思います。
CPU使用率もしっかりと分散されているかと思います。
チャンク読み込みそこそこ上げてもついてきてくれてる。

#プラグインの動作テスト

そのままでは快適に動作することがわかりましたが、プラグインを導入した際にどのような挙動をするのかも見ていきます。
今回導入したのはGeyserとfloodgate、dynmaapの3つです。

以前試したところエラーで起動できませんでしたが修正されたそうなのでそこも含めて試してみます。
Paperの派生なのでSpigot版の物を使用。

何のエラーも吐かずすんなり起動しました。

#総括
特にバグ等もなく、プラグインも普通に動くため普通にサーバー運用も可能だと思います。

なにか間違い等あればご指摘ください。
【React Native】下から引っ張るタイプのモーダルを作る

最初からプルタブが露出しているタイプのモーダルが作りたかったので、ライブラリを使って作ってみました。

完成はこんな感じ

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1711764/3094a8c6-bce8-a1c7-7310-1bb7ad693c73.jpeg" width=300>　<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1711764/23f16e4a-2d07-166c-65e1-14cd64f561c8.jpeg" width=300>


#ライブラリを使用
Reanimated Bottom Sheetというライブラリを使用します。リファレンスは[こちら](https://github.com/osdnk/react-native-reanimated-bottom-sheet)

```:ライブラリのインストール
npm install reanimated-bottom-sheet react-native-gesture-handler react-native-reanimated
```
リファレンスのサンプルコードから引っ張ってきたものを以下で改良していきます。

#プルタブの作成
```javascript:App.js
import * as React from 'react';
import { StyleSheet, Text, View, Button } from 'react-native';
import BottomSheet from 'reanimated-bottom-sheet';

export default function App() {

  const renderContent = () => (
    <View style={styles.modalWrapper}>
      <View style={styles.modalHeader}>
        <View style={styles.modalPulltab}/>
      </View>
      <View style={styles.modalContents}>
        <View style={{height: '100%'}}>
          <Text>modal contents here</Text>
        </View>
      </View>
    </View>
  );

  const sheetRef = React.useRef(null);

  return (
    <>
      <View
        style={{
          flex: 1,
          backgroundColor: 'papayawhip',
          alignItems: 'center',
          justifyContent: 'center',
        }}
      >
        <Button
          title="Open Bottom Sheet"
          onPress={() => sheetRef.current.snapTo(0)}
        />
      </View>
      <BottomSheet
        ref={sheetRef}
        snapPoints={['90%', '50%', 50]}
        initialSnap={2} // モーダルの初期位置を決める。snapPointsのインデックス番号を指定
        borderRadius={20}
        renderContent={renderContent}
      />
    </>
  );
}

const styles = StyleSheet.create({
  modalWrapper: {
    backgroundColor: 'rgba(221,221,221,0.3)',
},
  modalHeader: {
    backgroundColor: 'rgba(153,153,153,0.7)',
    height: 50, // 引っ張り出す部分を露出させたいので、初期位置のsnapPointsと同じ高さを指定する
    alignItems: 'center',
    justifyContent: 'center'
  },
  modalPulltab: {
    backgroundColor: 'gray',
    height: 5,
    width: 40,
  },
  modalContents: {
    backgroundColor: 'rgba(230,230,255,0.8)',
    paddingLeft: 16,
    paddingRight: 16,
    flexGrow: 1
  }
})
```
`BottomSheet`の`snapPoints`というプロパティはモーダルが固定される位置を指定できます。また、`initialSnap`で初期状態での`snapPoints`を指定できるため、今回は`50`を指定してモーダルの上部50を露出させています。
Python - FizzBuzz

```python
def fb(n):
    result = ''

    if n % 3 == 0:
        result = 'Fizz'
    if n % 5 == 0:
        result += 'Buzz'
    if result == '':
        result = n

    return result


i = 1
while i <= 100:
    print(fb(i))
    i = i + 1
```
Gitでよく使うコマンドまとめ

##はじめに
このページでは、Gitを始める際のrepositoryの作成や使用していく上で便利なコマンドを備忘録的に記録しています。
なお、編集者の環境はmacOS Mojaveです。

##Gitのセットアップ
githubで新しいrepositoryを作ってからローカルにクローンしてプッシュするまで。
optionalと書いてある箇所はしなくてもOK
###repositoryの作成
1.右上のプラスマークをクリックし、"New repository"を選択
2.Ownerを確認し、Repository nameを入力する
3.(optional)Descriptionを記入
4.visibilityを選択
  Public:誰でもこのrepository内のcodeを読むことが可能
  Private:誰がこのrepositoryを見れるかを指定可能。
5.(optional)必要なファイル（READMEなど）があれば選択
6."Create repository"をクリック

###SSHの設定をする
次のステップでローカルにrepositoryをcloneしますが、そのために必要な準備。以前はパスワード認証で簡単だったんですが、2021/8/13からPersonal access tokenなるものが必要になったらしいです。参考にした記事→[GitHubでhttpsのパスワード認証が廃止された。Please use a personal access token instead.](https://qiita.com/shunsa10/items/e43564cf48f84b95455b)ここでは、以前から使用されているSSH接続を行うための設定を行います。

1.ローカルの環境で、以下のコマンドを実行し、SSH keyがあるかを確認する

```bash:
ls -al ~/.ssh
```
以前作ったものを使用したい場合はそのファイル名をコピー。大抵の場合はid_rsa.pubのように後ろにpubとついている。ただし、その鍵を作った際のパスワードを覚えておく必要がある。
2.SSH keyがない場合、または新規に作成する場合はこちらの記事を参考にして作成してください。
[SSH接続の手順](https://docs.github.com/en/github/authenticating-to-github/connecting-to-github-with-ssh)
作成したファイルのファイル名とパスワードを記録
3.以下のコマンドでファイル内の鍵をクリップボードにコピー

```bash:
pbcopy < ~/.ssh/XXX.pub
#XXXはファイル名
```
4.gitのweb pageに戻り、アカウントのロゴ（右上）をクリックし、"Settings"を選択
5.左のメニューリストから"SSH and GPG keys"を選択
6.SSH keys の項目に"New SSH key"というボタンを押し、TitleとKeyを入力
　TitleはMac Bookなど自身がわかるような名前を設定する
　Keyの欄には3でコピーしたものを貼り付ける
7."Add SSH key"を押して完了

###cloneする
1.cloneしたいrepositoryのgitのページにいき、"Code ▽"をクリックし、Cloneの項目にあるSSHを選択。そこに表示されるgit@から始まる文字列をコピーする

2.ローカルのターミナルで作業directoryに移動し、以下を実行し、設定したパスワードを入力

```bash:
git clone XXX
#XXXは1でコピーしてきた、git@ から始まる文字列
```

####参考文献
[GitHub でリポジトリを作成・削除する方法](https://qiita.com/TK-C/items/c72edc46e74ccbb7ba78)
[Connecting to GitHub with SSG](https://docs.github.com/en/github/authenticating-to-github/connecting-to-github-with-ssh)

----

##Git tag
tagとは特定のcommitに対してつけることができ、バージョン管理はもちろんだが、branchを操作することなく、過去のバージョンから編集することが可能になる。

###tagの作成
tagはcommitに対してつけられるものなので、事前にcommitしておくと良い。しない場合は最後のcommitに対してtagがつけられる。

```bash:
git tag -a <versionName> -m "<comment>"
```

###tagの確認
```bash:
git tag
```

###以前のタグに戻す
```bash:
git checkout /refs/tags/<tag name>
```

####参考文献
[git tagの使い方まとめ](https://qiita.com/growsic/items/edgi67e03fda5ab7ef9d08)

##branch
###ローカルブランチ名を変更する
以下のコマンドを変更したいブランチにcheckoutした後で行う。

```bash:
git branch -m <new branch name>
```

###ローカルブランチの削除
```bash:
#すでにmergeしたブランチを消す場合
git branch -d <branch name>
#mergeは完了してないが、不必要なので消したい場合
git branch -D <branch name>
```

##diffを取る
基本的な使い方は以下に示すように<before> <after>にcommit番号やbranch名を入れる。

```bash:
git diff <before> <after>
```
##mergeする
codeの修正が終わったものは分岐元のbranchにmergeする。


####参考文献
[git mergeを使ってブランチをマージする方法]
(https://techacademy.jp/magazine/10264)
[ブランチ切って更新してマージするまでの流れ]
(https://qiita.com/shuntaro_tamura/items/6c8bf792087fe5dc5103)
.envファイルの環境変数を本番 docker環境で使う

##はじめに
環境構築はそれぞれ違うと思いますので、あくまで私個人の備忘録として見ていただければありがたいです。

##.envファイルの導入
まずはじめにgemを入れます。
Gemfileに下記のように記述してbundle install

```Gemfile
gem 'dotenv-rails'
```

bundle installできたら.envファイルを作ります。
作る場所はプロジェクトの一番上の階層です。

ターミナルのアプリのディレクトリで```touch .env```で作成します。
あとはそのファイル内にそのファイル内に 環境変数を設定して、アプリの中で使うだけです。

このファイルはgitにpushしたくないのでgitignoreに記載しておきましょう。

##本番のdockerで使う
同じ要領で行います。
ec2インスタンスにターミナルからログイン。
```docker ps```でコンテナidを確認し、```docker exec -it 確認したコンテナid sh```でアプリがあるコンテナに入ります。そこでtouch .envで作成。

```vi .env```envファイルを開いて「iキー」で入力可モード。
あとは環境変数を書き込んで、:wqで保存。

これでdocker環境でも反映されるはずです。
コンテナを一度downさせて再upしておきましょう。
[Rails]フォロー機能導入中にActiveModel::UnknownAttributeErrorというエラー発生

# はじめに
本記事では、フォロー機能時に発生した
`ActiveModel::UnknownAttributeError`というエラーの解決した方法を記述します。
仲間に助けてもらいながら実装できたため、個人でもアウトプットして身につけたいと思い、記事にしました。

# エラー画面

![フォロー機能導入できない.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1768158/6d9269d3-3e99-1950-006f-c044d6252c9e.png)

`attribute`=`属性`という意味。（Google先生）

Relationshipに`user_id`という属性は知らん。と怒られました。

![フォロー機能のsequel pro.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1768158/5fa8dc25-1c57-ada7-a05a-fcbd235568db.png)

確かに、`user_id`はありません。

しかし、`binding.pry`でparams[:user_id]の値取れてるじゃないですか...。
と言い訳してみたはいいものの、まあカラムにないわけですからなんとかします。

![フォロー機能　binding.pry.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1768158/2af51c60-a54b-8293-b489-f3a1b89558a8.png)

# コード
実際のコードがこれです。

```relationships_controller.rb
class RelationshipsController < ApplicationController
  before_action :authenticate_user!
  def create
    following = current_user.relationships.build(follower_id: params[:user_id])
    following.save
    redirect_to request.referrer || root_path
  end

  def destroy
    following = current_user.relationships.find_by(follower_id: params[:user_id])
    following.destroy
    redirect_to request.referrer || root_path
  end
end

```

```rb
following = current_user.relationships.build(follower_id: params[:user_id])`
```
エラーの内容的にここだよね。と思ったので、もうピンポイントで突き止めていきます。

# 結論

```relationships_controller.rb
class RelationshipsController < ApplicationController
  before_action :authenticate_user!
  def create
    following = Relationship.create(follower_id: params[:user_id], following_id: current_user.id)
    redirect_to request.referrer || root_path
  end

  def destroy
    following = Relationship.find_by(follower_id: params[:user_id], following_id: current_user.id)
    following.destroy
    redirect_to request.referrer || root_path
  end
end
```

```rb
following = Relationship.create(follower_id: params[:user_id], following_id: current_user.id)
```

Relationshipモデルにcreateメソッドつけて、
カラムである`follower_id`と`following_id`をセッターにして、
それぞれ値を入れ込めば完了。

# 敗因
①`Relationship.create(follower_id: params[:user_id], following_id: current_user.id)`の形で値を入れることを理解できていなかった。

②なんとかして、変数を作って入れることしか考えていなかった。

別解として、
カラムを`following`を`user_id`に変えてしまう手もあったようです。

# 終わりに
完全に仲間に助けてもらい、解決しました。
同じスタートを切ったはずなのに差ができていたことに愕然としたものの、
みんなでディスカッションしながらコードを眺めるのも、楽しいなと感じました。

[Railsでフォロー機能を作る方法](https://qiita.com/mitsumitsu1128/items/e41e2ff37f143db81897)
[【Ruby on Rails】フォロー機能を作ろう（PART2）How to set up a Follower Following system in Ruby on Rails](https://www.youtube.com/watch?v=iAIRNEsA-7g)
2つ目はYouTubeですが、
この方の動画はかなり参考になるかと思います。

今日は週末ですが、
明日も頑張ります！！
Power Automate (無償) で Forｍs API を使って Forms の情報を取得する

# なんの為に？
Forms の結果を取得する際、吐き出されるExcel を元に現在の回答結果を見る方法があります。
が、取得するのが結構面倒ですよね。

そんな時に、Forms API を利用して回答結果を分析することが出来ますよ、というお話です。
しかも、無償で。

# Forms の Actions は、今後増えてくるだろうけど、現状は以下のみ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/99314ce9-886c-5b1d-52a9-1edf8615ab92.png)

https://docs.microsoft.com/en-us/connectors/microsoftforms/#actions

# 今回の肝
- Forms API を [Send an HTTP request to SharePoint](https://docs.microsoft.com/ja-jp/connectors/sharepointonline/#send-an-http-request-to-sharepoint) で利用する

以下に API まとめ

https://qiita.com/baku2san/items/47c8ad906e01d7e5d5b9

# Forms API 情報
公式Documentsもまだ・・

https://techcommunity.microsoft.com/t5/microsoft-forms/is-there-an-api-to-read-microsoft-forms-data/m-p/292045

https://www.facebook.com/groups/powerappsjp/posts/4110061889041743

Facebook の投稿内容は以下
> https://forms.office.com/formapi/api/<tenantid>/users/<userid>/light/forms('<formid>')
responseをつけると回答内容も取得できます。
https://forms.office.com/formapi/api/<tenantid>/users/<userid>/light/forms('<formid>')/responses

# 概要
1. Tenant ID は、[list-my-environments](https://docs.microsoft.com/ja-jp/connectors/flowmanagement/#list-my-environments) で Default Environment から取得
1. User ID は、[office365users](https://docs.microsoft.com/ja-jp/connectors/office365users/#get-my-profile-(v2)) などで取得
1. Form ID は、Forms の [Trigger](https://docs.microsoft.com/ja-jp/connectors/microsoftforms/#when-a-new-response-is-submitted) か、APIで取得とか
1. Responses API で回答取得

## Tenant ID
[⇒ Power Automate で Tenant ID を取得する](https://qiita.com/baku2san/items/fc7c32157f4cbb37a062)

## Responses API で回答取得
```text:SiteAddress
https://forms.office.com/formapi
```
```text:Uri
api/@{variables('TenantID')}/users/@{variables('UserId')}/light/forms('@{variables('FormsID')}')/responses
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/15e21a97-52e0-c6c9-dbee-a12f1a56f006.png)

# search for
How to use Forms API on Power Automate

# あとがき
Graph API もこんな感じで使えるようにならんものか :laughing:
基本情報技術者試験勉強0827

本日の積み上げ結果
基本情報技術者試験勉強
平成29年秋過去問
平成30年春過去問
間違えた問題の復習
AWSの本を読む

ペネトレーションテスト　コンピュータやネットワークのセキュリティ上の脆弱性を発見するために，システムを実際に攻撃して侵入を試みる手法。

メモリリークの説明　OSやアプリケーションのバグなどが原因で，動作中に確保した主記憶が解放されないことであり，これが発生すると主記憶中の利用可能な部分が減少する。

ソフトウェア制御における，ポーリング制御　CPUが状態レジスタ又はビジー信号などを読み出して，入出力装置の状態を監視する。

MRPの特徴　製品の基準生産計画を基に，部品の手配数量を算出する。　　

IPv4において，インターネット接続用ルータのNAT機能の説明として，適切なもの　プライベートIPアドレスとグローバルIPアドレスを相互に変換する機能である。

Perl プログラムをコンパイルしたファイルを事前に用意する必要はない。

ボットネットにおいてC&Cサーバが果たす役割　遠隔操作が可能なマルウェアに，情報収集及び攻撃活動を指示する。

ページング方式の仮想記憶において，ページフォールトの発生回数を増加させる要因　主記憶に存在しないページへのアクセスが増加すること。

アクチュエータの機能　コンピュータが出力した電気信号を力学的な運動に変える。

監査調書の説明　監査人が行った監査手続の実施記録であり，監査意見の根拠となる。

サービスマネジメントにおいて，サービスレベル管理の要求事項　提供するサービスのサービスカタログとSLAを作成し，顧客と合意する。

システム運用業務のオペレーション管理に関する監査で判明した状況のうち，指摘事項として監査報告書に記載すべきもの　オペレータが，日次の運用計画を決定し，自ら承認している。

JIS Q 27000:2014(情報セキュリティマネジメントシステム－用語)において，"エンティティは，それが主張するとおりのものであるという特性"と定義されているもの　真正性

攻撃者がシステムに侵入するときにポートスキャンを行う目的はどれか。　事前調査の段階において，攻撃できそうなサービスがあるかどうかを調査する。

IoT(Internet of Things)の実用例として，適切でないもの　インターネットにおけるセキュリティの問題を回避する目的で，サーバに接続せず，単独でファイルの管理，演算処理，印刷処理などの作業を行うコンピュータ。

開発プロセスにおいて，ソフトウェア方式設計で行うべき作業　ソフトウェア品目に対する要件を，最上位レベルの構造を表現する方式であって，かつ，ソフトウェアコンポーネントを識別する方式に変換する。

キャッシュメモリ　データ書込み命令を実行したときに，キャッシュメモリと主記憶の両方を書き換える方式と，キャッシュメモリだけを書き換えておき，主記憶の書換えはキャッシュメモリから当該データが追い出されるときに行う方式とがある。

ナレッジマネジメント　企業内に散在している知識を共有化し，全体の問題解決力を高める経営を行う。
　
アクチュエータ　エネルギー発生源からのパワーを，制御信号に基づき，回転，並進などの動きに変換する。

OC曲線　抜取り検査において，ある不良率のロットがどれだけの確率で合格するかを知ることができるもの。

システムのスケールアウト　既存のシステムにサーバを追加導入することによって，システム全体の処理能力を向上させる。

フォールトトレラントシステム　システム構成に冗長性をもたせ，部品が故障してもその影響を最小限に抑えることで，システム全体には影響を与えずに処理を続けられるようにする。

SPF(Sender Policy Framework)の仕組み　電子メールを受信するサーバが，電子メールの送信元のドメイン情報と，電子メールを送信したサーバのIPアドレスから，ドメインの詐称がないことを確認する。

ITサービスマネジメントにおける問題管理で実施する活動のうち，事前予防的な活動　インシデントの発生傾向を分析して，将来のインシデントを予防する方策を提案する。

XML文書のDTDに記述するもの　文書型の定義

SDメモリカードの上位規格の一つであるSDXCの特徴　ファイルシステムにexFATを採用し，最大2Tバイトの容量に対応できる。
Laravel8 Jetstream アカウント作成後のリダイレクト先変更

##はじめに
今回は、Laravel8でアカウント作成後のリダイレクト先を変更する方法についてご紹介します！
また、ログイン後のリダイレクト先変更については、こちらの記事で紹介していますので是非参考にしてください。
https://qiita.com/yyy752/items/60511e1ef799f9943ee7

## リダイレクト先変更
1.RegisterResponseを新規作成。

```php
/app/Http/Responses/RegisterResponse.php
<?php

namespace App\Http\Responses;

use Illuminate\Http\JsonResponse;
use Illuminate\Http\Response;
use Laravel\Fortify\Contracts\RegisterResponse as RegisterResponseContract;

class RegisterResponse implements RegisterResponseContract
{        
    public function toResponse($request)
    {
        // below is the existing response
        // replace this with your own code

        return $request->wantsJson()
                    ? new JsonResponse('', 201)
                    : redirect('/list');
    }
}
```

2.JetstreamServiceProviderのbootを修正。

```php
/app/Providers/JetstreamServiceProvider.php

    public function boot()
    {
        $this->configurePermissions();

        Jetstream::deleteUsersUsing(DeleteUser::class);

        // register new RegisterResponse
        $this->app->singleton(
            \Laravel\Fortify\Contracts\RegisterResponse::class,
            \App\Http\Responses\RegisterResponse::class
        );
    }
```

## まとめ
以上でアカウント作成後のリダイレクト先を変更できました！
是非参考にしてみてください！

##参考サイト

https://laracasts.com/discuss/channels/laravel/redirect-after-registration-laravel-8
【Azure】CosmosDBを使っている人は今すぐプライマリキーを更新しよう

[ChaosDB: How we hacked thousands of Azure customers’ databases](https://www.wiz.io/blog/chaosdb-how-we-hacked-thousands-of-azure-customers-databases)ってのを見つけたんだけど、なんか日本語記事が[ロイターのよくわからんの](https://jp.reuters.com/article/microsoft-security-idJPKBN2FS035)しか見当たらないので注意喚起のため軽く紹介します。

# FAQ

## 誰が対象？

・Jupyter Notebookを有効化したCosmosDBは全て。
・2021年2月以降に作成したCosmosDBは全て。

## 何をすればいい？

[MSの記事](https://docs.microsoft.com/azure/cosmos-db/secure-access-to-data#primary-keys)を参考に、CosmosDBのプライマリキーを新しく発行して更新する。


# ChaosDB: How we hacked thousands of Azure customers’ databases

2019年、CosmosDBの可視化ツールとして[Jupyter Notebookが導入された](https://docs.microsoft.com/ja-jp/azure/cosmos-db/cosmosdb-jupyter-notebooks)よ。
2021年2月には[デフォルトで有効化された](https://docs.microsoft.com/ja-jp/azure/cosmos-db/enable-notebooks#enable-notebooks-in-an-existing-cosmos-account)よ。
ところがJupyter Notebookの設定ミスで、他ユーザの権限を手に入れることが可能になっていたよ。
最終的に他者のCosmosDBプライマリキーをゲットすることができたよ。
つまりそれは、CosmosDBのフルコントロール権限を手に入れたということだよ。
我々はこの脆弱性をChaosDBと名付けたよ。

この脆弱性をMSに連絡したら48時間以内に修正された。

MSは、我々の調査期間中に影響を受けた可能性のあるユーザにメールを送った。
しかしこの脆弱性は数年前から存在したから、もしかしたら影響範囲はもっと広いかもしれない。

# 感想

めちゃ深刻な問題だと思うんだけど全然話題になってないのはなんでだ。
[公式Twitter](https://twitter.com/azurecosmosdb)もガンスルーだし。
Visual Studio CodeでGit Push時の認証ができなくなった

#　VC Codeでgit push時に認証できなくなった 
VC Codeでアカウントを切り替えて、git pushをしようと思い下記の画面でパスワードを入れると
![settingToken4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336536/914cac87-0f08-612b-a691-714912e0d525.png)

下記のエラーが出て困りました

> Support for password authentication was removed on August 13, 2021. Please use a personal access token instead.

# どうやら、ブラウザのGitHubのページからトークンを生成しなければならないようです
[こちら](https://github.blog/2020-12-15-token-authentication-requirements-for-git-operations/)の真ん中あたり

## 備忘録のため手順をまとめました

  1. GitHubのページをブラウザで開いて、settingsを選択
      ![settingToken1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336536/15cd9892-592c-5e73-b96b-5a9d7a145af9.png)

  2. Developer settingsを選択
      ![settingToken3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336536/d6e9edbe-5542-9c67-5f0a-53a497bc3292.png)

  3. トークンを設定する
      - 任意のトーク名を入力
      - トークンの有効期限を選択
      - 下記にチェックを入れる
        - repo
        - admin：repo_hock
        - delete_repo
      - Generate Tokenボタンを押下
      ![settingToken2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336536/ec1dbcc1-f853-a16b-fc1d-53135af10677.png)

  4. 次の画面でトークンが発行されるのでコピーする
  5. VS Codeのパスワード入力で、トークンを貼り付けて認証する
      ![settingToken4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336536/914cac87-0f08-612b-a691-714912e0d525.png)
ReactでHelloWorld！！

##概要
Reactを使ってとりあえずHelloWorldをするための手順です。
環境構築を兼ねますので、さくっと環境構築として使えます。

この記事は「[ReactでHelloWorldをしてみよう！](https://qiita.com/micropig3402/items/b90afc78f439f9bec81a)」をすごくすごく参考にしています。Naoya Abeさんに感謝。


##ざっくり手順
1.Node.jsをインストールする
2.Yarnをインストールする
3.create-react-appをインストールする
4.create-react-appコマンドを実行する
5.yarn run start

##詳細手順
###**1.Node.jsをインストールする**
* [Node.js](https://nodejs.org/ja/)にアクセスしましょう。(2021年8月時点)
* 推奨版でOKです。
* ダウンロードして手順に従ってインストールしましょう。

####Node.jsとnpmがインストールされているか確認する

* Windowsキー＋R　を押して「ファイル名を指定して実行」を開く。
* 「powershell」と入力しエンターを押して、PowerShellを開く。
* 「node -v」を入力してENT。
* 「npm -v」を入力してENT。
* バージョン情報が表示されればOK。

###**2.Yarnをインストールする**
* Windowsキー＋R　を押して「ファイル名を指定して実行」を開く。
* 「powershell」と入力しエンターを押して、PowerShellを開く。
* 「npm install -g yarn」を入力してENT。
* インストールが完了した旨のメッセージが表示されればOK。

####yarn がインストールされているか確認する
* powershellに「yarn -v」を入力してENT。
* バージョン情報が表示されればOK。

####Pathを通す
* スタートメニューを押して、「kan」と入力し、「環境変数を編集」を押す。
* 「C:\Users\UserName\AppData\Local\Yarn\bin」をPathに追加する。

###**3.create-react-appをインストールする**
* Windowsキー＋R　を押して「ファイル名を指定して実行」を開く。
* 「powershell」と入力しエンターを押して、PowerShellを開く。
* 「yarn global add create-react-app」と入力する。

###**4.create-react-appコマンドを実行する**
* 任意のディレクトリに移動する。「cd C:\reactProject」
* 「create-react-app test」を実行する。

###**yarn run startコマンドを実行する**
* 「cd test」で作成したプロジェクトに移動する。
* 「yarn run start」を実行する。
このコマンドを入力すると自動的にブラウザが表示されReactの画面が表示されます。
Rails    pluckメソッドとは？

###結論
####pluckメソッドとは引数に指定したカラムの値を配列で返してくれるメソッド

###使い方
####1 モデル名.pluck(:カラム名)　
####2 重複を取り除く
pluckメソッドは、重複を取り除くdistinctメソッドと併用する事が出来る。

```
Owner.distinct.pluck(:カラム名)　←こんな感じ
```
####3 条件を指定する
pluckメソッドは、条件を抽出してくれるwhereメソッドと併用する事が出来る。

```
Owner.where('条件').pluck(:id)　←こんな感じ
```

今回、自分のポートフォリオ作成時に上記を使ったのでQiitaに投稿してみました
Hobby.where(user_id: User.where("nickname LIKE ?", "%#{value}%").pluck(:id))
→検索時の部分一致

###pluckメソッドの返り値
pluckメソッドの返り値は、配列です。
その為、pluckメソッドの後にメソッドチェーンを使って他のクエリメソッドを繋げることが出来ないので注意。

など、まだ他にも使い方はあります！
また似たようなメソッドにmapメソッドがあります。違いはいくつかあるのでまた調べます。
【Rails】ActiveRecord::RecordNotFound (Couldn't find Order without an ID)の対処法

<h2>症状</h2>
RailsAPIでメソッドを作成していたところ、以下のエラーメッセージが表示されてしまいました。
翻訳すると、「IDのないHogeが見つかりませんでした」

```ruby:error
Completed 404 Not Found in 1ms (ActiveRecord: 0.0ms | Allocations: 158)

ActiveRecord::RecordNotFound (Couldn't find Hoge without an ID)
```

メソッドにパラメータは以下です。

```ruby:parameter
Parameters: {"params"=>{"id"=>12}, "hoge_id"=>"12", "hoge"=>{}}
```

該当のメソッドは以下です。

```ruby:hoge.rb
class OrdersController < ApplicationController
  def update
    hoge= Hoge.find(params[:id])

    render json: {
      hoge: hoge
    }, status: :ok
  end
end
```



<h2>解決方法</h2>
パラメータを適切に受け取れるように、paramsの指定先を修正したら解決しました。
パラメータの受け取り方がよくなく、結果、DBにfindしようとしたときに、id指定ができていなかったため、「IDがないよ」と怒られていたようです。

```ruby:hoge.rb
class OrdersController < ApplicationController
  def update
    hoge= Hoge.find(params[:hoge_id])

    render json: {
      hoge: hoge
    }, status: :ok
  end
end
```

<h2>参考</h2>

https://qiita.com/Lancai/items/7253cc531485c70eb673
CHAP とは

## 勉強前イメージ

平文がなにかっていうプロトコルだったはず・・・
PAPとかも仲間

## 調査

### CHAP とは

Challenge-Handshake Authentication Protocol の略で
[PPP](https://qiita.com/miyuki_samitani/items/0f3fb4cb10e523ba3668#ppp-%E3%81%A8%E3%81%AF) などで利用される認証方式の一つで
ユーザ認証の際にパスワードをハッシュ関数を用いて送ることで漏洩を防止します。
ハッシュ関数を用いることをチャレンジ&レスポンス方式といいます。

### チャレンジ&レスポンス方式 とは？

はじめにサーバ → クライアントに `チャレンジ` と呼ばれる値を送信
受け取ったクライアントは チャレンジの値に パスワードを掛けて演算を行い、生成された `ハッシュ値` をレスポンスとして返します。

チャレンジとして送られてくる値は毎回変わるので、レスポンスの値もそれにより変わる。

### そういえばPAPってあった気もする

CHAPの仲間にPAPってあった気がするけどなんだっけ？
→
Password Authentication Protocol の略で、
PPPでの認証の際にパスワードを平文で送るため安全性が十分ではない。
最近ではCHAPを利用することが多い。

要するに、CHAPの平文版がPAPってことですね。


## 勉強後イメージ

そういえばそんな事やった気がする・・思い出した
CHAP → 平文じゃない
PAP → 平文 ってことですね

## 参考

- [CHAP](https://www.sophia-it.com/content/CHAP)
- [チャレンジ&レスポンス方式](https://www.sophia-it.com/content/%E3%83%81%E3%83%A3%E3%83%AC%E3%83%B3%E3%82%B8%26%E3%83%AC%E3%82%B9%E3%83%9D%E3%83%B3%E3%82%B9%E6%96%B9%E5%BC%8F)
WioLTE で温度湿度センサーを使う

![IMG_20210827_202817.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/07b2ee85-3fdd-3d45-98c3-0bc25b8a252f.jpeg)

こちらで ArduinoUno で行ったことを、WioLTE で行いました。
[ArduinoUno で温度湿度計を使う](https://qiita.com/ekzemplaro/items/c4dd042cec5344c9cd5f)

温度湿度計は
Temperature & Humidity Sensor pro v1.3 です。

```text:dht22_test/dht22_test.ino
// ---------------------------------------------------------------
/*
	dht22_test.ino

						Aug/28/2021
*/
// ---------------------------------------------------------------
#include "DHT.h"

#define DHTTYPE DHT22
#define DHTPIN 38 
DHT dht(DHTPIN, DHTTYPE);

int count = 0;
// ---------------------------------------------------------------
void setup()
{
	delay(1000);
	
	SerialUSB.println("Aug/28/2021 AM 10:00 ***");
}

// ---------------------------------------------------------------
void display_proc(float temp_hum[])
{
	SerialUSB.print("temperature = ");
	SerialUSB.print(temp_hum[1]);
	SerialUSB.print(" C  ");
	SerialUSB.print("humidity = ");
	SerialUSB.print(temp_hum[0]);
	SerialUSB.println(" %");
}
// ---------------------------------------------------------------
void loop()
{
	float temp_hum[2] = {0,0};

	SerialUSB.print("count = " + String(count) + "  ");

	if (!dht.readTempAndHumidity(temp_hum))
		{
		display_proc(temp_hum);
		}
	else
		{
		SerialUSB.println("ERROR! *** readTempAndHumidity ***");
		}

	delay(5000);

	count++;
}

// ---------------------------------------------------------------
```
Pythonパッケージ中にsymlinkを含めたい

Pythonパッケージ中にsymlinkを含めたいことがある。

現行の状況では、

- ファイルのsymlinkは実体がコピーされる
- ディレクトリのsymlinkはエラーを起こす(include_package_data)か無視される(package_data)

という状況。

どうしてもsymlinkのまま扱いたいことがあると思います。

https://github.com/pypa/pip/issues/5856 で議論されているように見えますが結論が見えない。

https://github.com/cielavenir/distutils_symlink_enabler ライブラリを作ってしまいました。

bdistは非対応ですが、build_pyとsdistであればこれで対応できます。

(ただしWindowsでは確認してません)
俺のO365テナントにPowerAutomateのアクション単位DLPがとうとう来た

# 3年近く待ってやっと搭載されたDLPの拡張
後述の通り、今とは違う形の初期のDLP拡張に関する情報から約3年経って、形が変わりアクション単位でのDLP設定という素晴らしい機能がようやく俺の個人契約しているO365テナントに展開されたことをたった今確認した。

# コネクタのアクションを個別に許可もしくはブロック設定することが出来る
注意点として、まだプレビューなので全コネクタがアクション単位の許可/NG設定可能なわけではない。
だが、おそらく要望の多いであろうコネクタから対応しているようで、アクションベースの管理をしたいと考えていたコネクタは結構対応している。
設定を開くには、DLPのコネクタグループ分け画面で以下のように設定を開ける
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239862/a81b53c7-2a18-db46-6caa-006a119b44bd.png)

例えばTwitterのアクション単位の許可設定画面はこんな感じ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239862/742c43ed-2bf7-6480-ac1e-c8e111793da4.png)

今まで出来なかった「Twitterの投稿は許可したくないけど、Twitterの情報は定期的に拾って社内に貯めたい」という許可設定が可能になる。
ちなみに個人用のOutlookコネクタもアクション単位の許可設定が可能になっている。
少し前まで個人用Outlookコネクタはブロックできないコネクタだったのでアクションベースの管理をしたかったのだが、今確認したらブロック出来るようになっていたのでもうアクションベースの許可設定は個人的にあまり需要はないが、出来るのは悪いことではない。

<strong>以降はただのポエムです。</strong>

# 初めての出会いは2019年
初出は2019年4月のrelease waveだったと記憶している。この頃はまだrelease waveという名前が付いておらず、2019年4月開始のプラットフォーム更新の一部だった。
この時発表された機能は「コネクタ間でのデータの流れる方向を管理できる」という説明がなされていた。
TwitterコネクタからSharepointコネクタへデータは流せるが、SharepointからTwitterへのデータは流せない、という管理が出来るようになるという話だった。
当時O365テナントを仕事で管理していたのでこの機能の情報を見たとたん、テンションが爆上がりした。
一刻も早くこの機能が欲しいと切実に思った。
それからずっと実装を待ったが、待てど暮らせど実装されず、ついにリリース計画からこっそり消える事となった。
始めてrelease waveという名前が付いた2019 release wave 2に再びその機能は「Data loss prevention policy enhancements」という項目で記載された。
延期は残念だが実装予定ならいいか、ということで引き続き機能の実装を待った。
が、再びこの機能は次のrelease waveへ持ち越しとなった。
この後ずっと延期に次ぐ延期となり、「もう実装されないのではないか？」と思った矢先、確か2020年だったか2021年初頭だったかうろ覚えだが、もう実装されることはないだろうと完全にあきらめていたこの機能が形を変え、「アクション単位での許可設定」という形で実装されると発表され、MS社内ビルドのO365テナントでの実際の操作画面まで公開された。
この時には既にO365のテナント管理の仕事から離れていたが、3年ちかくも待った機能がようやく実装されるということで、また俺のテンションは爆上がりした。
が、実際にテナントに展開されるのはまたしばらく待つことになった。
2021 release wave 1 の「Public Preview が2021年7月に開始」という情報もズルズル後ろにずれてまた次のrelease waveに持ち越されるのか、と嫌な記憶がフラッシュバックしたりもした。
そして今日、つい1か月ほど前にはまだ実装されてなかったので「これはまた延期かな？」と思いながらPowerPlatform Admin Centerを開いてDLP管理画面を確認したところ、アクション単位の許可設定が出来るようになっていた。
<strong>なので、狂喜乱舞してこのエントリを書いた。</strong>
ついでにコネクタの接続先のアドレス単位でのフィルタ機能も同時に実装されていた。
テナント単位でアドレスが変わるサービスの自社テナントだけ接続を許可、とかが出来る機能なのかな？
まだよく確認してないがこっちも素晴らしい機能だ。
ようやく、日本の大多数の企業にPowerAutomate（Desktopじゃない方）を安心してオススメ出来る土壌が整った。
いろいろ出来るが故に万人にオススメというわけにはいかないが、O365を契約すればデフォルトである程度使えるという意味で、このサービスを利用できれば生産性を向上できる企業はそれなりにあったと思う。
だが、自動で外部にメール送信できてしまうとか、特定のアクションだけの許可することが出来ないとかで、「みんなどんどん使おうよ！」といいづらいサービスでもあった。
これからも機能が拡充されていくだろうが、ようやく諸手を上げてオススメ出来るようになった。
ついこの間PowerAppsの設定不備でデータがどこからでも閲覧可能になっていた、というニュースもあったことだし、DLPが拡張されたことは素直に喜ばしいことだと思う。
あぁ、やっぱりO365触る仕事に戻りてぇなぁ。
こういう新機能の自社ビジネスへの影響を確認して、導入可否の検討して、導入時の設定考えて、社内での利用拡大を進めて業務効率化を目指していくってやりがいある仕事だと思う。
JIS鋼材DBの開発記録(0)


これからJIS鋼材DBの開発記録を日記のようにつけていこうと考える。
鋼材にはいくつかあるけど、まずは条鋼断面のインターフェイスを定義する。

```C#:IStructureSteelCrossSection.cs
    public interface IStructureSteelCrossSection
    {
        double CrossSectionArea();
        double CrossSectionRerimeter();
    }
```

CrossSectionAreaは鋼材断面積をcm2で返し
CrossSectionRerimeterは鋼材表面をcmで返す関数である。
これがcm2であるのは鉄鋼業界で面積はcm2だからである。
ネイティブモジュールを含む Python プロジェクトの開発イテレーションを改善したい

setup.py でビルドする + C/C++ ネイティブモジュールな Python プロジェクトがある.

動かすと不都合があるので .py をいじって修正して再度実行 -> おかしい -> print デバッグ -> ... みたいなイテレーションをする.

python ソースコードだけであれば, pip インストール先のファイルを直編集という手もあるが, ネイティブモジュール含んでいて, ネイティブモジュール部分を編集した場合ビルドしなおしが発生.

毎回 `python setup.py install` して動かして... とかだとめんどい.

## とりあえずの方法

`python setup.py build` でネイティブモジュールも含めビルド一式が `build/lib.linux-x86-64-.../` とします. ここにそこにパスを通して動かす.

```
# ビルドしなおす
(cd <repo>; python setup.py build)

export PYTHONPATH=<repo>/build/lib.linux-x86-64...:$PYTHONPATH
python mytest.py
```

.py など変えたら上記のようなスクリプトで毎回ビルドしなおしてから実行, みたいな感じになるでしょうか...

## TODO

* [ ] libtorch みたいにでかいプロジェクトだと再コンパイルも時間かかってめんどい. みんなどうしているのかしらね.
初心者による初心者のためのDiscord.py

## 前書き
この初心者による初心者のためのDiscord.pyでは、
Discord.pyを習得したいけどよく分からない！
という人のために、初心者が、初心者のための解説をしていきます。
書き方、使い方、構文などを記載していきます。
この記事を書こうと思った理由は、動くけど情報が古かったり、だいぶ昔に作成された記事がヒットしたりと、最近の記事が少なかったので、先駆者様への恩返しなども込めた記事となっております。
ちなみに初投稿です。至らない部分もあると思いますが、問題点などあれば教えて下さると幸いです。

対象:初心者(パソコンのタイピングができて、pythonを触ったことがある程度の人)

##基本構文
まず初めに、Discord.pyとは、Discord BotをPythonで動かすためのライブラリのことを指します。
まず、

```shell:ターミナル
# Windows環境
py -3 -m pip install discord.py
# その他
python3 -m pip install discord.py
```

でdiscord.pyをpythonで使えるようにインストールします。

では、次は実際にコードの例を見ていきましょう。

```python:main.py
import discord #Discord.pyをimport

client = discord.Client() #クライアントを定義。
token = "ここにdiscord tokenを貼り付ける"

#処理

client.run(token) #botを走らせる
```

と言った形です。これでとりあえずbotはオンラインになります。
では、次に実際に処理を書いていきましょう。

処理は、

```python:main.py
@client.event
async def 使いたいもの:
  #処理1
```

という構文で書いていきます。

例として、次のものは、!helloと発言した際に、こんにちは。と返すコードです。

```python:main.py
import discord

client = discord.Client()
token = ""

@client.event
async def on_message(message):
  if message.content == "!hello": #もしメッセージがhelloだったら
    await message.channel.send("こんにちは。") #こんにちはを送信
```

では、詳しい解説をしていきます。

```python:main.py
async def on_message(message):
```

このコードは、メッセージが送られてきた時に反応するという意味のコードです。
async defにはそれぞれ名前があるのですが、初心者がこれを最初から詰め込んでしまうと多分パンクしてしまうので、飛ばします。

```python:main.py
if message.content == "!hello":
```

このコードは、message.content(送信されたメッセージの内容。)が、もしも!helloと等しかったら(==という演算子。!=などもある。)処理を実行するというif文です。
このif文というのはよく使うので、覚えておきましょう。

```python:main.py
await message.channel.send("こんにちは。")
```

このコードは、message.channel.sendで、このメッセージが送信されたチャンネルに、こんにちはとメッセージを送信するコードです。
この message.channel.sendというのは、Discord.pyをする上ですごくよく使うコードなので、これも覚えておきましょう。

##よくやってしまう間違い
次に、よくやってしまう間違いを見ていきましょう。

```python:main.py
@client.event
async def on_message(message):
  #処理

@client.event
async def on_message(message):
  #処理2
```

のように、同じイベントを2つ書いてしまう人がめちゃくちゃ多いのですが、やめましょう。
どちらかが動きませんし、もし動いたとしても可読性が悪く、コードのバグが見つけにくいです。

次のよくある間違いは、

```python:main.py
@client.event
async def on_message(message):
      if message.content == "!hello":
await channel.send("こんにちは。")
```

はい。インデントエラーですね。
ここまで極端な例は無いと思いますが、もし動かなかったときのエラー文にindentという文字があったら、まっさきに確認しましょう。

次のよくある間違いは、

```python:main.py
@client.event
async def on_ready():
  channel = 定義
  await message.channel.send("起動しました！")
```

はい。この何がダメかと言うと、messageが定義されていないのに、message.channel.sendを使おうとしていますね。
これだとエラーを吐いてしまいます。
正しくは、channel.sendです。間違えないようにしましょう。
##最後に
ここまで読んでいただいてありがとうございます。
今回は構文を説明しただけですが、次回からはコードを動かすサーバーや、実用性のあるコードを記述していきます！
役に立った方は、LGTMやストックなどよろしくお願いします！
APNS のペイロードデータを struct にマッピングする

## TL;DR

```swift
struct APNSPayload: Decodable {
    struct APS: Decodable {
        struct Alert: Decodable {
            let title: String
            let body: String
        }

        let alert: Alert
        let badge: Int?
    }

    struct CustomField: Decodable {
        let hogeList: [String]
        let fuga: String?
    }

    let aps: APS
    let customField: CustomField?

    init(decoding userInfo: [AnyHashable: Any]) throws {
        let json = try JSONSerialization.data(withJSONObject: userInfo, options: [])

        // snake_caseをcamelCaseに変換する場合
        let decoder = JSONDecoder()
        decoder.keyDecodingStrategy = .convertFromSnakeCase

        self = try decoder.decode(APNSPayload.self, from: json)
    }
}

// {
//   "aps" : {
//     "alert" : {
//       "title" : "タイトル",
//       "body" : "本文",
//     },
//     "badge": 9,
//   },
//   "custom_field": {
//     "hoge_list": [
//       "piyo"
//     ]
//   }
// }
let payload: APNSPayload? = try? APNSPayload(decoding: userInfo)
```

## モチベーション

APNS のペイロードデータは REST APIのレスポンスと同様に JSON 形式で表現されるのですが、クライアント側での取得インターフェイスが

```swift
var userInfo: [AnyHashable : Any] { get }
```
https://developer.apple.com/documentation/usernotifications/unnotificationcontent/1649869-userinfo

となっているため、ペイロード中のカスタムデータを取得するとなると、

```swift
guard let aps = userInfo["custom_field"] as? NSDictionary,
      let hogeList = aps["hoge_list"] as? [String] else {
    return
}
```

のような　辛い実装が発生することがあります。

これを、よくある REST API のレスポンスモデルへのマッピングのような形で実装したいというのがモチベーションとなります。

## 概要

stack overflow の[Swift read userInfo of remote notification に対する回答](https://stackoverflow.com/a/62304666)そのままです。

`userInfo: [AnyHashable: Any]` 自体は JSON フォーマットを表現しているため、

1. `userInfo` を JSONObject として扱い、`JSONSerialization.data` で JSONData に変換
1. `JSONDecoder` で JSONData を元に `Decodable` へのデコードを試みる

という流れで、 `Decodable` に適合した `struct` へのマッピングを実現しています。

上述の例ではペイロードのキー名が snake_case で表現されている前提なのですが、実際には APNS ペイロードデータ内で利用されるキー名に応じて、 `Decodable` に適合する際に `enum CodingKeys: String, CodingKey` を用意する or プロパティ名の調整が必要となってきます。
（APNS標準のペイロードデータでは、 `content-available` のように kebab-case が利用されています。）

## 参考

https://stackoverflow.com/a/62304666
Firebase導入でCannot read property 'app' of undefined firebaseの対処方法

### 今まで普通に使えたFirebaseが急に使えなくなった！
原因はマジ意味不明！！！！

ただ、Firebaseのバージョンを見ると・・・・9だった・・・・・・・！
よくわからんエラーに悩まされるくらいなら！！！

```bash
$ npm install firebase@8.9.1
```

はい終わり。もう知らない。動けばいい。
ReactとAWSを使ったアプリ開発をやってみて


#　今週学んだこと
* React、React-Router-Dom、TypeScript型定義の復習
* 先週作ったauth0のエラー修正
* AWS(Amplify)を使ってのアプリケーション開発

#　学習の成果
###React、React-Router-Dom、TypeScript型定義の復習
ここでは、特にTypeScriptでの型定義が自分の中でなかなか理解するのが大変でした。
最初は、なんでわざわざ型を定義しなくちゃいけないのかよく分からず、今までコードを書いていて型なんてあまり意識していなかったし、逆に型を付けることによってエラーが出てしまったり、
必要性をあまり感じませんでした。
型をpropsで渡すときなど、VFCに型を付けて定義したり型用のファイルを作成してそこからimportして使ったりと、そこまでして型定義するものかなと不思議に思ってました。
しかし、使い続けていると段々と型を定義することにも慣れてきて、値を入力すると予測で出来てきくれるし（ここで出来きてくれるのが地味に嬉しかった）、なによりもコンポーネント間での渡し忘れを教えてくれるのが、コードを書き慣れていない私からしてみたらとても助かりました。
###先週作ったauth0のエラー修正
この学習では、初めてAPIサーバーを開発したり、Reactと連携させたりと学ぶことがとても多かったです。
そんな中、auth0のサービスを使ってユーザー認証機能を追加する際に、なぜか401エラーが出てしまいうまく機能しませんでした。
この時は先輩エンジニアの方が、エラー内容からエラー箇所の大体の場所を教えていただけたのでなんとか無事解決しましたが、これを一人で解決するには、まだまだ知識が足りず学習が必要だな思いました。
###AWS(Amplify)を使ってのアプリケーション開発
AWS Amplifyを使った開発でも初めて聞く単語なども多かったですが、前回NetlifyやHerokuなど色々なサービスを使っての開発だったのでそれなりに必要なコードなども多く、自分が今どこの実装をしているのか、エラーが出た際にどの場所でエラーが出ているのかを調べるのが、今の私にはかなり難しく大変でした。
でも、AWS AmplifyではAmplify Cliに従って進むだけで簡単に欲しい機能が実装できるし、何よりReactアプリ作成だけに専念でき、他は数行のコードだけで済むのが前回と比較するとあまりにも違いすぎて驚きました。

#今後学んでいきたいこと
Reactに関しては初めに比べたらかなり理解出来てきてるかなと感じるので、今後はアプリケーションを作っていく上で必要なReact以外の箇所にも力を注げたらいいかなと思います。
特に、今回学んだAWSではまだほんの一部の機能しか触っていないし、出て単語なども初めて聞くものも多かったので今後学習を進めていき理解を深めていけたらなと感じました。
CentOS 7 で Node.js(バイナリアーカイブ)を使えるようにする方法

# 環境
- Windows10 + Virtual Box + CentOS 7
- VScode + Remote-SSH

# ソース入手
下記のページからダウンロードする。今回は、Linux Binaries (x64) を選択。
[nodejs download page](https://nodejs.org/ja/download)
ダウンロードした node-v14.17.5-linux-x64.tar.xz を /root に移動
# 解凍と配置
    # tar -xJvf node-v14.17.5-linux-x64.tar.xz -C /usr/local/lib/
    # cd /usr/local/lib/
    # ln -s node-v14.17.5-linux-x64/ nodejs
# パスを通す
/etc/profile を編集してもよさそうだが、記述が煩雑になりそうだったので .bash_profile を編集することにする。

    # vi ~/.bash_profile
    ...
    PATH=$PATH:/usr/local/lib/nodejs/bin
    export PATH
    (ZZ)
    # source .bash_profile
    # node -v
    v14.17.5
上記の方法は、個別ユーザーごとに /home/[user]/.bash_profile の編集が必要。
# nodejs をバージョンアップする
目的のバージョンのバイナリアーカイブを入手して 解凍、/usr/local/lib/ に配置して、シンボリックリンクを張り替える。

    # cd /usr/local/lib/
    # rm nodejs ← rm nodejs/ 末尾にスラッシュがあるとリンク先まで削除してしまうので注意
    # ln -s node-[v14.17.5]-[linux-x64]

# 削除
パスの記述を削除する

    # vi ~/.bash_profile
    ...
    PATH=$PATH:/usr/local/lib/nodejs/bin ← この行を削除
    export PATH
    (ZZ)
    # source .bash_profile
ディレクトリを削除する

    # cd /usr/local/lib/
    # rm -rf node-v14.17.5-linux-x64
    # rm nodejs
# まとめ
シンボリックリンクは使える！（ネストしない限り）
Salesforce SOQL・SOSLの言語構文

https://developer.salesforce.com/docs/atlas.ja-jp.soql_sosl.meta/soql_sosl/sforce_api_calls_soql.htm

---------------------
Salesforce Object Query Language (SOQL)
- 使用場所
    - query() コールの queryString パラメータ
    - Apex ステートメント
    - Visualforce コントローラおよび getter メソッド
    - Salesforce CLI、または Visual Studio Code 向け Salesforce 拡張機能


---------------------
- 使用方法

```SELECT 【one or more fields 】
FROM 【an object】 
WHERE 【filter statements and, optionally, results are ordered 】
```


---------------------
- 使用Case
    - 1 つのオブジェクト、または相互に関連する複数のオブジェクトからデータを取得する。 关联数据
    - 指定された条件を満たすレコードを数える。  统计功能
    - クエリの一部として結果を並び替える。      排序
    - 数値、日付、またはチェックボックス項目からデータを取得する。


---------------------
単一引用符 (') およびバックスラッシュ (\) 文字は SOQL クエリで予約され

引用符で囲まれた文字列のエスケープシーケンス
https://developer.salesforce.com/docs/atlas.ja-jp.soql_sosl.meta/soql_sosl/sforce_api_calls_soql_select_quotedstringescapes.htm

AND、ASC、DESC、EXCLUDES、FIRST、FROM、GROUP、HAVING、IN、INCLUDES、LAST、LIKE、LIMIT、NOT、NULL、NULLS、OR、SELECT、WHERE、WITH


---------------------
SOQL SELECT の構文
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356407/21754c3c-594c-7335-6880-16ebf9032381.png)
https://developer.salesforce.com/docs/atlas.ja-jp.soql_sosl.meta/soql_sosl/sforce_api_calls_soql_select.htm

---------------------
リレーション名について
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356407/10555b37-65dd-c29b-780d-e6426d382709.png)

https://developer.salesforce.com/docs/atlas.ja-jp.soql_sosl.meta/soql_sosl/sforce_api_calls_soql_relationships_understanding.htm

---------------------
参照関係と外部結合
関連付けられた外部キー項目が null 値であってもレコードを返します。
```SELECT Id, CaseNumber, Account.Id, Account.Name
FROM Case
ORDER BY Account.Name
```
https://developer.salesforce.com/docs/atlas.ja-jp.soql_sosl.meta/soql_sosl/sforce_api_calls_soql_relationships_lookup.htm

---------------------
親子リレーションの識別


-----------------------
リレーション項目および多態的な項目について

-----------------------
リレーションクエリ制限について
https://developer.salesforce.com/docs/atlas.ja-jp.soql_sosl.meta/soql_sosl/sforce_api_calls_soql_relationships_query_limits.htm


-----------------------
履歴オブジェクトとリレーションクエリの使用
https://developer.salesforce.com/docs/atlas.ja-jp.soql_sosl.meta/soql_sosl/sforce_api_calls_soql_relationships_query_hist.htm
【初心者向け】MVCについて

#はじめに
私は、初めてMVCという言葉を耳にしたとき、なんだそれって思いました。
初めはそういう考え方があるんだなぐらい理解しておけばいいかと思います。

#MVCについて
MVCとは、アプリケーションの設計を整理するための概念で、機能ごとに「Model(モデル)」「View(ビュー)」「Controller(コントローラー)」という３つのチームに分けて、それぞれが連携することでアプリケーションの処理を進めていこうというような考え方です。
この３つのチームの頭文字をとってMVCと呼ばれています。

非常に簡単にですが、それぞれの役割は以下のとおりです。

#Model(モデル)
データベースにアクセスしてデータのやりとりを行うなど、データの管理を担当します。

#View(ビュー)
実際にユーザーが目にする部分、つまり画面表示部分を担当します。

#Controller(コントローラー)
モデルとビューを制御する役割を担う橋渡し役です。
具体的には、ビューから送られてきたリクエストを受け取り、モデルにデータベースからデータを取得するよう指示し、モデルから受け取ったデータをビューに渡すといった処理を行います。

#まとめ
現在、LaravelでWebアプリを作っているのですが、モデル・ビュー・コントローラーが絶妙に連携して処理を行っているので、概念だけを知っていた頃に比べてかなり具体的にイメージできるようになりました。
やはり実際に手を動かして作るというのは大事ですね。
サービス化したNode.jsアプリ自身にアップデート+再起動させる

## やりたいこと

- `winser` を使ってWindowsサービス化したNode.jsアプリケーションをバージョンアップして再起動したい
- プロセスマネージャとかコンテナとかを使わずにアプリケーション自身で上記を行う(トリガは開発者が行う)
- Node.jsのバージョンは12.xを使用

## やったこと

### 準備

更新が必要なファイルをリストアップした設定ファイルを作っておく。

```json:update.json
{
  "files": [
    "package.json",
    "index.js"
  ]
}
```

### バージョンアップ

1. [nodegit](https://www.nodegit.org/) を使って、Gitリポジトリにあるソースコードを一時フォルダにクローンする

    ```javascript:index.js
    const Git = require('nodegit').Clone;
    const TEMP_DIR = __dirname + '/temp;
    await Git.clone('path/to/repo', TEMP_DIR);
    ```

1. 一時フォルダにあるファイルから必要なファイルをコピーする( [fs-extra](https://www.npmjs.com/package/fs-extra) を使用 )

    ```javascript:index.js
    const files = require(TEMP_DIR + '/update.json').files;
    const fs = require('fs-extra');
    for (const file of files) {
        fs.copySync(TEMP_DIR + '/' + file, __dirname + '/' + file, {
            overwrite: true
        });
    }
    ```

### 再起動

1. サービスの停止と起動を実行するコマンドをバッチファイルにしておく

    ```bat:restart.bat
    call net stop %1
    call npm install
    call net start %1
    exit
    ```

2. `child_process` で再起動するためのコマンドを実行する。`start` コマンドを使ってさらに別のプロセスとしてサービスの停止～起動を実行するのがポイント

    ```javascript:index.js
    const { spawnSync } = require('child_process');
    const serviceName = require(__dirname + '/package.json').name;
    spawnSync('start', ['""', 'restart.bat', `"${serviceName}"`], {
        stdio: 'ignore',
        shell: true
    });
    ```
psコマンドの使い方

##経緯
過去仕事していた時に執筆していたもので、いつまでも下書きにあってもしょうがないのでアップすることにした記事
なのでメモ程度に見て下さい。

##psコマンドとは？
###現在動いているプロセスを表示するコマンド
linuxでは、yumやrpmを利用してパッケージをインストールします。
これらのパッケージの起動確認は個々にコマンドがあります。
（例えばrpm -qaやyum install -listなど）
しかし、yumやrpm以外を用いてインストールしたパッケージのプロセス確認（状態確認）は見ることが出来ません。
そこで、psコマンドの登場です。
psコマンドを利用しyumやrpm以外でインストールされたプログラムのプロセスを把握します。
コマンドの後に表示されるものの見方については参考資料のリンクを参照すること。

```
# ps
  PID TTY           TIME CMD
 1774 ttys000    0:00.12 -bash
 2523 ttys001    0:00.34 -bash
```

###オプション例
|option|説明|備考|
|---|---|---|
|a|操作端末のプロセスを表示する||
|x|操作端末以外のプロセスを表示する||
|r|今実行しているプロセスを表示する||
|c|実行しているコマンド名を表示する||
|e|実行しているコマンド名と環境変数を表示する||
|u|CPUやメモリの使用率なども表示する||
|h|項目名を表示しない||
|l|プロセスの状態なども表示する||
|f|プロセスを階層で表示する||
|o|指定したリスト順の出力形式で表示する||
|-u|プロセスを実行しているユーザーを指定する||
|-g|プロセスを実行しているグループを指定する||
|-p|実行プロセスのPIDを指定する||



##参考資料
[Linuxコマンド集$ps](https://eng-entrance.com/linux-command-ps)
[psコマンドで表示される内容について調べた](https://qiita.com/toshihirock/items/565fe71d778d3ee36b96)
【Lambda】AWSのLambdaの設定項目について調べてみた。

#はじめに
先日、業務でAWSのLambdaというサービスを使うことになり、
それについて色々調べてみました。

今回は、備忘としてLambda関数の設定項目に関する説明を記述していこうかなと思います。

##Lambdaとは

Lambdaとはどういったサービスなのか。
AWSの公式ページには以下のように記載されていました。

>AWS Lambda はサーバーレスコンピューティングサービスで、サーバーのプロビジョニングや管理、ワークロード対応のクラスタースケーリングロジックの作成、イベント統合の維持、ランタイムの管理を行わずにコードを実行できます

わざわざサーバを構築せずとも。色々なことを実行できますよー的な感じですね。

Lambda上に実行したい処理（プログラム）を定義することにより、
指定したタイミングで実行することができます。

Lambdaを利用して様々なことができる訳ですが、
どんなことが出来るかは各自で調べていただけると幸いです。。

##Lambdaの設定

本題のLambdaで設定できる内容について記載していこうと思います。
なお、本記事では関数の設定項目について記載しています。

###関数名
その名の通り、関数の名前を指定します。
半角英数字、ハイフン、アンダースコアのみを使用でき、スペースは使用できません。

###ランタイム
関数の記述に使用する言語を選択します。
コンソールコードエディタは Node.js、Python、および Ruby のみをサポートします。

###実行ロール
関数のアクセス権限を定義するロールを選択します。以下の3つから選択可能です。

・基本的な Lambda アクセス権限で新しいロールを作成
・既存のロールを使用する
・AWS ポリシーテンプレートから新しいロールを作成

###説明
関数の説明を入力することができます。

###メモリ
作成する関数には、設定したメモリに比例する CPU が割り当てられます。
メモリを 128 MB～10240 MB の間で設定します。

指定したメモリにより料金が変動します。デフォルトは128MBです。

###タイムアウト
関数が停止するまでに許可される実行時間。 
デフォルトは 3 秒です。 許容されている最大値は 900 秒 です。

###トリガー
トリガー設定を行うと別のサービス（API Gatewayなど）での、
イベントの発生をきっかけに処理を行うことができます。

###送信先
呼び出しレコードを別のサービスに送信するように Lambda を設定することもできます。Lambda は、非同期呼び出しに対して以下の送信先をサポートしています。

・Amazon SQS – 標準 SQS キュー。
・Amazon SNS – SNS トピック。
・AWS Lambda – Lambda 関数。
・Amazon EventBridge – EventBridge イベントバス。

呼び出しレコードには、JSON 形式のリクエストとレスポンスに関する詳細が含まれます。

処理に成功したイベント用と、
すべての処理試行に失敗したイベント用に別々の送信先を設定できます。

###環境変数

環境変数を使用すると、コードを更新せずに関数の動作を調整できます。
環境変数は、関数のバージョン固有の設定に保存される文字列のペアです。

###タグ
タグは、AWS リソースに割り当てるラベルです。
各タグは、キーとオプションの値で構成されます。

タグを使用して、リソースを検索およびフィルタリングしたり、
AWS コストを追跡したりできます。

###同時実行
Lambdaを１秒間に同時実行することができる回数を指定します。
デフォルトは１０００回になっています。

例えば、同時実行が１００だとします。
３秒かかる処理を１秒ごとに５０回実行したとすると、以下のようになります。

１秒目：同時実行数は、５０回
２秒目：１秒目に実行された５０回＋２秒目から実行された５０回
３秒目：１秒目に実行された５０回＋２秒目から実行された５０回＋３秒目からの５０回

こと時、２秒目までは同時実行数１００回でも足りますが、
３秒目には１秒間１５０回の要求が来ているため、エラーが返されます。

###コード書名
コード署名を使用して、未検証コードのデプロイを制限します。
コード署名プロファイルを作成するには、次を参照してください。

###イベントの最大有効期間（非同期処理）
未処理のイベントをキューに保持する最大時間。

###再試行（非同期処理）
関数がエラーを返すときに再試行する最大回数。

###デッドレターキューサービス（非同期処理）
非同期呼び出しから Amazon SQS キューまたは Amazon SNS トピックに未処理のイベントを送信できます。

#さいごに

以上になります。

もう少し設定項目はありそうでしたが、
今回は考慮する必要がない設定項目だったので記載しておりません。。。

もし気が向いたら追記しておこうと思います。

いつかは、LambdaからDynamoDBにデータを書き込むまでの記事を作成したいな。
もしよかったらそちらもご覧ください。
【Draft.js】ContentState

# ContentStateとは
- Editor内の文章全体の情報を持つ
- 大きく以下の２つの要素に分けられる
  - ContentBlock
  - Entity

## ContentBlock
  - HTMLのブロック要素に対応する要素
  - 以下の情報が格納されている
    - プレーンテキスト
    - テキストの装飾情報

※ `ContentBlock` の詳細は [こちらの記事](https://qiita.com/y-hira18/items/d0449b6370abc617e8a6) に記載

## Entity
  - テキストや装飾情報以外の補足情報が格納されている  
  **（例）** `a` タグの `href` に渡すurl

※ `Entity` の詳細は [こちらの記事](https://qiita.com/y-hira18/items/796048296a15e9d8f4d9) に記載
１つのインスタンスに対して複数クライアントからssh公開鍵認証する際の流れ

# はじめに
OS:m1mac

複数のpcを使用していて、仮想マシンの１つのインスタンスに対してそれぞれssh接続したい時があります。その際に新しく公開鍵と秘密鍵を作成するのではなく、秘密鍵を持ってきて使用したいpcに適応させる方法の流れを書いておきます。
# 流れ
### ①まずは元々生成してある秘密鍵を確認する（pc-A）
```
-----BEGIN OPENSSH PRIVATE KEY-----
(長い文字と数字の羅列)
-----END OPENSSH PRIVATE KEY-----
```
### ②これを丸々コピーして、何らかの方法を用いて新たにssh接続したいpc（pc-B）にデータを移す
### ③秘密鍵を置いておくファイルを生成
```
touch ~/.ssh/id_rsa
```
### ④エディタで開き、②でコピーしてきた秘密鍵を丸々ペースト
### ⑤以下のコマンドを実行
ファイルのパーミッション設定を変更します。

```
chmod 600 ~/.ssh/id_rsa
```
### ⑥無事、インスタンスに接続できました、めでたしめでたし
```terminal
ssh (ユーザ名)@(外部IP)
```
RoR faraday/options.rb:166: warning 対策の例

こういうエラー

```
vendor/bundle/ruby/2.7.0/gems/faraday-0.15.4/lib/faraday/options.rb:166: 
warning: Capturing the given block using Proc.new is deprecated; use `&block` instead

```

環境変数で対応できる

```
export RUBYOPT=-W0
```
jqコマンドで必要な項目のみ取得してjsonを作成する



こんなJSONの中から特定のキーだけ取得したJSONを再作成する

```sample.json
{
    "userList": [
        {
            "userID": 1,
            "nickname": "taro",
            "height": 175.7,
            "_disabled": false
        },
        {
            "userID": 3,
            "nickname": "hanoko",
            "_disabled": false
        },
        {
            "userID": 4,
            "nickname": "momoko",
            "weight": 45,
            "_disabled": true
        }
    ]
}
```

userIDと_disabledだけ取得

```cmm
$ cat sample.json | jq -r '{userList: [.userList[] | { userID: .userID, _disabled: ._disabled}]}'
{
  "userList": [
    {
      "userID": 1,
      "_disabled": false
    },
    {
      "userID": 3,
      "_disabled": false
    },
    {
      "userID": 4,
      "_disabled": true
    }
  ]
}
  
```
線形回帰モデル vol.2 

#前回記事
https://qiita.com/yudaiyamashita/items/48295fc8b23019289d39

# 参考本

多変量解析入門　小西貞則著　岩波書店

#最小2乗推定量の性質
$\hat{\boldsymbol \beta}$は予測値ベクトル、$\boldsymbol \beta$は回帰係数ベクトル、さらに$\boldsymbol y = X \boldsymbol \beta + \boldsymbol \epsilon$としよう。
$E[\boldsymbol y]= E[X\boldsymbol \beta + \epsilon]= E[X\boldsymbol \beta] + E[\epsilon]= X\boldsymbol \beta$
$$E[({\boldsymbol y} -  X \boldsymbol \beta)({\boldsymbol y} -  X\boldsymbol \beta)^T]= E[\boldsymbol \epsilon \boldsymbol \epsilon^T]=\sigma^2I$$
となる.
以下の通りに定義できる。(vol.1を参照。)
$\hat{\boldsymbol \beta} = X(X^{T}X)^{-1}X^{T} \boldsymbol \beta$

$E[\hat{\boldsymbol \beta}]=X(X^{T}X)^{-1}X^{T}E[\boldsymbol \beta]$

分散共分散行列を指す変換$\rm{cov}$について
$$\rm{cov}(\boldsymbol \beta)=E[(\hat{\boldsymbol \beta} -  \boldsymbol \beta)(\hat{\boldsymbol \beta} -  \boldsymbol \beta)^T]= (X^{T}X)^{-1}X^{T}E[(\boldsymbol y - X\boldsymbol \beta)(\boldsymbol y - X\boldsymbol \beta)^T X(X^{T}X)^{-1}= \sigma^2(X^TX)^{-1}$$

※途中で転置をとったことに注意。また(X^{T}X)は対称行列。

最小2乗推定量$ \hat{\boldsymbol　\beta}$の期待値は、推定しようとするパラメータである回帰係数ベクトル$\boldsymbol \beta$に等しい。
こういった$\hat{\boldsymbol \beta}$を$\boldsymbol \beta$の不偏推定量である、という。

一般に、確率ベクトル$\boldsymbol y$の線形結合で表される任意の不偏推定量を$\hat{\boldsymbol \beta} = C\boldsymbol y$, $C$は定数行列(正方行列とは限らない)とする。最小2乗推定量は、$C=(X^TX)^{-1}X^T$とした推定量であった。

最小2乗推定量は、変動が最も小さいことが以下の定理によって保障されている。 


#ガウス・マルコフの定理

任意の線形不偏推定量$\tilde{\boldsymbol \beta}$、要は$\boldsymbol \beta$の線形変換に対して

$$\rm{cov}(\tilde{\boldsymbol \beta}) \geq \rm{cov}(\hat{\boldsymbol \beta}) $$

が成立する. 

何やら仰々しく感じるかもしれないが、多次元だろうが誤差ベクトルの$L^2$ノルム（高校課程のベクトルの長さ）が一番小さくなるように$\hat{\boldsymbol \beta}$を設定することができる、ということである。

# 解説
行列の大小は正方行列$A$, $B$に対して
$$A-B$$が非負値定符号行列(semi-positive definite (value) matrix)である、とは

2次形式のトピックであるが、以下の通りである.

正方行列のサイズを$n$として次元$n$である任意のベクトル$\boldsymbol x$に対し

$$\boldsymbol x^T(A-B)\boldsymbol x \geq 0 \Rightarrow A \geq B$$

例えば
$x^2+y^2$の,　ベクトルを
$\boldsymbol a = \begin{pmatrix}x \\\ y \end{pmatrix}$, 
計量行列は
$M= \begin{pmatrix}1 & 0 \\\ 0 & 1 \end{pmatrix}$
とすれば、

$\boldsymbol a^T M \boldsymbol a$と表示でき、実数上、$(0, 0)$以外では0より大きい。こういったケースの行列を正定値であるといい、$(0, 0)$以外では0以上であることを半正定値、もしくは非負値の行列であるという。負定値、半負定値も同様に定義できる（例、終わり）

証明は佐和（1979, p63）,東京大学教養学部統計学教室編を参照のこと。

vol.3に続く。

https://qiita.com/yudaiyamashita/items/55dcd075d4d8965c0932
【Unity】Unity-QuickSheetを使ってxlsxファイルのデータをScriptableObjectに変換する

#表題
今開発中のゲームが錬金術系のRPGということで、アイテムデータの管理について検討していたところ、ScriptableObjectという便利機能を見つけました。これは便利！


▼神サイト様☺

https://kan-kikuchi.hatenablog.com/entry/What%27s_Scriptableobject#%E4%BD%BF%E3%81%84%E6%96%B9


続いて外部ファイルにまとめたアイテムデータをプロジェクトに読み込む方法を検索したところ、①Unity-Excel-Importer②Unity-QuickSheetという２つの方法を見つけました。


▼神サイト様☺

https://kan-kikuchi.hatenablog.com/entry/ExcelImporter_QuickSheet#Unity-QuickSheet%E3%81%AE%E4%BD%BF%E3%81%84%E6%96%B9%E3%82%B9%E3%83%97%E3%83%AC%E3%83%83%E3%83%89%E3%82%B7%E3%83%BC%E3%83%88%E3%81%8B%E3%82%89%E3%83%80%E3%82%A6%E3%83%B3%E3%83%AD%E3%83%BC%E3%83%89%E3%81%97%E3%81%A6%E3%81%8F%E3%82%8B%E5%A0%B4%E5%90%88


なんと自動でScriptableObjectに変換してくれるとか・・・便利。
私の場合はアイテムのステータスをenum（列挙型）で管理したかったので、Unity-QuickSheetを利用してアイテムデータを読み込むことにしました。

- Googleスプレッドシート
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1384531/d34b0b39-f50e-bc75-2449-c75e81a64a65.png)
- ScriptableObjectのインスペクター
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1384531/fa65a552-7d59-3b89-7986-f212ec5e1a7d.png)

なんて便利なんだ・・・


#アセンブリの重複エラー
Unity-QuickSheetをプロジェクトに追加した際に「Newtonsoft.Json」が重複しているというエラーが出てきました。

- 「Assets/QuickSheet/GDataPlugin/Editor/Google/Newtonsoft.Json.dll」の削除
- 「ProjectSetting/Player/OtherSettings」にあるAssembly Version Validationのチェックを外す

以上の方法で解決できました、良かったです😌