2016年08月15日

新ブログ・サイトの開設

新しいブログ・サイトを開設しました。以下がそのURLです。

 黄昏色のオーディオ使い http://k9-audio.sblo.jp

このサイトにはオーディオ機器全般に関する記事を掲載していきますが、主に扱うのは中国製のオーディオ製品です。私は最近中華イヤホンにはまっているので、そのレビューや紹介記事が一番多くなるでしょう。

私個人の日記的な情報も今後はこちらの新サイトの方へ掲載します。したがって、本サイトにはコンピュータ関連の記事だけを投稿することになります。

仕事の方はオーディオ分野の方へ移行を進めていますが、趣味ではコンピュータ関連への感心を完全に失った訳ではありません。個人的興味の範囲を出ることはないので、今後記事数はかなり低下すると思いますが、本サイトは細々と更新を続けていくつもりです。
posted by とみやん at 21:54| Comment(0) | 日記

2016年08月09日

長野県上田へ事業所を移転

個人事業の事業所在地を長野県上田市へ移転しました。

じつは、仕事の関係で去年の10月からずっと上田に滞在しています。こちらの仕事を始めたのは去年の9月からなので、もうすぐ一年になります。

以前にも9ヶ月程こちらで仕事をしたことがあるので、馴染みはありました。佐久や上田の街は色々な店やショッピングセンター、ホテルなどが増えて街は発展しています。長野と松本を除いて信州の他の街は寂れていますが、上田にはそういう寂れ感はあまり漂っていおらず活気が感じられます。NHK大河ドラマ「真田丸」の影響で今年は観光客も多く訪れているので、上田駅や上田城周辺は毎日賑わっています。

上田は松本や塩尻よりずっと住み易いです。まずは天候がすごく安定しているので老体には優しいです。中信のように天候が荒れることはほとんどありません。東信地域は全国で二番目に降雨量が少ないエリアだそうです。確かに、毎日晴れの日ばかりで雨は少ないです。冬も中信より降雪量が少なく、気温も少し高いように感じられます。

それから、やはり東京へのアクセスが抜群に良いのが大きなメリットです。仕事や私用で東京へ行かないといけないことが年に数回あるので、いざいうときに本当に助かります。北陸新幹線の開業で電車の本数も増えているので、東京への行き帰りがすごく楽です。以前の記事にも書きましたが、東京との関係を維持したまま信州に住むには、やはり東信を選ぶのがベストだと思います。

上田の街の主要な店は駅から半径2km以内に集まっています。そのため、徒歩や自転車でほとんどの店に行くことができます。車を持っていないくても暮らすことができるのも気に入っています。信州の他の街は車なしで暮らすのは難しいです。信州大学繊維学部が在る関係で上田は賃貸物件の数も比較的多いです。ただし、学生向け物件が多く、しなの鉄道沿線の街で一番家賃相場が高いがネックですが。

こちらでの知人に松本から上田へ移ってきた人が何人かいるのですが、松本より上田の方が住み易いという私の意見に全員賛成してくれています。知人の話では、信州の街を転々と移り住んだ経験を持つ人の中で最後に上田に定住する人が結構いるそうです。

以前の記事で、私の独断による信州の街の住み易さランキングを示しました。そのランキングでは、1位 佐久、2位 長野、3位 松本、 4位 茅野、5位 軽井沢、6位 上田にしましたが、この順位を1位 上田、2位 佐久、3位 長野、 4位 松本、5位 茅野、6位 軽井沢に変えたいです。佐久と上田のどちらを上にするかは判断が難しいところです。東京へのアクセス時間は10分しか差がありません。しなの鉄道が利用できるので、近隣の街へのアクセスは上田の方が断然有利です。店の数と種類はほぼ同等ですが、佐久は広い範囲に店が点在しているので車なしでの生活は難しいでしょう。浅間山が近いので佐久は風が強い日がありますが、上田はそんなことはありません。総合的に観ると、やはり佐久より上田の住み易さの方が上ではないかと思えます。この新ランキングには、実際に上田に住んでいる贔屓目も入っています。私は長野や松本にも住んだことがありますが、この2つより街の規模が小さいのに店がそこそこ多いので、日々の買い物は楽です。ただし、長野や松本に比べて上田は路線バスの本数が少ないので、遠方の店にいくのは大変です。

生活と仕事のどちらの利便性も格段に向上したので、上田へ移転して本当に良かったと思っています。
posted by とみやん at 14:57| Comment(0) | TrackBack(0) | 日記

2016年08月04日

コンピュータ関連事業から撤退しました

コンピュータ関連事業から撤退し、新しい分野の事業を始めました。

そのため、今後本サイトは個人的なコンピュータ関連の研究内容やTips情報などを発信するサイトとなります。仕事の活動は新事業へ注力するため、本サイトの更新頻度は低下すると思います。

病気による体調不良が続いていたため、長らく本サイトの更新を行っていませんでした。

これから少しずつ記事の投稿を再開していくつもりです。ただし、コンピュータ関連の研究に時間が割けなくなって更新頻度が極端に低下するようなら、本サイトは閉鎖しようと考えています。本サイトを閉鎖する場合は、それに代わる個人の日記的なブログ・サイトを開設するつもりです。

posted by とみやん at 10:02| Comment(0) | TrackBack(0) | 日記

2015年08月01日

Aspire S3の英語配列キーボードへの換装

私がいま所有しているWindows PCは3台だけですが、その中の1台Acer Aspire S3-951-F34Cのキーボードを英語配列の物へ交換する作業を行いました。

じつは、私が所有しているPCの中で唯一このAspire S3-951-F34Cだけが日本語配列キーボードでした。他の2台はLenovoのThinkPadシリーズで、2台とも英語配列キーボードに交換済みです(LenvoのノートPCの英語キーボード部品は容易に入手できます)。AcerはLenovoのようなPCのCTO販売を行っておらず、英語キーボードを搭載したモデルも販売していません。Aspire S3-951-F34Cは値段が安かった割にはパフォーマンスがそこそこ高かったので気に入っていたのですが、キーボードが日本語配列であるという点だけが不満でした。

このAspire S3はもう3年以上使っていますが、キーボードの交換は諦めていました。その理由は、同機のキートップが本体のキーボード・ベゼルから直接出ているような造りになっていたので、キーボード・ベゼルが日本語配列専用であり、英語キーボードにする場合はベゼルも一緒に交換しないとダメだと思っていました。つまり、キーボード部品だけを英語配列の物に交換しても、ベゼルのキートップ穴の配列や形状と合わないと思い込んでいました。

以前もAspire S3シリーズの英語配列キーボードを探したことがあるのですが、そのときは見つけることができませんでした(海外からなら部品として入手できたかもしれませんが・・・)。最近になって、改めてYahoo!オークションでAspire S3シリーズのキーボード部品を探してみると、数点出品されているのを見つけて、その中に英語キーボードもありました。そこで、オークションの商品情報ページに掲載されていた英語キーボードの部品の写真を手持ちのAspire S3とキーボートとじっくりと比較してみると、キーボードの部品だけを交換しても大丈夫そうな感じでした。英語キーボード側のキートップの配列と形状が本体のキーボード・ベゼルのキートップ穴のそれと完全に一致しているように見えたからです。
ANIMG_20150801_134442-Replacing_Keyboad-Aspire_S3-640x480.jpg
ANIMG_20150801_135344-Replacing_Keyboad-Aspire_S3-640x480.jpg
上の写真が今回入手したAspire S3用の英語キーボードですが、正確には、これはUS英語ではなくUSインターナショナル英語配列の物です([ 5 ]キーにユーロ記号の刻印があり、[Alt Gr]キーが存在することが、この2つの配列の相違点です)。キーボードの配列自体は104キー(QWERTY)で共通です。

Aspire S3の分解は、YouTubeで見つけた下の動画を視ながら行いました。

この動画では、本体ボディーを開いてキーボード以外の部品を取り外すまでの手順が説明されています。

実際にやってみると、Aspire S3の分解作業の難易度はかなり高いです。一度もノートPCを分解したことがない人には多分無理だと思います(2012/08/26の記事にAspire S3の内蔵HDDをSSDへ交換した際の作業記録を書きましたが、ここまでの手順なら難易度は低いです)。私は過去に数台のノートPCを分解した経験を持っており、こういう作業には慣れていますが、それでも細心の注意を払いながら慎重にAspire S3の分解作業を進めました。分解手順の中でバッテリーを取り外す工程にもっとも神経を使いました。バッテリーを取り外すときに慎重にゆっくりやらないと、バッテリーの上を横断しているスピーカーのケーブルを切断してしまう可能性があります。

上の動画のとおりにAspire S3を分解すると、下の写真のように、キーボードの裏板が見える状態になります。
ANIMG_20150801_143417-Replacing_Keyboad-Aspire_S3-640x480.jpg
ここまで分解できたら、後の作業は簡単です。まずは、右側の黒いフラット・ケーブルとテープを剥がします。この2つはキーボードの裏板は貼りつけられています。これらを剥したら、続いてキーボードの裏板を固定しているネジをすべて外します(ネジは全部で28個もあります。このネジはすごく小さくて、#0の+精密ドライバーが必要です。また、ネジの位置を記憶するために、外す前に写真を撮っておいた方が良いです)。
ANIMG_20150801_145629-Replacing_Keyboad-Aspire_S3-640x480.jpg
ネジをすべて外したら、キーボードを取り外すことができます。
ANIMG_20150801_145905-Replacing_Keyboad-Aspire_S3-640x480.jpg
交換用のキーボードを取りつけたら、それをネジで元どおりに固定します。
ANIMG_20150801_160422-Replacing_Keyboad-Aspire_S3-640x480.jpg
さらに、剥がした黒いテープとフラット・ケーブルをキーボード裏板の元の位置に貼りつけます。

ここからは、動画の作業手順を逆に辿ってAspire S3を組み立てていきます。組み立てる際も、スピーカーのケーブルを切断しないように、バッテリーを取りつける工程でもっとも神経を使いました。

下の写真が、英語配列キーボードに換装した後のAspire S3です。
ANIMG_20150801_172859-Replacing_Keyboad-Aspire_S3-640x480.jpg
元の日本語配列キーボードと比較すると、英語配列キーボードでは、[Backspace]キーが大きくなり、[ \ ]キーの位置が[Enter]キーの上に移動して、しかも同キーも大きくなっています。この2つはWindowsでもっとも頻繁に使うキーなのに、日本語配列では、隣り合った位置に在る上に、[ \ ]キーが小さくなっていました。この配列は最悪で、ものすごく打ち難かったです。さらに、英語キーボードでは日本語配列特有の[無変換][変換]キーがなくなったおかげで、[Space]キーが両側に広くなっています。日本語JIS配列よりこちらの方が断然打ち易いです。私はUS英語ASCII配列のタッチ・タイピングに慣れてしまっているので、この配列でないとキーの早打ちができません。仕事でどうしても日本語キーボードを使わざるをえないこともあるので、一応こちらもタッチ・タイピングはできるのですが、英語キーボードよりは入力速度が遅くなります。

これで、私が所有しているPCは全部英語配列キーボードになりました(Macも含めてです)。諦めていたAspire S3まで英語キーボードに交換することができたので大いに満足しています。

やはりPCにとってキーボードの打ち易さはすごく重要です。キーボードが打ち難いと、イライラばかりが募って精神衛生上良くないです。PCで英語配列キーボードを使っている人は想像以上に多いじゃないかと思っています。PCが登場した当初は英語ASCII配列のキーボードしか存在しなかったので、私のような年配のPCユーザーで英語キーボードしか使わないという人は相当数いるはずです。会社で日本語キーボードのPCを支給されても、自分で英語キーボードを持ち込んで使っている人もかなり多いです。実際に、私はいままでそういう人を何人も見ています。ノートPCでキーボードが交換できない場合は、日本語キーボードをあえて英語配列設定にして使っている人さえいました。日本の会社は、社員に支給するPCのキーボード配列を選択できるようにするべきです。この施策を実行に移すだけで、社員の仕事の効率が格段に向上するでしょう。キーボードはPCの最大の入力デバイスなので、この施策は想像以上に効果があると私は思っています。

いっそのことIBMが実施しているようにPCのOSの種類も社員が自由に選べるようにしたら、もっと仕事の効率が向上するんじゃないかと思います。オープンソース、モバイル、Web系の開発でWindowsを使うのは最悪の組み合わせです。これらのソフト開発では、MacかLinuxを使った方が格段に仕事の効率が良くなるはずです。これらの分野の開発では、アメリカのプログラマはもはやMacを使っている方が多数派です。日本の企業でいまだにWindowsを使い続けている所は多いでしょうが、それは自分で自分のクビを絞めているようなものです。日本でも、先見的なベンチャー企業は軒並みWindowsからMacへ乗り換えています。そういう企業にMacへ乗り換えた理由を聞いてみることを勧めたいです。きっと「社員がMacの方を好むから」とか「仕事の効率が上がるから」とか答えるでしょう。社員の嗜好や自由度を優先した方が、最終的には会社の業績向上につながることを理解していない経営者が多すぎます(日本の大手企業は硬直化しすぎていて、革新的な施策は一切実行に移すことができない体制になってしまっているのでしょう)。Windowsでは本来の目的とは関係のない余計な作業に時間を取られることがあまりに多すぎます。ある統計データによると、WindowsではPC使用時間全体の8割をこういう作業に消費しているそうです。MacやLinuxでもOS周りやアプリの設定に時間を取られることは多少ありますが、そういう時間はWindowsよりずっと少ないです。Windows用ソフトを開発する場合は仕方がありませんが、それ以外でWindowsを使うのは時間の浪費以外の何者でないと私は思っています。
タグ:Acer Aspire S3
posted by とみやん at 18:14| Comment(0) | TrackBack(0) | PC > Windows

2015年07月30日

Kindle Fire HDX 7を使い始めた

07/18の記事にKindle Fire HD 6の使用感を書いたばかりですが、これに続いて、Kindle Fire HDX 7(ストレージ16GB、第3世代、2013年モデル)も使い始めました。

じつは、去年の9月にBIGLOBEのキャンペーンを利用してWiMAX 2+回線を契約したのですが、このKindle Fire HDX 7はそのキャンペーン特典の一つとして無償で入手した物です。Kindle Fireシリーズを欲しくなったのは今年の春くらいからで、それまでは同シリーズに特に興味を持っていませんでした。すでに屋内専用タブレットとしてLenovo IdeaTab A2109Aを使っており、新しいAndroidタブレットを使う気になれなかったので、Kindle Fire HDX 7は未開封のまま保管していました。

Kindle Fire HD 6を入手してから、そのパフォーマンスの高さとAmazonのサービスとの親和性の良さがすごく気に入りました。Kindle Fire HD 6の使い易さには満足していますが、このままKindle Fire HDX 7を使わずにいるのは勿体無いと思って、保管していた物入れの中から探し出しました。

Kindle Fire HDX 7の製品パッケージの構成物はKindle Fire HD 6とまったく同じでした。本体、AC−USBアダプタ、USBケーブル、簡易版取扱説明書、そして保証に関する資料だけです。
ANIMG_20150730_160246-Kindle_Fire_HDX7-ProductPackage-640x480.jpg
ANIMG_20150730_162046-Kindle_Fire_HDX7-ProductPackage-640x480.jpg
ANIMG_20150731_153004-Kindle_Fire_HDX7-BodyView-640x480.jpg
ANIMG_20150731_153531-Kindle_Fire_HDX7-BodyView-640x480.jpg
ANIMG_20150731_153636-Kindle_Fire_HDX7-BodyView-640x480.jpg
Kindle Fire HDX 7のサイズはKindle Fire HD 6より一回り大きいです。一応片手で持てますが、掌をやや広げ気味にしないと収まりません。重さは関しては、Fire HD 6との差はまったく感じません(公称仕様では、Kindle Fire HDX 7の重量は303gです)。スクリーン画面もFire HD 6より一回り大きいです。しかもFire HDX 7の液晶パネルの解像度は1920x1200なので、Fire HD 6の1280x800と比較して、動画を再生したときの精細さに際立った差を感じます。グラフィックや写真の多い雑誌やコミックなどを読む際も、やはりFire HDX 7の方が圧倒的に鮮明です。プロセッサを比較すると、Fire HD 6の最大1.5GHzに対してFire HDX 7の方は2.2GHzです。どちらもQuad-Coreですが、ビットレートの高い動画を再生した際に明らかな差があり、Fire HDX 7の方が再生がスムーズな感じがします。さらに、Fire HDX 7のスピーカーはステレオなので、動画を再生したときにFire HD 6のモノラル音より臨場感があります。操作全般に対するフォーマンスを比べても、Fire HDX 7はFire HD 6以上にサクサクと反応します。

Amazonから定価で購入すると、Kindle Fire HD 6(16GB)は13,800円でKindle Fire HDX 7(16GB)は19,800円です。両者の価格差は6,000円ですが、この差額なら、Fire HDX 7の方を選択した方がきっと満足度が高いでしょう。実際に使った感想として、この2つ機種は性能の差をはっきりと実感できます。

7インチ・クラスのAndroidタブレットでKindle Fire HDX 7の最大のライバルとなるのは、多分Google Nexus 7ではないかと思います。GoogleストアでのNexus 7の販売はすでに終了していますが、家電量販店などでは在庫品がまだ売られています。Nexus 7(Wi-Fi 16GB、2013年モデル)の現在の市場価格は18,000〜20,000円位です。スペックもほぼ同等ですが、プロセッサには差があります。Kindle Fire HDX 7のSnapdragon 800 2.2GHz(Adreno 330 GPU)に対して、Nexus 7はSnapdragon S4 Pro 1.5GHz(Adreno 320 GPU)です。明らかに、Kindle Fire HDX 7の方が1ランク上の性能です(ただし、私はNexus 7を実際に使ったことがないので、この2つの機種の実感的な差は判りません)。プロセッサの性能が同クラスで画面解像度が1920x1200という条件で探すと、他にライバルになりそうなのはASUS MeMO Pad 7 ME572C(Wi-Fiモデル)くらいしか見つかりませんが、こちらの市場価格は23,000〜30,000円位です。こうやってライバル機種と比較すると、Kindle Fire HDX 7のコストパフォーマンスの高さは頭一つ以上飛び抜けています。Google Playが使えないというデメリットを承知した上で、これを自力でカバーできる自信があるなら、7インチ・クラスのタブレットの中でKindle Fire HDX 7は強く推薦できる機種だと思います。

普段使っているアプリ(nicoid、niconico、dailymotion、Amazon Kindleなど)を一通り動かしただけですが、それでも、いままで私が入手したAndroidタブレットの中でKindle Fire HDX 7がナンバーワンだと自信を持って断言できます。それほど、Kindle Fire HDX 7のパフォーマンスは飛び抜けて優れています。コストパフォーマンスでKindle Fire HDX 7に競合する機種はこれからもなかなか出てこないじゃないかと思います。2万円以下の販売価格で、他のメーカーがKindle Fire HDX 7に競合するタブレットを製造するのは相当難しいでしょう(日本メーカーの製品開発手法では、Kindle Fire HDX 7みたいなタブレットは逆立ちしても製造できないでしょう)。価格を度外視しても、Kindle Fire HDX 7より優れている7インチ・タブレットはiPad mini 2かiPad mini 3くらいしか存在しないじゃないかとさえ思われます。Amazonの製品開発力恐るべしです。


posted by とみやん at 18:11| Comment(0) | TrackBack(0) | モバイルデバイス > その他

2015年07月29日

Windows 10リリースに思うこと

今日2015年7月29日はIT業界に係るすべての者にとって記憶に残る日になりそうです。MicrosoftによってWindows 10がリリースされた日だからです。しかも、既存のWindows 7/8/8.1の利用者へはWindows 10は無償アップグレードという形で提供されます。この無償アップグレードは一年間限定の処置で、Mac OS Xのような完全無償配布ではありませんが、それでも、これはいままでのWindowsの配布形態(パッケージ版やOEMライセンスなどすべて有償配布)から大きく踏み出した画期的な施策だと言えます。

インターネット上にはWindows 10 Preview版の使用体験記事が溢れており、いずれもかなり評価が高いようです。早くもWindows 10正式リリース版の評価記事も流れています。

 Windows 10の時代が始まる―間違いなく過去最高のWindows | TechCrunch Japan
 Windows 10使った初日の感想 : ギズモード・ジャパン

Microsoftも自信満々でWindows 10を発表したようですが、はたしてWindows 10のユーザー数はどれくらい伸びるでしょうか。私はこれについてはかなり悲観的な予想をしています。確かにWindows 10は素晴らしいOSなのかもしれませんが、あまりに世に出るのが遅すぎたと思うからです。

最新の調査情報によると、世界累計の出荷台数ベースでのWindows搭載機のシェアは全体の14%位まで低下しているそうです。

 Gartner Says Tablet Sales Continue to Be Slow in 2015

Windowsのシェアがここまで落ちてしまった原因としては、やはりスマホやタブレットの出荷台数が大きく伸びていることが影響しているのでしょう。モバイルデバイスの大半を占めるのは個人ユーザーですが、個人ユーザーにとってWindowsはもはや使い易いOSとは言えません。IT業界とは無縁の一般ユーザーの中で、iOSやAndroidと比較してWindowsの方が使い易いと言う人はほとんど存在しないでしょう。いまだにWindowsを使っているユーザーの大半は個人ではなく企業です。個人ユーザーにとってモバイルデバイスの主流はスマホやタブレットへ移っており、いまだにノートPCをメインに使っている人は少数派です。

ノートPCに限っても、WindowsではなくMacBookを使っている人が増大しています。カフェやファミレスの店内でノートPCを使っている人を見かけるのは日常風景ですが、いまやWindowsよりMacの方がやや多いのではないかと思えるほどです。IT関連イベントでは確実にWindowsよりMacの数の方が上回っています。プログラマが集まる勉強会などのイベントでは7〜8割位がMacだったりします。「もはやデファクト・スタンダードPCはMac」だと言えるほど、プログラマの間ではMacが普及しています。

 最近のMacはなぜWindowsパソコンを上回っているのか - 日経トレンディネット

個人だけでなく企業でも、WindowsからMacへ乗り換える所が増えています。PC/AT互換機の起源となったマシンを生み出したIBMが全社的にMacを導入することを決めたというニュースは有名です(社員にOSの種類を自由に選択させる方式のようですが)。

 IBMの社員がMacBookを使う時代になりました : ギズモード・ジャパン
 Following Apple partnership, IBM now offering employees Macs for the first time | 9to5Mac
 IBM、従業員向けにMacBookを5万台導入予定 - iPhone Mania
 IBM gives workers choice between Macs or PCs, plans to deploy 50,000 Apple MacBooks

アメリカのIT業界や大学でのMacの普及率の高さは異常なほどです。IT関連イベントや大学の授業ではMacだらけの風景が当たり前になっており、IT・Web系のスタートアップ企業ではほぼ例外なくMacしか使っていません。

 Macが合衆国のPC市場で過去最高のマーケットシェアを達成 | TechCrunch Japan
 Mac Achieves Highest U.S. PC Market Share Ever In Q3 2014 According To IDC | TechCrunch
 Life is beautiful: アメリカの大学の典型的な授業風景
 【商用可・無料】スタートアップ系の雰囲気を再現した写真素材サイト「STARTUP STOCK PHOTOS」 | ビットエーブログ - 株式会社BITA
 Startup Stock Photos

Microsoftが実施したWindows 10のメディア向け発表会でさえMacだらけという有り様です。

 「Windows10の発表会に来てみたら…MacBookの海になっていた」矛盾を感じる写真:らばQ
 A sea of Macbooks at the Windows 10 unveiling - Imgur

また、日本国内の地方自治体でも、Linuxなどのオーブンソース・ソフトウェアを利用して情報基盤システムを構築する動きが活発になっています。Microsoftという一企業のソフトウェアに依存する形で公的な情報基盤システムを構築することは高いリスクを伴うので、これを回避しようとするのは当然の動きだと言えます。このように、モバイルデバイスだけでなくPC利用シーンでもWindows離れは大きな流れになっています。Windows 10がどんなに素晴らしいOSであっても、もはやこの流れを変えるのは難しいでしょう。

ここまでWindowsのシェアが落ちているので、当然ソフトウェア開発者はWindowsへの対応優先度を下げています。私の周りでも、Windowsのソフト開発に携わっている人は片手で数えるられるほどに少なくなっています。仕事でWindowsソフトの開発をやっている人はまだそこそこいますが、趣味のプログラミングでWindows用ソフトを開発しているプログラマは一人も存在しません。プログラマにとって、Windowsは魅力を感じられないOSになってしまっているからでしょう(特に若手プログラマがWindowsソフト開発を毛嫌いする傾向が強いです。Windowsに将来性がないことを敏感に感じているからでしょう)。Windowsのシェアが大きく回復しないかぎり、この状況が変ることはないでしょう。個人ユーザーのライフスタイルにマッチした魅力的なアプリが少ないことも、Windows離れを引き起こしている原因です。Windows StoreでWindowsデバイス向けのアプリが配布されていますが、App StoreやGoogle Playと比較すると悲惨な状況です。Windows 10がどんなに素晴らしくても、アプリ配布のエコシステムの成長なしにその未来を語ることはできません。エコシステムの構築という面でもWindowsはiOSやAndroidに大きく引き離されています。

これからのWindowsの命運は、Windows 10のユーザー数がどれくらい伸びるかにかかっていると言っても良いでしょう。Microsoft社の予想通りにWindows 10のユーザーが増えれば良いですが、もしその予想より大きく下回った場合は、Windowsは一気に終焉へと向かうかもしれません。無償アップグレード期間中にWindows 10のユーザー数がどれくらい増えるかが勝負所となりそうです。Windowsのシェアが大きく回復すれば、ソフトウェア開発企業もWindowsへの対応優先度を上げざるをえなくなりますし、個人のプログラマもWindowsへ再び目を向けるようになるでしょう。しかし、現状Windowsユーザーの大半は個人ではなく企業です。企業では、PCの搭載OSのバジージョンを変えるのことを避ける傾向が強いです。現在企業内のPCで使われているのはほとんどWindows 7ですが、これをWindows 10へアップグレードする需要がどれくらいあるのか疑問を感じざるをえません。多分大半の企業はすぐにはWindows 10へアップグレードを行わないで、しばらく様子見の姿勢を続けるでしょう。私がWindows 10のユーザー数が大きく伸びないと予測しているのは、上記のようなWindowsを取り巻く状況が改善へ向かうとは思えないからです。

ちなみに、既存のWindows 7/8/8.1ユーザー向けのWindows 10無償アップグレードは「Get Windows 10」という予約アプリ経由で行う方式になるそうです。

 Windows 10 にアップグレードする方法 - マイクロソフト

本日(7/29)以降Windows Updateを適用すると、タスクバー上にこのアプリの通知アイコンが表示されるようになるらしいです。このアプリを使って無償アップグレード予約の登録を行うと、Windows 10アップグレードの準備が整った時点で、デスクトップ上にその通知ウィンドウが表示されるそうです。

私はいまWindows PCを3台所有しており、いずれもWindows 7が搭載されていますが、これらをWindows 10へアップグレードする気はまったくありません。私にとってWindows PCはあくまで仕事用なので、わざわざOSをWindows 10に変える必要性がないからです。下のページにWindows 10への無償アップグレードを抑止する方法が記載されているのを見つけたので、この方法をすべてのWindows PCへ適用してしまいました。

 [企業ユーザー向け] Windows Update からの Windows 10 への無償アップグレードを管理する方法 - Ask CORE - Site Home - TechNet Blogs

Windows 10のDSP版は8/1から、パッケージ版は8/16から販売が始まるそうです。海外メーカーのWindows 10搭載PCは本日(7/29)から発売されているようですが、国内メーカーのWindows 10搭載PCはこれから順次発売されて、各メーカーの機種が一通り揃うのは10月頃になりそうです。こちらの方はかなり販売数が伸びるのではないかと予想しています。新しいもの好きのユーザーは相当数いると思うからです。Windows 95以来のWindows特需現象が起きるかもしれません。ちなみに、私が最後に買ったWindows PCは2012年5月に入手したAcer Aspire S3-951-F34という奴です。これ以降Windows PCは一台も買っていませんし、これからも買うつもりはありません。Macで十分に満足していますし、仕事ならともかくプライベートでWindowsを使う気にはなれないからです。プログラマが使うOSとして、WindowsよりMac OS Xの方が圧倒的に優れていると思っていることも大きな理由です。

今後のIT業界の状況がどのように変わろうとも、今回のWindows 10のリリースは世の中に大きな影響を及ぼすことになるでしょう。Windowsの歴史の大部分はPCの歴史とも重なっているので、Windows 10の登場によってPCの利用形態が大きく変化するかもしれません。1992年リリースのWindows 3.1、1995年リリースのWindows 95もその後のPCの利用形態を大きく変えました。もしかすると、10年後には「Personal Computer」という呼び名そのものが無くなってしまっている可能性もあります。個人ユーザーは無視することもできますが、IT企業にとってはWindows 10への対応をまったく行わない訳にはいきません。Windows 10のリリースはIT業界にとって大きな転換点となる出来事になりそうです。

【2015/08/02 追記】

MicrosoftはWindows 10を「最後のWindows」と呼んでいます。それは、今後Windowsのメジャー・アップグレードは行わず、新規機能の追加も含んで、すべてのアップグレードをWindows Update経由で配信しする予定だからです。つまり、Microsoftがいままだ続けてきたパッケージ版による販売はWindows 10が最後になります。

 最後のWindowsとなる「Windows10」今後Microsoftはどこで利益を上げるのか | FUTURUS(フトゥールス)

私は文字通りの意味でWindows 10が「最後のWindows」になるだろうと言ってやりたいです。予言という訳ではありませんが、私は「2020〜2021年頃にWindowsは終焉を迎える」と思っているからです。

いまのWindowsを取り巻く状況は日本の幕末時代に良く似ているように思えます。1853年(嘉永6年)の黒船来航から1867年(慶応3年)の大政奉還まで、たった14年間で日本の歴史は怒涛のごとく変化しました。Windowsを江戸幕府に例えるなら、iPhoneの登場が黒船来航に相当するでしょう。iPhoneが登場したのは2007年なので、この例えをそのまま適用すると、Windowsの終焉は2021年になります。2021年はいまから6年後ですが、Windows 10のユーザー数が予想より伸びずに、さらにWindows離れが加速すれば、MicrosoftがWindowsの開発終了を決意するまでに丁度良い感じのタイムスパンではないかという気がします。

私には、もはや「Personal Computer」という存在そのものが時代遅れになるつつあるように思えてなりません。1977年にCommodore、Apple、Tandy RadioShackの各社から相次いで発売された、ケースに収納された一体型のコンピュータをPersonal Computerの起源とするなら、それから37年経っています。Personal Computerの機能や性能は大きく変わっていますが、基本的な構成(キーボードとモニタの存在)や外形は原型からそれほど変化していません。もうそろそろPersonal Computerに置き換わる新時代の情報端末デバイスが登場しても良い頃です。「スマホやタブレットがそれだ」いう人もいるでしょうが、私にはどうもそうだとは思えません。スマホやタブレットは基本的に情報出力専用のデバイスだからです。キーボードがついているからノートPCを使っているという人は多いと思いますが、情報入力デバイスとしてのノートPCの良さとタブレットの手軽さを兼ね備えた新しいデバイスを求めているユーザーは多いと思います。Microsoftなら「Surfaceこそまさにそれだ」と言うでしょうが、私にはSurfaceはいまいち違うんじゃないかと思っています。SurfaceはノートPCにタブレット的な機能を無理やり追加したような造りに見えるからです(OSがWindowsと大した違いがないWindows RTだという点も気に入らないです)。アプローチとしては逆のような気がしており、タブレットにノートPCの良さを追加する方が正しい方向性のように思えます。ペンによる手書き入力デバイスを研究している企業も多いですが、それも少し違うような気がします。文章では上手く説明できないのですが、キーボードとタッチパネルの両方の良さを兼ね備えた入力デバイスの登場が待ち望まれているように思えます。アニメに良く登場するシーンで説明します。腕時計型デバイスから仮想スクリーンがポップアップして、モニタとタッチパネルを兼ねているシーン。そして、机上などにキーボードの画像イメージを投影して仮想キーボードとして使うシーンです。この2つのシーンが合体した感じの物を想像しています。どちらもSFチックなシーンに見えますが、もうそろそろこんなテバイスが登場しても良い頃です。これから10年以内に、こういうデバイスが実験段階から実用段階に移行しそうな予感がしています。タッチパネルに代わる新しい入力デバイスが登場したときが、新時代Personal Computerの幕開けになるとじゃんないかと想像しています。
タグ:Windows 10
posted by とみやん at 12:16| Comment(0) | TrackBack(0) | 日記

2015年07月18日

Kindle Fire HD 6を購入した

久しぶりにAndroid搭載タブレットを入手しました。と言っても、入手したのはKindle Fireです。7/15にAmazonでHAPPY PRIME DAYというプライム会員限定セールをやっていて、このセールですべてのKindle Fire製品が30%オフになっていたので、思わずポチってしまいました。前々からKindle Fire HD/HDXシリーズの評判が高いことを知っていて、できたら欲しいなぁと思っていたので、このチャンスを逃したくありませんでした。ちなみに、私が購入したのはKindle Fire HD 6(ストレージ16GB、第4世代、2014年モデル)です。ストレージ容量を8GBと16GBのどちらにするか迷いましたが、30%オフならどちらも1万円を切るので、今回は思い切って16GBの方を選びました。商品を注文したのは7/15の昼頃ですが、プライム会員だと「お急ぎ便」の配送料が無料なので、この配達オプションを指定したら、翌日(7/16)の14時頃に商品が配達されました。さすが、Amazonです。

商品が到着してから、さっそく写真撮影をしながらKindle Fire HD 6の開封の儀をとり行いました。製品箱に入っていたのは本体、AC−USBアダプタ、USBケーブル、簡易版取扱説明書、そして保証に関する資料だけでした。ごちゃごちゃとマニュアルや資料だらけの日本製品より、こういう必要最低限の物だけしか入っていない方がよっぽど好感が持てます。
ANIMG_20150716_172441-Kindle_Fire_HD6-ProductPackage-640x480.jpg
ANIMG_20150716_174257-Kindle_Fire_HD6-ProductPackage-640x480.jpg
手に持ってみると、Kindle Fire HD 6は片手に無理なく収まるサイズでした。そして、長時間片手で持ってもまったく苦にならない軽さです(公称仕様によると、Kindle Fire HD 6の重量は290gです)。
ANIMG_20150718_150555-Kindle_Fire_HD6-ProductPackage-640x480.jpg
6インチの画面は小さいかもしれないと想像していましたが、実際に使ってみると、その点はさほど気になりませんでした。過去に入手した7インチのAndroidタブレットを使ったときの記憶を思い出してみましたが、それらと比較しても大きな差は感じられません。片手に無理なく収まりスペースを取らない点は、むしろ7インチより優れているんじゃないかという気もします。購入時にKindle Fire HDの6インチと7インチのどちらにするかも迷いましたが、6インチの方を選んで正解だったと思っています(価格を比較して6インチの方が安かったことが、こちらを選んだ最大の理由ですが・・・)。

開封の儀が終わったので、さっそくKindle Fire HD 6の電源を投入してみました。起動後に表示されたロック画面を解除すると、一番最初に下のような画面が表示されました。これがKindle Fireのホーム画面のようです。ホーム画面中央の大きなアイコンはスライダーになっていて、最近使ったアプリが順番に表示されています。このスライダーには、アプリだけでなく、Kindleストアで購入済みのコンテンツのタイトルも後ろに続いています。
ANShot_20150718_152347-Kindle_Fire_HD6-Screens-320x512.pngANShot_20150718_153704-Kindle_Fire_HD6-Screens-320x512.png

スライダー上に存在しないアプリを表示するには、ホーム画面下側のアイコンの領域を上へスワイプします。これがお気に入りアプリの登録画面です。端末にインストールされているアプリから選んで、このお気に入り画面へ追加することができます。他の端末で購入済みのアプリは、その端末のストレージとAmazonのクラウド領域の両方に保存されています。購入済みアプリの一覧画面を開いてクラウド側からアプリをダウンロードすれば、Kindle Fireでも使えるようになります。
ANShot_20150718_152412-Kindle_Fire_HD6-Screens-320x512.pngANShot_20150718_153731-Kindle_Fire_HD6-Screens-320x512.png

Kindle FireシリーズのUIはAmazonユーザー向けに特化しているので、他のメーカーのAndroidタブレットを使ったことがあるユーザーは戸惑うかもしません。そう言う私も、最初はこのUIにちょっと驚きました。しかし、しばらく使っているうちに、Amazonユーザーにとってはこれは合理的なUIなんだなぁと思えてきました。電子書籍など私も最近はAmazonのサービスを結構利用しています。だからこそ、Kindle Fire HDが欲しくなった訳です。Kindle FireシリーズはAmazonユーザーのためデバイスだと言えます(逆に言えば、Amazonをあまり利用しないユーザーにとっては無用の長物的なデバイスかもしれません)。ちなみに、AmazonからKindleデバイス製品を購入すると、あらかじめAmazonのユーザー・アカウント情報が登録されている状態で届きます。つまり、Wi-Fiの接続設定だけ行えば、すぐに使い始めることができます。

一通りKindle Fire HD 6を使ってみた感想ですが、これは他社のAndroidタブレットとは一線を画した素晴らしいデバイスだと思います。あらゆる操作にサクサクと反応するので、使っていてストレスを感じシーンがまったくありません。Kindle Fireに搭載されているのはAndroidをベースにAmazonが独自のカスタマイズを施したFire OSというものですが、これはAndroidとは異次元のパフォーマンスです。AndroidベースのOSだとはとても信じられないくらい、どんな操作にキビキビと反応してくれます(これを逆に言えば、Google製のAndroidには全体のパフォーマンスを低下させる無駄なものがたくさん入ってということです。もしかすると、Google以外でAndroidをもっとも深く知り尽くしているのはAmazonなのかもしれません)。バッテリーも他社のAndroidタブレットよりずっと長く持ちます。じつは、Lenovo製のIdeaTab A2109AというAndroidタブレットを持っているのですが、この機種と比較すると、Kindle Fire HDの液晶画面はコントラストが高くて精細です。そして、そのサウンドも素晴らしいです。Kindle Fire HD 6の搭載スピーカーから出る音はモノラルですが、イヤフォン・ジャックはステレオです。このイヤフォンの音がIdeaTabより奥行き感が感じられます。私がいままで使ったことがあるAndroidタブレットの中で、迷わずこのKindle Fire HD 6のサウンドがナンバーワンだと断言できるほど明確な差があります。この機種のサウンドはDolby Audioだからでしょう。

性能面だけで比較すると、Kindle Fire HDシリーズはあらゆる点で他社のAndroidタブレットを凌駕している素晴らしい製品ですが、大きな欠点があります。唯一かつ最大の欠点かもしれませんが、それはGoogle Playが搭載されていないことです。Kindle FireシリーズのアプリはAmazon Androidアプリストアから入手しますが、こちらにはGoogle Playと比較して1/7程度の数しかアプリが登録されていないそうです。IdeaTabの方で使っているアプリをKindle Fireへもインストールしようと思って、Amazonアプリストアで探してみましたが、いくつかのアプリは登録されていなかったり、登録されていてもバージョンが古かったりしました。

Kindle FireにGoogle Playのアプリを入れる方法として、他のAndroidタブレットからインストール済みアプリのapkファイルを抜いてKindle Fireへ転送するという手があるそうです。PCを使いこなしているユーザーならそれほど難しくはありませんが、一般のユーザーにはやや敷居が高い特殊な方法です。こういうことが苦にならないユーザーになら、Kindle Fire HD/HDXをぜひ薦めたいです。他社のAndroidタブレットと比較しても、Kindle Fire HD/HDXシリーズのコスト・パフォーマンスは格段に優れています。現在市場で販売されているAndroidタブレット(Kindle FireシリーズをAndroidタブレットのジャンルに入れるべきではないのかもしれませんが)の中で、Kindle Fire HD/HDXはトップ・クラスの性能を持つ製品だと自信を持って断言できます。

世の中にはAmazon信者と呼ばれるほど、何でもかんでもAmazonから買っている人がたんさんいるらしいです。私はそこまでのヘビー・ユーザーではありませんが、電子書籍を利用するようになってから特にAmazonの便利さを痛感するようになりました(おかげで、リアルの本屋に行くことがまったくなくなりましたが・・・)。他に利用しているAmazonのサービスは通販くらいですが、やはりAmazonの存在感はすごいなぁと最近はつくづく思います。ハードのトップ企業がAppleなら、サービスのトップ企業はAmazonと言えるでしょう。Kindle Fire HDの出来の良さを見ると、ハード方面でもAmazonの技術力はずば抜けているのかもしれません。Appleの製品ほどではないですが、Kindle Fire HDにも製品開発者の拘りみたいなものが感じられます。いままで入手したAndroidタブレットはいずれもイマイチ感が強い物ばかりでしたが、このKindle Fire HD 6には早くも愛着が湧いています。タブレット製品は進化が速いので2〜3年位が限界だと思いますが、できるだけ長く使っていきたいです。

【2015/07/19 追記】

Lenovo IdeaTab A2109AとAmazon Kindle Fire HD 6の使用感を比較してみました。私がいま所有しているAndroidタブレットはこの2台だけです。片や9インチでもう一方は6インチなので、使用シーンは違うと思いますが、スペック的には大きな差はありません。

プロセッサを比較すると、IdeaTab A2109AのNVIDIA Tegra 3(T30SL)1.2GHzに対して Kindle Fire HD 6はMediaTek MT8135最大1.5GHzで、どちらもQuad-Coreです。そして、RAMサイズも同じ1GBです。ちなみに、液晶パネルの解像度も同じ1280x800ピクセルです。OSを比較すると、Android 4.1.1対Fire OS 4.5.4(Android 4.4ベース)です。IdeaTabの出荷時のOSはAndroid 4.0.4で、使い始めた頃はそこそこ良いパフォーマンスで満足していたのですが、Android 4.1.1へアップグレードしてから目に見えて操作感が悪くなりました。すべての操作に対して3〜10秒も待たされる状態になってしまい、使っているとイライラ感ばかりが募ります(これが新しいAndroidタブレットを欲しくなった最大の理由です)。一方Kindle Fire HDはあらゆる操作にサクサクと反応し、ストレスを感じることはまったくありません。ハード・スペックに大きな差がないのに、パフォーマンスにこれほどの差が生まれる原因はOSの性能差にあるとしか考えられません。

IdeaTabのOSをAndroid 4.0.4から4.1.1へアップグレードしてからパフォーマンスが大きく低下した事実から、Android 4.0.xと4.1.xでは要求ハード性能に明らかな差が存在するように思えてなりません。Android 4.1以降は相当高性能なハード(最低1.5GHz以上のQuad-Coreプロセッサと高性能なGPUを搭載している物)でないと、まともに動かないOSなのではないかと想像しています(私はAndroidのFinal Versionは4.0.xであって、それ以降のバージョンはひたすら改悪を続けているだけなんじゃないかと思っています)。「Androidはハードの進化におんぶすることで何とか使い物になっているOS」だと、言い切っても良いんじゃないかでしょうか。そして、これこそが「Androidの断片化問題」を引き起こしている元凶でもあります。日常的に使っているAndroidスマホやタブレットでOSをバージョンアップするのは避けた方が無難です。Androidのバージョンアップはハードの性能アップを前提として行われているので、旧機種ではOSをバージョンアップした途端にパフォーマンスが低下して使い物にならなくなることがあります。iOSでも多少こういうことはありますが、旧機種が使い物にならないほどひどいケースはありません。Androidアプリの開発者は半年に一回のペースでターゲット機を高性能な機種に買い換えないと、まともに仕事ができない状況に陥っているのではないかと想像しています。Android 2.2以降のバージョンアップがずっとこのペースで続いているからです。iOSでも似たような状況は存在しますが、ここまでひどくはありません。iOSでは過去のバージョンを使っているユーザーは極端に少ないので、それに対応するための開発コストを抑えることができます。iOSの旧バージョンを使っているユーザーが少ないのは、OSをバージョンアップしても、パフォーマンスがそれほど低下せずに新しい機能が利用できるからです。

Kindle Fire HDを使い始めてから、私はAndroidタブレットへの興味をさらに失いました。Kindle Fire HDもAndroidタブレットの一種と見るなら、この表現は適切ではないかもしれませんが、次世代のAndroidタブレットが欲しくなっても、Kindle Fire HDを新モデルに買い換えることだけを検討すれば十分だと思えるからです。それくらいKindle Fire HDのコスト・パフォーマンスと使い易さはずば抜けています。Kindle Fire HD/HDXシリーズこそがAndroidタブレットの最終形態ではないかと思えるほど、この機種の出来は素晴らしいです。

【2015/07/22 追記】

Kindle Fire HD 6を使い始めて一週間経ちましたが、その使用感について改めて実感した事があるので書きます。

それは、Kindle Fire HDのパフォーマンスがあまりに良すぎるので少し慣れが必要だという点です(もちろん、これは良い意味で言っています)。他社のAndroidタブレット(特に旧世代の機種)を使い慣れているユーザーはKindle Fire HDの反応速度のあまりの鋭さに戸惑うかもしれません。そう言う私もその一人なのですが、いままでのAndroidタブレットではタッチにしろスワップにしろ、すべての操作を意識的にややゆっくりと(モッサリとした感じで)やっていました。こういう操作への反応速度が鈍くて、ときどき反応しないこともあったからです。こういう経験から、私はAndroidはノロノロとしか反応しないOSだと思い込んでいましたが、Kindle Fire HDによってその印象が一掃されました。Kindle Fire HDはすべての操作に対して鋭く反応します。そして、タッチやスワップなどの操作が速すぎても、取りこぼすことがまったくありません。旧来のAndroidタブレットのようにモッサリと触っていると、Kindle Fire HDでは意図しない操作になってしまうことがあります。誤ってちょっとスクリーンにタッチしてしまった場合でさえ、それに正直に反応します。ただし、使い続けていれば、これにはすぐに慣れるでしょう。iPhoneやiPadを使っているユーザーなら、それらと同じようにKindle Fire HDを操作すれば良いだけです。

いままでのAndroidタブレットは一体何だったのかと思いたくなるほど、Kindle Fire HDのパフォーマンスはずば抜けています。これが本来の姿であって、いままでの機種の方があまりにダメすぎたと言った方が適切なのでしょう。Fire OSとAndroidは互換性があってほとんどのAndroidアプリはそのまま使えますが、パフォーマンス面だけを比較すると、この2つのOSは別物だと観るべきです。Androidをカスタマイズしてここまで性能を向上させることがAmzaonにはできるのに、なぜGoogleにそれができないのか不思議でなりません。Androidの出来の悪さから前々から思っていたことですが、やはりGoogleにはOSの深い部分を理解できるエンジニアがいないのかもしれません。Android 5.0 Lollipoに多くの新機能を追加しているようですが、他にやるべきことがあるだろうとGoogleに言ってやりたいです。


posted by とみやん at 16:18| Comment(0) | TrackBack(0) | モバイルデバイス > その他

2015年07月12日

広告ポップアップを表示するMagicanを削除した

私は毎日Macを使っていますが、2日前(7/10)から下のような「MacCare」というアプリの広告ポップアップ・ウィンドウが突然表示されるようになりました。
SCShot_150712_0001-Uninstalling_Magican_AdPopUp-400x352.png
Webブラウザで怪しげなサイトを訪問すると、こういう広告ポップアップが表示されることは良くあります。しかも、怪しげなサイトから離れた後も、Webブラウザを開いていると常に広告ポップアップが表示されるようになったりします。こういう悪さをするものを「Adware」と呼ぶらしいです。ちなみに、こういうAdwareは大抵Webブラウザのプラグイン経由で入り込んでいるらしいです。Webブラウザを使っている際にAdwareの広告ポップアップは何回か見たことがあり、Windowsでは入り込んだAdwareを削除するのに苦労した経験もあります(WindowsのInternet Explorerはセキュリティ上の弱点が多く、Adwareのターゲットになり易いと言われています。私もWindowsではIEを避けてGoogle Chromeを使っています。また、怪しげなサイトに行ったりするのはブライベート用のWindows PC一台だけに制限しています)。しかし、Webブラウザを起動していない状態で、上のような広告ポップアップが表示されたのは初めての経験です。

もはやPCユーザーにとっての常識ですが、こういう広告ポップアップ・ウィンドウが表示されても、絶対にウィンドウ内の[Try]や[Go]などのボタンを押してはいけません(「Install」みたいな直接的な表現でなくても、ウィンドウ内のボタンを押すのはNGです)。ウィンドウ内に表示されているアプリが強制的にインストールされることがあるからです。この手のアプリには大抵ウィルスやマルウェアが仕込まれているので、一旦アプリがインストールされてしまうと、PCに入り込んでしまったウィルスやマルウェアを削除するのに大変な労力を使うことになります。マルウェア入りの広告拡販アプリと言えばMacKeeperというのが有名ですが、安易なネーミングのこのMacCareというアプリも相当怪しいです。‎広告ポップアップで勧められても、そんなアプリは絶対に信用してはいけません。

今回のケースもMacがウィルスかマルウェアにもでも感染したのかと思ったので、すぐにClamXavとBitdefender Virus Scannerを使ってウィルス検索を行いました。しかし、どちらとも何も検出されませんでした。

それで、ググって情報を探し回ると、まったく同じ症状が記載されている下のページに見つけました。

 MacCare MacCleaning pop up window | Apple Support Communities

このページの情報によると、何とMagicanというアプリが悪さをしているそうです。

上のページの情報の真偽を確かめるために、Macが起動した直後にMagicanを終了させてみました。すると、5分以上経過しても広告ポップアップは表示されませんでした。Magicanにはログイン時起動機能が備わっており、この機能を有効にするとMagicanMonitorというサービスがログイン項目に登録されて、システム起動時にメニューバーにMagicanのアイコンが表示されます。この状態ではMagicanがバックグラウンドで動作していますが、システム起動後のきっかり5分後に広告ポップアップが表示されることが確認できました。ログイン時起動機能を無効にして、手動でMagicanを起動した場合も、Magicanの起動時点から丁度5分後にこの症状が起きました。

Magicanの存在を知って以来私はすべてのMacへ入れおり、その機能も結構利用していました。最初にMacへMagicanをインストールしてからもう3年位使い続けていましたが、いままで上記のような症状は一度も経験したことはありません。これは想像ですが、Magicanを開発している企業が他の企業に買収でもされて、その企業の事業方針に従うために、広告ポップアップを表示するに変えたのかもしれません。Magicanの広告ポップアップを表示する処理はインターネット経由で実行されているのでしょう。もしそうだとすると、インーネット経由でMacを操作されてしまう可能性もあります。

どんなに便利な機能を持っていても、広告ポップアップを表示するアプリを使うのは嫌です。こんな広告は鬱陶しいですし、他にも色々な悪さをしている可能性もあります(事前通知なしで、いきなり広告ポップアップ表示を始めるようなアプリを性善説で信用するのは無理です)。広告ポップアップを表示しているのがMagicanであることが判った時点で、私はすべてのMacからMagicanをアンインストールしました。ちなみに、Magicanはそこそこ有名なアプリで、ググると、便利なアプリとしてプッシュしているページがかなりの数ヒットします。こういう情報を知ってインストールしている人は大勢いるようですが、Magicanを使うのはすぐに止めるべきです。そう言う私も安易にインストールしてしまった一人ですが、今回の件でMagicanはもはや信用できないと思いました。Magican Restというアプリも利用していたのですが、これもすべてのMacから削除してしまいした。ちなみに、MagicanはMac AppStoreには登録されていません。MagicanLiteという機能縮小版の方が登録されていますが、これをインストールするのも避けた方が良いでしょう。Magicanの公式サイトの掲載情報によると、Magicanはv1.4.8(2013/08/09リリース)以降バージョンアップされていません。こういう状況からも、Magicanはかなり疑惑の深いアプリではないかと思います。

スマホでは広告付きアプリを避けるのは困難な状況になっていますが、PCでは広告付きアプリを使うのはできるだけ避けるべきです。どうしても広告付きアプリを使わければならない場合は、ファイアウォールを利用するという手もあります。最近は広告付きアプリが増えており、私もWindows PCでは仕方なくいくつか使っていますが、高機能なファイアウォール・ソフトをインストールしておいて、こういうアプリのインターネット・アクセス先を制限するようにしています。PCではファイアウォールはもはや必須のソフトです。Windowsには必ず入れていたのですが、今回のケースに遭遇して、すべてのMacにフリーのファイアウォール・ソフトをインストールしました。

■ Magicanのアンインストール


Magicanには[Magicanをアンイストール]というメニューが在ります。ただし、このメニュー項目はMagicanの通常メニユーの方ではなく、アイコン・メニューの方に存在します。Magicanのアンインストールはこのメニューを実行すれば良いだけですが、私はその後にいくつか追加の操作を行いました。Magicanを完全に削除したかったからです。私が行った操作を以下に記します。
  1. 最初に、AppCleanerによってMagicanの関連ファイルを検索しました。
    SCShot_150712_0015-Uninstalling_Magican_AdPopUp-446x1021.png
    そして、上のウィンドウのスクリーンショットを取得しました。

  2. Magicanの[環境設定]メニューを開いて、[一般]タグ画面の[ログイン時にモニターを起動]チェックボックスをOffにします。
    SCShot_150712_0010-Uninstalling_Magican_AdPopUp-480x144.png
    これによって、ログイン項目からMagicanMonitorが削除されます。

  3. Magicanアイコンのメニューから[Magicanをアンイストール]を実行します。
    SCShot_150712_0011-Uninstalling_Magican_AdPopUp-578x322.png
    すると、下のようなウィンドウが表示されます。
    SCShot_150712_0013-Uninstalling_Magican_AdPopUp-388x270.png
    このウィンドウの[アンイストール]ボタンを押すと、Magicanのすべてのコンポーネントが削除されます(Magicanのアンインストール終了後に、Webブラウザでアンインストールの理由を尋ねるアンケート・ページが開きますが、このページは無視して閉じました)。

  4. Magicanによるアンイストール処理が終わった後、ターミナルから次のコマンドを実行して、残っているMagicanの関連ファイルを検索しました。
    % sudo find /Applications /Library ~/Library /private/var/db -name "*[M|m]agican*" -ls

    そして、見つかったMagicanの関連ファイルをすべて削除しました。
    % rm -rf ~/Library/Preferences/com.magican.*
    % rm -rf ~/Library/Caches/com.magican.*
    % rm -rf ~/Library/Logs/Magican*
    % sudo rm -rf /private/var/db/BootCaches/200FA34F-2267-4ED5-A03A-D70EF0AE905C/app.com.magican.*
    % sudo rm -rf /private/var/db/receipts/com.magican.*

    ここで削除するファイルは、AppCleanerのMagican関連ファイルの検索結果と照合しながら選別しました(上のfindコマンドでは、Webブラウザのキャシュ・ファイルなどもヒットするからです)。

以上でMagicanのアンインストールは終わりですが、余談的な情報も書いておきます。

じつは、上のApple Support Communitiesのページに辿り着いて、今回のケースの症状を解決するまでに試行錯誤を繰り返しました。

まず最初に試したのが、このアプリです。

Icon-AdwareMedic-64x64.pngAdwareMedic

SCShot_150712_0003-AdwareMedic_Scanning_Adware-600x603.png
ググって見つけたフリー・ソフトですが、「Mac Adware」というキーワードで検索すると、AdwareMedicのページがトップでヒットします。

さっそくこのAdwareMedic試してみたところ、私の環境では、下のようにAwesome ScreenshotというSafariとFirefoxのプラグインが検出されました。
SCShot_150712_0005-AdwareMedic_Scanning_Adware-700x572
このAwesome Screenshotというプラグインも便利に利用していたのですが、じつは、3ヶ月程前にこいつがどうも悪さをしているらしいという下のページを見つけて、SafariとFirefoxのいずれもプラグインは残した状態のその機能を無効にしていました。

 Awesome Screenshot が閲覧したサイトのURLを収集している疑い | 秋元@サイボウズラボ・プログラマー・ブログ
 Awesome Screenshot URL tracking and niki-bot | mig5.net

今回AdwareMedicによってAdwareとして検出されたことを受けて、Awesome Screenshotも削除してしまいました(AdwareMedicではなく、SafariとFirefox側でプラグインをアンインストールしました)。

ちなみに、このAwesome Screenshotというのは縦に長くてスクロールしないと表示できないページを一つのイメージでスクリーンショットを作成してくれるプラグインです。これも結構広く使われているようですが、上のページに記載されているようにユーザーの閲覧サイト履歴を収集している疑いが濃厚で、Adwareを仕込むこともあるらしいので、たとえ便利でも使うのは止めた方が無難です。私もブログ記事に貼るWebページのスクリーンショットを作成するのにAwesome Screenshotを利用していましたが、いまはqSnapいうものに乗り換えています。

最後に、Macで起きる問題を解決するのに役立ちそうなフリー・ソフトをもう一つ見つけたので紹介しましょう。

Icon-EtreCheck-64x64.png EtreCheck

このEtreCheckというソフトの存在は、上のApple Support Communitiesのページで知りました。これはMacのハードウェアやソフトウェアの詳細情報を収集して表示するだけのシンプルなアプリです。Macの標準アプリの[システム情報](System Information)と似ていますが、[システム情報]はカテゴリ別なのに対してEtreCheckの方は一覧形式で情報を表示してれます。

私のMacBook Air 11-inch(Early 2014)で、このEtreCheckを実行した結果を以下に示します。
SCShot_150712_0048-EtreCheck_Checking_SystemInfo-610x1160.png
SCShot_150712_0049-EtreCheck_Checking_SystemInfo-610x1138.png
SCShot_150712_0050-EtreCheck_Checking_SystemInfo-610x678.png
上の一覧情報の中には[システム情報]によって取得できるものもありますが、カーネル拡張モジュール、エージェント、デーモンなどの情報は特殊なコマンドを使わないと取得できません。これらのエントリ情報の横に[Click for support]という文字列が存在しますが、これはリンクで、クリックするとWebブラウザが開いてGoogleの検索情報が表示されるようになっています。EtreCheckの取得情報とGoogle検索情報を組み合わせることで、カーネル拡張モジュール、エージェント、デーモンなどが悪意のあるものかどうかの判断材料が得られる訳です。

このEtreCheckはApple社内でも利用されているそうです。マニアックなアプリですが、長年Macを使っていてディープな情報も理解できるようなユーザーにとってはかなり役立つものじゃないかと思います。私はこのEtreCheckというアプリが気に入って、すべてのMacへインストールしました。普段使うことはないでしょうが、いざというときに役立ちそうです。


posted by とみやん at 09:12| Comment(0) | TrackBack(0) | PC > Mac

2015年05月30日

Preztoによるzshプラグインの導入

前々からまとまった時間が取れたら、Mac OS XのCLI環境の再整備をやりたいと思っていました。私のCLI環境では、ターミナルをデフォルトのTerminalからiTerm2へ、ログインシェルもbashからzshへ換えています。この2つを行ったことで、CLI環境は格段に使い勝手が良くなりましたが、さらに、今回は次の2つを目標を達成することを目指して整備作業をやることにしました。
  • プラグインを導入して、zsh環境をさらに使い易くする。
  • GitHubを利用して、dotfilesを一元的に管理する。

Mac OS X CLI環境整備の第一段として、Preztoというプラグイン・マネージャーを使ってzshへのプラグイン導入を行ったので、自分自身の備忘録を兼ねてその作業記録を書きます。

zshは豊富な機能やオプション設定を持っていて、zsh本体には標準でこれらを利用したプラグインが含まれています。標準プラグインを使うことで、zshの動作をカスタマズすることができます。また、zshを使っているユーザーは非常に多いので、ユーザーが独自に作成したプラグイン(外部プラグイン)も世の中にはたくさん存在しています(参考ページBに主要なzshの外部プラグインの一覧が掲載されています)。zshの外部プラグインは個別に入れていくこともできますが、プラグイン・マネージャーを使った方が格段に導入が楽です。ググって調べてみると、zshのプラグイン・マネージャーとして以下の3つが有名らしいです。

Google検索のヒット数から判断すると、これらの中で一番広く使われているのはoh-my-zshのようです。これはプラグイン・マネージャーと言うよりは、作成者の好みの設定を数多く収集したオプション・コレクションみたいなものらしいです。上記のoh-my-zshのリンクページには180以上のプラグインが収納されていると書かれていますが、全体の作りが良くないらしく若干動作が重くて、プラグインのメンテもあまりされていないという情報があります。さらに、oh-my-zshのプラグインにはユーザーがRubyを使っていることを前提とした設定が多く含まれているという情報も散見しました。私はプログラミング言語としてRubyを使っておらず、今後も使う予定はまったくはありません。私の好みとは合っていないような気がしたので、oh-my-zshは候補から外しました。Antigenというのは、zshの作者がoh-my-zshとvundle(Vimのプラグイン・マネージャー)の影響を受けて開発しているプラグイン・マネージャーです。Antigenは一部の機能をoh-my-zshのプラグインをそのまま利用する形で実現されています。この点が気に入らなかったのと、Google検索のヒット数から情報が少ないことを理由にAntigenも候補から外しました。最終的に消去法で残ったPreztoをzshのプラグイン・マネージャーとして採用することに決めました。

■ Preztoのインストールと設定


Preztoのインストールは、以下のコマンドによって行えます。
% git clone --recursive https://github.com/sorin-ionescu/prezto.git "${ZDOTDIR:-$HOME}/.zprezto"

このコマンドを実行すると、~/.zpreztoというディレクトリが作成され、その中にPreztoのリポジトリのクローンが作成されます。

続いて、Preztoの起動スクリプトファイルのリンクを作成しますが、その前に既存のzshのスクリプトファイルを保存しました。
% cd ~
% mkdir zsh_orig
% mv .zshrc zsh_orig

私の環境では.zshrcしか存在しなかったので、このファイルだけ保存しましたが、.zlogin, .zlogout, .zprofile, .zshenv, .zshrcが存在する場合は、これらをすべて保存しておきます。

最後に以下のコマンドを実行すれば、zshの起動時にPreztoを読み込むための.zlogin, .zlogout, .zprofile, .zshenv, .zshrc(これらはすべて~/.zprezto/runcomsに格納されているファイルのリンク)がホームディレクトリに作成されます。
% setopt EXTENDED_GLOB
% for rcfile in "${ZDOTDIR:-$HOME}"/.zprezto/runcoms/^README.md(.N); do
ln -s "$rcfile" "${ZDOTDIR:-$HOME}/.${rcfile:t}"
done

Preztoをインストールした直後に別のターミナルでzshを起動すると、コマンド・プロンプトが下のような表示に変わりました。
SCShot_150530_0002-Installing_Prezto.png
Preztoのプラグインを有効にしたり個々のプラグインのオプション設定値を変えるには、~/.zpreztorcというファイル(これは~/.zprezto/runcoms/zpreztorcに対するリンク)を編集します。デフォルトではこのファイルは以下のような内容になっています。
#
# Sets Prezto options.
#
# Authors:
# Sorin Ionescu <sorin.ionescu@gmail.com>
#

#
# General
#

# Set case-sensitivity for completion, history lookup, etc.
# zstyle ':prezto:*:*' case-sensitive 'yes'

# Color output (auto set to 'no' on dumb terminals).
zstyle ':prezto:*:*' color 'yes'

# Set the Zsh modules to load (man zshmodules).
# zstyle ':prezto:load' zmodule 'attr' 'stat'

# Set the Zsh functions to load (man zshcontrib).
# zstyle ':prezto:load' zfunction 'zargs' 'zmv'

# Set the Prezto modules to load (browse modules).
# The order matters.
zstyle ':prezto:load' pmodule \
'environment' \
'terminal' \
'editor' \
'history' \
'directory' \
'spectrum' \
'utility' \
'completion' \
'prompt'

#
# Editor
#

# Set the key mapping style to 'emacs' or 'vi'.
zstyle ':prezto:module:editor' key-bindings 'emacs'

# Auto convert .... to ../..
# zstyle ':prezto:module:editor' dot-expansion 'yes'

#
# Git
#

# Ignore submodules when they are 'dirty', 'untracked', 'all', or 'none'.
# zstyle ':prezto:module:git:status:ignore' submodules 'all'

#
# GNU Utility
#

# Set the command prefix on non-GNU systems.
# zstyle ':prezto:module:gnu-utility' prefix 'g'

#
# History Substring Search
#

# Set the query found color.
# zstyle ':prezto:module:history-substring-search:color' found ''

# Set the query not found color.
# zstyle ':prezto:module:history-substring-search:color' not-found ''

# Set the search globbing flags.
# zstyle ':prezto:module:history-substring-search' globbing-flags ''

#
# Pacman
#

# Set the Pacman frontend.
# zstyle ':prezto:module:pacman' frontend 'yaourt'

#
# Prompt
#

# Set the prompt theme to load.
# Setting it to 'random' loads a random theme.
# Auto set to 'off' on dumb terminals.
zstyle ':prezto:module:prompt' theme 'sorin'

#
# Ruby
#

# Auto switch the Ruby version on directory change.
# zstyle ':prezto:module:ruby:chruby' auto-switch 'yes'

#
# Screen
#

# Auto start a session when Zsh is launched in a local terminal.
# zstyle ':prezto:module:screen:auto-start' local 'yes'

# Auto start a session when Zsh is launched in a SSH connection.
# zstyle ':prezto:module:screen:auto-start' remote 'yes'

#
# SSH
#

# Set the SSH identities to load into the agent.
# zstyle ':prezto:module:ssh:load' identities 'id_rsa' 'id_rsa2' 'id_github'

#
# Syntax Highlighting
#

# Set syntax highlighters.
# By default, only the main highlighter is enabled.
# zstyle ':prezto:module:syntax-highlighting' highlighters \
# 'main' \
# 'brackets' \
# 'pattern' \
# 'cursor' \
# 'root'
#
# Set syntax highlighting styles.
# zstyle ':prezto:module:syntax-highlighting' styles \
# 'builtin' 'bg=blue' \
# 'command' 'bg=blue' \
# 'function' 'bg=blue'

#
# Terminal
#

# Auto set the tab and window titles.
# zstyle ':prezto:module:terminal' auto-title 'yes'

# Set the window title format.
# zstyle ':prezto:module:terminal:window-title' format '%n@%m: %s'

# Set the tab title format.
# zstyle ':prezto:module:terminal:tab-title' format '%m: %s'

#
# Tmux
#

# Auto start a session when Zsh is launched in a local terminal.
# zstyle ':prezto:module:tmux:auto-start' local 'yes'

# Auto start a session when Zsh is launched in a SSH connection.
# zstyle ':prezto:module:tmux:auto-start' remote 'yes'

# Integrate with iTerm2.
# zstyle ':prezto:module:tmux:iterm' integrate 'yes'

zstyle ':prezto:load' pmodule '<PLUGIN_MODULE>' ...」という記述がzshの起動時にロードされるプラグイン・モジュールを定義しています。この記述にプラグイン名を追加することでプラグインを有効にできます。~/.zprezto/modulesに存在するディレクトリ名がプラグイン名に相当します。また、「zstyle ':prezto:module:<MODULE_NAME>' <OPTION> '<VALUE>'」という記述が多く存在しますが、これらはプラグイン・モジュールのオプション値を設定しています。これらの中で、「zstyle ':prezto:module:prompt' theme 'sorin'」がコマンド・プロンプトのテーマを設定しているプラグイン・オプションです。「prompt -p」というコマンドによって、利用可能なプロンプト・テーマの表示形式の一覧を確認することができます。各プラグインの機能やオプションの詳細についてはプラグイン・ディレクトリ内のREADME.mdに説明が記載されています。私は好みで、上記の.zpretorcを以下のように変更しました。
--- /Users/yuhri/Downloads/prezto-master/runcoms/zpreztorc	2015-05-26 19:12:54.000000000 +0900
+++ /Users/yuhri/.zpreztorc 2015-05-30 18:05:19.000000000 +0900
@@ -32,6 +32,14 @@
'spectrum' \
'utility' \
'completion' \
+ 'archive' \
+ 'git' \
+ 'python' \
+ 'node' \
+ 'osx' \
+ 'homebrew' \
+ 'syntax-highlighting' \
+ 'history-substring-search' \
'prompt'

#
@@ -39,7 +47,7 @@
#

# Set the key mapping style to 'emacs' or 'vi'.
-zstyle ':prezto:module:editor' key-bindings 'emacs'
+zstyle ':prezto:module:editor' key-bindings 'vi'

# Auto convert .... to ../..
# zstyle ':prezto:module:editor' dot-expansion 'yes'
@@ -63,13 +71,13 @@
#

# Set the query found color.
-# zstyle ':prezto:module:history-substring-search:color' found ''
+zstyle ':prezto:module:history-substring-search:color' found ''

# Set the query not found color.
-# zstyle ':prezto:module:history-substring-search:color' not-found ''
+zstyle ':prezto:module:history-substring-search:color' not-found ''

# Set the search globbing flags.
-# zstyle ':prezto:module:history-substring-search' globbing-flags ''
+zstyle ':prezto:module:history-substring-search' globbing-flags ''

#
# Pacman
@@ -117,12 +125,12 @@

# Set syntax highlighters.
# By default, only the main highlighter is enabled.
-# zstyle ':prezto:module:syntax-highlighting' highlighters \
-# 'main' \
-# 'brackets' \
-# 'pattern' \
-# 'cursor' \
-# 'root'
+zstyle ':prezto:module:syntax-highlighting' highlighters \
+ 'main' \
+ 'brackets' \
+ 'pattern' \
+ 'cursor' \
+ 'root'
#
# Set syntax highlighting styles.
# zstyle ':prezto:module:syntax-highlighting' styles \
@@ -135,7 +143,7 @@
#

# Auto set the tab and window titles.
-# zstyle ':prezto:module:terminal' auto-title 'yes'
+zstyle ':prezto:module:terminal' auto-title 'yes'

# Set the window title format.
# zstyle ':prezto:module:terminal:window-title' format '%n@%m: %s'
@@ -155,3 +163,10 @@

# Integrate with iTerm2.
# zstyle ':prezto:module:tmux:iterm' integrate 'yes'
+
+#
+# Custom
+#
+
+# Prevent to convert 'diff' to 'git diff' by utility module.
+alias diff='command diff'

なお、インストール済みのPreztoを更新したい場合は、以下のコマンドによって行えます。
% cd ~/.zprezto
$ git pull && git submodule update --init --recursive


■ dircolors-solarizedの導入と設定


Preztoのインストールに合わせて、以下のサイトで配布されているdircolors-solarizedというものも導入しました。

 seebi/dircolors-solarized ・ GitHub

これは、GNU lsコマンドによるディレクトリやファイル名の表示色をSolarizedカラーに適合させるためのカラー・テーマです。私はiTerm2のカラー・テーマをSolarizedに設定していますが、上のカラー・テーマを導入すると、GNU lsコマンドのディレクトリやファイル名がSolarizedカラーに対して視認性の高い色で表示されるようになります。

ただし、Mac OS XのデフォルトのlsコマンドはBSD版起源のものであり、GNU版のlsではありません。上のdircolors-solarizedを利用したい場合は、GNU lsが収納されているcoreutilsというフォーミュラをHomebrewによってインストールする必要があります。
% brew install coreutils

これでGNU ls(glsコマンド)が使えるようになったので、dircolors-solarizedを取得します。
% mkdir ~/zsh
% cd ~/zsh
% git clone git://github.com/seebi/dircolors-solarized.git

さらに、以下のコマンドを実行して、カラー・テーマ定義ファイルに対するリンクを作成します。
% ln -s $HOME/zsh/dircolors-solarized/dircolors.256dark ~/.dir_colors

最後に.zpreztorcを以下のように変更すれば、dircolors-solarizedの設定は有効になります。
--- /Users/yuhri/Backup/zpreztorc	2015-05-30 18:05:19.000000000 +0900
+++ /Users/yuhri/.zpreztorc 2015-05-30 18:06:28.000000000 +0900
@@ -30,6 +30,7 @@
'history' \
'directory' \
'spectrum' \
+ 'gnu-utility' \
'utility' \
'completion' \
'archive' \
@@ -64,7 +65,7 @@
#

# Set the command prefix on non-GNU systems.
-# zstyle ':prezto:module:gnu-utility' prefix 'g'
+zstyle ':prezto:module:gnu-utility' prefix 'g'

#
# History Substring Search


【2015/05/31 追記】

本記事に掲載した私家版.zpreztorcに「alias diff='command diff'」という記述が存在しますが、これはPreztoのutilityモジュールによって「diff」コマンドが「git diff」に変換されてしまうことを回避するために追加した設定です(この設定は参考ページCに掲載されていました)。このコマンド変換は以下のファイル内の定義によって実現されています。
#
# Highlights diff output.
#
# Authors:
# Sorin Ionescu <sorin.ionescu@gmail.com>
#

function diff {
if zstyle -t ':prezto:module:utility:diff' color; then
if (( $+commands[colordiff] )); then
command diff --unified "$@" | colordiff --difftype diffu
elif (( $+commands[git] )); then
git --no-pager diff --color=auto --no-ext-diff --no-index "$@"
else
command diff --unified "$@"
fi
else
command diff --unified "$@"
fi
}

diff "$@"

このファイルでは、colordiffコマンドが存在する場合は「diff | colordiff」が、colordiffコマンドが存在せず、かつgitコマンドが存在する場合に「git diff」の方が使われるように定義されています。そこで、Homebrewでcolordiffコマンドをインストールしてみました。
% brew install colordiff

その結果、やはり「diff」コマンドは「diff | colordiff 」として実行されるようになりました。

上記の結果から、colordiffをインストールしておけば、「diff」コマンドは「git diff」に変換されないので、.zpreztorc内に「alias diff='command diff'」という記述は不要になります。

【参考ページ】

  1. Zsh の環境を揃えるのに疲れたら Prezto がオススメ ≫ GeeksDev
  2. zshの外部プラグインまとめ - Qiita
  3. ターミナル環境を見直す(1) - zsh + prezto編 - oinume journal
  4. oh-my-zshを使っていて重いと感じている方、preztoはいかが? - Qiita
  5. Zsh + Prezto で快適コマンド環境を構築する | Developers.IO
  6. Zsh - LS_COLORSを設定しよう - Qiita



posted by とみやん at 13:14| Comment(0) | TrackBack(0) | PC > Mac

2015年04月02日

Tizenアプリ開発事始め (2)

昨日(04/01)から日吉の街は若者達で溢れかえっています。昨日、慶応大学の入学式があったようです。クラスやクラブの仲間同士で親睦会をやっているのでしょう。街中の喫茶店、カフェ、レストラン、ファミレスはどこも新入生らしい若者で一杯で、他の客はいつも以上に入りづらい雰囲気が漂っています。リクルート・スーツの新社会人もそうですが、大学の新入生を見分けるのはすごく簡単です。私服に慣れていない様子で一目で判ってしまいます。特に地方から上京してきたらしい女子学生は、私服がぜんぜん様になっていないので一発でそれだと判ります(いま三くらいアダルティな服装が似合っておらず、私服の着こなしに慣れていないのが丸分かりです)。私は大学へは進学しなかったので当事者としての経験はありませんが、これが学生街特有の春の雰囲気というものなのですね。彼らを観ていると、若さへの羨望が湧き上がってきて複雑な気持ちになります。人生の黄昏時を迎えている私にとっては眩しすぎる光景です。

さて、前記事の続きを書きます。Tizen Developer Guideの掲載されているチュートリアルを読みながら、Tizen(Tizen Mobile)のNative ApplicationモデルのHello Worldアプリを作成してEmulatorで実行できることを確認するのがゴールです。

■ Native Applicationモデル・アプリの作成


最初にやるべきことは、Native Applicationモデルのプロジェクトの作成です。

Tizen IDEの[File] > [New] > [Project]メニューを選択すると、下のようなウィンドウが開きます。
SCShot_150402_0003-Creating_HelloWorld_NativeApp-TizenIDE-525x500.png
このウィンドウの[Tizen] > [Tizen Native Project]という項目を選択して、[Next > ]ボタンを押すと、さらに下のような[New Tizen Native Project]ウィンドウが開きます。
SCShot_150402_0008-Creating_HelloWorld_NativeApp-TizenIDE-910x759
チュートリアルに従って、このウィンドウでは[Template] > [MOBILE-2.3] → [UI Application] > [Basic UI Application]という項目を選択し、[Project name]エディットボックスにプロジェクト名を入力した上で、[Finish]ボタンを押しました。この操作によって、新しいNative Applicationモデルのプロジェクトが作成されます。

作成されたプロジェクトは、Workbenchウィンドウの[Project Explorler]ビュー内にエントリとして追加されます。
SCShot_150402_0010-Creating_HelloWorld_NativeApp-TizenIDE-1024x742
プロジェクトを作成できたので、さっそくこれをビルドしてみました(上のスクリーンショットは、プロジェクトをビルドした後のものです)。ビルドのやり方はWeb Applicationと同じです。

■ EmulatorによるNative Applicationの実行


Native Applicationモデルのプロジェクトが作成できたので、Tizen SDKのEmulatorを使ってこれを実行してみしまた。Emulatorの仮想マシンでプロジェクトを実行する手順は、Web Applicationと同じなので省略します(前記事を参照のこと)。
SCShot_150402_0011-Creating_HelloWorld_NativeApp-TizenIDE-434x452.png
SCShot_150402_0012-Creating_HelloWorld_NativeApp-TizenIDE-434x452.png

■ Native Application Hello Worldチュートリアル


以上でNative Applicationモデル・アプリの作成とEmulatorによる実行は終わりですが、「Creating Your First Tizen Application」チュートリアルには、プロジェクトに変更を加えてEmulatorで実行するまでの手順が書かれています。続きの作業として、このチュートリアルの内容を最後までやってみました。

Tizen IDEの[Project Explorler]内のプロジェクトの構成ファイルからsrc/helloworldnativeapp.c(このソースファイルの名前はプロジェクト名に連動して決まるようです。つまりプロジェクト名によってファイル名が変わります)をダブルクリックすると、下のような[Editor]ビューが開いて、その中にhelloworldnativeapp.cの内容が表示されます。
SCShot_150402_0013-Creating_HelloWorld_NativeApp-TizenIDE-1024x742
helloworldnativeapp.cにはC/C++で書かれたアプリの処理コードが含まれています。

チュートリアルにはNative Applicationプログラムの基本原則とTizen IDEのコード入力支援機能についての概要説明が書かれており、それに続いて、helloworldnativeapp.cに対する改造版サンプル・コードが掲載されています。[Editor]ビュー内のコードを編集して、このサンプル・コードをhelloworldnativeapp.cへ追加してみました。
#include <tizen.h>
#include "helloworldnativeapp.h"

#if 0
typedef struct appdata {
Evas_Object *win;
Evas_Object *conform;
Evas_Object *label;
} appdata_s;
#endif
#if 1
typedef struct appdata
{
// All graphical objects here are pointers to the value of the type Evas_Object.
Evas_Object *win;
Evas_Object *conformant;
Evas_Object *naviframe;
} appdata_s;
#endif

static void
win_delete_request_cb(void *data, Evas_Object *obj, void *event_info)
{
ui_app_exit();
}

#if 0
static void
win_back_cb(void *data, Evas_Object *obj, void *event_info)
{
appdata_s *ad = data;
/* Let window go to hide state. */
elm_win_lower(ad->win);
}
#endif
#if 1
static void
clicked_cb(void *user_data, Evas_Object *obj, void *event_info)
{
elm_exit();
}
#endif

#if 0
static void
create_base_gui(appdata_s *ad)
{
/* Window */
ad->win = elm_win_util_standard_add(PACKAGE, PACKAGE);
elm_win_autodel_set(ad->win, EINA_TRUE);

if (elm_win_wm_rotation_supported_get(ad->win)) {
int rots[4] = { 0, 90, 180, 270 };
elm_win_wm_rotation_available_rotations_set(ad->win, (const int *)(&rots), 4);
}

evas_object_smart_callback_add(ad->win, "delete,request", win_delete_request_cb, NULL);
eext_object_event_callback_add(ad->win, EEXT_CALLBACK_BACK, win_back_cb, ad);

/* Conformant */
ad->conform = elm_conformant_add(ad->win);
elm_win_indicator_mode_set(ad->win, ELM_WIN_INDICATOR_SHOW);
elm_win_indicator_opacity_set(ad->win, ELM_WIN_INDICATOR_OPAQUE);
evas_object_size_hint_weight_set(ad->conform, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
elm_win_resize_object_add(ad->win, ad->conform);
evas_object_show(ad->conform);

/* Label*/
ad->label = elm_label_add(ad->conform);
elm_object_text_set(ad->label, "Hello EFL");
evas_object_size_hint_weight_set(ad->label, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
elm_object_content_set(ad->conform, ad->label);
evas_object_show(ad->label);

/* Show window after base gui is set up */
evas_object_show(ad->win);
}
#endif

#if 1
static void
create_gui(appdata_s *ad)
{
// Create the window
ad->win = elm_win_util_standard_add(PACKAGE, PACKAGE);
elm_win_conformant_set(ad->win, EINA_TRUE);

// Advertise which rotations are supported by the application; the
// device_orientation callback is used to do the actual rotation when
// the system detects the device's orientation has changed
if (elm_win_wm_rotation_supported_get(ad->win)) {
int rots[4] = { 0, 90, 180, 270 };
elm_win_wm_rotation_available_rotations_set(ad->win, (const int *)(&rots), 4);
}

// Add a callback on the "delete,request" event; it is emitted when
// the system closes the window
evas_object_smart_callback_add(ad->win, "delete,request", win_delete_request_cb, NULL);

// Alternatively, elm_win_autodel_set() can be used to close
// the window (not the application) automatically
// with the Back button, for example
// elm_win_autodel_set(ad->win, EINA_TRUE);

// Create the conformant
ad->conformant = elm_conformant_add(ad->win);

// Set the conformant use as much horizontal and vertical space as
// possible, that is, expand in both directions
evas_object_size_hint_weight_set(ad->conformant, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);

// Set the conformant as the resize object for the window:
// the window and the conformant grow together
// in proportion to each other
elm_win_resize_object_add(ad->win, ad->conformant);

// Show the conformant since all widgets are hidden by default
evas_object_show(ad->conformant);

// Create the naviframe
ad->naviframe = elm_naviframe_add(ad->conformant);
elm_object_content_set(ad->conformant, ad->naviframe);

// Show the box
evas_object_show(ad->conformant);

// Create the box
Evas_Object *box = elm_box_add(ad->naviframe);

// Set the box vertical
elm_box_horizontal_set(box, EINA_FALSE);

// The box expands when its contents need more space
evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);

// The box fills the available space
evas_object_size_hint_align_set(box, EVAS_HINT_FILL, EVAS_HINT_FILL);

// Add the box in the naviframe container
elm_naviframe_item_push(ad->naviframe, "Hello World", NULL, NULL, box, NULL);

// Show the box
evas_object_show(box);

// Create the label
Evas_Object *label = elm_label_add(box);
// The label expands when its contents need more space
evas_object_size_hint_weight_set(label, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
// The box fills the available space on the horizontal axis and is
// centered on the vertical axis (placed at 0.5 vertically, that is, in the
// middle)
evas_object_size_hint_align_set(label, EVAS_HINT_FILL, 0.5);

// Set the text for the label and set formatting through the HTML tags:
// - "Hello World!" centered on the first line
// - skip a line
// - Add a longer text that does not fit on a single line but wraps at
// the word boundaries
elm_object_text_set(label,
"<align=center>Hello World!</align>< br >"
"< br >"
"<wrap = word>Clicking on the button below closes the application.</wrap>");

// Add the label at the end of the box
elm_box_pack_end(box, label);

// Show the label
evas_object_show(label);

// Create the button
Evas_Object *button = elm_button_add(box);

// The box expands when its contents need more space
evas_object_size_hint_weight_set(button, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);

// The button fills the available space on the horizontal axis and is
// placed at the bottom of the vertical axis (1 is the end of the axis,
// the coordinates start at (0, 0) on the top-left corner
evas_object_size_hint_align_set(button, EVAS_HINT_FILL, 1);

// Set the text for the button
elm_object_text_set(button, "Close!");

// Add a callback on the button for the "clicked" event; implementation of
// the callback is below
evas_object_smart_callback_add(button, "clicked", clicked_cb, NULL);

// Add the widget at the end of the box; since the axis starts in the top left
// corner and the box is vertical, the end of the box is below the label
elm_box_pack_end(box, button);

// Show the button
evas_object_show(button);

// Show window after the GUI is set up
evas_object_show(ad->win);
}
#endif

static bool
app_create(void *data)
{
/* Hook to take necessary actions before main event loop starts
Initialize UI resources and application's data
If this function returns true, the main loop of application starts
If this function returns false, the application is terminated */
appdata_s *ad = data;

#if 0
create_base_gui(ad);
#endif
#if 1
create_gui(ad);
#endif
return true;
}

static void
app_control(app_control_h app_control, void *data)
{
/* Handle the launch request. */
}

static void
app_pause(void *data)
{
/* Take necessary actions when application becomes invisible. */
}

static void
app_resume(void *data)
{
/* Take necessary actions when application becomes visible. */
}

static void
app_terminate(void *data)
{
/* Release all resources. */
}

static void
ui_app_lang_changed(app_event_info_h event_info, void *user_data)
{
/*APP_EVENT_LANGUAGE_CHANGED*/
char *locale = NULL;
system_settings_get_value_string(SYSTEM_SETTINGS_KEY_LOCALE_LANGUAGE, &locale);
elm_language_set(locale);
free(locale);
return;
}

static void
ui_app_orient_changed(app_event_info_h event_info, void *user_data)
{
/*APP_EVENT_DEVICE_ORIENTATION_CHANGED*/
return;
}

static void
ui_app_region_changed(app_event_info_h event_info, void *user_data)
{
/*APP_EVENT_REGION_FORMAT_CHANGED*/
}

static void
ui_app_low_battery(app_event_info_h event_info, void *user_data)
{
/*APP_EVENT_LOW_BATTERY*/
}

static void
ui_app_low_memory(app_event_info_h event_info, void *user_data)
{
/*APP_EVENT_LOW_MEMORY*/
}

int
main(int argc, char *argv[])
{
appdata_s ad = {0,};
int ret = 0;

ui_app_lifecycle_callback_s event_callback = {0,};
app_event_handler_h handlers[5] = {NULL, };

event_callback.create = app_create;
event_callback.terminate = app_terminate;
event_callback.pause = app_pause;
event_callback.resume = app_resume;
event_callback.app_control = app_control;

ui_app_add_event_handler(&handlers[APP_EVENT_LOW_BATTERY], APP_EVENT_LOW_BATTERY, ui_app_low_battery, &ad);
ui_app_add_event_handler(&handlers[APP_EVENT_LOW_MEMORY], APP_EVENT_LOW_MEMORY, ui_app_low_memory, &ad);
ui_app_add_event_handler(&handlers[APP_EVENT_DEVICE_ORIENTATION_CHANGED], APP_EVENT_DEVICE_ORIENTATION_CHANGED, ui_app_orient_changed, &ad);
ui_app_add_event_handler(&handlers[APP_EVENT_LANGUAGE_CHANGED], APP_EVENT_LANGUAGE_CHANGED, ui_app_lang_changed, &ad);
ui_app_add_event_handler(&handlers[APP_EVENT_REGION_FORMAT_CHANGED], APP_EVENT_REGION_FORMAT_CHANGED, ui_app_region_changed, &ad);
ui_app_remove_event_handler(handlers[APP_EVENT_LOW_MEMORY]);

ret = ui_app_main(argc, argv, &event_callback, &ad);
if (ret != APP_ERROR_NONE) {
dlog_print(DLOG_ERROR, LOG_TAG, "app_main() is failed. err = %d", ret);
}

return ret;
}

※「#if 0 〜 #endif」で挟まれた行はオリジナルのコードを無効化した部分、「#if 1 〜 #endif」で挟まれた行が追加したコードです。また、160行目と161行目に“< br >”という文字列が存在しますが、これは“<br>”が正しいです。“<br>”だとHTMLの改行タグと解釈されてしまうため、わざと“< br >”に変えています。上のソースコードをコピペして利用する場合は、この2箇所を修正してください。

上のhelloworldnativeapp.cの処理コードの詳細はまだ理解できていません。これからTizenのアプリ開発を続けていけば、自然に理解できるようになるでしょう。

上記の操作が終わった後、プロジェクトを再ビルドした上で、Emulator Managerの仮想マシンでプロジェクトを再度実行してみました。すると、アプリの起動画面は下のような表示に変わりました。
SCShot_150402_0014-Creating_HelloWorld_NativeApp-TizenIDE-434x452.png
チュートリアルに掲載されているスクリーンショットと若干の相違がありますが、ほぼ同じアプリの起動画面が表示されたので、これでゴール到達とします。

Web ApplicationとNative Applicationを比較すると、前者のプログラミング言語はHTML5とJavaScriptなのに対して後者はC/C++になります。プログラミングの手軽さではやはりWeb Applicationの方に軍配を上げざるをえません。モバイル・アプリ開発ではフットワークの軽さはすごく重要だと思います。C/C++だと単機能な軽いアプリでも最低丸一日かかりますが、HTML5 + JavaScriptだと数時間で出来てしまうじゃないかという気がします(もちろんOS側のフレームワークやAPIに精通していることは条件になりますが)。TizenやFirefox OSでHTML5 + JavaScriptでアプリが書けることは、iOSやAndroidと比較して大きな利点だと思います(iOSやAndroidにもHTML5 + JavaScriptでアプリ開発ができるフレームワークやツールは存在します)。HTML5 + JavaScriptの有利さを知って、益々Tizenへの興味が膨らんできました。HTML5とJavaScriptを本格的に勉強してみたかったので、TizenやFirefox OSのアプリ開発は良い素材になりそうです。組込み、モバイル、Webプログラミングが融合した研究テーマであることに気づかされました。

以上で、TizenのHello Worldアプリの作成とEmlator/Web Simulatorによる動作確認は終了です。記事を書きながら作業を進めたので2日かかってしまいましたが、全体でも1〜2時間でできる作業だと思います。03/27の記事と合わせて、Tizenへの取り組みを始めるプログラマ達の役に立てば幸いです。

私がTizenの研究を始めた理由は、組込みLinuxとモバイル・アプリ開発の両方に取り組めるテーマだからです。JavaのフレームワークでLinuxを覆い隠しているAndroidよりは、システム側をいじくり回す機会が多いんじゃないかと思っています(私がAndroidを嫌っている大きな理由がこれです。個人研究のプログラミングでJavaは使いたくないです)。Yocto Linuxの記事へのアクセス数があまりに少ないので、もう少しメジャーな研究テーマへシフトしたかったことも理由の一つです(Tizenはまだまだメジャーではないですが、Yocto Linuxよりは検索する人が多いんじゃないかと思います)。Yocto Linuxのネタはまだたくさん有るのですが、こちらはサブのテーマに格下げして、これからはTizenの方をメインの研究テーマとして取り組んでいきます。他にも挑戦してみたい研究テーマもいくつかあるのですが、当面はTizenメインでやっていきます。

やはり実機ターゲットが無いと意欲が湧いてこないので、近いうちにTizenが動くターゲットを一台入手しようと目論んでいます。現在はまだ情報収集中ですが、Androidスマホ(Samsung製限定?)かx86 Atom Bay Trail シリーズを搭載したタブレット辺りでTizenを動かすことに挑戦してみようと計画しています。Firefox OSより情報は少ないですが、ググるといくつかの情報がヒットするので、すでに色々やっている人はいるようです。この計画の実作業を始めたら、その内容も記事に書きたいと思っています。

【参考ページ】

  1. [Tizen]ネイティブアプリを作成しエミュレータ上で実行してみる | GCG研究所
  2. GClue blog: Tizen のNative アプリを実行してみる
posted by とみやん at 09:59| Comment(0) | TrackBack(0) | モバイルOS研究 > Tizen