親鶏と酒とエンジニアリングと私

親鶏と酒とエンジニアリングと私

自分的に苦労したり新しいと思ったりGoogle先生が答えてくれない技術系の悩みについての解決策を模索していくブログです。

Amebaでブログを始めよう!
PostgreSQLでtext型の列に画像などのバイナリデータを入れておくケースはあると思います。

その場合にその列にデータが入っていないものだけを抽出したいという場合、

TABLE1のVALUEという列が対象の列だとすると、普通は



SELECT ID FROM TABLE1 WHERE VALUE IS NULL OR VALUE = '';
SELECT ID FROM TABLE1 WHERE NOT VALUE IS NULL OR VALUE <> '';




というような書き方をすると思います。

しかし残念ながらPostgreSQLにてtext型のカラムに対して

「IS NULL」
「= ''」
「<> ''」

といった記述をすると、インデックスが効かないのか、中身をすべて精査するのか、、、
理由は判りませんが、とにかく非常に検索が遅くなってしまうのです。
※件数が少ない場合は問題ないかもしれませんが、多くなると本当に遅い!!

これを回避するにはこのように書いてあげれば良いです。



SELECT ID FROM TABLE1 WHERE BIT_LENGTH(VALUE) = 0;
SELECT ID FROM TABLE1 WHERE BIT_LENGTH(VALUE) <> 0;




「BIT_LENGTH」関数を使ってあげると、NULLでも空文字列でも「0」を返してくれます。

こうすると、数万件が対象でも一瞬で結果が返ってくるようになります。
text型への登録有無の検索で悩んでいる方は是非ともお試しあれ。



※本記事は PostgreSQL 8.4 で検証しています。
外部モニターをサブモニターとして接続(画面拡張)している環境でリモートデスクトップ接続をしたい場合のお話です。


メインモニター : 通常のデスクトップ画面
サブモニター : リモートデスクトップウィンドウを最大化したデスクトップ画面



といったように、モニター毎に異なるデスクトップの表示を行いたいといったケースはあると思います。


しかしながら、"リモートデスクトップ接続の設定画面から設定した場合"には、

「リモートデスクトップでのモニター解像度はメインモニターの解像度によって決定される」

といった悲しい仕様になっています。


よって、メインモニターとサブモニターで解像度が異なる場合、
サブモニター側でリモートデスクトップウィンドウ最大化すると

・上下にスクロールが発生してしまう
・上下に余白ができてしまう

といったように、綺麗に最大化されてくれません。


#このエントリを"探し当てた結果"読んでおられる方々には上記症状をよく理解していただけるかと思います。 
#ちなみに、そもそもサブモニター側で最大化がうまくできないという方は
リモートデスクトップウィンドウをサブモニターに持って行って「Ctrl+Alt+Break」
#で最大化自体はされると思います。



この解決方法があまりに掲載されていないので、ここで記載したいと思います。
#漁れば見つかることには見つかるのですが、直感的な書き方ではなかったので。  



- 手順 -

まず、リモートデスクトップ接続の設定画面からごく普通にrdpファイルを作ります。
接続先やローカルリソースなど、とりあえず接続したい情報でしっかりと設定を行うようにしてください。


次に、出来上がったrdpファイルをメモ帳やエディタで開きます。
ここからが重要です。


ファイルの中から

 screen mode id:i

という記述を探してその値を「2」に変更します。
※これは画面を最大化するのか、ウィンドウ表示するのかを示すプロパティです。2は最大化を表します。

結果的には

 screen mode id:i:2

となります。

同様にして

 desktopwidth:i
 desktopheight:i


という記述を探します。
※これはリモートデスクトップでのモニター解像度を表します。
※設定画面ではメインモニター解像度からの選択しかできませんが、実は 直接ファイルを開いてやれば好きな値に指定可能なのです。

例えばサブモニターの解像度が「1024x768」であれば

 desktopwidth:i:1024
 desktopheight:i:768

という風に設定します。

さらに

 winposstr:s

という記述を探します。
※これはリモートデスクトップウィンドウの初期表示位置と初期表示サイズを表します。
※前回の情報を記憶する仕組みなのか、設定画面では設定できない情報です。
※カンマ区切りで左から「0固定,1固定,ウィンドウ左端の位置,ウィンドウ上端の位置,ウィンドウの右端の位置,ウィンドウの下端の位置」です。

例えばメインモニターの解像度が「1200x900」、サブモニターの解像度が「1024x768」であれば

 winposstr:s:0,1,1200,0,2224,768

という風に設定します。
※補足すると、ここではサブモニターの左上からサブモニターの右下にかけてリモートデスクトップウィンドウが展開されるような設定を行っています。


あとはrdpファイルを上書き保存します。


このrpdファイルのダブルクリックで接続を開始してみるとご所望の結果が得られるはずです!!

ある日Windows7のローカルセキュリティポリシーのWindows Firewall に関する項目を触っていると、Windows Firewall が起動しなくなった。


どうせ無効にしていたので起動しないこと自体は別にどうでもいいのだが、なぜかその影響でLAN内の他PCからの要求を全てシャットアウトするようになってしまった。


とりあえず内部的にどんなエラーが出ているかを調査。


まずは、サービスを開始させたときのエラー。

ローカルコンピューターでwindows firewallを開始できません。詳細については、システムイベントログを確認してください。これがmicrosoft以外のサービスである場合はサービスの製造元に問い合わせて固有のエラーコード87を参照してください。



んー、トンチンカンなエラーメッセージ。


次にイベントビューアからログをあさってみたところ見つけたエラー。

Windows Firewall サービスは、サービス固有エラー パラメーターが間違っています。 で終了しました。

Windows ファイアウォールで、新しいセキュリティ ポリシーを解析できませんでした。Windows ファイアウォールでは、現在のポリシーが引き続き適用されます。

エラー コード: 2147942487



ふむふむ。推測するに、Windows Firewall の設定はレジストリに保存されていて、その設定が矛盾しているか壊れているかなんだかで起動できていないっぽい。


このエラーメッセージを元にGoogle先生に聞いてみても、現象はあれど解決したものが見つからなかった。


そういえば、ローカルセキュリティポリシーの設定時に固定IPを入力したという事を思い出した。


[Win]+[R] -> regedt32 でレジストリエディタ起動。


入力した固定IPを検索キーにしてローラー検索。



おおっ!!
予想通り Windows Firewall のレジストリ設定にぶつかった。



うちの環境では以下のキーがヒットした(一部伏せ時)。
・[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Group Policy Objects\{AAAAAAAAAA}Machine\SOFTWARE\Policies\Microsoft\WindowsFirewall]
・[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Group Policy Objects\{BBBBBBBBBB}Machine\SOFTWARE\Policies\Microsoft\WindowsFirewall]
・[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Group Policy Objects\{CCCCCCCCCC}Machine\SOFTWARE\Policies\Microsoft\WindowsFirewall]
・[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Group Policy Objects\{DDDDDDDDDD}Machine\SOFTWARE\Policies\Microsoft\WindowsFirewall]
・[HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\WindowsFirewall]

エクスポートしておいて取込直せば失敗しても大丈夫ってことで、上記のキーをそれぞれエクスポートしてごっそり削除。


サービスから Windows Firewall を起動してみると。。。




おおおおっ!!

起動したっ!!


ちゃんとLAN内の他PCからアクセスしてみても接続を拒否られなくなっていた。


解決!!


どこにも解決の記事がなかったので相当ぶりにブログを更新してみた次第です。


※レジストリを触るのでお約束として一応自己責任で。
※作業前に削除するキーのエクスポートとシステム復元ポイントの作成は忘れずに。