2010/09/06

UIColorの値をとる時に便利なツール Developer Color Picker

ダウンロードしたDeveloperColorPicker.colorPickerを/home/Library/ColorPickers/に入れるだけ。 color picker

他のColor picker同様、虫眼鏡ツールを使って色を取得する事もできます。

  2010/09/03

iPhoneとAndroidアプリを開発できるcoronaってのがあるらしい。

サイト

Ansca日本コロナの会

これって、AdobeがFlash CS5に搭載しようとした機能みたい? ※ActionScriptでのコンパイルは規約違反になるため断念

ActionScript、JavaScript、PHPの能力があればできるらしいが、果たして全部の機能が網羅されているのだろうか?

概要

Corona SDK 2.0

主要な機能をまとめて集約してライブラリにしてるみたいですね。

評価してないのでなんともいえませんが、

メリット

・言語の敷居が低い ・コーディングが格段に少なくなる  ※ゲーム制作とかはOpenGL-ESに対応してるので圧倒的に有利

デメリット

・Corona SDKにない機能は搭載できない ・iPhone、Androidに新しいSDKがでたら対応できない

簡易アプリやデザイナーさん向けのツールのような気もする。 一応、30日お試し版で試してみようかな?

  2010/09/01

アプリを作ってみて初めてreleaseの重要性を実感しました(^^;) CGContextでUITextField、UILabelを大量に追加したUIViewを往復してると、動作が重くなりメモリリーク(>_<)

UINavigationControllerでViewController(@synthesizeした)をpush後、親ページに戻った時(popした時)に、viewDidUnloadが発生しないことがわかりました。

メモリリークの遷移

その為、以下の遷移でを繰り返していると

(1) UIViewControllerをinitWithNibNameでallocし、UINavigationControllerに追加(pushViewController) (2) UIViewControllerのviewDidloadが呼ばれる (3) UIViewControllerに大量のオブジェクトをaddSubViewする (3) UINavigationControllerで戻る(popViewController) (4) UIViewControllerがdeallocされない

と、通常は2~3Mのメモリを行ったりきたりするのですが、ページにアクセスする毎に500K単位で増えていきました。

原因

(1) pushするUIViewControllerを@synthesizeして(せざるを得なかった)利用していた (2) pushするUIViewControllerをpush後にreleaseしていなかった(できなかった) (3) UIViewにaddSubViewしたオブジェクトをreleaseしていなかった

pushするUIViewControllerを@synthesizeしていた(せざるを得なかった)のは、自分の設計ミス(^^;)

リークする例1

@synthesize hogeViewController;
   ...
-(void)pageHoge {
   hogeViewController= [[HogeViewController alloc] initWithNibName="HogeViewController" bundle:nil];
   [self.navigationController pushViewController:hogeViewController animated:YES];
}

他のメソッドでViewControllerを利用したいばかりに、不用意に@synthesizeした結果です。 HogeViewControllerに追加したオブジェクトがアクセスするたびにallocされますが、UINavigationControllerで戻ってもviewDidLoadが呼ばれません。 よって全てのオブジェクトがメモリ内に残ったままです。

pushViewController後にrelease

-(void)pageHoge {
   HogeViewController *nextController = [[HogeViewController alloc] initWithNibName="HogeViewController" bundle:nil];
   [self.navigationController pushViewController:nextController  animated:YES];
   [nextController release];
}

それでも@synthesizeが必要なときは、nilで判断するかないのかな???

リークする例2

-(void)addButton {
    IButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
    [button addTarget:self action:@selector(edit:) forControlEvents:UIControlEventTouchUpInside];
    [self addSubView:button];
}

単純にbuttonのrelease忘れです。

addSubViewする時はretainで

これも忘れがちですが、UIButton等を動的にaddSubViewする場合、retainされたオブジェクトにしておくことです。

-(void)addButton {
    UIButton *button = [[UIButton buttonWithType:UIButtonTypeCustom] retain]; //retain
    [button addTarget:self action:@selector(edit:) forControlEvents:UIControlEventTouchUpInside];
    [self addSubView:button];
    [button release];  //メモリ開放
}

retainしないでaddSubView後にreleaseするとアプリが落ちます。 これ外部の指摘で気づきました。 ※他にも多々そういうトピックがあるかと・・・ buttonWithType は init 系メソッドじゃないので、retain の必要ないので下記のコードで大丈夫です。

-(void)addButton {
    IButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
    [button addTarget:self action:@selector(edit:) forControlEvents:UIControlEventTouchUpInside];
    [self addSubView:button];
}

まぁ、retain して release してもトータルプラマイゼロにはなると思いますが、意味がない・・・。

メモリ状況の確認

これらは、InstrumentsのLeaksを利用してメモリ変化が見られます。 instruments

勉強を始めた時には実感がなかったのですが、作ってみて初めて身にしみますw

参考サイト

メモリリーク対策のサイト ・How to avoid memory leaks in iPhone applications

  2010/08/31

American Typewriter

AmericanTypewriter AmericanTypewriter-Bold <h3AppleGothic AppleGothic

Arial

ArialMT Arial-BoldMT Arial-ItalicMT Arial-BoldItalicMT

Arial Rounded MT Bold

ArialRoundedMTBold

Arial Unicode MS

ArialUnicodeMS

Courier

Courier Courier-Bold Courier-Oblique Courier-BoldOblique

Courier New

CourierNewPSMT CourierNewPS-BoldMT CourierNewPS-ItalicMT CourierNewPS-BoldItalicMT

DB LCD Temp

DBLCDTempBlack

Georgia

Georgia Georgia-Bold Georgia-Italic Georgia-BoldItalic

Helvetica

Helvetica Helvetica-Bold Helvetica-Oblique Helvetica-BoldOblique

Helvetica Neue

HelveticaNeue HelveticaNeue-Bold

Hiragino

Hiragino Kaku Gothic ProN W3 HiraKakuProN-W3 Hiragino Kaku Gothic ProN W6 HiraKakuProN-W6

Marker Felt

MarkerFelt-Thin

STHeiti J

STHeitiJ-Light STHeitiJ-Medium

STHeiti K

STHeitiK-Light STHeitiK-Medium

STHeiti SC

STHeitiSC-Light STHeitiSC-Medium

STHeiti TC

STHeitiTC-Light STHeitiTC-Medium

Times New Roman

TimesNewRomanPSMT TimesNewRomanPS-BoldMT TimesNewRomanPS-ItalicMT TimesNewRomanPS-BoldItalicMT

Trebuchet MS

TrebuchetMS TrebuchetMS-Bold TrebuchetMS-Italic TrebuchetMS-BoldItalic

Verdana

Verdana Verdana-Bold Verdana-Italic Verdana-BoldItalic

Zapfino

Zapfino

LockClock-Light

LockClock-Light

PhonepadTwo

PhonepadTwo

HKGPW3UI

HKGPW3UI

  2010/08/26

OpenVPN設定していて、コマンドミスってブリッジ接続を有効になってしまい

サーバに全てのプロトコルで繋がらなくなった!!

自サーバとは言え、さすがに一瞬凍りついた(>_<)

一応、サーバ再起動して解決。

SassesでVPSサーバ再起動

(1) Sassesのコンパネからログイン ※Sasses登録時のメールアドレスとパスワード

(2) サーバのステータスが表示される ※なかなか表示されないのでリロードした

(3) サーバの再起動 ※数分かかる

これ、サーバ起動時にブリッジ立ち上がる設定になってたら全てが終了だったよ・・・。 それにしても、VPSは自分でサーバ再起動できるのはよいねえ。

  2010/08/25

---2010/11/11 詳細手順、キャプチャーを追加

実機で動かすまでの手順

実機テストと言っても、初回の手順は結構大変です・・・

・キーチェーンアクセスで自己証明書の作成 ・iPhone Provisioning Portalに証明書を申請(アップロード) ※Safariでないとアップロードできません ・iPhone Provisioning Portalから証明書を取得(ダウンロード) ・キーチェーンアクセスに証明書を登録 ・iPhone Provisioning PortalでDevice情報を登録 ・iPhone Provisioning PortalでApp IDを登録 ・iPhone Provisioning Portalでプロビジョンプロファイルの作成 ・iPhone Provisioning Portalからプロビジョンプロファイルを取得(ダウンロード) ・Xcodeのオーガナイザでプロビジョンプロファイルを登録 ・Xcodeのプロジェクト設定でデバイスを設定 ・Xcodeのinfo.plistのBundle identifierにAppIDを設定 ・Xcodeから実機に自作アプリを転送

自己証明書の作成

(1) キーチェーンアクセスを起動する。 (2) キーチェーンアクセス>証明書アシスタント>認証局に証明書を要求を選択する。 (3) 各項目を入力する。 ・ユーザのメールアドレス:AppleDeveloper登録した際のメールアドレス ・通称(コモンネーム):氏名 ・要求の処理:ディスクに保存 ・鍵ペア情報を指定:チェック iPhone (4) CertificateSigningRequest.certSigningRequest を任意の場所に保存する。 (5) RSA 2048ビットで【続ける】をクリックする。 iphone (6) 証明書が作成される。

自己証明書申請

(1) Safariを開き、iOS Dev Centerにアクセスする ※Google Chromeだとアップできませんでした (2) Provisioning Portal にアクセスする。 iphone

(3) CertificatesのDevelopmentタブ画面を開き、【Request Certificate】をクリックする。 iphone

(4) 作成した証明書をアップロードする。 iphone

証明書ダウンロード・登録

(1) Your Certificate 一覧に証明書が表示されているので【Download】で、cerファイルをダウンロードする。 ファイル名:developer_identity.cer

(2) click here to download now.のリンクをクリックし、AppleWWDRCA.cerをダウンロードする。 (3) キーチェンアクセスを開き、自分の証明書を選択する。 (4) developer_identity.cerをドラッグ&ドロップで追加。 iphone ※この段階だと証明書が有効性がない

(5) AppleWWDRCA.cerをドラッグ&ドロップで追加する。 iphnoe

実機テスト用にデバイスを登録する

(1) Xcodeを起動し、ウィンドウ>オーガナイザを開く。 iphone

(2) DEVICESで自分のデバイスを選択し、identifierをコピーする。 iphone

(3) Provisioning PortalのDevicesを開き、【Add Device】をクリックする。 iphone

(4) 各項目を入力し【Submit】する。 Device Name:デバイス名 Device ID:オーガナイザでコピーしたidentifier

App IDの登録

(1) Provisioning PortalのApp IDsを開く。 iphone (2) 【New App ID】をクリックし、Description、Bundle Identifier (App ID Suffix)を入力し【Submit】する。 例) Description:任意だがアプリ名が良いか? Bundle Identifier: ドメイン.アプリ名 iphone

iphone

Provisioningファイルの作成

(1) Provisioning PortalのProvisioningを開く。 (2) 【New Provisioning】をクリックする。 (3) 各項目を入力し【Submit】する。 Profile Name:任意名を入力 Certificates:証明書を選択 Devices:利用するデバイスをチェック iphone

(4) Development Provisioning Profiles一覧から、Provisioningファイルをダウンロードする。 iphone

(5) Provisioningファイルをダブルクリックすると、オーガナイザに登録される。 iphone

XcodeにAppIDを登録

(1) Xcodeのプロジェクト>プロジェクト設定を編集を選択する。 (2) ビルドタブを選択しコード署名ID>Any iPhone OS Deviceを、作成したProvisioningに設定する。 (3) info.plistを開き、Bundle identifier を作成した App IDに設定する。 iphone (4) Xcode【ビルドと実行】をDeviceに切り替えて実行する。

参考ページ

[iPhone 開発メモ] iPhone/iPod touch に自作アプリを転送する方法

  2010/08/19

www.yoo-s.comのドメインをyoo-s.comで統一したい場合、.htaccessで設定するだけです。

サンプル


    RewriteEngine On
    RewriteCond %{HTTP_HOST} ^www\.yoo-s\.com
    RewriteRule ^(.*) http://yoo-s.com/$1 [R=301,L]

www.yoo-s.comドメインを正規表現で取得し、301リダイレクトします。 $1を引数にすることで、下位階層のパスまで対応できます。

追記:2014/08/14

Apacheの.htaccess上書き設定

/etc/apache2/sites-available/default


        
                Options Indexes FollowSymLinks MultiViews
                AllowOverride All
                Order allow,deny
                allow from all
        

参考

301リダイレクトで「WWWあり」と「WWWなし」の統一をさくらサーバで実現する

  2010/08/19

AppleのiPhone OS View Controllerプログラミングガイドの日本語版が思いのほか充実している。 昔のドキュメントは英語ばっかだったんだけど。

NavigationControllerによる階層データの編集についても図がついていてわかりやすいです。

参考サイト

AppleDeveloper「編集(Edit)」/「完了(Done)」ボタンの使用Navigation Controllerの使用

  2010/08/19

CoreDataはメモリ上にデータを管理(NSManagedObjectContext)しているため、保存処理は十分注意する必要がある。

例えば、新規でレコードを作りそれをキャンセル(メモリ破棄)する場合、deleteObjectsで削除してコミット(save)すれば動作するでしょう。

新規でない場合、しかし、既にフェッチしたデータを編集する場合は注意です。 やっぱりキャンセルしようとdeleteObjectsを使うと、その名の通りデータが削除されてコミットされてしまいます。

NSManagedObjectContext

NSManagedObjectContextに、saveやundo等の処理が定義されています。

- (NSSet *)insertedObjects;
- (NSSet *)updatedObjects;
- (NSSet *)deletedObjects;
- (NSSet *)registeredObjects;

- (void)undo;
- (void)redo;
- (void)reset;
- (void)rollback;
- (BOOL)save:(NSError **)error;

- (void)lock;
- (void)unlock;
- (BOOL)tryLock;

キャンセルする場合、差し当たりrollbackで良さそうだけどちょっと自信はない。。。 それぞれの挙動は、時間あったら調べておきます。

ちなみに、undoManagerってのも存在するので1つずつ戻すってことも簡単に(?)できそうです。

参考サイト

CoreData - トランザクション(5) まとめ

  2010/08/16

IBでなくXcodeでUIButtonを追加してみる。

ボタンの種類

IBでおなじみのボタンです。 UIButton.hに定義されています。

    UIButtonTypeCustom = 0, 
    UIButtonTypeRoundedRect,
    UIButtonTypeDetailDisclosure,
    UIButtonTypeInfoLight,
    UIButtonTypeInfoDark,
    UIButtonTypeContactAdd,

UIButton buttonWithType:で設定します。

イベントの種類

これは他のオブジェクトが利用するのでUIControllに定義されています。

    UIControlEventTouchDown           = 1 <<  0,      // on all touch downs
    UIControlEventTouchDownRepeat     = 1 <<  1,      // on multiple touchdowns (tap count > 1)
    UIControlEventTouchDragInside     = 1 <<  2,
    UIControlEventTouchDragOutside    = 1 <<  3,
    UIControlEventTouchDragEnter      = 1 <<  4,
    UIControlEventTouchDragExit       = 1 <<  5,
    UIControlEventTouchUpInside       = 1 <<  6,
    UIControlEventTouchUpOutside      = 1 <<  7,
    UIControlEventTouchCancel         = 1 <<  8,

    UIControlEventValueChanged        = 1 << 12,     // sliders, etc.

    UIControlEventEditingDidBegin     = 1 << 16,     // UITextField
    UIControlEventEditingChanged      = 1 << 17,
    UIControlEventEditingDidEnd       = 1 << 18,
    UIControlEventEditingDidEndOnExit = 1 << 19,     // 'return key' ending editing

    UIControlEventAllTouchEvents      = 0x00000FFF,  // for touch events
    UIControlEventAllEditingEvents    = 0x000F0000,  // for UITextField
    UIControlEventApplicationReserved = 0x0F000000,  // range available for application use
    UIControlEventSystemReserved      = 0xF0000000,  // range reserved for internal framework use
    UIControlEventAllEvents           = 0xFFFFFFFF

サンプルコード

- (void) createButton(NSInteger) index {
    UIButton *button = [UIButton buttonWithType: UIButtonTypeRoundedRect];
    button.tag = index;
    //button.titleLabel.text = @"ボタン"; //iphone3Gまで?
 [button setTitle:@"C" forState:forState:UIControlStateNormal];
    button.titleLabel.font = [UIFont systemFontOfSize: 12];
    button.frame = CGRectMake(0.0f, 0.0f, 15.0f, 15.0f);
    button.titleLabel.shadowOffset = CGSizeMake (1.0, 0.0);
    [button addTarget:self action:@selector() forControlEvents:UIControlEventTouchUpInside];

- (void) editBar:(UIButton *)sender {
    NSLog(@"---- editBar ----");
    NSLog(@"%d", sender.tag);
    
}

tagはUIViewに定義されているプロパティですが、アプリケーション上のグループIDみたいなもののようです。 例えば複数のボタンを作成して、どのボタンがクリックされたかを連番のキーで判別するのもありかな?と。

CGRectMake

CGRectMakeで座標(第1,2引数)とサイズ(第3,4引数)を指定します。

イベント登録

addTarget:でイベントを登録できます。 forControlEvents:はイベントの種類を指定します。

titleLabel.textはiOS4では利用できないみたいなので、setTitleで指定します。 その際、ボタンの状態も指定する必要があります。

ボタン状態の種類

    UIControlStateNormal       = 0,                       
    UIControlStateHighlighted  = 1 << 0,                  // used when UIControl isHighlighted is set
    UIControlStateDisabled     = 1 << 1,
    UIControlStateSelected     = 1 << 2,                  // flag usable by app (see below)
    UIControlStateApplication  = 0x00FF0000,              // additional flags available for application use
    UIControlStateReserved     = 0xFF000000    

ボタンのスタイルの隠し機能??

UIButton の隠し API

pngファイルの軽量化
Google DriveのIconを再起的に削除
php-markdownでバニラPHPなコードブロック処理
laravel-ffmpeg を使う
2021年版 Ubuntu + certbot + Let's Encrypt でサーバ証明書設定
GihHub のデフォルトでない master ブランチを checkout する
マルチログインで未認証のリダイレクト
Homebrew で Redis をインストール
CSS だけでスムーズスクロール
EC-CUBE4 で Gmail の smtp を利用する
Amazon Linux 2 の amazon-linux-extras とは
UNIQUE カラムのバリデーションで自分自身を除外して更新
フォーム有効期限切れで Page Expired をリダイレクト
ログを日付でローテーションやクリアや削除
Homebrew で PHP8.0 から PHP7.4 にダウングレード
Big sur で zsh 移行と Homebrew アップグレード
Mac に minikube をインストール
途中から .gitignore に追加する
Larevel 6.x から Laravel 8.x にバージョンアップ
Composer で Allowed memory size (メモリ不足)エラー
Blade でカスタムクラスを利用する
git push git pull にブランチ指定せずに実行する
git pull や git push できなくなったとき
Docker のコンテナからホストOS に接続
Mac で ローカル IP アドレス(ipv4)のみを表示する
ホストOS から Docker の MySQLコンテナに接続
caching_sha2_password のエラー
node-config で環境設定ファイルを利用する
rootパスワードを初期化(再設定)する
Git から clone したときのエラー対処
Mac に MySQL をインストール
Mac に PostgreSQL をインストール
Laravel 環境構築 - Mac ネイティブ編
Firebase 入門 - Firebase とは
Firebase 入門 - CLI インストールとデータベースの設定
AWS 無料枠(t2.micro)で容量とメモリエラー
Cloud9 を起動する -初心者編-
gcloud で GCEインスタンスを起動してみる
AWS CLI と jq でインスタンス一覧を整形して表示
React と Laravel7 のプロジェクトを作成する
Homebrewインストール-2020年版
3直線で囲まれた範囲塗りつぶし
PuLP で線形最適化問題を解く
カスタムのペジネーションを作る
node-sass を使って sass をコンパイルする
Log ファサードでSQLログを分離して書き出す
いちから始める Docker - 複数のコンテナを使う - (2020年)
いちから始める Docker - docker-compose を使う - (2020年)
AWS ECR を使ってみる
Laravel7 でマルチ認証