Linux環境でNVIDIAのCUDA/OpenCLを使う場合、以下のような環境変数の設定に注意する必要がある。

   1  NV_COMPUTE_SDK_PATH="/path/to/NVIDIA_GPU_Computing_SDK"
   2  SDK_INSTALL_PATH="/path/to/NVIDIA_GPU_Computing_SDK/C"

posted by Png genki on Sun 7 Feb 2010 at 09:14

subviewはsuperviewのalphaを引き継いでしまう。たぶん。親のalphaが0.7で子が0.5の場合は0.7*0.5で子は0.35のalphaになる? 背景スケスケでコンテンツはクッキリ表示したい場合はどうすればいいか?と言うと、もう一つalpha 1.0のUIViewを用意し、そのviewをsuperviewにして子にaplha 0.7のbackground viewとalpha 1.0のcontens viewを加えればいい。

つまり最初のviewの構成が

   1  UIView alpha 0.7
   2   UIView alpha 1.0 contens view
となっているところを
   1  UIView alpha 1.0
   2   UIView alpha 0.7 background view
   3   UIView alpha 1.0 contents view
とする。

解決法がタイトルは嘘にしてしまったが、やりたい事はコレで実現できる。もちろんbackgournd viewを本来のあるべきサイズにしなきゃいけないけどね。

posted by Png bopper on Sat 6 Feb 2010 at 20:05

link_to 等のヘルパメソッドは sinatra 本体には含まれていませんが、 sinatra_more という gem が用意されています。

install

   1  % gem install sinatra_more

standalone 利用の場合

直接 Sinatra::Base に register してしまいましょう。

   1  require 'sinatra'
   2  ...
   3  require 'sinatra_more/markup_plugin'
   4  Sinatra::Base.register SinatraMore::MarkupPlugin
   5  ...
   6  get '/' do
   7    ...

クラス利用の場合

該当クラスで register します。

   1  require 'sinatra_more/markup_plugin'
   2  
   3  class Application < Sinatra::Base
   4    register SinatraMore::MarkupPlugin
   5  end

MarkupPlugin

link_to だけでなく、全56種(ver 0.3.33 現在)ものヘルパメソッドが利用できるようになります。 以下に、よく使いそうなものを抜粋します。

   1  link_to(*args, &block)
   2  stylesheet_link_tag(*sources)
   3  javascript_include_tag(*sources)
   4  image_tag(url, options={})
   5  image_path(src)
   6  escape_html(text)
   7  h!(text, blank_text = '&nbsp;')
   8  content_tag(*args, &block)
   9  tag(name, options={})
  10  input_tag(type, options = {})
  11  form_for(object, url, settings={}, &block)
  12  text_field_tag(name, options={})

詳細は lib/sinatra_more/markup_plugin/*.rb を確認して下さい。

その他のPlugin

sinatra_more gem には、 MarkupPlugin 以外にも RenderPlugin、WardenPlugin、MailerPlugin、RoutingPlugin といったプラグインが用意されています。 利用方法は MarkupPlugin の場合と同じで、 利用したいプラグイン名を列挙していきます。

   1  require 'sinatra_more/markup_plugin'
   2  require 'sinatra_more/render_plugin'
   3  Sinatra::Base.register SinatraMore::MarkupPlugin
   4  Sinatra::Base.register SinatraMore::RenderPlugin
   5  ...

各プラグインの代表的なメソッドを記載します。 例えば、RenderPlugin にはみんな大好きな "partial" が入ってたりしますので、しっかりチェック&register しましょう。

RenderPlugin

描画系プラグイン

   1  partial(template, options={})
   2  erb_template(template_path, options={})
   3  haml_template(template_path, options={})
   4  render_template(template_path, options={})

WardenPlugin

認証系プラグイン

   1  current_user
   2  authenticate_user!
   3  logged_in?
   4  authenticated?(&block)

MailerPlugin

メール関係?(使わないので未調査)

RoutingPlugin

ルーティング系プラグイン (named route?)

   1  map(*args, &block)
   2    # map(:accounts).to('/accounts/url')
   3    # map(:admin, :show).to('/admin/show/:id')
   4    # map(:admin) { |namespace| namespace.map(:show).to('/admin/show/:id') }

posted by Png maiha on Thu 4 Feb 2010 at 01:10

まだリリースされて間もないせいか、 NVIDIAのOpenCL SDKを使っていると不可解なエラーに遭遇します。 掲題のようなエラーメッセージを出すのもその一例ですが、 以下のようなコード(一部抜粋)でエラーがでます。

   1      float4 x = sphere->c;
   2      dg->t = x.x;

しかし以下のように記述すると大丈夫です。

   1      float x = sphere->c.x;
   2      dg->t = x;

OpenCLコンパイラが生成したptxコードの中に'selp'というのが入るような場合に問題が発生するようです。

NVIDIAのOpenCL SDKの場合、*.clファイルをCLコンパイラがコンパイルして、ptxという中間言語に変換します。さらに、ptxをptxparse(PLANGというパッケージの一部らしい)が解析してllvmのbcに変換します。 このケースでは、CLコンパイラが吐き出すコードと、ptxparse側の認識が一致していない感じです。 とりあえず、バグが直るまでコンパイラの気持ちになって回避するしかありません。

posted by Png genki on Mon 1 Feb 2010 at 13:26 with 1 comment

NVidiaのOpenCL SDKには、少なくともkernel moduleとdriver component の二つの要素があるらしい。

   1  Error: API mismatch: the NVIDIA kernel module has version 190.18,
   2  but this NVIDIA driver component has version 185.18.08.  Please make
   3  sure that the kernel module and all NVIDIA driver components
   4  have the same version.

たまにこんなエラーメッセージが出てきます。

kernel moduleというのはバージョン番号とファイル名の一致からすると

   1  /usr/lib64/libcuda.so.190.18

このへんのファイルらしい(Linux版) driver componentというのはどこにある何を指しているのかが不明。

posted by Png genki on Mon 1 Feb 2010 at 05:23

at iPhoneOS 3.1.2

shouldAutorotateToInterfaceOrientationじゃなくて任意のタイミングで roateする方法を探していたんだけど、見かけるのはUIViewのtransformでrotateすることばかり。確かめてないけど。この方法だとUIViewControllerのinterfaceOrientationと齟齬も発生するじゃないかと思う。

それで無理くり何とかする方法を考案した。けど、この方法では(もう少し改善すればできるかもしれないが)重力方向への回転しかできない。 shouldAutorotateToInterfaceOrientation:を使ってrotateすのはいつもとどおり。だけど先に方向を決めておいてNSNotificationを投げて強制的にshouldAutorotateToInterfaceOrientation:を発生させることによって 任意のタイミングでviewを回転させる事ができる。

   1  - (void)rotateNow{
   2    UIDevice *device = [UIDevice currentDevice];
   3    self.toRotate = device.orientation;
   4    NSNotification *notification = [NSNotification notificationWithName:@"UIDeviceOrientationDidChangeNotification" object:device];
   5    [[NSNotificationCenter defaultCenter] postNotification:notification];
   6  }
   7  
   8  - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
   9    if(self.toRotate){
  10      return interfaceOrient == self.toRotate;
  11    }else{
  12      return NO;
  13    }
  14  }

こんな感じ。何をしたかったかと言うと向きが変わったときにいきなり回転させるんじゃなくて、ちょっとボタンをだして確認を取りたかった。だからタイミングだけずらして回転方向は重力方向だけでいいやって話しなんだけど。

もしかすると、このNSNotificationを作ってる部分でobject:deviceってUIDeviceを渡してる部分。このオブジェクトのプロパティorientationを任意の方向を返す様なオブジェクトを作ってViewControllerを更に騙すことができるならば、タイミングだけじゃなくて方向も変えれるんじゃないかな?そこまでは確認を取ってません。

まぁ何にせよ。かなりhackな方法だからOSのバージョン上がったら使えなくなるかもしれない。

posted by Png bopper on Sun 31 Jan 2010 at 14:02

ちょっとレンダリング結果を動画にして確認したい場合に、.txt形式で出力してconvert (ImageMagick)すると便利です。

   1  /*
   2   * Output image
   3   */
   4  std::vector<unsigned char> buf(3*width*height);
   5  glFlush();
   6  glReadBuffer(GL_BACK);       
   7  glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
   8  glReadPixels(0, 0, width, height,
   9      GL_RGB, GL_UNSIGNED_BYTE, &buf[0]);
  10      
  11  char filename[1024];
  12  sprintf(filename, "%s_%04d.txt", basename, frame);
  13  FILE *fp = fopen(filename, "w");
  14  fprintf(fp,
  15      "# ImageMagick pixel enumeration: %d,%d,%d,rgb\n",
  16      width, height, 255);
  17  for(int y = 0; y < host->height; ++y){
  18      for(int x = 0; x < host->width; ++x){
  19          int idx = (host->height - y - 1)*host->width + x;
  20          fprintf(fp, "%d,%d: (%d,%d,%d)\n",
  21              x, y, 
  22              buf[3*idx + 0],
  23              buf[3*idx + 1],
  24              buf[3*idx + 2]);
  25      } 
  26  }
  27  fclose(fp);

出来上がったら、

   1  % convert basename_*.txt basename.mp4

posted by Png genki on Sat 30 Jan 2010 at 15:13

fltkもGLUTも気がつけばFATになっていっている気がします。

  • FrameBufferにpixelsをput出来る
  • 最低限のマウス、キーボードからの入力をさばける
  • Windowは1個. resizeとかは不要

だいたいこのぐらいで十分なので、

  • 外部ライブラリに依存しない
  • OS/アーキテクチャに依存せず 32bit/64bit で動く
  • 初心を忘れない鉄の意志でメンテナンスされている

GUI toolkitが欲しいです。無かったら作ろうかな。

posted by Png genki on Sat 30 Jan 2010 at 06:17

Widnowsの時代にはBSoD (Blue Screen of Death) というのがありましたが、 Macの場合は画面がグレーアウトするので、Gray Screen of Deathと呼んでるみたいです。

uncluttered_panic.jpg

悲しいです。

最近GSoDが頻発するのですが、Geniusバーに持っていっても原因不明。いっそ綺麗に壊れてくれれば交換してくれるんですけどね。 道具として使い物になるかならないかギリギリのところ。

posted by Png genki on Fri 29 Jan 2010 at 03:02

iPadのCPUはApple独自開発のA4というものでした。Qualcomm Snapdragonだと思っていたので意外。A4についてちょっと調べてみました。

  • GPUの機能などを集約したSystem on chip構成
  • 1GHz
  • GPU部分はPowerVR SGX series 5 core の可能性が高い
  • OpenGL ES 2.x, OpenGL 3.2, OpenCL 1.0が走る

See Also

posted by Png genki on Thu 28 Jan 2010 at 02:11 with 2 comments