Hatena::ブログ(Diary)

御手洗特急途中下車

2013-11-07

【第三弾】iOSアプリ(ゲーム)を作りました

01:06 |

ネコシールドというiPhoneアプリを作りました!

Connecting to the iTunes Store.

f:id:Kojo_Sugita:20131108010636p:image

本当はM字開脚した猫をキャラクターとして登場させたかったのですが、

Appleからキャラクターが不適切ということでリジェクトされたという。。。

Ver1.0.0のApp Storeのスクショはその名残です。

トラックバック - http://d.hatena.ne.jp/Kojo_Sugita/20131107

2013-05-26

iOSアプリ(ゲーム)を作りました

| 00:57 |

仲間内で暗算チキンヘッドというiPhoneアプリミニゲーム)を作りました!

f:id:Kojo_Sugita:20130527005914p:image

https://itunes.apple.com/app/id647531680?mt=8

暇つぶしにでも是非!

KerryKerry 2013/07/02 01:29 "Hi,
I just came across your app website for, Quick Draw Chickenhead ... and it looks like an interesting app.

I make my living by developing my own apps and marketing them. I've
launched over 100 apps and sold an app business in the 6 figures. I've
had a ton of success marketing my own apps and now I am reaching out to
other app developers via my new business, YourAppReport.com. We
recently launched YourAppReport.com and are currently giving away a
(100% Complimentary), customized marketing report tailored for your app
and you can get it instantly! (Only ONE per developer account).
Get a full app optimization review, a list and analysis for 50 of your
app competitors, specific marketing recommendations tailored to your app
& more... Take your app to the next level now!

YourAppReport.com will instantly scan your app title, description and keywords and return
specific content optimization suggestions and recommendations. Your app
is useless if no one can find it.  Get your 100% complimentary report
today (ONLY ONE REPORT PER DEVELOPER ACCOUNT).

To get your report (only one per developer account) visit YourAppReport.com today and simply input your appstore url. It takes about 1 minute...

Thanks,
Kerry (Creator of YourAppReport.com)
info@yourappreport.com"

トラックバック - http://d.hatena.ne.jp/Kojo_Sugita/20130526

2012-04-02

iPhoneのアラートビューとアクションシート

| 22:57 |

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;
    }
}
トラックバック - http://d.hatena.ne.jp/Kojo_Sugita/20120402

2011-05-28

イングロリアス・バスターズを見てみた

| 20:05 |

いつもは観賞メーターに感想を書くのですが、長すぎて書ききれなかったのでここに書いておきます。

イングロリアス・バスターズ

まず最初にこの素晴らしい映画を撮ったクエンティン・タランティーノ監督に謝罪の意を表明したい。この映画を見るまで最近のタランティーノは才能が枯渇したよねー。と申しておりました。殴られた記憶もろくにないくせに申し訳ございませんでした。

さて、イングロリアス・バスターズは「ナチスに家族を殺されたユダヤ系の少女」と「ドイツ占領下のパリに潜入し、ナチスの軍人を始末する部隊"バスターズ"」の2つの軸を持つ群像劇である。

この映画からテーマを読み取ることは難しい。(あるいは無いのかもしれない。)

なぜならばイングロリアス・バスターズはナチス・ドイツを題材にしているが、いわゆる「戦争映画」の下敷きを敷いていない一風変わった構成になっているからだ。

主人公の一人であるショシャナ(メラニー・ロラン)に焦点を当てれば復讐劇であるが、もう一人の主人公であるアルド・レイン中尉(ブラピ)に焦点を当てるとまた違ったジャンルとなる。そしてこの映画は悲劇でもなければ喜劇でもない。

だかといってイングロリアス・バスターズは決して中途半端な作品ではない。まだ見ていない人のためにネタバレは差し控えるが、ストーリーが練り込まれており、映画としての「見せ方」も素晴らしい。そして登場人物の粋な言葉のキャッチボールは涎モノである。いや、お見事。

私はタランティーノ作品の中ではパルプ・フィクションが最も好きだ。今まで見た映画の中でBEST10を決めるとしたら、その中にパルプ・フィクションは必ず入れる。

このイングロリアス・バスターズはパルプ・フィクションに勝るとも劣らない傑作である。

トラックバック - http://d.hatena.ne.jp/Kojo_Sugita/20110528

2011-03-27

以前使用していたC言語のシンプルな拡張数学ライブラリ

| 01:24 |

以前使用していた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組み合わせの総数を計算する
Distance2点間の距離を求める
DivideInternally2D2点p1,p2からなる線分をm:nに内分する点を求める (2次元)
DivideExternally2D2点p1,p2からなる線分をm:nに外分する点を求める (2次元)
Triangle_CenterOfGravity3点p1,p2,p3からなる三角形の重心を求める (2次元)
ToVecto2点を結ぶベクトルを求める
VectorSumベクトルの和を求める
VectorDifferenceベクトルの差を求める
Normベクトルの長さ(ノルム)を計算する
InnerProductベクトルの内積を計算する
IncludedAngle2つのベクトルのなす角を計算する
UnitVector単位ベクトルを求める
NormalVector3D3次元の法線ベクトルを求める
CrossProduct3D3次元ベクトルの外積を計算する
VectorSimilarity2つのベクトルの類似度を計算する
NormalizedVectorDistance正規化距離を計算する
IsDepthOnLine3D3次元空間上の点p1と点p2を結ぶ直線上に点pが存在するかを判定する
CalculatePlane3D3次元平面を作成する
CalculatePlane3D_Using3Depths3点から3次元平面を作成する
ToLineCanonicalForm直線の方程式標準形から一般形に変形する
ToPlaneCanonicalForm平面の方程式を標準形から一般形に変形する
ToPlaneGenericForm平面の方程式を一般形から標準形に変形する
DistanceLineToDepth点と直線との距離を返す
DistancePlaneToDepth点と平面との距離を返す
IsCorrectPlane2つのベクトルからなる平面がよい平面かを判定する
Arg第1象限から第4象限までの偏角を求める
ZenithAngle天頂角を求める
Sigmoidシグモイド関数を計算する
pi円周率を求める
to_deg弧度法表記を度数法表記に変換する
to_rad度数法表記を弧度法表記に変換する
logn任意の整数を底とする対数を計算する
cbrt_newtonニュートン法で立方根を近似する
frac除算を計算する


バグがあったらごめんなさい。使用する際は自己責任でお願いします。

もっと複雑なことをしたい場合はGSLがおすすめ。

トラックバック - http://d.hatena.ne.jp/Kojo_Sugita/20110327

2010-09-12

HTML5+JavaScriptで画像処理 ハーフトーニング

| 14:59 |

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階調の表現ができる(下記図参照).

f:id:Kojo_Sugita:20100912143459p:image

割り当てる濃度パターンを4×4,現画像をN×M画素とすると出力画像は4N×4M画素になる.

実行結果

f:id:Kojo_Sugita:20100912143503p:image

※ 前述のとおり画像サイズが大きくなるため一部抜粋


ディザ法 (tither method)

ディザパターンと呼ばれるN×Nの行列を用意しておく.

ディザパターンの値と現画像の各画素の輝度値を比較し,その大小関係でその画素を白にするか黒にするかを決定する.

f:id:Kojo_Sugita:20100912143502p:image

1. 画像をN×N画素(ディザパターンのサイズ)のブロックに分割する

2. ブロック内の各画素がディザパターン内の対応画素値×16 + 8以上なら白,未満なら黒を割り当てる

実行結果

f:id:Kojo_Sugita:20100912143501p:image


誤差拡散法 (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

実行結果

f:id:Kojo_Sugita:20100912143500p:image

誤差拡散法が一番それっぽい結果になっていることが分かる.

トラックバック - http://d.hatena.ne.jp/Kojo_Sugita/20100912

2010-06-25

トラックバック - http://d.hatena.ne.jp/Kojo_Sugita/20100625

2010-05-04

HTML5 + JavaScriptで画像処理 (エッジ検出)

| 00:29 |

古籏一浩のJavaScriptラボ ― 第14回 HTML5のcanvasで作る画像フィルター

を読んで、Canvasで画像の輝度値を編集できることを知ったので、ためしに実装してみることに。

GUIや画像の端の処理などかなり手抜きだが、FirefoxGoogle ChromeOperaで動作することを確認した。

処理はかなり重く、私の非力なマシンは実行するたび悲痛なファンの音を上げるほどである。。。でもしょうがないよね(´・ ω・`)

ちなみに3種類のブラウザで最も実行速度が早かったブラウザはOperaであり、もっとも遅いブラウザはFireFoxだった。

HTML5 + JavaScriptによるエッジ検出

http://jstap.web.fc2.com/test/html5/filtering/filtering.html

実行結果

f:id:Kojo_Sugita:20100505001856p:image

ソースコード

2011/04/24追記

以下は古いソースコードです。最新は https://github.com/kojo-sugita/Image-filtering をご覧ください。

HTML

<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);
}

tarotaro 2013/03/09 03:06 setPixelはおそいですよ。バッファを直にいじると100倍ぐらいはやいです

2010-03-21

HPを移行しました

| 23:13 |

管理しているHPのURLを変更しました。

ブックマークをしてくださっていた方はお手数ですが、ブックマークの変更をお願いします。


LaTeXコマンド集 - LaTeXのコマンド集。卒論やレポート作成のお供にどうぞ

 新URL http://www.latex-cmd.com/

C tips & reference \n - C言語のTips集とリファレンス

 新URL http://www.c-tipsref.com/

トラックバック - http://d.hatena.ne.jp/Kojo_Sugita/20100321

2010-03-13

2月に読んだ本と見た映画

| 03:35 |

2月は新しい職が決まった月でした。


読んだ本

2月の読書メーター
読んだ本の数:2冊
読んだページ数:453ページ

箱男 (新潮文庫)箱男 (新潮文庫)
読了日:02月18日 著者:安部 公房
業界No.1エージェントが教える 転職メソッド―自己分析・企業分析・職務経歴書・履歴書・面接業界No.1エージェントが教える 転職メソッド―自己分析・企業分析・職務経歴書・履歴書・面接
読了日:02月01日 著者:小畑 重和,川野 晋太郎

読書メーター


見た映画

2月の鑑賞メーター
観た本数:7本
観た時間:750分

イエスマン “YES”は人生のパスワード 特別版 [DVD]イエスマン “YES”は人生のパスワード 特別版 [DVD]
典型的なアメリカンコメディで展開も先読みできる。だけど面白い。すべてを肯定するその姿勢は見習うべきところがある。それにしてもズーイー・デシャネルがかわいい。
鑑賞日:02月27日 監督:ペイトン・リード
ストレンジャー・ザン・パラダイス [DVD]ストレンジャー・ザン・パラダイス [DVD]
多分合う合わないがはっきり分かれであろう大きな展開のない雰囲気映画。少なくとも徹夜明けに見る映画じゃなかった。眠い。
鑑賞日:02月26日 監督:ジム・ジャームッシュ
黒猫白猫 [DVD]黒猫白猫 [DVD]
至高のコメディ。文句のつけようがない。 にぎやかな東欧のノリが最初から最後まで続き一度も映画のテンションが下がらない。 先読み可能な一本筋のストーリーではあるものの、中弛みせず、始終見ている側を楽しい気分にさせてくれる。 登場人物全員が生き生きとしていて魅力的なところもすごい。
鑑賞日:02月23日 監督:エミール・クストリッツァ
デッドマン スペシャル・エディション [DVD]デッドマン スペシャル・エディション [DVD]
雰囲気とジョニデの演技を楽しむ叙事詩的な映画
鑑賞日:02月21日 監督:ジム・ジャームッシュ
ラン・ローラ・ラン [DVD]ラン・ローラ・ラン [DVD]
ローラがひたすら走る映画。スタートからゴールまで3パターンのストーリーが用意されている。ローラ役のフランカ・ポテンテがまったく可愛くない。また、ハイペースで走る描写が多用されるわりにローラの息が全く切れていないなど引っかかる部分も多かったが、映像手法や細かい演出はよい。
鑑賞日:02月21日 監督:トム・ティクバ
いまを生きる [DVD]いまを生きる [DVD]
鑑賞日:02月13日 監督:ピーター・ウィアー
コーヒー&シガレッツ [DVD]コーヒー&シガレッツ [DVD]
鑑賞日:02月11日 監督:ジム・ジャームッシュ

トラックバック - http://d.hatena.ne.jp/Kojo_Sugita/20100313