2018年9月12日水曜日

【1行Tips】Excel関数:都道府県文字を取得


=IF(ISERR(FIND("県",LEFT(A2,4),1)),
 IF(ISERR(FIND("都",LEFT(A2,3),1)),
 IF(ISERR(FIND("道",LEFT(A2,3),1)),
 IF(ISERR(FIND("府",LEFT(A2,3),1)),"N/A",
 LEFT(A2,FIND("府",A2,1))),
 LEFT(A2,FIND("道",A2,1))),
 LEFT(A2,FIND("都",A2,1))),
 LEFT(A2,FIND("県",A2,1)))

2018年5月19日土曜日

ゴルフGPSナビをGPSロガーとして使う検証

本blogをゴルフブログとして使う気は全くないのですが、日常にIT機器がある以上、様々な発展形を意識していきたいと思いつつ、タイトルの件となります。

結果としては、
〇ゴルフGPSナビは通常のGPSロガーとしても使える
〇データとしてkmlファイル形式のデータが出力できる機器であれば他のソフトとの連携も可能

ということで、自分のツール活用範囲が広がりそうです。

ゴルフGPSナビって何ぞや

「みちびき」に対応している機器もある、ゴルファー御用達のゴルフ支援機器です。
個人的に入手し使う機会があったことから本記事を書くきっかけとなりました。

何ができるのか

ゴルフ向けの機能は当然ながらたくさんあります。そのなかで、今回は「みちびき対応」のGPS情報が取得できる、データをkmlファイルで取得できるという2つの理由から、GPSロガーとして使ってみたらどうかという検証へ行きつきました。

検証

ゴルフコースでの初利用を終え、GPSロガーとしての機能は十分に持っていると確信しました。コース内を行ったり来たりしている様子がきちんと管理アプリで確認できたためです。
しかし、それはあくまで管理アプリ上での話。ゴルフGPSナビの管轄外であるゴルフコース外のGPS情報を果たしてどのように扱ってくれるのか、そのために、あえて日常でGPSナビを起動、ログを取得して検証してみました。

結果

いきなり結果になってしまいましたが、データの取得、地図ソフトでの確認ともに、バッチリ万全でした。
・データの取得には、EagleVision社のezComを利用
・データ管理アプリはEagleVisionPlus(WindowsApplication)を利用してkmlを取得
・地図表示にはGoogleMapのマイマップ機能を利用

上記組み合わせでGPSロガーとしての機能を全うできました。


え?Googleのタイムラインでいいんじゃない?というご意見もあろうかと思いますが、明らかに精度が違う。(タイムラインは気分屋で、ポイント点以外の経路は結構雑と感じてます)

登山やハイキングなどで外出することも多い私には活用できそうなアイテムになりそうです

2018年5月10日木曜日

リモートデスクトップができなくなった(WindowsUpdate)

事務スタッフからの連絡を受けて事務所へ急行。
接続してみると。。。確かに接続できない。


要求された関数はサポートされていません
原因はCredSSP 暗号化オラクルの修復である可能性があります

見たことないメッセージ。ってオラクルってなんで?と思いつつ、エラーメッセージでGoogle検索すると、リモートデスクトップの接続元(ゲストPC)と、接続先(ホストPC)で、暗号化に関する機能のレベルが不一致だと起きる模様。

後で聞いたら、昨日の夜にWindowsUpdateが動いていたのだと。
https://blogs.technet.microsoft.com/jpsecurity/2018/05/09/201805-security-updates/

対処としては、同じ暗号化機能のバージョンが双方にあればよい。つまり、WindowsUpdateで双方を最新化すればよい。


ホストPC側もWindowsUpdateは済んでいて再起動待ちだったので、再起動して処置完了しました。

2018年4月17日火曜日

YAMAHA RTXにてポート変換(NAT,NAPT)

利用機種:YAMAHA RTX1100

要件は以下となります

・外部から、SSHとWWWを通したい。
・SSHは通常のポートではなく、違うポートとし、RTX1100にて変換

前提

外部からの「全ポート」はクローズ状態とする
WWWサーバは192.168.10.100
SSHアクセスが必要なサーバは192.168.10.200、外部からのポートは12345とする
グローバルアドレスは持っている。DNS等々は別で管理のため今回は考慮除外

natの定義

nat descriptor masquerade static 1 1 192.168.10.100 tcp www
nat descriptor masquerade static 1 1 192.168.10.200 tcp 12345=22

ip filterの定義

ip filter 21001 pass * 192.168.10.100 tcpflag=0x0002/0x0017 * www
ip filter 21002 pass * 192.168.10.200 tcp * 22

まとめ

外部へのアクセスができる状態で運用できているのであればそれに対して外部からのポートを開ける設定と、natの設定をすれば実現可能
natが働いてからipfilterが働く

設定を開けたら外部サイトからのアクセスチェックをお忘れなく

ポート開放テスト
https://www.cman.jp/network/support/port.html

ポート全チェックテスト (ShieldsUP!)
https://www.grc.com/x/ne.dll?bh0bkyd2

2018年4月4日水曜日

TERATERMマクロでYAMAHA RTXのconfigをまとめて取得

概略

タイトルがマニアックですが、要は

1)ネットワーク内に管理したいルーターがたくさんある
2)各ルーターのConfigを取得してテキストへ保管したい
3)同じ処理を繰り返すので、マクロ(TTPMACRO)など活用で何とかしたい

という要件です。

管理端末から各ルーターへの疎通は当然できる状態で、
1.ログイン
2.ログ取得開始
3.CONFIGを表示する命令を実施
4.ログ取得終了
5.ログアウト

ができればOKとします。

マクロファイルの作り方

teratermインストールディレクトリに拡張子が.ttlのサンプルファイルがいくつかありますがそれを参考としました。

;マクロ例
;ホストのIPを指定。ルーターへはTelnet接続
HOST = '192.168.107.254'
ADDR = ''
LOGNAME = ''
;ホスト名を生成(ADDR)
strconcat ADDR HOST
strconcat ADDR ':23 /nossh /T=1'
;ログファイル名を生成
strconcat LOGNAME HOST
strconcat LOGNAME '.log'
connect ADDR
wait   'Password:'
sendln 'パスワードを記載'
wait   '>'
sendln 'administrator'
wait   'Password:'
sendln 'パスワードを記載'
logopen logname 0 0
sendln 'show config'
wait   '#'
logclose
sendln 'exit'
wait   '>'
sendln 'exit'
あとはこれを.ttlファイルとしてttpmacro.exeで読み込ませるだけです

ホストもたくさんあるのだが

上記を改良していきます。今回は上部の「IPアドレス」だけを変えて、あとは同じ動作をするようにします。
アプローチとして
1)上位にバッチファイルをかませてバッチファイルで書き換えていく
2)TERATERMのマクロでホスト名ファイルを読込んで処理する

の1)が始めの想定でしたが、2)ができることが分かったので2)で実装します。

HOSTFILE='IPLIST.TXT'
fileopen fh HOSTFILE 0
:readloop
filereadln fh buf
if result goto loop_exit
HOST = ''
strconcat HOST buf
if result<>1 CALL MAIN_OPERATION
goto readloop
:loop_exit
fileclose fh
end

:MAIN_OPERATION
;HOST = '192.168.107.254' ループ側で指定される
ADDR = ''
LOGNAME = ''
;ホスト名を生成(ADDR)
strconcat ADDR HOST
strconcat ADDR ':23 /nossh /T=1'
;ログファイル名を生成
strconcat LOGNAME HOST
strconcat LOGNAME '.log'
connect ADDR
wait 'Password:'
sendln 'パスワードを指定'
wait '>'
sendln 'administrator'
wait 'Password:'
sendln 'パスワードを指定'
logopen logname 0 0
sendln 'show config'
wait '#'
;早すぎてログが出力されないケースがあるのでpauseを入れる
pause 1
logclose
sendln 'exit'
wait '>'
;コンソールを閉じるわけではないのでclosettへ変更
closett
return
サーバーに接続できない場合のケースや実行日時を記録するなど、まだまだ追加機能は必要そうですが一旦はこれで完了とします

2018年3月26日月曜日

【svn】どのリビジョンがインストールされているかを確認する

【要旨】

・運用中アプリはSVNにリリースモジュールがあり、開発環境からSVNへアップした後に運用環境にてSVN UPすることでモジュールを最新化している。
・今回、一部の運用環境で最新プログラムが適用されていない可能性があったため、サーバの状況を調査し最新化を行った。

【手順をひとことで】

サーバにてsvnversionコマンドでリビジョン確認し対象のリビジョンの内容確認して対応

【手順】

1)運用環境の対象ディレクトリへ移動し、「svnversion」コマンドを実行 →リビジョンが表示される
2)開発環境の「tortoisesvn」から、「リポジトリブラウザ」→右上の「リビジョン」をクリックし、当該リビジョン番号を入力
3)その時の状態が表示されるので、内容を確認

【まとめ】

自前でバージョン管理しなくてもSVNのリビジョンだけで状況把握はできる

2018年2月26日月曜日

2枚目以降でヘッダのレイアウトを変える場合のコツ(ireports)

たまにしかやらないのと、サンプルが行方不明になるので備忘録

【要件】

・ヘッダがあって、明細繰り返しのタイプの帳票
・定型フォーマットは決まっている。但し、2枚目以降はヘッダの一部情報が不要
 →よくある「請求書の2枚目に1枚目の〇〇の情報は要らない」

【対応のコツ】

・ヘッダは一般的にはGroupで定義されているはずなので、
 ・Group を別で定義する(インスタンスが別。内容は同じでもOK)
 ・Reprint Header のプロパティを、隠したい項目の部分のGroupHeaderのみOffとする
・一覧表のヘッダは出したい。という要件もあるはずなので、その場合には
 さらに別のGroupを作成(内容は同じ)し、それはReprintHeaderをOn

【ざっくり言うと】

グループヘッダを分割して、出したい部分、出したくない部分に分ける
分けて、それぞれのプロパティ制御でコントロール

【その他メモ】

グループヘッダの分割は、ただ単にグループヘッダを増やすではNGで、「グループ」を追加、グループヘッダを追加とする。(Add Report Group)

 2018/11追記
Print When Expressionにて以下記載をすれば柔軟に制御できる
($V{PAGE_NUMBER}.toString()).equals("1") ? Boolean.TRUE : Boolean.FALSE

2017年11月13日月曜日

MySQLのチューニング(JOIN編)

おそらくオプティマイザの挙動が安定しないことが起因で、今まで問題なく動作していたクエリがものすごく遅くなるという事象に遭遇しました。
結果、「ばらし」て組み直すことで解消したのですがその一部始終で技術要素を色々調べられたのでメモしておきます。

やったことの結果要約

・5つあるJOIN句のなかにサブクエリが2つあったので、先行してTemporaryTableへ吐き出すようにした
 →合わせてその時にIndexも貼る
・ベースとして結合したい表をFROMの後へ置き、そのあとは結合しやすい順で並べた。
 →特に意味はないという記事もあったが念のため。元は「ほしい情報」をベースで置いていた。
・結合の条件のなかで、左に今まで出てきている項目、右が対象項目という順とした。
 →オプティマイザに効果があるとの情報
・結果、2分かかっても終わらなかったものが、6秒。これでOKとしました。

実施1)Temporary Tableを使い処理を分割

元々1クエリだったものを、分割して、事前にTemporaryを作成、そのあとにクエリでTemporaryから読むという分割をしました。

【Temporary Table作成の構文】
 CREATE TEMPORARY TABLE temptablename
(INDEX idx_temporary (a,b)) ENGINE=MEMORY
SELECT a,b,c,d,e from table1
今回はSSD環境のDBだったのでMyISAMでも良いのですが、メモリへの展開と指定しました。tmp_table_sizeの設定に依存しますが、今回は許容範囲内なので問題なし。
構文にはフィールド名、型名を指定する方法もありますが、今回はベース表のフィールド名、型をそのまま引き継ぐ形で作ればよく、省略して記載しています。

実施2)ベースの表を変える

対象レコードが少ない表をベース表とし、INNER JOINで結合していきました。
これは今まであまり気にしていませんでしたが、オプティマイザの仕組みを考えると理にかなっている方法だと思います。

実施3)結合の構文の左右を意識する

例文)
select tbl1.a , tbl2.cc from tbl1 inner join tbl2 on tbl1.a = tbl2.a
通常無意識的にメイン表を左、結合対象を右にしていましたが、今回は一部の結合条件で左右が逆でした。

ダメな例文)
select tbl1.a , tbl2.cc from tbl1 inner join tbl2 on tbl2.a = tbl1.a
これもオプティマイザの解釈を考慮すれば当然なのでしょうが、結合したい基本を左に置くことを意識し、全体を調整しました。
→結合表が多くなってきた時に無意識に間違いそうな気がします。

実施4)Temporary Tableにインデックス

これは「ひょっとしたら」で追加したのですが、効果が劇的でした。
Temporary(今回は2つ)はそれぞれUNIQUEなので結合項目としてはすべて使ってます。※先の例で言うとa,b,c,d,eのすべてが結合条件。
それにもかかわらず、aとb(抽出元表:table1のPrimary)にインデックスを貼ったことで
使ってくれて、速度も向上したのです。
知識ある人からしたら「当然だよ」かもしれませんが結果には驚きました。

その他)STRAIGHT_JOIN

結局試していないのですが、[STRAIGHT_JOIN]キーワードを使うと、JOINの順番を強制することができるようです。

2017年10月8日日曜日

JasperReport (IReport)でHH:mm形式の時間を合計する

技術Tipsです

〇要件

グループ計で時間を合計したい。
 ex) 勤務時間のような日別の時間で、グループ計を取る

〇前提

各レコードにはHH:mm形式のデータがある。 ex) 12:30
 定義名はF_HHMMとする

〇実装 (IReportのバージョンは4.0.2)

1)variablesで分に置き換えて保持しておく。
Name:V_HHMM
 Variable Class : java.lang.Integer
   Calculation : Sum
 Reset type:Group
 Reset group:対象のグループ名
 Increment type:none
 Variable Expression:
$F{F_HHMM}.equals(null) ? 0 : new Double(new Double(new Double($F{F_HHMM}.substring(0,2)) * 60) + new Double($F{F_HHMM}.substring(3,5)))

2)レコード出力対象のフィールドにてFieldExpressionを定義

$F{V_HHMM}.equals(null)?null:(((new Integer($F{V_HHMM}) / 60).toString().replace('.',':').split(':')[0])  + ':' + ((new Integer($F{V_HHMM}) % 60).toString().length()==1?('0'+(new Integer($F{V_HHMM}) % 60)):(new Integer($F{V_HHMM}) % 60)))

2017年10月5日木曜日

Illustrator CS2 でIMEが利用できない (事象のみ。未解決)

最近は社内SEもしております。

Illustrator CS2を使って名刺など作りたいという要望があり、個人パソコンへ
インストールするのも後で面倒そうなので、新規にWindows7環境を構築して
Illustrator CS2をインストールしたところ、IMEが使えない。と。。。

現象の詳細

・Illustrator CS2を起動して、テキストエリアなどで半角/全角キーを押しても入力モードが切り替わらない
・アプリを終了 → IMEのバーをタスクバーへ入れてアプリ起動 するとアプリの起動時にIMEのバーが消える (この時点でおかしいよね。。。と)
・他のアプリを起動して利用してみると、IMEのバーは表示される。
・いわゆる「再起動すれば直る」を期待したが、それでもNG

まずは調べてみた

1)Windows7ではCS2に対応していない
2)IME2010をインストールすると直るかもね。
3)キーボードショートカットのバッティングが原因では?

試してみた

1)互換性モードでアプリケーションを起動 → 解消せず
2)IME2010をインストール → 解消せず
3)「キーボードまたは入力方法の変更」から「キーボードの変更」→「詳細なキー設定」→「入力言語を切り替える」を「左shift+Alt」から「なし」へ変更 →解消せず

想定外の挙動

Illustratorが標準で持つショートカットキーも、一部使えない(ズームなど)
結局のところ、未サポート -> キーボード操作の一部に不良 という現象は綺麗に解決できそうにありませんでした。

結果

CS2の利用はあきらめました。
Illustrator CS3があったのでCS2をアンインストール後、CS3をインストール。無事に動くことを確認できました。