OmniAICreator/Qiita-1.07M huggingface dataset:
windows10をクリーンインストールする際の覚え書き

# 目的
windows10をクリーンインストールする。
これはもう病気なんじゃないかと思うほど頻繁にOSをクリーンインストールしている為、その度記憶をほじくり返す手間を減らすため記録しておく。
ほぼ全てどこかのサイトから拾ってきた情報で構成されている。

# 準備
__windows10のインストールメディアを作成する__
MediaCreationTool.exeなるものをダウンロードし、USBメモリに展開。
__ドライバをダウンロードしておく__
M/Bメーカーなどのサイトからドライバをダウンロードしておく。Windows10では大抵のドライバは自動で拾ってくれるため不要かとも思うが、念のため。
__ポータブル版のアプリケーションはバックアップ__
外付けハードディスクなどにドライバと一緒に移動しておく。
些細な事だが、1つ1つインストールするのは手間なので出来るだけポータブル版を使用しているとこういう時に楽だ。
__※必要ならSATAケーブルを不要なHDD等から抜いておく__
非常に面倒くさいがdiskpartなどを誤爆すると嫌なので自分は抜いている。ケースが大きいので楽ちんだ。

#インストール
__UEFI__
インストールメディをUSB差込口にセットしPCを起動。
ASUSのM/Bでは起動後Deleteキーを押してUEFI画面に行くため、連打する。
ブートメニューからセットしたUSBメモリを指定してブート。ちなみにUEFIインストールを行うのでデバイス名より先にUEFIという記述があった筈。

__Windowsインストーラー__
基本的には指示に従うだけでよい。
インストールドライブを選ぶ画面が出てきたらShift+F10でコマンドプロンプト（黒画面に白い棒が点滅するハッカー的なあれである）を起動。
```diskpart```でdiskpartを起動。
```list disk ```でディスク一覧を表示する。
GPTという欄で起動ディスクのパーティションテーブルがGPT形式になっていることを確認。
なっていなかったら```select disk```でディスクを選択肢し、```convert gpt```で変換する。
その上で```clean```コマンドで一度データを削除したら```exit```あるいはAlt+F4でコマンドプロンプトを終了。
最新の情報に更新、フォーマットを行ってからインストールする。

#インストール終了後
適当にアカウントを作成し、ログインする。この際余計と思われる項目は全てオフ。ローカルアカウントでログインする。
何はともあれwindows updateを実施。更新が出てこなくなるまで放置。この間に設定項目を弄ってもものによっては復活する為、精神衛生上放置する。
それが終わったら設定を起動。全ての項目を隅から隅まで一度確認して行く。
この時Microsoftアカウントでログインしてしまう。
更にコントロールパネルを起動して、これも全ての項目を見ていく。とはいえ殆ど素通り。
重要そうな項目は以下
<dl>
<dt>エクスプローラーのオプション
<dd>「エクスプローラーで開く：」にPCを指定。
「プライバシー」の2項目からチェックを外す。
表示タブから「登録されている拡張子は表示しない」のチェックを外す。
<dt>サウンド
<dd>サウンドタブから「サウンド設定」をサウンドなしに変更。
<dt>システム
<dd>左側のリストからシステムの保護を選択。システムのプロパティウィンドウが開いたら構成ボタンをクリック。全ディスクでシステムの保護を無効にし、全ての復元ポイントを削除する。
これはもう何か不具合があったらシステムイメージからバックアップするかさもなきゃ再度クリーンインストールを掛けるからであって、非推奨。
更に同じく左側のリストからシステムの詳細設定を開き、パフォーマンスオプションの視覚効果タブではパフォーマンスを優先するをクリック、その後「アイコンの代わりに縮小版を表示する」「スクリーンフォントの縁をなめらかにする」のみチェックを入れる。
詳細設定タブでは仮想メモリの項目でページングファイルを全て削除。これもマシンに32Gのメモリを積んで有る為であり、非推奨。
<dt>マウス
<dd>全ての基本マウスの挙動を設定する。移動量をマックスにしてスクロール量を12に設定。
<dt>管理ツール
<dd>everythingというファイル検索ソフトを使用しているが、起動時のUACがうっとおしいのでタスクスケジューラに登録してしまう。
</dl>

__ドライバ・アプリのインストール__
イントールタイプのアプリやドライバをインストールしていく。
各種インストーラーを保存しておくと楽。
.netやらC++やらのランタイム？もざっとインストールしてしまう。先ほどコマンドライン上でインストールする記事を発見したので実験してみたい。

__アンインストール__
一通りソフトのインストールが済んだら今度は要らないプリインストールソフト等をアンインストールしていく。特にwindows10はアップデートすると勝手にキャンディクラッシュやらをインストールしてくる為クリーンインストールに関わらず時々確認した方がよいかも。

__ポータブル版アプリの復元__
準備で避難したものをシステムドライブに突っ込む。ちなみにシステムドライブである理由は皆無。
この作業の為だけにポータブル版アプリは全て一カ所に固めてあり``C:\mysystem``とか適当な名前をつけている。紛らわしい名前をつけるとWindowsに怒られるので注意。

__バッチファイル__
あちこちにシンボリックリンクを張ったりする作業は全てメモ帳に書き留めて以下のようなバッチファイルにしてある。

```setup.cmd
rd /s /q "C:\Users\yukio\Contacts"
mklink /d "C:\Users\yukio\Contacts" "D:\yukio\Contacts"
```
この調子で殆ど全てのユーザーフォルダの中身をシステムドライブ外に移してシンボリックリンクを張る。なんだったらitunesのiphoneのバックアップフォルダまで一気にやる。
更にメモリ解放用のソフトempty.exeとやらをWindowsフォルダ内に放り込み、SendToフォルダにバッチファイルをコピーして送るコマンドに追加する。
レジストリを改変して不必要なコンテキストメニューを削除したり、サービスを停止したりする。

__環境変数__
setxコマンドから編集しようとしたら元々の内容が吹っ飛んだのでGUIでやることに。
7zipとかffmpegとかを追加する。

__スタートアップ__
何故かコマンドプロンプトでコピーしても反映されないのでスタートアップフォルダにアプリのショートカットを入れておく。

__フォントの追加__
気に入った物を保存してあるのでまとめてコンテキストメニューからインストール。

__その他__
オンラインアカウントでログインした後はパスワードの入力とか面倒くさいものを全部撤廃する。セキュリティとか知ったことではない。
msconfigとかgpdeditとかスタートアップとかも弄る。
***
以上でセットアップの際やっている事は大体網羅できたはず。
何故こんなにしつこくしているのだろうと悩むほど行ったクリーンインストールの集大成ともいえるバッチファイルは内容公開しても大丈夫なんだろうか？
TopCoder SRM730 Div2 500 - "ExpectedMinimumPowerDiv2"

# 問題文
## Problem Statement
>You are given two positive s: n and x.

>You are going to choose x distinct integers, each between 1 and n, inclusive. The choice will be made uniformly at random. That is, each of the possible x-element subsets of the integers 1 to n is equally likely to be chosen.

>Let S be the smallest integer among the x chosen ones. Compute and return the expected value of 2^S. In other words, determine the average value of 2 to the power of S, where the average is taken over all possible choices of the x distinct integers.

##日本語訳
>あなたは2つの正の引数n，xが与えられる．

>あなたは1からnの自然数から異なるx個の数を選ぶ．1からnの選ぶ確率は一様にランダムである．

>ここで，選んだx個の中で最小のものをsとするとき，2のs乗の期待値を求めよ．つまり，考えられるすべての組み合わせから2のs乗の平均を求めよ．


# 解法
まず，n個の数からx個選んだときの最小値がsである確率を求める．ここで，1<=s<=nである．分母にはn個の数からx個選んだときの組み合わせの数nCxをおく．分子には最小値sを選び，残りのx-1個をsより大きい数であるn-s個の中から選ぶ組み合わせの数n-sCx-1をおく．

```math
e^{i\pi} = -1
```
[tex:{\frac{1}{2}}]
Docker 初期設定

```dockerfile:dockerfile
# DOCKER CONFIG
FROM centos:7

# yum-config-manager のインストール
RUN yum -y install yum-utils

# yum repository の追加
RUN yum -y update
RUN yum -y install epel-release
RUN yum -y install http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
RUN yum -y install http://dev.mysql.com/get/mysql57-community-release-el7-9.noarch.rpm

# https://rpms.remirepo.net/RPM-GPG-KEY-remi2018
RUN rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-*

# yum repository の有効化
RUN yum-config-manager --enable  remi-php71

# SED インストール
RUN yum -y install sed

# NKF インストール
RUN yum -y install nkf

# WGET のインストール
RUN yum -y install wget

# ZIP のインストール
RUN yum -y install zip unzip

# GCC のインストール
RUN yum -y install gcc

# OPEN-SSL のインストール
RUN yum -y install openssl openssl-devel

# OPEN-SSL のインストール
RUN yum -y install curl curl-devel

# HTTPD インストール
RUN yum -y install httpd  httpd-devel
RUN systemctl enable httpd
RUN systemctl start  httpd

#  MYSQL のインストール
RUN yum -y install mysql-community-client  mysql-community-server  mysql-community-devel
RUN systemctl enable mysqld
RUN systemctl start  mysqld
RUN mysqladmin password Passw0rd! -u root -p$(cat /var/log/mysqld.log  | grep root@localhost | sed -e "s/.*root@localhost: //g")

# PHP のインストール
RUN yum -y install php php-devel php-intl php-json php-mbstring php-mysqlnd php-pdo php-xml php-zip

# COMPOSER のインストール
RUN mkdir -p /usr/local/src/composer/
WORKDIR /usr/local/src/composer/
RUN php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
RUN php composer-setup.php --install-dir=/usr/local/bin --filename=composer

# GIT のインストール
RUN mkdir -p /usr/local/src/git/
WORKDIR /usr/local/src/git/
RUN wget https://github.com/git/git/archive/master.zip 
RUN unzip master.zip
WORKDIR /usr/local/src/git/git-master/
RUN make
RUN make test
RUN make install

# docker のインストール
# RUN yum -y install docker docker-compose docker-client
# RUN systemctl enable docker 


```
rails flashメッセージのコーディングをスッキリ

今まで、フラッシュメッセージのコーディングをうまく書けなくて悩んでいたところ、スッキリ分かりやすいやり方を学んだのでまとめました。

## flashメッセージってなに？
ログインした時に`ログインしました`と表示されたり、記事を投稿したときに`記事を投稿しました`と表示されるメッセージのこと

## flashってなに？
簡単なメッセージを画面に表示するためのメソッド
`flash`は、ハッシュのように使用することができる。
`あるキーに対する値としてメッセージを設定する`、仕組みとなっている。
設定されたメッセージは、`session`に保管される。
一度表示されるまではsession内に残っており、一度表示されると`自動的に削除`される。

## 使い方
コントローラー側でflashメッセージを指定し、view側でメッセージを表示する。

（例）新たなblogを投稿し、「ブログを投稿しました」というメッセージを表示したい場合

```ruby:blogs_controller.rb
def create
  @blog = Blog.new(blogs_params)
  if @blog.save
    redirect_to blogs_path, notice: t('flash.blogs.create')   
  else
    render 'new'
  end
```
redirect_toメソッドは、次のような使い方ができる。
`redirect_to(リダイレクト先のURL [, :status => ステイタスコード, オプション])`
ここの`オプション`に、`notice:`や`alert:`を設定すると、`flash[:notice]`,`flash[:alert]`と同様の記述となる。
（注）notice、alert以外にも独自のキーを設定るすことも可能

```ruby:index.html.haml
- flash.each do |key,value|
 - key = "info" if key == "notice"
 - key = "danger" if key == "alert" 
 = content_tag :div, value, class: "alert alert-#{key}"  
```
bootstrapを使用したデザインにするため、上のような記述としている。
設定されたキーの値でデザインを変えるため、変数keyにそれぞれbootstrap用のclassの一部を代入し渡している。
`content_tag`は、タグを自動で生成してくれるメソッド（詳細は省略）

```ruby:ja.yml
  省略
  flash:
   blogs:
    create: ブログを投稿しました
```
設定するメッセージは、tメソッドを使用してi18nの仕組みを利用している（ここも省略。書くと長くなるので。。）

## まとめ
- メッセージの設定にtメソッドを使用すること
- Bootstrapを適用するためのviewのコーディング方法  
この二つのやり方を学べたのは大きかった。
CSSアニメーションで円形プログレスバーを作る方法

CSSアニメーションで円形プログレスバーを作ってみました。JavaScriptやSVG、画像は使っていません。

##サンプル（GIF）
![circle.gif](https://qiita-image-store.s3.amazonaws.com/0/223036/2d090dc4-90f6-6234-639a-51b30870ff05.gif)

##HTML
```html
<div class="circle"><div class="circle-inner">loading</div></div>
```
内側の白円が不要な場合は、div.circle-innerは要りません。

##CSS
```css
.circle {
	position: relative;
	width: 120px;
	height: 120px;
	background: #333;
	border-radius: 50%;
	text-align: center;
	overflow: hidden;
	z-index: 1;
}

.circle::before {
	content: "";
	display: block;
	position: absolute;
	top: 0;
	left: -60px;
	width: 120px;
	height: 120px;
	background: #999;
	transform-origin: right 60px;
	z-index: 2;
	animation: rotate-circle-left 2s linear forwards;
}

.circle::after {
	content: "";
	display: block;
	position: absolute;
	top: 0px;
	left: 60px;
	width: 120px;
	height: 120px;
	background: #999;
	transform-origin: left 60px;
	z-index: 3;
	animation: rotate-circle-right 2s linear forwards;
}

.circle .circle-inner {
	position: absolute;
	top: 10px;
	left: 10px;
	width: 100px;
	height: 62px;
	padding-top: 38px;
	background: #fff;
	border-radius: 50%;
	z-index: 4;
}

@keyframes rotate-circle-right {
	0%   {
		transform: rotate(0deg);
		background: #999;
	}
	50%  {
		transform: rotate(180deg);
		background: #999;
	}
	50.01% {
		transform: rotate(360deg);
		background: #333;
	}
	100% {
		transform: rotate(360deg);
		background: #333;
	}
}

@keyframes rotate-circle-left {
	0%   { transform: rotate(0deg); }
	50%  { transform: rotate(0deg); }
	100% { transform: rotate(180deg); }
}
```

##考え方
まず、円をひとつ描きます。その上に、左側と右側とに分けて2つ正方形を重ねます。
![img1.jpg](https://qiita-image-store.s3.amazonaws.com/0/223036/729c12d8-2d6e-f513-6e02-e29ddcff4338.jpeg)

次に、右側の正方形を180度回転させます（バーは50%のところまで進む）。
![img2.jpg](https://qiita-image-store.s3.amazonaws.com/0/223036/c0421ef0-f85a-d312-ae9e-11e0ddf00d94.jpeg)

ここで、右側の正方形の色を変えて、瞬間的にさらに180度回転させて元の位置に戻します。
見た目はバーが50%のところまで進んだ状態のままです。
![img3.jpg](https://qiita-image-store.s3.amazonaws.com/0/223036/7a40f717-3fd2-24d5-8a45-fd89dcdb25fa.jpeg)

そこから、左側の正方形を180度回転させて、バーを100%のところまで進めます。
![img4.jpg](https://qiita-image-store.s3.amazonaws.com/0/223036/e3f5c165-324c-4028-2fd8-81e8c322ed41.jpeg)

animation は 基本的に transform: rotate だけなのでシンプルです。
ループさせたいときはオプションの forwards を infinite に変えて、秒数と keyframes のパーセンテージを調整します。このあたりは好みですね。

50%以下で止めたい場合は ::afterのみを回転させ、50 - 100%の間で止めたい場合は ::beforeの回転角度を調整します。

##使用例
![circleset.gif](https://qiita-image-store.s3.amazonaws.com/0/223036/c6a96f1d-8817-ccc2-af2b-240c16396155.gif)

プロフィールページなどに使えるスキルの表示例です。
ローディング画像にも使えるし、他にもいろいろ応用すると表現の幅が広がります。

[使用例に載せたスキル表示は、僕のプロフィールページに実装してみました。](http://www.i-keita.com/profile.html)
次はJavaScriptを学ぶ

HTML→CSSときて、次はJavaScript。
フロントエンドを網羅する予定の僕にとって順当な流れだ。

しかし今回はフロントエンドのためのコードではなく、とにかくAlexaスキルを作りたい！という気持ちでJSを学ぶことに。

いつものことながら、ネットに転がっている情報を組み合わせてとにかく動くものを作ろうと思ったけど、やっぱり前提知識がなさすぎて動く代物を作れなかったので、MDNのチュートリアルをやっていきたいと思います。

[1.JavaScriptって何？](https://developer.mozilla.org/ja/docs/Learn/JavaScript/First_steps/What_is_JavaScript)
[2.JavaScriptへの最初のダイブ](https://developer.mozilla.org/ja/docs/Learn/JavaScript/First_steps/A_first_splash)←見本コードをそのまま打ち込んでいくだけで為になる。
[3.何が間違っている? JavaScript のトラブルシューティング](https://developer.mozilla.org/ja/docs/Learn/JavaScript/First_steps/What_went_wrong)
[4.必要な情報を保存する — 変数](https://developer.mozilla.org/ja/docs/Learn/JavaScript/First_steps/Variables)←変数の使い方がわかる。とくに var とか　array とか。
[5.JavaScript での数学入門 — 数値と演算子について](https://developer.mozilla.org/ja/docs/Learn/JavaScript/First_steps/Math)←数字を使った処理を学んだ。
[6.テキストを扱う — JavaScript での文字列](https://developer.mozilla.org/ja/docs/Learn/JavaScript/First_steps/Strings)←文字列の特徴を学んだ。
[7.便利な文字列メソッド](https://developer.mozilla.org/ja/docs/Learn/JavaScript/First_steps/Useful_string_methods)←文字をくっつけたり話したりするのを学んだ。
[8.配列](https://developer.mozilla.org/ja/docs/Learn/JavaScript/First_steps/Arrays)

## プログラムが動かない・意図した動きをしない原因
- そもそも動かない→文法エラー
- 意図した動きをしない→論理エラー

## varは変数を宣言するキーワード
```js:hensuu.js
var myNameArray = ['たける','ほそや','けんご'];
var myNumberArray = [28,29,27];

myNameArray[0]; //たけるが表示される
myNumberArray[1]; //２９が表示される
```

## トグル
>スイッチのON/OFFのように、ある状態がもう一つの状態にトグル (切り替え) するといいます。

## \ バックスラッシュ
option + ¥　→ \
Pythonことはじめ

Pythonをインストールから始めてみることにした。参考にしたサイトは[ここ][PythonエンジニアによるPython3学習サイト]。
環境は以下。

| OS | Windows 10 |
|:-:|:-:|
| CPU | Core i5-6500  |
| メモリ  | 8GB |
|エディタ|Mery|
|IDE|PyCharm|

# Install
まずはインストールから。Windowsの場合はインストーラのダウンロード。
https://www.python.org/downloads/

インストーラを実行したら、

 - [ ] Add Python 3.6 to PATH

にチェックを入れてインストール開始。
簡単にはインストールディレクトリは変えられなさそう。


コマンドライン上で `python -V` 、 `pip -V` と打ち込んでそれっぽく表示されればインストール成功。

# Execute
取り敢えずなにか実行してみよう。以下のファイルを作成。

```python:hello_world.py
print('Hello Python World')
```
ダブルクリックで実行できそうなので、ダブルクリック。
。。。
一瞬でウィンドウが閉じた。
仕方ないのでコマンドプロンプトから実行。

```
C:\>python\helloworld\hello_python.py
Hello Python World
```
確認できた。
ダブルクリックで実行後にウィンドウが閉じないようにするにはスクリプトに`input()`を加える方法もあるようだけれど、スマート（？）にIDEを使おう。

# IDE
どうやら主に二つの開発環境があるらしい。

* __IDLE__　　　簡易的な開発環境
* __PyCharm__　多機能な開発環境

ということでPyCharmを選択。以下からダウンロード。
https://www.jetbrains.com/pycharm/download/#section=windows

オープンソース版がフリーライセンス（Apache）らしい
とりあえずインストール。
途中で分かったけれどIDLEはpythonインストール時にインストールされてたっぽい。
まあ、PyCharmの方で進めていった方が後々便利だろう。








# reference
* [PythonエンジニアによるPython3学習サイト][PythonエンジニアによるPython3学習サイト]
[PythonエンジニアによるPython3学習サイト]:http://www.python.ambitious-engineer.com/
KibanaでIndex Patternsが作成できなくなった時の対処法

#症状 / 原因
AWS上でfluentd - elasticsearch - kibanaでログの可視化環境を構築していました。kibanaもelasticsearchもバージョン6.0.0です。



![image.png](https://qiita-image-store.s3.amazonaws.com/0/98127/b577b83d-8acf-39a5-1be4-8e197176e58a.png)


上図のindex patterns作成ページのcreateボタンを押しても、画面が切り替わらず、どうやら画面の見切れた先にうっすらエラーの内容が表示されているような挙動をしていました。( chromeブラウザーでした ）
そこでchromeのジャバスクリプトのエラーログを確認してみると、

```
Error 403 Forbidden: blocked by: [FORBIDDEN/12/index read-only / allow delete (api)];
```

というエラーが出ていました。
これはどうやらkibanaのエラーというよりelasticsearch側のエラーの用で、サーバーが容量不足になるとelasticsearch側が　indexをread-onlyに制限してしまうようです。実際にelasticsearchがゴリゴリ容量をいっぱいにしていました。

そこで、サーバーの容量不足を解消してから、

elasticsearch側で、

```
curl -XPUT -H "Content-Type: application/json" localhost:9200/_all/_settings -d '{"index.blocks.read_only_allow_delete": null}'
```

を実行してから再度createボタンをkibana上で押して見ると、indexが作成できました。
これにてお粗末！！
アプリをローカルでビルド


## 対象
- OS 10.13.3
- Xcode8
- Swift 3
- nifty mBass

## Xcode8.3のインストール
ライブラリーが多く使われており、各ライブラリーのバージョンによって起動が不安定なため、推奨されているバージョンでしか動かない状態。推奨と言うより必須条件となっている。

- Appleの[Developerサイト](https://developer.apple.com/xcode/)にログイン
- 8.3をダウンロード

※ 8.3.xではなく、8.3をダウンロード
※ 8GBありダウンロード、インストールまでに30分以上かかる

## Githubからのデータをそのまま起動
podなどで各最新のライブラリーを入れ直したりすると、エラーの原因になるため、必ず、githubからダウンロードした状態で起動するようにする。

##  .workspeaceから起動する
Xcodeのファイルには「.xcodeproj（青）」と「.xcworkspace（白）」のファイルがあるので、必ず、「.xcworkspace」をXcode8.3で起動させる。
※「.xcodeproj」で起動させると、Podsのフォルダが読み込まれなくなり、エラーを起こす。

## ビルドフォルダのクリーンアップ
ファイルを開き、そのままビルドを起動するとビルドはできるがシミュレーションが起動しない恐れがある。そのため、ビルドフォルダを一度クリーンアップしてから起動させる。

- 「option」を押しながら、メニューバーの「Product」>「Clean Build Folder」を選択

※この時、「option」が押されていないと、項目が「clean」だけになり、ビルドフォルダをキレイにすることができない。
※これでもシミュレーションで起動されない場合は、一度、Xcodeとシミュレーターを再起動させる。

> 参考：
https://stackoverflow.com/questions/37601925/framework-did-not-have-a-cfbundleidentifier-in-its-info-plist

## Xcode8.3でビルドしていたら、エラーが出た時
なんらかの要因により、再度エラーが発生したら、Gitから落とした状態に戻し、ビルドのクリーンアップを行う。
TestFrightでビルドしてみる。


## 対象
- OS 10.13.3
- Xcode8
- Swift 3

## やりたいこと
TestFrightでビルドして、実機で確認できるようにする

そもそも、DeployGateを使用していたようだが、もしかしたら、TestFirghtの方が使いやすいのではと思い、TestFrightで試してみることにします。

## DeployGate と TestFrightの比較
[こちら](https://dev.classmethod.jp/smartphone/testflight-deploygate/)のサイトで比較をしているので参考にしてください。

- [[iOS] TestFlight の特徴 と DeployGate との違い](https://dev.classmethod.jp/smartphone/testflight-deploygate/)

## 認証やらなんやら
さっそく、自分と同じ状況の人を検索してみた。いきなり発見。[こちら](http://twocolor.hateblo.jp/entry/2017/11/08/204840)の方も同じ境遇でTestFrightで検証をしてみたぽいので参考にさせてもらいました。

- [TestFlight利用までの備忘録](http://twocolor.hateblo.jp/entry/2017/11/08/204840)

そして、初っ端の「App IDの登録」はすでに前回のプッシュ通知で登録していたので、そちらを利用しました。

- [nifty mBassのプッシュ通知を設定する](https://qiita.com/norizou4/private/561d587cb2b9fb045e24)

そして、次に行ったのが iTune Connect にAppを登録する必要がありましたが、前開発者もTestFrightを作成していたようで、すでにマイAppは登録されていました。

## マイAppへのArchive時に問題発生
最初というか、終始この問題に躓いてしまいました。
アプリ自体はすでに登録されているのですが、自分のローカルで修正した最新のファイルをマイAppに再登録（アップデート）する必要があります。

### Archiveできない。
Archiveは、「XcodeのメニューからProduct > Archive」でできるのだが、グレーアウトになっており、Archiveできない状態でした。
その場合は、実証検証したいiphoneを接続して、ビルドの対象を接続した実機にします。下の記事を参考にしてください。

- [Archiveを選択できず、ipaファイルが作成できない時の対処法](https://qiita.com/naoyashiga/items/14608929a36f5f17e1e0)

Archiveにはすごい時間がかかります。

### 開発者とデバイスがあっていない
Archive時にいくつかエラーが発生した。
つくづく、swiftの開発を行っていると思うのが、エラーをちゃんと読めば道は切り開けるということ。しかし、英語なので、何と無くしかわからないのが辛い。
Archive時に出たエラーは開発者が、App IDで登録されているものと、App自体に記入されているものが違うと出ている。
これを直すためには、アプリの設定画面から「Build Setting」>「Signing」の「Code Signing Identity」を全てAppIDで登録してある開発者に設定する必要があります。

![アプリのBuild Setting画面](![04_01.png](https://qiita-image-store.s3.amazonaws.com/0/23659/27e1bb40-39de-a3cd-ae55-e9e1849a0868.png "04_01.png")

- Code Signing Identity
- Developer Team
- Provitioning Profile
- Provitioning Profile(Deprecaed)

これらの内容をAppIDで設定した、ユーザーに変更します。

### なんとか無事にArchiveできました
これで、設定がうまくできていればArchiveできますが、かなり長い時間かかります。およそ15分から20分かかります。

## Update ができない
Archiveが完了すると　Archive画面に自動的に遷移します。右上の「Update」ボタンをクリックします。ここでも結果が出るまでにすごい長い時間かかります。
しかし、私の場合は、この段階でつまずいたままになっています。(2018年2月4日)

一度、諦めて、次の工程に移ってみました。

## マイAppにテスト者を追加
今度は、[iTune Connect](https://itunesconnect.apple.com/)の画面でテストする人をアサインします。
マイAppの「TestFright」をクリックし、アプリを選択します。
左メニュー「iTune Connectユーザー」をクリックして、テスターの「＋（プラス）」ボタンをクリック。テストのユーザーとして登録したい人を登録します。ただしApp IDで登録した人のみ設定できます。
それ以外に外部でテストをお願いしたい場合は、サイドメニューの「外部テスター」に追加できます。

これで、テスターにメールが届き、実機で検証することができます。
私の場合は、以前のバージョンでは検証ができましたが、Updateが完了していないため、新しいバージョンでの検証ができませんでした。
Tensor flowでのSiamese Network modelの実装　ワンショットラーニング

去年画像分類をMxnetでSiamese Network modelで実装したが、今回自分の振り返り用も含めてTensor flowで実装したいと考えたのでまとめたい。正確にはネットワーク部分をCNNで実装した。

## Siamse Networkモデルとは
以下の論文や記事によれば、

[Koch, Gregory, Richard Zemel, and Ruslan Salakhutdinov. "Siamese neural networks for one-shot image recognition." ICML Deep Learning Workshop. Vol. 2. 2015.](https://www.cs.cmu.edu/~rsalakhu/papers/oneshot1.pdf)

[Siamese Networkをchainerで実装するまで](https://qiita.com/TatsuyaMizuguchi17/items/f6ef9d7884b4cf4b364e)
ワンショット（学習データが１件）学習や不均衡データに対する分析にも強いようで、そのため去年のプロジェクトで少し使った。ただもちろん弱点もあって２値クラスでしか対応していないという事があげられる。

## Siamse Networkモデル説明と実装
２つ同じネットワークを用意して、その出てきたそれぞれの距離を学習させていくのが、この分析のミソになる。距離層のところは最初の論文はユークリッドらしいので今回はユークリッド距離で実装した。
![キャプチャ.JPG](https://qiita-image-store.s3.amazonaws.com/0/161216/cc5b3f7e-9ae6-db9d-116f-9ef76476d77b.jpeg)

[実装したコード](https://github.com/Dormir30/Siamese_network/blob/master/siamese_network.py)そんなに綺麗なコードではなくてすいません・・・。とりあえず有名なMnist様で実装をした。ただしMnistでもせっかくなので学習データは１件で０と１の分類を行った。

## 結果
その結果は以下のように１枚でも約９０％の精度と高い結果が得られた。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/161216/6a603b0b-7b26-44d1-672c-4dc9033df900.png)


一応以下のようにCNNでもやってみたが、やはり余り良い結果は得られなかった（２値分類なので５０％が基準となる）。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/161216/c1ea7de7-db8d-f095-dd4f-815ad083c990.png)


実際のデータはMnistとかみたいに割り付けがされていることは本当に少なく、不均衡のことが多い。そうゆうときにはやはり便利なアルゴリズムなんだなと思ったし、実際にsomote擬きみたいな事を画像でもやったが、それよりはSimese Network modelのほうが精度はよかった。研究でもう少し複雑なネットワークや多値分類をやっているケースもあるので今後も勉強していきたいところ*。


注 っていうかこれもうちょっと発展させたら普通に論文としてどっかに投稿できそうな感はある。
ServiceNowでHeaderやMenuやBrowser Tab Titleを変更する

Version:Kingston

# 作るもの

ServiceNowでHeaderやMenuやBrowser Tab Titleを変更します

![FireShot Screen Capture #008 - '20% cooler now' - dev48240_service-now_com_nav_to_do_uri=_$pmview_do_sysparm_view=planning&sysparm_projid=99e3fd4ddba0.png](https://qiita-image-store.s3.amazonaws.com/0/193272/da11acf0-2e33-f41a-3db0-3016ec82bbdc.png)

# Propertiesを編集する

Filter Navigatorにpropertiesと入力しSystem Properties -> Basic Configuration UI16を選択して色々編集します

![FireShot Screen Capture #006 - 'System Configuration UI16 I 20% cooler now' - dev48240_service-now_com_nav_to_do_uri=_$system_properties_ui_do_sysparm.png](https://qiita-image-store.s3.amazonaws.com/0/193272/d07d649c-34f7-e25a-6573-212389155a60.png)

Page header captionが画面左上の文字列、Browser tab titleがBrowser Tab Title(HTML)のTITLE、Banner image for UI16が画面左上のログ画像、後は色々と画面の色を変更可能な様です
PHPで正規表現のバリデーション


```php
$input_string = '^([\s\S]*)$';

@$result = preg_match('/'.$input_string.'/u', '', $match_list);// uはマルチバイト対応

if ($result === false)
{
    // バリデーションエラー
}
```

[preg_match](http://php.net/manual/ja/function.preg-match.php)
> preg_match() は、pattern が指定した subject に
> マッチした場合に 1 を返します。
> マッチしなかった場合は 0、
> **エラーが発生した場合は FALSE を返します。**
新しいMacでGitHubのSSH接続をするまでの環境構築手順

新しいMacでGitHubのSSH接続を確認するところまでの環境構築メモ。
※すでにGitHubアカウントが存在する前提で進めます

# 大まかな流れ

1. gitのインストール
2. SSH認証キーの作成
3. GitHubに公開鍵を登録
4. SSH接続確認

# Homebrew経由でgitをインストールする
まずはgitをインストールします。
ここではHomebrew経由でインストールするので、まだインストールしていない場合はHomebrewをインストールしましょう。

[MacにHomebrewをインストールする手順とWarningの解決方法 - Qiita](https://qiita.com/unsoluble_sugar/items/6ac1848ba1933ac05c76)

Homebrewが使えるようになったら、ターミナルで以下コマンドを打ちgitをインストールします。

```
$ brew install git
```

以下コマンドでgitのバージョン番号が表示されればOKです。

```
$ git --version
```

# SSH認証キーの作成
SSH認証に使う秘密鍵（id_rsa）と 公開鍵（id_rsa.pub）を生成します。

```
$ ssh-keygen -t rsa
```

## ~/.ssh/configに接続設定を追加
```
$ vim ~/.ssh/config
```
```
# global setting for macOS Sierra
Host *
  AddKeysToAgent yes
  UseKeychain yes

Host github
  HostName github.com
  IdentityFile ~/.ssh/id_rsa
  Port 22
  User git
```
`AddKeysToAgent`と`UseKeychain`の設定は、macos Sierra以降でマシン再起動すると毎回パスワード入力を求められるようになったので、その対策として入れてます。



## 生成した秘密鍵に読み取り専用属性を与える
```
$ cd ~/.ssh
$ chmod 600 id_rsa
```

## ssh-agentに秘密鍵を登録
```
$ eval `ssh-agent`
$ ssh-add ~/.ssh/id_rsa
```

## 登録されたか確認
```
$ ssh-add -l
```

`The agent has no identities.`と出たら登録されていない状態です。

# GitHubに公開鍵を登録する
続いてGitHubに公開鍵の登録をします。

## 公開鍵をコピーする
```
$ pbcopy < ~/.ssh/id_rsa.pub
```

## GitHubへアクセスしSSH Keysを登録
GitHubで「settings」 > 「SSH and GPG keys」 > 「New SSH Key」と進み、「Key」項目に公開鍵を貼り付けて「Add SSH key」をクリック。
<img width="781" alt="スクリーンショット 2018-03-13 21.03.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/6380/22183c66-efeb-dce0-704d-17da0a02829d.png">
GitHubから「[GitHub] A new public key was added to your account」という件名のメールが来るはずなので確認しましょう。

## 公開鍵が登録されたか確認
```
$ ssh -T git@github.com
$ Are you sure you want to continue connecting (yes/no)? yes
$ Enter passphrase for key
Hi unsolublesugar! You've successfully authenticated, but GitHub does not provide shell access.
```


# SSH接続確認
`.ssh/config`に登録したホスト名でも接続できるか確認。

```
$ ssh github
PTY allocation request failed on channel 0
Hi unsolublesugar! You've successfully authenticated, but GitHub does not provide shell access.
Connection to github.com closed.
```
疎通確認ができたら終わり。
CDBに共通ユーザを作るときの注意事項

使用環境はOracle12c。

CDBに共通ユーザを作成するときは、
ユーザ名の頭に「C##」を入れる必要があるので注意、という話です。


ユーザの作成方法は下記。
sqlplusでログインし、CREATE USER文を実行します。

```ruby
[oracle@sample ~]$ sqlplus / as sysdba
SQL> create user c##test00 identified by welcome1;

ユーザーが作成されました。


```


※「C##」を入れないと、下のようなエラーが出ます。

```ruby
ORA-65096: 共通ユーザーまたはロール名が無効です
```


作成したユーザを確認するときは、dba_usersからselectします。

```ruby:
SQL> select username from dba_users order by 1;

USERNAME
----------------------------------------
…
C##TEST00
…
```
Azure Functions で Post の引数が渡らない問題を検証する

Azure Functions の Javascript のディフォールトのプログラムで Post の引数が渡らないので、それを検証しました。

Azure Functions のプログラムです。ディフォールトをメッセージを出すように改造しました。

```js:index.js
module.exports = function (context, req) {
    context.log('JavaScript HTTP trigger function processed a request.');

    if (req.query.name || (req.body && req.body.name)) {
        context.res = {
            // status: 200, /* Defaults to 200 */
            body: "Hello " + (req.query.name || req.body.name) + " " + req.method + "\n"
        };
    }
    else {
        var str_out = ""
        str_out += "*** error ***\n"
        str_out += "method = " + req.method + "\n"
        str_out += "req.body = " + JSON.stringify(req.body) + "\n"
        context.res = {
            status: 400,
            body: str_out
        };
    }
    context.done();
};
```

まず、Get のテスト

```text
$ curl -G https://ekzemplaro02.azurewebsites.net/api/HttpTriggerJS1?code=****== --
data 'name=jiro'
Hello jiro GET
```

次に -G を取って Post のテスト

```text
$ curl https://ekzemplaro02.azurewebsites.net/api/HttpTriggerJS1?code=****== --
data 'name=jiro'
*** error ***
method = POST
req.body = "name=jiro"
```
[react]子のコンポーネントから親のstateを変更する方法

#子のコンポーネントから親のstateを変更する方法
子のコンポーネントから親のstateを変更したい場合があると思います。
最近ここでかなり時間を取られたのでメモがわりに残しておこうと思います。

## コード
- parent(親コンポーネント)

```jsx
import React from 'react';
import PropTypes from 'prop-types';
import child from './child';

class parent extends React.Component {
  constructor(props) {
    super(props);

    this.state = {
      hoge: 'hogehoge'
    };
  }

  hogeFunc() {
    this.setState({ hoge: '変えたぞ' });
  }
  render() {
    return (
      <div>
        <child dataHoge={() => { this.hogeFunc(); }} />
      </div>
    );
  }
}
```

- child(子コンポーネント)

```jsx
import React from 'react';
import PropTypes from 'prop-types';

const propTypes = {
  dataHoge: PropTypes.func,
};

class child extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
    };
  }
  
  clickButton() {
    return this.props.dataHoge();
  }
  
  render() {
    return (
      <div>
        <button onClick={() => { this.clickButton(); }}>ボタン</button>
      </div>
    );
  }
}

child.propTypes = propTypes;
export default child;
```

## まとめ
親のコンポーネントでsetStateさせる関数を用意させ、
子のコンポーネントにpropsで関数を渡すことで子のコンポーネントから
その関数を実行できるようになります。
仮想ネットワーク ピアリング( Virtual network peering)を試してみる



他社様サブスクリプションと接続する際に使ったので、忘れないうちに個人の検証環境で復習した記録
が、実際問題どういった時に使うことが多いのだろう。。。

- 20180314

# Over View
Virtual network peeringとは[MS公式](https://docs.microsoft.com/ja-jp/azure/virtual-network/virtual-network-peering-overview)

異なるサブスクリプションやリソースグループの仮想ネットワーク同士をつなぐ。 
接続されたNWはMSバックボーン経由の通信がされる。

- ピアリング同士の通信は費用はわずかながら発生する
- ゲートウェイ（VPN GatewayとかExpressRoute）がいらない
- 同じリージョン内のみ（リージョン間でのPeeringはPreviewだが、US、カナダのみできる）
- ルーティング設定は自動でされる。
- アドレス体系は気にしなくていいようだ（クラスAとクラスCの接続もOK）

## 今回の環境
次のNWをピアリングしてみた

- NW-A:10.0.0.0/16
- NW-B:192.168.29.0/24
- リソース名はnwa-nwb-peeringでいいんじゃないでしょうか

## 準備

作業を行うアカウントは接続する**両方**の**リソースグループ**に対して、**ネットワークの共同作業者**の権限が必要なので
ポータルから権限を付与しておくこと

## 手順

1. NW用のリソースグループを作って、NWを作る。
![1.png](https://qiita-image-store.s3.amazonaws.com/0/242511/2836398f-c737-9928-626a-7b6ff0db3671.png)

1. 作成したNW-ABのリソースIDをコピーする。（後で使う）
![vnet2.png](https://qiita-image-store.s3.amazonaws.com/0/242511/22162a5f-a841-d74c-ee6f-763a93c33390.png)

1. vnet(NW-A) を選択 > peering > 項目を入力  
  I know my resource IDにチェックして、Resource IDを入力が楽
![vnet5.png](https://qiita-image-store.s3.amazonaws.com/0/242511/3ceed5a4-94b2-a7fe-3492-ff16224c9600.png)


1. vnet(NW-B) でも同様の手順を実施

## 動作確認

ここではA,BのNW上のサーバーから相互にRDP接続することで疎通確認することとした。

1. AzureのNSGでvnetの通信を許可する
1. サーバーのWindowsFWで、接続したvnetのアドレスからの着信を許可する。  
1. RDPして完了！  
![vnet9.png](https://qiita-image-store.s3.amazonaws.com/0/242511/979f012a-3ee3-0e21-a1f6-147e6cc2c9d2.png)
CentOS6.8 > kernel以外をアップデートする

```txt:動作環境
CentOS 6.8 (64bit)
  - on VMWare workstation
  - ホスト側はCore i7-6700
for WRF3.9, WPS3.9
  Open MPI v2.1.1
  gcc version 4.9.2 (とgfortran; devtoolset-3使用)
　NetCDF v4.4.1.1, NetCDF (Fortran API) v4.4.4
```

### 参考

- [CentOSのパッケージをアップデートしたときにやったこと](https://qiita.com/yuizho/items/3b6a26e0f664080c6530) by @yuizho さん
- [yumでシステムのアップデート](http://www.8wave.net/yum.html) @ hajichan.net

情報感謝です。

### 実施

上記を参考に下記を実施しました。

1. /etc/yum.confに`exclude=kernel*`を追加
2. カーネル確認
    - `$ uname -a`
    - `Linux deltaFlyer.localdomain 2.6.32-642.el6.x86_64 #1 SMP Tue May 10 17:27:01 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux`
3. `yum check-update`
    - カーネルは対象外であることを確認
4. `$ cat /etc/redhat-release`
    - `CentOS release 6.8 (Final)`
5. `yum update`
    - アップデートされる

```bash
$ cat /etc/redhat-release 
CentOS release 6.9 (Final)
```

### アップデート後の確認

All hands, damage report! (船員全員、被害報告!)

- [x] WPS, intact (無傷です)
- [x] WRF, intact
- [x] F***T, intact
- [x] Shields are holding

問題なかった。

これで、仮想でない実サーバーをアップデートする準備は整った。
Python:Left$,Right$,Mid$関数（文字列操作、　初心者向け）

Pythonには文字列の一部を取り出すメソッドが無いかな？と思って検索していたら海外の質問コーナーで同じ質問を見つけました。
その回答欄にプログラムがあったのでそれを今迄使っていました。
他にも訳のわからない回答があったのですが？？？

ブックマークに登録していたので今日たまたま開いて、最後まで読んで意味がわからないが書いてあることを実行したら、あれ、`Left$`,`Right$`,`Mid$`関数ってPythonには最初から機能がついている！！

記憶力が悪いのでライブラリに登録することにしました。
コメントにてご指摘いただきましたので一部修正しました。

```python:LeftRightDoll.py
#!/usr/bin/python3

def left(text, n):
  return text[:n]

def right(text, n):
  return text[-n:]

def mid(text, n, m):
  return text[n-1:n+m-1]
  #str = str[:n+m-1]  #ご指摘により削除
  #return str[-m:]    #ご指摘により削除

#使い方
print(left("abcdefghijklmnopqrstuvwxyz",3))
print(right("abcdefghijklmnopqrstuvwxyz",3))
print(mid("abcdefghijklmnopqrstuvwxyz",10, 5))
```

```python:結果
$ ./LeftRightDoll.py
abc
xyz
jklmn
```

~~あと、例外処理は
https://qiita.com/ty21ky/items/1d591b2180333d4d4961
LibreOffice Pythonマクロ　サンプルプログラム（初級者向け）Writer編 No.1~~（これもいらないような気がします。）

ライブラリに登録は
https://qiita.com/ty21ky/items/942e8f46441b092fce29
自作のPythonプログラムをパッケージに追加して使用する

~~引数の有無等のチェックは適宜追加してください。~~（引数がないと呼び出す側のプログラムでエラーが出るので、不要と思います。文字列がn個より短い場合は、文字列がそのまま返されます。）
【非推奨】Google Chromeで証明書警告の画面を回避する方法

#開発で警告が邪魔になるとき
![image.png](https://qiita-image-store.s3.amazonaws.com/0/228301/7674f1b8-45ee-1861-f625-9388208a87d7.png)

Google ChromeでWeb開発してるとき、上の画面がたびたび表示されて「はいはい許可許可」っていう場面があると思います。

毎回許可すればいいのですが、それも煩わしいというときの解決法。

#起動オプション「--ignore-certificate-errors」を使う

Chromeのショートカットを作成>プロパティ>ショートカット>リンク先に**「--args --ignore-certificate-errors」**という起動オプションを追加します。

以後証明書を無視したい時はこのショートカットで開けばOK。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/228301/d181c917-edef-887c-0300-766e37d80c42.png)


Chromeの起動オプションは他にもいろいろあります。デフォルトシークレットブラウザで開く起動オプション**「--incognito」**とかも便利。
参考:http://chrome.half-moon.org/43.html

※セキュリティ上好ましくないので、Web開発専用です。
【CSS設計】BEMについて1日考えてみた

## はじめに
皆さんは普段コーディングをする際、cssに対してどのような「設計」をしていますでしょうか？
- BEM
- SMACSS
- FLOCSS
- OOCSS
- ECSS
...などなど色々な方法があると思います。
中にはこれらを複合して使ってみたり独自で開発している方もいるのではないでしょうか。

私はよくBEMでコーディングをしています。
仕事でコーディング規約を作ることになったのですが、自分が使っているBEMって合っているのか...BEＭにわかなんじゃないか...と気になったので、少しまとめてみました。

## BEMとMindBEMding
なんとBEMには種類があるみたいです(種類があったら派閥ができてややっこくならないのかな...)

### BEM

[BEMの公式](https://en.bem.info/methodology/)によると、

```

<div class="block">
	<div class="block__element">
		<div class="block__element block__element_modifier">
			hogehoge
		</div>
		<div class="block__element block__element_modifier">
			hogehoge
		</div>		
	</div>
</div>
```

上記のように、
- **block**は小文字始まり(あくまでも公式内では)
<br>

- **element**はアンスコ2つで表現
例) `.block__element`
<br>

- **modifier**はアンスコ1つで表現
例) `.block__element_modifier `
また、modifierのkeyとvalueをアンスコを繋げて表現することも可能
例) `form__submit_size_s`
などform__submitの「sizeがsだよ」という状態を表すことができる。ちなみにMindBEMdingではこの記法は使わない。
<br>

- 単語を区切るときはケバブケースを使うらしい。
例) `.block-name` `.block__element-name`


など公式には他にも様々なルールが載っています。
私は記事などを見てなんとなく書いていたBEMにわかなので、驚いた部分が多々ありました。

### MindBEMding
BEMをCSSのクラス名に適用するための規則でこの記法が「BEM」と呼ばれることが多いらしい。
私もてっきりBEMはこれしかないと思っていました。

[MindBEMding公式](https://csswizardry.com/2013/01/mindbemding-getting-your-head-round-bem-syntax/)によると、

```

<div class="block">
	<div class="block__element">
		<div class="block__element block__element--modifier">
			hogehoge
		</div>
		<div class="block__element block__element--modifier">
			hogehoge
		</div>		
	</div>
</div>
```

- **element**はアンスコ2つで表現
例) `.block__element`

- **modifier**はハイフン2つで表現
例) `.block__element--modifier ` `block-name--modifier`

- こちらも単語を区切るときはケバブケースを使うらしい。
例) `.block-name` `.block__element-name`

### その他
見たことのあるBEM...?記法

- `Block` `Block__Element`
アッパーケースのようなもの

- `blockName` `blockName__elementName`
キャメルケースのようなもの

- `block_name` `block_element-modifier`
アンスコ/ハイフンそれぞれ1つなもの


## まとめ
おそらくどれも正解不正解はないのでしょうが、
「BEM」を使うときは公式にしたがって書くべきだなーと思いました。
「googleは何を使ってる？」「githubは？！」と調べながらやってみましたが、BEMの世界は思ったより深そうです...
NutanixのPower Systems版をさわってみた

#NutanixのPower Systems版とは？
2017年に、IBMとNutanixが提携し、サーバーを発表していました。

- https://www.ibm.com/blogs/systems/jp-ja/ibm_hyperconverged_systems_powered_by_nutanix/

今回、そのサーバーの1つであるCS821を触れる機会があったので、簡単にPrismの管理画面を紹介していきます。

#実機の前に
NutanixのPower Systems版について調べてみます。

各会社での製品紹介ページ
Nutanix
- https://www.nutanix.jp/ibm/
IBM
- https://www.ibm.com/jp-ja/marketplace/hyperconverged-systems

IBMのデータシート
- [IBM Hyperconverged Systems powered by Nutanix データシート](https://www-01.ibm.com/common/ssi/cgi-bin/ssialias?htmlfid=POD03132JPJA)

Nutanix、IBM共にビッグデータや機械学習のためのインフラストラクチャーと記述があります。
Power Systems版では、全てSSDでの構成のようでハイパーバイザーとしてAHVのみ使えるようです。
仮想マシンのOSには、UbuntuとCentOSが使えます。

#Prism管理画面

x86版のNutanixと同様に、CS812でもPrismの画面からネットワークの設定やVMの作成といった各種操作ができます。
<img src="https://qiita-image-store.s3.amazonaws.com/0/242652/e181370b-d345-2cfd-2885-0256b0859ace.png" width=100%>

ホーム画面をみると、ハードウェア情報のモデルのところにCS821と表示されています。
ホスト4、ブロック4となっているので、CS821が4台で1クラスターが構成されていることがわかります。

ハードウェア管理画面のダイアグラムを確認してみると、CS821が4台あるのがわかります。
![スクリーンショット 2018-03-15 10.52.20.png](https://qiita-image-store.s3.amazonaws.com/0/242652/34bbc425-8371-f2ad-0a11-ef552803cf76.png)

ホーム画面では、その他にもIOPSのグラフや健全性の表示がされています。
VMのCPU使用率が高くなった場合であったり、クラスターに障害が発生したときなどに表示が変わります。

Nutanix CE(Community Edition)をさわったこともありますが、Power Systemsでもほとんど同じ画面で操作ができます。

今回は試せていませんが、Prism Centalを利用すればx86で構成したクラスターと同じ操作画面で管理できるようです。

##VMの管理画面
VMの管理画面の下のような形で表示されています。
<img src="https://qiita-image-store.s3.amazonaws.com/0/242652/431b4c1f-abcd-12af-bdd6-b2c9b78c3c22.png" width=100%>
作成したVMが並んで表示されています。
ここの画面から、VMの作成やマイグレーション、スナップショットの作成などが出来ます。
今後、Prismを使ったVMの作成も記事にしようと思います。

##ネットワークの管理画面
他にも、ネットワークの管理画面は下のように表示されます。
どのVMが、どのホストに接続されているか確認することができます。
ネットワークの経路を確認する時に見やすくて良いと思います。
<img src="https://qiita-image-store.s3.amazonaws.com/0/242652/916ebc03-e3d3-e995-c540-ca33562de392.png" width=100%>

#今後
- VMの作成方法や各種設定にふれていく予定

#参考
- [IBM Systems Japan Blog](https://www.ibm.com/blogs/systems/jp-ja/ibm_hyperconverged_systems_powered_by_nutanix/)
- [IBM Hyperconverged Systems powered by Nutanix データシート](https://www-01.ibm.com/common/ssi/cgi-bin/ssialias?htmlfid=POD03132JPJA)
- [Nutanix プレスリリース](https://www.nutanix.jp/press-releases/2017/05/16/ibm-nutanix-launch-hyperconverged-initiative-bring-enterprises-cognitive-era/)


Nutanix CEって？という方向けの参考
- [【2016年版】Nutanix CE再入門＋最新情報（その1：ハイパーコンバージドインフラとNutanix CEの概要）](https://qiita.com/hanakara_milk/items/316c59130454f9da92d3)
Railsアプリケーションのhttpアクセスを強制的にhttps化する方法

#やりたいこと

サイトのSSL化が完了した後、HTTPアクセスを遮断したい。
調べるといくつか記事が出てきたが最も簡単にできた方法を記載する

#実装方法

```ruby:config/environments/production.rb
config.force_ssl = true
```

上記の記述が初期ではコメントアウトしているのでそれをアンコメントしてあげれば良いらしい。
セキリュティ等の観点からもやはりHTTPアクセスは遮断したいですよね。これでRailsアプリケーション全体のアクセスが強制的にHTTPS化されました！
ClickHouse のパーティション

# ClickHouse のパーティション

ClickHouse では、INSERTのみでUPDATE/DELETEが行えませんが、パーティションを使いデータを分割しておけば、パーティション単位では削除が可能です。

昔はDate型のカラムを使い、月単位でのパーティションしかできませんでしたが、最近のバージョンで任意のカラムでパーティション分割が行えるようになりました。

## パーティションの指定方法

パーティションが使えるのは、MergeTree系のエンジンのみになります。
次のように、パーティションとして使うカラムと、ソート順を指定します。

```sql
CREATE TABLE partitioned_by_date(
  log_date Date,
  log      String
) ENGINE = MergeTree PARTITION BY log_date ORDER BY log_date;
```

PARTITION BY (a, b) のように指定すれば、複数カラムをキーとしたパーティションも可能です。

パーティションを細かくしすぎると、性能が落ちるので、削除したい単位を考えて指定すると良いと思います。
パーティションをまたがっては圧縮がされないので、細かいパーティションにすると圧縮率が下がってしまいます。また、多くのパーティションをスキャンすると参照性能にも影響が出る可能性があります。

こちらに、月単位のパーティションから日単位に切換えて、7.7GB から 15GB にデータ量が増えたという記事があります。
https://www.altinity.com/blog/2017/11/8/custom-partitioning-in-clickhouse-1154310

### パーティション指定で便利な日付関数

以下の関数を使うと、月、週、日別の指定ができます。

- 月単位：toYYYYMM(date/datetime)
- 日単位：toYYYYMMDD(datetime) ※時刻から日付にしたい場合
- 週単位：toMonday(date/datetime)

実行すると以下のようになります。

```sql
SELECT toYYYYMM(now())

┌─toYYYYMM(now())─┐
│          201803 │
└─────────────────┘

SELECT toYYYYMMDD(now())

┌─toYYYYMMDD(now())─┐
│          20180314 │
└───────────────────┘

SELECT toMonday(now())

┌─toMonday(now())─┐
│      2018-03-12 │
└─────────────────┘
```

## パーティションの確認と削除

MergeTree エンジンでは、INSERTするごとに、1つのpartが作られます。
このpartをバックグラウンドでマージして数を減らすことで、性能を維持しています。

system.parts テーブルには、このpartsの一覧が入っていますので、partitionごとに集計することで、パーティションのレコード数やサイズを確認することができます。

```sql
SELECT partition, sum(rows) AS rows, sum(bytes) AS bytes
  FROM system.parts
 WHERE active AND table = 'partitioned_by_date'
 GROUP BY partition;

┌─partition──────┬─rows─┬─bytes─┐
│ \'2018-03-01\' │    1 │   440 │
│ \'2018-02-01\' │    2 │   878 │
└────────────────┴──────┴───────┘
```

削除するには ALTER TABLE table DROP PARTITION parttion を実行します。

```sql

ALTER TABLE partitioned_by_date
DROP PARTITION '2018-02-01'

Ok.

SELECT partition, sum(rows) AS rows, sum(bytes) AS bytes
  FROM system.parts
 WHERE active AND table = 'partitioned_by_date'
 GROUP BY partition;

┌─partition──────┬─rows─┬─bytes─┐
│ \'2018-03-01\' │    1 │   440 │
└────────────────┴──────┴───────┘
```
OpenAPI 3.0 (swagger) のバリデーションをCircleCIで回す

# モチベーション
OpenAPIを使ってAPIの定義を書いているが、ファイルが大きくなってくると定義がOpenAPIの仕様から逸脱していないかの確認が大変になってしまう（いちいち [editor.swagger.io](http://editor.swagger.io) に貼り付けるのは面倒だし [validator-badge](https://github.com/swagger-api/validator-badge) はOAS3.0に未対応っぽい）のでCircleCIでやりたい。

# 結論
[openapi3-validator](https://github.com/usabilla/openapi3-validator) を使う。
有志が開発している [validator](https://github.com/p1c2u/openapi-spec-validator) をdockerで使えるようにwrapしたものだが、今のところvalidation機能については問題なさそう。

# CircleCI設定例
```.circleci/config.yml
jobs:
  openapi:
    wordking_directory: ~/myapp
    docker:
      - image: circleci/ruby:2.5-node
    steps:
      - checkout
      - setup_remote_docker:
          docker_layer_caching: true
          version: 17.11.0-ce
      - run:
          name: openapi
          command: |
            docker create -v $(pwd):/openapi --name openapi-validator alpine:3.4 /bin/true
            docker cp ./docs/openapi/myapp-api.yaml openapi-validator:/openapi
            docker run -it -w /openapi --rm --volumes-from openapi-validator usabillabv/openapi3-validator myapp-api.yaml
```
OpenAPIを記述したyamlをマウントしないといけないので、[この辺](https://circleci.com/docs/2.0/building-docker-images/#mounting-folders)を使っています

```shell:通った時
$ docker run -it -w /openapi --rm --volumes-from openapi-validator usabillabv/openapi3-validator myapp-api.yaml
 [PASS] No errors found
```

```shell:落ちた時
$ docker run -it -w /openapi --rm --volumes-from openapi-validator usabillabv/openapi3-validator myapp-api.yaml
   :
   :
Error #11 in [security]:
    {'http': []} is not of type 'array'
    {'http': []}

 [FAIL] 11 errors found
```

べんり。
socket.ioの取り扱い

サーバーサイドではページごとにsocket.ioの処理を書くのではなく、1つにまとめる。
クライアントサイドでは、サーバから送られてきたメッセージに対しての処理をページ別に書く。

なんか違うような。。

```nodejs:app.js
app.use('/', index);
app.use('/aa', bb);
app.use('/bb', bb);
```

```nodejs:aa.js
var io = require('socket.io')(1234);
io.on('connection', function(socket){
 socket.on('fa', function(aa){
 	socket.emit('ca');
 });
 socket.on('fb', function(aa){
 	socket.emit('cb');
 });
});
router.get('/', function(req, res, next) {
  res.render('aa');
});
module.exports = router;
```

```nodejs:bb.js
router.get('/', function(req, res, next) {
  res.render('bb');
});
module.exports = router;
```

```nodejs:aa.html
<script src="/socket.io/socket.io.js"></script>
var socket = io();
socket.emit('fa');
socket.emit('fb');
socket.on('ca', function(aa){
});
socket.on('cb', function(aa){
});
```
```nodejs:bb.html
<script src="/socket.io/socket.io.js"></script>
var socket = io();
socket.emit('fa');
socket.emit('fb');
socket.on('ca', function(aa){
});
socket.on('cb', function(aa){
});
```
AWS APIGateway　Authorizer で Cognito　認証を設定

[![Screenshot from Gyazo](https://gyazo.com/fd5113cacaf91b48f070ab3cad57b471/raw)](https://gyazo.com/fd5113cacaf91b48f070ab3cad57b471)

こいつを設定するためにGUIが使えなくなっているのでコマンドを紹介しときます。

GUIで設定できるようになったら、報告するかも。

$ aws apigateway create-authorizer --name YOUR-AUTHZ-NAME --rest-api-id your_api_id --type COGNITO_USER_POOLS --provider-arns  arn:aws:cognito-idp:your_userpool_cognito_arn --identity-source 'method.request.header.Authorization' --region ap-northeast-1
smoosh, squash, flatten?

# Smoosh, squash, flatten?

TC39ではflattenという関数(ネストされた配列をフラットにする)の名前をsmooshとかsquashにしたほうがいいんじゃないかという[議論](https://github.com/tc39/proposal-flatMap/pull/56)がされている。ちなみに、TC39はECMAScriptに関する提案を扱う委員会のこと。

flattenの動きはこんな感じ（になる予定？定かではない）

```javascript
const a = [1, [2, 3, 4], 5];
flatten(a); // -> [1, 2, 3, 4, 5]
```

なぜflattenではまずいかというと、[MooTools](https://mootools.net/core/docs/1.5.2/Types/Array)というユーティリティライブラリにflattenという関数がありTC39で提案されている関数と互換性がないため。

個人的にはflattenになってほしい。多くのライブラリがflattenという名前を採用している気がするから。

# 参考
- [dev.toの記事](https://dev.to/kayis/smooshing-javascript--5dpc)
FreeBSDでApacheのインストールと起動

今回はFreeBSDでWebサーバとしてのApacheをインストールしていきます。

```java:Apacheのインストール
# pkg search apache2（Apache２バージョンの検索）
apache22-2.2.34_1              Version 2.2.x of Apache web server with prefork MPM
apache24-2.4.29                Version 2.4.x of Apache web server
p5-Apache2-SOAP-0.73_4         Apache2 mod_perl2 SOAP Server
p5-Apache2-SiteControl-1.05_3  Perl web site authentication/authorization system
今回は最新のApache2.4を選択しましょう。

# pkg install apache24-2.4.29
インストール開始・・・
```

インストールが完了したら、Apacheの設定をいじっていきましょう。
今後、Apacheに関して色々と設定していくと思います。Apacheの設定は
##### **/usr/local/etc/apache24/httpd.conf**
に書き込んでいきます。
FreeBSDには初期状態からエディタとして**「vi」**がインストールされていますが、**「vim」**を今後使用したい方はインストールしておきましょう。  
  
  
```java:vimのインストール
# pkg install vim
インストール開始・・・
```  
  
  
  
  
では、vimでApacheの設定をみてみましょう。

```java:Apacheの設定
# vim /usr/local/etc/apache24/httpd.conf
#
# This is the main Apache HTTP server configuration file.  It contains the
# configuration directives that give the server its instructions.
...Apacheについての文章や設定が書かれています。

変更点は一つのみです。
...
ServerName www.example.com:80
文頭の＃を消して下さい。
...
```
　
viやvimはコマンドで操作することになるため、使い方がわからない場合はWebで調べながら進めて下さい。以上で設定完了です。vimを終了して下さい。　　
　　
　　
　　
　　
次にApacheを起動するための設定をします。

```java:rc.confの設定
# vim /etc/rc.conf
...
apache24_enable="YES"
最終行に追記して下さい。
```

以上で設定完了です。vimを終了して下さい。
　　
では、設定した内容に間違いがないか確認しましょう。

```java:設定内容の確認
# apachectl configtest（文法チェック）
Performing sanity check on apache24 configuration:
Syntax OK
Syntax OKと出たら文法あってます！というサイン

#apachectl start（Apacheスタート）
Performing sanity check on apache24 configuration:
Syntax OK
Starting apache24.

これで完了です。もし、設定を変えた際には毎回Apacheの再起動を行わないと、反映されません。
リスタート方法
# apachectl restart
Performing sanity check on apache24 configuration:
Syntax OK
Stopping apache24.
Waiting for PIDS: 30177.
Performing sanity check on apache24 configuration:
Syntax OK
Starting apache24.

もしくは
# apachectl stop
Stopping apache24.
Waiting for PIDS: 91657.
# apachectl start
Performing sanity check on apache24 configuration:
Syntax OK
Starting apache24.
を実行すれば大丈夫です。
```
ではApacheが正常に動いているのか確認しましょう。

Apacheが起動している場合、自分のPCから何らかのエクスプローラーを開きましょう。GoogleChomeでもSafariでもFirefoxでも何でもいいです。　　
　　
　　
アドレスを打ち込む場所にhttp://（アドレス）
アドレスは自分で設定したもの
[アドレスがわからない方はこちら](https://qiita.com/kaz1shuu2/items/a9a8150b46bcdb814e25)
![Apacheの確認.png](https://qiita-image-store.s3.amazonaws.com/0/241572/ec3be9d8-1233-3732-89d5-47c1523d81da.png)
　　
　　
　　
　　
するとIt works!と出てくると思います。
![It works.png](https://qiita-image-store.s3.amazonaws.com/0/241572/2bd52a0a-3b0d-25f0-1fe9-07a19b9a718a.png)
これで正常に動いていると確認できました。
GCPにはサービスとAPIとあるから気をつけましょう

#GCPと仲良くなりたい
AIとか機械学習をやっているともうはやクラウドがさわれないと話にならなくなりつつあり、ちゃっちゃとクラウドさんと仲良くなるべきGCPをいじっています。
https://cloud.google.com/?hl=ja

#proxy経由でGoogle Cloud SQLにつなげるだけで詰まった

https://cloud.google.com/sql/docs/mysql/admin-api/?hl=ja

ここをみればできそうなもんなんですが詰まりまして、とりあえず何が死んでいるのかを下記のコマンドで確認。



```コンソールから
systemctl list-units
```

そうしまたら、proxyのサービスも死んでまして、なんでだろうと思ったらGCPには
**『Google Cloud SQL』**
っているサービスと
**『Google Cloud SQL　API』**
っているAPIがあり、
後者を有効にしていなかっただけでした。

『Google Cloud SQL』
https://cloud.google.com/sql/docs/?hl=ja
『Google Cloud SQL　API』
https://cloud.google.com/sql/docs/mysql/admin-api/?hl=ja

#おわりに
皆さんも気をつけなはれや!
Vagrantのおけるポートフォワーディングではまった

Oracle VM VirtualBox Manager 5.2.8


#Vagrantのポートフォワーディング
簡単に言えば、ホスト（例えば自分のPC）から、ゲスト（ここではVagrantで作った仮想環境）で立ち上げたアプリにアクセスするために使用します。

仮想環境の立ち上げ方などは検索すればたくさん出てくるので省略しますが、下記のような設定を追加して、ポートフォワーディングを可能な設定にします。必要に応じて、`vagrant up`　or　`vagrant reload`をします。



```ruby:Vagrantfile
config.vm.network :forwarded_port, guest: 8000, host: 8000
```

その後、ゲスト（仮想環境）にて、ポート８０００を使用するアプリ（例えばnginx）を立ち上げると、ホストのブラウザなどから http://localhost:8000 と入力することで、ゲストのアプリにアクセスできるようになります。

参考：[Vagrant + VirtualBoxで仮想環境側のポートをあける](https://qiita.com/kkam0907/items/4a345cd5e834969d3859)

#はまったこと
初回起動時にはうまく接続できたのですが、ゲストにてアプリを立ち上げようとすると、アプリが起動できない。
*The port is already in use*のような表示がされて、起動に失敗します。`lsof -i:8000` で確認すると、確かに使用されています。ステータスはTCP listenとかです。開いているのはいいんだけど、なぜアプリが起動できない。Why?
ちなみに、`vagrant up`自体ができない原因は、すでにホストでそのポートが使用されているからなので、`lsof`などでPIDを調べて、killするか、そもそもvagrantfileの設定を変えましょう。`auto_correct: true`を追加しても良いかもしれません。そのときは、ホストで`vagrant port`とやって、対応ポート番号を確認したりする必要があるかもしれませんが。

参考：[ポートフォワードにより仮想マシン内のサーバにアクセスする](http://maku77.github.io/vagrant/port-forward.html)

脱線しましたが、今回私がはまったのはこれではありません。検索してもあまり出てこなかったので、記事にしました（そもそもはまらないのかもしれませんが。。）。

#原因
vagrantを停止するときに、`vagrant suspend`で停止していたためです。この場合、ホストをShutdown、再起動しても、vagrantの状態は `vagrant saved`とかでのままで、`vagrant up`しても、ゲスト側でアプリを同じポートが使用中のステータスで保存され、同じポートを使えません。そのほか、[いろいろ保存されたままになるようです](https://www.vagrantup.com/docs/cli/suspend.html)。メモリとかも圧迫するみたい。詳しくはドキュメント見てください。

#解決
`vagrant halt`をしてから、`vagrant up`をすると、解決しました。
Java9を入れてしまった時にAndroid device monitorを使用する方法

Android開発している時に繋いでいる実機のログを見るためのAndroid device monitorですが、Java9を入れてしまった場合起動時にエラーが出るようになってしまい、使えなくなってしまいます。その時の対処法です


### 症状

ADMを使おうとするとエラーダイアログが発生しログを見ろと言われるのでログを見ると

```
java.lang.IllegalStateException: Unable to acquire application service. Ensure that the org.eclipse.core.runtime bundle is resolved and started (see config.ini).
        at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:74)
        at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:353)
        at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:180)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.base/java.lang.reflect.Method.invoke(Method.java:564)
        at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:629)
        at org.eclipse.equinox.launcher.Main.basicRun(Main.java:584)
        at org.eclipse.equinox.launcher.Main.run(Main.java:1438)
```
のような例外が記録されている

### 原因

すべてJava9のJigSawのせい


### 解決策

monitorのInfo.plist を編集して、java8を使うように修正すればOKです。
下のように、Info.plistのEclipseのKeyにJava8のパスを設定してあげればOKです。
コメントも書かれているので、ファイルを開けばわかると思います。

```xml:/Users/{username}/Library/Android/sdk/tools/lib/monitor.app/Contents/Info.plist
    <key>Eclipse</key>
        <array>
            <!-- この辺にコメントが書かれています -->
            <string>-vm</string><string>/Applications/Android\ 
Studio.app/Contents/jre/jdk/Contents/Home/bin/java</string>
    ...
       </array>

```
※PathはOSによって変わる可能性があります。
※--add-modulesを追加する方法もあるとは思いますが、みつけられませんでした


### 参考(というか自分が回答していますが)

https://stackoverflow.com/questions/46390699/android-device-monitor-not-running-with-jdk-9-on-mac-os-x-even-after-updating-ec/49272127#49272127
ConversationUI関連のツールまとめ

< 編集を重ねる予定 >


#設計課題について


[Google](https://developers.google.com/actions/designing-your-apps?hl=ja
)
[IBM-a](https://www.ibm.com/developerworks/jp/cognitive/library/cc-cognitive-chatbot-conversational-design/)
[IBM-b](https://www.ibm.com/developerworks/jp/cognitive/library/cc-watson-chatbot-conversation/)
[Mailchimp](https://styleguide.mailchimp.com/voice-and-tone/)





#ConversationUI関連の便利そうなツールをストックしていきます。


シナリオ設計に役立ちそうなモックアップツール

[Botsociety](https://botsociety.io/)
[Xmind](http://jp.xmind.net/)
[Lucidchart](https://www.lucidchart.com/)
[Botmock](https://botmock.com/)


#サービス


[Google assistant](https://assistant.google.com/intl/ja_jp/)
[Kik](https://www.kik.com/)
[Hoteltonight](https://www.hoteltonight.com/)
[Fify](http://fify.ai/)
[Healthtap](https://www.healthtap.com/)
[Airtailor](http://www.airtailor.com/)
Webページのパフォーマンス計測サイト3選

Webページのパフォーマンスチューニングをするにあたってレスポンス速度や改善項目を定量的に把握したかったので、改良ポイントを提示してくれるサイトを探していた所、3つ出てきました。

## 1. Google PageSpeed Insights

https://developers.google.com/speed/pagespeed/insights/

## 2. WEB PAGE TEST

https://www.webpagetest.org/


## 3. GTmetrix

https://gtmetrix.com/

基本的には1.Google PageSpeed Insightsを参考にして速度改善や画像最適化などを行っていきます。

今後も追記予定です。