OmniAICreator/Qiita-1.07M huggingface dataset:
[Swift] [Xcode] 脱・初級者のための学習ソース

私が「脱・初級者」するために、参考にさせていただいた学習ソースをリスト化してみました。

Swiftのバージョンが古いソースもありますが、概念的なところは参考にできると思います。

私はまだまだ修行が足りないので、随時更新したいと思います…
他に何か良い学習ソースをご存知でしたら、コメントで教えてください。

# Swift

[詳解 Swift](https://www.sbcr.jp/product/4815604073/)（書籍）
・Swift言語の解説にテーマを絞っており、とても詳細に書かれています。

# Xcode

[Xcodeチートシート](https://qiita.com/dondoko-susumu/items/2d124e315f898b3c94c0)
・ショートカット集です。

[Xcode デバッグ術まとめ](https://kosukeblog.com/2018/02/debug/)

# 設計

[iOSアプリ設計大全集 2016](https://qiita.com/tattn/items/d4b95af0b60c3849243a)

[iOSアプリ開発デザインパターン入門](https://nextpublishing.jp/book/9798.html)（書籍）

# テスト

[XCTest入門Part1 (Swift)](https://qiita.com/okuderap/items/97f9d6026d0da59fef38)

[XCTest入門Part2 (Swift) ~非同期編~](https://qiita.com/okuderap/items/e02b73880b8bc499debe)

[XCTestでカバレッジを確認する](https://qiita.com/okuderap/items/de574685592fe0bee8ea)

[UITestの導入とチートシート](https://qiita.com/hanawat/items/79bc81ed87704b15f3cd)

# Auto Layout

[よくわかるAuto Layout](http://www.ric.co.jp/book/contents/book_1032.html)（書籍）
・Auto Layoutは概念を良く理解しないと使いこなせないな、と感じています。

[VFLを使ってみよう](https://blog.personal-factory.com/2016/01/16/use-visual-format-language-with-auto-layout/)
・Viewをコードで生成する時に使う「Visual Format Language (視覚的形式言語)」について、とても参考になりました。

# 並列処理

[Swift 並列プログラミング基礎](https://qiita.com/ShoichiKuraoka/items/9599c32bc27c3c822f02)

[Swift GCD入門](https://qiita.com/ShoichiKuraoka/items/bb2a280688d29de3ff18)

# 多言語対応

[[iOS] ゼロから始める！簡単！多言語対応！](https://qiita.com/simorgh3196/items/c9b04377dfa1425085c3)

[iOSアプリの国際化対応の勘所とTips集(Swift版)](https://qiita.com/mono0926/items/c41c1ce18b90b765a8f2)

# アニメーション、Firebase など

[Lets Build That App](https://www.letsbuildthatapp.com/)
・英語です。
・アプリを作り込んでいく様子を動画で教えてくれます。
Macの初期セットアップメモ(2) - Python周り

[前回](https://qiita.com/cielo1985/items/6d32e2ec7c74ee60dca7)に引き続き設定を今回はPythonをインストールしていく。作業を簡略化したいので基本的にHomebrewを使ってインストールする。

データサイエンスの勉強をしているのでnumpy,pandas,matplltlib,jupyter-notebookあたりもインストールする。Anaconda使うと楽なのかもしれないけど、初心者だからこそブラックボックスにしたくないという思いでpipを使って必要なものを1個１個インストールしていくスタンスを取る。

# 環境情報
MacBook Air (13-inch, Mid 2011)
macOS High Sierra (v10.13.6)

# Homebrewのインストール
[ここ](https://brew.sh/index_ja)にある通り以下のコマンドでインストール。

```zsh
% /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```

# Python3のインストール
MacにデフォルトでインストールされているのはPython2.7なので、Python3をインストールする。

```zsh
# デフォルトのバージョンを確認すると2.7.10
% python -V
Python 2.7.10
```

以下のコマンドでPython3をインストール

```zsh
% brew install python3
```

バージョンを確認すると3.7.0が入りまいした。3.7.0は2018.6.28にリリースされたバージョンですね。新しくてちょっとびっくり。今後変なところでつまづかないといいけど。
https://docs.python.org/3.7/whatsnew/3.7.html

```zsh
% python3 -V
Python 3.7.0
```

## データサイエンス系モジュールをインストール
とりあえず最低限ということでnumpy, pandas, matplotlib, jupyterをインストール。pipでサクッと入れられるのほんと便利。

```
% pip3 install numpy pandas matplotlib jupyter
```

## `python`で`python3`を起動させる
3を打つのが面倒なのでaliasしておきました。

```zsh:~/.zshrc
alias python=python3
alias pip=pip3
```

# 今後について
ベースは概ね整ったかなという感じです。web開発も勉強したいのでrawなmacとは分けた環境で作って気軽にtry&errorできるようにしたい。なのでdocker,virtualbox,vagrantあたりを考えていきます。

**追記**
vimの設定忘れてました。[Macの初期セットアップメモ(3) - vim周り
](https://qiita.com/cielo1985/items/8b26cb292a8ef99255b7)へ続く。
新人エンジニアの時に知っておきたかったこと[Zsh編]

## はじめに
この記事は[新人エンジニアの時に知っておきたかったこと](https://qiita.com/hirokisan/items/cd45d3f6e5fa688235fc)に含まれます。
他の記事は上記のリンクから遷移可能です。あわせてご覧ください。

## Zshとは？
Unixのコマンドシェルの1つ

[Wiki](https://ja.wikipedia.org/wiki/Z_Shell)

[Manual](http://zsh.sourceforge.net/Doc/Release/zsh_toc.html)

コマンドシェルには他にも

- Bash
- Fish

などがあります。

[コマンドシェル](https://ja.wikipedia.org/wiki/%E3%82%B7%E3%82%A7%E3%83%AB#%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%83%A9%E3%82%A4%E3%83%B3%E3%82%B7%E3%82%A7%E3%83%AB%E3%81%AE%E4%B8%80%E8%A6%A7)

## インストールと適用
[Source](http://zsh.sourceforge.net/Arc/source.html)

実際にZshをインストールしてみます。
~/local/srcにソースをダウンロードし、~/local/binにZshを配置します。

### インストール

```
$ mkdir -p ~/local/src
$ cd ~/local/src
$ wget https://sourceforge.net/projects/zsh/files/zsh/5.5.1/zsh-5.5.1.tar.xz/download -O zsh-5.5.1.tar.xz
$ tar xvf zsh-5.5.1.tar.xz
$ cd zsh-5.5.1
$ ./configure --enable-multibyte --enable-pcre --prefix=$HOME/local
$ make
$ make install
```

これでZshが~/local/binに配置されたはずです。

### 適用

シェルの一覧にインストールしたZshを追加します。

```
$ sudo sh -c "echo '$HOME/local/bin/zsh' >> /etc/shells"
```

ログインシェルをインストールしたZshに変更します。

```
$ chsh -s $HOME/local/bin/zsh
```

### Pathを通す
~/.zshrcに以下を記述します。
もし.zshrcが存在していない場合、作成します。

```
export PATH=$HOME/local/bin:$PATH
```

もし変更の際にroot権限が求められる場合には以下を実行します。
$usernameはZshを使用するユーザ名に置き換えてください。

```
$ sudo chsh -s $HOME/local/bin/zsh $username
```

### 反映
ログアウトしてください。
ログアウトして再度ログインすればインストールしたZshがログインシェルとして使用されているはずです。


## 設定ファイル
Zshには設定ファイルがあります。
この設定ファイルをに設定を追加することでデザインや機能の拡張が可能です。


>$ZDOTDIR/.zshenv

>$ZDOTDIR/.zprofile

>$ZDOTDIR/.zshrc

>$ZDOTDIR/.zlogin

>$ZDOTDIR/.zlogout

[5 Files (zsh)](http://zsh.sourceforge.net/Doc/Release/Files.html#index-zshrc)

設定ファイルには種類があり、それぞれ読み込まれる条件が異なります。

[zshの設定ファイルの読み込み順序と使い方Tipsまとめ](https://qiita.com/muran001/items/7b104d33f5ea3f75353f)

## プラグイン
Zshには機能を拡張するプラグインが用意されています。
プラグインをインストールする際にはプラグインマネージャを使用します。

[まだ oh-my-zsh で消耗してるの？](https://qiita.com/b4b4r07/items/875235f6122a6d779306)

### 試しに[zplug](https://github.com/zplug/zplug)でプラグインをインストールする

.zshrcに以下を記述します。

```
if [[ ! -d ~/.zplug ]];then
    git clone https://github.com/zplug/zplug ~/.zplug
fi

source ~/.zplug/init.zsh

#### 以下にインストールしたいプラグインを記述する

zplug "zsh-users/zsh-syntax-highlighting"
zplug "zsh-users/zsh-completions"

#### 以上にインストールしたいプラグインを記述する

# Install plugins if there are plugins that have not been installed
if ! zplug check --verbose; then
    printf "Install? [y/N]: "
    if read -q; then
    ¦   echo; zplug install
    fi
fi

zplug load
```

### 設定を反映する
以下のコマンドを実行して設定を反映します。

```
$ source ~/.zshrc
```

## まとめ
この記事ではZshについて共有しました。
私自身、まだまだZshに関して細かいことを理解しているわけではありません。
ですが、プラグイン等をインストールして使ってみるとシェル操作が快適になることが分かっています。
シェル操作に抵抗のある方も、プラグインをいれて快適なシェル環境を得られれば、その抵抗は軽減されるはずです。
ぜひ、Zshをカスタマイズしてシェル操作に慣れてみてください。
OculusGoでGazePointerがuGUIではなく、その奥のオブジェクトを指してしまう問題

## 現象

OculusGoのプロジェクトで、OVRRaycasterとOVRPhysicsRaycasterを利用するとき、手前にCanvas(uGUI要素)を置いても奥にあるオブジェクトにGazaPointerが表示されてしまい、クリック等のイベントも奥にあるオブジェクトに対して発生してしまう。

また、メニューをレーザーポインターの光線が貫通しないようにBoxColliderをアタッチするとメニューのボタンが押せなくなる。

環境: Unity 2018.1.5f1 (64-bit) / OculusUtilities(1.26.0 2018/06/20)

## 原因

OVRPhysicsRaycaster.sortOrder が OVRRaycaster.sortOrder よりも大きいため、OVRPhysicsRaycasterで指されるオブジェクトが優先されている。

※
OVRPhysicsRaycaster.sortOrder の既定値は20
OVRRaycaster.sortOrder の既定値は0
……なので、何も設定しないと上のような状態になってしまう。

## 対策

OVRPhysicsRaycaster.sortOrder を -1 に設定してやる。
PreferenceFragmentCompatのフォント大きすぎてダサい問題を解決する

`PreferenceFragmentCompat` 使って設定画面の実装してるんですが、フォント大きすぎてダサいだよー。
マテリアルデザインぽくしたいだよー。 ってときのやり方。

```xml
    <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <!-- ↓これ追加すればマテリアルデザインガイドラインぽい設定画面になる -->
        <item name="preferenceTheme">@style/PreferenceThemeOverlay.v14.Material</item>
    </style>
```
Rotation and to radian function example for complex number with python

```python
import math
import cmath

def to_rad(deg):
    return deg*math.pi/180

p1=[3,8]
p2=[13,8]
p2a=[p2[0]-p1[0],p2[1]-p1[1]]
print(p1,p2,p2a)
z2=complex(p2a[0],p2a[1])
zr1=complex(1/2,3**(1/2)/2)
zr2=complex(1/2,-3**(1/2)/2)

z31=z2*zr1
z32=z2*zr2

print(z31.real+p1[0],z31.imag+p1[1])
print(z32.real+p1[0],z32.imag+p1[1])
print(z2.real)
print(z2.imag)
```
```
[3, 8] [13, 8] [10, 0]
8.0 16.660254037844386
8.0 -0.6602540378443855
10.0
0.0
```
# Refs.  
http://www.geisya.or.jp/~mwm48961/koukou/rotation1.htm
https://note.nkmk.me/python-complex/
https://qiita.com/shuhei/items/f5cf6c83fcfb5dd24c2d
https://www.ajaxtower.jp/js/math_class/index10.html
https://juken-mikata.net/how-to/mathematics/radian.html
新人エンジニアの時に知っておきたかったこと[Vim編]

## はじめに
この記事は[新人エンジニアの時に知っておきたかったこと](https://qiita.com/hirokisan/items/cd45d3f6e5fa688235fc)に含まれます。
他の記事は上記のリンクから遷移可能です。あわせてご覧ください。

## Vimとの出会い
エンジニアとして駆け出しの頃、Vimに出会いました。
先輩エンジニアがVimを使用しており、Vimは紹介されたエディタの1つでした。
当初はAtomを使用していましたが、彼がVimを常用しており、その操作スピードと謎な操作方法に惹かれていきました。
そして、Vimを常用する様になり、今ではVimなしでの開発は考えられません。
Vimの魅力を教えてくれた先輩エンジニアにはとても感謝しています。

## Vimとは？
viから派生し、発展した高機能なテキストエディタです。
詳しくは[wiki](https://ja.wikipedia.org/wiki/Vim)を参照ください。

## Vimを使って良かったこと
### ファイル操作が快適
ターミナルアプリ開いて以下のコマンドを実装するだけでファイル編集が可能なので、あのファイル修正したいと思った時にすぐに作業できます。

```
vim .
```

### 手を動かす時間の削減
Vimを使っているとわかりますが、基本的にキーボードのホームポジションから手を動かさずに操作できます。
慣れてくるとこの快適さをブラウザや他のツールを使用する際にも求める様になり、ショートカットを多用する習慣が生まれてくるはずです。
結果として、キーボードのホームポジションからマウスやトラックパッドに手を動かす手間を省けます。
塵も積もれば山となるので、毎日の手を動かす手間を省くだけで、少なからずの効率化につながります。

### 作業効率の向上
Vimには便利なプラグインが用意されており、作業が捗ります。
特定のファイルを探したり、特定の文字列を含むファイルを探したり、正規表現で文字列置換したり、Gitコミットしたり、関数の定義元にジャンプしたり、プログラムを実行したり、シンタックスをチェックしたり、変更箇所を明示したり。

## Vim基本操作
基本的な操作に関しては以下が参考になります。

- [よく使う Vim のコマンドまとめ](https://qiita.com/hide/items/5bfe5b322872c61a6896)
- [脱初心者を目指すなら知っておきたい便利なVimコマンド25選 (Vimmerレベル診断付き)](https://qiita.com/jnchito/items/57ffda5712636a9a1e62)

## 設定ファイル
Vimには設定ファイルがあります。

```
.vimrc
```
このファイルに設定を加えることで操作やデザインをカスタマイズできます。

[こちら](https://vim-jp.org/vimdoc-ja/usr_toc.html)にマニュアルがありますので参照ください。

インターネット上で検索してみるといろんな人が.vimrcを公開していたりするので参照してみてください。

[初心者向け vimrcの設定方法](https://qiita.com/iwaseasahi/items/0b2da68269397906c14c)


## プラグイン
Vimには機能を拡張するプラグインが用意されています。
いろんな人がプラグインを開発して、Vimをより快適に使える様にしています。

プラグインのインストールにはプラグインマネージャを使用します。

[おい、NeoBundle もいいけど vim-plug 使えよ](https://qiita.com/b4b4r07/items/fa9c8cceb321edea5da0)

ご自身の課題を解決する様なプラグインをインストールして、自分の好きなキーボードショートカットを割り当ててみましょう。

たとえば、「HTMLを触るので、効率的にHTMLを記述したい」。
そんなプラグインを探してみると、以下の様なプラグインがあるのでプラグインマネージャを使用してインストールする。
といった感じです。

[mattn/emmet-vim](https://github.com/mattn/emmet-vim)

プラグインマネージャの使用方法がよくわからない方は、以下のサンプルソースを参考にしてみてください。

[サンプルソース](https://github.com/hirokisan/dotfiles/blob/master/vim/.vimrc#L1-L44)

## Dotfilesとして管理する
.vimrcを自分用にカスタマイズすると、あなたはカスタマイズした.vimrcに依存することになります。
そのため、環境を初期化した際や新しいデバイスを購入した際に再設定する手間が発生します。

その際の手間を省くために、dotfilesとして.vimrcを管理しておきます。
結果として、新しい環境に移行した際にもdotfilesをインストールするだけで、いつもの自分のvim環境を用意することが可能になります。

[最強の dotfiles 駆動開発と GitHub で管理する運用方法](https://qiita.com/b4b4r07/items/b70178e021bef12cd4a2)

## まとめ
この記事ではVimについてご共有しました。
私自身、まだまだVimについて細かいなことは理解していませんが、ツールとしては便利であることは分かっています。
界隈でプラグインを開発している方々やVim関連の紹介記事を書いている方にはとても感謝しています。

新人エンジニアの方々にとって、Vimというエディタは他のAtom等のエディタに比べると敷居が若干高い気もします。
しかし、習慣的に触っていると、その良さと快適さが分かってくるのかなと思います。
ぜひ、一度お試しください。
新人エンジニアの時に知っておきたかったこと[ツール編]

## はじめに
この記事は[新人エンジニアの時に知っておきたかったこと](https://qiita.com/hirokisan/items/cd45d3f6e5fa688235fc)に含まれます。
他の記事は上記のリンクから遷移可能です。あわせてご覧ください。

## ツール一覧
私が新人エンジニアとしてキャリアを歩み始めてから「便利だなぁ」と感じて使っているツールをご紹介します。
周りのエンジニアの人たちが使っていたり、作業を効率化するために良さげなツールはないかなぁと調べて使うようになったツールたちです。
ぜひ、目を通して触ってあなたに合うかどうか試してみてください。

### ブラウザ
使用するブラウザは1つでいいんじゃないかと思われるかもしれませんが、少なくとも仕事用とプライベート用を分けたくなるはずです。
私の場合、基本的にはFirefoxを仕事用、Chromeを検索・開発用として使っています。
とりあえず、用途にごとに使用するブラウザを分けておくと便利ですという話です。
なお、私は最近Windowsを使っていないのでIEやEdgeは含めていません。

* [Chrome](https://www.google.com/intl/ja_ALL/chrome/)
* [Chrome Canary](https://www.google.com/chrome/canary/)
* [Firefox](https://www.mozilla.org/ja/firefox/)
* [Blisk](https://blisk.io/)
* [Brave](https://brave.com/)

### データベース GUIクライアント
データベースの扱いに関してはCLIを使うこともできますが、データを手軽に確認したいときにはGUIが結構便利だったりします。
また、一口にエンジニアといってもデータベース関連の作業が役割範囲ではないという場合もあるかと思います。
要はCLIでのデータベース操作に抵抗がある方は手軽にGUIを使っちゃいましょうという話です。
設定を保存しておけるので、接続先の情報を覚えておかなくていいのが敷居を下げてますね。

* [Sequel Pro](https://www.sequelpro.com/)
* [PSequel](http://www.psequel.com/)

### Redis GUIクライアント
RedisのGUIです。手軽にデータを確認したいときに便利。

[Medis](http://getmedis.com/)

### その他開発関連
Docker for [Mac](https://www.docker.com/docker-mac)/[Windows](https://www.docker.com/docker-windows)
[Virtualbox](https://www.virtualbox.org/)
[Postman](https://www.getpostman.com/)
[Genymotion](https://www.genymotion.com/)
[iOS Simulator](https://developer.apple.com/jp/documentation/IDEs/Conceptual/iOS_Simulator_Guide/GettingStartedwithiOSSimulator/GettingStartedwithiOSSimulator.html#//apple_ref/doc/uid/TP40012848-CH5-SW1)

### ターミナルアプリ
[iTerm](https://www.iterm2.com/)

### エディタ
[Vim](https://www.vim.org/)
[Atom](https://atom.io/)
[Visual Studio Code](https://code.visualstudio.com/)
[Brackets](http://brackets.io/)

### Markdown エディタ
[Macdown](https://macdown.uranusjr.com/)
[HackMD](https://hackmd.io/)

### FTPクライアント
[Cyberduck](https://cyberduck.io/)

### ユーティリティ
[GIF Brewery](http://gifbrewery.com/)
[Keycaster](https://github.com/keycastr/keycastr)
[MindNode](https://mindnode.com/)
[Clipy](https://clipy-app.com/)
[f.lux](https://justgetflux.com/)

### デザイン系
[Sketch](https://www.sketchapp.com/)
[Adobe Photoshop CC](https://www.adobe.com/jp/products/photoshop.html)
[Cacoo](https://cacoo.com/)

### コミュニケーション
[Slack](https://slack.com/intl/ja-jp)
[Zoom](https://zoom.us/jp-jp/meetings.html)
[Chatwork](https://go.chatwork.com/ja/)
[Discord](https://discordapp.com/)

## まとめ
この記事ではよく使うツールをご共有しました。
今は使わないにせよ、目を通しておくと、あとで「あぁ、あのツールを使えば作業効率上がりそう」という具合に思い出せるはずです。
いろんなエンジニアの使用するツールを調査してみると、作業にかける時間を短縮して幸せになれるんじゃないかなと思います。
取り急ぎ、箇条書きでのツール紹介となりました。
機会があれば、使い方に関しても言及してみます。
文字化け。 日本語の文字列を含んだデータをPython出力をエクセルを行う

文字化け。
日本語の文字列を含んだデータをPython出力をエクセルを行う際にハマりそうになったところを以下のサイトで助けてもらいました。
また参照することになるので、メモ。



Pythonでサクッと日本語を取り扱う方法のまとめ
https://own-search-and-study.xyz/2016/10/01/%E5%88%9D%E5%BF%83%E8%80%85%E3%81%8Cpython%E3%81%A7%E3%82%B5%E3%82%AF%E3%83%83%E3%81%A8%E6%97%A5%E6%9C%AC%E8%AA%9E%E3%82%92%E5%8F%96%E3%82%8A%E6%89%B1%E3%81%86%E6%96%B9%E6%B3%95%E3%81%AE%E3%81%BE/
Firebase Authenticationユーザ作成時駆動のCloud Functions内でユーザデータが取得できない

Firebase Authenticationのユーザ作成時にトリガーする関数内でそのユーザのデータを取得するまでのメモ。
公式ドキュメントの方法ではデータが取れなかった。

https://firebase.google.com/docs/auth/extend-with-functions?hl=ja

![スクリーンショット 2018-08-05 12.46.27.png](https://qiita-image-store.s3.amazonaws.com/0/176237/79d3f04d-53c3-c457-88f9-f63c281f3716.png)

これを参考に、

```typescript
// ※TypeScript
export const sendWelcomeEmail = functions.auth.user().onCreate(event: any => {
  const user = event.data;
  const email = user.email;

  // なんか処理

});
```

こんなコードを書くがemailが取れない。
ログを見ると、

```
TypeError: Cannot read property 'email' of undefined at Object.
```

emailがundefinedの様子。
ということで試しに `console.log(event.data)` でevent.dataをログに吐かせてみると、

```
undefined
```

と出力。
そもそもお前がundefinedなんかい。

で、おおもとのeventはどうなのかと `console.log(event)` すると、

```
{ email: 'test@example.com',
  emailVerified: false,

  // 以下省略
```

なるほど、 `event` がユーザオブジェクトだった。
`event.data` というオブジェクトはなかった。

結論、

```typescript
// ※TypeScript
export const sendWelcomeEmail = functions.auth.user().onCreate(event: any => {
  const email = event.email;

  // なんか処理

});
```

これで上手くいったという話。
多分、ミスというよりは昔の仕様がそのままになっているだけのような気がする。
なので確認してないが英語ドキュメントでは正しい記載かもしれない。
手空きの際にGoogleへ報告してみる予定。
Rancher 2.0でCatalog AppsからWordpressをデプロイ

## はじめに
* 社内研修でkubernetesをやっており、構築がなかなかうまくいかなくて悩んでいたところ、**Rancherを使うとクラスターを構築するのが早くて楽**という話が聞こえてきました。Rancherでの構築は[同僚がこちらにまとめてくれました。](https://qiita.com/3364git/items/287fdf3685cebb4a7ce8
)
* 次のステップとして「デプロイをしよう」となったときに、**Catalog**なる便利機能がRancherにはあるらしいぞ、という情報が入ってきたのでやってみました。

## Catalogとは
* デプロイする準備のできたアプリケーション群。
* 繰り返しデプロイすることを容易にする
* [公式ページ](https://rancher.com/docs/rancher/v2.x/en/catalog/)

## 環境

* AWS (CentOS 7)
* インスタンス：t2.medium
* k8s：シングルクラスター構成

## 手順

* 構築は以下の手順を参照
https://qiita.com/3364git/items/287fdf3685cebb4a7ce8

* まずは画面上部から「クラスター名 ⇒ default」を選択します。
![無題の図形描画 (3).jpg](https://qiita-image-store.s3.amazonaws.com/0/177048/40c3a116-c171-4c35-672f-c2eb48954824.jpeg)


* 次に「Catalog Apps」を選択し、launchをクリックします。
![Catalog Apps](https://qiita-image-store.s3.amazonaws.com/0/177048/675e685a-e46b-d057-307e-a99db5aed63a.jpeg)


* Catalog一覧が出てきます。
![無題の図形描画 (5).jpg](https://qiita-image-store.s3.amazonaws.com/0/177048/aa3bd82b-3672-adf0-5bc9-2979216aced2.jpeg)


* 「Search」欄にWordpressと入力、検索します。
![catalog-search.jpg](https://qiita-image-store.s3.amazonaws.com/0/177048/9764c16f-532d-254f-0521-e987d48fa820.jpeg)


* 選択すると以下のような画面が出てきます。
![catalog-wordpress.jpg](https://qiita-image-store.s3.amazonaws.com/0/177048/eb960fd9-e12a-b8d1-bb63-9d100312102d.jpeg)

* 「Configuration Options」に必要事項を入力します。
カタログ名、カタログのバージョン、コンテナイメージを指定
![catalog-name-image.jpg](https://qiita-image-store.s3.amazonaws.com/0/177048/8399da3e-8618-c575-cef7-4f6b5f48463c.jpeg)


* Wordpressのユーザ名・パスワード、Persistent Volumeを利用可能にするか指定します。
![catalog-wordpress-set.jpg](https://qiita-image-store.s3.amazonaws.com/0/177048/6e9ae4aa-2f3f-612a-9931-9f3163c7a85d.jpeg)

※**Persistent Volumeを作成しないで「Wordpress Persistent Volume Enable」をTrueにすると、当然ですがうまくいかないです。**

* mariaDBのユーザ名・パスワードなど指定
![catalog-mariadb-set.jpg](https://qiita-image-store.s3.amazonaws.com/0/177048/fd372998-3520-803a-4a68-b4f3001b34d0.jpeg)

※**Persistent Volumeを作成してないと、ここでもPersistent VolumeをTrueにするとうまくいかないです。**


* 画面下の「Launch」をクリックしてしばらく待ってると、こんな感じで成功したことが確認できます。
![catalog-start.jpg](https://qiita-image-store.s3.amazonaws.com/0/177048/10aa6405-6163-7c0a-98e4-7170e857d7f0.jpeg)


* Webブラウザで「AWSインスタンスのパブリックIP:ポート番号」を入力するとWordpressの画面にアクセスできます。
![無題の図形描画 (8).jpg](https://qiita-image-store.s3.amazonaws.com/0/177048/e92b250a-ca33-0266-6b13-311f4e9bab9e.jpeg)

* こんな感じで簡単に環境を作れるのがRancherの魅力の一つです。

##まとめ
* 今回はRancher Catalogの導入として、簡単にデプロイできることを紹介しました。
* Catalogを自分で用意するPrivate Catalogというものもあり、一度準備すれば繰り返し同じ環境をRancherから作ることもできます。
* Rancher 2.0では[Helm](https://helm.sh/)というKubernetesのパッケージマネージャーとの連携を強めており、Catalogでもhelm経由で作成という選択肢があります。
以下のように「Global ⇒ Catalogs」を選択して、Helm StableをEnableにすると選択できるようになります。
![無題の図形描画 (7).jpg](https://qiita-image-store.s3.amazonaws.com/0/177048/1c65bd74-f64e-0ada-108b-9b03bc135093.jpeg)
Ruby on Railsの環境構築とhello worldをデプロイするまで

「Ruby on Rails」のチュートリアルは丁寧に説明されてて読みやすくていいですね。
まずは第1章の「ゼロからデプロイまで」をやってみたので備忘録に。。
「[第1章ゼロからデプロイまで](https://railstutorial.jp/chapters/beginning?version=5.1#cha-beginning)」


## 開発環境構築

下記のサイトを元に構築しました

[http://railsgirls.jp/install](http://railsgirls.jp/install)


## 初期設定

```
$ rails new hello_qpp
$ bundle install
$ rails server
```

## デプロイ

herokuを使ってデプロイする

```terminal:herokuがインストールされてるか確認
$ heroku --version
```

```terminal:デプロイ
$ heroku login
$ heroku keys:add
$ heroku create // サブドメインが表示される
$ git push heroku master
```

## ルーティング

```ruby:ルーティング方法
root 'controller_name#action_name'
```

```ruby:application_controller.rb
class ApplicationController < ActionController::Base
  protect_from_forgery with: :exception

  def hello
    render html: "hello, world"
  end
end
```

```ruby:routes.rb
Rails.application.routes.draw do
  root 'application#hello'
end
```

## 参考サイト

- [bootsnapについて調べてみた](https://qiita.com/Daniel_Nakano/items/aadeaa7ae4e227b73878)
JSONファイルをExcelに変換

##目的
チャチャっとデータ一覧を確認して判断したいときに使う

##手順
まずJSONファイルを準備します。

<details>
<summary>例えば、AWSのAMI一覧をJSONで取得する場合</summary>
aws ec2 describe-images --owners amazon --filters "Name=platform,Values=windows" > hoge.json
これを実行すると
<div>

```json
{
    "Images": [
        {
            "VirtualizationType": "paravirtual",
            "Name": "My server",
            "Hypervisor": "xen",
            "ImageId": "ami-5731123e",
            "RootDeviceType": "ebs",
            "State": "available",
            "BlockDeviceMappings": [
                {
                    "DeviceName": "/dev/sda1",
                    "Ebs": {
                        "DeleteOnTermination": true,
                        "SnapshotId": "snap-1234567890abcdef0",
                        "VolumeSize": 8,
                        "VolumeType": "standard"
                    }
                }
            ],
            "Architecture": "x86_64",
            "ImageLocation": "123456789012/My server",
            "KernelId": "aki-88aa75e1",
            "OwnerId": "123456789012",
            "RootDeviceName": "/dev/sda1",
            "Public": false,
            "ImageType": "machine",
            "Description": "An AMI for my server"
        }
    ]
}
```
</div>

</details>

###Excelで新しいワークシートを開きます
あとは、下の図のようにやるのです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/185989/e9eec439-ca92-0098-6c8b-8cd92c07efac.png)


![image.png](https://qiita-image-store.s3.amazonaws.com/0/185989/9425a06b-26b9-3925-8030-ed19fc4ea764.png)


![image.png](https://qiita-image-store.s3.amazonaws.com/0/185989/70372ca9-e44a-c039-1b02-ff7e66b65542.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/185989/71adfae2-1f4f-123b-a3e4-073edcf4385e.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/185989/9778c6c2-7d92-f800-4b60-4d97ff505fae.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/185989/b9701292-a9ff-920d-a266-bdd37a0b9a86.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/185989/c146e473-2ab4-497b-b0ea-e7fc8f030036.png)

できた。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/185989/c655060d-094e-fb41-e48d-45c0db6e60a2.png)
Dockerの導入メモ (Win10 Home, Rails5, MySQL)

自分用にメモしておきます。

## 環境
Windows10 HomeEdition


## DockerToolBoxをインストール
win10 Proの場合はDocker CEというのを使うようだけど、Homeの場合はインストールできないので、代わりにDockerToolBoxというのをダウンロードしてインストール。

https://www.docker.com/get-docker

## Docker QuickStart Terminal
インストールすると「Docker QuickStart Terminal」というショートカットができる。
プロパティを見るとなんか引数を設定してターミナルからDockerを起動するものっぽい。
今後Dockerを使うときは毎回ここから立ち上げる必要があるので、削除しないでおくこと。

## DockerFile等の配置
プログラムを配置するフォルダを作り、以下四つの名前でファイルを作成する。
- docker-compose.yml
- DockerFile
- Gemfile
- Gemfile.lock

Gemfile.lock以外のファイルは以下の内容とする

```docker-compose.yml

version: '3'
services:
  web:
    build: .
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
    volumes:
      - .:/app
    ports:
      - 3000:3000
    depends_on:
      - db
    tty: true
    stdin_open: true
  db:
    image: mysql:5.7
    volumes:
      - db-volume:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: password
volumes:
  db-volume:

```

```:Dockerfile

FROM ruby:2.3.6
RUN apt-get update -qq && apt-get install -y build-essential nodejs
RUN mkdir /app
WORKDIR /app
COPY Gemfile /app/Gemfile
COPY Gemfile.lock /app/Gemfile.lock
RUN bundle install
COPY . /app

```

```:Gemfile

source 'https://rubygems.org'
gem 'rails', '5.0.0.1'

```

## ターミナルからコマンドを投げてDockerに環境を構築する
WindowsPowerShellを起動し、Dockerfileを配置したディレクトリに移動する。

下記のコマンドを実行する。
```
docker-compose run web rails new . --force --database=mysql
```
実行するとrailsアプリケーションに必要なファイル群が出来上がるので、ここで一旦ビルド。
```
docker-compose build
```

Config/database.yml を、docker-compose.ymlの設定と合わせるため、password と host を修正。

```config/database.yml

default: &default
  adapter: mysql2
  encoding: utf8
  pool: 5
  username: root
  password: password  # ←ここ
  host: db  # ←ここ

development:
  <<: *default
  database: app_development

```

下記のコマンドを投げる（コンテナをup）
```
docker-compose up -d
```

この状態ではまだDBが存在しないので、Rails上にMySQLのインスタンスを作成する。
```
docker-compose run web bundle exec rake db:create
```

完了したらブラウザを起動して、`http://192.168.99.100:3000`にアクセス。railsの初期画面が出てきたら構築成功。
オブジェクト指向のこころー演習問題

本記事の内容は、書籍：[オブジェクト指向のこころ](https://www.amazon.co.jp/dp/4621066048)の演習問題とその答えです。

[第１部:オブジェクト指向ソフトウェア開発入門](https://qiita.com/meshidenn/items/9b11750d6e06eac5df05)

[第２部：従来のオブジェクト指向設計における限界](https://qiita.com/meshidenn/items/6c6af5b2acd4523d7bd7)

[第３部：デザインパターン](https://qiita.com/meshidenn/items/e08704cbd10c68089a33)

[第４部：すべてをまとめる：パターンを使って考える](https://qiita.com/meshidenn/items/1ad0aed9f51b9fcb3770)

[第５部：新たな設計パラダイムに向けて](https://qiita.com/meshidenn/items/5402853daffb08cbc6f1)

[第６部：パターンの持つその他の価値](https://qiita.com/meshidenn/items/b81068abff1af055ddfc)

[第7部：ファクトリ](https://qiita.com/meshidenn/items/b1b52253ca65ae25e551)

[第8部：まとめ、そして今後](https://qiita.com/meshidenn/items/a57ffed157a1e018cad1)

参考
https://qiita.com/y_ujitoko/items/dc1048ec6a599d6ae9d3
オブジェクト指向のこころー演習問題(第２部）

以下の問題及び回答は[書籍](https://www.amazon.co.jp/dp/4621066048/)を参考に記載しています。また一部引用があります。

# 第3章：柔軟なコードを必要とする問題
## 基礎
Q1. このシステムで考える必要のある、シートメタルの５つのフィーチャーとは何でしょうか？
A1. 
スロット：一定幅でシートメタルを直線に打ち抜き、端部を直角または面取り加工したもの。スロットは任意の角度で撃ち抜くことが出来る。
ホール：シートメタルを円形に打ち抜いたもの。通常の場合、さまざまな大きさのドリルビットを使って加工する。
カットアウト：シートメタルを４隅が直角または面取りかこうされた４角形に撃ち抜いたもの。この形状は、ハイパワーパンチをシートメタルに打ち付けて加工する。
スペシャル：スロット、ホール、カットアウト以外の規制の形状である。こういった形状を迅速に打ち抜くため、専用のパンチが用意されることになる。
イレギュラー：上記以外。これに該当する形状はツールを組み合わせて撃ち抜く。

Q2. V1システムとV2システムの違いは何でしょうか？
A2. 
V1システム：サブルーチンライブラリの集合体になっている
V2システム：オブジェクト志向になっており、ジオメトリーがオブジェクトとして格納されている。

## 応用
Q1. CAD/CAMの事例が抱える本質的な問題とは何でしょうか？
A1. 一貫した方法でシステムから情報を抽出したいが、各
システムが同じ情報を保持しているにも関わらず、実装が全くことなっていること。

Q2. ポリモーフィズムは、ジオメトリーの抽出レベルで必要となりますが、フィーチャーレベルでは必要となりません。その理由は何でしょうか？
A2. ジオメトリーレベルでは、共通したメソッド名を持つことによって、一貫した情報抽出を実現出来る、フィーチャーレベルでは、それぞれのフィーチャー毎共通する処理概念（処理メソッド）に異なるため。

# 第4章：標準的なオブジェクト指向による解決策
## 応用
Q1. 本章で解説したCAD/CAMの問題を解決するためのアプローチを解説してください。このアプローチは妥当なものでしょうか？
A1. スロットクラスを用意することで、各特殊化に対応した。このアプローチは、冗長性が高く、凝集度が低く、クラス数が爆発する（フィーチャー数xバージョン数のクラス）という結果を招き、保守費用が高くなってしまっている。

## 基礎
Q1. 図4.3のクラス図から、以下のものを答えてください。
・抽象クラス
・カーディナリティ
・派生クラス
・コンポジション
・公開(public)メソッド
A1. 
・抽象クラス：Feature
・カーディナリティ：ModelインスタンスはFeatureインスタンスを0以上保持する。Featureインスタンスは、1つのModelインスタンスに保持される。
・派生クラス：SlotFeature, HoleFeature, CutoutFeature, IrregularFeature, SpecialFeature
・コンポジション：なし
・公開(public)メソッド：
　・Feature：featureType(), getXLoc(),getYLoc()
　・SlogFeature:getLength()
　・HoleFeature:getDiameter()
　・CutoutFeatuer:getOperations()
　・IrregularFeature:getNumSegments(),getSegments()

Q2. CAD/CAMアプリケーションが必要とする本質的な機能とは何でしょうか？
A2. 複数のCAD/CAMバージョンを透過的に取り扱う

Q3. 最初の解決策には４つの問題がありました。それらは何だったでしょうか？
A3. 
・メソッドの冗長さ-V1システムとやり取りを行うメソッドには、類似点があるにも関わらず、
・汚い
・高い結合度：各フィーチャーが間接的に関連しあっている。新たなCAD/CAMシステムの追加・既存のCAD/CAMシステムへの変更が発生すると、すべてのフィーチャーに影響がおよぶことになる。
・低い凝集度：書くとなる機能を実行するメソッドクラス間に散逸することになる。
Xiaomi Mi Band 3 iOS上で日本語環境のまま英語化する（要脱獄）

最近スマートウォッチ試してみたいと思ってMi Band 3 を買ってみました。UIは初期設定では中国語ですが、どうやら英語にはできるみたいなのでやってみました。
#Mi BandのUIを英語化

どうやらMi Bandのファームウェアには言語がいくつか含まれているみたいで、iOS側を英語環境にするとMi Bandの方も英語に切り替わるみたいです。

設定.app > 一般 > 言語と地域

からiPhoneの使用言語をEnglishに切り替えます。

<img width="375" alt="IMG_1254D6ECE537-1.jpeg" src="https://qiita-image-store.s3.amazonaws.com/0/267556/1a400045-e6de-a3ed-3619-9511b531ee05.jpeg">
 
Mi Fitを開いて同期すると無事Mi Bandが英語になります。

<img src="https://qiita-image-store.s3.amazonaws.com/0/267556/d5d7590a-ce5b-a7df-78da-22608c0a90e6.jpeg" width=50%>

#日本語環境で英語状態を保つ
さてここから日本語環境に戻すわけですが、iOSが日本語の状態で再び同期すると中国語に戻ってしまいます。これの対策をするために脱獄環境が必要になります。

Filza File Managerなどで
'/var/mobile/Containers/Data/Application/Mi Fit/Library/Preferences/5006078719'
に移動します。

あんまり調べてないですがもしかしたら5006078719の部分は端末によって値が違うかもしれないですね。

BandInfoConfigStore.plistを開き

<img width="375" alt="IMG_0152.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/267556/03ba568d-0f14-0a20-d949-a21228e3774d.png">

Root > deviceLastWriteLanguage の値を
'en_JP' から 'ja_JP'に変更します。

終わったらちゃんと'保存'しときましょう。

これでiOSを日本語環境に戻してもMi Bandの言語は英語のままになります。

#カスタムファームウェアを使った英語化

海外の有志によってカスタムファームウェアが配布されています。
インストールにはAndroid端末が必要です。
[English Firmware 1.3.0.4 | Xiaomi Mi Band 3 | GeekDoing](https://geekdoing.com/threads/english-firmware-1-3-0-4.28/)

こちらはオリジナルのファームウェアとは違い英語しか含まれていないみたいなので日本語環境でそのまま使っても中国語で表示されることはありません。

自分もAndroidでカスタムファームウェアをインストールし、iPhoneに同期してみました。ファームウェアが上書きされることもなく無事英語環境になったのですが、内蔵フォントが日本語に対応していないようで、文字化けします。

自分でカスタムファームウェアを作れたら良いんですが...

#おわり
今回の方法だと、ファームウェアアップデートがあったり何かの拍子にファームウェアの設定が上書きされたら結構めんどくさいです。今の所それは無いんですが。

初めはForceAppLangを使ってMi Fitだけを英語にしてみましたが、それだけではMi Bandは英語にはなりませんでした。Flex3を使ってどれかの値を変えればできるような気もします。

#追記 2018/9/11
公式から日本語化アップデートが来ました
ファームウェア 1.6.0.16
Laravel5.6 Validate機能を実装する

保存処理の前にValidateの設定を書きます。

```php:\app\Http\Controllers\ArticleController.php
// Validateをインポート
use Validator;

// 省略

public function add (Request $request)
    {
        // Validation
        // 入力情報の取得
        $inputs = $request->all();

        // ルールを設定
        $rules = [
            'title' => 'required|max:15',
            'body' => 'required|max:256'
        ];
        
        // エラーメッセージを設定
        $messages = [
            'title.required' => 'タイトルは必須だよ',
            'title.max' => 'タイトルは15文字以内だよ',
            'body.required' => '本文は必須だよ',
            'body.max' => '本文は256文字以内だよ'
        ];

        // 次の引数を渡してValidateする
        $validation = Validator::make($inputs, $rules, $messages);

        // Validateでエラーがでたら
        if ($validation->fails()){
        // 前のページにリダイレクトさせる
            // その際、エラーメッセージをinputデータとともに変数を渡す
            return redirect()->back()->withErrors($validation->errors())->withInput();
        }

        // 保存の処理
        // 省略
    }
```


画面側の処理
次で、入力されたデータが渡せる

```php

old('title')
```

次でエラーがあるかどうか分かる。

```php

$errors->has('title')
```

```html:\resources\views\article\index.blade.php
<div class="row">
    <div class="col-sm-12">
        <form method="POST" action="/article">
            <div class="form-group">
                {{ csrf_field() }}
                <p class="ext-monospace">タイトル</p>
                <input type="text" name="title" class="form-control @if ($errors->has('title')) is-invalid @endif" value="{{old('title')}}">
                @if ($errors->has('title'))
                    <span class="invalid-feedback">{{ $errors->first('title') }}</span>
                @endif
                <br>
                <p class="ext-monospace">本文</p>
                <input type="text" name="body" class=form-control value="{{old('body')}}">
                @if ($errors->has('body'))
                    <span class="invalid-feedback">{{ $errors->first('body') }}</span>
                @endif
                <br>
                <input type="submit" value="投稿" class="btn btn-default">
            </div>
        </form>
        <br><br>
    </div>
</div>
```

参考にさせていただきました
[Laravel5.6: バリデーション(posts)]
(https://qiita.com/sutara79/items/867a9dc7de50df8fd53c)

[Laravel 5.6 バリデーション]
(https://readouble.com/laravel/5.6/ja/validation.html)

[Laravel(5.1)でCRUD]
(https://qiita.com/zaburo/items/9fefa3f6834b2e79b734#7%E3%83%90%E3%83%AA%E3%83%87%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%92%E3%81%A4%E3%81%91%E3%82%8B)
曜日で音量（ミュート）設定 - IFTTT

■ウイークデーミュート設定
![2018080504.PNG](https://qiita-image-store.s3.amazonaws.com/0/145508/9dd9f9bf-4b35-1803-e7ec-9f47118cae9a.png)
![2018080505.PNG](https://qiita-image-store.s3.amazonaws.com/0/145508/c7c785bc-bf51-8a0d-eb1e-6a33d090bcb0.png)



■土日ミュート解除
![2018080504.PNG](https://qiita-image-store.s3.amazonaws.com/0/145508/f550e17b-50e2-944c-ea3d-5bb20eed6622.png)
![2018080505.PNG](https://qiita-image-store.s3.amazonaws.com/0/145508/44724c94-29bf-7ccb-c53b-1e31efbcb6ac.png)

＋ this の date & time
![2018080508.PNG](https://qiita-image-store.s3.amazonaws.com/0/145508/1a63e4ec-f357-4817-7dda-747702430e55.png)

＋ that の Android Device
![2018080503.PNG](https://qiita-image-store.s3.amazonaws.com/0/145508/6dc2594f-a847-7bb4-1134-7d6506b15107.png)
AWS CLIでのオプションquery句の使い方

aws cliで取得した結果について、その後に別言語の処理で一生懸命パース処理していませんか?
自分でも、以前はrubyで一生懸命パースしてました、しかし、欲しい値が決まっている場合には、queryで絞り込むのが効率的です。

##query句を使用しない場合
aws cli でec2のdescribe-instancesをそのまま実行する例で

コマンド

```shell-session
aws ec2 describe-instances
```

結果例

```shell-session
{
    "Reservations": [
        {
            "Instances": [
                {
                    "InstanceId": "i-xxaeb3215cbbfxxxx",
                    "InstanceType": "t2.micro",
                    、、、、
                }
            ]
        },
        {
            "Instances": [
                {
                    "InstanceId": "i-xxefe9832fbbcxxxx",
                    "InstanceType": "t2.nano",
                    、、、、
                }
            ]
        },
        、、、、
    ]
}
```

のようなjsonの戻り値があるはずです。

##query句を使用して出力結果を絞り込む

###単一項目を取得したい
単一項目の時は簡単です。
例えば、InstanceIdを取得したい場合
InstanceIdは、Reservations->Instances->InstanceIdという構造の項目なので
コマンド

```shell-session
aws ec2 describe-instances --query 'Reservations[].Instances[].InstanceId'
```
結果

```shell-session
[
    "i-xxaeb3215cbbfxxxx",
    "i-xxefe9832fbbcxxxx",
    、、、、
]
```

##複数項目
複数項目の時は、少し難しくなります
例えば、InstanceIdとInstanceTypeを取得したい場合
###１次元配列複数で取得する

コマンド

```shell-session
aws ec2 describe-instances --query '[Reservations[].Instances[].InstanceId, Reservations[].Instances[].InstanceType]'
```

結果

```shell-session
[
    [
        "i-xxaeb3215cbbfxxxx",
        "i-xxefe9832fbbcxxxx",
        、、、、
    ],
    [
        "t2.micro",
        "t2.nano",
        、、、、
    ]
]
```

##2次元配列で取得する
コマンド

```shell-session
aws ec2 describe-instances --query 'Reservations[].Instances[].[InstanceId, InstanceType]'
```

結果

```shell-session
[
    [
        "i-xxaeb3215cbbfxxxx",
        "t2.micro"
    ],
    [
        "i-xxefe9832fbbcxxxx",
        "t2.nano"
    ],
    、、、、
]
```

##まとめ

今回はのように同じ深さの項目ではない、違う深さの項目を取得する場合にはもう少し難易度があがりますが、まぁ、このような感じです。
では、皆様頑張りましょう
splitメソッドを解剖してみる【Ruby】

#splitメソッドを解剖してみる
たまにこのメソッドはどのような中身になっているのか。。。となることがありまして、今回はsplitメソッドを解剖してみます。つまり、splitと同じ処理をあえてsplitを使わずやってみます。

#splitの仕様
splitメソッドは、文字列を特定の区切り文字で分割し、配列化するメソッドです。

```
strs = "栃木;群馬;茨城"
splitted_strs = strs.split(";")
puts splitted_strs #=> ["栃木", "群馬", "茨城"]
```

#実際の解剖コード

こんな感じで書いてみました。

```ruby.rb
class Tokenizer

  def initialize(strs)
    @strs = strs
  end

  def tokenize(delim)
     one_chara_items = []
     stocked_items = []
     @strs.each_char.with_index do |ch, num|
        if ch == delim
          stocked_items.push(one_chara_items.join)
          one_chara_items = []
        elsif num == @strs.length - 1
          one_chara_items.push(ch)
          stocked_items.push(one_chara_items.join)
          one_chara_items = []
        else
          one_chara_items.push(ch)
        end
     end
     @stocked_items = stocked_items
  end

  def tokens
    @stocked_items
  end


end

tokenizer = Tokenizer.new("栃木;群馬;茨城")
tokenizer.tokenize(";")
puts tokenizer.tokens #=>  ["栃木", "群馬", "茨城"]

```

一番困ったのは、delimが文字の後（栃木、群馬の後の;）に来るものでないと、最初のif文（ch == delim）は効果を発揮しないということです。つまり、茨城の後には;が来ていないので、このif文だと、茨城が配列に入りません。
なので、elsifを追加して、最後の項目（茨城）を対象に別処理を追加しました。
MACでapkファイルをjavaのソースコードへ逆コンパイルする方法

CTFのrev問題でapkファイルを渡された場合、javaのソースコードへ逆コンパイルする必要がある。

`dex2jar` と `jad` を使う。

`.apk` -> `.dex` -> `.jar` -> `.class` -> `.jad` という流れ。

`.jad` ファイルを開けば`java` のソースコードが見れる。

参考：

https://qiita.com/le_skamba/items/04c0a0cfe420be862122

https://hacknote.jp/archives/10259/

http://inarizuuuushi.hatenablog.com/entry/2017/05/09/231600



# 0. dex2jar, jad のインストール

## dex2jar 

brewを使う。

パスを通す必要あり。

```bash
brew install dex2jar

echo 'export PATH="$PATH:/usr/local/Cellar/dex2jar/2.0/bin"' >> ~/.bash_profile
source ~/.bash_profile
```

## jad

brew cask を使う。

```bash
brew tap caskroom/cask
brew install caskroom/cask/jad
```



# 1. apk -> dex 

```bash
unzip hoge.apk
```

# 2. dex -> jar 

```bash
d2j-dex2jar hoge.dex
```

# 3. jar -> class

```bash
jar xf hoge.jar 
```

# 4. class -> jad

```bash
jad -r path/hoge.class 
```
整数文字列を64ビットの16進数に変換する

32〜64ビットの整数文字列を64ビット16進数に変換するコード。

```js

/**
 * 整数値を64ビットの16進数文字列に変換するコード
 */

 // 整数は文字列の形で指定
//let numString = '-9223372036854775807';
//let numString = '9223372036854775809';
let numString = '123333333333333';
let numArray = [];
let minus = false;
// 数値文字列を分割して配列に保存する
{
  let i = 0;
  for(const c of numString){
    if(c == '-'){
      if(i == 0){
        minus = true;
      } else {
        throw new Error(`不正な文字:${c}`);
      }
    } else {
      if(isNaN(c)){
        throw new Error(`不正な文字:${c}`);
      }
      numArray.push(parseInt(c,10));
    }
    ++i;
  }
}

// 変換結果を収める
let hex = [];
let b = 0;
let ans = [];
let remind = 0;

while(numArray.length > 0 || b > 15){
  b = 0;
  ans = [];
  remind = 0;
  numArray.forEach(num=>{
    b = b * 10 + num;
    if(b > 15){
      remind = b & 0b1111;
      ans.push(b >> 4);
      b = remind;
    } else {
      ans.push(0 | 0);
      remind = b;
    }
  })

  // 頭の0をとる
  let i = 0;
  while(ans[i] == 0){
    ++i;
  }
  numArray = ans.slice(i);
  hex.unshift(remind);  
}

if(hex.length > 16){
  throw new Error('64bit整数の範囲を超えています。');
}

// 桁揃え（16桁に）
if(hex.length < 16){
  let l = 16 - hex.length;
  while(l > 0){
    hex.unshift(0);
    --l;
  }
}

// マイナス値の処理
if(minus){
  hex = hex.map(d=>d ^ 0xf);
  hex[15] += 1;
  if(hex[15] > 15){
    hex[15] = 0;
    for(let i = 14;i >= 0;--i){
      hex[i] += 1;
      if(hex[i] < 16){
        break;
      } else {
        hex[i] = 0;
      }
    }
  }
  hex[0] |= 0b1000;//sign bitを立てる 
}
//hex.push(b);

console.log(hex.map(d=>d.toString(16)).join(''));
```
Javascript オブジェクトおさらい

オブジェクトとは・・・名前と値のペアの集合です。
プロパティ・・・名前と値のペアのこと

オブジェクトリテラル式
{プロパティ名：プロパティ値、プロパティ名：プロパティ値、・・・}

オブジェクトリテラル 例
-

プロパティ名が識別子
{x:2,y:1} 

文字列値
{"x":2,"y":1}・{'x':2,'y':1}

数値
{1:2,2:1}

様々な型
{x:2,y:1,enable:true,color:{r:255,g:255,b:255}}

代入式
var obj = {x:3,y:4};　　オブジェクトを変数に代入

typeof obj; typeof演算子で型を判定するとobject

object


プロパティにアクセス
-

ドット演算子
print(obj.x) オブジェクトobjのプロパティxの値を表示


左に代入式を書くとプロパティに代入できる。
obj.x = 33;
print(obj.x);
33


ブラケット演算子[]

print(obj['x']); obj.xと同じ
3

var name = 'x';
print(obj[name]);


new式
オブジェクト生成のための式

newの後に書くのは関数名
（newに続けて関数名を書いた時、その関数をコンストラクタとして呼び出す）

var obj = new object();
typeof obj;
object
UITestで待つ動作をする方法3つ。expectionForPredicate,dispatch_after,sleep.

##概要
UITestにおいて「テストの処理を待つ」方法としてはexpectionForPredicate,dispatch_afterあたりがよく取り上げられます。
expectionForPredicateは「画面が一定の条件を満たすまで」待ち、dispatch afterは「一定時間」待ちます。
今回説明するsleepも「一定時間」待つ方法ですが、dispatch afterとはちがった性質を持っているため、使いどころによって他の二つの方法では解決できない問題にも対処できます。

##dispatch afterとsleepの違い
[XCTestでUITestするとき便利なもの、困ったこととその解決策](https://qiita.com/masashi-sutou/items/a7f12ac285c737752cf0)
この記事の「NSTimerなどのテストで遅延したい時」の項目ではdispatch afterを用いています。
これを用いると、｛｝で囲んだ部分を指定した時間だけ後に実行できますが、その外の部分はどんどん先に進みます。
なので、運用としてはこの記事のようにどこかでexpectionForPredicateを使って一定時間待った後に行われる処理の完了を待ったりみたいな使い方をします。
一方、sleepはテストがその行まで来たときにその行で一定時間止まります。
dispatch_afterのように他の処理が必要ありません。（アプリの処理が止まって困らない限り）
すなわち、待機動作が1行で書けます。

##使いどころ
- expectionForPredicateで拾えるような画面の変化ではなく時間経過を待ちたい時（APIを一定時間空けて叩くときとか）
- その間アプリ自体は止まってもいい時（止まってほしくないならdispatch after）
- テストコードを短くしたい時

##使い方
```swift
// 前の処理
sleep(4) //引数で指定した秒数だけ待機します。ここでは4秒待ちます。
//以下、一定時間待ってから行いたい処理
```
##参考
(http://galakutaapp.blogspot.com/2015/03/blog-post_26.html)
(備忘録)/\.tsx?$/ について TypeScript + Webpack + React 

#webpackで分からない記述があった。
```
test: /\.tsx?$/
```

#結論
ファイルの指定の正規表現。
意味は「.ts か .tsx にマッチするファイル全て」

#各記号の意味

個人的に一文字飛ばして2つの記号が特にわかりづらかったので公式から引用しておきます
###\

>特別な意味を持たない文字の前に付けられたバックスラッシュ文字は、次の文字が特別なもので、文字通りには評価されないことを表します。
例えば b は文字列中にある小文字の 'b' にマッチします。しかし b の前にバックスラッシュを置いて \b とすると、これはどんな文字にもマッチしません。これは単語区切り文字を意味する特殊文字になります。[ \ バックスラッシュの意味(MDN)](https://developer.mozilla.org/ja/docs/Web/JavaScript/Guide/Regular_Expressions#special-backslash)

##.

>改行文字以外のどの 1 文字にもマッチします。
例えば /.n/ は "nay, an apple is on the tree" の 'an' や 'on' にはマッチしますが、'nay' にはマッチしません。[. ドットの意味MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Guide/Regular_Expressions#special-dot)

「/\.tsx?$/」　で言えば、 . が特別な意味を持ってるんで、\ がその意味を打ち消してるんですね〜。そして .　はただの文字になりましたとさ。

##//
「それが囲った文字にマッチするもの全て」という意味。

##?
「一つ前の文字が省略可能」という意味

##$
「文の最後」という意味。
Mastodonで呟いたソースコードをwandboxで実行できるようにしてみた

#はじめに

TwitterでPaizaさんが提供されてるソースコードを実行するものをMastodonでもやってみたくて試したものになります。

なお、C++のソースコードを実行したパターンしか試していないので他な言語の場合は想定していないです。

#実際のコード

```ruby:Gemfile
source "https://rubygems.org"

git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }

gem 'mastodon-api', git: 'https://github.com/tootsuite/mastodon-api.git', ref: '189deb8'
gem 'dotenv'
gem 'wandbox'
```

```ruby:wandbox.rb
require 'bundler/setup'
Bundler.require(:default)

require 'open3'
require 'mastodon'

stream = Mastodon::Streaming::Client.new(base_url: <MastodonのURL>, bearer_token: <アクセストークン>)
client = Mastodon::REST::Client.new(base_url: <MastodonのURL>, bearer_token: <アクセストークン>)

URL = <MastodonのURL>
name = <MastodonのアカウントID>

stream.user() do |toot|
    if toot.content.to_s =~ /wandbox/ then
        str = toot.content.to_s
        str.gsub!(/<\/p><p>/, '<br>')
        str.gsub!(/<p>|<\/p>|wandbox|/, '')
        str.gsub!(/<a href=\"<MastodonのURL>\/tags\/include\" class=\"mention hashtag\" rel=\"tag\">|<span>|<\/span>|<\/a>/, '')
        str.gsub!(/<br>|<br \/>/, '\n')
        str.gsub!(/&lt;/, '<')
        str.gsub!(/&gt;/, '>')
        str.gsub!(/&quot;/, '"')
        str.gsub!(/&amp;/, '&')
        
        source = str.split('\n')

        File.open("wandbox.cpp", "w+") do |file|
            source.each do |line|
                file.puts(line)
            end
        end

        s = Open3.capture3("wandbox run wandbox.cpp --compiler=clang-head")
        p s[0]

        response = client.create_status("[Wandbox]三へ( へ՞ਊ ՞)へ ﾊｯﾊｯ\n#{s[0]}")
    end
end
```

ソースコードはこれだけ。

やったことといえばTootの成型と`Open3.capture3`でwandboxでの実行結果を受け取ってるくらい。

#おわりに

これうまいこと使えばソースコードを実行できるBotとか作れそうとか思った。
そこまでの気力はないので、だれか作らないかなぁ......|дﾟ)

やるなら[Qiitadon](https://qiitadon.com/about)辺りで実装すると面白いんではないかな？

#参考資料
[CLI から Wandbox を利用してソースファイルを実行する gem をつくった](http://secret-garden.hatenablog.com/entry/2015/07/20/203552)
[Rubyで外部コマンドを実行して結果を受け取る方法あれこれ](https://qiita.com/tyabe/items/56c9fa81ca89088c5627)
Java GCについてのメモ

安定化試験の担当になりました。
GCがどうなっているか報告しなければならないのですが、全く経験がなく未知の世界。
そんな訳で、恥をかかなないようにググったことをまとめました。

# Java VM引数
```java
-verbose:gc -Xloggc:gc.log
```

# GCViewのインストール方法
```java
brew install maven
git clone https://github.com/chewiebug/GCViewer.git
cd GCViewer
mvn clean install
java -jar target/gcviewer-1.36-SNAPSHOT.jar
```

# 結果
簡単なプログラムを稼働させてGCログを取っただけだと、
GCViewerでは時間が短すぎて縦線が表示されただけだった。
とりあえず、使い方は分かったので、職場で２日分のGCログ解析に役立てられそうです。


# 参考サイト

## JavaVMのGCログ出力とGCViewerについて
- URL: http://www.task-notes.com/entry/20150506/1430881200
- GCログのオプションに説明が充実。GCViewerのインストール方法の説明があり助かりました。

## Java開発の性能改善！ その２ GCログの解析とHeepの設定
- URL: https://qiita.com/i_matsui/items/aabbdaa169c6ae51ecb3
- GCViewerの見方の説明が参考になりました。
iPhoneアプリを開発するための環境をローカルに構築してみた！！

以前、[Laravel 5.6 Laravel Homesteadを試してみた！！](https://qiita.com/kouji555/items/caf0102326940ed8b37d)という記事を書きました。
こちらを利用して、iPhoneから```https://example.ml```で接続できるようにしてみたいと思います。

##DNSサーバの構築

vagrantでDNSサーバを構築していきます。

```
vagrant box add bento/ubuntu-16.04
vagrant init bento/ubuntu-16.04
vagrant up
```

Vagrantfileに```config.vm.network "public_network", bridge: 'en1: Wi-Fi (AirPort)'```を追記します。
追記後、```vagrant reload```で再起動します。次に、```vagrant ssh```でサーバにログインします。
小規模な内部ネットワーク向けの軽量な DHCPサーバーソフトウェア Dnsmasq を利用します。
まず始めに、管理者になり、dnsmasqをインストールします。 

```
// 管理者になります
sudo su

apt-get -y install dnsmasq

```

インストール後、設定をします。

```
vi /etc/dnsmasq.conf


# 19行目：コメント解除 (ドメイン名の無いクエリは上位サーバーに問い合わせない)
domain-needed
# 21行目：コメント解除 (プライベートIPの逆引き要求は上位サーバーに問い合わせない)
bogus-priv
# 53行目：コメント解除 (resolv.confに記述のサーバーに上から順に問い合わせる)
strict-order
# 135行目：コメント解除 (ホスト名に自動的にドメイン名を付加する)
expand-hosts
```

次に、クライアントからの要求に対して、設定した内部ドメインは ```/etc/hosts``` を参照し、その他は上位のDNSサーバーに問い合わせて結果を返すように設定します。

```
vi /etc/hosts


192.168.0.10       example.ml
```

設定後、dnsmasqを起動します。

```
systemctl start dnsmasq 
```

##Homestead内のsslの設定
Homestead内のnginxの設定にssl通信を追加します。
使用する証明書は、以前[Ubuntu18.04で構築したサーバの証明書](https://qiita.com/kouji555/items/4dbccc6aad32278e2cc6)を利用します。scpコマンドを利用して```/etc/nginx/ssl```にファイルを移動させます。そして、Homesteadのngnix設定ファイル```/etc/nginx/sites-available/homestead.test```をデフォルトの設定はコメントアウトし、新規に証明書の設定を追記します。

```
ssl_certificate     /etc/nginx/ssl/fullchain.pem; => 新規追加
ssl_certificate_key /etc/nginx/ssl/privkey.pem; => 新規追加
#ssl_certificate     /etc/nginx/ssl/homestead.test.crt; => デフォルトの設定
#ssl_certificate_key /etc/nginx/ssl/homestead.test.key; => デフォルトの設定

```

ファイルの設定後、nginxを再起動させます。

```
sudo systemctl restart nginx
```

##iPhone側の設定

①iPhone本体の設定から、Wi-Fi環境の設定を選択します。

<img width="378" alt="スクリーンショット 2018-08-05 8.45.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/25436/0d45d9fa-c85e-c0b5-ce36-5b6568e7bc4a.png">

②赤い矢印の箇所をクリックします。

<img width="503" alt="スクリーンショット 2018-08-05 1.21.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/25436/335719fb-c3d8-0047-e204-ff143bf1d685.png">

③そして、DNSを構成の箇所を選択します。デフォルトは、手動ではなく自動の設定をなっています。

<img width="378" alt="スクリーンショット 2018-08-05 9.03.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/25436/f4767268-fb20-56f1-099b-63a2c01b0b14.png">

④DNSサーバの箇所にDNSサーバのIPアドレスを設定すれば完了です。

<img width="384" alt="スクリーンショット 2018-08-05 9.06.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/25436/3f43e23e-910f-9cf4-ac59-180563d17861.png">

⑤```https://example.ml```にアクセスしてみてください。httpsでアクセスできていることを確認できるはずです。

<img width="381" alt="スクリーンショット 2018-08-05 1.10.58.png" src="https://qiita-image-store.s3.amazonaws.com/0/25436/bf0d740b-e7e1-301f-6664-1ac1ebdec3b2.png">

##最後に

開発するための環境のために、別環境でサーバを立てることなく自前のMac内で開発環境を構築しました。
心置きなく、iPhoneの開発ができます。
よかったら、参考にしてみてください。

参考元
https://www.server-world.info/query?os=Ubuntu_16.04&p=dnsmasq&f=1
Course 4 > Week 3 Object detection（Coursera Deep Learning Specialization 受講記録）

Coursera > [Deep Learning Specialization](https://www.coursera.org/specializations/deep-learning) > Course 4 : Convolutional Neural Networks > **Week 3 Object detection** の受講記録。

#概要
Course 4 は4週分の講座から構成される。

1. [Week 1 Foundations of Convolutional Neural Networks](https://qiita.com/onooooo/items/7e1dadb271085045f2c4)
2. [Week 2 Deep convolutional models: case studies](https://qiita.com/onooooo/items/f35f521c6f68a2d88454)
3. [Week 3 Object detection](https://qiita.com/onooooo/items/f36dde6014304a02668b)
4. Week 4 Special applications: Face recognition & Neural style transfer

Week3 はCNNの応用分野のひとつ、物体検出について学ぶ。

---

#Detection algorithms
##Object Localization

・Image classification
　画像に映っているものが何かを分類する
・Classification with localization
　「何が」だけでなく「どこに」映っているかを検出する
　「どこに」→バウンディングボックス
・Detection
　複数のオブジェクトが存在する可能性がある画像からすべてのオブジェクトを検出してさらに位置を特定する

##Landmark Detection
画像内のオブジェクトの位置を指定する方法として、バウンディングボックスのほかに、ランドマーク（オブジェクトの重要なポイント）の座標を指定する方法がある。

##Object Detection
Sliding Windows Detection
コンセプトとしては単純だが、計算コストがかなり高くなる

##Convolutional Implementation of Sliding Windows
FC layer -> Conv layer へ変換する方法。
たとえば 5*5*16 のボリュームをもつConvレイヤーと 400個のノードをもつFCレイヤーの接続部分は、 5*5*16ボリューム×400個のフィルタを使ってConv演算することで、FCレイヤーを 1*1*400 のConvレイヤーに置き換えることができる。これを使うことで、 Sliding Window のオブジェクト検出を畳み込みで実装することができる。イメージ全体をまとめてCNNに読ませ、すべての Sliding Window を一度に処理できるので効率が良くなる。ただし、バウンディングボックスの位置が正確でないという欠点がある。

*・・・説明を聞いてもいまいちピンと来ず。全結合をCNNに置き換えるだけで（結果的には同じ計算をするはずなのに）何がそんなに良いのか？要復習。*

(参考)[TensorFlow で「一般物体検出」入門　(「OverFeat」のところ)](http://tensorflow.classcat.com/category/overfeat/)

##Bounding Box Predictions
バウンディングボックスの位置をより正確に行うためのアルゴリズムの例として突然 YOLO (You Only Look Once) が登場する。YOLOは、画像をグリッドに区切って、各グリッドに対して画像分類とローカリゼーションアルゴリズムを適用する。Sliding Windows 方式よりもバウンディングボックスの位置が正確になる。

##Intersection Over Union
2つの画像の重なり度合い。予測したバウンディングボックスと正解のバウンディングボックスの重なり度合いに当てはめると、オブジェクト検出アルゴリズムの正確さの評価に使える。

*「IOU（I OWE YOU.つまり借用書) とは違いますよ」と英語が苦手な自分にとってはどうでもいい話を盛り込んでくる Andrew 先生。常に菩薩のような微笑み＆穏やかな口調で講義されるのでジョークなのか真面目な話なのか判断が難しい。*

##Non-max Suppression
アルゴリズムが同じオブジェクトを複数回検出する場合がある。Non-max Suppression によって各オブジェクトは1回だけ検出されるように抑制する。

(参考)[物体検出におけるNon-Maximum Suppressionのアルゴリズム](https://meideru.com/archives/3538)

##Anchor Boxes
これまで見たアルゴリズムでは各グリッドセルが1つのオブジェクトしか検出できない。Anchor Boxを使うことで１つのグリッドセルが複数のオブジェクトを検出することができる。

ここでの例だと１つのグリッドセルあたり３つ以上のオブジェクトは検出できない。また、１つのグリッドセル内で2つのオブジェクトが同じアンカーボックスを使用することはできない。

##YOLO Algorithm
YOLOの説明。ここでは２つのアンカーボックスを使っている。Prediction時は Non-max Suppression も使う。

*Anchor Boxの概念が掴みづらい。要復習。*
（参考）[Generating Anchor boxes for Yolo-like network for vehicle detection using KITTI dataset.](https://medium.com/@vivek.yadav/part-1-generating-anchor-boxes-for-yolo-like-network-for-vehicle-detection-using-kitti-dataset-b2fe033e5807)

##(Optional) Region Proposals

- R-CNN
- Fast R-CNN
- Faster R-CNN

この一連のアルゴリズムがまとめてOption扱い。Andrew先生的には、領域提案とクラス分類のステップが分離されていない、YOLOのようなアルゴリズムが好みだそう。