OmniAICreator/Qiita-1.07M huggingface dataset:
VM上でCUDAを動かす！(挫折)

純正とかにこだわらず、なんでもよいからCUDAをVMで動かしたいと思います。

先人によると、いろいろあるけど、とにかく難しいようです。
[Windows10上のTensorFlowでGPUを利用しようとしてダメだった→できるようになったみたいです！](http://www.scriptlife.jp/contents/programming/2016/09/14/post-1766/)

# VirtualBOX

Virtual BOXはパススルーに対応しているということでしたが、実際は難しいという報告が結構ありました。

[VirtualBoxでtensorflowを実行する【GPU版導入挫折報告](https://qiita.com/yh0sh/items/957a074f3e54744c4161)


[State of GPU Virtualization for CUDA Applications 2014](http://acceleware.com/blog/state-gpu-virtualization-cuda-applications-2014) には、この時点ではVirtual BOXはLinuxホストのみとあります。

[VirtualBoxの3Dアクセラレーションを有効にする方法](http://news.mynavi.jp/articles/2010/10/22/virtualbox-3d-acceleration/) これを見るといわゆるvGPUの機能は存在し、Guest Additionsというパッケージを入れれば３Dアクセラレーションまでは使える仕組みのようです。

それにしても、一時期まではtensor flowを動かすためにVM上でLinuxというのはあったのですが、Windows正式対応してからはあまりこの手のことをトライする人がいなくなっているようです。

でも、以下のように、成功している人もいるにはいるみたいなんですよね。
[Ubuntu 14.04 VirtualBox VM](https://github.com/BVLC/caffe/wiki/Ubuntu-14.04-VirtualBox-VM)


[VGPU 101:  PASSTHROUGH VS. VGPU & WHY IT MATTERS](http://www.whitehatvirtual.com/blog/vgpu-101-passthrough-vs.-vgpu-why-it-matters)に以下のようにあるので、この二つがよさそうです。

> Citrix XenServer and VMware ESX both support both NVIDIA vGPU and passthrough modes.

# Citrix XenServer

オフィシャルに対応しているようです。

[OpenCL and NVIDIA CUDA support for Citrix XenServer, XenDesktop and XenApp](https://www.citrix.com/blogs/2014/04/23/opencl-and-nvidia-cuda-support-for-citrix-xenserver-xendesktop-and-xenapp/)

[VIRTUAL GPU SOFTWARE FOR CITRIX XENSERVER VERSION 384.73/385.41](https://docs.nvidia.com/grid/5.0/pdf/grid-vgpu-release-notes-citrix-xenserver.pdf)

ただ、最近の情報はNVIDIA GRIDを前提とした記述が多く、なかなかアドホックなPC環境に入れた事例は無さそうです。


# VMWare ESX

こちらも上記の記事に書いてあるように対応はしているようです。

[Mware vSphere ESXiを試す + GPGPUの認識に挑戦](http://msyksphinz.hatenablog.com/entry/2016/03/19/025533)惜しいところで、成功したのかどうかわからない。どうも単にGPUとして認識されるだけではだめのようです。

[Machine Learning on VMware vSphere
with NVIDIA GPUs](http://on-demand.gputechconf.com/gtc/2017/presentation/s7216-uday-kurkure-machine-learning-on-vmware-vsphere.pdf) 
こちらもGRID全盛という感じで、懇切丁寧なインストール説明などはありませんでした。

# まとめ

以下の論文のように確かにこれらの仮想化環境でCUDAを作るというのは可能なようですが、少々難易度は高そうです。
[GPU Passthrough Performance: A Comparison of KVM, Xen, VMWare ESXi, and LXC for CUDA and OpenCL Applications](http://ieeexplore.ieee.org/document/6973796/)

Windows 10 Fall Creators UpdateのHyper-Vでしれっと対応してくれないかな？
外部の Python コードをページ内に表示(あるいはページ保存時にコードを保存)

# 動機

Jupyter Notebook で、自作クラスの説明とその実行例を幾つか掲載したい場面があった。
コードが短くて実行例も小さいな画像なら 1 ページに収めるのが普通。
しかし、クラスのコードはそこそこ長いし、実行例も matplotlib のグラフになるから場所をとるので、1 ページにまとめるとかなり長くなる。

そこで、ソースコードと実行例を別ページにすることを考えた。

複数のページでソースコードを共有する場合、プログラムファイル `foo.py` を同じフォルダに置いておいて、使う側で `import foo` とすればよい。
ファイル自体は、tree 表示画面で、New → Text File としてからファイル名を 'foo.py' としても作成できる。

問題は、プログラムファイルを表示する方法。
できれば、ソースコードとして表示させたい(シンタックスハイライトとか、行番号とか、クラスや関数の折り畳みとかが利くようにしたい)。

# 試したこと

## ボツ案1：プログラムファイルへのリンクを貼る

Markdown セルに `[プログラム](./foo.py)` と書く。

プログラムファイルが違うタブに表示されてしまうし、ベタテキストになって見づらい。

## ボツ案2：Python で表示する

ページ内で Python のコードを実行できるので、`open()` と `print()` で表示する。

```Python
for s in open('./foo.py'): print(s[:-1]) 
```

ページ内に表示されるようにはなった。しかし、この `for` 文が邪魔だし、ベタテキストなのは変わらない。
(テキストファイルの表示なら構わないのかも知れない)。

## ボツ案3：ページ保存時にスクリプトを保存する。

別ファイルのソースコードをページ内に表示するのはあきらめて、ページ内に埋め込んだプログラムを外部ファイルに出力することにした。
メニューから File → Download as → Python としてもよいが、保存先フォルダに気を使わないといけないし、コードを更新するたびに操作するのが面倒なので、自動化することにした。

[Jupyter Notebookのドキュメント](http://jupyter-notebook.readthedocs.io/en/4.x/extending/savehooks.html)によると、保存の前後にユーザ定義関数を呼び出すことができる。
サンプルの `script_post_save()` をそのまま使って、`jupyter_notebook_config.py` [^1] の
 `post_save_hook` に設定する。

[^1]: `jupyter_notebook_config.py` は、`jupyter-notebook --generate-config` を実行すると `%HOME%/.jupyter` に作成される。

こうすると、ページが保存されるタイミングで、プログラムファイルも保存される。
プログラムファイルには、Code セルの内容だけでなく、Markdown セルがコメントとして残る。

ただし、プログラムファイルに出力する必要のないコードまで出力するし、ページ内に Code セルが無くてもプログラムファイルができてしまう。

## 採用案：ページ保存時に指定した Code セルのみをプログラムファイルに保存する

先頭行に `##export` とある Code セルのみをプログラムファイルに出力する関数
 `script_pre_save()` を作成し、`jupyter_notebook_config.py` [^1] の `pre_save_hook` に設定した。

```Python:jupyter_notebook_config.py
import io
import os

def script_pre_save(model, path, contents_manager, **kwargs):
  # セルがあるページのみを対象とする
  if model['type'] != 'notebook':
    return
  if not 'content' in model or model['content'] == None:
    return
  if not 'cells' in model['content'] or model['content']['cells'] == None:
    return

  # 1行目が'##export'で始まるコードのみを対象とする
  exports = []
  for cell in model['content']['cells']:
    if cell['cell_type'] == 'code' and cell['source'][:8] == '##export':
      exports.append(cell['source'])
  if len(exports) == 0:
    return

  # ページ名からプログラムファイル名を作って、そこに書き込む
  base, ext = os.path.splitext(path)
  py_fname = base + '.py'
  contents_manager.log.info("Saving python code /%s", py_fname)
  with io.open(py_fname, 'wt', encoding='utf-8', newline='\n') as f:
    for code in exports:
      f.write(code)

c.FileContentsManager.pre_save_hook = script_pre_save
```

ファイルオープン時の例外処理とか、拡張子を '.py' 固定にしないとか、コードに変化が無かったら上書きしないとか、プログラムファイル名を指定できるようにするとか、いろいろサボっている。
Rails　Viエディタの基本操作

Rails Tutorialを進めて行く中で必要ではなかったけど少し手を出す機会があったので自分のメモ用に引用
なんのことなのかは今はまだわからない。



■viのモード
viには次の2つのモードがあります。
コマンドモード	vi起動時のモード。カーソル移動や文字削除を行う。
インサートモードからコマンドモードへは[Esc]キーで移行する。
インサートモード	文字を入力するモード。コマンドモードからは主に[i]キーで移行する。

■カーソル移動(コマンドモード)

●1文字単位の移動

複数文字分移動したい場合は、その文字数と移動方向キーを組み合わせます。

例えば、５文字分右に移動させたい場合は「5ｌ」と入力します。

ka-soru
●単語単位の移動

単語レベルでカーソル移動する場合は次のように入力します。

入力	説明
w/W	次の単語の先頭の文字へ移動
b/B	前の単語の先頭の文字へ移動
e/E	今の単語の最後の文字へ移動
●行の移動
行の先頭や末尾へのカーソル移動ができます。

入力	説明
0(数字のゼロ)	行の先頭へ移動
$	行の末尾へ移動
^	行頭が空白だった場合、その次の先頭文字へ移動
H	表示している画面の一番上の行の先頭へ移動
M	表示している画面の中央の行の先頭へ移動
L	表示している画面の一番下の行の先頭へ移動
スクリプトやプログラムをコンパイルしてエラーが出力された際、そのエラーの行番号がメッセージに表示される場合があります。その行へ一度に移動する場合は、コマンドラインモードで「:」の後に移動する行番号を入力することで移動します。（ex, 「:10」）

●インサートモードへの移行
コマンドモードからインサートモードへ移行するには次のコマンドがあります。

入力	説明
i	カーソル位置から文字が入力可能
a	カーソルの後から文字が入力可能
I	カーソルのある先頭行から文字が入力可能
A	カーソルのある末尾から文字が入力可能
o(小文字オー)	カーソルのある下の行に新しい行を追加して文字が入力可能
O(大文字オー)	カーソルのある上の行に新しい行を追加して文字が入力可能
■編集(コマンドモード)

●文字の削除

入力	説明
x	カーソルのある文字を削除
X	カーソルの前にある文字を削除
dw	カーソルのある単語を削除
dd	カーソルのある行を削除
D	カーソルのある文字から行末までを削除
u	アンドゥ(最後の行動の取り消し)
インサートモードで文字を削除する場合は、「Back space」や「d」キーを利用します。

●文字のコピーと貼り付け

入力	説明
yw	単語のコピー
yy	カーソルのある行のコピー
p	カーソルのあとに挿入
P	カーソルの前に挿入
■検索(コマンドモード)

テキストファイルを扱う場合、文字列を検索することが多くあります。

入力	説明
/  [検索したい文字列]	文字列パターンを下方向に検索
?	文字列パターンを上方向に検索
n	次候補を同じ方向(上へ下へ)で検索
N	次候補を逆方向で検索
■保存終了(インサートモード)

viで編集したファイルを保存して終了するには次のコマンドがあります。

入力	説明
:wq	保存して終了
:q!	保存せず終了
:w	保存(終了しない)
:e [ファイル名]	現在のファイルを終了して別ファイルを開く
複数のレイヤーを乱数で配置する（位置と回転）

# まえがき
背景に写真を散りばめたいと思いました。

##説明
選択（複数可能）したレイヤーの位置（X,Y）と回転Z軸に乱数で配置出来ます。
乱数の範囲はコンポジション（今回はフルHD）サイズ内で収まるように設定しています。
xは0～1920
yは0～1080
Z回転は-45～45
に設定しています。

沢山の写真を背景にしたい時等便利かなーと思います。
本当は３Dレイヤーか判定して分けてやったほうがいいかなと思いますが、時間がある時修正します。

###ソース


```js
var myWin= new Window("palette","位置＆Z回転乱数セット");
var btn=myWin.add("button",undefined,"作成");


btn.onClick=function(){

var selNum=app.project.activeItem.selectedLayers.length;


app.beginUndoGroup("乱数");

for (var i=0; i<selNum; i++){
var myComp=app.project.activeItem;


var xMin=0;
var  xMax=myComp.width;
var x = Math.floor( Math.random() * (xMax + 1 - xMin) ) + xMin ;

var yMin=0;
var  yMax=myComp.height;
var y = Math.floor( Math.random() * (yMax + 1 - yMin) ) + yMin ;

var rMin=-45;
var  rMax=45;
var r = Math.floor( Math.random() * (rMax + 1 - rMin) ) + rMin ;    
    
    
var ind=app.project.activeItem.selectedLayers[i].index;
var setP=app.project.activeItem.layer(ind).property("ADBE Transform Group").property("ADBE Position").setValue([x,y]);
var setR=app.project.activeItem.layer(ind).property("ADBE Transform Group").property("ADBE Rotate Z").setValue([r]);
}

app.endUndoGroup();


}
myWin.show();

```

![キャプチャ.JPG](https://qiita-image-store.s3.amazonaws.com/0/178061/e6f54546-a22c-c770-b07a-673af7a7d859.jpeg)
Angular tips(1)

# Angular 復習(Angular4～)

## Directive

`*ngIf`や`*ngFor`のことを`構造ディレクティブ`と呼び、ngModelなどのDOMの属性を変更するものを、`属性ディレクティブ`と呼ぶ。

### 1. 構造ディレクティブ

構造ディレクティブとは、HTMLのレイアウトを扱えるものです。
DOMのストラクチャの追加や、削除、要素の操作を可能としている。
他のディレクティブと同様に、対象要素に構造ディレクティブを適用する。


* *ngIf

heroが存在すれば(true)表示し、存在しなければ表示しない。

```
<div *ngIf="hero" >{{hero.name}}</div>
```

* *ngFor

配列heros分だけ繰り返して、heroの値を表示する。(foreach的な)

```
<ul>
  <li *ngFor="let hero of heroes">{{hero.name}}</li>
</ul>
```

* *ngSwitch

heroオブジェクトのemotionの値に対して、表示するコンポーネントを切り替える。

```
<div [ngSwitch]="hero?.emotion">
  <happy-hero    *ngSwitchCase="'happy'"    [hero]="hero"></happy-hero>
  <sad-hero      *ngSwitchCase="'sad'"      [hero]="hero"></sad-hero>
  <confused-hero *ngSwitchCase="'confused'" [hero]="hero"></confused-hero>
  <unknown-hero  *ngSwitchDefault           [hero]="hero"></unknown-hero>
</div>
```


### 2. 属性ディレクティブ

属性ディレクティブとは、DOM要素の見た目や挙動を変えるものです。作成することもできますが、ここでは割愛します。

* ngClass

CSSクラスの追加、削除を行う。
```
[ngclass]="{'クラス名': (true|false)}"
```
上記の形式で要素に適用する。カンマで区切って、複数指定することが可。
true、falseはオブジェクトの戻り値(xxxx.method())で判定することも可。

```
[ngclass]="{'クラス1': (true|false),'クラス2': (true|false)}"
```

```
<div [ngClass]="{'active': isActive, 'disabled': isDisabled}">
```
Ruby on Railsでメッセンジャーライクな簡易2chビューアを作成してみる Part2

[前回](https://qiita.com/_hrk_o/items/30b503bc3dfb031b1564)の続きです。
前回は2ch.scのスレッドをスクレイピングして取得して表示する所までやりました。
今回は1つの板のスレッド一覧を取得して表示し、その板全体のスレッドをそれぞれ表示させられるようにしたいと思います！:D

## 環境
以前と同じです。

macOS Sierra 10.12.6
Visual Studio Code 1.16.0

Ruby on Rails 5.0.6
Ruby 2.3.1
rbenv 1.1.1-2-g615f844
MySQL 5.7.17

## 板のコントローラ・ビューを作成
`$ rails g controller subbacks index`

http://localhost:3000/subbacks/index
に接続してみると、ビューファイルが作成されていることが確認できる。

## ルーティングを編集
```ruby:routes.rb
Rails.application.routes.draw do
  get 'subbacks/:subback_id' => 'subbacks#index'
  get 'threads/:subback_id/:thread_id' => 'threads#index'
end
```
`subbacks/params[:subback_id]`で任意の板のスレッド一覧を、
`threads/:subback_id/:thread_id`で任意の板の任意のスレッドを表示します。

## 板のコントローラを編集
```ruby:subbacks_controller.rb
class SubbacksController < ApplicationController
  def index
    agent = Mechanize.new
    url = get_url
    page = agent.get(url)
    html = Nokogiri::HTML(page.body)
    @subback_title = html.css('head title').text.sub('＠2ch掲示板＃スレッド一覧', '');
    @threads = []
    is_removed_guide = false
    html.css('small#trad a').each do |thread_title|
      if thread_title.attribute('class').try(:value) == 'sc' && !is_removed_guide
        is_removed_guide = true
        next
      end
      thread_title['href'] = thread_title.attribute('href').try(:value).sub(/l50/, '').insert(0, '/threads/anime2/')
      title = thread_title.to_html.sub(/\d{1,3}: ?/, '')
      thread = {title: title}
      @threads << thread
    end
  end

  def get_url
    url = 'http://ikura.2ch.sc/' + params[:subback_id] + '/subback.html'
  end
end
```
Mechanizeでスレッド一覧を取得して、板名から`＠2ch掲示板＃スレッド一覧`を取り除いた文字列を@subback_titleに代入し、配列@threadsには取得したスレッドタイトルをhtml形式(リンク付き)で格納します。
また、スレッド番号(1: など)は削除しています。
スレッドリンクは、末尾の`/l50`を取り除いて、スレッド全体を開けるようにしました。

## スレッドのパーシャルを作成
```haml:_thread.html.haml
.thread
  .thread-title
    = simple_format(thread[:title])
```

## 板のビューを編集
```haml:index.html.haml
.subback-header
  %span
    = @subback_title
.thread-box
  - @threads.each do |thread|
    = render 'thread', thread: thread
```

## 板のcssを整える
```scss:subbacks.scss
.subback-header {
  height: 2rem;
  background-color: #777;
  color: #FFF;
  text-align: center;
  line-height: 35px;
  font-weight: bold;
  a {
    font-size: 17px;
  }
}

.thread-box {
  margin: 10px 30px 0;
  padding-bottom: 20px;
  a {
    color: #FFF;
    text-decoration: none;
    &:hover{
      color: #CCC;
    }
  }
}

@media screen and (max-width:1024px){
  .subback-header {
    font-size: 13px;
  }
  .thread-box {
    font-size: 12px;
    margin: 0 3px;
    padding-bottom: 0;
  }
}
```
ここまでで特定の板からスレッド一覧を取得するところと、その板のスレッドを開くところまでは完成です！:D
次回は板一覧を取得してトップページに表示させようと思います。

## PC版
<img width="851" alt="スクリーンショット 2017-10-11 14.19.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/151736/c3a0914c-dc1f-aa87-c4e1-fb5b8eb079bf.png">

## スマホ版
<img width="322" alt="スクリーンショット 2017-10-11 14.19.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/151736/4991b83a-b394-a1b8-61f7-67a16910708c.png">
VMware vSphare5.5.0でWindowsコンテナを動かすまでの手順とできないこと

Windows Server 2016をVMware vSphare5.5.0上の仮想マシンに入れてWindowsコンテナを動かそうとして躓きました。結果として仮想化のネストの許可が必要ということとHyper-V ContainersはvSphare5.5では動かずVMware vSphare6.0以上が必要であることが分かりましたのでそのまとめです。


# 必要要件

要件は[ここ(Deploy Windows Container)](https://docs.microsoft.com/ja-jp/virtualization/windowscontainers/deploy-containers/system-requirements)に書いてあります。

- 4GB以上のメモリ
- Windows Server 2016, or Windows 10 on the host system, and Windows Server (Full, Core) or Nano Server
- Intel VT-x が有効なプロセッサ
- CPUが2コア以上

となってますが、メモリ、コア数は多少足りなくてもとりあえずは動きました。一方Intel VT-xはHyper-V Containersを使わない場合でも必須でした。

# Windowsコンテナを動かすまで
ということで、Intel VT-xの有効化、つまり仮想化のネストの許可を行っていきます。今回、仮想マシンの作成はvSphare web clientを使用します。（普通のclientから設定できなかった）


まずは空の仮想マシンを作成してください。

次に仮想マシンの仮想マシンハードウェアバージョンをアップグレードします。手順は[VMware Docsのここ](https://docs.vmware.com/jp/VMware-vSphere/5.5/com.vmware.vsphere.vm_admin.doc/GUID-60768C2F-72E1-42E0-8A17-CA76849F2950.html)です。これを行うとvSphare5.5の場合バージョンは10になります。


最後に作成した仮想マシンの仮想化のネストの有効化を行います。手順は[VMware Docsのここ](https://docs.vmware.com/jp/VMware-vSphere/5.5/com.vmware.vsphere.vm_admin.doc/GUID-2A98801C-68E8-47AF-99ED-00C63E4857F6.html)になります。

以上で終了です。後は普通にWindows Server 2016をインストールして、[クイックスタート](https://docs.microsoft.com/ja-jp/virtualization/windowscontainers/quick-start/quick-start-windows-server)に従ってDockerをインストールすれば使えます。

# できないこと
vSphare5.5ではHyper-V Containersが使えません。これは仮想マシンのWindows Server 2016の中でHyper-Vの起動ができないからです。
実際にやってみると「役割と機能の追加」からHyper-Vのインストールは成功します。しかしイベントを確認すると

- Hypervisor launch failed; Processor does not support the minimum features required to run the hypervisor 

というようなエラーが発生して起動できていないことが分かります。

調べてみると[こちら](https://kb.vmware.com/selfservice/microsites/search.do?language=en_US&cmd=displayKC&externalId=2132789)のような話が見つかり、Windows2016のHyper-vを使用するためには仮想マシンハードウェアバージョンが**11**以上が必要でvSphare5.5では10までしか上がらないので使用できないということが分かります。
SmartGit > Commit画面 > NameをCtrl+cできる

```txt:動作環境
Windows 7 Pro (32bit)
SmartGit Version 17.0.4 #10132
SmartGit付属のMinwGW32
grep (GNU grep) 2.24
```

コミットメッセージの作成時、主な変更をしたファイル名と変更内容を記載している。
こうすることで、コミットメッセージ一覧参照時に何をどう変更したかが分かりやすい。

Commit画面においてName, Directory等の表示がある。
選択状態でCtrl+cすることで、以下のようなテキストが取れるようだ。

```
true XXXControlUnit.cpp .
```
VScodeアイコンの変化

いつでも過去のアイコンと比較できるように･･･（笑

![icon.PNG](https://qiita-image-store.s3.amazonaws.com/0/200222/f16c05f4-6212-e9e7-2890-72df6461e77d.png)


いろいろ賛否があると思いますが、私は新しいオレンジアイコンのほうが好きです

### 2017/10/27 追記

どうやら、青に戻るみたいですｗ
GIGAZINの記事ですが、こんな経緯があったみたいですね。

https://gigazine.net/news/20171026-icon-journey/

本文抄訳を書いている方もおりました
https://qiita.com/EbXpJ6bp/items/b912f78c92a1ec15b9c9

ただ、左が空いている、フラット目のデザインはやはりよいと思います。
色としてオレンジが好きだっただけに残念。愛用エディターが好きな色だとテンションもあがるものです。

### 2017/11/9　追記
ついに青くなったアイコン！
![VS.PNG](https://qiita-image-store.s3.amazonaws.com/0/200222/989f6e52-bc58-837e-9fd8-daabf50b0971.png)

▼before after 

![vscodeee.PNG](https://qiita-image-store.s3.amazonaws.com/0/200222/3e817529-198b-8509-3597-0b34b51b5171.png)


1.18では、デバッグコンソールや統合ターミナルを右端に表示できるようなアップデートもきましたね。
これは期待していただけにうれしいです。こういう使い方したいときもあったので！

もうしばらくないと思いますが、またアイコン変わったらここに蓄積していきます･･･！
Hyper-V上のUbuntuでCUDAを導入する Windows 10ではだめでした。。。

前回の[Hyper-V上のUbuntuでCUDAを導入する 準備編](https://qiita.com/Masutani/items/5e49388e9696436987c2)で、Hyper-V上でCUDAをGPUパススルーを用いて実現しようとしたのですが、そもそも仕様でそんなことはできないことが判明しました。

こちらの[本家ページ Which graphics virtualization technology is right for you?](https://docs.microsoft.com/en-us/windows-server/remote/remote-desktop-services/rds-graphics-virtualization)にあるように、DDAという最新機構をもったものがGPUパススルーであり、CUDAを利用するための要件になっているようである。


## 何が問題か？

勘違いしていた点をまとめておきます。

* RemoteFXはGPU仮想化の一種ではあるが、純然たるパススルーではなく、ハイパバイザが翻訳するタイプのものらしい。
* この場合、ドライバもネイティブのものではなくRemoteFXドライバというものをゲストOSに入れる。
* RemoteFXで対応できるのは、DX11.1, OpenGL4.4, OpenCL1.1まで。なのでGPGPUができないわけではない。
* それとは別にいわゆるGPUパススルーである、DDAというのが新しいHyper-V に入り、それならCUDAを含めたネイティブのGPUドライバが使える。
* DDAは現状Windows Server 2016にのみ入っている。ServerとClientOSの違い上の問題で、Windows 10に入れるのは難しい模様。

大体対応表は以下のようになります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/146939/1043d219-bfd6-9be7-1369-3c1b05a8aecb.png)

IOMMUなどの要件はDDA用のものでした。

## RemoteFXとDDAの関係

上記資料にある通りですが、わかりやすく書くと、以下のようなイメージのようです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/146939/cd624903-4f01-5fe5-95df-8da677ffd0a9.png)

以下のようにGPU利用のシナリオを考えると、上からDDA、RemoteFX、WARP(ソフトウェアエミュレーション）が担当するということのようです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/146939/c7edb6ad-2e0b-7f15-bdcf-4f3a952ca436.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/146939/b9b8a2a3-86fc-22bd-5b14-3a7e32f697ae.png)

他のハイパバイザならWindows10でパススルーに対応しているようなので、そちらを試してみたいと思います。
フォルダの画像枚数をそろえる為の一斉コピー

実験で取得した画像をCNNに入れる為に、全ての実験フォルダの画像の枚数をそろえる必要があり、
各フォルダの一番最後の画像をコピーしてそれぞれ必要な枚数付け足す、ということをしました。
その覚え書きです。

画像が入ったディレクトリは名前に全て「Motion」が付いているものとします。
各画像名は000.png,001.pngのように三ケタの連番になっているものとします。
このプログラムを同じディレクトリに入れ、TARGETに必要な枚数入れれば実行できます。

-要点
```os.getcwd()```: カレントディレクトリの取得
```os.listdir(ABC)```:ディレクトリABC内のフォルダとファイルの一覧を取得 
```re.search('abc',file)```:フォルダに[abc]が入っているか検証
```os.chdir(DEF)```:ディレクトリDEFに移動 
```copy_im=GHI.copy()```:画像GHIをコピー

```
draw=ImageDraw.Draw(copy_im)
copy_im.save("%03d.png" % (i+count+1),quality=100)
```
 :画像を張り付けし保存。（名前は続きの番号になるようにしてあります。）



-プログラム全文

```py:arrange_pic.py
from PIL import Image
from PIL import ImageFont,ImageDraw
import os
import re

TARGET=230 #put the number you want 

#get the path of current directry
dir=os.getcwd() 

#loop for the number of Motion file
files=os.listdir(dir)
for file in files:
	index=re.search('Motion',file) 
	if index:
		os.chdir(dir+"/"+file)	
		under_files=os.listdir(dir+"/"+file)
		print (dir+"/"+file)
		#count the number of pictures
		count=0
		for file in under_files:
			under_index=re.search('.png',file) 
			if under_index:
				count=count+1
		#copy the last picture
		print count
		im=Image.open("%03d.png" % count)
		for i in range(TARGET-count):
			copy_im=im.copy()
			draw=ImageDraw.Draw(copy_im)
			copy_im.save("%03d.png" % (i+count+1),quality=100)
```
PowerShellでアクティブウィンドウをキャプチャ

#Powershellでアクティブウィンドウをキャプチャ
あるプログラムで繰り返しのテストを行っていたのですが、
自動化をするにあたってPowerShellを利用しました。
その際にキャプチャのやり方が分かったので載せておきます。
##コード
例としてメモ帳をキャプチャします。

```powershell:capture_note.ps1
#キャプチャ関数
function Get-ScreenCapture($name)
{   
    begin {
        Add-Type -AssemblyName System.Drawing, System.Windows.Forms
        $jpegCodec = [Drawing.Imaging.ImageCodecInfo]::GetImageEncoders() | 
            Where-Object { $_.FormatDescription -eq "JPEG" }
    }
    process {
        Start-Sleep -Milliseconds 250
        
        #Alt+PrintScreenを送信
        [Windows.Forms.Sendkeys]::SendWait("%{PrtSc}")        
        
        Start-Sleep -Milliseconds 250
        
        #クリップボードから画像をコピー
        $bitmap = [Windows.Forms.Clipboard]::GetImage()    
        
        #画像保存(名前がかぶらないようにしている)
        $ep = New-Object Drawing.Imaging.EncoderParameters  
        $ep.Param[0] = New-Object Drawing.Imaging.EncoderParameter ([System.Drawing.Imaging.Encoder]::Quality, [long]100)
        $screenCapturePathBase = "$env:USERPROFILE\Desktop\${name}"
        $c = 0
        while (Test-Path "${screenCapturePathBase}_${c}.jpg") {
            $c++
        }
        $bitmap.Save("${screenCapturePathBase}_${c}.jpg", $jpegCodec, $ep)
    }
}

#例としてメモ帳起動
notepad

#起動完了まで待つ
Start-Sleep -Milliseconds 500

#とりあえずtestを送信
#$retは使用していないがMarkdownでうまく表示されないため追加
$ret = [Windows.Forms.Sendkeys]::SendWait("test")


#キャプチャ
Get-ScreenCapture test

#メモ帳終了
$ret = [System.Windows.Forms.SendKeys]::SendWait("%{F4}")
Start-Sleep -Milliseconds 500
$ret = [System.Windows.Forms.SendKeys]::SendWait("{TAB}")
start-sleep -Milliseconds 500
$ret = [System.Windows.Forms.SendKeys]::SendWait("{ENTER}")
```
##実行結果
スクリプトを実行します。
```
 .\capture_note.ps1
```
次の画像が無事にキャプチャされました。
![test_0.jpg](https://qiita-image-store.s3.amazonaws.com/0/140055/09b7ff82-1078-885a-6609-e5e81a19a429.jpeg)
しょうもないですが、何かと組み合わせたりすると役に立つかもしれません。
vaffleでEXCELファイルをEXCELで開きたかったからvimrcに設定書いた

Windows ユーザーです。EXCELとか開くことが多いです。
昔は、vimfiler 使ってました。vaffle に乗り換えました。
x 押しても外部プログラム実行できないのつらい。
なのでちょっとしたスクリプト書いた。

```Vim
autocmd FileType vaffle nmap <buffer> x :call ExecuteFileByVaffle()<CR>

function! ExecuteFileByVaffle()
    execute "normal v$h\"ay"
    execute "!start " . vaffle#buffer#extract_path_from_bufname(expand('%:p')) . '\' . substitute(@a, '^ \+', '', '')
endfunction
```

今カーソルのある位置のファイル名を取得して、単純に`!start`コマンドで実行してるだけ。

詰まった点としては、特定のFileTypeタイプでマッピングする方法が分からずあせった（通常のファイル編集で`x`押したら`ExecuteFileByVaffle()`が呼ばれたので)のと。ヤンクした文字列をどうやって`!start`コマンドの引数にするのかで悩んだってところあたり。`@a`がaレジスタに格納されている値を取り出せる魔法の文字列。その前の`vaffle#buffer#extract_path_from_bufname(expand('%:p'))`は現在開いているvaffleのディレクトリの絶対パス名を取るためのおまじない。で、今のところはこれで何とかなりそうかなって思う。
[JAWS-UG CLI] Alexa Skills Kit Command Line Interface (ASK CLI)のセットアップ

Alexa Skills Kit Command Line Interface (ASK CLI)をセットアップします。

オリジナル手順:https://developer.amazon.com/ja/docs/smapi/quick-start-alexa-skills-kit-command-line-interface.html#step-2-install-and-initialize-ask-cli

# 前提条件

- Amazon Developerアカウントを有していること。

 - https://developer.amazon.com/



# 1. nodeのインストール (nodebrewを使う場合)

```bash:コマンド:
curl -L git.io/nodebrew | perl - setup
```

```text:結果:
Fetching nodebrew...
Installed nodebrew in $HOME/.nodebrew

========================================
Export a path to nodebrew:

export PATH=$HOME/.nodebrew/current/bin:$PATH
========================================
```

~/.bashrcにPATHを追記します。

```bash:.bashrcに追記:
echo 'export PATH=$HOME/.nodebrew/current/bin:$PATH' >> ~/.bashrc
```

```bash:コマンド:
. ~/.bashrc 
```

```bash:コマンド:
which nodebrew
```

```text:結果(例):
/Users/taro/.nodebrew/current/bin/nodebrew
```

nodeをバイナリでインストールします。(v6.10.0の例)

```bash:コマンド:
nodebrew install-binary v6.10.0
```

```bash:コマンド:
nodebrew use v6.10.0
node -v
```

```text:結果(例):
v6.10.0
```

自動的にnpmもインストールされているはずです。

```bash:コマンド:
which npm
```

```text:結果(例):
/Users/taro/.nodebrew/current/bin/npm
```

```bash:コマンド:
npm -v
```

```text:結果(例):
3.10.10
```

# 2. ASK CLIのインストール


```bash:コマンド:
npm install -g ask-cli
```


```bash:コマンド:
which ask
```

```text:結果(例):
<HOMEディレクトリ>/.nodebrew/current/bin/ask
```


# 3. ASKの初期化


```bash:コマンド:
ask init --no-browser
```

```text:出力
There is no AWS credentials setup yet, do you want to continue the initialization? (Default: False)
```

```text:入力
Y
```

```text:出力
Paste the following url to your browser:
<URL>

? Please enter your Authorization Code:
```

- <URL>をコピーしてブラウザのURL欄に貼り付けます。
- "OK"(ボタン)をクリックします。
- Authorization Codeが表示されるので、黒い枠の中のテキストをコピーします。
- 上記でターミナルに表示されている"Please enter your Authorization Code:"の後ろにペーストし、エンターキーを押します。

```text:出力
Tokens fetched and recorded in ask-cli config.
Vendor ID set as XXXXXXXXXXXX

Profile [default] initialized successfully.
```


# 4. 事後確認

```bash:コマンド
ask init -l
```

```text:結果(例):
Profile              Associated AWS Profile
  [default]                 <プロファイル名>
```

~/.ask/cli_configに認証情報が保存されています。

# 完了
aws ecr get-loginでunknown shorthand flag : 'e'

## aws ecr get-loginでエラーが返ってくる

```
$ aws ecr get-login | bash
unknown shorthand flag: 'e' in -e
See 'docker login --help'.
```

dockerのバージョンによっては `aws ecr get-login | bash` でエラーが発生するようです。

```
$ docker -v
Docker version 17.09.0-ce, build afdb6d4
```

## 解決法
`--no-include-email` を使う。

```
$ aws ecr get-login --no-include-email | bash
```


## 参考
- http://docs.aws.amazon.com/cli/latest/reference/ecr/get-login.html
- https://github.com/moby/moby/issues/23390
- https://qiita.com/Mic-U/items/7854f298003f20ab2794
usingをnamespaceの内側と外側に書いた際の違い

usingを使用する時にnamespaceの内側と外側に書いた際の違いが分からなかったので調べてみました。

# 結論
検索の順序が変わる
内側から順に検索されて該当箇所が発見された時点で検索終了

# 検証
参考ページにある処理を試してみました。
まずは**namespace Test**の中に**Mathクラス**を作成
<img width="415" alt="スクリーンショット 2017-10-11 10.09.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/201662/6a9d5de9-ecd0-a716-9456-b661f93894b5.png">

次にusing Systemをnamespaceの内側、外側にそれぞれ記載。
**Mathクラス**を呼び出して動作を確認してみます。

**内側に記載**
<img width="699" alt="スクリーンショット 2017-10-11 10.11.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/201662/f92e9acb-30ab-ed0e-1b0d-8757b924a63c.png">

**外側に記載**
<img width="672" alt="スクリーンショット 2017-10-11 10.11.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/201662/b4a2d758-b56c-5241-9987-56d3dae3b94b.png">

結果はnamespaceの外側にusing Systemを記載すると、自作した**Mathクラス**が先に検索されて呼び出されました。

# 検索順序
こちらも参考ページより抜粋した処理となります。
検索順序は以下のようになるようです。

```csharp:Test.cs
using System;
using System.Collections.Generic;
using System.Linq;
//using MyCorp.TheProduct;  <-- uncommenting this would change nothing
using MyCorp.TheProduct.OtherModule;
using MyCorp.TheProduct.OtherModule.Integration;
using ThirdParty;

namespace MyCorp.TheProduct.SomeModule.Utilities
{
    class C
    {
        Ambiguous a;
    }
}
```

1. クラスCの内部
2. 名前空間の型 MyCorp.TheProduct.SomeModule.Utilities
3. 名前空間の型 MyCorp.TheProduct.SomeModule
4. 名前空間の型 MyCorp.TheProduct
5. 名前空間の型 MyCorp
6. グローバル名前空間
7. using系

# 参考ページ
[stackoverflow](https://stackoverflow.com/questions/125319/should-using-statements-be-inside-or-outside-the-namespace)
Rails5でGoogleMapを表示


以外にハマったので備忘録
google mapのapiの仕様が変わって昔の記事を参考にするとダメみたい

## googleからAPIキーを取得

Google Maps JavaScript APIを使うためにはAPIキーが必要です。

下記URLにGoogleアカウントでログインして次の手順でAPIキーを取得してください。手順に従うだけです。

https://console.developers.google.com/?hl=ja

## プロジェクトを作成

`rails new google_map -d mysql`

## geocoderを追加

住所から経度、緯度を取得してくれるいいやつ

```Gemfile
gem 'geocoder'
```

`bundle install`

## scaffoldでいろいろ作成

`rails g scaffold map address:string latitude:float longitude:float
`

## DBを作成する

`rails db:create`

`rails db:migrate`

## Viewを弄る

formで緯度、経度を直接操作できないように修正

```form.html.erb
<%= form_for(map) do |f| %>
  <% if map.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(map.errors.count, "error") %> prohibited this map from being saved:</h2>

      <ul>
      <% map.errors.full_messages.each do |message| %>
        <li><%= message %></li>
      <% end %>
      </ul>
    </div>
  <% end %>

  <div class="field">
    <%= f.label :address %>
    <%= f.text_field :address %>
  </div>

  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>
```

GoogleMapを表示するscriptとstyleとviewを設定

```show.html.erb
<script type="text/javascript">
    function initMap() {

        var test ={lat: <%= @latitude %>, lng: <%= @longitude %>};
        var map = new google.maps.Map(document.getElementById('map'), {
            zoom: 15,
            center: test
        });
        var transitLayer = new google.maps.TransitLayer();
        transitLayer.setMap(map);

        var contentString = '住所：<%= @address %>';
        var infowindow = new google.maps.InfoWindow({
            content: contentString
        });

        var marker = new google.maps.Marker({
            position:test,
            map: map,
            title: contentString
        });

        marker.addListener('click', function() {
            infowindow.open(map, marker);
        });
    }
</script>
<script async defer
        src="https://maps.googleapis.com/maps/api/js?v=3.exp&key=[googleで取得したAPIキー]&callback=initMap">
</script>

<p id="notice"><%= notice %></p>

<p>
  <strong>Address:</strong>
  <%= @map.address %>
</p>

<p>
  <strong>Latitude:</strong>
  <%= @map.latitude %>
</p>

<p>
  <strong>Longitude:</strong>
  <%= @map.longitude %>
</p>

<style type="text/css">
  #map { height: 400px;
    margin-left:auto;
    margin-right:auto;
    text-align:left;
    width: 80%;}
</style>
<div id="map"></div>

<%= link_to 'Edit', edit_map_path(@map) %> |
<%= link_to 'Back', maps_path %>

```

## サーバー起動してテスト

1. `rails s`
2. `http://localhost:3000/maps` 画面で `New Map`
3. `address` に適当な住所を入力して `Create Map`

![Kobito.g3WPui.png](https://qiita-image-store.s3.amazonaws.com/0/136533/0e5739f4-2255-525b-94c7-b484a48ed948.png "Kobito.g3WPui.png")

ほいでけた！
ファイル名つきのcat

複数の短いファイルを見るとき、lessでは一度に見られないし、catではどれがどのファイルかわかりにくい、と思い、ファイルの内容をファイル名つきで出力するスクリプトを書きました。

```bash:showfile
#!/bin/sh
while [ "$#" -gt 0 ]; do
    if [ ! -e "$1" ]; then
        echo "$1: no such file or directory" 1>&2
        exit 1
    fi
    echo "$1:"
    cat "$1"
    shift
    [ "$#" -gt 0 ] && echo
done
```

で、せっかくなのでファイル名は色付きで表示するオプションもつけてみたのですが、ちょっとオプション解析で長くなりすぎたので、Rubyで同等のものを書いたらかなり短くなりました。
コードはGistにあります。
https://gist.github.com/takara7/d86d7bc06dad8d7d75dbbb9b50cbc950
bash版はbash 3.2.57および4.3.48で、Ruby版は1.8.7、2.3、2.4で動作確認しています。
Android で ビルド失敗するとき

# ライセンスへの同意が完了していない場合の対処

ビルド時にライセンスへの同意が完了していないと怒られた場合に、CLI上で解決する方法。


## 問題

下記コマンドを実行した際に失敗した。

````
react-native run-android
```

### エラー内容
```
FAILURE: Build failed with an exception.                                                            
                                                                                                    
* What went wrong:                                                                                  
A problem occurred configuring project ':app'.                                                      
> Could not resolve all dependencies for configuration ':app:_debugApk'.                            
   > A problem occurred configuring project 'XXXXX'.                            
      > You have not accepted the license agreements of the following SDK components:               
        [Android SDK Build-Tools 25.0.2].                                                           
        Before building your project, you need to accept the license agreements and complete the installation of the missing components using the Android Studio SDK Manager.                           
        Alternatively, to learn how to transfer the license agreements from one workstation to another, go to http://d.android.com/r/studio-ui/export-licenses.html
```

## 対応

下記コマンドで、OK

```
sdkmanager --license
```

あとは、表示されるメッセージに従う

### help の内容

```
sdkmanager --licenses [<common args>]

With --licenses, show and offer the option to accept licenses for all
     available packages that have not already been accepted.
```
Kubernetesというコンテナ・オーケストレーション・プラットフォーム

[Kubernetes](https://kubernetes.io)（ギリシア語：κυβερνήτης。読み方：クベルネーテス。意味：按針、船長、知事。）はコンテナアプリのデプロイとスケーリングの自動化に対するプラットフォームだ。もともとGoogleに実装されて2015年Apache License 2.0でオープンソースとして公開された。

Kubernetesと同じようなプラットフォームは[Amazon ECS](https://aws.amazon.com/jp/ecs)やDocker Inc.の[Swarm](https://docs.docker.com/docker-cloud/cloud-swarm/using-swarm-mode)（スウォーム）がある。

## なぜKubernetes？

DockerはKubernetes, ECSなどのプラットフォームを利用せずにも使える。しかし、コンテナアプリは増えたら、多くのコンテナの管理に適当なツールがないと困るだろう。CLIツールは当たり前だが多くのコンテナのクラウドの管理にGUIも必要だろう。

## Kubernetesのきっかけ

先週は初めてのDockerとECSを利用するプロジェクトをリリースして、ベンダーロックインも避けるためにECS以外のDockerプラットフォームも調べたほうがいいと思った。Twitterも多くの記事でもKubernetesというものは人気そうでいったいどんなものかを調べることにした。

## アーキテクチャ

![kub.png](https://qiita-image-store.s3.amazonaws.com/0/196208/96a155ff-edb4-0f62-e5b0-1efe896773bc.png)

### 主な要素

- [Node](https://kubernetes.io/docs/concepts/architecture/nodes)（ノード）
  - コンテナを運用できるマシン（物理、仮想）
  - 全ノードにインストールされる[Kubelet](https://kubernetes.io/docs/admin/kubelet)というサービスがノードとポッドの管理APIを提供する
- [Pod](https://kubernetes.io/docs/concepts/workloads/pods/pod-overview)（ポッド）
  - 1~nのコンテナの集まり
  - 一つのコンテナは一つのマイクロサービスだ（MySQL、Apache、とか）
  - ポッドのコンテナは同じ物理マシン、IPアドレス、などのリソースを共有する
- [Service](https://kubernetes.io/docs/concepts/services-networking/service)（サービス）
  - 1~nのポッドの集まり
- [Volume](https://kubernetes.io/docs/concepts/storage/volumes)（ボリューム）
  - ポッドのライフサイクルと一緒（コンテナが消されてものボリュームが残る、ポッドが消されたらボリュームも消される）
  - ポッドのコンテナはボリュームを共有する
- [Namespace](https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces)（ネームスペース）
  - 同じ物理クラスターの中の仮想クラスター
  - プロジェクトとチームが多い環境に向けているリソースアロケーション方法

## ほかのプラットフォームとの比較

|  | Kubernetes | ECS | Docker Cloud Swarm |
|---|---|---|---|
| スポンサー | Google, RedHat, Microsoft, IBM | Amazon | Docker Inc. |
| クラウド対応 | [GKE](https://cloud.google.com/container-engine)（Google）, [Azure](https://docs.microsoft.com/ja-jp/azure/container-service/kubernetes)（Microsoft）, [OpenShift](https://www.openshift.com/container-platform/kubernetes.html)（RedHat）, [Bluemix](https://www.ibm.com/cloud-computing/bluemix/containers)（IBM）, [などなど](https://kubernetes.io/docs/setup/pick-right-solution) | AWS | Docker Cloud |
| スケーリング単位 | ポッド | タスク | タスク |
| デプロイ単位 | サービス | サービス | サービス |
| 機能（特にGUI） | かなり多い | 普通 | 少ない、まだbeta... |
| 設置 | クラウドによって異なる、複雑（カスタマイズ性高いから） | 普通 | 簡単 |

## Kubernetesの印象

確かにでかいプラットフォームだ。KubernetesではECSのようなサービスを自分のサーバ環境に設置できそうだ。要素、ツール、用語などについて勉強することはまだ多い。Kubernetesのツールはまだあまり触っていないので使いやすいか、実際にどれぐらい便利か、とかの判断はまだできない。ローカル環境の設置とアプリのデプロイのサンプルは次の記事までお待ちください。
CakePHPのsaveメソッドがupdateにならない場合

1.更新するテーブルのプライマリキーがセットされているか確認する。

```php
$this->MODEL_NAME->id = $primary_id;
```
2.実行されたSQLログを取得する。

```php
try {
    $result = $this->MODEL_NAME->save($data);
} catch (PDOException $e) {
    $this->log('DBerror:' . $e->getMessage(), LOG_DEBUG);
}

$this->log($this->MODEL_NAME->getDataSource()->getLog(), LOG_DEBUG);
```

$this->logで `/app/tmp/logs/debug.log` にログが書き出される。
書き出されない場合は、core.phpのdebug設定が2になっているか確認。

```app/config/core.php
/**
 * CakePHP Debug Level:
 *
 * Production Mode:
 * 	0: No error messages, errors, or warnings shown. Flash messages redirect.
 *
 * Development Mode:
 * 	1: Errors and warnings shown, model caches refreshed, flash messages halted.
 * 	2: As in 1, but also with full debug messages and SQL output.
 *
 * In production mode, flash messages redirect after a time interval.
 * In development mode, you need to click the flash message to continue.
 */
	Configure::write('debug', 2);
```

3.モデル内で、function exists(){}がオーバーライドされていないか確認する。
通常は、継承元のAppModelの中にあるexists(){}でプライマリキーを条件にしたSELECT文が作成される。
しかし、下記のようなプライマリキー以外の条件を追加したコードが継承したモデル内にあると、SELECT文の条件が変わってしまい別レコードとして処理されてしまう。

```php
public function exists($id = null)
{
    if ($id === false) {
        return false;
    }

    return (bool)$this->find('count', array(
        'conditions' => array(
            $this->alias . '.' . $this->primaryKey => $id,
            $this->alias . '.public_flag' => 1
        ),
        'recursive' => -1,
        'callbacks' => false
    ));
}
```
Databinding を使っていて、うまくいかないときに確認すること

何度か binding ファイルが自動生成されなくてハマることがあったのでメモ

## 生成されるファイル名を勘違いしている
```java
MainActivityBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
```
上のコードはコンパイルエラーになる。Activity の名前は MainActivity だが、Databinding はレイアウトファイルの名前に従って生成されるので、生成されるクラスの名前はActivityMainBinding という名前になる。 MainActivityBinding と勘違いして結構ハマった。

## layout タグで囲ったのに自動生成してくれない
こんな感じで layout タグで囲ったのに自動生成されない

```xml
<layout>
    <TextView
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/my_text_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Title" />
</layout>
```
これは xmlns:android 記述箇所が TextView になってしまっているのが、原因。これをちゃんと正しい場所に配置すると自動生成してくれる

```xml
<layout xmlns:android="http://schemas.android.com/apk/res/android">
    <TextView
        android:id="@+id/my_text_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Title" />
</layout>
```
こんな感じ。

## id 対応する View を作ってくれない
```xml
<layout xmlns:android="http://schemas.android.com/apk/res/android">
    <TextView
        android:id="@id/my_text_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Title" />
</layout>
```
binding.myTextView が自動的に生成されるはずなのになぜかない。これは id の指定方法が間違っているのが原因。正確には @+id/my_text_view とする必要がある。findViewById の場合は + がついてなくても動くが DataBinding ではだめなようだ。

以下のように @+id の正しい形式に直せばよし。

```xml
<layout xmlns:android="http://schemas.android.com/apk/res/android">
    <TextView
        android:id="@+id/my_text_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Title" />
</layout>
```
こんな感じ！

## レイアウトファイルでコンパイルエラーが発生した。該当部分を直したけど、毎回元に戻されて修正が反映されない
よくタブを見ると自動生成されたレイアウトファイルを開いて編集していませんか？ 

ビルドエラー時に開かれるファイルが自動生成されたファイルなので、元のファイルを手動で開いて編集する必要がある。これは Android Studio 2.3 のバグではないだろうか・・。

##  レイアウトファイルで補完が効かない
以下のようなコードの data タグの中身はちゃんと補完してくれるが、activity.getMyText のところは補完してくれない。

```
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
    <data>
        <variable
            name="activity"
            type="ore.MainActivity"
    </data>
    <LinearLayout 
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:text="@{activity.getMyText}"
        android:orientation="vertical">
    </LinearLayout>
</layout>
```

あと部分的にしかジャンプできない。これは最初書き方をミスっているのかと思っていたが、仕様らしい。
これが微妙すぎるので onClick とかをレイアウトファイルに書くのをやめた。

## リファクタリング（リネームとか）すると、おかしなところまで編集しようとする
これたぶん Android Studio 2.3 のリファクタリング機能がバグってる。Databinding を使っている箇所は基本的にリファクタリング機能が使えない、もしくは注意してリファクタリング機能を使う必要があるという認識である必要があるっぽい。
Laravel 5.x 新機能とアップグレードガイド

Laravel 5.1 LTS以降のリリースの新機能とリリースノートのリンク集です。
新機能のドキュメントはLaravel Newsの記事の拙訳です。
リリースノートはLaravel本家サイトの和訳サイト(readouble.com)へのリンクです。

# Laravel 5.1 LTS 2015年9月リリース
- サーバー要件
    - PHP >= 5.5.9
    - OpenSSL PHP拡張
    - PDO PHP拡張
    - Mbstring PHP拡張
    - Tokenizer PHP拡張

# Laravel 5.2 2015年12月リリース
- サーバー要件
    - PHP >= 5.5.9
    - OpenSSL PHP拡張
    - PDO PHP拡張
    - Mbstring PHP拡張
    - Tokenizer PHP拡張
- [Laravel 5.2 の新機能](https://qiita.com/saab/items/5eac686c9aee3c249b28)
- [5.1から5.2.0へのアップグレード](https://readouble.com/laravel/5.2/ja/upgrade.html)

# Laravel 5.3 2016年8月リリース
- サーバー要件
    - PHP >= **5.6.4**
    - OpenSSL PHP拡張
    - PDO PHP拡張
    - Mbstring PHP拡張
    - Tokenizer PHP拡張
    - **XML PHP拡張**
- [Laravel 5.3 の新機能](https://qiita.com/saab/items/cad8f724715b0aec8702)
- [5.2から5.3.0へのアップグレード](https://readouble.com/laravel/5.3/ja/upgrade.html)

# Laravel 5.4 2017年1月リリース
- サーバー要件
    - PHP >= 5.6.4
    - OpenSSL PHP拡張
    - PDO PHP拡張
    - Mbstring PHP拡張
    - Tokenizer PHP拡張
    - XML PHP拡張
- [Laravel 5.4 の新機能](https://qiita.com/saab/items/61fecce7a38b1abb572c)
- [5.3から5.4.0へのアップグレード](https://readouble.com/laravel/5.4/ja/upgrade.html)

# Laravel 5.5 LTS 2017年８月リリース
- サーバー要件
    - PHP >= **7.0.0**
    - OpenSSL PHP拡張
    - PDO PHP拡張
    - Mbstring PHP拡張
    - Tokenizer PHP拡張
    - XML PHP拡張
- [Laravel 5.5LTS の新機能](https://qiita.com/saab/items/28536a38ab18cf23360c)
- [5.4から5.5.0へのアップグレード](https://readouble.com/laravel/5.5/ja/upgrade.html)

# Laravel 5.6 2018年2月リリース
- サーバー要件
    - PHP >= **7.1.3**
    - OpenSSL PHP拡張
    - PDO PHP拡張
    - Mbstring PHP拡張
    - Tokenizer PHP拡張
    - XML PHP拡張
    - **Ctype PHP拡張**
    - **JSON PHP拡張**
- [Laravel 5.6 の新機能](https://qiita.com/saab/items/f978a977f83d0b0a2be5)
- [5.5から5.6.0へのアップグレード](https://readouble.com/laravel/5.6/ja/upgrade.html)
UDPを使う際、inet_addr()でC4996エラーが出るときの対処方法

# InetPton()関数を代わりに使おう

 PCTSTR WSAAPI inet_pton(
&nbsp;&nbsp;&nbsp;&nbsp;INT Family,
&nbsp;&nbsp;&nbsp;&nbsp;PCTSTR pszAddrString,
&nbsp;&nbsp;&nbsp;&nbsp;PVOID pAddrBuf
);

+ 第1引数 : Family
    IPv4を使うなら"AF_INET"、IPv6を使うなら"AF_INET6"

+ 第2引数 : pszAddrString
    IPアドレスを格納している文字列のポインタ

+ 第3引数 : pAddrBuf
    バイナリ形式に変換したIPアドレスを格納するバッファのポインタ

# 例
```cpp
#include <winsock2.h>
#include <ws2tcpip.h>

void Send_Packet()
{

sockaddr_in addr;
addr.sin_family = AF_INET;

～中略～

//IP アドレスの変換
InetPton( addr.sin_family, _T("127.0.0.1"), &addr.sin_addr.S_un.S_addr );

～中略～

}

```
*参考ページ:*  [https://msdn.microsoft.com/ja-jp/library/windows/desktop/cc805844](https://msdn.microsoft.com/ja-jp/library/windows/desktop/cc805844 "InetPton function")
データベースの正規形について考える

# はじめに
システムを作っていく上でデータベースの設計は避けては通れません。
といっても、どうするのがベストなのか、どう折り合いをつけるべきなのか悩むところです。
そこで、データベースには「正規化」というものがあります。
たぶん、基本的には「第3正規形」が一般的に使われていると思います（たぶん）
今回は、その第3正規形について説明していきたいと思います。

# 正規化とは
正規化とは簡単に言うと「効率よくデータを扱うため、データを整理すること」です。
詳しく言うと
・データの重複をなくして、整合的にデータを取り扱えるようにデータベースを設計すること。
・データの追加・更新・削除のときに不整合が起こるのを防ぎメンテナンスをしやすくする。
ってことです。

## 第1正規形

例えば、卸売会社で商品を以下のような形で管理しているとします。

|仕入先|住所|代表者|代表者連絡先|商品名|単価|入荷日|入荷数|備考|
|:---:|:--:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|
|X商社|A県B市|Y田S男|03-xxxx-yyyy|メモリ|5000|2017-08-30|10|S社製|
|X商社|A県B市|Y田S男|03-xxxx-yyyy|CPU|30000|2017-05-30|3|I社製|
|Y商社|C県D市|K田J子|03-gggg-dddd|HDD|10000|2017-07-30|10| |

これは、すべて個別のデータとなっているため、レコードとして登録できます。
この状態が「第1正規形」です。基本的な形ですね。

しかし、これにはいくつか問題があります。

・もし新しい仕入先が増えたとしても、実際にその仕入先から仕入れないと登録できない
・代表者や連絡先などが変更になった場合、複数レコード修正する必要があり不整合が起きやすい

などがあります。

## 主キーと非主キー

ここで、データベースを設計するために知っておく必要がある「主キー」と「非主キー」について説明します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/110131/eef1ec5e-e2ec-be40-59fe-1b34876e1b17.png)

主キーとは、「第1正規形のテーブルでレコードを一意に定める要素」である。つまり、「仕入先、商品名、入荷日」である。なので、非主キーとはそれ以外の項目であり、非主キーは主キーの一部の要素で決まります。これを部分関数従属といいます。

言い換えると、「仕入先」「商品名」「入荷日」のそれぞれのテーブルを作成し、リレーションを組むことができます。これが「第2正規形」です。
では、第2正規形に整形します。

## 第2正規形

・仕入先テーブル

| 仕入先 | 住所 | 代表者 | 代表者連絡先 |
|:-:|:-:|:-:|:-:|
| X商社 | A県B市 | Y田S男 | 03-xxxx-yyyy |
| Y商社 | C県D市 | K田J子 | 03-gggg-dddd |

・入荷テーブル

| 商品名 | 仕入先 | 入荷日 | 入荷数 |
|:-:|:-:|:-:|:-:|
|メモリ|X商社|2017-08-30|10|
|CPU|X商社|2017-05-30|5|
|HDD|Y商社|2017-07-30|5|

・商品テーブル

| 商品名 | 単価 | 備考 |
|:-----:|:---:|:----:|
|メモリ|5000|S社製|
|CPU|30000|I社製|
|HDD|10000||

さて、これで「第2正規形」に整形できました。第1正規形に比べて、メンテナンスもしやすくなりました。
しかしそれでも、代表者が複数の仕入先にいた場合に、代表者連絡先などが変更されたら、複数のレコードを変更する必要があります。
なので、主キー以外でも依存関係を持っているもの（推移的関数従属）も、別テーブルに切り分けていきたいと思います。
これが、「第3正規形」です。

## 第3正規形

・仕入先テーブル

|仕入先|住所|代表者|代表者連絡先|
|:--:|:--:|:--:|:--:|
|X商社|A県B市|Y田S男|03-xxxx-yyyy|
|Y商社|C県D市|K田J子|03-gggg-dddd|

・入荷テーブル

|商品名|仕入先|入荷日|入荷数|
|:--:|:--:|:--:|:--:|
|メモリ|X商社|2017-08-30|10|
|CPU|X商社|2017-05-30|5|
|HDD|Y商社|2017-07-30|5|

・商品テーブル

|商品名|単価|備考|
|:--:|:--:|:--:|
|メモリ|5000|S社製|
|CPU|30000|I社製|
|HDD|10000||

・電話帳

|代表者|代表者連絡先|
|:---:|:-------:|
|Y田S男|03-xxxx-yyyy|
|K田J子|03-gggg-dddd|


第3正規形にすれば、基本的には１つの要素を変更すれば、リレーションを組んでいるので自動的に複数レコード変更されます。メンテナンスも楽ですし、不整合も出にくいので、それが第３正規形のいいところですね。

# まとめ
正規形としては、第1から第5まで存在しますが、第4, 5はよほどのことがない限り使いません。
なぜなら、逆に複雑になりすぎるからです。基本的には第３正規形が完成だと思っても大丈夫だと思います。

わかりやすく、かつ、メンテナンスが楽・不整合が起こらない管理方法が一番です。
Windowsで快適なC/C++開発環境を作る

# はじめに
MinGWを使い、Windows 10上にC++開発環境を作ります。

# コンパイラのインストール

## MinGWのダウンロード
MinGWの公式サイトにアクセス
http://www.mingw.org/
~~そして、"download Installer"をクリック。~~
サイトのデザインが変わり、ダウンロード場所が変わりました。
右上の"download"をクリックして、
![1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206651/96e39c60-9ea0-0b1b-2aaf-30b3d83839f1.png)
osdnのページに飛ぶので、下のmingw-get-steup.exeをクリックします。
![2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206651/1ac399d2-bac8-39bf-ff1f-a1ba2e77e161.png)
これでmingw-get-steup.exeがダウンロードされます。


## MinGWのインストール
ダウンロードしたmingw-get-setup.exeをクリック。
後は出てきたウィンドウのInstall→Continueの順でクリック。

上記のことをするとMinGW Installation Managerというものが出てくるので、

* mingw32-base
* mingw32-gcc-g++

の項目を右クリックしてMark for Installationをクリックする。

![3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206651/c3354fef-d994-cba2-e2d4-a04115bec8e4.png)

後はツールバーのInstalltion→Apply Changesをクリック。

![2.5.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206651/2f0ab015-52b7-3f59-61f9-1009c04a1d1f.png)

さてMinGWのインストールはこれで終わりです。

# PATHを通す

さてMinGWのインストールは完了しました。
早速、コマンドプロンプト![5.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206651/1e2f3943-6523-2548-dad0-cc25c3b6bb31.png)を起動させて、

```
gcc -v
```
と入力してみます。

```
'gcc' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。
```

と表示されると思います。
gccがインストールしているのにコマンドプロンプトには「ないよ」と言われてしまいました。
なぜなら、PATHが通っていないためです。
そこでPATHを通したいと思います。

## PATHを設定する
下記のサイトを参考に、"C:\MinGW\bin"を追加してください。

WindowsXP
http://pocketstudio.jp/win/xp/path.html

Windows7
http://next.matrix.jp/config-path-win7.html

windows8
https://pc-karuma.net/windows-8-environment-variables/

Windows10
http://pineplanter.moo.jp/non-it-salaryman/2016/04/09/windows10-path/

## 確認
```
gcc -v
```
をコマンドプロンプトで入力しましょう。

```
~~~(色々な情報)~~~
gcc version ~~バージョン番号~~ (GCC)
```
と出てきたらgccのインストール完了です。

# 参考
https://webkaru.net/clang/mingw-gcc-install/
Effective C# 社内勉強会

#社内勉強会を実施しようとしたきっかけ
自分のエンジニアとしての技術力が世間一般のレベルに達していないと感じた。

社内で開発されたフレームワークに乗っかってアプリケーションを開発すると、ある程度の品質と呼ばれる基準には達することができる。
ただ、明確な理由なくプログラミングしている自分がいた。何故このようなクラス設計になったのか、何故このような例外処理を行っているのか等、考える行為をしなくなっていた。

同様に感じている社員も少なからずいて、若いエンジニアにも同じ境遇になって欲しくはなかった。

優秀なエンジニアは自分のペースで勝手に、勉強していくものだろう。そうではない「自分を含めた」社員が、心折れずに勉強する場を強制的に作ってみようと思った。

勉強会という形をとったのは、
・技術力を高める習慣を付けること
・技術本を読む力を付けること
・社員同士の交流
・挫折しない、させない
以上の理由から。

#勉強会のテキスト
Effective C# 4.0

#勉強会の形式
毎週木曜日に実施。1時間程度で1Chapterずつ進める。
輪読形式。予習なし。

Chapter毎に持ち回りで講師を決めると、担当者の負担が大きくなると思ったため。

ただ、試行錯誤して実施していこうと思う。
テキストの難易度は、新人エンジニアには高いはず。人によっては予習が必要だろう。C#の入門書と平行して勉強する必要があるかもしれない。

ハンズオン形式で手を動かしながら理解を深めたほうがいいかもしれない。
勉強会の形式は、随時変更していく。

#Qiitaの更新
Qiitaの記事としては、毎週勉強会を実施した後に、どのような箇所で疑問があったか等をまとめていく。
これから勉強会を実施しようと考えている人の一助になれば。

Effective C#の実際の内容については、他ブログなどを参考に。

#未来予想
この本を読破しても、劇的にプログラミングが上達しないかもしれない。もう１、２周読み返す必要があるかもしれない。
ただ、技術本を読みきったという自信は付くだろう。次の技術本を手に取るきっかけになって欲しい。

#各回へのリンク
「この記事は以下の記事からリンクされています」ってなるので、必要ないかも。
目次は、[Effective C#のもくじ](https://qiita.com/redpanda/items/e20070a036481834aacc)を参照させて頂きました。

[はじめに](https://qiita.com/ykoji1112/items/a52155e2e8c998c63874)
######第1章
Chapter1 [アクセス可能なデータメンバの代わりに常にプロパティを使用すること](https://qiita.com/ykoji1112/items/30f1288accc25914f371#_reference-df497826dac56b2f8d41)
Chapter2 constよりもreadonlyを使用する
Chapter3 キャスト時にはisあるいはas演算子を使用すること
macbook でターミナル開いたときに.bash_profileのエラー吐く

ターミナル開くと必ず、以下のエラー。
しかもぐぐっても解消法にたどり着けず、、、
このエラーになると、今利用しているユーザーが自分だと認識されず、
いろんなとこで permission denied がでる、、、
sudo 打てば問題ないんだけど、対処療法にすぎないし、、、
以下、出たエラーと修正前の.bash_profileの情報


出たエラー

```
last login: Wed Oct 11 00:37:16 on ttys000
-bash: /Users/ユーザー名/.bash_profile: line 2: syntax error near unexpected token `fi'
-bash: /Users/ユーザー名/.bash_profile: line 2: `fi'
```

修正前の.bash_profileの情報

```
  source '/Users/ユーザー名/Downloads/google-cloud-sdk/path.bash.inc'
  fi
  
  export M3_HOME=/Users/ユーザー名/Downloads/apache-maven-3.3.9
  M3=$M3_HOME/bin
  export PATH=$M3:$PATH
   source '/Users/shuya/Downloads/google-cloud-sdk/completion.bash.inc'
  fi
  
  # The next line updates PATH for the Google Cloud SDK.
  if [ -f /Users/ユーザー名/Downloads/google-cloud-sdk/path.bash.inc ]; then
   source '/Users/ユーザー名/Downloads/google-cloud-sdk/path.bash.inc'
  fi
  
  # The next line enables shell command completion for gcloud.
  if [ -f /Users/ユーザー名/Downloads/google-cloud-sdk/completion.bash.inc ]; then
   source '/Users/ユーザー名/Downloads/google-cloud-sdk/completion.bash.inc'
  fi
  
  export NVM_DIR="$HOME/.nvm"
  [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"  # This loads nvm

```



以下のように自力対処し、エラーは出なくなったが、あってるかはわからず、、、
どなたか正しい対処法ご存知でしたらコメントお願いします。

ターミナルで、 
/usr/bin/open -e ~/.bash_profile 

2行目、8行目の  fi  削除
これで一旦エラーはでなくなった。
なんだ、、これ、、。
data-toggleがiOSで動かないとき

## 起こった現象
bootstrapでiOSのSafariでアコーディングメニューが使えなかったので、修正方法をメモ

問題のコード（クリックしても何もおきない）
`<a data-toggle="collapse" data-target="#target">Open</a>`

## 解決法
何パターンか修正方法があるらしい。が、ここでは２パターンのみで

・href属性を追加
`<a data-toggle="collapse" data-target="#target" href="#target">Open</a>`


・cursorスタイルを追加
`<a data-toggle="collapse" data-target="#target" style="cursor: pointer;">Open</a>`

後者の方を採用して、cssに組み込みます。

・css

```css
a#ios {
    cursor: pointer;
}
```

・html
`<a id="ios" data-toggle="collapse" data-target="#target">Open</a>`

`a#ios` なんで `<a id="ios"></a>`　にしか反応しません。
Sequelizeでoperatorsのdeprecatedが出た時

忘れがちなのでメモがてら。

Sequelizeでこんなメッセージが表示される場合（V4以上？）がある。

```console:console
sequelize deprecated String based operators are now deprecated. Please use Symbol based operators for better security,
```

where句で使う演算子（operators）を文字列（`$gt`とか`$like`とか）では無くシンボル演算子(`Sequelize.Op.gt`とか`Sequelize.Op.like`とか）を使いなさいとの事。

このままでも動くけどセキュリティ的に対応したほうが良いよーって事なので、
http://docs.sequelizejs.com/manual/tutorial/querying.html#operators
を参考に対応する。