OmniAICreator/Qiita-1.07M huggingface dataset:
使ったことない人向けのAzure用語

どうも。
Azureがあまりにも意識の高い言葉を使うので、ぼくみたいな情弱でもわかるように翻訳してみました。
自分はAzure初心者なので、間違っている可能性大です。遠慮なく編集リクエストを送ってください。

## サービスプリシンパル

アプリケーション登録したときにもらえます。
Ansibleや自作のツールから、Azureを操作（VMの作成とか）するときに必要です。

中身は3つの情報があります。
一つがアプリケーションID。
もう一つはアプリケーションシークレット。
最後がテナント。

## テナント

>テナントとは、Azure や Office 365 などの Microsoft クラウド サービスに組織がサインアップしたときに、その組織専用に与えられる Azure AD ディレクトリのインスタンスです。

よく意味がわかりませんが、つまりは組織を認識するIDらしいです。つまり、Azureを契約している会社や団体一つ一つにあるんですかね。

## サブスクリプション

請求単位、らしいです。
大きな会社だと、複数のサブスクリプションがあり、課金が必要な操作（VM追加とか）をする場合にはどのサブスクリプションで実行するか選びます。

サブスクリプションごとに、引き落とされる口座や金額の確認、領収書、割引などをわけられます。

「極論で言えば、どいつの懐から引き落とすか」を選べます。

## リソースグループ

VMとかネットワークなどをまとめる単位です。
プロジェクトごと、部門ごとなど、組織によって使い方はさまざまだと思います。
ただ、リソースグループをまたいでの通信・構成は一切できません。

## ネットワークセキュリティグループ(NSG)

すごいファイアウォールです。
どのポート向けのパケットを通すか、どのアドレスだと弾くか、みたいなことを設定できます。
また、NSGは、「VMのNIC」、「仮想マシン自体」、「ネットワークのサブネット」の3つの好きなところに設置できます。
従来のiptablesやネットワークスイッチでやることを、全部ファイアウォールという概念で済ませるようにしたものですね。

## ストレージアカウント（ストレージ）

Amazon S3みたいなやつです。BLOB的なオブジェクトストレージとして使ったり、nosqlやメッセージキューをぶち込む機能があります。

### ストレージアカウント種類

ストレージアカウントには種類があります。

- Blobストレージアカウント： ブロックBlob専用のストレージアカウント
- GPv1アカウント（汎用v1）： Blob,File,Queue,Tableのすべてを使えるストレージアカウント
- GPv2アカウント（汎用v2）： GPv1に加え、クールストレージ、アーカイブストレージといった層の選択が使えるようになります。

現在のAzureでは、GPv2への移行が進められているようです。今BlobストレージアカウントやGPv1アカウントを使う意味はないそうです。価格もGPv2が安いとのこと。

### 扱えるデータの種類

さきほど紹介した、BlobやFileなどの用語の説明です。GPv2のストレージアカウントではこれらすべてを使用できます。

- Blob Storage： Blobオブジェクトを保存する用。
- File Storage： ファイル保存用。sambaでアクセスできる共有ディスク。NASみたいなもの）
- Queue Storage： メッセージキュー。アプリケーション間通信に使用されるあれです）
- Table Storage： NoSQLのような、キーバリュー型の保管ができる

また、Blob Storageにはさらに2つの種類があります。

- ページBlob： データが超頻繁に読み書きされるものに向いているらしいです。後述するVMのディスクはこのページBlobに保管されるようです。
- ブロックBlob： 1つのデータは細かく分割されて分散保管されるようです。画像とか静的ファイルみたいな、読み取られることが多いデータに向いているとのこと。
- 追加Blob： だんだん増えていくデータが多いデータに向いているとのこと。

### ストレージ層

ストレージアカウント全体や、個別のBlob Storageの中のBlobごとに、ストレージ層というものを選択できます。
層ごとに、アクセス速度や料金が違うようです。

- ホットストレージ層： 頻繁にアクセスされるような普通のデータ向けです。
- クールストレージ層： 30日以上更新されないデータ向けです。
- アーカイブストレージ層： 180日以上更新されないデータ向けです。これはBlob単体にのみ適用でき、ストレージアカウント全体には適用できないとのこと。また読み出しには最大15時間ほどかかるらしいです（！）

GPv1は、ストレージ層を選択する機能がなく、すべてがホットストレージ層扱いになるようです。

### データ冗長オプション

- LRS（ローカル冗長ストレージ）： 1つのデータセンターで冗長化される
- ZRS（ゾーン冗長ストレージ）： 複数のデータセンターで(ry
- GRS（Geo冗長ストレージ）：複数のリージョンで(ry
- RA GRS（読み取りアクセスの Geo 冗長ストレージ）： GRSで、複数のリージョンで同時にreadできるようにして速度あげるバージョン（raid 1的な）

さらに、速度が2つの種類があります。

- Standard： HDD並のアクセス速度
- Premium： SSD並のアクセス速度

現状、Premiumを使えるのはLRSだけのようです。

## ディスク

VMに後から追加できるディスクです。HDDかSSDかを選ぶことができ、VMからは/dev/sdb、/dev/sdcのように認識されます。
ディスク自体は、vhdファイルになっており、ストレージアカウントのBLOB Storageにオブジェクトとして保管されています。
そのため、VMに追加ディスクを追加する場合には、追加ディスクをどのストレージアカウントにおいておくか選ぶ必要があります。

### 種類

- 非管理対象ディスク： 従来のディスク。先程の説明のように、ストレージアカウントを指定してその中にvhdファイルができる。
- 管理ディスク（Manage Disk）： 最新のディスク。ストレージアカウントを作成・指定しなくていい。

ストレージアカウントの作成や理解は結構めんどくさいため、ディスクは全部管理ディスクにして問題ないです。
Azure側も徐々に非管理ディスクを管理ディスクにすることを推奨しているよう。
Animate CCのシンボルをGIFアニメーションに書き出す

webでSWFは使いにくくなりました。代わって、GIFアニメーションは手軽に見せられることで復権しているようです。Animate CCからはGIFアニメーションも書き出せます。ただし、[ライブラリ]のシンボルからじかにつくることはできません(図001)。GIFアニメーションは、メインタイムラインから書き出さなければならないのです。本稿はそのやり方をかいつまんでご紹介します。

####図001■[ライブラリ]のシンボルから書き出し
![1802002_001.png](https://qiita-image-store.s3.amazonaws.com/0/128949/99c7247e-bb69-d016-f67d-69a27468a907.png)

#レイヤーを新規ドキュメントにコピーする
手順として、まずシンボルのレイヤーを、新規ドキュメントにコピーします。シンボルを開いた編集モードで、タイムラインから使うレイヤーを選び、右クリックで[レイヤーをコピー]します(図002)。

####図002■シンボルの編集でレイヤーを選んで[レイヤーをコピー]
![1802002_002.png](https://qiita-image-store.s3.amazonaws.com/0/128949/e89d3612-2dcb-46c3-4073-3e7ba280807e.png)

つぎに、新規ドキュメントを開きます。メインタイムラインのレイヤーを選んだら、[レイヤーをペースト]します(図003)。

####図003■新規ドキュメントのメインタイムラインに[レイヤーをペースト]
![1802002_003.png](https://qiita-image-store.s3.amazonaws.com/0/128949/71b9f89c-2de8-4a4a-d02f-495dcccba9e7.png)

シンボルの基準点がステージの左上角にペーストされますので、アニメーションがステージからはみだすかもしれません。不安になっても、**ここは気にしない**ようにしましょう(図004)。

####図004■ペーストされた位置は気にしない
![1802002_004.png](https://qiita-image-store.s3.amazonaws.com/0/128949/df156f69-a8af-9770-787a-8a7ec693ed6b.png)

#アニメーションGIFを書き出す
[ファイル]メニューの[書き出し]から、[アニメーションGIFを書き出し」を選びます。ダイアログボックスの[ステージにクリップ]のチェックを外せば、ステージにかかわりなくシンボルの領域が認識されるはずです(図005)。そのほかの画像の設定を済ませたら、[保存]ボタンでGIFアニメーションファイルがつくれます。

####図005■[ステージにクリップ]のチェックを外す
![1802002_005.fw.png](https://qiita-image-store.s3.amazonaws.com/0/128949/09a70002-5ddf-fef2-8d82-f8cacdefcbf1.png)

これでGIFアニメーションのでき上がりです(図006)。

####図006■でき上がったGIFアニメーション
![pen.gif](https://qiita-image-store.s3.amazonaws.com/0/128949/63369c52-56d8-9ada-fd24-583f2912fda6.gif)
【TeX】私にはベクトル表記を楽にする方法のない人生なんて考えられない

#はじめに
ベクトルを表す表記として、文字の上に矢印をつける方法と文字を太字にしてさらに斜体にする方法があります。TeXでこれらを表現する場合、前者は`\vec{ベクトルにしたい文字}`とすればよいので簡単ですが、後者は方法を知らないと意外と面倒です。

そこで、今回は太字かつ斜体で文字を楽に表記する方法を紹介したいと思います。

*200128追記*
(@fr0077 さんからも[コメント](https://qiita.com/rebi/items/e4bf51eb94864c9e6cea#comment-d250e83e0e6198aeaeb4)にて情報提供いただいたので、こちらもご参照ください。)

#方法

結論としては`\mbox{\boldmath ＄ベクトル表記にしたい文字＄}`とすれば太字かつ斜体で文字を表示することができます。しかし、文章中で何度もベクトル表記をする場合、いちいちこのコマンドを書くのは面倒です。

そこであらかじめコマンドを定義しておくことで、楽に記述することができます。

具体的に説明すると、TeXで文章を書く際は例えば以下のように

```TeX:example.tex
\documentclass[a4paper]{jsarticle}

%例なので\usepackage{}は省略

\begin{document}

%本文を書く

\end{documet}
```

として書き始めると思いますが、\documentclassと\begin{document}の間に以下のように書くことで事前にコマンドを定義しておくことができます。

```TeX:vector.tex
\documentclass[a4paper]{jsarticle}

%例なので\usepackage{}は省略

%↓新しくこの一行を加えた
\newcommand{\bvec}[1]{\mbox{\boldmath $#1$}}

\begin{document}

%本文を書く

\end{documet}
```

このように新たに一行加えることで、`\bvec`というコマンドを定義することができます。

そのため、数式中で`\bvec{(ベクトルにしたいもの)}`とすることでベクトル表記にすることができます。

実際に[TeXclip](https://texclip.marutank.net/)で試してみます。TeXclip上で

```text:example.txt
\newcommand{\bvec}[1]{\mbox{\boldmath $#1$}}

\begin{displaymath}
m\bvec{a}=\bvec{F}
\end{displaymath}
```

と入力すると以下のようになります。

![texclip20180219211040.png](https://qiita-image-store.s3.amazonaws.com/0/239294/11596c26-aa93-bd5e-5cc9-df9d26a8d436.png)

実際に新たに定義した`\bvec`というコマンドが作用し、ベクトル表記になっていることがわかるかと思います。

#まとめ

ベクトル表記にするために、太字かつ斜体で文字を表記するには

`\mbox{\boldmath ＄ベクトル表記にしたい文字＄}`

とすればよいのでうが、何度も表記する場合には面倒です。

そこで、

```text:newcomand.txt
\newcommand{\bvec}[1]{\mbox{\boldmath $#1$}}
```

と新たに定義すれば`\bvec{}`とするだけで楽に書くことができます。

#あとがき

この度は貴重な時間を割いて読んでいただき誠にありがとうございました。

最近ようやく修論が一段落したので、これを機会にアウトプットを始めていきたいと思い、投稿を始めてみました。少しでもお役に立つことができたなら幸いです。

当面は私が研究で主に使っていたTeXとMathematicaに関する投稿が中心になるかと思います。よろしくお願いします。
Javascriptの配列のソートは同じ値の順番は保証されない

> https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/sort
> このソートは stable ではありません(訳注:同じ位の値の順番が保証されません)。

Javascriptのsort関数は、ブラウザごとの実装がそれぞれ異なっているようで、
比較関数をちゃんと書かないと、同じコードでも違った出力となってしまう（！）

## NG example 1

```javascript
var array = [{ id: 0, value: 2 }, { id: 1, value: 1 }, { id: 2, value: 1 }] 
var compareFunc = function(a, b) {
  return a.value > b.value ? 1 : -1
}

array.sort(compareFunc)

// chrome firefox
// array = [{ id: 1, value: 1 }, { id: 2, value: 1 }, { id: 0, value: 2 }]

// safari
// array = [{ id: 2, value: 1 }, { id: 1, value: 1 }, { id: 0, value: 2 }]
```

## NG example 2
```javascript
var array = [{ id: 0, value: 2 }, { id: 1, value: 1 }, { id: 2, value: 1 }] 
var compareFunc = function(a, b) {
  return a.value >= b.value ? 1 : -1
}

array.sort(compareFunc)

// chrome firefox
// array = [{ id: 2, value: 1 }, { id: 1, value: 1 }, { id: 0, value: 2 }]

// safari
// array = [{ id: 1, value: 1 }, { id: 2, value: 1 }, { id: 0, value: 2 }]
```

## OK example
```javascript
var array = [{ id: 0, value: 2 }, { id: 1, value: 1 }, { id: 2, value: 1 }] 
var compareFunc = function(a, b) {
  if (a.value > b.value) return 1
  if (a.value < b.value) return -1
  return 0
}

array.sort(compareFunc)

// chrome firefox
// array = [{ id: 1, value: 1 }, { id: 2, value: 1 }, { id: 0, value: 2 }]

// safari
// array = [{ id: 1, value: 1 }, { id: 2, value: 1 }, { id: 0, value: 2 }]
```

比較関数で、「return 0」をちゃんと定義すると主要なブラウザでは、
値が同じ時の順番は元の配列の順番を保持してくれるようです。

このArray.prototype.sort関数に関しては、
mochaなどのテスティングフレームワークのテストは通っていても、
ブラウザでは挙動が違うということもあるので要注意です。
KUSANAGI に Zabbix 3.4 を yum でインストールする方法

最近Zabbixを構築する必要にかられて色々調べたところ、KUSANAGI で Zabbix を構築するのが便利そうだったので採用することにしました。

ただ、最新の 3.4 をインストールするにあたり依存関係とかで結構ハマったのでうまくいった方法を書き残しておきます。

# 参考資料

[Download Zabbix](https://www.zabbix.com/download)  
[Zabbix Server を入れてみる(kusanagi 8.0編) – わが愛とSolarisの日々](https://www.myzkstr.com/archives/613)

上記を参考にしつつ、多少工程を追加すればできました。

# 作業工程
追加した工程は下記の通り。

- Zabbix リポジトリの登録で ```rpm -i``` ではなく ```rpm -Uvh``` を使う
- Zabbix をインストールする前に Zabbix リポジトリの優先順位を上げる

これだけです。

これをしないともともと KUSANAGI によって用意されている方のリポジトリが使われてしまい、3 系のバージョンがインストールされます。

あとは2番めの参考記事のとおりに登録していくと無事に Zabbix 3.4 が動き出します。
Railsで各ユーザーメッセージ機能を作りたい（作成中）

##ここまでの概要

https://qiita.com/jnchito/items/aec75fab42804287d71b
https://qiita.com/Hijiri-K/items/c3774c72a2cb68e1a720

二つを参考してログインなしメッセージ機能をできた。

##これからしたいこと
　各ユーザー同士が、DM機能みたい個別にやりとりする機能をつくりたい

###参考記事

情報をたくさん集めました。

https://qiita.com/Hijiri-K/items/7e3c018c8330f69fc4cf#_reference-def83613c821d82e0f08
Action Cableでリアルタイムチャットアプリの作成方法 （Rails 5.1.4にて）（その2）グループ別チャンネルの作成！！

https://qiita.com/YN6127yn/items/7ddd966141cca195b4da
Ruby on Rails チュートリアル 機能拡張5(メッセージ機能)

https://qiita.com/kohei1228/items/7aed5aad9c63e834c0e1
Rails 5 Action Cable メッセージとルームを紐付ける。

https://railsguides.jp/action_cable_overview.html
 Railsガイド


###考察
　自分なりにメッセージ機能作りやり方の仮説を立てました。

####仮説①
　 room modelが必要　３つモデルの関連づけが必要

Userモデル、messagesモデル、roomモデル

roomモデルは、メッセージを管理するモデルで二人のuser_idを入れる

####仮説②
　actioncable機能は、Railsガイドhttps://railsguides.jp/action_cable_overview.htmlを参考する。

読んでみたけど、よくわからない

####仮説③coffeescriptの知識が必要

coffeescriptとは、javaScript に比べ 1/3 程度の行数が削減できる言語のことです。

自分は、ドットインストールのcoffeescriptをやってみました。

https://dotinstall.com/lessons/basic_coffeescript_v2
IBM Cloud（旧Bluemix）と Pepper を連携する

#IBM Cloud（旧Bluemix）と Pepper を連携する

IBM Cloudの Node-RED と Pepper を連携させるが記されています。

・IBM Blluemix を Pepper とつないでみよう
https://www.slideshare.net/TakujiKawata/ibm-blluemix-pepper

・pepper サンプルアプリ
https://github.com/Smartrobotics/pepper_samples/
[Git] Fix massive conflict files with command

```sh
git status | grep both | awk -F ' ' '{printf "%s\n", $3}' | xargs -J % git checkout --ours %
```

Explanation:

`git status`
List changed files

`grep both`
Pick up conflict files.

`awk -F ' ' '{printf "%s\n", $3}'`
Get the file names. The third column separated with space.

`xargs -J % git checkout --ours %`
For each file check out ours.
AzureとかAWSてナニ？

#AzureとかAWSてナニ？

汎用パブリッククラウドサービスです。
いろんなサービスがあり、いろんなコトができます。

・Microsoft Azure
https://azure.microsoft.com/
https://azure.microsoft.com/ja-jp/services/
13のカテゴリ、168のサービス（2018/2/19時点）

・Amazon Web Services
https://aws.amazon.com/
https://aws.amazon.com/jp/products/
21のカテゴリ、140のサービス（2018/2/19時点）

・IBM Cloud（旧 Bluemix）
https://www.ibm.com/cloud-computing/
https://console.bluemix.net/catalog/
20のカテゴリ、多数のサービス（2018/2/19時点）

多すぎて、ナンノコッチャーƪ(•̃͡ε•̃͡)∫

##たとえばどんなコトができる？
以下のリンク先はMicrosoftのページですが、出来るコトと、AzureとAWSの対比がまとめられています。

・AWS サービスと Azure サービスの比較
https://docs.microsoft.com/ja-jp/azure/architecture/aws-professional/services

わかりやすいけど、まだ多すぎて、ナンノコッチャーƪ(•̃͡ε•̃͡)∫

##コンピューティング
###サーバを数分で作成することができます。
Windowsサーバや、Linuxサーバを数分で調達することができます。
OSの管理権限が払い出され、OS層以上を構築できます。

・Azure（Virtual Machines）
https://azure.microsoft.com/ja-jp/services/virtual-machines/
・AWS（Amazon EC2）
https://aws.amazon.com/jp/ec2/


##データベース
数分でデータベース環境を調達できます。

###リレーショナル データベースを数分で作成することができます。
MySQL、PostgreSQL、SQL Serverのようなリレーショナル データベースを数分で調達できます。

・AWS（Amazon Relational Database Service (RDS)）
https://aws.amazon.com/jp/rds/
・Azure（Azure Database for MySQL プレビュー）
https://azure.microsoft.com/ja-jp/services/mysql/
・Azure（Azure Database for PostgreSQL プレビュー）
https://azure.microsoft.com/ja-jp/services/postgresql/


###非リレーショナル データ ストアを数分で作成することができます。
NoSQL環境をを数分で作成することができます。

・Azure（Table Storage）
https://azure.microsoft.com/ja-jp/services/storage/tables/

でも、データ格納先は kintone が使いやすいでしょう。

##ストレージ
ファイル置場。API経由で操作します。
UNCでアクセスするファイルサーバやNASではないので注意。

・Azure（Storage）
https://azure.microsoft.com/ja-jp/services/storage/
・AWS（Amazon S3）
https://aws.amazon.com/jp/s3/


##サーバレスアーキテクチャ
サーバ不要、数分でアプリケーション開発環境を調達できます。

###WEBアプリ開発
.NET、Java、Node.js、PHP、Python、Rubyなどを使用して、Webアプリをデプロイできる環境を数分で調達することができます。
もちろん、HTMLファイルだけを保存すれば、静的ウェブサイトとして利用できます。

・Azure（Web Apps (App Service)）
https://azure.microsoft.com/ja-jp/services/app-service/web/


###イベント ドリブン型のアプリ開発
イベントまたはスケジュールをきっかけに開始するアプリをサーバレスで作成することができます。
たとえば、ストレージにデータが格納されたら、サムネイルを自動的に作成するなど。
・AWS（AWS Lambda）
https://aws.amazon.com/jp/lambda/
・Azure（Functions）
https://azure.microsoft.com/ja-jp/services/functions/



###ワークフローでアプリ開発
難しいコーディングは不要、GUIでフローを作成するだけでアプリを開発できます。

・IBM Cloud（Node-RED Starter）
https://console-regional.ng.bluemix.net/catalog/starters/node-red-starter
・Azure（Logic Apps）
https://azure.microsoft.com/ja-jp/services/logic-apps/

###IBM Cloud（旧Bluemix）と Pepper を連携する
IBM Cloudの Node-RED と Pepper を連携させるが記されています。
・IBM Bluemix を Pepper とつないでみよう
https://www.slideshare.net/TakujiKawata/ibm-blluemix-pepper
・pepper サンプルアプリ
https://github.com/Smartrobotics/pepper_samples/
## インテリジェンス
音声認識、画像認識、自然言語処理・・・・

・IBM Cloud（Watson）
https://www.ibm.com/watson/jp-ja/
https://www.ibm.com/watson/jp-ja/developercloud/services-catalog.html

・Azure（Cognitive Servicesなど）
https://azure.microsoft.com/ja-jp/services/cognitive-services/
https://blogs.msdn.microsoft.com/bluesky/2016/05/06/microsoft-cognitive-services-api-overview/
RubyでGPSを使って距離・方角を扱ってみた

[とやまシビックテックパーティー2018](https://code4toyama.connpass.com/event/76153/)に参加した時にGPSの距離計算をしたので、メモ書きです。
APIリクエスト等の時間も不要なので計算時間短めです。
また、関数化しておけば意識せずに渡すことができます。
例では富山駅からハッカソンが行われた富山県民会館までの情報を調べます。

## 距離
2点間の距離を求められます。
結果から富山駅から富山県民会館まで720mちょっとであることがわかります。

```ruby
include Math
def get_distance(pos1, pos2)
  y1, x1, y2, x2 = [*pos1, *pos2].map{ |v| v * PI / 180 }
  earth_r = 6378.14 # km
  cos_theta = sin(y1) * sin(y2) + cos(y1) * cos(y2) * cos(x2 - x1)
  earth_r * acos(cos_theta)
end

# [latitude, longitude]
toyama_station = [36.7022545,137.2120993]
toyama_kaikan = [36.7059723,137.2053941]
puts get_distance(toyama_station, toyama_kaikan)
# 0.727599296578177
```

## 方向
北向きを0度とした時計回りでpos1からpos2に向けての方位を求められます。
富山駅から見て富山県民会館は南の方向にあることがわかります。

```ruby
include Math
def get_angle(pos1, pos2)
  y1, x1, y2, x2 = [*pos1, *pos2].map{ |v| v * PI / 180 }
  y = cos(x2) * sin(y2 - y1);
  x = cos(x1) * sin(x2) - sin(x1) * cos(x2) * cos(y2 - y1);

  angle = 180 * atan2(y, x) / PI;
  if (angle < 0)
      angle = (angle + 360)%360 #0～360 にする。
  end
  angle
end

toyama_station = [36.7022545,137.2120993]
toyama_kaikan = [36.7059723,137.2053941]
puts get_angle(toyama_station, toyama_kaikan)
# 202.1394161068865
```

## 番外編
### 距離測定ツール
- geocoder 
modelに追加するみたいで大変そう
[geocoder](https://github.com/alexreisner/geocoder)

- geokit
qiitaの記事に書いているが、Google検索で一定時間しか検索できないので実用性は低そう
[地球上の2点間の距離の求め方](https://qiita.com/port-development/items/eea3a0a225be47db0fd4)
[geokit](https://github.com/geokit/geokit)

## 参考文献
[緯度・経度から二点間の距離と方向を計算する](http://hamasyou.com/blog/2010/09/07/post-2/)
Raspberry Piで入店音システム4

#【Raspberry Pi】 USBスピーカーから音を出す

前回の記事：[【Raspberry Pi】 人感センサー設置と反応の取得](https://qiita.com/namekuji/items/9b5289ab003f0c54f21d#_reference-6f7e5ef497398baba39e)
##第0章　全体の流れ
前回の記事では人感センサーを接続して、実際に反応を確かめました。今回はUSBスピーカーを接続して音を出すところまでやります。

**第1章**では、必要なアイテム（今回使用したもの）の参考リンクです。
**第2章**では、USBスピーカーを使うための設定を行います。
**第3章**では、自分が持っている音楽をUSBスピーカーから直接流します。

##第1章　必要なアイテム
1. [Raspberry Pi 3 model B](https://www.amazon.co.jp/gp/product/B01CD5VC92/ref=oh_aui_detailpage_o00_s00?ie=UTF8&psc=1)
2. [macbook](https://www.amazon.co.jp/MacBook-Display-13-3インチ-Graphics-MF839J/dp/B00UJK322O/ref=sr_1_8?s=computers&ie=UTF8&qid=1512355535&sr=1-8&keywords=macbook+pro)
3. [USBスピーカー](https://www.amazon.co.jp/エレコム-スピーカー-コンパクト-2-1W-MS-P05UBK/dp/B007F4J83O/ref=sr_1_7?ie=UTF8&qid=1519035586&sr=8-7&keywords=USBスピーカー&dpID=41Ow5yqdD3L&preST=_SY300_QL70_&dpSrc=srch)<br>
*:sunny:USBのみで使用できるものであれば100均でもOKです*
4. [USBメモリ](https://www.amazon.co.jp/東芝-TOSHIBA-USBフラッシュメモリ-Windows-16GB-1個/dp/B071V5VYKP/ref=zg_bs_2151969051_9?_encoding=UTF8&psc=1&refRID=EHW6B9WHG7NB36RZJP5A)<br>
*:sunny:普段使いのもの、激安品、なんでもいいです。お好きな音楽（wav形式のみ）を入れておいてください。<font color="red">この際、フォルダに入れると以下の説明通りではできませんので、パスについて理解のない人はフォルダに入れないで直接置いておいてください。</font>*

##第2章　USBスピーカーの設定
ログインの方法がわからないときは[前回の記事](https://qiita.com/namekuji/private/4adfdbfac7c3911a70ab)をみてください。

1. **USBポートに接続をする**
2. **macでRaspberry Piにログインする**
3. <font color="red">**[重要]方法を選択する**</font>
    1. ```$cat /etc/modprobe.d/alsa-base.conf```と入力して、表示されるか確認する。
    2. [表示された場合]以前の方法が必要です。[こちら](http://uepon.hatenadiary.com/entry/2016/04/14/214420)を参照して**「Wheezyの場合」**という項目から進めてください。
    2. [エラーの場合]予定通りの状態です。このまま進んでください。
4. **出力をUSBスピーカー最優先にする**
   <tab>1. ```$sudo vi /usr/share/alsa/alsa.conf```と入力してください。たくさん文字が出てくるはずです。
    *:sunny:もし何も表示されてなかったら```:q!```（保存しないで終了）と入力して、```Enter```を押してください。文字の打ち間違えか、「第2章 3.方法の選択」を間違えている可能性があります。*
    2. 赤枠行の先頭に```#```を追加してコメントアウト（無効化）する。
    <img width="621" alt="2_alsa1.png" src="https://qiita-image-store.s3.amazonaws.com/0/231619/bdabba4f-b45a-ad13-55bb-fad0161f64d6.png">
    3. 赤枠の数値を0→1に変更する。
    <img width="622" alt="2_alsa2.png" src="https://qiita-image-store.s3.amazonaws.com/0/231619/2113eef4-b9c6-a768-daa2-851e3a627476.png">
    4. ```$sudo reboot```で再起動してまたログインする。
5. 音が鳴るか試聴する。
    ```$aplay /usr/share/sounds/alsa/Front_Center.wav```で、英語「フロントセンター」が鳴ればOK。

##第3章　自分の音楽を鳴らしてみる
1. **事前に音楽を入れたUSBメモリをRaspberry Piに接続する**
2. **メモリの位置を確認する**
    1. ```$df -h```でメモリ一覧を確認する。
    2. 自分のメモリ（私はTOSHIBAがメモリ名なので）の位置(```/media/pi/TOSHIBA```)をコピー<br>
<img width="548" alt="3_memory_ls.png" src="https://qiita-image-store.s3.amazonaws.com/0/231619/113e499b-be7b-6654-d595-f44bed315206.png">
3. **音楽ファイルをコピーする**
    ```$cp /media/pi/TOSHIBA/ファイル名.wav Music/ファイル名.wav```と入力してファイルをMusicフォルダにコピーする。<br>
    *:sunny:USBメモリでフォルダに音楽を入れた人は、```/media/pi/TOSHIBA/フォルダ名/ファイル名.wav Music/ファイル名.wav```でしてください。*<br>
*:sunny:ファイル名は自分の音楽ファイルの名前にしてください。*
4. **音楽を流します。**
    ```$aplay Music/ファイル名.wav```で音楽が流れます。<br>
*:sunny:<font color="red">[注意]大音量です。</font>*<br>
*:sunny:```control+c```で終了します。*

##第4章　最後に
今回は簡易的な音楽を流すシステムですが、次回はいよいよ最終回！人を感知して音を流すことで入店音システムを作ります。
次回の記事：[【Raspberry Pi】 人を感知して音を流す]()
モダンなJS/CSSがどのブラウザで使えるか簡易早見表


Can I Useをいちいち見に行くのが面倒なので、自分がよく使うリストを作りました。
結論的にはIEを捨てれば幸せになれます。IEを捨てましょう。

##Javascript 

| 機能 | IE | Edge | Chrome | Firefox | Safari | iOS | Android | 
|:-----|:----:|:----:|:-----:|:-----:|:----:|:-----:|:-----:|
| forEach | 9- | ○ |○ |○ |○ |  ○|○ |
| Promise | × | ○ |○ |○ |○ | ○| 4.4|
| ()=>{} | × | ○ |○ |○ |○ | ○| Ch|
| let/const | 11- | ○ |○ |○ |○ | ○| Ch|
| classList | 10- | ○ |○ |○ |○ | ○| ○|
| webWorker | 10- | ○ |○ |○ |○ | ○| 4.4|

##CSS

| 機能 | IE | Edge | Chrome | Firefox | Safari | iOS | Android | 
|:-----|:----:|:----:|:-----:|:-----:|:----:|:-----:|:-----:|
| flex | 10- | ○ |○ |○ |○ |  ○|○|
| grid | × | ○ |○ |○ |○ |  ○| Ch |
| calc | 9- | ○ |○ |○ |○ |  ○| 4.4|
| vw/vh | 10- | ○ |○ |○ |○ |  ○| 4.4|
| var | × | ○ |○ |○ |○ |  ○| Ch |
さくらレンタルサーバーでWordpressのpostieプラグインをCRONで使う方法

さくらレンタルサーバーのスタンダードプランで、httpsでWordpressを使っていますが、メール投稿のプラグインpostieをCRONで動かすことに、少しハマってしまったので、ここで書かせていただきます。

CRONに以下のように記述しましたが、メールを取得しませんでした。

    /usr/local/bin/wget --spider --quiet --no-check-certificate "https://example.com/?postie=get-mail"

そこで、オプションを消して、

    /usr/local/bin/wget "https://example.com/?postie=get-mail"

として、出力をpostmasterにメール受信してみました。
すると、以下のようになっていました。

    --2018-02-19 19:20:00--  https://example.com/?postie=get-mail 
    Resolving example.com... 219.94.xxx.xxx 
    Connecting to example.com|219.94.xxx.xxx|:443... connected. 
    HTTP request sent, awaiting response... 301 Moved Permanently 
    Location: https://example.com/?postie=get-mail [following] 
    --2018-02-19 19:20:01--  https://example.com/?postie=get-mail 
    Reusing existing connection to example.com:443. 
    HTTP request sent, awaiting response... 301 Moved Permanently 
    Location: https://example.com/?postie=get-mail [following] 
    --2018-02-19 19:20:01--  https://example.com/?postie=get-mail 
    Reusing existing connection to example.com:443. 
    HTTP request sent, awaiting response... 301 Moved Permanently 

301リダイレクトループしていました。
これは.htaccessで以下のようにhttpをhttpsにリダイレクトしているためでした。

    <IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{ENV:HTTPS} !^on$
    RewriteCond %{HTTP:X-SAKURA-FORWARDED-FOR} ^$
    RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
    </IfModule>

なので、自サーバーからのアクセスをリダイレクトから外すようにしました。
それがこちら↓

    <IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{REMOTE_ADDR} !^219\.94\.xxx\.xxx$
    RewriteCond %{ENV:HTTPS} !^on$
    RewriteCond %{HTTP:X-SAKURA-FORWARDED-FOR} ^$
    RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
    </IfModule>

219\\.94\\.xxx\\.xxxのところは、もちろんサーバーのIPにしてください。
これでCRONを実行したところ、postmasterへの出力メールが以下のようになりました。

    --2018-02-19 19:30:00--  https://example.com/?postie=get-mail 
    Resolving example.com... 219.94.xxx.xxx 
    Connecting to example.com|219.94.xxx.xxx|:443... connected. 
    HTTP request sent, awaiting response... 200 OK 
    Length: unspecified [text/html] 
    Saving to: 'index.html?postie=get-mail.3' 
    
         0K .......... .......                                     8.05K=2.1s 
    
    2018-02-19 19:30:12 (8.05 KB/s) - 'index.html?postie=get-mail.3' saved [17581]

これできちんとメールを読み込んでWordpressに投稿がされました。
QiitaAPIにトレンドが見当たらないので泣いてたら

2018/02/19

.jsonつけたらイケた
どしてもっと早く教えてくれないのん(´；ω；｀)

https://qiita.com/trend.json

## 追記

2018/03/22 9:00〜13:00頃
未ログインだと見れなくなってもうた(´；ω；｀)

しょうがないからAPI経由で、過去x日でxストック以上された記事
https://qiita.com/search?q=stocks:>20+created:>2018-03-01
とかそんな感じのやつを取得して代用することにした

試してないけど多分こんな感じ

```ruby:kuso_qiita.rb
require 'active_support'
require 'active_support/core_ext'
require 'qiita'

Time.zone = 'Asia/Tokyo'

def qiita_search_pages(qiita_client)
  search_deadline = 8.days.ago.strftime('%F')
  query = "stocks:>20 created:>#{search_deadline}"

  # 読んでも10ページまで
  (1..10).each_with_object([]) do |page, trend_pages|
    trend_page = qiita_search_page(qiita_client, page, query)
    trend_pages << trend_page

    break trend_pages if trend_page.next_page_url.blank?
  end
end

def qiita_search_page(qiita_client, page, query)
  qiita_client.list_items(page: page, per_page: 100, query: query)
end

qiita_client = Qiita::Client.new(access_token: ENV['QIITA_ACCESS_TOKEN'])

pages = qiita_search_pages(qiita_client)

#####
# 例えばuuid一覧を取得
#####

def qiita_pages_uuids(pages)
  pages.inject([]) do |uuids, page|
    uuids.concat(page.body.map { |item| item['id'] })
  end
end

uuids = qiita_pages_uuids(pages)

p uuids.map(&:presence).compact.uniq
```

## 追記2

201９/04/07
いつからそうだったのかは謎だけど、
トレンド情報をjsonで取得する事自体が出来なくなっている事を確認
@YumaInaura さんがコメントで教えてくれました
Azure VM Linux(ubuntu)にリモート デスクトップ接続 (RDP) をする

## はじめに
Azureの仮想ギャラリーにあるUbuntuで、リモートデスクトップしてもすぐに切断されてしまいます。
代替手段として、LXDE (Lightweight X11 Desktop Environment)をインストールすることで、
接続可能になります。
[Azure VM の Ubuntu 14 にリモートデスクトップ接続](http://pronama.azurewebsites.net/2015/04/21/azure-vm-ubuntu-remote-desktop/)
* ubuntu-desktopをインストールするとリモートデスクトップするとログイン後、すぐに切断されてしまいます。

## 前提
ubuntuは、仮想ギャラリーから『Ubuntu Server 14.04 LTS』で作成しています。

## 手順

### OSを最新版にアップデートを行う
```shell-session
$ sudo apt-get update
$ sudo apt-get upgrade -y
$ sudo reboot
```

### LXDE (Lightweight X11 Desktop Environment)パッケージのインストール
```shell-session
$ sudo apt-get install -y lxde lxsession-logout
$ sudo reboot
```

### xrdp のインストールおよび設定
```shell-session
$ sudo apt-get install -y xrdp
$ echo lxsession -s LXDE -e LXDE > ~/.xsession
$ sudo service xrdp restart
```

### ファイルウォールの設定
```shell-session
$ sudo ufw enable
$ sudo ufw allow ssh
$ sudo ufw allow 3389/tcp
$ sudo ufw reload
```

### AzureでRDPのポート(3389)を解放する
ネットワーク セキュリティ グループ > 受信セキュリティ規則 で追加。
*画面にあるBasicを選択するとサービスからRDPを選択できます。
![auzre-ubuntu-desktop-1.png](https://qiita-image-store.s3.amazonaws.com/0/206716/9fa10adc-6eaa-8791-bc8f-c208c083d726.png)


## 参考
[Azure Virtual Machines 上にデプロイした Ubuntu Server 15.10 を日本語化、RDP 経由でアクセスする](https://kogelog.com/2016/03/05/20160305-01/)
[Azure VM の Ubuntu 14 にリモートデスクトップ接続](http://pronama.azurewebsites.net/2015/04/21/azure-vm-ubuntu-remote-desktop/)
[ど素人だが Azure にUbuntu 仮想マシン作り、リモートデスクトップで接続してみる](http://d.hatena.ne.jp/hilapon/20160415/1460711501)
ExecJS::RuntimeError  SyntaxError: [stdin]:11:3: unexpected ifのエラー

##エラーの概要

![screenshot 2.png](https://qiita-image-store.s3.amazonaws.com/0/167576/5db68cf3-066a-7108-9534-0c5ac5d08648.png)

home/indexにSyntaxError: [stdin]:11:3: unexpected if
が出た

##解決法
coffeescrpitにcoffeescrpit以外のコードを書いていたことが原因らしい

room.coffee
エラー前
![screenshot.png](https://qiita-image-store.s3.amazonaws.com/0/167576/7c35249b-3acc-a95b-6d3f-14e47c051ca8.png)![screenshot.png](https://qiita-image-store.s3.amazonaws.com/0/167576/7ff209f2-bf40-25e8-d69e-8c487f779839.png)


エラー解決後

![screenshot.png](https://qiita-image-store.s3.amazonaws.com/0/167576/5e0c0f67-788d-3465-2e4b-98682ce95777.png)


参考文献
　　https://teratail.com/questions/30240
# C++ の dynamic_cast 的なのを自前でやってみた

仕事では NO_RTTI ばっかりだったし必要な書き方をしてなかったので dynamic_cast 自体の必要性も謎なのだけど頭の体操のつもりで代替処理を書いてみた。 20年不要だったので今後も身の回りでは不要だろうとは思う。

```C++
#include <type_traits>

class DynamicCastable {
protected:
    /// 型式別に使う関数
    template<typename T> static void Type() {};
    /// 型式別に使う関数の型
    typedef void (*TypeFunc)();
    /// 型判別仮想関数
    inline virtual auto Is(TypeFunc fn) const -> bool {
        return &Type<DynamicCastable> == fn;
    }
public:
    /// 型判別
    template<typename T>
    inline auto Is() const -> bool { return Is(&Type<T>); }
};

/// 動的型変換
template<typename T, typename E>
inline auto DynamicCast(E* e) -> T {
    typedef typename std::remove_pointer<T>::type type;
    return e->template Is<type>() ? static_cast<T>(e) : nullptr;
}

class One : public DynamicCastable {
protected:
    inline auto Is(TypeFunc fn) const -> bool override {
        // 失敗したら基底へ
        return &Type<One> == fn || DynamicCastable::Is(fn);
    }
};

class Two : public One {
protected:
    inline auto Is(TypeFunc fn) const -> bool override {
        // 失敗したら基底へ
        return &Type<Two> == fn || One::Is(fn);
    }
};
```
SidekiqでRailsからワーカーを起動する

railsでバックグラウンドの処理をする場合、resqueでもsidekiqでもrailsとは別にワーカーを立ち上げる必要がある。事前起動と落ちていたときの管理はわずらわしい。
管理は、capistranoタスク、最初に手動で、起動スクリプト、monitなどがありますが、
Railsソース内で完結した形(システムコマンドは使う)で起動するようにしたいと思います。

```Ruby
Open3.popen3(%Q! x=`ps aux | grep sidekiq | grep -v grep | awk '{print $2}'`; [ "$x" == "" ] && cd #{Rails.root} && bundle exec sidekiq -d  -C #{Rails.root}/config/sidekiq.yml -e #{Rails.env}!)
```
システムコマンドのOpen3.popen3で、sidekiqワーカーが起動しているかを確認して、起動していなければワーカーを立ち上げる仕組み。
うっかりワーカー立ち上げるの忘れちゃっても、キューを入れる前にこれを実行すれば防げる。

クラス化したのは以下。

```Ruby

require 'sidekiq/api'
class KiqStart
  def self.start
   if (!!Sidekiq.redis(&:info) rescue false)
    Open3.popen3(%Q! x=`ps aux | grep sidekiq | grep -v grep | awk '{print $2}'`; [ "$x" == ""  ] && cd #{Rails.root} && bundle exec sidekiq -d  -C #{Rails.root}/config/sidekiq.yml -e #{Rails.env}!) {|a,b,c| b.read }
   end
  end

  def self.redis_run?
   (!!Sidekiq.redis(&:info) rescue false)
  end

  def self.process_run?
   Open3.popen3(%Q! echo `ps aux | grep sidekiq | grep -v grep | awk '{print $2}'`;!) do |a,b,c| p b.read end.strip.present?
  end

  def self.stop
    Open3.popen3(%Q! cd #{Rails.root} && bundle exec sidekiqctl stop tmp/pids/sidekiq.pid 0 !)
  end

  def self.status
   p "-" * 10
   p "redis run?"
   p self.redis_run?
   p "-" * 10
   p "queue_size"
   p Sidekiq::Queue.new.size
   p "-" * 10
   p "processes_size"
   p Sidekiq::ProcessSet.new.size
   p "-" * 10
  end

end

```

システムコマンドを使っているため、気になる場合は変数をすべてスタティック文字列に置き換えるなど確認してご利用ください。
cutコマンドでバッファリングさせないようにする

USBでMacに繋ぐとシリアルデバイスとして認識される温度湿度気圧センサがあるとします。
このセンサは1秒に1回 `20.00,10.00,1000.00` という形式のデータを送ってきます。
`20.00`が温度、`10.00`が湿度、`1000.00`が気圧です。
手元にセンサがない人もいることでしょうし、センサのかわりに以下のようなスクリプトを用意します。

```sh:sensor.sh
#!/bin/sh
while :; do
  echo 20.00,10.00,1000.00
  sleep 1
done
```

これを実行すると、以下のように1秒ごとにデータが流れてきます。

```shell-session
$ ./sensor.sh 
20.00,10.00,1000.00
20.00,10.00,1000.00
20.00,10.00,1000.00
20.00,10.00,1000.00
20.00,10.00,1000.00
.
.
.
```

温度だけ取り出したいので、cutコマンドを使ってみます。

```shell-session
./sensor.sh | cut -d, -f1
20.00
20.00
20.00
.
.
.
```

うまくいきました。

今度は温度をコンソール上で確認しながら同時にファイルに記録しておきたいので、`tee`に渡してみます。

```shell-session
$ ./sensor.sh | cut -d, -f1 | tee temp

```

あれれ、なにも出てきません。`temp`の中身も空っぽです。
どうやら、端末以外に出力するときは、`cut`が標準出力をバッファリングするみたいです。

`cut buffering`などでGoogleで検索すると、`stdbuf`というコマンドを使うとバッファリングなしを強制できるようです。
ところが`stdbuf`はGNUとBSDでともに提供されているものの、macOSにははいっていません。これはちょっとめんどくさいです。

いろいろ悩んだ挙句、`while`と`read`を使えばPOSIXの範疇で簡単に解決できることに気づきました。

```shell-session
$ ./sensor.sh | while read l; do echo $l | cut -d, -f1; done | tee temp
20.00
20.00
20.00
20.00
20.00
^C
$ cat temp 
20.00
20.00
20.00
20.00
20.00
```

1秒ごとに`20.00`が表示されます。うまくいきました。

ワンライナーだと見づらいのでシェルスクリプトとして書いてみます。

```sh
./sensor.sh         |
cut -d, -f1         |
while read line; do
  echo ${line} |
  cut -d',' -f1
done                |
tee temp
```

タイトルに反して「バッファリングさせないようにしている」わけではないですが、ラインバッファを強制したときと同じ結果が得られました。
`cut`を毎回起動するのでパフォーマンスの面では劣りますが、POSIXの範囲内で簡単に解決できたのと、元々多くても1秒間隔くらいでやってくるデータを想定しているので、これでじゅうぶんだと思います。
`cut`に限らず、`awk`など出力をバッファリングしてしまうコマンドに出くわしたときに使える手だと思います。
プログラミングパラダイムって何? 文系学生が勉強してみた!!

##はじめに

インターン先でプログラミングを学んでいる文系学生。

社員さんから
「プログラミングをやるんだったら、プログラミングパラダイムをやらないと」
と言われた。

(ぷろぐらみんぐぱらだいむって何…?)
まぁ、良いきっかけだよね。

よっしゃ! 勉強したろ!

##勉強方法
「とりあえずこれを読んでごらん」
心優しい社員さんからオススメのサイトを2つ紹介してもらった。
1,[Programming Paradigms](http://cs.lmu.edu/~ray/notes/paradigms/)
2,[新人プログラマに知っておいてもらいたい人類がオブジェクト指向を手に入れるまでの軌跡](https://qiita.com/hirokidaichi/items/591ad96ab12938878fe1)

よし! １つずつ見ていくか!

##Programming Paradigms
URL:[http://cs.lmu.edu/~ray/notes/paradigms/](http://cs.lmu.edu/~ray/notes/paradigms/)

とりあえず、サイト見てみよう。

・・・

全部英語やんけ!!

文系学生にこれはキツいぞ…
まぁ、やるしかないんですけどね(絶望)


Google先生に力を借りて約2時間かけて読解。

理解できた概念? 考え方?は次の通り

* プログラミングパラダイム=プログラミングをする際に基礎となる考え方、様式
* 1つのプログラミングで色々なパラダイムを取り入れることができる。
* パラダイムだけで構成されているプログラミングはほとんどない。

プログラミングの勉強をしていた時に何気なくみていた構文にも、プログラミングパラダイムが含まれていたなぁ。
名前を全く知らなかったから、ちょっと怖かったけど、案外仲良くできるかも!

## 新人プログラマに知っておいてもらいたい人類がオブジェクト指向を手に入れるまでの軌跡
URL:[https://qiita.com/hirokidaichi/items/591ad96ab12938878fe1](https://qiita.com/hirokidaichi/items/591ad96ab12938878fe1)

(オブジェクト指向って何なの…?)
(誰だこんな分かりにくい言葉にした奴)
このような思いを抱えている人は自分の他にもいるだろう(と思いたい)。

しかし、そんな思いとも今日でおさらばだ。
時代背景を知ることで、オブジェクト指向の理解に近づけたような気はする。
最低でも名前を付けた理由はわかったかも。

けれども、まだオブジェクト指向を完全に理解できたとは言えない。
実際にプログラムを組んでみないとわからないのかもね。

読んでるだけでも理解に近づけたと思うから、実務レベルの仕事を貰えるまで、何度か読みなおそっと。

##まとめ
**「プログラミングパラダイム」＝「プログラミングの基礎となる考え方や構文」**
概念レベルでは理解できたけど、技術レベルには未だ落とし込めてない。
次は、実際の構文を使って紹介できるレベルを目指して頑張ってみますか!!
## 参考文献
* [Programming Paradigms](http://cs.lmu.edu/~ray/notes/paradigms/)
* [新人プログラマに知っておいてもらいたい人類がオブジェクト指向を手に入れるまでの軌跡](https://qiita.com/hirokidaichi/items/591ad96ab12938878fe1)
射影行列

## 射影行列とは
射影行列は、あるベクトルに作用させると、そのベクトルの部分空間成分を取り出すような行列である。

射影行列がなぜ重要かというと、線型方程式系の最小二乗解と密接に関係しているからである。
最小二乗解は一般逆行列を使って求められるが、一般逆行列の表式の意味を理解しようとすると、射影行列を知っておくのが一番てっとり早いのである。

## 射影行列の表式
ストラングの教科書[^1]に従って、行列$A$の列ベクトルたちの張る空間を列空間と呼ぶことにする[^2]。
このとき、$A$の列空間への射影行列は $ A (A^T A)^{-1} A^T $ であることが知られている[^3]。

この記事ではこの表式を導出したいと思う。


## 導出の前置き
前出のストラングの教科書では、直交性を使って示されている。
しかし、ここでは、双対基底というものを使うことで、射影行列がより簡潔かつ一般的に書けることを示した上で、元々の表式も導出してみる。

双対基底については簡単に説明するが、後半で、計量テンソルを使った反変・共変成分の変換計算[^4]を説明なしに使う。

## 導出
### (Step1) 双対基底
$A$の列ベクトルたち $ \\{a_i\\} $ が張る空間（列空間）の基底を $ \\{a_i\\} $ にとる。
これに対して、正規直交性 $$ a^i a_j = \delta ^i_j $$ を満たすような基底を双対基底 $ \\{a^i\\} $ と呼ぶ。
この式は、$a^i$ と $a_j$ の内積を表しており、$ \\{a_i\\} $ を縦ベクトルとすると、$ \\{a^i\\} $ は横ベクトルであることに注意。
双対基底と区別する意味を込めて、元の基底 $ \\{a_i\\}$ の方を自然基底と呼ぶこともある。

### (Step2) 双対基底を使った射影行列の表式
正規直交性から、任意の（縦）ベクトル $x$ に、$a^i$ を掛けると $x$ の $a_i$ 成分が得られることが分かる。
つまり、Aの列空間への射影成分は
$$ x_{\mathrm{span}\\{a_i\\}} = \sum_i (a^i x) a_i $$ である。この式は
$$ x_{\mathrm{span}\\{a_i\\}} = \sum_i a_i(a^i x) = \sum_i (a_i a^i) x
$$ と書き換えられるので、射影行列は
$$ P=\sum_i a_i a^i $$ である[^5]。
[^5]: これは抽象的に書けば、$\hat{P}=\sum_i a_i \otimes a^i$ というテンソル積の和で表される写像であり、これを数ベクトル空間で表現したものが行列$P$である。

このように、射影行列は、双対基底を入れることで、非常に簡潔な形で表せる。
ここまで来れば、あとは計量テンソルによる添字の上げ下げをするだけである。

### (Step3) Aを使った式に直す
計量テンソルで双対基底を自然基底に戻す（添え字を「下げる」）と
$$ P=\sum_{i,j} a_i g^{ij} a_j $$ であり、行列で書くと、$ P = A G^{-1} A^T $ と書ける。
ここで、$ g^{ij} $は $G = (g_{ij})$ の逆行列の行列要素であることを使った。

自然基底の作る計量テンソルである $ g_{ij} $ は、$ g_{ij} = a_i \cdot a_j $であり、行列で書くと、$ G = A^T A $ であるから、結局、射影行列は、
$$ P = A (A^T A)^{-1} A^T $$ となる。

## 補足：行空間への射影行列
$A$の行ベクトルたちが張る空間は行空間と呼び、同様に射影行列を作ることができる。
列空間の場合と対比的に書くと、

* $A$の列空間への射影行列は $ A (A^T A)^{-1} A^T $
* $A$の行空間への射影行列は $ A^T (A A^T)^{-1} A $ 

行空間への射影行列の表式は、列空間への射影行列の式において、$ A \rightarrow A^T $と置き換えれば得られる。これは、$A$の行空間は、$ A^T $ の列空間と言い換えられるからである。

行空間への射影行列は、線形方程式系のノルム最小解と関連している。

[^1]: 『ストラング：線形代数イントロダクション』https://www.kindaikagaku.co.jp/math/kd0405.htm

[^2]: 一般的な言葉でいえば、列空間とはAが表す線形写像の像（Image）です。

[^3]: Aは実数行列とします。複素数の場合は、転置を共役転置に置き換えれば良いだけ。

[^4]: 相対論でよく使うやつ
VisualStudioCodeでVisualStudioのプロジェクトをビルドしたい

## たてまえ

* くっそおもいVisualStudioおもいから使いたくない (語彙力
* 作業用のラップトップでVisualStudio動かすのだるい

## ほんね

* ビルドコマンドわからんから勉強したい、何やってるのか分からないで使うの嫌だからということにしとく。
* 仕事でつかうのでも重いし画面も白いし
* そもそもインストールとか時間かかりすぎやねん（インストール中に書いてる
* でもシミュレータとかデバッガは使うからVisualStudioもいれとこー
* コーディングはVScodeでしたい。

## 前準備

* nodejsを入れておく（いろいろ便利だから入れとけ）
* Pythonを入れておく（cpplintつかえるように）
* VisualStudioCodeをインストールする
    * VisualStudioのインストールが非常に時間かかるので先に入れておくといいと思う。
    * ついでに拡張機能でC#とC++も入れておく
    * お好きに環境作ってくだせぇ
* VisualStudioをインストールする
    * 描いてるときはのCommunity 2017でやってる
    * インストール中は適当に手順書とか作っておくといいよ

## VSCodeにはビルドタスクのテンプレでMSBuildがある

* **msbuildってなんやねん**
* ビルドツールですね。
* VisualStudioにバンドルされてるっぽい

## MSBuildのPathを環境変数にいれる

いわゆる**パスを通す**ってやつ。

nodejsとかPythonとかrubyやると自然と身につくよね。

というわけでMSBuild.exeのパスを確認する。
2017の場合は下記にあるらしい。

```text:VisualStudio2017
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\MSBuild\15.0\Bin\MSBuild.exe
```

まあバージョンが違えば場所も変わるだろうが大きく違うことはないでしょう。

いつも通り環境変数にぶち込んで終わりです。

## VisualStudioでビルド構成を行う。

もろもろ必要なことはVisualStudioで設定しておく

## ビルドコマンド

コマンド引数は以下で確認しよう

* https://msdn.microsoft.com/ja-jp/library/ms164311.aspx

## 

### ただビルドするだけならば

```
msbuild [PROJECT_FILE_PATH]
```

でええんちゃうかな。

### 構成を指定する場合

ビルド構成を指定する場合は以下のようになる

```
msbuild [PROJECT_FILE_PATH] /p:Configuration=[SETTING_NAME]
```

## VScodeでビルドタスクを作る

こんな感じ

```json
{
    "version": "2.0.0",
    "tasks": [
        {
            "label": "debug build",
            "type": "shell",
            "command": "msbuild C:\\Path\\to\\project.sln",
            "args": [
                "/p:GenerateFullPaths=true;Configuration=Debug",
                "/t:clean;rebuild",
            ],
            "group": "build",
            "presentation": {
            },
            "problemMatcher": "$msCompile"
        },
        {
            "label": "product build",
            "type": "shell",
            "command": "msbuild C:\\Path\\to\\project.sln",
            "args": [
                "/p:GenerateFullPaths=true;Configuration=Product",
                "/t:clean;rebuild",
            ],
            "group": "build",
            "presentation": {
            },
            "problemMatcher": "$msCompile"
        },
    ]
}
```

## 後はお好きにどうぞ。

あとはVSCodeでコーディングして `Ctrl + Shift + B` でビルドタスク選択してビルドする。

楽ちん。
話す順番を少し変えるだけで理解度が深まるという話

こんにちは、最近座ってるだけで膝が痛いです。

#結論→理由の順で話そう

**まとめ：結論を前提として話を聞く形になる為、一度の説明で理解度が深まる。**

この一文で納得できるかたは以降読まなくても大丈夫です（笑）

社会人１年目、ペーペーのアシスタントディレクターで
案件説明もド下手だった頃にアドバイスされたのがこれでした。

案件説明はもちろん質疑応答や企画プレゼンなんかでも使えます。
無意識に実行している方も多いかもしれません。

どうして効果的なのかちょっと紐解いていきたいと思います。

#序盤の言葉や話は頭に残りやすい
集中力の問題なのか、脳の処理の順番の問題なのか、というところですが・・

**序盤の言葉や話って頭に残りやすいです。**

校長先生のお話を思い出してみてください。
前半はわりと聞いていても、最後のほうは大体覚えていなかったと思います。
まーた始まったよ、今日は何の話だよ みたいな。
で、途中居眠りしていつのまにか全校朝礼が終わり、何の話だったの？ってなる。

ここでもし校長先生が最初に「今日は防犯の話をします」とか言っていれば、
途中居眠りしたとしても「防犯の話をしてたな」くらいはわかるはずです。

#会議でも理屈は同じ

校長先生の話といえば長いものですが、
これって会議内での短い質疑応答や議題の説明でも同じことが言えると思います。

会議だと聞いているだけの時間って意外と短く、資料見たり、メモしたり、結構同時に頭や手を使ってます。
でも会議始まった瞬間や新しい議題に移った瞬間に、資料見ることはあってもメモはしないですよね。

**その瞬間にその場で一番大事なことを言っておくと良いです。**
ついでに資料の頭にも結論から書いておくと尚良いです。

どうしてそうなるのかなどの理由は、メモしながらでもかいつまんで聞ければ、
そのうち点と点が繋がるように理解していきます。
どんな聞き方をしたところで、結論を最初に出しているためゴールは一緒になります。

#結論を前提として話を聞く形になる為、一度の説明で理解度が深まる。
「突然ですが今夜飲み会を開催します」
「何でだよ！」

こう言われると理由が説明されてないので「何でだよ！」ってなりますよね。
この「何でだよ！」を引き出すことに成功したらもうこっちのものです。
参加するかはともかく、興味を引くことに成功しているので話は聞いてもらえます。

全ての会話、全ての議題に通じることでは勿論ないですし、あくまで経験からくる持論ですが、
ちゃんと説明したはずなのにイマイチわかってもらえてないと感じた時には試しに取り入れてみてください。


#おまけ：日本語と日本人の気質の関係
突然ですが、例えばリンゴが好きであることを相手に伝える場合

日本語　`私はリンゴが好き`
英語　`I like apples`

日本語だと、**最後まで聞かないと何の話をしようとしているのかわからない**
対して英語は、**序盤で、なんらかの好きなものの話をしようとしているのがわかる**

日本人は「自己主張が苦手」とよく言われます。もちろん個人差はありますが。
対して英語圏は「自己主張が強く、思ったことをハッキリ言う」というイメージがあります。

日本語だと**結論や言いたいことが最後に来がち**です。日本人の性格がどうこうとかではなく文法の問題で。
なので**結論や言いたいこと**を伝える前の段階でいくらでもニュアンスが変えられます。
今回の例で言えば「ちょっとだけリンゴが好き」なのか「とってもリンゴが好き」なのか。

対して英語だと**結論や言いたいことが先に来ます**。
後からフォローを加えるような文法になると思います。
今回の例に当てはめると「I like apples very much.」私はリンゴが好き、とっても！という具合で。

海外の会議に出たわけではないので実際のところはわかりませんが、何となく英語圏は会議がスムーズそうな気がします。
こういった言語からくる国民の気質なんかと技術の成長・発達スピードって関係あるかもしれないですね。
文法を変えることはできなくても、日本語は柔軟な言語なので、ディレクションや人に説明をする立場の人間としてはこういうところもっと上手くできたらと思います。

それではまた
Facebook の Graph API で 団体の情報を得る

Graph API を curl で使う例です。

まず、フェースブックのページにアクセスします。
その団体の情報を得てみます。（ID を調べるのにも使えます。）

https://www.facebook.com/shimotsuke.city.promo/
![facebook_feb1901.png](https://qiita-image-store.s3.amazonaws.com/0/179446/9064c29c-d534-77ba-98b7-dfdeffe12c40.png)

USER_TOKEN は、有効なものと置き換えて下さい。
"shimotsuke.city.promo"　を変更すれば、色々な団体の情報が得られます。

```bash:get_info.sh
#
#	get_info.sh
#
#
#                				   Feb/19/2018
# 
URL="https://graph.facebook.com/v2.12/"
CODE="shimotsuke.city.promo"
#
USER_TOKEN="FG4EFFBgb938BAO2ouOc1235pjXC8YgsXZBYRnZB8nNvwZCP7dJDTXq7pRrZCVXDX4rmH9hvEZCUj8ZA2ihBlMKMoVWWwzaaRzI8tqA6zCAhgZB12idZCYxIxXNmC112GypCJlnsGdUgLLwAYp0PAQinfL3J123f6or2JYj65bt0QSp1umNabcfg"
#
FIELDS='id,name,about'
#
curl "$URL$CODE?fields=$FIELDS&access_token=$USER_TOKEN" | jq .
#
```

実行結果です。
![facebook_feb1902.png](https://qiita-image-store.s3.amazonaws.com/0/179446/d7e07bb4-5309-5731-40e4-fc79aa34b0d6.png)
Raspberry Piで入店音システム2

#【Raspberry Pi】 Vim設定からプログラミング
前回の記事：[【Raspberry Pi】購入からSSH設定まで](https://qiita.com/namekuji/private/ee4cb54d636ec5cd9d47)

##第0章　全体の流れ
前回の記事では、SSH接続でMacとRaspberry Piを接続しました。今回は、SSH接続を使って、プログラムを書くためのvimの設定と、実際にプログラムを実行してみたいと思います。

**第1章**では、必要なアイテム（今回使用したもの）のリンクを載せています。
**第2章**では、vimの設定を行い、プログラムを書けるようにします。
**第3章**では、簡単なプログラムを実行してみて、問題なく行えるか確認します。

##第1章　必要なアイテム

どちらも前回使用したものです。事前に必要なSSH設定は[前回の記事](https://qiita.com/namekuji/private/ee4cb54d636ec5cd9d47)を見てください。
1. [Raspberry Pi 3 model B](https://www.amazon.co.jp/gp/product/B01CD5VC92/ref=oh_aui_detailpage_o00_s00?ie=UTF8&psc=1)
2. [macbook](https://www.amazon.co.jp/MacBook-Display-13-3%E3%82%A4%E3%83%B3%E3%83%81-Graphics-MF839J/dp/B00UJK322O/ref=sr_1_8?s=computers&ie=UTF8&qid=1512355535&sr=1-8&keywords=macbook+pro)

##第2章　vimの設定
1. **SSH設定でログインする**
    1. Raspberry Piとmacを起動する。
    2. macでRaspberry Piに```$ssh pi@hostname.local```でログインする。<br>
*:sunny:hostnameは自分のホスト名にしてください。*

2. **vimの設定をする**
    1. ```$sudo apt-get install vim```でvimをインストール。
    2. ```$sudo vi /etc/vim/vimrc```で設定画面を開きます。
    3. ```i```を入力して画面下にINSTALLと表示されたのを確認します。
    4. ```" syntax on```から```"```を削除して画像のようにします。
    5. 次に```" if has("autocmd")```から```" endif```までの、3行の```"```を削除して画像のようにします。
    6. さらに```set number```を画像の位置に書き込みます。
    <img width="1068" alt="2_vimrc.png" src="https://qiita-image-store.s3.amazonaws.com/0/231619/c192e434-a2dd-6ead-4532-227396a66c3a.png">
    7. ```esc```を入力して、INSARTが消えたら、```SHIFT```を押しながら```z```を2回押します（保存して終了）。

##第3章　簡単なプログラムを書いてみよう
1. **プログラムをまとめるフォルダを作る**
    1. ```$cd Documents```でドキュメントフォルダへ移動する。
    2. ```$mkdir Python3```でPython3用のフォルダを作る。<br>
    *:sunny: この時Python3の部分がフォルダ名になるため、好きなもので良い。*
2. **viでプログラムを書く**
    1. ```$vi test.py```で、test.pyというpythonのファイルをviで作って開く。
    2. ```i```を押すと入力モード（画面下にINSERT）になり、```esc```を押すと保存とか終了をするモードになります。プログラムを入力したいので、```i```を入力して入力モードにします。
    3. ```print("こんにちは！プログラムを始めました！")```と入力しましょう。
    <img width="510" alt="3_program.png" src="https://qiita-image-store.s3.amazonaws.com/0/231619/0c1b683a-d350-ceed-c546-0e3f699c14ba.png">
    4. ```esc```を押して、```SHIFT```を押しながら```z```を2回押します（保存して終了）。<br>
    <font color="red">これらの操作はこれからずっと使います。覚えておいてください。</font>
3. **実行する**
    1. ```$python3 test.py```で実行できます。<br>
    *:sunny:python3というプログラム言語で書かれた、test.pyというプログラムを実行という意味です。*
    2. 正しく実行されれば、先ほど入力した「こんにちは！プログラムを始めました！」が出力されます。<br>
    <img width="510" alt="3_program_run.png" src="https://qiita-image-store.s3.amazonaws.com/0/231619/2c5295f0-8a0d-4a11-6286-ca19167c6ace.png">

##第4章　最後に
今回はvimを設定して実際にプログラムを作ってみました。次回は人感センサーを使って反応を取得します。お疲れ様でした。
次の記事：[人感センサーの設置と反応の取得](https://qiita.com/namekuji/items/9b5289ab003f0c54f21d#_reference-6f7e5ef497398baba39e)
Heroku Postgresのデータをローカルにコピーする方法 - Docker Compose版

## docker-compose便利

HerokuにあるPostgresのデータをローカルにdumpしてrestoreし、本番環境と同じデータで検証したいというケースは多いはず。

最近であれば、ローカルの開発環境はすべてdocker(とcompose）で構築している方も多いはず。かくいう私も基本的には、

* Postgres / Redisなどのミドルウェアは `docker-compose.yml`をプロジェクトごとに用意して立ち上げる
* Rubyはrbenv(dockerを経由しない）

このような環境でやっています。昔はrubyの環境もdocker-compose経由で行っていましたが、実行速度等総合的に判断してrbenv以上のメリットを感じないと思い、rbenvでやっています。nodeもそうですね

## heroku toolbeltからdocker-compoesのpgへリストア

ここからが本題です。

heroku toolbeltからdocker-composeへリストアするスクリプト。このスクリプトをプロジェクトフォルダのどこかに置きます。

```bash
#!/usr/bin/env bash

heroku_app="YOUR_AWESOME_HEROKUAPP"
database_name = "開発環境のデータベース名"

heroku pg:backups capture --app $heroku_app
curl -o latest.dump `heroku pg:backups public-url --app $heroku_app`

docker-compose up -d db
DOCKER_DB_NAME="$(docker-compose ps -q db)"
docker exec -i "${DOCKER_DB_NAME}" pg_restore --verbose --clean -U "postgres" --no-acl --no-owner -d $database_name < "latest.dump"
docker-compose stop db
```

これは、何をしているかというと

1. `YOUR_AWESOME_HEROKUAPP`というHerokuアプリのバックアップをとる
2. curlでローカルに`latest.dump`という名前でダウンロード
3. docker-composeでPostgresを立ち上げる
4. そのときのDockerコンテナIDを覚えておく
5. コンテナに入ってpg_restore
6. postgresコンテナを停止

参考までに、postgresのdocker-compose.ymlはこんな感じです

```yaml

version: '2'
services:

  db:
    image: postgres:9.6.2
    environment:
      - "POSTGRES_USER=postgres"
      - "POSTGRES_PASSWORD=password"
    volumes_from:
      - data
    ports:
      - "5432:5432"

  data:
    image: "busybox"
    volumes:
      - "db:/var/lib/postgresql/data"
      - "bundle:/usr/local/bundle"

  redis:
    image: redis:3.2.10-alpine
    ports:
      - "6379:6379"

volumes:
  db:
    driver: local
  bundle:
    driver: local

```

これは、各プロジェクト共通で使えるので効率的に開発が出来るようになります。

こういう小技が使えるのも、Herkouのメリットですね。
【jQuery】パララックス設置方法

ダウンロード
https://github.com/Prinzhorn/skrollr
公式デモ
http://prinzhorn.github.io/skrollr/
参考サイト
設定方法
https://www.imd-net.com/blog/2016/10/26-213534/
デモ
http://teamsanta.info/sample/skrollr/
エラー
https://www.flying-h.co.jp/media/2014/10/01/skrollrsampleclassic_parallax_with_different_sections_and_parallax_images_between_the_gaps/

#手順
##1,jQueryダウンロード
ダウンロードして読み込ませるjs
→skrollr.min.js
とこれを直下に書く↓。

```ruby:
<script>
    var s = skrollr.init();
</script>
```

##2,パララックスさせたい要素に動作してほしいことを記述していく

例）スクロール0(data-0)の時は背景色白で、スクロールが2000(data-2000)になったら背景色黒に変更。

```ruby:ex
<body
   　　data-0="background: rgb(255,255,255);"
    data-2000="background: rgb(0, 0, 0);">
```

##3,スクロール量を計測する

```ruby:js
$(function() {
 
  // スクロールしたら発動
  $(window).scroll(function() {
 
    // スクロール量を変数に格納
    var sc = $(this).scrollTop();
 
    // HTMLにスクロール量を表示
    $('p').text(sc);
 
  });
});
```
Sketch備忘録~ショートカットキー編~

#はじめに
ショートカットキーを覚えられない~~(覚えて忘れてを繰り返す)~~ので書き置きメモします。

##環境
sketch Version48.2 (Free Trial)

##今回の備忘録
Skecthで勉強できたショートカットキーまとめ(随時追加)

|ショートカットキー|詳細| 
|:----------------------:|:----------------------:|
|option + 長押し|位置表示|
|option + ドラッグ + enter|要素のコピー|
|ドラッグorクリック + Z|対象の範囲にズームイン|
|option + Z|ズームアウト|
|command + 1|キャンバスを見渡せるようにズームインorズームアウト|
|command + 2|指定したオブジェクトに合わせてズームイン|
|command + 3|対象の要素を中央に配置|
|command + R|ルーラー設置|
|command + 要素選択 + R|リネーム|
|control + P|表示の切り替え|
Python で Linux の rename コマンドを実装

Homebrew の [rename](https://qiita.com/shuhei/items/cf1ddf373d1f83d5d667) コマンドは高機能なんだけど、その分オプションが多くて覚えられない…
Linux みたいにシンプルな `rename from to file...` のコマンドが欲しいなあと思って Python で作ってみました。

# 環境
macOS Sierra 10.12.6
Python 2.7.10
Homebrew 1.5.4

# 実装

```python:rename.py
import sys
import os

args = sys.argv
itext = args[1]
ftext = args[2]
files = set(args[3:])

for iname in files:
    fname = iname.replace(itext, ftext, 1)
    if fname != iname:
        if os.path.exists(fname):
            print("'"+iname+"' cannot be renamed to '"+fname+"'. '"+fname+"' has already existed.")
        else:
            os.rename(iname, fname)

``` 

[GitHub](https://gist.github.com/ryutok/80410de2d3340a7883652ab9fb21476c) からもダウンロードできます。

# 実行速度
10,000個のファイルを rename したときの実行速度を time コマンドで測定。

|    |Homebrew| Python |
|:---|-------:|-------:|
|real| 1.571 s| 3.425 s|
|user| 0.508 s| 1.607 s|
|sys | 0.832 s| 1.091 s|

# 結論
Python での rename コマンドの実装は処理速度の面で問題あり。
エイリアス `alias rename="rename -s"` で対応した方が良さそう。
FatFS > R0.13 > fs->winをセットしている処理の整理

http://elm-chan.org/fsw/ff/00index_e.html
http://elm-chan.org/fsw/ff/archives.html

ChaNさんによるFatFSに関して見ている(ソースのバージョンはR0.13)。
(R0.13のR0.12cバグ修正と関連して)。
> Fixed exFAT FAT entry can be collapsed when write or lseek operation to the existing file is done. (appeared at R0.12c)

ff.hにおいてFATFS構造体が定義されている。その中で気になっているメンバは以下。

```ff.h
    ...
    BYTE	win[FF_MAX_SS];	/* Disk access window for Directory, FAT (and file data at tiny cfg) */
} FATFS;
```

win[]の値はどこでセットされているのか?

sync_fs()において以下のような実装で値がセットされている。
st_word()というのはstoreする関数のようだ。他にst_dword()とst_qword()がある。

```c
st_word(fs->win + BS_55AA, 0xAA55);
```

put_fat()においても以下のような実装で値がセットされている。

```c
st_dword(fs->win + clst * 4 % SS(fs), val);
```

これらの値がdisk_write()において`Data to be written`として使用されているようだ。
GCP上でWindowsにディスク追加　コマンドライン編

#目的
ＧＵＩからボリュームを追加に行ったら何度やってもAccess deninedになったので諦めてdiskpartを利用しました。マニュアルにはdiskmgmt.mscを使えとありますが、私の環境ではだめでした。

#手順
１．Compute Engineでディスクを作成してVMインスタンスへ追加します。
　VMインスタンス側からでも作成可です。
　![gcp-add-disk01.png](https://qiita-image-store.s3.amazonaws.com/0/220924/8cd324f9-1cfd-7934-68d7-b6059904c1df.png)
　![gcp-add-disk02.png](https://qiita-image-store.s3.amazonaws.com/0/220924/5c904470-1c49-033c-8b9b-319f0a28683c.png)

２．次のコマンドをサーバー上で実行します。（コマンドプロンプトは管理者で実行です）
　a. diskpartを起動します。
　b. list diskを実行します。
　　![gcp-add-disk03.png](https://qiita-image-store.s3.amazonaws.com/0/220924/d21cb72b-dda7-880e-1b94-a903114ab27f.png)
　c. select diskを実行します。
　　![gcp-add-disk04.png](https://qiita-image-store.s3.amazonaws.com/0/220924/cb128486-f4b0-6fab-0193-578ef2d436b9.png)
　　list diskで*が付いていれば選択済みです。
　d. convert gptとconvert dynamicを連続実行します。
　　![gcp-add-disk05.png](https://qiita-image-store.s3.amazonaws.com/0/220924/b99b1caf-470d-3654-0e90-09822b3a2066.png)
　e. create volume simple size=xxx MBを実行します。
　　![gcp-add-disk06.png](https://qiita-image-store.s3.amazonaws.com/0/220924/03ed7f4f-1cee-6b98-7401-69eefc64c377.png)
　f. format fs=ntfs label="xxxx" quickを実行します。
　　![gcp-add-disk07.png](https://qiita-image-store.s3.amazonaws.com/0/220924/cb8928a3-de1a-9780-6a5e-ec6e89017e60.png)
　g. assign letter=Xを実行します。
　　![gcp-add-disk08.png](https://qiita-image-store.s3.amazonaws.com/0/220924/d5513304-9904-4c6e-667b-6ba54b1ec34c.png)

#きっかけ
　Windowsのディスクを増やそうとしたら、サーバーマネージャーからやると
　Access deniedになって進めず、
　![gcp-add-disk09.png](https://qiita-image-store.s3.amazonaws.com/0/220924/e940bf0d-d636-532a-1bc0-fcbf0fa61dc1.png)

#diskmgmt.mscの結果
　私の環境では動きませんでした。一度、GUIでダメにしてしまうとdiskpartでもvolumeを削除するしかないようなので、最初からdiskpartを使った方がよいと判断しました。
　![gcp-add-disk11.png](https://qiita-image-store.s3.amazonaws.com/0/220924/cea27300-7b44-ac1a-6afc-33d1769524ef.png)
　アクセスすると
　![gcp-add-disk12.png](https://qiita-image-store.s3.amazonaws.com/0/220924/2d48c0b4-c467-c956-798a-980b4d3c967a.png)
　という感じです。

#運用面での不安
　ボリュームの拡張や縮小はdiskmgmt.mscでできるので若いメンバーも安心です。
　追加だけがdiskpartでしかできませんでした。extendはともかくshrinkはわかりづらい。まず、使わないにしても。
FatFS > R0.13 > fs->n_fats > 1(exFAT), 2(FAT)

http://elm-chan.org/fsw/ff/00index_e.html
http://elm-chan.org/fsw/ff/archives.html


ChaNさんによるFatFSに関して見ている(ソースのバージョンはR0.13)。

ff.cにおいて`fs->n_fats`の値によって異なる処理をしている。
n_fatsが1か2の時の処理をしているようである。


find_volume()において以下のような実装がある (fmt==1の時)。

```ff.c
		fs->n_fats = fs->win[BPB_NumFATsEx];			/* Number of FATs */
		if (fs->n_fats != 1) return FR_NO_FILESYSTEM;	/* (Supports only 1 FAT) */
```

また、下記のような実装もある (fmt!=1の時)。

```ff.c
		fs->n_fats = fs->win[BPB_NumFATs];				/* Number of FATs */
		if (fs->n_fats != 1 && fs->n_fats != 2) return FR_NO_FILESYSTEM;	/* (Must be 1 or 2) */
```

fmtはcheck_fs()により取得され、check_fs()のコメントで以下のように記載がある。

- 0: FAT
- 1: exFAT
- ...

まとめると下記ということなのだろう。

- exFATの時: n_fats == 1
- FATの時: n_fats == 2

n_fatsが2に対する処理は、FAT関連の処理だと推測される(例としてsync_window())。


```ff.c
if (fs->n_fats == 2) disk_write(fs->pdrv, fs->win, fs->winsect + fs->fsize, 1);	/* Reflect it to 2nd FAT if needed */
```