OmniAICreator/Qiita-1.07M huggingface dataset:
文系学生のプログラミング学習1日目

ここ数日体調が悪く前回の投稿から時間が経ってしましました。
今日から本格的にスタートします。
HTML/CSS、JavaScriptを使ってwebサービス作成の勉強をしようと思い、チュートリアルを探していたのですが、この３つの他にjQueryというアニメーションをつける言語が必要らしく、急遽progateでjQueryを学習することにしました。

#自分なりのプログラミング学習法

今まで勉強してきた中で、progate→ドットインストールという自分なりのルーティンが出来ました。
初めはprogateで基本的な解説を見て感覚をつかみ、ドットインストールで実践するという形。
ドットインストールは進みが速いので、はじめは難しい気がします。

また、私はprogateで学習するときに基本的な形などをいちいちノートに書いて覚えるようにしているのですが、これは良いのか悪いのかまだ分かりません。サイトなどには書くことが大切みたいに書かれていますけどね。

#'this'メソッドについて

学習していく中でthisメソッドというものが出てきました。

<li>要素が複数あり、それにclickイベントがついていた場合に実際にクリックされた要素だけに処理を行いたい時に使うものです。
はじめは意味が分からず、「これ本当に必要か？」と思いました。
試しにthisメソッドを使わずにやってみると上手くいかないことが分かりました。

何が言いたいかというと、ある機能の意味が分からないときはそれを使わないとどうなるかを試してみることが大切ということです。

明日はドットインストールで引き続き学習していきます。
EC2インスタンスの wake on ALB Access と停止

# EC2インスタンスの wake on ALB Access
## 目的
* [AWS Instance Scheduler](https://aws.amazon.com/jp/solutions/instance-scheduler/)とか便利なのがあるけど、もっと節約したい。
* 不定期でしか利用しないWebサイトをスケジュールで課金するのはもったいない。

## 要件
* インスタンス起動にCLIもマネージメントコンソールも利用したくない
* 起動してから一定時間アクセスが無かったら、自動でインスタンス停止する

## 考え抜いた起動方法（妥協
* 起動トリガーは `ブラウザからURLをアクセスして、ALBに[503]エラーを吐かせる` に決定
* インスタンス起動は何でやっても一定の時間は必要だし
* ブラウザからアクセスしたら、タバコでもトイレでもネット見るなりして時間潰せば良いんだ

### 起動
* CloudWatch メトリクス ALB 500 の合計値が1分間で1件以上を検知してアラーム

CloudWatch メトリクスを作るところ毎回わかりづらいからイメージ貼っとく

<img width="723" alt="qiita3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/164563/083349a6-9ef4-9353-44af-7a5cd569f2f8.png">
<img width="872" alt="qiita4.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/164563/1758da32-7d88-e9f4-9868-f804e2abaaa8.png">
<img width="901" alt="qiita5.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/164563/7cc4dc66-4cc2-ff8a-bc98-12c68d550bf9.png">
<img width="1034" alt="qiita6.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/164563/9cff65a9-c250-5263-0fd0-b23f89b94048.png">


* アラーム→SNSトピック→Lambda起動して、EC2インスタンス起動

```python:EC2を起動するlambdaのソース
import boto3
 
def lambda_handler(event, context):
    region = "ap-northeast-1"
    instances =[
        "i-XXXXXXXXXXXXXX",
    ]
    ec2 = boto3.client('ec2', region_name=region)
    ec2.start_instances(InstanceIds=instances)
```

### 停止
* クラウドウォッチメトリクス ALBのTargetGroup 200 の合計が1時間で0件以下を検知してアラーム
* アラーム→SNSトピック→Lambda起動して、EC2インスタンス停止

```python:EC2を停止するlambdaのソース
import boto3
 
def lambda_handler(event, context):
    region = "ap-northeast-1"
    instances =[
        "i-XXXXXXXXXXXXXX",
    ]
    ec2 = boto3.client('ec2', region_name=region)
    ec2.stop_instances(InstanceIds=instances)
```

## よく考えたら
* ALBを使わない方が節約になりそうな気もする・・・
JavaScript: Object.prototypeにメソッドを生やしてパイプライン演算子っぽくしてみた

まず最初に言っておきます。ビルトインオブジェクトにプロパティ、メソッドを追加するのは、たいがい Bad mannerです。やらないでください。

と ことわった上でちょっとだけ遊んでみました。
今現在、```|>``` はまだ普通には使えないので、代わりといっては何ですが、パイプライン演算子っぽいものを作ってみます。

```js:
const _ = Symbol("pipeline")
Object.prototype[_] = function(f){return f(this)}
```
はい完成。
Object.prototype に [_] というメソッドを追加してみました。自分を関数に適用した結果を返す、みたいなことです。
名前は既存のプロパティ、メソッドとかぶっちゃいけないので、Symbolを使ってみました。

こんな使い方です。

```js:
console.log(
  [0,1] 
    [_] (x=>x.map(e=>e*2))               // [0, 2]
    [_] (x=>x.reduce((acc,e)=>acc+e,0))  //  2
    [_] (x=>x===0)                       // false
    [_] (x=>!x)                          // true
);  // 'true'
```
ほーらパイプライン演算子に見えてきた!

おしまい。

くれぐれも本番では使いませんように。

「おかしいよ」「そんなことしたら、こんな悪いことがあるぞ」というようなお叱りのコメント、おまちしております。

#追記： これのダメなところと対策

もうちょっと遊んでみます。

## ダメなところ

Object.prototype にメソッドを付ければ、すべてのモノに使える、と思ったのが間違いの元。

```js:
null[_]  // TypeError: Cannot read property 'Symbol(pipeline)' of null
undefined[_]  // TypeError: Cannot read property 'Symbol(pipeline)' of undefined
```
null と undefined には使えませんでした。
なので、実行時にこの疑似パイプラインのチェーンの途中にこれらの値が現れると、エラーで止まる、ということになります。

## 対策1 ： nullとundefinedを適宜、別のものにすりかえる

```js:
const thingNull = Symbol("null")
const thingUndefined = Symbol("undefined")
const checkFail = x =>
  x===null ? thingNull
  : x===undefined ? thingUndefined
  : x

const _ = Symbol("pipeline")
Object.prototype[_] = function(f){
  const thingThis = this.valueOf()
  return checkFail(
    f(
      thingThis===thingNull ? null
      : thingThis===thingUndefined ? undefined 
      : thingThis
    )
  )
}
```
こうしておくと

````js:
checkFail(undefined) [_] (x=>x);  // Symbol(undefined)
checkFail(null) [_] (n=>n===null);  // true
```
のように、最初だけ null/undefined かどうか、チェック checkFail() が必要ですが、あとは適宜ダメなところは別のオブジェクト thingNull/thingUndefined にすりかえながら計算を続行してくれます。

## 対策2 ： null, undefined, NaN をまとめて、「計算が失敗した」ことにする


```js:
const Nothing = Symbol("Nothing")
const checkFail = x =>
  x===null || x===undefined || Number.isNaN(x) ? Nothing : x

const _ = Symbol("pipeline")
Object.prototype[_] = function(f){
  const thingThis = this.valueOf()
  return (thingThis===Nothing)?  Nothing
  : checkFail(f(thingThis))
}
```
対策1と似ていますが、 null/undefined/NaN が現れたら 計算の失敗 Nothing ということにして 以降は計算しないで Nothing を返す、というところが違います。

```js:
checkFail(undefined) [_] (x=>x);  // Symbol(Nothing)
checkFail(null) [_] (n=>n===null);  // Symbol(Nothing)
checkFail( 1 ) [_] (x=>NaN);  // Symbol(Nothing)
```
これで、途中に null/undefined が現れても大丈夫になりました。

おしまい。
くれぐれも本番では使いませんように。
UITableViewDelegateに準拠したクラスを継承した時にUIScrollViewDelegateメソッドが呼ばれない場合の対処法 

レア？なケースに直面したので備忘として。

# 前提条件
- UITableViewDelegateに準拠したクラスを準備

```swift:BaseClass

class BaseClass: UITableViewDelegate {
   ・・・(省略)
}

```
- BaseClassを継承した子Classを二つ用意

```swift:ChildClassA
class ChildClassA: BaseClass {
   ・・・(省略)
   // 例えばこのメソッドを定義
   func scrollViewDidScroll(_ scrollView: UIScrollView) { print("A") }
}

```

```swift:ChildClassB
class ChildClassB: BaseClass {
   ・・・(省略)
   // 例えばこのメソッドを定義
   func scrollViewDidScroll(_ scrollView: UIScrollView) { print("B") }
}

```

# 実行結果(各画面でスクロールさせた時)

```swift:結果
A <- なぜか片方しか実行されない
```

# 対応
### BaseClassで空のDelegateメソッドを実装して、子ClassでOverRideするようにした

```swift:BaseClass

class BaseClass: UITableViewDelegate {
   ・・・(省略)
   // 空メソッドを定義
   func scrollViewDidScroll(_ scrollView: UIScrollView) {}
}

```
- BaseClassを継承した子Classを二つ用意

```swift:ChildClassA
class ChildClassA: BaseClass {
   ・・・(省略)
   // オーバーライド
   override func scrollViewDidScroll(_ scrollView: UIScrollView) { print("A") }
}

```

```swift:ChildClassB
class ChildClassB: BaseClass {
   ・・・(省略)
   // オーバーライド
   override func scrollViewDidScroll(_ scrollView: UIScrollView) { print("B") }
}

```

# 再実行結果(各画面でスクロールさせた時)

```swift:結果
A
B
```

あまりスマートな解決方法ではないと思いますが、一応やりたいことは出来ました。

かなり簡略化してますが、基本的にはこの構成になっており自分が調査した限りではAとBの違いを見出せず...
UIScrollView周りに知見がおありの方、「ここが怪しいんじゃないの？」的なご意見ございましたら是非ともお願いします(_ _)
きちんとマークアップすると爆速でコピペできる

みなさん、きちんとマークアップできていますか？`div`だけでマークアップしたりしてないですか？

style当てれば見た目一緒になるやん、よくわからんから`div`で作っておけばいいでしょ、見た目一緒だから…などの理由で`div`を多様するのは最悪ですね。
宗教上の理由で`div`しか使えないなどの理由がある方は仕方がありません。

おざなりになりがちなマークアップですが、きちんとマークアップすることの重要性を知っておきましょう。

# 第1話 table編
`table`、それは太古の昔、ホームページを召喚する儀式の際に使われていた古代言語…。
といういいつたえもありますが、今でも現役の要素です。

ExcelやSpreadsheetなどの**表形式のデータ**を作りたいときに適しています。そういうときにばしばし使いましょう。

## 表を組んでみた
<img width="216" alt="よつばたそ〜〜〜〜〜" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241886/5efbff1a-0272-5225-9526-823a6019aabd.png">
[実際のものはこちら(Codepen)](https://codepen.io/dazi_gomi/pen/jRGQrV)

最高な表ですね。みなさんはどの子が好きですか？ぼくは4の子が好きです。
この最高な表を社内のみんなにも見てもらいたいので、Excelにコピペしてメールに添付して送りましょう。
この表をコピーしてExcelにペーストすれば…
<img width="107" alt="divでマークアップした場合" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241886/da87d185-4566-3066-8ece-e47f02f92f67.png">
…。
最高な表が崩れてしまい、最悪な表になってしまいました。完全に怪文書です。
こんな怪文書を送ったら、頭がヤバイと思われて解雇間違いなしなので、せっせと表を組み直…

さなくても、`table`要素にするだけでtableの書式が保持されちゃいます。
なので`div`をtableに置き換えてみましょう。

``` table.html
<table class="table">
  <thead class="thead">
    <tr class="tr">
      <th class="th">First</th>
      <th class="th">Last</th>
      <th class="th cv">CV</th>
    </tr>
  </thead>
  <tbody class="tbody">
    <tr class="tr">
      <td class="td">中野</td>
      <td class="td">一花</td>
      <td class="td cv">花澤香菜</td>
    </tr>
    <tr class="tr">
      <td class="td">中野</td>
      <td class="td">二乃</td>
      <td class="td cv">竹達彩奈</td>
    </tr>
    <tr class="tr">
      <td class="td">中野</td>
      <td class="td">三玖</td>
      <td class="td cv">伊藤美来</td>
    </tr>
    <tr class="tr">
      <td class="td">中野</td>
      <td class="td">四葉</td>
      <td class="td cv">佐倉綾音</td>
    </tr>
    <tr class="tr">
      <td class="td">中野</td>
      <td class="td">五月</td>
      <td class="td cv">水瀬いのり</td>
    </tr>
  </tbody>
</table>
```

コピペすると…
<img width="304" alt="tableでマークアップした場合" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241886/9298389b-afdd-ca87-8684-383add25cd86.png">
ｷﾀ━━━━(ﾟ∀ﾟ)━━━━!!
誰が見てもわかる最高の表になりましたね。
あとはこれをzipにしてパスは教師…。

………

## 後日談
偉い人「キミ頭大丈夫？なんかヤバそうだから解雇ね。」

**完**

## まとめ

- Webクローラーからすると、`div`だけで構成されているページは謎の情報が置いてあるだけのページにしか見えない。
- 適切にマークアップされていることにより、クローラーにもページの構造が理解できるようになる。よってSEO的な面で有利。(になるかはわからないけど少なくともマイナスにはならない)
- コピペしやすかったり、ユーザビリティも爆上がりする。
- 綺麗に掛けてると育ちよく見える。

ちなみに画像のaltもコピペできたりします。
装飾で使っている画像のaltに装飾とか入れてインライン要素で配置すると、文章滅茶苦茶になるので気をつけましょう。

## 次回予告
次回は**『脱div、抑えておきたい要素一覧』**です。

### 追記
`div`で組んだものにcssを当てる前のものを追加しました。(見やすいようにサイズだったりドット線追加してますが)
`div`オンリーのものは「縦積みされている箱を無理矢理配置し直して表っぽく見せている」 ような感じです。
一方`table`は、Headerを意味する`th`だったり、列を意味する`tr`、セルデータを意味する`td`などを用いて意味も記述してあるので機械が意味を汲み取ってくれていると思ってもらうのが良いかと思います。（たぶん）
初代Hololensの環境構築 (MRTK v2もあるよ)

# なぜ
幣研究室にてHololensを使った研究をするため
同じ研究に取り組む身内のために書いたものなので、ガバい所があります。
# Hololens環境構築の手順
## Visual Studio 2017 のインストール
1. 以下から最新のVisual Studio 2017のDLできる  
https://docs.microsoft.com/ja-jp/visualstudio/releasenotes/vs2017-relnotes
2. Visual Studio Installer で必要なパッケージの設定  
`ユニバーサル Windows プラットフォーム開発`  
`Unity によるゲーム開発`  
上二つにチェック  
オプションから `Unity 20XX.X 64-bit Editor` のチェックを外す

### なぜ2017なのか?  
以下参照  
https://docs.microsoft.com/ja-jp/windows/mixed-reality/install-the-toolsVisual  
Studio 2019 ではMR開発に既知の問題があるらしい  
## Unity のインストール
1. 以下からUnityHubをDLできる  
https://store.unity.com/ja/download?ref=personal
2. Instals -> Official Releases から Unity 2018.3.x の最新のものをDownload  
ちなみに2019年5月現在、Unity 2018.4.x LTS が出ている  
私は試していないが、Unity 2018.4.x LTS でも出来るかも？  
追記 : MRTK対応していなかったので、大人しく Unity 2018.3.x を使いましょう
3. Add  components to yor install から `UWP Build Support (IL2CPP)` にチェック

## MRTK のセッティング
1. Windows 10 を Windows 10 Fall Creators Update 以降のバージョンにする
2. windows SDK 18362 よりも新しいのに更新する  
以下からWindows SDK をDLできる  
https://developer.microsoft.com/en-US/windows/downloads/windows-10-sdk
3. MRTK のダウンロード  
2019年5月現在での最新版は `Microsoft Mixed Reality Toolkit v2.0.0 RC1 Refresh` である  
以下のサイトから  
https://github.com/Microsoft/MixedRealityToolkit-Unity/releases  
`Microsoft.MixedReality.Toolkit.Unity.Examples-v2.0.0-RC1-Refresh.unitypackage`  
`Microsoft.MixedReality.Toolkit.Unity.Foundation-v2.0.0-RC1-Refresh.unitypackage`  
をDLする
4. Unity の対象となるプラットフォームを切り替える  
Unity で新しいプロジェクトを作成  
File -> Build Settings -> Platform -> Universal Windows Platform を選択し、  
Switch Platform をクリック
5. MRTK のパッケージを Unity にインポート  
Assets -> Import Package -> Custom Package ... をクリック  
`Microsoft.MixedReality.Toolkit.Unity.Foundation-v2.0.0-RC1-Refresh.unitypackage`  
`Microsoft.MixedReality.Toolkit.Unity.Examples-v2.0.0-RC1-Refresh.unitypackage`  
の順でインポート  
出てきたダイアログは基本Applyで大丈夫かと.....  
(詳しくは https://microsoft.github.io/MixedRealityToolkit-Unity/Documentation/GettingStartedWithTheMRTK.html)

# 参考リンク  
https://qiita.com/sifue/items/d83384282d0e75cf36e7https://docs.microsoft.com/ja-jp/windows/mixed-reality/install-the-tools
https://www.gaprot.jp/gaprot-x-chogiken/xr/hololens
https://microsoft.github.io/MixedRealityToolkit-Unity/Documentation/GettingStartedWithTheMRTK.html
https://microsoft.github.io/MixedRealityToolkit-Unity/Documentation/GettingStartedWithTheMRTK.html
AWS codebuildでのshell 出力の注意点

# 目的
環境情報を環境変数で吸収させるため、codebuild内で出力した イメージ定義ファイルimagedefinitions.json の内容を文字列置換したい。

# 現行ソース
```buildspec.yml
post_build: 
    commands: 
      - printf '[{"name":"PREFIX-fargate-container","imageUri":"%s"}]' $REPOSITORY_URI:$IMAGE_TAG > imagedefinitions.json
```

# 修正方針
クォート処理が手間なので、出力後にsedコマンドで置換することにした。

```修正案buildspec.yml
      - sed -e "s/PREFIX/$PREFIX/g" imagedefinitions.json > imagedefinitions.json 
```

しかし、テストしてみたところ、置換後に出力したはずのイメージ定義ファイルimagedefinitions.json が空となってしまい、後続のCodeDeployでエラーが発生した。

# 対応
一時的ファイルをかませることで動作が確認できたので、そちらで対応した。

```修正後buildspec.yml
post_build: 
    commands: 
      - printf '[{"name":"PREFIX-fargate-container","imageUri":"%s"}]' $REPOSITORY_URI:$IMAGE_TAG > temp.json
      - sed -e "s/PREFIX/$PREFIX/g" temp.json > imagedefinitions.json 
```

# 所感
入力ファイルと出力ファイルを同一ファイルにすると、空になってしまうのはなぜだろう。
OpenCVで編集した動画が保存できなくて、もう遠回りした

タグがカオスになってますね...笑

さて、環境ですが
MAC OS X 10.14.4
python 3.7.3
Opencv 3.4.2
PIL 5.4.1

#やりたかったこと
プレゼンでキャニーエッジ処理をした動画を見せたくて保存したかったんですよ。
OpenCVを使うとキャニーエッジの処理がめっちゃ簡単にできるじゃないですか

out.write(frame)使って動画を作ると
<img width="528" alt="スクリーンショット 2019-05-14 16.40.01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404462/21ed00ff-5735-0591-6f2d-204bc9107655.png">

動画が258バイトってありえないよねー。そもそも再生できないし。

#色々調べたがもう保存できれば良いかと開き直った
#####ffmpegで連番画像を作成
　　　　↓
#####PILで画像を読み込み
　　　　↓
#####OpenCVでCannyEdge処理
　　　　↓
#####PILで画像を保存
　　　　↓
#####ffmpegで連番画像を動画に戻す

#具体的な手順
input.mp4から連番画像を作成します。

```
ffmpeg -i input.mp4 -vcodec png image_%03d.png
```

連番画像
image_001.png
image_002.png
...
image_125.png
こんな感じでできます。

この連番画像をOpenCVで編集するわけですが、保存パートができなかったわけで
PILを利用して画像を保存します。

コードは以下

```CannyEdge.py
import numpy as np
from PIL import Image
import cv2

#img file
pic_start = 1
pic_finish = 125

for i in np.arange(pic_start,pic_finish+1):
  #扱っている画像を表示
  print("\r{:}".format(i),end = "")

  #open image
  im = Image.open("image_{:0=3}.png".format(i))

  #OpenCVに渡すためにnumpyに変換
  open_im = np.asarray(im)

　#CannyEdge処理
  edges = cv2.Canny(open_im, 100, 150)

  #save image
  pil_im = Image.fromarray(edges)
  pil_im.save("image2_{:0=3}.png".format(i))
```

そして最後に新たな連番画像をffmpegにより動画に戻す。

```
ffmpeg -r 30 -i image2_%03d.png -vcodec libx264 -pix_fmt yuv420p -r 30 out.mp4
```

これによりキャニーエッジ処理したout.mp4が保存できます。
~~OpenCV便利なんだけどたまにな...~~
LINE WORKS + Azure Automation + Microsoft Flow で LINE WORKS Bot からトークメッセージ送信

こちらの記事で PowerShell のコマンドレット操作で LINE WORKS のトーク BOT API を用いて、任意のメンバーやトークルームにメッセージを送る方法を紹介しました。

TITLE: PowerShell から トーク Bot API で LINE WORKS にメッセージ送信
URL: https://qiita.com/iwaohig/items/92a3b5b4af288c22a96a

さらに、こちらの記事では Windows のタスク スケジューラを用いて、エラー イベントの記録などをトリガーに Bot からトークで通知を送る方法を紹介しました。

TITLE: Windows のイベント ログに特定のイベントが記録されたら LINE WORKS の Bot で通知
URL: https://qiita.com/iwaohig/items/8853ed4433f6653396c2

本記事では、Microsoft Flow と連携して、各種 Web サービスと連動して、LINE WORKS のトーク Bot API からメッセージを送信してみます。

Microsoft Flow と連動して PowerShell スクリプトを実行するために Azure Automation を利用します。

#Azure Automation

Azure Automation の利用開始にあたっては、Azure Portal で "Automation アカウント" を作成し、"Runbook の種類"が PowerShell" の Runbook を作成します。

TITLE: Azure Automation アカウントを作成する
URL: https://docs.microsoft.com/ja-jp/azure/automation/automation-quickstart-create-account

TITLE: Azure Automation Runbook を作成する
URL: https://docs.microsoft.com/ja-jp/azure/automation/automation-quickstart-create-runbook

この Runbook に以下のスクリプトを記述します。

```
$header = New-Object "System.Collections.Generic.Dictionary[[String],[String]]"
$header.Add("Content-Type","application/json; charset=UTF-8")
$header.Add("consumerKey","<Server API Consumer Key>")
$header.Add("Authorization","Bearer <Server Token>")
$header.Add("Cache-Control","no-cache")

$request = @"
{
    "botNo": <bot No.>,
    "accountId": "<user id>",
    "content": {
        "type": "text",
        "text": "<メッセージ本文>"
    }
}
"@


$Body = [System.Text.Encoding]::UTF8.GetBytes($request)

$Uri = "https://apis.worksmobile.com/<API ID>/message/sendMessage/v2"
Invoke-RestMethod -Uri $Uri -ContentType 'application/json' -Method Post -Header $header -Body $Body
```
なお、このスクリプトでは アドレスを基にした LINE WORK の API 認証トークンを利用するため、Azure Automation の Hybrid Runbook Worker 機能を用います。

TITLE: Windows Hybrid Runbook Worker をデプロイする
URL: https://docs.microsoft.com/ja-jp/azure/automation/automation-windows-hrw-install

TITLE: Hybrid Runbook Worker での Runbook の実行
URL: https://docs.microsoft.com/ja-jp/azure/automation/automation-hrw-run-runbooks

Runbook の作成が完了したら "開始" ボタンのクリックで正常に動作することを確認しましょう。この際に実行設定の実行対象をハイブリッド Worker に指定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396107/a89b91cc-e91d-fb3e-ad8b-aa07f26dff52.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396107/b591103d-eb66-f3b1-1036-bc597d402096.png)

ジョブが完了し、正しく応答があることが確認できます。

#Microsoft Flow

Microsoft Flow から Azure Automation の Rubook を呼び出して実行できます。これによって、Microsof Flow で連携できる各種 Web サービスの動作などをトリガーに LINE WORKS の Bot からトーク メッセージが送信できます。

TITLE: Microsoft Flow でのフローの作成
URL: https://docs.microsoft.com/ja-jp/flow/get-started-logic-flow

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396107/0ccefa78-56f4-7493-6663-f38a91ca9a97.png)

ここではテスト目的で Flow のモバイル アプリのボタンをトリガーにしていますが、実際には利用目的に応じた設定を行います。

#動作確認

Flow のジョブの作成画面から "テスト" をクリックし、LINE WORKS にトークメッセージが送られることを確認します。

正常動作が確認できれば、ジョブを保存して、実際にトリガーとなるアクションの後にメッセージが届くことを確認します。
AWS DeepRacer　リソース一括削除方法（メモ）

## 作成したリソースの一括削除
DeepRacer関連のリソースが不要になった場合、

1. CloudFormationのコンソールで、対象（DeepRacer）のスタック（Stack）を削除すると、データおよび作成された環境が削除されます。
2. S3に、作成したモデルなど残っているので、不要なら削除します。
3. IAMコンソールで、以下のロールを削除する。<BR>
　・AWSDeepRacerCloudFormationAccessRole<BR>
　・AWSDeepRacerLambdaAccessRole<BR>
　・AWSDeepRacerRoboMakerAccessRole<BR>
　・AWSDeepRacerSageMakerAccessRole<BR>
　・AWSDeepRacerServiceRole<BR>

これで課金は完全にストップされる（はず）。

再度、DeepRacerを行う場合は、Account resourcesで「Reset resources」を実行すればOKです。
Cognos Analytics CSVやExcelデータのアップロード方法

#データのアップロード方法
Cognos Analyticsでは、自分の端末上にあるCSVファイルやExcelファイルをCognosポータルにアップロードして、レポートやダッシュボードの開発に使用する事ができます。
この章では、エンドユーザーの方がブラウザ上でCognosにアクセスし、簡易的なデータモデリングを行える「データ・モジュール」の機能を学びますが、本記事ではその前提として、CSVデータの作成からCognosアップロードを行う方法を学びます。
![005.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/a2f1b45b-1448-f9e2-0534-f9d91d69e056.jpeg)

Cognosポータルへのアップロード後のCSVデータエントリー
![013.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/2d175a6b-0edf-36bf-8861-8b238ac9551e.jpeg)


ある程度の「レポート」の機能を使用する事ができる前提で記載していますので、レポートの機能を使用した事が無い方は、是非「レポート」の章から学習下さい。

#手順
・データの作成

レポートを新規に作成し、パッケージとして「GO データウェアハウス(クエリー)」を選択し、以下のように「販売とマーケティング(クエリー)」→「販売(クエリー)」→「製品」を展開し、「製品ライン」「製品タイプ」「製品」「製品キー」「製品色」「製品サイズ」「製品ブランド」「製品の説明」をリストに配置する。
次に、赤枠の「実行オプション」アイコンから「CSVを実行」を選択し「製品マスタ.csv」というファイル名で任意のフォルダに保存する。
![001.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/5f0daa98-7e29-89d9-da57-aa3654ec4079.jpeg)

同様に、「製品キー」「数量」「単価」「収益」をリストに配置し、「CSVを実行」を選択し「販売実績.csv」というファイル名で任意のフォルダに保存する。
![002.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/a9484bef-bb92-ea76-c25d-dc9a9a660502.jpeg)

2ファイルがフォルダ上に保存されている。
![004.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/77dfabbe-110c-41ae-f67e-acf8eb2f431f.jpeg)

赤枠の、「新規レポート」の右側の「^」のプルダウンから、新規レポートの「X」を選択し、レポートを閉じる。
![003.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/54adb858-2c1b-09a9-da1b-d60e7874d17b.jpeg)

ポータル画面上で以下の画像の様に、エクスプローラー上の「製品マスタ.csv」ファイルを、ブラウザ上のCognosポータルの画像の辺りの位置にドラッグ&ドロップ。
![006.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/624a3c1d-5d54-6fe1-30f3-e0bbeb0b94ba.jpeg)

ポータル画面上で「個人用コンテンツ」を選択すると、「製品マスタ.csv」がエントリーとして表示される事がわかる。
![007.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/063ead98-cb62-59dc-e6df-c970faa979c0.jpeg)

同様に、「販売実績.csv」もアップロード。
![008.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/2297ab27-5b85-9ccf-9b16-95a2ca2bf3aa.jpeg)

「個人用コンテンツ」は、ログインしているユーザー個人のためのフォルダなので、CSVデータを他のユーザーも使用可能とするため、「チーム・コンテンツ」にCSVデータの移動を行う。
まずは移動先のフォルダを作成するため、「チーム・コンテンツ」から任意のフォルダで「+」から「フォルダー」を選択し、任意の名称（今回は「アップロードデータ」）を指定。
![009.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/714740ec-73fe-fcd8-77bd-c61baa8cfdb6.jpeg)

「個人用コンテンツ」の「製品マスタ.csv」の「・・・」から「コピーまたは移動」を選択。
![010.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/c99e364d-77ef-8b21-3a67-94c25a3a9801.jpeg)

チーム・コンテンツの「アップロードデータ」フォルダを指定し「移動先」を選択。
![011.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/6274a240-c18d-ecfb-ef03-90bc5c2f47a8.jpeg)

「製品マスタ.csv」が該当のフォルダに移動されている。
![012.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/ee33bb10-f86a-cb12-2775-9b30cb0a5855.jpeg)

同様の手順で「販売実績.csv」も移動する。
![013.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/34b01c0f-d73e-73b4-0def-4ffa2ad8ab5f.jpeg)


#自己学習記事一覧
**Cognos Analytics をエンドユーザーの方に自己学習して頂くためのサイト**
https://qiita.com/shinyama/items/95885c7246dc413b6448
ERR_SPDY_INADEQUATE_TRANSPORT_SECURITYエラー対応とHTTP/2について


# 現象

- ”ERR_SPDY_INADEQUATE_TRANSPORT_SECURITY”というエラーが発生し本番環境でアクセス障害発生
- 現象としては主にAndoroidOSでコンテンツにアクセスすると上記出力
- すべてのユーザではなく一部のユーザに発生
- サービス自体は不具合なく提供できている状態

# 原因

- 現時点で原因と考えられることがクラウドプロバイダ側のロードバランサーとSSL証明書の相性が悪かったと推測。断定できていない
- 使用していたSSL証明書は信頼性の高いJPRS発行のDV証明書
- 以前はRapidSSLのDV証明書を使用していた
- この事故が発生した数日前に証明書期限切れの為RapidSSLのものからJPRSのものに変更
- おそらくこの変更が原因だったと推測
- プラットフォーム側に確認したところHTTP2との相性が悪いのではとの推測
- AWSなどの場合ACMのCertificateだった場合、こういった現象が起こる可能性は低いと推測
- SSL検証サイトでSSLのレベルを測定
- 多くのブラウザでHTTP2が非対応との結果

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57350/80e760d4-e92f-ab16-d1e9-074210e951cd.png)

- Webサーバー側の暗号化アルゴリズムが何を使用しているかでも類似の現象が発生する可能性がある
　[リンク](https://www.jeffgeerling.com/blog/2016/fixing-errspdyinadequatetransportsecurity-ssl-error-chrome)

# HTTP2について
- HTTP2はTLS(SSL)は必須ではないが、chromeやFireFoxなどのブラウザでは必須である為、実質TLS1.2以上が必須である
- cipher-suiteはTLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256が必須

- [RFCリンク](https://summerwind.jp/docs/rfc7540/)
- [使用を推奨しないcipher-suite：RFC](https://tools.ietf.org/html/rfc7540#appendix-A)
- [使用を推奨しないcipher-suite：IPA](https://www.ipa.go.jp/security/ipg/documents/ssltls_cipher_suite_config_20150803.pdf)
- 現在推奨となっているcipher-suiteも将来的に非推奨になるかもしれない。そう考えると気軽に使えない。
- HTTPヘッダにも制限があるらしい。大文字がHTTPヘッダになるとエラーになるらしい。

# 対応
- クラウドのロードバランサーからHTTP2の設定を外してもらう
- エラーは出なくなる
- SSL検証サイトでHTTP2非対応エラーを確認。ほとんど出なくなっている。
-

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57350/1039e8c6-aced-3c72-d2bc-03522d238998.png)

# 結論
- HTTP2を使用している場合、SSL証明書の種類とブラウザによって同様の現象が発生する可能性がある

※他詳細分かり次第随時追記
【Unity】 子オブジェクトの衝突が検知される条件

Unityにおいて、子オブジェクトの衝突が検知されるパターンと検知されないパターンが少しだけややこしかったのでメモ程度に残しておきます。初歩的な内容になっています。

##検証準備

落下する方のCubeにRigidbodyをつけて、
<img width="1680" alt="スクリーンショット 2019-05-14 16.21.02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360619/bcf09b11-4cdb-2620-52b3-025bae8ce2c8.png">

空のゲームオブジェクトの子にCubeを置いておく
<img width="1680" alt="スクリーンショット 2019-05-14 16.25.05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360619/e820a37f-371e-0c18-8312-7bed5dfcd719.png">

親のゲームオブジェクトの方に以下のスクリプト(CollisionCheck.cs)をつけて衝突判定の有無を調べる

```
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CollisionCheck : MonoBehaviour
{
    private void OnCollisionEnter(Collision col){
        Debug.Log("当たったよ");
    }
}
```

##パターン1 この状態で実行してみる

この状態（親はスクリプトのみがついていて、子にColliderがついている状態）で実行すると

<img width="1337" alt="スクリーンショット 2019-05-14 16.30.03.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360619/6c963c99-7e98-6b7c-ece7-d9e55f7542e0.png">

検知されませんね

##パターン2 親にRigidbodyをつけて実行する

というわけで、下の様に親の空のゲームオブジェクトにRigidbodyをつけて実行すると、（UseGravityは切って、動かない様にisKinematicをtrueにしてます）

<img width="1680" alt="スクリーンショット 2019-05-14 16.34.27.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360619/6529fbdc-cdec-05e7-6b62-251d23ac2459.png">

すると、

<img width="1337" alt="スクリーンショット 2019-05-14 16.37.10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360619/96d54b7c-ece2-330e-29fb-665f54a7d5d1.png">

無事、コンソールに出力されました。

ということで、親にRigidbodyをつけていると、子のColliderの衝突検知もされるとのことです。

子の当たり判定が反応しない！という風に困っている方がいれば是非参考にしてください。
PowerShellでファイルロックをする方法

# Power Shellを使ってみた

初めて単体テスト設計書を作成した際に
参考にしていた設計書に
「対象ファイルが開かれているときに操作ができないこと」という
テスト項目が現れました。

利用しているテキストエディタではどれもファイルロックされなかったので
強制的にファイルロックがしたくてPower Shellを使いました。


##強制的にファイルロックをする

Power Shell（いまいち何か分かってない）を起動して以下のコードを入力します。

```

# Lock
$file = [System.IO.File]::Open($filePath,[System.IO.FileMode]::Open,[System.IO.FileAccess]::Read,[System.IO.FileShare]::None)

# UnLock
$file.Close()

```

「$filePath」には対象のファイルを「"フルパス"」ダブルコーテーションで囲うと上手くいきました。
electron-vue の electron のバージョンが古いとお悩みのあなたへ

# 前置き

[electron](https://electronjs.org/) の上で [Vue.js](https://jp.vuejs.org/) 製のアプリケーションを動かしたいとき、ググると大抵 [electron-vue](https://github.com/SimulatedGREG/electron-vue) を使った方法がヒットします。しかし2019年5月現在、electron-vue で使われる electron のバージョンは 2.0.4 (最新は 5.0.1 )とだいぶ古く、Node.js はバージョン 8 台(現在の最新は 12.2.0 )、Chromium もバージョン 61 台(最新の electron では 73.0.3683.121 )とかなり前のものを使わなければなりません。この頃ですとブラウザの新しく便利な API が使えなかったり Node.js では fs.promises がなかったり何かと不便です。そもそも electron-vue は Vue CLI 2 系の時代の産物ですので、そろそろ新しいものを使いたくなります。

そこで [vue-cli-plugin-electron-builder](https://github.com/nklayman/vue-cli-plugin-electron-builder) を利用した方法を紹介します。この方法は軽く調べてもまだ日本語の情報が少なかったので、記事を書く意味があるのではないかと思いかなり久々に Qiita の記事を書いています。この方法を初めて知ったのは Youtube の [Electron with Vue.js](https://www.youtube.com/watch?v=Fl7---SEORQ) という動画でした。投稿者の Andre Madarang 氏に感謝申し上げます。

ではこの vue-cli-plugin-electron-builder を利用した Vue.js + electron のアプリケーションを作る手順を紹介いたします。

# 手順

手順とは言っても順番さえわかれば簡単です。

## 手順1

```bash
$ vue create vue-electron-sample
$ cd vue-electron-sample
```

まずはいつもどおり Vue CLI でプロジェクトを作成します。ここでの設定はお好みでどうぞ。終わったら cd するなり VSCode を立ち上げて統合ターミナル使うなりしてプロジェクトのディレクトリに入ってください。

## 手順2

```bash
$ npm run serve
```

この手順は省略可能ですが一応。これで localhost:8080 にアクセスするといつものあの画面が見れるはずです。きちんとプロジェクトが作成できたことが確認できたら開発サーバーを終了して次へ進みましょう。

## 手順3

```bash
$ vue add electron-builder
```

ここで electron が登場します。electron-builder とは書いていますがこれは完成したアプリケーションをビルドする [electron-builder](https://github.com/electron-userland/electron-builder) ではなく、[vue-cli-plugin-electron-builder](https://github.com/nklayman/vue-cli-plugin-electron-builder) を指しています。`vue add` はプラグインを追加するコマンドで、入力された名前の前に `vue-cli-plugin-` をつけて npm からインストールします。

ここで electron のバージョンを聞かれます。古いバージョンも選べますがここでの目的は最新の electron を使うことなので `5.0.0` を選択しました。すると以下のファイルが追加/更新されたと表示されます。

```bash
src/background.js
.gitignore
package-lock.json
package.json
```

`src/background.js` が今までなかったファイルですね。electron を触ったことのある人ならこのファイルを覗くと何の役割をしているかわかるでしょう。electron のメインプロセスです。

## 手順4

```bash
$ npm run electron:serve
```

これは今までの `npm run serve` の代わりとなります。文字通り electron で起動してくれます。しっかり変更のあったファイルを検知してホットリロードしてくれます。

あとはここから好きなアプリケーションを開発しましょう！

## 手順5 (アプリケーションが完成したら)

```bash
$ npm run electron:build
```

アプリケーションを [electron-builder](https://github.com/electron-userland/electron-builder) を用いてビルドしてくれます。処理が終わると `dist-electron/` 内にインストーラーができます。あとはこのインストーラーを配布しましょう！
vimrcの設定について

個人的なvimの設定メモ。
訳あってプラグインは入れていません。

##バージョン
|環境|バージョン|
|:-:|:-:|
|Vim|7.4|
|CentOS|7.2|

##.vimrcを作成

まずはホームディレクトリに.vimrcを作成します。
この.vimrcは、
vimをデフォルトから使いやすいように設定することができるファイルのことです。

```console
$ vim ~/.vimrc
```

普段は隠れているので、ll -laとかで表示します。

```console
$ ll -la
```

##中身の設定もろもろ


```vim:.vimrc
syntax enable                                                                                                   
set fenc=utf-8

"-----カーソル・移動関連 -----
set number " 行番号
set virtualedit=onemore " 行末から1文字先までカーソルを移動可能
set showmatch " 閉じ括弧入力時に対応する開き括弧に移動する
set whichwrap=b,s,h,l,<,>,[,],~ " カーソルの左右移動で行末から次の行頭へ移動する
set cursorline " カーソルラインをハイライトする

"-----検索関連-----
set incsearch " インクリメンタルサーチ
set ignorecase " 大文字小文字の区別しない
set smartcase " もし検索パターンに大文字があれば大文字小文字を区別する
set hlsearch " 検索結果のハイライトする

"-----タブ・インデント関連-----
set smartindent " スマートインデント 
set tabstop=4 " タブの空白数
set autoindent " 改行時のインデントを継続する
set expandtab " タブの挿入時に空白を入れる
set shiftwidth=4 " smartindentで増減する幅

"-----表示関連 -----
set laststatus=2 " ステータスラインを常に表示
set wildmode=list:longest " コマンドのTabで補完する
set ruler " ステータスラインにカーソル位置表示する
```

設定が完了したら、
:wqで閉じると設定が反映されます。

###参考

https://qiita.com/ahiruman5/items/4f3c845500c172a02935
httpd.confがpassenger-6.0.2のパス周りでエラーを起こしたとき

## エラー

`~~~/gems/passenger-6.0.2/buildout/apache2/mod_passenger.so`あたりが変だよと怒られる。

```
$ apachectl configtest
httpd: Syntax error on line 176 of /private/etc/apache2/httpd.conf: Cannot load /Users/{ユーザー名}/.rbenv/versions/2.6.0/lib/ruby/gems/2.6.0/gems/passenger-6.0.2/buildout/apache2/mod_passenger.so into server: dlopen(/Users/{ユーザー名}/.rbenv/versions/2.6.0/lib/ruby/gems/2.6.0/gems/passenger-6.0.2/buildout/apache2/mod_passenger.so, 10): no suitable image found.  Did find:\n\t/Users/{ユーザー名}/.rbenv/versions/2.6.0/lib/ruby/gems/2.6.0/gems/passenger-6.0.2/buildout/apache2/mod_passenger.so: stat() failed with errno=13
```

## 解決した方法
単純にmod_passenger.soまでのパスが変だったんでそこを直したら解決した。

### passengerを入れ直し
ここではエラーは起きなかった。

```
$ gem install passenger
Fetching rack-2.0.7.gem
Fetching passenger-6.0.2.gem
Successfully installed rack-2.0.7
Building native extensions. This could take a while...
Successfully installed passenger-6.0.2
Parsing documentation for rack-2.0.7
Installing ri documentation for rack-2.0.7
Parsing documentation for passenger-6.0.2
Installing ri documentation for passenger-6.0.2
Done installing documentation for rack, passenger after 97 seconds
2 gems installed
```

### passenger-install-apache2-moduleをし直す
```
$ passenger-install-apache2-module
Welcome to the Phusion Passenger Apache 2 module installer, v6.0.2.
(略)
* Checking whether Apache is installed... ✓
* Checking whether the Passenger module is correctly configured in Apache... ✗

Incorrect Passenger module path detected

Phusion Passenger for Apache requires a 'LoadModule passenger_module'
directive inside an Apache configuration file. This directive has been
detected in the following config file:

    /private/etc/apache2/httpd.conf

However, the directive refers to the following Apache module, which is wrong:

    /Users/{ユーザー名}/.rbenv/versions/2.6.0/lib/ruby/gems/2.6.0/gems/passenger-6.0.2/buildout/apache2/mod_passenger.so

Please edit the config file and change the directive to this instead:

    LoadModule passenger_module /usr/local/var/rbenv/versions/2.6.2/lib/ruby/gems/2.6.0/gems/passenger-6.0.2/buildout/apache2/mod_passenger.so


Detected 1 error(s), 1 warning(s).
Please solve the above issues, then press ENTER to continue.
```
**終わったと思って、よく読んでみるとエラーが。**


親切にも`/private/etc/apache2/httpd.confっていうファイルの中のこのパスが間違っているからこっちに直してね。`と詳しく教えてくれています。

ここは素直に言われたとおり

```
LoadModule passenger_module /usr/local/var/rbenv/versions/2.6.2/lib/ruby/gems/2.6.0/gems/passenger-6.0.2/buildout/apache2/mod_passenger.so
```

と書き換えて解決でした。めでたしめでたし。
MATLABで簡単なシミュレーションをしよう

# はじめに
大学，大学院では数値計算ソフトとしてMATLABを使う方も多いのではないでしょうか．
やはり最近は，python人気ということもありMATLABが見向かれなくなっているように感じますが，数値計算全般ではコードが非常に組みやすく，pythonに比べても構文が簡単に書けることも多いと思っています．
今回は，MATLABを研究で使い始める人や初めて使う人向けに，具体的な使用例を紹介したいと思います．



## 量子力学
MATLABの使用例として，「線形代数の計算」と「結果の可視化」という最も基礎的な例を取り上げます．その対象として，系のエネルギーをハミルトニアンで記述できる量子力学を例題として挙げようと思います．

###ハミルトニアン
量子力学において，系のエネルギーを記述するのはハミルトニアンでした．ハミルトニアンの固有値がエネルギーです．いま

「電子スピンに外部磁場を印加した際に，その磁場強度と磁場角度によってどのようなエネルギーをとるのか？」

を可視化します．ここではMATLABの練習が主題なので物理的意味は興味なければ追求する必要はありません．
（※スピンの量子化軸を$z$軸方向にとり，$z$方向とのなす角度を$\theta$と定義します）

ハミルトニアンは

```math
H = DS_z^2\,+\,\gamma B_0S_{B_0} \\
S_{B_0} = S_z\cos\theta + S_x\sin\theta
```

で表します．問題は，磁場角度θと磁場Bです．これらを振って，Hの固有値を求めましょう（他のパラメータは全て定数です）．


```MATLAB:tripletstate.m
clc
clear

Sx = 1/sqrt(2)*[0,1,0;1,0,1;0,1,0];
Sz = [1,0,0;0,0,0;0,0,-1];
Ns = size(Sz,1); 

% physical quantity
gamma = 2.8e+6;% Hz/G
Dgs = 2.87e+9;% GHz
Hdgs = Dgs*Sz.^2;

B0 = linspace(0,1200,1e+2); %等差数列を作る
Nb0 = length(B0);

theta = linspace(0,pi/2,1e+2);
Ntheta = length(theta);

Energy = zeros(Nb0,Ntheta,Ns); %３次元のゼロの配列
for refth = 1:Ntheta
    Sb0 = Sz*cos(theta(refth))+Sx*sin(theta(refth));
    for refb0 = 1:Nb0
        Hzeeman = gamma*B0(refb0)*Sb0;
    
        Htot = Hdgs+Hzeeman;
        
        E = eig(Htot);
        Energy(refb0,refth,1) = E(1);
        Energy(refb0,refth,2) = E(2);
        Energy(refb0,refth,3) = E(3);
    end
end

%グラフの描画
figure  
hold on
box on
for refl = 1:Ns
    surf(B0, theta/pi*180, Energy(:,:,refl)'*1e-9);
end
hold off

xlabel('B_0 (G)');
ylabel('\theta (deg)');
zlabel('Energy (GHz)');
shading('flat');
colorbar;

```

コードはこれだけです．
始めに，物理定数$D$と行列$S_x, S_z$を定義します．ここではパウリ行列を用いています．
for文直前には，計算領域の確保を行います．必要なのは，2変数に対する結果なので計3次元の領域が必要になり，zerosを用いて0行列を作製しておく必要があります（ここに順次，計算結果を格納します）．

あとはfor文中で，$\theta$と$B_0$の各要素に対するハミルトニアンを計算します（要素数を予め，Nb0, Nthetaとして取得しておくのがよいです）．

ハミルトニアンを計算し，最後にeigを用いて固有値が算出されます！便利．

当然，各々の$\theta$と$B_0$に対して計算するのでfor文内でEnergy(refb0,refth,1)などに順次入れていく必要がありますね．


###グラフの描画
計算結果を踏まえて，グラフを描画します．
3次元にはsurfが便利です．また，shading('flat')をいれることで滑らかな曲線を描けます．



# 結果
このハミルトニアンを解いた結果，以下のようなグラフが得られました．
![tripletstate.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/384231/2f834ccc-5156-3944-e348-38493e5fe293.png)

大学を卒業後に，MATLABは使えなくなってしまった（笑）ので，今回はOctaveで出力しています．しかしコードは全く同じで大丈夫です．3D図も描けます．
物理的な意味は詳述しませんが，ここでは磁場と角度を変数としてEnergy（縦軸）の準位が計算できました．固有値をしっかり表現できたようです．

## おわりに
今回はハミルトニアンの固有値を得て，それを可視化しました．
その過程では，

１．行列計算
２．固有値計算
３．グラフの出力

を行う大変基本的なものですが，計算結果の格納，for文という非常に重要な要素も使われています．

私はコードを書く勉強を始めたとき，何からやればいいかわからず最初は先輩に書いてもらいました．最初は真似から入るのが良いと思います．
とくに，物理を始めた学生方は大学の計算環境を用いていかがでしょうか．
Magic Leap MagicScript Landscape Application. UiDatePicker

**Prepare**
Magic Leap One
https://www.magicleap.com/magic-leap-one

mlsdk v.0.22.0
https://creator.magicleap.com/downloads/lumin-sdk/overview

magic-script-cli v2.2.17
https://www.npmjs.com/package/magic-script-cli

magic-script-polyfills v2.6.2
https://www.npmjs.com/package/magic-script-polyfills

**Create Project**

```
magic-script init
? What is the name of your application? Sample-UiDatePicker
? What is the app ID of your application? net.magicmodelers.magicscript.sample.uidatepicker
? In which folder do you want to save this project? sample-uidatepicker
? What app type do you want? Landscape
? Use TypeScript? No
```

**Code**
Change app.js

```javascript
import { LandscapeApp, ui } from 'lumin';
const {
  UiLinearLayout
  ,UiDatePicker
  ,Side
  ,UiText
  ,EclipseLabelType
  ,Alignment
  ,HorizontalTextAlignment
  ,DatePickerParams
  ,DateFormat } = ui;

export class App extends LandscapeApp {
  onAppStart () {
    // Create a new prism that's half a meter cubed.
    const prism = this.requestNewPrism([0.5, 0.5, 0.5]);
    const layout = UiLinearLayout.Create(prism);
    layout.setAlignment(Alignment.CENTER_CENTER);

    const text = UiText.CreateEclipseLabel(
        prism,
        'UiDatePicker',
        EclipseLabelType.kT7
    );
    text.setAlignment(Alignment.CENTER_CENTER);
    text.setTextAlignment(HorizontalTextAlignment.kCenter);

    const date = new ui.Date();
    date.setYear(2019);
    date.setMonth(12);
    date.setDay(10);
    
    const date_picker_params = new DatePickerParams();
    date_picker_params.dateFormat = DateFormat.kYYYYMMDD;
    date_picker_params.defaultDate = date;
    date_picker_params.labelSide = Side.kTop;
    date_picker_params.labelText = "Release Date";
    const date_picker = UiDatePicker.Create(prism, date_picker_params);
    
    date_picker.setAlignment(Alignment.CENTER_CENTER);
    date_picker.onDateChangedSub(
        function(uiEventData)
        {
            text.setText(date_picker.getDateString());
        }
    );
    layout.addItem(date_picker, [0.01, 0.01, 0.01, 0.01]);
    layout.addItem(text, [0.01, 0.01, 0.01, 0.01]);
    prism.getRootNode().addChild(layout);
  }

  // Known Issue
  // Web Inspector does not work unless the updateLoop function is present in source.
  // It can be removed for production code.
  updateLoop (delta) {
    return true;
  }

  init () {
    return 0;
  }
}

```

**Build**

```
magic-script build -i
```

**Run**

```
magic-script run --port=10000
```

**Reference**
UiDatePicker (MagicScript API)
https://docs.magicscript.org/lumin.ui.UiDatePicker.html

DatePickerParams (MagicScript API)
https://docs.magicscript.org/api_1.6.0/lumin.ui.DatePickerParams.html

DateFormat (MagicScript API)
https://docs.magicscript.org/api_1.6.0/lumin.ui.DateFormat.html

magicscript
https://www.magicscript.org/

Thanks!
matplotlibで3Dの図を作る

# シンプルな図を作る
今回は、label、grid、tick、axixの線を消す
さらに図の中心を球の中心からずらす
![plot_out.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/341384/35a14316-1c47-e8fc-a5a2-5d6f7d7a2269.jpeg)

```python:delete_label_grid_tick_axis.py
#!/usr/bin/env python3

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

fig=plt.figure(figsize=(5,5))
ax=fig.add_subplot(111, projection='3d')

# axis range
ax.set_xlim([-1.5, 1.5])
ax.set_ylim([-1.5, 1.5])
ax.set_zlim([-1.5, 1.5])

lw=0.25  # line width
c='lightgray' # color

# label, grid, tick
for a in [ax.xaxis, ax.yaxis, ax.zaxis]:  # print(ax.xaxis.__dict__)
    a.set_ticklabels([])
    a._axinfo['grid']['linewidth']=lw
    a._axinfo['grid']['color']=c
    a._axinfo['tick']['linewidth']=lw
    a._axinfo['tick']['color']=c
    a._axinfo['tick']['inward_factor']=0
    a._axinfo['tick']['outward_factor']=0

# axis
for a in [ax.w_xaxis, ax.w_yaxis, ax.w_zaxis]:
    a.line.set_linewidth(0)

# sphere
u,v=np.mgrid[0:2*np.pi:50j, 0:np.pi:25j]
x=np.cos(u)*np.sin(v) + 0.5
y=np.sin(u)*np.sin(v) + 0.5
z=np.cos(v)
ax.plot_wireframe(x, y, z, color='lightskyblue', linewidth=0.5)

plt.savefig('plot_out.pdf')
```

# デフォルト設定
図の中心は自動で球の中心となる
![plot_out.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/341384/086b7fb0-d436-ff7b-d1dd-5bdab088d467.jpeg)

```python:default.py
#!/usr/bin/env python3

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

fig=plt.figure(figsize=(5,5))
ax=fig.add_subplot(111, projection='3d')

# sphere
u,v=np.mgrid[0:2*np.pi:50j, 0:np.pi:25j]
x=np.cos(u)*np.sin(v) + 0.5
y=np.sin(u)*np.sin(v) + 0.5
z=np.cos(v)
ax.plot_wireframe(x, y, z, color='lightskyblue', linewidth=0.5)

plt.savefig('plot_out.pdf')
```

# 環境
Ubuntu 18.04
Python 3.7.2
matplotlib 3.0.3
seaborn 0.9.0
numpy 1.15.4
td-agent と fluentd の違い

td-agent と fluentd の違いがよくわからなかったので整理しました。

公式ページによると、
「td-agent は **Fluentd の安定版の配布パッケージ**」と説明されています。

両者の違いはざっくりと以下のようになります:

1. fluentd: <= コミュニティによって開発が進められている ruby gem
2. td-agent: <= fluentd の安定版 + 各OS用インストーラ

つまり、 **どちらも実体は fluentd という ruby gem** ですが、fluentd は 生の gem なのに対し、 td-agent は各OS用に rpm や yum パッケージの形式で配布されています。
「**td-agent は fluentd を利用しやすいようにして提供したもの**」ということもできます。

## 参考: td-agent は内部に fluentd を含んでいる?

td-agent も実体は fluentd という ruby gem なので、内部に gem package `fluentd` を保持しています。
以下のコマンドで確認できます:

```console
$ td-agent-gem list | grep fluentd
fluentd (0.12.40)
```

これは `td-agent --version` の出力結果と一致しています。

```console
$ td-agent --version
td-agent 0.12.40
```

## 参考

* https://www.fluentd.org/faqs
* https://github.com/fluent/fluentd
* https://github.com/treasure-data/omnibus-td-agent
ウェブ解析士が押さえるべき「各種サービス・ツール」100選


「ウェブ解析士 認定試験公式テキスト2019」で紹介されている、ウェブ解析関連の各種サービス・ツールです。

#アクセス解析ツール
・Googleアナリティクス
・Adobe Analytics
・similarWeb

#クエリ解析
・Search Analytics For Sheets：Googleスプレッドシートのアドオン。サーチコンソール上のデータを無料で簡単にGoogleスプレッドシートに取り込める

#SEO
・ランキングチェッカー
・SEOチェキ！
・Mieruca（ミエルカ）

#ミクロ解析ツール
・ユーザーエクスプローラレポート
・Visionalist
・らくらくログ解析
・User Insight
・リストファインダー
・SATORI

#Chromeのアドオン
・Google Analytics Debugger
・Google Tag Assistant

#ソーシャルリスニングツール
・Sprinklr
・クチコミ＠係長
・見える化エンジン
・Meltwater
・Yahoo!リアルタム検索
・Twitterの「キーワード検索」

#ウェブマスターツール
・Google Search Console
・Bing Web マスターツール
・NAVERウェブマスターツール
・捜索資源平台
・Yandex.Webmaster

#検索エンジン順位測定ツール
・GRC
・GRC-W
・RankTracer

#アドネットワーク
・MicroAdCOMPASS
・Advertising．com Network

#アドエクスチェンジ
・Google Ad Manager
・OpenX Market Japan

#DSP
・MicroAd BLADE
・MarketOne RTB
・FreakOut DSP
・KANADE DSP

#SSP
・MicroAd AdFunnel
・YIELD ONE

#レコメンド広告
・Criteoパフォーマンスディスプレイ広告
・デクワス.AD
・おもてなしバナー

#DFO
・コマースリンク株式会社
・株式会社フィードフォース

#CDP
・トレャーデータ株式会社

#第三者配信アドサーバー
・Google Marketing Platform（サイズミック・テクノロジーズ株式会社）
・Sizmek MDX（サイズミック・テクノロジーズ株式会社）
・digitalice（Fringe81株式会社／フリンジハチイチ）
・i-Effect（DAC／デジタル・アドバタイジング・コンソーシアム株式会社）

#動画解析
・Social Blade
・vidlQ

#SDK
・Repro：ターゲティングプッシュ通知やアプリ内メッセージといった機能で、アプリの成長支援を行う

#アプリ解析
・Firebase Analytics

#サポート支援
・Zendesk：ソーシャルメディアのメッセンジャーから電話対応まで、組織的に効率的な対応をするためのナレッジ共有が可能
・Franz：チャット、メール、電話問い合わせへの対応を効率的に組織で運用するサービス

#チャットボット
・サポートチャットボット：株式会社ユーザーボーカル提供のチャットボット
・Many Chat：facebookでチャットによる対応を自動化するソリューション

#パフォーマンス調査
・Lighthouse：ブラウザアプリケーション

#AMP関連
・AMP Client ID API：AMPページと非AMPページのセッションを切らずに測定することを可能にする

#その他
・Googleトレンド
・日経会社情報DIGITAL
・eMark+
・App Analytics
・Buffer
・FOODee IM
・Pingdom
・Internet Archive
・G Suite
・Vimeo
・Googleマイビジネス

#Excelのアドオン
・分析ツール

#ASPカート
・CARTSTAR
・commerce creator
・shopify
Elastic Beanstalk にファイルアップロードができない (nginxで413エラー)

# 背景
EBにrailsアプリケーションをデプロイしたらファイルのアップロードがうまくいかず

# 調査
```:ローカル
$ eb ssh
```
でサーバに入り

```:サーバ内
$ view /var/log/nginx/access.log
```
でログを調査
413エラーが出ていました

[nginxで"client intended to send too large body"が発生した時の対策方法](https://qiita.com/n-oshiro/items/4816ad71b90a9967fa18)

を見てみると
どうやらファイルサイズがnginxの設定値より大きくてエラーになるらしく、デフォルトでは1MBまでしか受け取れないらしい

# 設定を変更してみる
## 試行1
[Elastic beanstalk で大きいデータを POST したら nginx が 413 Request Entity Too Large](https://qiita.com/kawachi/items/0c70cf3a791bae2683f4)
[reasing client_max_body_size in Nginx conf on AWS Elastic Beanstalk](https://stackoverflow.com/questions/18908426/increasing-client-max-body-size-in-nginx-conf-on-aws-elastic-beanstalk)
を参考にebextensionsを書いてデプロイしてみる

```yml:.ebextensions/01-nginx-max-body.config
files:
  "/etc/nginx/conf.d/client-max-body-size.conf":
    mode: "000755"
    owner: root
    group: root
    content: "client_max_body_size 1024M;"
```
そしてデプロイをするも変わらずエラー

## 試行2
[Nginx httpディレクティブで指定したclient_max_body_size が無視される](https://kishaku-kangen.blogspot.com/2017/01/nginx-httpclientmaxbodysize.html)
を見て
サーバ内部の`/etc/nginx/nginx.conf`を見てみると

```
include /etc/nginx/conf.d/*.conf;
```
がhttpディレクティブに書かれており、serverディレクティブには

```
include /etc/nginx/default.d/*.conf;
```
とあったので`.ebextensions/01-nginx-max-body.config`の
`/etc/nginx/conf.d/client-max-body-size.conf`を
`/etc/nginx/default.d/client-max-body-size.conf`に書き換えてデプロイするもエラー

## 試行3
設定が反映されていないのでは？と思ったがnginxの設定値を確認するコマンドがわからず
とりあえずサーバ内で

```shell-session
# nginx -s reload
```
をしてみると、動いた！！！
なるほど、設定が反映されていないんですね〜

ということで最終的に

```yml:.ebextensions/01-nginx-max-body.config
files:
  "/etc/nginx/conf.d/client-max-body-size.conf":
    mode: "000755"
    owner: root
    group: root
    content: "client_max_body_size 1024M;"

container_commands:
  01-nginx_reload:
    command: sudo nginx -s reload
```

でデプロイしたら成功、予想通り！

デプロイポリシーが`All at once`だったので`reload`が必要だったのかもしれない
`immutable`だと新しいインスタンスが立ち上がるから`reload`必要ないのかもしれない
ここらへんは要検証
アプリの種類

#ネイティブアプリ
プラットホーム上で直接動作するもの
マーケットからインストールされ、手数料が必要
·Androidアプリ
·iOSアプリ
#Webアプリ
ブラウザ上で動作
HTML＋CSS＋JavaScriptで構成
ネットワークが必要
OSが異なっても動作
#ハイブリットアプリ
フレームワークがネイティブ機能を呼び出し、表示部分はWebで動作
フレームワークはハイブリッドであり、OSが異なっても動作
XcodeGenでNotificationServiceExtensionを使う

# `targets`にこんな感じで追加する

```yaml:project.yml  
  NotificationService:
    type: app-extension
    platform: iOS    
    sources: NotificationService
    settings:
      base:
        ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES: ${inherited}
        PRODUCT_NAME: NotificationService
        PRODUCT_BUNDLE_IDENTIFIER: {NotificationService用のBundle Identifier}
        INFOPLIST_FILE: NotificationService/info.plist
        CODE_SIGN_STYLE: Manual
        TARGETED_DEVICE_FAMILY: 1
        DEVELOPMENT_TEAM: {アプリに合わせる}
      configs:
        debug: 
          CODE_SIGN_IDENTITY: iPhone Developer
          PROVISIONING_PROFILE_SPECIFIER: {Debugビルド用のProvisioning Profile}
        release: 
          CODE_SIGN_IDENTITY: iPhone Distribution
          PROVISIONING_PROFILE_SPECIFIER: {Releaseビルド用のProvisioning Profile}
```

# アプリターゲットの`dependencies`に以下を追加

```yaml:project.yml
- target: NotificationService
  codeSign: false
  embed: true
```
jdk環境変数の設定

jdkをインストールした後、環境関数の設定を行うことが必要です。
１、PC->プロパティ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300779/9a189874-adf8-1511-0a4e-e42be107e1e7.png)

２、システムの詳細設定->環境変数
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300779/678bad8e-4358-e674-072f-0dc360def4c7.png)

３、新規「JAVA_HOME」、値はインストールパスです。OK
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300779/b18db35e-e673-b475-c284-37af9fce606c.png)

４、環境変数「Path」について、編集します。
下図の2つの値を追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300779/402ed102-b58c-fffe-7040-37d59bb046e8.png)

５、新規変数「CLASSPATH」、値は「.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar」に設定します。（一番前に．があります、注意してください）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300779/e6ea1c0d-45a0-f155-32ec-c0c5ef660feb.png)

６、cmdに「java -version」を実行します。
下図のようにバージョンを出てきますと、環境変数の設定が成功ということです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300779/59a56415-63cd-8322-a3f3-ad87bc31fee0.png)
MDCTextFieldでテキストを入力してもplaceholderが移動しない場合の対処法

# 概要
MDCTextFieldでplaceHolderが以下のようになる場合の対処法です。

- NGパターン
<img width="338" alt="TextNG.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/380239/874f627d-393f-baf1-f064-1e9b119d75d5.png">

- OKパターン
<img width="334" alt="TextOK.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/380239/71e24233-c88c-970f-90f1-118f2c385ae0.png">

## 前提知識
placeHolderをfloatingさせる場合には、
MDCTextFieldのスタイルを設定するMDCTextInputController〜クラスを使う必要があります。

MDCTextInputController〜クラスは以下参照。
https://github.com/material-components/material-components-ios/tree/develop/components/TextFields/styling


この記事ではMDCTextInputControllerUnderlineクラスを例として使います。

イニシャライザに対象のMDCTextFieldインスタンスを渡すと
placeHolderがfloatingするようになります。

```
MDCTextInputControllerUnderline(textInput: $(MDCTextFieldのインスタンス))
```

## 原因と対策
問題点は、MDCTextInputControllerUnderlineのインスタンスの宣言位置です。
クラスのプロパティとして宣言しなければ正常に動作しません。
メソッドのローカル変数ではダメ。

サンプルコードは以下です。
-  OKパターン

```swift
class MDCSample {
    var style: MDCTextInputControllerUnderline!

    private func setUp() {
        style = MDCTextInputControllerUnderline(textInput: $(MDCTextFieldのインスタンス))
    }
}
```

- NGパターン

```swift
class MDCSample {
    private func setUp() {
        var style: MDCTextInputControllerUnderline!
        style = MDCTextInputControllerUnderline(textInput: $(MDCTextFieldのインスタンス))
    }
}
```

# ネタ元
https://stackoverflow.com/questions/49245280/ios-mdctextfield-placeholder-text-not-floating-when-used-in-mdctextinputcontroll
【祝】Qiita初投稿！

初投稿です！
よかったら[ポートフォリオサイト](https://portfolio-a051e.firebaseapp.com/#/)を見ていってください！

##自己紹介
都内でシステムエンジニアをやっています。
他業界から転職して、IT歴はそろそろ１年になります。
現在はPHP & Laravelで業務システムのリプレイスを担当しています。

ポートフォリオはVue.jsを使って作りました。

最近フロントエンドに興味を持ち、[Udacity](https://www.udacity.com/)のJavaScript周辺のコースを受講してます。Udacityでもそれ以外でも、おすすめのコースがあればぜひお知らせください！

##目的
- アウトプット
    - Udacityの受講レポート
    - 作ったサイト
    - 勉強会参加レポート(まだ行ってない)

主にアウトプットの練習のために投稿していきたいです。

##これから
いまはUdacityの[Object-Oriented JavaScript](https://www.udacity.com/course/object-oriented-javascript--ud711)を受講しているので、軽くレポートを書こうと思います！
docker-compose間で通信できるようにする

# 手順1 事前にネットワークをコマンドで作成する
```shell-session
$ docker network create oreore
```

`oreore`に関しては社内で統一してルール化するとよさげ

# 手順2 docker-compose.ymlにネットワークを設定する
```docker:project_a/docker-compose.yml
~省略~
services:
  app:
    ports:
      - 3000:3000
    ~省略~
    networks:
      - oreore
      - default
  db:
    ports:
      - 5432:5432
    ~省略~
networks:
  oreore:
    external: true
```

```docker:project_b/docker-compose.yml
~省略~
services:
  app:
    ports:
      - 1323:1323
    ~省略~
    networks:
      - oreore
      - default
  db:
    ports:
      - 5431:5431
    ~省略~
networks:
  oreore:
    external: true
```

# 解説
```
networks:
  oreore:
    external: true
```
の部分については、
- 最初にコマンドで作った `oreore`ネットワークを使うように設定

```
    networks:
      - oreore
      - default
```
の部分については、サービス(コンテナ)を

- `oreore`ネットワークに追加
- `default`ネットワークにも追加

ということをやっています

# 注意
- `default`を忘れると同一の`docker-compose.yml`内での通信(`app:3000`-`db:5432`間)ができなくなる
- `サービス名:ポート番号`が重複してると起動時にエラーになる