頭と尻尾はくれてやる!

iOSアプリなどの開発日記です


祝!イオン貝塚店がオープン!

ずっと更地だった貝塚ジャスコ(貝ジャス)跡地についにイオン貝塚店が"ソフトオープン"したってお話だよ。

AEON | 店舗情報 | イオン貝塚店

ソフトオープンなんて初めて聞いたんだけど、本家サイトにそういう風に書いてたんだ。昨日の11月21日ソフトオープンで11月24日にグランドオープンらしいよ。
そのサイトによると"ソフトオープン"の説明に
当店は、オープン時の店舗周辺の交通渋滞を緩和するため、また建設期間中にご協力いただいた店舗近隣の皆さまにゆっくりとお買い物を楽しんでいただくため、11月21日(水)〜23日(金)の3日間をソフトオープン期間として営業します。

ってあるんだけど夕方に子供と行ってみたら、別に武井咲が来るわけでもないのにすんごい混雑でさ。

イオン貝塚店

↑アイスクリームの31(サーティワン)で風船をもらっただけで帰ってきたよ。

ともかく待望の貝ジャス復活。末永く続きますように。


クラス外から参照させない"プロパティ"の書き方

クラス外から参照されたくないクラス内専用のプロパティを記述する方法についてのお話だよ。
この前人様のコードを見てて気が付いたんだけど、こういう書き方があったんだ!と目からウロコが落ちまくったので書いておくよ。もちろんObjective-Cね。

そもそもなんでクラス外から見られたくないんだ、クラス外から参照できるようにするためのものがプロパティじゃないのかって感じなんだけど、クラス内専用にしたい時っていうのがあるんだ。

どんな状況かというと、クラス内であるオブジェクトを持つ時に、それが何回作っちゃうかわからないようなモノだとメモリリークがイヤだから通常のインスタンス変数じゃなくてプロパティの形にすることがあるんだ。
もちろんARC(Automatic Reference Counting)は無しの場合ね。
例えばインスタンス変数だとあるクラス(MyViewControllerクラス)内の実装ファイル(MyViewController.m)でこんな書き方をしたとするよ。
//MyViewController.m
#import "MyViewController.h"
@interface MyViewController () {
	Hoge *hoge;
}
@end

@implementation MyViewController

-(void)loadView
{
    [super loadView];

    [self makeObject];
}

-(void)makeObject
{
    hoge = [[Hoge alloc] init];
}
@end
makeObjectというメソッド内でHogeクラスのオブジェクトを作ってるんだけど、実はこのメソッドがどこから何回呼ばれるかよくわからない、とするとこのhogeオブジェクトをどうやってリリースするんだって悩むでしょ?
だから今まで俺はこういう時にプロパティにしてたんだよ。
コードはこんな感じ。
//MyViewController.h
@interface MyViewController : UIViewController

@property(nonatomic,retain) Hoge *hoge;

@end

//MyViewController.m
#import "MyViewController.h"
@interface MyViewController () {
}
@end

@implementation MyViewController

-(void)loadView
{
    [super loadView];

    [self makeObject];
}

-(void)makeObject
{
    self.hoge = [[[Hoge alloc] init] autorelease];
}
@end
こうしておけば最後にnilを入れればリークの心配はないよね(上には書いてないけど)。Xcodeのいつからだったか@synthesizeも書かなくてもよくなったから楽チンだ。それでいて_hogeでアクセスもできるし。
ただこの方法だと本当にクラス外からアクセスできるプロパティと区別がつかないんだよね。
だから何だ?と言われればそれまでなんだけど、俺としてはそれが気持ち悪いんだよ。
後々このクラスのヘッダーをみたらどのクラスかがhogeプロパティを参照してるのか?書き換えてるのか?とか思っちゃうじゃない。
インスタンス変数なら@publicとかでああ、クラス外からも参照するんだなってわかるけど、プロパティにはそういうのはないよね。
なんとかならないのかなあってことでマイルールなんだけど俺はずっとそういうクラス外から参照されない、クラス内専用の"プロパティ"には文字列の後ろにアンダーバーを付けているんだよ。
ここだとプロパティの設定のところで
@property(nonatomic,retain) Hoge *hoge_;
こんな感じに。あまり見た目よくないけどねえ。

ところが、だよ。

こういう書き方してるのをたまたま見たんだ。
//MyViewController.m
#import "MyViewController.h"
@interface MyViewController () {
}
@property(nonatomic,retain) Hoge *hoge;
@end

@implementation MyViewController
//実装部分
@end
なんのことはない、ヘッダー部分じゃなくて実装ファイル側でプロパティを設定してるんだ。
これだとヘッダーに何にもプロパティhogeのことは書いてないので、当然クラス外から参照できない。
クラス内からはちゃんとアクセスできて後から見てもああ、これはクラス外からアクセスしない"プロパティ"だな、というのがすぐわかる。
これだよ、これ!これならコードの記述がすっきりするわ。
ふー、もっと早く知りたかったよ。


釣った魚を料理してみたら

先月くらいだったか、子供にせがまれて仕方なく釣りへ行ったものの二回続けて坊主だったんだ。
それで俺自身なんだか火がついたというか、ホントに釣りたくなってきてさ。先週末に子供置いといて早朝一人で釣りに行ってきちゃったよ。
子供と一緒の時は朝食を食べてから出かけていたんだけど、一人なので朝4時頃に起きて準備して出かけたよ。こんなの5歳児にさせられない。

で、まだ真っ暗な中釣り糸をたらし始めたのはいいんだけど、、、恐ろしく寒い!
この日は風もあってあまりコンディションよくなかったかも。
こりゃまた坊主かな、それでもいいや、とっとと終わらせて帰ろうって気になってどんどん撒き餌を豪快に撒いて、自分は車の中に退却してたくらいだよ。
暖かいお茶持ってくればよかったなあ、車の外に出たくないなあとか思いつつ、しばらくして竿を確認してみたら魚がかかっていたんだ。俺ごときに釣られるなんて、不運なお魚たちだ。
結局釣れたのがこの4匹。

セイゴ四匹

実はアジ狙いだったんだけど、アジじゃないのはわかってた。
これ食べられるのかな?と思いつつとりあえず持って帰って調べてみたらどうも鱸(すずき)の幼魚のセイゴって魚みたい。
調べるといろいろレシピはあったんだけど、結局選んだのはこれ。
Anglers Fish recipe♪:セイゴの塩麹ホイル蒸し

上のサイトにはさばき方からあるんだけど、さばくのも難しいもんだね。
普段はせいぜいさんまやイワシの内蔵を取り出すくらいしかしないから、三枚におろすなんてのも四苦八苦だったよ。背びれかどこかで指突き刺して出血しちゃうしさ。

三枚におろされたセイゴ
↑なんとか三枚におろして、

セイゴを塩麹で浸ける
↑レシピ通り一晩塩麹に浸けて、

セイゴのホイル蒸し
↑完成したホイル焼きがコレ。
これがね、ホントに美味しかったんだよ。ヨメさんも子供も喜んで食べてくれてね。
ヨメがまた釣ってきて欲しいねなんて言うから、、、また釣りに行きたくなってきたよ。



良いコードを書くためのマイルール

理解しやすいコードにするにはどうしたらいいんだろうってお話だよ。

既にリリースしたアプリに修正をする時や、新しく作る場合でもいいんだけど、数日前、場合によっては数ヶ月前に書いたコードを見ることがあるんだ。でも処理の流れやメソッドの内容とかがすぐに理解できないことがあって、そういうのを把握するのに時間がかかってストレスになってしまうことがあるんだよ。自分で書いたコードなのにだよ。
それでいろいろ参考になるページがないか探していたらこんなページを見つけたんだ。

良いコ-ドへの道―普通のプログラマのためのステップアップガイド:連載|gihyo.jp … 技術評論社

まだ途中をかじってるところなんだけど、ほーっと思うところがたくさんあるよ。
こういうのを参考にしながら自分でルール決めて可読性を高めるようにしてみようって思ったんだよ。
今まで意識していなかったんだけどすぐにできそうなのがこんなの。まあマイルールなんだけどさ。

(その1)
const int c = a*b;
のように変更してはいけない変数にはconstを付けるというもの。
どこかでc++;とか書いちゃうとビルドできない。なるほど。この行をみればこの変数は変化しないモノだとすぐにわかるよね。

(その2)
スコープはなるべく小さくする。クラスメソッド使え、というもの。
スコープを小さくするってのも意識していなかったし、クラスメソッドもそういう役割を果たすなんて思いもしなかったよ。

(その3)
ハードコーディングはするな!というもの。
ああああ、聞いたことあります、はい。すいません。これからは徹底します。誰に謝ってるんだ?

(その4)
メソッドの引数は5つまで!というもの。まあ数はいくらがいいのかは知らないけど、こんなのがあったんだ。
第3回 スコープを意識したプログラミング―その3 インスタンスメソッドの可視性:良いコ-ドへの道―普通のプログラマのためのステップアップガイド|gihyo.jp … 技術評論社
メソッドの引数は必要最低限の情報を持つのが依存性が少なく良いコードであると言えます。
ただし,引数の数が多くなり過ぎる場合は,引数をオブジェクトに変更したほうがよいです。目安として引数の数が5つを超えるメソッドは,引数をオブジェクトに変更することを検討するとよいでしょう。
ほうほう。悩むところだよね、このリンク先にある例題。
今まで意識しなかったけど、なるべく最低限の情報でやりとりするように心がける、と決めたよ。


GoogleConversionTrackingSDKに不具合あったんだって

Google Adwordsでコンバージョン測定用コードが原因でクラッシュするから最新版にしましょうってお話だよ。

無料のiOSアプリ「赤ちゃんの成長グラフLite」にコンバージョンを測定するためのGoogleのコードを埋め込んだんだけど、他の修正をやっているところだからまだ申請はしていないんだよ。
そしたらGoogle AdWordsのサイトにこんな注意書きが出てたんだ。

Google Adwordsの警告1

なんだってー!?まあまだ申請してないから何の問題もないんだけどね、俺の場合。
リンク先の詳細を見ると10月31日から11月9日の間にSDKをダウンロードしてる人はあかんでー!バグあるでー!とのこと。

Google Adwordsの警告2

SDKをダウンロードした日付を確認すると11月9日になってる。時差とかでホントにアウトかどうかわからないけど一応最新のをダウンロードしなおしたよ。

それにしてもダウンロードしてきたGoogleConversionTrackingSDKのバージョンはどこを見ればいいんだろう?




Copyright ©頭と尻尾はくれてやる!. Powered by FC2 Blog. Template by eriraha.