OmniAICreator/Qiita-1.07M huggingface dataset:
String型変数が数字であるかチェックする方法の速さ比較

String型変数が数字である（0から9で構成されている）かチェックする方法がいくつかあります。この記事では以下の方法の速さを比較しました。

+ Character#isDigit()メソッドを使う。
+ Integer#parseInt()メソッドを使う。
+ String#matches()メソッドを使う。

実行環境は以下の通りです。

+ DELL VOSTRO 1540
+ Windows 10 Pro 32bit
+ Intel Celelron 2.00 GHZ
+ メモリ 2.0GB
+ HDは約300GB

#ソースと実行結果

以下のソースを使って比較しました。引数が数字で構成されているかのチェックです。各チェック方法を300000回ずつ繰り返し、経過したミリ秒を出力しています。

```java:ソース
package test;

import java.util.function.BooleanSupplier;

public class Test {
    private final static String reg = "\\d+";
    private static String input;

    // --計測用--
    private void printProcessingTime(BooleanSupplier f) {
        int count = 300000;
        long start, end;
        start = System.currentTimeMillis();
        for (int i = 0; i < count; i++) {
            f.getAsBoolean();
        }
        end = System.currentTimeMillis();
        System.out.printf("出力確認:%s, 計測 %3d: ", f.getAsBoolean(), end - start);
        System.out.println();
    }

    // --計測--
    public static void main(String[] args) {
        input = args[0];
        System.out.println("入力値:" + input);
        new Test().test();
    }

    private void test() {
        System.out.println("test1");
        printProcessingTime(() -> {
            boolean isDigit = true;

            for (int i = 0; i < input.length(); i++) {
                isDigit = Character.isDigit(input.charAt(i));
                if (!isDigit) {
                    break;
                }
            }

            return isDigit;
        });

        System.out.println("test2");
        printProcessingTime(() -> {
            boolean isDigit = true;

            try {
                Integer.parseInt(input);
            } catch (Exception e) {
                isDigit = false;
            }

            return isDigit;
        });

        System.out.println("test3");
        printProcessingTime(() -> {
            return input.matches(reg);
        });
    }

}
```

```DOS:数字のみでの結果
入力値:1234567
test1
出力確認:true, 計測  31: 
test2
出力確認:true, 計測  46: 
test3
出力確認:true, 計測 271: 
```

```DOS:文字を含めた結果
入力値:123456a
test1
出力確認:false, 計測  31: 
test2
出力確認:false, 計測 778: 
test3
出力確認:false, 計測 272: 
```

Character#isDigit()メソッドを使うのが一番早いという結果が出ました。文字を含めた場合は特に差が付きました。

##全角数字についての追記

@saka1029 さんからコメントを頂いた通り、上記の場合、正規表現は半角数値のみでした。正規表現を以下に変えて再実施しました。

```java:正規表現定義の箇所
    private final static String reg = "[\\d０-９]+";
```

```DOS:全角数字のみ
入力値:１２３４５６７８９０
test1
出力確認:true, 計測  57: 
test2
出力確認:true, 計測  74: 
test3
出力確認:true, 計測 508: 
```

```DOS:最後「あ」
入力値:１２３４５６７８９０あ
test1
出力確認:false, 計測  64: 
test2
出力確認:false, 計測 851: 
test3
出力確認:false, 計測 476: 
```

#修正履歴

20161009

+ ソースを修正し、java.util.functionを使用。
+ 出力結果も再実施。
PHP でメールを送れなかったときの備忘録

お名前 VPS を使っていて、ある日サーバ（CentOS 6.2）が落ちていて SSH でも入れなかったので復旧してもらったんですが、テストサイトを組んでいてよくあるごく一般的な「お問い合わせフォームからのメール」が飛んでいかなくなっているという現象になりました。

1. 遅延かなと思ったけどさっぱり来ない。
2. 送信処理の PHP は他で組んだものの使い回しなので問題ないだろうと。
3. 実際、mb_send_mail() の結果も　true だし、送信している筈の内容に手落ちもない。
4. このサーバで立てている別のテストサイトで試してみたけど送れない。
5. ははぁーん、サーバの復旧時にどこかおかしくなってるなと思う。

以上のような経緯から postfix を再起動すると溜まっていたテストメールがわんさか来ました。お前ら迷惑メールかよと思うぐらいに。

```
/etc/init.d/postfix restart
```

今後、復旧してもらった際に忘れないよう備忘として残しておきます。
javadocにおける{@link}と{@linkplain}の違いと使い分けについて

javadocコメントを書くときに参照を表す`{@link}`と`{@linkplain}`の違いがよくわからなかったので調べてみた。

# `{@link}`タグ

クラスやメソッドへの参照を記述することができ、メソッドなどのjavadocコメントに記述することができる。

### `{@link}`タグの記述例

```html:
/**
 *  タイトル.<br>
 *  詳細はこの{@link Test#getId() メソッド}を参照
 */
```

表示イメージ
* * * 
タイトル.
詳細はこの<a href="../../Test.html#getId"><CODE>メソッド</CODE></a>を参照
* * * 

### `{@link}`タグを使って出力されたHTMLソース

```html:
<a href="../../Test.html#getId"><CODE>メソッド</CODE></a>
```

※hrefのURL部分はイメージ

javadoc生成後の「メソッド」部分のHTMLソースが上記である。
`<CODE>`タグが入っているため、等幅フォントで表示される。


# `{@linkplain}`タグ

クラスやメソッドへの参照を記述することができ、メソッドなどのjavadocコメントに記述することができる。
`{@link}`タグとは違い<b>プレーンテキスト</b>で表示される。

### `{@linkplain}`タグの記述例

```html:
/**
 *  タイトル.<br>
 *  詳細はこの{@linkplain Test#getId() メソッド}を参照
 */
```
表示イメージ
* * * 
タイトル.
詳細はこの<a href="../../Test.html#getId">メソッド</a>を参照
* * *

### `{@linkplain}`タグを使って出力されたHTMLソース

```html:
<a href="../../Test.html#getId">メソッド</a>
```

以上のことから`{@link}`タグは生成されたHTMLソースに`<CODE>`タグが付加されて出力されるが、`{@linkplain}`タグでは`<CODE>`タグが入っていないことが分かる。
使い分けについては調べてもあまり出てこなかったので公式の`{@linkplain}`が追加された時のバグフィックスを見てみる。
 
# 使い分け

[JDK-4429628](http://bugs.java.com/bugdatabase/view_bug.do?bug_id=4429628)

>Some people might prefer that use (particularly in headings, where code can look odd).

あまり英語に強くないけど「`{@linkplain}`タグは見出しなどを表示するときに`<CODE>`タグを付けてほしくない場合などに使用を好まれるかもしれません」、的なことが書かれている？
ここの「見出し」というのがよくわからないけどメソッドコメントの開始から「.」までのタイトルのことかな？
タイトルに参照とかあまり使わない気がするけど、書くとするなら以下のような感じかな？

```html:linkplainを使った例
/**
 * {@linkplain String}を{@linkplain Integer}に変換.<br>
 * なんらかの詳細な説明文。
 * @param str 数値に変換したい文字列。{@code null}の場合は0に変換される。
 * @return 変換後の数値。変換できない場合は0に変換される。{@code null}は返却されない。
 */
```

上記の例はString型をInteger型に変換するメソッドコメントで、String型とInteger型にリンクを付けている。
バグフィックスを見ても分かるようにもともと`<CODE>`タグ付加なしバージョンがないので追加しましたよ的な感じなのであまり気にせずに使ってもいいかもしれない。

もっと単純に考えて`<CODE>`タグがないので、「等幅フォントじゃなくてもいいよ」とか「タイトルとして表示する時に`<CODE>`タグは使いたくないよ」とかいう場面で使い分けすればいい感じなのかな。
あまりHTMLに詳しくないので違いの部分しか分からなかった。こういう明確な使い分けがありますよ！ということがあれば教えて下さい。
Ubuntu16.04のPhpStormで日本語入力が使えなくなった時の解消法

ある日突然PhpStormで日本語入力ができなくなりました。
（[システム設定]-[言語サポート]-[キーボード入力に使うIMシステム]-[Fcitx]の場合になるようです）

・IMシステムを変えて対応
[システム設定]-[言語サポート]-[キーボード入力に使うIMシステム]を[IBus]に変えたら入力できました。

・起動スクリプトに手を加えて対応
インストール先は人それぞれ多少違うかもしれませんが

```bash:/opt/PhpStorm-xxx.xxxx.x/bin/phpstorm.sh
if [ -n "$PHPSTORM_CLASSPATH" ]; then
  CLASSPATH="$CLASSPATH:$PHPSTORM_CLASSPATH"
fi

# ここから
XMODIFIERS="@im=fcitx"
export XMODIFIERS
# ここまでを追加

# ---------------------------------------------------------------------
# Run the IDE.
# ---------------------------------------------------------------------
IFS="$(printf '\n\t')"
```

中国語は読めないけど参考にさせていただきました。
[ubuntu下phpstorm无法输入中文的解决办法](http://blog.csdn.net/SakuraLLj/article/details/52181084)
TortoiseSVNとWinMergeの設定をいじる

#はじめに
使ってて不便を感じたので設定を見直してみた。
特に複数ファイルのリビジョン比較する際にウィンドウ開きまくるのとか、空白検知とか。

#よくやる使い方（一応）

1. TortoirseSVNで管理しているフォルダのShow Logする。
2. 比較したいリビジョンをShiftキーやCtrlキーを押しながらクリックする。
3. 選択したうえで右クリックしてCompare Revisionsする。
4. TortoirseSVNとWinMerge連携してたら、ダブルクリックでWinMergeが起動する。
5. 複数ファイルを開くとWinMergeはタブで見れるのにウィンドウを開いてしまう。←これが嫌

#基本の設定
まずは公式のドキュメントに従って、TortoirseSVNのDiffビューワーを設定する。

+ [TortoiseSVN の設定 外部プログラムの設定](https://tortoisesvn.net/docs/release/TortoiseSVN_ja/tsvn-dug-settings.html#tsvn-dug-settings-progs)

Tortoiseがインストールされてる人は、
エクスプローラ右クリックしてTortoiseSVN>Setting（もしくは設定）>DiffViewerで設定する。

> WinMerge の設定例:
> C:\Path-To\WinMerge.exe -e -ub -dl %bname -dr %yname %base %mine
※Path-Toは任意に変える

#オプションパラメータを変えよう

特にWinMerge.exe以降のパラメータが大事。
> -e -ub -dl %bname -dr %yname %base %mine

それぞれこんな意味


オプションの意味

|	パラメータ	|	意味	|
|	:--	|	:--	|
|	e	|	EscキーでWinMergeが閉じる	|
|	ub	|	最近使用した項目に追加しない	|
|	dl	|	左側タイトルバーの説明を指定	|
|	dr	|	右側タイトルバーの説明を指定	|

パラメータの意味

|	パラメータ	|	意味	|
|	:--	|	:--	|
|	%bname	|	変更前ファイルのウィンドウタイトル	|
|	%yname	|	変更後ファイルのウィンドウタイトル	|
|	%base	|	変更前のファイル	|
|	%mine	|	変更後のファイル	|

ファイル名を指定しておくとよい感じ。そうでないとtmpとかになる。
個人的にはオプションに

|	パラメータ	|	意味	|
|	:--	|	:--	|
|	s	|	既存ウィンドウで比較実行|

をつけると複数ウィンドウできずにタブできるので良いと思う。

#WinMerge自体の設定をする

下記がおすすめ

+ View>Launguageから 日本語に設定する

### 編集>設定

####\>一般

+ 自動的に最初の際にスクロールする
+ スプラッシュ画面を非表示
+ 複数のインスタンスを起動しない  →これで複数ウィンドウを開かなくなる。
+ 開くダイアログのオートコンプリート →最近使ったリスト

####\>比較

+ 空白　変更を無視する
+ 空行を無視する


#パラメータ一覧

|	パラメータ	|	意味	|
|	:--	|	:--	|
|	%base	|	変更前のファイル	|
|	%bname	|	変更前ファイルのウィンドウタイトル	|
|	%brev	|	元ファイルのリビジョン（もしあれば）	|
|	%burl	|	元ファイルのURL（もしあれば）	|
|	%fname	|	競合ファイルの名前	|
|	%mine	|	変更後のファイル	|
|	%nqbname	|	引用符なしの変更前ファイルのウィンドウタイトル	|
|	%nqbrev	|	引用符なしの元ファイルのリビジョン（もしあれば）	|
|	%nqburl	|	引用符なしの元ファイルのURL（もしあれば）	|
|	%nqfname	|	引用符なしの競合ファイルの名前	|
|	%nqpeg	|	引用符なしのペグリビジョン（もしあれば）	|
|	%nqyname	|	引用符なしの変更後ファイルのウィンドウタイトル	|
|	%nqyrev	|	引用符なしの第2ファイルのリビジョン（もしあれば）	|
|	%nqyurl	|	引用符なしの第2ファイルのURL（もしあれば）	|
|	%peg	|	ペグリビジョン（もしあれば）	|
|	%yname	|	変更後ファイルのウィンドウタイトル	|
|	%yrev	|	2番目のファイルのリビジョン（もしあれば）	|
|	%yurl	|	2番目のファイルのURL（もしあれば）	|

#ちなみに
ExcelもWinMergeできるけど
ExcelはTortoiseSVNのDiffすれば勝手にExcelで比較してくれるからあまり必要ないか。

##参考リンク

+ [【Subversion】TortoiseSVNの差分表示時にWinMergeを使う【WinMerge】 - somemo's diary:](http://somemo.hatenablog.com/entry/2012/04/15/130204)

こんなのもあった

+ [Excelファイル同士をdiffするための方法 Qiita](http://qiita.com/akashima/items/4a31edc00b6768c9c4c7)
+ [xdocdiff WinMerge Plugin -Word、Excel、PowerPoint、pdfの比較・差分を見る-](http://freemind.s57.xrea.com/xdocdiffPlugin/)

画像も比較できるぽい
+ [WinMerge 日本語版](http://www.geocities.co.jp/SiliconValley-SanJose/8165/winmerge.html#jpver)
WindowsでGrunt-Sassコンパイル時にcharacter "\xE6"が出た時の対処法

# Windows環境下でgrunt-contrib-sassでコンパイル時に以下のエラーが表示された時の対処法

```
Running "sass:dist" (sass) task
Error: Invalid Windows-31J character "\xE6"
        on line 5 of xxx/xxx/yyy.scss
  Use --trace for backtrace.
Warning: Exited with error code 65 Use --force to continue.
```

# 原因

コンパイル対象のSCSSに日本語（漢字）が含まれていることでエラーが発生しています

例えば以下のようにfont-familyに日本語を含む場合

```css:yyy.scss
body {
    font-family: Verdana, "游ゴシック", YuGothic, "メイリオ", Meiryo, "ヒラギノ角ゴ ProN W3", "Hiragino Kaku Gothic ProN", "ＭＳ Ｐゴシック", sans-serif;
}
```

# 対策方法

scssファイルの先頭行に```@charset "utf-8";```を追加してあげればOK


```css:yyy.scss
@charset "utf-8";
body {
    font-family: Verdana, "游ゴシック", YuGothic, "メイリオ", Meiryo, "ヒラギノ角ゴ ProN W3", "Hiragino Kaku Gothic ProN", "ＭＳ Ｐゴシック", sans-serif;
}
```

以上
DataGridTemplateColumn内のコントロールにコードビハインドからアクセスする-其の1-

##やりたいこと
コードビハインドからDataGridTemplateColumn内のコントロールにアクセスする。
動的にバインドしたかった。

##方法
```csharp:xaml
<DataGrid Name="MainGrid">
  <DataGrid.Columns>
    <DataGridTemplateColumn IsReadOnly="False">
      <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
          <CheckBox Name="CheckBox"/> ★これにアクセスしたい
        </DataTemplate>
      </DataGridTemplateColumn.CellTemplate>
    </DataGridTemplateColumn>
  </DataGrid.Columns>
</DataGrid>
```
```csharp:C#
var templateColumn = ZeroDataGrid.Columns[0] as DataGridTemplateColumn;
var checkBox = templateColumn.CellTemplate.LoadContent() as CheckBox;
checkBox.SetBinding(CheckBox.IsCheckedProperty,
new Binding()
{
    Path = new PropertyPath("プロパティ名"),
    Mode = BindingMode.TwoWay,
});
```

##駄目っぽい？
どうも上の方法だと新しいインスタンスが返却されているみたい？
[其の2](http://qiita.com/skuromaku/items/c5138869aed6fced0975)に続く
iOSDC2016に参加しiOSDC Reject Conferenceで発表してきた

8月はiOSDC2016に参加し、iOSDC Reject Conferenceで発表してきました。
そのことを1つのエントリーにまとめて投稿しておきます。

# iOSDC2016に参加
8/23@練馬でおこなわれたiOSDCに参加してきました。
ちなみに、体力的にふらふらしてたので、途中抜けもありそこまで聞いたのは多くないです。

見たいのがあったのに残念だなと思ってたのですが、発表資料はアップされているし、Youtubeで発表も見れるしで素晴らしいですね。

## 聞いた発表一覧
 - [Handling rich text in Swift（30分）](https://speakerdeck.com/kishikawakatsumi/handling-rich-text-in-swift)
 - [RxSwiftは開発をどう変えたか?（30分）](https://speakerdeck.com/ishkawa/rxswifthakai-fa-wodoubian-etaka)
 - [iOS10時代のCollectionView最新つかいこなし（15分）](https://speakerdeck.com/toyship/ios10shi-dai-falsecollectionviewzui-xin-tukaikonasi)
 - [Reactive State Machine（30分）](https://speakerdeck.com/inamiy/reactive-state-machine-japanese)
 - [ドッグフーディングしやすい環境を整える（15分）](https://speakerdeck.com/nishimao/totukuhuteinkusiyasuihuan-jing-wozheng-eru)
 - LT 5分 × 12（90分）

## 所感
聞いた発表はどれも興味深く、特に[「Reactive State Machine」](https://speakerdeck.com/inamiy/reactive-state-machine-japanese)は発表がそもそも面白かったというのもありますが、内容も面白かったですね。
ここらへんは、あまり触れられていないので触っていかないとなとつくづく思いました。
コードの可読性とかテスタビリティとかが気になったりするのですが、これは自ら触って判断ですかね。

[「ドッグフーディングしやすい環境を整える」](https://speakerdeck.com/nishimao/totukuhuteinkusiyasuihuan-jing-wozheng-eru)は他社さんのやっていることが聞けて良かったですね。
私も使ってくれない..という経験はあるので、参考にしたいなと思った次第。
この手のやつって場当たり的にやっていくのではなく、ちゃんと戦略を考えてやっていかないと意味ないですよね。
特に[FeedbackKit](https://github.com/nishimao/FeedbackKit)は、似たようなものを私も作ろうかなと思っていたものなので利用したいなと思います。

発表の種類的にも、多少多岐にわたっていて良かったのですが、今回の発表でテスト周りについての話しがなかったのは残念だったなぁと。
来年のiOSDCでは1つ以上テスト周りの発表であるようにこの1年間頑張っていきたいと思った所存。


それにしても、こういうのに参加して色々な人の話を聞くと、私もやらねば！となるのでいいですね。
そんな思いの中、iOSDC Reject Conference days2で発表してきました。


# iOSDC Reject Conference days2で発表
iOSDCに落ちたので[iOSDC Reject Conference days2](http://iosdc-reject-conference.connpass.com/event/37110/)で発表してきました。

iOSDC2016ではテスト周りの発表が一切なく、「実は皆、テストに興味ない？」または「テストやってない？」という思いを元に発表しています。
なので、まずテストをはじめる第一歩として今あるものを知ってもらおうというスタンスのもと発表しました。

来年のiOSDCではテスト周りが増えてくれればなと思い1年間活動したいと思った次第です。
外部へのメール送信を制限

## やりたい事

* テスト環境などから不本意なうっかりメールを飛ばしてしまわないよう制限したい

## 想定環境

* centos6.x
* 載っている各種MTAは停止しておく

## Outputで 25番ポートへ接続できないようルールを追加

```
sudo iptables -A OUTPUT -m tcp -p tcp --dport 25 -j DROP
sudo service iptables save
sudo service iptables restart
```

## 変更後の設定確認

```
sudo service iptables status
```

以下のルールがリストに存在することを確認

```
Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination
1    DROP       tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:25
```

## 設定後の確認方法

mail コマンド等でテスト用のメアドへメール送信を試行し、mailq に滞留するか、MTAの動作ログといったところを監視、送信先にもメールが届かない事を確認
Xcodeで実機インストール際に「A valid provisioning profile for this executable was not found.」が出てインストール出来ない問題

# 現象

実機にアプリをインストールする際に`A valid provisioning profile for this executable was not found.`というエラーが表示され、インストールができなくなった。

![error.png](https://qiita-image-store.s3.amazonaws.com/0/56178/aaadbb3b-fa38-2e25-2475-206aa62ff529.png)

- Xcode7.2.1
- iOS8.3
- iPad Air Wi-Fiモデル(MD785J/B)
- インストール方法は開発者登録せずにインストールする方法を利用

# 結論

端末の時間がおかしかった(進んでいた)。

# 補足

`A valid provisioning profile for this executable was not found.`に関しては以下のように記事はあるのですが、解決できませんでした。

- [App installation failed / A valid provisioning profile for this executable was not found.](http://makotton.com/2015/06/23/1063)
- [A valid provisioning profile for this executable was not found](http://stray-light.info/wp/a-valid-provisioning-profile-for-this-executable-was-not-found/)
- [XCode :7 App installation failed :A valid provisioning profile for this executable was not found](http://stackoverflow.com/questions/33126849/xcode-7-app-installation-failed-a-valid-provisioning-profile-for-this-executab)

インストールが失敗した時のログを見てみると、日付がOct 1になっていることに気づきました。
※実際にインストールしたのは8月

```
Oct  1 11:38:49 iPad streaming_zip_conduit[516] <Warning>: __dispatch_source_read_socket_block_invoke:203: Failed to install application at file:///var/mobile/Media/PublicStaging/XXX.app/ : Error Domain=LaunchServicesError Code=0 "The operation couldn’t be completed. (LaunchServicesError error 0.)" UserInfo=0x14fe2c9f0 {Error=ApplicationVerificationFailed, ErrorDetail=-402620395, ErrorDescription=Failed to verify code signature of <MIExecutableBundle : path = /private/var/mobile/Library/Caches/com.apple.mobile.installd.staging/temp.c00YZk/extracted/XXX.app identifier = com.ZZZ.forTest type = 4> : 0xe8008015 (Signer did not match any installed provisioning profile)}
：
以下略
```

上記から端末の日時を確認してみると2ヶ月も日時が進んでいました。
共有の開発端末だったので日時のテストをした後とかだったのかもしれません。

端末の日時を正しくしたところインストールできるようになりました。
CentOS7でrbenvを使ってRubyをインストールできるようにする


# 発端と概要
**/etc/profile を直接編集するとか、そういうやばそうな手順が含まれるもが散見された**ので、ちゃんとCentOS7の流儀に従ったやり方でインストールたいです。

*etc/profile と /etc/bashrcに書いてあること*

```
# It's NOT a good idea to change this file unless you know what you
# are doing. It's much better to create a custom.sh shell script in
# /etc/profile.d/ to make custom changes to your environment, as this
# will prevent the need for merging in future updates.
```

# 必要そうなパッケージのインストール
rbenvのインストール～`rbenv install`で必要になるもののインストールをします。

```bash
yum -y install git gcc make openssl-devel libffi-devel readline-devel
```
 
それぞれ、以下のタイミングで必要になります。

ライブラリ | 使用用途
--- | ---
git | rbenvとruby-buildのインストール
他のもの | ruby-buildで使う

# rbenvとかruby-buildのインストール
`/opt/rbenv` にインストールします。他の場所（例えば/usr/localとか）にしたい場合は、適宜読み替えてください。

```bash
# rbenv
cd /opt
git clone https://github.com/rbenv/rbenv.git
# ruby-build
mkdir /opt/rbenv/plugins
cd /opt/rbenv/plugins
git clone https://github.com/rbenv/ruby-build.git
# ログイン時にrbenvを使えるようにする初期化スクリプトを作る
cat << 'EOS' > /etc/profile.d/rbenv.sh
export RBENV_ROOT="/opt/rbenv"
export PATH="${RBENV_ROOT}/bin:${PATH}"
eval "$(rbenv init -)"
EOS
# 環境変数とかを変更したので、ログインシェルをリロードする
exec $SHELL -l
```

# Rubyのインストールする
2.3.1をインストールして、システム全体で使えるようにします。
install で時間が掛かります。

```bash
rbenv install 2.3.1
rbenv global 2.3.1
```

確認

```bash
ruby --version
```

# 参考文献

[「CentOS/RHEL に Ruby 2.x をインストールする」](http://dotnsf.blog.jp/archives/1020034700.html)は、「最後に /etc/profile に以下の３行を追加」しやがりました。
  で、それを真に受けてしまった記事が
[ruby2.x.xのインストール方法](http://qiita.com/k4zzk/items/ae125a23151113032e79)。  
[「CentOS に Ruby をインストールする（kzy52's blog）」](http://kzy52.com/entry/2015/05/13/201831)  は、丁寧で良い記事だと思います。  
 設定の反映で、source で直で読み込んでるのが、動作確認の意味も含めたい私としては、危なそうに感じました。
配列が空かどうかを判定する

入れ子で配列が返ってくる場合に中身が空かどうかを判定する関数。
ACFを利用する場合は、have_rows関数でも問題ないと思う。

## ソースコード

```php5:functions.php
<?php
/**
* 配列の空判定
**/
function check_ary($array){

	if(is_array($array) && !empty($array)){

		foreach($array as $item){
			if(is_array($item)){
				if(check_ary($item)){
					return true;
				}
			}else{
				if(!empty($item)){
					return true;
				}
			}
		}
	}else{

		if(!empty($array)){
			return true;
		}
	}

	return false;
}
?>
```

## 使用例

```php5:ソース
<?php
$fields = get_field($field_name);
if(check_ary($fields)):
?>
<p>値が存在する場合の処理を記述する</p>
<?php endif; ?>
```
wordpressのブランクテーマ「sage」のセットアップ


wordpressのテーマ開発用のブランクテーマ[「sage」](https://roots.io/sage/)のセットアップ方法のメモ。

#環境
- mac osx
- MAMPのhtdocsにsampleディレクトリを作成しwordpressをインストールセットアップ済み
- bower、node.js、npmのインストールは済み

#sageとは？
sageはwordpressのテーマ開発用のブランクテーマ。ブランクテーマについては[こちら](https://roots.io/sage/)をどうぞ。
sageでは、
- Twitter Bootstrapのサポート
- HTML5でのコーディング
- sassの利用
- gulpでタスクの自動化
がされておりwordpressのテーマ開発が非常にやりやすくなっています。

#sageのダウンロード
GitHubよりthemesディレクトリにクローン

```
//MAMP/sample/wp-content/themes/
$ git clone https://github.com/roots/sage.git
```

#npmパケージのインストール
クローンしたsageディレクトリに移動しnpmパッケージのインストール
package.jsonがあるので下記でOKです。

```
//MAMP/sample/wp-content/themes/sage/
$ npm i
```

これでgulpfile.jsに記載されているタスクが実行可能となります。

#bowerパッケージのインストール
さらにbowerでbootstrap,jQueryのインストール
こちらもbower.jsonがあるので下記でOK。

```
//MAMP/sample/wp-content/themes/sage/
$ bower install
```

これでbootstrap-scssが利用可能となります。

#browser-syncのプロキシ設定（MAMP利用の場合）

browser-syncのために、MAMPなどローカルサーバーを利用の場合はプロキシ設定が必要。
sage/assets/manifest.jsonにアクセスし、プロキシの設定を行います。
下部に記載されている"devUrl"の \"http\://example.dev"を下記に変更。/sample/の部分は任意のディレクトリ名に。


```json:manifest.json
{
  "dependencies": {
    "main.js": {
      "files": [
        "scripts/main.js"
      ],
      "main": true
    },
    "main.css": {
      "files": [
        "styles/main.scss"
      ],
      "main": true
    },
    "customizer.js": {
      "files": [
        "scripts/customizer.js"
      ]
    },
    "jquery.js": {
      "bower": ["jquery"]
    }
  },
  "config": {
    "devUrl": "http://localhost:8888/sample/"
  }
}

```

これでbrowser-syncの利用が可能です。

#jsライブラリーの追加
テーマ開発の中で追加のjsライブラリーが必要な際はbowerで可能。

```
$ bower install パッケージ名 --save
```
その後に追加されたパッケージの結合、圧縮を行う。

```
$ gulp build
```

これで追加ライブラリーがdist/main.jsに結合します。

この挙動がわかるまで半日を消費。。
manifest.jsonやらbower.jsonのoverrideやら追記まったく必要ないのね。。

※追記
レスポンシブスライドショーのflickityを追加しようとしたところ上記の方法では、うまく動かなかった。
[sageのフォーラム](https://discourse.roots.io/t/how-to-add-a-third-party-js-plugin-correctly/3059/6)を調べたところ、buildの他にbower.jsonのoverridesに下記を追加すると動くとのこと。

```
  "flickity": {
    "main": [
      "./dist/flickity.pkgd.js",
      "./dist/flickity.min.css"
    ],
    "dependencies": {}
  }
```

追加したところ無事実装完了。
overridesが必要なのは、パッケージ自体が他のパッケージに依存している場合。パッケージ自体のbower.jsonのmainはdist/を指していない。
そのようなパッケージではoverridesが必要。
mainにdist内必要ファイルのパスを記載する。
追加で

```
"dependencies": {}
```
を記載しておいたほうが無難かも。pkgdファイルに既に含まれている。いらないパッケージもまとめられてしまうことがあるので。

#gulpコマンド解説

sageでデフォルトで使えるgulpコマンド。

##scssのコンパイル
assets/styles/内のscssの変更後下記コマンドを実行するとscssのコンパイルに加えcssの圧縮、bower管理のbootstrapのscssとの結合まで行ってくれます。コンパイル後のcssファイルは、dist/styles/main.cssです。

```
$ gulp styles
```

##画像のロスレス圧縮
assets/images/内の画像ファイルをロスレス圧縮します。
圧縮後のファイルはdist/images/に格納されます。


```
$ gulp images
```

##javascriptの結合、圧縮
bowerの追加パッケージ、assets/scripts/main.jsの追記をdist/scripts/main.jsに結合、圧縮します。
bowerで追加パッケージを入れた際は必須。

```
$ gulp scripts
```


##変更の監視、プラウザのオートロード
browser-syncを利用し、プラウザのオートロードが可能です。
templateフォルダ内のphp、scssの変更でオートロードします。
さらに画像の追加でも自動的にimagesタスクを実行します。

```
$ gulp watch
```
自動的にプラウザが立ち上がり、変更に応じてリロードされます。
ターミナルに表示されるExternalのURLにスマホ等、別のデバイスでアクセスすることでそちらでも確認が可能です。
自然キーのリソースに対してRESTのURLをどう設計するか

追記: 投稿から2年経ち何度か試しましたが、本文中の 3) のパターンで良いと結論づけています。

## 概要
(特にRailsでは一般的な)サロゲートキーをもつときの、基本的なactionに対するURI設計はこんな感じになる。

| action       |  HTTP Method      |    URI    |
|:-------------|:------------------|:------------------|
| create       |              POST |      /resources   |
| show          |              GET |      /resources/:id |

では、自然キーをもつリソースに対してはどうするべきだろうか?

ここでは自然キーを `key`、リソースの他のカラムを `foo` とする。自然キーなので、create時にそのkeyを指定する必要がある。これが上記との違いになる。

## 考えうるパターン

1) POSTもGETもURIに自然キーを含める。

| action       |  HTTP Method      |    URI           | params |
|:-------------|:------------------|:-----------------|:-------|
| create       |              POST |  /resources/:key | { foo: 1 } |
| show          |              GET |  /resources/:key |            |

※コメントで指摘いただきましたが、この場合はPUT(リソースをまるごと更新)として考えるのが正解かもしれません。新規作成

2) POSTもGETも、自然キーはparams (body) で扱う。

| action       |  HTTP Method      |    URI           | params |
|:-------------|:------------------|:-----------------|:-------|
| create       |              POST |  /resources | { key: 1, foo: 1 }  |
| show          |              GET |  /resources | { key: 1 }  |

※showの方はGETリクエストなので、実際のURIは `/resources?key=1` である。

3) POST時はparams (body) で扱い、GET時はURIに含める。

| action       |  HTTP Method      |    URI           | params |
|:-------------|:------------------|:-----------------|:-------|
| create       |              POST |  /resources | { key: 1, foo: 1 }  |
| show          |              GET |  /resources/:key |   |

## 結論
3にしてみることにした。理由は以下。

- Railsでの扱いやすさ。標準の場合とURIが変わっていないため。(Railsでは、createやshowメソッドを定義すると、自動でURIが上のようになる。)
- POST時に、自然キーは他のカラムと一緒にbodyに入れるのが、直感的にわかりやすい。

すこし気になるのは、create時は自然キーがparamsに入り、showではuriに入ること。これは目をつぶることにする。
cakephp 1.2 save()

```php
<?php
function edit($id) {
    //POST された form データがあるか？
    if(!empty($this->data)) {
        //form データが有効で保存できた場合...
        if($this->Recipe->save($this->data)) {
            //セッションにフラッシュメッセージをセットしリダイレクトする
            $this->Session->setFlash("Recipe Saved!");
            $this->redirect('/recipes');
        }
    }

    //form データがない場合、編集する recipe を検索し
    //ビューに渡す
    $this->set('recipe', $this->Recipe->findById($id));
}
```
Pythonにてコールバック関数を使う

#コールバック関数って？
>コールバック関数とは、プログラム中で、呼び出し先の関数の実行中に実行されるように、あらかじめ指定しておく関数。
>http://e-words.jp/w/%E3%82%B3%E3%83%BC%E3%83%AB%E3%83%90%E3%83%83%E3%82%AF%E9%96%A2%E6%95%B0.html

関数の引数として渡す関数とも説明されることもあります。

#使用方法
リンク先の記事まんまです
http://qiita.com/pocket8137/items/df5afba90b51e90587a5
まずはコールバック関数を呼び出す関数を定義。

```
def handler(func,*args):
    return func(*args)
```


第一引数が関数ポインタ、第二引数が可変引数です。第二引数にてコールバック関数の引数を受け取ります。

そして、コールバック関数を定義

```
def say_hello(name):
    print("Hello!!")
    print(name)

```

呼び出します。
ちなみに、Pythonでは関数名に()をつけないことで関数ポインタを指します。

```
if __name__ == "__main__":
    callback = say_hello
    #callbackにsay_helloのオブジェクトIDを格納
　　handler(callback, "moroku0519")
```

実行結果

```
   Hello!!
   moroku0519
```

#どういったことに使ったか
私の場合、場合によって使用する関数を分けたいなと思う場面がありました。
そこで、オブジェクトIDを格納した辞書を定義しました。

```
def handler(func, *args):
    return func(*args)

def function1(hoge):
    return hoge

def function2(hoge, huga):
    return hoge, huga

func_dic = {"func1": function1, "func2": function2}
```

```
result1 = handler(func_dic["func1"], hoge)
result2, result3 = handler(func_dic["func2"], hoge, huga)
```
Rails + mysql でテーブルのidのauto incrementをやめる

## 概要

Railsはふつう id という名前の自動採番のPKを作る(いわゆるサロゲートキー)が、そうではなく自然キーを利用したい場合にどうするか。

## 環境
Rails 5.0.0.1, MySQL 5.6, ruby 2.3.1,
mysql2 (gem) 0.4.4 で確認。

## やり方
PK名自体は `id` で良いとすると、マイグレーションは以下のようになる。

```rb
class CreateHoge < ActiveRecord::Migration
  def change
    create_table :hoges, id: false do |t|
      t.column :id, 'int(11) PRIMARY KEY'
      t.integer :fuga

      t.timestamps null: false
    end
  end
end
```

`t.column` で生っぽく書けるのがポイント。

なお、 `id` という名前も変えたいのであれば、モデル側で `self.primary_key =` の設定が必要。

## 利用例

ある外部システムのIDと、内部のあるIDを、1対1に紐付けるだけのテーブルが必要になった。
標準では、 `id hoge_id fuga_id`の3カラムのテーブルになるが、リレーションもhoge_idやfuga_idでしかしないため、サロゲートキーとしてのidは全く役に立たないし紛らわしいだけなので、追い出した。

なるべく面倒を避ける為、 `id` という名前の自然キーにして、テーブル名に hoge を入れることで、hogeのidであると分かるようにした。

```rb
class CreateFugaHoge < ActiveRecord::Migration
  def change
    create_table :fuga_hoges, id: false do |t|
      t.column :id, 'int(11) PRIMARY KEY'
      t.integer :fuga_id, null: false # 内部テーブルであればreferencesでよい

      t.timestamps null: false

    end

    # fuga_idにunique indexはる

  end
end
```

## 参考

http://stackoverflow.com/a/3049727

Rails3時代の回答だが、Rails5.0.0.1でも利用できていることを確認した。
embulk_rubyというgemを作成中

#embulk便利

なんだけど、実行結果を受け取れなくて辛い。
似たような実行コードを書き散らさないといけない

#解決
wrapperのgemをつくった。

http://github.com/yuuna/embulk_ruby/

とりあえずerrorとかは受け取れる。
あとは結果を解析して適切にraiseしたりreturnできればつかえる

```ruby:example.rb
  EmbulkRuby::Embulk.exec config:"./example.yml", bundler: "./bundler"
```

systemuをつかってるので
[status, stdout, stderr]
の配列でreturnしてます。

このへんは今後いじる予定。
AppleScriptをカレンダーから実行する　- Evernoteの定期バックアップ-


##AppleScriptをアプリケーションとして保存
アプリケーションとして保存するEvernoteバックアップのスクリプトについては、下の記事を参照してください。
[AppleScript入門 (操作対象のアプリで利用できるコマンドを調べる) (Evernoteを自動バックアップ)](http://qiita.com/takuyaWt/items/83567d923cd06232e6c5 "AppleScript入門 (操作対象のアプリで利用できるコマンドを調べる) (Evernoteを自動バックアップ)")

<img width="424" alt="スクリーンショット 2016-08-25 11.02.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/110085/f393bcbd-0285-3791-2994-51aa55a5922c.png">

##アプリを一度開く
保存が完了したら、カレンダーに登録する前に、
一度、作成した「xxx.app」を右クリックで開いておきます。
一度開いておかないと、下の警告が出力されカレンダーから実行されないので注意してください。
<img width="537" alt="スクリーンショット 2016-08-25 11.01.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/110085/220d9fdc-8378-0870-24ec-7fccac68b3e0.png">

##アプリをカレンダー通知に登録
カレンダーに予定を作成し、その通知項目に登録します。
通知項目の「カスタム」を選択して、次に「ファイルを開く」を選択して、
アプリケーションとして保存しておいた「xxx.app」を指定
<img width="501" alt="スクリーンショット 2016-08-25 10.59.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/110085/0ae2cd35-804e-25b8-9bba-8513f5bb7740.png">

<img width="499" alt="スクリーンショット 2016-08-25 10.59.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/110085/2d693889-96a9-5a47-d1d9-0ec35df325a0.png">
少し昔の iOS アプリを更新したら iPhone 5 とかが対象外になってた


Xcode 6 の頃リリースしたアプリを更新して AppStore に上げたら iPhone 5 とかたくさんの機種が除外対象になっていた。


## こうしたら iPhone 5 等が除外されなくなった

1. プロジェクトの `Build Setting > Architectures > Build Active Architecture Only` が `Debug` と `Release` 共々 Yes になっていたのを `Release` だけ No にした。

2. `Build Setting > Build Options > Enable Bitcode` が `No` になってたのを `Yes` にした。

<br>
1 は、開発に使ってる実機が iPhone 6 plus だったので、リリースしたら iPhone 6 plus 以外のアーキテクチャが対象外になってたのかな。Debug 時のビルドは早い方がいいので No にしたままでいいのかな。

2 はこのアプリでは、本当に必要だったかはわからない。

取敢えず両方やったら iPhone 5 たちも除外されなくなりました。
zeppelinからredshiftに接続


- redshift jdbc driverがmaven centralにはない
- 自分でdownloadして、適当な場所に配置
- zeppelin intercepterの設定で追加

```
/ZEPPELIN_HOME/extjars/edshiftJDBC41-1.1.13.1013.jar 
```
をartifactを設定するところで設定

あとは、

- jdbc defaultで設定
- mysqlとうはmysql prefixが効いているのでそれで
boot2dockerをvirtualboxへインストールするスクリプト作った

* https://github.com/tukiyo/boot2docker-installer

## 特徴

* boot2docker.isoをHDDにインストール、パーティショニング
* ssh公開鍵をGitHubからダウンロード
* /home/docker/, /root/ を永続化


## インストール

1. boot2docker.iso でboot

```
git clone https://github.com/tukiyo/boot2docker-installer
cd boot2docker-installer
#vi install.sh
sh install.sh
```

2. reboot

## ファイル

|ファイル|説明|
|:--|:--|
| /mnt/sda2/var/lib/boot2docker/bootlocal.sh | スタートアップスクリプト |
| /mnt/sda2/var/lib/boot2docker/network.sh | IP設定用 |
| /mnt/sda2/var/lib/boot2docker/profile | docker起動時の設定 |
| /mnt/sda2/var/lib/boot2docker/root | /root |
| /mnt/sda2/var/lib/boot2docker/home | /home/docker |
| /mnt/sda2/var/lib/boot2docker/ssh/sshd_config | sshd_config |
HomebrewとCaskでMac環境構築を自動化

Macの環境構築を自動化したときの作業メモです。

# 環境
OS X El Capitan (バージョン 10.11.5)

# 事前準備
XcodeをAppStoreからインストール
インストールが終わったら、起動して、規約に同意する

# Homebrewインストール
本家サイト( http://brew.sh )から以下コマンドをコピーして、ターミナルで実行する

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

# Homebrewのバージョン確認

```
$ brew --version
Homebrew 0.9.9 (git revision cb700; last commit 2016-08-23)
Homebrew/homebrew-core (git revision bebc; last commit 2016-08-23)
```

# Homebrewを最新にする

```
$ brew update
Already up-to-date.
```

# Homebrew確認

```
$ brew doctor
Your system is ready to brew.
```

# Brewfile作成
管理ファイル作成

```
$ touch Brewfile
```

インストールしたいパッケージを書く

```
$ vi Brewfile
tap 'homebrew/bundle' # tapでリポジトリを指定
tap 'peco/peco'
brew 'git'            # package指定
brew 'peco'
brew 'python'
brew 'ruby-build'
brew 'rbenv'
brew 'ruby'
brew 'tree'
brew 'vim'
brew 'wget'
brew 'zsh'
cask 'alfred'         # caskでGUIアプリをインストール
cask 'dropbox'
cask 'evernote'
cask 'google-chrome'
```
# パッケージインストール
Brewfileのあるディレクトリで以下実行

```
$ brew bundle
Succeeded in tapping homebrew/bundle
Succeeded in tapping peco/peco
Succeeded in installing git
Succeeded in installing peco
Succeeded in installing python
Succeeded in installing ruby-build
Succeeded in installing rbenv
Succeeded in installing ruby
Succeeded in installing tree
Succeeded in installing vim
Succeeded in installing wget
Succeeded in installing zsh
Succeeded in installing alfred
Succeeded in installing dropbox
Succeeded in installing evernote
Succeeded in installing google-chrome

Success: 16 Fail: 0
```

# やってみて
今まで新しくMacの環境構築するたびに以前の環境確認しながらアプリ入れていたのですごく楽になりました。
BrewfileもGithubで管理しておけばいいし。もっと早くHomebrew使えばよかったです。
Windows10のHyper-VにXP(SP3)をインストール

#前提
ホストOS：Windows10 Pro
　　　　　バージョン:1607
　　　　　ビルド:14393.82
 　　anniversary updateを当てた状態ですね。

#記事を書いた動機
VisualStudio（6.0/2005/2008）を使用したかったのですが
Windows10は上記アプリに対応していなかったため、
Hyper-VでXP（SP3）環境を構築しました。

アプリのインストールは問題なく完了しましたが、NICが認識されずホストOSとのファイル共有ができないといった問題が発生したためその解決策を記します。


#NICの認識方法
　仮想環境の設定でレガシネットワークアダプタを追加して使用してください。
（初期設定のネットワークアダプターだとダメでした。）
![無題.png](https://qiita-image-store.s3.amazonaws.com/0/94585/4ffac431-e027-9449-74a4-56703f4a96e9.png)



##ちなみに
・Windows10 Client Hyper-VではXPの統合サービスをサポートしていません。このことから本事象が発生している可能性があります。
・XPはサポートが打ち切られているので仮想スイッチで「外部ネットワーク」は選択しないようにしましょう。


##2016.10.25　追記
セットアップしてから60日が経過して「ライセンス認証をしなさい」と怒られログインができなくなりました。
ライセンス認証はインターネットに接続していないので電話での認証を行い無事に使用できるようになりました。



以上
React-NativeでCmd+Rしてもリロードされない問題とその原因

ちょっとReact Nativeを使ってみようとして、公式ページのGetting startedにあるとおりにコマンドを打つ
https://facebook.github.io/react-native/docs/getting-started.html#content

```bash
$ brew install node
$ brew install watchman
$ npm install -g react-native-cli
$ react-native init AwesomeProject
$ cd AwesomeProject
$ react-native run-iso
```

するとデフォルトの以下の様な画面が出るはず。

<img width="375" alt="react-native.png" src="https://qiita-image-store.s3.amazonaws.com/0/110715/00257931-afe3-b627-7feb-c41423c35514.png">

ここまでは問題ない。
ここで画面にある通り`Cmd+R`とキー入力しても無反応。おかしい。もちろん`Cmd+D`もダメ。

# キーボード配列が問題

結論から言うと、__問題はDvorak配列を使っていることでした！`Cmd+P(Qwerty配列のR)`でReloadされます__
iOS Simulator内の自作アプリ側の入力ではMacのキーボード配列変更が反映されないために起こったようです。`Cmd+Q`などのショートカットキーは自作アプリ側のための入力ではないために問題が起きていなかったのですが、Simulatorの中にwebViewやそのたぐいのものがあって、さらにそのwebViewがショートカットキーを持つようなアプリの場合にこのような問題が起こります。

Dvorak配列を使っていて、かつReact Nativeでリロードされない問題に出くわしてしまう運の悪い方が もしいらっしゃいましたら、その方の助けになるような記事となっていれば幸いです。
MojoliciousでWindowsのShift-JISを扱う

PerlのWeb Application Frameworkである[Mojolicious](http://mojolicious.org/)は、既定のエンコーディングがUTF-8です。

ただ、諸事情によりどうしても**Windowsの**Shift-JISを扱わないといけないときもあります（外部Web APIがShift-JIS前提とか……）。そんな時に、どうやってやればよいかという話です。

## やること

- `before_dispatch`フックでリクエストの文字コードを'cp932'にする
- `before_render`フックで
    - `html`、`json`、`txt`それぞれのフォーマットのキャラセットに'Shift-JIS'を指定する
    - 描画する際の文字コードを'cp932'にする

## コード

```pl
#!/usr/bin/perl

use Mojolicious::Lite;

hook before_dispatch => sub {
  my $c = shift;

  # リクエストの既定の文字コードを指定
  $c->req->default_charset('cp932');
};

hook before_render => sub {
  # 必要に応じて、各フォーマット毎にcharsetを指定する
  app->types->type(html => "text/html; charset=Shift-JIS");
  app->types->type(json => "application/json; charset=Shift-JIS");
  app->types->type(txt  => "text/plain; charset=Shift-JIS");

  # 描画する際の文字コードを指定
  app->renderer->encoding('cp932');
};

post '/' => sub {
  ...
};
```

## 謝辞

Twitterで困ったと呟いたらアドバイスいただいた[@hayajo](https://twitter.com/hayajo)さんに感謝！

[Mojoliciousでcp932](https://gist.github.com/hayajo/943f3bef6180b55cdfe7b06059fe7998)
php count() の例

```php
<?php
$a[0] = 1;
$a[1] = 3;
$a[2] = 5;
$result = count($a);
// $result == 3

$b[0]  = 7;
$b[5]  = 9;
$b[10] = 11;
$result = count($b);
// $result == 3
```
メモ：Eclipse Pleiades Mars のダークとColor themeの組み合わせがうまくいかない

####使用環境
Windows7
Java 1.8.0.102
Eclipse Mars Pleiades版（Java Standard）
Eclipse Color Themeインストール済み
####やりたいこと
外観＞テーマをダークにする＋Eclipse Color themeのMonokaiを適用＋少しだけカスタマイズ
####やったこと
一般＞外観＞テーマをダークにして、Color Theme Monokaiを適応
→再起動したら元に戻る

一般＞外観＞テーマをWindowsにして、Color Theme Monokaiを適応し、一般＞外観＞テーマをダークにする。
→再起動したら元に戻る
※こちらを参考にしました
http://qiita.com/mshoj@github/items/15eaf546373cdc722cb4

一般＞外観＞テーマをクラシックにして、Color Theme Monokaiを適応
→再起動しても元に戻らない
※でも、周りが白でエディタだけ黒なので目がチカチカでこれは却下……。

……テーマのダークと競合しているっぽい。

Color Themeを適応してから、ダークの設定を適応してるのかな？
ちなみに一般＞エディター＞テキスト・エディターで設定した背景色も元に戻ってる。

~~Neonだったらこのあたり解消されているのかは不明（新作すぎて試してない）~~
Neonでも解決されてませんでした。デフォでColor Theme含まれてるのに……。

- [x] 紆余曲折を経て、なんかうまくいきました。

[【解決】Eclipse Pleiades Neon のダークとColor themeの組み合わせで今度こそうまくいった件](http://qiita.com/nekomanma/items/890e6723cecc54972171)
MacにWindows用キーボード設定

# 利用環境
設定に使用した環境は以下のとおり

* El Capitan 10.11.6
* Seil [11.3.0](https://pqrs.org/osx/karabiner/seil.html) - 無変換・変換・ひらがなキー対応アプリ
* Karabiner [8.4.0](https://pqrs.org/osx/karabiner/index.html.ja) - キーボードカスタマイズツール
* Real Force 91U - 接続キーボード

# 設定
1. SeilとKarabinerをインストール
2. Seilで日本語キーボードを設定。3種類をチェック。これで「無変換」ボタンなどが認識される
<img width="781" alt="日本語キーボード設定画面" src="https://qiita-image-store.s3.amazonaws.com/0/122213/fda05817-d20b-8192-d291-f4f1e7521a7f.png">

3.Karabinerで　キーマップ調査アプリを起動(Karabiner -> Misc&Uninstall->Launch EventView)
<img width="1026" alt="Karabiner設定画面.png" src="https://qiita-image-store.s3.amazonaws.com/0/122213/1ad2e17c-d80d-9549-176f-8fa6da54a6c0.png">

4.イベント画面で必要なキーの値を確認。
今回の場合は以下のボタンを設定するので値を調査。各キーを押して、code部分に出る値(16進数なので入力時は10進数にする必要があるので注意)とnameの名前を控えておく。
 * 左CTLキー -> 左コマンドキーに変更
 * 左Windowsキー -> 左オプションキーに変更
 * 左Altキー -> 左コマンドキーに変更

<img width="856" alt="Event Viewer画面.png" src="https://qiita-image-store.s3.amazonaws.com/0/122213/49af57e0-0559-2788-3413-911850cd6457.png">

5.Seilに再び戻りOther Keysのメニューから調べた値に該当するキーを探し変更したい値を入力してチェックボックスをつける（チェックをつけないと反映されない）

イベント画面で調べておいたname部分が左のリストにあるので、「Change XXX」（XXXの部分)、該当箇所にチェックして、右端の入力エリアに変更したい値を入れる（入力できない表示のみの数字がイベント画面で調べた値の10進数になっている)
<img width="771" alt="値入れ替え.png" src="https://qiita-image-store.s3.amazonaws.com/0/122213/0f4205f8-1b90-034e-d266-1f0cb83a43ab.png">

左コマンドキーは「55」、左オプションキーは「58」になるので、変更したいキーに先値を入れた。

6.Caps LockキーをCTLに入れ替えたいので、こちらはOSのシステム環境設定->キーボード->修飾キーから変更する
<img width="662" alt="修飾キー.png" src="https://qiita-image-store.s3.amazonaws.com/0/122213/36307c9c-912d-bbd1-8931-81d91b1e3cbb.png">


これで設定完了。
Google公式のGoogle BigQueryを爆速で設定する

この記事は一度もGoogle BigQueryを触ったことがない人のための、セットアップの説明です。。Google BigQueryにアクセスするにはまず、Google　BigQueryにサインアップする必要があります。自分のクレジットカード情報を記入する必要がありますが、60日間の無料お試し期間があり、1 TB / 月まで無料ですので、サクッと試すぐらいでしたらあまり心配しなくてもいいのではないでしょうか。ので利用しましょう。もし限度を超えることがあったとしても、勝手に課金される前に、YesかNoと断れるようになってます。詳しくは[こちら](https://cloud.google.com/bigquery/pricing?hl=ja) の方に、Google BigQueryの料金体系が書いてあります。

##プロジェクトを作成する

いったんサインアップすると、Google Cloud Consoleページからプロジェクトを作成することができます。

![how_to_create_project_google.png](https://qiita-image-store.s3.amazonaws.com/0/91522/b83f9720-68bd-6f16-d7d7-9f806fc911ad.png)

ヘッダーのドロップダウンメニューからプロジェクトを作成を選んで下さい。

プロジェクト名を入力してください。

![](images/how_to_create_project_google2.png)![how_to_create_project_google2.png](https://qiita-image-store.s3.amazonaws.com/0/91522/ed18c933-1134-6c53-706f-26001215705b.png)


##データセットを作りましょう

いったんプロジェクトを作ると、左側のメニューボタンを押して下さい。

![](images/how_to_create_project_google1.png)![how_to_create_project_google1.png](https://qiita-image-store.s3.amazonaws.com/0/91522/ffddd478-57fd-63a9-34cc-ba068bf18f54.png)


メニューからBigQueryを選び、Google BigQueryのUIを開きましょう。

![how_to_create_project_google3.png](https://qiita-image-store.s3.amazonaws.com/0/91522/e598e6b1-7ded-58c3-d3d1-fa139248ce97.png)


矢印のアイコンの隣にあるボタンを押して、データセットを作成してください。

![how_to_create_project_google4.png](https://qiita-image-store.s3.amazonaws.com/0/91522/da89a1d3-058d-8f1c-7c72-5cb998cde21c.png)


データセットIDをタイプして、OKボタンをクリックしてください。

![how_to_create_project_google5.png](https://qiita-image-store.s3.amazonaws.com/0/91522/ee67b902-2575-4087-3ab0-f9b5b8a80766.png)


これで設定は終了です。Google BigQueryのデータ分析については、こちら↓で書いているのでよろしかったらどうぞ。

[なぜデータ分析においては、SQLではなくRを使うべきか？  Google公式のGoogle BigQueryに保存されてる３TBのGitHubデータを使って、Rのパッケージをクラスタリングしてみた](http://qiita.com/21-Hidetaka-Ko/items/2ee0ef76d639ec6aeb2f)


##興味を持っていただいた方、実際に触ってみたい方へ

Exploratoryは[こちら](https://exploratory.io/
)からβ版の登録ができます。こちらがinviteを完了すると、ダウンロードできるようになります。


ExploratoryのTwitterアカウントは、[こちら](https://twitter.com/ExploratoryData
)です。

Exploratoryの日本ユーザー向けの[Facebookグループ](https://www.facebook.com/groups/1087437647994959/members/
)を作ったのでよろしかったらどうぞ

分析してほしいデータがある方や、データ分析のご依頼はhidetaka.koh@gmail.comまでどうぞ
Inventory / unity > code v0.5 > UniqueIndexでの部分検索を実装

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

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

### v0.5

以下の機能を実装した。

- UniqueIndexによる検索 (Checkボタン)

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

これまではnameによる辞書での検索を実装してきたが、shelf(旧名:case),row,columnでの検索用にUniqueIDでの検索を追加。

考えとしては、name用辞書とは別にuniqueID用辞書を用意した。2つの辞書は無駄ではあるが、現状はこれでよしとする。

1つの辞書に複数の項目での検索をする方法は将来必要に感じた時に調べることにした。
ORACLE Java Silverの問題をTypeScriptにしてみる3-1

3-1.次のプログラムを実行した結果を選びなさい。

```java:java3-1.java
public class Main{
 public static void main(String[] args){
  int a = 3;
  int b = a+=5;
  System.out.println(a+b);
 }
}

```

```ts:ts3-1.ts
  var a:number = 3;
  var b:number = a+=5;
  console.log(a+b);
```



A.8が表示される
B.10が表示される
C.16が表示される
D.コンパイルエラーが発生する
E.実行時に例外がスローされる




答えはCです。
これもjavaと差はありませんね。
【メモ】Atom


## ターミナル

作業ディレクトリに移動して`atom .`でエディタ起動

## フォント

RictyDiminishedに設定
https://github.com/edihbrandon/RictyDiminished/blob/master/RictyDiminished-Regular.ttf

## スニペット

[Atom講座 スニペット登録](http://rfs.jp/sb/atom-github/atom05_snipet.html)


## インデント設定

jsは半角スペース2, pythonは半角スペース4にしたかったので

```:.editorconfig
root = true

[*]
indent_style = tab
tab_width = 2
indent_size = 2
charset = utf-8
end_of_line = lf
insert_final_newline = true
trim_trailing_whitespace = true

[*.py]
tab_width = 4
indent_size = 4

[Makefile]
indent_style = tab

[*.js]
tab_width = 2

[{package.json,.travis.yml}]
```

> 参考
[Atomでインデント設定に困ったらEditorConfigを使用する](http://blog.webic.org/atom-editorconfig-120)

## ショートカット

### 画面分割

`command + k + 分割方向の矢印`

### マルチカーソル

`command + D`
一部飛ばしたい場合は `command + K`
一つ前をキャンセルしたい場合は `command + U`

### 括弧

`ctrl + M` 対応する括弧やタグに移動
`ctrl + command + M` 対応範囲をハイライト

### 行を複製

`command + shift + D`

カーソルおく -> その１行を複製
複数行を選択 -> 複数行を複製

### 目的ファイルの検索

`command + T` + 目的ファイルの名前

### マークダウンプレビュー

`ctrl + shift + M`

### キーマップ

`alt + shift + i` : 自動インデント

### 大文字変換

`command + k + u`


## パッケージ

とりあえず入れてみていい感じのもの

### 補完
[emmet](https://atom.io/packages/emmet)
[tag](https://atom.io/packages/tag)
タグを閉じてくれる

autocompleteシリーズ
[autocomplete-html](https://atom.io/packages/autocomplete-html)
[autocomplete-php](https://atom.io/packages/autocomplete-php)
[autocomplete-modules](https://atom.io/packages/autocomplete-modules)
[autocomplete-python](https://atom.io/packages/autocomplete-python)
[autocomplete-paths](https://atom.io/packages/autocomplete-paths)

### 色
[color-picker](https://atom.io/packages/color-picker)
[pigments](https://atom.io/packages/pigments)


### 整列、ハイライト

[atom-beautify](https://atom.io/packages/atom-beautify)
alt + ctrl + B

[file-icons](https://atom.io/packages/file-icons)
[highlight-selected](https://atom.io/packages/highlight-selected)
[atom-jade](https://atom.io/packages/atom-jade)


### git
[git-plus](https://atom.io/packages/git-plus)
atom内でgitコマンドを打てる

[merge-conflicts](https://atom.io/packages/merge-conflicts)
mergeの可視化、解決

<br>

> 参考
[ATOMおすすめパッケージ 2015年末版](http://qiita.com/saison/items/e241cb538ff23d1bf386)
[Atomエディタの初期設定とオススメプラグイン](http://astone.jeez.jp/atomeditor_best_setting_plugin/)
[Atom講座スニペット登録](http://rfs.jp/sb/atom-github/atom05_snipet.html)
[凄腕エンジニアが選んだAtom・Vim・Emacsの超便利プラグインと設定34選](http://paiza.hatenablog.com/entry/2016/05/23/%E5%87%84%E8%85%95%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%8C%E9%81%B8%E3%82%93%E3%81%A0Atom%E3%83%BBVim%E3%83%BBEmacs%E3%81%AE%E8%B6%85%E4%BE%BF%E5%88%A9%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4)
[ドットインストール Atom入門](http://dotinstall.com/lessons/basic_atom_v2)
技術英語 > So when weeds [take over], cows can go hungry. / Nature will [take over].

@ LOE > August 15, 2003
http://www.loe.org/shows/shows.html?programID=03-P13-00033
> So when weeds <font color=red>take over</font>, cows can go hungry.

http://ejje.weblio.jp/content/take+over
> (2) 〈…を〉接収する.

意訳「[weed:雑草](http://ejje.weblio.jp/content/weed)が大地を占拠することにより、牛の食料となる草が成長せず、牛が飢える」。

<hr>
関連して思い出したのは

Nature will <font color=red>take over</font>.

http://ejje.weblio.jp/content/take+over
> (1) 〈職務などを〉引き継ぐ; 〈事業などを〉引き取る.

人が自然に手を加えるのだが、結局は、その後自然が引き継いでくれる、という場面で使われていた。
WebSocketのデバック

前回RailsのActionCableで作った[チャットアプリ](http://mydemos1-1223107232.ap-northeast-1.elb.amazonaws.com:3001/rooms/show?id=1
)にAndroidからデータを投入すべく、リクエスト内容を解析しました。

#1. wscatのインストール
[こちら](http://tricknotes.hateblo.jp/entry/20120227/p1)を参考にインストールします。

> npm install -g ws

#2. 起動
> wscat -c ws://hogehoge:port/

#3. コマンド実行
WireSharkでチャットアプリの通信を記録して、SubscribeとMessage送信部分をそのまま叩いてみます。
<が受信で、>が送信です。

```
[murotanimari]$ wscat -c ws://mydemos1-1223107232.ap-northeast-1.elb.amazonaws.com:28080/cable
connected (press CTRL+C to quit)
  ### 接続が確率するとwelcomeが返却される
  < {"type":"welcome"}

  ### Pingを定期的に受信
  < {"type":"ping","message":1472068181}

  ### こちらがsubscription要求
  > {"command":"subscribe","identifier":"{\"channel\":\"RoomChannel\"}"}

  ### こちらがsubscription要求の返事
  < {"identifier":"{\"channel\":\"RoomChannel\"}","type":"confirm_subscription"}

  ### こちらがメッセージ送信要求
  > {"command":"message","identifier":"{\"channel\":\"RoomChannel\"}","data":"{\"message\":\"\343\201\213\343\201\213\343\201\213\",\"action\":\"speak\"}"}

  ### こちらがメッセージ受信
  < {"identifier":"{\"channel\":\"RoomChannel\"}","message":{"message":"\u003cdiv class=\"message\"\u003e\n  \u003cp\u003e\343\201\213\343\201\213\343\201\213\u003c/p\u003e\n\u003c/div\u003e\n"}}

```

若干文字化けしましたがプロセスと書式が分かったので後日利用していきます。
Level script

#### [1 - Triggerable Light](https://www.youtube.com/watch?v=9kzbsH8HgVY)：単純に近づいたらON/OFFする明かり（LevelBlueprint）
+ (Trigger等の)アクタを選択、シーン中で右クリックしAdd Event->BeginActorOverlap等とすることで、対象アクタと連携したLevel Blueprintの編集に即座に入ることが可能。

#### [2 - Blueprint Pickup](https://www.youtube.com/watch?v=q_9QKzLK-sU&index=46)
+ Content Browserのアセットを右クリックし、Asset Actions->Create Blueprint Usingを選ぶことで対象アセットを使用したClass Blueprintを直で作れる。

#### [3 - Custom Projectile](https://www.youtube.com/watch?v=ojvuTz4KCfE)
+ Blueprint Editorにて、まず「Static Mesh」コンポーネントを追加し、その後Static Meshカテゴリで対象となるMesh（動画ではCorner）を選択する。

#### []()
+ AAA

#### [5 - Communicating Between Blueprints](https://www.youtube.com/watch?v=s5pIrpI7py8)
+ Custom Event/Event Dispatcher

#### []()
+ AAA

#### []()
+ AAA

#### []()
+ AAA

#### []()
+ AAA

#### []()
+ AAA

#### []()
+ AAA

#### []()
+ AAA
「ionic2」まとめ連載（其の１０・静的なページ内容を変更する）

#静的なページ内容を変更する

こんにちは、mucunです。

今回は、静的なページ内容の変更方法について紹介したいと思います。
静的なページ内容とは、ページを表示したときの条件がいかなる場合も、
変わらない内容のことを言います。
ページのタイトルや、共通のデザインなどがそうです。

逆に、条件によって変わる内容のことを動的な内容と言います。
人毎に異なる「ようこそ、○○さん」等のメッセージや、
ECサイトでの「商品名・商品画像・価格」などがそうです。
つまり、一定のテンプレートに、状況によって様々設定される内容のことです。

今回は、上記前者の変更方法についてです。

「ionic2」モジュールの構成は、３種類のプログラムから成っています。
これは、一般的なWEBページと同様の形式です。
　① html ： 静的な表示内容の直書きや、動的な表示内容用のテンプレートを設定
　② scss ： 文字フォントや、文字色・背景色など見た目に関わる設定
　③ typescript ： 動的な表示内容を制御するためのアルゴリズムを設定
<img width="390" src="https://qiita-image-store.s3.amazonaws.com/0/126499/f544dc6b-74ef-c3db-b040-1948258b0a6a.png">

静的な内容は、主に「①html」にて直書きされている内容です。
それでは変更してみましょう。
テストには、前の回（[其の４](http://qiita.com/mucunwuxian/items/54983981a279cda82376)）にて取得した公式チュートリアルを使います。

先ず、コマンドプロンプトにて、対象の「ionic2」モジュールのフォルダの中で、
「ionic serve」コマンドを実行します。
<img width="600" src="https://qiita-image-store.s3.amazonaws.com/0/126499/44444f44-4efa-33e9-69f7-c94a2a8be923.png">
（※前の回（[其の４](http://qiita.com/mucunwuxian/items/54983981a279cda82376)）にて、"Hello Ionic"が"Good Morning Ionic"に変更されています）

そして、エディターで「(「ionic2」フォルダ)/app/hello-ionic.html」を開きます。
<img width="600" src="https://qiita-image-store.s3.amazonaws.com/0/126499/1e264934-59c9-cfca-8527-68cd296d0f97.png">

前の回（[其の４](http://qiita.com/mucunwuxian/items/54983981a279cda82376)）で、文言を変えることはやったので、
今回は、[公式ページのCards表記方法](http://ionicframework.com/docs/v2/components/#cards)を参考に、表示項目の追加をしてみましょう。

以下のコードを最終行（</ion-content>と書かれている行）の上に挿し込みます。

```html:追加コード
<ion-card>

  <ion-card-header>
    Card Header
  </ion-card-header>

  <ion-card-content>
    This is static content!
  </ion-card-content>

</ion-card>
```

修正後ソース
<img width="600" src="https://qiita-image-store.s3.amazonaws.com/0/126499/6d2443ec-5932-042d-c891-574e24188751.png">

すると、画面に反映されます
<img width="600" src="https://qiita-image-store.s3.amazonaws.com/0/126499/7efc0faa-b0e6-df16-c93b-2c5f43820d31.png">

上記コードの内容は、html上に直書きで書き込んでいるので、
どんな条件においても、この文言でページ上に表示がされます。
この意味は次回（[其の１１](http://qiita.com/mucunwuxian/items/aee92f8ad6442cd7c210)）で動的なページ内容表示を確認すると分かると思います。

以上、静的なページ内容の変更についての記事でした。
今回はここまでとなります。
読んで下さった方、ありがとうございました。(*‘∀‘)

[👈【其の９・公開サンプルを動かす】](http://qiita.com/mucunwuxian/items/a6e02222d311bb85c0bc)　　[👉【其の１１・動的なページ内容を変更する】](http://qiita.com/mucunwuxian/items/aee92f8ad6442cd7c210)
CentOS7 最小構成でNAT＋HostOnly接続する方法【VirtualBox】

# 概略
VirtualBox5.1＋CentOS7でNAT・HostOnly接続設定する手順です。
HostOnlyアダプタ経由でのSSH接続が上手くいかずかなり苦戦しました。
ポイントは次の3点です。

* ゲストOSのルートテーブルにHostOnlyサブネットを追加する
* ゲストOSのIPアドレスは固定IPで設定する（DHCPをつかわない）
* ホスト側ネットワーク設定は既定

上述のようにDHCPを使わない方法としています。
注意深く設定すればDHCPでも上手く設定する方法があるかもしれませんが、本稿は固定IPによるHostOnly接続方法の紹介です。


# ホストOS側設定（HostOnlyネットワーク設定）
ホスト側のHostOnlyネットワーク設定を確認します。

VirtualBox環境設定より、「ネットワーク」>「ホストオンリーネットワーク」の設定を確認します。
この例ではアダプター名：「**VirtualBox Host-Only Ethernet Adapter #2**」
![VirtualBox環境設定(1).png](https://qiita-image-store.s3.amazonaws.com/0/66448/f40341fc-fba5-5b1c-192f-09ef6ab17dce.png)

IPv4アドレス・ネットマスクを確認します。
この例では「IPv4アドレス：**192.168.56.1**」「IPv4ネットマスク：**255.255.255.0**」
![VirtualBox環境設定(2).png](https://qiita-image-store.s3.amazonaws.com/0/66448/3e32e86a-9ae1-4ee6-6bee-5ec026d53071.png)

DHCPは使用しません。
![VirtualBox環境設定(3).png](https://qiita-image-store.s3.amazonaws.com/0/66448/12783c35-1adb-5233-1c04-9930b5dacebc.png)


# ゲストマシン ネットワーク設定

**アダプター1**には「割り当て：**NAT**」を設定します
![Guestマシンネットワーク設定(1).png](https://qiita-image-store.s3.amazonaws.com/0/66448/afdafe7e-d7bf-09c5-be16-6ab9edcfb41c.png)

**アダプター2**をつぎのように設定します。

* 「割り当て：**ホストオンリーアダプター**」
* 「名前：**VirtualBox Host-Only Ethernet Adapter #2**（前述）」
* 「MACアドレス」…ゲストマシン側NICのMACアドレスです（ゲストOS側の設定で迷ったらここで設定したMACアドレスと一致していることを確認する）

![Guestマシンネットワーク設定(2).png](https://qiita-image-store.s3.amazonaws.com/0/66448/3ef7fac0-2aac-2060-1b84-fdc2a53b9684.png)




# ゲストOS側設定（nmtui）

「**Edit a connection**」よりゲストOS側アダプタのIPアドレス設定をおこないます。
![nmtui(1).png](https://qiita-image-store.s3.amazonaws.com/0/66448/b5b2559b-aa7d-ffcf-c793-cee9375cd4e9.png)

「**enp0s8**」（HostOnlyアダプタ）を選んで「**Enter**」キーで指定アダプタの設定を開始します。
（参考：「**enp0s3**」はNATアダプタ）
（参考：日本語ロケールではアダプタ名が文字化けすることがある。その場合はMACアドレスを確認しアダプタを識別する）
![nmtui(2).png](https://qiita-image-store.s3.amazonaws.com/0/66448/330db449-8be1-4b64-bfaa-fabd4682409e.png)

以下のように設定する。

* IPv4 CONFIGURATION：**Manual** （既定値は***Automatic***なので変更する）
* Addresses：**192.168.56.101/24** （固定IPアドレスおよび末尾に「**/24**」を付加する）
* Never use this network for default route：✔
* Require IPv4 addressing for this connection：✔

（**重要**：上記「**/24**」のようにサブネット範囲を付記することで**当該サブネットを行き先とするパケットは本アダプタへルーティングされる**ようルートテーブル・エントリが自動で追加される）
![nmtui(3).png](https://qiita-image-store.s3.amazonaws.com/0/66448/1b5cfb29-fbbb-612f-67ea-656be9d9b508.png)

以下のように設定する。

* Automatically connect：✔
* Available to all users：✔

![nmtui(4).png](https://qiita-image-store.s3.amazonaws.com/0/66448/d29de637-7548-dad5-6f32-beb320b2adf1.png)


# ゲストOS NIC再接続

下記コマンドまたはNICの切断・再接続によってNIC設定の変更をシステムに反映させます。

```
# systemctl restart network
```

![ゲストマシンNIC再起動.png](https://qiita-image-store.s3.amazonaws.com/0/66448/57184244-b905-24ed-2f41-6c6964377346.png)

# 結果確認
## 「ip r」コマンドの結果（ルートテーブル）
```
# ip r
```

「192.168.56.0/24」サブネットに対する送信パケットはenp0s8アダプタへ送るようルートが追加されています。（３行目）

```
default via 10.0.2.2 dev enp0s3  proto static  metric 100
10.0.2.0/24 dev enp0s3  proto kernel  scope link  src 10.0.2.15  metric 100
192.168.56.0/24 dev enp0s8  proto kernel  scope link  src 192.168.56.101  metric 100
```

上記設定が確認できたら外部からゲストマシンへアクセス（ping, SSH）できることを確認します。