pslaboが試したことの記録

はてなダイヤリーからはてなブログに引っ越してきました

この日記は現在実行中の減量記録を含む個人的なメモとして始めましたが、最近はコンピュータやガジェット、ハック、セキュリティネタのほうがメインになっております。

はてなダイヤリー時代はカテゴリ分けが適当だったのですが、これはそのうち直します。


無くし物や忘れ物の防止用にTrackR pixelを本格導入する

以前から TrackR と MAMORINO を試験的に使っていたのですが、自分の要件には MAMORINO よりも TrackR の方が合うので、本格的に使っていくために TrackR pixel 3個パックを追加購入してみました。

導入を決めたきっかけ

今回、本格的に使うことを決めたきっかけは、朝早い時間に出社したにも関わらず、オフィスの入室カードキーを忘れたためにせっかくの早起きを無駄にしてしまったこと。

試験利用中の1個はカバンの中の Yubikey につけていたので、カードキー忘れの防止には全く役に立ちませんでした。

TrackR を何に付けるか?

追加購入したブツを含めて4つの TrackR pixel を以下のように配分することにしました。

  • 通勤用カバン(今まで通り、Yubikey と一緒につけておく)
  • 入室カードキー(ネックストラップにカードキーと TrackR を下げる)
  • 財布(小銭入れに入れておく)
  • 出張用のキャリーバッグ(内側のポケットに入れておく)

自分の普段使いの物品でタグつけておきたいのはこれくらいです。

MAMORINO を選ばない理由、TrackR を選ぶ理由

MAMORINO ではなく TrackR を使う理由は2点です。

  • スマートフォン側からの操作で音を鳴らして探せる
  • 電池交換が自分で行える

MAMORINO は上記の点ができないので、本格利用は見送りました。音を鳴らして探すことができるのは、探し物をするときにとても役に立ちます。MAMORINOだと自分の近くにあることは分かっても、最終的に見つけるのは自分で頑張らねばなりません。

電池交換については、できないことは必ずしもネガティブでは無いし、MAMORINO のように新品に半額で交換できるのは悪く無いけど、タグの個数が増えるとそれなりに負担になるので、たくさん使いたい場合は交換できた方がありがたい。

ただし MAMORINO は可動部品(電池蓋やスマートフォンを探すスイッチ)がなく、またタグの形状がシンプルなので、手元にある分は子供に持たせている家のカギにつけておく運用を当面継続しようと考えています。(ただしバッテリが切れたら、これも TrackR に変えるかもしれないけど)

クラウドサーチの機能には期待しない

なお、TrackR にしろ、MAMORINO にしろ、クラウドサーチの機能は基本的に当てにしていません。これは運が良ければ見つかる、くらいの話だと思っています。

ユーザ数が増えてきたらそれなりに使い物になるかもしれませんが、今の普及度ではまだまだ難しい。

設定の注意点

  • 「Cloud Locate アラート」は原則 off で使います。これを on にしていると、自分が持ち歩いているはずのタグを誰かが見つけたときにアラートが上がってきて大変ウザい

  • 「アイテムの移動履歴」はお好みで。on にしておけば履歴が取れるので、探すときの参考になる場合もあるかもしれません。

  • 「デバイス分離アラート」は、基本は off だと思います。これを on にしていると、スマートフォンとデバイスの距離が離れていると検知したときにデバイスから音が鳴り出すので、普段使いには向きません。

  • 「携帯電話分離アラート」も、基本は off だと思います。on の時は離れたときに スマートフォンに通知され、おまけにアラーム音が鳴ります。このアラーム音はマナーモードでも鳴るので、少々困ります。ただしアラームはカスタマイズ可能なので、無音の音楽をスマートフォンにインストールしておき、それをアラームonに設定しておくことで回避可能です。

  • WiFiセーフゾーンに登録された WiFi に接続中は、アラートを無効にすることができます。距離が離れたかどうかの検知は誤作動することがあるので、そういう場合に無駄な通知をさせずにすみます。

JSONデータのキーをカンマ区切りで取得したい

JSONデータのキーをカンマ区切りで使用する必要が出たので、方法をメモしておく。

$ curl [URL] | jq -r '.rootProperty[0]|keys_unsorted|@csv' | sed 's/"//g'
$ curl [URL] | jq -r '.rootProperty[0]|keys_unsorted|@tsv' | sed 's/\t/,/g'

基本的には jq に丸投げしつつ以下のことを行っているだけ。

rootProperty の部分は実際のJSON配列名等に書き換えます。

  • keys_unsorted でキーをソート無しで取得
  • @tsv または @csv に変換
  • sed で余計な文字を切り落とす

本当は @csv でダブルクオートなしの出力が得られればよかったのだけど、そういうわけではなさそう。だから @csv したものを sed で後処理している。

同様の理由により、@tsv した場合も sed での後処理が必要っぽい。

Oracle12g を Docker で動かす

Oracle12g も立てる必要がでてきたので、同じく Docker で立ててみる。

DB2 は公式ストアから入手してみたけど、Oracle はこちらの手順でやってみることにします。

qiita.com

そうすると以下の設定で接続できるものができました。

  • ポート番号 = 1521/TCP
  • Service_Name = ORCLPDB1
  • パスワード (SYS, SYSTEM, PDBADMIN) = コンテナの生成ごとに振られるランダム文字列

TNSの接続なら、こういう文字列ですかねえ。

  • (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = IPアドレス)(PORT = 1521)))(CONNECT_DATA = (SERVER = DEDICATED)(SERVICE_NAME = ORCLPDB1)))

起動したコンテナは Ctrl + C すると一時停止しますが、docker start [コンテナ名] と実行すれば再開します。

以下では docker run の初回実行時のコマンドとログをメモとして残します。公式ストアから入手する方法は別途試そう。

$ sudo docker run -p 1521:1521 -p 5500:5500 --name Oracle12g -i oracle/database:12.1.0.2-ee 
Password:
ORACLE PASSWORD FOR SYS, SYSTEM AND PDBADMIN: (生成されたパスワード)

LSNRCTL for Linux: Version 12.1.0.2.0 - Production on 27-FEB-2018 13:03:37

Copyright (c) 1991, 2014, Oracle.  All rights reserved.

Starting /opt/oracle/product/12.1.0.2/dbhome_1/bin/tnslsnr: please wait...

TNSLSNR for Linux: Version 12.1.0.2.0 - Production
System parameter file is /opt/oracle/product/12.1.0.2/dbhome_1/network/admin/listener.ora
Log messages written to /opt/oracle/diag/tnslsnr/8bd9ba867228/listener/alert/log.xml
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1)))
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=0.0.0.0)(PORT=1521)))

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1)))
STATUS of the LISTENER
------------------------
Alias                     LISTENER
Version                   TNSLSNR for Linux: Version 12.1.0.2.0 - Production
Start Date                27-FEB-2018 13:03:38
Uptime                    0 days 0 hr. 0 min. 0 sec
Trace Level               off
Security                  ON: Local OS Authentication
SNMP                      OFF
Listener Parameter File   /opt/oracle/product/12.1.0.2/dbhome_1/network/admin/listener.ora
Listener Log File         /opt/oracle/diag/tnslsnr/8bd9ba867228/listener/alert/log.xml
Listening Endpoints Summary...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=0.0.0.0)(PORT=1521)))
The listener supports no services
The command completed successfully
Copying database files
1% complete
2% complete
27% complete
Creating and starting Oracle instance
29% complete
32% complete
33% complete
34% complete
38% complete
42% complete
43% complete
45% complete
Completing Database Creation
48% complete
51% complete
53% complete
62% complete

64% complete
72% complete
Creating Pluggable Databases
78% complete
100% complete
Look at the log file "/opt/oracle/cfgtoollogs/dbca/ORCLCDB/ORCLCDB.log" for further details.

SQL*Plus: Release 12.1.0.2.0 Production on Tue Feb 27 13:30:14 2018

Copyright (c) 1982, 2014, Oracle.  All rights reserved.


Connected to:
Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options

SQL> 
System altered.

SQL> 
Pluggable database altered.

SQL> Disconnected from Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options
The Oracle base remains unchanged with value /opt/oracle
#########################
DATABASE IS READY TO USE!
#########################
The following output is now a tail of the alert.log:
Tue Feb 27 13:30:00 2018

XDB initialized.
Tue Feb 27 13:30:10 2018
Thread 1 advanced to log sequence 12 (LGWR switch)
  Current log# 3 seq# 12 mem# 0: /opt/oracle/oradata/ORCLCDB/redo03.log
Tue Feb 27 13:30:14 2018
ALTER SYSTEM SET control_files='/opt/oracle/oradata/ORCLCDB/control01.ctl' SCOPE=SPFILE;
   ALTER PLUGGABLE DATABASE ORCLPDB1 SAVE STATE
Completed:    ALTER PLUGGABLE DATABASE ORCLPDB1 SAVE STATE
Tue Feb 27 13:38:59 2018
Resize operation completed for file# 9, old size 563200K, new size 593920K
Tue Feb 27 13:55:17 2018
Warning: VKTM detected a time drift.
Time drifts can result in an unexpected behavior such as time-outs. Please check trace file for more details.
Tue Feb 27 13:55:17 2018
Default pga_aggregate_limit value is too high for the
amount of physical memory in the system
pga_aggregate_limit is 2048 MB
limit based on physical memory and SGA usage is 1199 MB

IBM DB2 を Docker で動かす

DB2の試験環境が必要になったのだけど、仮想マシンで普通に立てるのはリソースの無駄遣いなので Docker で立ててみます。

Docker のホストは macOS を使用。macOS 向けの環境構築手順は割愛します。

store.docker.com でポチっておく

ここでポチります。開発版なので費用はかからない。 https://store.docker.com/images/db2-developer-c-edition

ポチったら、手順に従って pull して実行します。

コンテナを実行したい環境で docker pull

ストアからの入手ではログインが必要のようですから、ログインしておきます。そして macOS で利用する場合は x86_64 を入手します。

$ docker login 

$ docker pull store/ibmcorp/db2_developer_c:11.1.2.2b-x86_64

設定ファイルを作る

.env_list という名前でファイルを作ります。今回はこんな内容で。

LICENSE=accept
DB2INSTANCE=db2inst1
DB2INST1_PASSWORD=password
DBNAME=testdb
BLU=false
ENABLE_ORACLE_COMPATIBILITY=true
UPDATEAVAIL=NO
TO_CREATE_SAMPLEDB=true
REPODB=false
IS_OSXFS=true # Only specify this parameter if you are running on macOS
PERSISTENT_HOME=false # Only specify this parameter for Docker for Windows users

実行する

今回はこんな感じで。-v でホスト側のディレクトリをコンテナ内にマウントさせた場合はうまく動かなかったので、とりあえず -v 抜きで動作確認しています。

docker run -h db2server_container \
  --name db2server \
  --restart=always \
  --detach \
  --privileged=true \
  -p 50000:50000 -p 55000:55000 \
  --env-file .env_list \
  store/ibmcorp/db2_developer_c:11.1.2.2b-x86_64 

接続確認する

任意のツールで確認すればよいと思います。

とりあえず手元では RAD Studio 10.2 Tokyo の IDE からデータエクスプローラで操作できることを試したり、DB Artisan で接続できることを確認しました。

FireDAC での設定箇所と DB2 の .env_list の対比はこんな感じです。

FireDAC DB2 .env_list
Database DBNAME
User_Name DB2INSTANCE
Password DB2INST1_PASSWORD
Server (実機のIPアドレスまたはホスト名)

Windows標準コマンドだけでMD5を計算表示しつつクリップボードにもコピーする

右クリックメニューの拡張でMD5を取り扱う事例はググれば出てきますが、自分が欲しい機能は「結果を表示する」ことと「クリップボードにもコピーする」ことの両方だったので、それを行えるような処理をバッチファイルで書くことにしました。

使い方はイロイロあるでしょうけど、とりあえず作ったバッチファイルだけ貼っておきます。

@echo off

if "%1" == "" goto ERROR

: 一時ファイルにMD5の計算結果を格納
set md5tempfile=%temp%\%RANDOM%.txt
certutil -hashfile "%~1" MD5 > %md5tempfile%

: クリップボードにMD5SUMだけをコピーする
type %md5tempfile% | findstr /V ":" | clip

: ファイル名とMD5SUMをメッセージボックスとして出力する
(
echo %~1
type %md5tempfile% | findstr /V ":"
) | msg %username%

: 一時ファイルを削除
del %md5tempfile%
goto :EOF

:ERROR
echo usage: md5sum.bat [filename] | msg %username%

:EOF

Citrix NetScaler のCookie情報にはバックエンドのWebサーバの情報が含まれている

自社のあるサイトが Citryx NetScaler を利用しているのだけれど、たまに不安定なことがあり、なおかつその機材の管理チームと不安定な状況の改善に向けてやり取りしていてもラチがあかないので、合法的な範囲で調べてみるテスト。

Cytrix NetScaler というのはロードバランサー機能を含む複数の機能を提供するアプライアンス製品なわけですが、少なくともIPアドレスやポート番号の情報が NetScaler の生成する Cookie には含まれているようです。この Cookie 情報を用いて、特定のクライアントとの通信が特定のバックエンドに振り分けられるようにしているようです。

そこで、NetScaler が生成する Cookie の意味を具体的に調べていたら、これに関する情報が下記のコンテンツにありました。

itgeekchronicles.co.uk

そしてCookieをデコードする方法は無いものかと思って読み進めてみると、先程の記事の最後に下記の GitHub リポジトリが紹介されていて、ここにコードがありました。

github.com

PythonJavaScript コードがあるようですが、とりあえず Python を試してみます。

実行方法はカンタンで、実際にやってみると、こんな感じ。手元の Cookie の現物を晒すのはイヤなので、GitHub リポジトリの readme に記載の Cookie で試してみます。

$ ./nsccookiedecrypt.py NSC_Qspe-xxx.bwjwb.dp.vl-IUUQ=ffffffff50effd8445525d5f4f58455e445a4a423660
vServer Name=www.**********-HTTP
vServer IP=xxx.xxx.xxx.xxx
vServer Port=80

うん、たしかにデコードされた。そして手元の現物も同じようにデコードできた。

wena wrist pro を買ってオメガスピードマスターとDYIで組み合わせてみた

色々考えてみたけれど、やはりバッテリーが持たないスマートウォッチは基本的に受け入れられないし、画面が常時表示では無い機種もイマイチです。

なので、いっそのこと、画面なし、バッテリ長持ちな通知受け専用デバイスに手を出して見ることにしました。

購入したもの

今回購入したのは、 wena wrist pro Silverwena wrist pro Silver WB-11ASと、wena wrist pro用エンドピース20mm Silver SONY (ソニー) WB-EP200-Sエンドパーツ 20mmの2つです。

今回は組み合わせる時計が オメガ スピードマスター プロフェッショナル なのですが、こいつはバンド幅が20mm、wena wrist pro の標準のエンドピースは22mmなので、エンドピースの付け替えが必須なのです。

また、無謀にもDIYでやろうと思ったので、メタルバンド用のコマ外し工具も調達してみました。

コマ調整の手順

普通は時計屋さんに持っていくことを強くお勧めします。

今回購入したコマ外しは標準のエンドピース22mmをバンドから外す用途には微妙に不向きでした。(エンドピースがバンド側から時計側に向かって斜めに広がる形なので、真っ直ぐに押し込むことが難しい)

さて、それでもDIYでやる、という方には、私が行った手順を紹介しておきます。

エンドピース20mmが無理なくつけられそうかどうかを確かめる

手元のスピードマスタープロフェッショナルは、時計の上下バンド部分の幅に微妙に違いがありまして、片方はスムースにつけられそうなのですが、もう片方がクリアランスがなさすぎて入りませんでした。

仕方がないので少量のCRC5-56を塗りつつ、付ける側を入れ替えたりしていたら、ある向きから差し込んだ場合になんとか入りました。(が、多分、傷がついたかもしれない)

上下ともスムースにつけられそうでしたら、特に気にせずにエンドピースをバンドにつけてしまってOKですが、確認せずにバンドを準備した挙句、上下逆じゃないとつけられなかった、なんてことになったら、バンドとエンドピース を再度つけ直しですね。DIYでやるには楽しくない作業です。

エンドピース 22mmを wena wrist pro から外す

最終的なバンドの長さがわかっている場合は、エンドピースだけではなく、長さ調整用のコマも抜いてしまいます。

私の場合は調整用コマを2つ(両端からそれぞれ1つ)外していますが、これは長さが微妙に足りない感じがするので、調整ピースを入れて少し伸ばそうかと思っています。

エンドピースの外し方ですが、たまたま、手元にあったバネ棒外しの反対側がちょうどピンと同様の太さだったので、私はそれをピンに当ててハンマーで軽く叩いてピンをずらし、あとはラジオペンチで引き抜く、という方法で抜いてしまいました。

なお、この時計のバンドはピンがバンドの中でCリングを通って固定されていますが、Cリングは非常に小さい部品なので、DIYの場合はバンドの中から落ちないように注意して作業する必要があります。

Cリングが外れてしまった場合は安全ピンなどの針に軽くさしてバンドに押し込めば大丈夫です。ピンセットでつまんでなんとかしようとすると紛失の元です。

時計 + 20mm エンドピース にバンドを取り付ける。

取り付けの向きに注意してつけましょう。バンドとエンドピースを合わせて、ピンを所定の向きから押し込みます。今回購入したコマ外しはピン押し込みも可能なので、これを使ってじわじわと押し込んで行きます。ある程度押し込んだら、ピン抜き用の方でピンを押して、ピンの頭がバンドから隠れる程度に押し込んでおきます。

こういう工具がない場合は、ペットボトルの蓋を机の上において、半刺しのピンを垂直に押し当てて押し込む、という力技も一応は可能ですが、ピンが折れると残念なことになるので不慣れな方にはお勧めしません。また、この方法ではピンの頭がバンドから隠れるところまで押し込むことは難しいです。

バンド長を調整する

長すぎる場合はコマ抜き、足りない場合はコマを足して調整します。長さ調整のコマのパターンは取扱説明書を参考にしつつ行います。

とりあえずの感想

  • 電池は4日くらい持ちます。
  • スピードマスタープロフェッショナル + wena wrist pro は重量が150gくらいあるので、Pebble Time に比べると重量感がすごいです。