カテゴリー : プログラム

IntelliJでHTTPビルトインサーバーが使えない件その2

Run Debug Configurations

IntelliJでHTTPビルトインサーバーが使えない件をもう一回調べてみたのだがやっぱりだめ。WebStormだと下記の手順でうまくいったので、IntelliJ+プラグインとWebStormで何か違いがあるのかも。

  • Run→Edit Configurationで、JavaScript Debug→Remoteを追加。
  • URL to openを、http://localhost:63342/webdemo とする。webdemoのところはプロジェクト名。
  • デバッグで、先ほど構成したConfigurationを選択。ブラウザが開く(Configurationで選択したブラウザ。Firefox or Chrome)。
  • 初回だとなぜかデバッガで止まらないかもしれない。そのときは、http://localhost:63342/webdemo/index.html というふうにサイド開いてみる。

ちなみにWebStormでJavaScriptをデバッグする方法は三種類ある。大きく分けてローカルとリモート。リモートの場合上記ビルトインサーバーを使う方法の他、ApacheなんかにDeployして使うこともできる。詳しくは「Running and Debugging JavaScript」を参照のこと(これくらいしか情報がない)。

IntelliJのHTTPビルトインサーバーが使えない件

WebStorm 6でHTMLファイルをビルトイン実行できるらしい。IntelliJでも当然できるものだと思いやってみたのだが、
404 Not Found

こうなってしまい全然だめ。PHPStormだと実行できてないみたいなので、IntelliJでもだめなのか?時間ドブにすてた気分。

「eclipse 4.2 Juno」イマイチだった

しばらく「eclipse 4.2 Juno」を使っていたのだがどうも良くない。全般的にもっさりしているし、画面の描画がところどころおかしい。外観を「Classic」にすると変なところに謎の空白ができる。

ということで、eclipse 3.7.2に戻しました。俺ぐぬぬ。

Mountain Lion + Xcode 4.4.1でiOS Simulatorは5.0以上しか存在しない?

意気揚々とMountain LionにアップデートしてXcode 4.4.1を使っていて気がついたこと。iOS 4.3シミュレーターがダウンロードできなくなっています。Preferences→Downloadsで以下の通りiOS 5.0 Simulatorしかダウンロードできません。

Lionだとダウンロードできるみたいだけど、Mountain Lionだとだめっぽい。まあ個人的にはこれを機会にiOS 5以上対応に切り替えられると思えば気が楽かな。これきっかけで開発者の間でiOS 5以降対応が一気に増えそう。

やむを得ない事情でiOS 4.3対応必須の場合は、Lionをキープしとかないとまずそうですね。

■参考リンク

iOSアプリでGoogle Chromeを使ってURLを開く方法

Opening links in Chrome for iOSというページ書かれている通りにやればいいらしい。

NSURL *inputURL = ;
NSString *scheme = inputURL.scheme;

// Replace the URL Scheme with the Chrome equivalent.
NSString *chromeScheme = nil;
if ([scheme isEqualToString:@"http"]) {
  chromeScheme = @"googlechrome";
} else if ([scheme isEqualToString:@"https"]) {
  chromeScheme = @"googlechromes";
}

// Proceed only if a valid Google Chrome URI Scheme is available.
if (chromeScheme) {
  NSString *absoluteString = [inputURL absoluteString];
  NSRange rangeForScheme = [absoluteString rangeOfString:@":"];
  NSString *urlNoScheme =
      [absoluteString substringFromIndex:rangeForScheme.location];
  NSString *chromeURLString =
      [chromeScheme stringByAppendingString:urlNoScheme];
  NSURL *chromeURL = [NSURL URLWithString:chromeURLString];

  // Open the URL with Chrome.
  [[UIApplication sharedApplication] openURL:chromeURL];
}

裏技でもなんでもなく、URL Scheme を使うごく普通の方法。アプリごとに対応しないといけない。

今後iOSが強さをみせつけるほど、標準ブラウザをSafariから解放せよという圧力も強まってくるんじゃないかな。WindowsでMicrosoftが独占禁止法がらみでいろいろやられたので、Appleも当然対応はを考えているだろうけど。

日本人としてはIMEの解放してほしい。ATOK使いたいし。

Objective-Cでインスタンス変数はアンダースコアで開始する

浦島太郎状態だったXcode4をさわってリハビリ中。よくみるとXcodeが生成するコードのテンプレートがだいぶかわっている。特に気になったのが以下の点。

インスタンス変数の宣言がなくなってる

@interface DelegateDemoAppDelegate : UIResponder 

@property (strong, nonatomic) UIWindow *window;

@property (strong, nonatomic) DelegateDemoViewController *viewController;

@synthesizeの書式が変わっている

@implementation DelegateDemoAppDelegate

@synthesize window = _window;
@synthesize viewController = _viewController;

インターネットの大海を探索してみたところ、以下のブログで明快に説明されていた。

プロパティに対応するインスタンス変数の命名規則について – Awaresoft

なるほど、欧州最新形では、インスタンス変数にはアンダースコアのprefixをつけ、ヘッダで宣言もしないらしい。全然しらなかった。インスタンス変数とプロパティの使い分けは以前からなやましかったので、これで統一されたのであればスッキリ。

あと関係ないけど、Xcode4になってから、Interfce Builderとの連携が結構パワーアップしている。

[Xcode][IB] IBOutletやIBActionをマウス操作で接続 – iOS 開発ブログ Natsu’s note

この操作でもアンダースコア原則を守ってくれるのかと思いきやそうはならなかった。

UIImagePickerControllerのボタンのラベルがローカライズされない

UIImagePickerControllerのナビゲーションバーのボタンが、シミュレータの言語設定を切り替えても変わらないので悩みました。
plistの「Localization native development region」で指定した言語で常に表示されているようです。

結局、Localizable.stringsを追加して、英語・日本語でローカライズしてみたところ、UIImagePickerControllerのナビゲーションバーのボタンも切り替わるようになりました。謎です。

UIButtton setTitle:forState:ではまる

forState:の引数が論理和で一気に指定できると思い込んでいました。しかし次のように指定してもタイトルがなぜか変わらない。

[button setTitle:title forState:UIControlStateNormal | UIControlStateHighlighted | UIControlStateDisabled | UIControlStateSelected];	

しばらく悩みました。やはり一つずつ指定しないとだめなようです。

[button setTitle:title forState:UIControlStateNormal ];	
[button setTitle:title forState:UIControlStateHighlighted];	

元からそういうものかわかりませんが、だめなものはだめでしたw

iPhoneシミュレータに写真をとりこむ時にiTunesを使えるのか?

UIImagePickerControllerを使ったプログラムをテストするとき、シミュレータ内に写真が必要です。全く写真が存在しない場合、次のように表示されます。

screenshot

「You can sync photos and videos onto your iPhone Simulator using iTunes」をまともにとるとiTunesとiPhoneシミュレータを同期して写真を転送できそうなのですができませんでした。どうすればいいのでしょうか。

MacからiPhoneシミュレータ上のSafariにドロップし、クリック長押しで保存する方法だとできるみたいなので、こうするのが正解かな?

CWinApp::m_pszProfileNameはdeleteじゃなくfreeする

MFCアプリでiniファイルの書き出しがうまくいかない現象に悩んでいました。その現象自体はiniファイルのパスをフルパスで指定することで解決したのですが(Vista以降で起こるUACがらみの挙動が影響しているらしい)、今度はプログラム終了時にヒープが壊れて文句をいわれるようになってしまいました。

MFCアプリでiniファイルのパスを指定するのはCWinAppのm_pszProfileNameに値を設定します。ここでm_pszProfileNameに直接文字列リテラルのポインタを代入していたのがだめな原因でした。C++とすっかりご無沙汰だったせいで結構初歩的なところでボロボロです。悔しいですw

■間違い

m_pszProfileName = _T("d:\\temp\\test.ini");

■正解

if (m_pszProfileName) {
    free((void*)m_pszProfileName);
}
m_pszProfileName = _tcsdup(_T("d:\\temp\\test.ini"));