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”というキーワードで調べてみたらサンプルプログラムがわんさか出てきました。なんだ最初っからここで調べれば良かったんジャン!と思いつつ、サンプルプログラムをダウンロードして動かしてみたらちゃんと動きました。ちなみに会員登録しないとダウンロード出来ない仕組みになってるし、英語サイトになっています。会員になっててヨカッタァ。
 
ソフトウェア開発の素直研究所です。お仕事のご依頼はこちらからどうぞ!

より高速にサムネイル画像(縮小画像)を作成するには?


クリックで@ITの
「より高速にサムネイル画像(縮小画像)を作成するには?」へ

 栃木県内の某カメラ量販店さんの店舗受付機のカスタマイズのお仕事をさせてもらっていて、以前からなかなか解決できていなかったことがあった。それは「より高速にサムネイル画像(縮小画像)を作成するには?」ということである。しかも今回は、サムネイルだけでなくExif情報内の他の情報(例えば撮影日時など)の情報も取得しなければならないので、それだけ処理に手間が掛かると思っていた。
 ネットで調べて見るとより「高速にサムネイル画像(縮小画像)を作成するには?」と題して、「アットマーク・アイティ」というIT技術系情報サイトで解説をしていた。正に福音だった。
 ポイントとなる点は2点。
 一つはFromStreamメソッドを使うことにより、大きなサイズのファイルでもファイル全体を一度に読み込まないで済むということ
 もう一つは、JPEGファイルのExif情報に格納されているサムネイル画像のデータ(タグ番号は0x501b)をバイト配列のデータとして取り出し、そこからサムネイル画像の画像オブジェクトを作成するということである。
 このことによりDVDやSDメディアに入った膨大な量の画像ファイルも、飛躍的に高速に読み取ってくれるようになった。ちなみに自分のシステムで、1枚当り3~4MBほどある4000×3000の179枚の画像を4.56秒で全て読み込んでサムネイル画像を作成して保存してくれた
 勿論撮影日時の情報を取得したり、Exif情報のないJPEGファイルの場合は、元の画像からサムネイルを作成するなどの工夫をしなければならないのだが、とりあえず店舗受付機から注文してくれるお客さんが、全然ストレスを感じないほどに速くなったことに、お店の方から感謝のメールを頂いたのにはちょっと嬉しかった。こういう仕事をして良かったと思う瞬間である。


実はこれはまだ高速サムネイル処理が未実装の版

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

C#でDataGridViewに配置したチェックボックスの状態取得


 DataGridView のカラムにチェックボックスを入れて、チェックボックスをクリックしたときにリアルタイムにDataGridViewの同一行等に対してスタイルを変更したり、カラムに書き込んだりする方法がやっとわかった。
 要するにDataGridViewのCurrentCellDirtyStateChangedイベントで、チェックボックスを配置しているカラムのイベントを捉えて、コミットさせて、そのカラムの値を判定してチェックボックスの状態を取得すればいいわけねぇ。

private void Form1_Load(object sender, EventArgs e)
{
    string[] strItem = {"Desktop PC", "Note PC", "Tablet" };

    for (int i = 0; i < strItem.Length; i++)
    {
        dataGridView1.Rows.Add();
        dataGridView1["Column2", i].Value = strItem[i];
    }
}

private void dataGridView1_CurrentCellDirtyStateChanged(object sender, EventArgs e)
{
    if (dataGridView1.CurrentCellAddress.X == 0 && dataGridView1.IsCurrentCellDirty)
    {
        // --- Commit!
        dataGridView1.CommitEdit(DataGridViewDataErrorContexts.Commit);
        if (dataGridView1["Column1", dataGridView1.CurrentCellAddress.Y].Value.ToString() == "True")
        {
            for (int i = 0; i < dataGridView1.Columns.Count; i++)
            {
                dataGridView1[i, dataGridView1.CurrentCellAddress.Y].Style.BackColor = Color.Red;
            }
            dataGridView1["Column3", dataGridView1.CurrentCellAddress.Y].Value = "購入";
        }
        else
        {
            for (int i = 0; i < dataGridView1.Columns.Count; i++)
            {
                dataGridView1[i, dataGridView1.CurrentCellAddress.Y].Style.BackColor = Color.White;
            }
            dataGridView1["Column3", dataGridView1.CurrentCellAddress.Y].Value = null;
        }
    }
}

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