2010/07/27

Firefox4でBloggerのプレビュー

Firefox 4

ChromeやFirefox3

Blogger in Draftでは投稿のプレビューが新しいウィンドウ(タブ)で表示されます。その際、左上に帯状の「プレビュー」という表示があるのですが、Firefox4だとちょっとスタイルが崩れてますね。

CSSの仕様でしょうか。とくに実害はありませんが。

Firefox4見た目調整

@namespace url("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"); #appmenu-button-container{ display : none !important; } #navigator-toolbox[tabsontop="true"] #TabsToolbar{ padding-left: 0 !important; padding-top: 1px !important; margin-left: -3px !important; } #bookmarks-menu-button { display : none ! important; }

タブをアドレスバーの上に移動(標準機能)して、メニューバーを非表示(標準機能)にし、プルダウン化されるメニューボタンを非表示(userChrome.css)にしてます。ついでブックマークバーを従来のブックマークツールバー化(標準機能)し、アドレスバーの横に配置(標準機能)し、ブックマークツールバーのボタンも消しました(userChrome.css)。

以前心配していた、タイトルバーがなくなるので押す場所が無くなるというのはXPだと関係なかったのですが、折角なのでAutoHotkeyで消しました。

toggleTitleBar() { global WinSet, Style, ^0x00C00000, ahk_id %target% }

"target"というglobal変数にFirefoxのウィンドウハンドルが入っている前提です。

タイトルバーが無いとウィンドウの移動が出来ないので、予めウィンドウ移動用のマクロなんかも併用していないと不便なだけだと思います。

参考:

2010/07/20

MT4で大量のオブジェクトを消す

MetaTrader4で大量のテキストオブジェクトをループで削除する際に、必ず一定数が消えずに残る。という現象にはまったのでメモ。

オブジェクト総数が不明の場合に、総当りの処理をするには、"ObjectsTotal"を使います。ヘルプを見るとサンプルコードが載っています。これが罠ですが。

int obj_total=ObjectsTotal(); string name; for(int i=0;i<obj_total;i++) { name=ObjectName(i); Print(i,"Object name for object #",i," is " + name); }

オブジェクトはindex番号で探しますが、削除する関数"ObjectDelete"では名前で対象を指定します。なので、あわせるとこんな感じになります。

int obj_total=ObjectsTotal(); string name; for(int i=0;i<obj_total;i++) { name=ObjectName(i); ObjectDelete(name); }

これで消えるかと思ったら、消えません。index番号をログに出して見ると必ず後半半分が失敗します。600個なら300個、300個なら150個消え残ります。

どうも、ObjectDeleteは削除するたびにオブジェクト配列を一つ前にシフトするみたいです。考えて見れば当たり前ですが。

object[0] = "a" object[1] = "b" object[2] = "c" object[3] = "d" for (int i=0; i<4; i++) { name = ObjectName(i); ObjectDelete(name); }

このような配列をループで消す場合のイメージですが、

//1周目 i==0 name == "a" //削除後の配列 object[0] = "b" object[1] = "c" object[2] = "d" //2周目 i==1 name == "c" //削除後の配列 object[0] = "b" object[1] = "d" //3周目 i==2 name == "" // GetError() == 4202:ERR_OBJECT_DOES_NOT_EXIST //削除後の配列 object[0] = "b" object[1] = "d" //4周目 i==3 name == "" // GetError() == 4202:ERR_OBJECT_DOES_NOT_EXIST //削除後の配列 object[0] = "b" object[1] = "d"

ベタなオチですが、MTは配列の操作を暗黙的に行う場合が多いので気づかないとハマりますね。コードが"objects.shift()"なら気が付いたかもしれませんが。

結局、全部消す場合、後ろからデクリメントしていくか、だるま落としの様に常に0を消していくかですかね。

int obj_total=ObjectsTotal(); string name; for(int i=obj_total-1;0<=i;i--) // デクリメント { name=ObjectName(i); ObjectDelete(name); } int obj_total=ObjectsTotal(); string name; for(int i=0;i<obj_total;i++) { name=ObjectName(0); // 常に先頭の要素 ObjectDelete(name); }

試してませんが、後者の方が負荷大きそうな気がしますね。

2010/07/19

Firefoxのプロファイルが飛んだ

4のbeta1を試そうと、普段あまり使わないプロファイルマネージャとかを使ってたら、うっかりプロファイルを消してしまいました。

プロファイルマネージャで新規プロファイル作成時に、作成フォルダを一度変更してしまうと、デフォルトパスに戻してもサブフォルダが作成されず、階層がずれる、と言う仕様みたいです。

デフォルトでプロファイルマネージャは

C:\Documents and Settings\{user}\Application Data\Mozilla\Firefox\Profiles というフォルダの下にユーザ別に {hash data}.{user name} というフォルダを作ります。例えば wu9zgrrz.KNYI Jong

といったフォルダです。

その為、プロファイルマネージャで[Create Profile] > [Next > ] > [Choose Folder]を選ぶと上記の"Profiles"フォルダが選択された状態になっています。

普通この状態で[Choose Folder]の上にあるユーザ名入力欄にユーザ名を設定し、[Finish]ボタンを押すと、"Profiles"の下にユーザ名でサブフォルダが作成され、その下に各種ファイルが展開されます。

ユーザ名の入力欄のすぐ下にフルパスが表示されていて、ユーザ名の入力がリアルタイムでパス(の末尾)に反映されるので、サブフォルダ名は[Finish]押下前に確認可能です。

ところが、

  1. [Choose Folder]で別のフォルダを選択
  2. ユーザ名を設定
  3. [Choose Folder]で元のデフォルトフォルダに戻す
  4. [Finish]押下

とすると、サブフォルダが作成されず、"Profiles"直下にファイルが展開されてしまいます。

そのため、プロファイルマネージャで[Delete Profile]する際に、[Delete Files]を選んでしまうと、"Profiles"配下のファイルが全部削除されてしまいます。

Profiles\ ← 新規作成したユーザフォルダ Profiles\xxxxxx.UserA\ ←既存ユーザAのフォルダ Profiles\yyyyyy.UserB\ ←既存ユーザBのフォルダ

となっているため、新規作成したユーザを削除すると、巻き添えで既存ユーザフォルダまで削除されます。しかもゴミ箱にも入らず、復元ソフトでも見つかりませんでした。

本来"Profiles"直下はサブフォルダしかなく、こまごました大量のファイルは置いていない見たいなので、そういったファイルがある人は削除時に要注意です。

これ自体は恐らく仕様でしょうが、サブフォルダを作ったり作らなかったりが変更されるのであれば、その点にもう少し注視されるような警告が欲しいところです。

一度フォルダを移動してしまうと、ユーザ名の変更がフルパスの末尾に反映されなくなります。しかし、これは反映される状態とされない状態を両方知っていないと気づかない差ですし、知っていても気づかない場合も予想される、地味な表示です。

また、[User Default Folder]という選択肢があり、こちらのボタンを使ってデフォルトに戻すとサブフォルダが作成されるように戻ります。

にも関わらず、[Choose Folder]を開くたびに、デフォルトの"Profiles"が自動で選択され、そちらで[OK]を押して元のフォルダに戻しても、サブフォルダは作成されないままです。

ちょっと詰めが甘いというか、仕様が錯綜している気がします。

2010/07/18

マウスジェスチャの様なランチャ

Launcher_As_Gesture

AutoHotkeyスクリプトで出来たランチャもどきです。

マウスの右クリックを乗っ取って、押した瞬間ポインタの下に3×3のパネルを開きます。

右ボタンを押したまま、マウスをどこかのパネルの上に移動してから離すとパネルの内容が実行されます。

赤枠パネルの上に持っていくと、そのパネル位置を中心として更にもう一段3×3のパネルを開きます。

影が無いので解り難いですが、最初のパネルの右上にある[Windowメニュー]の上にポイントして、2枚目のパネルを開いた所です。

パネルを多段展開する事で、マウスジェスチャの↑→↑↑といった長いコマンドを見ながら探せます。覚えてるコマンドは見ないでも出来ますし、忘れていたら見ながらも出来ます。ジェスチャって全部覚えられませんよね、というコンセプトです。

随分前から考えていたんですが、特に必要性は無かったのでずっと作ってなかった物です。リンク先エントリ書いた時点(2009-03)で思い立ってから随分たっているので構想だけ二年以上してたのかもしれません。

重い腰上げて作る気になったのは、Firefox4でタイトルバーが極端に狭くなるらしい事が解ったからです。chromeもそうですが、タブバーが上に来ると、ほぼ同じ内容を表示しているタイトルバーは要らなくなりますので、枠線といえるほど狭くなります。

ここ数年、最小化/最大化/閉じるボタンなどを押すのが億劫なため、タイトルバー全体のどこでも右クリックしたら最小化、中クリックしたら閉じる、といった動作を割り当てていたのですが、利用頻度の最も高いFirefoxでそれが出来なくなると由々しき事態です。

そもそもウィンドウ操作って全面的に改良の余地がありそうなもんです。タッチパネルが流行ってきたので、PCでもマウス二個持ちでフリックやピンチしてもいいですし。基本、ウィンドウ内のコンテンツ操作より、ウィンドウ操作の方が多い場合、ウィンドウ上の何処でもダブルクリックしたら最大化や最小化、Win+クリックしたら従来の操作とかでもアプリによってはそんな困らない気がします。ウィンドウ操作モードとコンテンツ操作モードのトグルとピン(固定)が上手くできればどうとでも。

これも全く緊急性がないので、構想だけはしますが、多分必要になるまで仕掛からないでしょう。

2010/07/09

Firefox固有のホイール移動量を設定する

マウスを変えてから、ホイールの移動量が大きすぎて微調整が難しくなっていたのですが、Firefoxにはシステム設定を無視して移動量を調整する項目がありました。

prefsにある"mousewheel.with*"で始まる項目です。withとあるのはCtrl/Shift/Altを押しながらホイールを回した場合の動作などがあるためです。キーを組み合わせない単純なホイール移動は"with no key"です。

mousewheel.withnokey.sysnumlines
システム上の設定を使う場合true、無視する場合false(多分)。
mousewheel.withnokey.numlines
上記をfalse(無視)にした場合に、Firefox固有の移動量を設定する行数。

どちらもabout:configから見れば、キー自体はデフォルトで存在します。Configuration Mania :: Add-ons for Firefoxなどを利用すれば、prefsを直接いじらなくても設定可能です。

MagicMouseなどの正規のドライバーが貧弱なマウスだと、ホイール移動量を調整する項目が見当たらなかったりします。Explorerなどの場合、微調整自体必要ないのですが、ブラウザの場合、長文を読んでる最中にちょっと回したつもりが、ゴソっと移動して何処まで読んだか見失ったりします。

設定が必要なこと自体、面倒といえば面倒です。しかし微調整の可能なブラウザを使っている事でその他(マウスなど)の選択肢が広がると考えれば、それがFirefoxを使っている理由にもなると思います。

2010/07/06

Nドライブ

NドライブはNAVERという韓国大手ポータルが提供しているサービスの中の一つで、カバーしている機能的にはdropboxと同じです。

オンラインのディスクスペースとして5GBを提供。閲覧環境は以下の3通り

  • ブラウザ
  • Explorer
  • iPhoneアプリ

dropboxと一緒ですね。

ユーザ登録あれこれ

  • △メアド+パスワード
  • ×OpenID不可
  • ○Gmailのエイリアスexample+xxx@gmail.comは利用可能
  • ○ユーザ名:全角利用可能、変更は不可
  • ○その他:ニュースレター購読、追加情報入力(性別、生年、住所(都道府県のみ))は任意

インタフェースあれこれ

  • △ExplorerはNドライブ固定
  • △常駐アプリのログイン時にCookieの確認ポップアップ(IEのCookie?)
  • ○全体的にI/Fの完成度は高い
  • ○スライドショーなどのビューア機能が提供されている
  • ○利用ガイドが利用開始時にフォルダ内にdocファイルで置いてある

色々こまごましたところで気が利いている印象です。

一番期待したのはファイル共有で、dropboxのiPhoneアプリでは複数の写真を選択して、まとめてアップロード出来ないので、替わりにならないかという点です。

残念ながらdropboxよりは若干楽ですが、カメラロール内で複数選択が出来ないので不便さは解消されませんでした。

iPhoneが公式にWi-Fi同期出来るのを待った方が早いでしょうか。

Bloggerにサーバサイドの統計機能

Blogger: ダッシュボード
http://www.blogger.com/home
Blogger in Draft:ダッシュボード
http://draft.blogger.com/home

BloggerにおいてGmailなどのLabs機能に相当する"Blogger in Draft"はアクセスURLを切り替えるだけで使えるので、ちょっと試すのに便利ですが、ここ最近は実用的で面白い機能もよく出てくるので、デフォルトにしてしまってもいい感じです。

最近使えるようになった統計も、Analyticsと違って埋め込みコードが不要で、しかもdraftを使っていなかったユーザでも、統計機能の提供当初からのデータが見られるみたいです。

ただ、私のブログで見る限り、Analyticsとdraft内の統計では日単位のページビューに倍近い差があります。

とくにIT系のブログだと閲覧者にAdblockやNoScript系の機能を使う人が多そうなので、埋め込みコードで集められるカウントと、サーバサイドで数えるリクエスト回数のカウントには差があるのかもしれません。

時間帯別の閲覧数やページ毎の閲覧数などを正確に知りたい場合はサーバサイドの統計が有効でしょうが、モニタサイズ、OSやブラウザなどユーザ環境を知るにはクライアントサイド(から送られるスクリプト)の統計が有効になるんでしょうか。

ちゃんと分析するのなら、その辺使い分けないといけないんでしょうね。

2010/07/04

後で調べる iOS4の不具合

iOS4にしてから、[設定]>[一般]を開くとフリーズして設定アプリ?が落ちるようになりました。

  • 再起動→改善なし
  • ソフトリセット→改善なし
  • 設定リセット→[一般]の下にあるので実行不可
  • 工場出荷状態に復元→改善
  • バックアップから設定を復元→エラー再現

設定項目の内容が新しい設定画面では存在しない選択肢になってるとかそんなんでしょうか。

他に心当たりとしては、iPhone構成ユーティリティ(iCU:iPhone Configuration Utility)からインストールした自作プロファイルです。
柔軟材: iPhoneをルータ無しにWi-Fi接続する

iCUからプロファイルを作成すると、パスコードやWi-Fiの設定のテンプレートを複数のiPhoneで共有できるので、企業ユーザなどは便利だそうです。私は自宅のWi-Fi設定用に入れてました。

なので、とりあえずプロファイルを削除しようとした所、別の問題が発生しました。久しぶりに起動したiCUがエラーになります。

去年インストールしたバージョンは2.0.xですが、その時点では当然問題なく起動できています。

2.0.x
  • 起動時に何かエラーポップアップの音がでるが、表示されない。
  • 起動後にiPhoneを認識しない。
  • "kAMDUndefinederror"なんたらというエラーが出ることがある。
  • メモリのread/writeがプロテクトされてうんぬんといわれ、プロファイルが更新できない

Apple - Support - Discussions - Iphone 3G kAMDUndefinederror Error ...

Apple Software Updateで検索すると、2.1が見つかります

2.1.x
同上。改善せず

最新版にすると直るという話もあるようなので、Appleのサイトで最新版を落としてくると、2.2が手に入ります。Software Updateが2.1なのはなんなんでしょう。
iPhone 構成ユーティリティ 2.2 (Windows)

2.2
iPhone構成ユーティリティは[Apple Mobile Device Support]を検出できませんでした。うんぬん言われ、起動すら出来なくなる。

悪化しました。全く同じような質問をされている方が居ますが、未解決みたいです。
Apple - Support - Discussions - iPhone Configuration Utility startup ...

リンク先にあるようなDLLの問題は出ていないのですが、起動はしません。

  • プログラムの追加と削除からiCUの[修正]
  • 同[削除]→再インストール
  • iTunesからなにから全部削除
  • 一式再インストール
  • Windowsアップデート(特に.net Framewark)の更新
  • セキュリティソフトの停止
  • 各ステップで再起動

しても検出されません。

Apple Mobile Device SupportはiPhoneなどを物理的に接続した際に検出するサービス(バックグラウンドプロセス)の様で、プロセス名は"AppleMobileDeviceService.exe"ですが、サービスは起動していますし、起動設定は[自動]ですし、タスクマネージャから存在も確認できますし、iTunesからはiPod nanoもiPhoneも認識します。

と言うわけで、残された解決手段は

iCUも設定アプリも使わずにプロファイルを削除する手段を探す
ぱっとみ見当たらない
工場出荷状態にリセットして、復元せずに手作業で全部再設定する
SMS/MMSのバックアップなどが面倒
iCUが更新されて直るのを待つ
一番楽だが、不確実

旧バージョのiTunesを入れなおして、Apple Mobile Device Supportフォルダだけ差し替えるという手段もあるようですが、面倒なのでまだ試してません。
iTunes 8.2 にアップしたら iPod touch と同期できなくなった ≪ ogaoga.org

もし、勝手プロファイルを入れている人が居たら、iOSおよびiTunesの更新前に一度消した方が良いかもしれません。

[設定]>[一般]が使えないのは若干不便ですが、喫緊の問題は無いので修正を待ちます。