2017年9月30日土曜日

vagrant ボックスの移行でつまづく

vagrantのボックスは他のPCに移行するとき ネットワークまわりで注意が必要なようだ
Vagrantfileにはhostonlyの設定をひとつしか記述してないので、2つのethがしかも同じIpアドレスのものができて、おかしいと思っていました。
https://qiita.com/YusukeHigaki/items/36cd2d4b60f049815fc6
こちらを参考にさせていただきました
どうやら、Macアドレスが固定化される問題があるらしい。

また、いろいろ操作しているうちに
vagrant destroyを忘れると
起動時に Warning: Remote connection disconnect. Retrying...がでてしまう。
これもhttps://teratail.com/questions/38135 を参考にさせていただきました。

2017年9月23日土曜日

vagrant box 移行 覚書

おおまかな流れとして

すでに以前 作成した設定が残っているとうまくいかないことが多いようなので
あらかじめ、以下のような操作で できるだけ不要なものは削除しておくといいようだ。
 vagrant halt  
   vagrant destroy  
 vagrant box remove ボックス名
  
vagrant packageでエクスポート
別のPCの該当フォルダにpackage.boxをコピー
vagrant box add newboxname package.box
vagrant box listで確認

ここでいったん vagrant init
ただし、できたVagrantfileは編集する必要がある。
Vagrantfileでconfig.vm.box = "newboxname" その他、ネットワーク等さまざまな初期設定を書き込む

vagrant up --provision
で起動

これらの操作をバッチファイルにまとめ、それをさらにC#でわかりやすく操作できるようにしてみた。コマンド知らない人にもサーバ構築できるようなものを試しにつくれないか検討中。

さまざまなPCで、インストールを試してみたら、うまくいかないものがあった。
 バッチコマンドの実行中に文字化けが、、どうやら、全角文字が原因らしい。
調べてみると、やはりそうでした。パス名の中に全角文字があるとうまくいかない仕様になっているとのこと。
 対策は、環境変数にVAGRANT_HOMEを追加すること。この環境変数により、ディフォルトパス(ユーザープロファイルのパス)でなく、任意に変更できる。そういえば、vagrant関連データを、c:\の直下にフォルダを作ってもうまく行かなかった。この方法なら、自分で好きなところにフォルダを作りそこに関連データを置ける。そしてそのフォルダ名は当然全角にはしないこと。


  

2017年9月17日日曜日

リバースプロキシについて

Macアドレスで制限があると、仮想ホストの運用しにくい?のでないか。
よくわからないけど、念のため、リバースプロキシを使って物理ホストのイーサネット
にアクセスしたものを、仮想ホストのイーサネットに転送させてみようかと考えた。
nginxが手軽で便利なようだ。
 server {
        listen       8080;
        server_name  i5;
         location / {
              proxy_pass         http://192.168.1.111:8080;
              proxy_redirect     default;
        }
としてみたら、なんとかうまくいった。
 http://192.168.1.111:8080/とするとうまくいかなかった。

<追記>
ホストで8080を使っていたため、nginxを使うことにしたけれど、やはりホストの8080は停止して、シンプルにvagrantで ポートフォワードを使うことにした

2017年9月16日土曜日

Dockerで注意必要なこと

その1 Dockerをいろいろ試し見ているが、なぜか文字化けが発生した。
ディフォルトではだめならしい。
こちらを参考に、cd /rootで
localedef -f UTF-8 -i ja_JP ja_JP.UTF-8 というコマンドを実行して、tomcatを再起動したら
解消した。このへんは、ネットの情報がないと、なんとも対処できそうにない。


その2 sambaがうまくいかない
ポートを指定してやる必要があるようだ。
こちらを参考にさせていただきました。

docker run  -p 139:139 -p 445:445 のような指定をするとOkでした。

いろいろ、細かいところでひっかかるところがあるようです。

その3 vagrantの中でdocker runを行うとき、コンテナの中でプロセスを実行するには?
 ネット上で、例を見つけるのが大変だったが、cmd: という記述を追加することがわかる。
 結局、以下のようにすると うまくいった。
 注意点として、vagrant upだけではだめで、vagrant up --provisionと打ち込まないとうまくdockerが動かない。
config.vm.provision "docker" do |d|
 d.run "イメージ名(ただし、:は使わないほうがいい?)", cmd: "/init.sh" , args: " -e LANG=ja_JP.UTF-8 -p 139:139 -p 445:445 -p 8080:8080 --cap-add SYS_PTRACE  -it -v /vagrant:/tmp/shared"
end

2017年9月9日土曜日

vagrantとDockerをざっと知る

http://qiita.com/hidekuro/items/fc12344d36d996198e96

上記のリンクが参考になりました。
簡単に仮想サーバを用意して
さらにそのなかに、いろいろなプロセスを簡単に動かせるので便利かもしれません。
うまく活用すれば環境構築がだいぶスムーズにできそうです。

ひっかかったところ
その1:vagrant でパブリックネットワークを固定Ipにする方法がよくわからない
結局、
  config.vm.network :public_network,  :ip => "192.168.1.123" , :netmask=>"255.255.255.0" , :bridge => "Intel(R) Ethernet Connection (2) I218-V"
のようにしてやるとうまくいった。ただし、Intel(R) Ethernet Connection (2) I218-Vの部分は自動では取得しないので、Windowsの場合は、ネットワークのイーサネットから接続の方法の欄あたりからコピペするしかない。このへんも自動取得してほしいところだが。。

その2:dockerのUbuntu14.04の中でなぜかtomcat7が起動しない
 ネットで調べたら、解決方法がでていた
https://stackoverflow.com/questions/29683231/tomcat7-fail-to-start-inside-ubuntu-docker-container

docker run --cap-add SYS_PTRACEとするらしい

その3:dockerのブリッジのIpアドレスの固定のしかたがわからない。
http://qiita.com/bellx2/items/21fdc3bdc6958f749f3e
に方法が出ていた。
たしかに/etc/default/dockerの
DOCKER_OPTS="--bip 192.168.1.126/24           "
を追加して、再起動したら、うまくいった。
ただ、こうすると コンテナに192.168.1.1が割り振られてしまう。ここはすでに使っているので、対処療法的だけど DOCKER_OPTS="--bip 192.168.1.130/25    としてみた。でも、これは、以下のことから、あまり意味が無いことが判明。

その4:やはりコンテナにアクセスできない。
docker run -p 8080:8080  というようにしてやるといいらしい。
http://christina04.hatenablog.com/entry/2016/07/22/193000
すると、コンテナの192.168.1.129ではアクセスできないけれど
ブリッジの192.168.1.130やホストOSのアドレスでアクセスすると、コンテナ内の
サーバにアクセスできる。
いまいち、すっきりしないが、とりあえず、解決。



2017年9月7日木曜日

JAVA Linuxではパスからファイル名がうまく取得できない

 Windowsでは、うまくいっても、Linuxではうまく動作しないということがよくある。ファイルアップロードの手直しをしている際に、またそういうところに遭遇する。
 パスからのファイル名の取得に関するメソッドgetName()です。\¥か/で違いがあるので、やむを得ないところもあるが、WIN,Linuxどちらでも使えるようにするためには、それなりの工夫が必要なようです。

 http://buzzword111.hatenablog.com/entry/2017/06/21/102518
 上記のリンクを参考にさせていただきました。



2017年9月4日月曜日

IE11ではFormDataのメソッドがすべて使えない

HTML5の機能としてFormDataが便利ですが
残念ながらIE11ではappendのメソッドしか使えないようです。
最初、これがわからず、ファイルのDrag&Dropのところで
Chromeで動くのに、IE11だと動かない現象に悩まされました。
getメソッドが使えないのが原因なので、結局getを使わずにappendする前に
必要な値は取得しておくことで解決しました。
よく考えれば当たり前の対策なのですが、getを無理に使うことばかりにとらわれてしまいました。

2017年9月3日日曜日

FormDataを使ってファイルアップロードとパラメータ渡しを同時に行う方法

ファイルのアップロードとパラメータ渡しを同時に行うのは意外とやりにくい。Formからボタンをクリックして行うのはまだいいとしても、Drag&Dropなど行うには工夫が必要なようだ。

解決方法がこちらにでていた。
https://stackoverflow.com/questions/5512442/input-type-text-value-from-jsp-form-enctype-multipart-form-data-returns-null
これを参考にして パラメータはHashを使ってみた。サーバのほうは、こんな感じです。
 File dirs = new File(path+"tmp");
if (!dirs.exists()) {
   dirs.mkdir();    //make folders
}
FileItemFactory factory = new DiskFileItemFactory();
    ServletFileUpload upload = new ServletFileUpload(factory);

    Iterator<FileItem> iterator = upload.parseRequest(request).iterator();
    HashMap<String,String> map = new HashMap<String,String>();
    String filename="";
    while (iterator.hasNext()) {
   //ファイルはひとつが前提。複数ファイルなら最後のファイル名のみ取得
                   FileItem item = iterator.next();
                   if (!item.isFormField()) {
                      filename= item.getName();
                       item.write(new File(path+"tmp/" + filename));
                   }
                   else {
                     String otherFieldName = item.getFieldName();
                     String otherFieldValue = item.getString();
                     map.put(otherFieldName ,otherFieldValue);
                   }
              }

クライアントのほうは
   var formData = new FormData();
    formData.append('flg','foo');のようにパラメータを追加していく
 
 このFormDataに ドロップされたファイルは
   var files = event.dataTransfer.files;
fd.append('file', files[i]); とするとよいようだ。(iをforなどで処理する。)
 あとは、ファイルもパラメータも一緒にformDataとして非同期でサーバに送ります。
      var uploadURL ="fileupload"; //Upload URL
      $.ajax({
          url: uploadURL,
          type: "POST",
          contentType:false,
          processData: false,
          cache: false,
          data: formData,
          success: function(data){
         ..............というように