start

PocketTopとSeeThru for MacBook Pro

MacBook Proの持ち運びケースで、何かナウイ(死語)のないかなーと探してたらBelkinの「PocketTop」という製品がよさげな感じで、目出度く購入。

Mac専用という訳ではないけど、Macで使って下さいと言わんばかりのデザイン。その辺の普通のノートPCで、このケースと釣り合いが取れる物は、なかなか無いんじゃないかと。DELL? Are you kidding?

特徴は上面(背面)についてるポケット。ここにACアダプタやマウスなどの小物を入れる事が出来るようになっている。

でもって、ケーブルを通す為の穴が空いてるので、ACアダプタなら本体側は接続しっぱなしで、コンセントに突っ込むだけでOKという運用が可能。 ケースに入れたまま開いて、膝の上に載せて使うという状況も想定されてるようだけど、それにはちょっと不安定という感じがした。

でも、見た目のポップさ以上に外殻は固く、重さも結構ある。 落下の衝撃とかには耐えられないだろうが、通常範囲の持ち運びでの衝撃程度には十分の強度がありそうだ。

MacBook Proと言えば、麗しき酸化アルミニウムの本体。ケースを買ったとはいえ、むき出しで使ってれば傷が付くのは避けられないので「SeeThru for MacBook Pro」という製品を購入。

これはポリカーボネートで出来た保護板?を本体の外側に装着して、本体が傷付くのを防ぐもの。 MacBook Pro専用ってだけあって、装着感も、装着後の本体端子なども全部利用可能。素晴らしい。

ただ、成型に所々雑な箇所が見られるのが残念。

この2アイテムさえあれば、MacBook Proを気兼ねなく持ち運べる。 問題なのは重量だけ。 ACアダプタとかも含めると、4〜5kg近い重さになってるんじゃなかろうか……。

UNIX系OSでのソフトのインストール

俺が初めてUNIXに触ったのは、中1の丁度今ごろだったと思う。教育実習に来てた大学生に大学へ連れてってもらい、そこで実物のUNIXと遭遇した。何分、当時の俺にとって、UNIXは「そういうOSがある」という程度の知識を持つに留まるのみの、得体の知れない何だか崇高な存在だった。それ故、UNIXが動いていたマシンが何でどのUNIXなのか理解できようもなかったが、3ボタンの光学マウス(現在巷に溢れているような物ではない。光を反射する専用のマウスパッド上でしか使えない代物)と、5インチMOだけは鮮明に記憶に残っている。

第2の遭遇は、古本屋で見かけたFreeBSDの黄色い解説書だった。時期的には上と同じ年か、その翌年位だったかな。そして何を思ったのか、俺はその本を買った。WindowsはおろかPCすら持ってなかったというのに。

全ての物をファイルとして扱う、という概念はかなり奇っ怪に見えた。パーティションとスライスの区別が付かなかった。だが、portsとpackagesの仕組みには感激したのを覚えている。これが俺のFreeBSDマンセーの起源だ(w

第3の遭遇は高校生の時だ。PCを買ってもらい、BMSに明け暮れていた。

ひょんな事から「UNIX USER」と、4つくらいのディストリビューションが収録されていたLinux雑誌を買ってしまい、PCにインストールしてみた。当時最新鋭だったGeForce 256 with DDRを積んだうちのマシンでは、丁度リリースされたばかりのXFree86 4.0でなければXが動かなかった。この時収録されていたOSで、XFree86が4.0だったのはFreeBSDだけだった。この件で俺の“FreeBSD命”が確固たるものになる(ww

それから、PS2Linuxを買ったり、突発的にPCにLinuxを入れたりすることはあったが、所詮一過性のお遊びに過ぎなかった。途中BeOSに浮気したりもした。

大学に入り、Windows XPにSP2を入れたら起動しなくなり、それにブチ切れた俺はMac OS Xに走った。余ったマシンにFreeBSDを入れ、サーバにしたりした。そして、今に至る……と。

ここからが本題。上の長ったらしい前置きは、殆ど関係ない(ぉ

UNIX系OSで何かソフトをインストールするとき、基本はソースからmakeする事である。

この方法は如何にもパソコン操作してます、って感じで「俺は出来るヤツ」という優越感に浸れる素晴らしい特徴があるのだが、問題が発生すると生半可な知識じゃ手も足も出ないという、重大な欠点(?)がある。

問題が発生した場合、似非UNIX使いの俺みたいな人は必死でGoogle先生に問い合わせ、どんな些細な情報でも藁をも掴む思いで参考にし、問題解決を試みる。そして、大概は撃沈するのだが、時には「なんだよ、こんな単純な事だったのかよ…」という具合に解決することもある。

こういう時、「これくらいの情報、書いててくれたっていいじゃないか。不親切だなぁ」と思い、自分がインストール過程を残すときは事細かに残そう、と思っていたのだが、最近になってそれが不可能な事に気がついた。

最初はきっちりとログを取るのだが、問題が発生し、何だかごちゃごちゃやってるうちに動いてしまう。こういうパターンが多分にあるのだ。インストール手順を公開しようにも出来ない、ってのが真実だった。

締めは………すまない、何もないんだ。

GLEW.framework

Mac(Xcode)でGLEWの静的/動的ライブラリを使おうと随分と前から格闘してただんだけど、どうしても上手くいかず、ついカッとなってフレームワークを作った。

一応、ちゃんと動いてる模様。

動作報告やバグ報告(技術が無いので対処できるかは不明ですが)などなど、お待ちしております。

折角なので、このフレームワークを使うようにしたvisualinfoのログを曝してみる。MacBook Pro 2.4GHz (MA896J/A)での結果なのでありますよ。

OpenGL vendor string: NVIDIA Corporation
OpenGL renderer string: NVIDIA GeForce 8600M GT OpenGL Engine
OpenGL version string: 2.0 NVIDIA-1.5.2
OpenGL extensions (GL_): 
    GL_ARB_transpose_matrix, GL_ARB_vertex_program, GL_ARB_vertex_blend,
    GL_ARB_window_pos, GL_ARB_shader_objects, GL_ARB_vertex_shader,
    GL_EXT_multi_draw_arrays, GL_EXT_clip_volume_hint, GL_EXT_rescale_normal,
    GL_EXT_draw_range_elements, GL_EXT_fog_coord, GL_EXT_gpu_program_parameters,
    GL_APPLE_client_storage, GL_APPLE_specular_vector, GL_APPLE_transform_hint,
    GL_APPLE_packed_pixels, GL_APPLE_fence, GL_APPLE_vertex_array_object,
    GL_APPLE_vertex_program_evaluators, GL_APPLE_element_array,
    GL_APPLE_flush_render, GL_APPLE_aux_depth_stencil, GL_NV_texgen_reflection,
    GL_NV_light_max_exponent, GL_IBM_rasterpos_clip, GL_SGIS_generate_mipmap,
    GL_ARB_shading_language_100, GL_ARB_imaging, GL_ARB_point_parameters,
    GL_ARB_texture_env_crossbar, GL_ARB_texture_border_clamp,
    GL_ARB_multitexture, GL_ARB_texture_env_add, GL_ARB_texture_cube_map,
    GL_ARB_texture_env_dot3, GL_ARB_multisample, GL_ARB_texture_env_combine,
    GL_ARB_texture_compression, GL_ARB_texture_mirrored_repeat, GL_ARB_shadow,
    GL_ARB_depth_texture, GL_ARB_fragment_program,
    GL_ARB_fragment_program_shadow, GL_ARB_fragment_shader,
    GL_ARB_occlusion_query, GL_ARB_point_sprite,
    GL_ARB_texture_non_power_of_two, GL_ARB_vertex_buffer_object,
    GL_ARB_pixel_buffer_object, GL_ARB_draw_buffers, GL_ARB_shader_texture_lod,
    GL_EXT_compiled_vertex_array, GL_EXT_framebuffer_object,
    GL_EXT_texture_rectangle, GL_ARB_texture_rectangle, GL_EXT_texture_env_add,
    GL_EXT_blend_color, GL_EXT_blend_minmax, GL_EXT_blend_subtract,
    GL_EXT_texture_lod_bias, GL_EXT_abgr, GL_EXT_bgra, GL_EXT_stencil_wrap,
    GL_EXT_texture_filter_anisotropic, GL_EXT_secondary_color,
    GL_EXT_blend_func_separate, GL_EXT_shadow_funcs, GL_EXT_stencil_two_side,
    GL_EXT_depth_bounds_test, GL_EXT_texture_compression_s3tc,
    GL_EXT_texture_compression_dxt1, GL_EXT_texture_sRGB,
    GL_EXT_blend_equation_separate, GL_EXT_texture_mirror_clamp,
    GL_EXT_packed_depth_stencil, GL_EXT_geometry_shader4,
    GL_EXT_transform_feedback, GL_EXT_gpu_shader4, GL_APPLE_flush_buffer_range,
    GL_APPLE_ycbcr_422, GL_APPLE_vertex_array_range, GL_APPLE_texture_range,
    GL_APPLE_float_pixels, GL_ATI_texture_float, GL_ARB_texture_float,
    GL_ARB_half_float_pixel, GL_APPLE_pixel_buffer, GL_APPLE_object_purgeable,
    GL_NV_point_sprite, GL_NV_register_combiners, GL_NV_register_combiners2,
    GL_NV_blend_square, GL_NV_texture_shader, GL_NV_texture_shader2,
    GL_NV_texture_shader3, GL_NV_fog_distance, GL_NV_depth_clamp,
    GL_NV_multisample_filter_hint, GL_NV_fragment_program_option,
    GL_NV_fragment_program2, GL_NV_vertex_program2_option,
    GL_NV_vertex_program3, GL_ATI_texture_mirror_once,
    GL_ATI_texture_env_combine3, GL_ATI_separate_stencil,
    GL_SGIS_texture_edge_clamp, GL_SGIS_texture_lod.
GLU version string: 1.3 MacOSX
GLU extensions (GLU_): 
    .

[kernel/main.c]_PROTOTYPEマクロに唸る

MINIXのご本尊のmainだと思われる、kernel/main.cから読み進めて行こう。ファイルの冒頭にも「This file contains the main program of MINIX as well as its shutdown code.」と書いてある。

24行目から始まるプロトタイプ宣言。初っぱなからマクロの登場だ。

FORWARD _PROTOTYPE( void announce, (void));

FORWARDはinclude/minix/const.hで#define FORWARD staticと定義されている。これ以外の独自修飾子も、同様にconst.hで宣言されている。

include/minix/const.h:9-12
#define EXTERN        extern	/* used in *.h files */
#define PRIVATE       static	/* PRIVATE x limits the scope of x */
#define PUBLIC					/* PUBLIC is the opposite of PRIVATE */
#define FORWARD       static	/* some compilers require this to be 'static'*/

FORWARDは、関数のスコープをファイルスコープに押さえ込む役割のようだ。

続いて_PROTOTYPEマクロ。

名前からもわかるように、関数プロトタイプ宣言に関するマクロである。これの役割はK&R CとANSI Cのプロトタイプ宣言の違いを吸収するものっぽい。本体はinclude/ansi.hに記述されている。

#ifdef _ANSI
 
/* Keep everything for ANSI prototypes. */
#define _PROTOTYPE(function, params) function params
#define _ARGS(params) params
(略)
 
#else
 
/* Throw away the parameters for K&R prototypes. */
#define _PROTOTYPE(function, params) function()
#define _ARGS(params) ()
(略)
 
#endif /* _ANSI */

この定義と、先のプロトタイプ宣言を見比べると、K&RとANSIそれぞれの場合で以下のように展開されることがわかる。

ANSIの場合static void announce (void);
K&R の場合static void announce();

ANSIの場合は普通のプロトタイプ宣言だが、K&Rにはプロトタイプ宣言なるものは存在しないので、この文は関数の使用宣言をしているらしい(K&Rの資料がないので詳細は不明)。

では実際の関数定義部はどうなっているかというと……announce関数は引数を持たないので、その次のshutdown関数を見てみる。

PRIVATE void shutdown(tp)
timer_t *tp;
{
	...

こっちは完全にK&R準拠の書き方だ。後方互換の為に、ANSI Cでもこの書き方も許されている(無論、推奨はされていないが)ので、プロトタイプ宣言部分だけを切り替えてやれば、K&RなコンパイラでもANSIなコンパイラでもコンパイルできるって仕組みか。すげー!

0.MINIXのソースを読む

就活の面接で「OSのソースを読むと勉強になるYO!」と言われたのに触発され、読んでみる事にした。タスク管理とか前々から興味はあったしね。

Mac厨でありBSD厨でもある俺としては、FreeBSDとかDarwinのソースを読んでみたい所だけど、こいつらは流石に規模が大き過ぎるので、初学者には厳しいと判断。とりあえず、この手の話には最適なMINIXのソースを読む事にする。

MINIX 3公式サイトからMINIX 3.1.1の基本機能部分だけのソースtarballを落としてきて解凍。適当にXcodeでプロジェクトを作って、ソースファイルを丸ごと追加した。ソースコードを読むための、各種ツールなんかもあるみたいけど、とりあえずはXcodeだけで頑張って見る予定。

まずは、kernel/main.cあたりから読んで行けばいいのかな?OSに限った話じゃないが、初学者がある程度の規模のソフトのソースを読む際は、どっから読んでいいのか非常に困る所である。

ま、適当に読んで行くとしましょうか。

  • start.txt
  • 最終更新: 2022-07-27 15:26
  • by Decomo