2012-04-02
iPhoneのアラートビューとアクションシート
Objective-C, iPhoneアプリ | |
IBでレイアウトして作らない系のやつ
アラートビュー
// アラートビューを作成 UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"タイトル" message:@"実行しますか?" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"OK", nil]; // アラートビューを表示 [alert show];
/** * アラートのボタンが押された時に呼ばれるデリゲート */ - (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex { if (buttonIndex == 1) { // ラベルにOKと表示 myLabel.text = @"OK"; } else { // ラベルにCancelと表示 myLabel.text = @"Cancel"; } }
アクションシート
// アクションシートの作成 UIActionSheet *actionSheet = [[UIActionSheet alloc] initWithTitle:@"タイトル" delegate:self cancelButtonTitle:@"キャンセル" destructiveButtonTitle:@"赤いやつ" otherButtonTitles:@"普通のやつ1", @"普通のやつ2", nil]; // アクションシートの表示 [actionSheet showInView:self.view];
/** * アクションシートのボタンが押された時に呼ばれるデリゲート */ - (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex { switch (buttonIndex) { case 0: myLabel.text = @"赤いやつ"; break; case 1: myLabel.text = @"普通のやつ1"; break; case 2: myLabel.text = @"普通のやつ2"; break; default: break; } }
2011-05-28
イングロリアス・バスターズを見てみた
映画 | |
いつもは観賞メーターに感想を書くのですが、長すぎて書ききれなかったのでここに書いておきます。
イングロリアス・バスターズ
まず最初にこの素晴らしい映画を撮ったクエンティン・タランティーノ監督に謝罪の意を表明したい。この映画を見るまで最近のタランティーノは才能が枯渇したよねー。と申しておりました。殴られた記憶もろくにないくせに申し訳ございませんでした。
さて、イングロリアス・バスターズは「ナチスに家族を殺されたユダヤ系の少女」と「ドイツ占領下のパリに潜入し、ナチスの軍人を始末する部隊"バスターズ"」の2つの軸を持つ群像劇である。
この映画からテーマを読み取ることは難しい。(あるいは無いのかもしれない。)
なぜならばイングロリアス・バスターズはナチス・ドイツを題材にしているが、いわゆる「戦争映画」の下敷きを敷いていない一風変わった構成になっているからだ。
主人公の一人であるショシャナ(メラニー・ロラン)に焦点を当てれば復讐劇であるが、もう一人の主人公であるアルド・レイン中尉(ブラピ)に焦点を当てるとまた違ったジャンルとなる。そしてこの映画は悲劇でもなければ喜劇でもない。
だかといってイングロリアス・バスターズは決して中途半端な作品ではない。まだ見ていない人のためにネタバレは差し控えるが、ストーリーが練り込まれており、映画としての「見せ方」も素晴らしい。そして登場人物の粋な言葉のキャッチボールは涎モノである。いや、お見事。
私はタランティーノ作品の中ではパルプ・フィクションが最も好きだ。今まで見た映画の中でBEST10を決めるとしたら、その中にパルプ・フィクションは必ず入れる。
このイングロリアス・バスターズはパルプ・フィクションに勝るとも劣らない傑作である。
2011-03-27
以前使用していたC言語のシンプルな拡張数学ライブラリ
C | |
以前使用していたC/C++用の拡張数学ライブラリ(といってもかなりシンプルですが)を公開します。
コードはANSI-Cで書いています。幾何学系が多めですが、行列演算等は(他のライブラリを使用していたため)サポートしていません。
ソース
https://github.com/kojo-sugita/mathex.h
サポートしている機能
| 関数 | 概要 |
|---|---|
| Summation | 総和を計算する |
| SumOfSquares | 平方和を計算する |
| SumOfProduct | 積和を計算する |
| Average | 平均値を計算する |
| Variance | 分散を計算する |
| UnbiasedVariance | 不偏分散を計算する |
| Covariance | 共分散を計算する |
| StdDev | 標準偏差を計算する |
| Max | 最大値を求める |
| MaxInt | 最大値を求める(int型配列) |
| Min | 最小値を求める |
| MinInt | 最小値を求める(int型配列) |
| MaxMin | 最大値と最小値を求める |
| Factorial | 階乗を計算する |
| Permutation | 順列組み合わせの総数を計算する |
| Combination | 組み合わせの総数を計算する |
| Distance | 2点間の距離を求める |
| DivideInternally2D | 2点p1,p2からなる線分をm:nに内分する点を求める (2次元) |
| DivideExternally2D | 2点p1,p2からなる線分をm:nに外分する点を求める (2次元) |
| Triangle_CenterOfGravity | 3点p1,p2,p3からなる三角形の重心を求める (2次元) |
| ToVecto | 2点を結ぶベクトルを求める |
| VectorSum | ベクトルの和を求める |
| VectorDifference | ベクトルの差を求める |
| Norm | ベクトルの長さ(ノルム)を計算する |
| InnerProduct | ベクトルの内積を計算する |
| IncludedAngle | 2つのベクトルのなす角を計算する |
| UnitVector | 単位ベクトルを求める |
| NormalVector3D | 3次元の法線ベクトルを求める |
| CrossProduct3D | 3次元ベクトルの外積を計算する |
| VectorSimilarity | 2つのベクトルの類似度を計算する |
| NormalizedVectorDistance | 正規化距離を計算する |
| IsDepthOnLine3D | 3次元空間上の点p1と点p2を結ぶ直線上に点pが存在するかを判定する |
| CalculatePlane3D | 3次元平面を作成する |
| CalculatePlane3D_Using3Depths | 3点から3次元平面を作成する |
| ToLineCanonicalForm | 直線の方程式を標準形から一般形に変形する |
| ToPlaneCanonicalForm | 平面の方程式を標準形から一般形に変形する |
| ToPlaneGenericForm | 平面の方程式を一般形から標準形に変形する |
| DistanceLineToDepth | 点と直線との距離を返す |
| DistancePlaneToDepth | 点と平面との距離を返す |
| IsCorrectPlane | 2つのベクトルからなる平面がよい平面かを判定する |
| Arg | 第1象限から第4象限までの偏角を求める |
| ZenithAngle | 天頂角を求める |
| Sigmoid | シグモイド関数を計算する |
| pi | 円周率を求める |
| to_deg | 弧度法表記を度数法表記に変換する |
| to_rad | 度数法表記を弧度法表記に変換する |
| logn | 任意の整数を底とする対数を計算する |
| cbrt_newton | ニュートン法で立方根を近似する |
| frac | 除算を計算する |
バグがあったらごめんなさい。使用する際は自己責任でお願いします。
もっと複雑なことをしたい場合はGSLがおすすめ。
2010-09-12
HTML5+JavaScriptで画像処理 ハーフトーニング
JavaScript, HTML5 | |
HTML5とJavaScriptでハーフトーニングをしてみました.
実行ページ
http://jstap.web.fc2.com/test/html5/halftoning/halftoning.html
※ 濃度パターン法は低速なので注意してください.
ソース
http://github.com/kojo-sugita/Halftoning
ハーフトーニングとは多値階調を持つ画像を2値(あるいは少ない階調)で表現する方法のことである.
マンガのスクリーントーンやモノクロプリンタで出力された画像などがまさにソレで点の密疎で濃淡を表現する.
今回実装した手法は以下の3通り.いずれも基本的な手法である.
濃度パターン法 (density pattern method)
画像の1画素に対して複数画素からなる2値表現のパターンを割り当てて濃淡を表現する手法.
例えば1画素を4×4のパターンを割り当てると擬似的に17階調の表現ができる(下記図参照).
割り当てる濃度パターンを4×4,現画像をN×M画素とすると出力画像は4N×4M画素になる.
実行結果
※ 前述のとおり画像サイズが大きくなるため一部抜粋
ディザ法 (tither method)
ディザパターンと呼ばれるN×Nの行列を用意しておく.
ディザパターンの値と現画像の各画素の輝度値を比較し,その大小関係でその画素を白にするか黒にするかを決定する.
1. 画像をN×N画素(ディザパターンのサイズ)のブロックに分割する
2. ブロック内の各画素がディザパターン内の対応画素値×16 + 8以上なら白,未満なら黒を割り当てる
実行結果
誤差拡散法 (error diffusion method)
ある画素の輝度値と,その画素を2値化した値との誤差を周辺画素に分散させ,誤差をキャンセルするように未処理画素の輝度値を修正しながら2値化していく手法.
fを対象画素の輝度値,gを出力画素の輝度値とする.
1. 誤差eを以下のように決定する.
f > 128 のとき・・・g = 255
f <= 128 のとき・・・g = 0
e = f - g
2. 誤差eを周辺画素に分散させる.
f'(x + 1, y) = f(x + 1, y) + (5/16)e
f'(x - 1, y + 1) = (x - 1, y + 1) + (3/16)e
f'(x, y + 1) = f(x, y + 1) + (5/16)e
f'(x + 1, y + 1) = f(x + 1, y + 1) + (3/16)e
実行結果
誤差拡散法が一番それっぽい結果になっていることが分かる.
2010-06-25
2010-05-04
HTML5 + JavaScriptで画像処理 (エッジ検出)
HTML5, JavaScript | |
古籏一浩のJavaScriptラボ ― 第14回 HTML5のcanvasで作る画像フィルター
を読んで、Canvasで画像の輝度値を編集できることを知ったので、ためしに実装してみることに。
GUIや画像の端の処理などかなり手抜きだが、Firefox、Google Chrome、Operaで動作することを確認した。
処理はかなり重く、私の非力なマシンは実行するたび悲痛なファンの音を上げるほどである。。。でもしょうがないよね(´・ ω・`)
ちなみに3種類のブラウザで最も実行速度が早かったブラウザはOperaであり、もっとも遅いブラウザはFireFoxだった。
HTML5 + JavaScriptによるエッジ検出
http://jstap.web.fc2.com/test/html5/filtering/filtering.html
実行結果
2011/04/24追記
以下は古いソースコードです。最新は https://github.com/kojo-sugita/Image-filtering をご覧ください。
<p><b>オリジナル画像</b></p> <img src="./lena.png"></img> <br> <input type="button" name="edge" value="エッジ検出" onClick="EdgeDetector()"> <br> <p><b>エッジ画像</b></p> <img src="./lena.png" style="display: none"> <canvas id="myCanvas" width="256" height="256">canvasに対応したブラウザーで実行してください</canvas>
JavaScript
/** * エッジ検出 */ function EdgeDetector() { var _canvasW = 256; // 横幅256ピクセル var _canvasH = 256; // 縦幅256ピクセル var canvas = document.getElementById("myCanvas"); var context = canvas.getContext("2d"); var imgObj = new Image(_canvasW, _canvasH); imgObj.src = "http://jstap.web.fc2.com/test/html5/edge/lena.png"; context.drawImage(imgObj, 0, 0); var grayImage = new Array(_canvasW * _canvasH); for(var y = 0; y < _canvasH; y++){ for(var x = 0; x < _canvasW; x++){ var pixelData = getPixel(canvas, x, y, _canvasW, _canvasH); // ピクセル値を取得する var R = pixelData.R; var G = pixelData.G; var B = pixelData.B; // グレースケール化 grayImage[y * _canvasW + x] = ToGrayscale(R, G, B); } } /* Sobelフィルタ */ var filter = new Array(); filter[0] = 1; filter[1] = 0; filter[2] = -1; filter[3] = 1; filter[4] = 0; filter[5] = -1; filter[6] = 1; filter[7] = 0; filter[8] = -1; /* 空間フィルタリング */ var resultImage = SpatialFiltering(grayImage, _canvasH, _canvasW, filter, 3); /* セット */ for (var y = 0; y < _canvasH; y++) { for (var x = 0; x < _canvasW; x++) { var I = resultImage[y * _canvasW + x]; setPixel(canvas, x, y, I, I, I, 255, _canvasW, _canvasH); } } } /** * 空間フィルタリング */ function SpatialFiltering(grayImage, height, width, filter, size_f) { var init = Math.floor(size_f / 2); var from = - init; var to = init; var resultImage = new Array(height * width); for (var k = 0; k < resultImage.length; k++) { resultImage[k] = 0; } for (var i = init; i < height - init; i++) { for (var j = init; j < width - init; j++) { var sum = 0.0; /* フィルタリング */ for (var n = from; n <= to; n++) { for (var m = from; m <= to; m++) { sum += grayImage[(i + n) * width + j + m] * filter[(n + init) * size_f + m + init]; } } resultImage[i * width + j] = Math.floor(Math.abs(sum)); } } return resultImage; } /** * RBGをグレースケールにして返する */ function ToGrayscale(R, G, B) { R = Math.floor(R * 0.299); G = Math.floor(G * 0.587); B = Math.floor(B * 0.114); return R + G + B; } // GetPixel // 戻り値はオブジェクトのプロパティでR,G,B function getPixel(srcCanvas, x, y, canvasW, canvasH){ if (window.opera) { var gContext = srcCanvas.getContext("opera-2dgame"); var rgbStr = gContext.getPixel(x, y); // ピクセル値を取得する var R = eval("0x"+rgbStr.substring(1,3)); var G = eval("0x"+rgbStr.substring(3,5)); var B = eval("0x"+rgbStr.substring(5,7)); return {R:R, G:G, B:B}; } var imagePixelData = srcCanvas.getContext("2d").getImageData(x, y, 1, 1).data; var R = imagePixelData[0]; var G = imagePixelData[1]; var B = imagePixelData[2]; return {R:R, G:G, B:B}; } // SetPixel function setPixel(srcCanvas, x, y, R, G, B, A, canvasW, canvasH){ if (window.opera) { var gContext = srcCanvas.getContext("opera-2dgame"); var rgbaColor = "rgba("+R+","+G+","+B+","+A+")"; gContext.setPixel(x,y, rgbaColor); return; } var context = srcCanvas.getContext("2d"); var pixelImage = context.createImageData(1, 1); pixelImage.data[0] = R; pixelImage.data[1] = G; pixelImage.data[2] = B; pixelImage.data[3] = A; context.putImageData(pixelImage, x, y); }
2010-03-13
2月に読んだ本と見た映画
日記 | |
2月は新しい職が決まった月でした。
読んだ本
2月の読書メーター
読んだ本の数:2冊
読んだページ数:453ページ
箱男 (新潮文庫)
読了日:02月18日 著者:安部 公房
業界No.1エージェントが教える 転職メソッド―自己分析・企業分析・職務経歴書・履歴書・面接
読了日:02月01日 著者:小畑 重和,川野 晋太郎
読書メーター
見た映画
2月の鑑賞メーター
観た本数:7本
観た時間:750分
イエスマン “YES”は人生のパスワード 特別版 [DVD]
典型的なアメリカンコメディで展開も先読みできる。だけど面白い。すべてを肯定するその姿勢は見習うべきところがある。それにしてもズーイー・デシャネルがかわいい。
鑑賞日:02月27日 監督:ペイトン・リード
ストレンジャー・ザン・パラダイス [DVD]
多分合う合わないがはっきり分かれであろう大きな展開のない雰囲気映画。少なくとも徹夜明けに見る映画じゃなかった。眠い。
鑑賞日:02月26日 監督:ジム・ジャームッシュ
黒猫白猫 [DVD]
至高のコメディ。文句のつけようがない。 にぎやかな東欧のノリが最初から最後まで続き一度も映画のテンションが下がらない。 先読み可能な一本筋のストーリーではあるものの、中弛みせず、始終見ている側を楽しい気分にさせてくれる。 登場人物全員が生き生きとしていて魅力的なところもすごい。
鑑賞日:02月23日 監督:エミール・クストリッツァ
デッドマン スペシャル・エディション [DVD]
雰囲気とジョニデの演技を楽しむ叙事詩的な映画
鑑賞日:02月21日 監督:ジム・ジャームッシュ
ラン・ローラ・ラン [DVD]
ローラがひたすら走る映画。スタートからゴールまで3パターンのストーリーが用意されている。ローラ役のフランカ・ポテンテがまったく可愛くない。また、ハイペースで走る描写が多用されるわりにローラの息が全く切れていないなど引っかかる部分も多かったが、映像手法や細かい演出はよい。
鑑賞日:02月21日 監督:トム・ティクバ
いまを生きる [DVD]
鑑賞日:02月13日 監督:ピーター・ウィアー
コーヒー&シガレッツ [DVD]
鑑賞日:02月11日 監督:ジム・ジャームッシュ
2010-02-01
1月に読んだ本と見た映画
日記 | |
読んだ本
1月の読書メーター
読んだ本の数:9冊
読んだページ数:2016ページ
親指の恋人〔文庫〕
20歳の男女が心中したという既成事実が冒頭に示され、そこに至るまでの詳細なプロセスが全体にわたって書かれている。 作者としては「現代格差社会」と「若者の自殺」をテーマに本作を書いたのだろうが、あまりにも通俗的であり展開も使い古されている。 特に、主人公らの心情変化の表現が乏しいため、どうしても薄っぺらな印象を受けてしまう。石田が片手間に書いた小説に思えてしょうがない。
読了日:01月22日 著者:石田 衣良
当て屋の椿 3 (ジェッツコミックス)
読了日:01月17日 著者:川下 寛次
飛ぶ男
阿部公房の未完の遺作。未完なため結末を迎えることなく物語が幕を閉じるが、それでも十分楽しめる。
読了日:01月16日 著者:安部 公房
カルプス・アルピス
ご都合主義というかストーリーが少し出来すぎている気がするけど、胸に響く文章がいくつもある。何より作品がまとっている雰囲気が美しい。嶽本野ばらは独特の文体から敬遠する人も多いが、本作はクセも少なく読みやすいので、野ばら嫌いな人にもオススメ。
読了日:01月12日 著者:嶽本 野ばら
灰色のピーターパン―池袋ウエストゲートパーク6 (文春文庫 い 47-10)
IWGPシリーズの第6作目。風営法や在留外国人に対しての思想はともかくとして、読みやすく集中して一気に読める一冊。疾走感がよい。それにしてもタカシはいつまでGボーイズのキングをやるつもりなんだろう?
読了日:01月11日 著者:石田 衣良
HUNTER×HUNTER NO.27 (ジャンプコミックス)
読了日:01月11日 著者:冨樫 義博
屍蝋の街
腐蝕の街の続編である。が、そのことを知らずに本作から読んでしまった・・・近未来クライムアクションとしてよく出来ていると思う。
読了日:01月06日 著者:我孫子 武丸
転職面接必勝法
読了日:01月03日 著者:細井 智彦
きつねのはなし (新潮文庫 も 29-2)
京都奇譚集。一話目の表題作は秀逸、二話目もオモチロいのだが三話目以降がいまひとつだった。三話目は物語前中盤の伏線らしき部分を回収しきれておらず、読み終わった後に残尿感を感じた。四話目は構成がぶつ切りで読み難い。太陽の塔や、夜は短し歩けよ乙女も構成面で荒さが目立ったがそれを補うユニークな文章とストーリーの面白さがあった。しかし、本作四話目はそれがない。総評としてはイマイチ。個人的に大好きな作家のため次回作に期待したい。
読了日:01月03日 著者:森見 登美彦
読書メーター
見た映画
1月の鑑賞メーター
観た本数:8本
観た時間:1205分
ほしのこえ [DVD]
私がNHKのデジタル・スタジアムで「彼女と彼女の猫」を見たのは10年ほど前のことである。 ガイナックスに影響を受けたであろう映像構成とクォリティの高さに衝撃を受けたことを覚えている。 TUTAYAで何気なく手に取った本作が「彼女と彼女の猫」の新海誠の作品ということを知り、 問答無用でレンタルした。 個人制作のため、仕方ないといってしまえばそれまでだが、キャラデザや声優が同人臭いのが少し気になった。 一方で背景美術が美しく、細部まで手抜きのない映像は一人で製作したとは思えないレベルである。
鑑賞日:01月31日 監督:
ターミネーター:サラ・コナー クロニクルズ 〈セカンド・シーズン〉 コレクターズ・ボックス1 [DVD]
鑑賞日:01月17日 監督:
パリ、テキサス デジタルニューマスター版 [DVD]
子供が可愛すぎて、妻が美人過ぎる。まあ、それはいいとして主人公に共感できない。特に面の皮の厚さと計画性の無さには脱帽させられる。が、見た後の余韻が楽しめるという点では素晴らしい。
鑑賞日:01月11日 監督:
ユージュアル・サスペクツ [DVD]
カイザー・ソゼというunknownな存在が非常にいい味を出しており、途中まではすごくワクワクしながら見ることができた。ただし、ミスリードが露骨すぎて根拠無しにカイザー・ソゼの正体が予想可能だったため、ひっくり返された感がなかったのが残念。面白かったが、自分にとって突出した映画ではない。
鑑賞日:01月10日 監督:ブライアン・シンガー
コーチ・カーター スペシャル・コレクターズ・エディション [DVD]
鑑賞日:01月05日 監督:トーマス・カーター
テルマ&ルイーズ
男根主義へのアンチテーゼ
鑑賞日:01月03日 監督:
ソウ5 DTS【アンレイテッド】エディション [DVD]
犯人が既知だったためか特にスリルも無く、前作までを刈り取って、次回作へ向けて種まいて終わった感じ。
鑑賞日:01月02日 監督:ディヴィッド・ハックル
ナイト・オン・ザ・プラネット [DVD]
タクシードライバーにまつわる群像劇。ローマの話が特に面白かった。
鑑賞日:01月01日 監督:
2010-01-31
Javaを使う理由
日記 | |
人気プログラミング言語ランキングでJavaが1位を獲得した。
これは私にとっては意外な結果であった。(個人的にはCだと思っていた)
さて、最近あるソフトウエアハウスの営業役員の方(仮にAさんとしよう)とお話をさせていただく機会があり、
そこでJavaの話題が出た。東海三県ではJavaの案件が多いそうだ。
なぜJavaが多いのか。Aさん曰く3つの理由があるそうだ。
理由
1. 既存の資産活用が可能
一時期オブジェクト指向言語の代表例としてJavaがもてはやされたため、多くの企業がそれに乗っかった結果、資産が多く残ったため
2. マシンパワーが必要
Javaを快適に動作させるにはそれなりにマシンパワーが必要となるため、ハードウエアの買い替え需要が発生する(SIerとしては美味しい)
3. オフショア開発
中国にはJavaプログラマが多く存在しており、オフショアに出しやすいため
Aさんの話を聞く限り、何かしらのソリューションとしての言語選択ではなく、
環境がJavaを使う理由となっているようだ。
特に2については「なんじゃそりゃ」と言わざるをえない。
是非Javaプログラマの方にJavaの優位性を示してもらいたいものだ。
MT
2010/02/04 01:47
Java VMによる汎用性、これに尽きると思う。






