El Capitan で RCS が行方不明な件

ついに引導を渡された、ということでしょうか。

RCS って、確かに化石みたいなもんだけど、生きている化石だと思ってたんですけどね。

vi 並にしぶとく。

まあ、ポンコツのオッサンに今更新しいことを覚えろというのが土台無理な話なわけで。

時代的には、一人が 1 ファイルだけのコードのバージョン管理って、何でやるんですかね?
RCS でいいでしょ、RCS で。

MacPorts も入れてあったと思ったんだけど、そっちの使い方自体忘却の彼方。

$ which port
/opt/local/bin/port

ということで、入って入る模様。

$ port selfupdate
Warning: Your developer_dir setting in macports.conf points to a non-existing directory. Since this is known to cause problems, please correct the setting or comment it and let macports auto-discover the correct path.
---> Updating MacPorts base sources using rsync
Error: /opt/local/bin/port: port selfupdate failed: Error synchronizing MacPorts sources: command execution failed

う、めんどい。

今日は電話案件があったので起きてたんですが、もういい時間なので、さっさと寝たいと思います。

STORES の管理画面がリニューアルされた件

雑貨屋 Hearth & Home 暖炉家(暖炉屋) は STORES という個人のお店用のサービスを使って営業しています。

こういうサイトを一から作るのはそれなりに手間隙がかかるわけで、売れるかどうかもわからない状態で、コストを掛けることはできないし、拙速に行こうということで、サービスが始まった当初に登録して、1 年くらいは開店休業状態だったんですが、2 年ほど前から、本格的に活動を始めたわけです。

ヤフオクも手数料が跳ね上がったので、今までどおりの価格では出品できなくなったのと、簡単取引の仕組みが導入されたたため、すべての出品を一度終了していたのですが、自動出品機能も STORES のほうが変更になったので機能しなくなっていたので、雨で外の仕事ができないので、ごそごそとプログラムを書き直しました。

ほとんど備忘録ですが、JavaScript で変数の汚染の問題があったんですが、とりあえず、無名関数を使って対処するようにしました。

(function(){
    l = [];
    e = document.querySelectorAll('p.quantities_variation_title');
    if (e) {
        for (i = 0; i < e.length; ++i) {
            l.push(e[i].textContent);
        }
    }
    return l.join(';;');
})();

それはそうと、いろいろ調べ物をしていて、今頃知ったんですが、JXA といって、Mac の操作が JavaScript からできるようになっているようです。

Illustrator とかも、JavaScript で自動化できるようですし、Safari 自体も、コンテンツを JavaScript で外部から云々すれば、クロスサイトでの処理も、上の join のようなブサイクなことをしなくても済むので、かなりコーディングが楽になりそうです。

勉強してみようと思いますが、その前に、Raspberry Pi、届いているんですが、micro SD のアダプタがないこと、HDMI で繋がるディスプレイがないこと、この 2 点でテンションが下がって、放置プレイ中です。

忘れるほうが早い年代になってきましたので、忘れないうちにこっちにも時間を割いていこうと思います。

いきなり 3.8 倍速

結局、昨日は昼ごろにうとうとしてしまいました。。。
まあ、台風で仕事にならなかったんで、それそれで悪くなかったんですが。

出典 http://121ware.com

出典 http://121ware.com

で、このところ無線 LAN の具合が悪くて、ストレスがたまってるって この前書いた件 ですが、結局、当初の予定通り、WG1200HP を購入しました。

ブリッジモードにスイッチを切り替えてつないだだけ。

画像で見るとコソコソ大きさがあるのかと思ったんですが、手のひらサイズで、今まで使用してきた WR8165N に比べて薄くなっているので、容積でいえば、かえって小さいくらいに感じました。

壁掛けなどもできるようになっているし、付属するケーブルも短くて、そこは無駄がなくていいようにも思うんですが、ただ、ケーブル自体は太いし、AC アダプタのコードは長いので、うちの場合は、イーサネットはコンセントに埋め込んであるので、アダプタの方のケーブルがタップリと余っちゃってますね。。。
まあ、コード類の長さはどれくらいが最適なのか、というのは永遠のテーマでしょうが、アダプタの場合は、LAN ケーブルとは違って、短くてもそのへんで売ってない、というのがあるから必然的に眺めにせざるをえないのでしょうね。

さて、肝心の速度の変化です。

アップロードは元からストレスは感じていなかったんですが、ダウンロードが 27.84Mbps → 106.2Mbps と 3.8 倍ほど速くなりました。

ネットからの転送なので、ローカルでの転送だと、もっと差がつくかもしれませんね。

iPad でのビデオの視聴なんかも、試してみた範囲で、もたつく印象もすっかりなくなりました。

Mac で通信が時々できなくなる症状も、昨日の晩に届いて設置してから、という限られた時間の中では今のところは発生していません。

今回の件では、新しい規格も出て、速度が上がったりもあるし、毎日使うものでもあるので、やはりある程度の間隔で更新したほうがこういうインフラは良い、と思い強く感じました。

仮に 3 年使ったとすれば、電気代と合わせるとだいたい 12,000 円くらい、月 320 円、一日 11 円ってことになりますね。
高いか安いか、微妙ではあるんですが、ネットの回線の月々の料金はもっとするわけなので、そこそこ快適に使わないと、意味が無いですね。

そういう意味では、iPhone も 2 年になるし、Mac も 2 年くらい経つのかな?
まあ、iPhone は 7 になるまで粘ろうと思うし、Mac も全く不満はないので、今すぐって気は全くないんですが、そろそろ検討を始め他方が良さげです。
当然、お金も貯めておかないとなんで、コツコツ行こうと思います。

無線 LAN の具合が悪い件

出典 http://121ware.com

出典 http://121ware.com

自宅では、NEC の WR8165N を使っています。

この機種をチョイスした理由なんですが、消費電力が最大 3W と非常に少ないこと、そして中継機能があることです。

神社では、Apple の AirMac を使っていたんですが、寿命で 1 台壊れたため、安価な WR8165N に置き換えました。

しかし、社務所は基本的にスチール製の雨戸を閉めてあるため、電波が飛びづらく、親機をハイパワータイプに交換し、余ったものを自宅で使っていたんです。

が、最近、たまに途切れるようになりました。
特に Mac Book Pro が切れるので、ネットで検索して、書いてあることは試してみたてはいるんですが、劇的に改善ってことはないんです。
ただ、気のせいだか、10.10.5 (14F27) にしてからは、切れなくなった気もしないでもない。

神社では、同じ WR8165N を使っていますし、そちらは環境が中継なのですが、問題が発生していないことから、原因は、個体の問題と思うので、新しく買い直そうかと思っているんですが、結構、種類が多くて悩みます。

出典 http://121ware.com

出典 http://121ware.com

今のところ、WG1200HP が最有力候補で、価格はざっと調べたところ、コジマ Yahoo! 店 で 7,460円 が T ポイントを考慮すると最安でした。

WG1200HP は、WG1200HS よりも若干高いのですが、中継機能があり、最大 3 世代まで中継できる、つまり、親 → 子 → 孫 → ひ孫、ということで、神社で使うとしても、境内をほぼ確実にカバーできる能力があるのが魅力です。

最上位モデルの WG2600HP はとても高速っぽいんですが、本体の価格も高く、それと同時に消費電力も 32W にもなります。

32W だと、1 年間で 280kWh も電気を消費します。1kWh を仮に 25 円としても、7,000 円ほど電気代がかることになるわけです。
製品の寿命を 3 年程度と考えると、概ね電気代は、端末の市場価格と同程度、ということになるので、高い端末は、その後も高いので、本当に必要な性能かどうか、よく考える必要がありますね。

そういう意味では、自宅では、WG1200HP でも過剰かなとは思うんですが、昔買って放置してあった nasne をようやく使い始めて、そっちで 5GHz 帯を使ってみたいというのがあるので、ほぼ決めかけてはいるんですが、消費電力が 8W と倍以上になるので、ちょっとそこのところが悩ましい限りです。

まあ、使えないほど頻繁に途切れるわけではないので、WR8165N がモデルチェンジするなり、それに相当するモデルが出るまで粘るってのも、現状選択肢ですが。

毎日使うものだし、悩むほど高いものでもないんだけどね。

画像形式を変換するコマンド

最近本当に忘れっぽくて困ります。

さて、本日のお題は、表題のとおりなんですが、STORES.jp に出品している商品をベースとして、ヤフー店にも、商品を転送?しているわけですが、スクリプトがエラーになりました。

まあ、商品の登録時に気をつけておけばいいことではあるんですが、この調子だといつまでも覚えてないと思うので、また同じ轍を踏むのは確実です。

というわけで、スクリプト自体を書き換えました。

エラーの原因は、いくつかあって、STORES の方は、JPEG 以外にも、PNG などの形式が OK なんですが、ヤフー店は、JPEG か GIF ということになっているためです。

それ以前に、スクリプト自体が JPEG である前提でした。

set myNumImages to do JavaScript "document.querySelectorAll('li>img[src*=hearthandhome]').length"
if myNumImages > 3 then set myNumImages to 3

set myPath to do shell script "echo ~/Pictures/STORES/" & myItemId
try
    do shell script "mkdir " & myPath
end try
do shell script "open " & myPath

repeat with myImageIndex from myNumImages to 1 by -1
    set myImageFileName to do JavaScript "document.querySelectorAll('li>img[ng-src*=hearthandhome]')[" & myImageIndex - 1 & "].src.replace(/^.+[/]|_100x100/g,'')"
    
    set myImagePath to myPath & "/" & myImageIndex & ".jepg"
    set myImageURL to "https://f.stores.jp/_files/hearthandhome/" & myImageFileName
    
    do shell script "/sw/bin/wget --no-check-certificate " & myImageURL & " -O " & myImagePath
    
    if myImageFileName ends with ".jpeg" is false then
        do shell script "sips -s format jpeg " & myImagePath
    end if
end repeat

やっつけなので汚いですが、とりあえず動きました。

今度の改築で、自動的に png があると jpeg に変換されるので、その画像にすげ替えれば、次からは問題ないかと。

えらく振りが長くてすみません。

肝心のコマンドですが、sips です。

sips コマンドは、記憶が確かなら海上忍氏の 連載記事 で知ったと思うんですけど、あれ、344 回も続いたんですね。

当該記事は、こちら です。

2003/12/05 の記事でしたので、かれこれ 12 年ほど前ですか。
まあ、よく覚えていたというべきか、それともやっぱり耄碌したと考えるべきか。

というか、OS X になってからもうそんなに経つんですかね。
そういえば、Preview Release は嫁さんと新宿新南口の高島屋に買いに行ったような記憶があります。
Cheater のリリースは 2001 年だったのようですから、子供が生まれる前ですね。
いやはや、長生きしたものです。

今更ながら JavaScript で半角 → 全角

まあ、半角・全角という表現がアレなのはおいておいてください。

最近、郵送にクリックポストという手段を使うのですが、ヤマトのメール便に似た感じのサービスで、A4 サイズ、3cm までの厚みのものが安価に送れます。

ウェブで送り先などを入力して、ラベルを作成するんですが、ある程度の数になると、それが結構面倒臭いんですよね。

需要があるのか、さっぱりわかりませんが、重松は住所録ソフトは筆まめを使っているんですが、その筆まめの住所データーをいちいち Windows と Mac とを切り替えながらコピペするのも面倒くさいので、自動化しました。

その時、住所は半角があってはいけないので、変換する必要があるんですが、以前は、Script Managaer を使って変換していたんですけど、もう OSAX がどっかに行ってしまっているし、JavaScript でやることにしました。

以下のページを参考にしました。

tell application "Finder"
    set myText to the clipboard
end tell

tell application "Safari"
    set myClickPostDocument to 0
    
    set myNumOfDocuments to count every document
    repeat with myDocumentNum from 1 to myNumOfDocuments
        set theDocumentTitle to do JavaScript "document.title" in document myDocumentNum
        if theDocumentTitle contains "新規発送" then
            set myClickPostDocument to myDocumentNum
            exit repeat
        end if
    end repeat
    
    if myClickPostDocument is 0 then
        say "click post document was not found"
        return
    end if
    
    tell application "Finder" to set myClip to the clipboard
    set buf to AppleScript's text item delimiters
    set AppleScript's text item delimiters to " "
    set myData to every text item of myClip
    set AppleScript's text item delimiters to buf
        
    set myName to item 4 of myData
    set myZip to item 67 of myData
    set myAddr to item 68 of myData
    if 0 < (length of (item 69 of myData)) then set myAddr to myAddr & item 69 of myData
    
    tell document myClickPostDocument
        do JavaScript "
document.querySelector('div.edit_panel input[name$=id39]').value='おふだ';
document.querySelector('div.edit_panel input[name$=no_missive]').checked=true;
document.querySelector('div.edit_panel input[name$=checked_pack_size]').checked=true;

myZip = '" & myZip & "';

document.querySelector('div.edit_panel input[name$=zip1]').value = myZip.substr(0,3);
document.querySelector('div.edit_panel input[name$=zip2]').value = myZip.substr(4,4);

myAddr = '" & myAddr & "'.replace(/[!-~]/g, function(s) {
    return String.fromCharCode(s.charCodeAt(0) + 0xFEE0);
});
myAddr = myAddr.replace(/^愛媛県/,'');
document.querySelector('div.edit_panel textarea[name$=receiver_address]').value = myAddr;

myName = '" & myName & "';
document.querySelector('div.edit_panel input[name$=receiver_name]').value = myName;
"
    end tell
end tell