2012年12月16日日曜日

Mac で glGetString(GL_EXTENSIONS)

Mac の OpenGL 3.2 で glGetString(GL_EXTENSIONS) がなぜか NULL を返すと思ったら、今は glGetIntergerv(GL_NUM_EXTENSIONS, &i) と glGetStringi(GL_EXTENSSIONS, i) を使うことになっていた。

#include <OpenGL/OpenGL.h>
#include <OpenGL/gl3.h>
#include <iostream>

int main()
{
 CGLPixelFormatAttribute attribs[] = {
  kCGLPFAOpenGLProfile, (CGLPixelFormatAttribute)kCGLOGLPVersion_3_2_Core,
  (CGLPixelFormatAttribute)0
 };
 CGLPixelFormatObj pix;
 GLint npix;
 CGLChoosePixelFormat(attribs, &pix, &npix);

 CGLContextObj ctx;
 CGLCreateContext(pix, 0, &ctx);
 CGLSetCurrentContext(ctx);

 std::cout << "vendor : " << glGetString(GL_VENDOR) << std::endl;
 std::cout << "renderer : " << glGetString(GL_RENDERER) << std::endl;
 std::cout << "version : " << glGetString(GL_VERSION) << std::endl;
 std::cout << "shader : " << glGetString(GL_SHADING_LANGUAGE_VERSION) << std::endl;

 std::cout << "extensions : " << std::endl;
 GLint count;
 glGetIntegerv(GL_NUM_EXTENSIONS, &count);
 for (GLint i = 0; i < count; i++)
 {
  std::cout << "\t" << glGetStringi(GL_EXTENSIONS, i) << std::endl;
 }

 CGLReleaseContext(ctx);
 CGLReleasePixelFormat(pix);
 return 0;
}
コンパイル方法:
$ clang++ -Wall -framework OpenGL -framework Foundation -o gl gl.cpp
実行結果:
vendor : NVIDIA Corporation
renderer : NVIDIA GeForce GT 650M OpenGL Engine
version : 3.2 NVIDIA-8.6.22
shader : 1.50
extensions : 
 GL_ARB_instanced_arrays
 GL_ARB_occlusion_query2
 GL_ARB_shader_bit_encoding
 GL_ARB_timer_query
 GL_EXT_depth_bounds_test
 GL_EXT_framebuffer_multisample_blit_scaled
 GL_EXT_texture_compression_s3tc
 GL_EXT_texture_filter_anisotropic
 GL_EXT_texture_mirror_clamp
 GL_EXT_texture_sRGB_decode
 GL_APPLE_client_storage
 GL_APPLE_container_object_shareable
 GL_APPLE_object_purgeable
 GL_APPLE_rgb_422
 GL_APPLE_row_bytes
 GL_APPLE_texture_range

2012年6月17日日曜日

PrallelsでLinuxが動かない

ParallelsでLinuxを動かそうと思ったらカーネルに制御が移った直後にハングして動かなかった。いろいろ試してみるとカーネルが2.6.39ならOKで3.0だとNG。 覚悟を決めてgit-bisectしていくとIvy Bridgeで導入された仮想環境でのセキュリティ絡みの機能を有効にするパッチが入ってから起動しなくなっていた。
http://git.kernel.org/?p=linux/kernel/git/torvalds/linux.git;a=commit;h=de5397ad5b9a

Parallelsの問題っぽいのでParallelsフォーラムに書き込んで対応を待つことにした。

今回初めてgit-bisecを使ってみたけど、結構便利だね。この手の二分探索を手作業でやるのは面倒だし。

追記 (7/16) :
Build7.0.15104 (Revision 778994; Tue, 10 Jul 2012) で修正された様子。
http://kb.parallels.com/en/113626

2012年6月13日水曜日

再インストール

MacをUNIX的に使おうとするとファイルシステムがCase Sensitiveじゃないと何かとトラブルの元。なのでSSDをCase Sensitiveにフォーマットしなおして再インストール始めたら残り10時間とかのたまっている。どうもOSイメージを全てダウンロードしているっぽい。リカバリパーティション消してないのに...

2012年6月12日火曜日

Retina Display MacBook Pro 開封

朝一で銀座のApple Storeに行ってRetina Display MacBook Proを買ってきました。店の前に着いたのは開店二時間前の午前八時。 先客は8人でしたが開店するころには60人ぐらいの列になっていました。「ちょっと張り切って早く来すぎたかな?」とも思ったけど、「僕の分もあるかな?」とやきもきせずに済んだのでヨシとしよう。

開店10分ぐらい前になって隣に並んでいた人に「メモリって増設できるのかな?」と言われて「そういえば、薄くなってるし、MacBook Airの例もあるし、もしかしたら増設できないのかも...」と思ったけど、時すでに遅し。すでに買う気満々だったしお店の人は「カスタマイズはUSキーボードを選ぶことしかできません。」というので迷わずカスタマイズなしのメモリ8GBで買ってきました。

会社についてネットをみると「Retina Display MacBook Proはメモリを増設できないらしい。」という情報があったものの、「らしい。」ばっかではっきりした情報がなかったので自分で確認してみることにしました。

ネジは五芒星型のの特殊ネジ。会社帰りに秋葉原の秋葉館によってMacBook Air用のドライバーを買ってきました。もちろん今日発売なのでRetina Display MacBook Pro対応等とは書いてありませんが普通に使えます。

ネジは10個。ネジさえ取れば裏蓋は簡単に外れました。

シンメトリーでいつも以上に美しい中身。

そして肝心のメモリ

うん。マザボにばっちり直付け!

ハイ。メモリ増設の余地はまったくありませんでした。ちなみにチップはハイニックスのH5TC2G83CFRとい256M×8bitのチップが見える限りでは16個。16個じゃ4Gbyteなので裏にもう16個ついてんのかね。姉妹品(?)で容量が倍のチップもあるみたいなので16GBモデルではそっちが載ってるんでしょうね。
ちなみにハイニックスはVerilogのシミュレーションモデルを提供してました。謎のノイズが乗ってちゃんと動かなかったけど大学のときにFPGAでSDRAMコントローラを作ろうとしたことがありました。そのときは確かマイクロンのシミュレーションモデルのお世話になりました。僕の中ではシミュレーションモデルを提供してくれるメーカーは印象UPです。(だから何だろね。)

せっかく(ドライバー買ってまで)開けたんで他の部品も見てみましょう。

まず、SSD。

チップは全てサムスンのS4LJ204X01-Y040, K9UHGY8U7A-HCK0, K4T2G314QF-MCF7。この組み合わせは単体のSSD(830シリーズ)としても売っていて高速なものらしい。スバラシイ。SSDは別基盤になっていて対応品さえ発売されれば交換できそう。

無線LANモジュール。

詳細は知らん。ぐぐってすらいない。

バッテリー。8460mAh。工学ドライブ跡地は全てバッテリーが使ってるんじゃないかというほどデカイ。Designed by Apple in California Assembled in China, Apple Japanと書いてある。電池自体は日本製?

CPU。詳しくはヒートパイプの下。

(おそらく)ノースブリッジ。詳細はヒートパイプの下で。

謎チップ1, 型番E208B361。ぐぐっても出てこない。

謎チップ2, 型番DSL3510L。ThunderBoltコントローラらしいが詳細不明。

というわけでメモリの増設はできませんでした。実際のところ8GBでも困らないんだけど、会社で使ってるMacBookがメモリ16GBなので気になるんですよ。メモリ16GBがいい人はおとなしくWebで注文するのが吉です。

2012年5月27日日曜日

GRUBに選んだカーネルを覚えておかせる

Ubuntu(実際に使っているのはLinux Mintだけど)をデスクトップ用途で使うにはCONFIG_PREEMPTの有効になったlowlatencyカーネルを使いたいところ。

でもlowlatencyカーネルをインストールしてもGRUBはデフォルトでは一番上にリストされる(lowlatencyとは限らない)カーネルを起動するために、毎度手動でlowlatencyカーネルを選ばなくちゃいけない。

/etc/grub/defaultのGRUB_DEFAULTでlowlatencyカーネルを指定するにしても番号で指定してしまっては新しいカーネルがインストールするたびに番号が変わってしまうかもしれないし、名前で指定しても新しいlowlatencyカーネルをインストールする度に手動で変更しないといけない。

どちらもいまいちだなと思ってgrubのinfoマニュアルを見るとGRUB_SAVEDEFAULTという設定があった。

`GRUB_SAVEDEFAULT'
     If this option is set to `true', then, when an entry is selected,
     save it as a new default entry for use by future runs of GRUB.
     This is only useful if `GRUB_DEFAULT=saved'; it is a separate
     option because `GRUB_DEFAULT=saved' is useful without this option,
     in conjunction with `grub-set-default' or `grub-reboot'.  Unset by
     default.  This option relies on the environment block, which may
     not be available in all situations (*note Environment block::).

要するに/etc/default/grubに

GRUB_DEFAULT=saved
GRUB_SAVEDEFAULT=true
と書いておけば前回起動したの同じカーネルで起動してくれるようになる。
(update-grubするのを忘れずに!)

これで新しいカーネルをインストールする度に/etc/default/grubをいじる必要がなくなって少しだけ幸せ。

2012年5月25日金曜日

Linuxでwprintfを使う

Linux で wchar_t と wprintf を使ってどうやって日本語を出すのかわからなかったのでメモ。
#include <stdio.h>
#include <wchar.h>
#include <locale.h>

int main(int argc, char *argv[])
{
 wchar_t *str = L"( ´∀`)";
 setlocale(LC_ALL, "");
 fwide(stdout,1);
 wprintf(L"%ls\n",str);
 return 0;
}

Javaのソースコード&実行環境の文字コード指定

日本語表示しようとしたら ? と表示された場合の対応。
環境は OSX 10.7, Java 1.6.0_31。
javac -encoding UTF-8 Foo.java
java -Dfile.encoding=UTF-8 Foo