OmniAICreator/Qiita-1.07M huggingface dataset:
[備忘録]自作コードトレース履歴　メソッド

-------------------------------

メソッド内で使用するstatic

	インスタンス化せずにそのクラスにアクセスが可能
	クラス名.変数名で呼び出しが出来る
	自分のコードの中では
	static final int　～
	private static final int　～
	そのクラス内部でのみ使用出来るものと、別クラスで使用出来る2つを使用していた。

-------------------------------

ジェネリックス <>

	例えば　private ArrayList<string> list = new Arraylist<>();
	というのがあった時、listの中にはstring型しか入れれませんという型を制限する機能
	他にも機能があるかもしれないが、ここでは割愛。

-------------------------------

コンストラクタ

	クラス名()と表記されているものはコンストラクタといって、メンバ変数を設定できるもの。
	クラス名(String name, int age)であれば、
	nameにはString型のageであれば、int型のオブジェクトを設定することができる。

-------------------------------

@Override

	オーバーライドしてますよ～って事。
	オーバーライドとは？
	親クラスで定義したメソッドを子クラスで定義しなおす事。

-------------------------------

protected

	サブクラス内で定義されたprotectedにはスーパークラスへアクセス出来ますよ～という意味合いをもつ。
	例)
	protected void onCreate(Bundle savedInstanceState) {
        	super.onCreate(savedInstanceState);
        	setContentView(R.layout.activity_main);

        	initView();
    	}
	
	上記例だと、メソッド内に「super.」が使用されている。
	これは、スーパークラス内(親クラス)で使用しているonCreateにアクセスしたい時に使うもの。

-------------------------------

onCreate

	Activityが初めて生成された状態のものを書く。
	初期状態はこんな形ですよ～っていうのがonCreate。

-------------------------------

onResume

	Activityが表示された時のものを書く。
	自分のコードの中では、viewを再表示した時の表示を記載。

-------------------------------

onPause

	Activityの一時停止。
	例えば時計をviewの中で表示させる処理だと、アプリが起動していない場合は必要はない。
	なのでonPause内で一時停止させる処理を書く～だとかが使い方。

-------------------------------
会社にあった雑誌読んでみた

## 目的
少しでもプログラミングや開発の理解を含めようと思ったため

### 内容
- NoSQL, RDBMSの仕組みをしておくべき<br>
https://academy.gmocloud.com/qa/20160509/2284

- AngularJS Backborn.js のJavaScriptのフレームワークがいい
可読性やコードの美しさ←書き直しに便利
JQuery sublimeTextを読んで練習
SQLインクジェクション、OSコマンドインクジェクション対応が不十分になる

- 全体最適のために1人が負担するのはコスパがいい
- ソフトウェアエンジニアに向いている人間は『問題解決能力の高い人』

- バイナリ形式←テキスト形式で文字だけのデータでないもの
いいコードとは無理なくよめてメンテナンスしやすい
### テキストエディタの効果
- ソースコードの色付け
- 自動的にインデントをそろえる
- 長い名前を自動的に補完
- リファクタリングの支援←プログラムの最終的な動作を変えずに内部を綺麗にする

実装単位の大きさは粒度という
- 問題の切り分けが大切
- この実装はどんな問題を解決するものなのかを常に意識する

### パラメータとは
１．外から渡す 
２．何らかの値である
 ３．結果に影響を与える（ことが多い）

文字列の文字エンコーディングを変換する関数ってどゆ意味？
エンコーディング、、、「整数値」から「文字」へと変換するための変換表が「文字エンコーディング」

粒度を下げることによってユニットテストしやすくなる、最適化しやすくなる
→そのため粒度を下げる
まとめてやらずに細かい単位でやれば単純化できる
コミット名やメソッド名等名前をつけることはかなり重要
メゾットを間違えたクラスに実装してはいけない←間違えたコミットを行なっている

練習として他の人のコードを小説を読む感覚で読む

### 情報が少なすぎる報告は避けるべき
・問題の再現条件
・実際の結果
・期待される結果
を伝える



### Atomとは
githubによりWEB技術によって作られたエディタ
HTML,css,js等ブラウザで動くWebページを構成する技術なOSのサポートを気にする必要がない

- Dockerの良さよくわからん<br>
https://knowledge.sakura.ad.jp/13265/
https://qiita.com/itachi2901/items/196ae0c2591e085cbecb

コンテナ型のサーバ仮想化技術とは？
https://takaxtech.com/2017/12/13/article110/
デプロイの課題を解決するもの
Rubyアプリケーションでもpythonアプリケーションでも同じやり方でデプロイできる

Reactってすごい
Reactだけでもアプリケーションを作れる
->体型的理解は今後深めていく

### DOMとは
* ツリー構造とも呼ばれる階層構造を取る
* それぞれノードという言葉で説明される
* WEBページとJavaScriptなどのプログラミング言語とを繋ぐ

##解決しなかった問題点
プログラミングでいう真偽値ってなんぞ
Windows10のローカルユーザーアカウントを追加する

Windowsのログオンユーザー名に日本語が含まれていると、アプリケーションによっては思いもよらないエラーが起きたりします。  
その場合、ログオンユーザー名が英数字のみのユーザーに変える必要がありますが、単にユーザー名を変更するだけではユーザーフォルダ名が変わらないため意味がありません。

そこで新しいユーザーとして、英数字のみのユーザー名のローカルユーザーアカウントを作る手順を記載します。

# ローカルユーザーアカウントを作成する
## アカウント設定画面
1. スタートメニューを開き「アカウント」と入力し、検索結果から「アカウントの管理」をクリックする。  
![1.jpg](https://qiita-image-store.s3.amazonaws.com/0/1136/edfcab01-9cda-3a93-27c6-d3c551802574.jpeg)

2. 「家族とその他のユーザー」＞「その他のユーザーをこのPCに追加」と進みます。  
![2.jpg](https://qiita-image-store.s3.amazonaws.com/0/1136/e59b53b8-1824-28d2-c2f4-a427badc8dca.jpeg)

3. 今回作成するのはローカルユーザーアカウントであるため、「このユーザーのサインイン情報がありません」＞「Microsoftアカウントを持たないユーザーを追加する」と進みます。  
![3.jpg](https://qiita-image-store.s3.amazonaws.com/0/1136/ad85c73d-4580-708f-8243-0f5d6c7d532b.jpeg)  
![4.jpg](https://qiita-image-store.s3.amazonaws.com/0/1136/e2345c6a-8c15-036e-1c09-5ef5fd2a6533.jpeg)

4. 新しいユーザーアカウントのユーザー名、パスワード、パスワードのヒントを入力し、「次へ」をクリックします。このとき、ユーザー名は英数字のみとするようにしましょう。  
![5.jpg](https://qiita-image-store.s3.amazonaws.com/0/1136/d973063a-6b9a-8c48-31ba-fbc3b7f7af7d.jpeg)

# 作成したユーザーアカウントを管理者とする
上記の手順で作成したユーザーアカウントは管理者権限を持たないため、必要があればそのアカウントを管理者と設定します。  
![6.jpg](https://qiita-image-store.s3.amazonaws.com/0/1136/5f7aebd0-fa01-9c0e-6733-76e132cce2aa.jpeg)  
![7.jpg](https://qiita-image-store.s3.amazonaws.com/0/1136/0b9376a8-f0e8-c6aa-3252-06dfb339597b.jpeg)

# ユーザーアカウントを削除する
ユーザーアカウントが不要になった場合は、アカウントの管理画面から削除することができます。  
![8.jpg](https://qiita-image-store.s3.amazonaws.com/0/1136/59a3ce34-c55d-45fb-4355-0ebcd856227d.jpeg)
RouterBOARDをAmazonで購入したら使用できないことが判明


# 初めに

評判の高かった無線LAN付のルータ(MikroTik RouterBoard hAPac) をAmazonで購入しました。
USからの直送なので、時間がかかるかなと思った以上早く入荷しました。
本家ホームページからwinbox.exe をダウンロードし、ファームウェアを更新するところまで
来た時の事でした。
![IMG_0380.JPG](https://qiita-image-store.s3.amazonaws.com/0/184069/40abef7e-f23e-e8df-b38b-ca426ce72857.jpeg)




# 技適マーク
これUS版か、EU版かどちらかなと思い、何の気なしに、ルータの裏を見ると、あるはずの
技適マークが無いじゃありませんか。技適マークが無い機器を使用すると電波法違反です。
あれぃ、ちょっと青ざめました。US版でも構わなかったのです、使用できれば。
Amazonの商品の説明には、国内技適取得シール貼付済とあったのに。

# 問題点
これは、日本の競争力に関わる問題だと経団連も問題にしているようです。
（個人の）研究開発業務において活用を検討する新規技術を搭載した通信機器・通信モジュールに
関して、技術基準適合証明を取得しておらずとも海外より輸入および（個人の）研究開発への利用
を許容すべきである。かっこ内は投稿者の付け足し。あと輸入はお咎めなし。

大体、基準がUS(ジャイアン),EU(スネ夫),JP(のび太)と３つもあるのが不合理だよね。
MRA何それ。
相互承認できないのも大体(ジャイアンな)USのせいだとは思われるのだけれども。
放っとくと又、US(ジャイアン)から非関税障壁だとか叩かれるだろうに。

※5GHz帯のWi-Fiは、USとJPで利用できる帯域は異る。
　USでは5725MHzから5825MHz帯でも通信できるが、JPでは認められていない。

訪日外国人は、入国の日から９０日に限って利用可能だとか、理解不能。

あと、Buffalo無線ルータのファームウェアをOpenWRTに載せ替えるのも違法になるのだろうか？

# 参考
[技適マークの運用がそろそろ意味不明となりつつある件](https://news.yahoo.co.jp/byline/yamamotoichiro/20140528-00035764/)
[「技適」の見直しで、日本の競争力向上を](https://www.asahi.com/articles/ASL2Q745GL2QUEHF00G.html)
[イノベーションを阻害する「技適」。経団連などが規制改革要望を提出](https://smhn.info/201802-keidanren-reform-giteki)
[Android P開発者プレビュー版が配信。日本の開発者は合法機体消滅へ](https://smhn.info/201803-android-p-giteki)
[日本における無線通信機器の基準認定制度の概要](http://www.tele.soumu.go.jp/resource/j/equ/mra/pdf/23/n01.pdf)
[無線機器の「技適マーク」の扱いに対する総務省の回答](https://srad.jp/story/14/07/01/0457205/)
[技適マークのない機器で無線を使っていたので自首してきた。](http://tojikomorin.sakura.ne.jp/blog/2016/08/09/技適/)
[技適(技術基準適合証明)の調べ方](https://qiita.com/blucky@github/items/371448990502e87143eb)
[最近のiPhoneには"技適"マークがない](https://news.mynavi.jp/article/20130406-iphone_why40/)
[内閣府、技適未取得デバイスの国内持込みの規制緩和を議論](https://robotstart.info/2018/02/05/giteki.html)
# 最後に
しらべ方が足りないので、間違っている点は指摘して下さい。
よろしくお願いします。

以上
solidity仕様まとめ

solidityのコードを読んでいて頻出するコードの意味をまとめました。

## データ保存領域
Storageはブロックチェーンに書き込まれ永続的に保存されるが非常にGasを消費する。Memoryはコントラクトの実行が終わると破棄される、安価。
関数外で宣言された変数(ローカル変数)と状態変数はstorageに保存される。関数の戻り値はmemoryに保存される。また外部関数の引数はcalldata(関数の引数が格納されるmemoryのようなもの)に保存される。
## アクセス権限
-- private
定義されたコントラクト内でのみ参照可能。

-- internal
定義されたコントラクト及びそのコントラクトを継承したコントラクトから参照可能。変数はデフォルトでinternal。

-- external
外部からのみ参照可能。ただしthis.f()とすれば内部からも参照できる。

-- public
定義されたコントラクト及びそのコントラクトを継承したコントラクト及び外部から参照可能。関数はデフォルトでpublic。

-- externalとpublicの違い
externalの方がGasの消費が少ない。これはexternalは関数の内部呼び出しを考慮する必要がないからである。関数の内部呼び出しの際引数はmemoryに書き込まれるので、calldataから直接読み取る外部呼出しと比較してGasを消費する。
またthis.f()は非常にGasを消費するので使わないほうが良い。

## 関数修飾子
-- view
状態を変更しない(ブロックチェーンに書き込まない、storageに書き込まない)ことを宣言する。
storageから読み込んだり、読み込んだデータを処理することはできる。

-- pure
viewに加えてstorageからの読み込みもしないことを宣言する。つまり引数のみが処理可能。
Docker上のカレントディレクトリ

dockerを使っていて、sys.path.appendを使って自作のモジュールをインポートしようとしていて、うまくいかなかったときです。

カレントディレクトリを勘違いしていたというただのアホです。


ディレクトリ構成

```
app_name
  modules
    testmodu
      modu.py
  app.py
Dockerfile
```


sys.path.appendはapp.pyをローカル環境で実行すると以下で通ります。

```
import sys
sys.path.append('modules/testmodu')
from modu import hello
print(hello())
```

Docker上でやってみると以下うまくいかない

間違ったapp.py

```
sys.path.append('modules/testmodu')
from modu import hello
```

dockerのカレントディレクトリを考慮してパスを指定しなければいけないです。場合によって違うと思いますが今回は下のディレクトリで

正しいapp.py

```
sys.path.append('app_name/modules/testmodu')
from modu import hello
```

ただのアホですね。はい。
どうやったらこういうのパって気付けるんだろう。
Visual Studio CommunityでAndroid-SDK入れたのに入ってない

Visual Studio2017 Communitをインストールするするときに、モバイル開発でJavaScriptとCordovaを使う項目を選んでインストールする際に、オプション指定でAndroid-SDKもインストールするように指定しました。

実際に今、このように設定されています。
![キャプチャ0408.PNG](https://qiita-image-store.s3.amazonaws.com/0/20977/69301edb-0dfa-6632-66d9-d608d5fd1716.png)

でも、エクスプローラーで調べれると.Androidというフォルダで10GB使っていますが、SDKとしてファイルがありません。
Visualstudioが頭に付くファイル名でデバッグのファイルが数個あります。

タブレットPCのため、内蔵の記憶容量が60GBで、残り5GBにまで減ってしまっているため、Android studioのインストールも困難と思い、このまま実機でのみデバッグする方向で動きます。
エミュレーターは、ブラウザベースのものは使えます。
今回、HAXMのエミュレーターをインストールする作業をしています。

Windows10 HOMEなので、hyper-Vは使えないためです。

MacBookAirの方は、残り10GBなので、困っています。
Macの方は、VisualstudioでXamarinの環境になっています。
ころらは、ちゃんとAndroid-SDKがインストールされていることを確認できています。
今回は、JavaScriptとHTML、CSSで作っているため、Macの環境を使えないのです。

Maacの方は、内蔵SSDが128GBのモデルです。
XcodeをアンインストールしないとVisualstudioをインストールできないので、iOSのアプリは作れないです。

早く内蔵のSSDが大きいパソコンを買って、開発環境を万全にしたいと思っています。

Monacaを使うことが出来たら、本当に助かるのですが。

私が最初にAndroidアプリを作った時と、かなり開発環境が変わっているため時代に合った方法に私も進化している途中です。

MacのSSDの容量が少ないので、環境をせっかく作っても消したこともあり、再構築していることも、今回のドタバタの原因です。


2018/04/08追記
一応SDKインストールできました。
詳しくは、こちらを読んでください。
https://qiita.com/masaru21/items/02f560836e973b352c3a
Vuejs+Cordovaの開発をvue-cliを使って数コマンドで試せるプラグインを書きました

Vue-CLI3.0に対応したCordova用のプラグインを作成しました。まだbetaではありますが、最低限動きます。

[https://github.com/dekimasoon/vue-cli-plugin-cordova](https://github.com/dekimasoon/vue-cli-plugin-cordova)

## 使い方
事前に [Vue-CLI3.0](https://github.com/vuejs/vue-cli) のインストールと、[Cordovaの開発環境の準備](https://cordova.apache.org/docs/en/latest/guide/cli/index.html)が必要です:wink:

```sh
$ vue create my-project     # Vue-CLI3.0でプロジェクトを作成します。TSにも対応しています。
$ cd my-project
$ vue add cordova           # 本プラグインをmy-projectに追加します
$ npm run cordova-serve     # cordovaに適した形でwebpack-dev-serverを起動します

# 別のタブで 
$ cordova platform add ios  # my-projectの対応プラットフォームにiOSを追加します
$ cordova run ios           # my-projectをiOS上で実行します。YATTA!
```

その他プラットフォームについてなど、もう少し詳しい内容を[スタートガイド](https://github.com/dekimasoon/vue-cli-plugin-cordova/blob/master/docs/StartGuide.md)に書きました。こちらも合わせて御覧ください。

## シミュレータ・実機でのHot Reload対応
`npm run cordova-serve`した後に、`cordova run ios`してもらえれば、それだけでHotReloadするはずです。とても便利 :wink: 
実機でうまく動かない場合は、PCとテスト用端末が同じLANに接続していることと、テスト端末->PCのアクセスを阻むファイヤウォールなどが無いことをご確認ください。

仕組みとしては、以下になります。

1. pluginの初期化処理で、`public/cordova`から`platforms`へのシンボリックリンクを作成しておく。こうすることで、webpack-dev-serverから`platforms`以下のファイルにアクセスできるようになる。
2. `npm run cordova-serve`時に、`www/index.html`をリダイレクト用のhtmlに差し替える。
3. iOS/Android上でアプリケーションが実行されると、まず(2)のリダイレクト用のindex.htmlが読み込まれる。このリダイレクト用のindex.htmlで、webpack-dev-serverが起動しているIPにリダイレクトさせる。
4. リダイレクトしただけだと、cordova.jsや各plugin用のjsが読み込まれないため、(1)で用意したシンボリックリンクを使って、動的に適切なcordova.jsを読み込ませる。

この方法はシンプルですが、デメリットもあります。
一番大きいのが、webpack-dev-serverが起動しているIPへのリダイレクトを許可にするために、allow-navigationをユルユルにしておかないといけない点です。[TODOも付けてはいますが](https://github.com/dekimasoon/vue-cli-plugin-cordova/blob/master/generator/templates/config.xml#L18)、ご注意ください。

## 最後に
「今更Cordovaなんてダサいよな。ReactNativeかWeexだよな。」という声がどこからか聞こえて来る気もしますが、web、iOS、Androidの全てにワンソースで対応でき、かつネイティブ通知なども実装できるCordovaは、リソースの少ない個人開発者にとってまだまだ使える技術だと思っています。

大本のVueCli3.0自体がまだbetaだったり、本プラグインにも[未実装なTODOがありますが](https://github.com/dekimasoon/vue-cli-plugin-cordova#todo)、Vuejs+Cordovaに関心がある方はぜひ一度使ってみてください。
動かねーぞという罵声、お待ちしております :goat:
Raspberry PiをC言語で動かしてみる 

ラズベリーパイでプログラムを開発するにはPythonかJavaを覚えないといけないような気がしていつもそこで止まっていた。
今日、よく考えたらgccが使えるのでC言語で開発すればいいと今更ながら思いついた。

[GPIOでLEDの点滅(C言語)](http://make.bcde.jp/raspberry-pi/gpio%E3%81%A7led%E3%81%AE%E7%82%B9%E6%BB%85c%E8%A8%80%E8%AA%9E/ "GPIOでLEDの点滅(C言語)")

上記の記事を参考にC言語でLチカを組んでみた。
まずはラズベリーパイ上でgitで「wiringPi」ライブラリをインストール＆コンパイル

    $ git clone git://git.drogon.net/wiringPi
    $ cd wiringPi
    $ ./build

サンプルソースをviで打ち込んでgpio_test.cで保存

    #include <wiringPi.h>
    #define GPIO17 17
    
    int main(void) {
    int i;
  
    if(wiringPiSetupGpio() == -1) return 1;
        pinMode(GPIO17, OUTPUT);
        for(i=0; i<10; i++){
            digitalWrite(GPIO17, 0);
            delay(950);
            digitalWrite(GPIO17, 1);
            delay(50);
        }
        digitalWrite(GPIO17, 0);
  
        return 0;
    }

以下を打ち込んでgccでコンパイルしてみるけど、
    $ gcc -o gpio_test gpio_test.c -I/usr/local/include -L/usr/local/lib -lwiringPi


'wiringPiSetupGpio'に関する定義されていない参照です
・・・
とエラーになる。たぶんライブラリがちゃんとリンクされていないんだろうなと色々見てみると、上記の-lwiringPiを-IwiringPiとTypoしていた。
小文字のLと大文字のIの書き間違いでした。小文字のLが正解です。

そこを修正するとコンパイルに成功したので
    ./gpio_test
と打つと
wiringPiSetup: Unable to open /dev/mem or /dev/gpiomem:Permission denied.

とエラーになる。
なんか実行権限がいるとか書いてあった記憶があったので

sudo ./gpio_test

と打つと無事動きました。
rubyでモンティホール問題に挑戦

#rubyでモンティホール問題に挑戦

##環境
ruby 2.4.1
##概要
[プログラミングのための確立統計](https://www.amazon.co.jp/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE%E7%A2%BA%E7%8E%87%E7%B5%B1%E8%A8%88-%E5%B9%B3%E5%B2%A1-%E5%92%8C%E5%B9%B8/dp/4274067750)という本を読んでいたらモンティホール問題の話が出てきました。なので組んでみます。

### モンティホール問題って何？
３つの扉とヤギと車で構成されるゲームです。
詳しくは[ここから](https://mathtrain.jp/monty)

### ソースコード

今回作成したソースコードを置いておきます。
試行回数は10000に設定してあります。

```ruby:モンティホールプログラム
# 新たにモンティホール問題をセットするメソッド
def set_monty_hall_problem
    monty_hall_problem = Array.new(3).map{|t| "Goat" }
    correct_door_num = rand 3
    monty_hall_problem[correct_door_num] = "Car"

    return monty_hall_problem, correct_door_num
end

# その扉が正解かどうかを返却するメソッド
def correct_door? correct_door_num, open_door_num
    correct_door_num == open_door_num
end

# 扉を開示するメソッド
def open_goat_door correct_door_num, open_door_num
    goat_door_num =
        if correct_door? correct_door_num, open_door_num
            # 正解の場合、不正解のドアをどちらか開示
            [*(0..2)].select{|t| t != open_door_num}.sample
        else
            # 不正解の場合、もう片方の不正解のドアを開く
            [*(0..2)].select{|t| t != correct_door_num && t != open_door_num}[0]
        end
end

# 確率に変換してくれるメソッド
def change_probability sum, occurrence_num
   probability = (occurrence_num.to_f / sum.to_f) * 100
end

# モンティホール問題をプレイするメソッド
def play_monty_hall_problem trials_num
    not_change_door_count = 0

    trials_num.times do 
        # モンティホール問題と正解の扉番号を取得
        monty_hall_problem, correct_door_num = set_monty_hall_problem
        # 開けるドアをランダムに選択する
        open_door_num = rand 3
        # ヤギがいるドアの番号を取得
        goat_door_num = open_goat_door correct_door_num, open_door_num
        # 扉を変更しない場合
        not_change_door_count += 1 if correct_door? correct_door_num, open_door_num

    end
    not_change_door_probability = change_probability trials_num, not_change_door_count
    change_door_probability = 100 - not_change_door_probability
    puts "扉を変更しないで車が当たった確率：#{not_change_door_probability}%"
    puts "扉を変更して車が当たった確率：#{change_door_probability}%"

end

play_monty_hall_problem 10000
```

###結果
上記のソースコードを実行した結果を下記に記します。

```terminal:結果
扉を変更しないで車が当たった確率：33.33%
扉を変更して車が当たった確率：66.67%
```
それぞれの理論値は、
扉を変更しないで車が当たった場合が1/3
扉を変更して車が当たった場合が2/3
なので、近い値になっている事がわかるかと思います。

本を読むだけじゃ手に入れられない実感を得られたので今後もこのように検証していきたいと思います。
Jetson TX1にOpenCV 3.4をインストールしてみた

## 環境
- Jetson TX1
- JetPack 3.2
- OpenCV 3.4.1

## 注意点
TX1のストレージの空きが少ないため、外部SSDやSDメモリカード上で実行する。

## インストール
```
$ git clone https://github.com/jetsonhacks/buildOpenCVTX2.git
$ cd buildOpenCVTX2
$ vi buildOpenCV.sh
```
リビジョン(3.3.0)、ビルドディレクトリ($HOME/opencv)、python3サポート(OFF)等を変更する。

``` buildOpenCV.sh
...
# Python 3
sudo apt-get install -y python3 python3-dev python3-numpy python3-py python3-pytest -y
...
git clone https://github.com/opencv/opencv.git
cd opencv
git checkout -b v3.4.1 3.4.1
...
git clone https://github.com/opencv/opencv_extra.git
cd opencv_extra
git checkout -b v3.4.1 3.4.1
...
-DBUILD_opencv_java=OFF \
    -DBUILD_opencv_python2=ON \
    -DBUILD_opencv_python3=ON \
    -DENABLE_PRECOMPILED_HEADERS=OFF \
...
```

```
$ ./buildOpenCV.sh
$ cd $HOME/opencv/build
$ sudo make install
```
入門 Kubernetes の手順通りに進めても Ghost のデプロイが上手く行かない件

[入門 Kubernetes](https://www.oreilly.co.jp/books/9784873118406/) (原題: [Kubernetes: Up & Running](http://shop.oreilly.com/product/0636920043874.do)) の 14 章「実用的なアプリケーションのデプロイ」という章の「14.2 Ghost」にある Ghost のデプロイ手順をそのままやってみたのですが、動きませんでした。

Pod のエラーログを追っているうちにいくつかの問題が見つかったので、修正して本家のリポジトリに Pull Request を出しています。

* [Fix 14-4-ghost.yaml](https://github.com/kubernetes-up-and-running/examples/pull/14)

が、最近のリポジトリの動きをみてる限りでは取り入れてもらえるか微妙な感じなので、この記事を書くことにしました。

## 前提となるバージョン

大前提として `minikube` で動かしています。
`kubectl` も `minikube` も、この記事を書いている 2018/04/08 時点でだいたい最新だと思います。

```
$ kubectl version
Client Version: version.Info{Major:"1", Minor:"10", GitVersion:"v1.10.0", GitCommit:"fc32d2f3698e36b93322a3465f63a14e9f0eaead", GitTreeState:"clean", BuildDate:"2018-03-27T00:14:31Z", GoVersion:"go1.9.4", Compiler:"gc", Platform:"darwin/amd64"}
Server Version: version.Info{Major:"", Minor:"", GitVersion:"v1.9.4", GitCommit:"bee2d1505c4fe820744d26d41ecd3fdd4a3d6546", GitTreeState:"clean", BuildDate:"2018-03-21T21:48:36Z", GoVersion:"go1.9.1", Compiler:"gc", Platform:"linux/amd64"}

$ minikube version
minikube version: v0.25.2
```

また、この書籍の手順上、Ghost の最新の Docker image が参照されていますが、これは 2018/04/08 時点で 1.22.1 でした。

## 修正内容

上記の Pull Request を参照してください。

### Ghost の config ファイルのパスを修正

これは書籍のミスなのですが、元の config ファイルは書籍上では以下のように ConfigMap として登録しています。

```
$ kubectl create cm --from-file ghost-config.js ghost-config
```

`ghost-config.js` というファイル名で登録しているので、これをファイルシステム上にマウントした場合は同じ名前で参照する必要があります。

```diff
diff --git a/14-4-ghost.yaml b/14-4-ghost.yaml
index 6e534ce..15c297f 100644
--- a/14-4-ghost.yaml
+++ b/14-4-ghost.yaml
@@ -18,7 +18,7 @@ spec:
         command:
         - sh
         - -c
-        - cp /ghost-config/config.js /var/lib/ghost/config.js
+        - cp /ghost-config/ghost-config.js /var/lib/ghost/config.js
           && /entrypoint.sh npm start
         volumeMounts:
         - mountPath: /ghost-config
```

### 最新の Ghost の Docker image に合わせた修正

これはおそらく原著が出て以降のどこかで Dockerfile の定義が変わったようです。

```diff
diff --git a/14-4-ghost.yaml b/14-4-ghost.yaml
index 15c297f..f553ac0 100644
--- a/14-4-ghost.yaml
+++ b/14-4-ghost.yaml
@@ -19,7 +19,7 @@ spec:
         - sh
         - -c
         - cp /ghost-config/ghost-config.js /var/lib/ghost/config.js
-          && /entrypoint.sh npm start
+          && docker-entrypoint.sh node current/index.js
         volumeMounts:
         - mountPath: /ghost-config
           name: config
```

## それでもエラーが出たら

今後も Ghost 側の変更等の影響で動かなくなる可能性はあると思います。
その場合はやはり Kubernetes の Pod のエラーログを見ると良いでしょう。

今回の場合は Kubernets のダッシュボードからログを参照したところ、以下のようなエラーが出ていました。

```
cp: cannot stat '/ghost-config/config.js': No such file or directory
```
サイトを作っていて、スマホでのスクロールが綺麗にできない場合の対処法

## はじめに
スクロールが出る画面を作成してた際に、スマホでのスクロールの滑り（？）が悪く、なんでや！？と思ったので共有。

## 状況
ページ内コンテンツでスクロールができるアイテムを設置。
PC表示では特に気になる点はなかったが、スマホで確認していた際、スクロールの滑りが悪く、さっと指を動かしても、すぐにスクロールの動きが止まってしまう状態に。
滑らかじゃない！！動きが汚い！！使いづらい！！！！！！

## 原因
AppleはsafaciやwebViewに滑りの悪いスクロールをあえて設定しているらしい。（どうしてなんだ、Apple....）

## 対策
慣性スクロール（滑らかなスクロール）をするかどうかの制御をする場合はスクロールができる要素（外側）に以下をつける

```css
div{
  -webkit-overflow-scrolling: touch;
}
```

これだけで、動きがスムーズになり、問題解決しました。
同じ問題で困っている人がいたら、試してみてください。
知り合いがインシュアランステックなベンチャーに入りたいとか言い出したので自分が入るか的な観点で聞いて見た結果

## ヒアリング対象
保険業界１０年目のベテラン
もともとはリサーチ会社とかに勤めていた経験があり一生くいっパクれない仕事を求めて保険業界に来たけど将来なくなる仕事に選ばれてて不安らしい。

インシュアテックが海外で流行ってるから。国内でそんなベンチャーをやるかやりそうなところに転職したいということで、ベンチャーを無駄に経験していて、嫁が保険業界の人だから話がわからないわけじゃなさそうなので聞いてと言われたので聞いてみた。

## ターゲット

- 20代・30代

とりあえず損保とかもあるけどわかりやすい生命保険・医療保険・がん保険あたりで考えてみる。

##行動分析
###なんで若い人は保険に入りたいとおもうの？
- 20代で自動車保険とかの必要な損保を超えて入ってくれるお客さんは少ない。
- 医療は親が子供の頃から積んでいるケースが多いので本人からは入ろうとしないし、必要性がない。

###自分たちから入るタイミングは世間的には
- 結婚
- 出産
- 家族の大病
- 親やパートナーに言われて

20代、30代でありがちなライフイベントがきっかけになる場合が多い。

#####この人たちはどうして入る

- 自分がもし病気になった・死んだ場合に安心したい

#####この人たちがよく入る保険(損保意外)

- 医療保険
- 死亡保険
- 学資保険
- がん保険

####この人どこから保険に入る？

- ネット 2%-4%
- ほとんどの人が店舗型または訪問営業から入る。

####これの理由

- 貯蓄型保険がほぼ対面販売
 - 学資とか。戻り率が高い商品つまりみんな入りたい商品は対面やと。
 - そうなると他も一緒に入るし、販売会社(代理店)の営業戦略も概ねその戦力をとる。
- 保険商品のメリット・デメリット・保証条件などがわかりづらい。結局のところ意識高い系じゃない人は人に聞きたい。

###インシュアランステックという分野はこれを解決するの？
####僕が契約する太郎さん役として知人に質疑応答してみた

- 28歳でデキ婚しゃいました。
- 親と奥さんからあんたが明日病気になったら子供どうすんの言われた
- 将来の学費が不安や。会社も一生は面倒見てくれる時代じゃないし・・・
- 中堅商社の営業マン。年収450万。
- 奥さんは大学の同級生。中小広告代理店で企画のお仕事をしていて年収400万だったけど。１年間の産休。保育園が見つからなくれば延長も・・・
- 夫婦で貯蓄300万。ただ、新婚旅行にはいけないので結婚式を豪華にやる都合でご祝儀いただいてもウェディングフォト等も含めて100万くらい出る予定あり。
という太郎さん。

####太郎さん
- 生命保険には入っておかないと
- がん保管と医療保険ってどないしたらええにゃろ
- 学資保険も入っておきたいけど・・・

たまたまネットを調べていたらネットで売ってくれるサービスが最近はたくさんあることに気がついた。

#####太郎さん 
インターネット診断をしたところ。

- がん保険は必要。
- あなたは医療保険には入る必要なし。
- 生命保険は必要ですね

と出たと。

ここで太郎さんは疑問に思う。
あれ医療保険入らなくて平気なの？
学資保険は？？

####太郎さんのケースの要因
- 医療保険に入らなくていい判定の理由
 - 貯蓄がそこそこある
 - 高額医療費制度がある
 - 健康保険組合のセーフティネットがある
- 学資保険
 - 対面販売しかないからメニューに出ない

####太郎さんは思う！

- いやいや200マンはあるけど住宅購入のことを考えたら一円足りとも使えないし。35歳までにもっと貯金しないとまずい。
- 先進医療は？個室は？長期になっちゃった場合は？がん以外になった時本当に救われるの？
- フリーランスとか独立した時はどうなるの？(国民健康保険でも一緒なの？)

####太郎さんはヘルプや自動回答チャットで検索する

- (太郎役の僕としては)ちんぷんかんやと

- よし保険の窓口に相談だ！
- そういえばアフラックは学資保険の利率よかったからアフラック土日に呼び付けよ。


あれ人が来た方が便利だったな!
となるのが課題じゃないかという結論になった

###インシュアテックが今後普及するための課題やインプレッションまとめ

- 仮に僕らの業界の技術的なところだけで解決するならAI回答の仕組みが相当に高度でないといけない。
- 僕が質問しただけでもここに書いた大雑把なものの他に、この場合どうなるのというものを大量に質問しました。現在のネット販売保険サービスは簡単なフローチャートの分析みたいなのはありますがここまでは答えてくれるものは知りません。
- 有人チャットで対応するとしたらそれは既存の保険代理店と何が違うのですか？既存の保険代理店が電話・メールの他に・チャット受付を始めればいい話だと
- 先日、コインチェック事件もそうだけど金融商品の取り扱いはその人の人生を大きく左右してしまう。いわゆるネットWeb業界のスタートアップ的なノリで手を出して良い分野ではない。専門的な知識と経験がある方の協力が必須ではないでしょうか？
- 業界の動向としてただのネット販売や性格分析テストみたいなレベルの自動回答フォームでインシュアテックとかAIとか言っている傾向があるように見えるから、本当に技術があるのか見極め大事じゃないかと思う。
- 一言でいうと「その人の人生を背負えるAIを実装できますか？」ということになる。
- ただ、人と会うのは面倒だし、家にあげられる状態にするのも億劫なので、以上の懸念を包括的に解決できるアイデアやテクノロジーを有しているとか、AIを専門的に研究した人がいるような体勢を確保できるベンチャーなら入ったら面白そうな分野だと感じました。
JavaScriptの変数ってなんだっけ


## はじめに
これからJSやjQueryを学ぼう、という人がおそらくはじめに勉強するのが、JSの基本文法でしょう。
新しい言葉がいくつも出て来て、勉強を進めるうちに、あれ？この単語ってなんだっけ？となることがあるので、まとめておきました。
こちら変数編になります。
~~まとめ記事目次は[こちら](https://qiita.com/nabe_kurage/items/373adae38c0b6073b304)~~
（2018/04/08現在、修正中）

## 変数
変数とは、データを格納するための入れ物のようなもの。
変数にデータをいれることを、「変数にデータを代入する」と言う。

### 特徴
#### ES5までの仕様
- 使用前に定義しておく必要がある。``var``という予約語と、その後に任意の名前を指定することで、変数を宣言できる。

```js
var myVariable:
```

- 定義後、値を割り当てることができる。

```js
var myVariable;
myVariable = 20;
```

- 定義と同時にデータを代入することもできる。（よく使います）

```js
var myVariable = 20;
```

- あとで値を変更することもできる

 ```js
var myVariable = '学生';
myVariable = '社会人';
```

- 様々なデータ型を入れられる

```js
var myVariable = 20;  //数値（例 0.01, 200)

var myVariable = 'kurage';  //文字列。’’か””で囲う。（例'apple','くらげ')

var myVariable = true;  //真偽値。真か偽の二種類のみ（例 true,false)

var myVariable = [1,10,100 ]; //配列。複数の値。(例 ['dog','cat','rat'])

var myVariable =  document.querySelector('h1');  //オブジェクト。
```

- 変数に変数を代入することもできる

```js
var myVariable = 20;
myVariable = myVariable + 20;
```

- 自分自身の値を変更する場合は省略可能

```js
var myVariable = 20;

myVariable += 20;
// myVariable = myVariable + 20;

myVariable -= 20;
// myVariable = myVariable - 20;

myVariable = myVariable++;
//インクリメント。自分自身から1を加算。

myVariable = myVariable--;
//デクリメント。自分自身から1を減算。
```

#### ES201５以降の仕様
ES201５からは``var``の代わりに``let``と``const``を使い分けます。

- 定数宣言は``const``で
``const``は一度宣言したら、値を再び代入することができない。なので、はじめに宣言したら値を買えない定数に使用する。（再度代入しようとするとエラーを吐く）

 ```js
const myVariable = '学生';
myVariable = '社会人'; //error
```

- 変数宣言は``let``で
何度も値を代入し直す場合は、``let``で宣言する。

 ```js
let myVariable = '学生';
myVariable = '社会人'; 
```
- {}を使ったブロックスコープの使用
ブランケットを使用した範囲がスコープとなり、変数の使用場所を限定することができる。

 ```js
{
  let myVariable = '学生';
  myVariable = '社会人';
  console.log(myVariable); //  '社会人'
}
console.log(myVariable); // undefined
```
Vue transition all

### Vue 最大の利点 transition control
```html
<link href="https://unpkg.com/animate.css" rel="stylesheet" type="text/css">
<script src="https://unpkg.com/vue"></script>
<div id="example-3">
  <button @click="show = !show">
    Toggle render
  </button>
  <transition
 name="custom-classes-transition"
 enter-class="animated tada"
 enter-active-class="animated tada"
 enter-to-class="animated tada"
 leave-class="animated flipOutX"
 leave-active-class="animated flipInX"
 leave-to-class="animated hinge"                     
  >
    <p v-if="show">hello</p>
  </transition>
</div>

<script type="text/plain" name="animate-cheat-sheet">
bounce	flash	pulse	rubberBand
shake	headShake	swing	tada
wobble	jello	bounceIn	bounceInDown
bounceInLeft	bounceInRight	bounceInUp	bounceOut
bounceOutDown	bounceOutLeft	bounceOutRight	bounceOutUp
fadeIn	fadeInDown	fadeInDownBig	fadeInLeft
fadeInLeftBig	fadeInRight	fadeInRightBig	fadeInUp
fadeInUpBig	fadeOut	fadeOutDown	fadeOutDownBig
fadeOutLeft	fadeOutLeftBig	fadeOutRight	fadeOutRightBig
fadeOutUp	fadeOutUpBig	flipInX	flipInY
flipOutX	flipOutY	lightSpeedIn	lightSpeedOut
rotateIn	rotateInDownLeft	rotateInDownRight	rotateInUpLeft
rotateInUpRight	rotateOut	rotateOutDownLeft	rotateOutDownRight
rotateOutUpLeft	rotateOutUpRight	hinge	jackInTheBox
rollIn	rollOut	zoomIn	zoomInDown
zoomInLeft	zoomInRight	zoomInUp	zoomOut
zoomOutDown	zoomOutLeft	zoomOutRight	zoomOutUp
slideInDown	slideInLeft	slideInRight	slideInUp
slideOutDown	slideOutLeft	slideOutRight	slideOutUp 
</script>
```
```js
new Vue({
  el: '#example-3',
  data: {
    show: true
  }
})
```
日本でも増えてきているブロックチェーン関連イベント

ビットコインと仮想通貨に関する規制や仮想通貨取引所の再編などについての話題もメディア上にさかんに流れていますが、ブロックチェーン技術の仮想通貨以外への応用についての企業の取り組みも本格化しつつある中、さまざまなブロックチェーン関連のイベントも日本で開催されるようになってきました。
今回は、その中ても３つのイベントについてのオンラインメディアでのレポート記事をピックアップしてご紹介します。一つ目は2月に名古屋で開催されたナノオプト・メディア主催の「Blockchain for Enterprise 2018」。二つ目が3月29日に東京大学で行われたEthereumの開発者向け日本公式イベント、そして最後が4月4日と5日にウェスティン東京で開催された「BeyondBlocks」です。いまブロックチェーン活動でどのような分野・内容がテーマとされているか感じられるレポートです。

※下記サイトからの転載。ビッグデータ・AIなどに関するトピックを毎週取り上げています。
[TechCrowd: https://www.techcrowd.jp/related/](https://www.techcrowd.jp/related/)


#[未来はブロックチェーンでどう作られるか？　「文化財のための資金」「記事の信頼性」「格差の是正」？] (https://internet.watch.impress.co.jp/docs/event/1108364.html)

ナノオプト・メディア主催のイベント「Blockchain for Enterprise 2018 ―名古屋―」が2月22日、JPタワー 名古屋ホール＆カンファレンス（愛知県名古屋市）で開催されました。その中で行われた「ミライを作るブロックチェーン産業の展望について」と題したパネルセッションの内容をレポートしたINTERNET Watchの記事です。

パネルセッション最初のテーマは、「アイデンティティの管理と認証」。下記のような興味深い一方でまださまざまな議論が必要となりそうなテーマが話し合われたようです。

・新たに口座を開く際に、本人確認をブロックチェーン上で行い、それを使ってほかの口座も開設できるようにすることのメリットはある

・（ブロックチェーンでは）使いたいサービスを提供するベンダーに、個人の判断での使いたい情報提供を可能にするといったように、個人情報の民主化を実現し、サービスベンダーの側でも、それをうまく活用できるようにすべき

・法的身分証を提供する国連支援プロジェクト『ID2020』では、非中央集権型のブロックチェーンテクノロジーを使用しているが、これを国という観点から見ると、難しい課題になるだろう

・総務省が住所変更などについて、ブロックチェーンを活用して共通化するという取り組みを行っている。1つの住所変更だけで、すべての変更が完了するという仕組みはいいアイデア

2つめのテーマは、海外と日本のブロックチェーンの状況の違いについて。ここでは、トークンを活用した新たな価値創出にまで話題が及んだようです。


#[時価総額2位「イーサリアム」初の日本公式イベント　熱気渦巻く] (http://www.itmedia.co.jp/news/articles/1803/29/news095.html)

「ビットコイン」に次いで、時価総額2番目の人気を誇る仮想通貨「Ethereum」（イーサリアム）の開発者向け日本公式イベントが、3月29日に東京大学（文京区本郷）で行われましたがITmedia NEWSがその様子をレポートした記事です。イーサリアムの生みの親であるヴィタリック・ブテリンさん（24歳）が講演するとあり、会場には約500人の参加者が詰めかけたようです。

イーサリアムは取引履歴の他、「スマートコントラクト」と呼ばれる「契約を自動執行する仕組み」をブロックチェーンに乗せることで、分散型のアプリケーション（DApps）を開発するプラットフォームとしても機能します。そのためスマートコントラクトのプラットフォームというとEthereumという印象が強いのですが、ブロックチェーン上でDAppsを大規模に動かすためには、1秒間に15回までしか取引を処理できないイーサリアムの仕様がボトルネックとなるということもよく言われている制約です。この講演では、このような制約を解決するための新技術「Plasma」や「Sharding」の概要が説明されたようです。

ゲストには、DAppsの開発者たちが登壇。異なるブロックチェーン同士をつなげて相互運用を目指す「COSMOS」プロジェクトや、スマートコントラクトを通じてコンピュータの計算資源を貸し借りできる「golem」プロジェクトなども紹介され、参加者からは興奮さめやらぬ声が聞かれたようです。


#[BeyondBlocks初日レポート】bitFlyer 加納氏 日本の現状 ブロックチェーン全体に関する進展の概況] (https://crypto-times.jp/beyond-report-1stday-kanou/)

4月4日 恵比寿のウィストンホテル東京にて行われたBeyond Blocksに関して、メディアパートナーともなっているCRYOPTO TIMESの、、bitFlyerの加納さんによる初日の基調講演に関してのレポート記事です。

ブロックチェーンの市場は世界では300兆円、日本政府も67兆円の市場だと試算しており現在では、主にデジタル通貨だけに注目が集まっていますが、今後は仮想通貨だけでなくトレーサビリティーやProof of Documentにもなり得る可能性があるとのこと。

bitFlyerでは現在、プライベートチェーンであるMiyabiの開発に力を入れているようです。ブロックチェーンには処理が遅いという問題がありますが、miyabiは処理速度をあげることにより金融機関でも使えるものにすることを目指しているとのこと。


#[ガートナー、ブロックチェーンへの取り組みに関する調査結果を発表] (https://gartner.co.jp/press/html/pr20180405-01.html)

最後に、ガートナージャパンが4月5日に発表した、ブロックチェーンへの取り組み状況に関する調査結果をご紹介します。

従業員数500人以上の日本企業を対象として2018年2月にガートナーが実施したブロックチェーンへの取り組み状況に関する調査の結果、42.6%の企業が、調査など初期的なものも含め、ブロックチェーンに何らかの形で取り組んでいることが明らかになったとのこと。
ガートナーはブロックチェーンに関して、以下の仮説を含む展望リサーチも発表しています。

新しいテクノロジ群の一角を占めるブロックチェーンへの理解や試行を進めようとしないIT部門のほとんどが、2021年までに自社のデジタル・ビジネスに向けた活動をリードできない状況に陥る

インターネットによりさまざまな分野が変革してきたように、ブロックチェーンの技術によりさまざまな分野が変革していくのは確かなようです。
Spring Boot DB関連の豆知識

Spring Boot を『はじめてのSpring-Boot』にて勉強中。
DB関連の設定で、いいこと書いていたので紹介します。

# 自動読み込みされるSQLファイル
Spring Bootではクラスパス直下(src/main/resources/*.sql)に以下のSQLファイルが存在すれば読み込んで実行される。

```
schema-(platform).sql
schema.sql
data-(platform).sql
data.sql
```

# SQLファイルに日本語を使う場合

src/main/resources/application.properties

```
spring.datasource.sql-script-encoding=UTF-8
```

# H2のDB設定

src/main/resources/application.properties

```
spring.datasource.driver-class-name=org.h2.Driver
spring.datasource.url=jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE
spring.datasource.username=sa
spring.datasource.password=
```

永続化したければurlを以下のように変更

```
spring.datasource.url=jdbc:h2:file:./target/db/testdb
```

永続化する場合の設定

```
spring.datasource.url=jdbc:h2:file:./target/db/testdb
```

# Log4JDBCを使ったSQLログ出力

- pom.xml

```xml
<dependency>
	<groupId>org.lazyluke</groupId>
	<artifactId>log4jdbc-remix</artifactId>
	<version>0.2.7</version>
</dependency>
```

- Log4JDBC用のJDBCドライバ設定

src/main/resources/application.properties

```
spring.datasource.driver-class-name=net.sf.log4jdbc.DriverSpy
spring.datasource.url=jdbc:log4jdbc:省略
```

- Log4JDBC用ログレベル設定

src/main/resources/application.properties

```
logging.level.jdbc=OFF
logging.level.jdbc.sqltiming=DEBUG
```

# リファレンス
- はじめてのSpring-Boot
https://www.amazon.co.jp/s/ref=a9_sc_1/357-5571034-7925567?rh=i%3Aaps%2Ck%3Aはじめてspring+boot&keywords=はじめてspring+boot&ie=UTF8&qid=1523177092
大学生がエンジニアインターンとして５ヶ月働いて感じた必要なこと

#1. プロジェクトの目的を明確にする
　これはプロジェクトを進めていく上で一番重要なことだと思います。プロジェクトを渡された際の取り組み方には大まかに二つの種類があると思います。
　一つは既にゴールと目的が伝えられている場合です。この場合は実現方法であったり、リソースの割き方について話し合いながら進めていくことになると思います。
　もう一つは、ゴールが決められているが目的が伝えられていない場合。この場合は目的を明確化することが重要であると思います。自分にとっては目的が明確に思えるものでも、実際には自分の考えている目的と他のチームの方が考えている目的には多少なりとも違いが出ていることがあると思います。これを解消しないままプロジェクトを進めても、プロジェクトの終わりの方でひずみが生じて時間を無駄にしてしまいます。
　結論として、全てに置いて目的意識を持つことが大事だと感じました。

#2. 要件定義の重要性
　これは目的を達成するために必要なことを「一意」に定義することの重要性を学んだということです。他人にプロジェクトをお願いする際に、相手と自分の認識にズレがあれば上で書いたように話し合って解消すればいいことかもしれません。しかし、それ以前に渡す際に伝えられるところは明確に伝えることで両方の時間を奪わずにすむことができると感じました。

#3. 他人のコードを読む
　今まで、チームでの開発経験というものは無かったので他人のコードを読むという機会がほとんどありませんでした。実際にエンジニアインターンとして働いてみて、自分が想像していた以上に他人のコードから学ぶことがありました。読みやすいと感じるコードと読みにくいコードとの違いであったり、自分が考えていない実装方法であったり、色んなことが見えてきます。他人のコードを読むことは、意外と「成長するための近道」なんじゃないかなぁと感じました。

#4. アウトプットの重要性
　みなさん、アウトプットをすることで知識が定着するということは聞いたことがあると思います。自分も頭の中で「そういう効果があるんだろうなぁ」とは思っていたものの、あまりアウトプットする機会というものはこれまでありませんでした。
　しかし、CTOの方からアウトプットを実践するように言われて行なったところアウトプットの難しさというものに気づかされました。自分がなんとなく頭の中で理解していることを言語化して伝えるというのは意外にも難しい作業ということを痛感させられました。

#まとめ
　エンジニアとして必要なことは意外にも、「実装する力」ではないんだなと感じました。それ以前の目的の明確化であったり、コミュニケーション能力であったり、インターンをする前では見えてこなかったことがいくつかありました。
　大学生のうちにインターンをすることで、社会人として成功するために必要なこと、チームの雰囲気づくりであったり色々なことが学べると思うので挑戦してることをオススメします。
JUnit5で＠Autowiredが使えんかった件

Spring Boot + JUnit5 環境で、テストクラスで＠Autowiredが動作しないためか変数にインスタンスが生成されずに、NullPointerExceptionが発生。

JUnit5で、Spring Bootを動かす設定がJUnit4とは異なることが判明。

```
migrate from JUnit 4 to JUnit 5 you can replace 
@RunWith(SpringRunner.class) with @ExtendWith(SpringExtension.class).
```

参考になるページにたどり着くまで、結構時間かかったです。

# リファレンス
https://stackoverflow.com/questions/48019430/junit5-with-spring-boot-1-5
ServiceNowでDeveloper Instanceを使い始めにやっておきたい事

# 環境

バージョン：KINGSTONE(DEVELOPER INSTANCE)

# （１）言語設定

下記を参考に日本語環境をインストールする。
開発時は主に英語設定を使用するが、日本語に変更して一度、一通りメニューを確認しておいた方が良い。

[ServiceNow初期設定 インスタンスを日本語化する](https://qiita.com/Kisaragi13/items/abbc205134d1696ff644)

# （２）タイムゾーンの設定

ログを確認時のタイムゾーンが日本語になっていないと分かりにくので、タイムゾーンは日本語に設定しておく。

[ServiceNow タイムゾーンを日本時間に変更する](https://qiita.com/Kisaragi13/items/176a222f7d1b9b987b3e)

# （３）お気に入りによく使うものを登録しておく

 「Studio」や「Application Log」「Field Labels」などよく使うものは、それぞれのメニューの星マークをクリックしてお気に入りに登録しておく。

![Favorite.png](https://qiita-image-store.s3.amazonaws.com/0/197947/cbc09f74-7aeb-9113-bb3b-5be8017c1922.png)

# （４）ServiceNowのCommunicationサイトにプロフィールを登録する

ServiceNow + キーワードで検索してヒットするページは大体ServiceNowのCommunityのページである。あらかじめプロフィールを登録しておく。

# （５）GitHubにユーザー登録する

ServiceNowのTraining用のソースは、GitHubからForkしてソースを利用する。また、ServiceNowのDeveloper Instanceを10日間使用していないと、自動的に削除される。GitHubに編集後のソースのbranchをコミットして置く事で、削除のリカバリーが可能。
コッホっぽい曲線


基数変換の変形にて。

```rb:tyama_henae23.rb
#!/usr/bin/env ruby
#http://nabetani.sakura.ne.jp/hena/orde23nokoch/
#https://qiita.com/Nabetani/items/77e7e2c749767f197c0e

T={'a'=>[0,1,-1,0],'b'=>[0,1,0,-1,0]}
STDOUT.sync=true
while gets
	n,s=$_.chomp.split(',')
	n=n.to_i-1
	q=0
	s.reverse.each_char{|c|
		n,r=n.divmod(T[c].size)
		q=(q+T[c][r])%3
	}
	if n>0
		puts 'x'
	else
		puts '0+-'[q]
	end
end
```
Laravel5.5  メッセージファイルの日本語化

Laravel5.5 認証, ペジネーション, パスワード再設定, バリデーションの4つのメッセージを日本語化する
==========================================================

###自分なりにいろいろ見て廻った中での自分用の覚書です。

##### /resources/lang/以下に、日本語用の ja ディレクトリを作成する。

##### 同階層のenディレクトリと同じように、4つの空のファイルを作成する。

auth.php
pagination.php
passwords.php
validation.php

##### 空のファイルに https://github.com/minoryorg/laravel-resources-lang-ja から落としてきた日本語メッセージファイルと、それぞれ対応するファイルとを入れ替える。

##### minoryorgさん、あざーす！ めちゃ助かります！

##### /config/app.php の２箇所を "ja" に変更

```
'locale' => 'ja',
```
```
'fallback_locale' => 'ja',
```

そんでもって、さらに、メッセージが "email" だと味気ないので、
"email" を "メールアドレス" に、 "password" を "パスワード" に変えるようにする。

先ほどの、validation.php の中の、'attributes' の値を以下のように修正する。

```
'attributes' => [
    'email' => 'メールアドレス',
    'password' => 'パスワード',
];
```

##### これで日本語化バッチリ！
<!DOCTYPE html>って何なの？？

## はじめに
毎回なんとなく書いていたけど、ちゃんと説明できるようにならなきゃと思って、調べてみました。

## DOCTYPE宣言について
**DOCTYPE宣言（文章型宣言）**といい正式な呼び方はには「ドックタイプ宣言」だそうです（今までドクタイプって読んでました…）。
これは簡単に言うと文章の仕様やバージョンをブラウザに伝えるためのもので、HTML５以前のバージョンでは**DTD**と呼ばれるものをHTML(XML)に結びつけるものでした。

例えばHTML4.01だとこんな感じのDOCTYPE宣言になります。

```
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
```

## DTDとは
DTDは **Document Type Definition（文章型定義）**の略で、どんなタグがどんなタイミングで使えるのか、などの文章の構造が指定されていました。
試しに、HTML4.01のDOCTYPE宣言で書いたURLに飛んでみるとイメージしやすいかもしれません。

http://www.w3.org/TR/html4/loose.dtd

## HTML５だと…
一方、HTML５では大変シンプルなDOCTYPE宣言です。
```
<!DOCTYPE html>
```

これはHTML５では、DTDの文章にあたる情報が仕様書の中に同じ言語で記述されており、DTDと繋げる必要がないためです。
ではなぜDOCTYPE宣言が必要なのでしょうか？
それにはwebサイトの歴史が関係しています。

## HTML５でDOCTYPE宣言が必要な理由
HTML言語が標準化してきた1990年代、作成されたページはDOCTYP宣言がなされていないものも多く、それに困った各種ブラウザが、宣言がないものは旧式のページとして認識し、モードを切り替えるようにした。
その仕様が続いているため、DTDがなくなった今でもDOCTYPE宣言を記述して、旧式のページと認識されないようにしているというわけです。
オープンソースモデリング環境Modelioを使ってみる

最近、業務でModelioというソフトウェアを利用する機会があったので、
せっかくなのでご紹介します。

## ざっくり3行でまとめると
・ModelioとはGPLライセンスで配布されているオープンソースのモデリングソフトです
・対応する図はUML、SysML(一部の図のみ)、BPMN、MDA等。(筆者は後ろ2つは詳しく無いですが、、、)
・色々バグや使いづらい点は多いですが、フリーソフトで業務利用可能なモデリングソフトを探している人には選択肢になるかも？

## Modelioの特徴
・こんな感じの図が描けます。
###ユースケース図
![test1.png](https://qiita-image-store.s3.amazonaws.com/0/232089/e760cc58-e547-b0e6-509f-36e51cd0e58f.png)
###クラス図
![test2.png](https://qiita-image-store.s3.amazonaws.com/0/232089/f666bc48-4d7c-b6fe-19b5-c7ce08831465.png)
(内容適当です、、、)
###シーケンス図
![test3.png](https://qiita-image-store.s3.amazonaws.com/0/232089/32a057d3-e3ef-2cb3-93fc-09ac139c682a.png)
###アクティビティ図
![test4.png](https://qiita-image-store.s3.amazonaws.com/0/232089/6387b238-af52-8f01-7c34-8d1b8b0130dd.png)
###ステートマシン図
![test5.png](https://qiita-image-store.s3.amazonaws.com/0/232089/fafb01cb-e260-f44d-fe85-0281b50f53e5.png)

また、各種拡張機能が豊富に用意されていますが、
コード自動生成やコードからのモデル生成といった機能は有料な模様です、、、

## Modelioの使いどころ
こんな場合は導入を検討してみてはいかがでしょう？
・業務でモデリングソフトを使う文化が無く、モデリングソフト対して予算が下りないけど、UML等の図をちょっとだけ描きたい
・某ast*hのバージョン6.9を使い続けている
・ExcelでUMLを描くのに疲れ切ってしまった

## 公式サイト
https://www.modelio.org/

## その他
次回以降、Modelioの使い方や注意点、バグの回避方法とか書ければ良いなーと思っています。
マルチシーンを使った開発で Instantiate を呼ぶと、思いもしないシーンにInstantiateしてしまう話


# マルチシーンを使った開発
Unity 5 系のいつからから、シーンを複数呼ぶことができるようになりました。
現在のプロジェクトで初めてマルチシーンを使用しています。
そのときにハマった罠を紹介できればと思います。

## Instantiate を呼ぶと、どのシーンに配置される?
Unity を使ってる人ならみんな大好き(?) Instantiate。
GameObject を hierarchy 上で生成するときに使いますよね。
マルチシーンがないときには何も意識せずに Instantiate したら、シーン上に GameObject が生成されました。

さて、マルチシーンで Instantiate したら、どのシーンに GameObject が作られるのでしょうか?

## Instantiate シーンを単独で開いて GameObject の作成
Instantiate シーンを開いて、適当な Prefab(Cube) を Instantiate しました。
ボタンの Addlistener に Instantiate するだけですね。

```C#
[SerializeField] private Button _instantiatePrefabButton;

[SerializeField] private GameObject _prefab;

// Use this for initialization
private void Start()
{
    _instantiatePrefabButton.onClick.AddListener(() => { Instantiate(_prefab); });
}
```

<img width="950" alt="SimpleInstantiate.png" src="https://qiita-image-store.s3.amazonaws.com/0/151719/63ffa910-1dce-d44c-94ac-3bae2d4f8850.png">

まぁ、シーンは一つしかないので、そのシーンに配置されますね。

## Instantiate シーンを Additive で追加する形で開いて GameObject を作成
最初に適当なシーン(ここでは Main)を開いて、そのあとに Instantiate シーンを Additive で開いてみます。

```C#
[SerializeField] private Button _addSceneButton;

private void Start()
{
    addSceneButton.onClick.AddListener(() =>
           SceneManager.LoadScene("Instantiate", LoadSceneMode.Additive));
}
```

さて、Instantiate シーンで Instantiate する GameObject は、一体どのシーンに作られるのでしょうか

<img width="950" alt="PreFix.png" src="https://qiita-image-store.s3.amazonaws.com/0/151719/ba37f20f-55e0-234d-20bc-e5e563781281.png">

Instantiate シーンに作られなくて、Main シーンに作られてしまいました。

## 対策(?)
Instantiate シーンに、適当な空の GameObject を作成し、それを親にして GameObject を作成しましょう。

```C#
private void Start()
{
    _instantiatePrefabButton.onClick.AddListener(() => { Instantiate(_prefab, _transform); });
}
```

<img width="948" alt="Fix.png" src="https://qiita-image-store.s3.amazonaws.com/0/151719/8830052e-744a-dcb5-d731-38614fc2d1ed.png">

Instantiate シーンに GameObject が作成されましたね。

## まとめ
マルチシーンを使用するときには、Instantiate される Hierarchy 上の場所にも気をつけましょう。

たとえば上記の例で Instantiate シーンを Unload しても、本来 Instantiate シーンで作成した GameObject が消されないで残ってしまいます。(実際それでバグを産んだ)
バックログを作って旅行計画を立ててみる

# はじめに
お久しぶりです。かずさです。
もうすぐ**ゴールデンウィーク**ですね！
読者の皆様はどのようなご予定でしょうか。
自分は重要なプロジェクトのリリース日がGW真っ只中になる危機に曝され、GWが無くなる覚悟もしていましたが、なんとかリスケになって連休を確保することができました。
(止めてくれる常識ある人が周りにいて良かった。。。)

というわけでウェイウェイと海外旅行に行くことに！
その場所は、、、**マニラ**！！！

そして今回の旅行計画は、行きたい場所・やりたい事を付箋に書いてプロダクトバックログのようなものを作り、そこから計画に落とし込んでみることにしました。

# まずは認識合わせ
互いにどんな旅行にしたいのか、ざっくりとした認識合わせをすることにしました。

- **あんまり詰め込みすぎず、まったり旅行**
- マニラの観光スポット全部まわる勢いの詰め詰め旅行

あっさり前者となりました。
複数人で何かをするときは、まずこのように大枠の認識をあわせるとその後の議論が円滑に進むと思います。
例えばスクラムを使ってソフトウェア開発をするにしても、

- 顧客へ提供する価値を最大化すること
- 目の前のベロシティを上げること
- 今後の拡張性や保守性まで意識して開発すること
- 定時帰りでストレスフリーなチームにすること

などなど、メンバーそれぞれが最も重要視するポイントが異なってしまうと、振り返りの際などに意見が発散してしまいます。

# バックログ作り
ウェイウェイは旅行ガイドブック、私はトリップアドバイザーを見ながら行きたいところをどんどん付箋に書いていきます。
また、並行してその場所をGoogle Mapにプロット。

![意外に.png](https://qiita-image-store.s3.amazonaws.com/0/237975/809abf46-f6f5-125e-6cd5-01412d5693fd.png)

![googlemap.png](https://qiita-image-store.s3.amazonaws.com/0/237975/9960a2ec-a68c-e6fb-5cfa-82bf03b030d8.png)
(黄色ピンが行きたいところ)

というわけで、意外に行きたいところが少なく、優先順位を設定して取捨選択する、、、というフェーズに至りませんでした。(企画倒れ！)
決してマニラが魅力ない街だとか、そういうことではありませんのでご理解くださいｍｍ

# 気づき
本来なら大量に付箋を書き、優先順位で1列に並べ、限られた旅行日程の中でどこまで訪れることができるかを議論したかったところですが、議論の必要もなく全て行ける、ということになってしまいました。
ただ、付箋を書いている最中に、ちゃんとプロダクトバックログが作れた場合こういう展開になるよね、と感じたことだけ共有します。

**旅行のプロダクトバックログを作ることのメリット**
優先順位でバックログが並んでいるため、予定よりも進捗が遅かったときに何を諦めるのか、進捗が早かったときに何を追加するのか即座に決定できる。

**旅行のプロダクトバックログを作ることの課題**
効率良く訪れる(クリティカルパス)ために、結局優先順位を崩して旅程を作り直す必要がある。また、最後の最後に少し時間が余ったからと言って、優先順位最上位のバックログに手をつけられるかは今いる場所にも依存する。

というわけで、ソフトウェア開発のようにひとつひとつのバックログが綺麗には見積もれず、訪れる順番によってバックログにかかる時間が変化してしまうため、工夫が必要だと感じました。

何かいい案が思いつけば追記しようかと思います。何かアドバイスがあればコメント残していただけるとありがたいです。
ではでは。
Mac > Fiddler




https://telerik-fiddler.s3.amazonaws.com/fiddler/fiddler-mac.zip


Mac 

[Fiddler for OS X Beta](https://www.telerik.com/download/fiddler/fiddler-osx-beta)


[Latest Fiddler Available for OS X](https://www.telerik.com/blogs/introducing-fiddler-for-os-x-beta-1)



## Mono framework installed

すでに導入済みであればこれはスキップ

Please download it from 
http://www.mono-project.com/download/#download-mac

and install it. 
If you already have it installed, ensure you’re running the latest version.



## If you just installed Mono


```
/Library/Frameworks/Mono.framework/Versions/<Mono Version>/bin/mozroots --import --sync
```

### バージョンを調べる

```
cd /Library/Frameworks/Mono.framework/Versions/
ls
```

以下が表示されたのでバージョン5.10.0 となります。

```
5.10.0	Current
```

バージョンに合わせて以下コマンドを打ちます。

```
/Library/Frameworks/Mono.framework/Versions/5.10.0/bin/mozroots --import --sync

```


### 結果

```
Mozilla Roots Importer - version 5.10.0.0
Download and import trusted root certificates from Mozilla's MXR.
Copyright 2002, 2003 Motus Technologies. Copyright 2004-2008 Novell. BSD licensed.

WARNING: mozroots is deprecated, please move to cert-sync instead.

Downloading from 'https://hg.mozilla.org/releases/mozilla-release/raw-file/default/security/nss/lib/ckfw/builtins/certdata.txt'...
Importing certificates into user store...
153 new root certificates were added to your trust store.
Import process completed.

```


解説ブログには以下のような注意書きがありました。

```
The Mono framework has its own trusted root certificates store. Currently (at mono version 4.2.4) this store remains empty after installing Mono on OS X. Fiddler uses the certificates in this store to validate the certificates of the websites visited. So you need to populate this store with a set of commonly trusted root authorities to avoid getting constant certificate warnings by Fiddler. The mozroots tool imports trusted authorities from the Mozilla LXR.
```




## fiddler-mac.zip

fiddler-mac.zipを解凍して出てきたフォルダを書き込み権限があるところへ移動

Windowsパスと同じようなフォルダ構成にしてる場合には（あるのか？）Fiddlerがうまく動作できないようです。


It is recommended that the full path to Fiddler install folder does not contain any Windows path illegal characters. (At present it is possible that some Fiddler functionality, e.g. various file exports or Fiddler Script won’t handle such paths.)



## Fiddlerの実行

ターミナルで配置したフォルダに移動します。
以下のコマンドを打ちます

`mono --arch=32 Fiddler.exe`


```
The Carbon driver has not been ported to 64bits, and very few parts of Windows.Forms will work properly, or at all Stacktrace:
```


32bit
iPhoneのファイルをMac/Winパソコンに移行する小技

iPhone X/8/7/6s等を長い間に利用した後、特に、写真がどんどん増えていますね。iPhone容量を解放して利用可能なスペースを増やすには、どうすればいいでしょうか？今日は便利な小技をシェアいたします。

実は説明しなくても、皆さんはもうご存知でしょう。便利な一つの方法はiPhoneのファイルをMac/Winパソコンに移行することです。

Macパソコンの場合では、その「写真」アプリを使うと、一気に導入することができます。それから、iPhone上の写真を削除すればいいです。こうしたら、相当分の空き容量が出てきます。
<img width="256" alt="yosemite20.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/124905/0c1b09fc-2d1e-808d-572f-2fc869cbc9e4.jpeg">

Winパソコンの場合では、フリーの[iPhoneデータ移行ソフト](https://jp.easeus.com/phone-transfer/mobimover-free.html)MobiMover Freeをおススメいたします。
![by-folder-by-file.png](https://qiita-image-store.s3.amazonaws.com/0/124905/9ab85824-ff94-a52f-3ade-9602538944b0.png)

:one:「コンピュータに転送」を選択し、ソフトは自動的にデバイス上のデータを認識できます。

:two:移行したいファイルをチェックしてから、「...」をクリックすると、保存先をご選択ください。

:three:「転送」ボタンを押すと、一括で移行します。

ちなみに、この[iPhoneデータ移行ソフト](https://jp.easeus.com/phone-transfer/mobimover-free.html)はMac OSにも対応できます。

これで簡単でしょう？必要な時に、試してみましょう。

以上。
MACのネットワーク再インストールで-2002Fなどのエラーが出る場合

MACのネットワーク再インストールで-2002Fや-2003Fなどのエラーが出る場合、ルーターのDHCPを切ったり、ゲスト用のWifiや携帯でのテザリングでの接続を試みるとうまくいきます。

３度ほど同じ画面が出ましたが、再起動→再インストール作業を繰り返しようやく本来のインストール画面へとたどり付けました。
引き継いだモジュールに存在した、理解が難しかったコード

組込み系は歴史が古く、自分が生まれる前のコードが現役で動いてることが多い。
そういえばこんなのもあったなあというメモ。
見つけたら適宜追加。

#古い規格
```c:sample.c
 func(a, b)                      
 int a, b;                       
 {                                       
       .                                 
       .                         
 }
```
K＆R規格であるためANSI規格とは関数定義の方法が異なる。
今後誰がこのモジュールを触るか分からないため（もしかしたら新人かもしれない）、現行の規格に則った定義に変更して他モジュールと統一した。
（追記）
ANSI規格で関数定義していれば完全に正しいようなプログラムでも K&R スタイルで書くと正しくなくなる (そしてそれがコンパイルエラーにならない) 場合が有る。（また、C++ ではこのスタイルは廃止）

#たらい回し
```c:sample.c
AAA[(UH)BBB[(UH)CCC[(UH)DDD[(UH)EEE]]]]
```
別の場所にテーブルが作られており、それを参照するためのコード。
EEEを貰って、それからDDDを参照し、そのDDDからCCCを参照...といったように役所ばりにたらい回しにされるコード。
特に説明コメントがあるわけでもなく、一見しただけでは意味が分からなかった。
テーブル周りは今後触ることは無さそうなので、単純に上記コードをバラけさせて説明コメントを追加した。

#マンモス構造体
```sample.c
typedef struct {
        int a;
        int b;
        int c;
        //以下、なんかめちゃくちゃでかい構造体
        hoge hoge_struct;
        foo foo_struct;
        bar bar_struct;
    }sample_struct;
```
数千バイトもあるような構造体があると、スタックの管理がしっかり出来ていないとすぐスタックオーバーフローを引き起こしてしまう。
過去見たコードだと、

- ローカル変数として上記のようなマンモス構造体を宣言
- 適当なget関数に宣言したマンモス構造体のポインタを渡してデータを得る
- 得たデータをほんのちょっとだけ使う

等をしている箇所があった。
マンモス構造体の一部しか使わないなら、必要なデータだけを得る関数を作るなど別の方法でデータを得る方が良い。
そもそもマンモス構造体が出来ないようにすることが大事。
しかし組み込みの現場では古いコードを秘伝のタレの如く継ぎ足し継ぎ足し追加していくので、最初書かれた時はマンモス構造体ではなかったが、年月によりマンモスになってしまったパターンが多い。
そういう時はリファクタするか、見なかったことにしてそっと閉じよう。
SQL　コーディング規約/ルール

サンプルSQL

```SQL
SELECT
      TableXxx.column_a
    , TableXxx.column_b
    , TableXxx.column_c
    , TableYyy.column_d
    , MAX(TableYyy.column_e) max_column_e
FROM
    table_xxx TableXxx
    INNER JOIN table_yyy TableYyy
    ON TableYyy.column_a = TableXxx.column_a
WHERE
    TableXxx.column_c = '1'
AND TableYyy.column_Z = '0'
GROUP BY
      TableXxx.column_a
    , TableXxx.column_b
    , TableXxx.column_c
    , TableYyy.column_d
HAVING
    COUNT(TableXxx.column_h) > 5
AND COUNT(TableXxx.column_i) > 2
ORDER BY
      TableXxx.column_b DESC
    , TableXxx.column_c

```
#### 予約語/関数/テーブルエイリアスは大文字
#### テーブル名と項目名は小文字でスネークケース
- テーブル名は複数にする
- テーブル名はシステムプレフィックスをつける
- ステータスやフラグは出荷状況ステータスや出荷停止フラグなど必ず何のステータス/フラグか明確にする
- 型について
  - floatなどの浮動小数点の型ではなく、numericを使う

#### インデックスは"IX_テーブル名_2桁連番"とする
例) IX_RB_USERS_03
#### テーブルのエイリアスはテーブル名のキャメルケース
#### インデントは半角スペース4つ
折り返しについては、サンプルSQL参考

#### 制約は基本つける

| 主キー制約        | 〇 |
|:-----------------|---:|
| 一意性制約        | 〇 |
| 外部キー制約      | 〇 |
| NOT NULL制約     | 〇 |
| チェック制約      | × |

#### 必要な項目のみselectする
基本的に*は禁止。ただしEXISTSは例外。
アカウントとセキュリティ強度について考え続けている話

# 考えていること
Ubuntu系のLinuxサーバを操作していてふと思うところがあった。
Linuxサーバが攻撃に耐えられなくなって、誰かに侵入された場合、Ubuntuだとroot権限を取られるまでに時間稼ぎはできないな。と。
一方、CentOSだと時間稼ぎできそうだな。と。**「だからUbuntuはダメ」という話をしたいわけではない。**
僕は日常的にUbuntu系のLinuxMintを使用していて、その便利さに感謝している。

## CentOSとUbuntuのアカウント
CentOSなどでは、一般ユーザのアカウントAでアクセスし、root権限が必要な作業をしなければいけない時には、sudoコマンドやsuコマンドを使用するというのが普通だ。この時、sudoコマンドはできることが限定されていて何でもできるわけではない。suコマンドを使うときには、アカウントAとは別のrootのパスワードが必要になってくる。つまり2組のIDとパスワードが必要になるということだ。
もっとも、rootというIDは全世界が知っているので、わからないのは1組のIDパスワードとrootのパスワードということになる。
Ubuntuなどでは、インストール時に設定する初期ユーザがsudoコマンドで何でもできるようになっている。root権限で何かするときには、sudoコマンドで”自分のパスワード”をいれることになる。

## 1組のIDパスワードだと何が気になるのか
UbuntuでもCentOSでも、IPアドレスやポート番号でフィルタリングしたり、802.11x認証や公開鍵認証方式でSSHできるようにする等、アクセス制限をガチガチにかためることはできるのだが、**「それでも侵入されてしまうことはある。」**という考え方に基づいて対策は練っておく必要があるんだろう。
侵入されてしまったときに、はじめからroot権限をとられてしまうような場合はどうしようもないとして、一般ユーザの権限をとられてからroot権限に昇格されてしまうまでに時間がかかれば、対応が打てる可能性もある。
この時、1組のIDパスワードでなんでもできるようになっていると、すでに侵入されてしまったわけだから、root権限も奪取されたと同じことになるのではないか？と考えた。これが2組のIDパスワードを奪取しなければroot権限を取得できないとすれば、一般ユーザからrootになるまで、時間稼ぎができる。

## 他のネットワーク機器は？
他のスイッチ、ルータ、Firewallなんかを見ると、configを変更できたり、リブートやシャットダウンするために、1組のIDパスワードでできるものと2組以上のIDパスワード入れなければできないものがある。

2つのパスワードが必要なものの代表としては、多くのところで使用されているCiscoのスイッチやルータがある。１組のIDパスワードの代表としては、多くのブロードバンドルータ・Wifiルータが挙げられる。ブロードバンドルータやWifiルータはWebGUIを備えているものが多く、IDがadminでパスワードは任意に変えられるというものが多かったりする。他にもFirewallでWebGUIで設定するようなものは1組のIDパスワードとして考えられる。
ちょっと古い話になるけど、IOT機器がミライなどの感染するマルウェアに乗っ取られてしまうのは、IDとパスワードが1組だからだと思う。

## Ubuntuはどうしたら良いのか？
Ubuntuで管理者権限で重要な作業をする場合、インストール時に登録したユーザで作業することが多いのではないだろうか？もしくは、個人アカウントを設定してあって、普段は個人アカウント、root権限を必要とするときには、特権ユーザアカウントでログインしなおしたり、sudoコマンドで特権ユーザになったりするわけだけど、sudoコマンドを使うときにはやっぱり自分のパスワードを使うことになる。
この辺の運用の仕方が一般的にどうやっているのかよくわからないのだけれど、少なくともインストール時に登録したアカウントで作業し続けることはあまり良くないような気がしている。それはIDはわからないものの、rootで作業しているのと同等なんじゃなかと思っている。

Ubuntuサーバでアカウント数が増えてくると、一発で乗っ取られてしまうことは確率的に減ってくるけど、一般ユーザで閲覧できる/etc/passwdファイルを見れば、一番最初に登録されたアカウントは何なのかすぐにわかってしまう。後で修正を加えてアカウントの順番を変えれば少しは時間稼ぎになるかもしれない。

## sudoについて少し調べたら光が見えてきた
sudoを使うときには”自分のパスワード”を入れるわけだが、少し調べてみたら、これは絶対ではないことがわかった。あくまでデフォルトが"自分のパスワード”になっているだけで、別のパスワードに変更することができるようだ。

## やり方
まず、Ubuntuのrootにパスワードを付けておく。

```
$ sudo su -
```
で、1度rootになり、passwordコマンドを使用してrootのパスワードを設定しておく。
次に、sudoコマンドを実行した時にrootのパスワードを聞いてくるようにする。

```
$ sudo visudo
```
を使用して/etc/sudoersファイルに追加の設定を入れる。

```
Defaults       rootpw
```

ちなみに、特定のユーザのパスワードを使用するときは（下記の場合はtestというユーザのパスワードを使用するとき）

```
Defaults  runaspw,runas_default=test
```

特定のユーザのパスワードを使用するとき。例えば、hogeユーザだったら/root/text.txtファイルを編集できるとした場合

```
$ sudo -u hoge vi /root/test.txt
```
という感じで入力できるようにする場合は、以下のように追加する。

```
Defaults  targetpw
```

そもそもubuntuはrootパスワードを設定せず、一般ユーザがrootパスワードを知らなくても良いように作られているのだが、あえてrootパスワードを設定したり、root権限を持ったユーザを作っておき、一般ユーザにはsudoで適切な権限を与えることで、2つのパスワードを使い分けることができ、時間稼ぎができるようになる。

## 他のネットワーク機器はというと…
しかし、ブロードバンドルータなどの1組のIDパスワードで守られているネットワーク機器が乗っ取られた場合、時間稼ぎをして管理者権限を守ることは難しそうだ。この場合は、侵入されたら終わりと考えたほうが良く、すぐに切り離しをして、他の機器への影響を最小限にする対策が求められそうだ。
残念なことに、sudoコマンドを調べていたら、**「sudoでパスワードを聞かれないようにする方法」**というようなサイトを多数見ることができた。それなら何もubuntuなど使わず、CentOSでもなんでも、rootになって作業をすればよいのではないかと思うのだが……。


## 参考
[一般ユーザでもroot権限が必要なコマンドを実行できるようにする – sudo](http://blog.amedama.jp/entry/2015/09/14/213846)
Mastodonで不穏な単語をにゃーんに変えるGemを作ってみた

#はじめに

Mastodon では非公開や未収載などの機能を使うことでLTLを不穏な空気にしなくて済むことが可能です。

ただ、どうしてもフォローしている人には不穏な単語を見られてしまいます。

そこで、指定の単語を自動的に「にゃーん」という鳴き声に変換してくれるGemを作ってみました。

#作ったもの

作ったものはこちらになります。

[Nyaaaan](https://rubygems.org/gems/nyaaaan/versions/0.1.2)

ソースは[こちら](https://github.com/S-H-GAMELINKS/Nyaaaan)になります。

#実際の使い方

Mastodon のGemfileに以下のように追加

```
gem 'nyaaaan', '~> 0.1.2'
```

その後、config/initializers内にnyaaaan.rbを作成し、下記のように変換したい単語を登録していきます。

```ruby:nyaaaan.rb
Nyaaaan.setup do |status|	
  	
    # 社会性フィルター機能	
    nyaaaan = Nyaaaan::Lang.new('[ 　\n]?#(社会性フィルター)[ 　\n]?', [	
      {	
        pattern: '死ね',	
        replace: 'にゃーん'	
      },	
  	
    ])	
    status = nyaaaan.convert(status) if nyaaaan.match(status)	
    status	
end
```

インストールはこれで終了です。

あとは、#社会性フィルターというハッシュタグを追加してつぶやくだけで指定の単語が置き換わるようになっています。

#終わりに

Nyaaaanを使うことでより優しいMastodonライフを送れるようになれればなと思います。

#追記

諸事情により公開停止しました。

#参考

[mastodon_command](https://github.com/kenchiki/mastodon_command)

Nyaaaan制作にあたって参考にさせていただきました。
誠にありがとうございます。