OmniAICreator/Qiita-1.07M huggingface dataset:
aws周りのメモ3


## インスタンスの起動と停止など

【Tips】AWS CLIを使ってAmazon EC2を起動・停止するワンライナーまとめ ｜ Developers.IO
http://dev.classmethod.jp/cloud/aws/awscli-tips-ec2-start-stop/

起動
>
```bash
INSTANCE_ID=<instance_id>
# 起動
aws ec2 start-instances --instance-ids ${INSTANCE_ID}
# 起動確認
aws ec2 describe-instance-status --instance-ids ${INSTANCE_ID} | jq '.InstanceStatuses[] | {InstanceId, InstanceState: .InstanceState.Name, SystemStatus: .SystemStatus.Status, InstanceStatus: .InstanceStatus.Status}'
# 起動と待機
aws ec2 start-instances --instance-ids ${INSTANCE_ID} && aws ec2 wait instance-running --instance-ids ${INSTANCE_ID}
# 全起動
aws ec2 start-instances --instance-ids $(aws ec2 describe-instances | jq -r '[.Reservations[].Instances[] | select(.State.Name == "stopped") | .InstanceId] | join(" ")')
```

停止
>
```bash
# 停止
aws ec2 stop-instances --instance-ids ${INSTANCE_ID}
# 停止確認
aws ec2 describe-instances --instance-ids ${INSTANCE_ID} | jq '.Reservations[].Instances[] | {InstanceId, InstanceState: .State.Name}'
# 停止と待機
aws ec2 stop-instances --instance-ids ${INSTANCE_ID} && aws ec2 wait instance-stopped --instance-ids ${INSTANCE_ID}
# 全停止
aws ec2 stop-instances --instance-ids $(aws ec2 describe-instances | jq -r '[.Reservations[].Instances[] | select(.State.Name == "running") | .InstanceId] | join(" ")')
# 自分以外を全停止
aws ec2 stop-instances --instance-ids $(aws ec2 describe-instances | jq -r --arg myid $(curl http://169.254.169.254/latest/meta-data/instance-id 2> /dev/null) '[.Reservations[].Instances[] | select(.InstanceId != $myid) | select(.State.Name == "running") | .InstanceId] | join(" ")')
```

AWS CLIにalias機能が追加されました ｜ Developers.IO
http://dev.classmethod.jp/cloud/aws/aws-cli-alias/

> ~/.aws/cli/aliasに特定の書式でファイルを作成することで利用できるようです。GitHub上のサンプルファイル内には7つの例が記載されています。

https://github.com/awslabs/awscli-aliases

公式

> brew upgrade aws-cli

## RDSの削除と復帰

AWS CLIを利用したRDSの起動停止スクリプト(検証環境用2017年1月版) ｜ Developers.IO
http://dev.classmethod.jp/cloud/aws/rds-oracle-aurora-start-stop-by-aws-cli/

追記：削除じゃなくて停止ができるようになった（なる？）らしい。

## 請求まわりがまだよくわからない

【AWS超初心者】 AWSの請求をいろいろと調べたメモ。 - /var/www/yatta47.log
http://yatta47.hateblo.jp/entry/2016/09/14/201121
fortune + cowsay で遊ぶ


fortune やら、cowsay やらを教えてもらったのですが、せっかくなので、bash シェルを起動するたびに、ランダムな画像を出すようにしてみました。

## なにもの？
ジョークゲームです。
　fortune は、格言などやちょっとしたセリフをランダムにつぶやくゲームです。シェークスピアとか、ガンジーとか、いろんな人の言葉を教えてくれます。
　cowsay は、ASCII アートがセリフを喋ってくれます。fortune の言葉や、用語集、コマンド集など、ちょっとした言葉を渡すと喋ってくれます。いろんな ASCII アートが用意されていて、指定すると切り替えられます。
　似たゲームでpokemonが喋ってくれる pokemonsay というのもありますが、画像がカラーで目立ってしまったので、モノクロの cowsay にしました。

## 環境
Ubuntu 16.04.2

## 準備
（当然ですが・・）標準ではインストールされていないので、インストールします。

> sudo apt-get fortune
> sudo apt-get cowsay

## ~/.bashrc に追記
bash の起動時に表示されるよう、~/.bashrc に追記します。

```~/.bashrc
# fortune cowsay 
cowsay_img=`ls /usr/share/cowsay/cows | shuf -n 1`
fortune | cowsay -f $cowsay_img
echo $cowsay_img | sed 's/.cow$//'
```

cowsay に fortune の言葉を喋ってもらいます。
インストールされた ASCII アートからランダムに１つ選んで指定します。ASCII アートによってはわかりにくいものもあるので、ファイル名も出しておきます。

## bash を起動してみましょう
急いでログインしている時でも、一瞬和みますね。

![スクリーンショット 2017-06-02 18.51.21.png](https://qiita-image-store.s3.amazonaws.com/0/27486/a5505b0f-6d0e-f04c-94c4-730698c909b0.png "スクリーンショット 2017-06-02 18.51.21.png")
機械学習 理解とイメージを掴むための、まとめと、メモ

#はじめに
この記事は、私個人の、機械学習に対しての理解と、イメージを掴むためのメモ/勉強の記録として、記載します。勉強したこと等を、メモしているだけなので、一度は勉強したけど、つまづいて立ち止まった人向けかつ、シンプルなところから、勉強したい人向けで、何かしら、ご参考、お役に立てればです。

#機械学習に必要な数学
・因数分解
・展開
・微分
・導関数の微分
・偏微分
・逆数の微分法
・指数関数の微分
・商の微分方程式
・内積
・線形代数

よく見かける、機械学習のHello Worldブログは、高校数学の知識で〇〇な、シリーズが多いいですが、この辺りの記事を見ても、イメージが掴みづらかったのは、中学校で学ぶ、数学も、一部忘れたため、中高で学ぶ数学を一旦、復習しました。
内積と、線形代数は、2,3次元ベクトル/行列を仕事でよく扱うため薄く理解していた感じです。
復習方法は、googleで、ひたすら、公式/例題等を探して、ローカルにメモ書き/手書き計算、もしくは、youtube、で上記のキーワードを入力すれば、意外と、動画での説明もあり、すぐ復習できます。

※n'とか、良く見かけますが、この「'」の部分は、微分しろという意味です。


#順伝播計算が、わかりやすかった資料
<b>・深層学習の非常に簡単な説明</b>
https://www.slideshare.net/SeiichiUchida/ss-71479583
このスライドが、今のところ、内積を理解していれば、誰でも理解できてしまいそうな、内容です。
ものすごくわかりやすかったです。
内積は、3Dだと、ライトベクトルから、光の当たり具合を算出(面の色味を調整)する際に、良く使われたりしますよね。3Dプログラム得意な人は、これ見たら、すぐ、理解してしまうのではないでしょうか？

このスライドでは、ニューロンは、内積とあります、以下のように、

入力(ベクトル)
x1 
xi
xd

重み(ベクトル)
w1
w2
wk

この２つのベクトルの内積が、類似度を表現し、

x1*w1+xi*w2+xd*wk = 類似度
1に近いほど、類似度が高い。

というのは、非常に、わかりやすかったです。
この後の、類似度の精度を出すための、線形変換のところの説明は、わかりずらかったので、一旦、ここまで、理解しました。

<b>・高校数学で理解・実装するニューラルネットワーク</b>
http://qiita.com/perrying/items/6b782a21e0b105ea875c#重みとバイアスの更新
非線形関数をかます、やり方が非常にわかりやすい、記事です。
例は、シグモイド関数を使った説明ですが、上記の、内積で、類似度を表すところを当てはめると、

```math
\frac{1}{1+exp(-内積)} = \frac{1}{1+exp(-(x1*w1+xi*w2+xd*wk))}
```

というやり方で、非線形関数をかますことができます。


#シグモイド関数の微分
誤差逆伝播を理解するにあたって、この、シグモイド関数の微分の理解が必要そうだったので、メモです。

・指数関数の微分

```math
(e^-x)'\\
= e^-x(-x)'\\
= e^-x*-1\\
= -e^-x
```

・商の微分方程式

```math
(\frac{f(x)}{g(x)})' = \frac{f'(x)g(x)-f(x)g(x)'}{g(x)^2}
```

・実際のシグモイド関数の微分

```math
f(x)' = \frac{1}{1+e^-x}\\
「1」の分子が、商の微分方程式によると、f(x)\\
「1+e^-x」の分母が、g(x)\\
商の微分方程式に当てはめると\\
= \frac{1'*(1+e^-x)-1*(1+e^-x)'}{(1+e^-x)^2} \\
= \frac{0*(1+e^-x)-1*-e^-x}{(1+e^-x)^2}\\
= \frac{e^-x}{(1+e^-x)^2}\\
= \frac{1}{1+e^-x}\frac{e^-x}{1+e^-x}\\
\frac{1}{1+e^-x}このパートは、f(x)に置き換えられるので、以下のようになる\\
= f(x)*\frac{e^-x}{1+e^-x}\\
さらに、\frac{e^-x}{1+e^-x}について、式を展開し、\\
\frac{e^-x}{1+e^-x} = \frac{1+e^-x}{1+e^-x}-\frac{1}{1+e^-x}\\
= 1 - \frac{1}{1+e^-x}\\
= 1 - f(x)\\
となり、\\
f(x)' = f(x)*(1 - f(x))\\
が、シグモイド関数の微分になる。
```


#誤差逆伝播
・ニューラルネットワークの順伝播，逆伝播，確率的勾配降下法を手計算する
http://qiita.com/sz_dr/items/800d043f8ff92f49c18c#comment-0ee03e7d6ad7fb178328
この記事の参考にしたところは、手計算で、重みの更新の計算をしているところです、実際に、この記事見ながら、ノートに、同じく、手計算して、やってみることで、重みの更新方法を理解しました。

二乗和誤差の微分は、

```math
E'=\frac{1}{2}(y-t)^2\\
=\frac{1}{2}(y-t)(y-t)\\
=\frac{1}{2}(y^2-2yt-t^2)\\
=\frac{1}{2}(2y-2t)\\
= y - t
```

#その他メモ

<b>・Nature of code:Neural Networks</b>
http://natureofcode.com/book/chapter-10-neural-networks/
https://www.youtube.com/user/shiffman
これは、Processingもしくは、p5jsを使って、モデル、学習過程を、ヴィジュアライズし、教師あり学習の基本的なところをわかりやすく説明してくれている、チュートリアルです。
さらに、基本を深く学べたのでオススメです。

#TODO
ここまでは、理解できたので、これらを、tensorflow使わず、pythonで、実際にやってみて、理解してみる。
良い、リソース見つけたら、時間ができたら、更新。
オフラインリアルタイムどう書くE14 の問題の実装例

オフラインリアルタイムどう書くE14 の問題の実装例です。

問題 : http://mtsmfm.github.io/2017/06/03/doukaku-e14.html
解答リンク集 : http://qiita.com/mtsmfm/items/89b6634f363bbf5b47f5
イベント : https://yhpg.doorkeeper.jp/events/59397

```ruby
def rot( f )
  f.transpose.reverse
end

# 横に4マス続くパターンを含む展開図
def solve1(m)
  (1..m.size-2).each do |y|
    (0..m[0].size-4).each do |x|
      a=m[y][x]
      b=m[y][x+1]
      next if a==b
      next unless 7-a==m[y][x+2]
      next unless 7-b==m[y][x+3]
      rest = [*1..6] - [a, 7-a, b, 7-b]
      return true if [0,1].any?{ |ix| m[y-1][x,4].include?(rest[ix] ) && m[y+1][x,4].include?(rest[1-ix] ) }
    end
  end
  false
end

# 3×1 が2つという形の展開図
def solve2(m)
  (0..m.size-2).each do |y|
    (0..m[0].size-5).each do |x|
      a,b,c =[0,1,2].map{ |ix| m[y][x+ix] }
      d,e,f =[0,1,2].map{ |ix| m[y+1][x+ix+2] }
      return true if a+c==7 && d+f==7 && b+e==7 && [a,b,c,d,e,f].uniq.size==6
    end
  end
  false
end

# 階段状の展開図
def solve3(m)
  (0..m.size-3).each do |y|
    (0..m[0].size-4).each do |x|
      a,b =[0,1].map{ |ix| m[y][x+ix] }
      c,d =[0,1].map{ |ix| m[y+1][x+ix+1] }
      e,f =[0,1].map{ |ix| m[y+2][x+ix+2] }
      return true if a+d==7 && b+e==7 && c+f==7 && [a,b,c,d,e,f].uniq.size==6
    end
  end
  false
end

# それ以外の展開図
def solve4(m)
  (0..m.size-3).each do |y|
    (0..m[0].size-4).each do |x|
      b,c,d =[0,1,2].map{ |ix| m[y+1][x+ix+1] }
      e,f =[0,1].map{ |ix| m[y+2][x+ix] }
      a, = [*1..6] - [ b, c, d, e, f ]
      next unless m[y][x+1,3].include?(a)
      return true if a+f==7 && b+d==7 && c+e==7 && [a,b,c,d,e,f].uniq.size==6
    end
  end
  false
end

def solve_impl( src )
  field = src.split(",").map{ |x| x.chars.map(&:to_i) }
  2.times do
    4.times do |r|
      return "1" if solve1(field)
      return "2" if solve2(field)
      return "3" if solve3(field)
      return "4" if solve4(field)
      field = rot( field )
    end
    field = field.reverse
  end
  false
end

def solve( src )
  (!!solve_impl(src)).to_s
end

if $0==__FILE__
  okays = DATA.map do |line|
    num, src, expected = line.split(/\s+/)
    actual = solve( src )
    ok = actual==expected
    p [ ok ? "ok" : "**NG**", num, src, actual, expected ]
    ok
  end
  p [ okays.count{ |x| x }, okays.size ]
end

__END__
0 44165,44516 false 状況
1 26265,31436 true  状況
2 46345,54215 true  状況
3 62143,11152 false 状況
4 4242,4314,1562  false 状況
5 5612,3656,4523  false 状況
136 5545354,6566343,3525411,5356165,4625265,1535435,5522665 false 状況
```

いつもどおり、テストケースの大半は省略。

45分ぐらいで解けた気がするけど、苦しい感じだった。
解けてほっとした。

展開図を4種類に分けて、それぞれベタに書くという戦略
手数が多いので書ききれるかどうか心配だったけどなんとかなった。

想定解がどうなっているのかはまだわからないんだけど、どうなんだろ。
我が家で利用している周波数

|周波数|機器|波長|種別|台数|
|:--|:--|:--|:--|:--|
|40KHz,(60KHz)|[JJY](http://qiita.com/yamori813/items/d9b0a451f1e115de893f#jjy)|7.49km|受信|時計 4台、タイムサーバ 2台|
|500KHz-1500Khz|AMラジオ|600m|受信|4台|
|3MHz-30MHz|短波ラジオ|90m|受信|1台|
|70MHz-105MHz|FMラジオ|4.28m|受信|6台|
|900MHz|[Wi-SUN](http://qiita.com/yamori813/items/f0dfedf31b2b51e658f9)|333mm|送受信|1台|
|900MHz|LTE携帯|333mm|送受信|1台|
|1090MHz|[ADS-B](http://qiita.com/yamori813/items/87ec7cc7f2de5c421c3c)|275mm|受信|1台|
|1575.42MHz|[GPS](http://qiita.com/yamori813/items/d9b0a451f1e115de893f#pps%E3%81%AE%E8%A9%B1)|190mm|受信|Android 1台、モジュール2台|
|1.9GHz|デジタルコードレス電話(自営PHS)|158mm|送受信|1台|
|2.4GHz|WIFI|124mm|送受信|Mac 3台、Android 1台|
|2.4GHz|Bluetooth|124mm|送受信|2台|

1970年台後半の自分が小さかった頃、電子工作系の王道はアマチュア無線だったんですが田舎すぎて資格を取れなかったので、ラジオが好きで良く聞いていました。BCLとかいっていて受信報告書を送ってベリカードをもらったものも残っています。当時AMラジオはトランジスタを組み合わせて簡単に作れましたが、FMは高度な回路が必要で、簡単には作れませんでした。今はワンチップで作れるのでAMもFMも変わりないですが。

この中で一番古くからあるのがAMラジオで、一番新しいのはWi-SUNだと思います。

AMラジオはパソコンなどに近づけるとノイズが出ていることが確認出来る。たまたま気がついたが、コンセントはつないであるが使ってない状態でも炊飯器が結構なノイズを出していた。

# アンテナの引き回し

GPS/JJYタイムサーバとADB-S受信は以下のような構成になっている。

![アンテナ.png](https://qiita-image-store.s3.amazonaws.com/0/104066/50418d71-2087-50f0-22b6-9aff1f0642e2.png)

この構成で、アンテナは出来るだけ高いところだったり、開けたところに置くのがよいのだが、引き回す場合どこを伸ばすかも悩みどころだったりする

アンテナと受信機間を伸ばすのが良くあるパターンだが減衰が気になる。

受信機とFreeBSDはシリアルやUSBで接続されているが、これらの延長には限界がある。しかしFreeBSDなモジュールと受信機をはなすとノイズの影響を軽減できる。

JJYは受信機が信号受信とデコーダーの二つに分かれているのだが、これらもある程度離した方が良かった。

壁掛けの針の電波時計があるのだが、パソコンから1.5mくらいのところに設置していたところ、パソコンが発するノイズのためか壊れてしまった。電波時計はノイズ源に近いところには置かないほうがいい。AMラジオを使いノイズが入らないか確認するのがいい。

アンテナと受信機とFreeBSDをほぼ同じところに置き、LANで引き回す方法もある。ただし高いところだったりすると電源の問題もある。

高いところは、日があたり高温になる場合もあるので、FreeBSDなモジュールは置きたくない。コンデンサーは10度高くなると寿命が半分になります。

u-bloxなGPSモジュールはコネクタが付いてアンテナが取り替えられたので、室外に置けて5mのケーブルが付いた小型のアンテナを安価に手に入れて、アンテナは室外に設置している。

![IMGP0036.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/d1c532e8-e5c6-fa0b-d3b5-46346f58ab1c.jpeg)

ADS-Bの受信のために作ったコリニアアンテナは塩ビパイプに入れて屋外の手すりにくくりつけて、3C2Vのケーブルで屋内に引き込んでいます。
Vue.js で v-html を使ったのに script 要素を実行してくれないときの対処法

節操なく jQuery の html() メソッドを使います。
次のように変数に変更があったら別の所にこっそり埋め込んじゃいます。
jQuery は埋め込んだタイミングで script の中を実行してくれます。

```html
<html>
  <body>
    <script src="https://unpkg.com/vue"></script>
    <script src="https://unpkg.com/jquery"></script>
    <div id="app">
      <input v-model="x" />
      <div v-html="x" ></div>
      <div id="kossori_run" v-show="false"></div>
    </div>
    <script>
      new Vue({
        el: "#app",
        data: {x: ""},
        watch: {
          x(v) {
            $("#kossori_run").html(v)
          }
        },
      })
    </script>
  </body>
</html>
```
<img width="669" alt="スクリーンショット 2017-06-02 20.56.10.png" src="https://qiita-image-store.s3.amazonaws.com/0/2369/4315abcb-50d5-5195-017c-73bd89eb89d9.png">

# 参照
Executing \<script\> elements inserted with .innerHTML
https://stackoverflow.com/questions/2592092/executing-script-elements-inserted-with-innerhtml

# 追記 2019/01/23

https://www.npmjs.com/package/vue-script2 を使った方がいいかもしれません
AWS VPCの料金

AWSのVPCおよびデータ連携に関する基本的な内容をまとめてみたものです。AWSのVPCやデータ連携に関する、Web上にすでにある解説コンテンツをまとめたサイトの抜粋です。
[AWS VPCの料金] (https://www.techcrowd.jp/datalink/fee-2/)

# [AWS VPCの料金体系] (https://www.techcrowd.jp/datalink/fee-2/)

AWS VPCでは、
・VPNへの接続
・NATゲートウェイの利用
について料金が発生します。

VPNへの接続料金
・VPNに接続した時間について料金が発生します
・接続していた時間が1時間に満たない場合でも、1時間分の料金が課金されます
・VPNに接続して転送されるデータに対して、AWSのデータ転送料が発生します

NATゲートウェイの利用料金
・VPC内にNAT ゲートウェイを作成した場合、NATゲートウェイがプロビジョンされて利用可能であった時間分の料金が請求されます
・NATゲートウェイの利用時間が1時間未満でも、1時間分の料金となります
・NATゲートウェイで処理されたデータ量に対しても、ギガバイト単位で料金の計算が行われます

ただし、Amazon S3、Amazon RDS、Amazon Redshiftなどを利用する場合は、別途料金が請求されます。


# [料金が発生する接続と料金が発生しない接続] (https://www.techcrowd.jp/datalink/fee-2/)

VPCインターネットゲートウェイを経由してAmazon S3などのAWSにアクセスする時はデータ転送料が請求される事はありませんが、VPN接続を経由してAWSのリソースにアクセスするとインターネットデータ転送料金が支払う必要が出て来ます。

Amazon VPCを利用する時は料金の発生する接続の仕方と、無料で使える接続の仕方を意識する事が大切です。


# [VPCの利用で注意する点] (https://www.techcrowd.jp/datalink/fee-2/)

VPN接続に関する料金は利用可能な状態であった時に発生しますので、VPN接続を終了しないと料金が請求されてしまいます。
AWSマネジメントコンソールやCLIなどによって、VPN 接続の状態を確認する事が出来ます。

Amazon EC2などのAWSを利用した時はリソースの発行料金が必要となりますが、VPCのインターネットゲートウェイからAmazon S3などのAWSへアクセスする場合については、データの転送料は発生しません。
pythonで改行しないで文字列の表示(自分用メモ)

pythonで改行しないで文字列を表示したかったので自分用メモ



進捗管理のために１処理ごとにメッセージを表示していたが、一回一回改行されるのがうっとおしく感じた。

```python:test.py  
for i in xrange(10):
    print "i = %d"%i
```


>i=1
>i=2
>i=3
>i=4


こんな感じ。
ここで目をつけたのが¥rというエスケープシーケンス。　　
昔のタイプライターのなごりで復帰を表す。これが使えるのではないかと思い使ってみる

改行は使わないので文末に，（カンマ）をつけ、確認できるようにスリープもつける。

```python:test2.py  
import time
for i in xrange(10):
    print "¥r i = %d"%i,
    time.sleep(0.3);
```


>i=9

何も表示されずにi=9のみが表示される。
javaなどはこの方法でもうまくいったがpythonはできなかった。
そこで、強制フラッシュするsys.stdout.flush()をいれる。

```python:test3.py  
import time
import sys
for i in xrange(10):
    print "¥r i = %d"%i,
    sys.stdout.flush()
    time.sleep(0.3)
```
これでうまく動くようになった。


他にもpython3の標準出力関数を使う方法もあるらしい。
また、調べてみるとやはりたくさんこの問題についての記事があった。
Amazon VPCのピアリング接続

AWSのVPCおよびデータ連携に関する基本的な内容をまとめてみたものです。AWSのVPCやデータ連携に関する、Web上にすでにある解説コンテンツをまとめたサイトの抜粋です。
[Amazon VPCのピアリング接続] (https://www.techcrowd.jp/datalink/peering/)

# [ピアリング接続とは] (https://www.techcrowd.jp/datalink/peering/)

VPC間を接続させて、相互通信を行うのが、ピアリング接続です。
ピアリング接続を使うと同じネットワーク内に存在するかのように、通信する事が出来ます。

ピアリング接続を利用するには、
・接続するVPCが同一リージョンである
・接続先のVPCのオーナーが、接続要求を受け入れる
・IPアドレス範囲が重複しない
などの条件を満たす必要があります。


# [VPCのピアリング接続の用途] (https://www.techcrowd.jp/datalink/peering/)

VPCのピアリング接続は、

・複数のAWSを利用している時に、コンテンツを1か所にまとめたい
・複数のAWSアカウント間で、通信を行う
・ 同じIPでは複数のVPNを利用出来ませんが、ピアリング接続を使う事でVPNの使用が可能になります

などの用途で、使う事が出来ます。


# [ピアリング接続の設定方法] (https://www.techcrowd.jp/datalink/peering/)

ピアリング接続の設定方法は、以下のようになります。

・AWSコンソールのVPCダッシュボードから、ピアリング接続を選択します
・VPCピア接続の作成で、ネームタグやピア接続するローカルVPCなどを設定します
・VPCピア接続の作成が完了すると、相手に接続に行きます
・接続先でも設定を終わらせると、リクエストが来ているのが確認出来ます
・接続元を確認して、リクエストの承諾を行います
・お互いのルーティングテーブルにルートを追加します

このような作業を行う事で、ピアリング接続が利用出来ます。
AWSのための専用回線DirectConnect 

AWSのVPCおよびデータ連携に関する基本的な内容をまとめてみたものです。AWSのVPCやデータ連携に関する、Web上にすでにある解説コンテンツをまとめたサイトの抜粋です。
[AWSのための専用回線DirectConnect] (https://www.techcrowd.jp/datalink/directconnect/)

# [既存システムとAWSを接続する方法] (https://www.techcrowd.jp/datalink/directconnect/)

AWSと接続する方法として、

・一般的なインターネット回線
・専用の暗号化機器を使用してインターネット回線を、仮想のプライベートネットワークとして利用するIPsec VPN
・アマゾンが用意する専用の回線を使って直接接続するAWS DirectConnect

の3種類の選択肢があります。

どの接続方法を使ってもAWSの豊富なサービスが利用出来ますが、DirectConnect はAWSのサービスを快適に利用するための環境を提供してくれます。


# [AWS DirectConnectの特徴] (https://www.techcrowd.jp/datalink/directconnect/)

AWS DirectConnectには、次のような特徴があります。

一貫性のあるネットワークパフォーマンス
・データのルーティングの設定が出来るので、計画的にAWSを利用する事が可能となります

全てのAWSにアクセス可能
・Amazon S3、Amazon EC2、Amazon VPCなどの全てのAWSに、AWS DirectConnectを使ってアクセスする事が出来ます

Amazon VPCへのプライベート接続
・AWS DirectConnectによって オンプレミスネットワークとAmazon VPCを直接接続するプライベート仮想インターフェースが確立出来ます
・複数のVPCによる複数の仮想インターフェイスも使用可能

通信速度が選択出来る
・1Gbpsと10Gbpsのどちらかを選べる

コストの削減が可能
・直接AWSと通信する事で、インターネットサービスプロバイダの使用を減らしてコストを削減する
・AWS Direct Connectのデータ転送料金が適用される事で、AWS の利用料金を減らす事が出来ます


# [DirectConnectの接続方法] (https://www.techcrowd.jp/datalink/directconnect/)

AWS DirectConnectの接続方法には、占有プランと共有プランの2種類があります。

占有プラン
・AWSまでの物理接続を占有する
・自由に論理接続を作成出来る
・高コストになるが、論理接続数が多くても料金は変わらない

共有プラン
・AWSまでの物理接続は、キャリアが所有して管理する
・論理接続の数に応じて課金される
・低コストであるが、論理接続数分のコストが必要となる
AWS VPCの概要

AWSのVPCおよびデータ連携に関する基本的な内容をまとめてみたものです。AWSのVPCやデータ連携に関する、Web上にすでにある解説コンテンツをまとめたサイトの抜粋です。
[AWS VPCの概要] (https://www.techcrowd.jp/datalink/aws-vpc/)

#[AWS VPCとは] (https://www.techcrowd.jp/datalink/aws-vpc/)
WS VPC (Amazon Virtual Private Cloud)は、仮想ネットワーク内にAWSのリソースを起動して使用することのできるネットワークサービスです。

AWS アカウント専用の仮想ネットワークであるVPCは、

・IP アドレス範囲
・サブネット
・ルートテーブル
・ネットワークゲートウェイ
・セキュリティ

のなどの設定が可能となっています。


#[インターネットに接続する方法] (https://www.techcrowd.jp/datalink/aws-vpc/)

起動したVPCのインスタンスが、VPC以外のリソースへのアクセスもコントロールします。

・デフォルトのVPCはインターネットgatewayを含んでおり、デフォルトのサブネットはパブリックサブネットとなる
・デフォルトのサブネット内で起動するインスタンスは、プライベート IP アドレスとパブリック IP アドレスを持つ

したがって、これらのインスタンスはインターネットgatewayを介してインターネットに接続する事が可能です。

しかし、デフォルト以外のサブネットで起動したインスタンスは、プライベートIPアドレスだけしか割り当てられませんので、そのままではインターネットに接続する事は出来ません。
デフォルト以外のサブネットで起動したインスタンスがインターネットに接続するには、インターネットgatewayをVPCにアタッチして、インスタンスにElastic IPアドレスを関連付けるなどの操作が必要となります。


# [オンプレのシステムにも容易に接続出来る] (https://www.techcrowd.jp/datalink/aws-vpc/)

Amazon VPCとオンプレのシステム間でVPN 接続を確立すると、既存のリソースと同じようにVPC内にあるAmazon EC2インスタンスが使えます。

さらに、DirectConnectを使ってオンプレのシステムとAWS間を専用線で接続すると、より効率的なシステム運用が可能となります。


# [Default VPCと独自に作成したVPCの違い] (https://www.techcrowd.jp/datalink/aws-vpc/)

Default VPC以外にもVPCを作成する事が出来ますが、Default VPCと独自に作成したVPCにはいくつかの点で違いがあります。

Default VPC
・各種の設定が行われている
・インターネットゲートウェイが含まれる
・デフォルトのサブネットがパブリックサブネット
・デフォルトのサブネット内のインスタンスは、プライベートIPアドレスとパブリックIP アドレスを持つ
・直ぐにインターネットに接続出来る

独自に作成したVPC
・ユーザーが設定を行う
・インターネットに接続するにはインターネットゲートウェイにアタッチして、インスタンスにElastic IPアドレスを関連付けるなどの操作が必要


# [Default VPCの作成時期によるサポートの違い] (https://www.techcrowd.jp/datalink/default-vpc/)

Default VPCは、作成した時期によって、サポート内容に違いがあります。

2013年12月5日以降にAWSアカウントを作成した場合
・EC2-VPCのみサポート
・AWSのリージョンごとに、Default VPCが作成される

2013年3月18日～12月4日までにAWSアカウントを作成した場合
・基本的には、EC2-Classicのみサポート
・使った事のあるAWSのリージョンについては、EC2-ClassicとEC2-VPCがサポートされる事もある

2013年3月17日以前にAWSアカウントを作成した場合
・使った事のあるAWSのリージョンでは、EC2-VPC とEC2-Classicをサポート
・使った事がないAWSのリージョンは、EC2-VPCだけをサポート
初めてHerokuを使ってlaravelアプリをデプロイした

初めてHerokuを利用したのでメモ。
[公式サイトのマニュアル](https://devcenter.heroku.com/articles/getting-started-with-laravel#changing-the-log-destination-for-production)をぼんやり読み進めながらやりました。

laravelのバージョンは5.1.46
Herokuは無料プランを利用しました。

# 無料プランの制限
- 月の稼働時間が550時間に制限される（ アカウントにクレジットカード情報を登録すると1000時間になる）
- 30分間アクセスがないとスリープモードに入って、次にアクセスがあったとき起動に時間がかかる

# アカウントを登録しよう
[Heroku](https://www.heroku.com/)にアカウントを登録します。

# Herokuにログインしよう
登録したメールアドレスとパスワードを入力します。

```
$ heroku login
Enter your Heroku credentials:
Email: hogehoge@hoge.com
Password: ********
Logged in as hogehoge@hoge.com
```

# Herokuアプリをつくろう

```
$ heroku create 任意のアプリ名
```

アプリ名は他のユーザーと重複不可。
アプリ名を指定せずに `$ heroku create` すると`sleepy-plateau-1982`みたいな感じのランダムな単語の組み合わせがアプリ名になります。

# Procfile ファイルを作成しよう
プロジェクトフォルダ直下にProcfile という名前でファイルを新規作成します。
ファイルの中身は下記で保存。

```
web: vendor/bin/heroku-php-apache2 public/
```

Procfileを作成したら一度コミットしときましょう。

```
$ git add .
$ git commit -m "Procfile for Heroku"
```

# 環境変数を設定しよう
まず

```
$ php artisan key:generate --show
```

を実行して実行結果を↓の…のところに貼り付けます。

```
$ heroku config:set APP_KEY=…
```

`$ heroku config` で設定した環境変数を確認できます。

# デプロイしよう

`$ git push heroku master`でいよいよデプロイ！ちょいと時間がかかります。

https://`設定したHerokuアプリ名`.herokuapp.com/
にアクセスしてデプロイしたアプリを見てみましょう！

ファイルに更新があった時もコミットしてHerokuにプッシュすればおけです。

以上になります。
eclipse タブ幅変更が効きません。

お世話になっております。浦本＠エクスファです。

ある着想があったので、久しぶりにJavaに戻り、eclipse を立ち上げました。
気分を変えようとタブ幅を半角4スペースから2へ。
applayして、少しわくわく感でタブしてみたら、あきまへん！
変わりません。

いつもの慌てぐせかと、ここは慎重に再確認。ググった指南書とも照らし合わせたのですが、結果は同じ。

Eclipse Java EE IDE for Web Developers.
Version: Mars.2 Release (4.5.2)
Build id: 20160218-0600

を使ってるのですが。

致命的な話ではないので、急ぎませんが、スッキリしません。
どなたか対処法をご伝授ください。
宜しくお願いします。
![なぜ６.jpg](https://qiita-image-store.s3.amazonaws.com/0/5135/d8db6d9d-615b-9271-ed44-9d2e57d2e127.jpeg)

##いくらかのご指摘をいただくことがありますが、お願いしている立場で言えたものではありませんが、ご指摘いただく以上、ご自分でお確かめの上、お願いします。##

ググってサンプルなど、参考にさせていただくことが結構多いのですが、だいたい、1,2箇所、回答間違いがあり、これに、結構踊らされたりするわけです。

ご指摘される方は慣れていらっしゃるはずなので、間違いなどない、との確信で、無検証でご意見いただくのでしょうが、一応、検証してみるというスタンスは、皆が幸せになれるキーポイントかもしれません。
【CMSで作るホームページ1】さくらのレンタルサーバにConcrete5 Ver8をインストールする

#はじめに
とあることから、親戚のホームページを作ることになってしまった私。
フロントエンジニアでも何でも無いため、concrete5でやってみることにします。


##動作環境
- さくらのレンタルサーバ スタンダード
- MySQL5.5
- PHP5.6
- concrete5 Ver8.0.2

##参考情報
- [さくら公式　独自ドメインでconcrete5を表示させる手順について](https://help.sakura.ad.jp/hc/ja/articles/206057462)
- [concrete5公式　さくらインターネット インストールガイド](https://concrete5-japan.org/help/5-6/install/hosting/sakura/)


##事前準備
###さくらのレンタルサーバのアカウントを開設
ついでに独自ドメインも取得しておく。

###新規にデータベースを作成する
さくらのサーバコントロールパネルにログインして、データベースの設定を選択。

![image](https://qiita-image-store.s3.amazonaws.com/0/98130/450828b3-30ac-edca-a075-b908baed2cc9.png)

データベースの新規作成にて、データベースのバージョンと文字コードを選択。
- MySQL5.5
- 文字コード：utf8


以下の画像はconcrete5公式サイトより。
現時点も変わっていませんでした。

![image](https://qiita-image-store.s3.amazonaws.com/0/98130/51b55f9f-4af2-5ede-aa74-632abb343b97.png)


###MySQLの接続照合順序の確認
管理ツールログインをクリック。

![image](https://qiita-image-store.s3.amazonaws.com/0/98130/17982a1c-c52b-9d8d-4eb2-edabd56a5b21.png)

phpMyAdminにログインする。

![image](https://qiita-image-store.s3.amazonaws.com/0/98130/44e52854-7757-8401-cd91-ce1919b2b9ba.png)

照合順序が、*utf8mb4_general_ci*になっているか確認。
デフォルトでは、utf8_general_ciになっている。

![image](https://qiita-image-store.s3.amazonaws.com/0/98130/ca13da85-f106-8c52-b95c-166a2fcd7683.png)

*utf8mb4_general_ci*を選択して、「実行する」をクリックする。

![image](https://qiita-image-store.s3.amazonaws.com/0/98130/b72d8b8f-0fce-69a5-b6f2-aa2f5f211a01.png)

###PHPバージョンとPHPの設定
PHPのバージョン選択をクリックする。
![image](https://qiita-image-store.s3.amazonaws.com/0/98130/8a6a109d-58bb-d607-6947-8cdc02467a63.png)

デフォルトのPHP5.6のままとする。
![image](https://qiita-image-store.s3.amazonaws.com/0/98130/0c8958cb-ed40-c6aa-12ce-711b1f81d8ea.png)

PHP設定の編集をクリックする。
![image](https://qiita-image-store.s3.amazonaws.com/0/98130/1d889a42-5ded-2a48-4392-d1320058350b.png)

php.iniに以下の設定を貼り付けて保存する。

```php
cgi.fix_pathinfo=1
default_charset = UTF-8
mbstring.language = neutral
mbstring.internal_encoding = UTF-8
mbstring.http_input = auto
mbstring.http_output = UTF-8
iconv.input_encoding = UTF-8
iconv.internal_encoding = UTF-8
iconv.output_encoding = UTF-8
date.timezone = "Asia/Tokyo"
```

##concrete5のインストール
クイックインストールをクリックする。
![image](https://qiita-image-store.s3.amazonaws.com/0/98130/115b7fcd-5e85-63d8-9fa5-7b7a373b12b3.png)

CMSから、concrete5を選択する。
![image](https://qiita-image-store.s3.amazonaws.com/0/98130/83247c4f-c9ec-c8e1-6787-cefcd727928b.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/98130/7a386a42-f934-d9bc-a542-2ed2a172c163.png)

現時点でクイックインストールされるconcrete5は、8.0.2。
![image](https://qiita-image-store.s3.amazonaws.com/0/98130/b688ede0-5d36-428e-2a6f-1cfcf7feda27.png)

以下を入力して、「インストール」をクリックする。

- インストール先
    - 初期ドメイン/concrete5
- データベース
    - concrete5用に新規作成したデータベース
- データベースパスワード
    - 新規作成時に設定したパスワード 

成功すると、以下のメッセージが表示される。
![image](https://qiita-image-store.s3.amazonaws.com/0/98130/c7cd6370-c279-46e3-1c1c-0702d909431c.png)


#おわりに
concrete5はVer8から、バージョンがわかりやすくなりましたね。
独自ドメインは取得したばかりでまだ使えないため、
後日設定することにします。
[Mac][Unity]Visual Studio Codeで保存する時にフォーマットする

# command+sでフォーマットして保存できるようにする

## 1.visual studio codeにマクロの拡張機能を追加する
左メニュ→一番下アイコン→拡張機能検索→macrosをインストールする
<img width="171" alt="スクリーンショット 0029-06-03 16.21.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/50917/a518f398-1a35-a15e-2843-916e99db47d9.png">

## 2.マクロ定義する
Codeメニュー→基本設定→設定
<img width="620" alt="スクリーンショット 0029-06-03 16.24.53.png" src="https://qiita-image-store.s3.amazonaws.com/0/50917/f99ac50c-1171-6a90-ed96-096cdc5e38ab.png">

```setting.json
{
    "macros": {
    "saveWithReformat": [
        "editor.action.format",//フォーマットキーマップ
        "workbench.action.files.saveAll"//保存キーマップ
    ]
    },
}
```
キーマップの参考:http://webdesign.vdlz.xyz/Editor/VSCode/Doc/Customization/Doc010_KeyBindingsForVisualStudioCode.html

## 3.ショートカット割り当て
Codeメニュー→基本設定→キーボードショートカット→高度なカスタマイズを行うkeybinding.json選択
<img width="705" alt="スクリーンショット 0029-06-03 16.29.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/50917/8f22cf45-1276-6d89-38cb-beb74cfc8025.png">

```keybindings.json
[
  {
    "key": "cmd+s",
    "command": "macros.saveWithReformat"
  }
]
```



-----------------------------------------
以下は、ゲームの宣伝です（すいません）

○落ちてくる物すべてタップ
<img src=https://qiita-image-store.s3.amazonaws.com/0/50917/7e445cb0-29fe-eb7d-f35c-c48ffd0bc504.jpeg width=150px align="left">
<a href= https://play.google.com/store/apps/details?id=com.secretcommandlab.taptapdrop><img src=https://qiita-image-store.s3.amazonaws.com/0/50917/e5ad66a0-6cce-c312-9ae5-3f6473de9783.png width=150px align="left">
</a>
<a href="https://itunes.apple.com/us/app/%E8%90%BD%E3%81%A1%E3%81%A6%E3%81%8F%E3%82%8B%E7%89%A9%E3%81%99%E3%81%B9%E3%81%A6%E3%82%BF%E3%83%83%E3%83%97/id1228691845?mt=8"><img src=https://qiita-image-store.s3.amazonaws.com/0/50917/37d2e0ca-bf3d-86f3-6d5b-173029f5ad20.png align="left" width=150px>
</a>
CSSのflexを使ったリストのスクロール方法

CSSのflexという機能を知ってその使い方をメモ的に残しておきます。

flex はタグのスタイルに`display: flex`を指定することでその子要素の配置を簡単に行う機能です。

詳細な説明は以下のページが図解付きでとてもわかりやすく説明してくださっています。

* CSS3 Flexbox の各プロパティの使い方をヴィジュアルで詳しく解説 | コリス
  * http://coliss.com/articles/build-websites/operation/css/css3-flexbox-properties-by-scotch.html

このflexを使うことでページ中の一部をスクロールさせるようなデザインが簡単にできるようです。
サンプルを以下に作成しました。中央のリスト部分を縦にスクロールできます。

* https://jsbin.com/vaqozevoqa/edit?html,output

これの具体的な指定内容は以下の通りです。

```html
<div
  class="list-container"
  style="
    width: 200px;
    height: 250px;
    display: flex;
    flex-direction: column;
    ">

  <div
    class="list-header"
    style="
      flex-grow: 0; /* 省略可 */
      flex-basis: auto; /* 省略可 */
    ">
    ヘッダー
  </div>

  <div
    class="list-body"
    style="
      flex-grow: 1;
      flex-basis: 　0;
      overflow-y: scroll;
    ">
    <div class="list-item">リスト1</div>
    <div class="list-item">リスト2</div>
    <div class="list-item">リスト3</div>
  </div>

  <div
    class="list-footer"
    style="
      flex-grow: 0; /* 省略可 */
      flex-basis: auto; /* 省略可 */
    ">
    フッター
  </div>
</div>
```

こういったレイアウトを行う時に問題になるのは、ヘッダーやフッターなどの配置を固定した上で、リスト部分(`class="list-body"`の部分)のサイズを最大にする方法です。flex を使うことで`px`単位で固定の値を使うことなく、このbodyの高さの自動調整を行うことができます。

```
リスト部分(`class="list-body"`)の高さ = 
  一番外側のタグ(class="list-container")の高さ
    - (ヘッダーの高さ + フッターの高さ)
```

設定のポイントは以下のとおりです。

* 一番外側の領域 (list-container)
  * 高さを指定する
  * `display: flex;`を指定する
  * `flex-direction: column;`を指定して中のヘッダー、ボディ、フッターが縦に並ぶようにする
* ヘッダー、フッター(list-header, list-footer)
  * `flex-grow: 0; flex-basis: auto;`が設定された状態にして高さが固定になるようにする
  * これはflexの内部要素(flexItem)のデフォルト値なので省略可能
* ボディ(list-body)
  * `flex-grow: 1; flex-basis: 0;`を指定して高さを自動計算されるようにする
  * `overflow-y: scroll;`で内部がはみ出したときにスクロールするように指定する

この指定でのflexによる高さの計算は以下のような理屈のようです。

1. flexの子要素の初期の高さを算出
  * `flex-basis: auto`であるためlist-header, list-footerの高さをそのタグの中身から決定する
  * list-bodyの高さを、`flex-basis: 0`の指定から`0px`とする
2. (list-containerの高さ - Step.1で算出した子要素の高さの合計) = (list-containerの高さ - (list-headerの高さ + list-footerの高さ + list-bodyの高さ(= 0px) )) を算出する
3. Step.2で算出した高さを、子要素のflex-growの値の比率に合わせて分配する
  * list-headerの高さ : list-bodyの高さ : list-footerの高さ = `flex-grow: 0` : `flex-grow: 1` : `flex-grow: 0` = 0 : 1 : 0
  * つまり、list-bodyにStep.2での高さを全て割りあてる

結果的に、`list-bodyの高さ = list-containerの高さ - (list-headerの高さ + list-footerの高さ)`が実現されています。
オフラインリアルタイムどう書くE14 の問題

@Nabetani さんが主催するオフラインでリアルタイムに「どう書く」をやるイベント( https://yhpg.doorkeeper.jp/events/59397 )で問題を出させてもらいました。

問題は「サイコロできるかな」という名前で、詳細は
http://mtsmfm.github.io/2017/06/03/doukaku-e14.html
です。

実装ができた方はこちらのコメント欄からリンクを張っていただくと見つけやすくて助かります。
似たような問題をもっと解きたいという方は、Doorkeeper の コミュニティページ
http://yhpg.doorkeeper.jp/
に @Nabetani さんの過去問リンク集がありますので、そちらをご覧になると良いと思います。
AWSによるクラウドとオンプレの連携

AWSのVPCおよびデータ連携に関する基本的な内容をまとめてみたものです。AWSのVPCやデータ連携に関する、Web上にすでにある解説コンテンツをまとめたサイトの抜粋です。
[クラウドとオンプレの連携] (https://www.techcrowd.jp/datalink/onpremis-cloud/)

# [クラウドとオンプレのシステムを連携する方法] (https://www.techcrowd.jp/datalink/onpremis-cloud/)
クラウドとオンプレミスのシステムを連携するために、オンプレミスのシステム側に手作りの仕組みを作ったり連携ツールを使うと、オンプレミスのシステムの負担が大きくなり、連携をするのが大変になります。

その点、クラウド側の連携の仕組みを使って、クラウドとオンプレミスのシステムを連携すれば、オンプレミス側の負担が小さくなるので、容易に連携する事が出来ます。
クラウド側に用意されている連携サービスを使えば手軽に連携が出来るだけではなく、クラウド本来の性能が実現可能となります。

さらに、よりクラウドサービスを有効に利用するには、複数のクラウドとオンプレミスのシステムを連携して使うのが一番です。
一つのクラウドサービスでは物足りない場合でも、複数のクラウドを連携して使えば、高度な機能を実現する事も出来ます。
最近は数多くクラウドサービスが存在しますので、機能が充実していて連携しやすいサービスを見付けて利用する事が可能です。


# [クラウドとオンプレのシステム間でのデータ連携方法] (https://www.techcrowd.jp/datalink/onpremis-cloud/)

クラウドとオンプレのシステム間でデータの受け渡しをする方法として、
・データファイルをHTTPSでWebDAVなどを使って送受信する
・オンプレのデータベースからデータを作成して、外部のサービスを利用する
などが使われます。

しかし、より高度な連携が必要になった場合には、クラウドとオンプレのシステム間でプロセスでの連携を検討しなくてはなりません。
プロセスでの連携を実現する事で、クラウドを使ったBPMやトランザクション処理などを、ストレスを感じないで利用出来るようになります。


# [クラウドサービスを利用する時の注意点] (https://www.techcrowd.jp/datalink/onpremis-cloud/)

クラウドとオンプレのシステムを連携する時は、
・スループット
・通信系のエラーの発生
・メンテナンスなどによるサービスの停止
などの点に注意しなくてはなりません。

スループット
クラウドシステムは、クラウドシステム自体の処理速度や通信回線の速度が原因となって、スループットが悪化する事があります。
そのため、円滑なシステム運用を行うには、理論値だけを調べるのではなく、実際の処理時間を計測しておく事が大切です。

通信系のエラーの発生
外部回線を使うために、クラウドシステムを使用すると、通信系のエラーが発生する確率が高くなります。
通常は通信をリトライする事で障害が発生するのを防げますが、エラーの対応についてはクラウドサービスごとに内容が異なるので、サービスを利用する前にエラーの対処方法を確認しておく必要があります。

メンテナンスなどによるサービスの停止
クラウドサービスを提供している会社に都合によって、サービスの停止がある事に気を付けなくてはなりません。
事前にサービス停止予定の連絡が来ますが、業務によってはサービスが停止すると大きな影響が出る事もあります。


# [セキュリティ面のクラウドとオンプレのシステムの比較] (https://www.techcrowd.jp/datalink/cloudsecurity/)
クラウドサービスとオンプレのシステムのセキュリティを比較すると、クラウドサービスの方がセキュリティ面への配慮がされている面があります。

クラウドサービス
・顧客へのサービス提供が本業なので、セキュリティに十分な注意をしている
・問題がないかを常時監視している
・最新のセキュリティ対策を積極的に導入している

オンプレのシステム
・本業とは別にシステム開発をしているので、セキュリティ面にまで注意が行かない
・セキュリティ費用が、十分ではない

このように比較してみると、クラウドサービスの方が安全に利用出来る環境が整っていると考えられる面がありますが、クラウドサービスを運営する企業ごとにセキュリティに関する考え方や対応策が異なっているので、サービスを利用する前に具体的な内容を調べておく必要があります。


# [クラウドでは誰がデータの権限を持っているか確認する] (https://www.techcrowd.jp/datalink/cloudsecurity/)

クラウドサービスのセキュリティ面を比較する時は、クラウド上のデータの権限が誰にあるのかも確認する必要があります。

データの権限がクラウドサービスの運営者にあれば、大きな問題が発生した時の行政による情報の開示要求に応じるかもしれません。
行政がデータを見に来る事など極めて稀な事態ですが、もしもの時の事も考えておく必要があります。

セキュリティをより確かなものにするには、クラウドサービスの運営者が作成する年間報告書を読んで、・行政への対応・暗号化の状況、なども確認しておくとよいでしょう。
ニコニコ除ニコレポ的なものを作った

## 原因

2017/05末あたりに『最新ニコレポ』のページ構成に変更が入り、[ニコニコ除ニコレポ](https://chrome.google.com/webstore/detail/%E3%83%8B%E3%82%B3%E3%83%8B%E3%82%B3%E9%99%A4%E3%83%8B%E3%82%B3%E3%83%AC%E3%83%9D/cjfmeecodnibclajaofkinnebeklbkjm?hl=ja)が動作しなくなっていまいました。
かわりに入った[ミュート機能](http://blog.nicovideo.jp/niconews/25675.html)はまともに運用できないどうしようもないゴミでした。

なので作った

## インストール方法

[右クリック禁止を禁止](http://qiita.com/rana_kualu/items/51230bfd903a7320eb55)あたりを参考にTampermonkeyをインストールします。

更新URLに『`http://www.nicovideo.jp/my/top`』、ソースには以下を貼り付けます。

```js
// ここに削除したい文字列を書いてね
const DELETE_CONTENT = ["生放送", "再生を達成", "位を達成"];

(function() {
    'use strict';
    /*
        TODO 最初はNicorepoTimelineItemがないので遅延させているが、
        一回だけでいいのでずっと監視しなくてもいい
    */
    var target = document.querySelector('.nicorepo-page');
    var mo = new MutationObserver(startDeleteElement);
    mo.observe(target, {childList: true});

    function startDeleteElement(){
        // XXX 追加要素だけチェックすればいいけど現在全件見る
        function deleteElement() {
            // なんか2回走る
            var elements = document.querySelectorAll('.NicorepoTimelineItem');
            for (let element of elements) {
                for (let delItem of DELETE_CONTENT) {
                    if(element.innerText.indexOf(delItem) > 0){
                        element.parentNode.removeChild(element);
                    }
                }
            }
        }
        var target = document.querySelector('.NicorepoTimeline');
        var mo = new MutationObserver(deleteElement);
        mo.observe(target, {childList: true});

        deleteElement(); // 初回
    }

})();
```

画面から設定とかはできませんが、まあ早々変更したりするようなものでもないしいいでしょう。

## 既知のバグ

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">おうふ、【過去のニコレポを見る】の位置が動かなくなるぞ。なんでだ。<br>まあ連打して適当にロードしてから見るのが楽だからこれはこれでいいや。 <a href="https://t.co/bJHnJ2WRGC">pic.twitter.com/bJHnJ2WRGC</a></p>&mdash; ラナ・クアール (@rana_kualu) <a href="https://twitter.com/rana_kualu/status/870897213517340674">2017年6月3日</a></blockquote>

## その他

動けばいいやの精神で作ったのでかなり適当。
2回走るとかどうにかしろよ。

ニコニコ除ニコレポの[ソースが公開されてる](https://github.com/fushihara/nico-repo)ことには作った後で気付いた。
Git Hub が Faild を出してきたらローカル・ディスクにファイルが多すぎる可能性がある

# 結論
アップロードするファイルの個数と容量がともに多すぎたのでは。リポジトリの容量があるのか。

# 過程
何が原因だったのかは　よく分かっていない。

Git Hub のGUIで sync ボタンを押したり、CLONE AGEIN ボタンを押したりしても　１時間ぐらい反応がないか、線が　くるくる回っていて　Failed というエラーメッセージを返すとき、

ローカル・ディスクのフォルダーの　ファイル数を減らしたら　くるくるが解消することがあった。


そこで　また CLONE AGEIN ボタンを押したんだが　また　くるくる回っている。
もう少し　調べてみる。

# ずっと　くるくる回っているのが　おかしいのでは

まだそんなに入れてないリポジトリの CLONE AGEIN でそんなに時間がかかるとも思えない。

１時間ぐらい放置して戻ってくると
Git Hub のGUIでリポジトリの中を覗くことができ、中は空っぽだった。

ローカルから全部入れてみる。


# .bin を認識してしまう

Git Hub のGUIで　default の ignore ファイルを作っても
.bin を認識してしまう。

Unity の Library フォルダーの下にシェーダーのキャッシュがいっぱいあって 900 ファイルぐらい認識してしまう。

とりあえずコミットしてみる。１時間ぐらい　放置してみる。


Git Hub に　アカウント凍結されているんじゃないか、という説もあるが　よくわからん。

「[雑記]github のアカウントが停止された」
http://d.hatena.ne.jp/osyo-manga/20130714/1373737167

理由をどうやって調べたんだろうか。


# published に戻っている

synced の代わりに published に戻っていた。
サーバー上のリポジトリーが消えるということがあるんだろうか。
とりあえず　published をクリックしてみる。

そのまま変わらない。

# インターネットをチェックしてください　とエラーが出た。

あたらしくリポジトリを作ったところ、インターネットをチェックしてくださいと出た。
Git Hub のページは出てきた。

# Open Shell

ダイアログボックスで Open Shell というボタンが出てきたが、何をやるものかも分からない。
ただ　外部記憶装置のファイルを減らすと　つながりやすくなるようだ。

つながるといっても　くるくる　が終わるだけで

```
failed to sync this branch.
You might need to open a shell and debug the state of this repo.

OPEN SHELL CANCELL
```

と出てくるだけで　sync はできないようだ。
これが　アカウント凍結　されているのかどうか分からない。


コミットはしていて、 sync はできないのだろうか。

「.gitignore が反映されない時の対応」
http://qiita.com/colorrabbit/items/464878f8fb61922e5b9d

# Powershell.exe

[Ctrl]+[C] や [Ctrl]+[V] は違う働きをするようだ。


「Github Windows 'Failed to sync this branch'」
https://stackoverflow.com/questions/15387640/github-windows-failed-to-sync-this-branch


# git status 

と打ち込んでみるが　何をやっていいのかわからない。

# PCを再起動してみる

新しく作った Test リポジトリは sync できるようになった。
納品先の private リポジトリは publish すると

```
error
Failed to publish this branch.
OK
```

と出てくる。
カルーセルスライダーどれを使えば

仕事柄、カルーセルスライダーをよく使うのですが、どれを使えば間違いないというのが、未だに決めかねている現状です。
というのも、どんな状況においてもこれがバッチリというスライダーは存在せず、どれも一長一短あるというのが、いろいろ使ってみてわかってきました。
ただ、こういう時はこれを使うというのが、ある程度自分の中でモヤっとあるので、それをまとめておこう。

# 1.Bxslider
[http://bxslider.com](http://bxslider.com)
## メリット
- 複数読み込み可能
- レスポンシブ
- 複数表示/スクロール数の調整可能
- コールバックの処理がわかりやすい
- 矢印画像の差し替えや配置の変更も容易
- 参考となる情報ページが多い

## デメリット
- フルスクリーンのスライダーがめんどくさい
- なぜか最後の画像が先頭の画像としてスライダーに表示される（バグ）
- レスポンシブの挙動が不安定？（これは自分が使っている上では気にならなかった）


# ２.Slider Pro
[http://bqworks.com/slider-pro/](http://bqworks.com/slider-pro/)
## メリット
- フルスクリーン対応
- レスポンシブ
- サムネイル付きのスライダーが設置しやすい
- というか、公式にあるような事やらせるなら結構容易（Macみたいだあ）

## デメリット
- 複数読み込みできない
- 複数表示できない？（やり方わからん）
- スライダーの画像数が２つだと、挙動がおかしい


# ３.slick
[http://kenwheeler.github.io/slick/](http://kenwheeler.github.io/slick/)
## メリット
- 複数読み込み可能
- レスポンシブ
- 複数表示/スクロール数の調整可能
- 挙動が安定している


## デメリット
- フルスクリーンのスライダーがめんどくさい
- コールバックの処理がよくわからん
- 矢印の画像変更とかが難しい
- つーか参考になる情報ページがあまり豊富じゃない


<br>

だいたいこの３つを使う事が多いです。
使い分けとしては、

基本的にはbxslider、フルスクリーンの時はslider pro。
それら２つでどうにもならない時はslickという感じですね。
ADBコマンド導入の方法

# Windowsの場合

## Android Studio が入っている方

Windowsのシステム情報 > システムの詳細設計 > 環境変数 で PATH に以下のものを追加します。

```
C:¥Users¥{ユーザーネーム}¥AppData¥Local¥Android¥sdk¥platform-tools
```

## Android Studio が入ってない方

[https://developer.android.com/studio/releases/platform-tools.html](https://developer.android.com/studio/releases/platform-tools.html)

上部リンクから SDK Platform-Tools for Windows をダウンロードします。

任意のフォルダにzipファイルを展開します。

展開したフォルダを開きます。

``adb.exe``が見える状態でフォルダの PATH を Explorer の上部のバーから取得します。

Windowsのシステム情報 > システムの詳細設計 > 環境変数 で PATH に Explorer で取得した PATHを入力します。

## トラブルシューティング

- 正しく PATH を設定しても adb コマンドが叩けない
 - コマンドプロンプトや叩いているshellを再起動してください。 


# Macの場合

## Android Studio が入っている方

ターミナルを開いて以下を入力します。

```
echo 'export PATH="$PATH:/Users/{ユーザーネーム}/Library/Android/sdk/platform-tools"' >> ~/.bash_profile
```

デフォルトの bash 以外を使ってる認識がある方は適宜 .bash_profile をご自分の shell の設定ファイルを変更してください。

## Homebrew が入っている方

ターミナルを開いて以下を入力します。

```
brew install android-platform-tools
```

## それ以外の方

[https://developer.android.com/studio/releases/platform-tools.html](https://developer.android.com/studio/releases/platform-tools.html)

上部リンクから SDK Platform-Tools for Mac をダウンロードします。

任意のフォルダに展開します。

展開したフォルダにある ``adb`` を右クリックして、情報を見るで``場所：``以降をコピーします。

ターミナルを開いて以下を入力します。

```
echo 'export PATH="$PATH:{コピーした場所：以降の値}"' >> ~/.bash_profile
```

デフォルトの bash 以外を使ってる認識がある方は適宜 .bash_profile をご自分の shell の設定ファイルを変更してください。


## トラブルシューティング

- 正しく PATH を設定しても adb コマンドが叩けない
 - ターミナルや叩いているshellを再起動してください。 


# Windows / Mac 以外の場合
ggrks


ドラブル情報や編集リクエストお待ちしています。
# Cacti の  Advanced Ping で グラフが描写されない

# 経緯
cacti で advanced ping を使って 死活監視をしようとしたところ全くグラフが描写されなかった。
そこで調べてみました。

# 環境
- Ubuntu16.04
- php version 7.0
- cacti version 0.8.8f

# 調査

```
$ sudo php /usr/share/cacti/site/scripts/ss_fping.php 127.0.0.1
PHP Fatal error:  Uncaught Error: Call to undefined function split() in /usr/share/cacti/site/scripts/ss_fping.php:26
Stack trace:
#0 /usr/share/cacti/site/scripts/ss_fping.php(20): ss_fping('127.0.0.1')
#1 {main}
  thrown in /usr/share/cacti/site/scripts/ss_fping.php on line 26
```

# 原因
split()関数が呼び出せていないみたい。
調べているとphp 7.0 からsplit()は削除されているみたい。

http://php.net/manual/ja/function.split.php

代わりにexplode()関数を使う。

http://php.net/manual/ja/function.explode.php

# 対応
```php
 26   //list($micro,$seconds) = split(" ", microtime()); // 26行目をコピーしてコメントアウト
 27   list($micro,$seconds) = explode(" ", microtime()); // split をexplodeに変更

114     //list($micro,$seconds) = split(" ", microtime());
115     list($micro,$seconds) = explode(" ", microtime());

```

# 結果

```
/usr/share/cacti/site/scripts$ sudo php ss_fping.php 127.0.0.1
min:0.0140 avg:0.0175 max:0.0300 dev:0.0057 loss:0.0000
```

でけた！
Macでディスク容量がいっぱいになってしまったときにすること

![image.png](https://qiita-image-store.s3.amazonaws.com/0/52847/a106622a-dbe9-2078-329b-1bb4b2e95743.png)

ステータスバーのアップルマーク > このMacについて > ストレージ

から確認すればだいたい検討がつくが、エンジニアの場合は大抵「その他」が大半を占めているケースが多いのではないだろうか。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/52847/817e62d4-3358-ef5b-1698-0aeff1d19e76.png)

これだとどこが容量を占めているかわからないので、
CLIを使って調べる。
以下のコマンドを、ルートで実行する

```
sudo du -sh ./*|sort -nr
```


実行結果

```
344G	./Users
 32K	./Incompatible Software
 32G	./Applications
 16G	./private
 10G	./Library
7.1G	./System
6.5G	./usr
4.5K	./dev
4.0K	./var
4.0K	./tmp
4.0K	./installer.failurerequests
4.0K	./etc
4.0K	./Volumes
2.5M	./bin
1.0M	./sbin
1.0K	./net
1.0K	./home
  0B	./cores
  0B	./Network
```

まずはルートで実行 → /Usersで実行 → 容量割合の大きかったディレクトリで実行 ・・・ を繰り返して、
削除/移動するファイル群を検討する

MacOSじゃなくてもUnixOS全般で使えるので覚えておいて損はない
[flaskr改造編メモ]HTMLもWeb構築もわからない素人がPython+FlaskでWebサービスを作ってみる

これは、エンジニア未経験のど素人が、週末エンジニアとして
PythonとFlaskでWebアプリを作成するためのメモ記事です。

[ランディングページ](http://qiita.com/yuusei/items/0c202309743214fdce2f)
[Flask](http://qiita.com/yuusei/items/15f38a6abd431d093d2e)
-> [flaskr起動&test編](http://qiita.com/yuusei/items/73eef67fa692090086c0)
-> [flaskr改造編] このページ
[Docker] (http://qiita.com/yuusei/items/51b3917f1ce3f2fbb5e6)
-> [Dockerコマンド](http://qiita.com/yuusei/items/640c85da1a1bf43fe72f)
[Web開発](http://qiita.com/yuusei/items/cf738b0849fc932a64e6)

# FlaskrにLeafletを表示させる
## Leaflet とは
Leafletとは JAVA Scriptで書かれたオープンソースの地図クライアント・ライブラリです。詳しい説明は[こちら”leaflet始めました”](http://monomoti.hatenablog.jp/entry/20111218/1324220882) を参照してください。

簡単にいうと、自分のWebサービスにGoogleMap的な地図を埋め込むサービスで、素晴らしいのは簡単なコードで某ぐ○ナビにある地図みたいなサービスを作る事ができます。 [例えば ~~Pokemon go公式に嫌われている~~P-go Searchもleafletを使っています](https://pmap.kuku.lu/)。

今回はとりあえずページに地図を埋め込む方法を説明します。
参考にしたのは先のサイトに加え、

[Leaflet Quick Start Guide](http://leafletjs.com/examples/quick-start/)
[leafletで地図を作る](http://xl.hisholy.net/gis/creating-maps-with-leaflet/)

の２つです。

## Leafletによる国土地理院地図の埋め込む方法
やることは簡単。

[Leaflet Quick Start Guide](http://leafletjs.com/examples/quick-start/)

にあるコードをHeaderとBodyに埋め込むだけ。国土地理院の地図に変更するには、

[こちら”leaflet始めました”](http://monomoti.hatenablog.jp/entry/20111218/1324220882) 

を参照してください。具体的に埋め込んだコードは

<img width="745" alt="head.png" src="https://qiita-image-store.s3.amazonaws.com/0/138270/453327ed-2fb5-c8ca-a1d5-736fc498996a.png">


<img width="792" alt="body.png" src="https://qiita-image-store.s3.amazonaws.com/0/138270/aec28494-4471-e284-47d0-ac1879fc8018.png">


これだけ。これを”layout.html”に埋め込むだけ。で、埋め込んだ結果はこれ。

<img width="1428" alt="Top.png" src="https://qiita-image-store.s3.amazonaws.com/0/138270/cdcc8665-9e64-b9e6-cbee-508384942f28.png">


コード内のサイズをいじれば下の地図サイズは変更できます。自分が作りたいサービスの叩き台にはちょうどいい感じ。ここから色々いじって見たいと思います。

一応、Flaskrアプリの機能はそのまま残ってます。

<img width="1424" alt="LogIn.png" src="https://qiita-image-store.s3.amazonaws.com/0/138270/a42f437c-827a-ba4c-403b-9f1091e0b21a.png">

以上です。
apkファイル関連メモ

# はじめに
apkファイル関連で使ったツールの使用方法を忘れないうちにメモ

# apktool
apkファイル展開
`$apktool d /path/to/apkfile`

apkファイル再ビルド
`$apktoo b /path/to/apkfile`

# baksmali
dexファイルをsmaliファイルへ
`$baksmali d /path/to/dexfile`

# jar2dex
jarファイルをdexファイルへ
`$jar2dex -o filename /path/to/jarfile`
 
# jarsigner(追記)
apkファイルへの署名
`$jarsigner -keystore /path/to/keystore -storepass "storepass" -keypass "keypass" /path/to/apkfile "keystore別名"`
swift3.0 プロパティの種類

## プロパティの種類

- インスタンスプロパティ
    - ストアプロパティ
        - 変数ストアプロパティ
        - 定数ストアプロパティ
        - 遅延ストプロパティ
    - コンピュテッドプロパティ
        - Read-Onlyコンピュテッドプロパティ
- 型プロパティ
    - ストアプロパティ
    - コンピュテッドプロパティ



## ストアプロパティ：値を格納するプロパティ

```
var varStored: String = “Hello"
let letStored: Int = 1
```

### 変数ストアプロパティ：再代入可能な値を保持するプロパティ
### 定数ストアプロパティ：再代入が出来ない、宣言時の値を保持するプロパティ
### 遅延ストアプロパティ：参照される際に初めて初期値が設定されるプロパティ

```
class File {
    var name = “data.txt"
}

class Storage {
    lazy var file = File()  //遅延ストアプロパティ
    var data = [String]()
}

let storage = Storage() //まだstorage.fileは生成されない
storage.data.append(“some data”) //まだstorage.fileは生成されない
print(storage.file.name) //参照されて初めて値が設定される
```

## コンピュテッドプロパティ：値を計算するプロパティ

```
var greeting: String = “Hello"
var computed: String {
    //プロパティを参照する際に実行して値を返す。
    get {
        return greeting
    }
    //プロパティに値を設定した時に実行される。
    set(newValue) {     //(newValue)はデフォルトで使用されるため、宣言時の省略が可能
        greeting = newValue
    }
}
```

### Read-Onlyコンピュテッドプロパティ：読み取り専用のプロパティで常に値を返す
        
```
struct ViewSize {
    var width = 0.0, height = 0.0
    var size: CGSize {
        return CGSize(width: width, height: height)
    }
}

let newViewSize = ViewSize(width: 3.0, height: 5.0)
print(“view size is \(newViewSize.size)”)  // "view size is 15.0"
```

ストアプロパティはclassとstructureで利用出来る一方、コンピュテッドプロパティではclassとstructureとenumで利用することが出来る。


## プロパティオブザーバ

```
class HeightManager {
    var height: Double = 100.0 {
        //値がセットされる前に実行される(newValueはこれからセットする値)
        willSet {
            print(“身長が\(height)cmから\(newValue)cmになりました。")
        }
        //値をセットした後に実行される(oldValueは元の値)
        didSet {
            print("変更分は\(height - oldValue)cmです。")
        }
    }
}

let manager = HeightManager()
manager.height = 160.0
// 身長が100.0cmから160.0cmになりました。
// 変更分は60.0cmです。
```

## インスタンスプロパティと型プロパティ
・インスタンスプロパティ：値がインスタンスに付随しているので、基本的に新しい新スタンスが生成される度に複製される。
・型プロパティ：値が型自身に付随しているので、何個インスタンスが生成されようが、実体は常に一つしか存在しない。



## 参考
https://www.slideshare.net/hasegawatomoki/swift-45247767
https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Properties.html#//apple_ref/doc/uid/TP40014097-CH14-ID254
Android GoogleMap API Release-apkでマップが表示されない時の対処

#AndroidでRelease-apkの時にマップが表示されない件
表題に関してココで説明する前に、前提知識としてapiキーの取得方法とSHA1フィンガープリントの設定まで出来ている事を想定しています。

ということで、以下本論。

私は、公開用apkでマップが表示されない件でドハマリしました。ほぼほぼ一週間解決までに時間がかかりましたが、解決方法はなんともあっけないものでした。

#公開apkでマップが表示されない時の解決方法の結論！
公開用apiキーはmanifestsファイルに直書きする！！！
![image.png](https://qiita-image-store.s3.amazonaws.com/0/137470/8bf5cc69-c13a-aae5-7817-cdf3784b0f19.png)
↑
こんな感じ。

#ハマった理由
APIキーを設定する時にDebug/Releaseを切り分けてAndroidStuidに記載する必要がある。と思い込んでいた。これは何を意味するかという↓を参照。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/137470/ccd23a9c-6b34-f779-ddb5-675ba41aad7c.png)

AndroidStudioのデフォルでは、Debug用のgoogle_maps_api.xmlファイルしか表示されない！！（泣）しかし、Release用のファイルも存在しており、Release-apkを作成するときはRelease用のファイルへ記載するのかな～^^?と思い込んでおり、ネットでもそんな書き込みがあったのでそう信じていた！だけど、これは私の環境では通用しなかった。もし、他にハマっている方がいれば、是非、マニフェスト直書きをやってみて欲しい。

ザマリンでもマニフェストに書いてねと言っているのでやっぱりマニフェスト直書きが正解なんでしょうかね～。ようわからんです。
https://developer.xamarin.com/guides/android/platform_features/maps_and_location/maps/obtaining_a_google_maps_api_key/
┐(´д｀)┌ﾔﾚﾔﾚ

以上です。
ubuntuで録音

## マイク入力の音量確認

### alsamixerの場合

* `Front Mic Boost`のボリュームを上げる

![device.png](https://qiita-image-store.s3.amazonaws.com/0/25728/9782d616-a201-0595-c6fe-e0cccde7e9e6.png)

### xubuntuの場合

![2.png](https://qiita-image-store.s3.amazonaws.com/0/25728/9f9c2ce0-a492-a04d-d00b-ff9bcd053af4.png)

## 録音準備の確認

```
arecord -f S16_LE -r 44100 | aplay
```


## 録音

```
arecord -f S16_LE -r 44100 a.wav
```

ctrl-cで終了


## 確認

```
aplay a.wav
```

## 編集

audacity

![audacity.png](https://qiita-image-store.s3.amazonaws.com/0/25728/538d93c7-f148-b65f-4e55-714aa82e843a.png)
開発環境(windows)にGitをセットアップする

 以下のソフトの最新版をインストールする。

# git for windows 
(2017/6/3時点で、「2.13.0」)
https://git-for-windows.github.io/

# TortoiseGit
(2017/6/3時点で、「2.4.0.2」)
https://tortoisegit.org/download/

# sourcetree
(2017/6/3時点で、「2.0.20.1」)
https://ja.atlassian.com/software/sourcetree
ffmpegコンテナを使ってm4aファイルをwavファイルに変換する

こんにちはみなさん

macのquicktime Player使ってPCから流れる音を録音すると、m4a形式で録音されるのだけど、pythonとかでいじりたいので、wavにできないかなーって思ってgoogle先生に聞きまわったところ、webサイトでのエンコードとかしか出てこなかったので、せっかくだからffmpegとか使ってさっさと変換してしまおうと考えました。

今回はそんなお話です。

# まずはDockerhuからffmpegイメージを落とす

もう全部コンテナでいいんじゃないかってくらいコンテナに浸かっているので、今回もdockerhub上で一番DL数の多いイメージを落として、そいつを使うことにしました。
というか、ローカルにffmpegインストールすると、PCに変な依存性ができそうで嫌だった感じです。
せっかくなので、極力軽いものを選びます。

```
$ docker pull jrottenberg/ffmpeg:3.3-alpine
```
25MBでした。

# ディレクトリを作ってテストをする

入力ファイルと出力ファイルが格納されるディレクトリを作って、テスト用のファイルを投入します。

```
$ mkdir input output
$ cp ~/Music/something/test.m4a ./input/
```
テストデータが入ったところで、動かしてみましょう

```
$ docker run --rm -v `pwd`/input:/input -v `pwd`/output:/output jrottenberg/ffmpeg:3.3-alpine \
-i /input/test.m4a /output/test.wav
```
これでデータが作成されました。
サイズが4倍くらいになりますが、ちゃんと変換されていて、音も聞けます。

# ついでにスクリプトにする

これで終わってもいいのですが、コマンドが面倒くさいのでシェルスクリプトに落としちゃいましょう。

```convert.sh
INPUT=`pwd`/input
OUTPUT=`pwd`/output
FFMPEG=jrottenberg/ffmpeg:3.3-alpine
COMMAND="docker run --rm -v ${INPUT}:/input -v ${OUTPUT}:/output ${FFMPEG}"

NAME=$1

`${COMMAND} -i /input/${NAME}.m4a /output/${NAME}.wav`
```
convert.shの引数にファイル名の拡張子を除いたものを入れると、自動的にinputディレクトリのファイルを基にoutputディレクトリにwavを吐き出します。

```
$ sh convert.sh test2
```
こんな感じです

# まとめ
音声や動画変換するときに、専用ツールを使うのもいいのですが、ffmpegの事も思い出してあげてください。
そして、docker便利です。

# 参考
https://hub.docker.com/r/jrottenberg/ffmpeg/
truncateコマンドでファイルを空にする

## echoコマンドのリダイレクトによる方法は扱いづらい
ファイルを空にする方法は色々あるかと思うが、自分はこれまで次のように`echo`コマンドのリダイレクトを使っていた。

```shell-session
$ echo -n > target.txt
```

しかしこのやり方は空にしたいテキストファイルに対して書き込み権限が無いと、`sudo`で実行しても弾かれてしまう。

```shell-session
$ sudo echo -n > target.txt
-bash: target.txt: Permission denied
```

なのでそういう場合は次のように`sh -c`を使って、`sh`コマンドの引数として実行するコマンドを渡さなければならなかった。

```shell-session
$ sudo sh -c 'echo -n > target.txt'
```

しかし、このやり方にはファイル名の補完がうまく効かないという問題があり、場合によっては少々危険になり得る。
...というように、リダイレクトを使う方法は特に権限周りで面倒になってしまうことが多い。

## そこでtruncateコマンドですよ
こういう時は、次のように`truncate`コマンドを使う方が楽。

```shell-session
$ truncate target.txt --size 0
```

`--size`オプションに0を与えてファイルサイズを0、つまり空にしている。
書き込み権限が無いファイルの場合は、単純に`sudo`で実行すれば良い（`sh -c`など使わなくていい）。

```shell-session
$ sudo truncate target.txt --size 0
```

※ truncateコマンドの参考リンク
https://linuxjm.osdn.jp/html/GNU_coreutils/man1/truncate.1.html
YUML > パラメータ から 光学特性の計算まで 

```
![](http://yuml.me/diagram/class/[parameters]ADDA(Suspend)-->[InitField-Y],[InitField-Y]-->convertToInputcsv_170422.py[input.csv],[input.csv]TensorFlow(learnExr_170504.py)-->[model_variables_170429.npy],[model_variables_170429.npy]reproduce_170429.py-->[prediction],[prediction]toInitFieldY_170603.py-->[InitField-Y],[InitField_Y]ADDA(Resume)-->[light scattering properties])
```
というYUML形式は以下のようになる。

![](http://yuml.me/diagram/class/[parameters]ADDA(Suspend)-->[InitField-Y],[InitField-Y]-->convertToInputcsv_170422.py[input.csv],[input.csv]TensorFlow(learnExr_170504.py)-->[model_variables_170429.npy],[model_variables_170429.npy]reproduce_170429.py-->[prediction],[prediction]toInitFieldY_170603.py-->[InitField-Y],[InitField_Y]ADDA(Resume)-->[light scattering properties])

見栄えが良くないが、だいたいの流れは見えてきた。

処理の点が線につながりつつあるが、まだプロトタイプと呼べる域には達していない。
上記が完成してもTensorFlowの学習分が余分な処理時間になる。
複数のパラメータ(例：サイズ、複素屈折率、形状）を含めた学習形態にすることができれば、全体の処理効率が高まるだろうが、どういうネットワークがいいのか。

#link
- convertToInputcsv_170422.py
  - http://qiita.com/7of9/items/930cde32700320a8db63
- learnExr_170504.py
  - http://qiita.com/7of9/items/ad1acaf930ca6852cce9
- reproduce_170429.py
  - http://qiita.com/7of9/items/f267e59790526e49a7fd
- toInitFieldY_170603.py
  - in coding
  

### v0.2
(追加 2017/06/18)

![](http://yuml.me/diagram/class/[parameters]ADDA(Suspend)-->[InitField-Y],[InitField-Y]-->convertToInputcsv_170422.py[input.csv],[input.csv]TensorFlow(learnExr_170504.py)-->[model_variables_170429.npy],
[input.csv]-->check_resultmap_170429.ipynb[map of Ex Ey Ez],[model_variables_170429.npy]reproduce_170429.py-->[prediction],[prediction]toInitFieldY_170603.py-->[InitField-Y],[InitField_Y]ADDA(Resume)-->[light scattering properties])
Laravel ビューで独自ライブラリクラスを呼ぶ

### やりたいこと
Laravelのbladeテンプレートで、独自定義したPHPのライブラリ関数を呼ぶ

### やり方
`@inject('myLib', 'App\Libs\MyLibrary')`
`<p>{{ $myLib->myMethod() }}</p>`

### 感想
そういえば、bladeテンプレートでisset()とかの関数使うけど
独自ライブラリの関数は使ったこと無かったなと思ったのでメモ