決して実行されないイベント関数

 ある会社のホームページを改修作業を請け負っていて、モバイル等の画面の小さなブラウザで見たとき、メニューが表示されないので不思議に思ってたんですが、前任者が下のようなコード書いてたんですよね。

<script type="text/javascript">
<!--
  if (screen.width <= 940) {
    (function($){
      $(function() {  
        $('#menu .switch').on('click', function() {
          $(this).next().slideToggle(300);
          $(this).toggleClass('active');
        });
    });
  })(jQuery);
}
-->
</script>

 まあこんなコード書いてちゃ駄目だよなぁって思っちゃいました。

 皆さんは何故だかわかりますか?もう一点指摘したいところはあるんですけどね。

PowerShellを使ってアプリの自動実行(その3)

※この記事の前準備として2020年8月3日の記事も読んでね。

先ず、CrenaHtml2jpg.exe って云うサイトサムネイル作成アプリと使用されるバッチプログラムやスクリプトは全部、C:\work\CrenaHtml2jpg-v1.20 にある想定。

 そこで、PowerShellのスクリプト:capture.ps1 は、こんな感じ。

$process = Start-Process -FilePath “C:\work\CrenaHtml2jpg-v1.20\CrenaHtml2jpg.exe” -PassThru
$window = Get-UiaWindow -ProcessId
$process.Id $window | Get-UiaEdit -AutomationId ‘1010’ -Class ‘Edit’ -Name ‘http://www.yahoo.co.jp’ | `
Set-UIAControlText -Text $args[0];
$window | Get-UiaButton -Name ‘実行’ | Invoke-UiaButtonClick | Out-Null
$window | Get-UiaButton -Name ‘終了’ | Invoke-UiaButtonClick | Out-Null

 このスクリプトはコマンドライン引数を1つ(キャプチャーするサイトのURL)を持つんスよ。

PS >cd C:\work\CrenaHtml2jpg-v1.20
PS >.\capture.ps1 http://www.wowow.co.jp/detail/017949

 次にこのスクリプトを昨日(4月26日)の記事の通りに、PowerShellのスクリプト実行権限を緩めてスクリプトを実行し、また実行権限を戻すというバッチ処理を管理者権限で行うって云う話っすねぇ。それはこんなスクリプトを書くんスよ。

REM — 管理者権限があるかどうかチェック —————–
whoami /PRIV | find “SeLoadDriverPrivilege” >NUL
if not errorlevel 1 goto START
REM — ない場合は powershell 経由で自分自身を実行
powershell.exe -Command Start-Process “%~0 %~1” -Verb Runas goto :EOF
:START REM — ここからバッチ本来の処理 ——————————
cd “C:\work\CrenaHtml2jpg-v1.20”
powershell Set-ExecutionPolicy RemoteSigned
powershell .\capture.ps1 %1
powershell Set-ExecutionPolicy Restricted

 1行目で管理者権限の有無をチェックし、なければPowershellコマンドを使って管理者権限でバッチプログラムを開き直す。管理者権限があればSTARTラベルに飛んで、バッチ処理本来のお仕事をするってぇ感じっすかねぇ。

 次回はその4で、CrenaHtml2jpg.exeのInternet Explorerのエミュレーションモードをレジストリで最新のEdgeと同様に設定する方法についてっすよ。

ソフトウェア開発の素直研究所です。お仕事のご依頼はこちらからどうぞ!

PowerShellを使ってアプリの自動実行(その2)

以前のブログ「PowerShellを使ってアプリの自動実行」という記事を書いたんだが、実はUI Automationのdllをインポートするという前準備が必要なことを書くのを忘れてました。以下の手順ッスねぇ。


 前準備として、http://uiautomation.codeplex.com/ に行き、Downloadボタンを押してzipをダウンロード、 Documents\WindowsPowerShell\Modules\UIAutomation に展開する。
 次にPowerShellを開いて、上記のディレクトリに移動し、下のコマンドを実行。

PS > Import-Module .\UIAutomation.dll

 Get-Moduleして以下のようにでてくればOK。

PS > Get-Module UIA* ModuleType Version Name ExportedCommands ————————————- Binary 0.8.7.79 UIAutomation {Add-UiaBannerText…

 そこで、前回の記事の通り、テキストエディタでスクリプトを書いて保存し、実行するんだが、保存されたスクリプトを実行するとセキュリティ警告が出て実行できない。そこいら辺の話はコチラに詳しく載ってるんで譲るとして、実際スクリプトを実行するには…

  1. スクリプト実行のポリシーを変更し、権限を緩める。
  2. 目的のスクリプトを実行する。
  3. スクリプト実行のポリシーを元に戻す。

スクリプト実行権限を元に戻すのは、セキュリティ上の穴を開けないためねぇ。
 で、これをバッチプログラムにすると以下の様になる。

echo off
powershell Set-ExecutionPolicy RemoteSigned
powershell .\目的のスクリプト.ps1
powershell Set-ExecutionPolicy Restricted

 で、このバッチプログラムを管理者権限で行わなきゃならないんだが、実はこのバッチプログラムをPython等の別のプログラムからコールしようと思ってるんだが、それがけっこう厄介なんだなぁ。  とりあえず今日はここまで。次回は管理者権限でバッチプログラムを他のPythonやphpなんかの別のプログラムから呼び出すにはどうするかについて書いてみる。

ソフトウェア開発の素直研究所です。お仕事のご依頼はこちらからどうぞ!

Window10に標準でOpenSSH

 最近、DellのT100サーバにVirtualBoxって云うソフトをインストールしたんスよね。要はコンピュータの中に仮想のコンピュータを仕立てるソフトなんスよ。
 で、Fedora28って云うLinuxマシンを仮想コンピュータとして起動したのが上の図っすよ。旧態依然としたモノクロのキャラクターベースのログイン画面なんスけど、皆さんが普通にアクセスしてるサイトのウェブサーバも大体こんな感じっスからね。
 で、このサーバにアクセスして操作をするソフトをターミナルソフトって云うんだが、オイラは大体Tera Termと云うのを使ってたんだが、Windows10にも標準でOpenSSHって云うのが付いてくるようになったんで、OpenSSHクライアントソフトを使ってみたんスよ。

 使い方は何のことはない。[スタートメニュー]→[Windows システム ツール]→[コマンドプロンプト]を選択すると上のような画面が出てくる。
 上の図は”C:\Users\user>”ってなってるんだが、PCにログオンしてるユーザー毎に”user”の部分は変わるんで、読み替えてみてね。上の図では何をやってるかと云うと…

  • カレントフォルダ直下に.sshって云うファイルもフォルダがないのを確かめ…
  • sshコマンドで、sunao-laboと云うユーザーでホスト192.168.11.11のPCにログインしようとする
  • 「ホントに接続を続けてもいいの?」って尋ねてくるので”yes”
  • パスワードを入力すると…ログイン出来たっと!
  • exitでログアウトして…
  • カレントフォルダ直下に.sshって云うフォルダが出来て、その中にknown_hostsって云うファイルが出来てた。
  • typeコマンドでknown_hostsの内容を見たらこんな感じだった

って云う感じっすね。

 上の図はsshって云うコマンドだけじゃなく、ssh-keygenって云う公開暗号カギを生成するコマンドも付いてきって云う話ッスね。公開暗号を使ってサーバにログインする方法についてまた今度にしますんで悪しからず。

ソフトウェア開発の素直研究所です。お仕事のご依頼はこちらからどうぞ!

Windows Update(1903)でVMware Workstation 12が使えなくなった

 ”VMware Workstation 12 Player” ってぇのはPCの中に仮想のPCが作れるソフトで、仮想環境のサーバを使ってウェブアプリケーションを作るのに便利なんスよ。わざわざハードウェアを用意する必要もないんでコストも掛からないしね。
今ではAWSとかのクラウドで開発することが多いんで、VMwareで開発をお願いされることはなくなったんスけど、個人的な学習と云うか研究と云うのには今でも使ってるんスよ。
ところが最近、Windows 10がアップデートしてバージョンが1903になったんスけど、VMware Workstasion 12 Playerを起動すると下のような警告が出るようになって使えなくなっちゃったんスよ。

 ちなみにこの警告が出るのはDellのPowerEdge T100 と云うサーバマシンで、システムのバージョン情報は以下の通り。


※クリックして拡大

 一応X3330と云うインテルXeonプロセッサなんスけど、Core2Quadとかのハイパースレッディングがない時代のCPUでして、このCPUに対応してるVMware Workstationのバージョンは12まででして、Win10 Proのバージョン1903で使えるのはVMware Workstationのバージョン14からなんスよね。
ちなみにウチにはEPSONの Endeavor MR3500って云うCore2QuadのQ9400のCPU搭載のPCもあるんスけど、システムのバージョン情報は以下の通り。


※クリックして拡大

 こちらはWin10 Pro のバージョンが1809でして、こっちのPCではVMware Workstation 12 Playerが使えるんスよ。
結論として、Core2Quad時代のCPUを使ってるPCは、VMwareのバージョンは12までで、Win10のバージョンを1809までしか上げられないと云う事っすかねぇ。でなければCore iシリーズのCPU搭載のPCに買い替えてVMwareのバージョンを14以上にするしかないッスね。

ソフトウェア開発の素直研究所です。お仕事のご依頼はこちらからどうぞ!

YoutubeのAPI その1:ユーザーIDからチャンネルIDを取得する

 Web APIとは何ぞや?」ってぇ難しい話は、この語句のリンク先にまかせるとして、YoutubeでもFacebookでも或いは楽天でもこのWeb APIで成り立ってると云っても過言ではないくらい、インターネット技術の中枢的な存在っすね。コイツのおかげでオイラは飯を食わせてもらってるようなもんです。
 オイラが関わってる海外ドラマのサイトは、放送局が持っているFacebookサイトのウォール情報をFacebookのAPIで、放送局のアップしているYoutube動画情報をYoutube APIで取得して、カスタマーにサイトのページで提供したり、別のオリジナルなAPIとして提供してる訳っすよ。

 例えば、YoutubeのNHKオンラインでアップされてる動画情報を取得するのに、ユーザーIDが”NHKonline”と分かってるんだが、ユーザーIDからチャンネルIDを取得しないと動画情報は取得できないんだが、チャンネルIDを取得するAPIってぇのがあって、それが下のURLのような感じ…

https://www.googleapis.com/youtube/v3/channels
?part=contentDetails&forUsername=ユーザーID&key={APIキー}

 APIキーってぇのはこのAPIが誰でも使えちゃうのも差し障りがあるんだか知らんが、Youtube APIを使っていいよって証になるキーですね。すると下のようなJSONという構造体のデータを返してくれるんスよ。

 NHKオンラインのチャンネルIDは”UCip8ve30-AoX2y2OtAAmqFA”だわねってことが分かる訳っすよ。まぁこのあとチャンネルIDを使って動画情報を取得して、そういうデータをうまく加工してカスタマーに提供したりする訳っすね。
 ちなみにオイラのAPIキーがばれるとまずいので、ユーザーIDからチャンネルIDを取得するページを簡単に作ってみました。Google Chromeで拡張機能のJSON Viewをインストールしないと上のようにきれいに表示されないと思うけどご参考まで。次回はもう少し突っ込んだ話を。
http://sunao-labo.main.jp/api/youtube/get_channel_id.php

ソフトウェア開発の素直研究所です。お仕事のご依頼はこちらからどうぞ!

AmazonのクラウドサービスEC2でボリュームの拡張

 昨日の夕方、管理してるサーバの警告メールが届いたんスよね。要するにデータ領域が少なすぎて「別のサーバからデータを転送できねぇぜ」と云うお達し。管理サーバにsshでログインして調べてみたらデータパーティション領域の使用率が99%でした。仕方ないんで危急に必要のないバックアップデータとかを別のサーバに一旦移して使用率を96%にまで下げました。

[root@ip-1X-X-X-XX ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/xvda1 20G 1.8G 18G 9% /
devtmpfs 993M 60K 993M 1% /dev
tmpfs 1002M 0 1002M 0% /dev/shm
/dev/xvdf 50G 45G 2.2G 96% /mnt/xxxx

 容量を確認。/dev/xvdf は96%になったけどあんまり余裕なし。
 そのうちまたデータが一杯になるのは想像に難くないので、ハードディスクを増設しようと。
 それで、AmazonのクラウドサービスEC2の便利なところがサーバが稼働中にハードディスクのボリュームを増量することができるんスよ。実機でだったら稼働中にUSB接続で外付けハードディスクをアタッチすることは出来るけど、さすがに動いてる内臓ハードディスクの容量を300GBから500GBに増量なんて出来ないっしょ?

 先ずはデータパーティションのデータのバックアップということでスナップショットを撮ります。万が一ボリューム変更時にパーティションを壊してデータをお釈迦にしても大丈夫なように保険っすね。AWSのコンソールからブラウザで操作っすよ。

 で、50GBから70GBへボリュームを変更すると…

 最適化が始まって、10分位すると100%になって使えるようになると…いうわけじゃないんスよ。
 この後、この管理サーバにsshでログインしてパーティション領域を拡張する作業が必要なんスよ。

[root@ip-1X-X-X-XX ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
xvda 202:0 0 20G 0 disk
+-xvda1 202:1 0 20G 0 part /
xvdf 202:80 0 70G 0 disk /mnt/xxxx

 ボリューム増量後は70GBになってるね。ここでパーティションを拡張するコマンドを投入。

[root@ip-1X-X-X-XX ~]# growpart /dev/xvdf 1
FAILED: unable to determine partition type

 ありゃ?だわねぇ。じゃあファイルシステムを強制的にチェックしよう。

[root@ip-1X-X-X-XX mnt]# e2fsck -f /dev/xvdf
e2fsck 1.42.12 (29-Aug-2014)
/dev/xvdf is mounted.
e2fsck: Cannot continue, aborting.

 やっぱ、ディスクをマウントしたままじゃダメかぁ。エイやでアンマウントしてみるかぁ。

[root@ip-1X-X-X-XX mnt]# umount /mnt/xxxx
[root@ip-1X-X-X-XX mnt]# e2fsck -f /dev/xvdf
e2fsck 1.42.12 (29-Aug-2014)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
/dev/xvdf: 750800/3276800 files (0.2% non-contiguous), 11882540/13107200 blocks

 出来たねぇ。じゃあファイルシステムのリサイズコマンドいいんじゃね?

[root@ip-1X-X-X-XX mnt]# resize2fs /dev/xvdf
resize2fs 1.42.12 (29-Aug-2014)
Resizing the filesystem on /dev/xvdf to 18350080 (4k) blocks.
The filesystem on /dev/xvdf is now 18350080 (4k) blocks long.

 すかさずマウントすると…

[root@ip-1X-X-X-XX mnt]# mount /dev/xvdf /mnt/xxxx
[root@ip-1X-X-X-XX mnt]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/xvda1 20G 1.8G 18G 9% /
devtmpfs 993M 64K 993M 1% /dev
tmpfs 1002M 0 1002M 0% /dev/shm
/dev/xvdf 69G 45G 21G 69% /mnt/xxxx

 出来ましたねぇ。
ソフトウェア開発の素直研究所です。お仕事のご依頼はこちらからどうぞ!

PowerShellを使ってアプリの自動実行(その1)

 仕事で某BS有料放送の番組ページ等が3万ページ弱あるサイトのクロールをして、”Apache Solr”という全文検索システムで、番組キーワードに該当するページの検索結果をサイトのサムネイルとともに表示するシステムを管理してる。
 サムネイルを作成する現行システムはあるにはあるんだが、理由があってリプレイスしたいと考えている。サイトを巡回してサムネイルを作成するアプリケーション
をいろいろ探してるんだが、なかなかいいのがない。たまたま見つけたのが上のCrenaHtml2jpgと云うアプリ。コイツのイイところはGUI(グラフィカルユーザーインターフェース)とCLI(コマンドラインインタフェース)の両方で使えて、例えばサイトを巡回してバッチ処理的にサムネイルを作成するには、CLIを使えばいいのだ。
 だが色々試行錯誤したのだが、自分が管理しているサイトでは、GUIの方じゃないとちゃんとキャプチャーしてくんないということが判明。

 どうしたものかと思ってたらWindowsに標準でついてるPowerShellを使えば、GUIのテキストボックスとかにターゲットのURIを入力したり、実行ボタンを押してくれるスクリプトが書けるらしい。
 但し前準備が必要で、動かしたいアプリケーションのテキストボックスやボタン等の部品(オブジェクト要素)のプロパティを取得したり、書き換えたりするUIAutomation.dllというのをインポートする必要がある。


 先ずは、http://uiautomation.codeplex.com/ に行き、Downloadボタンを押してzipをダウンロード、
Documents\WindowsPowerShell\Modules\UIAutomation
に展開する。
 次にPowerShellを開いて、上記のディレクトリに移動し、下のコマンドを実行。

PS > Import-Module .\UIAutomation.dll

 Get-Moduleして以下のようにでてくればOK。

PS > Get-Module UIA*
ModuleType Version Name ExportedCommands
———- ——- —- —————-
Binary 0.8.7.79 UIAutomation {Add-UiaBannerText…

 そして、こんな感じでスクリプトを書いて、PowerShellに実行させるらしい。

$process = Start-Process -FilePath “C:\Program Files\CrenaHtml2jpg-v1.20\CrenaHtml2jpg.exe” -PassThru
$window = Get-UiaWindow -ProcessId $process.Id
$window | Get-UiaEdit -AutomationId ‘1010’ -Class ‘Edit’ -Name ‘http://www.yahoo.co.jp’ | `
Set-UIAControlText -Text “http://www.wowow.co.jp/detail/110495”;
$window | Get-UiaButton -Name ‘実行’ | Invoke-UiaButtonClick | Out-Null
$window | Get-UiaButton -Name ‘終了’ | Invoke-UiaButtonClick | Out-Null

 ちなみにこれは、CrenaHtml2jpg.exe のアプリケーションが、
“C:\Program Files\CrenaHtml2jpg-v1.20\”
にインストールされているという前提です。

ソフトウェア開発の素直研究所です。お仕事のご依頼はこちらからどうぞ!

URLリストに従って、順次Google ChromeでURLを開くバッチプログラム

表題の通り、URLリストに従って、Google Chromeで順次指定したURLを開くバッチプログラムなんスけど、先ず

  • メモ帳(notepad.exe)で参照したいURLを列記して、url_list.txtという名前で保存。
  • 同じくメモ帳で下のプログラムの通り打ち込んで、test01.batという名前で保存。
  • test01.batダブルクリックして実行。

 すると、10秒毎にURLのページをクロームで開き、閉じるという動作をするだけなんスけど、これに間に画面キャプチャーするコマンドを入れてやると、サイトキャプチャーソフトの出来上がりってぇわけです。

 ちなみにurl_list.txtとtest01.batは同一フォルダに置く必要があるんっすよ。
— test01.bat

echo off
REM — url_list.txtから一行ずつ読み込みURLを取得 —————–
for /f “delims=” %%a in (url_list.txt) do (
   start chrome –app=%%a
   timeout /T 10
  REM — ここに画面キャプチャコマンド等を挿入

  REM — タスク削除 ————————————————-
   for /f “usebackq tokens=1,2 delims=,” %%a in (`tasklist /FI “imagename eq chrome*” /FI “status eq RUNNING” /FO CSV /NH`) do (
  taskkill /pid %%~b
  )
)

— url_list.txt

http://www.infoseek.co.jp/
http://www.rakuten.co.jp/
http://news.infoseek.co.jp/topics/itmedia_mobile_20170124030/
http://news.infoseek.co.jp/topics/gendainet_370857/
http://news.infoseek.co.jp/topics/170124jijiX678/

 別にクロームでURLを開いてもなんの意味もないんスけど、オフィス・オートメーションで単純な仕事やるときにこんな手法で事務処理をするっていうのが賢いやり方っすよ。

ソフトウェア開発の素直研究所です。お仕事のご依頼はこちらからどうぞ!

C# によるキーボードのグローバルフック

The Code Project Global Hook

 リリースしたシステムのプログラミングについて、先週の水曜日あたりからずっと悩んでいて、先週は非常に不機嫌でした。自分はVisual Studio 2005のC#で開発しているんですけど、「フォームがアクティブでないとキーボード入力の割り込みを受け付けないのでバックグラウンドでもキーボード入力を拾うようにして欲しい」という顧客からの要望が挙がってきました。ネットで調べて見ると「グローバルフック」とかのキーワードでいろいろ出てくるんですけど、ドットNETだとdllじゃないとだめだとか、参照の設定が面倒で名前空間に見つからないとか、デバッグ時にホスティングプロセスを有効にするチェックを外さなければいけないとか、いろいろあってまともに動くサンプルプログラムが見つかりませんでした。まあへぼプログラマだから仕方ないんですけどね。
 昨日夜半過ぎまでネットで調べていたら“The Code Project”の中で“Global Hook”というキーワードで調べてみたらサンプルプログラムがわんさか出てきました。なんだ最初っからここで調べれば良かったんジャン!と思いつつ、サンプルプログラムをダウンロードして動かしてみたらちゃんと動きました。ちなみに会員登録しないとダウンロード出来ない仕組みになってるし、英語サイトになっています。会員になっててヨカッタァ。
 
ソフトウェア開発の素直研究所です。お仕事のご依頼はこちらからどうぞ!