OmniAICreator/Qiita-1.07M huggingface dataset:
DockerからWASの実行環境を構築する

#始めに
[WAS Liberty 環境を Docker 上で動かしてみよう](https://www.ibm.com/developerworks/jp/websphere/library/was/liberty_docker/1.html)をみてDocker上でWASを動かしてみることにする。
まずは、Docker-ToolBoxを導入しようとしたのだが、上記サイトで紹介されているリンクからだと、Docker-ToolBoxのダウンロードサイトにジャンプすることができない    
Googleで検索したところ、docker-ToolBoxのダウンロードサイトは
[https://www.docker.com/get-docker](https://www.docker.com/get-docker) 
のようだ

#dockerセットアップ時に発生するエラーの対処方法
##Docker Quickstart Terminalをダブルクリックするとエラーになる 1
Dockerのインストール時にGitのインストールを選択しない場合、「Docker Quickstart Terminal」のショートカットのパスにインストールされたGitのBashを指定する必要がある
##Docker Quickstart Terminalをダブルクリックするとエラーになる 2
Docker Quickstart Terminalをダブルクリックして

```
Error with pre-create check: "This computer doesn't have VT-X/AMD-v enabled. Enabling it in the BIOS is mandatory
```
のエラーが出る場合は、OSのBIOS上で仮想化の設定を行う必要がある。
ちなみにWin10でBIOSの設定画面を立ち上げるには設定から「更新とセキュリティ」を経由する必要がある
(参考サイト)http://tanweb.net/2017/12/22/17401/

#WASの起動

## １．WAS Liberty の仮想イメージを Dokcer Hub からダウンロードする

以下のコマンドを実行する

```sh
docker pull websphere-liberty
```

## ２．仮想イメージの起動を実行する

### （１）対話モードでの実行

以下のコマンドを実行する

```sh
docker run -it websphere-liberty
```

### （２）バックグランドモードでの実行

以下のコマンドを実行する

```sh
docker run -d -p 80:9080 --name wlp websphere-liberty
```

### （３）ログの確認

以下のコマンドを実行する

```sh
docker logs --tail=all -f wlp
```

#### （４）ＩＰアドレスを確認する

以下のコマンドを実行する

```sh
docker-machine ip
```

#アプリケーションをデプロイする

## １．仮想環境へのアプリケーションのアップロード
```sh
docker-machine scp localhost:/docker/ci.docker.tutorials/app/ServletApp.war $(docker-machine active):/tmp/ServletApp.war
```
でうまくいくとされているが、

```
docker@127.0.0.1's password:    
Permission denied, please try again.
```
と設定した覚えのないdocker@127.0.0.1のパスワードを求められうまくいかなかった。    
仕方がないのでWinSCPを入れてSCPを入れたらうまく仮想環境にファイルをアップロードできたよ

## ２．アプリケーションをデブロイする
以下のコマンドを実行する

```sh
docker run -d -p 80:9080 --name=app -v /tmp/ServletApp.war:/config/dropins/app.war websphere-liberty
```

(コマンドの意味)
ホスト側はポート80、ゲスト側はポート9080でゲストの/tmp/ServletApp.war
に配置したWebアプリケーションをデブロイする

## ３．デプロイしたアプリケーションがゲスト端末で起動していることを確認する
以下のコマンドを実行する

```sh
docker ps
```

## ３．デプロイしたアプリケーションを停止させ、アンデプロイする
以下のコマンドを実行する

```
- docker kill app
- docker rm app
```

## ４．Dockerfileからファイルからアプリケーションをデプロイする

#### (1)Dockerfileの中身

```docker
FROM websphere-liberty    
ADD ServletApp.war /config/dropins/app.war
```

### (2)実行するコマンド

```sh
docker run -d -p 80:9080 --name=app app
```
2Dから3D物体検知についての論文

##概要
画像データから3D物体を検出し、3D物体を枠で囲む（バウンティングボックス）

##既存の検出方法の欠点
 - 全体を読み取るため、3Dオブジェクトの検出に時間がかかってしまう点
 - 似ような色で物体が続いている場合、検出が曖昧になり、不完全になってしまう点
 - 奥行き情報の符号化について不完全である点

##提示されている検出方法について
 - 物体の紹介を読み取り、枠で囲み、3Dの物体を検出・提示を行う。
 - CADモデルを使用せず検出させる事によって、上記に上げた検出法と比べ、時間の短縮を図れる。
 - 場所によっては検出まで時間がかかってしまう場合がある（それでも、既存の検出法と比べ検出時間は短く済む）
 - 既存の3Dの物体検出方法と比べ、論文で提示されている検出方法は約3倍の速さで検出を行うことが可能。（また、誤差は少なくすむ）
 - この検出方式を使用することによって、特定の物体の位置をRGB-Dデータから、3次元座標の特定が可能である。

##すごいと思った点
 - 防犯カメラにこの技術を使うことによって、展示品などのリアルタイムな位置特定が可能になり、防犯性能を上げることが可能であると考えられる点。
 - 3Dの検出が短時間で済ませることができるため、3Dデータの収集などが容易に行うことができると考えられる点。

>参考論文
*2D-Driven 3D Object Detection in RGB-D Images*
https://ivul.kaust.edu.sa/Pages/pub-3d-detect.aspx
Qiitaに投稿した記事のview数をGoogleスプレッドシートへ記録する

# やりたかったこと

以前、[Googleスプレッドシートに記事一覧を取得](https://qiita.com/FrozenVoice/items/b89e48719906180e060c)出来るようにしたので、view数も取得出来るようにしたい

# やりかた

## APIでの取得方法

view数は記事一覧APIの返却値には含まれておらず、認証トークンを使用して各記事の詳細を取得するAPI (/api/v2/items/[記事のID]) から値を取得する必要がある。

## 認証トークンの取得

認証トークンはQiitaにログインして右上の自分のアイコンから「設定」→「アプリケーション」→「新しくトークンを発行する」で取得出来る。

## 記事の詳細情報取得関数を準備

記事IDを指定して情報を取得する下記のような関数をGoogleAppsScriptで用意する。

```js
function detailReader(id) {
  var apiUrl = "https://qiita.com/api/v2/items";
  var token = "[認証トークン]";

  var headers = {'Authorization' : 'Bearer ' + token};
  var params = {'headers' : headers};
  
  var detail = UrlFetchApp.fetch(apiUrl + "/" + id, params);
  var jsonDetail = JSON.parse(detail.getContentText());

  return jsonDetail;
}
```

## 一覧情報から詳細情報を取得

```js
  var detailKeys = {
    'page_views_count' : "",
  };

  // jsonDataに記事一覧が取得されている
  for (var idx in jsonData) {
      // 記事一覧で取得出来る情報をスプレッドシートに出力
      // ・・・中略・・・

      // 詳細情報の項目をスプレッドシートに出力
      var detail = detailReader(jsonData[idx]["id"]);
      for(var detailKey in detailKeys) {
        sheet.getRange(i, j).setValue(detail[detailKey]);  
        j++;
      }
  }
```
お手軽に改ざん検知する方法を考える

# イントロ
このメモはたぶん数時間後に役に立つと思うの。

# 目的
WordPressとか改ざんされやすいCMSで不正なコードを入れられたか検出したい。（悪いのはプラグインだという議論はとりあえず横に置いておくとして）
でもちょっとしたゲームで利用する目的なので大がかりなことはしたくない。どうせいろいろ制限されてるだろうし…

# 方法
正常時にWordPressインストールディレクトリ配下のファイルのMD5値を計算して保存しておく。uploadsディレクトリは除外しておく。

```
# find /path/to/wordpress \
    -type d -wholename '/path/to/wordpress/wp-content/uploads' -prune -o \
    -type f -print0 | xargs -0 md5sum > base.txt
```

```base.txt
3698b890560d117e206fa8e3cf6cddc3  /path/to/wordpress/wp-signup.php
e54cae70b7252c32c1f9c0c8c1a7d1a4  /path/to/wordpress/wp-comments-post.php
f440516a1e2260095e956529ed9e00d4  /path/to/wordpress/wp-login.php
(snip)
```

適当にファイルを書き換えて、その後に出力ファイル名を変更して再度MD5値を計算する。

```
# find /path/to/wordpress \
    -type d -wholename '/path/to/wordpress/wp-content/uploads' -prune -o \
    -type f -print0 | xargs -0 md5sum > modified.txt
```

diffを取るとどのファイルが書き換わったかとか、どこにどんなファイルが追加されたかとか分かる。

```
# diff base.txt modified.txt
813c813
< a3fc7848293b003dae941bb7c1cf339d  /path/to/wordpress/wp-config.php
---
> bf5ce5421a5f6a0c1db77038bb306685  /path/to/wordpress/wp-config.php
1339a1340
> d41d8cd98f00b204e9800998ecf8427e  /path/to/wordpress/evilcode.php
```

これだけだとuploadsディレクトリにPHPスクリプトが置かれたときに検出できないので問題がある。下記のように設定しておくことでたとえ不正なファイルを置かれたとしても実行されることはない。他のスクリプト言語が実行できるサーバ環境ならそれらにも対応しておく。

```/path/to/wordpress/wp-content/uploads/.htaccess
<FilesMatch \.php$>
  SetHandler text/plain
</FilesMatch>
```

とりあえずこのメモは改ざん検出が目的であって改ざんされないようにアップデートや適切なパーミッション設定を行うことは別途必要ということはお忘れ無く。改ざんでもファイル書き換えを伴わない[WordPress 4.7.1の脆弱性](https://www.ipa.go.jp/security/ciadr/vul/20170206-wordpress.html)みたいなものは検出できない。

あと気が向いたらcronで自動的に実行するためのスクリプトを考えてみる。

# cronで定期的に改竄チェック＆メール通知
あとで書こうと思ってたら、すっかり忘れてたので今更ながら追記。このスクリプトを一日一回、cronで実行する。crontabに**MAILTO=**で通知先メールアドレスを記載しておいて、メール通知を行うことで、改竄されたファイルが確認できる。

このスクリプトでは、拡張子がphpのファイルしかチェックしていないが、必要に応じて適当に変更する。

```bash:/root/check_defacement/check_wordpress.sh
#!/bin/sh
export LANG=C

# check WordPress dir
DIR=/var/www/wordpress

FILELIST=`find ${DIR}/* -name '*.php' -type f -print`

DATEID=`date '+%Y%m%d'`
PREVDATE=`date -d '1 days ago' '+%Y%m%d'`

FILENAME=/root/check_defacement/wordpress_${DATEID}.txt
PREVFILE=/root/check_defacement/wordpress_${PREVDATE}.txt

for FILE in $FILELIST
do
echo `md5sum ${FILE}`
done >> $FILENAME

DIFF=`diff ${FILENAME} ${PREVFILE}`
if [ "$DIFF" != "" ]
then
  echo file changed in ${DIR}
fi
```
javaの抽象クラス(abstract class)について

## abstract メソッド 
### abstractメソッドとは
- 処理内容が未定義なメソッド
	- 処理内容は継承先のクラスで記述する。

### Abstractメソッドを作成する目的
- 子クラスの記述・仕様・設計デザインを指定するのに使用する
	- アプリケーションデザインが統一されて開発が行いやすくなる

### 宣言方法
```java
void normalMethod(){
	// 処理
}
abstract void abstractMethod();
``` 

Abstractメソッドを含むクラスは`abstractなクラス`である必要がある

## abstractなクラス

- Abstractメソッドを含むクラス
- 継承元とするために使用する

宣言方法

```java
abstract class ClassName{
	// メソッドなど
}
```


## abstractクラスの継承

```java
class ChildClass extends AbstractClass{
	void abstractMethod(){
	  // 処理内容
	}
}
```


## 具体例

例: 以下のstudentクラスを継承した子クラスはstudyメソッドを持たなければならなくなる

```:説明
「Studentクラス」のオブジェクトは「studyメソッド」を持たせるよう設計したい。
しかし、具体的なstudyメソッドの内容はわからないのでabstractで抽象的に記述。

「InformaicsStudentクラス」は、studentクラスを継承したクラス。
studyメソッドに「情報学を勉強している」と記述する。
```


abstractクラス

```java

abstract class Student(){
	abstract void study();
}
```

子クラス

```java
class InformaicStudent() extends Student{
	void study(){
		System.out.println("情報学を勉強しました");
	}
}
```
忘れた時の文字列検索find

#忘れた時の文字列置換 find
よく自分が忘れるので、自分が使うようのメモとして書いてます。

##ファイル名で検索
find <検索対象ディレクトリ> -name  <検索対象のファイル or ディレクトリ名>

ex)find ./ -name hoge.txt

##全ファイルの中からの文字列を検索(他人のプログラムを読むときに個人的によく使います)
find <検索対象ディレクトリ> -type f -print | xargs grep <文字列>

ex) find ./ -type f -print | xargs grep hogehoge
スクリプトでちょっと足回り強化

## 正直`:ls`は使いづらくて…

使いづらいってほどじゃないんだけど、コマンド実行後の画面専有があまり嬉しくないので定期的にふっ飛ばしたくなりつつも、あると便利なのも本音なのでうまいこと調節してやりたいんですよね。それは`:oldfiles`も一緒で…でもいちいち`:filter`もめんどくさい。

ということはスクリプトですよね？

### SCRIPT OR DIE!!!!!!!!!

```vim:command.vim
" :lsと:oldfilesのフィルタリング用
function! s:loadList(...) abort
  if a:0 != 1
    let l:query = '/'.a:2.'/ '
  else
    let l:query = '// '
  endif
  exec 'filter '.l:query.a:1
endfunction

command! -nargs=? RRoldfiles call s:loadList('oldfiles',<f-args>)
command! -nargs=? BBls call s:loadList('ls',<f-args>)

noremap <Leader>rr :RRoldfiles 
noremap <Leader>bb :BBls 
```

これでリーダーから省略で入力してもその状態からフィルタリングして出力の量が減らしやすくなりました。さておき、それでも多いときは多いし出来ればコマンドの出力結果自体を画面の半分くらいにしてほしいんだけど、どっか設定できる所あるんですかね？おしえてvimmer!

## 間違えて何度ウィンドウ閉じたことか…

編集ウィンドウが一つしかない時によく間違えて`:q`してしまうので…

```vim:command.vim
function! s:chkQuit() abort
	if winnr() * tabpagenr() > 1
		:quit
	else
		:enew
	endif
endfunction

command! -bang CQ :call s:chkQuit('')

nnoremap q :CQ
```

~~`:q`に対して引数ないので簡単だったけどこれ`:wq`に対してはちょっと調べないとる気がせんやつだなーってなってます。そんなに考えることなさそうなんでちょっとやってみますか…~~

なんだこれ全然ダメじゃねぇか！

### もっと単純でいいのよ？

コマンドの置き換えは`cabbrev`を使える…なら`close`に置き換えてしまえるのか…

```vim:vimrc
cabbrev q <c-r>=(getcmdtype()==':' && getcmdpos()==1 ? 'close' : 'q')<CR>
```

まぁそりゃそうよね。ただ、「気分的にコマンドに対して別なコマンド動くの気持ち悪くない？」ってなってます。例えば…

```vim
function! s:quitChk() abort
	if winnr('$')*tabpagenr('$') <= 1 && getcmdline() != ':quit'
		enew
	endif
endfunction

augroup dumbQuit
	autocmd!
	au QuitPre * call s:quitChk()
augroup end
```

…みたいに出来ないの？と思ったけど結局終了処理に入りましたね。

#### 間違っとるやんけ！

```vim:dumbquit.vim
" :qでvimを終了させないための処理
function! s:quitChk() abort
	if winnr('$')*tabpagenr('$') <= 1 && histget("cmd",-1) !~ '\v^quit(all)?!?'
		echo ''':quit[all]'' to close vim.'
		sbp
	endif
endfunction

augroup dumbQuit
	autocmd!
	au QuitPre * call s:quitChk()
augroup end
```

微妙に間違ってて、コマンドが省略なしの`:quit`だった時だけ`sbp`させないようにしてた部分が`getcmdline()`だとダメだったので`histget()`に変更しました。出来れば起動時のメッセージも出したいんだけどアレどうやって出してるんです？
railsでjQueryが初回だけ動かない!

# railsでjQueryが初回だけ動かない！

インクリメンタルサーチを実装後、動作確認をしたところ初回だけ非同期通信が走らない。
ページをリロードすると何の問題もなく動く。
色々と確認してみると別ページで実装した非同期通信も初回だけ動いていない...

### 原因は「gem 'turbolinks'」でした。

- Gemfile の `gem 'turbolinks'` をコメントアウト
- application.js の`//require turbolinks` を削除
- サーバー再起動

これで最初からきちんと動くようになりました！
<br>

- Rails5以降の場合は以下の箇所も要変更 layouts/application.html.erb

`　"data-turbolinks-track" => true`
　　　　　　　       　↓
`"data-turbolinks-track" => "reload"`
DartでつくるCASL2逆アセンブラ

ひょんなことからCASL2について人に教える立場になってしまった。汗

CASLをやったのは〇十年前なので、作りながらはまり箇所をチェックしていくのが一番なんだけど、期間的に厳しいのでとりあえず逆アセンブラでも作って仕様に慣れてよしとしよう。

ほんとはCで作ったほうがいいんだけど、今回は布教を兼ねてサクッとDartで。逆アセンブルができれば、その先も見えてくると思うので、時間をみつけて最終的にはDart版CASL2アセンブラとCOMET2シミュレータの実装まで手を出せたらいいなと思う。

といっても、CASL2アセンブラによってアセンブルされたオブジェクトファイルを読み込んで、逐次的に処理するだけで、至って簡単。

事前にアセンブルされたオブジェクトファイルが必要だけど、今回はCASL2のC実装である[YACASL2](https://github.com/j8takagi/YACASL2)で出力したオブジェクトファイルを使用した。

[C言語の勉強がてら、CASL II処理システムを実装した話](https://qiita.com/j8takagi/items/2db31b073cf1fbfd492f)

使用例）

YACASL2にあるサンプルCASLファイルをアセンブルしておく。

```as/hello.casl
MAIN    START
        OUT     OBUF,LEN
        RET
OBUF    DC      'Hello, World!'
LEN     DC      13
        END
```

```
$ casl2.exe -ohello.o as/hello.casl
$ od -t x2 hello.o
0000000 7001 0000 7002 0000 1210 0013 1220 0020
0000020 f000 0002 1210 0021 1220 0022 f000 0002
0000040 7120 7110 8100 0048 0065 006c 006c 006f
0000060 002c 0020 0057 006f 0072 006c 0064 0021
0000100 000d 0a0d 0100 0000
0000107
```

出力されたオブジェクトファイルを逆アセンプルする。

```
$ cd casldump
$ pub run bin/main.dart hello.o > reverse.casl
```

```reverse.casl
MAIN  START
L0000 PUSH #0000,GR1           ; 7001 0000
L0002 PUSH #0000,GR2           ; 7002 0000
L0004 LAD  GR1,#0013           ; 1210 0013
L0006 LAD  GR2,#0020           ; 1220 0020
L0008 SVC  #0002               ; f000 0002
L000a LAD  GR1,#0021           ; 1210 0021
L000c LAD  GR2,#0022           ; 1220 0022
L000e SVC  #0002               ; f000 0002
L0010 POP  GR2                 ; 7120
L0011 POP  GR1                 ; 7110
L0012 RET                      ; 8100
L0013 DC    72                 ; 0048 'H'
L0014 DC   101                 ; 0065 'e'
L0015 DC   108                 ; 006c 'l'
L0016 DC   108                 ; 006c 'l'
L0017 DC   111                 ; 006f 'o'
L0018 DC    44                 ; 002c ','
L0019 DC    32                 ; 0020 ' '
L001a DC    87                 ; 0057 'W'
L001b DC   111                 ; 006f 'o'
L001c DC   114                 ; 0072 'r'
L001d DC   108                 ; 006c 'l'
L001e DC   100                 ; 0064 'd'
L001f DC    33                 ; 0021 '!'
L0020 DC    13                 ; 000d
L0021 DC    13                 ; 0a0d
L0022 DC     0                 ; 0100 (might be DS)
      END
```


ラベルは復元できないのでSTARTのMAINラベルは固定、あとはオフセットをそのままラベル化。マクロも展開されたまま。一応、逆アセンブルをファイルに落として再度アセンブルできることは確認した。（あんまりテストしていない。サブルーチンとか？）

Dartでバイナリ操作するのは結構大変そうだなと思っていたがそうでもなかった。しかし、書式の指定が仰々しい。もっとスマートに書けるんかな。

ソースはここ。
https://github.com/tatsu/casldump

以下、Dartメモ。

File#readAsBytesの戻り値がList<int>で使いにくそうだと思ったが、実際はUint8Listなのでupcastするだけで使えた。
https://github.com/dart-lang/sdk/issues/31547

シンボル名を表示しようとすると、リフレクションが必要みたい。いまのところ。
https://github.com/dart-lang/sdk/issues/28372
windows10でVSCode+WSL+anacondaの環境を構築したかった

# 目標
- VSCodeのデバッグ環境でのPythonと、WSLで使っているPythonが別物なのが気持ち悪い。特に、VSCodeでのターミナルをWSLにしているとき。
- Windows10 + VSCode + WSL + anacondaの環境を構築したい。
- VSCodeとWSLで同じanacondaのPythonが動けばベスト。

# やったこと
- まずanaconda+VSCodeを構築し、ここにWSLを乗せることを考えた。  
[Windows10環境にAnaconda+Visual Studio CodeでPython環境を構築](https://qiita.com/Atupon0302/items/ee3303629ce0b2ae58d7)    
この手順でインストールされるanacondaでのPythonの実体はwindows環境用(exeファイル)で、WSLでは動かなかった。
- まずanaconda+WSLを構築し、ここにVSCodeを乗せることを考えた。  
[bash on ubuntu on windows に anaconda をサクッとに入れる](https://qiita.com/esu_eichi/items/e716567f44611fb49a4b)  
この手順でインストールされるanacondaでのPythonの実体はLinux環境用(binaryファイル)で、VSCodeでは動かなかった。
- そもそもVSCodeとWSLはいろいろと不都合が多い。  
[VSCode + WSL](https://qiita.com/remin/items/b764036e95a13075ee98)  
よくよく考えれば当たり前だった。。

#解決
- Windows10 + Atom + WSL + anacondaの環境にした。  
AtomならVSCodeみたいにPythonを紐づけることもないので解決。  
ここで違うのはデバッグ環境がないことぐらいだけど、まああまり使わないしなあ。
Vagrant アンインストール時のトラブルシューティング

もう使われなくなったサーバマシンをおもちゃにしても良い、とのことだったので、まずは HDD の大半を占めている Vagrant を軽い気持ちでアンインストールしようとしました。Vagrant 初めて触るのに。
猫と遊んだりしながらだらだらと作業をしていたら思った以上に失敗したので FYI です。
反面教師にしてください。

要は Vagrant をアンインストールする前に vagrant destroy をちゃんとやっておけ、という話。

# Vagrant のアンインストール

[公式](https://www.vagrantup.com/docs/installation/uninstallation.html)を見たところ、以下のディレクトリを削除すれば良いとのこと。

>On Linux:
>```rm -rf /opt/vagrant
rm -f /usr/bin/vagrant
```

アンインストール超簡単！HDD の空きはどのぐらい増えたのかな？
と思って確認すると・・・全然増えてないな・・・

>On all platforms, remove the ~/.vagrant.d directory to delete the user data. When debugging, the Vagrant support team may ask you to remove this directory. Before removing this directory, please make a backup.

同じページに User Data の消し方も書いてあったので、

```shell-session
# rm -rf ~/.vagrant.d
```

それでも空き容量は増えません。

# ~/VirtualBox VMs/ 配下を削除

~/VirtualBox VMs/ の仮想イメージファイルっぽいものを発見。
OK、これを消せば良いんだな。

```shell-session
# rm -rf ~/VirtualBox\ VMs/centos_default
```

まだまだ空き容量は増えません。

# Vagrant アンインストール後に仮想マシンを削除する方法

ここら辺でいよいよ「これ以上場当たり的なことをせず、ちゃんと調べよう」と思い立ちます。

* [Vagrant destroyをせずにVagrantのプロジェクトディレクトリを削除した場合に仮想マシンを削除する方法](http://stupiddog.jp/note/archives/725)

どうも Vagrant をアンインストールする前に vagrant destroy で仮想マシンを破棄していなかったことが悪かった模様。
上記リンクで確認したところ、VBoxManage で削除する方法が記載してありました。

```shell-session
# VBoxManage list vms
"centos_default" {UUID}
```
VBoxManage list vms で見つけた仮想マシンを削除します。

```shell-session
# VBoxManage unregistervm centos_default --delete
VBoxManage: error: Cannot unregister the machine 'centos_default' while it is locked
VBoxManage: error: Details: code VBOX_E_INVALID_OBJECT_STATE (0x80bb0007), component MachineWrap, interface IMachine, callee nsISupports
VBoxManage: error: Context: "Unregister(CleanupMode_DetachAllReturnHardDisksOnly, ComSafeArrayAsOutParam(aMedia))" at line 156 of file VBoxManageMisc.cpp
```

ギャフン

# 仮想マシン削除時に「Cannot unregister the machine 'xxx' while it is locked」というエラーが出た時の対処

また調べます。
* [vagrant destroyが「Cannot unregister the machine 'xxx' while it is locked」というメッセージを出して失敗する](http://l-w-i.net/t/vagrant/control_100.txt)

なるほど、プロセスが生きてるのか。

```shell-session
# ps -ef | grep -i vboxheadless
root      6972  6466 10  2017 ?        16-18:53:10 /usr/lib/virtualbox/VBoxHeadless --comment centos_default --startvm uuid --vrde config
root     11107 10504  0 14:12 pts/0    00:00:00 grep -i vboxheadless```
# kill 6972
```

さて改めて削除するか、と仮想マシンを再度確認すると、

```shell-session
# VBoxManage list vms
"<inaccessible>" {uuid}
```

ギャフン

# 仮想マシンが inaccessible になった時の対処

df コマンドで確認したところ、この時点で予想していた分だけ HDD 空き容量は増えていました。
(プロセスを kill する前には増えていたのかも。)

とはいえ Virtual Box に inaccessible が残っているのは気持ちが悪い・・・
今度は --delete オプションなしの VBoxManage unregistervm で登録されている VM を解除します。

```shell-session
VBoxManage unregistervm {uuid}```
# VBoxManage list vms
#
```

これにて落着。

---

Vagrant をアンインストールする機会というのはあまりないかもしれませんが、エラーメッセージなどで検索してきた人に、この記事が少しでも役に立てたら何よりです。
Hexo で作った静的サイトを AWS で運用した場合の月額費用

## 概要
### 構成
[こちらを参照](https://qiita.com/shimon_haga/items/c19e10c584b742cb502f)

### 運用しているサイト
[黒柴の柚子](https://yuzu.shibainu.love)

### ズバリおいくら
77円でした。

<img width="645" alt="トータル費用" src="https://qiita-image-store.s3.amazonaws.com/0/71497/ccf088d1-e9a0-88e3-494a-e5ccee7320af.png">

## 内訳
Route53 >> CloudFront > S3 > Tax

### Route53
詳しく見ると料金のほとんどは Route53 によるもの。
さらに詳しく見ると zone のホスト数による費用がほぼ全て。
<img width="851" alt="Route53 内訳" src="https://qiita-image-store.s3.amazonaws.com/0/71497/f672cd24-3f3b-60c1-5ef7-9a8fff11802c.png">
Route53 は Zone が 25 ごとに $0.5 かかるので、1ドメインだけ運用していると、確かに高い。
逆に言えば 25 サイトまではベースが $0.5 で済むので、複数運用するならお得になる感じ。
クエリ数に対する費用はほぼかかっていないも同然。

### CloudFront
2番目に高かったのがこいつ。
SSL もついてくるので、高かろうが文句はない。
高いと言っても $0.08 なので、まぁ1円くらい。安い。<img width="620" alt="CloudFront 内訳" src="https://qiita-image-store.s3.amazonaws.com/0/71497/200c273d-b084-af3a-bb7f-006c5cdbfd0b.png">
今回は Global の配信はしなかったので、ちょっと安くなっていると思う。

### S3
最後はこいつ。
ホスティングの肝の S3 さん。
正直安すぎてよくわからない。
<img width="875" alt="S3内訳" src="https://qiita-image-store.s3.amazonaws.com/0/71497/111f3734-0a9d-4013-7796-9c6f423b6381.png">
hexo の仕様なのか調査が必要だが、デプロイ時に全ての記事を再アップロードしているように思う。
構築して最初だったため、サイトのデザイン調整や、記事の拡充等で結構頻繁にデプロイしたので、1000近い操作クエリになっている。

## まとめ
1サイトをサーバフリーで運用できる上に100円未満って超安くないですか？
TortoiseSVNを既にインストールしてるときのコマンドラインツールの取得・設定方法

#概要
既にTortoiseSvnをインストールしてしまって、コマンドラインからTortoiseSvnを打てるコマンドラインツールを後から欲しくなってしまったけど、やり方があんまり載ってなかったので忘備録としてまとめます。

![2018-05-11_20h47_39.png](https://qiita-image-store.s3.amazonaws.com/0/59907/ef6a288d-7abf-1177-c7ba-ed6ce0f63319.png)

#やり方

1.このサイトでApache Subversion command line tools をダウンロードします。 
https://www.visualsvn.com/downloads/

2.環境変数のPathにダウンロードしたcommand line toolsの中にあるbinフォルダのパスを通します。

例:　C:\Apache-Subversion-1.10.0\bin

3.コマンドラインからコマンドを打ちます。
一番簡単なのはバージョン情報だと思うのでそれを打ちます。

```shell
svn --version
```

こんな感じにバージョンが出れば成功です。

```sh
svn, version 1.10.0 (r1827917)
```
#終わりに#
もっといいやり方あるよとかあれば教えていただけるとありがたいです。

#参考URL#

https://www.softel.co.jp/blogs/tech/archives/4667

http://www.neko.ne.jp/~freewing/software/subversion/
$watchでオブジェクトの変更を監視する方法


##はじめに

Vue.jsで生成したオブジェクトは`$watch`というメソッドを持っています。
これによりデータの変更を監視することが可能になります。
しかし、`$watch`メソッドは、オブジェクトの追加や削除を検出してくれますが、
オブジェクトの値が変更された場合は検出しません。😢

次のような例をみてください。
(※例ではVueインスタンスの`watch`オプションに設定していますが、インスタンス化したときにオブジェクトの各エントリに対して`$watch`メソッドが呼び出されます)

```vue:
<script>
  export default {
    data () {
      return {
        someObj: {
          a: 'obj-a',
          b: 'obj-b',
          c: 'obj-c'
        }
      }
    },
    watch: {
      someObj: function (val, oldVal) {
        console.log('someObj changed')
      }
    }
  }
</script>
```
この場合、オブジェクトデータ`someObj`の中のネストされた値(`someObj.a`,`someObj.b`,`someObj.c`)が変更されても、
`watch`オプションでは検出してくれません💦
オブジェクトの変更を検出するには、以下の方法があります😇




##オブジェクトを丸ごと監視したい場合(ネストしたデータも監視したい場合)


```vue:
<script>
  export default {
    data () {
      return {
        someObj: {
          a: 'obj-a',
          b: 'obj-b',
          c: 'obj-c'
        }
      }
    },
    watch: {
      someObj: {
        handler: function (val, oldVal) {
          console.log('someObj changed')
        },
        deep: true
      }
    }
  }
</script>
```


`options`引数に`deep: true`を渡すことで、
オブジェクトの中のネストされた値の変更を検出することができます。
※監視する際のコールバック処理は`handler`に記述します。

##オブジェクトを個々に監視したい場合


```vue:
<script>
  export default {
    data () {
      return {
        someObj: {
          a: 'obj-a',
          b: 'obj-b',
          c: 'obj-c'
        }
      }
    },
    watch: {
      'someObj.a': function(val){
        console.log('someObj.a changed');
      },
      'someObj.b': function(val){
        console.log('someObj.b changed');
      },
      'someObj.c': function(val){
        console.log('someObj.c changed');
      }
    }
  }
</script>
```

`watch`のキーを`'someObj.a'`のようにクォーテーションで囲うことで、
それぞれのプロパティを個々に監視することができます。

##まとめ

多くの場合では、データの変更を監視するには算出プロパティの方が適切だと思うのですが、
中にはカスタムウォッチャが必要な時もあると思います✌️
データの変更に対して反応する、`watch`オプションはとても汎用性が高く便利ですね😇
疎結合な団体メンバー間のコミュニケーションサポートボットの予想図

# 一行テーマ

個人情報を交換せずにメンバー同士のコミュニケーションをサポートするチャットボット

---
# ストーリーボード

<img width="446" alt="スクリーンショット 2018-05-11 20.30.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/27862/701a1a79-7a02-f1da-6914-6468f1015603.png">

<img width="385" alt="スクリーンショット 2018-05-11 20.39.11.png" src="https://qiita-image-store.s3.amazonaws.com/0/27862/b3f94b5c-7823-14df-61bb-39845390ccde.png">


---
# 仕組み

- スマホ(LINE)を使えないメンバーにもリーチするため、情報の出力先として LIN(スマホ), SMS(ガラケー), 音声通話(家電)をサポート
- 質問や指示の入力は厳密な書式や単語を使用しなくても大体で大丈夫(自然言語認識AIによるバックエンド)

<img width="703" alt="スクリーンショット 2018-05-11 20.45.19.png" src="https://qiita-image-store.s3.amazonaws.com/0/27862/65b3e6cd-2483-63dc-bd91-5c992d427ddf.png">
spring-bootでファイルパス上のメッセージプロパティをMessageSourceに使う

spring-bootはclasspath下に```message.properties```という名前のファイルを置けばメッセージプロパティとして使用できる。そうではなく、任意のパス上にファイルを配置したい場合。

## 準備
```xml:pom.xml
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.0.1.RELEASE</version>
	</parent>
```

## コード
メッセージプロパティファイルは```files/mymessages.properties```に配置。

```properties:files/mymessages.properties
hoge.message=foobar
```

```java:Application.java
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.MessageSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Lazy;
import org.springframework.context.support.ReloadableResourceBundleMessageSource;

@SpringBootApplication
public class Application implements CommandLineRunner {

	@Autowired
	@Lazy
	MessageSource messageSource;

	public static void main(String[] args) {
		SpringApplication.run(Application.class, args);
	}

	@Override
	public void run(String... args) throws Exception {
		String hoge = messageSource.getMessage("hoge.message", null, null);
		System.out.println(hoge);
	}

	@Bean
	public MessageSource messageSource() {
		ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
		messageSource.setBasename("file:files/mymessages");
		return messageSource;
	}
}

```

## 調査メモ
spring.messages.basenameでmessage.properties以外の名前にしたり複数のファイルを指定できる。ただし、ここにはclasspath下のファイルしか指定できない。```file:files/mymessages```とか書いても```classpath*:file:files/mymessages.properties```になる。
mongodb/mongoid：ネストしたフィールドを検索する方法


# ドット記法で取れる

## こんなデータを
```json
{
  "name": "taro",
  "address": {
    "number": 1234,
    "building": "tokyo_tower"
  }
}
```

## こう取る
```ruby
User.where("address.building" => "tokyo_tower").as_json
```


# 補足
***where***はトップレベルのみ検索できる（ネストされたフィールドは検索できない）と書かれた記事もあったのですが、ドット記法で問題無く取れました。古いバージョンなのかどうかはよくわかりません

# 参考
[mongoDB - Query on Embedded/Nested Documents](https://docs.mongodb.com/manual/tutorial/query-embedded-documents/#query-on-nested-field)

# バージョン
* mongoid (6.0.2)
* MongoDB shell version: 3.2.14
Raspberry Pi のペリフェラル割り込み番号

Raspberry Pi のペリフェラル割り込み番号を調べてみました。

Raspberry Pi の割り込み番号は、BCM2835 ARM Peripheralsというドキュメントにも載っているのですが、情報が抜けています。

抜けている情報をLinuxのカーネルソースから拾って埋めてみました。


| 番号 | 割込み | 番号 | 割込み | 番号 | 割込み | 番号 | 割込み |
|:--|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|0  | timer0  |16   |dma0  |32   |   |48   |smi   |
|1  | timer1  |17   |dma1   |33   |hvs   |49   |gpio   |
|2  | timer2  |18   |vc_dma2   |34   |   |50   |gpio   |
|3  | timer3  |19   |vc_dma3   |35   |   |51   |gpio   |
|4  |   |20   |dma4   |36   |dsi0   |52   |gpio   |
|5  |   |21   |dma5   |37   |   |53   |i2c0/i2c1/i2c2  |
|6  |   |22   |dma6   |38   |   |54   |spi_int   |
|7  |   |23   |dma7   |39   |   |55   |pcm_int   |
|8  |   |24   |dma8   |40   |hdmi   |56   |sdhost   |
|9  |usb   |25   |dma9   |41   |hdmi   |57   |uart0   |
|10  |v3d   |26   |dma10   |42   |pixelvalve   |58   |   |
|11  |   |27   |dma11   |43   | i2c_spi_slv_int  |59   |vec   |
|12  |   |28   |dma12   |44   |dsi1    |60   |   |
|13  |   |29   |uart1/spi1/spi2	   |45   |pwa0   |61   |uart0   |
|14  |   |30   |sdhci   |46   | pwa1    |62   |sdhci   |
|15  |   |31   |   |47   |   |63   |   |



## 割り込み番号の調べ方

- デバイスツリーのファイルを開く
- https://github.com/torvalds/linux/blob/master/arch/arm/boot/dts/bcm283x.dtsi
- 各ペリフェラルのinterrupts の設定を探す。

```
interrupts = <2 30>;
```

- １番目の数字をa, ２番目の数字をbとしたら　32*(a-1) + b が割り込み番号になります。
- a=2、b=30なら、割り込み番号は62です。


## 追記
- もうちょっと探したら、割り込み番号が定義されたヘッダファイルがあった。
- https://github.com/raspberrypi/linux/blob/rpi-4.2.y/arch/arm/mach-bcm2708/include/mach/platform.h
Ubuntu Desktop 18.04 の Docker インストールで詰まった話

# 環境
Ubuntu 18.04 LTS

## Ubuntu ソフトウェアからインストール

Ubuntu 公式のストアから普通にインストール出来る

が、なぜか docker グループが作成されず
自分で追加してみても　sudo 無しで docker コマンドを実行できなかったので
大人しく Docker Documantation に従うことにした

[追記]
単純に docker を再起動して ssh し直すのを忘れていた可能性大

## 公式ドキュメント

https://docs.docker.com/install/linux/docker-ce/ubuntu/

3つほど方法があるのだが、公式リポジトリを利用する方法を採用

最後の最後で詰まる

```
$ sudo apt install docker-ce

パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
パッケージ docker-ce は使用できませんが、別のパッケージから参照されます。
これは、パッケージが欠落しているか、廃止されたか、または別のソース
からのみ利用可能であることを意味します。

E: パッケージ 'docker-ce' にはインストール候補がありません
```

docker-ce がそもそも無いらしい…

実は stable リポジトリにはまだ docker-ce が無いので edge 版を入れる必要があった

https://linuxconfig.org/how-to-install-docker-on-ubuntu-18-04-bionic-beaver

```
$ sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   edge"
```

確認

```
$ sudo apt search docker-ce

ソート中... 完了
全文検索... 完了
docker-ce/bionic 18.05.0~ce~3-0~ubuntu amd64
  Docker: the open-source application container engine
```

これでインストールできる

[追記]
コメントでいただいたように、
stable 版では6月には利用できるようになるそうです
https://qiita.com/yukin01/items/67b13a20962b56facfdc#comment-1e78ebca5ae9de676b21
js 与えられた文字の母音の数を返す

##題
与えられた文字の母音(a i u e o)の数をかえしてください。
*ここで与えられる文字はスペースを含むアルファベットを指します。
*正規表現、使用不可（簡単すぎるので）

```javascript

getCount = (str)=> {
  //write your code

}
getCount('abcidsge');//3

```

##使ったもの
forEach()
if
spread operator

##考え方
spread operatorで引数を一文字にして配列にいれる。
配列の文字をforEachで個別にifで母音か判定
当てはまれば返す数字を足していく

##コード

```javascript
getCount = (str)=> {
  let vowelsCount = 0;
  str.toLowerCase().split('').forEach((e,i)=>{
    if(e == "a"||e == "e"||e == "i"||e == "o"||e == "u")vowelsCount++
  });
  return vowelsCount;
}
getCount('abcidsgE');
```

##その他コード

```javascript
function getCount(str) {
 return str.split('').filter(c => "aeiouAEIOU".includes(c)).length;
}

```
他にもコードが浮かんだ方、
コードゴルフが浮かんだ方、コメントにお願いします。


**おまけ 正規表現**

```javascript
function getCount(str) {
  return (str.match(/[aeiou]/ig)||[]).length;
}

```
cx_Freeze ビルド時によく遭遇するエラー(NameError, AttributeError, ImportError)とその対処方法

Python スクリをバイナリ化するビルドツール cx_Freeze を使っててよく遭遇するエラーとその対処についてまとめてみました。

# 前提
- Python 3.6
- cx_Freeze 5.1.1
 
# (エラー1) NameError: name `'__file__'` is not defined
`__file__` は使えない。

(対策) `sys.argv[0]` などで補う。

# (エラー2) NameError: name 'exit' is not defined
`exit()` は使えない。

(対策) `sys.exit()` を使う。

# (エラー3) AttributeError: 'NoneType' object has no attribute 'write'
argparse を例にする。

argparse は Usage や「コマンドライン引数が不正ですよ」といった旨を標準出力するが、cx_Freeze で **Win32GUI でビルドしている場合は標準出力担当が消えてなくなる（標準出力を行う機能を持ったオブジェクトが None になる）** ため、このようなエラーが出る。

決定的な対策方法はなく、工夫して凌ぐしかない。以下に二つほど挙げる。

## 対策1: try-except でラップする
たとえば拙作のプログラムランチャ incl では [例外時のエラーメッセージをシンプルにした上で、winapi の MessageBox で表示させる](https://github.com/stakiran/incl/blob/bf7aa0f81062ef9f548dfd35d125ed5f72bfe584/incl.py#L132) という対応をしている。素のエラーメッセージ（スタックトレース）全文を表示するよりは全然優しい。

## 対策2: 標準出力先を nul(null) に置き換える
トリッキーな方法として「標準出力自体を無効化する」やり方もある。

```python
import os
import sys

# 標準出力先を nul(null) に置き換える
null_fp = open(os.devnull, 'w')
sys.stdout = null_fp
```

詳しくは [Redirecting stdout to "nothing" in python - Stack Overflow](https://stackoverflow.com/questions/6735917/redirecting-stdout-to-nothing-in-python) に書いてあるが、sys.stdout に nul や null に相当するディスクリプタを指定させることで何も出力させないようにするというもの。

ただしこれを行うと **開発時（たとえばコンソールから実行する時）も標準出力が一切見えなくなってしまう** ため不便だ。開発時は普段通り表示し、リリース時にのみ nul 指定させる、などさらに一工夫必要だろう。

# (エラー4) ImportError: can't find module `'XXXXXXXX__main__'`
実行ファイル名を変更した後で起動すると起きる。

## 詳しく
cx_Freeze では `cx_Freeze.Executable('main.py')` という形でエントリーポイントを指定するが、この時の実行ファイル名は main.exe 固定となる。

この時、内部的にはおそらく以下のようになっていて、

- `(実行ファイル名)__main__` という名前のメインモジュールが定義されている
  -  `(実行ファイル名)` 部分は **ビルド時点のものがハードコードされる**
- 実行ファイルを実行すると、まず `(実行ファイル名)__main__`  を開こうとする
- この時の `(実行ファイル名)` 部分は **実行時の実行ファイル名から動的に取り出す**

したがって **「ビルド時点のハードコードされた実行ファイル名」と「実行ファイル名」が違っているとメインモジュールにヒットしない** という挙動になってしまう。

## 対策: 実行ファイル名は変更しない
実行ファイル名を変更したい場合は、エントリーポイントとなる py ファイル名自体を変更すること。

上記例で言えば、main.py をビルドして出来た main.exe を mytool.exe に変更するのではなく、main.py を mytool.py に変更した上でビルドする（すると mytool.exe ができる）。

# (エラー5) ImportError: DLL load failed: 指定されたモジュールが見つかりません。
実行ファイル実行時のカレントディレクトリが「実行ファイルのあるディレクトリ以外」になっている時に起きる。たとえば TKinter モジュールに対して起きる。

## 原因
DLL ファイルの同梱先が間違っており DLL 探索に失敗している。

## 対策
**DLLは lib フォルダの中に入れる**。

これも [拙作プログラムランチャ incl の話](https://github.com/stakiran/incl/issues/2) になるが、以下のように修正した。

正しくない例:

```
+ incl
  + lib        ★ 正しくはこっちに入れるべきなのに
  + tcl
  + tk
  - incl.exe
  - tcl86t.dll ★ DLL を実行ファイル直下に置いていた
  - tk86t.dll  ★
```

正しい例:

```
+ incl
  + lib
    - tcl86t.dll ★ DLL を lib 配下に移した
    - tk86t.dll  ★
  + tcl
  + tk
  - incl.exe
```

ちなみに、**cx_Freeze でビルドしただけだと DLL は上記「正しくない例」の位置に配置されてしまう** ので、「正しい例」の位置に配置させるためには追加手順（DLLファイルの move をビルドスクリに追記する等）が必要。
SQLSTATE[23000]: Integrity constraint violation 1048

# エラー概要

Integrity constraint violation => 整合性規約違反

上記のような意味となるので基本的には定義には当てはめられない挙動を実行しようとした場合に起こるエラーと考えて良い。

[MySQL B.3 サーバーのエラーコードおよびメッセージ](https://dev.mysql.com/doc/refman/5.6/ja/error-messages-server.html) においてエラーコード「1048」　で検索を行うと以下のような説明がある。

> - エラー: 1048 SQLSTATE: 23000 (ER_BAD_NULL_ERROR)

>     メッセージ: カラム '%s' は null にできません

# 実際に起こるケース

### DBのテーブル定義を変更した

- auto_incrementだったカラムをauto_incrementを外したが、補完するコードを入れ忘れた(「1062 Duplicate entry '0' for key 'PRIMARY'」など)


### 単純に起こる回数が少なかったが、定義忘れ
CentOS7で/etc/init.d/iptables saveする

# TL;DR

※ firewalldとは共存できないらしいので注意

```
$ sudo yum install iptables-services
$ sudo /usr/libexec/iptables/iptables.init save
```

# 経緯
Amazon Linux 2を使うとiptablesは入っているけど/etc/init.d/iptablesがなくて/etc/init.d/iptables saveができなかった。というか/etc/init.d以下にほとんどスクリプトがない。
で、/etc/init.d/READMEってファイルがあったので見てみたらsystemctl使え（意訳）って書いてある。systemctlでiptablesを使うにはiptables-servicesをインストールする必要があるっぽい。インストールする。

```
$ sudo yum install iptables-services
```

しかしsystemctlにはsaveなんてコマンドはない。
systemdのサービス化したとはいえ、どうせ/etc/init.d/iptablesのスクリプトをそっちに移動しただけだろうと推測しその起動スクリプトを探してみる。systemctlの設定ファイルには起動コマンドが書いてあるはずなので、そこから探す。systemctl enable iptablesしたら設定ファイルが`/usr/lib/systemd/system/iptables.service`にあることが分かった。

```
$ cat /usr/lib/systemd/system/iptables.service
[Unit]
Description=IPv4 firewall with iptables
Before=ip6tables.service
After=syslog.target
AssertPathExists=/etc/sysconfig/iptables

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/libexec/iptables/iptables.init start
ExecReload=/usr/libexec/iptables/iptables.init reload
ExecStop=/usr/libexec/iptables/iptables.init stop
Environment=BOOTUP=serial
Environment=CONSOLETYPE=serial
StandardOutput=syslog
StandardError=syslog

[Install]
WantedBy=basic.target
```

起動スクリプト本体は`/usr/libexec/iptables/iptables.init`らしい。これの中身を見てみるとやっぱりsaveコマンドある。というわけで

```
$ sudo /usr/libexec/iptables/iptables.init save
```

で、/etc/init.d/iptables save相当のことができた。
plaidMLの落とし穴

#plaidMLでKerasのコードをそのまま実行
```
TypeError: Failed to convert object of type <class 'plaidml.tile.Value'> to Tensor. Contents: Tanh FLOAT32(<tile.Value Operation UINT64()>, 64). Consider casting elements to a supported type.
```
こんなエラーが出ることがあります。よくあるのが

```
layer = Lambda(lambda x: tf.sqrt(x))(prev_layer)
```
 
こんな感じでKerasのLambda内部でTensorflowのメソッドを直接使っている場合です。plaidMLが定義しているクラスのインスタンスをTensorflowのメソッドの引数にしたらクラスが違うのだからそりゃダメだよね、という事で

```
import keras.backend as K
layer = Lambda(lambda x: K.sqrt(x))(prev_layer)
```

kerasのバックエンドメソッドを利用しましょう。これらのメソッドはplaidML側で受け皿がちゃんと用意されているようです。
ただし、Tensorflowの豊富なメソッドが全てバックエンド関数で使える訳ではないので工夫が必要になることも多いです。
NCL > array > 2つのarrayを足す > array_append_record()

```txt:動作環境
Xeon E5-2620 v4 (8コア) x 2
32GB RAM
GeForce GT 730 1GB GDDR5
CentOS 6.9 (64bit)
NCAR Command Language Version 6.3.0
for WRF3.7.1, WPS3.7.1
  openmpi-1.8.x86_64 とその-devel
  mpich.x86_64 3.1-5.el6とその-devel
  gcc version 4.4.7 (とgfortran)
for WRF3.9, WPS3.9
  Open MPI v2.1.1
  gcc version 4.9.2 (とgfortran; devtoolset-3使用)
　NetCDF v4.4.1.1, NetCDF (Fortran API) v4.4.4
Python 2.6.6 (r266:84292, Aug 18 2016, 15:13:37) 
Python 3.6.0 on virtualenv
GNU bash, version 4.1.2(2)-release (x86_64-redhat-linux-gnu)
date (GNU coreutils) 8.4 
tmux 1.6-3.el6
```

NCAR Command Langurage (NCL)関連。

### arrayを足す

2つのarrayを足すにはarray_append_record()を使うようだ。

https://www.ncl.ucar.edu/Document/Functions/Contributed/array_append_record.shtml

### code

以下のような使い方ができる。

```ncl
  xs_d02 = (/lon_min_d02,lon_max_d02,lon_max_d02,lon_min_d02/)
  ys_d02 = (/lat_min_d02,lat_min_d02,lat_max_d02,lat_max_d02/)
  xs_d03 = (/lon_min_d03,lon_max_d03,lon_max_d03,lon_min_d03/)
  ys_d03 = (/lat_min_d03,lat_min_d03,lat_max_d03,lat_max_d03/)
  xs = array_append_record(xs_d02, xs_d03, 0)
  ys = array_append_record(ys_d02, ys_d03, 0)
```

ここで、lon_min_d0Xは１つの値を持つ。
lon_max_d0X, lat_min_d0X, lat_max_d0Xについても同様。
Ubuntu16.04で複数ネットワークの設定

#環境
Ubuntu16.04(Windows Server2012 r2内のHyper-V上）
Hyper-Vの仮想スイッチマネージャーで複数のNICを設定
（NICが複数ある実サーバでも可）

#ネットワーク構成
eth0(NIC#1)に192.168.0.1/24
eth1(NIC#2)に128.20.0.1/16
を割り当てる。
インターネットは192.168.0.1の方を通る。

```
INTERNET
|
192.168.0.254(デフォゲ・ルータ）
192.168.0.0/24(ネットワークアドレス）
192.168.0.1(eth0,NIC#1)
|
Ubuntu
|
128.20.0.1(eth1,NIC#2)
128.20.0.0/16(ネットワークアドレス）
128.20.0.254
```
#ネットワークの確認
```sh:sh
$sudo lshw -short -class network
```
このような表示が出てくる

```sh:
H/W path        Device      Class      Description
==================================================
/1              eth1        network    Ethernet interface
/2              eth0        network    Ethernet interface
```
#/etc/network/interfacesを開く

```
$ cat /etc/network/interfaces
```
こんな感じ。eth1が認識されていない。

```sh:/etc/network/interfaces
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

source /etc/network/interfaces.d/*

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
auto eth0
iface eth0 inet dhcp
```

まずeth1をdhcpしてみる。
eth1のネットワークがdhcpなのが前提なので、不要ならば飛ばしても構わない。
interfaces ファイルを編集
```
$ sudo pico /etc/network/interfaces
```
以下を追加

```sh:/etc/network/interfaces
# The secondary network interface
auto eth1
iface eth1 inet dhcp
```
eth1を起動
```
$ sudo ifup eth1
```
何やらDHCPを参照してIPが付与されることを確認。

##スタティックIPの設定
dhcpからstaticにする。

```sh:/etc/network/interfaces
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

source /etc/network/interfaces.d/*

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
auto eth0
#iface eth0 inet dhcp
iface eth0 inet static
  address 192.168.0.1
  netmask 255.255.255.0
  gateway 192.168.0.254
  dns-nameservers 192.168.0.254

# The secondary network interface
auto eth1
#iface eth1 inet dhcp
iface eth1 inet static
  address 128.20.0.1
  netmask 255.255.0.0
```
#スタティックルートを追加する
明示的にルーティングしたい場合スタティックルートを追加する。
下の例では
10.0.0.0/8はeth0
172.16.0.0/16はeth1を通るルーティングを最後に追加してやる。

```sh:/etc/network/interfaces
#static route
  post-up route add -net 10.0.0.0 netmask 255.0.0.0 gw 192.168.0.254
  post-up route add -net 172.16.0.0 netmask 255.255.0.0 gw 128.20.0.254
```

#サーバを再起動
終わったらサーバを再起動（した方が早かった）。
EC2のUbuntu16で"Loading random data"から進まなくなったとき

# 困ったこと

Kerberos認証の設定を進めていたところ、`Loading random data`の表示から進まなくなった。

```bash
ubuntu@ldap_srv:/etc/default$ sudo kdb5_util create -r LDAP_SRV -s
Loading random data

↑以降戻ってこない
```

以下の記事を参考に、[Haveged](https://wiki.archlinux.jp/index.php/Haveged)をインストールすることにした。
[Increasing Entropy in VM for Kerberos](http://championofcyrodiil.blogspot.jp/2014/01/increasing-entropy-in-vm-for-kerberos.html)


```bash
ubuntu@ldap_srv:~$ sudo apt install haveged
```

```bash:/etc/default/haveged
# Configuration file for haveged

# Options to pass to haveged:
#   -w sets low entropy watermark (in bits)
DAEMON_ARGS="-w 1024"
```

Havegedインストール後はすぐにパスワード入力が求められ、`Loading random data`で待つことは無くなった。
WPS > NCL > wps_plot_geo_em_with_marker_180511.ncl > v0.1 > geo_em.d01.ncデータの地図上表示 + markerの表示

```txt:動作環境
Xeon E5-2620 v4 (8コア) x 2
32GB RAM
GeForce GT 730 1GB GDDR5
CentOS 6.9 (64bit)
NCAR Command Language Version 6.3.0
for WRF3.7.1, WPS3.7.1
  openmpi-1.8.x86_64 とその-devel
  mpich.x86_64 3.1-5.el6とその-devel
  gcc version 4.4.7 (とgfortran)
for WRF3.9, WPS3.9
  Open MPI v2.1.1
  gcc version 4.9.2 (とgfortran; devtoolset-3使用)
　NetCDF v4.4.1.1, NetCDF (Fortran API) v4.4.4
Python 2.6.6 (r266:84292, Aug 18 2016, 15:13:37) 
Python 3.6.0 on virtualenv
GNU bash, version 4.1.2(2)-release (x86_64-redhat-linux-gnu)
date (GNU coreutils) 8.4 
tmux 1.6-3.el6
```

WRF(Weather Research and Forecasting Model)とその前処理であるWPS関連。

### 関連

[WPS > NCL > geo_em.d01.ncデータの地図上表示](https://qiita.com/7of9/items/8e73a4d4b88d66210d6a)

### markerの追加

geo_em.d01.ncデータの地図上表示に加えてmarkerを追加してみる。


### 参考

- [Graphics: NCL - Example](http://www2.mmm.ucar.edu/wrf/OnLineTutorial/Graphics/NCL/Examples/BASIC/basic_plot_setup.htm)
- [gsn_polymarker_ndc](https://www.ncl.ucar.edu/Document/Graphics/Interfaces/gsn_polymarker_ndc.shtml)

### code v0.1

```wps_plot_geo_em_with_marker_180511.ncl
load "$NCARG_ROOT/lib/ncarg/nclscripts/csm/gsn_code.ncl"
load "$NCARG_ROOT/lib/ncarg/nclscripts/wrf/WRFUserARW.ncl"

;
; v0.1 May. 11, 2018
;   - overlay markers defined with xs[], ys[]
;   - plot [geo_em.d01.nc] file
;


begin

  infile = addfile("./geo_em.d01.nc","r")

  type = "x11"

; 1. plot WPS output
  wks = gsn_open_wks(type,"plt_geo_4")

  opts = True
  opts@MainTitle = "GEOGRID FIELDS"

  ter = infile->HGT_M(0,:,:)

  res = opts
  res@cnFillOn = True

  contour = wrf_contour(infile,wks,ter,res)

  pltres = True
  pltres@PanelPlot = True  ; to overlay marker
  mpres = True
  plot = wrf_map_overlays(infile,wks,(/contour/),pltres,mpres)

; 2. add markers
  gsres = True ; set some resource
  gsres@gsMarkerSizeF = 10.
  gsres@gsMarkerIndex = 16.  ; filled circles
  gsres@gsMarkerColor = 0  ; white
  xs = (/130.0,140.0,140.0,130.0/)
  ys = (/30.0,30.0,40.0,40.0/)
  plot1 = gsn_add_polymarker(wks,plot,xs,ys,gsres)

  draw(plot)
  frame(wks)

end
```

### 結果

日本近海のgeo_em.d01.ncファイルに対して以下のような表示になった。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/db843c87-486f-cb5a-5fe4-66e923bf6357.png)
poiでCreateCellStyleを連発するのは辞めた方が良い話

poiでセルにスタイルを作る場合、大抵CreateCellStyleを行います。

が・・・

ちょっとトラップがあります。

#Excelの仕様

知っている方は知っていますが、[Excelの仕様](https://support.office.com/ja-jp/article/excel-%E3%81%AE%E4%BB%95%E6%A7%98%E3%81%8A%E3%82%88%E3%81%B3%E5%88%B6%E9%99%90-1672b34d-7043-467e-8e27-269d656771c3)として
1Bookで作れるスタイルには上限があります。

|            | 最大スタイル数 | 最大行数         |
|:-----------|--------------:|:---------------:|
| 2003       | 4000          | 65,536          |
| 2007       | 64000         | 1,048,576       |
| 2010       | 64000         | 1,048,576       |
| 2016,2013  | 64000         | 1,048,576       |

2003だけ最大スタイル数も行数も違います。
相手がどのバージョンのエクセルで開くかわからない場合上記に注意して作った方がいいかも知れません。

これだけ見るとpoiで作る場合でも
2003だったら、4000を超えるcreateCellStyle()を
2007以上だったら、64000を超えるcreateCellStyle()をしなければいいんだ:bulb:

と思い勝ちですが、ここに大きな落とし穴があります。



#ループの中で回した場合の挙動 ~XSSF~

では検証してみます。
通常ループの中でcreateCellStyle()をnewする事は少ないと思いますが
独自のキャッシュ機構を入れたり、処理上どうしても入れたいって事がない事もないと思います。



```java
for (int i = 0; i < 100; i++){
	CellStyle cs  = workbook.createCellStyle();
	Cell cell = row.createCell(i);
	cs.setBorderLeft(BorderStyle.THIN);
	cs.setBorderTop(BorderStyle.THIN);
	cs.setBorderRight(BorderStyle.THIN);
	cs.setBorderBottom(BorderStyle.THIN);
	cell.setCellStyle(cs);
}
```

これを実行すると・・・
![image.png](https://qiita-image-store.s3.amazonaws.com/0/240108/a6853961-1f6a-f81b-782b-3654ab0933c0.png)

はい、まぁ予想通りです。





#ループの中で回した場合の挙動 ~HSSF~

問題はこっちです。HSSFはxls形式に対応している為
古いプロジェクトやxlsx形式だと不都合がある場合に良く使われます。

```java
for (int i = 0; i < 100; i++){
	HSSFCellStyle cs  = workbook.createCellStyle();
	HSSFCell cell = row.createCell(i);
	cs.setBorderLeft(BorderStyle.THIN);
	cs.setBorderTop(BorderStyle.THIN);
	cs.setBorderRight(BorderStyle.THIN);
	cs.setBorderBottom(BorderStyle.THIN);
	cell.setCellStyle(cs);
}
```
一見すると、型以外さっきのソースと全く同じで100番目のカラムまで罫線でかこまれそうですが・・

![image.png](https://qiita-image-store.s3.amazonaws.com/0/240108/ee562e66-0d85-ba89-9abc-dbeab5bf708b.png)


おや・・。？

#結論と対策
タイトル通り、CreateCellStyleはループ内で使用すべきではない。
apache側も打開作として、CellUtilという便利なものを出してくれていますので、こちらを使うのが良さそうです。
Jupyter notebookでのみ　module import errorが起こるときの簡単な解決方法

## 題名どおりのことが起こった時の一番簡単な解決方法はjupyter上で!pip installでmoduleをインストールし直すこと。

例)  jupyterでpandasがimportできないとき、下記のコマンドをjupyter上で実行。

```:Jupyter
!pip install pandas
```

jupyter上で!(エクスクラメーション)後にコマンドを打てばシステムコマンドを実行できるのを知らんかった。覚えておくべき。
https://heavywatal.github.io/python/ipython.html


ちなみに上記の方法を綺麗なやり方じゃない。というのもすでにpandasインストール済みの場合はpandasが2個存在することになるので。
本来的な解決方法は
http://pyth0n.hatenablog.com/entry/2016/10/28/jupyterでimport_error
である。
ただ俺の場合は、この方法を使うとpandasのインストールエラーは解消されたが、別のpandas依存モジュールのインストールエラーが出た。キレてつい楽な方に手を出してしまった。反省は若干している。
MariaDBでGaleraCluster

MariaDBでGaleraClusterを久々組みました。少々忘れていて色々サイトを回って下記で正常に出来ました。
まずはインストールですが、以下のリポジトリを作成します。

```
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.1.13/centos7-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1
```

あとは

```
# yum -y install MariaDB
```

クラスタ設定(1台目)
まずは、1台目の設定です。この1台目のサーバのIPアドレスは「192.168.0.201」です。

```
# vi /etc/my.cnf.d/server.cnf
```


以下を追記します。

```
[galera]
wsrep_on=ON
wsrep_provider=/usr/lib64/galera/libgalera_smm.so
binlog_format=row
wsrep_sst_method=rsync
wsrep_cluster_address=’gcomm://’
default_storage_engine=InnoDB
wsrep_cluster_name=”kumoyanet_cluster”
innodb_autoinc_lock_mode=2
wsrep_node_address=192.168.0.201
wsrep_sst_method=rsync
```

1台目を起動します。この時MariaDBが起動していないことを確認しておいたほうが良いです。

```
# system status MariaDB
```

起動していたら止めること!!!

```
# galera_new_cluster
# systemctl status mariadb
● mariadb.service – MariaDB 10.1.33 database server
Loaded: loaded (/usr/lib/systemd/system/mariadb.service; enabled; vendor preset: disabled)
Drop-In: /etc/systemd/system/mariadb.service.d
└─migrated-from-my.cnf-settings.conf
Active: active (running) since 金 2018-05-11 17:19:15 JST; 14min ago
```

クラスタ設定(2台目)
次に2台目です。基本1台目と設定はほぼ変わりませんが、
```
wsrep_cluster_address=’gcomm://192.168.0.201,192.168.0.100′
```

のようにIPアドレスを追加しています。

```
# vi /etc/my.cnf.d/server.cnf
```

以下を追記します。

```
[galera]
wsrep_on=ON
wsrep_provider=/usr/lib64/galera/libgalera_smm.so
binlog_format=row
wsrep_sst_method=rsync
wsrep_cluster_address=’gcomm://192.168.0.201,192.168.0.100′
default_storage_engine=InnoDB
wsrep_cluster_name=”relocation_cluster”
innodb_autoinc_lock_mode=2
wsrep_node_address=192.168.0.100
wsrep_sst_method=rsync
```

あとは、起動ですが、2台目移行は通常のMariaDBの起動を行います。

```
# systemctl start mariadb
● mariadb.service – MariaDB 10.1.33 database server
Loaded: loaded (/usr/lib/systemd/system/mariadb.service; enabled; vendor preset: disabled)
Drop-In: /etc/systemd/system/mariadb.service.d
└─migrated-from-my.cnf-settings.conf
Active: active (running) since 金 2018-05-11 17:19:28 JST; 17min ago
```


一応、GaleraClusterは3台構成が基本となります。3台目は同じように

```
wsrep_cluster_address=’gcomm://192.168.0.201,192.168.0.100,192.168.0.101′
```


のように増やして言ってください。

確認方法
マスターでもスレイブでもいいのでMysqlコマンドで接続します。クラスタに参加しているIPアドレスが表示されます。

```
MariaDB [(none)]> show status like ‘wsrep_incoming_addresses’;
+————————–+—————————————+
| Variable_name | Value |
+————————–+—————————————+
| wsrep_incoming_addresses | 192.168.0.100:3306,192.168.0.201:3306 |
+————————–+—————————————+
1 row in set (0.00 sec)
```

以上、クラスタライフをお楽しみください。
bash の起動時に読み込まれるファイルたち

# はじめに

`man bash 1`のINVOCATIONのところを簡単にまとめただけです。
バージョンは`GNU Bash 4.3`です。(4.3と4.4でも違いはあるみたい)

# bashの起動モード

- ログインシェル (`-bash` or `bash --login`で起動)
- インタラクティブシェル (`-i` で起動もしくは次のいずれかを満たして起動）
    - 引数なし
    - `-c COMMAND` オプションなし
- shシェル (`sh`として起動)
- POSIXシェル (`--posix`で起動）

ログインシェルとインタラクティブシェルは直交する。
shシェル、POSIXシェルのモードは今回省略する。

# ログインシェルの場合

## 起動時

1. `/etc/profile`
2. `~/.bash_profile`, `~/.bash_login`, `~/profile`のいずれか（この順で探索）

`--noprofile`によりこれらは読み込まれなくなる。

## 終了時

1. `~/bash_logout`

# ログインシェルでない場合

## インタラクティブシェルの場合

1. `/etc/bash.bashrc`
2. `~/.bashrc`

`--norc`によりこれらは読み込まれなくなる。
`--rcfile FILE`によりこれらの代わりに`FILE`を読み込む。

## インタラクティブシェルでない場合

`$BASH_ENV`で指定されたファイルが読み込まれる。

# リモートから(`rshd`または`sshd`によって)起動された場合

1. `/etc/bash.bashrc` (`man`には`~/.bashrc` and `~/.bashrc` と書いてあるが前半は誤植)
2. `~/.bashrc`

ちなみに4.4だと`~/.bashrc`だけが書いてあるが未検証。
Laravel5.5LTSの便利なバリデーションの使い方

ここに書くのはバリデーションをちょっと実案件向けにアレンジしたものになります。バリデーションルール自体は適当です。

見どころは、前回の入力値の保持と、項目ごとのエラー出力です。
　
フォームリクエストを使用したバリデーションの設定をする。

```php:LoginUserRequest.php
//LoginUserRequest.php
<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class LoginUserRequest extends FormRequest
{
    public function authorize()
    {
        return true;
    }

    public function rules()
    {
        return [
            'email' => 'required',
        ];
    }

    public function messages() {
        return [
            'email.required' => '「メールアドレス」が未入力です',
        ];
    }
}

```
　
コントローラーの設定

```php:LoginController.php
<?php

namespace App\Http\Controllers\Auth;

use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\AuthenticatesUsers;
use Illuminate\Http\Request;

// 追記する
use App\Http\Requests\LoginUserRequest;

class LoginController extends Controller
{
    use AuthenticatesUsers;

    protected $redirectTo = '/';

    public function __construct()
    {
    }

    public function authenticate(LoginUserRequest $request)// 追記する
    {
        // 処理
        
        return redirect()->intended('/');
    }
}

```

viewにて全部のエラーを表示

```php:test.blade.php
@if (count($errors) > 0)
  <div class="alert alert-danger">
      <strong>失敗：</strong>入力に誤りがあります。<br><br>
      <ul>
          @foreach ($errors->all() as $error)
              <li>{{ $error }}</li>
          @endforeach
      </ul>
  </div>
@endif
```
　
項目ごとにエラーを出す場合

```php:test.blade.php

@if ($errors->has('email'))
    <p class="alert">{{ $errors->first('email') }}</p>
@endif
<input type="text" name="email" value="{{ old('email')}}" placeholder="メールアドレス" class="">
```
$errors->first('email')でemailのエラーメッセージだけを表示する。
old('email')で保持している前回の入力値も表示できる。


---
エラーサーチという、働くエンジニアのためのメモ帳サービスを運営しています!

自分用の情報をパパッとメモ書きしたり、役立つ情報は整理して他の人にもシェアしたり！
[エラーサーチ] (https://error-search.com/)

[Twitterはこちら] (https://twitter.com/error_search)

---
SHELL変数が存在するかを確認

```shell
[bouser@nonstop ~]$ comic=
[bouser@nonstop ~]$ echo ${comic+x}
x
[bouser@nonstop ~]$ unset comic
[bouser@nonstop ~]$ echo ${comic+x}

[bouser@nonstop ~]$
```
${parameter+word}の意味は、parameterが設定されている場合（値はNULLでも）、wordは最終の値になる。
parameterが設定されていない場合、NULLは最終の値になる。

parameterはNULLであっても、設定されているだけでxが最終の値になるため、parameterが存在しているかを判断できる。

[ここ](http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_06_02)を参考した。
さくらのレンタルサーバーにRuby 2.4.3をインストールする

# OS

- FreeBSD 9.1-RELEASE-p24

# インストール手順（history）
```shell:history
$ cd www
$ mkdir -p local
$ cd local
$ git clone git://github.com/sstephenson/rbenv.git rbenv
$ mkdir -p ./rbenv/plugins
$ cd ./rbenv/plugins/
$ git clone git://github.com/sstephenson/ruby-build.git
$ vi ~/.bashrc
$ source ~/.bashrc
$ rbenv install 2.4.3
$ rbenv rehash
$ rbenv global 2.4.3
$ ruby -v
  ruby 2.4.3p205 (2017-12-14 revision 61247) [x86_64-freebsd9.1]
$ rbenv versions
  system
* 2.4.3 (set by /home/aok-net2/local/rbenv/version)
```
```shell:~/.bashrc
export RBENV_ROOT=$HOME/local/rbenv
export PATH=$RBENV_ROOT/bin:$HOME/local/bin:$PATH
eval "$(rbenv init -)"

export TMPDIR=$HOME/tmp
```

# 2.5.0 はruby-buildのエラーによりインストールできませんでした

- [CentOS6.9 に ruby の環境を作って、Ruby on Rails のプロジェクトを作る - Qiita](https://qiita.com/binthec/items/a0582c4cd0efa75ef7cd)