Tag Archives: プログラミング言語

HTML5, CSS, jQueryの基本コードパッケージ

0
Filed under プログラミング言語, 仕事ツール
Tagged as , , , ,

ちょっとしたテストとか、JavaScriptの動作チェックとかやる度にゼロからHTMLを書いていました。
まだ、これまではその間隔が2,3ヶ月に1度くらいだったのであまり苦痛ではなかったのですが、最近1ヶ月に1度はやっている気がする。
大抵のテストではjqueryを使いたくなるので、それをダウンロードして、読み込ませたりするし、当然CSSも必要。
でも、CSSのプロパティとかどういうパラメータ名だったっけ?とか、jqueryってどういう使い方だったっけ?と基本的なところので悩み、なんとなく、こんな感じのような。。ちがうなぁ、と試行錯誤の繰り返し。

サンプルファイルアーカイブ

今更ですが、この作業があまりに無駄に感じたので、その最初のところまでをシンプルにしてまとめたものをアップしておきます。ご自由にお持ちください!

大抵のウェブコンテンツ制作者の方には不要だと思いますが、誰よりも自分のために公開!

Read More »

svnの差分があるファイルをリストアップしたらawkが面白いことを知った

0
Filed under Subversion, プログラミング言語, 仕事ツール
Tagged as , , ,

svn diff

subversionで変更一覧を見るには次のコマンドを入力します。

1
$ svn diff

これで、ファイル名に続いて差分がdiff形式で表示されます。
しかし、変更箇所の詳細は不要で、変更ファイルのファイル名だけが欲しい、という状況になり、一覧を調べるのに何か便利なコマンドがないかと調べて、awkと組み合わせてリストアップするコマンドを見つけました。

1
$ svn diff | awk '/^Index/ {print $NF}'

参考サイト:http://www.02.246.ne.jp/~torutk/subversion/intro.html

エイリアス化

これを毎回入力するのは面倒なので次のように .bash_profile に書いて、エイリアス登録。

1
alias svn_diff_list='svn diff | awk "/^Index/ {print $NF}"'

awk導入

上記コマンドの後半はawkによる文字処理。
awkって名前は知っているけど、自分で使ったこと無いので、これを機にちょっと調べてみた。
awkの面白さが分かりやすかったのがこのページ(http://x68000.q-e-d.net/~68user/unix/pickup?awk)
ls -alで出てくる情報を空白区切りとみなして、5列目、9列目のみ表示したい場合には次のようなコマンドでOKなのだ!

1
$ ls -al | awk '{print $5,$9}'

おー!!これは面白い!!!
んで、そのなかでも、例えば、adminという文字列がある行のみ表示したい場合には、次のように正規表現で指定すれば、行を抽出できる。

1
$ ls -al | awk '/admin/ {print $5,$9}'

ちなみに正規表現にマッチした行をすべて表示するには次のような感じ。

1
$ ls -al | awk '/admin/ {print;}'

awk、奥が深いらしいのですが、導入はこれで十分ですね!あとは、必要に応じて調べればいい!


[AD]

↓AWKの項目もある!ちなみにAWKとは、作者3人の名前の頭文字。エイホ(Aho)、ワインバーガ(Weinberger)、カーニハン(Kernighan)。そう、あのカーニハンですよ!

言語設計者たちが考えること (Theory in practice)

出版社:オライリージャパン( 2010-09-27 )

定価:¥ 3,780

Amazon価格:¥ 3,780

大型本 ( 536 ページ )

ISBN-10 : 4873114713

ISBN-13 : 9784873114712


↓awkを本格的にプログラム言語として勉強するならこれが良さそう。

sed & awkプログラミング 改訂版 (A nutshell handbook)

著者/訳者:Dale Dougherty Arnold Robbins

出版社:オライリー・ジャパン( 1997-10-01 )

定価:¥ 4,305

Amazon価格:¥ 4,305

大型本 ( 461 ページ )

ISBN-10 : 4900900583

ISBN-13 : 9784900900585


↓256倍シリーズのAWK本。

AWKを256倍使うための本 (Ascii 256倍)

著者/訳者:志村 拓 鷲北 賢 西村 克信

出版社:ASCII( 1993-08 )

定価:¥ 1,223

単行本 ( 277 ページ )

ISBN-10 : 4756101623

ISBN-13 : 9784756101624


Objective-Cの既存のクラスを拡張する仕組み

0
Filed under iPhone, Objective-C, プログラミング言語
Tagged as , , , , ,

Objective-Cには「カテゴリ」という機能があり、それについて調べたときのメモをまとめました。

その名は「カテゴリ」

ネットに転がっているソースを見ていて、それまで見たことなかった書き方があったときにはそれをどうやって調べたらいいのか、なかなか手こずります。その書き方そのものの名を知らないからです。
今回の例で言うと「カテゴリ」という機能のことで、下記のような感じで書かれていたら、それはカテゴリ機能を使っているのです。

1
@inteface NSString (HogeHoge)

このカテゴリ機能を活用すると、既存のクラスをちょっと機能拡張したい時に無駄なクラスを作る必要がなくなります。
例えば、文字列を扱うクラス NSString をに機能を追加したいことはよくあるのですが、NSStringの中身に応じたハッシュ値(MD5)を出力できるようなメソッドを追加する、という例に説明してみます。
MD5の機能実装の参考にしたのはこちらのサイト。関数の中身は全く同じです。

ざっくりしたカテゴリの書き方と使い方

まず、カテゴリ定義の書き方。
NSStringにMD5の機能を追加する場合、ファイル名は、NSString+MD5.h, NSString+MD5.m とするのがマナーのようです。
また、後述するソースを見ると分かるのですが、定義部は @inteface NSString (MD5)、実装部は @implementation NSString (MD5) という感じにして、あとは通常のクラス定義と同じように書きます。
次に使い方ですが、#import “NSString+MD5.h” として一緒にビルドすれば、そのソース内でNSStringインスタンスは全てMD5カテゴリの機能を持つことが出来ますので、下記のようなコードでMD5値を出力させることが出来ます。

1
2
NSString* strTest = @"テスト文字列";
NSLog( @"original[%@], MD5[%@]", strTest, [strTest MD5String] );

NSString+MD5 コード全容

1
2
3
4
5
6
7
//  NSString+MD5.h
 
#import <Foundation/Foundation.h>
 
@interface NSString (MD5)
- (NSString*) MD5String;
@end
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//  NSString+MD5.m
 
#import "NSString+MD5.h"
#import <CommonCrypto/CommonDigest.h> // for CC_MD5
 
@implementation NSString (MD5)
- (NSString *) MD5String
{
  const char *cStr = [self UTF8String];
  unsigned char result[CC_MD5_DIGEST_LENGTH];
  CC_MD5( cStr, strlen(cStr), result );
  return [NSString stringWithFormat:
    @"%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x",
    result[0], result[1], result[2], result[3], 
    result[4], result[5], result[6], result[7],
    result[8], result[9], result[10], result[11],
    result[12], result[13], result[14], result[15]
    ];  
}
@end

iOS SDKのMD5関数についての説明

おまけとして、上記のソースの内容を説明します。
MD5への変換関数 CC_MD5はiOS SDKにC言語ライブラリが用意されています。(リファレンスはこちら

CC_MD5は、次のように定義されています。

1
2
extern unsigned char*
CC_MD5(const void *data, CC_LONG len, unsigned char *md);

data が元になるデータのポインタ。
len がdataの長さ。
md がMD5計算の結果を格納する出力用バッファへのポインタで、CC_MD5_DIGEST_LENGTHの長さが必要なので、予め用意しておきます。本当はCC_MD5_DIGEST_LENGTHの長さに合わせて、出力部分を対応できるよう書いておく必要がありますが、CC_MD5_DIGEST_LENGTHは、そうそう16から変わることはないので、出力部分を固定で16要素並べてstringWithFormatで出力させています。

クラスの機能分割、という視点

カテゴリについての詳しい説明は、「Dynamic Objective-C」という書籍にも3ページに渡って説明されているのですが、こちらでの視点はチョット違う。

Dynamic Objective-C

著者/訳者:木下 誠

出版社:ビー・エヌ・エヌ新社( 2009-03-27 )

定価:¥ 3,360

Amazon価格:¥ 3,360

単行本(ソフトカバー) ( 456 ページ )

ISBN-10 : 4861006414

ISBN-13 : 9784861006418


そのセクション名は「カテゴリ ―動的なメソッドの追加によるクラスの拡張」となっていながらも、最初の段落の説明は次にように書かれている。

Objective-Cには、カテゴリと呼ばれる機能がある。クラスが持つメソッドを、名前の通りカテゴリごとに分類するための機能だ。これを使うことで、大きなクラスでもコーディングしやすいように分割することができる。

そもそもカテゴリとは、クラス実装を分割するための仕組み、だというのだ。
なるほど、そう考えるとカテゴリが「カテゴリ」という名前の由来もわかるし、ウェブに転がるサンプルのファイル名がHOGEHOGE-FOO.hとかハイフン繋ぎになっているモノがあるのも理解できる。
MVCモデルでクラスを分けても大きくなってしまうクラスはあるし、その場合にはカテゴリを使った機能分割も視野に入れていいかもしれない。
その他にもObjective-Cの深いところをじっくり説明してくれている「Dynamic Objective-C」はおすすめ書籍です!

カテゴリで出来ないこと

後から知ったのですが、カテゴリ機能で「クラスのインスタンス変数の追加」は出来ないようですね。
これ、結構重要なポイントだと思います。

参考サイト:『kuro’s blog : Objective-C:カテゴリで「できること」と「できないこと」』


[AD]

↓「CHAPTER09 カテゴリ」とカテゴリについて章を割いて説明されているようです!

詳解 Objective-C 2.0 改訂版

著者/訳者:荻原 剛志

出版社:ソフトバンククリエイティブ( 2010-12-17 )

定価:¥ 3,990

Amazon価格:¥ 3,990

大型本 ( 608 ページ )

ISBN-10 : 4797361786

ISBN-13 : 9784797361780


↓昨年8月に亡くなった今敏が1985年〜1986年に連載していたマンガ!面白そう!

OPUS(オーパス)上(リュウコミックス) [コミック]

著者/訳者:今 敏

出版社:徳間書店( 2010-12-13 )

定価:¥ 980

Amazon価格:¥ 980

コミック ( ページ )

ISBN-10 : 4199502211

ISBN-13 : 9784199502217


↓PS3もXbox360も持っていないけど、これは面白そう!

キャサリン 特典 サントラCD付き

キャサリン 特典 サントラCD付き

定価:¥ 7,329

Amazon価格:¥ 4,980

カテゴリ:Video Game

発売日:2011-02-17


Objective-Cで頭を悩ませる

2
Filed under Objective-C
Tagged as , ,

今回のエントリは、ここ数週間、Objective-CでiPhoneアプリ向けにコードをバリバリ書いているのですが、言語的に微妙に使い勝手が悪く、違和感を感じていたのですが、その原因の一つが分かった、という話です。
違和感の原因は、オブジェクト管理(メモリ的な意味)の分かりにくさ、でした。
私はC/C++での開発経験はあるので、ポインタが分からない〜、とかそういう話ではありません。(かつて、そういう時代もありましたがw)

retainしてんの?してないの?

retain/releaseという参照カウンタの仕組みは良いとは思うのですが、それ(retain)が全てではない、というところに問題の根源があると思うのです。
Counterphoto © 2008 Marcin Wichary | more info (via: Wylio)
copyするかもしれないし、assignかもしれない、という可能性を考えていたら、標準ライブラリの情報不足がジワリジワリと効いてきて、コードを書いてるのか、パズルを解いているのか分からなくなってきます。
例を上げてみます。
可変長の配列クラス NSMutableArray に addObject というメソッドがあります。
- (void)addObject:(id)anObject;
で、このメソッドが与えたオブジェクトをどう管理してくれているのか、それを知るすべが見つからないのです。
典型的な使用例として、下記のコードを見てください。このコードで問題ない、と言い切れるにはどれくらいの知識が必要でしょうか。

1
2
3
4
5
NSMutableArray* array = [[NSMutableArray alloc] init]; // (1)
NSObject* obj = [[NSObject alloc] init]; // (2)
[array addObject:obj]; // (3)
[obj release]; // (4)
[array release]; // (5)

(3)で渡したオブジェクトはretain/assign/copyの3通りの処理の可能性があります。
また、(5)のrelease時に、そのオブジェクトをどう処理しているか(releaseするのか、しないのか)を考える必要があります。
(3)で引数に渡したオブジェクトをretain、もしくはcopyしていたら、まぁ、(5)内では、オブジェクトをreleaseしてくれているとは想定できます。それをしないとほぼ確実にメモリリークしますしね。
しかし、(3)の引数処理がassign(参照渡しのみ)だったら、どうでしょうか?配列は破棄処理をするべきでしょうか。外部の使用者から見たら全く想像がつきませんね。
リファレンスにも次のようなことしか書いていませんでした。

addObject:
Inserts a given object at the end of the array.
- (void)addObject:(id)anObject
Parameters
anObject
The object to add to the end of the array’s content. This value must not be nil.
Important: Raises an NSInvalidArgumentException if anObject is nil.

anObjectはnilじゃだめだよ。nil渡したら例外投げるよ、ってことしか書かれていません。うーん、そうじゃなくて、引数を内部ではどう処理するのか、とかそういう情報も欲しいと思うんです。
結局下記のコードで、retainしていて、上記のコードで問題ないことを確認しました。

1
2
3
4
5
6
7
8
9
NSMutableArray *array = [[NSMutableArray alloc] init];
NSObject *obj = [[NSObject alloc] init];
NSLog(@" check A [%d]", (int)[obj retainCount]);	// 1
[array addObject:obj];
NSLog(@" check B [%d]", (int)[obj retainCount]);	// 2
[obj release];
NSLog(@" check C [%d]", (int)[obj retainCount]);	// 1
[array release];
NSLog(@" check D [%d]", (int)[obj retainCount]); // objがnilなので落ちる.

Open your mind!

retainも便利だとは思うし、積極的に使うべきだとは思うけど、明示して欲しいのですよ。
例えば、プロパティみたいに次のような構文が書けて、ヘッダーのメソッド宣言で分かればいいかも。
- (void)addObject:(id,retain)anObject;
あー、これだったらすっきりする!と自画自賛!!
特に標準じゃないライブラリとか、自分で書いたものとかですら、あとから使うときに困ることが多いんじゃないかな、と思うのですが、私だけでしょうか。


[AD]
↓「Chapter 3 オブジェクトの基本操作」が気になる

XcodeによるObjective-C入門

著者/訳者:大津 真

出版社:毎日コミュニケーションズ( 2010-01-23 )

定価:¥ 3,150

Amazon価格:¥ 3,150

単行本(ソフトカバー) ( 304 ページ )

ISBN-10 : 4839931879

ISBN-13 : 9784839931872



↓この本で言語仕様をしっかり勉強すべきかも。「CAPTER13:オブジェクトのコピーと保存」が上記エントリと関係ありそうですね。

詳解 Objective-C 2.0

著者/訳者:荻原 剛志

出版社:ソフトバンククリエイティブ( 2008-05-28 )

定価:¥ 4,410

大型本 ( 560 ページ )

ISBN-10 : 4797346809

ISBN-13 : 9784797346800