OmniAICreator/Qiita-1.07M huggingface dataset:
設計書は Excel だけじゃなくて Markdown も使ってほしい

設計書の不具合を見つけるたびに Excel の設計書を綺麗に直しながらコーディングしろって？時間がいくらあっても足りないってばよ…。
という状況を経験した SE の皆さんは多いはず。ここで Markdown の出番です。まず初めにそれぞれのメリットを見ていきましょう。

**Excel**

- 画像や表、グラフなどが簡単に作成できる
- 関数やフィルターが使える
- 納品しやすい

**Markdown**

- メンテナンスがしやすい
- 文字を書くのに時間がかからない
- 検索がしやすい

## メリットの詳細

一つ一つメリットを掘り下げて見ていきます。

**Excel**

> 画像や表、グラフなどが簡単に作成できる

Excel での画像の貼り付けはコピペで一発。表はセルの設定で直感的に作成可能。チャートなどのグラフは標準機能から適当に探して使うだけで綺麗なものが完成します。
一方、Markdown で画像を使用する場合はまず画像をファイル保存してからファイルへのリンクを記載する必要があります。表はテキストベースのため非直感的。何れも書きやすくしてくれる物があるので、書いてみて慣れなかったら使用してみるのもありだと思います。

> 関数やフィルターが使える

Excel では合計値や平均値を出したり、ある条件に当てはまるデータのみ抽出するフィルター機能がとても強力です。設計書ではあまり使用しませんが、いざという時にあるとやはり頼もしいです。Markdown はどちらも使用できません。

> 納品しやすい

現場は Excel などの Office 形式で納品することが多いです。Office で納品を求められた場合、Markdown で作った物は変換作業を挟まなければなりません。

**Markdown**

> メンテナンスがしやすい

Markdown 最大のメリットです。Git などのバージョン管理を使用できるので、それを前提に説明します。バージョン管理を使用するとコミットログから変更が追える。複数人で編集可能。マージもわかりやすい。製品リリース後もコードの変更とともに適切なメンテナンスをしていけば、後から入ってくるメンバーにもフレンドリーです。
Excel だとバージョン管理を使用できません。正確に言うと使用できるのですが、変更箇所がわからないし、複数人でメンテナンスをしてたら 100% コンフリクトします。なのでどこかの共有ディレクトリに置いて運用する形が多いです。

> 文字を書くのに時間がかからない

Markdown はテキストを書いているのとほとんど変わらないです。好きなエディターを使用できるし、文字の検索やフォーカス移動などもやりやすいです。Excel だとセルを編集モードにして書く必要がありますし、方眼紙などにして綺麗にレイアウトしていると、改行なども考えながら文字をかかなければいけません。

> 検索がしやすい

Markdown の中身はあくまでテキストのため、フォルダ指定などで中身を一括して検索することが可能です。例えばテーブル名などが変わって設計書をメンテナンスしなければならない場合、エディターなどを使用して一括置換が可能です。Excel でも似たような機能を持った別のアプリケーションを探すかマクロを作れば可能です。


## Markdown を使ってみる

最後に Markdown を使って設計書のメンテナンスをしてみようと思います。「開発を進めていく中でテーブルの名前が変わってしまった」という例題に沿って進めていきます。

#### 設計書構成

A B C 三つの設計書が存在しています。それぞれ概要、テーブル、ワークフローを記載しています。（左側が中身のテキストで、右側がプレビューです。）

[![https://gyazo.com/86a835cfe0233fb8cf4119e821d7e1ce](https://i.gyazo.com/86a835cfe0233fb8cf4119e821d7e1ce.png)](https://gyazo.com/86a835cfe0233fb8cf4119e821d7e1ce)

#### 課題内容

テーブル *excel_table* を *markdown_table* に変更します。

#### 対応内容

ディレクトリ内のファイルに対して *excel_table* を検索します。

[![https://gyazo.com/490797a107c71c27396a0f50c63fac5d](https://i.gyazo.com/490797a107c71c27396a0f50c63fac5d.png)](https://gyazo.com/490797a107c71c27396a0f50c63fac5d)

内容を確認した結果、今回は一括で置換するのがベストなので *markdown_table* に置換します。

[![https://gyazo.com/561737756342d5b3ee2b55bac2a50b84](https://i.gyazo.com/561737756342d5b3ee2b55bac2a50b84.png)](https://gyazo.com/561737756342d5b3ee2b55bac2a50b84)

変更内容をコミット（プッシュ）します。

[![https://gyazo.com/d37feaf4b22c42f4c82b0d4a3a28681c](https://i.gyazo.com/d37feaf4b22c42f4c82b0d4a3a28681c.png)](https://gyazo.com/d37feaf4b22c42f4c82b0d4a3a28681c)

#### 対応確認

A C 二つのファイルが正しく変更されていることを確認します。コミットログを見れば他の人が確認することも簡単ですし、やっぱり元に戻すなどといった対応も直ぐに実施できます。

[![https://gyazo.com/6918d0bc0b53eeadb59910ddbafd092c](https://i.gyazo.com/6918d0bc0b53eeadb59910ddbafd092c.png)](https://gyazo.com/6918d0bc0b53eeadb59910ddbafd092c)


#### 備考

今回使用したツールなどは下記の通りです。

- エディター：Visual Studio Code
- バージョン管理：Git
- Git クライアント：SourceTree
Nuro光(F660A)を使用してWebサーバを公開する方法

Nuro光(F660A)のルータを使用している環境下でWebサーバをインターネット上に公開する方法を以下に記載する。

#前提
当設定の前にインターネット上のDNSの設定が正しく設定されていること
私は、「お名前.com」を利用している為、「DNSレコード設定」画面内のグローバルアドレスの設定領域（「A/AAAA/CNAME/MX/NS/TXTレコード」）に「CMAN.jp」で調べたアドレスを設定している。
具体的な設定方法は、以下のページを参照
＜参照Page＞
[UQ WIMAXとお名前.comとTomcatでインターネットにサイトを公開する方法](https://qiita.com/KOJI-YAMAMOTO/items/2a33651b474da8b47154)

#1.ルータ(F660A)の管理コンソールにアクセスする
＜アクセスURL＞
http://192.168.1.1/
![image.png](https://qiita-image-store.s3.amazonaws.com/0/204260/949c3891-1fe8-8d71-698b-9f2b15c6fbe1.png)

#2.ログインしたら左メニュー内の「アプリケーション」→「ポートフォワーディング」を選択する。

#3.「有効にする」にチェックを付与し、必要なものを入力して「追加」ボタンを押下する。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/204260/7703de4a-5fc4-ba8e-dd91-a0a9dc53884c.png)
注意 : 設定内容を参考として掲示するために、「変更」ボタンが表示されています。

以上、稼働確認は、サーバと異なるネットワークからURLを叩いてサイトが表示されれば問題ない。
40億の整数を格納する方法:BitMap

## 2GメモリのPCで、重複なしの40億正整数からある整数を特定できますか？
### 問題の考え方：
   40億のint（40億* 4）/ 1024/1024/1024約14.9G、明らかにメモリの2Gだけではありませんが、40億のデータをメモリに入れることは不可能です。この問題をすばやく解決する最善の解決策は、データをメモリに格納することです。したがって、問題は現在、2Gのメモリ空間に40億の整数を格納する方法です。Javaのint型の整数は32ビットの4バイトで、int型の整数を識別するためにビットを使用すると記憶領域が大幅に縮小され、40億/ 8/1024/1024は約476.83メガバイトなので、処理するためにこれらの40億の整数をメモリに入れることができます。

### 具体的なアイデア：
   intは4バイト、即ち4×8 = 32ビットを占有し、我々は、Nが実行されるルックアップの合計数を表し、完全なデータを格納するために、[1 + N / 32]配列INT INT TMPの長さを適用する必要がありますtmpの各要素は、0から31までの10進数に対応する32ビットを占めることができるため、BitMapテーブルを使用できます。

tmp [0]：0〜31で表すことができます

tmp [1]：32〜63で表すことができます

tmp [2]は64〜95を表すことができます

.......

次に、10進数を対応するビットに変換する方法を次に見てみましょう。

40億のintデータが6,3,8,32,36、......と仮定すると、特定のBitMapは次のように述べています。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/32434/c24abfa3-1a4b-d9eb-6117-ac131e8213e5.png)


tmp配列内の添え字をどのように決定するかは、実際に整数を32で割ることによって行うことができます。たとえば、整数8を32で割って0に等し、8をtmp [0]にします。さらに、tmp [0]の32ビットのどれが8であるかを知るにはどうすればmod 32はmodでokです、再び8の整数、tmp [0]のmod 8の32は8の場合、整数8はtmp [0]の8ビット目（右から数えて）にあります。
Nuxt.js で作った静的サイトを PWA 化する

# はじめに

僕は GitHub Pages でちょっとした自己紹介ページを運用してます。

https://quanon.github.io/

このページは [Nuxt.js](https://ja.nuxtjs.org/) で作成したのですが、今回はこのページを [PWA (Progressive Web Apps)](https://developers.google.com/web/progressive-web-apps/) 化してみます。Nuxt.js を使うと PWA 化が非常に簡単にできるのです :blush:

# 方法

[nuxt-community/pwa-module](https://github.com/nuxt-community/pwa-module) の README.md を参考にします。

まず `@nuxtjs/pwa` をインストールします。

```shell-session
$ yarn add @nuxtjs/pwa
```

次に `nuxt.config.js` に `modules` と `manifest` を追加します。

```nuxt.config.js
// 略

module.exports = {
  // 略
  modules: [
    '@nuxtjs/pwa'
  ],
  manifest: {
    name: "QUANON's Page",
    lang: 'ja'
  }
};
```

`.gitignore` に次の行を追加します。

```.gitignore
sw.*
```

最後にアイコン画像を `static/icon.png` に配置します。画像のサイズは 512x512px 以上を推奨とのことです。

# 確認

ではデプロイして PWA 化されたことを確認します。

```shell-session
# 静的ファイルを生成する。
$ yarn run generate

# GitHub Pages にデプロイする。
$ yarn run deploy
```

デプロイが終わったら Android 端末の Google Chrome で PWA 化された https://quanon.github.io/ にアクセスします。なお Android のバージョンは 7.0 です。

メニューを開き「ホーム画面に追加」をタップします。

![01.png](https://qiita-image-store.s3.amazonaws.com/0/6697/c982df88-1083-3df3-ac97-125fe2dfe764.png)

ダイアログが表示されるので「追加」をタップします。

![02.png](https://qiita-image-store.s3.amazonaws.com/0/6697/20e67bc5-0bc4-e54d-5c1e-4c64e0909f9f.png)

端末のアプリケーション一覧に追加されました。

![03.png](https://qiita-image-store.s3.amazonaws.com/0/6697/dba75f2b-986f-d1fd-eeba-446f9ebb30fa.png)

アプリを開くとこんな感じです。Google Chrome とは独立したアプリとして起動します。アドレスバーも表示されません。

![04.png](https://qiita-image-store.s3.amazonaws.com/0/6697/f0dfda34-b187-2b1c-1ebb-1697811fa059.png)

機内モード :airplane: でも表示できました (キャッシュが表示されます) 。

![05.png](https://qiita-image-store.s3.amazonaws.com/0/6697/eac572db-5027-8f44-f94c-51d1a34d968d.png)

なお非 PWA の場合でもホーム画面に追加することは可能です。しかしアプリケーション一覧には追加されず、あくまでホーム画面から Google Chrome へのショートカットとしてしか機能しません。

# 最後に

Nuxt.js 便利 :v_tone1::sparkles:
Rによる教師ありLDA

# はじめに
自分でゼロから実装せずに教師ありトピックモデル／LDAをやりたいのであれば選択肢は限られています。Pythonだと個人がGithubで公開しているモジュールをインストールするしかないし、Rなら[lda](https://cran.r-project.org/web/packages/lda/lda.pdf)パッケージ一択です。

# サンプルデータ
ldaパッケージに同梱されている*poliblog*を使います。これは政治に関するブログ773編からなるデータであり、テキストの他にそのブログの政治的立場が左派と右派かを示す数値が付いています。[-100(Liberal)〜100(Conservative)]

# ldaパッケージによるsupervised LDA
マニュアルにある`slda.em`関数を使います。データセットが準備できているのであれば実装は簡単です。
実際のデータに適用するときは`lexicalize`関数を使ってdocumentとvocabを作成します．

```r
library(lda)
data("poliblog.documents")
data("poliblog.vocab")
data("poliblog.ratings")

num.topics = 2
params = sample(c(-1,1), num.topics, replace = TRUE)
result = slda.em(documents = poliblog.documents, K = num.topics,
 vocab = poliblog.vocab, num.e.iterations = 10, num.m.iterations = 4,
 alpha = 1.0, eta = 0.1, poliblog.ratings/100, params, variance = 0.25,
 lambda = 1.0, logistic = FALSE, method = "sLDA")
top.topic.words(result$topics, 10, by.score = TRUE)
```
こちらがsldaによって抽出されたトピック2つです。

|Topic 1|Topic 2|
|:-----:|:-----:|
|obama|iraq|
|clinton|years|
|voters|american|
|hillary|bush|
|obamas|war|
|election|president|
|barack|money|
|party|government|
|win|tax|
|candidate|senate|

なんとなくトピック1がリベラル寄り、トピック2が保守寄りな気がします。
実際このトピックが補助情報の予測にどのように使われているのかはsldaの結果のmodelパラメータを見れば分かります。

```r
> result$model

Call:
lm(formula = annotations ~ z.bar. + 0)

Coefficients:
 z.bar.1   z.bar.2  
-0.41753  -0.05789 
```
マイナス符号がリベラル寄りでプラス符号が保守寄りなので確かにトピック1のほうがリベラル寄りだと言えそうです。
作成したモデルによる予測は`slda.predict`関数でできます。

```r
predictions <- slda.predict(poliblog.documents, result$topics, result$model, alpha = 1.0, eta=0.1)
```

またトピックの単語分布$\beta$と文書のトピック分布$\theta$はそれぞれresultのtopicsプロパティとdocument_sumsプロパティに格納されています。

```r
> beta = result$topics
> dim(beta)
[1]   10 1290

> theta = result$document_sums
> dim(theta)
[1]  10 773
```

# 感想
ここまでRのldaパッケージのslda関数を見てきましたが，現状以下の不満があります．

+ 尤度が計算できない
+ 変分ベイズしか実装されていない
+ 教師データが連続値を想定していて，教師データの回帰モデルが正規分布ベースの線形回帰

結局自分でコードを書けってことか（泣）
ガチ素人が1ヶ月でディープラーニングのジェネラリストになった話

# はじめに
~~なんか、ガチ素人って書くとAVみたいですね~~
ディープラーニングの知識ゼロの素人でしたが、1ヶ月の勉強でディープラーニング　ジェネラリスト試験[^1]に合格しました。
せっかくなので、自分の経験を踏まえつつ合格への（おそらく）最短ルートをまとめてみます。
これからチャレンジしてみようという方の参考になれば幸いです。

ちなみに、僕のスペックはこんな感じです。

- 数年前まで理系の大学院生だった。
    - 専攻は機械工学だったので、ディープラーニングの知識はゼロ。行列の計算くらいはできる。
- お仕事は上流という名のパワポ職人。

# 多分これが一番早いと思います
## Coursera
色々なところで紹介されているので、今更細かい解説はしません。
騙されたと思って、Andrew先生の機械学習講座を修了してください。
修了する頃には「何がわからないかがわかる」＝「次にどんな勉強をすれば良いかわかる」ようになっていると思います。
[Machine Learning](https://www.coursera.org/learn/machine-learning)

面倒だと思いますが、プログラム課題もきっちりやりましょう。
動画を見てわかったつもりになって先へ進んでしまうと、後でまた戻ってくることになりますよ（体験談）

**ここまで60〜70時間くらい。最初にして最大の難所。**
机に向かう時間が捻出できない人は、スマホアプリ版Courseraを使って通勤時間を活用すると良いと思います。
iOSとAndroid、両方あります。

どうしてもモチベーションが続かない人は、
最後の週 (Week 11) の最後の動画 (Summary and Thank you) をこっそり見ましょう。
理由は見ればわかります。

## 指定参考書をよむ
Machine Learning講座だけでは出題範囲をカバーしきれないので、公式サイトで指定されている3冊の参考書もチェックしておきます。

### 人工知能は人間を超えるか ディープラーニングの先にあるもの

かんたん。さくっと読めます。
**ここまで65~75時間くらい**

[人工知能は人間を超えるか](http://amzn.asia/90cvJze)

### 深層学習 (機械学習プロフェッショナルシリーズ)

数式ばかりで内容が重い。初学者がいきなりこれを読むとやる気を失うかもしれない。
でも、Courseraを修了した貴方なら読み通せるはずです。
最初の方は「あ、この問題、Courseraでやったやつだ！」という感じで流し読み。
後半のCNNやRNNについて言及しているところを重点的に読みます。
数式の理解に力を入れる必要はありませんが、原理は押さえておく必要があります。
**ここまで70時間~80時間くらい**

[深層学習](http://amzn.asia/6awu9LK)

### AI白書2017
こちらは物理的に重い。腰を据えて読みます。
ディープラーニングを取り巻く社会情勢にまつわる問題がここから出ます。
おそらくところどころ「？」の浮かぶポイントがあると思いますが、
個々の用語を深追いするよりも一通り読み通すことを優先します。
**ここまで80時間~85時間くらい**

[AI白書2017](http://amzn.asia/1KVGRgU)
紙の本は絶版しているみたいなので、電子版を買いましょう。

## 試験結果
ジェネラリスト試験は、自分の点数も合格基準点も公開されません。
どのくらいの余裕で受かったのかは今もって不明です。
が、自分の感触だと正答率85%くらいでしょうか。

# ふりかえって
元々はディープラーニングの理解を目的に始めた勉強で、資格取得自体は単なるマイルストーンのつもりでした。
ですが振り返ってみると、受験の過程で役に立つ知識を学ぶことが出来たかなと思います。
次の試験は2018年6月だそうです。1ヶ月で、となると結構ハードでしたが、今から始めれば半年あります。
興味のある方は、ぜひチャレンジしてみてはいかがでしょうか。

[^1]: http://www.jdla.org/business/certificate/#education
MacOS（HighSierra）でVirtualBox＋Ubuntu仮想環境を構築する

こんばんは、たびびとの服とこんぼうとおなべのふたで戦うプログラマです。

MacBookPro（2016Late）を購入して一ヶ月くらい経ちました。
１０歳くらいではじめてPCに触ってから、Windows以外したことがなかったのでなかなか新鮮な毎日です。

この前、うどんの汁を少しこぼしてしまったのですが、しばらくして感圧タッチパネル(?)が反応しなくなる上電源ボタンが死にました。
でも、電源アダプタぬいてふた閉めて一週間ほど放置→もう一度アダプタつけてふたをあける→なぜか復活しました。

繊細なのかそうでもないのか、謎です。

昨日からいきなりLinux環境でうんたらかんたらすることになってしまったのですが、動きがかわいらしく萌えたので自分のMacBookに入れることにしました。

調べたところ、VirtualBox＋Ubuntuが良さそうだなあということで、その方向で行くことにしました。


#HighSierraではVirtualBoxはインストールできない？
おもむろにTerminalをたちあげ、

```
brew cask install virtualbox
```
と書くとエラーが出て終了してしまいます。

セキュリティが厳しくなった関係みたいで、

ディスプレイ上方にあるアップルマーク
→環境設定→セキュリティとプライバシー
→下の方にある鍵をクリックして鍵を外す
→ダウンロードしたアプリケーションの実行許可
→Oracleっぽい文字が書いてある見慣れないメッセージの横にある許可のボタンをクリック

でもう一度、Homebrewでインストールしたら入りました。
最後にビールの絵文字が出てくるのいいですよね。

#Ubuntuのイメージを落としてくる
日本語だと↓から、ISOイメージというのをおとします。
https://www.ubuntulinux.jp/download/ja-remix

でも最新版がないっぽいから、最新がよかったらアメリカとかの方がいいのかな？と思い、わたしはアメリカの方からおとしました。
http://mirror.pnl.gov/releases/artful/
の【64-bit PC (AMD64) desktop image】というのです。

#VirtualBoxの初期設定をする
Launchpadの最後の方にある箱みたいなアイコンをクリックしてVirtualBox立ち上げ。

そのまま指示に従って進んでいくのだけれど、
「名前とオペレーティングシステム」
の「名前」には【Ubuntu−17.10】みたいにVersionがわかるように書いている人が多かったのでわたしもそうしました。
Ubuntuと入力すると自然にタイプがLinuxになっているけど、なっていなかったらLinuxに設定します。

あと、**バージョンはおとしたイメージとあわせないとだめっぽい。なので64bitをおとしたひとは64bitを選択しないとだめみたいです。32bitの人も同様。**

あとはまあ、「続ける」〜でメモリーサイズは1024MBのまま、仮想ハードディスクを作成するを選んで、ファイルタイプはVDI、物理ハードディスクにあるストレージは、Linuxで容量使いたい人は可変にするといいみたいです。わたしはとりあえずまあ固定でいいや・・・と固定にしました。

これで仮想マシンができました。

#最後のしあげ
VirtualBoxを立ち上げると、左の方に【Ubuntu-17.10】ができていると思います。
それをクリックすると、ISOファイルを読み込むようにうながされるので、さきほどダウンロードしておいたUbuntuのISOファイルを選択してStart。
「Ubuntuをインストールを選択」をクリック。
正直あとはいまいちよくわからなかったので、デフォルトの設定まま進んでいきましたが、無事にインストールできました。

なんか赤い背景にかわいい動物がでてきました。

#まとめ

お手軽にLinux環境をつくれて感動しました。
ただなんか動きがやたら遅く、画面がちかちか点滅するので、そのあたりをちょっと。
あとは画面サイズを変えたい（今は固定なので、リサイズできるようにしたい）


一応、SE（という名目で雇われたプログラマー）として一年経ちましたが、わからないことばかりです。
はやくレベルアップして、せめて【どうのつるぎ】とかを装備したいです。
dockerコンテナへのアクセス

[前回](https://qiita.com/kkkkkkkkkk1005/items/02b4ffae8af2578002e1)の記事ではdocker上でnginxが起動するまでを行いました。
今回は、dockerコンテナへアクセスしてnginxの設定ファイルを探します。

## dockerコンテナのプロセス確認

```shell
$ docker ps
```
testserverという名前のnginxイメージが起動しています。
![1__Thanks_for_flying_Vim__zsh_.jpg](https://qiita-image-store.s3.amazonaws.com/0/222267/86e85ccf-748c-4cea-d831-697a429f956c.jpeg)

## コンテナにアクセス

```shell
$ docker exec -it testserver /bin/bash
```

![スクリーンショット 2018-01-11 23.26.58.png](https://qiita-image-store.s3.amazonaws.com/0/222267/8c2615ef-5b19-3b5a-aa88-3cf4c0a64a86.png)


## nginxの設定ファイル
公式ドキュメントには
__*「It is typically one of* /usr/local/nginx/conf, /etc/nginx, or /usr/local/etc/nginx *.」*__
とあり、__Google__翻訳すると
__*「通常は* /usr/local/nginx/confか/etc/nginx/*か*/usr/local/etc/nginx/ *にあります。」*__
とのことです。
参照 [https://www.nginx.com/resources/admin-guide/configuration-files/](https://www.nginx.com/resources/admin-guide/configuration-files/)

/etc/nginx
![1__Thanks_for_flying_Vim__docker_.jpg](https://qiita-image-store.s3.amazonaws.com/0/222267/183fd27b-73e7-1b0c-429f-ed78c9e140c6.jpeg)


nginx.conf
![スクリーンショット 2018-02-06 0.32.51.png](https://qiita-image-store.s3.amazonaws.com/0/222267/f8a255db-e6fe-2d5c-1804-97d3947a0d74.png)

実際はコンテナ内に入る機会はそんなにないようですが、
緊急時や直接確認したい事があるかもしれませんので、覚えていて損はないでしょう。
WebDriverでBasic認証を突破する

## WebDriverでのBasic認証突破
* Basic認証がかかっているページの対処方法について書きます。
* テスト用のサイトはBasic認証外すっていう対応もいいと思います。
* でも、環境ごとに差分作りたくなかったり、Basic認証通ること自体をテストしたいこともあるかも。
* とはいえ、GUI自動テストは万能ってわけでもないので、自動テストする観点を分けるっていう諦めもときには大事だと思っています。

### 通常は、以下の通りでよいはず

  ```java
  WebDriverWait wait = new WebDriverWait(driver, 10);
  Alert alert = wait.until(ExpectedConditions.alertIsPresent()); 
  alert.authenticateUsing(new UserAndPassword(username, password));
  ```

* しかし、現状(2017/08/02)はInternetExplorerDriver、かつSelenium-3.4でしか動作していない。
* 各ブラウザのDriverは安定しないことも多く、一度動いていても動かなくなったり、Chromeでは動いたけど、IEでは動かないなどということもある。

### そのため、以下のような対処方法となる。
* [BasicAuthTest.java](https://github.com/nobutnk/selenium-examples/blob/master/src/test/java/com/nobutnk/selenium/examples/BasicAuthTest.java)

```java
/**
 * Basic認証付きページにアクセスする
 * @param driver webdriver
 * @param baseUrl 認証ありページと同一ドメインの認証なしページ
 * @param protectedUrl 認証ありページ
 * @param username username
 * @param password password
 */
public static void basicAuthentication(
        WebDriver driver, String baseUrl, String protectedUrl, String username, String password) {
    // 認証前ページにアクセス
    driver.get(baseUrl);

    // JavaScriptで認証
    JavascriptExecutor jexec = (JavascriptExecutor) driver;
    StringBuilder js = new StringBuilder();
    js.append("var XMLReq = new XMLHttpRequest();");
    js.append("XMLReq.open('GET', '"
            + protectedUrl + "', false, '"
            + username + "', '" + 
            password + "');");
    js.append("XMLReq.send(null);");
    jexec.executeScript(js.toString());
    
    // 認証後ページにアクセス
    driver.get(protectedUrl);
}
```

* 流れ
  1. 認証が必要なページと同一ドメインで、認証がかかっていないページに遷移する。※前提条件となる。  
  2. JavaScriptのXMLHttpRequestを使い、Basic認証を行う  
  3. 認証がかかっているページに遷移する。

* ※前提条件：ドメイン内のすべてのページでBasic認証がかかっている場合、この方法は使えない。
  * JavaScriptでリクエストを投げる場合、同一ドメインから投げる必要があるため。ドメイン内のページに遷移後、JavaScriptからリクエストを発行するとう仕組みを使っている。
IntelliJのよく使う操作メモ

Windows、Eclipseユーザの自分が
MacでIntelliJの案件にジョインしてしまったので
よく使うことだけ必要最小限調べたのでメモっておく。

いいと思ったものは随時更新予定。

# 事前にやっといたほうがいいこと
* MacOSの入力ソースのショートカットを無効化(補完と突合するから)
* Mavenプロジェクトの場合、自動インポート(import Maven projects automatically)
* マウス・ホイールでフォント・サイズ変更する(Change font size (Zoom) with Ctrl+Mouse Wheel) = ON
* 保管時に行末のスペースを除去する(Ensure line feed at file end on Save) = 変更行のみ
* 行番号の表示(Show line number) = ON
* 空白を表示する(Show whitespaces) = ON (全角空白は □ で表示されます)
先頭=OFF
* Surround selection on typing quote or brace = ON (選択箇所をクォートで囲う)
* リッチテキストとしてコピーする機能を無効にする(Copy as rich text by default) = OFF

# ショートカット

* キーマップは`Mac OS X 10.5+ keymap`

## エディタ系

| キー | 内容 |
|---|---|
| command + f | ファイル内検索 |
| command + r | ファイル内置換 |
| command + d | 下に行を複製 |
| command + delete | 行を削除 |
| Shift + Enter | 下に行を追加 |
| option + ↑ | 選択範囲を広げる |
| option + ↓ | 選択範囲を狭める |
| option + command + l | コードフォーマット |

以下はMacのショートカットだけど便利。
Windowsに戻った時大変そう。。。

| キー | 内容 |
|---|---|
| ctrl + f | カーソルを右へ |
| ctrl + b | カーソルを左へ |
| ctrl + p | カーソルを上へ |
| ctrl + n | カーソルを下へ |
| ctrl + a | 行頭／段落先頭に移動 |
| ctrl + e | 行末／段落末に移動 |
| ctrl + h | カーソル左側の文字を削除 |
| ctrl + d | カーソル右側の文字を削除 |
| ctrl + k | カーソル右側の文字から行末／段落末まで削除 |


## 補完系

| キー | 内容 |
|---|---|
| tab | 補完 |
| esc | 補完表示を消す |
| ctrl + space | 補完再表示 |
| option + return | いい感じの案内をポップアップ表示してくれる |
| command + shift + return | いい感じに括弧やセミコロンを追加してくれる **★超使う★**  |

## 移動系

| キー | 内容 |
|---|---|
| ctrl + j | JavaDocをポップアップ表示 |
| 使用箇所で command + b | 定義元にジャンプ |
| 定義元で command + b | 利用箇所をポップアップ表示 |
| command + [ | ジャンプ前の場所に戻る |
| command + ] | 上記コマンドのやり直し |
| command + u | 親クラスに移動 |
| option + command + b | 子クラスをポップアップ表示 |
| command + e | 最近開いたファイルをポップアップ表示 |
| command + F12 | メソッド一覧をポップアップ表示 |
| shift 2回 | ファイル名、クラス名、メソッド名とかで検索 |
| command + shift + o | ファイル名をプロジェクト内検索 |
| command + shift + f | 文字列をプロジェクト内検索 |
| command + shift + r | 文字列をプロジェクト内置換 |

### デバッグ・テスト

| キー | 内容 |
|---|---|
| ctrl + r | 実行 |
| ctrl + d | デバッグ |
| command + option + r | 次のブレークポイントでストップ |
| F8 | 次の行でストップ |
| F7 | メソッド先に入ってストップ(スキップ設定通り) |
| option + shift + F7 | メソッド先に入ってストップ(スキップ設定無視) |
| shift + F8 | 今のメソッドを実行してしまってからストップ |
| command + shift + t | テストケース生成・移動 |

## 使うと便利な機能

### 一般

* クラスやメソッドや変数を安全にリネームする  
  `右クリック -> Refactor -> rename`
* 行番号付近で右クリックして`Annotate`をクリックで最終編集者が表示される
* `Compare with Clipboard`が何気に便利

### デバッグ
  * 「評価式」で任意の式を評価できる
  * 「ドロップフレーム」でメソッド呼び出し前の状態に戻せる
  * 「ブレーク条件」でブレークする条件を指定できる
  * 「巻き戻し」が`Chronon`プラグインで実現できる

## ついでにWindowsマシンだと

* IntellJはもちろん、VSCodeでもキーマップをIntellJにすれば同じでいけます。

| キー | 内容 |
|---|---|
| ctrl+c | 行のコピー |
| ctrl+x | 行の切り取り |
| ctrl+y | 行の削除 |
| ctrl+d | 行を複製 |
| ctrl+space | 補完再表示 |
| ctrl+w | 選択範囲を広げる |
| ctrl+shift+w | 選択範囲を狭める |
| ctrl+alt+l | コードフォーマット |
| shift+enter	| カーソル行下に行追加 |
| ctrl+delete | カーソル位置から行末まで削除 |
| ctrl+backspace | カーソル位置から行始まで削除 |
| ctrl+shift+f | プロジェクト内を検索 |
| ctrl+n | クラス？を検索 |
| ctrl+shift+n | ファイルを検索 |
| alt+left or alt+right | エディタータブの移動 |
| alt+f12 | コンソールを表示・非表示 |

## 今入れているPlugins

| Plugin名 | 内容 |
|---|---|
| AWS Toolkit | Lambdaの開発とかに |
| NodeJS | Lambdaの開発とかに |
Raspberry Pi + Elecrow 11.6インチディスプレイモニタ解像度調整

# はじめに
Elecrowの11.6インチHDMIディスプレイモニタをRaspberry Piに接続した際、デフォルトでは、画面いっぱいに画面表示されず、上下左右に黒いデッドスペースができてしまう。
どうも、1920 * 1080サイズだとこのようになってしまうようで、解像度を落としてあげる必要があるみたい・・・

# 前提条件
- Raspberry Pi 3
- RASPBIAN STRETCH WITH DESKTOP（Version:November 2017, 2017-11-29）
- Elecrow AUS62854E 1920x1080 HDMI Display 11.6inch

# Elecrow 11.6インチディスプレイモニタ仕様（[アマゾン](https://www.amazon.co.jp/gp/product/B06WV8XLQ4/ref=oh_aui_detailpage_o08_s00?ie=UTF8&psc=1)より抜粋）

- Elecrow11.6インチ1920X1080高解像度ディスプレイ 
  - アルミニウム材質を採用して、HD高解像度のゲームモニター。立派なデザイン、良い音質、優れた品質、良好な放熱機能、金属の質感も持っています。ゲーム愛好者やモデル撮影愛好家に大人気です。本製品は産業機器、家庭用の娯楽ゲームのオーディオとビデオとして、絶対良品です。

- アプリケーション 
  - 交換性：PS3 PS4 XBOX360 Raspberry pi、産業機器、自動車のオーディオとビデオ、自動車のヘッドレスト、医療機器の表示器。

- 仕様 
  - ディスプレイ技術：LEDディスプレイ
  - 画面サイズ：11.6インチ
  - パネルサイズ：10.1インチ
  - アスペクト比:16: 9 （幅：高さ）
  - パネルの明るさ：350cd / m² 
  - コントラスト：800:1（min）（伝送）
  - 解像度：1366X768、最大1080p
  - 視野角：170度の広い視野角
  - 外観サイズ：288mm x 185mmX25mm 
  - 表示面積：257mmx 115mm
  - 作業温度：-30℃--+50℃ 
  - 表示モード：恒常的な黒い表示、伝達タイプ
  - 表示色：262K / 16.7M（6ビット/ 6ビット+ Hi-FRC）
  - 応答時間：13/12 (TYP) (Tr/Td)（ms） 

- パッケージの内容： 
  - 11.6インチHDディスプレイX1
  - 12V/2A電源アダプタ×1
  - 1.4P HDMIケーブル×1
  - メタルラック×1

- ご注意 
  - 推奨解像度：1366 * 768 
  - 最大互換性解像度：1920 * 1080

# 設定
「/boot/config.txt」を弄る。
オリジナルをバックアップしておく。

```
$ sudo cp /boot/config.txt /boot/config.txt.bck
```

「hdmi_group」を「2」に編集する。

「hdmi_group」にはCEAとDMTという2つの規格に沿った設定が可能で（CEA=1、DMT=2）、CEAはTV出力をするとき、DMTはPC用ディスプレイに出力するときに設定するらしい・・（[参考サイト](http://monoist.atmarkit.co.jp/mn/articles/1504/07/news008_3.html)）

```
$ sudo vi /boot/config.txt
```

```
hdmi_group=2
```

以上、リブードで設定完了。
一些杂七杂八的技术

1.如何在virtualbox上面搭建的ubuntu上安装GuestAddtions
  为了解决virtualbox上guestOS和主机上的hostOS的通讯以及粘贴板的问题，需要在guestOS上面添加GuestAddtions.而添加GuestAddtions的方法也因为windows，centos，unix的不同而有区别。在此仅仅给出我在ubuntu的guestOS上安装GuestAddtions时的经验

 1-1
  sudo apt-get install -y linux-headers-generic
  这个网上是这么说的
   >準仮想化ドライバをビルドする為、カーネルヘッダが必要になります。

 1-2
  重启你的ubuntu系统，这个必须，如果不执行会报错

 1-3.
  首先在virtualbox上插入GuestAddtions的镜像

![IMG_0857.JPG](https://qiita-image-store.s3.amazonaws.com/0/191439/547ccfc8-fc28-ae05-ae8f-b7a74eb6811a.jpeg)

 1-4. 
  插入镜像以后，会在/media/用户名/VBox_GAs_5.2.4的目录里面被挂载

```
syoui@syoui-VirtualBox:/media/syoui/VBox_GAs_5.2.4$ ls
32Bit        OS2                       VBoxWindowsAdditions-amd64.exe
64Bit        runasroot.sh              VBoxWindowsAdditions.exe
AUTORUN.INF  TRANS.TBL                 VBoxWindowsAdditions-x86.exe
autorun.sh   VBoxLinuxAdditions.run
cert         VBoxSolarisAdditions.pkg
syoui@syoui-VirtualBox:/media/syoui/VBox_GAs_5.2.4$ 
```

1-5. 
  这里有很多执行文件，根据自己的系统执行对应的安装脚本我这里时ubuntu-16.04.3，执行VBoxLinuxAdditions.run

```
syoui@syoui-VirtualBox:/media/syoui/VBox_GAs_5.2.4$ sudo ./VBoxLinuxAdditions.run 
Verifying archive integrity... All good.
Uncompressing VirtualBox 5.2.4 Guest Additions for Linux........
VirtualBox Guest Additions installer
Removing installed version 5.2.4 of VirtualBox Guest Additions...
Copying additional installer modules ...
Installing additional modules ...
VirtualBox Guest Additions: Building the VirtualBox Guest Additions kernel modules.
VirtualBox Guest Additions: Running kernel modules will not be replaced until the system is restarted
VirtualBox Guest Additions: Starting.
```

1-6. 
  执行lsmod | grep vbox查看vbox命令，如果安装成功会看到如下结果

```
syoui@syoui-VirtualBox:/media/syoui/VBox_GAs_5.2.4$ lsmod | grep vbox
vboxsf                 45056  0
vboxvideo              40960  2
ttm                    98304  1 vboxvideo
drm_kms_helper        151552  1 vboxvideo
drm                   352256  5 vboxvideo,ttm,drm_kms_helper
syscopyarea            16384  2 vboxvideo,drm_kms_helper
sysfillrect            16384  2 vboxvideo,drm_kms_helper
vboxguest             299008  5 vboxsf
sysimgblt              16384  2 vboxvideo,drm_kms_helper

```
DynamoDBでアトミックカウンタを使ってシーケンスを管理する

DynamoDBを用いていると、IDなんかをシーケンシャルに扱いたくなってくることがよくあります。
いわゆる連番IDというやつですね。

一見DynamoDBでシーケンシャルなIDを管理しようと思うと、シーケンステーブルを作って最大値を保存するレコードを作成して、それを `get` して `+= 1` して `update` すれば実現出来る……と考えてしまいますが、それではトランザクションの原子性を保証することが出来なくて不安になってしまいます。同時に別のユーザがこの処理を実行してしまったらどうなってしまうのでしょうか！
問題ありません！　DynamoDBではアトミックカウンタを使って一つのクエリでレコードの現在の値を更新しつつ結果を取得する事が出来ます！

公式ドキュメントは次の通りです。
https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/WorkingWithItems.html#WorkingWithItems.AtomicCounters

Node.jsでの実装の一例を以下に示します。
実装例のシーケンステーブルは、パーティションキーにシーケンスID、 `value` に実際の最大値を想定しています。

```js
  /**
   * @param {string} tableName
   * @param {Object<string, *>} key
   * @param {number} incr
   * @return {Promise.<DocumentClient.AttributeMap>}
   */
  function incrementalUpdate(tableName, key, incr) {
    /**
     *
     * @type {DocumentClient.UpdateItemInput}
     */
    const params = {
      TableName: tableName,
      Key: key,
      ReturnValues: "ALL_NEW",
      UpdateExpression: "SET #value = #value + :incr",
      ExpressionAttributeNames: {
        ["#value"]: "value"
      },
      ExpressionAttributeValues: {
        [":incr"]: incr
      }
    };
    console.log("INCREMENTAL_UPDATE", params);
    return new Promise((resolve, reject) => {
      dynamoDBDocumentClient.update(params, (err, data) => {
        if (err) {
          return reject(err);
        } else {
          return resolve(data.Attributes);
        }
      });
    });
  }
```
CCNA学习笔记

1.no ip domain-lookup
  这个命令必须要在global config 模式下才能执行
  为的是避免这样的错误

>% Unknown command or computer name, or unable to find computer address

 ```
Router>
Router>baidu
Translating "baidu"...domain server (255.255.255.255)
% Unknown command or computer name, or unable to find computer address

Router>enable
Router#google
Translating "google"...domain server (255.255.255.255)
% Unknown command or computer name, or unable to find computer address

Router#configure terminal
Enter configuration commands, one per line.  End with CNTL/Z.
Router(config)#no ip domain-lookup
Router(config)#google
               ^
% Invalid input detected at '^' marker.
	
Router(config)#exit
Router#
%SYS-5-CONFIG_I: Configured from console by console

Router#baidu
Translating "baidu"
% Unknown command or computer name, or unable to find computer address

Router#exit
 ```
 
 这样在随意输入一个字符串以后，路由器就不会去解析域名，而把输入的字符串当作一个命令去处理
>Router#baidu
Translating "baidu"
% Unknown command or computer name, or unable to find computer address
textFieldを内包した伸縮するcellを作る

<img width="294" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/21372/636552b9-7bee-9092-ab57-086122e233a2.png">

↑こういうやつをつくる(テキストを入力していくと下に伸びるcell)

## Storyboard+AutoLayoutでUIを組む
<img width="701" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/21372/87239db9-a4ff-a25f-0a7f-374ca21b4a33.png">

## TableViewDelegateを実装
```swift
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        return UITableViewAutomaticDimension
    }
```

UITableViewAutomaticDimensionを返すのがポイント
SQL Server逆引きメモ

必要に迫られたSQL Server関連の逆引きメモになります。

# ユーザマッピングで"エラー: 15023"が発生する場合の対応方法

ユーザを作成して"ユーザマッピング"を設定すると下記のエラーが表示される。

```
ユーザー、グループ、またはロール 'xxxxx' は現在のデータベースに既に存在します。 (Microsoft SQL Server、エラー: 15023)
```
## 原因
* ユーザマッピングが設定されたデータベースを別サーバに復元・コピーした場合に発生する。

## 対応方法
不整合が発生してる該当ユーザをチェック。

```sql
Use [データベース名]
EXEC sp_change_users_login 'Report'
```

ユーザマッピングを修正

```sql
Use [データベース名]
ALTER USER 旧ユーザー名 WITH LOGIN = 新ユーザー名
```

# 動的ポートでのファイアウォール設定

1. SQL Server Browser 用ポート`UDP 1434`の許可
2. sqlservr.exeの許可

# 参考
* [動的ポート時のファイアウォールの設定 at SE の雑記](https://blog.engineer-memo.com/2008/11/24/%E5%8B%95%E7%9A%84%E3%83%9D%E3%83%BC%E3%83%88%E6%99%82%E3%81%AE%E3%83%95%E3%82%A1%E3%82%A4%E3%82%A2%E3%82%A6%E3%82%A9%E3%83%BC%E3%83%AB%E3%81%AE%E8%A8%AD%E5%AE%9A/)
* [SQL Serverでバックアップを復元したときにログインできなくなった](https://qiita.com/naaaoooo/items/30c4824dcb5e97df85a8)
GO の cgo を使ってマルチプラットフォームなアプリを出そうとして Windows バイナリビルドで挫折した後、希望を抱いた話

技術的な話題というより、調査メモという形で残しております。すみません(´・ω・｀)

# 経緯
* cgo を使って C++で書かれたライブラリ(v8 engine)を組み込んだアプリを作ろうとした
* 具体的には emscripten 化した C言語ライブラリ(graphviz)を GO 上で動かしたくて v8 をビルドして組み込もうとした
    * 開発の動機は一言で言うと趣味です
    * graphviz もコンパイルする場合は VisualStudio でのビルドに対応しているらしい
        * https://graphviz.gitlab.io/_pages/doc/winbuild.html

# 調査
* まずは、v8 go binding の調査
    * https://github.com/mattn/go-v8
    * https://github.com/augustoroman/v8
    * https://github.com/fluxio/go-v8
    * https://github.com/ry/v8worker
* 色々あるなぁと思いながら眺める。どちらにせよ v8 のビルドが必要そうなのでビルドする
    * この時点で v8 は MinGW でもビルドできると思っていた
* v8 engine は Windows の場合、Visual Studio を使ったビルドができる
    * https://github.com/v8/v8/wiki/Building-with-GN
    * https://chromium.googlesource.com/chromium/src/+/master/docs/windows_build_instructions.md ( これは Chromium だけど)
    * https://medium.com/dailyjs/how-to-build-v8-on-windows-and-not-go-mad-6347c69aacd4
* v8 の static library が Visual Studio 2017 でビルドできるところまではできた
    * ちょうどこの問題に当たってパッチは当ててビルドした
        * https://bugs.chromium.org/p/v8/issues/detail?id=6158
* MinGW によるビルドは最近対応していないことがわかった

# 試行錯誤
* 結論から述べると、Visual Studio でビルドした .lib ファイルは MinGW でリンクできない
    * なんで MinGW の話が出たかというと、 GO の cgo は gcc を要求するため(cl.exe などはだめっぽい)
    * 上記条件がありつつ、ビルドはできなくはないのかと調査して、dlltool や pexports、reimp を使ってみたが、だめっぽい
    * http://www.mingw.org/wiki/MSVC_and_MinGW_DLLs
* そして挫折 orz
* 冷静になって調べてみた
* どうやら GO 側で cgo の clang 対応がされそうな雰囲気。 VIsual Studio の cl コマンドオプションを clang 側がいい感じにしてくれるようになれば、色々楽しそうだ
    * cmd/cgo: support clang on Windows
    * https://github.com/golang/go/issues/17014
    * cmd/link: support msvc object files
    * https://github.com/golang/go/issues/20982

# まとまらないまとめ
* 今回ハマった問題は Visual Studio でビルドしたライブラリを cgo(MinGW) でリンクしようとしたこと
    * MacOSX, Linux は問題なさそげ
* 今のところ Windows では cgo でビルドする時に gcc が要求される
* pure GO で書けば、マルチプラットフォームなバイナリは生成できる
* MinGW でライブラリをコンパイルできるなら、cgo で問題なくビルド & リンクができる
* cgo の clang 対応に期待してます
Python実行環境構築

# はじめに
Pythonの学習やプログラムを組んで遊んでいると、実行環境が色々あることに気付いたので、改めて整理しました。

## 実行環境
Python本体やAnacondaをインストールしたりして、PCの環境を汚すのに抵抗あるひとはたくさんいると思います。だから、用途で使い分ければみんな幸せになります。
私は、tkinterモジュールを使用するときはmac、グラフ機能を使用するときはJupyter、スクリプトを作って遊ぶときはdockerを使用しています。

### mac
macの場合、デフォルトでPython2.7がインストールされています。
しかし、西暦3000年に公開予定の理想のPython3はインストールされていないため、導入が必要です。

Python3は、[本家](https://www.python.org/)からダウンロードして実行するか、macOS 用パッケージマネージャである [Homebrew](https://brew.sh/)を使用する方法があります。なお、[日本のコミュニティサイト](http://www.python.jp/install/macos/index.html)では、Homebrwewを推しています。

また、[本家](https://www.python.org/)のサイト中央の黄色のボタン押すと、お試しでプログラムを実行できることに、最近気づきました!

![スクリーンショット 2018-01-10 00.55.41.png](https://qiita-image-store.s3.amazonaws.com/0/221759/7b8952df-4854-df7a-a114-a9dc1d433b04.png)

### Jupyter Notebook
Anacondaに内臓されているJupyter Notebookは、[tmpng](https://tmpnb.org/)を使用することで同じくWebブラウザ上でPythonのプログラムを実行できます。[tmpng](https://tmpnb.org/)は、Anacondaをインストールしなくても使えます。Pythonを使いたいけど、Anacondaをインストールしたくない方にはおすすめです。

### docker
Anacondaのイメージもdockerで簡単に呼び出して、実行ができます。
以下は、Python3とAnacondaの環境を使用するための手順になります。
dockerが利用できる環境であれば、わずか2ステップで実行できます。

- docker pullでイメージを取得 ※minicondaでAnacondaの中から最小限のパッケージのみに限定  
   `# docker pull continuumio/miniconda3`
- docker runでコンテナを起動  
   `# docker run -i -t continuumio/miniconda3 /bin/bash`

コマンドラインの画面が、Dockerのコンテナのコンソールに変わるので、Pythonを実行できます。
![スクリーンショット 2018-01-11 00.53.24.png](https://qiita-image-store.s3.amazonaws.com/0/221759/618c068b-2bb8-1f72-ee84-0db94aafdca7.png)
Angularの変更検知について

# まずはじめに

Angularで開発している中で、以下のような事象が発生した

- Google Map上でマーカーをクリックした際に、コンポーネントのビューが更新されない

=> Angularの「変更検知」に起因していることが後ほどわかる

---

# そもそもAngularの変更検知とは？

Angularアプリケーションの状態を更新する要因となるのは主に以下の3つ。これらが発生すると、Angularは状態が更新されたとみなし、ビューを更新する。

- **Events** - click, change, input, submitのようなユーザーイベント
- **XMLHttpRequests** - fetchなどの非同期処理
- **Timers** - setTimeout(), setInterval()など

今回のケースはclickイベントであり、一見問題ないように思われる。

---

# Angularの変更検知の仕組み

Angularの各コンポーネントには、**Change Detector**というものが備わっており、イベントや非同期処理などの発生を検知することができるようになっており、変更のたびにビューを更新することができるようになっている。

Change Detectorはコンポーネントと同様ツリー構造になっており、親から子、子から孫へと変更を伝えていく。

---

# 変更検知の要　NgZone（Zone.js）

Change Detectorの実態は**Zone.js**と呼ばれる非同期処理のユーティリティライブラリ。

AngularはこのZone.jsをNgZoneとして内部に備えており、イベントや非同期処理などをモンキーパッチしている。そしてAngularはこのNgZoneの中でコンポーネントのコードを実行している。このような仕組みで変更の検知を行なっている。

---

# コードで確認すると

ApplicationRefクラスに以下のコードがあり、ブートストラップ時に呼び出される。

```ts
// zone.jsでパッチしているコードの処理が完了した時に通知し、
// 変更検知を行うthis.tick()を呼び出す。
this._zone.onMicrotaskEmpty.subscribe({
  next: () => {
    this._zone.run(() => {
      this.tick();
    });
  }
});

//　全てのコンポーネントに対して変更検知のためのdetectChanges()を呼び出す。
tick(): void {
  this._views.forEach(
    (view) => view.detectChanges()
  );
}
```

---

# 最初のGoogle Mapのケースはどういうことだったか？

Google Map上のクリックはAngularの外で発生したものであり、NgZoneにパッチされていなかった。

そのためコンポーネントでの変更検知の対象外となり、いくらクリックしてもビューの更新がなされなかった。

---

# 解決策はあるのか？

NgZoneの`run()`メソッドを使用することで、明示的にNgZoneの内部でコードを実行することができるようになり、Angularに変更検知行させることが可能となる。

```ts
gMarker.addListener('click', () => {
  this.ngZone.run(() => {
    this.markerClick.next(marker);
  });
});
```

---

# 逆に変更検知させたくない場合

NgZoneの`runOutsideAngular()`メソッドの中で実行したコードは変更検知の対象外となる。

```ts
this.ngZone.runOutsideAngular(
  () => this.hogeService.fuga()
);
```

こうすることで、NgZoneの外側でコードを実行することができ、Angularの変更検知を引き起こさないようにすることも可能。

---

# まとめ

Angularの変更検知は通常はほとんど意識する必要はないため、変更検知周りでハマった時に苦労することが多い。

しかし実態はZone.jsであるということがわかれば、そんなに恐れることはない。

詳しく調べて見るとAngularの理解が深まると思う。

---

# 参考にしたもの

- [AngularとZone.jsとテストの話 - Qiita](https://qiita.com/Quramy/items/83f4fbc6755309f78ad2)
- [日本語訳：Angular 2 Change Detection Explained - Qiita](https://qiita.com/lacolaco/items/523d96ddbfe55c4e6949)
- [Angularでイベントから無駄にChange Detectionを走らせないためにすべきこと](https://qiita.com/ukyo/items/1775f5f09bbd9b5c2978)
- [Zones in Angular by thoughtram](https://blog.thoughtram.io/angular/2016/02/01/zones-in-angular-2.html)
- [application_ref.ts - angular/angular](https://github.com/angular/angular/blob/master/packages/core/src/application_ref.ts)

---

# ご静聴ありがとうございました
selene 1.0aで「ModuleNotFoundError: No module named 'webdriver_manager.phantomjs'」と出て起動しない場合の対処

Version1.0aでは、Phantomjsのdriver読み込みが残っているためエラーとなる。開発版(2018/01現在)では削除されているので、開発版をインストールして使用する。
#エラーログ
```bash
Traceback (most recent call last):
  File "test.py", line 9, in <module>
    from selene.api import *
  File "/usr/local/lib/python3.6/site-packages/selene/api/__init__.py", line 1, in <module>
    from selene import config, browser, browsers
  File "/usr/local/lib/python3.6/site-packages/selene/browser.py", line 7, in <module>
    import selene.factory
  File "/usr/local/lib/python3.6/site-packages/selene/factory.py", line 8, in <module>
    from webdriver_manager.phantomjs import PhantomJsDriverManager
ModuleNotFoundError: No module named 'webdriver_manager.phantomjs'
```

#selene開発版のインストール
```bash
pip install git+https://github.com/yashaka/selene.git
```
asteriskでAGIを扱うときにハマったところ

[Redial](http://www.itp-redial.com/class/weekly-notes/week4-notes/agi-scripting-with-python)というAGIのサイトをしてたところでちょっとハマってしまったので共有します。

<b>2018/1/14　Asteriskを入れ直したら権限などが少し変わってたので[ここ](http://yadotech.hateblo.jp/entry/2018/01/14/182416)に書き直しました。</b>

#AGIとは？
Asterisk Gateway Interfaceのこと
WEBサーバーのCGIみたいな感じで
Asteriskでダイアルしたらスクリプトを走らせたりするらしい。

##スクリプトはこんな感じ

```test.py

f = open("test.txt","w")
f.write("This is Test")
f.close()

```

```extensions.conf

exten => 5,1,Answer()
exten => 5,n,AGI(test.py)

```

クライアントから『５』をダイアルするとスクリプト(test.py)を走らせる感じ。

##ハマった所①

**改行コード**
改行コードはLFでないといけなかった。
atomで直した。

https://qiita.com/nyoro_712/items/8c80e32aa49f7a2d2eaf

##ハマった所②

**Pythonの実行パス**
asteriskの実行パスを確認してtest.pyの１行目に記述する。
それぞれ違ってた
まずは`sudo su asterisk`でユーザーasteriskになってから
Pythonのインタプリタに入って

```python

import sys
sys.executable

```

で確認する。
ユーザーが自分の時はanaconda使ってたのにasteriskになるとpython2.7になってた。
なんでや・・

##ハマった所③

**実行権限**

AGIを実行するのはAsteriskでrootではない
てことでちゃんと変更しておく

```shell

sudo chmod 755 test.py
sudo chown asterisk:asterisk test.py

```

#最後に
簡単に書いたけどメチャクチャハマってた。。
建築設備におけるエネルギーデータの分析の課題

# 建築設備のデータとは
建築設備のエネルギーデータとは、主に電力量や水量、ガス量などのデータを扱います。
これらのデータはビルエネルギマネジメントシステム（BMS）というシステムに、
csvやデータベースで保存されていることが多いのですが様々な問題を抱えています。
これらのデータの多くはセンサーからデータを取得します。
センサーのアナログ値をデジタルに変換するため、間に噛ませる機器によっては誤差が大きかったり、
劣化が激しかったりするため、情報の正確さが担保できない場合が非常に多く見受けられます。

# 建築設備のデータ分析における問題点
私のような建築設備のエネルギーデータを分析している人間にとって、下記のような問題点はデータ分析の効率や質を悪化させる大きな問題だと考えています。

1. 人的ミスによるデータの不正確さ
2. 建物オーナーのデータに対する意識の低さ
3. データ分析者の古い体制

## 1.人的ミスによるデータの不正確さ
1．はアナログデータをデジタルに変換する場合の倍率を間違えたり、本来記録されるべきデータがなかったり、
カラム名と実データが違ったりと様々です。
こういったデータに関わる部分のセンサーはゼネコンやサブコンの下請けの下請け的な業者が設置します。
監督しているとはいえ、すべて目が行き届くわけではないため、頻繁に発生する事例です。

## 2. 建物オーナーのデータに対する意識の低さ
2．は蓄積されたデータは大量にあるにも関わらず（正確さなどは別として）データを活用していないオーナーが多いということです。
日々の業務に追われて、蓄積されたデータを活用するところまで手が回らないのが実状かと思われます。

ただ、こう言った物件は、総じてゼネコンサブコンに言われるがままの設計でスタートし、
無駄にエネルギーが使われていることに疑問を抱かない状態のまま改修が行われていることが見受けられます。

## 3. データ分析者の古い体制
3．は主に省エネ業者に多いのですが、建築設備業界では、Excelにとらわれている人が非常に多い。
汎用性があり、扱いやすいのですが、Excelで扱えるデータ量を超えているにもかかわらず、無理やりExcelでデータを並べてみたり、
これがStandardだと言わんばかりに、新しい技術から目を背けている方が多く見受けられます。
仕方のないことかもしれませんが、大量のデータをExcelで操作するにも限度があります。

# Python（pandas）
これらの問題解決のために、Pythonという選択肢があります。
1.が原因の場合、デジタル変換の倍率がおかしい。もしくは、数値が入れ替わってる場合が多く見受けられますが、Pythonでは下記のようなコードで一瞬で見つけられます。何万レコードのデータでも下記のコードで一瞬でグラフ化まですることができます。（下記の例では、赤線の値が異常値です。）

```python3:データ確認
Data = pd.read_csv(r'Data\Data.csv',encoding='Shift-JIS',header=0,skiprows=[1],parse_dates=[0],index_col=[0])
EP = Data[Data.columns[Data.columns.str.contains('電力量')==True]]
plt.plot(EP)
plt.ylabel('電力量[kWh]', fontproperties=fp)
```
![index.png](https://qiita-image-store.s3.amazonaws.com/0/148213/87386dfb-dc92-814e-c9d9-08db27d0ed48.png)


2.の場合、大量のデータをとりあえず渡されて分析して？という依頼が多いかなという印象です。
まず、データ分析におけるオーナーの意識が低い場合は、細かく分析する必要はなく、大枠を示して、可能性の示唆だけすればオーナーの意識も少し変わるかと思います。そんな場合にざっくり分析するなら下記のようなコードを書けば大枠は示せるかと思います。

```python3:データ確認
Data = pd.read_csv(r'Data\Data2.csv',encoding='Shift-JIS',header=0,skiprows=[1],parse_dates=[0],index_col=[0])
EP = Data[Data.columns[Data.columns.str.contains('電力量')==True]]
#リサンプルして、月合計値にしてグラフ化
EP_M = EP.resample('M').sum()
EP_M.plot.bar(x = EP_M.index)
```
![index.png](https://qiita-image-store.s3.amazonaws.com/0/148213/0679593c-fb3d-6521-dbd3-c52757a8eea2.png)



3.の場合、Excelで扱いにくいデータを数行のコードで分析+可視化することを目の前で見せてることでクリアできると考えています。ただ、プログラムを組んだことのない人にとってはハードルは高いようです。しかし、これから多種多様なデータを扱うためには機械的に処理させる方法は学んでおく必要があると思います。下記のコードはそれぞれがグラフを表すコードです。何行のデータだろうがDataframeに読み込んでしまえば各グラフ１行で書けます。（意味があるかは別ですが）

```python3:データ確認
#面グラフ
EP_M.plot.area(x = EP_M.index)
#横棒グラフ
EP_M.plot.barh(x = EP_M.index)
#線グラフ
EP_M.plot.line(x = EP_M.index)
```

![index1.png](https://qiita-image-store.s3.amazonaws.com/0/148213/175174ee-8c86-a7da-95d3-2f1022483f2e.png)

![index2.png](https://qiita-image-store.s3.amazonaws.com/0/148213/734e1875-df4d-c429-5d51-56133e61c4df.png)

![index3.png](https://qiita-image-store.s3.amazonaws.com/0/148213/5862ccfc-ae51-59d9-9ebd-c2813bbd21d8.png)

# まとめ
新しい技術は取り入れるべきで、古き慣習がよい場合もありますが、時代の流れを汲んでいかないと
いつまでも建築業界はITから遅れている業界のままになっていくかと思います。
新しい技術は使っていきたい。そう思った今日この頃でした。
Wercker基礎知識

GitHubで利用できるCIのひとつ、Werckerの基礎知識についてまとめる
##1.Werckerとは
2012年にオランダで誕生したCI-as-a-Service。リポジトリへのソースコミットをトリガーとしてアプリケーションのビルド、テスト、デプロイを自動化できるサービス。読み方は「ワーカー」。
github、bitbucketで利用することができる。

##2.特徴
Werckerは、リポジトリのルートに「wercker.yml」を準備し、その中にテストの実行環境やデプロイコマンドをあらかじめ記載しておくことによりソースがコミットされたタイミングで自動的に記述された処理を行ってくれる。
Werckerでは、その実行環境を"box"、コマンド群を"step"として自作することができ、それを「Wercker Directory」に登録しておくことで様々なテストから実行環境やコマンド群を呼び出すことが出来る。
また、実行環境であるboxにはデフォルトで用意されたもの以外にも自分で用意したdockerイメージを設定することも出来たりと、設定の自由度が高いのが特徴。

##3.仕組み
![pipline (1).jpg](https://qiita-image-store.s3.amazonaws.com/0/222268/19d4063d-5f73-389b-97c8-fbfb439988fe.jpeg)
Werckerには"パイプライン"という概念がある。
パイプラインとは、1つのCIプロセスを複数のパイプラインに分割して組み合わせる機能のことである。Werckerでは"build"フェーズと"deploy"フェーズに分けられ、各フェーズはコマンド群である"step"で構成されている。そして、全てのフェーズは一つの実行環境"box"内で実行される。

1つのパイプラインは1つのwercker.ymlに記述され、下記のようにboxとbuildフェーズ、deployフェーズを記載し、フェーズの中にはstepを記載していく。

![yml.jpg](https://qiita-image-store.s3.amazonaws.com/0/222268/d807a771-6fb1-25e5-fd65-eabffa3de31f.jpeg)

##4.まとめ
・実行環境やビルド、デプロイコマンドを予め登録しておけるので設定の自由度が高く、かつ設定ファイルを簡潔に記載できる。
・無料で使えて、かつ対応しているCIツールが少ないbitbucketに対応している。
・全ユーザーがキューを共通利用しているらしいので、時々重くなることがある。

[Wercker導入手順](https://qiita.com/k_g/items/7188c59ed79b0c875dd0)
C++erがRustを勉強する時に間違えやすいポイント

C++erがRustを勉強し始めると、「あれ、思ってた動きと違う」と思う事があります。
そんな時は、この投稿を参考にしてみてください。


### 基本moveです

ある変数を関数に渡した場合、基本moveになります（i32,f32等のプリミティブ型はコピーになる）

moveというのは、内部的にはmemcpyしているという事で、move元の方は、もう使えなくなります。

```Rust
fn test(v: Vec<i32>) {
    println!("{:?}", v);
}

fn main() {
    let mut v = vec![1,2,3];  // vectorを作成
    v.push(4);  // OK
    test(v);    // ここでmoveされる！
//    v.push(5);  // もうmoveされちゃってるのでエラー
}
```

https://play.rust-lang.org/?gist=7f1f6c209fa8fe77ced725c18adcfbf3&version=stable

C++でvectorをmemcpyなんてしたら大変なことになりますが、Rustではちゃんとmove元の方を使えなくしてくれるので、問題ありません。

-----
### &（参照）の使い方がちょっと違う
Rustでは、参照を渡すときも&つける

```Rust
fn test(v: &Vec<i32>) {  //参照で受け取るようにした
    println!("{:?}", v);
}

fn main() {
    let mut v = vec![1,2,3];  // vectorを作成
    v.push(4);  // OK
    test(&v);    // ここでも&をつける！
    v.push(5);  // moveされてないのでOK
}
```

https://play.rust-lang.org/?gist=1515bbe72d328f8b1b23eebf6a91949c&version=stable


-----
### mutはconstの反対ではない

ミュータビリティは、C++には無い概念です。
ドキュメントを読んでると、あ、constが反対になったんだなと思ってしまいがちですが、違います。

- C++のconstは、その変数が不変である事を強制するもの
- Rustのmutは、これからこの変数を書き換えますよ、とコンパイラに伝えること

だいたいこんなイメージです。
※いろいろ試しているうちに、わかるようになりますので、そんなに心配しなくても大丈夫です。

[参考]
https://rust-lang-ja.github.io/the-rust-programming-language-ja/1.6/book/mutability.html
phpstormでデプロイ先が外れてしまったら確認する所

#結論
file → settings → Build,Exception,Deployment → Deployment → Mappingsタブの中のDeployment path on serverというところで設定すると直った。

#起こった現象
プロジェクト内のファイルを右クリックしてDeployしていたのが
デプロイ先が出てこなくなった。
Choose server to upload toという小さいウィンドウが出てくるだけになった。

#備考
なおremotehostウィンドウの設定もfile → settings → Build,Exception,Deployment → Deploymentでできる
Activity間のObject引き渡し（Gson）

# 方法
以前ObjectでSerializableをimplementsした方法を記載しました。
[Activity間のObject引き渡し](http://qiita.com/ijichi_y/items/7a45140d075b2466073f "Activity間のObject引き渡し")

今回はGsonを使用してObjectを引き渡します。

# 実装

## Gradle

```build.gradle
dependencies {
    // Gson
    compile 'com.google.code.gson:gson:2.8.0'
}
```

## Object
Activity間で引き渡すobject

```DataState.kt
data class DataState(
    val id: Int,
    val name: String
)
```

## Activity
引き渡し元

```MainActivity.kt
class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val intent = Intent(this, SecondActivity::class.java)
        val state = DataState(0, "name0")
        // Gsonで Object → String
        intent.putString(SecondActivity.KEY_STATE, Gson().toJson(state)) 
        startActivity(intent)
    }
}
```

引き渡し先

```SecondActivity.kt
class SecondActivity : AppCompatActivity() {

    companion object {
        val KEY_STATE = "key_state"
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_second)

        val stateStr = intent.getString(KEY_STATE)
        // Gsonで String → Object
        val state = Gson().fromJson<DataState>(stateStr, DataState::class.java)
        
        if(state is DataState){
            println(state.id)
            println(state.name)
        }
    }
}
```

# 出力結果

```
0
name0
```

# list objectの引き渡し

## Activity
引き渡し元

```MainActivity.kt
class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val states = arrayListOf<DataState>()
        for(i in 0..2){
            val state = DataState(i, "name$i")
            states.add(state)
        }

        val intent = Intent(this, SecondActivity::class.java)
        // Gsonで List<Object> → String
        intent.putExtra(SecondActivity.KEY_STATE, Gson().toJson(states))
        startActivity(intent)
    }
}
```

引き渡し先

```SecondActivity.kt
class SecondActivity : AppCompatActivity() {

    companion object {
        val KEY_STATE = "key_state"
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_second)

        val statesStr = intent.getStringExtra(KEY_STATE)
        // Gsonで String → List<Object>
        val states = Gson().fromJson<List<DataState>>(statesStr, object : TypeToken<List<DataState>>() {}.type)

        states.forEach {
            println(it.id)
            println(it.name)
        }
    }
}
```

# list object 出力結果

```
0
name0
1
name1
2
name2
```

# まとめ
Serializableをimplementsするより簡単
acts-as-taggable-onを使ってtag機能を作成したときに大量のN+1が発生するやーつ

# やったこと
- [acts-as-taggable-on](https://github.com/mbleigh/acts-as-taggable-on)を使って、tag機能を実装

＊具体的な使い方などは割愛します。適宜リファレンスなどを参照してください。

# なにがおきたか
- includeしたはずなのに、viewで呼び出すとsqlが発行され、tagが大量の N+1を発生させる

# 実際に書いてたコード
```ruby:postモデル
acts_as_taggable_on
```

```ruby:taggingモデル
has_many tags
```

```ruby:tagモデル
belong_to tagging
```

``` ruby:posts_controller

Post.include(tagging: :tag)

```

```ruby:view
@post.tags_list
```
* tags_listはgemの中で定義されているdefalultのメソッド
* tagの名前を配列で返してくれる

=> **レコードの数だけ tagが呼ばれてしまう。**


# 解決策

下記のようにコードを変更

```ruby:posts_controller
Post.include(:tag)
```

```ruby:view
@post.tags.pluck(:name).join("<br />").html_safe
```

どうやら、includeの書き方とメソッドの呼び出し方でsqlが変化するようだ。
これがライブラリーの怖さでもある
Java REPL が便利過ぎた

# REPL
*Read-Eval-Print-Loop* の略。
入力受付-入力解釈・評価-結果表示のループ、とでも訳せるだろうか。

大雑把に言うとshやcmdみたいなみんな大好き黒背景のアレとかブラウザF12のコンソールとかそこらへんのこと。
スクリプト言語にはREPLが標準装備されていることも多く、「あれってこういう時どんな挙動したっけ」を「REPLで試せよ」と一言で解決できる素晴らしい逸品。
**Java では 9 から標準装備される。**


# でも
* 9 入れるのめんどくさい！ メジャーバージョンアップなんてそうそうやってられるか！
* 諸々の事情で入れられない！ ヘタに環境汚せないんだよ！
* ~~Javaなんぞに手間かけたくないんだよ！ いいから趣味コード書かせろ！~~


そんな人向けのものがこちら。

Java REPL (Albert Latacz)
http://www.javarepl.com/term.html
https://github.com/albertlatacz/java-repl

# つかいかた

## by Browser
1. http://www.javarepl.com/term.html へアクセス。
2. 試したいのを適当に打つ。Enter。
3. 結果が出る。

## by Console
1. https://github.com/albertlatacz/java-repl をcloneしてビルドするなりビルド済みjarを落とすなり。
2. java -jar javarepl.jar 


# Why REPL makes you happy?
もうずっと昔から言われてますが、Javaって試すのがくっそダルい！いや、コンパイル型 (この言い方ももう古くなってきてるなあ) の言語はみんなそうだけど、Javaは特に。
REPLの存在は本当にありがたいのです。ちょっと標準の挙動試したいだけなのにmainのクソみたいなボイラープレート書くなんてやってられないからね！
単体プログラムでpdfを書き出し（Java/Perl/VBA）

## 概要

・PDF形式のファイルを、テキストで書き出します
・PDFファイルは通常、ファイル内で、部分的に圧縮されていますが、このツールでは、全てテキストで書き出しています。（ので、ファイル容量は大きくなります）
・文字を書く、線を引く、と言った基礎的なメソッドはあり、プログラムで制御できます（画像の出力は対応してません）


## 作例
(注:このファイルは、書き出し後圧縮済み)

https://github.com/santarou6/tokumori/blob/master/guruguru1.pdf
https://github.com/santarou6/tokumori/blob/master/guruguru2.pdf
https://github.com/santarou6/tokumori/blob/master/guruguru3.pdf
https://github.com/santarou6/tokumori/blob/master/guruguru4.pdf

## ソース
ソースは一式ここにあります
https://github.com/santarou6/tokumori
[リンク](https://github.com/santarou6/tokumori)


※　「トクモリ」の名は、「特盛」から来ています。じゃんじゃんPDFを作成出来るので、たくさん食べてもらいたい（？）という発想です。



## 実行例

```
java

c:\> javac eater.java
c:\> java eater > out.pdf


perl

c:\> eater.pl > out.pdf


excel

do "mainEater" from macro
```
AndroidTestに作ったDaggerのComponentが生成されない

Daggerをすでに導入していてUIテストでハマってる人向けです。

やりたいこと
1. Daggerを使う
2. バックエンドをモックした上でUIテストをする

この場合テスト用のComponentを`androidTest`に作り(`TestComponent`とする)、生成される`DaggerTestComponent`を使用します。

ですがこの`DaggerTestComponent`が生成されない。エラーも出ていない。
この時は以下をやる必要があります。

1. `build.gradle`に`kaptAndroidTest "com.google.dagger:dagger-compiler:${daggerVersion}"`を追加する

2. Android Instrumented Testを走らす(Rebuild Projectではない)

以上です。
PythonからJuliaを呼び出したいんだ（Notebook編）

# 本日は

[PythonからJuliaを呼び出したいんだ](https://qiita.com/SatoshiTerasaki/items/9d775c294a10c1f2edfe)

の続編としてPythonがカーネルであるJupyterNotebook上でJuliaのコードを呼び出す方法についてノベマス．

# 準備（インストール）

pyjuliaをインストールします．
インストール方法については
[PythonからJuliaを呼び出したいんだ](https://qiita.com/SatoshiTerasaki/items/9d775c294a10c1f2edfe)
を参照してください．

# 使用方法

Notebookのcell に

```notebook
%load_ext julia.magic
```

のおまじないを書きます．Juliaのインタープリタを起動するため少々お時間をいただきます．

上のおまじないをかけたら
Juliaのコードを書きたいセルの頭に
`%%julia`を書きます．

下図のようにノートブックを書いていくと良いです．

<img width="979" alt="スクリーンショット 0030-01-10 午後8.40.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/135978/9741fbea-060b-a6b3-8d4c-27df9fd40a73.png">

# 欠点

Pythonの実行結果はノートブック上に出てくるのですが，Juliaでのprintlnなどの出力結果はターミナルの方に出ます．　Mac，Windowsでも同じような現象が起きています．


# 参考文献
- [Best way to run Julia code in an IPython notebook (or Python code in an IJulia notebook)
](https://stackoverflow.com/questions/24091373/best-way-to-run-julia-code-in-an-ipython-notebook-or-python-code-in-an-ijulia-n)
Amazon SageMakerでml.p2.xlargeを使おうとしたらResourceLimitExceededって怒られた


# 事象
Amazon SageMakerで `ml.p2.xlarge` を使って学習させようとしたら以下のエラーが出て学習ができなかった。

```
ResourceLimitExceeded: An error occurred (ResourceLimitExceeded) when calling the CreateTrainingJob operation: 
The account-level service limit for training-job/ml.p2.xlarge is 0 Instances, with current utilization of 0 Instances and a request delta of 1 Instances. 
Please contact AWS support to request an increase for this limit.
```

# 原因
AWSでは利用できるリソースに制限があります。
詳しくは[こちら](https://docs.aws.amazon.com/ja_jp/general/latest/gr/aws_service_limits.html)のページをご確認ください。

Amazon SageMakerにも制限があり、[こちら](https://docs.aws.amazon.com/ja_jp/general/latest/gr/aws_service_limits.html#limits_sagemaker)では `ml.p2.xlarge インスタンス` のデフォルトの制限は `1` となっています。

# 対策
AWSのサポートに連絡して制限を緩和してもらいましょう。

1. AWSのコンソールにログイン
2. 右上の `サポート` から `サポートセンター` のページを表示
3. `ケースの作成` を押下
4. 内容で `サービス制限の増加` を選択
5. 制限タイプで `SageMaker` を選択
6. リージョン、リソースタイプ、制限をそれぞれ選択
7. 新しい制限値を入力
8. 適当に理由を書いて `送信` を押下

~~１営業日程度で対応してくれます。~~
海外のリージョンの申請は海外の担当部署と調整が必要らしく、少し時間がかかるかも

他のサービスも色々制限があったりするので、申請方法を覚えておきましょう。