2012年9月9日日曜日

大切な予定までの日数をカウントする『あとマル』

このエントリーをはてなブックマークに追加
あとマルは直近の特定日までの日数を表示してくれるアプリです。日時と予定を入力するだけで、その日までの残り日数をバッジに表示してくれます。バッジとはアイコンの右上に表示される赤い円のことです。


App Store:あとマル - 残り日付をバッジでカウントダウン


2012年9月7日金曜日

iOSのツールバーをUIToolBarで作成する

このエントリーをはてなブックマークに追加
iOSアプリでよく見るツールバーはUIToolBarを用いて簡単に作成できるようです。UIToolBarでツールバーを作成し、そこにiOS標準のボタンを設置して表示するプログラムを作成しました。


2012年9月5日水曜日

NSUserDefaultsを利用してアプリの起動回数をカウントする

このエントリーをはてなブックマークに追加
NSUserDefaultsクラスを利用すると、軽めの情報をiOSアプリ内へ簡単に保存したり読み出したりすることができます。このクラスを利用して、アプリの起動した回数をカウントするコードを書きました。


2012年9月2日日曜日

Objective-CのSyntaxHighlighterをBloggerで利用できるようにする

このエントリーをはてなブックマークに追加
SyntaxHighlighterはソースコードを色分けして綺麗に表示するJavaScriptのライブラリです。しかし、Objective-Cは本家のライブラリに含まれていないため、その言語を利用したい場合はそれ専用のファイルを別のサイトから持ってくる必要があります。いろいろと試して何とかObjective-CのSyntaxHighlighterをBloggerで利用できるようになったので、その導入手順をメモします。


導入手順は次の通りです。

1. SyntaxHighlighterをソースコードの色付け - SyntaxHighlighter - <設定編>の方法で設定します。
2. UNDER MY HATのSYNTAX HL BRUSHESから"Oxygen"にあるファイル(shBrushObjectiveC.js)を開いてコピーします。("Objective-C"にあるjsファイルは別もののようです)
3. 1.で設定したタグ<script src="http://alexgorbatchev.com/pub/sh/current/scripts/shBrushPerl.js" type="text/javascript">と<script language="javascript">の間に<script></script>を記述します。
4. 3で記述した<script></script>の間に2でコピーした内容を貼り付けます。
5. 後はObjective-Cのコードを <pre class="brush: objc"></pre>で囲むと色付けされるようになります。


実行サンプルは次の通り。(色付けが少し寂しい気がしますが。。)

この導入方法は簡単で良いのですが、本家ライブラリとshBrushObjectiveC.jsを自サイトにアップロードして利用するのが本来のやり方だと思います。しかし、Bloggerではjsファイルをアップロードして利用するということが難しそうだったのでこの方法を採りました。自サイトへのアップロードはまた別の機会に。


SyntaxHighlighterの本家URL:SyntaxHighlighter
Objective-CのSyntaxHighlighter:UNDER MY HAT
導入まとめ1:ソースコードの色付け - SyntaxHighlighter - <概要編>
導入まとめ2:ソースコードの色付け - SyntaxHighlighter - <使用編>
導入まとめ3:ソースコードの色付け - SyntaxHighlighter - <設定編>
導入参考サイト1:はてなブログでSyntaxHighlighterでObjective-Cを表示
導入参考サイト2:SyntaxHighlighterでObjective-Cをきれいに表示

2012年9月1日土曜日

マルチスレッドとは・・・

このエントリーをはてなブックマークに追加
マルチスレッドプログラムについて経験値がいくらかたまったので、一度自分の知見をまとめてみようと思います。自分の知識の整理を目的としたいと思います。

スレッドとは

端的に言うと、スレッドとは、プログラムを実行する主体の最小単位です。ここで言っている主体とは、例えば、a.outという実行ファイルを実行する"そのもの"を指します。プログラムを実行するスレッドが1つであればそれをシングルスレッドプログラムと呼び、プログラムを実行するスレッドが複数であればそれをマルチスレッドプログラムと呼びます。シングルスレッドプログラムはa.outを逐次実行し、マルチスレッドプログラムはa.outを並列・並行実行します。
次にリソースの観点では、スレッドはプログラムカウンタを始めとしたレジスタ群とスタックを個別に持ちます。スレッドは、プログラムを実行する主体の最小単位であるため、それぞれに個別のプログラムカウンタとスタックを持つ必要があります。一方で、命令コードと静的データ、ヒープは、スレッド間で共有されます。これら命令コード、静的データ、ヒープを所有する主体となるのが、プロセスです。
スレッドは、必ず1つのプロセスに属します。また、1つのスレッドが2つ以上のプロセスに属することはありません。プロセスというのは、実行される実行ファイルごとのメモリ上の区切りのようなものです。プロセスごとに、命令コード、静的データ、ヒープ、スタックをメモリ上に持ちます。実行ファイルa.outを2つ同時に実行すれば、2つのプロセスがコンピュータ上に同時に存在するということになります。もちろんこのとき、それぞれのプロセスにスレッドが存在します。

シングルスレッドプログラムとマルチスレッドプログラム

シングルスレッドプログラムとマルチスレッドプログラムの実装の違いを、簡単に見てみます。マルチスレッドプログラムで用いるスレッドライブラリは、openMPとpthreadを使いました。
以下、printfを10回実行するプログラムです。環境によっては、マルチスレッドプログラムのhelloがプリントされる順番が入れ替わったりするかと思います。

singleThread.c
#include <stdio.h>

int main(void)
{
 int i;
 
 for(i = 0; i < 10; i++)
 {
  printf("hello%d\n", i);
 }
 
 return 0;
}

multiThread_openMP.c
#include <stdio.h>
#include <omp.h>

int main(void)
{
 int i;
 
 #pragma omp parallel for
 for(i = 0; i < 10; i++)
 {
  printf("hello%d\n", i);
 }
 
 return 0;
}

multiThread_pthread.c
#include <stdio.h>
#include <pthread.h>

#define NUMOF_THREADS 10

void* printHello(void* arg)
{
 printf("hello%d\n", *(int*)arg);
}

int main(void)
{
 int i;
 pthread_t threads[NUMOF_THREADS];
 int threadArg[NUMOF_THREADS];
 
 for(i = 0; i < NUMOF_THREADS; i++)
 {
  threadArg[i] = i;
  pthread_create(&threads[i], NULL, printHello, (void*)&threadArg[i]);
 }
 
 for(i = 0; i < NUMOF_THREADS; i++)
 {
  pthread_join(threads[i], NULL);
 }
 
 return 0;
}


singleThread.cは、単にprintfをfor文で回しているだけなので、特に問題ないと思います。
multiThread_openMP.cは、singleThread.cとほぼ同じです。異なるのは、openMPのヘッダをインクルードしていることと、for文の前に#pragma omp paralle forの1行があることだけです。たったこれだけで、for文のなかのprintfが並列・並行実行されます。
multiThread_pthread.cは、openMPのものと同じ並列・並行実行であるのに対して、コード量が多くなっています。これは、pthreadでは、スレッドの作成と、終了待ちを関数呼び出しで明示的に行う必要があるためです。openMPの方では、ほぼスレッドなど意識せずただfor文を並列に実行する、とプログラムしているだけでした。
上記の例を一見すると、openMPの方が簡単にマルチスレッドプログラムを作ることができます。しかし、for文の並列化はopenMPが得意とするところなので、openMPの方がコード量を少なく記述できているだけです。
世にいくつかもあるスレッドライブラリですが、それぞれに得意なところ、不得意なところがあります。得意なところは、比較的コード量が少なくなり、不得意なところはコード量が多くなるのが一般的かと思います。また、各スレッドの同期等の細かな動作を細かく制御できるスレッドライブラリは、細かく制御できる分、コード量が多めになる傾向があります。pthreadは比較的何でもできるスレッドライブラリなので、並列化のためのコード量が多めになりがちです。

まとめ

スレッドの概念、スレッドとプロセスの関係を説明し、マルチスレッドプログラムの例を見ました。スレッドライブラリはいくつもあり、それぞれに得意・不得意なところを持っていることを述べました。マルチスレッドプログラムに関して、説明しなかったしなかったことは、なぜマルチスレッドにするのか?、何をマルチスレッド化するのか?、どのようにマルチスレッド化するのか?といったことになります。こういったことは、マルチスレッドに関する本が参考になります。また、現実に使われているマルチスレッドプログラムを探しだして読むことも参考になります。