24
2月 17

Java覚書 サーバ名からMACアドレスを取得

Windows上で動いている場合にしか利用できないけど、
サーバのMACアドレスを取得する方法を漁ってみたのだが、結局はARPコマンドを実行するぐらいしか簡単にできないようなので、ちょっとガックシしてしまった。

1) target に サーバ名を設定。
2) Windowsコマンド arp に、targetサーバのIPアドレスを設定して実行。
3) コマンドプロンプトの出力からtargetサーバのIPアドレスのMACアドレスを取得

    String target = "ここにサーバ名を設定";
    String adr= "";
    try {
      // 1)
      InetAddress ip = InetAddress.getByName(target);
      // 2)
      ProcessBuilder pb = new ProcessBuilder("arp", "-a", ip.getHostAddress());
      pb.redirectErrorStream(true);
      Process proc = pb.start();
      proc.waitFor();
      // 3)
      InputStream is = proc.getInputStream();
      BufferedReader br = new BufferedReader(new InputStreamReader(is));
      try {
        for (;;) {
          String line= br.readLine();
          if (line == null) break;
          if (line.indexOf(ip.getHostAddress()) >= 0) {
            adr = buf.substring(23,45).trim();
          }
        }
      } finally {
        br.close();
      }
      if (res.length() > 0) {
        System.out.println("Server ["+ target+ "] , IP [" + ip.getHostAddress() + "] , MAC [" + adr + "]");
      }
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
    }

参考URL
きしだのはてな「JavaでMACアドレスを取得する」
ひしだま’s 技術メモページ「Java > 外部プロセス起動」


23
1月 17

宅配サービスで嫌なもの

ここのところ、散財中。

Dr.AIRのマッサージ機を買ってみた。
9千円ぐらいだけど、百貨店で試しに使ってみたらメッチャ強力!だったので、思わず買ってしまった。
買ってすぐ家で使ってみたら、やっぱしメッチャ強力!
って、まだ弱レベルだった・・・
さらに強力にしてずーーっとブルブルさせてたら、突然電池切れ。
弱ーくなっていってプチっとかじゃなく、突然あっけなくなところが笑ってしまった。
で、早速充電。持ち歩けそうだし便利だな。(壊れなければ)

他にも色々買ってみたけど、それは別のお話。

で、宅配便のお世話になっているわけだが、迷惑な宅配業者(あるいは宅配担当者)を列挙してみん!

・人がいないときに来る
 まぁ、これはしょうがないじゃん、って思うんだけど、
 ヤマトだとあらかじめ宅配するけど大丈夫?メールがやってくるんだよね。
 これ、ホントありがたい。
 再配達してもらうのってやっぱしもうしわけないからね。
・時間どおりに来ない
 これもまぁしょうがないね。いっぱい運ばせてるのこっちだし。
・何度もやってくる
 1回できてね。その方が楽でしょ?って思う。

んで、こっからが本番!
・Web再配達受付の仕組みがない
 これはつらい。もういい加減電話なしで生活できるようにしてほしい。
・荷物がたばこ臭い
 論外。客のモノ(他人のモノ)って認識あるのか?
 下請け使ってるところは、もう本当にひどいときがあって、
 この間なんて、段ボールの外側だけじゃなくって内側にまでたばこ臭がついていた。

と、愚痴ってみたが、基本的に世話になっている身なので、一番下以外は文句は言わない。
一番下のやつは、もう、ホント勘弁してくれ。迷惑。部屋ん中まで臭なるわ・・・


01
1月 17

謹賀新年2017

新しい年が幕を明けた。
だからといって、大して何も変わらないので12月に見た面白い芝居について。

「繻子の靴」

京都の大学内にある春秋座というところで8.5時間かけて行われた芝居。
いやぁ~、長いのなんのって!
観てるほうが疲れるんだから、やってるほうはどうなんだろうか。

8.5時間の芝居って、台詞を覚えるのはどうすんのかなぁ?と考えたのだが、実際みてみると、半分は朗読なので、覚えるところはそんなに多くはなかったようだ。
が、それでも、膨大な量だなぁ。
と、裏っ側のことを気にしながら観てしまった。

舞台は3段になっていて、それに似非プロジェクションマッピングを合わせて、面白い構造になっていた。これをうまく画面転換や人物の距離を表すように使っていて、うん、うまい使い方だなぁ、などと思った。

ただ、いつも思うんだが、蜷川氏といい、この演出家といい、日本人がやると、妙に日本エッセンスを出そうとするところが、ちょっと「?」。
いい効果もあると思うのだが、例えば台詞を言っている最中に笛吹かれても、うるさいだけなんですけど。いや、風が吹いていることを表現したいのはわかるんだが、五月蝿いのよ、これが。
音響ってこういうことじゃないし、どうして狂言師をここまで配置する必要があるのか、雅楽?をこういうところ使われてもねぇ、とか、まぁとにかく音楽はいまいちだったなぁ・・・
(日本エッセンスも使いようなんだよね。いい使いかただなぁ、と思うところもあったのだけれど、必要ないよなぁ、と思うところやら、どうせだったらここで使ったらどうかなぁ?と思うところやら、いろいろあった。)

ただ、総合的に見て今までみた芝居の中でも、上位に入るすばらしい舞台だったなぁ、と思う。よくここまで作り上げたなぁ・・・と感心した。
また、機会があったら観てみたいな。

4日目まで見続けた人も、役者さんもお疲れ様でした。
これぐらいの芝居が7千円弱で観られるってのが凄いな。
企画してくれた人ありがとう。

ということで、これが12月のお話。
さて、今年は何を観ようか。


17
11月 16

SQLite覚書 副クエリを使ったUPDATE

世の中には、ありがた迷惑とか、小さな親切大きなお世話とか、そういうことがわからない人が一杯いるようだ。
そういう人は、「やるな!」「やらないでくれ!」っていっても、「やる」のだなぁ。
人のやること横取りするんじゃないよ!と、叫びたかった、今日の朝。

それはそうと、SQLiteでSELECT文を使ってUPDATEしたい!というのがあって、
そうすると、まぁ、

 UPDATE table1 SET
  col1 = (SELECT col1 FROM table2 WHERE .... )

みたいにすればできるぜ!みたいなことはいっぱい書いてあるんだけど・・・

 そうじゃないんです!
 JOINで連結させて、ホゲホゲホゲ・・・とやりたいんです!

という要求は満たされないわけ。

で、調べた。

SQLiteはWITH句が使えるらしい。
んで、WITH句をうまく活用して、UPDATEできるらしい。

他のDBのSQL文を

UPDATE table1 SET
    col1 = a.col1
  , col2 = a.col2
 FROM (SELECT .... FROM .... INNER JOIN ....) a
 WHERE table1.id = a.id

とすると、
WITH句を使ったSQL文は

WITH a AS (
  SELECT .... FROM .... INNER JOIN ....
)
UPDATE table1 SET
    col1 = (SELECT col1 FROM a WHERE table1.id = a.id)
  , col2 = (SELECT col2 FROM a WHERE table1.id = a.id)

みたいな感じ。

で、これを私が愛用する「A5:SQL Mk-2」(SQL開発ツール)で実行したのだが、うまくいかずに、「あれ?できないの?」とか思って悩んだのだが、ツール上ではうまくいかないだけで、SQLiteのコマンド実行では、ちゃんと動いた。

ホント、統一させてほしいんですけど。


15
11月 16

2か月もほったらかしてしまったから観劇感想

ブログをほったらかして、そろそろ2か月。
ちょっとは更新しておこう。

何もなかったわけではないのだが、「貧乏暇無し!」これに尽きる。

この2か月の間に、宝塚星組「桜華に舞え”/ロマンス」と梅芸「スカーレットピンパーネル」は観劇した。

前者は、週末の、しかも、トップのさよなら公演であったので、けっこう混んでいたが、さほど悪くない席が取れた。

で、まぁ、最終的に北翔さんという人は私は好きだったけど、トップになってみたら、

 さしたるトップではなかったなぁ・・・

と、ファンには申し訳ないのだが、そんなことを思った。
どちらかというと、割と自由にやれる脇役ってのがピッタリくる。
バウとかのメリーウィドウ等々がよかったから、トップでも十二分にやってくれそうな感じはしたのだが、トップになるといろいろなところでボロが出るもんだな・・・と感じた。
(誰も何も言わないんだろうか?)

一方、紅さんは品性に欠ける点があまり好きではないのだが、とはいっても、なんとかトップとしてやれそう?やれるかな?的な雰囲気が出ていたのが印象的だった。
(でも、金払って行くかと言われれば行かないかな。)

続いて、「スカーレットピンパーネル」

石丸さん好きですよ、私。
石井さんも好きですよ、私。
平方くん頑張ってますな、はい。

やっぱり男前が時代感たっぷりな衣装を着ていると、「目の保養」でありますな。
衣装が素晴らしく格好良くって、いや、衣装だけでも充分なのに、男前!という、ジュルジュル感たっぷりでございましたよ。

そこへ行くと、安蘭はイマイチ。なんというか品がないんだな。
立ち姿は悪くないし衣装が綺麗だし、静止画としてはいいのだが、動くと商店街のおばちゃんみたいな感じ。
前に観た「サンセット大通り」はよかったし、「スカーレットピンパーネル」の宝塚の初演は彼女が主役で、しかもとても面白い舞台だった。
私はこの宝塚初演版のDVDまで買ってしまったほどだったので、いつも以上に期待をしていたのだが、今回はガックシきてしまった。

内容は、といえば、宝塚版とは構成が違って、どちらかというと中身に重点を置いていて重厚感がある。
だけど、少々歯切れが悪く、どちらかと言えば、宝塚版のほうがライトで楽しめる感じ。
宝塚は人数が多いからそれだけで舞踏会の場面とかも迫力があるというのも、宝塚版のほうがいいと感じている理由の1つだ。
(小池修一郎の演出力を改めて見直してしまった。)

で、1つ愚痴っとこ。

私はスタンディングオベーションが大嫌い!なのだ。

ってかさ、そんなこと欧米のまねしなくてもよくない?
演者はスタンディングオベーションされて嬉しいんだろうけどさ、そもそも、

前の人が立った所為で舞台が見えなくなるから、仕方なく立ってるんです!

っていう人間がどれだけいると思ってる?
もうちょっと、他人に対する気配りしようよ、ホント。
(ってか拍手するだけじゃ、満足せんのか?)

私はレスリー・チャンが好きだったのだが、レスリーのファンというのが、
「映画を見終わったら、スタンディングオベーションしよう!」
みたいなことをやってて、実際にやってるひとがいたんだけど、あれもホント迷惑。
本人いないし。
もう、自己満足をひけらかしてる。
後ろからケリ入れたい気分だったが、良くも悪くも足が届かんかった。

あぁ~~~、悪魔の私が出てきてひっこまないぞぉ~~ということで、今日はこの辺に。


22
9月 16

Processing覚書 SQLite接続

Processing開発。
BezierSQLibライブラリを使ってSQLiteのDBにつないでいるのだが、1つ問題が。

というのも、エラーになったときExceptionが発生しない。
ライブラリ内部で例外処理までしてるのは兎も角、結果がエラーになってもエラーを判別できるフラグがない。
DBにLockがかかってる時にUPDATEしても、コンソールにエラーメッセージは出るが、それだけ・・・
Rollbackするタイミングがつかめない。
このままではマズイ。困った。

こうなったら、直接jdbcライブラリを利用しよう!となった。

プログラムソースのpdeファイルが入っているフォルダの下に「data」フォルダを作って、その中にDBファイルの「test.db」を入れる。
「data」フォルダと同じ並びに「code」フォルダを作って、その中にライブラリ「sqlite-jdbc-***.jar」ファイルを入れておく。

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;

// ------------------- ( 略 ) -------------------

void getData() {
  Connection con = null;
  Statement stmt = null;
  try {
    Class.forName("org.sqlite.JDBC");
    con = DriverManager.getConnection("jdbc:sqlite:"+ dataPath("test.db"));
    println("Opened database successfully");
    
    stmt = con.createStatement();
    stmt.executeUpdate("INSERT INTO m_users (user_cd ,user_name) VALUES ('1010101', 'Lily');");
    stmt.close();
    con.close();
  } catch ( Exception e ) {
    println( e.getClass().getName() + ":" + e.getMessage());
  }
}

Macでいけたから、あとはWindowsでも確認しよう。


07
9月 16

SQLite覚書 速度の向上

データが1万→2万になったところで、急激にUPDATEの速度が遅くなってしまった。
SQLiteって速いって聞くんだけど・・・
ということで、チューニングについて調べてみた。
INSERTが遅いってのがあったけど、Transactionは入れてるし。
UPDATEが遅いっていわれても、そこを変えるのは・・・と思ったので、以下のサイトを参考に、コマンドプロンプト上でDBの設定をかえた。
パフォーマンスを追求するためのSQLite設定 | ITハンドブック
SQLite「PRAGMA statement」

sqlite> PRAGMA main.journal_mode = PERSIST;
sqlite> PRAGMA main.synchronous=0;

mainはスキーマ名。
で、どうなったかというと、設定を変更後、一回VACUUMをしてから確認したら、劇的に速度向上?

<追記>
あぁ・・・勘違いしてた。
どうやら、DBを開いているときだけ設定した状態が保持される様子。

SQLite が認識できる SQL

閉じちゃったら元のDefault設定に戻るようだ。
たしかに、開き直したら設定が消えちゃってたよ。

開いた直後だな。設定するのは。

<追記2 2016/09/14>
さて、さて、いろいろ試した結果。

結果的に設定を変えて高速化したか?といえば、さほどな気はした。
やはり、他のSQLと同様、INDEXをはるってのが1番で、あとはなるべく実行しない方法を探すのがよいようで。
次に、TRANSACTION。これはかなり大きかった。1,2万行を順にINSERTしていく手前でBEGIN→終了時COMMITとするだけだが、これも速度がだいぶん速くなったように感じた。
DELETE&INSERTよりREPLACEを使うのがいいと書いている人もいるが、
目からウロコだったのは、INSERT文のVALUES部にUNION ALLしたSELECT文を用いるやり方。

SQLiteで最も速く複数行INSERTする方法 | transhumanist note
要は、複数行の実行をお纏めしちゃうわけで、これはなかなか面白いやり方だと思った。

まぁ、あとできることはVACUUMしてゴミを減らすことかな・・・


02
9月 16

ExcelVBA覚書 コマンド実行

Dir関数でファイルがないってときに、
 ただファイルがないのか、ネットワークにつながってないのかわかんないの?
 Ping飛ばしてネットワークにつながってるのか調べたらいいじゃない?
みたいな要件があって、まぁ、正直、「そこまでやるか?」って思ったけど、そういう環境で動いている人は、そういう発想になるんだろうなぁ・・・と思って、教えてもらったPing送信術をアレンジしてExcelに埋め込んでみた。

Public Function CheckNetwork(ip As String) As Boolean
    
  Dim wsh As Object
  Dim buf As String
    
  On Error GoTo ErrCheck

  Set wsh = CreateObject("WScript.Shell")
  wsh.Run "%ComSpec% /c ping -n 1 " & ip & " | clip ", 0, True
  buf = GetObject("\" _
               , "htmlfile").ParentWindow.ClipboardData.GetData("text")
  If InStr(buf, "ラウンド トリップの概算時間") > 0 Then
      CheckNetwork = True
  End If
  Exit Function
ErrCheck:
  err.clear
End Function

ちなみに、「%ComSpec%」は、「%SystemRoot%\system32\cmd.exe」のことらしい。
「 | clip」でクリップボードに入れて、それをbufに読み込むようにした。
また、Shellは、Execで動かす方法とRunで動かす方法があるが、Runのほうが、コマンドの窓が表示されないようにできるので、こちらを採用。
面倒な要件は、解決できると嬉しい。
解決しないと、逆恨みしそうだけど。


02
9月 16

ExcelVBA覚書 シートロック、でもフィルターは使いたい

あるよねぇ~~~~
ってことで、

Sub ProtectSheet
    With ws
        If Not .ProtectContents Then         'ロックされていないときだけロック処理
            .Protect Password:="password"
                   , DrawingObjects:=True
                   , Contents:=True
                   , Scenarios:=True _
                   , AllowFiltering:=True     'ここでフィルターOKにする
        End If
    End With
End Sub

以下は試していないけれど、これでもOKらしい。

Sub ProtectSheet2
    With ws
        If Not .ProtectContents Then         'ロックされていないときだけロック処理
            .Protect Password:="password"
                   , DrawingObjects:=True
                   , Contents:=True
                   , Scenarios:=True _
                   , userInterfaceOnly:=True
        End If
        .EnableAutoFilter = True
    End With
End Sub

02
9月 16

ExcelVBA覚書 Application.Goto

セル選択&移動させる方法はいろいろあるけど、一番手っ取り早いのはApplication.Gotoのようだ。

Sub ActivateRange(rng as Range)
    On Error Resume Next
    Application.Goto rng, True
    err.clear
End Sub

1つ目の引数は選択セル、2つ目の引数はスクロールして移動するかどうか、らしい。
選択だけだったら、rng.selectでもいいように思うけど。

これを使わずに選択させようとなると、

Sub ActivateRange(rng as Range)
    On Error Resume Next
    rng.parent.parent.Activate
    rng.parent.Activate
    rng.select
    err.clear
End Sub

みたいなかんじで、ブック→シート→セルをアクティブにしないといけないわけで、これは面倒。
(親がアクティブになっていないに、子をアクティブにはできないのだ)
楽にできる関数があるということで、メモ。