SimpleBoxes

Windows 11 を使い始めました

[図] Windows 11 デスクトップスクリーンショット

昨年 11 月末頃、 Windows のデスクトップマシンを購入しました。

購入したマシンにプリインストールされていたのは Windows 11 だったので、そのまま Winodws 11 を使っています。

デュアルブートにして Ubuntu マシンにしようかとも思ったのですが、WSL (Windows Subsystem for Linux) があるかと思って、とりあえず保留にしています。

Windows 11、 散々な評価も見かけたのですが、とりあえずこれまでのところ、特に悪い印象はないです。とは言え、まぁ Windows 10 のままでも支障はないという気がしなくもない……。

[図] Windows 11 設定スクリーンショット

「設定」はとても今風というか、ウェブアプリによく見られるサイドバーメニュー形式に変わりました。個人的には、使い勝手は向上したと感じていて、これだけでも Windows 11 がよいなと思うポイントだったりします。まだコントロールパネル残っていたりしますが。

[図] 中央寄せになったタスクバーからスタートメニューを開いているところ。

デフォルトでアイコンなどの表示位置が中央寄せになったタスクバー、どうなんだろう?と思っていたんですが、RoundedTB というユーティリティアプリを導入すると全く気にならなくなりました。見た目や使い勝手が一層 macOS に近くはなってしまうので、その辺がちょっと気にはなりますが。

Windows 11 利用とともに使い始めたアプリ

以下は Windows 11 利用とともに使い始めたアプリ群ですが、 Windows 10 でも導入可能なので、 Windows 11 だからどうという訳ではありません。

Windows Terminal

Windows Terminal がなかなか良い。

いわゆるターミナルアプリで、Windows 11 にはプリインストールされてました。PowerShell / コマンドプロンプトの代替ってだけじゃなくて、 WSL 環境用のターミナルもサポートしています。

というか、これオープンソースなんですね。ちょっとびっくり。

PowerToys

PowerToys が壮絶便利です。

むか〜しからあったと思うんですが、いつの間にかオープンソースになっていて、キーボードカスタマイズなどもサポートしてました。

以前はかざぐるマウスなどのサードパーティユーティリティ使っていたのも Microsoft 謹製のアプリでできてしまう。

PowerToys 利用して mac 風なキー割り当てにしちゃうことで、後述するキーボード共有している際の違和感をかなり解消することができています。便利。

Barrier

Barrier を使って、 mac mini に繋がったキーボードを三台の PC で共有しています。

概ね良好に動作しています。Windows でインストーラなど起動した際、管理者権限問われるタイミングなどで共有が切れてしまったりすることもありますが、挙動が予測はできるので、そこまで嫌な挙動ではないです。

クリップボード共有の機能があるんですが、特にmacOS - Windows 間のクリップボードの共有が不安定。使えれば便利程度なので、そこまで困っていないです。

これまでは基本 mac マシンのみだったので、teleport というアプリを使っていましたが、Windows 非対応なので、Barrier に乗り換えました。三台 PC (macOS x 2 + Windows) の並行利用が違和なく可能になっています。

Mailspring

メーラーは Mailspring を使ってみることにしました。

私自身は Microsoft の標準メール割と使いやすいと思っていたりはするんですが、Mailspring はオープンソース かつ React アプリなので、中身にちょっと興味があって使ってみることに。

ただ、まだ Windows 環境でうまくビルドできなくて、ビルド自体はちょっと挫折気味なんですが……。

スレッド表示をオフにできなかったり、メールボックスリスト・メールリスト・メールプレビューそれぞれのペーンのサイズを覚えてくれなかったり、いくつか仕様変わって欲しいなぁと思う部分があったりはしますが、こちらも概ね不満なく。

Brave

ウェブブラウザ、 Edge がまんま Chrome なので、そのままでも良かったんですが、Brave が気になったので、Brave をメインブラウザとして使ってみることにしました。

まぁ、私の使い方では Chrome / Brave / Edge / Firefox / Safari どのブラウザでも使い勝手の面で大きな違いがないことは分かりました。

Bing Wallpaper

デスクトップピクチャ、いわゆる壁紙は、最近では標準のままで使うことが多いのですが、実機の方には Bing Wallpaper をインストールしてみました。

ブラウザの新規タブウィンドウには Momentum という機能拡張使ってランダムな写真楽しんでいるんですけど、同じように Windows のデスクトップも日替わり壁紙にしてみることに。なかなか楽しい。

スポンサーリンク

Evernote 5.7 Mac で新しくなったプレゼンテーションモード

Evernote Mac 版 ver 5.7 が先日リリースされました。

[画像]Evernote 5.7 (Mac) が 10 月末にリリースされました。

このバージョンでは、Evernote Mac 版 ver 5.3 より搭載されたプレゼンテーションモードがバージョンアップされています。

プレゼンテーションモードはプレミアム (あるいはビジネス) 会員向けサービスですが、フリー会員でも 30 日間、一切の機能制限なく試用することができます。

[画像]新しいプレゼンテーションモードではレイアウト画面が追加されました。

レイアウトの編集

これまでのプレゼンテーションモードには、ノートに挿入された水平線を「改ページ」のように扱うという機能がありました。

新しいプレゼンテーションモードでは、水平線はそのまま水平線として扱うようになりました。改ページのような「区切り線」は新しく実装されたレイアウト画面で追加・編集できるようになります。

プレゼンテーションスクリーン右上にあるボタンが「レイアウト」ボタンです。

レイアウトを開くと、プレゼンテーションの縮小版が表示されて、表示したい箇所にさっとジャンプすることができます。

レイアウト画面右側に青いドットが表示されているのが分かるでしょうか。これは区切り線が挿入できるポイントを示しています。

マウスカーソルを持っていくと、どの位置に区切り線が挿入されるのか表示されます。そのままクリックすれば、区切り線が挿入されて、プレゼンテーションがその場で更新されます。

[画像]区切り線の追加は「+」ボタンで、追加した区切り線は「−」ボタンで行えます。

すでにある区切り線の横には「-」ボタンが表示されていて、それを押すとその区切り線を削除できます。区切り線はマウスでドラッグすることができて、区切り線の位置を変えたり、前後の区切り線と合わせたりすることでレイアウト調整ができます。

テーブル表示のサポート

Evernote Mac 版 ver 5.6 でエディタの機能が大きく改善されました。テーブルがより簡単に編集できるようになり、イメージのサイズも簡単に微調整できるようになりました。

これまでのプレゼンテーションモードでは、テーブル表示が崩れてしまったりすることがありましたが、大幅に改善さています。

[画像]テーブルの表示が大幅に改善されています。

イメージ表示のブラッシュアップ

これまでノートに貼り付けられたイメージは、プレゼンテーションモードでは画面中央に左右マージンをとって表示するような形で表示されていましたが、新しいプレゼンテーションモードでは、可能な限り大きく表示するようになりました。

特に縦長のイメージは、以前のプレゼンテーションモードでは常に画面に収まるように縮小されて表示されていました。新しいプレゼンテーションモードでは、この動作が変更されて、横幅が十分にある縦長のイメージに対しては、画面をはみ出して表示するようになっています。

[画像]縦長イメージも端から端まで使って表示するようになっています。

ウェブサイトのスクリーンショットなどで、スクロールする画面をくっつけたような縦長のスクリーンショットを見かけることがあると思いますが、そのようなスクリーンショットはとても自然に表示されることになります。

画面をはみ出してしまった縦長のイメージは、クリックすると縮小表示に切り替えることができますし、エディタ上で画像のサイズを変更すると、プレゼンテーションモードでもそれをそのまま利用するので、十分に小さくすれば、画面をはみ出さないように設定することもできます。

イメージ・テーブルの見出しと説明文

区切り線を調節することで、イメージやテーブル前後の文節を見出しや説明文として設定できるようになっています。

テキストでイメージ (テーブル) を挟み込むような形になるように区切り線を追加すると、イメージ (テーブル) 上部のテキストは見出しに、イメージ (テーブル) 下部のテキストは説明文として設定されて、それぞれ見た目が変わります。

[画像]区切り線を調整することで、イメージやテーブルにキャプションをつけることができるようになりました。

その他の改善点

外観のアップデート

タイトル表示やテキストの表示フォントがデザインし直されています。

[画像]新しくなったプレゼンテーションのデザイン

残念ながら、日本語での表示は以前とあまり大きく変わらないのですが、左右のマージンや行間なども微調整されていて、以前よりもさらにスッキリとした見栄えになっている感じがします。

表示フォントのサイズ変更

以前のプレゼンテーションモードでは、表示フォントサイズはほぼ固定でした。

新しいプレゼンテーションモードでは、表示フォントサイズを三段階で切り替えることができるようになりました。

スペースキー動作の改善

以前のプレゼンテーションモードでもスペースキーで下に移動、シフト + スペースキーで上に移動という動作になっていました。

[画像]スペースキーによる画面移動

以前のプレゼンテーションモードでも、区切りや貼り付けられたイメージを認識して、それがうまく表示されるように移動するという動作になっていましたが、新しいプレゼンテーションモードでは、その動作の精度が改善されています。

スポンサーリンク

さぁ、楽しいバグ取りの時間だ — バグに対してのワークフロー

現職でも前職でも JIRA というバグトラッキングシステムを使っています。

バグが報告された時にどのようなフローで処理するかをざっとまとめてみました。

チケットの発行

報告のあったバグはシステムに登録されます。

登録されたひとつひとつのバグはチケット (ticket) と呼ぶことが多い感じです。

以前の会社では issue とも言っていました。JIRA のシステム上では issue となっています。

ちなみに英語では、"raise a ticket (an issue)", "create a ticket (an issue)", "make a ticket" と言ったりしています。

バグの報告内容

  • 概要 (Summary)
  • テストしたソフトウェアバージョン
  • テストしたハードウェアならびに OS とそのバージョン
  • 再現手順
  • スクリーンショットやムービー

バグは再現性があるかどうかが肝で、再現する手順が明らかならば、そのバグは八割方直ったも同然です。

バグに対してのアクション

プロジェクトの進行状況や日程などによって変わりますが、バグが報告された際、すぐに修正作業に入ることはまれです。

  • レポーター (Reporter)

    バグを報告した人。テスターでなくてもバグの報告者になりえますが、テスターがレポーターになることが多いです。

  • ディスパッチャー (Dispatcher)

    バグの優先順位を決めたり、割り当て分担を決める人。テクニカルリーダーがこの役目を担うことが多いのですが、プロジェクトマネージャーやシステムエンジニアがチケットの割り当てを行うこともあります。

  • 担当者 (Assignee)

    バグの修正作業を行う人。当然ながら開発者 (デベロッパ) がバグ修正を行うことが多いです。

基本的な流れとしては、

  1. レポーターからバグの報告を受ける
  2. ディスパッチャーが各開発者の負荷や開発範囲を考慮して、それぞれのバグを開発者に割り当てる
  3. 開発者がバグを修正する

という形になります。

トリアージと優先順序

もちろん報告されたバグは全て直すのが理想ですが、リリース日程がタイトな場合には、全てのバグを直すのが事実上不可能なことがあります。

その場合、報告を受けたバグに優先順位をつけて、どのバグから優先的に修正するか、もしくは、修正しないことにするか (修正するにしても次のバージョンアップで修正する) などを決めていきます。

以前勤めた職場では、優先順位決定プロセスを「トリアージ (triage)」と呼んでいました。

災害などの非常事態に行う医療トリアージから来ています。

例えば、優先順位としては、以下のようなものが挙げられます。

順位 内容
P1 緊急。アプリケーションがクラッシュするなど、このバグのために他のテスト作業や開発業務ができない。深刻なセキュリティの脆弱性など
P2 重要。リリース前に直すべきバグ。アプリケーションが要求仕様通りに動作していない
P3 不具合だが回避方法がある、ミススペルや翻訳不備などのローカライゼーション系不具合、などの緊急度の低いバグ
P4 見た目だけの問題や微妙な挙動の一貫性不備、などの動作そのものには影響しないバグ

これは一例ですが、基本的な優先順位の意味付けはチーム内で共有しておく必要があります。

優先順位に付いている「P」は priority の略。

トリアージは以下のようなメンバーで行います。

  • テクニカルリーダー (あるいは、プロジェクトマネージャ)
  • システムエンジニア (あるいは、デザイナー) : 仕様作成者
  • テストリード
  • シニアソフトウェアエンジニア

これに (チケット内容の詳細を確認するため) レポーターが参加したり、実装の詳細をしっているエンジニアが参加したりする場合があります。

ソフトウェアリリース

バグに対してのワークフローからは少し脱線しますが、バグの優先順位はソフトウェアのリリースと関連付けられる場合あります。

ソフトウェアのリリースに関しては、正式公開されるまで

  • 基本仕様の実装完了 (Feature Complete)
  • アルファ版 (Alpha)
  • ベータ版 (Beta)
  • リリース候補版 (Release Candidate)

というような内部リリースの段階を踏みます。

リリース予定日から逆算してスケジュールを組むことが多いと思いますが、この内部リリースの大まかな定義 (目標) として、優先順をつけられたバグの数を使うことがあります。

つまり……

リリース 内容
Feature Complete 仕様実装がほぼ完了。新規機能追加を基本的に行わず、テストフェーズに移行
Alpha 最優先のバグ (P1) = 0。追加仕様の実装
Beta 重要なバグ (P2) = 0
Release Candidate その他、バグを可能な限りなくす。P3 バグ = 0 が目標

内部リリースのフェーズに応じて、その時点で残っているバグの優先順位の見直しが行われます。

場合によって、緊急度の低いいくつかのバグは次期バージョンに持ち越しされることもあります (defer)。

チケットの状態

報告されたチケットは、担当者に割り当てられるまではディスパッチャーが預ります。

チケットの状態 (status) にはおおよそ以下のように分類されます。

状態 内容
公開 (Open) チケットを受理。修正作業に入る前の状態
作業中 (In Progress) 担当者が当該チケットの修正作業中
修正済 (Resolved) 担当者がバグを修正し、テスターに検査依頼
完了 (Closed) テスターが修正内容を確認し、修正の承認が終了した状態

会社やプロジェクトによっては、更に以下のような状態が追加されている場合もあります。

状態 内容
新規 (New) Open の前段階。担当者に割り当てられる前の状態。New がない場合は、Open が New を兼ねる
検査中 (Testing) Closed の前段階。テスターが修正内容を検査中。Testing がない場合、Resolved が Testing を兼ねる

担当者 (開発者) のアクション

担当者はバグを修正して、テスターに「修正済 (Resolved)」として渡す役目を担いますが、単にソフトウェアを変更して「修正」する以外にもいくつか取りうるアクションがあります。

状態 内容
修正完了 (Fixed) ソフトウェアを変更し、バグを修正した
再現不可 (Cannot reproduce) 報告されたバグが再現できないため修正が困難。レポーターないしテスターに差し戻し
重複 (Duplicated) 他のチケットとしてすでに報告されている
修正不可 (Won't fix) 外部要因 (ハードウェアあるいは OS もしくはサードパーティライブラリ) による制限により修正不可能
仕様 (By design) 「それは仕様です (Working as intended)」

先述した通り、バグは再現性が非常に重要です。開発者の環境で再現できれば、そのバグは八割以上直ったのも同然とも言えます。

「再現できない (I could not reproduce/replicate it)」場合は、レポーターもしくテスターに差し戻して手順や条件の見直しをしてもらいます。

フロー概要図

以上を踏まえて、ざっと図にまとめると以下のようになります。

[図] チケットに対するワークフロー

人物っぽいシンボルについては

  • D : 担当者。主に開発者が担う。
  • L : ディスパッチャー。主にテクニカルリーダーが担う。
  • T : テスター。修正されたバグを検査する

のようになります。

レポーターは前述のとおり、テスターが担うことが多いのですが、必ずしもテスターがレポーターになるという訳ではありません (バグの報告は誰でもできます) 。

スポンサーリンク

Tinted image for UIImage

[画像]画面に表示するイメージ画像に色付けしたい……。

iOS のアプリケーションでハイライト状態などを示すため、生成した画像イメージに対して色付けしたいときがあります。

UIView には tintColor というプロパティがあって、色付けが簡単にできそうなのですが、イメージを表示する UIImageViewtintColor を設定しても何も変わりません。

そこで以下のようなヘルパークラスを用意して利用しています。

@interface SBLImageHelper
/**
 *  Generates an image which is tinted with a given color.
 *  @param image - an image to be tinted
 *  @param color - tint color
 *  @return an instance of UIImage
 */
+ (UIImage *)tintedImageFromImage:(UIImage *)image
                        withColor:(UIColor *)color;
@end


@implementation SBLImageHelper

+ (UIImage *)tintedImageFromImage:(UIImage *)image
                        withColor:(UIColor *)color
{
  UIImage *output = nil;
  CGRect rect = CGRectMake(0, 0, image.size.width, image.size.height);

  if (UIGraphicsBeginImageContextWithOptions != NULL)
  {
    UIGraphicsBeginImageContextWithOptions(image.size,
                                           NO,
                                           image.scale);
  }
  else
  {
    UIGraphicsBeginImageContext(image.size);
  }

  CGContextRef context = UIGraphicsGetCurrentContext();

  // -- flipping geometry
  CGContextTranslateCTM(context, 0, image.size.height);
  CGContextScaleCTM(context, 1.0, -1.0);

  // -- setting up blend mode
  CGContextSetBlendMode(context, kCGBlendModeNormal);

  // -- first drawing the image
  CGContextDrawImage(context, rect, image.CGImage);

  // -- then setting up mask and fill the color
  CGContextClipToMask(context, rect, image.CGImage);
  CGContextSetFillColorWithColor(context, color.CGColor);
  CGContextFillRect(context, rect);

  output = UIGraphicsGetImageFromCurrentImageContext();
  UIGraphicsEndImageContext();

  return output;
}

@end

次のように使います。

UIColor *tintColor = [[UIColor redColor] colorWithAlphaComponent:0.5];
UIImage *originalImage = [UIImage imageNamed:@"sample"];
UIImage *tintedImage = [SBLImageHelper tintedImageFromImage:originalImage
                                                  withColor:tintColor];

Objective-C にはカテゴリーという既存のクラスを拡張するための仕組みがありますが、すでにあるメソッドと同じ名前のメソッドを追加すると、どっちのメソッドが利用されるか分からなくなってしまうという強烈な副作用があります。

ですので、個人的にはあまりオススメしませんが、UIImage のカテゴリーとして拡張するバージョンだと以下のようになるでしょうか。

@interface UIImage (SBLImageHelper)
/**
 *  Generates an image which is tinted with a given color.
 *  @param color - tint color
 *  @return an instance of UIImage
 */
- (UIImage *)imageWithTintColor:(UIColor *)color;

@end


@implementation UIImage (SBLImageHelper)

- (UIImage *)imageWithTintColor:(UIColor *)color
{
  UIImage *output = nil;
  CGRect rect = CGRectMake(0, 0, self.size.width, self.size.height);

  if (UIGraphicsBeginImageContextWithOptions != NULL)
  {
    UIGraphicsBeginImageContextWithOptions(self.size,
                                           NO,
                                           self.scale);
  }
  else
  {
    UIGraphicsBeginImageContext(self.size);
  }

  CGContextRef context = UIGraphicsGetCurrentContext();

  // -- flipping geometry
  CGContextTranslateCTM(context, 0, self.size.height);
  CGContextScaleCTM(context, 1.0, -1.0);

  // -- setting up blend mode
  CGContextSetBlendMode(context, kCGBlendModeNormal);

  // -- first drawing the image
  CGContextDrawImage(context, rect, self.CGImage);

  // -- then setting up mask and fill the color
  CGContextClipToMask(context, rect, self.CGImage);
  CGContextSetFillColorWithColor(context, color.CGColor);
  CGContextFillRect(context, rect);

  output = UIGraphicsGetImageFromCurrentImageContext();
  UIGraphicsEndImageContext();

  return output;
}

@end

この記事は qiita.com の内容を再掲載したものです。

スポンサーリンク

Re: 今日のiPhoneホーム画面

salchuさんの「今日のiPhoneホーム画面」に触発されて、私もホームスクリーン晒し。

この間、日本でお会いした時には iPhone 持っていなかったので、お見せできなかったですものね。多分、iOS6 でのホーム画面はこれが最終形になるかと。五つの画面をひとまとめにしてしまったので、見づらくてごめんなさい。

[画像] iOS6 でのホーム画面

スクリーン 1
Apple 標準アプリのみ。"Podcast" は、半標準ということで。
スクリーン 2
ソーシャル系・日常で利用するアプリ。左に赤系・右に青系を置いてます。
スクリーン 3
Apple, Google, Evernote を順に並べて、自作アプリもここに。
スクリーン 4
辞書系・読書系のアプリ。
スクリーン 5
銀行関連・乗り換え案内関連。あといくつか普段あまり利用しないやつも。

傾向として……

  • フォルダはあまり使わない。
  • 同系色はまとめたい。
  • よく利用するアプリほど下に配置したい。

といった感じでしょうか。

地図は標準 Map と Google Map を半々で利用する感じ。これまでのところ、標準の Map で使いづらいとか困ったとかあまり感じたことがないので、特に Google Map じゃないとダメという感じではないです。

二ページ目は左側の赤系・右側に青系と決めているんですけど、そのせいであまり使わない mixi とか Foursquare が入ってしまっているのはご愛嬌。Gmail, ATOK Pad, Facebook, Dropbox は、ビューワとしてほぼ毎日使ってます。

iOS7 になると、おそらくまた構成が変わると思うので、この状態があと何日もつかは不明ですけれども。

あ、ちなみに iOS で最も頻繁に使っていると思われるアプリは Settings (設定) です。カメラはもっぱらロックスクリーンからアクセスするのでどこに置いても変わらないという。

スポンサーリンク

mi 3.0.0b1 - mi ver 3 のファーストベータ

多機能エディタ mi の新バージョン ver 3 の最初のベータ版が公開されました

ver 3 になって Cocoa フレームワークを利用したアプリケーションとして作り直されています。

そのため Maximizer のような Cocoa アプリケーションにしか効かない SIMBL プラグインも利用できるようになっています。フルスクリーンで mi が利用できるように。

UI のアピアランスが大きく変更されました。Cocoa フレームワークを利用したこと影響も大きいのでしょう、全体的にモダンな UI に変わっています。

[画像] mi ver 3 - インタフェースが刷新されました。

アウトラインは「見出しリスト」という形で従来からサポートされていましたが、それが強化されて、セクション毎に折畳みができるようになっています。

モダンなエディタらしく (?) 選択されたテキストなどに対して、同一ファイル内に存在する同じワードが全てハイライト表示されたりします。

モードや設定などは ver 2 から引き継がれますが、設定ファイルは別に保存されているので併用も可能です。

私の環境ではモード毎に設定されているツールに割り当てていたキーバインドの一部が引き継がれませんでしたが (一部、新規追加されたデフォルトのキーバインドと被っていたせいかもしれません)、概ね以前のままの状態でそのまま利用できる印象です。

英語リソースの対応はまだのようで、英語環境で立ち上げると英語と日本語が交じったインタフェースになってしまうのはご愛嬌。…… ver 2 から引き継がれたメニューやインタフェースは英語化されていて、新規に追加された分が英語化されていないという感じの状態になっています。

アプリケーション設定・モード設定が大幅に見直されてとても分かりやすくなっています。

[画像] mi ver 3 - 設定ウィンドウが大幅に刷新されています。

特にカラー設定は「カラースキーム」という csv ファイルで定義されるようになり、インポート・エクスポートが簡単にできて管理しやすくなっています。インタフェースも分かりやすい。

ver 2 では subversion などバージョン管理システムで管理されたファイルに対して差分表示を行う機能がありましたが、ver 3 では、差分表示機能そのものが大幅に強化されて、自動保存による履歴差分や他のファイルの差分表示などもサポートするようになっています。

[画像] mi ver 3 - 新規に追加された差分表示機能。

私の環境では Retina ディスプレイでの表示を確認することはできませんが、アプリケーション内のリソースを見ると一部アイコンなどはベクター画像が利用されたりしていて、Retina 表示にも対応しているようです。

アプリケーションアイコンも前掲の通り刷新されました。「ミミカキ」がなくなっていますが、最大サイズ (1024 x 1024) で見るとハイライトペンのところに、さりげなく「MI3」の文字が……。細かい。

[画像] mi ver 3 - アプリケーションアイコンに隠された (?) MI3 の文字。

アイコンでキャプチャされている書類は、なんらかのソースコードに見えます。なんだろう……。コードスタイルから見ると c++ っぽい感じのコード。

まだざっとしか利用していませんが、安定して動作しています。パフォーマンスに関しては今のところ従来と同等な印象ですが、大きなファイルを開いたり、マルチファイル検索などの比較的重めな処理は行っていないので、これから確認という感じです。

ver 3 ではフリー版・有料版・AppStore 版とリリースされる予定ですが、今回ざっと紹介した機能のどこまでフリー版のものか、有料版のものかなどの詳細はまだ分かりません。ともあれ今後の展開にとっても楽しみです。

スポンサーリンク

汎用コードを複数の iOS アプリケーション開発で共有利用する手法

いくつかの iOS アプリケーションを開発していると、自然と共有できるコードが増えてきます。

そうした共有可能な汎用コードを複数のアプリケーションのプロジェクトで利用する方法はいくつか考えられます。

アプリケーションのプロジェクトに組み込む

別リポジトリで管理している汎用コードを svn externals や git submodule などを使ってリンクして、それをそのままアプリケーションのプロジェクトに組み込みます。

svn や git などバージョン管理ソフトウェアの機能だけを利用しているので、仕組み自体はとてもシンプルになります。

構成はシンプルになりますが、その分運用でカバーしなくてはいけない点があります。

  • 汎用コード部分のビルドがアプリケーションのプロジェクトに依存するので、汎用コード部分の独立性を保つのに注意が必要。

  • 汎用コード部分でファイルの追加・削除があった場合、それを参照している全てのアプリケーションプロジェクトを逐次変更しなくてはならない。

  • 汎用コードを利用する新規アプリケーションプロジェクトを作成して、リンクしたリポジトリを取り込む際、ターゲットに含めるファイルとそうでないファイルの切り分けが必要。

総じて独立性が乏しい分、手順が増える傾向があります。

静的ライブラリとして生成する

汎用コード部分を静的ライブラリとして作成して、アプリケーションのプロジェクトにライブラリとして登録します。

静的ライブラリを作成するプロジェクトファイルがアプリケーションのプロジェクトとは独立した形で作成されるので、アプリケーションのプロジェクトに依存することなく、ビルド・ユニットテストを行うことができます。

Xcode は外部プロジェクトもプロジェクトに組み込めるので、アプリケーションをビルドする際に都度静的ライブラリを生成するような形で運用することも可能です。

Xcode の基本機能だけで完結しますし、手順もそれほど難しくはないのですが、イメージや xib などのバイナリリソースが静的ライブラリには、そのまま組み込めないという制約があります。

イメージなどのバイナリリソースは静的ライブラリとは別にアプリケーションのプロジェクトに組み込む必要があります。

その場合、汎用コード部分で利用されるリソースファイルの追加・削除の手間は前述の組み込み型と同等になります。

フレームワークとして生成する

静的ライブラリではリソースは組み込めないのですが、フレームワークという仕組みを利用するとリソースも込みでライブラリを生成することができます。

UIKit などはフレームワークの形で配布されて、ほぼ全てのネイティブ iOS アプリケーションで利用されています。

汎用コード・リソースの共有化という点では最適な方法なのですが、Xcode の標準な方法ではサポートされないという欠点があります。

Mac OS X 向けアプリケーションに対してはフレームワーク生成がサポートされていますが、iOS プラットフォームではサポートされていません。

iOS ユニバーサルフレームワークなどを利用すると iOS プラットフォーム向けフレームワークを作成することができます。

github での説明を見ても分かる通り、現状ではややハック的な運用にならざる得ないようです。Fake Framework という仕組みではバンドルを利用していたりするみたい。

静的ライブラリをリソース込みで生成する

拙作 SBPullToRefreshHeaderView のようにリソース込みな汎用コードがある場合、リソースがあるのでやはりフレームワークを使う方法になると思います。

ハック的な運用を避けて、Xcode 標準な機能だけでなんとかならないか、と探していたところ、Compiling Image Resources into a Static Library という記事を見つけました。

静的ライブラリにはバイナリリソースは組み込ませんが、バイナリを C コードの形でダンプしてコンパイルしてしまえば、データとして組み込むことが可能になります。

  1. イメージなどのバイナリを xxd -i コマンドを使って C コードに変換
  2. コード化されたデータを UIImage など Objective-C クラスに変換するローダーを生成
  3. リソースはローダーを介して読み込む

Compiling Image Resources into a Static Library では、イメージだけ処理していますが、同様に nib ファイルも処理できます。具体的な手順については後日改めて。

スポンサーリンク

Fastbook は UIWebView でも軽快に動作する件

iOS 版 Facebook の実装が HTML5 アプリケーションからネイティブアプリケーション (CocoaTouch フレームワークを使ったアプリケーション) に変更されたのは記憶に新しいところ

それに対して「Facebookのモバイルアプリが失敗した理由は HTML5 のせいじゃない。HTML5 でサクサク動く Facebook アプリを作って見せた Sencha Touch 開発チーム」という記事がありました。

元ネタは The Making of Fastbook: An HTML5 Love Story (以下、元記事) です。

簡単に言うと、「HTML5 だから遅いんじゃないよ、デモアプリケーション Fastbook のようにネイティブアプリケーション同等な (むしろそれを上回る) パフォーマンスでるよ」ということになるでしょうか。

動画も挙がっていて、自信の程が伺えます。

これに対して、いくつか指摘が挙がっています。

え?これSafariじゃね?WebViewとSafariじゃあスピード全然違うよ

[→はてなブックマーク - hazisarashi のブックマーク - 2012年12月20日]

Safariとかずるすぎワロタ。WebviewはSafariの約3.3倍遅いんですが、Webviewで動かすとどうなるんでしょうね(ゲス顔

[→はてなブックマーク - fikah のブックマーク]

同様に元記事のコメントでも……

The demo is really promising, but it is in MobileSafari. When you make an iOS app, you can only use WebView, which is a second-class and slower browser.

[意訳] デモはとても前途有望だけれど、MobileSafari で動いているね。iOS アプリを作る時には WebView しか使えなくて、それは遅いブラウザになってしまうよ。

[→元記事コメント @hlb]

A sticking point with iOS is that embedded WebKit (in Facebook’s old native app) performs horribly compared to Mobile Safari (what Sencha used here) due to Apple's selfish hoarding of the Nitro JavaScript engine.

[意訳] 問題は Facebook の前バージョンでも利用されてた組み込み WebKit で、このデモで使っている Mobile Safari よりもひどく遅いけど。Apple の勝手な囲い込みで Nitro JavaScript エンジンは使えないから。

[→元記事コメント @Ron Waldon]

Mobile Safari では Nitro と呼ばれる JavaScript エンジンでスクリプトが処理されるのですが、CocoaTouch フレームで利用できる UIWebView ではその高速な JavaScript エンジンが (セキュリティ上の理由から) 使われません。

私もこの点 (デモが Safari 上で動いている) は少し気になっていました。

それに対して、Sencha Team のメンバーの何人かが答えています。

@hlb the issue is NOT JavaScript. It's the DOM. The DOM engine is the *same* for both use cases.

[意訳] @hlb JavaScript が問題ではないんだ。DOM が問題で、DOM エンジンは (Safari も UIWebView も) 同じなんだよね。

[→元記事コメント @Jay Garcia]

@hlb Simply save the app to your homescreen to force it to use a WebView.

[意訳] @hlb ホームに置くと、WebView を使うようになると思う (iOS 5.1 以降では Mobile Safari を利用するようになったという指摘あり)。

[→元記事コメント @Jamie Avins]

@Ron Waldon It doesn't matter for such apps like this. Again as we mentioned the bottleneck is never JavaScript execution. We wrapped the app in native webviews for you to try it out yourself: github.com/extjs/fastbook

[意訳] @Ron Waldon このアプリではそこは問題にならないんだ。(これまで) 指摘している通り、ボトルネックは JavaScript の実行にあるわけではないから。ネイティブな webview で実装した例を github に挙げたので、試してみてね。

[→元記事コメント @Jacky Nguyen]

Jacky Nguyen さんと Jamie Avins さんは動画にも登場されています。

コメント受けて、WebView を使った利用例が github に公開されました

コードは実にシンプルで、

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    // Override point for customization after application launch.
    self.window.backgroundColor = [UIColor whiteColor];
    
    UIWebView* view = [[UIWebView alloc] initWithFrame:[UIScreen mainScreen].applicationFrame];
    [self.window addSubview:view];
    [view loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://fb.html5isready.com/"]]];
    [self.window makeKeyAndVisible];
    return YES;
}

メインのコードはこれだけ。UIWebView を作って http://fb.html5isready.com/ を開いているだけです。

動作させてみると、私が思っていた以上に速い。iPhone 4S / iOS 6.x で確認。確か iOS6 から WebView に対して動作割当メモリが増えたので、それも影響している可能性あり。

UIWebView 上の WebKit でも、スクロールとかきびきびと軽快に動作します。

iOS のアプリケーションとしては、ステータスバーをタップしてもトップにスクロールバックしない、ローディングアニメーションが表示されるべきところで表示されない、未実装な機能 (例えば検索機能) がある、などブラッシュアップが必要な部分はありますが、デモアプリケーションとしてはなかなか興味深い。

もっともこれでもって「HTML5 使うべき」とも言えない部分もあって、

スクロール速度だけを取り上げても。Facebookのエンジニアが指摘した第一の問題はそこじゃないですよね。クラッシュの原因が解らない等 http://lists.w3.org/Archives/Public/public-coremob/2012Sep/0021.html

[→はてなブックマーク - Teshのブックマーク]

という Tesh さんのブックマークコメントや

The premise of this argument is wrong. It's not a simple question of "slow" versus "fast." Application performance is only one factor in building an HTML5 app. Device support, engineer productivity, testability, measurement, tooling/debugging, and native integration are all points that should be factored in. Anyone who has burnt the hours trying to debug a perf issue on a device that doesn't support Webinspector knows this pain. As does anyone who has gotten the bug report about the keyboard not popping up correctly on insert random Android 2.X no one has ever heard of here. As does anyone who has gotten the layout performance awesome in one test environment only to test another and find it terrible. The argument that HTML is ready while the device landscape is not is pretty fraught.

As far as fast goes, even as well done as this demo is, the scrolling framerate is noticeably slower on the Nexus 4 compared against the native application. I feel like all the demo is proving is what we already knew - somethings can be done reasonably well in HTML while many other can't. I'm a person who would rather have the web win. I'm pretty sure it will win in time. It's a pretty clear fact that until the browsers/webviews get faster and/or the device's have faster hardware, HTML is the second best option for smartphones.

[意訳] 議論の前提が違っているよね。単に「遅い」か「速い」という問題じゃない。アプリケーション性能は HTML5 アプリを構築するひとつファクタに過ぎないよ。どのデバイスをサポートするか、エンジニアの生産性、テストのしやすさや計測しやすさ、ツールの使い勝手、デバッグのしやすさ、ネイティブなサポート、など全てのファクタを考える必要がある。ウェブインスペクタをサポートしないデバイスでパフォーマンスをデバッグするのがどんなに大変か知っている人はいる?Android 2.X でキーボードが正しく表示されずにランダムな文字が入力されてしまうというバグレポートを見たことがある人は?あるテスト環境では素晴らしく性能がいいのに、別の環境ではめちゃくちゃだというのを経験したことがある人は?この議論を実際デバイスを横向きにして見ると見づらいという事実についてはどう?

[意訳] 速さという点に関しては、このデモはとても良くできている。スクロールのフレームレートは Nexus 4 で見るとネイティブアプリに比べて遅いけど。このデモは Sencha Team が HTML に関して深く理解している (そしてそれは他の多くの人はできない) こと証明しているに過ぎないと思うんだ。私個人的にはむしろ web が勝って欲しいし、いつかその日がくると信じているけれども、それはブラウザとデバイスが十分に速いというの明快になった時で、HTML はスマートフォンに対して二番目にベストなオプションだと思う。

[→元記事コメント @Jackson Gabbard]

元記事に寄せられた Jackson Gabbard さんのコメントのご指摘の通り、単純に速い・遅いという問題ではなくて、もちろんそれはとても重要な部分ではあるけれども、あくまでも全体の一部の問題でしかありません。

ツールの使いやすさ、デバッグのしやすさ、習得に対する敷居の低さ、などはソフトウェアを恒常的にメンテナンスする上で、重要なポイントになってきます。

Objective-C が習得に対して敷居が低いかどうかはまた別の議論になってしまいそうですが、ネイティブサポートのため、ハック的な知識がなくてもある程度の性能はいけるという印象はあります。もちろん実装次第ですけれども。

これは SenchaTitanium だけでなく、他のクロスプラットフォームなフレームワークでも大きな課題になっているポイントのような気がします。

スポンサーリンク

Visual Studio 2010 Express for Windows Phone を Windows 8 にインストール

[図] Visual Studio 2010 Express の起動画面

Visual Studio 2010 Express for Windows Phone を Windows 8 にインストールする手順について、備忘録

元記事 に全ての手順ならびに要因が詳しく説明してあります。

  1. Windows Phone SDK 7.1 をダウンロード・インストール
  2. Games for Windows Marketplace Client をダウンロードして・インストール
  3. 1. でダウンロードしたインストーラを再度起動して、修復 (repair) を選択
  4. Windows Phone SDK 7.1.1 Update をダウンロードして、SDK 7.1.1 にアップグレード

3. のステップが終了した段階で、Visual Studio 2010 Express は起動できるようになりますが、エミュレータが正しく起動しません。SDK 7.1.1 にアップグレードすることでエミュレータも動作するようになります。

スポンサーリンク

iOS デバイス一覧表

iOS デバイスの一覧表を自分用に作成 (2014/11 現在)。

デバイス発売年CPU解像度iOS
バージョン2345678
iPhone2007armv6320 x 4801.0 - 3.1.3 ×××××
iPhone 3G2008armv6320 x 4802.0 - 4.2.1 ××××
iPhone 3GS2009armv7320 x 4803.0 - 6.1.4 ×××
iPhone 4 (GSM)2010armv7640 x 960 *4.0 - 7.1.2 ×××
iPhone 4 (CDMA)2011armv7640 x 960 *4.2.5 - 7.1.2 ×××
iPhone 4S2011armv7640 x 960 *5.0 - ×××
iPhone 52012armv7s640 x 1136 *6.0 - ××××
iPhone 5c2013armv7s640 x 1136 *7.0 - ×××××
iPhone 5s2013arm64640 x 1136 *7.0 - ×××××
iPhone 62014arm64750 x 1334 *8.0 - ××××××
iPhone 6 plus2014arm641242 x 2208 **8.0 - ××××××
  
iPod touch2007armv6320 x 4801.1 - 3.1.3 ×××××
iPod touch (2nd)2008armv6320 x 4802.1.1 - 4.2.1 ×××××
iPod touch (3rd)2009armv7320 x 4803.1 - 5.1.1 ××××
iPod touch (4th)2010armv7640 x 960 *4.1 - 6.1.4 ××××
iPod touch (5th)2012armv7640 x 1136 *6.0 - ××××
  
iPad2010armv7768 x 10243.2 - 5.1.1 ××××
iPad 22011armv7768 x 10244.3 - ××
iPad (3rd)2012armv71536 x 2048 * 5.1 -×××
iPad (4th)2012armv7s1536 x 2048 * 6.0 -××××
iPad Air2013arm641536 x 2048 *7.0 - ×××××
iPad Air 22014arm641536 x 2048 *8.1 - ××××××
  
iPad mini2012armv7768 x 10246.0 - ××××
iPad mini Retina2013arm641536 x 2048 *7.0 - ×××××
iPad mini 32014arm641536 x 2048 *8.1 - ××××××

"CPU" とあるのは対応する CPU アーキテクチャを示しています。解像度で強調表記されているのは Retina ディスプレイを示しています。** は 3x 解像度です。

以下の iOS は特定のデバイスにのみ対応したバージョンになります。

3.2.*iPad (初代) 専用バージョン。
4.0 - 4.1iPad 未対応バージョン。
4.2.5 - 4.2.10iPhone 4 (CDMA) 専用バージョン。
参考

スポンサーリンク

1/13