Profile cover photo
Profile photo
Yamane Jun
Web関係の主に技術的なことについて投稿します。
Web関係の主に技術的なことについて投稿します。
About
Yamane's posts

Post has attachment
 契約しているサーバが4時間ほどダウンしていた。不思議なのが、FTPは使えるし、ドメインメールも使えるということ。
 「以前も同様のことがあったな」と、過去にサポートとやり取りしたメールを探したところ、原因らしきものを発見した。

・何らかの理由でWebアプリケーションファイアウォール機能が正常に動作できていない可能性

 サーバ管理画面から確認すると、Webアプリケーションファイアウォールについては、全てのドメイン(サブドメイン)で「利用しない」にチェックが付いている。取り合えず、1つのドメインについて「利用する」に一度設定した上で、「利用しない」に変更してみた。
 すると、そのドメインだけでなく、他のドメイン(サブドメイン)についても、あっさり繋がった。もしかしたら別の要因かもしれないが、解決したので備忘的に残しておく。

 と言うか、Webアプリケーションファイアウォールなど使わないので、トラブルのもとになるのであれば実装してほしくない。さくらインターネットは気に入っているのだが…

Photo

Post has attachment
 運営するメインサイトのレスポンスが最近よくない。同一レンタルサーバで運営している他サイトは問題ないのでプログラムに問題があるようだ。

 思い当たるのはfacebookのシェア数を一括取得するスクリプトだ。ローカル環境では取得できているのに、レンタルサーバ上では全く取得できていないのだ。2ヶ月前は取得できていたのに…。
https://plus.google.com/107527620186812837918/posts/fKwsuHy4pk8

 API経由でシェア数を取得したらキャッシュし、その後は一日一回情報更新する仕様なのだが、データを取得できていないらしい。毎回取得しようとするからページ表示速度が悪くなる。
 仕方がないのでfacebookシェア数の一括取得をやめることにした。途端にサイトのページ表示が早くなる。やはり原因はこれだったのか。

 更に調べたところ「(#4) Application request limit reached」のメッセージが戻ってくる。どうやら使用制限に引っかかってしまったらしい。

FacebookのAPIが変更されシェア数の取り方が変わった
http://rcmdnk.github.io/blog/2016/08/22/blog-octopress-javascript/

 従来と同様のやり方でFacebookのシェア数を取得しているので、APIの使用制限ルールが厳しくなったものと推測される。

 そう言えば、GoogleニュースのRSS取得もできる場合とできない場合がある。おそらく利用制限があるのだろう。


Post has attachment
 運営するサイトに突然エラーが発生した。確認したところ、SNSのAPIが原因のようだ。
 更に深堀することで、問題が起こっているのはFacebookのAPIだと分かる。

 エラーメッセージは以下の通り。

 [error_msg] => REST API is deprecated for versions v2.1 and higher (12)

 v2.1以上のAPIが必要らしい。要するにAPIのバージョンが古いということだ。

 Facebookプラットフォーム更新履歴を確認してみると、どうやらv2.0のAPIを使っていたことになる。
https://developers.facebook.com/docs/apps/changelog

 と言うことで調べてみたところ下記ページを発見。
http://koni.hateblo.jp/entry/2016/01/20/160903

 「http://graph.facebook.com/?ids=」の後に、シェア数を取得したい複数URLを「,」で区切ってgetすればOKとのこと。

 念のためにAPIの最新バージョン「グラフAPI Version v2.7」を確認する。
https://developers.facebook.com/docs/graph-api/reference/v2.7/url

 上記ページには「?ids=」でなく「?id=」のケースしか掲載されていないが、下記ページでは「複数IDの読み取りリクエスト」として「?ids=」が掲載されているから大丈夫そう。
https://developers.facebook.com/docs/graph-api/using-graph-api#multiidlookup

 取得した複数データについては「for」でループさせて、各URLのシェア数を["share"]["share_count"]で取得。これでエラーメッセージが消えた。

Post has attachment
 同窓会の記念冊子をPDF配布する際、ハマったので備忘的に残しておく。

 記念冊子の入稿データをPDFで受け取った。入稿データは見開き2ページで、しかも外側にはトンボ(アウトライン)がある。表紙が一番最後にきているし、このままではPDF配布できない。

 まずは、スクリーンキャプチャで1ページずつ画像データを作成し、それらをPDF結合してみた。出来上がりは悪くない。ただし、解像度が悪くなるので印刷向きではない。画像の保存形式を「.bmp」にしてもダメ。

 良い方法がないかと調べている最中、PDFでページの部分印刷ができることに気付く。試しに部分印刷したところ、解像度も問題ない。

 手順は以下の通り。

1.PDFの「編集/スナップショット」を選択してから印刷。
2.印刷はPDFファイルで出力。ファイル名をページ番号とする。(表紙は「00」、1ページ目は「01」)
3.Dropboxにフォルダを作成して、そこに上記2.で出力した全てのPDFを格納する。
4.「PDF 結合|Smallpdf」にアクセスして、上記3.のDropboxフォルダ経由でPDFを結合。

 これで記念冊子をPDFにすることができた。

ページの一部を印刷する (Acrobat/Adobe Reader)|Adobe
https://helpx.adobe.com/jp/acrobat/kb/cpsid_91527.html
PDF 結合|Smallpdf
https://smallpdf.com/jp/merge-pdf

Post has attachment
 先日、高校の同窓会が開催された。その時の模様を中心に、フォトブックを現在作成している。
 フォトブックは、何度か利用したことがあるし、値段と品質のバランスのとれているTOLOTを選択した。
http://tolot.com/

 ところが一つ困ったことが生じた。TOLOTの場合、CSVやエクセル等で送付先を一括アップロードできないのだ。100近くの送付先の姓名や住所等を1つずつコピペしたくない。

 と言う訳で、UWSCの出番。自動化処理をすればいい。早速スクリプトを組むことにする。

1.送付先のデータが格納されたCSVを読み込む。
2.1行ずつ、姓名や住所、ふりがな等のデータを取得する。
3.TOLOTの連絡帳の連絡先追加ページにIEでアクセスする。
4.IEの「Tab」ボタンをクリックして入力フォームを移動し、各データを貼りつける。
5.「保存」をクリックしてデータを登録する。
6.2.~5.をループ。

 出来上がったUWSCスクリプトは以下の通り。非常にシンプルです。

<-- UESCスクリプトここから -->

public NUM_PEOPLE = 90;
public URL = "https://tolot.com/member/contact/new";
DEF_DLL SendMessageA(Hwnd, Long, Long, Dword): bool: user32
CONST WM_ACTIVATE = $06

start();

//***********************************************************//
// Start
//***********************************************************//
procedure start()
// IEの起動
IE_OBJ = CreateOLEObj("InternetExplorer.Application");
IE_OBJ.Visible = True;
// CSVの読み込み
fid = FOPEN("tolot.csv", F_READ)
FOR i = 1 TO NUM_PEOPLE
no = FGET(fid, i, 1);
sei = FGET(fid, i, 2);
mei = FGET(fid, i, 3);
huri1 = FGET(fid, i, 4);
huri2 = FGET(fid, i, 5);
yuu = FGET(fid, i, 6);
pref = FGET(fid, i, 7);
city = FGET(fid, i, 8);
other = FGET(fid, i, 9);
// IEを起動してページを開く
IE_OBJ.Navigate(URL);
ie_wait();
tabs(11);
copys(sei, 1);
copys(mei, 1);
copys(huri1, 1);
copys(huri2, 2);
copys(yuu, 1);
copys(pref, 1);
copys(city, 1);
copys(other, 5);
KBD(VK_RETURN);
ie_wait();
sleep(3);
NEXT
FCLOSE( fid )
exitexit;
fend;

//***********************************************************//
// タブ移動
//***********************************************************//
function tabs(num)
IE = GETID("Internet Explorer", "IEFrame");
FOR i = 1 TO num
sckey(IE, VK_TAB);
NEXT
result = true;
fend;

//***********************************************************//
// コピー&ペースト処理
//***********************************************************//
function copys(fid, num)
SENDSTR(0, fid);
KBD(VK_CTRL,DOWN,40);
KBD(VK_V,CLICK,40);
KBD(VK_CTRL,UP,40);
tabs(num);
result = true;
fend;

//***********************************************************//
// ie_wait
//***********************************************************//
procedure ie_wait()
GETTIME();
x_ = G_TIME_SS MOD 5;
ifb x_=1 then
s_ = 2.5;
elseif x_=2 then
s_ = 1;
elseif x_=3 then
s_ = 1.5;
elseif x_=4 then
s_ = 2;
else
s_ = 3;
endif
sleep(s_);
repeat
sleep(0.1);
until(! IE_OBJ.busy) and (IE_OBJ.readystate=4);
SendMessageA(IE_OBJ.Hwnd, WM_ACTIVATE, 0, 0);
sleep(0.2);
fend;

<-- UESCスクリプトここまで -->

 なお、実際に活用する場合は、①TOLOTにログインする、②同じフォルダに「tolot.csv」を設置する、③「NUM_PEOPLE」の値に総人数を入れる必要がある。

Post has attachment
 今月に入ってから「このファイルを開く方法を選んでください」というポップアップが頻繁に出るようになった。(詳細は下記ページ)
https://plus.google.com/u/0/107527620186812837918/posts/L9cGqjiyqeE

 いろいろやったが解決せずに半ば諦めていたのだが、ふとしたことがきっかけであっさり解決した。

 タスク スケジューラのライブラリーを眺めていると、今月になって登録したスクリプトの存在に気付いた。「empty.exe」を30分おきに繰り返すスクリプトである。
 少しだけ嫌な予感がしたのでスクリプトを「実行」してみると、「このファイルを開く方法を選んでください」というポップアップが出た。これだ…

 調べたところ、タスク スケジューラの不具合ということが判明した。
 下記ページの指示に従い、「スクリプト ファイルを、スペースを含まないパスに配置」したところ解決。
https://support.microsoft.com/ja-jp/kb/3046977

 タスク スケジューラへの登録時にスクリプトを「実行」して、確認しなかった自分のミスである。

 下記サイトを参考に「empty.exe」を定期的に繰り返すスクリプトを登録したのだが、「C:\Program Files\empty\」という半角空白を含むパスに置いたのが敗因だった。
http://jutememo.blogspot.jp/2012/01/blog-post_10.html

 それにしても、パスに半角空白を含むのがNGって非常に困る。

Post has attachment
 ここ数日で、職場PC(Win10 pro)を作業中に「このファイルを開く方法を選んでください」というポップアップが突然出てくるようになった。何かのファイルを開くときでなく、普通に 作業している最中に出てくるのだ。再起動しても症状は変わらず。しかも規則性はないようで、鬱陶しいこと、この上ない。

 検索して調べたが有効な解決策は見つからない。
 下記ページとおそらく同症状。
http://answers.microsoft.com/ja-jp/windows/forum/windows_10-performance/%E4%BD%9C%E6%A5%AD%E4%B8%AD%E3%81%AB%E3%81%93/c1f672e5-a65b-4d0f-870f-e73cd97d48f0

 自分のケースでも「Adobe Acrobat Reader DC」がリストアップされるので、何らかの関係がありそう。

  タスクバーの通知領域を確認すると「Adobe Acrobat Reader DC」のアイコンがあった。非表示にしているので普段は気付かなかったが、どうやらアップデートが来ているみたい。クリックして「Adobe Acrobat Reader DC」をアップデートしたところ、「このファイルを開く方法を選んでください」というポップアップが表示されなくなった気配がする。

 これで解決してくれればいいが、もしも「Adobe Acrobat Reader DC」のアップデート通知が原因であるならば、他にやり方があるのではないかと感じたしだい。

【追記1】 残念ながら解決しなかった。他のPCでは生じていないし、何が原因なのだろうか。「Launch Windows App」とか関係あるのかな。

【追記2】解決した。(2016-06-14)
https://plus.google.com/u/0/107527620186812837918/posts/1x54vfFSxbM
Photo

Post has attachment
 Oceansoft「Agenda」が急に起動しなくなった。Windows XPの頃からお世話になっているソフトウェアだが、手帳のように使っているので使えない場合、仕事に多大な支障をきたす。データ自体はDropboxに置き、所有する全端末で同期しているため失う怖れは皆無なのだが…

 一度アンインストールしてからインストールし直したり、互換モード等で起動したりするが、「Agenda」は一向に立ち上がらない。

 公式ページを見ると、以下の記述を発見した。

解像度を変更したときに、データウインドウが表示されなくなった。
画面の外に追いやってしまったようなので、レジストリエディタを起動し、
HKEY_CURRENT_USER\Software\Oceansoft\Agenda\AgendaSub
を削除してみてください。
http://l.tpot.tk/win:agenda:tips:index

 試しに上記フォルダ以下の全てのレジストリを削除したところ、「Agenda」は無事起動した。万歳。「Agenda」をこの先も使い続けることができる。
 Android版「Agenda」もリリースしてほしい…

 最近Win10マシンにやったことメモ。

●「システムと圧縮メモリ」の停止
1. 「タスクマ ネージャー」→「サービス」→「サービス管理ツールを開く」
2. 「Superfetch」を右クリックして「無効」と「停止」を選択
3. PCを再起動

●Windows Defenderの暴走防止
1. 「コントロールパネル」→「小さいアイコン」→「Windows Defender」→「設定」
2. 「除外の追加」→「フォルダーを除外する」
3. 「C:\Program Files\Windows Defender」を追加

●Apacheの起動
1. 「コントロールパネル」→「プログラムと機能」→「Windows の機能の有効化または無効化」
2. 「インターネット インフォメーション サービス」の「World Wide Web サービス」のチェックを外して「OK」をクリック
3. PCを再起動

 javascriptのsort()で思いっきり躓いたのでメモ。オブジェクトの値がハッキリしない場合、手抜きしてはいけない。

【パターン1】※不正解
data.sort(function(b, a) {return b.val-a.val});

【パターン2】※不正解
data.sort(function(b, a) {return Math.floor(b.val)-Math.floor(a.val)});

【パターン3】※正解
data.sort(function(b, a) {return hikaku(b.val)-hikaku(a.val)});
function hikaku(val) {
return (val) ? Math.floor(val) : 0;
}

 パターン1やパターン2において、ソート対象の値が存在しない場合、そのオブジェクトはソートされない。
 そこで、パターン3のように、値が存在しない場合は「0」に置き換える。
Wait while more posts are being loaded