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配列名等に書き換えます。
本当は @csv でダブルクオートなしの出力が得られればよかったのだけど、そういうわけではなさそう。だから @csv したものを sed で後処理している。
同様の理由により、@tsv した場合も sed での後処理が必要っぽい。
Oracle12g を Docker で動かす
Oracle12g も立てる必要がでてきたので、同じく Docker で立ててみる。
DB2 は公式ストアから入手してみたけど、Oracle はこちらの手順でやってみることにします。
そうすると以下の設定で接続できるものができました。
- ポート番号 = 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 の意味を具体的に調べていたら、これに関する情報が下記のコンテンツにありました。
そしてCookieをデコードする方法は無いものかと思って読み進めてみると、先程の記事の最後に下記の GitHub リポジトリが紹介されていて、ここにコードがありました。
Python と JavaScript コードがあるようですが、とりあえず 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 に比べると重量感がすごいです。
スマートウォッチを買うのか、それとも既存の時計をスマートウォッチにするのか
というようなことを考えているのですが、まずはスマートウオッチを選ぶときの条件を整理してみる
機能ごとの優先度
必須要件
- 各種通知が受けられる
- 時計の盤面を変えられる
- アクティビティトラッカー
- 睡眠分析
この4つは必須だと思っています。
よりベターな要件
- バッテリーの持ち
- 常時表示できるか?
バッテリーが持たない時計は使い物にならないので、最低限3日くらいは充電せずとも動作してほしいものです。また時計なのですから、盤面は基本的に常時表示されることが望ましいです。
Apple Watch や Android Wear はバッテリーが持たなさそうなので、これらに移行することは当面なさそうです。
あったら良い要件
- プレインストール以外のアプリを入れてカスタマイズできる
これは必ずしも必要ではないと考えてます。Pebble にはいろんなアプリを入れてみたけれど、ほとんど使わなかった。
なくても困らない要件
心拍計はあったら情報が取れて良いけれど、なかったらなかったで不便とまでは感じない。GPSはアウトドアで運動する方には必須だろうけれど、自分の場合は自転車に乗るくらいしか無いので、GPSは必須では無い。通話や音楽再生の機能に至っては、欲しいと思ったことが無いので、なくても困らない。
こうやって考えてみると、Pebble はやはり自分に向いていた。Pebble が終焉に向かいつつある中で、次の時計をどうするかが悩ましいですねえ。
そもそも、既存の腕時計をスマートウォッチにできないだろうか?
Pebble 亡き後の選択肢として、手持ちの Omega Speedmaster Professional にスマートウォッチの機能をつけられないかなあ、と考えています。
そういう場合に、日本製なら wena wrist、海外製だと Smart Buckle, Trivoly, Chronos などがありますね。
wena wrist はまあまあ悪く無いけれど、バンド自体を交換するわけで、お値段が少々高め。またエンドパーツを時計に合わせて選ぶ必要があるので、時計によっては追加のコストがかかります。
Trivoly, Chronos は時計の裏面に貼り付けるデバイスなので、時計によっては微妙にアンバランスになりそう。 Smart Buckle は革ベルトのバックル部分を取り替えるだけ、という点では一番自然かも。メタルバンドが使いたい方向けには厳しいですけど。
これらはスマホからの通知のための盤面を捨てることで機能が絞り込まれていますが、その条件で問題が無いなら選択肢としてはありかも。
さーてどうしたものか。