OmniAICreator/Qiita-1.07M huggingface dataset:
findで検索元のディレクトリを結果から外したい


以下のようなことをしたい

~~~
$ find $dir -name $name
~~~

をやったあとの結果として

$dir/{result}
...

みたいな感じになるが、
検索元のディレクトリを外して

{result}

だけが取得したい

# awkを使う方法

~~~
find $dir -name $name | awk -F$dir/ '{print $2}'
~~~

区切り自体を$dirにして
{result}だけを取得する方法

職場のスクリプトでこれを使ってしまったのだが、
正直今考えてみるとあまりおすすめはしない

なぜなら区切り自体が$dirになるので
{result}の中に万が一

$dirが含まれてしまっていた場合、
予測していた結果にならないから

# cutを使う方法

~~~
find $dir -name $name | cut -c `echo $dir/ | wc -m`-
~~~

素直に頭から$dirの文字数分
抜き出すというもの

一番こっちが確実みたいなので、
明日職場のスクリプトを書直そう
Karabiner で自分の使いやすいように Keybind を変更する

## Command_L to Control_L

Command はなるべくホームポジションから状態の左小指で押したいですよね

## Command_R to Delete

Back Delete を右親指で押したいですよね

## Control_L to Command_L

Control は多少ホームポジションから動かした状態の左小指で押すぐらいで良いですよね

## Delete to Forward Delete

Forward Delete はあまり使わないので遠くて良いですよね

## Use EISUU as KANA/EISUU (toggle)

左親指で IME を Toggle で切り替えたいですよね

## KANA to Return

Return はホームポジションの右親指で押したいですよね
Android での WebP

## Android での対応状況
Android 4.1 以降
※（Lossless, Transparency は 4.2.1以降）

参考：https://developer.android.com/guide/appendix/media-formats.html

## メモ
drawable, mipmap ともに動作
アプリアイコンなどにも使える
Android Wear や Android TV については、何も気にせずこれでいいかも
複数人で開発するときに大量のコミットを１つにして合流させる方法

複数人で開発しているときに、とある理由から細かくコミットしながら自分の作業を１コミットとして反映させたい場合の方法メモ

例）master に合流させる場合

1.branch を確認する
`git branch`

２．コミット履歴を確認する
'git log'

3.10個のコミットをまとめる
`git rebase -i HEAD~10`

4.直前のコミットを取り消す
`git reset --soft HEAD^`

5.作業履歴を保存する
`git stash save`

6.master に切り替える
`git checkout -b master origin/master`

7.作業履歴を反映する
`git stash pop`
Google Play 早期アクセスの端末で、APIに渡すパラメータがアラビア語に変換されてしまった問題

## 概要
Google Play でアプリを公開するたびに、Rooted 端末からのアクセスがあり、APIに渡す数字がアラビア語に変換されて、クラッシュログが計測されていた
※未解決だが、備忘録のために


## 調査のきっかけ
Google Play でアプリをα配信（もしくはβ配信）した際に、必ず謎のクラッシュログが計測されたので調査してみた

## ログの詳細
* Rooted端末からのアクセス
* アプリからWebAPIへアクセスしている際に、パラメータがバリデーションに引っかかっているというエラーメッセージが出ている
* **APIに渡している数字がなぜかアラビア語になっている**

## 原因
* Google Play の早期アクセス欄を見たら、該当端末を発見
* 早期アクセスのところに同じクラッシュログが計測されていたので、APKの自動テストが走っていたもよう

## 実機確認
* 実機でアラビア語に設定してみたものの、APIに渡している数字（1とか）がアラビア語になってしまう問題は発生せず
Fragment で RecyclerView.Adapter の色々なタイミング、メモ


```java
public class RecyclerViewFragment extends Fragment {
  
    private RecyclerView mRecyclerView;

    private RecyclerView.Adapter mAdapter;

    private RecyclerView.ItemDecoration mItemDecoration;

    @Override
    public void onCreate(@Nullable final Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // RecyclerView.Adapter の生成
        mAdapter = new RecyclerView.Adapter();
        // ItemDecoration の生成
        mItemDecoration = new RecyclerView.ItemDecoration(....
    }

    @Override
    public View onCreateView(final LayoutInflater inflater, final ViewGroup container, final Bundle savedInstanceState) {
        final View view = inflater.inflate(R.layout.fragment, container, false);
        mRecyclerView = (RecyclerView) view.findViewById(R.id.recyclerView);
        return view;
    }

    @Override
    public void onActivityCreated(final Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);

        mRecyclerView.setAdapter(mAdapter);
    }

    public void onViewCreated(final View view, @Nullable final Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);

        mRecyclerView.addItemDecoration(mItemDecoration);
    }

    @Override
    public void onDestroyView() {
        super.onDestroyView();
        
        mRecyclerView.removeItemDecoration(mItemDecoration);
        mRecyclerView.setAdapter(null);
        mRecyclerView = null;
    }

    @Override
    public void onDestroy() {
        super.onDestroy();

        // RecyclerView.Adapter の解放
        mAdapter = null;
        // ItemDecoration の解放
        mItemDecoration = null;
    }
}
```
AppLaunchChecker を触ってみた


環境
AndroidStudio 2.0

Android Support v4 23.3.0

AppLaunchChecker
http://developer.android.com/intl/ja/reference/android/support/v4/app/AppLaunchChecker.html

```java:MainActivity.java
    @Override
    public void onCreate(final Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        boolean before = AppLaunchChecker.hasStartedFromLauncher(getApplicationContext())
        AppLaunchChecker.onActivityCreate(this);
        boolean after = AppLaunchChecker.hasStartedFromLauncher(getApplicationContext())
    }
```


*AppLaunchChecker.onActivityCreate(this);* によって計測が行われている

アプリケーションを新規インストール後にMainAcvitity起動
before: false
after: true

アプリケーションがタスクにいない状態から起動
before: true
after: true

アプリケーションのデータ削除後に、アプリを起動
before: false
after: true



AppLaunchChecker.onActivityCreate(Activity) が呼ばれるまでは常に 
AppLaunchChecker.hasStartedFromLauncherは false、逆に一度でも呼んでしまうとアプリがアンインストール（もしくはデータ削除）されない限りは true であり続ける

SharedPreferencesなどを用いて同様のロジックを組めるが、こちらの方が手軽。ただし、あとから追加というのが出来ないのでどのバージョンでも「新規インストール時」に処理を行いたい場合という限定的な仕様用とになりそう
Swift で　AutoLayout　を使う（基本編）


#AutoLayout概要

始めて　AutoLayoutを設定する
##概要
・アプリケーションの画面レイアウトを作成するシステム
・ユーザインターフェイスを調整できる
##メリット
・画面の大きさや向き、地域設定などを動的に変化させられる
・AutoLayoutを使わないと左上からの座標で配置されてしまうが、それをセンタリングやマージンを設定しておくことで、画面サイズが変わっても調整してくれる
##Previewの使い方
・storyboardを開く
・Assistant Editorを開く
・Assistant Editorのメニューバーのところで選択すればOK！
##設定画面
ここからは細かい画面について記載する
###右下のボタン
右から
・Resolve Auto Layout issues
・Pin
・Align
##Pin
・Use Current Canvas Value にすると現在の値を設定できる
###Constrain to margins
パーツはも元々マージンがあるものもあって、そのマージンも含めて
余白を設定するか？ということらしい
私は使いづらいので毎回チェックを外してマージンを内容にする
###Width
・幅のサイズ設定
###Height
・高さのサイズ設定

##Align
・Use Current Canvas Value にすると現在の値を設定できる
### Horizontally in１Container
・横方向の調整を設定する
・中心からの移動座標を設定する
### Vertically in Container
・縦方向の調整を行う
・中心からの移動座標を設定する

##赤、青、黄の→について
・青→　調整完了　異常なし
・黄色→　まだ確定していない属性があるよ　例えば、位置は決まっているけど、サイズが未決定など
・赤→　矛盾した設定があるよ

##パーツを移動させた後の処理
・Update Frames　　　　元の位置に戻す
・Update　Constraints　　設定を更新する
flexboxで縦型グローバルナビゲーションの中で横並べ

CSSのflex属性がとても便利ですね。

> Flexboxとは、要素のサイズが不明なものでもダイナミックに変化するものでも柔軟なレイアウトを実現できるCSS3の新しいレイアウトモジュールです。複雑なレイアウトでも今までより少ないコードで、よりシンプルなプロセスで実装することができます。
<q cite="http://coliss.com/articles/build-websites/operation/css/css3-flexbox-properties-by-scotch.html">CSS3 Flexbox の各プロパティの使い方をヴィジュアルで詳しく解説 - Coliss</q>

今回は、Flexboxを用いてスマホ向けグローバルナビゲーション内で、縦並びの項目の中にさらに横並びの項目を並べる実装をした時のコードを紹介します。


```html:filename.index.html
<nav class="navbar" role="navigation">
  <ul class="nav navbar-nav">
    <li class="nav-item">
      <a class="nav-link " href="#">Products</a>
    </li>
    <li class="nav-item">
      <a class="nav-link" href="#">About</a>
    </li>
    <li class="nav-item">
      <a class="nav-link" href="#">News</a>
    </li>
    <li class="nav-item">
      <a class="nav-link" href="#">Shop List</a>
    </li>
    <li class="nav-item">
      <ul class="nav-inline">
        <li class="nav-item nav-inline-item">
          Social:
        </li>
        <li class="nav-item nav-inline-item">
          <a class="nav-link" href="https://twitter.com/" target="_blank"><i class="fa fa-twitter fa-fw icon-twitter" aria-hidden="true"></i> <span class="text-hide">Twitter</span></a>
        </li>
        <li class="nav-item nav-inline-item">
          <a class="nav-link" href="https://facebook.com/" target="_blank"><i class="fa fa-facebook fa-fw icon-facebook" aria-hidden="true"> </i> <span class="text-hide">Facebook</span></a>
        </li>
        <li class="nav-item nav-inline-item">
          <a class="nav-link" href="https://www.youtube.com/" target="_blank"><i class="fa fa-youtube-play fa-fw icon-youtube" aria-hidden="true"></i> <span class="text-hide">YouTube</span></a>
        </li>
      </ul>
    </li>
  </ul>
</nav>
```
```css:filename.style.css
.navbar-nav .nav-item {
    float: none;
}
.nav-inline {
    display: flex;
    justify-content: space-between;
}
```
シンプルなCSSで実装することができました。
![ss.png](https://qiita-image-store.s3.amazonaws.com/0/119598/28559b3a-b850-d1da-23a4-0969e4cd46f7.png)

### justify-content プロパティおさらい
flexアイテムの横方向の整列を指定するCSSプロパティ。
<dl>
<dt>flex-start</dt>  <dd>横並びの場合は左揃えになり、縦並びの場合は上揃えになる。</dd>
<dt>flex-end</dt>  <dd> flex-startの逆。横並びの場合は右揃え、縦並びの場合は下揃えになる。</dd>

<dt>center</dt>  <dd> 各flexアイテムが中央揃えになる。</dd>
<dt>space-between</dt>  <dd>flexコンテナ内で各flexアイテムが均等間隔で整列する。</dd>
<dt>space-around</dt>  <dd>space-betweenと同じく均等の間隔を持って整列するが、両端のflexアイテムの外側に余白ができる。</dd>
</dl>
オブジェクトを隠す条件が消える。



#環境
FileMaker Pro Advanced 15.0.1
Windows 10 64bit

#再現方法
1. フィールドに、「次の場合にオブジェクトを隠す」の計算式を追加する。
2. ボタン設定を表示する。
3. 「次の場合にオブジェクトを隠す」の計算式が、消える。
4. 目のシンボルは表示されたままで、また、元のオブジェクトを隠す条件は有効に機能する。

1.
![1.png](https://qiita-image-store.s3.amazonaws.com/0/132059/8604c9c4-65cd-d8b2-4017-9824ed9ba7a7.png)

2.
![2.png](https://qiita-image-store.s3.amazonaws.com/0/132059/47e972c7-d54e-bb73-43ef-06831b4bc6c2.png)

3.
![3.png](https://qiita-image-store.s3.amazonaws.com/0/132059/51a94b38-fd6d-e5f0-f67a-373ba69478d3.png)

#解決方法
**グループ解除を行う。**

![4.png](https://qiita-image-store.s3.amazonaws.com/0/132059/f6344d3b-5a28-c895-356c-7aa28469c5b8.png)

#解説
https://community.filemaker.com/message/578580
を、読む限り、これはFileMakerの仕様です。
フィールドをボタン化するために、グループ化しているようです。グループ化前に設定したオブジェクトを隠す条件は、インスペクタでは見えませんが、実際には残っています。


#コメント
ボタン設定を表示するだけで、フィールドやテキストオブジェクトもグループ化された状態になるという意図しない結果になります。わかりにくいし間違いやすい事柄です。あるフィールドをコピー＆ペーストしている中で、あるタイミングでこのような状態になるし、原因は一体なんだろう？と考え、また、FileMakerのバグだとしたらデータベースの構造に影響を与えたんじゃないか？と、不安になる事柄でした。
IntelliJですばやくPythonDjango環境を構築する


##1.Python3をインストール

せっかくなのでPython3をbrewでインストールします。

```bash
$brew update
$brew install python3
$python3 -V
Python 3.5.2
```

バージョン確認オプションは`-V`なので注意。
`-v`は別オプションです。

##2.Djangoをインストール
```bash
$python3 -m pip install django
$python3 -m django --version
1.10
```

##3.Pythonプラグインをインストール

Preference > Plugins > Install JetBrains plugin...

`python` で検索してインストール&Restart

![Kobito.Bflwm4.png](https://qiita-image-store.s3.amazonaws.com/0/127115/9579fef9-0501-4b38-2a98-5de06cb38a5c.png "Kobito.Bflwm4.png")

##4.Pythonプロジェクトを作成
![Kobito.bxU1pc.png](https://qiita-image-store.s3.amazonaws.com/0/127115/c0ba9a13-f640-a48a-fd1a-4f7ef055c058.png "Kobito.bxU1pc.png")


##5.Run！！！
<img src="https://qiita-image-store.s3.amazonaws.com/0/127115/b38eb95b-1b77-52b3-4602-1569ad758ec9.png" width="300px"/>

`http://127.0.0.1:5000/` にアクセスすると

![Kobito.JLdMde.png](https://qiita-image-store.s3.amazonaws.com/0/127115/441a7c32-58f8-5598-a67a-644a07c2362b.png "Kobito.JLdMde.png")


いいね！
Github の Service に Amazon SQS を設定するときに IAM 周りでハマった

## 概要

Github の `Webhooks & services` のところで `Amazon SQS` を設定する際に最小限の権限だけ持った IAM の `Aws access key` を使いたいと思って設定したのですが全然うまく行かなかったので解決までの経緯を書きます。

タイトルの Github の Service と言うのはこの画面で設定するやつです。

![image](https://qiita-image-store.s3.amazonaws.com/0/17704/ab10969e-cf80-38a0-757a-5ce63a62fe24.png)

## TL; DR

IAM のポリシーに `sqs:GetQueueUrl` と `sqs:SendMessage` のアクションの許可が必要。 ドキュメントには `sqs:SendMessage`だけで良いって書いてあるけどね :angry: 

## 事の起こり

リポジトリに `Amazon SQS` の設定しようとして `Install Notes`(下記画像) には `SendMessage` の権限が必要とあったのでその権限だけの IAM を作って設定しました。

しかしテストしてみると SQS が配信されませんでした。 試しにここで設定した IAM ユーザーを使って自分のマシンから `aws` コマンドを買って SQS のメッセージを発行してみるとうまく動きました。

何がおかしいかよくわからないので調査することにしました。

![image](https://qiita-image-store.s3.amazonaws.com/0/17704/904de46c-746b-9305-13fd-ffd8a394d0e4.png)

## まずはすべてアクションを許可してみる

試しに IAM の許可されたアクションを `sqs:*` にしました。

この状態で Github からテストするとちゃんとメッセージが配信されました。

そこで全てのアクションを箇条書きにして1個ずつ消していくことにしました。

SQS のアクションを全て並べると以下のようになります(多い...)。

```
sqs:AddPermission
sqs:ChangeMessageVisibility
sqs:ChangeMessageVisibilityBatch
sqs:CreateQueue
sqs:DeleteMessage
sqs:DeleteMessageBatch
sqs:DeleteQueue
sqs:GetQueueAttributes
sqs:GetQueueUrl
sqs:ListDeadLetterSourceQueues
sqs:ListQueues
sqs:PurgeQueue
sqs:ReceiveMessage
sqs:RemovePermission
sqs:SendMessage
sqs:SendMessageBatch
sqs:SetQueueAttributes
```

### 最終的に残ったもの

1個消してはテストして、また1個消してはテストするというのを繰り返し続けました(Delete 系のやつや Permission 系のは流石に関係ないと思ってざっくり消したけど)。

その結果最後に残ったのは以下の2つでした。 `GetQueueUrl` を消すとまた動かなくなるのでなんか使ってるっぽいです。

- `sqs:GetQueueUrl`
- `sqs:SendMessage`

## まとめ

Github に `Amazon SQS` を設定する際は以下の2つのアクションの許可が必要です。

- `sqs:GetQueueUrl`
- `sqs:SendMessage`


また、記事中では触れていませんが更に安全にするために Github の IP アドレス以外からはメッセージが配信できないようにすると良いと思います。

`NotIpAddress` `aws:SourceIp: "192.30.252.0/22"` は拒否みたいな感じです。

`Github の IP アドレスだけ許可する` という構成にすると他のポリシーで上書きされてどの IP アドレスからでも配信できる状態にいつの間にかなってしまうことがあるので注意です。
アクションカメラで撮影した画像をMapillayスクリプトでアップロードする

GPS搭載アクションカメラなどで撮影した、位置情報付きの連続画像をPythonスクリプトでMapillaryにアップロードする手順を説明します。

#準備
##Python実行環境およびエディタのインストール
http://www.python.jp/ から実行環境をダウンロード、インストールします。

エディタはWindows環境ならサクラエディタあたりをインストールしておくと良いでしょう。
http://sakura-editor.sourceforge.net/download.html

##「mapillary_tools」のダウンロード
https://github.com/mapillary/mapillary_tools にアクセスし、[Clone or Download]ボタンを押して一括ダウンロードします。

ダウンロードしたスクリプトは任意のディレクトリに解凍してください。

## ハッシュコードの取得
以下のサイトにアクセスし、2つのハッシュコード
「Permission Hash」
「Signature Hash」
をメモしておきます。
https://legacy.mapillary.com/map/upload/im

##PYTHONPATHの設定
Pythonの設定情報が記されているPYTHONPATHに以下の様に項目を追加します。
追加方法
http://blog1.erp2py.com/2010/10/pythonpath.html

MAPILLARY_USERNAME = "mapillary_my_userID"
MAPILLARY_EMAIL = "sample@email.jp"
MAPILLARY_PASSWORD = "fjsei84aoreugj"
MAPILLARY_PERMISSION_HASH = "THISISSAMPLEsagoraoignreoanguoaenegoaernhueshgoseru48njfkdogsw48joa34903j03a40jh30a350ajhrigh8rfwnf498gj0aja0h80A4J0AGNODRG7AENROHJAEOR"
MAPILLARY_SIGNATURE_HASH = "THISISSAMPLELy/dusnkskn7J3SLSNjfsQ8="

PYTHONPATHの在り処がよくわからない場合はスクリプトに直接書き込んでしまったほうが手っ取り早いかもしれません。 

#画像の準備
Virbで撮影したものなど撮影時点で座標情報がExifタグとして埋め込まれた画像を用意します。

一連のシーケンスとして取り扱う画像をフォルダ単位にまとめます。


#スクリプトの実行
コマンドプロンプトを起動します
mapillary_toolsのフォルダまでcdコマンドで移動します。
以下のようにタイプします

upload_with_preprocessing.py [画像フォルダ]

upload_with_preprocessing.py D:\mapillary\pics\20160826\

#アップロード後
アップロードが終了したら、Mapillaryサイトで仕上げ作業を行います。
gemってどーなってるの？

gem自体は各rubyのバージョンごとに管理されているが
実際にそのgemを利用するかどうかは各アプリケーションごとに
入れないといけない。

つまりrubyにgemは入っているけど
制作中のアプリケーションにgemをインストールするために
gemfileに記入してbundle installを実行する必要がある。

そうする事によって必要なファイルが生成される。
海外でソフトウェアエンジニアとして働く利点と欠点

# 誰が書いているの？
この記事は、イギリスのロンドンで4年間ソフトウェアエンジニアとして働いてきたYoh Okunoが書いています。現在の所属はMicrosoftの英国法人で、その前はMicrosoftが買収したSwiftKeyという会社で働いていました。詳しくは以下の記事を参照してください。
[MicrosoftがAIで入力予測をするキーボードアプリ「SwiftKey」を2億5000万ドルで買収](http://jp.techcrunch.com/2016/02/03/20160202microsoft-is-acquiring-londons-ai-driven-swiftkey-for-250m/)

# 海外で働く利点
ここでは主に英語圏の現地企業でソフトウェアエンジニアとして働く場合を想定します。日本企業の駐在員の場合は事情が違うかもしれません。

## 給料が高い
海外のエンジニアの給料についてはいろいろな記事がすでにあるので、例えばこの記事を参考にしてください。
[ITエンジニアの地位とは？国別、職種別の年収比較から見えるもの](http://paiza.hatenablog.com/entry/2014/07/23/IT%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%AE%E5%9C%B0%E4%BD%8D%E3%81%A8%E3%81%AF%EF%BC%9F%E5%9B%BD%E5%88%A5%E3%80%81%E8%81%B7%E7%A8%AE%E5%88%A5%E3%81%AE%E5%B9%B4%E5%8F%8E%E6%AF%94%E8%BC%83)

やはりアメリカのソフトウェアエンジニアは給料が高いです。アメリカにはグーグル、アップル、マイクロソフトなどの有名な大企業が多いですし、シリコンバレーでは多くのスタートアップが生まれているので、ある程度仕事ができるソフトウェアエンジニアは争奪戦になるからです。イギリスはアメリカほどIT業界が盛んではありませんが、英語圏なので優秀なエンジニアはアメリカやヨーロッパに行くことができますし、やはり日本よりも給料が高い傾向があります。なお、同じ海外でもアジアではエンジニアの給料は日本と同程度かそれより低い傾向があるので注意が必要です。

## 英語が身につく
英語圏で働く魅力の一つが英語が自然に身につくということでしょう。日本人が大人になってから英語圏に住んでもネイティブスピーカーになれるわけではありませんが、エンジニアのようなミーティングが少なく専門用語の多い職種では仕事に困らない程度には英語が話せるようになります。英語が話せるようになると英語が必要な仕事ができたり、英語圏で仕事を探したりすることができるため、将来のキャリアの選択肢の幅が広がります。前述の通り英語圏のソフトウェアエンジニアは給料が高いので、いつでも英語圏で働けるようになる強みは大きいです。

## 自由な時間が多い
会社にもよりますが欧米のソフトウェアエンジニアは日本よりも残業をしない傾向にあるようです。私の会社を例に取ると、多くの人が午前10時前後に出社して、午後6時にはオフィスに誰もいなくなるのが普通です。有給休暇は年間25日あり、祝日は少ないですが、夏休みや年末年始で有給は使い切っています。病欠は有給にカウントされません。また週2日は自宅勤務ができるので、家が遠い人や子供がいる人はよく利用しています。欧米人は個人の幸福を最優先する気質で、仕事はそのための手段の一つでしかありません。自由な時間には家族や友達との時間を大切にしたり、趣味や勉強を楽しんだりしています。長期休暇には旅行に出かける人が多いようです。

# 海外で働く（住む）欠点
海外で働くためには海外に住む必要があります。ここでは海外（特にイギリス）に住む欠点を考えてみたいと思います。

## 食事が合わない
やはり日本の食事は素晴らしく、たまに一時帰国すると牛丼から回転寿司までなんでもおいしく感じます。イギリス料理がまずいのはイギリス人も認めるところで、イギリスには代表的な料理が3つあるというジョークがあります。「まずはフィッシュで、次はチップス。そして最後はフィッシュアンドチップスだ」。それだけおいしいものが少ないという意味ですね。ただしイギリスの中でもロンドンにはイタリアンレストランや中華料理店がたくさんありますし、自炊も組み合わせればイギリス料理を食べずに過ごすことは可能です。

![fishandchips.jpeg](https://qiita-image-store.s3.amazonaws.com/0/23665/5257a957-5a3a-43b3-92e4-1f37970cb680.jpeg)

## 気候が合わない
これも国によりますが、日本人には日本の気候がちょうどよいのかなと思います。イギリスはしょっちゅう雨が降るし、冬が長くてよく風邪を引きます。ただ、花粉症が軽いのと地震がないのはいいですね。夏の地中海にバカンスに行くと天気がよくて最高です。

## 孤独になりがち
これは人によりますが、やはり言葉と文化の違いは大きいように思います。家族を連れて行く人は家族も環境に適応できないと困りますし、子供の教育費が高額になるという話も聞きます。知り合いの日本人を見ると独身の人は女性のほうが外国人の友達を作るのが得意なようです。日本人から見ると欧米の男性はカッコよく見えますが、欧米の女性は太いし老けて見えます。理由はよくわかりませんが、西洋人は男女ともにテストステロンというホルモンがアジア人より多いことが関係しているようです。職場の人間関係はドライで飲み会などは少ないですが、これは人によっては利点に感じるかもしれません。

# 最後に
海外で働くことは日本とは大きく違っていて利点も欠点も多いですが、一度経験してみると自分に合っているか知ることができますし、新しい物事の見方を知ることができて良いと思います。アメリカやイギリスで労働ビザを取って働くのは難しく、ビザのコストを払ってでも雇う価値があることを雇用主に示す必要がありますが、この辺りの戦略についてはまた別の記事を書ければいいなと思います。
Inventory > 実例検討

実例
http://buzzap.jp/news/20120222-20-beautiful-libraries/

「せどり」からヒントをいただいた。

### ネスト探索

- 1つの本棚に複数の収納場所がある
  - 収納場所: divisionと定義する (英語: compartment?)
  - shelf(棚)１つにrow, column値が異なる複数のdivisionを持つ

- 7: ニール・ゲイマンの書斎
  - row: 8つ
  - division: 20くらい
  - 1division内: 1row x 10books

- 6: Skywalker Ranch
  - row: 2, column: 2として、左上、右上、左下、右下のdivisionを定義
  - 各divisionにネストしたrow, columnを定義
  
- 9: Thierry W. Desponent
  - row: 2として、上と下のdivision1を定義
  - 各division1をcolumn: 8として分離 (division2)
  - division2内でrow:5, column: 30くらいか?


### 例外

- 3番: カール・ラガーフェルド宅の書斎
  - row, columnの定義が難しい
  - 各棚に固有番号を付けることは可能
  - 固有番号の棚がどこにあるかを探すのは不可能
  - idea: shelfNoが(部屋の)画像のどの部分に対応するか図示 (例: http://blog.digit-parts.com/archives/52006177.html )
JavaFXのダイアログで×ボタンを無効にする方法

JavaFXのダイアログで×ボタンを無効にする方法です。Dialog#getResult()メソッドの結果がnullになることを利用します。

```java:×ボタンを無効
        Alert alert = new Alert(AlertType.INFORMATION);

        // ダイアログの×ボタンを無効にする
        alert.getDialogPane().getScene().getWindow().setOnCloseRequest(e -> {
                if (alert.getResult() == null) {
                    e.consume();
                }
        });

        alert.showAndWait();
```

#Dialog<R>#initStyleメソッドを使う方法

JavaFXのダイアログAlert、ChoiceDialog、TextInputDialogはDialog<R>クラスのサブクラスです。このクラスの[initStyleメソッド](https://docs.oracle.com/javase/jp/8/javafx/api/javafx/scene/control/Dialog.html#initStyle-javafx.stage.StageStyle-)を使うことによって、タイトルバーを非表示にできます。結果、×ボタンが表示されないです。@y_q1m さん情報ありがとうございます。

以下はメソッドの定義です。

> public final void initStyle(StageStyle style)

引数は[列挙型StageStyle](https://docs.oracle.com/javase/jp/8/javafx/api/javafx/stage/StageStyle.html)です。以下の定数があります。

+ DECORATED
+ TRANSPARENT
+ UNDECORATED
+ UNIFIED
+ UTILITY

このうち、DECORATEDが初期値です。タイトルバーを非表示にするには、TRANSPARENT、UNDECORATEDを使います。

##キャプチャ

以下のソースで定数を変えてダイアログを表示してみました。

```java:検証のソース
        StageStyle stageStyle = StageStyle.[定数];
        Alert alert = new Alert(AlertType.INFORMATION);
        alert.initStyle(stageStyle);
        alert.setContentText(stageStyle.toString());
        alert.showAndWait();
```

![DECORATED.png](https://qiita-image-store.s3.amazonaws.com/0/133921/d5e1541f-730b-6310-bd77-35209f6cc3e7.png)

![TRANSPARENT.png](https://qiita-image-store.s3.amazonaws.com/0/133921/7f32e3a3-36eb-fef8-c3a0-393c81932f68.png)

![UNDECORATED.png](https://qiita-image-store.s3.amazonaws.com/0/133921/d078d3be-9228-0219-54a4-46c0d7057c58.png)

![UNIFIED.png](https://qiita-image-store.s3.amazonaws.com/0/133921/78aa8b46-c432-0faa-cb3c-1199eda646b2.png)

![UTILITY.png](https://qiita-image-store.s3.amazonaws.com/0/133921/4b5133d2-5b5c-8730-ce1e-3b3744a87827.png)

TRANSPARENTは透明な背景になるはずですが、今回の検証では透明になりませんでした。


#編集履歴

20160911

+ 「Dialog<R>#initStyleメソッドを使う方法」を追加。
絵文字(emoji ZWJ Sequences)をJavascriptで操作する

<blockquote class="twitter-tweet" data-lang="ja"><p lang="en" dir="ltr">Woah, you can an ES6 spread to see what an emoji is made up of <a href="https://t.co/zvurJsfnzj">pic.twitter.com/zvurJsfnzj</a></p>&mdash; Wes Bos (@wesbos) <a href="https://twitter.com/wesbos/status/769228067780825088">2016年8月26日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

## emoji ZWJ Sequences
複数の絵文字を一つの絵文字として表示する `Emoji ZWJ Sequences` というものがあります。`Emoji ZWJ Sequences` は構成している絵文字を操作出来ます。

### Chromeのコンソールからのコピペです

```js
/* 通常の絵文字 */
[...'‍💏']
// -> ["‍", "💏"]

/* emoji ZWJ Sequences */ 
[...'‍👩‍❤️‍💋‍👨']
// -> ["‍", "👩", "‍", "❤", "️", "‍", "💋", "‍", "👨"]
'‍👩‍❤️‍💋‍👨'.replace('👩', '👨')
// -> "‍👨‍❤️‍💋‍👨"
'‍👨' + '🏿'
// -> "‍👨🏿"
'‍👨🏿' - '🏿'
// -> NaN 引くことは出来なかった...
```

### 参考
- [Emoji ZWJ Sequences Catalog, v3\.0](http://unicode.org/emoji/charts/emoji-zwj-sequences.html)
- [Full Emoji Data, v3\.0](http://unicode.org/emoji/charts/full-emoji-list.html)
- Chrome Canary以外では未確認
Inventory / unity > code v0.8 > 運用開始 / 保留事項

```txt:ビルド環境
Unity 5.3.5-f1 on MaxOS X El Capitan
```

在庫表示システム。
関連: v0.1 http://qiita.com/7of9/items/076cf5aaff7095bb876d

## v0.8までの変更

- amount項目追加、表示
- check date項目表示
- ソフトバージョン表示
- csv読込み時、1項目にカンマが入っている場合の対応
- androidビルド設定追加
- 画面サイズ自動調整機能追加

[v0.8 @ github](https://github.com/yasokada/unity-160820-Inventory-UI/releases/tag/v0.8)


## 実行例

304SH(android スマホ)を使用。

縦画面
![Screenshot_2016-08-27-08-51-10.png](https://qiita-image-store.s3.amazonaws.com/0/32870/621cf2af-82fd-8c6b-1a4e-de10ad1b9a1e.png)

横画面
![Screenshot_2016-08-27-08-51-14.png](https://qiita-image-store.s3.amazonaws.com/0/32870/63a0085f-e4e1-93c5-033a-baef212d2c5b.png)


その他、以下の環境で確認した

- Windows 8.1 pro (64bit)
- MacOS X El Capitan

僕自身は日常の使用時には304SHを使うだろう。

iPad mini4での動作は確認していない。Appleに有償登録しないといけないから。

## 保留中の事項

- Inventory情報の更新について
  - v0.8ではInventory.csv自体を書き換えることになる
  - git pullした時に僕のInventory.csvがユーザのファイルを書き換える
  - データ消失対策として、Inventory.csvを適宜バックアップしてもらう
- ソフトからのInventory更新機能
  - UDP経由を検討した
  - その場合、UDPで流すインターフェイスが別途必要
  - 作業量が多いので保留とした
- 名前検索
  - 大文字小文字区別している (case sensitive)
  - 大文字(か小文字)に統一して検索する方が使い勝手がいいかもしれないし、それは余計なことかもしれない
- 列飛び、行飛び未対応
  - 後述

### 列飛び、行飛び

列飛び (BとCの間がない)

| 1 | 2 | 3 | 4 |
|:-:|:-:|:-:|:-:|
| A  | B  |   | C |
| D  | E  | F  | G  | 

行飛び (AとIの間がない)

| 1 | 2 | 3 | 4 |
|:-:|:-:|:-:|:-:|
| A  | B  | C  | D |
|   | F  | G  | H |
| I | J  | K  | L  |

上記のようなInventory.csvの場合、BからCへ飛ぶ機能は未実装。
同様にAからIに飛ぶ機能も未実装。

実装するためには行末、最後列という余分な情報が必要となる。

飛ぶ部分にも"empty"という名前で登録するという運用で使ってみることとした。
SSH Reverse Port Forwarding で鍵ごとにlistenできるポートを制限する

2023-04-29 追記
OpenSSH 7.8以降ではパッチなどあてなくても`PermitListen`を使うとリバースフォワードするクライアントがsshサーバ上でLISTENできるポートを制限できます。


Tunnel Broker をつくるみたいな稀な用途でしか必要にならなさそうですが、（リバースでない）普通のポートフォワーディングをやるときの`permitopen`の要領で、リバースポートフォワーディングのセッションがサーバ側でlistenするポートを制限できる`permitremoteopen`を有効にするパッチが公開されていたので、試してみた。

https://github.com/antonyantony/openssh/

Ubuntu 16.04で、既にaptでopensshが導入済みの状態でインストールしてみる。

```bash
$ apt-get update && apt-get install -y build-essential zlib1g-dev libssl-dev git
$ git clone https://github.com/antonyantony/openssh.git
$ cd openssh
./configure --prefix=/usr --sysconfdir=/etc/s
sh --with-md5-passwords --with-privsep-path=/var/lib/sshd
$ make install
$ systemctl stop ssh
$ systemctl start ssh
```

authorized_keysに鍵ごとに許可するポートを記述する。

```authorized_keys
permitremoteopen="8004" ssh-rsa AAAAB3NzaC1yc2EAAAADAQ.....
```

クライアント側でsshを実行する。

```bash
$ ssh -v -N -R 8004:localhost:1880 miminashi@160.16.xxx.xxx
.
.
.
Authenticated to 160.16.66.104 ([160.16.66.104]:22).
debug1: Remote connections from LOCALHOST:8004 forwarded to local address localhost:1880
debug1: Requesting no-more-sessions@openssh.com
debug1: Entering interactive session.
debug1: client_input_global_request: rtype hostkeys-00@openssh.com want_reply 0
debug1: remote forward success for: listen 8004, connect localhost:1880
debug1: All remote forwarding requests processed
```

成功したっぽい。

次は、8005を指定してみる。

```bash
$ ssh -v -N -R 8005:localhost:1880 miminashi@160.16.xxx.xxx
.
.
.
Authenticated to 160.16.66.104 ([160.16.66.104]:22).
debug1: Remote connections from LOCALHOST:8005 forwarded to local address localhost:1880
debug1: Requesting no-more-sessions@openssh.com
debug1: Entering interactive session.
debug1: client_input_global_request: rtype hostkeys-00@openssh.com want_reply 0
debug1: Remote: Server denied remote port forward request.
debug1: remote forward failure for: listen 8005, connect localhost:1880
Warning: remote port forwarding failed for listen port 8005
debug1: All remote forwarding requests processed
```

無事失敗した。

とりあえず動くかどうか試したかったので行儀の悪い入れ方をしたけど、`apt-get source`でソースコードとってきてパッチあてたほうがいい気がする。
Sublime Text コマンドラインオプション 覚書

``subl -h`` または ``sublime_text -h`` を実行した場合に表示される
英文ヘルプメッセージの日本語訳。

#概要

```bash
sublime_text [arguments] [files]
sublime_text [arguments] [directories]
```

指定したファイルを編集、
または指定したディレクトリを開く。

#引数:

##``--project <project>``

指定したプロジェクトを読込む。

##``--command <command>``

指定したコマンドを実行する。

##``-n, --new-window``

新しいウィンドウを開く。

##``-a, --add``

現在のウィンドウへフォルダを追加する。

##``-w, --wait``

ファイルが閉じられるまで待機する。

##``-b, --background``

アプリケーションをアクティブにしない。

##``-h, --help``

ヘルプを表示する。

##``-v, --version``

バージョンを表示する。

ファイル名に ``:line`` または ``:line:column`` 接尾辞を指定すると
ファイルを開くと同時に指定した位置まで移動する。
unity > error CS0117: `System.Text.RegularExpressions.RegexOptions' does not contain a definition for `Compiled'

```txt:動作環境
Unity 5.3.5-f1 on MaxOS X El Capitan
```

http://qiita.com/7of9/items/e9b593495d5b2c0931f3
の実装をUnityプロジェクトに適用し、Player実行をすると以下のようなエラーが出るようになった。

> error CS0117: `System.Text.RegularExpressions.RegexOptions' does not contain a definition for `Compiled'

以下を見つけた。
http://answers.unity3d.com/questions/223915/regexoptions.html
> Edit -> Project Settings -> Player -> Optimization
Api Compatibility Level => .NET 2.0

APIの設定が.NET 2.0 subsetではだめで、.NET 2.0に変更したらエラーがでなくなった。
Vector Tiles to start in Japan (using Govt. Data)

貴重な情報をシェアしていただいた FOSS4G 2016 in Bonn 参加の精鋭の皆様に「帰国したら日本でもベクトルタイル時代が始まっていた」という状況をプレゼントしたく、国土数値情報の燃料給油所データのベクトルタイルを作成し、gh-pages でホストしてもらいました。

ベクトルタイルを、進めましょう🌈

repository: https://github.com/hfu/p07-15
sample site: https://hfu.github.io/p07-15/
vector tiles: https://hfu.github.io/p07-15/p07-15/{z}/{x}/{y}.pbf
to inspect data: https://github.com/hfu/p07-15/blob/master/07.geojson

tippecanoe と ogr2ogr と Mapbox GL JS と、あと何より、素晴らしく野心的で優秀なプロダクト、gh-pages に感謝です。

GitHub のレポジトリが、ベクトルタイルのような多数ではあるが総量が小さいファイル群を受け入れてくれること、gh-pages が、スタティックであればそうとう幅広くHTTP/HTTPS ホストをしてくれることがポイントです。（ベクトルタイルにおいては、HTTPS ホストをしてくれるというのがかなり重要になります。）多少のファイル配置のコンベンションが整理されたなら、うまくやると、ジオスペーシャルオープンデータのプラットフォームを取ってしまうくらい有望かもしれません。

そのわけは、「オンラインデータ」ということを実現しやすい仕組みになっている、というところですね。

通信コストの回収モデル次第で、既存の、より「発信者回収型」のサービスとどちらが前に出るか決まるのではないかな、と思います。物事の本質としては、地理空間情報の受益者は発信者であるべきではないので、発信者からの回収は、妥協であるとはいえ本質を捉えてはいない。とはいえ、配信にコストはかかる。本質を捉えてしかも事業として成立するモデルが、来るべきモデルでしょう。

gh-pages について、唯一、望むらくは、と思ったわがままは、拡張子 pbf では通信路 gzip 圧縮を効かせてくれると更に速くなるのかもしれない、ということくらいでしょうか。

※メモ：実際上、git 及び github.com の性質からして、ファイル数は3万くらいまでが現実的な中のギリギリでしょう。ちなみに、mokuroku が公開されているので周知の事実ですが、標準地図のタイル数は5000万程度あります。

背景地図の地理院化と燃料給油所ベクトルタイルのデータドリブンビジュアライズ化は、あとの楽しみにとっておいています✨
技術英語 > [to the tune of] $1.6 billion 

@ Code Complete (No. 9786 / 36077)

> Gerald Weinberg reports that in the 1970s, a comma was used in a Fortran FORMAT statement where a period should have been used. The result was that scientists miscalculated a spacecraft's trajectory and lost a space probe-<font color=red>to the tune of</font> $1.6 billion (Weinberg 1983).

http://eow.alc.co.jp/search?q=to+the+tune+of
> 1. ～という多大な額で、～の額で、～の額まで、～もの、～の程度まで、～に達して、大枚

[マイルとメートルの違いだけ](http://edition.cnn.com/TECH/space/9909/30/mars.metric.02/)でなく、","と"."の使い方の違い(1000の単位とするか、少数点とするか）でもこういう失敗をしていたようだ。
Next lexicographical permutation algorithmについてのメモ


参考というか大元です

* [Next lexicographical permutation algorithm
](https://www.nayuki.io/page/next-lexicographical-permutation-algorithm)

　HackerRankの問題を解いていたらつまづいた問題を解くために必要なアルゴリズム。以前どこかで見知った気もするが、覚えていないので、今回学んだことを整理しておく。
　
　Next lexicographical permutation algorithmは、「辞書順での次の順列を求めるアルゴリズム」とでも訳したらいいのかな。lexicographical　orderといったほうが一般的かもしれない。

## 問題
* 初めに文字列 S が与えらる。
* その文字列 S の文字の順序を入れ替えて S’ を作成する。
* このS'は辞書順で S よりも後に来るものとする。
* 複数パータンある場合は「辞書順で S よりも後」かつ「辞書順で最小のもの（次にくるもの）」を作成する。

具体的には、文字列S＝```xyzikdcba```というが与えられたら、この文字を入れ替えて辞書順で次に来るS'＝```xyzkabcdi```を作成するアルゴリズムです。

### 辞書順について
　私も詳しくないため言葉で説明するのは難しいので、実際にプログラムで見てみましょう。

```sh
scala> "abcd".permutations.toList.sorted
res1: List[String] = List(abcd, abdc, acbd, acdb, adbc, adcb, bacd, 
                          badc, bcad, bcda, bdac, bdca, cabd, cadb,
                          cbad, cbda, cdab, cdba, dabc, dacb, dbac, 
                          dbca, dcab, dcba)
```

　これが`a``b``c``d`の４文字を組み合わせた時の辞書順になります。そして、例えば`badc`が与えられたら、`bcad`を見つけ出すのが、このアルゴリズムです。

　文字数が数文字ならばアルゴリズムには頼らず、ライブラリで順列を算出し、それをソートしてあげれば簡単に求まります。しかし文字数が、数十文字、数百文字となると順列のパターンもどんどん増えていくので、効率的に解くためにはアルゴリズムが必要になります。
　
## 解説
文字だとわかりづらいので解説では数字に置き換えて考える。コンピューター中では文字も数字なので同じことです。

> S  = 0 1 2 5 3 3 0 
> S' = 0 1 3 0 2 3 5

### 処理手順
Sの末尾から順に探索して、昇順が終わる位置を探す。

```
    5の次に2が来るので昇順終了　  
      ↓ 　  ← 末尾からみて昇順(0335)
0  1  2  5  3  3  0　
```

昇順を終わらせた値[ 2 ] をpivotと呼び、末尾からみて昇順になっている部分をSuffix[ 5 3 3 0 ]とよびます

```
　  pivot
      ↓  　
0  1  2 |5  3  3  0|
        |  Suffix  |
```

Suffixの中から、pivotよりも大きくて、Suffixの中で最小を値[ 3 ]を見つけ出す。

```
　  	pivotより大きくて、suffixの中で最小
               ↓  　
0  1  2 |5  3  3  0|
      ↑ |  Suffix  |　
    pivot
```

そして、pivotと[ 3 ]を入れ替えます。[ 0 1 3 5 3 2 0] 

```
　        swap
      ↓￣￣￣￣￣↓  　
0  1  3 |5  3  2  0|
        |  Suffix  |　
```

最後に、入れ替えたSuffix [ 5 3 2 0 ]　の部分だけを昇順ソートしすると完成します。
   
```
0  1  3 |0  2  3  5|
        | asc sort |　    
```

### Scalaでプログラミング

javaやcなどは、上記したリンク先にあるので、そちらを参考にしてください。

```scala
object NextLexicographicalPermutation {
  def main(args: Array[String]): Unit = {

    val N = io.StdIn.readInt()
    for (i <- 0 until N) {
      val str: String = io.StdIn.readLine()

      // Sの末尾から順に探索して、昇順が終わる位置を探す。
      var i = str.length - 1
      while (i > 0 && str(i - 1) >= str(i)) {
        i -= 1
      }
      // 昇順が終わらせた値のindex
      val pivotIndex = i - 1

      if (pivotIndex < 0)
        // pivotがなかった場合
        println("nothing")
      else {
        // pivotと,Suffix内の値を入れ替える
        var j = str.length - 1
        while (str(j) <= str(pivotIndex)) {
          j -= 1
        }
        val swapIndex = j
        val strBuf = str.toBuffer
        strBuf(pivotIndex) = str(swapIndex)
        strBuf(swapIndex) = str(pivotIndex)

        //入れ替えおwたSuffixをソートしたのち組み合わせて完成
        val newStr = strBuf.mkString
        val prefix = newStr.substring(0, pivotIndex + 1)
        val suffix = newStr.substring(pivotIndex + 1)
        val sortedSuffix = suffix.sorted
        println(prefix + sortedSuffix)
      }
    }
  }
}
```
Swift弄ってみた。


iOS弄ったことなかったので、取り敢えず本を買って一週間で動くモノを作ってみました。

クロスプラットフォーム開発用のフレームワークも幾つか検討しましたが、Android端末は持っていないのと、どっぷりマカーなので今後のことも考慮し、Swiftで組んでみました。


[参考書](https://www.amazon.co.jp/dp/B018JMSUPC/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1)：噂通り、絶対に挫折しないくらいわかりやすい本でした。次は何を買おうか考え中。

#プラグイン管理
[Alcatraz](http://alcatraz.io/)
[cocoapod](https://cocoapods.org)


#使ったプラグイン
[Realim](https://realm.io/docs/swift/latest/)
[BarcodeScanner](https://cocoapods.org/pods/BarcodeScanner)


#作ったもの
バーコード読み込んで一覧表示し
データ削除とデータ送信(メール)できる棚卸アプリ。

※似たような機能実装でクラウド発注されてる案件があったので腕試しに。


#嵌った箇所
画面遷移がイマイチわかりづらかった。ストーリーボードを使った方法と、コードからの直指定とポップアップを織り交ぜながら騙し騙し実装。

データの永続化は、配列操作が面倒くさかったのでRealmSwiftを利用。もの凄く便利、初心者でもスグに使える。作ってくれた人ありがとうございます。

メール送信部分とかはPHPと殆ど一緒で楽ちん。

バーコード読取部分については、2日ぐらい格闘したけど時間が足りず、自分自身の理解不足もあって間に合いそうになかったのでプラグイン利用しました...orz

それでも多少は中身を弄って自分仕様にカスタマイズしたけど...。


#簡単なアプリ？を一本作ってみた感想
はじめは参考書どおりストーリーボードを利用して画面遷移を指定してたけど、コードで指定した方が楽な気がする。

環境設定とか考えたらRubyより楽だけど...メモリ管理とかドキュメント類(基本英語)を考えたらハードル高めかも。
でもCSSやJavaScript、SQLとかサーバサイドの周辺知識を覚えること考えたらiOSの方が学習コスト低いのかな？？？

わざわざネイティブで作らなくても[monaca](https://ja.monaca.io)とかで実装すれば、Ruby学習で培ったWeb知識を無駄にせずWebアプリくらいは作れる。

スマホ開発だと、より計算コストや設計、構成、デザインパターンなど真面目に考えないと破綻する。
そういう時は[MMVCペース開発](http://qiita.com/susieyy/items/2af5321b287b8d2f49f6)とか、[RubyistがSwift開発](http://qiita.com/merrill/items/079999aa064f0df9baf7)など、先人達の知恵を拝借しながら一歩一歩、前に進むしかない。

初心者のうちは、RailsのMVCモデルに乗っかるだけの方が楽かもしれない。
とりあえずiOS(Swift)とRubyで何本かアプリ実装して、スキルUpを目指します。
サーバー監視ツール Xymon

## Xymon
Xymon はグラフィカルな監視を提供する。
各デバイスのさまざまなネットワークサービスのステータスを表示し、定義されたレベルのダウンタイム後にキューに入れられたメールメッセージの数を一覧表示するなど、さまざまなアプリケーションおよびオペレーティングシステムのメトリクスを提供する。

## 歴史
ネットワークモニタリングアプリケーションである Big Brother のオープンソース版に触発され、その下位互換性を維持している。
2002年から2004年の間に Henrik Storner が bbgen ツールキットと呼ばれるオープンソースのソフトウェアアドオンを作成し、2005年3月に Hobbit という名のスタンドアロンバージョンをリリースした。
Hobbit の名称で2008年までリリースされたが、Hobbit の商標が既に存在していたため Xymon に改名された。[3] 2012年1月、Quest SoftwareはBig Brotherの開発を中止しました。[4]

## インストール
### リポジトリの追加
#### Terabithia RPM package for Xymon Monitor
```bash
curl -O /etc/yum.repos.d/xymon.repo -L https://terabithia.org/rpms/xymon/terabithia-xymon.repo
```
#### EPEL リポジトリ
```bash
yum install epel-release
```
### Xymon のインストール
```bash
yum install xymon xymon-client
```

```bash
systemctl enable xymon-client
systemctl enable xymonlaunch
```
```bash
systemctl start xymon-client
systemctl start xymonlaunch
```

![xymon1.png](https://qiita-image-store.s3.amazonaws.com/0/15175/77a12e73-4853-684e-abd4-786415f3b352.png)

![xymon2.png](https://qiita-image-store.s3.amazonaws.com/0/15175/fdd55b18-61e2-54f6-d956-276a0f9012c2.png)

## モニタリング関連記事
* [サーバー監視ツール Munin](http://qiita.com/bezeklik/items/c4863c4114e0c339412b)
* [サーバー監視ツール Xymon](http://qiita.com/bezeklik/items/0f1234d8c9a2b54ec986)
* [サーバー監視ツール Zabbix](http://qiita.com/bezeklik/items/1f638727d6485ce9b931)
OS X EL Capitan にアップグレードした後、無線ルータが繋がらなくなった事象の対処法


# 環境
- max OS EL Capitan
- バージョン:10.11.6
- 無線ルータ:buffalo WZR-300

# 事象
macBookProのOSをアップグレード後に自宅の無線ルータにつながらくなった。

**■確認できたこと**

- 有線LAN接続はOK
- iPhone6SのテザリングからのWifi接続もOK

# 実施したこと
ネットに載っていた下記を参考にしたが結局解決できなかった。

- [OS X El Capitan で 有線LANが繋がらなくなった時の解決事例](http://qiita.com/masu77/items/6b51755e5f835767aa76)
- [Mac OS X El Capitanのよくある不具合と
解決策](https://www.imobie.jp/support/mac-os-x-probelms-and-solutions.htm)



最終的には実施したことは、buffalo WZR-300で対処した下記2点を行ったことで解決した。

1.ファームウェアを最新にアップデート(1.99へ)
2.無線設定>基本(11n/g/b)で、倍速モードの帯域を`40Mhz`から`20/40MHz 自動選択`へ変更

**※直ったものの根本原因かどうかは未調査**

![スクリーンショット 2016-08-27 2.01.21.png](https://yamaru.qiita.com/files/f5b2744f-958b-77aa-5e89-9812947f2d1a.png "スクリーンショット 2016-08-27 2.01.21.png")
Swiftで軽量バリデーターを作ってみた


追記：Swift3.0にバージョンアップしました。


今回突発的にバリデータを作りました。
ただ単に、作った内容を紹介するだけでなく
何故作ったのか？作る過程、
といった側面も含めてまとめてみました。

#【キッカケ】
OSS活動や、登壇、執筆などパブリック活動しないと、エンジニアとしての個人ブランドが育たない。
そのままだと業界の中央や、面白そうな箇所に介入したくても難しくなる。
結局、古めかしいクローズな環境にしか身をおけず、時代遅れはまだしも、
歴史館においてある蝋人形のモブキャラになりかねないと思ったため。

#【期間】
衝動的に作ったので、コアとなる部分は、半日かかってないかも。
どちらかと言えば、その後のテストとかプリセット作成、
ライブラリ公開に関わる作業の方が時間かかってる。

#【なぜそれを作った】
丁度探してたのもあるけど、
エレベーターピッチじゃないけど、エレベーターに乗ってる間に、イメージ付いてしまったので
会社についてすぐに紙とペンで書いてたら、「あ、もういいや、これ作っちゃおう」と思ったから。


#【どのように作った】
上にも書いたけど、衝動的だったので朝の20分から40分ぐらい。
紙とボールペン使って、構造や流れが大体把握できるまで走らせた。

その後、その日のオヤツ時間から夕食ぐらいまで紙からコードに憑依させた。
Ω＜お前に生命を吹き込んでやる!!  タカタカッッ…ターーッン！

その後に細かい拡張、バグ、テスト、公開に時間かけた。
Ω＜お前に魂があるのなら…応えろ!! タカタカッッ…ターーッン！


# 【ライブラリ】
https://github.com/mothule/RNMoVali


#【なぜ英語】
勉強。構文とか単語とか間違ってるのは分かって書いてる。
ネイティヴの英会話の先生に
>「私の話してる日本語に間違いが多くても、あなたたち日本人は、何が言いたいか推測できるでしょ？私たちも一緒。大体何伝えたいか分かっから怖がらず考えすぎず話しなさい」

って言われてから、頑張ってる。

#【ライブラリ説明】
ポリシーはシンプルでお手軽。目的からブレない。目的はモデルの検証。

classのインスタンス変数に対して、コード上で制約を複数個つけれる。検証は必要になったタイミングで検証メソッドを対象インスタンス渡してコール。

結果は戻り値に帰ってきて、無効/有効判定と無効だったエラーメッセージが入ってる。

エラーメッセージは制約毎ではなく、インスタンス変数に紐付く制約毎に設定できる。(しないといけない)

#【使い方】

検証したい Model に RNValidatable を実装する。

~~~swift
class ProfileEntity : RNValidatable {
    var firstName:String
    var lastName:String

    init(firstName:String, lastName:String){
        self.firstName = firstName
        self.lastName = lastName
    }

    func bindConstraint(binder: RNConstraintBinder) {
        binder.bind(firstName, accessTag: "firstName")
            .add(constraint:RNConstraintLength(max: 10, errorMessage: "Invalid range"))
            .add(constraint:RNConstraintAlphabet(errorMessage: "Only alphabets."))
        binder.bind(lastName, accessTag: "lastName")
            .add(constraint:RNConstraintLength(max: 10, errorMessage: "Invalid range"))
            .add(constraint:RNConstraintAlphabet(errorMessage: "Only alphabets."))
    }
}
~~~


RNValidatorの検証メソッドを呼んで、先ほどの Model を渡すと、結果が帰ってくる。

~~~swift
let results = RNValidator.sharedInstance.validate(model)
if results.isInvalid {
    if let firstNameErrorMessages = results.fields["firstName"] {
        firstNameMessageLabel.text = firstNameErrorMessages.messages.joined(separator:"\n")
    }
    if let lastNameErrorMessages = results.fields["lastName"] {
        lastNameMessageLabel.text = lastNameErrorMessages.messages.join(separator:"\n")
    }
}
~~~


よろしかったら使ってみてください。

いーーーじょぅ！ :)
OpenSSH秘密鍵の中身

# はじめに
OpenSSHのコマンドで生成されるRSA鍵ペアについて、
なぜ秘密鍵id_rsaから公開鍵を作り出せるのか疑問に思いましたので調べてみました。


# RSA鍵ペアの概要

大きな２つの素数を$p$,$q$とした場合、

```math
N = pq \tag{1}
```

以下(2)を満たす変数を$L$とする。

```math
L = lcm(p-1, q-1) \tag{2}
```

さらに、次の式(3)を満たす変数を$E$とする。

```math
gcd(E, L) = 1 \tag{3}
```
最後に、式(4)を満たす変数を$D$とする。

```math
ED≡1 (mod L) \tag{4}
```

※ lcm(x,y)はx,yの最小公倍数(Least Common Multiple)
※ gcd(x,y)はx,yの最大公約数(Greatest Common Divisor)

ここまでで求めた$(E, N)$のペアが*公開鍵*, $(D, N)$のペアが*秘密鍵*になります。
また、$E$,$D$を現実的な時間で求めるには最初の素数$p$,$q$を知っている必要があります。

# OpenSSHでのRSA鍵ペア生成
OpenSSHの`ssh-keygen`コマンドでRSA鍵ペアを作成すると

```
$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/vagrant/.ssh/id_rsa):
Enter passphrase (empty for no passphrase): (Enter)
Enter same passphrase again: (Enter)
```

公開鍵`id_rsa.pub`と秘密鍵`id_rsa`が生成されます。

ssh-keygenの`-y`オプションはヘルプを見てみると

```
-y          Read private key file and print public key.
```
と書かれており、秘密鍵を入力とし、公開鍵を出力することができます。

# 今回の疑問点
上記の式(4)で, $ED≡1$は$DE≡1$とも書けますので、

 - なぜ秘密鍵から公開鍵が求められるのか？
 - 秘密鍵Dから公開鍵Eを生成できるなら、逆に公開鍵から秘密鍵を作ることもできてしまうのでは？

という疑問が浮かびましたので、調べました。

# id_rsaから公開鍵を生成できる理由

> なぜ秘密鍵から公開鍵が求められるのか？

答え：ファイルid_rsaには最初に作られる**素数p,qも含まれている**。

これは`openssl`を利用すると確認することができます。

```
$ openssl rsa -text -noout < id_rsa
modulus:
    00:dc:dc:dd:17:bb:10:3d:16:ee:cf:e7:bc:ec:e1:
             ...
publicExponent: 65537 (0x10001)
privateExponent:
    0f:73:a0:40:2d:c5:28:10:f7:aa:31:f3:44:bb:4a:
             ...
prime1:
    00:fe:d0:9b:2a:40:b4:7c:d1:29:05:ae:a2:46:06:
             ...
prime2:
    00:dd:e3:d5:27:48:30:d0:3b:77:de:a8:70:a5:8f:
             ...
exponent1:
    6e:94:e7:11:92:1d:01:a1:df:94:98:b1:d1:84:0b:
             ...
```
上記の[prime1], [prime2]が素数p,qになります。

> 秘密鍵Dから公開鍵Eを生成できるなら、逆に公開鍵から秘密鍵を作ることもできてしまうのでは？

答え：ファイルid_rsa.pubにはE,Nしか含まれていないので、秘密鍵を作ることはできない。
pylint 出力結果の警告についての備忘録

pylint を使って、コードを出来るだけ綺麗に書こうと思ったので、
警告の意味を備忘録として残すことにしました。

# 環境
・ Ubuntu 16.04
・ Python 2.7.11 :: Anaconda 4.1.0 (64-bit)

# インストール方法

```
$ pip install pylint
```

# 実行方法

```
$ pylint hoge.py
```

# 警告一覧

とりあえず、内容がわかったことだけ追記していく。

## Missing module docstring (missing-docstring)
   1行目に、以下のように、コメントを入れると良いらしい

```
"""This is a test program."""
```

## Unused matplotlib.pyplot imported as plt (unused-import)
   この例では、matplotlib.pyplot を import したが、使用していない。

```
import matplotlib.pyplot as plt
の行を削除した
```

## Invalid constant name "model" (invalid-name)
   この例では、model という名称が悪いらしい。

```
constant の場合、(([A-Z_][A-Z0-9_]*)|(__.*__))$
の規則に従って命名するので、MODEL という名称にした
```

## Module 'numpy.random' has no 'randn' member (no-member)

```py:sample.py
'''This is a test program.'''                           
import numpy as np                                      


print np.random.randn(6, 4)
```

上記のサンプルコードで引っかかったエラーだが、正常に動作したので、
以下のように、~/.pylintrc のファイルを新しく生成し、
下記のように numpy.random の判定を除外した。

```~/.pylintrc
[TYPECHECK]
ignored-modules = numpy.random
```
ログインシェルが設定されていないユーザへsuする


## 内容

ログインシェルが設定されていないユーザに、無理やりsuする。

## 検証

▼ログインできないテストユーザ「test01」を作成。

``` sh
useradd -s /usr/sbin/nologin test01
```

▼test01にsuコマンドで切替

``` sh
su - test01

This account is currently not available.
```

▼ログインシェルを指定して切替

``` sh
su -s /bin/sh test01

sh-4.2$
```

ログインできた。
Cocoaの機能を使ってRemindersで新規リストを作成するAppleScript


* Reminders.appにはAppleScript用語辞書があり、リストを作成できる
* Cocoaでは`EKEventStore`クラスと`EKReminder`クラスを使ってリストを作成する
* 下2つのAppleScriptは同じ操作
	* Cocoaの機能を使った方はReminders.appを起動しなくても使える


```make_new_list_in_Reminders_from_pure_AppleScript.scpt
tell application "Reminders"
	make new list with properties {name:"New List from pure AppleScript"}
end tell
```

```make_new_list_in_Reminders_from_ASObjC.scpt
use framework "EventKit"

set eventStore to current application's EKEventStore's alloc()'s initWithAccessToEntityTypes:(current application's EKEntityMaskReminder)
set calendar to current application's EKCalendar's calendarForEntityType:(current application's EKEntityTypeReminder) eventStore:eventStore
set calendar's title to "New List from ASObjC"
set calendar's source to eventStore's defaultCalendarForNewReminders's source
eventStore's saveCalendar:calendar commit:true |error|:(missing value)
```


## 更新履歴

* 2016-08-27: pure AppleScript版とASObjC版を作成
VagrantのゲストOSとホストOSをscpでファイルのやり取り

## やりたいこと

* vagrantで立ち上げた仮想マシン(ゲストOS)にホストOSからファイルをSCPで共有したい
* また、逆もやってみたい

### ホストOS > ゲストOS

```
$ vagrant ssh-config > ssh.config
$ scp -P 2200 -F ssh.config -r .vim vagrant@localhost:/home/vagrant/
```

このポート番号は、`vagrant ssh-config`で確認することが出来ます。

### ゲストOS > ホストOS

```
$ scp -P 2200 -F ssh.config vagrant@localhost:/home/vagrant/hoge.txt .
$ cat hoge.txt
ゲストOSで作ったファイル:
```
String#match


## 個人的なメモ

今まで、文字列を正規表現で引っ掛ける際は

```ruby
str = "2016-08-26 21:00"

if str =~ /\d+\-\d+\-\d+/
  puts $&
end

#=> 2016-08-26

```

を使ってた。でも次の方法だと、グローバル変数を使わなくていいみたい。

```ruby
str = "2016-08-26 21:00"

if var = str.match(/\d+\-\d+\-\d+/)
  puts var[0]
end

#=> 2016-08-26

```
MySQL バックアップのダンプコマンド

# mysqldump コマンド
## 基本コマンド
```bash
time mysqldump -u username -p ${db:=dbname} > ${db}_`date +%F_%H%M`.sql
```
`username` と `dbname` は自身の条件に合わせて変更のこと。

```bash:入力例
time mysqldump -u wordpress -p ${db:=wordpress} > ${db}_`date +%F_%H%M`.sql
```
`${db}` は書き換えないでよい。

##### **time コマンド**
データベースのサイズが大きいと時間がかかるため、目を離すとどれくらいかかって終わったのかが分からない。
`time` コマンドでかかった時間を以下のように出力させると次回以降の目安になってよい。

```
real    4m19.976s
user    4m42.802s
sys     0m7.899s
```

##### **標準変数**
`${db:=dbname}` とすると `$db` にデフォルト値として dbname が代入されて展開される。すなわち `${db:=dbname}` も `${db}` も `dbname` と展開される。

##### **コマンド置換** (command substitution)
バッククォート \` で囲むか `$()` でくくるとコマンド結果を展開してくれる。

##### **date コマンド**
日次をファイル名に自動で含めるために `date` コマンドを利用する。
`%F` は `%Y-%m-%d` と同じ。

## 圧縮ダンプ
```bash
db=dbname; time mysqldump -u username -p ${db} | gzip > ${db}_`date +%F_%H%M`.sql.gz
```
## 置換ダンプ
```bash
db=dbname; time mysqldump -u username -p ${db} | sed 's/www.example.jp/dev.example.jp/g' | gzip > ${db}_`date +%F_%H%M`.sql.gz
```
Movable Type や WordPress のデータベースを移行する際などに。

## 転送ダンプ
```bash
db=dbname; time mysqldump -u username -p ${db} | gzip | ssh example.com 'cat > ${db}_`date +%F_%H%M`.sql.gz'
```

## リストア
```bash
db=dbname; time zcat ${db}_YYYY-MM-DD_HHMM.sql.gz | mysql -u username -p ${db}
```
パイプを通すと変数が期待通りに渡らないならない模様。

## INSERT文を1行ずつ出力する
```bash
mysqldump -c --skip-extended-insert
```
`-c`(`--complete-insert`) カラム名を含んだデータを出力
`–skip-extended-insert` 1行ずつのINSET文を出力

# オプション一覧
## 接続
| オプション         |    | 説明 |
|:------------------|:--:|:-----|
|`--user`           |`-u`| ユーザー名 |
|`--password`       |`-p`| パスワード |
|`--host`           |`-h`| 未指定の場合は localhost |
|`--port`           |`-P`|  |
|`--login-path`     |    | MySQL 5.6 から。 |
## 挙動
| オプション         |    | 説明 |
|:------------------|:--:|:-----|
|`--force`          |`-f`| エラーが発生しても処理を継続させる。<br>未指定だとエラー時に処理が停止される。 |
|`--compress`       |`-C`| サーバー間でデータを圧縮して送信する。 |
## 指定
| オプション         |    | 説明 |
|:------------------|:--:|:-----|
|`--all-databases`  |`-A`| すべてのデータベースをダンプする。 |
|`--ignore-table`   |    | ダンプしないテーブルを指定できる。<br>`dbname.table_name` と指定。<br>複数テーブルを指定するには複数回使用する。 |
|`--no-data`        |`-d`| データ(`ISERT`文)を出力しない。 |
|`--no-create-db`   |`-n`| `CREATE DATABASE`文を出力しない。 |
|`--no-create-info` |`-t`| `CREATE TABLE`文を出力しない。 |
|`--complete-insert`|`-c`| `INSERT`文にカラム名を含める。 |
CygwinとUbuntu on Windowsで操作ログを記録できるようにしてみた

#狙い
teratermやPuttyで接続するときのようにCygwinやUbuntu on Windowsでも
操作ログをエビデンスとして残したいなと思ったのでscriptコマンドを.bashrcに組み込んでみた
(自分の管理用なので制御コードの除外は割愛)

#はまりどころ
scriptコマンドを適当に.bashrcに組み込んだら
挙動を全然理解していなかったので.bashrcがひたすら読み込まれ**多重起動地獄**

#解決策
##最初に起動する親プロセスの場合のみscriptコマンド実行する
Cygwinの場合は**/usr/bin/mintty**
Ubuntu on Windowsの場合は**/init**

##ps auxの結果を目的に一致するようにごちゃごちゃやって抽出
他のscriptコマンドでログ記録している方たちの情報を参照しつつ環境に合わせる
Cygwinのps結果は表示が少なかったりしたので合わせる
grep結果が複数該当するのでheadとかtailで1行抽出
sortで順番を変えたりする

#ソース
##Cygwin
```
P_PROC=`ps aux | grep "${PPID}" | awk '{print $8}' | sort | tail -1`
CMD_MINTTY=/usr/bin/mintty
if [ ${P_PROC} = ${CMD_MINTTY} ]; then
  script ${HOME}/log/$(date +%Y%m%d_%H%M%S)_$(whoami).log
fi
```

##Ubuntu on Windows
```
P_PROC=`ps aux | grep "${PPID}" | awk '{print $11}' | head -1`
CMD_INIT=/init
if [ ${P_PROC} = ${CMD_INIT} ]; then
  script ${HOME}/log/$(date +%Y%M%S)_$(whoami).log
fi
```
8/26　今日の学習内容～改訂３版「Ruby on Rails」cloud9でRuby on Railsを使えるように準備する！～

###今日の学習内容
***
今日は昨日届きました、「改訂３版 基礎 Ruby on Rails」を使ってRuby on Railsの学習を進めました。
>改訂３版 基礎 Ruby on Rails　https://www.amazon.jp/dp/4844338153

この本では、初心者や初学者が困らないようにRubyとRailsのインストール方法から説明してくれています。

ですが、環境設定が面倒ですし、早く使ってみたいので（←言い訳）、アプリケーションの開発やデータベースなどをクラウド環境で利用できるサービスである**cloud9**を利用することにしました(笑)
cloud9の使い方はドットインストールなどで説明されてますので、利用したことのない方は使い方を軽く見て頂けるとよろしいかと思います(*- -)(*_ _)ペコリ
>cloud9　https://c9.io
ドットインストール　https://dotinstall.com

![cloud9.png](https://qiita-image-store.s3.amazonaws.com/0/137880/46c01ae9-1f3f-4083-9b8d-b918a08f98d2.png)


↑cloud9の登録が済みましたら、workspaceのcreate a new workspaceを押してください。

![cloud9_2.png](https://qiita-image-store.s3.amazonaws.com/0/137880/d9abf61b-d384-1a3f-da65-10304ff912d9.png)

↑**workspaceの名前**を決めてください。私はmy_rails_appという名前にしました。
templateは**Blank**（templateなし）で行くことにします。
（一度Rubyを選択したのですが、本がcloud9を使う前提で書かれていないのでよく分からなくなったので、結局templateなしで始めることにしました(;´･ω･)）
名前とtemplateを決めたら**create workspace**をポチッとですね。

![cloud9_3.png](https://qiita-image-store.s3.amazonaws.com/0/137880/cbcc580a-18fa-fb8e-e863-85eb2ffefd46.png)

少し時間がかかる場合があるのでしばしお待ちを(;^_^A

cloud9のおかげで、面倒な環境設定は飛ばせたので、さっそくRailsを使う準備をしていきたいと思います(*'▽')

まず、**ターミナル**と呼ばれるコマンドを打ち込むところ（赤枠）に``gem install rails``と打ち込みます。
（``あなたの名前:~/workspace　$``のすぐ右横にそのまま打ち込んでください。）

すると...

![cloud9_4.png](https://qiita-image-store.s3.amazonaws.com/0/137880/a95c60d8-b6eb-0f56-a246-518a7b7a4d50.png)

↑のようにズラッとよく分からない文字列が流れてくるはずです(;'∀')

これはgemコマンドというものを使ってRailsをインストールしているわけなんですね。

**これでcloud9でRailsで開発する準備ができました！！**

次回は、「改訂３版 基礎 Ruby on Rails」の内容に従いつつ、今回、作成したworkspaceでRailsを使う準備を進めていきたいと思います。

###あとがき
***
やっとRailsに入りかけることができたでしょうか。
少しづつしか時間が取れていないので、進みが遅いですが(笑)
それにしても、cloud9は便利すぎますね。
私自身、一度ローカルで環境を構築しようと思ったのですが挫折しましたので、うまく構築できる自信がない方は、ぜひ最初からcloud9を使ってもらえればいいんではないでしょうか？(´-ω-`)
これからRuby on Railsの学習を進めていくきたいと思っています。初心者なりに頑張っていきますが、間違いがあれば指摘して頂ければ助かりますので、よろしくお願いしますm(__)m。（間違いを訂正できるだけでなく、先輩プログラマの方のお話は、とても勉強になりますので、少しでもあれ？違うんじゃないか･･･と思われたらご指摘下さい(*'▽')）

###参考にさせていただいたサイトなど
***
>cloud9はこれでバッチリ!Railsが使える環境設定をしよう！　https://blog.codecamp.jp/rails_cloud9
インプレス　「改訂３版基礎Ruby on Rails」
webpack --watch が vagrant 内の仮想環境で動作しない

## 現象
- `vagrant` で linux を立てている
- webpack を linux で実行している
- webpack の監視先は `vagrant/` 以下

これらの条件が当てはまるとき、通常の設定では `--watch` でコンパイルしてくれない。
これはファイルシステムの機能で実現しているため、`vagrant/` 以下は異なるファイルシステムであるために動かないという仕様。
(未確認だが、`vagrant/` 以下でなくともファイルシステムが異なる環境であれば現象が発生すると思われる。)

## 回避策

`webpack.config.js`  に以下の設定を追記する

```
watchOptions: {
  poll: true
}
```

設定の名前のとおり、ポーリングをするということ。
数値を入れるとポーリングの間隔をミリ秒で設定できる。  

```
watchOptions: {
  poll: 500
}
```

## ほか
今回の条件が絡まないケースでは[公式のトラブルシューティング](https://webpack.github.io/docs/troubleshooting.html#webpack-doesn-t-recompile-on-change-while-watching)にまとまっている内容を試すこと。

## 参考
- http://andrewhfarmer.com/webpack-watch-in-vagrant-docker/
間違ってauthorized_keysを消してしまってログインできなくなったEC2インスタンスにログインできるようにする方法

Linuxサーバでせっかく設定した`authorized_keys`を間違って更新したり、 `ssh-add -d`しようとして間違って `ssh-add -D`しちゃったりすると、いとも簡単にログインできなくなります。

これが、VPSだったりすると詰むのですが、EC2インスタンスだと解決できます。
この記事ではそのやり方のメモを残します。

# 手順の概要
1. 該当のEC2インスタンスを止めます。
2. ディスクをデタッチして外します。
3. 自分がrootになれる別のEC2インスタンスに、2のディスクをアタッチします。
4. そのEC2インスタンスにログインして、2のディスクをマウントします。
5. マウントしたディスクの中でauthorized_keysファイルを作ります。
6. ディスクをアンマウントしてログアウトします。
7. そのディスクを元のEC2インスタンスにアタッチして起動します。
    - その時、CentOS系だと `/dev/sda1`としてマウントしないと正しく起動しません。
8. 無事にログインできる事を確認します。

よかった… 本当によかった… :sob: 

# 注意点
- 該当のEC2インスタンスだけじゃなく、救助に使う方のEC2インスタンスも再起動が必要です。
    - 停止していないとディスクをアタッチ/デタッチできないため。
- `authorized_keys`を600にしたり、ユーザーID/グループIDを変更するのを忘れない事。
    - `chown ユーザーID:グループID authorized_keys` ←IDでも指定できる。

# 参考URL
- [ログインできないec2インスタンスを調査する | Developers.IO](http://dev.classmethod.jp/cloud/aws/ec2-investigate-detach-attach/)
- [EC2 のルートデバイスに EBS をアタッチする方法 - Qiita](http://qiita.com/dskst/items/302119452bc399414bae)
Groongaのインデックスの仕組みをおさらい


[Groongaで学ぶ全文検索 2016-08-26](https://groonga.doorkeeper.jp/events/48368)で学んだ事のまとめ。

# インデックスの基本

- インデックスは、キーを与えると対象のデータがどこに配置されているのかが分かる仕組み。
- 全文検索の場合は、文字列を分解したものを与えると、その文字列が含まれる文書が得られる。
    - 文字列の分解方式には、NGramや形態素解析のような方式がある。
    - インデックスのキーを語彙、それに対応する対象データをポスティングリストと言う。

# インデックスを使った検索
1. 検索するキーワードをインデックスのキーと同じ方式で分解する。
    - インデックスのキーには、文書をNGram等で分解したものが入っているので
2. 分解したキーワードでインデックスを検索し、対象のすべての語彙が含まれている文書を得る。
3. その文書の中に、分解前のキーワードが出現している事を確認する(後述)
    - していたら検索結果として表示する

### 分解前のキーワードが出現している
例えば「東京都」を検索する際、「東京」と「京都」に分解された場合、2の結果には「東京と京都」という文字列が含まれている文書も得られるが、これは意図した結果ではない。
そのため3において、2で得られた結果のそれぞれの文書に、キーワードが分解前の状態で含まれているのかを確認している。

1. PostgreSQLで全文検索する場合の確認方法
    - 2で得られた文書をすべてシーケンシャルに検索して、実際に含まれているかを確認する。
    - 長い文書が多い場合、検索のコストが高い。
2. Groongaでの確認方法
    - インデックス内に文書だけでなく、その文書内での出現位置も保持しているため、インデックスの検索結果だけで確認することができる。
    - 一般的にはインデックスのサイズがpg_bigmに比べるとデータ量が増える。
3. ※他の検索エンジンについても知っておきたい


# スコアリングについて
- スコアリングとは、検索された結果の表示順を制御するための仕組み。
- より検索した人の意図に近いと思われるものが先に出力されるようにするために用いられる。
- 複数の検索項目がある場合、確実性の高い(と思われる)項目や重要な項目がヒットした場合、そちらを優先して出すなど。
- 具体的な実装方法(どこまでGroongaに任せて、どこからをアプリ側で実装するか)については要学習。