【プログラミング】

array_unique() で小ハマリ

PHPの関数 array_unique() で小ハマリしたのでメモ。

array_unique() は、配列から重複する要素を削除する関数。

たとえば、こんなプログラム。

$list = array(‘A’, ‘B’, ‘A’, ‘C’);
$list = array_unique($list);
for ($cnt = 0; $cnt < count($list); $cnt++)
{
print($list[$cnt] . “\n”);
}

このプログラムは、「A」「B」「A」「C」という配列から、array_unique() によって、重複する「A」の余分な要素を取り除き、「A」「B」「C」という配列にするプログラムである。

このプログラムにおける、期待する実行結果は、こうである。

A
B
C

ところが、実際にプログラムを実行すると、この様に出力される。

A
B

最後の要素「C」が出力されない。
なぜだ。

実行結果だけを見ると、count($list) の値が「2」であるように見える。
確認してみよう。

$list = array(‘A’, ‘B’, ‘A’, ‘C’);
$list = array_unique($list);
print(sprintf(“===%d===\n”, count($list))); // ★追加★
for ($cnt = 0; $cnt < count($list); $cnt++)
{
print($list[$cnt] . “\n”);
}

実行してみると…

===3===
A
B

count($list) の値は「3」なのに、最後の要素が出力されない。
なぜだ。

var_dump() で配列の内容を一覧してみよう。
$list を初期化した後と、array_unique() を通した後に var_dump() を入れてみる。

$list = array(‘A’, ‘B’, ‘A’, ‘C’);
var_dump($list); // ★追加★
$list = array_unique($list);
var_dump($list); // ★追加★
for ($cnt = 0; $cnt < count($list); $cnt++)
{
print($list[$cnt] . “\n”);
}

実行してみると…

array(4) {
[0]=>
string(1) “A”
[1]=>
string(1) “B”
[2]=>
string(1) “A”
[3]=>
string(1) “C”

}
array(3) {
[0]=>
string(1) “A”
[1]=>
string(1) “B”
[3]=>
string(1) “C”

}
A
B

なるほど、array_unique() を通した後は、要素数(つまり count($list))は「3」なので、for は [0][1][2] でループするのだけれど、最後の要素の添え字は [3] だから出力されないんだ。
おそらく、[2] は null なのだな。

確認してみよう。

$list = array(‘A’, ‘B’, ‘A’, ‘C’);
$list = array_unique($list);
for ($cnt = 0; $cnt < count($list); $cnt++)
{
if ($list[$cnt] == null) // ★追加★
{
print(“NULL!\n”);
}
print($list[$cnt] . “\n”);

}

実行してみる。

A
B
NULL!

では、array_unique() を通した後の配列を正しくループさせるにはどうしたらいいのだろう。
sort() を通して配列を並べ替えたらどうだろうか。

$list = array(‘A’, ‘B’, ‘A’, ‘C’);
$list = array_unique($list);
sort($list); // ★追加★
for ($cnt = 0; $cnt < count($list); $cnt++)
{
print($list[$cnt] . “\n”);
}

できた!

A
B
C

しかし、これでは配列がソートされてしまう。ソートしたくない場合はどうしたらいいのだろうか。
array_系の関数をざっと見てみる… これか、array_merge() で、1個の配列だけをマージしてみたらどうか。
やってみよう。

$list = array(‘A’, ‘B’, ‘A’, ‘C’);
$list = array_unique($list);
$list = array_merge($list); // ★追加★
for ($cnt = 0; $cnt < count($list); $cnt++)
{
print($list[$cnt] . “\n”);
}

できた!

A
B
C

もっといいやり方があるような気がするのだが、とりあえず、これでヨシとしよう。
なかなか奥が深い。

楽天SocialNewsに投稿!
0 0 0

読書メーターのブログ・パーツ V2

このエピソードの続き。

読書メーターのブログ・パーツ

読書メーターのサイトがリニューアルされた。

読書メーター
読書メーター

このブログでは、ページの右下に読書メーターに登録した読んだ本の情報を表示しているのだが、読書メーターが提供しているブログ・パーツは不具合があって、更新内容が正しく反映されないので、自作のブログ・パーツで情報を表示している。
リニューアル後用のブログ・パーツがあればと思うのだが…リニューアル後のサイトでは、ブログ・パーツのダウンロード・ページなどが見当たらない。

そういう事で、自作のブログ・パーツをリニュアル後用に改修する事にした。
自作のブログ・パーツは、非ログインでも参照できるユーザのマイ・ページにアクセスしてHTMLをダウンロードし、「読んだ本」「読んだページ」「感想・レビュー」をHTMLから抽出している。

bookmeter-1

リニューアル前後で基本的な構造は同じようなので、アクセスするURLと、抽出するための正規表現を書き換えた。
ついでに、出力する値を3桁のカンマ区切りに変更。

ブログ・パーツ

とりあえず、これでOK。

楽天SocialNewsに投稿!
0 0 0

Aliexpress アフィリエイト WordPress プラグイン

最近、Aliexpress から商品を購入する機会が多くなってきた。

Aliexpress
Aliexpress

中国サイト、中国ショップ、中国製品は、正直言って品質がよくないので苦労する事も少なくないし、ショップの対応の質は低いし、購入してから商品が到着するまで1ヶ月くらいかかるなど、いろいろ難点はあるのだけれど、やはり、圧倒的な安さは大きな魅力だし、安価な商品でも送料無料(海外からの発送なのに!)が多いのも魅力を感じる。

さて、最近、このブログに設置されている Google AdSense の広告ボックスに、Aliexpress の広告が表示されている事に気が付いた。

Aliexpress広告

もしかして、Aliexpress ってアフィリエイトやっているのか?
検索してみると…あった!
Aliexpress のアフィリエイトってあるんだ。知らなかった。

AliExpress Affiliate
AliExpress Affiliate

さっそく登録してみた。

管理画面にアクセスして、いろいろ調べてみる。
まだ調べが足りないのかもしれないけど、Amazonや楽天のアフィリエイトに比べると、あまり使い勝手がよくない。
基本的にブログで商品を紹介する場合、ピンポイントでその商品を紹介する場合がほとんどなので、「リンクを作成」という操作をしたら、画像、商品名、リンクなどがパッケージされたHTMLのセットが生成されてほしいのだけれど、そのようなリンクは作成できず、ピンポイントの商品は、たとえば、以下のようなURLしか作成できない。

http://s.click.aliexpress.com/e/e27AUFeA2

画像などは自分でダウンロードするなどして準備してサーバにアップし、商品名などもコピペして持ってくるなどしないといけない。
ひじょうにメンドクサイ。

と、いう事で、できるだけ簡単にアフィリエイトのリンクが作成できるように、WordPress 用のプラグインを作ってみた。

Aliexpress アフィリエイト WordPress プラグイン

Aliexpress の商品の詳細ページには、<meta>データに Open Graph Protocol のデータが埋め込まれているので、このデータの「og:title」から商品名を、「og:image」から商品の画像を抽出して利用する事にする。
また、取得した商品名には、末尾に「カテゴリ」とか、「Aliexpress.com」とか、「Alibaba Group」とか、商品名そのものとは直接関係ない文字列が入っているので、これらは削除して使用する事にする。

<meta property=”og:title” content=”Original brand wansenda On sale 1PC Micro sd card 8GB 16GB 32GB 64GB class10 Real capacity Memory Card TF card free card adapter-in Memory Card from Consumer Electronics on Aliexpress.com | Alibaba Group” />
<meta property=”og:image” content=”http://g01.a.alicdn.com/kf/HTB1RvP0LXXXXXctXVXXq6xXFXXXa/Original-brand-wansenda-On-sale-1PC-Micro-sd-card-8GB-16GB-32GB-64GB-class10-Real-capacity.jpg”/>

本文中に、たとえば、以下のようなタグを本文中に記述する。
タグの中は「:」で区切って商品コードとアフィリエイト・コードを記述する。
商品コードは、商品の詳細ページのURL中にあるコード、アフィリエイト・コードは、アフィリエイトの管理画面で「Ad Center」→「Deep Link URLs」を操作して得られるURL中にあるコードだ。

[aliexpress]32709218468:e27AUFeA2[/aliexpress][aliexpress]32260198252:uV3nIYnA6[/aliexpress]
[aliexpress]32654385390:jM7iYfiQv[/aliexpress][aliexpress]32682370439:3FaMfIAqr[/aliexpress]

以下のようなアフィリエイト用のHTMLに置き換えられる。

Moweek 2016 Real capacity pendrive  4GB 8GB 16GB 32GB 64GB USB flash drive usb2.0 Colorful memory stick
Moweek 2016 Real capacity pendrive 4GB 8GB 16GB 32GB 64GB USB flash drive usb2.0 Colorful memory stick
Super mini usb 2.0 usb flash drive 16gb 32gb pen drive 4gb 8gb usb flash 64gb memory stick usb stick pendrive pass h2testw
Super mini usb 2.0 usb flash drive 16gb 32gb pen drive 4gb 8gb usb flash 64gb memory stick usb stick pendrive pass h2testw
Free shipping   Real capacity memory cards 2GB 4GB 8GB class 4 16GB 32GB 64GB class10 micro original tf sd cards +USB Reader
Free shipping Real capacity memory cards 2GB 4GB 8GB class 4 16GB 32GB 64GB class10 micro original tf sd cards +USB Reader

また、前述の通り、商品名と画像は Aliexpress の商品の詳細ページから取得するが、アクセスの度に Aliexpress にアクセスするわけにはいかないので、商品名と画像はキャッシュするようにした。
キャッシュしたデータは一定時間(とりあえず24時間)経過後に自動削除し、再取得するようにしてある。

とりあえず VER 1.0。
運用しながら改良していこう。

■2016/08/05 追記

このプラグインを作成している途中で、Aliexpress のアフィリエイトのリンクのブロックを受けてしまった(正しくは、ブロックを受けたと「思われる」なのだけど)。
アフィリエイトのURLにアクセスすると、商品の詳細ページが表示されず、ログインを要求されるようになった。ログインすれば詳細ページに遷移する。
異なるIPアドレスからアクセスすれば、ブロックされずに普通に商品の詳細ページが表示されるので、私の環境のみがブロックされた状態になってしまったようだ。

もちろん、開発中には Aliexpress へのアクセスが頻繁に発生したとは思うけれど、アクセスした回数は、多く見積もっても100回程度じゃないかな。Aliexpress 側のアクセス制限は小さい値になっているようなので、注意が必要だ。

正確には測っていないけれど、6時間程度でブロックは解除され、正常に戻った。
一旦ブロックされてしまうと、6時間程度はメンテナンスが困難な状態になってしまうので、Aliexpress のアフィリエイトの実装をする場合は、誤って多数のアクセスが飛ばない様に注意する必要だ。

楽天SocialNewsに投稿!
0 0 0

Raspberry pi シャットダウンUSBキー V2

このエピソードの続き。

Raspberry pi シャットダウンUSBキー

Raspberry pi をお手軽にシャットダウンできるUSBキー V2 を作ってみた。

Raspberry pi シャットダウンUSBキー V2

前版では、SDカードにファイルを書き込み、特定のファイルが存在しているか否かでシャットダウンを実行するように作成した。
しかし、SDカードを準備して、0バイトのファイルを1個だけ置くという、ひじょうに無駄の多い構成で、たとえば、SDカードの故障によってファイルが読み出せず、シャットダウンに移行できない状況も発生し得る。
もう少しシンプルな構成にできないだろうか。

前版では、「情報=ファイル」という頭があって、SDカードに情報を書き込んだのだけれど、SDカードに拘らず、USBデバイスの固有情報を利用して、特定のUSBデバイスが挿されたらシャットダウンをかける様にする事はできないだろうか。

SDカードを挿していないカードリーダーを Raspberry pi に挿し、接続されているUSBデバイスを一覧してみる。

$ lsusb | sort
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 002: ID 0424:9514 Standard Microsystems Corp.
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp. SMSC9512/9514 Fast Ethernet Adapter
Bus 001 Device 004: ID 1267:0201 Logic3 / SpectraVideo plc A4Tech SWOP-3 Mouse
Bus 001 Device 005: ID 0566:3002 Monterey International Corp.
Bus 001 Device 012: ID 05e3:0751 Genesys Logic, Inc.
$

上記の例では、最後の「Bus 001 Device 012」がカードリーダーだ。
カードリーダーのみでもUSBデバイスとして認識された。

カードリーダーの詳細を表示してみる。

$ lsusb -v -s 12
Bus 001 Device 012: ID 05e3:0751 Genesys Logic, Inc.
Couldn’t open device, some information will be missing
Device Descriptor:
bLength                18
bDescriptorType         1
bcdUSB               2.00
bDeviceClass            0 (Defined at Interface level)
bDeviceSubClass         0
bDeviceProtocol         0
bMaxPacketSize0        64
idVendor           0x05e3 Genesys Logic, Inc.
idProduct          0×0751
bcdDevice           14.03
iManufacturer           3
iProduct                4
iSerial                 0

(省略)

$

取得したUSBデバイスの情報から、「idVendor」「idProduct」あたりが固有情報(に近い情報)として使えそうだ。

これらの情報を抽出し、特定の値であればシャットダウンを実行するようにする。

$ lsusb -v -s 12 2> /dev/null | egrep “id(Vendor|Product)”
idVendor           0x05e3 Genesys Logic, Inc.
idProduct          0×0751
$

これならば、SDカードを準備する必要はない。
USBカードリーダー単体であれば、Amazonでは200円程度から、中国通販サイトなら20円程度からある。
また、中国通販サイトでSDカードを購入すると、多くの場合、カードリーダーもセットで送られてくるので、ずんべ の手元にも余ったものがけっこうあり、それらを活用できる。
必要な機材点数が減り、コストも削減できた。同時に故障率も減るものと考えていいだろう。

USBカードリーダ

更に言うと、シャットダウン・キーとするUSBデバイスは、別にカードリーダーである必要もない。マウスでも、キーボードでも、USBデバイスなら何でもいい。

もちろん、シャットダウン用の「idVendor」「idProduct」と同一のUSBデバイスを挿してしまうとシャットダウンが始まってしまうわけだけれど、別に一般ピープルが使用するわけではなく、限定された環境で使うものなので、気にしない事にする。

楽天SocialNewsに投稿!
0 0 0

Raspberry pi シャットダウンUSBキー

Raspberry pi をお手軽にシャットダウンできるUSBキーを作ってみた。

Raspberry pi + シャットダウンUSBキー

Raspberry pi をシャットダウンするには、基本的には、ログインしてコマンドを入力する必要がある。
シャットダウン用のボタンを付けてシャットダウンをかける方法は、WEBで様々書かれているけれど、ずんべ は電子回路には明るくないし、すぐに実装したかったので、手元にあるSDカード/USBメモリを使って、お手軽にシャットダウンする方法を考えてみた。

まぁ、「考えてみた」と言っても、たいした実装ではなく、以下のように動作させ、シャットダウンをかけるだけである。

(1).Raspberry pi にUSBメモリを挿す。
(2).USBメモリが自動的にマウントされる。
(3).マウントされたUSBメモリ内に「/shutdown.txt」が存在するか確認する。
(4).「/shutdown.txt」が存在していれば、シャットダウンする。

お手軽だ。(^^)

USBメモリは、こんな感じ。

シャットダウンUSBキー

USBメモリの中には、0バイトのファイルが1個だけ置いてある。

$ find . -type f -exec ls -l {} \;
-rwxr-xr-x 1 root root 0 Jul 14 03:33 ./shutdown.txt
$

USBメモリが挿されたか否かは、おそらく何らかの方法でリアルタイムに検出できるのだろうけれど、お手軽に cron による起動で、5分間隔くらいで実行する事にする。

$ EDITOR=cat crontab -e 2> /dev/null | grep shutdown.pl
5,10,15,20,25,30,35,40,45,50,55 * * * * /home/pi/foo/bar/shutdown.pl
$

USBメモリが挿されているか否かの検査は、こんな感じで。

$ mount| grep /media/ | grep vfat
/dev/sda1 on /media/pi/E405-3402 type vfat ( ・・・ )
$

この出力から、マウントされているディレクトリ(上記の場合「/media/pi/E405-3402」)を求める。
そして、その直下に「shutdown.txt」が存在するか検査し、存在していれば、シャットダウンを実行する。

$ ls -l /media/pi/E405-3402/shutdown.txt
-rwxr-xr-x 1 root root 0 Jul 14 03:33 /media/pi/E405-3402/shutdown.txt
$

今回作成したものは「シャットダウン・キー」なのだけれど、USBメモリ内に置くファイルを「reboot.txt」や「apatch_restart.txt」などとして、「リブート・キー」や「Apache再起動キー」など、キーボードなしで Raspberry pi に動作指示を与えるキー・セットを作る事もできると思う。


今回は手元にある余り機材を集めて準備したので、こんな構成になった。
SDカードのサイズはミニ(マイクロではない、骨董品だ)。(^^;
容量は16MB(16GBではない、骨董品だ)。(^^;

シャットダウンUSBキーの構成

SDカードに書き込むファイルは「shutdown.txt」が1個だけで、サイズは0バイトなので、16MBでも容量はあり余っているのだが、今時16MB程度の容量など、写真を数枚入れたらいっぱいになってしまうので使い道がなかったのだが、やっと有効活用できた。

今回は余り機材で構成したので、SDカード+USBアダプタになったけれど、スマートな構成にしようとすれば、スティック型のUSBメモリになるのかな。そうなると、サイズ0バイトのファイルを1個を置くためだけに4GBや8GBは無駄だし、コストも無視できない。
やはり、少し回路系の勉強をして、スイッチを付けるべきかな。
少し勉強してみよう。

楽天SocialNewsに投稿!
1 0 0

ActiveXで大ハマリ

ActiveXのインストールでハマったのでメモ。

お客様に納品しているソフトウェアは、開発言語が Microsoft Visual Basic 6.0(以下、VB6)で、AxtiveXで提供されているものがある。
ActiveXでソフトウェアを提供する事によって、Microsoft Internet Explorer(以下、IE)上で Windows ネイティブなプログラムを実行する事ができるため、WEB経由で動作するシステム上で、IE 上でシームレスにプログラムを動かせるので、便利に使用してソフトウェアを開発していた。
また、ActiveXが持つ機能を使用して VB6 のランタイムライブラリも自動的に必要なDLLのみがインストールされるのも便利なところだ。

しかしながら、昨今はセキュリティがひじょうに厳しくなった事もあって、ブラウザ上でネイティブなコードを実行できる ActiveX は避けられる方向にある。
代表例は Flash で、過去は、サイトのトップページで多用されていたが、現在は、スマートフォン端末やタブレット端末で使用できない事もあり、昨今では、ほとんど使われなくなった。

また、VB6 は、開発環境としては古いものであり、現行でマイクロソフトのサポートサイクル内にあるOSでは、Windows Vista までしか開発環境のインストールはサポートされていないものである。

開発ツール対応 OS 一覧

とは言え、お客様に納品しているソフトウェアは、そう簡単に新しいものには変えられないので、使える限りは、使い続ける事が原則だ。マイクロソフトの都合や、開発サイドの都合で、問題なく動いているものを、わざわざお金をかけて作り直しなどさせてはくれない。

そういうわけで、過去に VB6 + ActiveX で納品したソフトウェアの改修を行う事になったのだが、問題が発生した。

まず、ユーザ様の環境に合わせたテスト環境し、過去に納品した ActiveX のインストールを試してみる。
最新の IE である IE11 に合わせて若干の調整が必要であったが、インストールは問題なくでき、ActiveX は問題なく動作した。
ここまでは順調だ。

後日、プログラムを改修した ActiveX のパッケージで、インストールを試したところ、今度は問題が発生した。
ActiveX をインストールする旨のダイアログは表示されるが、インストールに失敗してしまう。エラーも何も出ない。

インストールはスタートする

インストールはスタートするのに、何も言わずに終了し、インストールに失敗してしまう。
なぜだ?
新しく作成した ActiveX のパッケージがおかしいのか?

試しに、先にインストールが成功した、過去に納品した ActiveX を一旦削除して、もう一度インストールをしてみると、こちらもインストールできなかった。
いったい何が起こっているのだ?

IE の「インターネット オプション」の設定を変更し、セキュリティを緩々にしてみる。
インストールできない。

テスト環境は ESXi 上に作成しているので、インストール操作を行う前にバックアップした環境を書き戻してみる(インストールに成功した環境に戻してみる)。
インストールできない。

んんんん??

ActiveX のインストールが行われる際に、IE は Temporary Internet Files にログを残すので、これを参照してみる。

IEのログ

すると…

*** Code Download Log entry (20 Nov 2015 @ 23:35:09) ***
Code Download Error: (hr = 800c0007) 要求されたリソースのデータは使用できません。Operation failed. Detailed Information:
CodeBase: http://***********************
CLSID: {********-****-****-****-************}
Extension:
Type:LOG: Item **********.ocx being processed.
--- Detailed Error Log Follows ---
LOG: Download OnStopBinding called (hrStatus = 0 / hrResponseHdr = 0).
LOG: Item **********.ocx being processed.
LOG: Item MSVCRT.DLL being processed.
LOG: Item MSINET.OCX being processed.
LOG: Item INETJP.DLL being processed.
LOG: Item COMDLG32.OCX being processed.
LOG: Item CMDLGJP.DLL being processed.
LOG: Item MSCOMCTL.OCX being processed.
LOG: Item MSCMCJP.DLL being processed.
LOG: Item msvbvm60.dll being processed.
LOG: Item OLEAUT32.DLL being processed.
LOG: Item OLEPRO32.DLL being processed.
LOG: Item ASYCFILT.DLL being processed.
LOG: Item STDOLE2.TLB being processed.
LOG: Item COMCAT.DLL being processed.
LOG: Item VB6JP.DLL being processed.
LOG: URL Download Complete: hrStatus:0, hrOSB:0, hrResponseHdr:0, URL:(http://***********************.CAB)
LOG: Download OnStopBinding called (hrStatus = 800c0007 / hrResponseHdr = 8007007e).
LOG: Redundant download attempted, but no more codebases available.
LOG: URL Download Complete: hrStatus:800c0007, hrOSB:0, hrResponseHdr:8007007e, URL:(http://activex.microsoft.com/controls/vb6/VB6JP.cab)
LOG: Reporting Code Download Completion: (hr:800c0007 (FAILED), CLASSID: d80b51ca..., szCODE:(http://***********************.CAB), MainType:(null), MainExt:(null))

2行目でエラー「800c0007」が記録されている。
その原因は、下から2行目の、リターンコード「8007007e」のようだ。
エラーとして記録されているURLは、これだ。

http://activex.microsoft.com/controls/vb6/VB6JP.cab

えぇ~?
activex.microsoft.com 上のパッケージにアクセスできない?

wget コマンドでダウンロードを試みてみる。

$ wget http://activex.microsoft.com/controls/vb6/VB6JP.cab
--2015-11-20 23:49:35--  http://activex.microsoft.com/controls/vb6/VB6JP.cab
activex.microsoft.com をDNSに問いあわせています... 61.213.151.18, 61.213.151.10
activex.microsoft.com|61.213.151.18|:80 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 404 Not Found
2015-11-20 23:49:36 エラー 404: Not Found。
$

404 Not Found…。orz

nslookup で activex.microsoft.com を引いてみる。

$ nslookup activex.microsoft.com
Server:         XXX.XXX.XXX.XXX
Address:        XXX.XXX.XXX.XXX#53Non-authoritative answer:
activex.microsoft.com   canonical name = activex.microsoft.com.edgesuite.net.
activex.microsoft.com.edgesuite.net     canonical name = a1670.g2.akamai.net.
Name:   a1670.g2.akamai.net
Address: 61.213.151.10
Name:   a1670.g2.akamai.net
Address: 61.213.151.18
$

DNSは引けるが、何だよ、この akamai.net って。

2日待ってみたが、一向に復旧しない。
サーバ activex.microsoft.com の障害って、どこに連絡をすればよいのだ?
マイクロソフトのMSDNのサポートに電話をしてみる。
が…まったく要領を得ない。
サポート窓口の人は、技術的な事はまったくわからないようで、「ActiveX」も、「activex.microsoft.com」も、拡張子「.CAB」も、「DNS」も、「nslookup」も通じない。
文字通り、話にならない。まったく埒があかない。
結局、最後はこうだ。

このサーバは、時々アクセスできなくなる事があるようです。
しばらくお待ちいただければ復旧すると思います。
このサーバに関する連絡窓口はございません。

いやいや、「時々、アクセスできなくなる事がある」って、おかしいやろ。
「このサーバに関する連絡窓口はございません」って、おかしいやろ。
activex.microsoft.com が動いていないという事は、世界中で ActiveX のインストールができない状態になってるって事だぞ。そんな重要なサーバが、何日も落ちっぱなしっておかしいやろ。

ちなみに、実は7年前にも似たような事があった。

【プログラミング】ActiveXで大ハマリ

この時は、完全にアクセスできないのではなく、不安定な状態で、ダウンロードできたり、できなかったり、という状況で、パッケージをローカル・サーバに置くことで回避できた。
しかし今回は、まったくアクセスできないので、パッケージを手元に置こうにも、そのパッケージのダウンロードもできない。

どうにもならない。
マイクロソフト君、しっかりしてくれ。

■2015/11/26 追記

再度マイクロソフトに問い合わせてみたけれど、やっぱり「わからない」という回答。
なんだかなぁ。

仕方がないので、activex.microsoft.com からのダウンロードは諦め、開発PC上の DLL や OCX が正であると考えて、パッケージを作成するときに、DLL や OCX をすべてパッケージに含めるように設定を変更してパッケージを作成。
当然の如く、パッケージは肥大化し、約200KBだったCABが、10倍の2MBに。

$ ls -l
-rw-r--r--. 1 zunbe zunbe  206058  3月 13 21:56 2013 OLD-ActiveX.CAB
-rw-r--r--. 1 zunbe zunbe 2007507 11月 26 05:20 2015 NEW-ActiveX.CAB

これで一応、新しい ActiveX をインストールする事はできるようになった。
ファイルのサイズは大きくなってしまったが、これはヨシとする。
とりあえずは、これでいい。

しかし、まだ問題が。
プログラムの検証をするために、旧版の ActiveX をインストールしなければならない。
ずんべ 自身がインストールするだけなら、ランタイム・ライブラリをインストールした上で、旧版の ActiveX を regsvr32 で登録すれば何とかなるが、お客様もでも同様に新旧両方の ActiveX をインストールして検証をする必要があるので、お客様には「regsvr32で」というわけにはいかない。

仕方がないので、作成した新版のパッケージを元に、旧版のパッケージを手動で作成する事にする。
まず、作成した新版の CAB を一旦解凍する。
新版の ActiveX を、旧版の ActiveX に差し替える。
INF ファイルも手動で修正する。
再び CAB に固める。
作成した旧版のパッケージで、インストールをトライしてみると、無事成功。

やれやれだぜ。(空条承太郎風)

楽天SocialNewsに投稿!
0 0 0

読書メーターのブログ・パーツ

久しぶりのプログラミングねた。
と、言うか、このブログのタイトルは「プログラマ ずんべ の日記Ⅱ」という事で、プログラムねたがけっこう出てこなければいけないと思うのだが、このブログをスタートしてから2年ちょっとの間で、カテゴリ「プログラミング」の投稿数は、この投稿を含めて、わずか5件…。orz
もうちょっとプログラムねたを頑張らないといけないな。

さて、ずんべ は、何年か前から読んだ書籍の記録と書評を「読書メーター」にアップしている。

読書メーター

このブログに、読書メーターのブログ・パーツを貼ってみた(右サイドバーの一番下)のだが…ん~、使えない。

bm1

一番下のパーツが読書メーターのブログ・パーツで、一見すると、きちんと表示されているように見えるのだが、実は表示されている数値がぜんぜん違う。
このエピソードを書いている時点での、正しい数値はこちら。

bm2

このブログにも、少し前からブログ・パーツを貼っていたのだけれど、どれだけ書籍を登録しても、最初にブログ・パーツを貼った時に表示された数値のままで、まったく更新されない。
読書メーターのサイト上にある不具合報告のBBSでも、この不具合は散々報告されているが、一向に修正される気配がない。
待っていても修正されそうにないので、自分で開発してしまう事にした。

と、言っても、読書メーター側に「読んだ本」と「読んだページ」の値を取得するようなAPIがあるわけではないので、姑息な方法を使ってデータを得るしかない。
幸い、読書メーターは、自分のマイページにはログインなしでアクセスでき、そのページ中に「読んだ本」と「読んだページ」が表示されている。

zunbeさんの読書メーター

そこで、マイページを ajax で読み込み、ページ内に記述されているHTMLから「読んだ本」と「読んだページ」を解析して(解析と言っても、正規表現をちょろっと書いて抜き出すだけなのだが)表示する事にした。

そんなわけで、さくっとJavaScriptのモジュールを作って組み込み。

bm3

と、いう事で、正しい数値が表示された。

読書メーターのページのHTMLを解析しているのだから、読書メーターが表示を変更すれば、まったくデータが取れなってしまうのだけれど、まぁ、このブログで表示できなくなるだけの事なので、ヨシという事にする。

楽天SocialNewsに投稿!
0 0 0

便利ツール Windows PowerShell版

このエピソードの続き。

便利ツール – ドットファイル作成
便利ツール – ファイル・バックアップ

先に作ったツールは Windows Scripting Host(WSH)で作成したのだが、今回は、これらの便利ツールを Windows PowerShell で作り直してみた。
Windows Scripting Host で作成したもので、動作的にはまったく問題ないのだが、これまで、Windows PowerShell でスクリプトを組んだことがなかったので、勉強がてら作ってみた。

todotfile.ps1
fbackup.ps1

Windows Power Shell は、プログラム中で変数への代入とパイプラインでの転送を統合した形で実装されており、興味深い実装なのだが、ちょっと慣れが必要だ。

プログラムの使い方は WSH 版と基本的に同じ。

PowerShell todotfile.ps1 file1 file2 file3 ...
PowerShell fbackup.ps1 file1 file2 file3 ...

で、コマンドラインで使うのはメンドクサイので、これを「送る」に入れて使う。
こんな感じに。

便利ツール PowerShell版

実行!

便利ツール PowerShell版

PoweShell をはじめて使ってみたけど、なかなか面白い言語だった。
もう少し勉強してみよう。

なお、プログラムはダウンロードして自由に使って頂いて構いませんが、自己責任でお願いします。

楽天SocialNewsに投稿!
0 0 0

便利ツール – ファイル・バックアップ

ずんべ の会社では、プログラムやデータなど、ファイルを更新する際は、オリジナルのファイルに「年月日」を付加してバックアップする規則になっている。

たとえば、「test.cgi」というファイルをバックアップする場合は、「20140702.test.cgi」というファイル名でバックアップする。
UNIXのコマンドラインで言うと、以下のようなコマンドを実行するイメージ。

$ mv test.cgi 20140702.test.cgi
$ cp 20140702.test.cgi test.cgi

なぜ、単に cp だけするのではなく、わざわざ mv してから cp して書き戻すのかというと…

バックアップは、可能な限りオリジナルを保存しておく

という考えによるもの。
環境によっては、コピーすると、パーミッションやタイムスタンプが失われてしまう可能性があるので、mv してオリジナルを保存した上で、cp して書き戻している。

操作としては mv して cp するだけなので、際立って面倒な作業というわけではない。
Windows上で操作する場合では、「オリジナルをリネーム」→「ファイルをコピー」→「コピーしたファイルをオリジナルのファイル名にリネーム」という手順になり、少し手順が増えるものの、やはり、際立って面倒な作業というわけではない。
とは言え、可能な限り作業は簡略化したいし、細かい事であっても、自動化できるところは自動化したい。

と、いう事で、Windows環境で使える便利ツールを作ってみた。

fbackup.vbs

コマンドラインでは、以下の様に使用する。

cscript fbackup.vbs file1 file2 file3...

で、コマンドラインで使うのはメンドクサイので、これを「送る」に入れて使う。
こんな感じに。

送る

実行!

送る

自分で言うのもナンだが、便利だ。(^^)

なお、プログラムはダウンロードして自由に使って頂いて構いませんが、自己責任でお願いします。

楽天SocialNewsに投稿!
0 0 0

便利ツール – ドットファイル作成

WEB関連の仕事をしていると、「.htaccess」というファイルに触れる機会がある。

UNIXでは、「.」という文字は基本的に英数字と同じように扱われるので、普通にコマンドラインなどで「.」から始まるファイル名にする事ができる。
Windowsでは、「.」は、拡張子を表すための区切り文字として扱われるため、「.」から始まるファイル名を作ろうとすると、「ファイル名なし+ドット+拡張子」となってしまい、エクスプローラ上の操作などでは、「.」から始まるファイルを作成する事ができない。

「.」から始まるファイルは作成できない

メモ帳などのエディタを起動して、「名前を付けて保存」などの操作で「.」から始まるファイルを保存する事はできるが、いちいちエディタを起動してこの操作をするのは、ちょっとメンドクサイ。

名前で付けて保存

もっと簡単にWindows上で「.」から始まるファイルを作成できないだろうか。

と、いう事で、Windows環境で使える便利ツールを作ってみた。

todotfile.vbs

コマンドラインでは、以下の様に使用する。

cscript todotfile.vbs file1 file2 file3...

で、コマンドラインで使うのはメンドクサイので、これを「送る」に入れて使う。
こんな感じに。

送る

実行!

送る

自分で言うのもナンだが、便利だ。(^^)

なお、プログラムはダウンロードして自由に使って頂いて構いませんが、自己責任でお願いします。

楽天SocialNewsに投稿!
1 0 0

広告

まとめページ

取得した資格
登った山

広告

サイト内検索

WordPress

広告

RSS

RSS 記事
RSS コメント
Server offered by
有限会社パテンティックソフトウェア
Profile for zunbe
zunbeの読書メーター
読んだ本
-
ページ数
-
書評投稿数
-