Macでは名前無しSemaphoreは未サポート

並行プログラムを勉強したくてMac OS X上でスレッドの同期をとる仕組みであるセマフォを勉強してみたので備忘録がてらブログを。

セマフォ(英語ではSemaphore)というのは複数のプロセスやスレッドが同期を取るための制御構造あるいは,そのような構造を構成する為のデータ型を指す。
この概念はグラフ構造のデータ上で最短パスを見つける為に使うアルゴリズムダイクストラ法を考案したエドガー・ダイクストラ氏が考案した。

データ型としてのセマフォ(以下単にセマフォと言ったらデータ型を指すとして)はPOSIXで提供されているのでLinuxUnixで使用する事ができる。
今回勉強するにあたって言語はC++コンパイラXCode付属の物を使ってみた。

sem_initを使ってみると

セマフォ変数の初期化関数であるsem_initを試すために次のようなサンプルコードをコンパイルしてみると

#include "semaphore.h"
int main(void) {
  sem_t value;
  if( sem_init( &value, 0, 0) == -1 ){
     perror("sem_init");
  }
  return 0;
}

こんなワーニングがでます。

 warning: 'sem_init' is deprecated [-Wdeprecated-declarations]
  if( sem_init( &value, 0, 1) == -1 ){
      ^
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk/usr/include/sys/semaphore.h:55:5: note: 
      'sem_init' has been explicitly marked deprecated here
int sem_init(sem_t *, int, unsigned int) __deprecated;

作成された実行ファイルを実行すると…

bash-3.2$ ./a.out 
sem_init: Function not implemented

エラーで止まってしまう。

理由は

sem_initは名前無しのセマフォ変数をメモリ内に作るがそもそもこれはXCodeコンパイラでは未サポートなのでワーニングでsem_initはやめようねと指摘されている。

名前無しセマフォとは同一プロセス内あるいは共有メモリを使っている複数プロセス間で使用されるものだ。

ところで、『名前無し』に対して『名前付きセマフォ』というのがあって、共有メモリを用いていない複数間のプロセスでも同期がとれるものだ。この名前付きセマフォを初期化するのにはsem_openという関数を呼び出す。


実はXCodeではセマフォを使うなら名前付きセマフォを用いないといけなくて、名前無しセマフォは未サポートだった。
ということで、

結論

Xcode使うならsem_openで名前付きセマフォを使おう。

MacBookProを買い替える

5年以上前のモデルをメインに使っていたんだが、さすがに厳しくなってきました。
OSはLionだったけど、アプデートもしなくなってきたので、2014年モデルのMacBookPro13インチを購入

スペックは

本来ならもう少し容量が欲しいところだけど予算の都合上で。

アプリケーション設定の備忘録

AppleID

OSのアップデートやXCodeのインストールをしようとするとAppStore経由なんだけどAppleIDで困った。
既に作ってあったんだけど,既存のものだとXCodeをダウンロードしようとしたらクレジットカードを登録って...

ちょっとやだなあと思っていろいろ試したけど、結局新規にAppleIDを作成して。
ここらへんをもう少し柔軟にしてくれると助かるんだけど。

Emacs

CarbonEmacsやCocoaEmacsではなく今回はMacEmacsを。
リリース Emacs24-with-inline-patch Emacs-24.3-with-inline-patch-R1 - MacEmacs JP - OSDN

日本語入力用のパッチをあてたものをインストールしました。
(インストール自体はApplicationフォルダにEmacsをドラッグ&ドロップ)

MacPorts

パッケージ管理システムはMacPortsを選択しました。HomebrewでなくMacPortsとしたのは
404 Blog Not Found:備忘録 - Mountain Lion を最低限文化的にしつけるためにやったこと


その他

Google日本語入力などもインストールしたけど備忘録として残すような事もないので割愛!

結論

Lionと比べてなんだけどトラックパッドの三本指ジェスチャーは二本指になってしまったのはちょっと違和感が。
あとSafariを始めダウンの操作も逆に、これはまぁなれるとこっちの方が便利。

HDDからフラッシュストレージとなり体感スピードは抜群にいい!
熱もほとんど感じないのも素敵だ。

香川県の地酒 川鶴

いつもお世話になっている職場近くにある居酒屋のマスターからオススメされたのがきっかけで出会った香川県の地酒,川鶴("かわづる")。

きりっとして飲みやすく懐に優しいのですぐにお気に入りとなりました。
ちなみに香川県だと悦凱陣("よろこびがいじん"と読みます)の方が川鶴より有名ですかね〜。

で,きりっとしてる川鶴なんだけど,この前,新しい発見がありました。
紹介されたのとは別のお店で香川県で作られている酒米(お酒を作るときに使う米の事)大瀬戸で作られた川鶴を飲みました。

これは…いつも飲んでいる川鶴とは全然違う!

口いっぱいに旨味に包まれた甘みが広がっていく,コクのある濃い目の味でした。
いつもの川鶴ももちろん美味しいんだけど,大瀬戸で作られた川鶴は味が全然ちがっていて本当に同じ川鶴なの?と思わずお店の人に聞いてしまいました。
個人的には大瀬戸で作られた川鶴の方が好きな味です。


酒米はいろんな種類があるんだけど,大瀬戸は初耳。素晴らしい酒米と出会えて嬉しかったですね。

Amazonの広告では雄町のしか見つからない…)

高知のお酒 美丈夫のぽんしゅわ!!

美丈夫のぽんしゅわ!!は日本酒ベースのリキュールで,ぽんかん味のお酒です。
四国高知県の銘酒である美丈夫を作ってる蔵が製造してるんだけど,もちろん美丈夫そのものもとても好きな銘柄ですが,この『ぽんしゅわ!!』も好きですね。
美丈夫については去年のブログでも書きました高知の美丈夫 - malibu-bulldogの日記

このぽんしゅわ!!の味は甘みと酸味がちょうどよく,後味すっきりな感じ美味しいです。
正直ぽんかんの味がするのか?と聞かれると自分がぽんかん自体あまり食べないので分かりませんが…
まぁでも居酒屋に置いてあればラスト一杯って時には必ず頼みたいですね。
(しかし置いている居酒屋は少ないんですけどね…)

なので,もっぱらこのお酒は酒屋で買うのが専門ですね。
自宅パーティーや花見などのイベント時に持参する必須アイテムとなっています。
それとプレゼント用にもよく買います,酒は飲むけど日本酒は嫌い/飲まないって人も多いのでそういう人へのプレゼントとして。
値段も1000円未満なので,送られた方もびっくりしないし。
また,日本酒ベースとはいえアルコール度数は低いので女性にも受けが良いです。

しかし日本酒と聞くとマユをひそめる人も多いのではじめは日本酒とは言いません。
でも面白いのは美味しいねと言ってくれた人に,これ実は日本酒ベースですよと明かすとびっくりしてます。

売ってる酒屋も置いてある居酒屋も少ないのが難点かな〜。

新潟の地酒 鶴齢(かくれい)

日本酒の鶴齢は,新潟の八海山のふもと南魚沼市にある青木酒造で作られているお酒です。
鶴齢はどんなお酒かというと…口に含むと口のなかにバターが広がるとでも言えばいいでしょうか,濃厚で豊潤な味わいです。

そんな鶴齢の中で僕がよく飲むのはこの本醸造生ですけどね!

リーズナブルな値段が気に入ってます。

ちなみに僕は『純米じゃなきゃダメだ!』とかそういう類のこだわりは持ってません。
リーズナブルな値段で美味しければそれでいいです。
(もちろん居酒屋さんとかで鶴齢の純米吟醸とか置いてあれば注文はしますけどね)


それから,青木酒造で作られている雪男。こちらは鶴齢と違ってスッキリタイプのお酒です。この雪男を呑んで辛口だね!という感想を言った人もいるけど…それほどでも無いような…

ラベルに描かれている雪男はなかなか可愛い感じですね。

雪男はワンカップも発売されていて,可愛い雪男がしっかり刻まれています。
女性へのプレゼントにしたら喜ばれるのでは?
(まぁ僕の身の回りにいる女性は日本酒嫌いな人が多いので試せていませんが…)

設計書書きながらプログラミング

最近,趣味で作っているプログラムは設計書(というか仕様書的な感じもしないでもない)を書きながら進めるようになった。

というのも,今は公私ともに充実しすぎていてまとまった時間が取れず隙間時間で作っている。
すると,例えば先週やっていた事は…あれ?なんかやろうとして挫折している?それとも中途半端?
というような状況に陥りやすい,いや陥ってしまう。

そこで設計書的なものを書きながらプログラミングをする事にした。

僕の現職業務はプログラマなんで,仕事では設計書的なものを書かないんだけど,いや…正直言えば設計書よりまず動くものだろ!という考えでやってきてるんで,設計書を書きながらプログラミングというのは実はプログラマ人生で初の出来事(少し言い過ぎか)。

さて,設計書的なものを書きながらプログラミングの効果はというと,細切れ時間で作るならとても有効だ。

作ってる最中に迷う事もなくなったし,見通しもよいし。
というか朝昼夜の空き時間に仕様書を書いて,通勤時間中に仕様書のチェックをし,多少時間のある土日に実装&実験というサイクルは割りと自分にフィットしている。

集中して作る時間が取れるなら(構想からアルゴリズムの検討&実験そして実装までノンストップで)まぁ別だけどね。

個人的なgo言語に関する備忘録

ここ最近のgo言語に関して知った事や思った事の備忘録。

mapの中身を探すには?

ある値がmapのキーにあるかどうかを判定
例えば,map型のmapdataとし,keyかどうかを判定したい変数をkeydataとすると

if _, ok := mapdata[keydata]; ok {
   // keydataがmapdataにあれば
}

って感じで書けば動いてくれる。

検索するときはgolang

goはgolangという名称が一般的かも。googleに'''go'''だけいれて尋ねても気の利いた答えは帰ってこない…。

case文

switch文はcase を続けてかいてもだめ。
case の後に条件をカンマ区切りで続けて書かないといけない。

例えば結構C++とかで

switch( type ){
  case 1:
  case 2:
     printf("test");
  break;

なんて感じで書けばtypeが1の時と2の時にtestってコンソールで表示されるけれど,同じようにgoでやったら

type := 1
switch( type ){
  case 1:
  case 2:
    println("test")
}

これだとtestとは表示されない。

case 1,2:

と書かないと!

メモリ上の日本語をそのままJSONで渡してもいい

最近の言語だし,内部はすっかりユニコード
ということで,コードに埋め込んだメモリ上の日本語をそのままJSONとしてクライントに返しても期待通り動いてくれます。
これは楽です!文字コードとか変換とかアレコレ気にしないですむのはいい。