OmniAICreator/Qiita-1.07M huggingface dataset:
【TIPS】SQL Serverでスクリプトを出力するときに、sp_addextendedpropertyを出したくない

> **Note:** 本記事は、2018年12月時点の内容です。

# 【Q】SQL Serverでスキーマをスクリプト出力したときに、余計なもの（拡張プロパティ：sp_addextendedproperty）が出力される。除外して出力できないの？


# 【A】SSMS(SQL Server Management Stuido)の設定を変更しましょう。

## 作業の手順
1. SSMSを起動
2. 以下の設定を変更

### 【手順1】SSMSを起動

### 【手順2】以下の設定を変更

* SSMSで `Tools > Options > SQL Server Object Explorer > scripting` を選択
* Script extended properties を `False` に変更

## 参考資料

> **How can I remove sp_addextendedproperty from a SQL Server view script?**

> * https://stackoverflow.com/questions/14903761/how-can-i-remove-sp-addextendedproperty-from-a-sql-server-view-script
久々にコードを触る僕がTypeScriptを勉強し始めて困ったこと

#はじめに
この文章は、コードを超久しぶりに触る僕がTypeScriptを勉強してるときに、
困ったことをアウトプットして覚えるためのものです。

※飽きなければ、随時加筆していきます。
※※文章が増えすぎたら分割するかも。
#目次
-tsconfig.jsonが使われなくて困った話

#tsconfig.jsonが使われなくて困った話
Object.entries()が以下のようなコンパイルエラーではじかれたときのこと。

```
test_type.ts:69:10 - error TS2339: Property 'entries' does not exist on type 'ObjectConstructor'.
```

調べていくと、どうやらESのバージョンの問題らしいということを知り、
以下の方を参考にしてtsconfig.jsonをいじってコンパイル。
[TypeScriptでObject.valuesを使いたい](https://qiita.com/pepo/items/62aa00ddffd68ecace17)

```
$tsc fuga.ts
```

しかし同じエラーが延々と出てうまくいかない。。。

最終的に、コンパイルするファイルを指定するとtsconfig.jsonが使われないという記述を見つけてやっと解決。
[TypeScript の tsconfig.json が効かない](https://www.pospome.work/entry/20150629/1435596334)

```
$tsc
```
俺の.gitconfigを晒す！

# 目的

　別環境でgitの省略コマンド使うときにコピペしたいので、ついでに晒して情報発信してみる。
## .gitconfig
```
[user]
        name = XXXX
        email = XXXX@example.com
[color]
  # colorの設定(以下のコマンドは自動で色つける)
  status = auto
  diff = auto
  branch = auto
  interactive = auto
  grep = auto
  ui = auto

[alias]
  
  # いい感じのグラフでログを表示
  graph = log --graph --date=short --decorate=short --pretty=format:'%Cgreen%h %Creset%cd %Cblue%cn %Cred%d %Creset%s'
  
  # 上の省略形
  gr = log --graph --date=short --decorate=short --pretty=format:'%Cgreen%h %Creset%cd %Cblue%cn %Cred%d %Creset%s'
  st = status
  ss = status -s
  cm = commit
  
  # Untracked filesを表示せず，not stagedと，stagedだけの状態を出力する
  stt = status -uno
  
  # 行ごとの差分じゃなくて，単語レベルでの差分を色付きで表示する
  df = diff --color-words
  dc = diff --cached
  dp = diff --no-prefix
  d1 = diff HEAD~            # HEADから1つ前とdiff
  d2 = diff HEAD~~           # HEADから2つ前とdiff
  d3 = diff HEAD~~~          # HEADから3つ前とdiff
  co = checkout
  br = branch
  ad = add
```

## 最後に
自分はの.gitconfigのほうが便利だ！っていう方はコメント欄に晒してください。良さそうならパクります！

自分の[技術ブログ](https://blog-c.cloudlance-motio.work/)ではフリーランス界隈の情報や最新のIT情報の発信していますので、よろしくお願いします。
シフト表を自動で割り振り

# シフト表を作ってみた
大学の後輩ちゃんが市役所の窓口で働いているのですが,
シフト表を作るのが難しくて毎月作成に時間がかかるのと, 市場のアプリを使っても要件が満たない.
ということで, 作ってくださ〜い,と可愛く頼まれたので作りました.


# 要件
- 窓口は２つ(メイン業務とサブ業務)。それが朝と昼に開催.空きを作ることは不可.
    - A:朝メイン
    - B:朝サブ
    - C:昼メイン
    - D:昼サブ
- 役割は３つ
    - 1:正社員(朝昼[A,B,C,D]ともに就業可能)
    - 2:時短社員A(朝[A,B]のみ就業可能)
    - 3:時短社員B(昼[C,D]のみ就業可能)
- 仕事量は基本的に同等にする(公務員らしい!)
- 1人当たりのメインとサブの数も同等にする(公務員らしい!)
- １人が仕事できるのは1日１回まで

# 完成図<img width="1364" alt="スクリーンショット 2018-12-26 14.42.42.png" src="https://qiita-image-store.s3.amazonaws.com/0/180419/8c677c03-e6ab-6fd9-9008-662af3318669.png">

だいたいこんな感じでできました.
SpreadSheetで作りました.


# プログラムの概要
5時間ぐらいで作ったので, 雑すぎて見せれるレベルでは無いのです...

- 営業日をもとめる
    - 祝日も判定できると尚よし
- 総仕事量をもとめる
    - 営業日*役割(A,B,C,Dの4つ)
- 一人当たりの仕事量をもとめる
    - まず平等数(基本的には最小公約数のもとめ方と同じ)
    - 総数と上記の総和に差がある時はその分を各人に配賦
- A,B,C,Dを各人に配賦していく
    - その際,各人の残りの配賦数が多いもの順から配賦
        

基本的には, これだけうまくいきます.
もっと単純に作ろうと思ったら人数分の配列に[A,B,C,D]をシャッフルさせながら入れていき,
エラーが出なくなったなるまで順番でズラしていくという"総当たり法"というやり方がありますが,
まぁそんな激しいことをしなくても十分作れます.


# 最後に
シフト表作成とかは, 経営工学とかオペレーションズ・リサーチと呼ばれるジャンルの初歩の初歩ですが,
自分で作ってみて意外と難しかったです.
非エンジニアの人と酒とか飲んで話していると経営工学チックなところでみんな悩んでいるなと印象があるので,
もっと汎用的な仕様にしたり, SpreadSheetでないアプリにしてみたいですね.


# 追記
調べたら リクルートさんのAirSHIFTっていうアプリを使えばものすごく便利やん！と後から気づく....
と言っても、平等にシフトを配賦するという機能は搭載してなさそうでしたが...
このアプリの追加機能作ってみたいですね.
【しずおかアプリ部】活動ログ　第55回

![しずおかアプリ部2.jpg](https://qiita-image-store.s3.amazonaws.com/0/88105/ee800648-fa25-1829-20c3-bad9c2055d35.jpeg)

##■公式サイト##
[http://monolizm.com/shizuoka-app](http://monolizm.com/shizuoka-app)
「Slack」も利用しています。 shizuapp で検索し、ご参加ください。

##◾️参加申し込み##
しずおかアプリ部への参加申し込みは[こちら](https://shizuoka-app.connpass.com/)から

##■タイトル##
第５５回


##■開催日##
２０１８年１２月８日（土）　１６：３０～１８：３０


##■参加者##
１２名


##■活動内容（概要）##
・菅原プレゼン：「Unity始めるよ　2018で強化された2D機能を試そう！　ボーンで動かす2DキャラとSpriteShapeで自由な2D地形作成」
・体験入部の方：ゲームの企画発表！
・部員さん：C#と時の部屋 #2「文字列型と配列編」


![IMG_4070.JPG](https://qiita-image-store.s3.amazonaws.com/0/88105/e8f7cc4b-6f69-5e6f-cd72-4d8b049f0baf.jpeg)



##■活動内容（詳細）##

【実演・プレゼン】

**・菅原プレゼン：「Unity始めるよ　2018で強化された2D機能を試そう！　ボーンで動かす2DキャラとSpriteShapeで自由な2D地形作成」**
 2018で扱えるようになった2D関連の機能を試してみました。
　一つは「2DAnimation」
　![スクリーンショット 2018-12-26 15.24.34.png](https://qiita-image-store.s3.amazonaws.com/0/88105/b33752b3-6dff-1945-531a-ad72a854ba53.png)
　Unity内で、スケルタルアニメーションデータが作れます。
　画像を１枚用意すればUnity内で、
　・メッシュ化
　・ボーン入れ
　・ウェイトペイント
　ができてしまいます。
　アニメーションについてはUnityのAnimationシステムがそのまま使えます。

　もう一つは「SpriteShape」
　![スクリーンショット 2018-12-26 15.24.43.png](https://qiita-image-store.s3.amazonaws.com/0/88105/f254f30e-ad6e-f819-b37a-25e7ae63b841.png)
　イラストレーターでパスを描くような操作で簡単に地形を生成できます。
　地形の角度により自動で画像を切り替えることができます。

　凝った2Dのゲームを作りやすくなりましたが、
　上記２つの機能は未だPreview版。
　正式リリースが待ち遠しいところです。

　[資料](http://monolizm.com/sab/pdf/第55回_プレゼン資料_(2018で強化された2D機能を試そう！).pdf)　

<hr>

**・体験入部の方：ゲームの企画発表！**
　初参加にしてプレゼンを行っていただけました。
　長い年月あたためてきたゲーム企画の発表と、
　本日の参加者に体験してもらうため、アナログで遊べる仕組みを用意してきていただきました。
　企画に関してはここに載せることはできませんが、
　遊ぶためのハードルが低く、かつ戦略的に遊べる奥が深いゲーム内容でした。
　かなり具体的な話で、今後が非常に楽しみです。

<hr>


**・部員さん：C#と時の部屋 #2「文字列型と配列編」**
　初心者向きに、
　・デバッグ機能の使い方
　・C#の基礎（プログラムの基礎）

　上級者向けに
　・高速化

　のお話をしていただきました。
　![スクリーンショット 2018-12-26 16.51.25.png](https://qiita-image-store.s3.amazonaws.com/0/88105/c0e1c713-3a81-6bdf-9f42-8a508899fd8c.png)


　![スクリーンショット 2018-12-26 16.50.52.png](https://qiita-image-store.s3.amazonaws.com/0/88105/dc2fa8d1-6890-c5fd-7b83-f84a1c4c2cf2.png)

　高速化については、モバイル環境だと特に意識していかなければなりません。
　プログラムを長くやっていても「どうだったっけかな？」ということがあるので、
　今回のプレゼンが良い機会になりました。
　
　[資料](http://monolizm.com/sab/pdf/第55回_プレゼン資料(CSharpと時の部屋2「文字列型と配列編」).pdf)
　[プロジェクト一式](http://monolizm.com/sab/src/CSharpWorld2.zip)
<hr>

　２０１８年最後のしずおかアプリ部でした。
　その後の忘年会では濃いお話をすることができました。
　個人的にはこれからもっと深い話ができると思っていたところで、時間がきてしまいました。
　技術者同士話をするのはおもしろいものです。
　また皆様と濃い話ができればと思います。

　来年もどうぞよろしくお願いいたします。
個人開発を応援するアプリを作った（モバイルアプリはOSS）

Advent Calendar 2018「個人開発 #2」最終日の記事です。

## なぜ作った？
普段から個人開発者たちのブログはよくチェックしていて、勉強になることも多いしモチベーションにも繋がっています。彼らに対して（できれば彼らと一緒に）なにかできればなーと思い作りました。

昨年くらいから`個人開発`のワードをTwitterでよく見るようになって、2つあるAdvent Calendarも全て埋まっているのをみて間に合わせようと急いで作りました。

個人開発プロダクトのマーケティングチャネル・集客力の一助になれたら幸いです。

## CodePicksとは？
![image.png](https://qiita-image-store.s3.amazonaws.com/0/72204/86c81cfb-c4fc-c137-7784-646963f3b86c.png)

個人開発者が自分のプロダクト・それに関連した記事を共有するサービスです。

- プロダクトを投稿・共有する
- プロダクト・個人開発に関する記事をシェアする（Canonicalタグに対応しているので転載OKです）

のがメイン機能になります。
個人開発はマーケティングや拡散にリソースを使えないため作って終わりな側面があり、それってすごく勿体無いなと思っていました。

## モバイルアプリについて
オープンソースで公開しています。
https://github.com/KangYoosam/CodePicks

現在iOS版は審査中で、Androidのみストアに出ています。
https://play.google.com/store/apps/details?id=com.codepicks

ReactNativeで開発しており、これからReactNativeの勉強会を毎週（多分）開催していこうと思っているので、アプリ開発に関して聞きたい方、ReactNativeを学びたい方がいらっしゃいましたらぜひご参加ください！

ちなみに明日（12月27日）に勉強会やります @神田
https://r-n.connpass.com/event/112874/

## これから
- プロダクトに対するフィードバック
- 仲間集め
- マーケティング・拡散に役立つ機能・施策
- サービスのグロースや売却まで視野に入れられるような営業活動

ができればなと思っています。特に`個人開発したサービスを売却する`ことは非常にニーズがあり、周りでちらほら見かけるので、これから市場自体を作っていければなと思っています。

CodePicks: https://codepicks.jp/

開発状況などは↓でつぶやいていくので、ご興味があればフォローよろしくお願いします！
https://twitter.com/kangyoosam
async/awaitとpromiseの対比

#はじめに

Promise と async/await について勉強した際のメモです

#async/await と promise

```javascript
const getDataPromise = (num) => new Promise((resolve, reject) => {
    setTimeout(() => {
        typeof num === 'number' ? resolve(num * 2) : reject('error!!!!!!!!!!!!!!!!!')
    }, 2000)
})
```

上のようなpromiseを返すgetDataPromise()があったとして、


```javascript

const processData = () => new Promise((resolve, reject) =>{
    getDataPromise(1).then((data) => {
        return getDataPromise(data)
    }).then((data) => {
        resolve(data)
    }).catch((err) => {
        reject(err)
    })
})
```

これは


```javascript
const processData = async () => {
    let data = await getDataPromise(1)
    data = await getDataPromise(data)
    return data
}
```

と同じ

asyncってのはつまるところ、戻り値をpromiseとして返すってこと

上の例でawaitしている関数でerrorが生じた場合、水面下で throw new ErrorしてくれるようになっているのでprocessData()を呼び出すときに

```javascript
processData().then((data) => {
    //なんかの処理
}).catch((error) => {
    //エラー処理
})
```

こんな感じでcatch()してあげればOK
超大雑把に配列の順序をランダムにする方法 (非破壊編集)

JavaScriptでランダムに配列をソートしたい、だけどもとの配列に影響を与えたくないということで考えたものです。

Fisher-Yates というアルゴリズムを見かけたのですが、もとの配列を並び替えるし状態管理の変数を使うというものだったのでスルーです。

---
@hogefuga さんのコメントより

非破壊なFisher-Yatesを教えていただきました。

```js
const randomSort = array =>
   array.reduce((sorted, value, i) => {
      const j = Math.floor(Math.random() * i);
      if (j === i) {
         return [...sorted, value];
      }
      else {
         return [...sorted.slice(0, j), value, ...sorted.slice(j)];
      }
   }, []);
```

同じコメントでPrototypeの拡張はアカンということも教えていただきました。

ありがとうございます！

---

最終的なコードは下記の通り。

```js
const randomSort = srcArray => {
  const newArray = Array(srcArray.length);
  srcArray.map(value => {
    const key = Math.floor(Math.random() * (srcArray.length + 1));
    newArray.splice(key, 0, value);
  })

  return newArray.filter(value => value);
}
```

Array オブジェクトのメソッドとして。（←アカンやつです）

```js
Array.prototype.randomSort = function() {
 const newArray = Array(this.length);
 this.map((value) => {
 	newArray.splice(Math.floor(Math.random() * (this.length + 1)), 0, value);
 });
 
 return newArray.filter(value => value);
}
```

これでまあまあランダムに並び替えてくれるので、ライトな使い方では十分でしょう。
流体表現に磨きをかける

この記事は**HoudiniAdventCalender2018 12月17日の記事です**
![loading_spy.gif](https://qiita-image-store.s3.amazonaws.com/0/179218/eda9cbe3-516c-6208-56e4-fa0417efd51c.gif)

---

皆様こんにちは
今年もAdventCalenderに参加できて光栄です。

蒸留水さんありがとうございます。

僕のネタは流体表現!!
ちょっとしたクリスマスプレゼント?になればうれしいです。

---
まず...
VFX流体の基礎として最低限抑えておきたい箇所を共有します(free)
https://drive.google.com/open?id=1zmmr_yaVmU2pRnpmsyvr4Txhbs5fPCho

Animationの基礎が分かっている前提で作成しています。
`気になる部分があったら各自で調べるのをお勧めします。`

ChristmasGift(HipFIle) はこちら
https://drive.google.com/open?id=15Zd1bI3qAyF9E5E5UngpqGSdp4S9hfag

---

さて...

Animationを考えた時に流体の動きのコントロールは何処でプログラム(管理)されているのか
掴んでおきましょう。

基本的なAnimation(lagrange)
``Pos = currentPosiotn + velocity``

```C:simpleAnimation.C

int main
{
   for (int i; iterate>= i; i++;)
  {
   vector Pos = currentPos;
   vector v = (velocity*TimeInterval)*i;
   //i = dt 
   @P = Pos +v;
   }
}
```
`pointPostionに直接変化量を待たせて、更新する。`


基本的なAnimation(Euler)
``Pos = currentPosiotn + velocity``

```C:simpleAnimation.C

int main
{
   for (int i; iterate>= i; i++;)
  {
   vector Pos = currentPos;
   vector v = (voxel_Velocity * TimeInterval)*i;
   //voxel_Velocity = Sampling current_VelocityData
   //i = dt 
   @P = Pos +v;
   }
}
```
`voxelに変化量を待たせて、それらを参照し更新する。`

___

Houdiniの`Fluid_Dynamics_System`にも同様に当てはめることが出来ます。

`voxelAnimation`と`ParticleANimation`の求め方の違いを握っておきましょう。


___

次に`VolumeDisplacement`についてです
以下を参照してください。
https://drive.google.com/open?id=13r1GNWwifSjvVBrFq513QF84Egr0-ZWP


```C:VolumeDisplacement.C

int main
{
   vector idxPos = dnesityPosition;
   vector directiornalVector = normalize(gradient(density))*(amount*lengthnormalize(gradient(density)));
   vector pushUp = idxPos + directiornalVector

   float density = voxelTrace_density(pushUp);

   return density;
   
}
```

`SurfaceDisplacementとVolumeDisplacementの違いをしっかりと復習しておきましょう`

---

`WaveletTurbulence & GridRessAdvection`

Technical Paper
 `Wavelet Turbulence`
https://www.cs.cornell.edu/~tedkim/WTURB/wavelet_turbulence.pdf

`Gridress Advection`
https://www.aps.org/units/dfd/meetings/upload/dfd2010-tessendorf.pdf

`Other`
https://people.cs.clemson.edu/~jtessen/papers_files/RIV.pdf



---

さっぱりな方は
これを...
https://drive.google.com/open?id=1x6lbRMJAqoUk2XbOTkiuPW7os21J4KdE

それでも分からない方は...


がんばってください


```C:CameraSpaceAdvect.C

int main
{
   vector Pos = dnesityPosition;
   vector advectvelocity = cross(getvoxelvelocity,CameraSpace_Turbulence) *(1/FPS)*Timestep;
   vector PositionSample_A =  advectvelocity+ Pos;
   
   vector PositionSample_B =(getvoxelvelocity(PositionSample_A) *(1/FPS)*Timestep;
   
   Pos +=  PositionSample_B;

   density = voxelTrace_density(Pos);
   return density;
}
```

___

Hipfileを見ながら、AdventCalenderネタを閲覧していただけるといいと思います。


これらの式や考え方をhoudiniに落とし込んでいき
実際のプロジェクトにラスタライズしていき
最終的にtoolとしてリリースします。


質問や意見などありましたら
気軽に聞いてください。


いいね！と思ったらGoodボタン...
じゃなくて

ソーシャルに拡散していただけるとうれしいです。

ぼくにも皆さんの気持ち(クリスマスプレゼント)頂けるとうれしいなぁー

PATREON
https://www.patreon.com/Nerv_lol


では
皆様
お元気で~~~~~~~~~
___

PS: 告知忘れましたがHoudiniHive2018 Tokyoでプレゼンしたので良かったら見てやってください。
https://vimeo.com/305069852
雑に始める CWL！でudockerを利用する

# CWLでudocker を利用してみる

@tm_tn さんが [雑に始める CWL！](https://qiita.com/tm_tn/items/4956f5ca523f7f49f386)を書いているので、この内容を利用してcwltoolのudockerを利用する機能を使用してみる

## udockerの準備
udockerをインストールして欲しい手順は[2. クラスター計算機で udocker を利用する: インストール編](https://qiita.com/percipere/items/f9b7a7ac9291c0cc4566)等を参照
*curlのバージョンが古いと正常に動作しないので、その時はcurlをバージョンアップしよう!*

udockerをカレントディレクトリにインストールしているので、PATHを通しておこう

## cwlを記述する

[雑に始める CWL！](https://qiita.com/tm_tn/items/4956f5ca523f7f49f386)のそれをそのまま利用する

内容は次の通り

```yaml:head.cwl
cwlVersion: v1.0
class: CommandLineTool
baseCommand: [head]
arguments: [-n$(inputs.nlines), $(inputs.source)]
inputs:
  - id: source
    type: File
  - id: nlines
    type: int
outputs:
  - id: out
    type: stdout
stdout: $(inputs.source.nameroot)-head.txt
requirements:
  - class: DockerRequirement
    dockerPull: alpine:latest
```

処理対象のファイルの作成方法も改めて記載しておく

```bash
$ man head > manhead.txt
```

## udocker を利用して実行

いよいよudockerを利用して実行してみる

cwltool に`--user-space-docker-cmd=udocker` を指定してdockerの代わりにudockerを利用するようにする

```bash
$ cwltool  \
    --user-space-docker-cmd=udocker \
    head.cwl \
    --source manhead.txt\
    --nlines 5
```

実行結果は次の通り

```bash
$ cwltool      --user-space-docker-cmd=udocker     head.cwl     --source manhead.txt    --nlines 5
/home/usr1/.udocker/bin/cwltool 1.0.20181217162649
Resolved 'head.cwl' to 'file:///home/usr1/work/cwl/head.cwl'
[job head.cwl] /tmp/OiEMR1$ udocker \
    --quiet \
    run \
    --volume=/tmp/OiEMR1:/bDkEhV \
    --volume=/tmp/0h3_Oq:/tmp \
    --volume=/home/usr1/work/cwl/manhead.txt:/var/lib/cwl/stga57d9eba-5c74-4201-8ae7-a81c633fd6e7/manhead.txt \
    --workdir=/bDkEhV \
    --rm \
    --env=TMPDIR=/tmp \
    --env=HOME=/bDkEhV \
    alpine:latest \
    head \
    -n5 \
    /var/lib/cwl/stga57d9eba-5c74-4201-8ae7-a81c633fd6e7/manhead.txt > /tmp/OiEMR1/manhead-head.txt
[job head.cwl] Max memory used: 12MiB
[job head.cwl] completed success
{
    "out": {
        "checksum": "sha1$2520a3daad4351ed428f758236710d4c703f2362", 
        "basename": "manhead-head.txt", 
        "location": "file:///home/usr1/work/cwl/manhead-head.txt", 
        "path": "/home/usr1/work/cwl/manhead-head.txt", 
        "class": "File", 
        "size": 158
    }
}
Final process status is success
```

作成された`manhead-head.txt`を確認すると正常に動作した事がわかる

## Job Schedulerを利用する
udockerの醍醐味はdockerをインストールできない環境でもdockerコンテナを利用できるということ
ここではUniva Grid Engineを利用して同じ処理をdocker環境の無いクラスターのノードにサブミットしてみる

その前にmanhead-head.txtを別名に変更しておこう

```bash
$ mv manhead-head.txt manhead-head_back.txt
```

下記では次の一連の作業を実行

- qsubでのジョブのサブミット `qsub -jc ジョブ実行用のキュー -cwd -b y` 実行するコマンド
- フォルダ上のファイルの確認
- 結果の比較を行い出力に差が無い事を確認

```bash
$ qsub -jc ジョブ実行用のキュー -cwd -b y cwltool --user-space-docker-cmd=udocker head.cwl --source manhead.txt --nlines 5
Your job 4661722 ("cwltool") has been submitted
$ ls
cwltool.e4661722  cwltool.o4661722  head.cwl  manhead-head.txt  manhead-head_back.txt  manhead.txt  udocker
$ diff manhead-head.txt  manhead-head_back.txt  
$ 
```

このようにして、cwltoolとudockerを利用して結果を得られた

注意

- コンテナ上のツールがudockerの環境下で正しく動作するかについて先に検証しておくこと
- ジョブを実行した数だけ、コンテナを展開した結果がディスク上に残るので適切な方法でこれを消去すること
    - 大量のJobをクラスタに分散する場合には特に留意が必要

今回はここまで:smile:
新卒2年目のインフラエンジニアがインフラ案件を紹介してみた①


#目次
1.はじめに
2.全体概要
3.要件定義フェーズ



## 1.はじめに

簡単に自己紹介と記事掲載の背景と目的を書きます。

### 自己紹介
　・新卒2年目のインフラエンジニア
　・大学時代にC言語を授業で受けていたが、全くわからず。。
　・入社後の研修では、Javaの研修がメイン(研修でインフラはあまりやってない)

### 記事掲載の背景と目的
　1つの案件で、要件定義～運用までの全行程に関わる機会があり、とてもたくさんの気づきを得れました。
　私がその案件で得た学びが「1〜2年目のインフラエンジニア」の方や「インフラ案件を初めてやるよ！」という方の参考になればと思い記事を掲載しています。

※私の経験ベースなので、多少一般論と異なることもあるかもしれませんが、ご了承ください。

## 2.全体概要

まず簡単にどんな案件なのかの説明から。
私は、EOSL(End of Service Life)を迎えるHWとSWのライフサイクル対応を行っていました。

ん？どういうこと？という方向けにもう少し簡単な説明を！

そもそもサーバやOS、ソフトウェアなどには保守期限（保証期間みたいなもの）があります。
保守期間内であればサーバなどに障害が発生した際にベンダーが対応してくれます。

もう少し実生活に近づけて例えるならば、電化製品を購入の際に「○年保証します！」という保証書が入っていますよね？
その保証期間と同じようなものをイメージしていただければ大丈夫です。

この保守期限を過ぎてしまった場合、ベンダーが障害対応をしてくれません。
となると、障害の発生で業務やサービスが長時間停止してしまう可能性が出てきます。
サービスの停止によって多額の損失を得るなんてことも。
その状態は好ましくない！ということでサーバの置き換え対応を行いました。

じゃあその案件は、全体的に案件がどう進んでいるの？という説明を。
インフラ案件は、サーバなどのHWの購入等で後戻りしづらいことから基本的にウォーターフォールモデルで進んでいます。
ウォーターフォールモデルとは？という方向けに簡単な説明を！

### ウォーターフォールモデルとは？

ウォーターフォールモデルとは、図2.1のようにシステムの要件定義から設計、製造、テストまで、各開発フェーズを段階的に進めていく開発モデルです。フェーズごとに進んでいくことから、仕様変更や前のフェーズに不足が発生した場合、前のフェーズに戻り、やり直さなければなりません。

詳しくは以下サイトをご覧ください！
<https://system-engineer.jimdo.com/ウォーターフォールモデル/>


![IMG_1716.PNG.jpeg](https://qiita-image-store.s3.amazonaws.com/0/329544/5365f35f-fd3a-6300-264d-255533ae3ad2.jpeg)
図2.1,ウォーターフォールV字モデル


余談ですが、各フェーズでODSCというフレームを意識して進めていくと、うまく進んでいくのでは？と思ってます！
ODSCの内容は以下参照。
<http://global-optimum.com/blog/2010/06/プロジェクトの計画と実行-odsc-とは？/>

私が参画した案件をベースに各フェーズについて紹介していきます。
（本記事では、要件定義のみです！以降のフェーズは次回の記事までお待ちください！）


## 3.要件定義フェーズ

要件定義を一言で言うと、
「お客様の要望を元に、システムの機能や性能を定義すること」です。

で、実際にどんなことするの？
という視点で続きを書いていきます。

要件定義フェーズでは、以下の内容を決め、要件定義書が作成します。
・プロジェクトの進め方
・機能要件
・非機能要件

インフラエンジニアの仕事は非機能要件がメインとなります。
では、それぞれの項目ではどのようなことを決めるのかもう少し詳細に書いていきます。

### プロジェクトの進め方
プロジェクトを進めていく上で必要な以下の項目を定義します。

#### プロジェクトの目的
　今回は、「EOSLによって非サポートとなるHWとSWを最新化することで、サポートを受けられる状態にすること」
　を目的と置いています。

#### プロジェクト体制図
　それぞれの役割を明確にし、誰が何をしているかが明確にわかる図を作成します。
　以下の図は例として参考にしてください。
<https://www.it-innovation.co.jp/2010/08/17-145655/>

![hironaka_chart100817_1.gif](https://qiita-image-store.s3.amazonaws.com/0/329544/9f927a6b-b66e-435c-6b91-242be12dad8b.gif)
図3.1.プロジェクト体制図

#### 連絡ツールとルール
　必要な連絡ツールとルールを定義します。
　メールとなる場合、プロジェクトの名称を件名に付与するようにルールを指定する場合があります。


### 機能要件
機能要件とは、どのような機能がそのシステムに必要なのかを定義したものです。
フリマサイトを例にあげると、

・商品の売買ができること
・ユーザーの登録ができること
　etc…

などが挙げられます。

### 非機能要件
非機能要件とは、機能要件以外の要件を指します。
以下に具体例を書きます。
・可用性要件（可用性、耐障害性、災害対策、回復性、成熟性）
　　 - サーバの稼働時間はいつからいつまで？
　　 - シャットダウンはしても平気？
　　 - もしサーバに障害が起きたら何分以内に復旧が必要？
　　　などを決めていく

・性能・拡張性（業務処理量、性能目標値、リソース拡張性、性能品質保証）
　　 - レスポンススピードはどのくらい？
　　 - データ処理ってどのくらいするの？
　　 - どうやって拡張できるようにする？
　　　などを決めていく

・運用・保守性（通常運用、保守運用、障害時運用、運用環境、運用・保守体制、運用管理方）
　　 - どんな風に運用していくの？
　　　などを決めていく

・移行性（移行時期、移行方式、移行対象（機器）、移行対象（データ）、移行計画）
　　 - 何をいつどうやって移行するの？
　　　などを決めていく

・セキュリティ（前提条件・制約条件、セキュリティリスク対応、セキュリティ診断、セキュリティリスク管理、アクセス・利用制限、データの秘匿、不正追跡・監視、ネットワーク対策、マルウェア対策、Web対策）
　　 - システムの安心をどう守る？
　　　などを決めていく

・環境・エコロジー（システム制約/前提条件、システム特性、適合規格、機材設置環境条件、環境マネージメント）
　　 - 耐震/免震、重量/空間、温度/湿度、騒音
　　　などを決めていく

以上の項目をまとめ、要件定義書を作成すれば要件定義フェーズ完了です。

基本設計以降は次回の記事（複数出す予定）に記載しようかと思いますので次回記事を乞うご期待ください！！！
任意の位置情報によるGoogle検索結果を取得するサービスを作ってみた



## 成果物

https://apps.yuking11.net/gms/

## 開発動機

社内マーケティングマネージャーからのありがたいお言葉。

「指定した位置情報での検索結果を取得したいんですよー。」
「もともとそういうツールあったけどなんか知らないけどぶっ壊れちゃってー。」
「外注に見積もり出したらXX万円て言われてー。」
「だから作って？」

## やったこと

- 検索結果パラメーターの解析（お言葉くれた人がすでに解析してた
- パラメーターの自動生成（PHP）
- 検索結果の表示（JavaScript）

## 簡単に解説

位置情報を指定しているパラメーターは「uule」なので、このValueを生成できればいい。
ここでは香川県での検索結果を取得するものとする。

1. [AdWords APIのGeotargets](https://developers.google.com/adwords/api/docs/appendix/geotargeting)にアクセス
2. Name「kagawa」でフィルタリングして、出てきたCanonical Name「Kagawa Prefecture,Japan」をメモメモ
3. [ここ](https://www.tools4noobs.com/online_php_functions/strlen/)から文字列の長さを取得（23だった）
4. そして[ここ](http://d1avok0lzls2w.cloudfront.net/uploads/blog/52aa7d2acd1fe6.90051212.jpg)の表と照らし合わせると「23」は「X」
5. んでもって[ここ](https://www.base64encode.org)で「Kagawa Prefecture,Japan」をUTF-8のbase64エンコード
6. 出てきた文字列は「S2FnYXdhIFByZWZlY3R1cmUsSmFwYW4=」
7. 今まで出てきた結果の頭に「w+CAIQICI」をくっつけて連結！（w+CAIQICI | X | S2FnYXdhIFByZWZlY3R1cmUsSmFwYW4=）
8. 完成したパラメーターは「uule=w+CAIQICIXS2FnYXdhIFByZWZlY3R1cmUsSmFwYW4=」となる

こうして出来上がったパラメーターを検索結果URLに付与すると・・・？

普通に検索
https://www.google.com/search?q=うどん

パラメーター付与
https://www.google.com/search?q=うどん&uule=w+CAIQICIXS2FnYXdhIFByZWZlY3R1cmUsSmFwYW4=

変わった・・・！

フッターの位置情報を見ると、ちゃんと「香川県」になってる。

## まとめ

というわけでうん万円の外注費が浮き、マネージャーの要望に答えることができたとさ。
サービスの方は上の解説を全部自動化（地域名日本語化）したり、他のパラメーター加えてたりします。はい。

最近はWeb制作よりこういうことやってる方が楽しくなってきて、自分は一体どこに向かってるんだろうと悩むことがあったりなかったり。

## 参考

https://seopt.pw/slog/title/位置情報から検索結果を取得する際のハッカー小話/
【TIPS】MATLABで「関数 'xxxx' が未定義です」エラーが出る

> **Note:** 本記事は、2018年12月時点の内容です。

# 【Q】MATLABで「関数 'xxxx' が未定義です」エラーが出る。なんで？

* 実行時のエラーメッセージ例

```
関数 'xxx' (タイプ'xxx' の入力引数) が未定義です。
```


# 【A】ライセンスに含まれない関数を使用している可能性があります。ライセンスに含まれているか確認しましょう。

## 作業の手順
1. whichコマンドでパスの確認

### 【手順1】whichコマンドでパスの確認
* MATLABのコマンドウインドウにて、以下コマンドを実行

```
>> which <function name> -all
```

* インストールされていない場合

```
>> which xxx -all

'xxx' が見つかりません。
```

* インストールされている場合、関数のパスが表示される

```
>> which abs -all

built-in (C:\Program Files\MATLAB\XXX\toolbox\matlab\elfun\@double\abs)   % double method
・・・(以下、略)・・・
```

* インストールされていない場合、MathworksのWebサイトでどのToolboxに含まれるかを確認しましょう。

* 有償Toolboxの場合、ライセンスを購入しましょう。


## 参考資料

> **なぜ「関数または変数 'xxxx' が未定義です。」のエラーが発生するのですか？**

> * https://jp.mathworks.com/matlabcentral/answers/316883-xxxx
HoloLensハンズオン 音声対話をしてみよう！2019（事前準備編）

##環境
HoloLens OS : RS5(日本語版)
PC OS：Windows 10
[Windows10SDK](https://developer.microsoft.com/ja-jp/windows/downloads/windows-10-sdk) : 17763
Unity：Unity 2017.4.14f1 (14f1以上であればおそらく可)
Visial Studio：Visial Studio Community 2017
gitがインストールされていること

※Unityインストール時には以下の２つのコンポーネントを追加してインストールしてください。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/60734/f6c929c6-3e1f-abe6-a186-edacc60cef9a.png)

##プロジェクト作成前の事前準備
###プロジェクトのクローン
https://github.com/decchi/MRAgent
からクローンしてください。

###oculus-lipsync-unityのダウンロード
https://developer.oculus.com/downloads/package/oculus-lipsync-unity/1.16.0/
からovr_audio_lipsync_unity_1.16.0をダウンロードします。
ダウンロード後展開し、ovr_audio_lipsync_unity_1.16.0\LipSync\UnityPlugin
にあるOVRLipSync.unitypackageをわかりやすい場所においておいてください。
###HoloToolkit 2017.4.3.0のダウンロード
https://github.com/Microsoft/MixedRealityToolkit-Unity/releases/tag/2017.4.3.0
からHoloToolkit-Unity-2017.4.3.0.unitypackageをダウンロードし、
わかりやすい場所においておいてください。
###Unityちゃんのダウンロード
Unityちゃんのパッケージ(ver.1.2)を下記リンクからダウンロードし、
わかりやすい場所においておいてください。
http://unity-chan.com/download/releaseNote.php?id=UnityChan
##Unityプロジェクト事前準備
###Unityを起動し、MRAgentプロジェクトを開く
先ほどクローンしたMRAgentのプロジェクトをUnity Editorで開きます。
※最初はエラーがでますが、気にしない。

###HoloToolkit-Unityのインポート
先ほどダウンロードしておいたHoloToolkit-Unity-2017.4.3.0.unitypackageをプロジェクトにインポートします。
###oculus-lipsync-unityのインポート
先ほどダウンロードしておいたOVRLipSync.unitypackageをプロジェクトにインポートします。
その際、Plugins/x86_64をインポート対象から外しておきます。（下図参照）
ダイアログとかでても問題ないので、そのままインポートしてください。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/60734/106ebaaa-d8cf-3c2c-147b-1d18d8b8939c.png)

###Unityちゃんのインポート
先ほどダウンロードしておいたUnityChan_1_2.unitypackageをプロジェクトにインポートします。
その際、Scriptsをインポート対象から外しておきます。（下図参照）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/60734/8122b0f1-dbc0-1109-751d-ce21e336e779.png)
###HoloLens用のプロジェクト設定
エディタのMixed Reality ToolKit→ConfigureでHoloLens用のプロジェクト設定を行う。
下記の２つの設定について設定を行う。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/60734/4d0cf98e-ab83-612c-0111-3efb5024ba07.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/60734/c6559539-bed9-99fa-acf8-fe524dc74738.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/60734/f76f2e61-9831-1729-a8bb-ef4af59c7b25.png)

###事前準備完了
Assets/MRAgentにあるMRAgentProject.sceneを開いて保存してください。
HierarchyウィンドウとProjectウィンドウが下図と同じになっていればOKです。
お疲れさまでした。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/60734/482b8a81-b914-dfe7-835b-0691e3834430.png)
C++ Builder XE4 > Assign() > Error: TShapeをTShapeに代入することはできません。 > overrideして使う?

```txt:動作環境
C++ Builder XE4
```


### 試そうとしたこと

- TShapeが2つある
- 片方のTShapeからもう片方へプロパティをコピー
- Assign()というのがあるようだ
    - [TPersistent.Assign Method]( http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/delphivclwin32/Classes_TPersistent_Assign.html)
        - > Copies the contents of another, similar object.

Assign()を使ってみよう。

### 実装

```Unit1.cpp
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
	Shape2->Assign(Shape1);
}
//---------------------------------------------------------------------------
```

### 動作させてみた

![2018-12-26_16h25_22.png](https://qiita-image-store.s3.amazonaws.com/0/32870/d3904487-2c28-795d-fb7e-c29a2a1c1aca.png)

### 関連情報

- [[Delphi]Assign使ってますか(1)](http://k2top.jpn.org/diary/?date=0220)
    - @ K2さんの雑記

情報感謝です。

> VCLのTPersistentクラスには、Assignというメソッドがpublicで宣言されている。この中身をそのまま使うと例外が上がるだけである。よってTPersistent継承クラスを作った場合は、Assign*1をoverrideして、再定義する。

上記のエラーはoverrideで直るかどうか。
主要な仮想通貨７個をテキトーに比較してみる

##2018年を振り返って
ブロックチェーン関連の仕事をしておりますが、あまりブロックチェーンそものもを触る機会はなく、日々日々悶々としている生活を送っております。

PoWの意味や真価が問われる2018年となりましたが、現在、ブロックチェーンをもう少し利用した新サービスの立ち上げをいくつか予定しており、自分の頭の整理をすべく主要な仮想通貨＆ブロックチェーンを比較してみたいと思います。言葉足らずになる可能性が高いので、ご勘弁を。

##気になっている仮想通貨
気になっているブロックチェーンがあったので、それぞれを独自の観点から比較して書いてみましょう。気になる仮想通貨は下記７個です。

1) Bitcoin
2) Bitcoin SV
3) Bitcoin ABC
4) Ethereum
5) EOS
6) Stellar
7) Tezos

###※注意点
NativeスマートコントラクトとdAppsということばの定義をしておきます。
dAppsとは、EthereumのSolidityのように誰でも簡単にデプロイできるスマートコントラクトのこと。
Nativeスマートコントラクトとは、ブロックチェーンの仕様に組み込まれるプロトコルのこと。
を指します。また、私の見解としては、dAppsと中央集権型のコードはほぼ一緒であるという認識で、dAppsに対しては、疑問を呈しているタイプの人間です。


##仮想通貨・ブロックチェーンの比較

|  | Bitcoin  |  Bitcoin SV | Bitcoin ABC  |  Ethereum | EOS  |  Stellar | Tezos  |
|:-:|---|---|---|---|---|---|---|
| オンチェーンスケーラビリティー  |△|○|○|○|○|?|?|
| オフチェーンスケーラビリティー  |○|✖︎|✖︎|○|○|△|△|
| 使いやすさ  |○|△|△|○|△|△|✖︎|
| コミュニティー  |○|✖︎|△|○|○|○|✖︎|
| 裏付け価値  |PoW|PoW|PoW|PoW|DPoS|SCP|DPoS|
| dApps  |N/A|N/A|N/A|○|○|○|△|
| Nativeスマートコントラクト|△|△|△|○|○|○|△|
| トークン|△|△|△|○|○|○|△|

###Bitcoin
まず、Bitcoinですが、やはり暗号通貨の中のKingであることは間違いなく、今後も期待ができる暗号通貨・ブロックチェーンであることは間違い無いと思います。ただし、ブロックサイズが1MBと超少なくTX手数料が高騰しやすいです。また、SideChainやLightningNetwork等のセカンドレイヤーと呼ばれる技術開発も大幅に遅れているため、王者としての地位を確立したまま走れるかどうかは疑問です。個人的には、早くブロックサイズを4MBくらいまであげてほしいと思っています。

###BitcoinABC
BitcoinCashのハッシュ戦争から派生したABCですが、今の所プロトコルの中で一番使いにくそうだなと思っているブロックチェーンの一種です。WCHと言われるトークンのプロトコルも、なぜかProof of Burnと呼ばれる意味もなく通貨の総量が減っていく仕組みで成り立っており、VALU社としてはあまり使わないように思える仕様です。ただし、Bitcoinの初期の時代を支えたキープレイヤーが複数人サポートしており、今後、私情を含まず業界の発展をさせるための活躍に復活に期待ですかね。

###BitcoinSV
来年の12月に2GBのブロックサイズにすると言っている挑戦的なビジョンを抱えていますが、トークンの仕様自体は使いやすそうであり、HardDiscが保てる状態なのであれば、かなり使いやすいブロックチェーンになるのではないかと思います。ただし、2GBのブロックサイズにすると、３〜５日に一回1TBのディスクを利用することになるので、リスクが高い挑戦なのではないかと思います。1TBのHDDが大体5000円なので、ブロックチェーンをフルで保存する場合は、1年間のコストが35万円~60万円くらいHDを毎年買い続けることになると思います。また、Explore等のMySQL等で高速にパフォーマンスを出しているWebアプリが使えなくなるような気がしています。

###Ethereum
今のところ、一番使いやすい仮想通貨なのではないかと思っています。ERC20, ERC721等の特殊なトークンも多いのが特徴です。トークン系のビジネスを行う際で、もっとも有力に使われるのが、Ethereumだと思っています。ただし、あまりの人気にどんどんブロックサイズが拡大していますが、なかなかプラズマなどのSideChainっぽいものの実装が進んでおらず、破綻するリスクも抱えているのではないかと推測します。

###EOS
中国版のEthereumという印象でしたが、DPoSを採用しており、もしかしたらEthereumより使いやすくなる可能性あるのではないかと思っております。技術的に触れてないので、感覚値ですが・・・

###Stellar
Rippleを作った人が作ったブロックチェーンとして有名ですが、少しづつ人気を集め始めているような気がします。
技術的に触れてないので、感覚値ですが・・・

###Tezos
他のブロックチェーンに比べて、OCamelなどのよくわからない言語を利用しており、導入コストが非常に高い印象。DPoSを採用しており、dAppsなども搭載しているため、Ethereumを超える可能性もあるが、ClassAの訴訟や様々な内部分裂等を抱えている印象。

##まとめ
Bitcoinマキシマリストの人は、将来的にパブリックブロックチェーンは１つになると言っていますが、果たして本当になるのでしょうか。ユーザーのことを考えたブロックチェーンが勝つような気がしていますが、どれも様々な問題があり、使う場合は、相当なリスクがあります。クリスマスに書く予定でしたが、大幅に遅れてしまい、また時間もあまり取れなかったため、簡単な比較考察になってしまいましたが、2019年もよろしくお願いいたします。
C言語でJSONを扱う。

# はじめに

C言語にもJSONパーサで色んな実装があるけど、自分で作りました。

https://gummoni.github.io/gummo_json/



# コンセプト
C言語にリフレクション機能を持たせて、変数とJSON文字列を直接変換できるようにしたところです。

イメージは、、、

struct(バイナリ) ＜－－＞　JSON（文字列）

こんな感じです。

パースするときにmallocも使っていないので、

メモリー領域に厳しいIoT関係に対応しました。


# 使い方
　構造体情報を「refrection.c」「refrection.h」に書くだけ！

あとは変数とJSONデータを用意して

JSON→変数に変換するのは、json_deserialize（）関数

変数→JSONに変換するのは、json_serialize（）関数

これだけ覚えておけばよいです。

#あとがき
構造体の中の構造体で配列型などにも対応していて、複雑な構造でも一通り対応できてると思います。

もし何かあればコメントください。
Bot Framework v4とCortana Skillと私

# 初めに
2018年にBot Framework v4がリリースされ、v3と書き方が全然違うので皆さん血反吐を吐く思いで勉強されていると思います。
私も勉強しているのですがASP.Net、何それ？という人なので良く分かっていません。
皆さんが公開しているサイトがなければすぐ挫折していたと思います。本当にありがとうございます。
まだまだ理解が追い付いていないので、お勧めの書籍なりサイトなりあれば教えてください。

と、話がそれました。。。
Bot Framework v4の記事を書ければよいなと思いながらQiitaを眺めていたのですが[ここ](https://qiita.com/kenakamu/items/6dc043cfc1f199032883)に良い記事がありましたので、今回はまだ日本でサービスインされていないCortana SkillをBot Framework v4で作成した場合の問題点について記載しようと思います。

# Cortana Skillとは
Cortanaから呼ぶことが出来るSkillです。
Amazon Echoで例えると、EchoがCortanaでAlexa SkillがCortana Skillとなります。

# BotとCortana Skillの関係
Bot Framework(v3でもv4でも)で作成したBotは様々なChannelに接続可能なように設計されています。
そのため、Azure Portal上でCortana Channelと接続設定さえすればCortanaからBotが呼び出せるようになります。
同様にSlackやMicrosoft TeamsなどからもBotに接続可能です。

# Bot Framework v4での問題点
さてさて、ようやく本題になります。
Bot Framework v4で作成したBotをCortanaに接続した場合、以下の問題があることがわかっています。

1. ConfirmPromptの選択肢(Yes/Noボタン)が表示されない
2. Typingを示す"..."が表示されない

1.のConfirmPromptの方はAdaptiveCardで対処しました。
AdaptiveCardではテキストのFontサイズも変更出来たりと便利なので、もうAdaptiveCardだけあれば良い気がしてきます。
(AdaptiveCardの詳細は[ここ](https://docs.microsoft.com/en-us/adaptive-cards/)を参照ください。)
ただし、Cortana Skillはユーザーからのインプットとして以下3つを考慮する必要があります。

- 音声
- キーボード
- ボタンタッチ

ConfirmPromptはYes/Noボタンを表示するため、AdaptiveCardで代用した場合は上記3つのインプットに**対応**する必要があります。
ここでわざわざ**対応**と言った理由ですが、Cortana SkillでAdaptiveCardを使用すると、音声やキーボードでYes/Noと入力した場合とボタンタッチでYes/Noを選択した場合とで得られる文字列が異なるためです。
音声やキーボードの場合はそのものずばりの文字列が得られるのですが、ボタンタッチの場合は得られる文字列の前後にダブルコーテーションが付きます。
前後にゴミが付くだけなので対応としては以下の様にすれば大丈夫です。

```
if (yesNo.ToLower().Contains("yes"))
{
    // Yesの時の処理
}
else if (yesNo.ToLower().Contains("no"))
{
    // Noの時の処理
}
else
{
    // それ以外
}
```

2.の対処策ですが現状不明です(少なくとも私は...)。
どなたかわかる人は教えていただけると助かります。

# 日本でサービスインされていないCortana Skillを使用するための設定
日本でサービスインされていないCortana Skillなので、どうやって使えるようになるのかを知らない人も多いと思います。
実は以下2つを設定するだけで使えるようになります。

- PCのCountry or Regionを米国する
- 言語設定を英語にする

# 最後に、現在解決策を知りたい事柄
以下をご存知の方、ぜひ教えてください。

- Typingを示す"..."が表示されない
　　上に記載しているため、詳細は省きます。

- Cortana SkillがCortanaが動作している環境のタイムゾーンの取得方法
　　メールアドレスや緯度経度は取得できますが、タイムゾーンの取得方法が不明でして。

- Cortana SkillからCortana Canvasを閉じる方法
　　もうCortana Skillを使い終わってもCortana Canvasがずっと表示されています。
　　これって消せないのかな？

# ちなみに
良いタイトルが思い浮かばなかったので、ちょうど聞いていた「部屋とYシャツと私」風にキーワードを列挙してみました。
MacコマンドラインからWebdavをマウント


いつもはwebdavのディレクトリをマウントする際に、
[Finder] > [サーバへ接続]を開き、共有フォルダのURLを入力して、
ユーザ名とパスワードを入力している。

コマンドラインからできないものかとやってみた。
mountコマンドの-tオプションでFinderの接続方法を参考に"https"と
指定したが、下記のエラーになってしまう。

```
mount: exec /Library/Filesystems/https.fs/Contents/Resources/mount_https for /Users/hoge/mnt: No such file or directory
```

mount_webdavというコマンドあることを知り、使ってみるとマウントできていた。


ひっかかった点は、パスワードの入力部分。
-i オプションをつけないと、キーチェーンのパスワードは聞いてくるが、
webdav側のユーザ名とパスワードは聞かれずに、エラーメッセージも表示されないが、
マウントは実行されていない。

```
# マウント
$ mount_webdav -i https://hoge.jp/dav ~/mnt
Username: xxxxxx
Password:
$


#　アンマウントはいつもどおりに
$ umount ~/mnt
```

（ちょっと悩んだので補足）
Finderの接続方法でマウントされるフォルダ /Volumes を指定しても
マウントできず、エラーメッセージも表示されなかった

```
~ $ ls -lh / |grep Volumes
drwxr-xr-x   4 root  wheel   128B 11 26 14:55 Volumes
```
管理者権限で行えばマウントできるのだろうけど、余計な作業を作ってしまうかもの心配から実施していません。
なぜFinderの「移動」→「サーバへ接続」だと管理権限なしで、/Volumeにマウントされるのかそちらの方が不思議になりました。
MacでTex環境を構築【その２】

Visual Studio Code でTeXファイルを編集する環境を整える.



# 拡張機能のダウンロード

拡張機能の LaTeX Workshop をダウンロード.
この拡張機能はTeXを書くときに補完や自動コンパイルを行ってくれる.
また,作成したPDFを確認しながら編集できる.


# LaTeX Workshop の設定

setting.json に以下の設定を追記.

```
    // latex settings
    "latex-workshop.latex.tools": [
        {
            "command": "platex",
            "args": [
                "%DOCFILE%.tex"
            ],
            "name": "Step 1: platex"
        },
        {
            "command": "dvipdfmx",
            "args": [
                "%DOCFILE%.dvi"
            ],
            "name": "Step 2: dvipdfmx"
        },
        {
            "command": "rm",
            "args": [
                "%DOCFILE%.dvi",
                "%DOCFILE%.aux",
                "%DOCFILE%.log"
            ],
            "name": "Step 3: rm"
        }
    ],
    "latex-workshop.latex.recipes": [
        {
            "name": "toolchain",
            "tools": [
                "Step 1: platex",
                "Step 1: platex",
                "Step 2: dvipdfmx",
                "Step 3: rm"
            ]
        }
    ],
    "latex-workshop.view.pdf.viewer": "tab",
    // 制御文字を表示する
    "editor.renderControlCharacters": true,
    "liveServer.settings.donotShowInfoMsg": true,
    "liveServer.settings.donotVerifyTags": true,
    "latex-workshop.message.update.show": false,
```

"latex-workshop.latex.tools" に実行するコマンドを書き, 
"latex-workshop.latex.recipes" に実行するコマンドの順番を書く.

"latex-workshop.latex.tools"はjson配列で与えられ,値は

```
{
    "command": "",
    "args": [],
    "name": ""
}
```

で与えられる.

| キー | 説明 |
|:--|:--|
| command | 実行するコマンド |
| args | コマンドに渡す引数 |
| name | この操作の名前 |

また, args にはプレースホルダーを渡すことができ,以下のようなものがある.

| プレースホルダー | 説明 |
|:--|:--|
| %DOC% | .tex 拡張子を含まないファイル名とパス |
| %DOCFILE% | .tex 拡張子を含まないファイル名 |
| %DIR% | ファイルのパス |
| %TMPDIR% | 補助ファイルを格納するための一時フォルダ。終了時に自動的に削除されます。 |


"latex-workshop.latex.recipes" には "latex-workshop.latex.tools" で設定した操作の実行順序を記述する.
操作の名前(nameで設定したもの)を実行したい順番に "tools" に記述する.

上記の設定を具体的に説明する.

```
    "latex-workshop.latex.tools": [
        {
            "command": "platex",      // platex を実行する
            "args": [                 // platex の引数にvscodeで開いているファイルを渡す
                "%DOC%"
            ],
            "name": "Step 1: platex"  // この操作の名前を "Step 1: platex" とする
        },

        (省略)

    ],
    "latex-workshop.latex.recipes": [
        {
            "name": "toolchain",
            "tools": [                // "Step 1: platex", "Step 1: platex", "Step 2: dvipdfmx", "Step 3: rm" の順番に実行
                "Step 1: platex",     // platex で tex ファイルをコンパイル
                "Step 1: platex",     // \ref{}で番号が正しく反映されないことがあるので二回する
                "Step 2: dvipdfmx",   // platex で作成された dvi ファイルを pdf に変換
                "Step 3: rm"          // コンパイル時にできた不要なファイルを削除
            ]
        }
    ],
    
    (省略)
```

設定は各々書き換えてください.
便利かもしれないstatic_assert改

#はじめに
static_assertのときに、ファイル名と行番号もついでに表示させられたら便利かもしれないというものです。
（2018/12/26 21:18 改訂 依存名改訂+α　書き換え箇所が多いです。すみませんorz
　　　　もう一度目を通して頂ければ幸いです。（泣））
この記事は、boost pp のところだけみてください！！

###必要なもの
C++17,boost


#static_assert改

MAKE_COMPILE_ERRORマクロです。普通のstatic_assertとfalse_v<T>を組み合わせ、ファイル名と行番号をメッセージと一緒に出力します。

```cpp
#include <type_traits>
#include <boost/preprocessor/stringize.hpp>

#define MAKE_COMPILE_ERROR( ... ) \
static_assert([](auto && a) { \
return std::remove_reference<decltype(a)>::type::value; \
} (std::is_void<int>{}), \
"\n\n\nMAKED COMPILE ERROR!\n" \
"file: " BOOST_PP_STRINGIZE(__FILE__) "\n" \
"line: " BOOST_PP_STRINGIZE(__LINE__) "\n" \
"message: " BOOST_PP_STRINGIZE(#__VA_ARGS__) "\n\n" \
)
```

#使い方

```cpp
#include <string>
#include <type_traits>
#include <boost/preprocessor/stringize.hpp>

#define MAKE_COMPILE_ERROR( ... ) \
static_assert([](auto && a) { \
return std::remove_reference<decltype(a)>::type::value; \
} (std::is_void<int>{}), \
"\n\n\nMAKED COMPILE ERROR!\n" \
"file: " BOOST_PP_STRINGIZE(__FILE__) "\n" \
"line: " BOOST_PP_STRINGIZE(__LINE__) "\n" \
"message: " BOOST_PP_STRINGIZE(#__VA_ARGS__) "\n\n" \
)

class s {
    int i;
    std::string str;
public:
    s() : i(10), str("default") {}
    template<typename T>
    T& get() {
        if constexpr (std::is_same_v<int, T>) return i;
        else if constexpr (std::is_same_v<std::string, T>) return str;
        else MAKE_COMPILE_ERROR("テンプレート引数を確認してください");
    }
};

int main() {
    auto&& tmp = s{}.get<double>(); // コンパイルエラー
}
```

wandboxの出力例です。

```
.
.
.
prog.cc: In instantiation of 'T& s::get() [with T = double]':
prog.cc:29:34:   required from here
prog.cc:8:23: error: static assertion failed: 


MAKED COMPILE ERROR!
file: "prog.cc"
line: 24
message: "テンプレート引数を確認してください"


    6 | static_assert([](auto && a) { \
      |               ~~~~~~~~~~~~~~~~~
.
.
.
```
コンパイルのエラーが少し見やすくなって、便利かもしれないです。

#実装
テンプレート引数が与えられるまでstatic_assertの評価を延期させるために、下のコードをあたえました。`std::remove_reference<decltype(a)>::type::value` は`std::remove_reference`のテンプレートのパラメータに依存する名前なので、名前の検索は実際のテンプレート引数がわかるまで延期されます([temp.res]/9)。よって、`if constexpr`でどれにもマッチしなかった時だけ、static_assertが評価されると考えられます。

```cpp
[](auto && a) {
    return std::remove_reference<decltype(a)>::type::value; // false
} (std::is_void<int>{})
```

(私がWandboxで試したときは、単純に`[]{return false;}()`だけでもgccとclang HEADで上と同じにできたので、そちらのほうがいいかもしれません...?)　~~←コンパイラのバグでした！~~バグじゃありませんでした！(2018/12/28　11:42)

表示するための文字列は、Boost.PPで作ってもらいました。

```cpp
"\n\n\nMAKED COMPILE ERROR!\n" \
"file: " BOOST_PP_STRINGIZE(__FILE__) "\n" \
"line: " BOOST_PP_STRINGIZE(__LINE__) "\n" \
"message: " BOOST_PP_STRINGIZE(#__VA_ARGS__) "\n\n"
```

BOOST_PP_STRINGIZEは、文字列を作ってくれます。また、messageは`__VA_ARGS__`で受け取っているので、なんでも文字列として受け取れます。

```cpp
MAKE_COMPILE_ERROR("default", hello! , 123, int);
// -> message: "\"default\", hello! , 123, int"
```

#おわりに
ここまで読んでくれたあなたに感謝を！
#python #初心者 #gc #ガベージコレクション #勉強 したい #rubyist @yumainaura

[Pythonのgcモジュールでガベージコレクションを行う方法 | TechAcademyマガジン](https://techacademy.jp/magazine/19437)

# 疑問、pythonでgcとか必要なの？そんな低レイヤーの処理

>プログラマーはメモリの解放を明示的にコーディングしなければなりません。コーディングを忘れたり間違えたりすると、メモリリーク(漏れ)の原因になります。

# やはり相当低レイヤー向けの処理らしい

>Pythonは必要に応じて自動的にガベージコレクションを行います。
>通常の用途では明示的にガベージコレクションを行う必要はありません。

# gc用のモジュールがあるらしい

>1行目でgcモジュールをインポートしています。

`import gc`

シンプルイズベスト


# コールバック

本体処理ではないが、処理をフックできるらしい。


>3行目で関数を定義し、コールバックに登録しました。
>ガベージコレクション実行のたびに、このコールバック関数が呼び出されます。

```
# コールバック関数を定義する
def callback(phase, info):
    print(phase, info)
gc.callbacks.append(callback)
```

# 無効化、停止処理も書けるらしい


>8行目で自動ガベージコレクションを停止しました。

```
gc.disable()
```

シンプルイズベスト

# どゆこと？

停止した後に collect処理がある？

```
gc.collect()
```

# 勉強ここまで

以上、初心者がつまづきやすそうな1ユーザーの痕跡。








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
最新のデータを反映したグラフを画像として出力する方法 (Google スプレッドシート)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/300876/77ea21e3-3b1e-534d-dda2-250f3ae4350e.png)

[Google スプレッドシート \- オンラインでスプレッドシートを作成、編集できる無料サービス](https://www.google.com/sheets/about/?hl=ja)


# 何かと便利なGoogleの文書作成ツール (ドキュメント エディタ)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/300876/07cd4fd4-2472-ab1d-d1cc-400fb463a44a.png)

[ドキュメント エディタ ヘルプ](https://support.google.com/docs?hl=ja)

Google ドキュメント や スプレッドシート を利用している方も多いと思います。近年は他社の製品も色々出来るようになってきているようですが、私はプライベート用途ではほぼGoogle系に依存しています。これまでもMicrosoft Officeシリーズを長年利用していましたし、とても使いやすいMicrosofot Officeシリーズを決して嫌いなわけではありませんが、個人用途ではどうしても無料で利用可能なGoogle系を利用することが多いです。余談ですが[LibreOffice](https://www.libreoffice.org/)も長年愛用していますよ。



# 静的なコンテンツと動的なコンテンツ

「静的」「動的」について簡単に記しておきます。

一般的に言われる「静的」「動的」とは、そのコンテンツにアクセスする度にシステム側がそのコンテンツをどのように生成し、ユーザーに返すかという観点で語られます。分かりやすい例で言えば、

- 静的コンテンツ(例)
    - 何度アクセスしても同じものである画像、写真など
        - これ自体が更新された場合は更新後のものが返ってきますが一般的には静的コンテンツ扱いで良いと思います。
- 動的コンテンツ(例)
    - 個人用にカスタマイズされたWebページ(なんらかのマイページなど)
    - (最近の)広告など、アクセスする度に表示内容が変わる最適な(?)広告など

上記はあくまで一例であり、厳密に言えば少し違うケースもありますが一般的な表現としてはこんな感じです。



# 表計算ソフトなどで作成されるグラフの画像

発表資料などでグラフを利用することもあると思います。多くの場合画像を貼り付けたりすることが多いのではないでしょうか。特にWebページなどにグラフを掲載する場合は画像をアップロードしたりすることが多いでしょう、きっと。

時間の経過と共にグラフの画像の内容が変化してしまっては困りますよね、いや、変化しないという前提であればこうすべきでしょう。一方で例えばブログなどに含めたグラフが元のデータと連動して変化してくれると良いなぁ、と言う場合もあるかと思います。

特に、グラフの作成に表計算ソフトなどを利用している場合、グラフを生成する為の元ネタというものは手元のパソコンの中にあったりするわけですので、そのデータが自動的にブログの記事などに反映されるというのはちょっとイメージしづらいと思います。出来なくはないでしょうがそこまではやらない方が良いと思います。

しかし、本当便利な時代です。今やGoogle スプレッドシート等を利用すれば元データと連動して画像ファイルを更新させることも可能です。技術的にはそんなに新しいものではないのですが、使い勝手の向上などにより本当に容易に実現出来る時代になっています。



## 表計算ソフトなどで作成されるグラフの画像 (静的)

この画像は単なる画像ファイルです。

画像ファイル自体をQiita(ここ)にアップロードしたものが表示されているので、その画像を更新しない限り同じものしか表示されません。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/300876/69639924-6c57-4acc-0286-df82c3dcf444.png)

[いろいろな折れ線グラフのイラスト \| かわいいフリー素材集 いらすとや](https://www.irasutoya.com/2015/06/blog-post_38.html)



## 表計算ソフトなどで作成されるグラフの画像 (動的)

一方、こちらの画像は単なる画像ファイルなのですが、元データに対応した最新のグラフです。

素晴らしいですね。本当便利です。


![](https://docs.google.com/spreadsheets/d/e/2PACX-1vS7n7--rRLhkhb5YNgpTAVEpGXfw5W6rd7r8DY470VIUXShoRev-4lNnx7NUnXF5Z_gxG200PbDanfD/pubchart?oid=1005663683&format=image)

出典: [Civic Tech アドベントカレンダー まとめ 2018 \- Qiita](https://qiita.com/szf/items/5d62e310220028ac1838)




# Google スプレッドシート でグラフを自動更新される画像として公開する方法

世の中は素晴らしい記事に溢れていますので私はそれを紹介させて頂くに留めます。

- [グラフ、表、スライドを Google ドキュメントや Google スライドにリンクする \- パソコン \- ドキュメント エディタ ヘルプ](https://support.google.com/docs/answer/7009814?hl=ja)
- [Googleスプレッドシートで作成したグラフをブログやSNSで公開する \- タダケンのEnjoy Tech](https://tadaken3.hatenablog.jp/entry/spredsheet-publish-graph)
- [Googleスプレッドシートで作成したグラフをWordPressサイトに埋め込む方法 \| クリエイトエクスプレス](https://create-express.net/spreadsheet_embedding/)


## 使いどころ

とはいえ、もし何らかの理由で元データを含むファイルを消失してしまったりすることも有るでしょう。

そもそも更新されるべきでは無い画像を利用した方が良いケースの方が多いでしょう。

知らない間に誰かが間違えてデータを更新してしまうかもしれませんね :cat2:

<img src="https://media.giphy.com/media/JIX9t2j0ZTN9S/giphy.gif" width=50%>





まぁ色々試してみるのは面白いですし、機会があれば是非挑戦してみて下さい :nerd:
GPSの研究　その50

#概要

gpsを理解したかった。
アグリナビで、遊んでみた。
raspberry pi 1で、gpsシュミレータ作って、動かしてみた。
アグリナビからは、bluetoothなgpsに見える。
ヘッドアップしない。履歴消せない。

#写真

![CIMG2833.JPG](https://qiita-image-store.s3.amazonaws.com/0/18104/df6dfd5c-2ecd-e78f-00d8-133ac91cef5a.jpeg)

#環境

Raspberry pi 1 model b(element14)
sd-card 8GB
raspbian 2016-11-25 jessie with pixel
python 2.7
bluetooth 4.0 dongle
tkinter
 
#実装したnmea

GPGGA GPRMC GPGLL GPVTG


以上。
【Unity】スクリプトからAddListenerで引数を渡す方法

こんにちは、Unityでゲーム作ってる電車君です。
今回は、スクリプトからAddListenerで引数を渡す方法を紹介します。

なお、内容に関してはこちらに書いてあることとほぼ変わりません。
https://blog.narumium.net/2017/04/15/%E3%80%90unity%E3%80%91addlistener%E3%81%A7%E5%BC%95%E6%95%B0%E3%82%92%E6%B8%A1%E3%81%99/

```
using UnityEngine;
using UnityEngine.UI;

public class Test : MonoBehaviour
{

    public GameObject buttonPrefab;

    void Start()
    {
        for (var i = 0; i < Main.onYard.transports.Count; i++)
        {
            GameObject button = Instantiate(buttonPrefab);
            var i1 = i;
            button.GetComponent<Button>().onClick.AddListener(() => TaskOnClick(i1));
        }
    }

    void TaskOnClick(int value)
    {
        print(value);
    }
}
```

ボタンの付け方などは説明していません。
先程のサイトと違うところは、 `ii = i + 0` で変数を作成していますが、
自分の場合は、 `i1 = i` でやっています。

以上です。
webpackでファイルが生成されない、、、

## 環境 :fallen_leaf: 
仮想環境のOS：Ubuntu
webpack 4.19.1

## webpackのメリット :dog: 
a.jsとb.jsがあるとして、a.jsで何かしらの処理をする関数を定義してb.jsでそれを使うとすると当然それらの二つのファイルが必要ですが、webpackを使うと、それらの二つのファイルを一つにまとめて一つのファイルとして生成できます。つまり、リソースを最適な形に出力できます。

## calc.jsにちょっとした関数定義して、main.jsでその関数を利用するようにする。それらの2つのファイルをまとめて一つのファイルとして生成する通常のコマンド打ってもなぜかエラーが、、、 :cry: 
定義した関数を使う側のjsファイルと出力ファイル名を指定したコマンド打ったら、、、

```
 (webpack 別ファイルで定義した関数を利用する側のファイル名 出力ファイル名.js)
$ webpack src/js/main.js out/test.js

Version: webpack 4.19.1
Time: 271ms
Built at: 12/26/2018 6:10:29 AM
 1 asset
Entrypoint main = main.js
[0] multi ./src/js/main.js test.js 40 bytes {0} [built]
[1] ./src/js/main.js + 1 modules 249 bytes {0} [built]
    | ./src/js/main.js 113 bytes [built]
    | ./src/js/calc.js 136 bytes [built]

WARNING in configuration
The 'mode' option has not been set, webpack will fallback to 'production' for this value. Set 'mode' option to 'development' or 'production' to enable defaults for each environment.
You can also set it to 'none' to disable any default behavior. Learn more: https://webpack.js.org/concepts/mode/

ERROR in multi ./src/js/main.js test.js
Module not found: Error: Can't resolve 'test.js' in '/home/vagrant/React_study/React入門/Reactのツールで自動ビルド/hello'
 @ multi ./src/js/main.js test.js main[1]
```


## 解決方法 :smile: :
参考書に書かれていたエラーの出るコマンド

```
$ webpack 別ファイルで定義した関数を利用する側のファイル名.js 出力ファイル名.js
```
上記コマンドだとダメっぽい。
なので、下記のように「--output」を追加すればいい

```
 (webpack 別ファイルで定義した関数を利用する側のファイル名 --output 出力ファイル名.js)
$ webpack src/js/main.js --output out/test.js

Version: webpack 4.19.1
Time: 253ms
Built at: 12/26/2018 6:13:57 AM
  Asset        Size  Chunks             Chunk Names
test.js  1010 bytes       0  [emitted]  main
Entrypoint main = test.js
[0] ./src/js/main.js + 1 modules 249 bytes {0} [built]
    | ./src/js/main.js 113 bytes [built]
    | ./src/js/calc.js 136 bytes [built]

```

## 結果 :smile: :
無事に、一つのファイルとして生成されたファイルが生成された
RailsでBasic認証の導入　〜完全版〜

最近、Railsで作っていたアプリにBasic認証を導入したのでその時のメモです。

# そもそもBasic認証って何？
Basic認証とは、サーバーと通信する時にユーザー名とパスワードを知っている人じゃないと、そのサイトにアクセス出来ないようにするための機能です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/301628/397d6a0d-4840-7925-1a84-d786bdf99721.png)

画像だとこんな感じですね。見たことある方いらっしゃると思います。では、実装していきます。

# 前提
* アプリケーションサーバーはUnicornを使っているとする
* WebサーバーはNginxを使っているとする
* クラウドはAWSを使っているとする
* Capistranoを用いて自動デプロイをしているとする

# application_controllerにメソッドを書く

Basic認証は全てのコントローラで行いたいので、application_controller.rbにコードを書いていきます！
RailsにはBasic認証をするためのメソッドが用意されてるます。
それが<b>authenticate_or_request_with_http_basic</b>
です！

```ruby:app/controllers/application_controller.rb

class ApplicationController < ActionController::Base
  before_action :basic_auth
  protect_from_forgery with: :exception

  private

  def basic_auth
    authenticate_or_request_with_http_basic do |username, password|
      username == ENV["BASIC_AUTH_USER"] && password == ENV["BASIC_AUTH_PASSWORD"]
    end
  end
end

```

authenticate_or_request_with_http_basicはRailsで簡単にBasic認証を実装してくれるメソッドです！

 username == ENV["BASIC_AUTH_USER"]
 && 
password == ENV["BASIC_AUTH_PASSWORD"]

のところは環境変数にしてます。直接、username="kenji"とかコードに書いちゃうとGithubにミスってアップしちゃった時に確実に不正利用されます！気をつけて下さい！

# ターミナルで、.bash_profileに環境変数を書く

今回は本番環境でやると仮定してます！
ssh接続してサーバーにアクセスして下さいね！

```terminal
$ vim ~/.bash_profile

 ###「i」を押してインサートモードにいく

export BASIC_AUTH_USER='kenji'
export BASIC_AUTH_PASSWORD='1234'

 ###書き終えたらescキーを押して、「:wq」を押して保存して終了

$ source ~/.bash_profile
 ###最後に.bash_profileを読み込んで環境変数を反映させる

```

# 本番環境でのみBasic認証をするようにする
config/deployのproduction.rbに追記していきます。

```ruby:config/deploy/production.rb
# server "db.example.com", user: "deploy", roles: %w{db}
server "(御自身のEC2のIPアドレス)", user: "ec2-user", roles: %w{app db web}

set :rails_env, "production"
set :unicorn_rack_env, "production"

# role-based syntax
# ==================

```

これでunicornが現在の環境を本番環境として認識するようになります。

# さらにapplication_controllerの記述を変更する

```ruby:app/controllers/application_controller.rb

class ApplicationController < ActionController::Base
  before_action :basic_auth, if: :production? 
  protect_from_forgery with: :exception

  private

  def production?
    Rails.env.production?
  end

  def basic_auth
    authenticate_or_request_with_http_basic do |username, password|
      username == ENV["BASIC_AUTH_USER"] && password == ENV["BASIC_AUTH_PASSWORD"]
    end
  end
end

```

追加したのは
before_action :basic_auth, if: :production?

  def production?
    Rails.env.production?
  end
の二つだけです。

production?メソッドでRails.env.production?を定義しているので本番環境なのかローカルなのか分かるようになっています。


#最後にデプロイして動作確認

```terminal

$ bundle exec cap production deploy unicorn:stop


$ bundle exec cap production deploy unicorn:start

```

もし「え、うまくいかないんだけど、、、、、、、」ってなった場合は、一度AWSのコンソールからEC2を再起動して下さい！その後、nginx、MySQL、Unicornを手動で順番に再起動してください。それでうまくいくはずです。

# お疲れ様でした！
しっかりBasic認証できてるはずです！
Codeacademyで学んだCSSについて

#CSSのボックスモデルについて
自分のまとめ用
##content-box
CSSのボックスモデルには`padding`プロパティ、`margin`プロパティ, `border`プロパティの影響を受け`height`, `width`プロパティで設定したボックスの大きさが変更するボックスモデルがある。

```css:style.css
h1 {
  border: 1px solid black;
  height: 200px;
  width: 300px;
  padding: 10px;
}
```

`h1`要素に対して上記CSSが指定してある場合、h1要素のボックスの大きさは縦方向が200pxではなく、それに`padding: 10px;`の20px, `border: 1px solid black;`の2pxを足し合わせた200+2 * 10+1*2=222pxである。
同様にh1要素の横方向の大きさは300+2*10+1*2=322pxである。
なぜh1要素のボックスは`padding`などの影響を受けるのか？
それはh1要素のCSSにはデフォルトで`box-sizing: content-box;`がCSSで設定されているからである。（box-sizingプロパティの値がcontent-boxとゆうボックスモデル）

つまり上記のCSSのコードは以下と同じである。




```css:style.css
h1 {
  border: 1px solid black;
  height: 200px;
  width: 300px;
  padding: 10px;
  box-sizing: content-box;
}
```
## border-box
一方で`padding`プロパティ、`margin`プロパティ, `border`プロパティの影響を受けず`height`, `width`プロパティの値が直接ボックスの大きさになるボックスモデルがある。
それが`box-sizing: border-box;`である（box-sizingプロパティの値がborder-boxとゆうボックスモデル）

```css:style.css
h1 {
  border: 1px solid black;
  height: 200px;
  width: 300px;
  padding: 10px;
  box-sizing: border-box;
}
```
h１要素に対して上記CSSが設定されている場合、h1要素のボックスの縦方向の大きさは200px,横方向の大きさは300pxである。