デスクトップPCにWindows8をインストールするメリットが分からん

デジイチやコンデジの画像管理に使っているSONYのPlayMemories Homeがバージョンアップした、とお知らせに表示されてたので、更新してみた。Windows8に対応したんだろうけど、これまた、パソコンユーザーには使い物にならんほどの改悪。

PMB(Picture motion browser)時代から使っているんだけど、なんつーか、

バージョンアップする毎に、使えないクソあぷり化しとる。

なんで、プレビュー画面から、選択している「画像の編集」にプレビューしている画像を追加できひんの??? フツー、プレビューしてから編集するもんでしょ? そのための”プレ”ビューでしょ?、なんで画像を個別に外部プログラム(Photoshopとか、Image Data Coverterとか)に渡して起動できへんの?

どうやったらこんなUXを考えつくんだ? バカなの? アホなの?

と、不満タラタラ、言いつつ、渋々使ってる僕は、ソニー信者。ハードウェア(製品)のデキが良いなら、ソフトウェア(アプリ)なんて、クソでも良いんです!(笑)

まぁ、どうでもいい話。

マイクロソフトによると、Windows8はWindows7より、より少ないリソースで高速に動作し、性能がいいらしい。
実際、5~6年前のPCで、メモリが1GBぐらいでもキビキビ動く。らしい。

そりゃもともとあった機能をジャンジャカ削ったんだからキビキビ動くだろうさ(^^;;; あ、なんかエアロ廃止とかあったけど、エアロライトってテーマがあるみたいじゃないですか。結局残したのね。

でも、わざわざWindows7から8にバージョンアップさせるメリットが今ひとつ見えない。何よりデスクトップOSとしては、非常に見栄えがよろしくない。

PCメーカー各社も、インテルが提唱しているウルトラブックのような製品をリリースしてCMもバンバン流れているけど・・・ノートPCを外で使いたい人は、外でもデスクトップOSを使いたいのであって、タブレット的な使い方をしたいのなら、それこそ2~3万円で驚くほど高精細な液晶とそこそこの性能持つタブレット端末が飽和的にリリースされているんだから、そっちを買って使う方がスマートでしょ?(ホントか?)

それに、Windowsというネーミングがタブレット向けじゃない。Windowsはもう、パソコンの代名詞的な用語になっちゃったんだから。 iPhoneのOSは、iOSであって、MacOSではない。そういうことだと思う。タブレット端末に、PCとの互換性を求める人はマイノリティーじゃないかと。思うんですが、どうなんでしょう。
タブレット端末という製品の位置づけが、マイクロソフトにとって、「所詮はノートパソコンの延長でそ?」みたいな考え方しているとしか思えない。でも、ま、最近のアップルの動向を見ると、MacOSとiOSを統合しよう、みたいな臭いが漂ってますが。

Windows8はさしずめ、家電製品で一時期意味も無くプッシュされていた3Dテレビみたいな、存在になるんじゃないか?3Dテレビは、ホント要らん機能だった。僕にとってはね。

まぁ、何が言いたいのかというと・・・・

Windows8のデスクトップPCは買わない!

ってこと。

そろそろ5年前に買ったパソコンを買い替えたくなってきた。DELLにするかレノボにするかエプソンにするか・・・ホントどうでもいい。

ID値がグローバル変数に自動追加される

超初歩的なことに、はまってしまった。自分自身の備忘録として残しておこう。

自分で組んだjavascriptコードが chrome で動いたり動かなかったりしたことがきっかけだった。
そのスクリプトは、ブラウザ判定をしてて、chrome、いえ、webkit の検出に以下のようなコードを使用していた。
これ自体は、グーグル検索で辿り着いた、W3G(world wide web guide)というサイトに掲載されていたものを丸々拝借させてもらいました。

// chrome/safari等のオブジェクトを使った判別。
(function(undefined)
{
  var isWebkit = !document.uniqueID && !window.opera && !window.sidebar && window.localStorage && window.orientation === undefined;
})();

さて、ここで、chromeでアクセスしているにもかかわらず、HTMLファイルによってはtrueになったりfalseになったりして ????という状態で、falseと判定されるHTMLを開いてブラウザのコンソールで、調べていったら、 !window.sidebarfalseになることが判明。

これでピンときた(思い出した)。

あ!、HTMLファイルのある要素(DIVタグ)に id=”sidebar” って属性をつけてるわ・・・。

とほほ。ご存じのように、タグのid属性に指定した値は、グローバル変数に(厳密に言うと、windowオブジェクト)に追加されるんだった・・・orz

いや、確かに昔、Internet Explorer が中心だったころ、よくこれでラクしてたんだよな・・・最近は、document.getElementByIdというDOMメソッドを使用することがほとんどだったので忘れてた。でもIEならともかく・・・webkitでこれに直面するとわおもわなんだ。

結局、元になるHTMLファイルから、sidebar という名のid属性値を、違う値に全部変更することで一件落着。

これから、タグにid属性を含めるときは、必ずハイフンを使用した値にするようにしよう・・・と固く誓うのであった・・・。
というより、こんなIEの独自仕様は端っからwebkitから消し去ってくれればいいのに・・・。

iPadで簡易”view-source”

撮影した写真をその場で確認したり、机の前に置いて見るだけの高価なフォトフレーム化しているiPad(^^;;

先日、iPadのブラウザでホームページを巡回していたら、ちょっと気になったページがあって、HTMLソースを見ようとしたら・・・・見れない。というか、iPadのSafariは、ソースを見ることができない・・・。ダメ元で、アドレスバーに “view-source:http://hoge~ “と入力してみたけど、「アドレスが無効です」とかいうエラー。ま、当然やな。

しょうがないので、ブックマークレットでなんとかやってみる。

とりあえず、どこかのページを開いてブックマークを追加し、ブックマークの編集でURLに以下をコピペ。

javascript:(function(){var w=window.open();var d=w.document.open();var t=window.document.getElementsByTagName("html").item(0).outerHTML; t=t.replace(/</g,"&lt;");t=t.replace(/>/g,"&gt;");t=t.replace(/ /g,"&nbsp;");t=t.replace(/\n/g,"<br>"); t=t.replace(/\t/g,"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"); d.writeln("<!doctype html>");d.writeln("<html><head><title>View-Source</title><style type='text/css'><!-- body{font-size:12pt;} --></style><body>",t,"</body></html>");})();

やってることは、<,>と空白、タブ、改行をエスケープして貼り付けてるだけ。TextNodeを生成して<pre>タグに放り込めばもっと短くなるんだけど、非常に長い行があるソースだと改行されず非常に見づらいのであえてメタ文字をエスケープしてBODY要素に放り込んでます。

検索すると、ソースそのものを外部サーバーに送って整形する・・・という手法が一般的みたいですが、「ちょっとだけ確認したいんや!」という用途にはちょうどいいかな、と自己納得w

そういえば・・・ iPad mini って出るんですかね?出ても買えないけど。

思いがけず、iPhone5をゲット

10月中ぐらいには、手に入ればな~、 なんて思いで会社事務所近くの家電量販店で予約した。そのときの対応してくれたおねーさんの口ぶりで、初日は無理、みたいな雰囲気を感じた。まぁ、田舎の地方都市なんてそんなもん。順番が「3」だった。

で、昨夕、見知らぬ番号から着信があり、出てみると、「入荷しましたので・・・」 (^^;;;
お金用意してないよ・・・なんてこったい。銀行に行く時間がない。
j-Debit で支払可能かどうか聞いたらOKだったので銀行のキャッシュカードで支払った。

最寄り駅前でLTEが立った!(^^) けど、会社事務所と自宅は残念ながら3Gのみ。

さて、肝心の使い心地は・・・・・・・正直、iOS 5にダウングレードしたい・・・。

色んなサイトで言われていると思いますが、以下の点がどうしようもなく使い勝手が悪い。

  1. マップがチープすぎる。はやくGoogleマップ出してくれ。
    – 方向音痴なんで、街に出たとき非常に困る!
  2. ミュージック内のプレイリストに登録したmp4(動画ファイル)が、見えない。
    –  なんちゅー仕様や!
    – 追記(2012/10/11) 該当ファイルの種類を”ミュージックビデオ”にすると見えるようになるらしい。今になってこんな気まぐれ的な仕様変更するとわ・・・ミュージックアプリの開発者が変わったのか?
  3. youtube 消えた。
    – 別途アプリをインストールしたけど、前のんの方が断然良かった・・・。
  4. バックアップから復元したら、購入したアプリが1,2個消えた。
    – 購入済みにも載ってない。なんで?単にバージョンチェックがかかってiOS6端末から見えないだけ?わからん。結局USBで接続してiTunesから追加した。
  5. など、挙げたらキリがないのでやめる。

薄くなったのはいいけど、僕的に軽くなったのはイマイチ。ちょっと重いぐらいの方が良かった。

とりあえず、980円のバンパー購入したけど、週末もっといいの探しに行こう。

C#でWordPressのエクスポートファイルを取得する

とある業務ソフトのヘルプをWordpressのブログシステム上で作成しよう、ということになってまして、まぁ、フツーはそのWordpressをユーザー認証をかけて、そのまま公開すれば話は済むんですが・・・普通はね・・・。でもクローズドな環境にも対応しなければいけません! とかいう、メンドクサイ仕様になってまして・・・。
それなら、Wordpressなんか使う必要あらへん、ホームページビルダなり、なんなり、使いやすいソフトにすればいいじゃねーの? とフツーはなるんですが・・・。
まぁ、ヘルプ作成について色んな方法を僕がいくら提案しても受け入れてくれないのは分かっているので、グダグダ文句を言っても始まりません。 結局は、ヘルプファイル(HTML)はローカルに置けるように、Wordpressの記事をすべてHTMLに落とすという全くもって本末転倒&意味不明のプログラムを組むことで落ち着きました。

はじめは、そんなの誰かがもうやってるだろう・・・とググったけど、探し方がまずいのか、ヒットしません。ま、そりゃ、そーだよな、わざわざWordpressの記事を全部HTMLに落とすなんてこと・・・する必要もねーし、そんなヘルプの作成の仕方しているの素人集団のウチだけだよな。

ま、グチを言ってても始まりません(笑)

WordPressはXML-RPCをサポートしてますので、XML-RPCで・・・と思ったんですが、Wordpressが吐き出すWXR形式のエクスポートファイル(XML)をダウンロードしてパースした方が早いんじゃねーの? という根拠のない脳内ベンチを信じて、C#で組み始めることに。

エクスポートファイルをパースしてHTMLファイルを一気に吐き出すコードは簡単にできたんですが、エクスポートファイルをWordpressから排出させるところで躓いた。

サーバー上のWordpressへのアクセスに System.Net.WebClient クラスを使ったんですが・・・ログイン処理、具体的にはクッキー処理がうまく行かず、ちょっと時間がかかってしまいました。ネットで検索して出てくる、WebClientを継承して、GetRequestメソッドをオーバーライドしてCookieを保存できるようにカスタマイズしたWebClientを試してみたんですが、どういうわけか、Wordpressへのログインは成功するんだけど、クッキーが保存されないのでログイン画面にリダイレクトされてしまう。
結局、HttpWebRequestの自動リダイレクトを無効/AllowAutoRedirectプロパティをfalseにすることで、解決しました。

/*
  エラー処理・タイムアウト処理はしていない。
*/
using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Text;
using System.Text.RegularExpressions;
using System.Linq;
using System.Net;
using System.Threading;

///<summary>
/// 自動リダイレクトを無効にするため、WebClientを継承します。
///</summary>
class XmlWebClient : WebClient
{
  protected override WebRequest GetWebRequest(Uri address)
    {
      WebRequest request = base.GetWebRequest(address);
      
      if (request is HttpWebRequest)
        ((HttpWebRequest)request).AllowAutoRedirect = false;
      
      return request;
    }
  
  ///<summary>
  ///エクスポートファイルを新規スレッドでダウンロードする。
  ///非同期APIを使えばいいんですが、ややこしいので、スレッドを一本起こしてます。
  ///</summary>
  public static Thread GetWXRFileAsync(string url,string user,string phrase,string ofilepath,Action cb)
    {
      try
        {
          var thread = new Thread(o =>
                                  {
                                    GetWXRFile(url, user, phrase, ofilepath);
                                    cb();
                                  });
          
          thread.Start();
          return thread;
        }
      catch(Exception exception)
        {
          throw exception;
        }
    }
  
  ///<summary>
  ///エクスポートファイルをダウンロードする。
  ///</summary>
  public static void GetWXRFile(string url,string user,string phrase,string ofilepath)
    {
      var xwc = new XmlWebClient { Encoding = Encoding.UTF8 };
      
      xwc.Headers[HttpRequestHeader.UserAgent] = "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.0; Trident/5.0)";
      xwc.Headers[HttpRequestHeader.Referer] = url + "wp-login.php";
      
      var param = new NameValueCollection();
      param.Add("log", user);
      param.Add("pwd", phrase);
      param.Add("rememberme","forever");
      param.Add("wp-submit","login");
      param.Add("redirect_to",url + "wp-admin/");
      param.Add("testcookie","1");
      
      xwc.UploadValues(url + "wp-login.php",param);
      
      string setCookie = xwc.ResponseHeaders[HttpResponseHeader.SetCookie];
      string[] cookies = Regex.Split(setCookie, "(?<!expires=.{3}),")
        .Select(s => s.Split(';').First().Split('='))
          .Select(xs => new { Name = xs.First(), Value = string.Join("=", xs.Skip(1).ToArray()) })
            .Select(a => a.Name + "=" + a.Value)
              .ToArray();
      
      xwc.Headers[HttpRequestHeader.Cookie] = string.Join(";", cookies);
      xwc.DownloadFile(url + "wp-admin/export.php?content=all&download=true", ofilepath);
    }
}

クッキー処理のところは、たまたま検索したページ(サイト失念(m_m))のコピペ。SetCookieヘッダーの処理って面倒なんですよね・・・助かる(^^)
あとは、下記のように WordPressのURLとログイン名・パスワード・ダウンロードするエクスポートファイルを保存するファイルパスを指定してコールするだけ。

//ダウンロード
XmlWebClient.GetWXRFile("ワードプレスのURL","ユーザー名","パスワード","ファイルパス");

//おまけで、コールバック関数を指定して別スレッドで動かす「なんちゃって非同期バージョン」
//Windowsフォームを使うアプリだと、非同期は必須っすね。
XmlWebClient.GetWXRFileAsync("ワードプレスのURL",
                             "ユーザー名",
                             "パスワード",
                             "ファイルパス",
                             () => {Console.WriteLine("エクスポートファイルの取得が終了しました。");});