OmniAICreator/Qiita-1.07M huggingface dataset:
Pandas データフレーム　列の値の出現頻度のカウント

以下で列内の値の出現頻度の確認をすることができる。

df["X"].value_counts()


参考文献
以下の163ページ
https://www.amazon.co.jp/Python%E3%81%AB%E3%82%88%E3%82%8B%E3%83%87%E3%83%BC%E3%82%BF%E5%88%86%E6%9E%90%E5%85%A5%E9%96%80-%E2%80%95NumPy%E3%80%81pandas%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%9F%E3%83%87%E3%83%BC%E3%82%BF%E5%87%A6%E7%90%86-Wes-McKinney/dp/4873116554
AmazonLinuxにtesseract-ocrをインストールする時にハマった

# この記事について
* pyocrでtesseract-ocrを使いたく、Amazon Linuxにtesseract-ocrをインストールしようとしたが、、
* 少しハマった。ので下記にメモ
* 結局、下記でyumで普通にインストールできました。。

# 結論
* yumの参照リポが、**amzn-main** になっているので、インストール時に **epel** を見るようにする。
* 下記で、tesseractと英語、日本語言語パックがインストールされる
* あとは、pyocrから叩くなり、そのまま使うなり、お好きにどうぞｗ

```console
# 前提ライブラリインストール
$ sudo yum --enablerepo=epel --disablerepo=amzn-main install libwebp

# tesseractと言語パックをインストール
$ sudo yum --enablerepo=epel install tesseract tesseract-en tesseract-langpack-jpn
```

# 手動インストール手順（yumで入れるなら不要な手順）
* 以下、epelに気づくまでに、手動でコンパイルしようとした時の作業メモです。
* **yumでインストール**するなら **不要な手順** です。
* 何の役に立つかわかりませんが、一応残しておきます。。

## 前提環境の導入
* [公式HP](https://github.com/tesseract-ocr/tesseract/wiki/Compiling#dependencies)に記載の手順で実施する。
* 前提環境は下記
    * A compiler for C and C++: GCC or Clang
    * GNU Autotools: autoconf, automake, libtool
    * autoconf-archive
    * pkg-config
    * Leptonica
    * libpng, libjpeg, libtiff
* **autoconf-archive** がyumでインストールできないので、自力コンパイル

```console
$ wget http://ftp.jaist.ac.jp/pub/GNU/autoconf-archive/autoconf-archive-2017.09.28.tar.xz
$ tar xvf autoconf-archive-2017.09.28.tar.xz
$ cd autoconf-archive-2017.09.28
$ ./configure && make && make install 
```

* で、**ハマったのが**、この手順。**make install**だけじゃなく、下記のコピーが必要！（★重要★）

```console
# copy the generated macros to /usr/share/aclocal/, such that autogen.sh can find them
$ cp ./m4/* /usr/share/aclocal/
```

## tesseract-ocrのコンパイル
* あとは、手順通りインストールすれば導入可能

```console
$ git clone https://github.com/tesseract-ocr/tesseract.git tesseract-ocr
$ cd tesseract-ocr
$ ./autogen.sh
$ make && make install
```

## ★重要★の手順を実施しないと、
* 下記のように、configureの *AX_CHECK_COMPILE_FLAG(-mavx, avx=true, avx=false)* でエラーとなる。

```console
$ ./configure
checking for g++... g++
checking whether the C++ compiler works... yes
checking for C++ compiler default output file name... a.out
checking for suffix of executables...
checking whether we are cross compiling... no
checking for suffix of object files... o
checking whether we are using the GNU C++ compiler... yes
checking whether g++ accepts -g... yes
Using git revision: 4.00.00dev-728-g40f43111
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for a thread-safe mkdir -p... /bin/mkdir -p
checking for gawk... gawk
checking whether make sets $(MAKE)... yes
checking for style of include used by make... GNU
checking whether make supports nested variables... yes
checking dependency style of g++... gcc3
checking whether to enable maintainer-specific portions of Makefiles... no
checking build system type... x86_64-unknown-linux-gnu
checking host system type... x86_64-unknown-linux-gnu
./configure: line 4201: syntax error near unexpected token `-mavx,'
./configure: line 4201: `AX_CHECK_COMPILE_FLAG(-mavx, avx=true, avx=false)'
```
Git:ローカルでブランチを作って、ブランチをリモートにプッシュする

# 概要

gitよくわからん〜〜

git flow運用のレポジトリに、ブランチきってプッシュする？方法のメモ。理解なさすぎて、表現正しいのかもわからんぞ

# はい


**スタート時**

```
git checkout -b features/hoge-107
git push -u origin features/hoge-107
```

**途中コミット時**


```

```


# memo

`git branch -a` : リモートのブランチ一覧表示
Project Euler 45「三角数, 五角数, 六角数」

# Problem 45 「三角数, 五角数, 六角数」
三角数, 五角数, 六角数は以下のように生成される.

```
三角数　Tn=n(n+1)/2 　1, 3, 6, 10, 15, ...
五角数　Pn=n(3n-1)/2　1, 5, 12, 22, 35, ...
六角数　Hn=n(2n-1) 　 1, 6, 15, 28, 45, ...
```

T285 = P165 = H143 = 40755であることが分かる.
次の三角数かつ五角数かつ六角数な数を求めよ.

```python
def hoge():
    n = 143
    while True:
        n += 1
        Hn = n * (2 * n - 1) # 増加幅の大きい六角数を基に
        # 五角数と三角数のチェック
        if (((24 * Hn + 1) ** 0.5 + 1) / 6).is_integer() and \
           (((8 * Hn + 1) ** 0.5 - 1) / 2).is_integer():
            return Hn

print(hoge())
```
homebrewで過去のバージョンのソフトウェアをインストールする

# はじめに
開発環境の統一などの理由により、ソフトウェアのバージョンを指定してインストールしなければならない場面がしばしばあります。
ここでは、homebrewにおける過去のソフトウェアインストール方法を説明します。

# 手順

## 既にインストールされている新しいバージョンを削除する
依存関係にも注意してください。
何もインストールしていない場合は飛ばしましょう。

```shell:console
brew uninstall <formula> # アンインストール
# brew uninstall hive hadoop # hiveの場合。hadoopが依存関係

brew cleanup -s # キャッシュ削除、-sオプションは削除内容を表示
```
`unlink`とかで残しながらでも行けるのかな？未検証。


## 所望のFormulaを取りに行く
gitと戯れます。

```shell:console
cd /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core/Formula # Formulaへ移動
git fetch --unshallow # 全コミットをぶち抜く

git log <formula.rb> # コミットログを確認し、コミットハッシュをメモる
#git log hive.rb # hiveの場合

git checkout <commitID> <formula.rb>　# 対象ファイルを巻き戻す
# git checkout 16ebe5f1843e6cb54856311ff0f676be53007329 hive.rb hadoop.rb # hive2.1.1の場合
```

## インストールする
`HOMEBREW_NO_AUTO_UPDATE=1`が重要。
これを指定しないと最新版がインストールされてしまいます。

```shell:console
HOMEBREW_NO_AUTO_UPDATE=1 brew install hive
```

以上で、過去のバージョンのソフトウェアをインストールできるはずです。

# 参考文献
* https://qiita.com/honeniq/items/778cc08d2db78e6774d8
* https://rcmdnk.com/blog/2016/11/15/computer-mac-homebrew-brew-file/
Office 365 とそのアイデンティティ基盤を使用したプログラミング

<p>この投稿は東京渋谷ヒカリエ 8 階にある <a href="http://aka.ms/aajp" target="_blank">Azure Antenna</a> で実施された「Office 365 とそのアイデンティティ基盤を使用したプログラミング」で使われた資料のご案内です。</p>

- <strong>Office 365 とそのアイデンティティ基盤を使用したプログラミング</strong><br />
https://onedrive.live.com/view.aspx?resid=9C0AF81B735E29EA!20742&ithint=file%2cpptx&app=PowerPoint&authkey=!AL7p1X-6KYmSB2U

<p>:satellite:&nbsp;&nbsp;新しいイベントの情報は、Connpass の <a href="http://aka.ms/aajp" target="_blank">Azure Antenna サイト</a>よりご確認いただけます。</p>

<p>:arrow_backward:&nbsp;<a href="https://qiita.com/AzureAntenna/items/71f394c100fbfa8ddcc8">「Azure Antenna 実施イベント資料（カテゴリ別）」に戻る</a></p>
PowershellとWSL

大量のログファイルから特定の文字列を含む行のみ取得してファイルに出力という処理を
当初Powershellで行っていたがWindows Subsystem for LinuxのUbuntuを使用したらやはりWSLの方が圧倒的に速い。
具体的な時間は計っていないが前者は分単位で時間がかかっていたが後者は数秒で終わった。

使用したコマンドは

【Powershell】
Get-Content ".\*.log" | Select-String "含む文字列1","含む文字列2" | Out-File -FilePath "ファイル名.log" -Width 99999

Get-Contentで取得元ファイル指定（ワイルドカード可）、Select-Stringで行に含む文字列を指定、Out-Fileに出力ファイルや一行の最大文字数を指定している。
（Out-Fileは１行が長いと自動で折り返される。ていうかLinuxと同じで>や>>でリダイレクト出来てそれだと折り返されないのか…）
Select-Stringのカンマ区切りはor文。
もっと複雑な条件を指定したい場合はSelect-StringではなくWhere-Objectを使用した。
一行が１万文字を超える行があったので何が何でも自動で折り返されないようOut-Fileの-Widthはヤケクソに99999を指定した。

【WSL（というかLinux）】
cat "./*.log" | grep -e '含む文字列1' -e '含む文字列2' > "ファイル名.log"

catで取得元ファイル指定（ワイルドカード可）、grepで行に含む文字列を指定（-eでor条件）、>で出力ファイル指定。
iPhoneアプリ起動時のコントローラーを動的に変更する2つの方法

# iPhoneアプリ起動時のコントローラーを動的に変更する2つの方法

## 需要
たとえばユーザー登録の必要なアプリでは、初回起動時は登録画面、セッションが切れたらログイン画面、通常時はメインの画面を開きたいという需要は多いはず。
その際、ナビゲーションバーを使ってないアプリの場合と使っているアプリでコードに差があって少しばかりはまってしまったので、小ネタとしてあげておく。

## ナビゲーションコントローラー無し
### 構成
* loginViewController
* mainViewController

![image.png](https://qiita-image-store.s3.amazonaws.com/0/157437/2ea6b694-6821-9a23-ead2-151f4d25ae2c.png)

エントリーポイントがメイン画面にある。別にログイン画面でも良いんだが、ログイン処理はログイン画面でやっても起動時のログイン済み確認はログイン画面開く前の AppDelegate.swift でやるから、そしたらログイン画面よりもメイン画面をスタートにしてログインしてないときだけスタートをログイン画面にした方が良いかなと思ってこうした。

### コード

```AppDelegate.swift
     /// ルートViewの変更
     func changeRootView() {
        //利用するストーリーボードを指定
        let storyboard:UIStoryboard =  UIStoryboard(name: "Main",bundle:nil)
        // storyboard ID で遷移先コントローラーを変更(ナビゲーションコントローラー使ってない場合)
        let viewController : UIViewController = storyboard.instantiateViewController(withIdentifier: "loginViewController") as UIViewController
        window?.rootViewController = viewController
    }
```

とりあえず、AppDelagete で使えるところに上記コードをペタッと貼りましょう。
そんで、""で囲まれてる"Main"と"loginViewController"を自分の環境に合わせましょう。
Mainはストーリーボード名(Main.storyboard)のことで、一個しかないならたぶんコレ。
loginViewController はスタート画面に変更したいコントローラーの Storyboard ID ね。ストーリーボードで変更できるやつ。
で、最後にスタート画面を変更したい条件を満たしたら changeRootView を呼び出せばそれだけで変更されてます。



## ナビゲーションコントローラーあり
### 構成
* loginViewController
* mainViewController
* navigationController

![image.png](https://qiita-image-store.s3.amazonaws.com/0/157437/92ba2243-8ecb-e0e1-e370-00c27810d6a7.png)

エントリーポイントがナビゲーションコントローラーにあり、メイン画面に線が延びているので通常何も設定しない場合はメイン画面が起動し、ナビゲーションバーが表示されている。
あとはさっきと同じです。

実を言うと先ほどのコードで同じようにスタート画面の切り替えはできます。
切り替えはできるのですが、ログイン画面をスタート画面にした場合、ナビゲーションコントローラーが無くなり、画面から消えてしまいます(コードで取得しようとすると nil になる)

### コード

```AppDelegate.swift
     /// ルートViewの変更
     func changeRootView() {
        //利用するストーリーボードを指定
        let storyboard:UIStoryboard =  UIStoryboard(name: "Main",bundle:nil)

        // storyboard ID で遷移先コントローラーを変更(ナビゲーションコントローラー使っている場合)
        let viewController : UIViewController = storyboard.instantiateViewController(withIdentifier: "loginViewController") as UIViewController
        let navigationController: UINavigationController = self.window!.rootViewController as! UINavigationController;
        navigationController.pushViewController(viewController, animated: false)
    }
```

で、その答えが↑こんな感じ。ちゃんとナビゲーションコントローラーを取得して、ナビゲーションコントローラーの func を使って遷移しましょう。っていうそんだけでした。
下手に一個目の方法で切り替えができていたので、そんだけのことになかなか気づかずにいろいろ調べ回ってしまったので、後続の方はコレを読んでスマートにサクッと開発してくださいな。
Node.js ではじめる Bot 開発 (基本編) 

<p>この投稿は東京渋谷ヒカリエ 8 階にある <a href="http://aka.ms/aajp" target="_blank">Azure Antenna</a> で実施された「Node.js ではじめる Bot 開発 (基本編) 」で使われた資料のご案内です。</p>

- <strong>Node.js ではじめる Bot 開発 (基本編)</strong><br />
https://blogs.msdn.microsoft.com/osamum/2017/09/21/howto_make_bot_nodejs/

<p>:satellite:&nbsp;&nbsp;新しいイベントの情報は、Connpass の <a href="http://aka.ms/aajp" target="_blank">Azure Antenna サイト</a>よりご確認いただけます。</p>

<p>:arrow_backward:&nbsp;<a href="https://qiita.com/AzureAntenna/items/71f394c100fbfa8ddcc8">「Azure Antenna 実施イベント資料（カテゴリ別）」に戻る</a></p>
つまずかない！？TigerVNCでリモートデスクトップ

# 環境
サーバ: Ubuntu 17.10 (GNOMEデスクトップ)
クライアント: Windows 10 Pro
接続環境: LAN (+ VPN)

# Ubuntu側
## TigerVNCのインストール

```
sudo apt install tigervnc-standalone-server
```

開いているデスクトップの画面をリモートでも共有したい場合は次のコマンドも実行しておきましょう。

```
sudo apt install tigervnc-scraping-server
```

## パスワードの生成
VNCに接続するためのパスワードを設定します。

```
tigervncpasswd
```

パスワードは6～8文字の間で設定してください。5文字以下は短すぎると言われて弾かれ、9文字以上は8文字に切り詰められます。💩

View-onlyパスワードは設定しなくても構いません。設定したパスワードは`~/.vnc/passwd`に保存されます。

## VNCサーバの起動
ここが最重要ポイントです。SSHセッションなどから起動する場合は次のコマンドで起動します。

```bash
tigervncserver -localhost no
```

**`-localhost no`がないと別のコンピュータからLAN等を経由して繋げません！**かなり大きなトラップです。

このコマンドを実行した後は、実行すると接続できますよと提示されたコマンドの**コロン`:`とその直後の数字を確認してください。**(大体は`:1`だと思います)SSHセッションなどを閉じても構いません。

すでに起動しているデスクトップをミラーリングしたい場合は次のコマンドを入力します。

```bash
x0tigervncserver PasswordFile=$HOME/.vnc/passwd
```

**オプションを忘れると、パスワード認証の段階で失敗します。**こちらはCtrl+Cで終了するタイプです。

## VNCクライアントのインストール

エンジニアたるものChocolateyを使ってインストールしましょう。PowerShellを管理者で開き、次のコマンドを入力してインストールします。

```powershell
cinst -y tigervnc-viewer
```

Macの人はHomebrewなりでインストールしてください。

## VNCクライアントから接続
スタートメニューからTigerVNC Viewerを探して起動します。VNC Serverの入力欄があるので、例えばサーバ側のIP(ホスト名が割り当てられている場合はホスト名を入力してください)が`192.168.11.45`の場合、`tigernvcserver`で起動した場合は`192.168.11.45:1`と入力します。ここで、`:1`はサーバ起動時に確認したものと合わせるようにしてください。`x0tigervncserver`で起動した場合は`:1`などは不要で、IPまたはホスト名そのままを入力してください。

入力したらConnectボタンを押します。上手く接続できた場合は`tigervncpasswd`で設定したパスワードの入力を求められますので、入力し、OKボタンを押します。パスワードが合っていた場合はサーバのデスクトップ画面が出ます。なお、`:`及びその後の数字を間違えた場合は、`unable connect to socket: Connection refused (10061)`というエラーメッセージが出るなどしますので、慌てないようにしてください。(`:`の後の数字によって使用するポート番号が異なるためです)

# SSH経由でサーバを起動する場合
 
`tigervncserver`をSSHセッションから実行し、その後ログアウトするとVNCサーバが終了してしまいます。tmux経由で起動してもダメです。💩なぜだ

個人的にはtmuxで新しくセッションを作り、そこから`-fg`オプションを付けて

```
tigervncserver -fg -localhost no
```

とするといい感じです。終了はCtrl+Cで行います。

# SSHトンネルを使用する場合
## VNCサーバの起動

SSHなどでtmuxセッションにアタッチし、次のコマンドを実行します。

```
tigervncserver -fg
```

すると、VNCサーバが起動します。`-localhost no`は不要です。tmuxセッションからデタッチしてもサーバは起動しっぱなしです。

次に、次のコマンドで、SSHトンネルを有効化します。

```bash
ssh -CNfL 5901:localhost:5901 192.168.11.45
```

SSHトンネルは`localhost`の5901番ポートをクライアントの5901番ポートに転送するように掘ります。
`-C`は圧縮有効化、`-N`はBashなどのコマンドを実行しない(トンネルなどだけ)、`-f`はバックグラウンドでSSHを実行という意味です。

## クライアントからの接続

クライアントからは`localhost:1`に接続します。VNCのパスワードを入力すると、リモート側の画面が見えるはずです。
Microsoft Bot Framework と Cognitive Services を活用した業務サポート BOT 構築

<p>この投稿は東京渋谷ヒカリエ 8 階にある <a href="http://aka.ms/aajp" target="_blank">Azure Antenna</a> で実施された「Microsoft Bot Framework と Cognitive Services を活用した業務サポート BOT 構築」で使われた資料のご案内です。</p>

- <strong>Microsoft Bot Framework と Cognitive Services を活用した業務サポート BOT 構築</strong><br />
https://www.slideshare.net/osamum/microsoft-bot-framework-cognitive-services-bot

<p>:satellite:&nbsp;&nbsp;新しいイベントの情報は、Connpass の <a href="http://aka.ms/aajp" target="_blank">Azure Antenna サイト</a>よりご確認いただけます。</p>

<p>:arrow_backward:&nbsp;<a href="https://qiita.com/AzureAntenna/items/71f394c100fbfa8ddcc8">「Azure Antenna 実施イベント資料（カテゴリ別）」に戻る</a></p>
high sierraでfiles broken，「壊れているため開けません。 ゴミ箱に入れる必要があります。」

ふだん使いのmacをMacBook Air with El CapitanからMacBook with high sierraにあげたんやけど，
> 「“Hogehoge.pdf”は壊れているため開けません。 ゴミ箱に入れる必要があります。」

というエラーが出ます．「[Macで"壊れているため開けません"の古いappを開く](https://qiita.com/quattro_4/items/f5b56c1897c0cc235c0f)」あるいは「[移行アシスタントでデータ移行したファイルが開けない (OSX High Sierra)](https://qiita.com/yuyhiraka/items/df8672130a6b5ef6b961#_reference-6152f599d52f59772dc4)」に従って，一つ一つ，
> xattr -c Hogehoge.pdf

したり，あるいは-rで全部変更してましたが，down loadあるいはmailのattachされたfileでも同様のエラーが出ます．下手こぐとdvipdfmxで作ったpdfも．

いろいろ探したんですが，これも[イーサネットの不具合](https://qiita.com/daddygongon/items/e6989bcc3ded5a2d78a9#_reference-e813350074f1d1ae326b)と同様にkextと関連がありそう．ただhigh sierraではsecurityとprivacyから「すべてのアプリケーションを許可」というのが消えているのですが．．．「[ここ](http://osxdaily.com/2015/05/04/disable-gatekeeper-command-line-mac-osx/)」にしたがって，terminalから
> sudo spctl --master-disable

して，ポチッとすると解消されました．ちょっとね．．．

これはmigration(移行アシスタント)で古いosからデータ移行すると起こるようです．多分，データ移行前に元マックのosをhigh sierraに合わせておけば起こらないと思います．元マックをあげるところまではできたんですが，1日の作業ですでに数メガの不一致ができているんで，同期が怖くて諦めました．次の時にはちゃんと準備しよう．タイムマシーンか．．．
IaaS や PaaS のリソースを、コードで自由自在に操る Azure Infrastructure as Code の基礎

<p>この投稿は東京渋谷ヒカリエ 8 階にある <a href="http://aka.ms/aajp" target="_blank">Azure Antenna</a> で実施された「IaaS や PaaS のリソースを、コードで自由自在に操る Azure Infrastructure as Code の基礎」で使われた資料のご案内です。</p>

- <strong>IaaS や PaaS のリソースを、コードで自由自在に操る Azure Infrastructure as Code の基礎</strong><br />
https://www.slideshare.net/ToruMakabe/azure-infrastructure-as-code

<p>:satellite:&nbsp;&nbsp;新しいイベントの情報は、Connpass の <a href="http://aka.ms/aajp" target="_blank">Azure Antenna サイト</a>よりご確認いただけます。</p>

<p>:arrow_backward:&nbsp;<a href="https://qiita.com/AzureAntenna/items/71f394c100fbfa8ddcc8">「Azure Antenna 実施イベント資料（カテゴリ別）」に戻る</a></p>
話題の Cosmos DB と App Service によるグローバル分散アプリ構築のコツ

<p>この投稿は東京渋谷ヒカリエ 8 階にある <a href="http://aka.ms/aajp" target="_blank">Azure Antenna</a> で実施された「話題の Cosmos DB と App Service によるグローバル分散アプリ構築のコツ」で使われた資料のご案内です。</p>

- <strong>話題の Cosmos DB と App Service によるグローバル分散アプリ構築のコツ</strong>
  - Cosmos DB と App Service によるグローバル分散アプリ構築のコツ<br />
https://slideship.com/users/@miyake/presentations/2017/12/VqYwpuMVzfwVnjiNsapS7u/ 
  - ハンズオンマテリアル<br />
https://github.com/zenarchitects/cosmosdb-global-distribution-handson

<p>:satellite:&nbsp;&nbsp;新しいイベントの情報は、Connpass の <a href="http://aka.ms/aajp" target="_blank">Azure Antenna サイト</a>よりご確認いただけます。</p>

<p>:arrow_backward:&nbsp;<a href="https://qiita.com/AzureAntenna/items/71f394c100fbfa8ddcc8">「Azure Antenna 実施イベント資料（カテゴリ別）」に戻る</a></p>
GAE と Angular で普通の SPA の作り方 〜 デプロイ編

# はじめに

* 今回は Google App Engine のプロジェクトを作成して、前回作成したアプリをデプロイするところまで

# プロジェクトの作成

* [ドキュメント](https://cloud.google.com/resource-manager/docs/creating-managing-projects?hl=ja#creating_a_project)に従って Google App Engine のアプリケーションをデプロイする先のプロジェクトを作成する。

# Google App Engine を有効にする

* GCP のプロジェクト作成後、左上メニューから "App Engine" を選択し有効にする

# デプロイコマンドを準備する

* 前回インストールした Cloud SDK の中にデプロイに利用する goapp コマンドが入っている
* goapp コマンドの場所の確認をし、実行権限がついていなければ付与する

```bash
chmod +x /PATH/TO/google-cloud-sdk/platform/google_appengine/goapp
```

# デプロイを実行する

* プロジェクト名と任意のバージョン名を指定してデプロイを実行する

```bash
cd server/gae
/PATH/TO/google-cloud-sdk/platform/google_appengine/goapp deploy -application $PROJECT_NAME -version $VERSION ./app.yaml
```

* $PROJECT_NAME には作成したプロジェクト名を入れる
* $VERSION にはデプロイ用のバージョン文字列を入れる (例: v1)

# 動作確認

* `https://"プロジェクト名".appspot.com/client/` にアクセスして Angular アプリが開発サーバーと同様に提供されていることを確認する。
AndroidStudioのGradleでDeployGateにログイン・アップロードできない時の対処法

# はじめに
AndroidStudioのGradle taskにて、`updateDeployGateDebug`, `loginDeployGate`を叩いたらこんなエラーが出た時に見るべし

```text:log
Failed to retrieve DeployGate credentials. Please try again or specify it in your build.gradle script.
```
あるいはDeploygateを初めて使うのにログインするためのブラウザが起動しない場合

# 原因？らしきもの
AndroidStudioのgradleからブラウザが起動できないのが原因っぽい。
んで、起動できないから当然ログインもできない→エラーシーケンスに流れる

# 対処法
デプロイゲートのコマンドラインツールからログインしてやればよさそう。
というかコマンドラインをインストールしてないのが原因？かもしれない

## 具体的な作業
https://docs.deploygate.com/docs/cli
を参考に`dg`コマンドをインストールする

```
$ curl -sSL https://deploygate.com/cli/install/9fb6413b | bash
```
Permissionエラーをもらったらsudoをつけて実行する。

```
$sudo curl -sSL https://deploygate.com/cli/install/9fb6413b |sudo bash
```

ログインしておく(参考:https://docs.deploygate.com/docs/cli-other-commands)

```
dg login
```

たぶんブラウザが起動するはず。で、ログインできると、コマンドライン側に`Welcome to Deploygate!`って歓迎される

```
$ dg login
Welcome to DeployGate!
         _            _                       _
        | |          | |                     | |
      __| | ___  ___ | | ___ _   ,____   ___ | |_ ___
     / _` |/ _ \' _ \| |/ _ \ \ / / _ \ / _ `| __/ _ \
    | (_| |  __/ |_) | | (_) \ v / (_| | (_| | |_' __/
     \___, \___| .__/|_|\___/ ` / \__, |\__,_|\__\___`
               |_|           /_/  |___/
Hello kkeisuke!
```

この状態でもう一度AndroidStudio側の`updateDeployGateDebug`を叩けば通る・・・はず。
ムームードメインで取得したドメインをさくらのクラウドに向かせる方法

さくらVPSを普段使っており、VPSにドメインを割り当てた経験はあったのですが、
さくらのクラウドは初めてで且つ記事が全然見つからなかったので備忘録としてメモる。


# ムームードメインのコンパネで用意しておくこと


##DNSの設定
ムームードメインコンパネ > カスタム設定のセットアップ情報変更 > 設定2


<img width="1072" alt="screenshot.png" src="https://qiita-image-store.s3.amazonaws.com/0/168190/1b76f8eb-0219-4a3d-0bba-01bfe8b4ca06.png">

これだけ。

# さくらの管理画面で用意しておくこと

##ネームサーバーの登録
1.会員メニュー > ドメイン > ゾーンの追加でドメインの追加
<img width="600" alt="screenshot.png" src="https://qiita-image-store.s3.amazonaws.com/0/168190/b51053ea-e6ba-495f-3079-c7ddc3fee588.png">

2.会員メニュー > ドメイン > 管理ドメインとネームサーバの一覧
<img width="724" alt="screenshot.png" src="https://qiita-image-store.s3.amazonaws.com/0/168190/00151eb3-0053-939b-5566-5f8aa339045e.png">

3.ネームサーバーの設定
さくらのクラウドで契約したサーバーのIPアドレスを入力し、送信。
<img width="506" alt="screenshot.png" src="https://qiita-image-store.s3.amazonaws.com/0/168190/99cafaf7-f46d-2b82-3f61-05b175bf568b.png">

これだけ。

こちらが参考になりました。
[ネームサーバ利用申請](https://help.sakura.ad.jp/hc/ja/articles/206207381)

さくらクラウド初めてだからって色々調べたけどやり方のってねー！！詰んだ！
って思ったけど、すごいシンプルで、さくらクラウドだからとか関係なかったというオチ。。
ツールと Python で戯れる Azure データサービス

<p>この投稿は東京渋谷ヒカリエ 8 階にある <a href="http://aka.ms/aajp" target="_blank">Azure Antenna</a> で実施された「ツールと Python で戯れる Azure データサービス」で使われた資料のご案内です。</p>

- <strong>ツールと Python で戯れる Azure データサービス</strong><br />
  - 世界最大のクラウドが提供する最先端のテクノロジーとその価値<br />
https://sepubho.blob.core.windows.net/docs/Microsoft_Azure_Value_v2.0.pdf 

  - DataServicesPart1_準備編 (v1.0)<br />
https://sepubho.blob.core.windows.net/docs/20171219_MS_DataServicesPart1_準備編_v1.0.pptx 

  - DataServicesPart1_実践編 (v1.0)<br />
https://sepubho.blob.core.windows.net/docs/20171219_MS_DataServicesPart1_実践編_v1.0.pptx 

  - 20171219_MS_DataServicesPart1_準備編<br />
https://sepubho.blob.core.windows.net/docs/20171219_MS_DataServicesPart1_準備編_v1.0.pptx 

  - DataServicesPart1_解説編 (v1.0)<br />
https://sepubho.blob.core.windows.net/docs/20171219_MS_DataServicesPart1_解説編_v1.0.pptx


<p>:satellite:&nbsp;&nbsp;新しいイベントの情報は、Connpass の <a href="http://aka.ms/aajp" target="_blank">Azure Antenna サイト</a>よりご確認いただけます。</p>

<p>:arrow_backward:&nbsp;<a href="https://qiita.com/AzureAntenna/items/71f394c100fbfa8ddcc8">「Azure Antenna 実施イベント資料（カテゴリ別）」に戻る</a></p>
クラウドで HPC ~ HPC 環境の構築から、アプリケーションの実行まで ~

<p>この投稿は東京渋谷ヒカリエ 8 階にある <a href="http://aka.ms/aajp" target="_blank">Azure Antenna</a> で実施された「クラウドで HPC ~ HPC 環境の構築から、アプリケーションの実行まで ~」で使われた資料のご案内です。</p>

- <strong>クラウドで HPC ~ HPC 環境の構築から、アプリケーションの実行まで ~</strong>
  - HPC 環境構築からアプリケーションの実行まで<br />
https://www.slideshare.net/ShuichiGojuki/azure-antenna-hpc-hpc 

  - HPC on Azure<br />https://www.slideshare.net/ShuichiGojuki/azure-antenna-hpc-hpc-hpc-on-azure


<p>:satellite:&nbsp;&nbsp;新しいイベントの情報は、Connpass の <a href="http://aka.ms/aajp" target="_blank">Azure Antenna サイト</a>よりご確認いただけます。</p>

<p>:arrow_backward:&nbsp;<a href="https://qiita.com/AzureAntenna/items/71f394c100fbfa8ddcc8">「Azure Antenna 実施イベント資料（カテゴリ別）」に戻る</a></p>
MacからJoy-Conを動かしてNintendo Laboを先取りしてみた

##どのようなものを作ったか

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">うごいたぁ<br>が<br>右左で微妙に出力が違うきがする <a href="https://t.co/lKvh59c1d0">pic.twitter.com/lKvh59c1d0</a></p>&mdash; Riti (@riti_daichizaki) <a href="https://twitter.com/riti_daichizaki/status/965824606299766784?ref_src=twsrc%5Etfw">2018年2月20日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

このようなものを作った

##なぜ作ったか
NintendoLaboのCMを深夜に見て触発された

##実装
まずJoy-Conを振動させるためのライブラリを探した
バイブレーションを動かせるライブラリは

GoLangのライブラリ
https://github.com/nobonobo/joycon/new/master

Unityのライブラリ
https://github.com/Looking-Glass/JoyconLib

上記の２つがありました。
なので使い慣れたUnityのライブラリを使って
以下のようなコードを書いた

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

public class Rimokon : MonoBehaviour {
	List<Joycon> 	joycons;
	Joycon			joyconL;
	Joycon			joyconR;

	// Use this for initialization
	void Start () {
		joycons = JoyconManager.Instance.j;

		if ( joycons == null || joycons.Count <= 0 ) return;

		joyconL = joycons.Find( c =>  c.isLeft );
		joyconR = joycons.Find( c => !c.isLeft );
	}
	
	// Update is called once per frame
	void FixedUpdate () {
        joyconR.SetRumble(100, 580, 0.6f, 200);
        joyconL.SetRumble(100, 580, 0.6f, 200);
	}
}

```

何かしからかのオブジェクトにアタッチして
Joy-ConをBlueToothでPCに接続してあげれば動くはず
##CADでのモデル作成

CADはFusion360を用いて
このようなモデルを作成した
<img width="1039" alt="スクリーンショット 2018-03-02 16.29.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/190143/25828f93-d396-f09b-142b-ef5df13a1177.png">

3Dプリンターで印刷をしてJoy-Conをくっつけて完成

STLファイル置いとくので
やりたい人いたらどうぞ
https://www.dropbox.com/s/dees2exew9b9eux/SwitchRadicon.stl?dl=0

##終わりに
3Dプリンターで作成はしたのですが安定度とか作りやすさ
振動の伝わりやすさなども考慮して考えると
やはりダンボールのすごさを感じた

今回のライブラリはHIDの信号を直接送ることで
Joy-Conのランブリングを可能にしたと思っていたが
NodeJSのHIDの信号のライブラリ
https://github.com/node-hid/node-hid
を使っても
なぜかうまく行かなかったので誰かやってくれたら嬉しい
Azure Batch Rendering ではじめる クラウド レンダリング（入門編）

<p>この投稿は東京渋谷ヒカリエ 8 階にある <a href="http://aka.ms/aajp" target="_blank">Azure Antenna</a> で実施された「Azure Batch Rendering ではじめる クラウド レンダリング（入門編）」で使われた資料のご案内です。</p>

- <strong>Azure Batch Rendering ではじめる クラウド レンダリング（入門編）</strong><br />
https://www.slideshare.net/hirtanak/azure-batch-rendering-86023990

<p>:satellite:&nbsp;&nbsp;新しいイベントの情報は、Connpass の <a href="http://aka.ms/aajp" target="_blank">Azure Antenna サイト</a>よりご確認いただけます。</p>

<p>:arrow_backward:&nbsp;<a href="https://qiita.com/AzureAntenna/items/71f394c100fbfa8ddcc8">「Azure Antenna 実施イベント資料（カテゴリ別）」に戻る</a></p>
Azure Media Services 紹介

<p>この投稿は東京渋谷ヒカリエ 8 階にある <a href="http://aka.ms/aajp" target="_blank">Azure Antenna</a> で実施された「Azure Media Services 紹介」で使われた資料のご案内です。</p>

- <strong>Azure Media Services 紹介</strong> 
  - Azure Media Services 概要<br />
https://www.slideshare.net/secret/r6DiueIZgP9emZ 

  - Azure Media Services チュートリアルドキュメント<br />
https://www.slideshare.net/shigeyf/azure-media-services-stepbystep-tutorial-docs-series-agenda 

  - Azure Media & AI Portal - Demo<br />
http://aimediaportal.azurewebsites.net/ 

  - Azure Media & AI Portal - Source Code<br />
https://github.com/shigeyf/ai-digitalmedia 

  - Video Indexer<br />
http://vi.microsoft.com/ 

  - Video Indexer API Portal<br />
https://videobreakdown.portal.azure-api.net/ 

  - Azure Media Services Explorer Tool<br />
http://aka.ms/amse 


<p>:satellite:&nbsp;&nbsp;新しいイベントの情報は、Connpass の <a href="http://aka.ms/aajp" target="_blank">Azure Antenna サイト</a>よりご確認いただけます。</p>

<p>:arrow_backward:&nbsp;<a href="https://qiita.com/AzureAntenna/items/71f394c100fbfa8ddcc8">「Azure Antenna 実施イベント資料（カテゴリ別）」に戻る</a></p>
#Quantopian Research に csvをインポートして使う

## local_csv 

VXXとVXSTについて調べたかったので，VXSTをCBOEから取得して，Quantopian Researchの `local_csv `関数 でファイルをUploadして使ってみました．

## 手順

1. ファイルをインポート
    1. [vxst](http://www.cboe.com/publish/scheduledtask/mktdata/datahouse/vxstcurrent.csv) をローカルにダウンロード
    2. [Quantopian > Research > data](https://www.quantopian.com/research/data) に移動し，Upload file ボタンを押下![Screenshot from 2018-03-02 16-06-40.png](https://qiita-image-store.s3.amazonaws.com/0/14019/f136da91-3f0c-10af-6d95-240af5678104.png)
    3. file を選択してアップロード
    4. upload したファイルが，https://www.quantopian.com/research/data に格納されているか確認
    5. file名をクリックするとファイルの中身を確認できます．

1. データをDataFrame化
    1. Research で任意のNotebookを作成
    2. [local_csv](https://www.quantopian.com/help#quantopian_research_local_csv "local_csv") を使ってファイルをDataFrame化
    3. VXXを取得して描画して眺める

```python
vxst = local_csv("vxstcurrent.csv",  # data 直下に入っていれば，ファイル名だけで良い
                 date_column="Date", # 元ファイルのDateコラムが日付だったので，ソレを指定．
                 use_date_column_as_index=True, # 日付コラムをインデックスに指定
                 skiprows=[0,1,2], # 元ファイルの1〜3行目にメモが入っているのでスキップさせる（0始まり）
                )
vxx = get_pricing("vxx", start_date=vxst.index[0], end_date=vxst.index[-1], fields="price")
vxst["vxx"] = vxx
vxst[["Close", "vxx"]].loc["2017-1-1":].plot(secondary_y = "vxx")

```
![Screenshot from 2018-03-02 16-32-24.png](https://qiita-image-store.s3.amazonaws.com/0/14019/e7854f93-2ef9-6425-acc3-51f27db1e65e.png)
((o(´∀｀)o))ﾜｸﾜｸ

## エラー例
上記コードを走らせると，`TypeError: index is not a valid DatetimeIndex or PeriodIndex` という例外が発生しました．
1-5の手順で説明したとおり，ファイル名をクリックして中身を確認したところ，一つの日付だけに，`*4/20/2011`こんなふうに`*`が混じっていて，これが，エラーの原因でした．
ファイルはウェブ上で修正できるので，*を削除してsaveし，再実行すればOKでした．

## 注意
Uploadしたファイルは永久にdataにあるわけではありません．何らかのタイミングで削除されるようです．お気をつけください．


## Quantopian でのIndexについて

ところで，Quantopianは株価は取れても指標は取れません．
SPYやVXX等のIndex ETFは取れても，SPX（SP500）インデックスやVIXは取れません．
ですので，こうやってファイルをUploadして使う必要があります．



## 参照
その他のVIX系インデックスのリンクはこちら

vix  http://www.cboe.com/publish/scheduledtask/mktdata/datahouse/vixcurrent.csv
vxst http://www.cboe.com/publish/scheduledtask/mktdata/datahouse/vxstcurrent.csv
vix3M (かつてのvxv) https://www.cboe.com/publish/scheduledtask/mktdata/datahouse/vix3mdailyprices.csv
vvixUrl http://www.cboe.com/publish/scheduledtask/mktdata/datahouse/vvixtimeseries.csv
CollectionViewで UICollectionViewLayout を使っている場合に画面回転時にセルサイズを変える方法

表題通り。
ハマった。

UICollectionViewLayout に関して調べると、　UICollectionViewFlowLayoutとかUICollectionViewDelegateの話がごっちゃになって調べるのが難しいから余計に時間かかってしまた...



# 内容

* UICollectionView **Layout**　を使ってる場合に、画面を回転したときにサイズが変わらないと苦しんだ
* UICollectionViewLayoutは自分でセルサイズや位置を調節できるため、その処理も書かないといけなかった
* 以下コードでは画面回転をUIViewControllerを継承してるクラスで画面回転を察して、invalidateLayout()を動かす前に1列当たりのセル数を更新してる。


# コード

``` PintaLayout.swift
class PintaLayout: UICollectionViewLayout {
    /// 1列当たりのセル数を定義する。
    var numberOfColumns = 2
    override func prepare() {
        super.prepare()
        makeLayout()
    }
    func makeLayout() {
        // TODO: ここにサイズを計算する処理を書く
        // TODO: numberOfColumns を使って横向きにいくつ配置するか計算する
    }
    override func invalidateLayout() {
        // TODO: makeLayout()で計算したサイズがあれば削除
        makeLayout()
        super.invalidateLayout()
    }
}
```


```MyViewController.swift
class MyViewController:UIViewController {
    @IBOutlet weak var collectionView: UICollectionView!

    /// 縦の時は1列、横の時は2列となるようにする。
    /// iPadは2列固定。
    var numberOfColumns: Int {
        get {
            if UIDevice.current.userInterfaceIdiom == UIUserInterfaceIdiom.pad {
                return 2
            }
            if view.frame.width < view.frame.height {
                return 1
            }
            return 2
        }
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        // TODO: セルの追加
        // collectionView.register(UINib.init(nibName:.......
        collectionView.delegate = self
        collectionView.dataSource = self
        if let layout = collectionView.collectionViewLayout as? PintaLayout {
            layout.delegate = self
            layout.numberOfColumns = numberOfColumns
        }
    }

    override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
        super.viewWillTransition(to: size, with: coordinator)
        guard let flowLayout = collectionView.collectionViewLayout as? PintaLayout else {
            return
        }

        coordinator.animate(alongsideTransition: { (_) in
            // 画面回転したら、invalidateLayout()を呼び出すが、その前に画面回転時に更新する1列当たりのセル数を調節する
            flowLayout.numberOfColumns = self.numberOfColumns
            flowLayout.invalidateLayout()
        }, completion: nil)

    }

}

```
Azure アプリケーション アーキテクチャ ガイド 紹介

<p>この投稿は東京渋谷ヒカリエ 8 階にある <a href="http://aka.ms/aajp" target="_blank">Azure Antenna</a> で実施された「Azure アプリケーション アーキテクチャ ガイド 紹介」で使われた資料のご案内です。</p>

- <strong>Azure アプリケーション アーキテクチャ ガイド 紹介</strong>
https://www.slideshare.net/KazuyukiNomura/azure-87150890

<p>:satellite:&nbsp;&nbsp;新しいイベントの情報は、Connpass の <a href="http://aka.ms/aajp" target="_blank">Azure Antenna サイト</a>よりご確認いただけます。</p>

<p>:arrow_backward:&nbsp;<a href="https://qiita.com/AzureAntenna/items/71f394c100fbfa8ddcc8">「Azure Antenna 実施イベント資料（カテゴリ別）」に戻る</a></p>
今こそ知りたいマイクロソフトの AI ＆ ハンズオンで学ぶ Azure Machine Learning

<p>この投稿は東京渋谷ヒカリエ 8 階にある <a href="http://aka.ms/aajp" target="_blank">Azure Antenna</a> で実施された「今こそ知りたいマイクロソフトの AI ＆ ハンズオンで学ぶ Azure Machine Learning」で使われた資料のご案内です。</p>

- <strong>今こそ知りたいマイクロソフトの AI ＆ ハンズオンで学ぶ Azure Machine Learning</strong>
 - 今こそ知りたいマイクロソフトの Artificial Intelligence<br />
https://www.slideshare.net/mihochannel1/azure-antennaai 
 - ハンズオンで学ぶ Azure Machine Learning<br />
https://www.slideshare.net/mihochannel1/azure-antenna-machine-learning 
 - Azure Machine Learning で始めるデータ分析の第一歩 （ハンズオンマテリアル）<br />
https://github.com/ayako/TS17-AzureMLHoL

<p>:satellite:&nbsp;&nbsp;新しいイベントの情報は、Connpass の <a href="http://aka.ms/aajp" target="_blank">Azure Antenna サイト</a>よりご確認いただけます。</p>

<p>:arrow_backward:&nbsp;<a href="https://qiita.com/AzureAntenna/items/71f394c100fbfa8ddcc8">「Azure Antenna 実施イベント資料（カテゴリ別）」に戻る</a></p>
AKS でコンテナアプリ Docker から Kubernetes まで実践入門

<p>この投稿は東京渋谷ヒカリエ 8 階にある <a href="http://aka.ms/aajp" target="_blank">Azure Antenna</a> で実施された「AKS でコンテナアプリ Docker から Kubernetes まで実践入門」で使われた資料のご案内です。</p>

- <strong>AKS でコンテナアプリ Docker から Kubernetes まで実践入門</strong><br />
https://speakerdeck.com/shin5ok/azure-antenna-aksdekontenaapuri-dockerkarakubernetesmadeshi-jian-ru-men 

<p>:satellite:&nbsp;&nbsp;新しいイベントの情報は、Connpass の <a href="http://aka.ms/aajp" target="_blank">Azure Antenna サイト</a>よりご確認いただけます。</p>

<p>:arrow_backward:&nbsp;<a href="https://qiita.com/AzureAntenna/items/71f394c100fbfa8ddcc8">「Azure Antenna 実施イベント資料（カテゴリ別）」に戻る</a></p>
Azure Functions とキューで構築する NoOps スケーラブルバッチ処理基盤

<p>この投稿は東京渋谷ヒカリエ 8 階にある <a href="http://aka.ms/aajp" target="_blank">Azure Antenna</a> で実施された「Azure Functions とキューで構築する NoOps スケーラブルバッチ処理基盤」で使われた資料のご案内です。</p>

- <strong>Azure Functions とキューで構築する NoOps スケーラブルバッチ処理基盤</strong>
 - 概要スライド<br />
https://slideship.com/users/@miyake/presentations/2018/01/NnHSqJFjL5MuwLeTRoDrkT 
 - ハンズオンマテリアル<br />
https://github.com/zenarchitects/functions-batch-handson<br />

<p>:satellite:&nbsp;&nbsp;新しいイベントの情報は、Connpass の <a href="http://aka.ms/aajp" target="_blank">Azure Antenna サイト</a>よりご確認いただけます。</p>

<p>:arrow_backward:&nbsp;<a href="https://qiita.com/AzureAntenna/items/71f394c100fbfa8ddcc8">「Azure Antenna 実施イベント資料（カテゴリ別）」に戻る</a></p>
Python による Azure サーバーレスアプリケーション開発

<p>この投稿は東京渋谷ヒカリエ 8 階にある <a href="http://aka.ms/aajp" target="_blank">Azure Antenna</a> で実施された「Python による Azure サーバーレスアプリケーション開発」で使われた資料のご案内です。</p>

- <strong>Python による Azure サーバーレスアプリケーション開発</strong>
  - ハンズオン概要<br />
https://www.slideshare.net/yokawasa/pythonazure-serverless-application-development-with-python-82884446 
  - ハンズオンマテリアル<br />
https://github.com/yokawasa/azure-functions-python-samples/tree/master/handson<br />

<p>:satellite:&nbsp;&nbsp;新しいイベントの情報は、Connpass の <a href="http://aka.ms/aajp" target="_blank">Azure Antenna サイト</a>よりご確認いただけます。</p>

<p>:arrow_backward:&nbsp;<a href="https://qiita.com/AzureAntenna/items/71f394c100fbfa8ddcc8">「Azure Antenna 実施イベント資料（カテゴリ別）」に戻る</a></p>
SlackのWebhookを使って自分にメッセージを送るCurlコマンドの例


## ながれ
1. [incoming-webhook新規追加ページ](https://slack.com/services/new/incoming-webhook)にアクセスする。
1.  Post to Channelで通知したいチャンネルを選択する。自分に送りたければ`Privately for @yourname(you)`を選ぶ。
1.  ボタンを押して作成する
1.  生成されたWebhook URLにメッセージ付きのJSONをPOSTする。  

以上。

参考: [SlackのWebhook URL取得手順](https://qiita.com/vmmhypervisor/items/18c99624a84df8b31008)

## サンプル
### curlサンプル
`curl -s -X POST -H 'Content-Type: application/json' -d '{"text":"hello!"}' YOUR-WEBHOOK-URL`

### shellサンプル
```sh:notifymeonslack.sh
#!/usr/bin/env bash

# set here your Webhook URL
SLACK_WEBHOOK_API_URL='ここに取得したURLをいれる'

MSG=$1
JSON="{ \"text\": \"$MSG\" }"

RES=`curl -s -X POST -H 'Content-Type: application/json' -d "$JSON" $SLACK_WEBHOOK_API_URL`

echo $RES
```

##### 実行例

* `~/bin/notifymeonslack.sh`として保存
* 実行権限をつける：`chmod +x ~/bin/notifymeonslack.sh`
* .bash_profileに`slackme hello`で呼び出せるようにエイリアスを追加：`alias slackme='~/bin/notifymeonslack.sh'`
* npm run buildは重い処理ということで。

```shell_session:npmビルドが終わったら自分に通知くる！
> npm run build ; slackme "デプロイ終わったけ"
 ...
92% chunk asset optimization
 ...
```

通知くる!　わたしうれしい!
いまさら聞けない AI 入門

<p>この投稿は東京渋谷ヒカリエ 8 階にある <a href="http://aka.ms/aajp" target="_blank">Azure Antenna</a> で実施された「いまさら聞けない AI 入門」で使われた資料のご案内です。</p>

- <strong>いまさら聞けない AI 入門</strong><br />
https://1drv.ms/f/s!AmZlMCvu1Zsei25lGZd06g4SDb_r  
  - Cortana Intelligence ソリューション紹介
  - Microsoft Advanced Analytics
  - 人工知能（AI）を支える技術

<p>:satellite:&nbsp;&nbsp;新しいイベントの情報は、Connpass の <a href="http://aka.ms/aajp" target="_blank">Azure Antenna サイト</a>よりご確認いただけます。</p>

<p>:arrow_backward:&nbsp;<a href="https://qiita.com/AzureAntenna/items/71f394c100fbfa8ddcc8">「Azure Antenna 実施イベント資料（カテゴリ別）」に戻る</a></p>
Azure で始める Deep Learning

<p>この投稿は東京渋谷ヒカリエ 8 階にある <a href="http://aka.ms/aajp" target="_blank">Azure Antenna</a> で実施された「Azure で始める Deep Learning」で使われた資料のご案内です。</p>

- <strong>Azure で始める Deep Learning ～ 準備編</strong>
https://1drv.ms/p/s!Ag1Ckn-esJgcgY9XQ08O7s3Dm9kOtQ


- <strong>Azure で始める Deep Larning ～ 理論と実装</strong>
https://1drv.ms/p/s!Ag1Ckn-esJgcga4we0FTVwhgqy81Xw


<p>:satellite:&nbsp;&nbsp;新しいイベントの情報は、Connpass の <a href="http://aka.ms/aajp" target="_blank">Azure Antenna サイト</a>よりご確認いただけます。</p>

<p>:arrow_backward:&nbsp;<a href="https://qiita.com/AzureAntenna/items/71f394c100fbfa8ddcc8">「Azure Antenna 実施イベント資料（カテゴリ別）」に戻る</a></p>
Azure でサーバーレスアーキテクチャを活用しよう ~ Azure Functions, Azure Logic Apps を中心に ~

<p>この投稿は東京渋谷ヒカリエ 8 階にある <a href="http://aka.ms/aajp" target="_blank">Azure Antenna</a> で実施された「Azure でサーバーレスアーキテクチャを活用しよう ~ Azure Functions, Azure Logic Apps を中心に ~」で使われた資料のご案内です。</p>

- <strong>Azure でサーバーレスアーキテクチャを活用しよう ~ Azure Functions, Azure Logic Apps を中心に ~</strong><br />
https://www.slideshare.net/satonaoki/20171124azureantennaserverless 


<p>:satellite:&nbsp;&nbsp;新しいイベントの情報は、Connpass の <a href="http://aka.ms/aajp" target="_blank">Azure Antenna サイト</a>よりご確認いただけます。</p>

<p>:arrow_backward:&nbsp;<a href="https://qiita.com/AzureAntenna/items/71f394c100fbfa8ddcc8">「Azure Antenna 実施イベント資料（カテゴリ別）」に戻る</a></p>
Javascript の正規表現で使用できるグルーピング

# 正規表現のグルーピングとは？

グルーピングというのは、正規表現中にある（）で囲んだプレースホルダを置いておくと、それをバッファに記憶してくれる機能の事を言います。
例えば、

```javascript
/.*\/(.*?group1.*?)\/(.*?group2.*?)\//  # ?は最短マッチ記号
```

といった正規表現に、　`http://abcde/fgh/agroup1_abc/bgroup2_def/a?l=1`
といった文字列を食わせると、グループの１番目に　agroup1_abc が、　グループの２番目に　bgroup2_def が保存されます。

取得した文字列を後々何かに使えるわけですね。

# グルーピングの必要性

上記のようなグルーピングが何故必要かというと、主に速度面が挙げられます。
大量のログ等をハンドリングしているような場合に、　if 文やらwhile文やらやらでぐるぐる回して文字列操作をすると、鬼のように遅くなる場合があります。
正規表現を使用すると、基本的には低レベルコーディングの段階で最適化してやってくれている（はず）なので、速度の心配をする必要が減るのですね。

# 例えばマスキング

ここでは、URLの中にある重要な文字列があり、それをマスキングしたいという例を挙げます。
`http://agroup/boauth/auth?authorization=aioj274_45098fjkhbl&b=d`
といった文字列があったとします。

この時、

```javascript
var authRegExp = /(.*auth?authorization=)(.*\&)(.*)/;
```

といった正規表現に食わせると、
- 1個目のグループ：　URLの　全部
- 2個目のグループ：　URLの　authorization= まで
- 3個目のグループ：　URLの　1個目のグループの終わりから&まで
- 4個目のグループ：　URLの　&以降

がグループ分けされて配列に格納されます。

これを　配列[1]　と　"XXXX&" と　配列[3] ではさんで出力すると、
`http://agroup/boauth/auth?authorization=XXXX&b=d`
見事に出力したくない部分がマスキングされるわけですね。

# コーディング例（わかりやすいようにデバッグでHTML出力）

```javascript
var authRegExp = /(.*auth\?authorization=)(.*\&)(.*)/;

var authMatch = authRegExp.exec('https://test.co.jp/auth?authorization=ekhd3jklhd:ejhnm_skjh2dk&test=go');
var OUT = 'a';

if ((authMatch !== null) && (authMatch.length > 0)) {
    OUT = authMatch[1] + 'XXX&' + authMatch[3];
    document.write( authMatch[0] + '<BR/>' );
    document.write( authMatch[1] + '<BR/>' );
    document.write( authMatch[2] + '<BR/>' );
    document.write( authMatch[3] + '<BR/>' );

}

document.write( '<BR/>' );

document.write( OUT  );
```
これを、BracketsとChromeでデバッグするとこうなります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/192988/cd063df1-cda5-9d3f-9b87-5227717f7c3e.png)




めでたしめでたし。
has_and_belongs_to_many　を利用した場合のフォーム作成

結論から言うと、has_manyの場合と同じぽい
上記のアソシエーションを使った場合に具体的にどういうフォームを作ればいいのかまとめ

## 環境
Rails 5.1.5
Ruby 2.3

### モデルの作成
さくっと作るためにscaffold使った
http://guides.rubyonrails.org/association_basics.html#the-has-and-belongs-to-many-association
参照

```bash
$ rails g scaffold assembly name
$ rails g model part part_number
$ rails g migration create_assemblies_parts
```

以下にmigrationファイルを成形確認

```
class CreateAssembliesAndParts < ActiveRecord::Migration[5.0]
  def change
    create_table :assemblies do |t|
      t.string :name
      t.timestamps
    end
 
    create_table :parts do |t|
      t.string :part_number
      t.timestamps
    end
 
    create_table :assemblies_parts, id: false do |t|
      t.belongs_to :assembly, index: true
      t.belongs_to :part, index: true
    end
  end
end
```

```bash
$ rake db:migrate
```

###コントローラーの作成

```assemblies_controller.rb
  def new
    @assembly = Assembly.new
    @assembly.parts.build
  end

def create
    @assembly = Assembly.new(assembly_params)
    @assembly.parts.build(part_params)

    respond_to do |format|
      if @assembly.save
        format.html { redirect_to @assembly, notice: 'Assembly was successfully created.' }
        format.json { render :show, status: :created, location: @assembly }
      else
        format.html { render :new }
        format.json { render json: @assembly.errors, status: :unprocessable_entity }
      end
    end
  end

private

    def assembly_params
      params.require(:assembly).permit(:name)
    end

    def part_params
      params.require(:part).permit(:part_number)
    end
```
ネストしている構成ではないので、ストロングパラメーターは個別に記載
`collection.build`で作成したものに関しては、関連IDが予め付与されるので、`Part.new`で作成したものに関しては、save後に `collection<<obj`　として改めて関連付けすると良さそう


###フォーム画面の作成
```
<%= form_with(model: assembly, local: true) do |form| %>

    <%= form.label :name %>
    <%= form.text_field :name, id: :assembly_name %>

    <%= fields_for :part do |field| %>
    	<%= field.label :part_number %>
    	<%= field.text_field :part_number %>
    <% end %>

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

###よく使いそうなメソッド（has_manyと同じ）
http://railsdoc.com/references/has_and_belongs_to_many

|メソッド　　　　　　　　　　　　　　　|解説　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　|
|:--|:--|
|collection<<(object, …)|1つ以上のモデルを多対多の関連に追加|
|collection=objects|多対多でひも付いたモデルを更新|
|collection.build(attributes = {})|新しいモデルを作り、多対多で関連付けるがDBは更新しない|
|collection.create(attributes = {})|新しいモデルを作り、多対多で関連付けてDBを更新|


### 最終的にこういうことがやりたい
**Eventテーブル**

|id|演目 | 演者|開催期間|
|:--|:--|:--|:--|
|1|アニー|劇団○○|10/1〜10/31|
|2|王家に捧ぐ歌|宝塚歌劇団|8/1〜8/31|
|3|エリザベート|宝塚歌劇団|8/1〜8/31|
|4|エリザベート|帝劇|9/1〜9/31|

**Locationテーブル**

|id|会場名|
|:--|:--|
|1|東京宝塚大劇場|
|2|帝国劇場|
|3|赤坂ACTシアター|

演目によって複数の会場で実施するため、以下形でレコードに入れていきたい

**Event-Locationテーブル**

|event_id|location_id|
|:--|:--|
|1|1|
|1|2|
|2|1|
|3|1|
high sierraでGigabitEtherをactivate

Mac OS high sierraで
* Cable Matters, USB-C Multiport Adapter with Ethernet
をつないだ時の対応．[マニュアルにあるsite](www.cablematters.com/downloads)に行っても，同じもの(AX88179_178A)しかなさそう．

つないだだけではだめ．「[この記事:LUA4-U3-AGTをmacOS High Sierraで使う話](https://qiita.com/tfunato/items/7197ddc0e53c9d0dfe64)」でだいたいOKなんですが，Security&PrivacyでAllowして，再起動してもうまくactivateできませんでした．わたしのMacBookのせいかもしれません．

で，[こちら:Ethernet not working with High Sierra (10.13)](http://www.qacqoc.com/forums/topic/ethernet-not-working-with-high-sierra-10-13/)を参考に，terminalでの作業．
> sudo kextload /Library/Extensions/AX88179_178A.kext
> kextstat |grep ax

で起動，確認．

osxを再起動するとまた消える．今は，滅多に使わないので，コマンドをacrivate_etherと登録して，接続前に打っています．あと，ケーブルの抜き差しとかも必要かも．．．青く光るのが懐かしい．


* sanwa supplay LAN-ADURCM

も同じドライバーで繋がるようになったが，こちらは，純正ドライバーが[ここ](https://www.sanwa.co.jp/support/download/dl_driver_ichiran.asp?code=LAN-ADURCM)にあります．

これを入れるとAX88179_178Aも再起動でも認識するようになりました．ドライバーを入れた後に，設定中というのでえらく時間がかかっていたんですが，たぶんKEXTの情報を再構築してくれるのでしょう．メニューバーの「このMacについて」->システムレポート->ソフトウェア->機能拡張でAX88179_178Aが「読み込み済み：はい」に変わってます．
brew update でPython環境がおかしくなったので雑に解消メモ

### 問題
homebrewですでにPython2.XとPython3.X系入ってた場合に、
`brew update` をすると `python3` のエイリアスが python2.X系に向いてしまう

```
$ brew list python
/usr/local/Cellar/python/2.7.13/bin/2to3
/usr/local/Cellar/python/2.7.13/bin/2to3-2
-----(ry
$ brew list python3
/usr/local/Cellar/python/2.7.13/bin/2to3
/usr/local/Cellar/python/2.7.13/bin/2to3-2
-----(ry
```

`python3` なのに `python2.X` を向いてるとは…。

### 解決
`brew upgrade python` で 2.X系のやつを3.X系で上書きしてしまう

```
$ brew upgrade python
==> Upgrading 1 outdated package, with result:
python 3.6.4_3
==> Upgrading python 
-----(ry
$ brew list python
/usr/local/Cellar/python/3.6.4_3/bin/2to3
/usr/local/Cellar/python/3.6.4_3/bin/2to3-3.6
/usr/local/Cellar/python/3.6.4_3/bin/easy_install
-----(ry
```

雑に解消したけども、
**Pythonで複数バージョン使用したりするなら `pyenv` や `venv` 使うのがベターだと思います**
初心者のためのLinuxコマンド： hostnameコマンドの実行例

![Linux_beginners_guide.png](https://qiita-image-store.s3.amazonaws.com/0/34875/cbb4d580-0a45-a204-ba54-9321fcde53fd.png)

システムのホストネームを表示するのが、**hostname**コマンドです。
書式は以下のようになっています。

```
hostname [option]
```

それでは、いくつか**hostname**コマンドの実行例を紹介します。今回はホスト名を**FQDNで登録**した場合と**ショートネームで登録**した場合の2パターンで実行してみます。
なお、以下の実行例はUbuntu 17.10で実行しています。

はじめにFQDNで登録したパターンです。

# 1. FQDN形式でホスト名を登録した場合
FQDNはショートホスト名＋ドメイン名のような形式です。今回は、以下のようなホスト名を登録してみます。

```
ubuntu.localhost
```

なお、`/etc/hosts`に以下のレコードが登録されているものとします。

```
XXX.XXX.XXX.XXX    ubuntu.local    ubuntu
```

## 1.1. ホスト名の設定
`hostnamectl`コマンドでホスト名の設定を行います。

```shell-session
$ sudo hostnamectl set-hostname ubuntu.local
```

## 1.2. ホスト名を表示する。
オプションの指定をしないで実行すると、システムに設定されているホスト名を表示します。

```shell-session
$ hostname
ubuntu.local
```

## 1.3. ショートネームを表示する。
**-s**オプションを利用するとショートネームを表示します。ショートネームはホスト名の最初のドットまでの文字列です。

```shell-session
$ hostname -s
ubuntu
```

## 1.4. ドメインを表示する。
**-d**オプションを利用するとドメイン名を表示します。

```shell-session
$ hostname -d
local
```

## 1.5. FQDNを表示する。
**-f**オプションを利用するとFQDNを表示します。

```shell-session
$ hostname -f
ubuntu.local
```

次にショートネームで登録したパターンを見てみます。

# 2. ショートネームでホスト名を登録した場合
以下のようなホスト名を登録してみます。

```
ubuntu
```

なお、`/etc/hosts`に以下のレコードが登録されているものとします。

```
XXX.XXX.XXX.XXX    ubuntu.local    ubuntu
```

## 2.1. ホスト名の設定
`hostnamectl`コマンドでホスト名の設定を行います。

```shell-session
$ sudo hostnamectl set-hostname ubuntu
```

## 2.2. ホスト名を表示する。
オプションの指定をしないで実行すると、システムに設定されているホスト名を表示します。

```shell-session
$ hostname
ubuntu
```

## 2.3. ショートネームを表示する。
**-s**オプションを利用するとショートネームを表示します。ショートネームでホスト名を登録している場合、`hostname`コマンドのデフォルトと同じ結果になります。

```shell-session
$ hostname -s
ubuntu
```

## 2.4. ドメインを表示する。
**-d**オプションを利用するとドメイン名を表示します。

```shell-session
$ hostname -d
local
```

### 2.5. FQDNを表示する。
**-f**オプションを利用するとFQDNを表示します。

```shell-session
$ hostname -f
ubuntu.local
```

以上、`hostname`コマンドの実行例の紹介でした。

---
この記事はブログから転載したものになります。もとの記事は[こちら](https://410gone.click/blog/2018/03/02/%E5%88%9D%E5%BF%83%E8%80%85%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AElinux%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%EF%BC%9A-hostname%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%AE%E5%AE%9F%E8%A1%8C%E4%BE%8B/)
社内RaspberryPi勉強会に参加してみた

# 勉強会参加の経緯
私は2018年2月現在、2年目社員としてとあるIT会社に勤めています。
日々こつこつと働いている中で
**「何か自分のつくってみたいこと、やりたいことを手段として、勉強してみたいなあ･･･」**
とふと思い立ち、かと言ってプライベートでも勉強する暇があまり無いので社内にそのような場は無いかと探していました。

ちょうど先輩方が中心となり「RaspberryPi勉強会」が開催されているとの噂を聞き、詳細を尋ねてみたところ

- 2017年下期は**RaspberryPiを用いてサーバー室設置用のエアコン故障通知システム構築** を目的に実施
- メンバーごとにどんな言語を用いて、どのような機能を実装するか、役割を分担する (本人の希望を聞いてくださる)
- 開催頻度は週一回
- 当番制でLTがあったり、自身の学習した事柄をメンバーに展開する機会が設けられる

とのことで、JSPやHTMLを用いて画面をデザインすることに興味を持ちつつ当時業務では触れていなかったため、いつどこで習得しよう･･･と考えていた私は、この勉強会ならそれを学ぶことができるかもしれない！！と思い立ち、参加させて頂くことになりました。

# 勉強会に参加した結果
そんなこんなで勉強会に約半年勉強会に参加させていただきましたが･･･
結論として、サーバー室設置用のエアコン故障通知システム構築は、2017年下期中には全て実現することはできませんでした。(業務が多忙になったためです)
ですが、センサの取得値が上限値を超えた場合に写真をカメラモジュールで撮影し、設定アドレスにメールを送信する機能は、2017年下期中に完了見込みです。こちらはPythonを用いて実装しているメンバーの方が中心となり作成していた機能です。

目標を完遂はできませんでしたが、本勉強会に参加したことで得たものは多くあります。
下記にまとめて記載します。

### RaspberryPiを知れた
本勉強会に参加するまで、RaspberryPiに対しては「RaspberryPi？おいしそう！」という知識レベルでした。
(つまり全くRaspberryPiを知らなかったのです)
RaspberryPi本体を配布して頂き、初めて実物を見たときは、「こんな小さいのにパソコンなんだ･･･」なのかと驚き、小さい基盤にUSB端子やHDMI端子があることにも驚きました。
また、SDカードにOSをインストールして、画面に映した時は、「こんな小さいのに以下略」と改めて感動しました。
このように、RaspberryPi自体がどのようなものなのかは実物を見て理解することができました。

### 当番制のLT・学習内容展開でプレゼンの経験を積んだ
本勉強会では必ずLTがあり、どのメンバーも数回発表する機会があります。
LTの題材に制限は無いため、IT分野以外にも自身が興味を持ったことを発表できます。
因みに私は、大学時代に研究した事を紹介したり、色やデザインに興味があったので、"パーソナルカラー"について調べて発表しました。
また、LTだけではなく、自身が実装を担当する機能の面で必要な知識をメンバーに展開する機会も設けられます。
私はサーバー室設置用のエアコン故障通知システムの画面担当だったため、PHPについて学習し、情報を展開しました。
発表の際はスライド等の資料も作成するため、発表の流れを考えたりプレゼン用資料作成の経験を能動的に培うことができたと思います。
因みに学習内容展開の際はこちらから一方的に話すだけではなく、メンバーからもアドバイスや知識の補足をして頂いたため、最終的には自身で学習した知識より多くの情報を仕入れることができました。(詳細は次項にて)

### 画面作りのための基礎知識や、それ以外のIT知識を学べた
前項に記載しましたとおり、私は本勉強会に向けてPHPに関して学習しました。
大まかですが、下記にPHPについて知った内容をまとめておきます。

- サーバーサイドスクリプト言語(JSPと同様。JavaScriptはクライアントサイドスクリプト言語)
- 広範囲に色々な種類のDBをサポート
- オブジェクト指向型、手続き型、どちらでもプログラミングが可能
- 文法が非常にわかりやすく、初心者向けの言語
- HTMLと組み合わせて利用可能(JSPと同様のイメージ)
- WordPressと組み合わせて利用することで、デザイン性に富んだサイトを作成できる
- PHPは並列処理に弱い。スレッド処理が標準では考慮されていない言語である。

･･･とPHPについてのみまとめましたが、本勉強会で学んだ知識はこれだけではありません。
他メンバーの情報共有からもたくさんのことを学べました。

- jQueryの使い方 ⇒ 話を聞いた数日後に業務で利用することがあり非常にタメになりました。
- RaspberryPiにおいて.NETアプリを動かす方法 ⇒ そもそも.NETに関する知識がなかったのですがそれの説明も事前にあったので理解できました。また、.NETフレームワークとして用いるMonoの概要、Monoのセットアップ方法等教授いただけたので、すぐにでもラズパイで扱うことができそうです。
- MonoDevelopの概要 ⇒ 実物を拝見してすごく使いやすそう…という感想を持ちました。ボタン等がドラッグ&ドロップで好きな場所に置けるのが便利。

その他にも多々学びましたがこちらでは割愛いたします。
中には本勉強会に参加しなければ知れなかったものもあるのではないかと思います。
非常に良い機会となりました。

### 緩い雰囲気でメンバーとのコミュニケーションをとる事ができた
本勉強会は"勉強会"といえど、ガッチリキッチリした講義というわけではなく、メンバーと和気藹々と話しながらゆるりと学べる場となっています。
中々業務中は話す機会が無い方と、IT知識についてあれやこれやと話すのは大変楽しかったです。


# 来期に向けて
来期も本勉強会は開催されるとのことですので、私は引き続き参加する予定です。
今期で培った知識を基に**RaspberryPiを用いたサーバー室設置用のエアコン故障通知システム構築**を来期は達成し、より明確なアウトプットを出します。
また、今回は初参加だったので主催の方から多くのサポートを頂き、ほぼ受動的で作業をしていましたが、来期はもっと能動的に活動していきたいと思います。