2013年7月31日水曜日

AndroidでAdobe AIR

先日Adobe AIRで動画再生する方法について書きましたが、今度はAndroid上でAIRアプリケーションを動かしてみます。

FlashDevelopを立ち上げ、[Project]-[New Project]メニューで開くダイアログボックスで、
[ActionScript 3]-[AIR Mobile AS3 App]を選んで[Name]テキストボックスに
プロジェクトの名前を適当に入力し[OK]をクリックします。ここでは名前を"movie"にすることにします。
必要なら[Create dirctory for project]のチェックを入れておきます。
[Project]ペインに作成したプロジェクトの構成要素が表示されるはずです。
"AIR_Android_readme.txt"は一読したほうがいいでしょう。
"AIR_iOS_readme.txt"ファイルが目にとまった方もいるでしょうが、
実はこのプロジェクトでiOS用のアプリケーションも開発できます。
ただし、それをiPadやiPhoneで実行するのはハードルが高いので。

とりあえずAndroidで動作できるまでやってみます。
まずは一度だけ"bat/CreateCertificate.bat"を実行しておきます。
また実行環境となるAndroid側で、Google PlayからAdobe AIRをインストールし、
[設定]アプリケーションの[アプリケーション]-[提供元不明のアプリ]をチェックしておきます。
もし使用するAndroid端末でADBドライバが提供されていれば、それをPCにインストールし、
[アプリケーション]-[開発]-[USBデバッグ]をチェックしてPCとUSB接続しておくことで、
作成したアプリケーションのAndroidへのインストールが簡単に行えます。

で、[Project]-[Build Project]メニューを実行すると"bin/movie.swf"が作成され、
"PackageApp.bat"を実行し、[1]を選択すれば"dist/movie.apk"が生成されます。
このときAndroid端末をADB接続していれば自動的にパッケージがインストールされるので、
普通のAndroidアプリケーションと同様に実行・管理することができます。
そうでなければ、"movie.apk"を適当なウェブサーバにアップロードし、
Androidのウェブブラウザからダウンロードしてインストールすることになります。
なお"PackageApp.bat"を実行した際に[3]を選択すると
AIRのライブラリが含まれたapkパッケージができあがるようです。

ちなみにメインのソースコードである"src/Main.as"はデフォルトで以下のようになっています。
package 
{
 import flash.desktop.NativeApplication;
 import flash.events.Event;
 import flash.display.Sprite;
 import flash.display.StageAlign;
 import flash.display.StageScaleMode;
 import flash.ui.Multitouch;
 import flash.ui.MultitouchInputMode;
 
 /**
  * ...
  * @author ---------
  */
 public class Main extends Sprite 
 {
  
  public function Main():void 
  {
   stage.scaleMode = StageScaleMode.NO_SCALE;
   stage.align = StageAlign.TOP_LEFT;
   stage.addEventListener(Event.DEACTIVATE, deactivate);
   
   // touch or gesture?
   Multitouch.inputMode = MultitouchInputMode.TOUCH_POINT;
   
   // entry point
   
   // new to AIR? please read *carefully* the readme.txt files!
  }
  
  private function deactivate(e:Event):void 
  {
   // auto-close
   NativeApplication.nativeApplication.exit();
  }
  
 }
 
}
とりあえず以下のようにすると動画が再生できました。
package 
{
 import flash.desktop.NativeApplication;
 import flash.events.Event;
 import flash.display.Sprite;
 import flash.display.StageAlign;
 import flash.display.StageScaleMode;
 import flash.ui.Multitouch;
 import flash.ui.MultitouchInputMode;
 import flash.events.AsyncErrorEvent;
 import flash.events.NetStatusEvent;
 import flash.events.SecurityErrorEvent;
 import flash.media.Video;
 import flash.net.NetConnection;
 import flash.net.NetStream;
 
 /**
  * ...
  * @author ---------
  */
 public class Main extends Sprite 
 {
  private var videoURL:String = "http://<コンテンツサーバ>/<ディレクトリ>/movie.flv";
  private var netConnection:NetConnection;
  private var stream:NetStream;
  
  public function Main():void 
  {
   stage.scaleMode = StageScaleMode.NO_SCALE;
   stage.align = StageAlign.TOP_LEFT;
   stage.addEventListener(Event.DEACTIVATE, deactivate);
   
   // touch or gesture?
   Multitouch.inputMode = MultitouchInputMode.TOUCH_POINT;
   
   // entry point
   // new to AIR? please read *carefully* the readme.txt files!
   netConnection = new NetConnection();
   netConnection.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler);
   netConnection.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler);
   netConnection.connect(null);
  }
  
  private function deactivate(e:Event):void 
  {
   // auto-close
   NativeApplication.nativeApplication.exit();
  }
  
  private function netStatusHandler(event:NetStatusEvent):void
  {
   switch (event.info.code) {
    case "NetConnection.Connect.Success":
     connectStream();
     break;
    case "NetStream.Play.StreamNotFound":
     trace("Unable to locate video: " + videoURL);
     break;
    case "NetStream.Play.Stop":
     stream.play(videoURL);
     break;
   }
  }
  
  private function connectStream():void
  {
   stream = new NetStream(netConnection);
   stream.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler);
   stream.addEventListener(AsyncErrorEvent.ASYNC_ERROR, asyncErrorHandler);
   var video:Video = new Video();
   video.attachNetStream(stream);
   stream.play(videoURL);
   addChild(video);
  }
  
  private function securityErrorHandler(event:SecurityErrorEvent):void
  {
   trace("securityErrorHandler: " + event);
  }
  
  private function asyncErrorHandler(event:AsyncErrorEvent):void
  {
   
  }
 }
 
}
しかし、ローカルファイルの再生方法はわかりません。
ネット上の情報を参考にいろいろやってみたのですができずじまいです。

2013年7月30日火曜日

Adobe AIR で動画再生

先日Adobe Flash で動画再生する方法について書きましたが、今度はAIRです。
まあAIRはFlashプログラムを独立したアプリケーションとして動かすだけなので、
そんなには変わりません。

FlashDevelopを立ち上げ、[Project]-[New Project]メニューで開くダイアログボックスで、
[ActionScript 3]-[AIR AS3 Projector]を選んで[Name]テキストボックスに
プロジェクトの名前を適当に入力し[OK]をクリックします。ここでは名前を"movie"にすることにします。
必要なら[Create dirctory for project]のチェックを入れておきます。
[Project]ペインに作成したプロジェクトの構成要素が表示されるはずです。
"AIR_readme.txt"は一読したほうがいいでしょう。
"src/Main.as"がメインのソースコードとなるのでこれを開きます。
元の内容は
package 
{
 import flash.display.Sprite;
 
 /**
  * ...
  * @author ---------
  */
 public class Main extends Sprite 
 {
  
  public function Main():void 
  {
   
  }
  
 }
 
}
なかんじのはずなので、ちょっと追加して以下のようにします。
package 
{
 import flash.display.Sprite;
 import flash.events.*;
 import flash.media.Video;
 import flash.net.NetConnection;
 import flash.net.NetStream;
 
 /**
  * ...
  * @author ---------
  */
 public class Main extends Sprite 
 {
  private var videoURL:String = "movie.flv";
  private var netConnection:NetConnection;
  private var stream:NetStream;

  public function Main():void 
  {
   netConnection = new NetConnection();
   netConnection.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler);
   netConnection.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler);
   netConnection.connect(null);
  }
  private function netStatusHandler(event:NetStatusEvent):void
  {
   switch (event.info.code) {
    case "NetConnection.Connect.Success":
     connectStream();
     break;
    case "NetStream.Play.StreamNotFound":
     trace("Unable to locate video: " + videoURL);
     break;
    case "NetStream.Play.Stop":
     stream.play(videoURL);
     break;
   }
  }

  private function connectStream():void
  {
   stream = new NetStream(netConnection);
   stream.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler);
   stream.addEventListener(AsyncErrorEvent.ASYNC_ERROR, asyncErrorHandler);
   var video:Video = new Video();
   video.attachNetStream(stream);
   stream.play(videoURL);
   addChild(video);
  }

  private function securityErrorHandler(event:SecurityErrorEvent):void
  {
   trace("securityErrorHandler: " + event);
  }

  private function asyncErrorHandler(event:AsyncErrorEvent):void
  {
   
  }
 }
 
}
これで[Project]-[Build Project]メニューを実行すれば、
"bin/movie.swf"ができているはずです。
動画ファイル"movie.flv"を"bin"("movie.swf"と同じ)ディレクトリにコピーし、
"Run.bat"を実行すればデバッガが立ち上がって動画再生が始まります。
もっとも動画ファイルのありかはソースコード中の
private var videoURL:String = "movie.flv";
で指定していて、相対パスや絶対パスで指定できます。
ただし、相対パスで親ディレクトリを示す".."が使えないようで、
ディレクトリツリーをさかのぼる指定はできません。
どうしても必要なら絶対パスで指定することになります。
ディレクトリの区切りは"\"(円マーク、またはバックスラッシュ)ではなく"/"を使う必要がありますが、
Windowsのドライブ指定は通常通り"c:"の形式で指定できます。
もちろんどこかにコンテンツサーバを立ててそこに置きたければ、
private var videoURL:String = "http://<サーバ名>/<ディレクトリ名>/movie.flv";
のようにURLとして指定してビルドしなおせば実現できます。

デバッガではなく単独で動作させたい場合は、
あらかじめ一度だけ"bat/CreateCertificate.bat"を実行しておいてから
"PackageApp.bat"を実行して"air/movie.air"を作成します。
ただし、これは実行可能ファイルではなくインストーラのデータに過ぎません。
AIRのランタイムをインストールしていると
関連付けされてこのairファイルが実行できるようになるので実行するとインストールでき、
無事単独アプリケーションとして実行できるようになります。
アンインストールするには通常のWindowsアプリケーションと同様に
[コントロールパネル]の[プログラムの追加と削除]や[プログラムと機能]から行います。

2013年7月29日月曜日

3D Galaxy Force II

Galaxy Force IIというとスマートフォンの新機種か、とか思われそうな今日この頃ですが、
大昔の3Dシューティングなアーケードゲームです。
超高価な体感筐体(スーパーDXで500万円以上?)なので、
地方に住んでいるとこれが置いてあるゲームセンターなどなく、
実は一度も遊んだことはないのですが、個人的にとても憧れのあるゲームです。
ちなみに家庭用ゲーム機への移植作も未体験なんです。

そんなGalaxy Force IIですが、Nintendo3DSに移植(?)されました。
しかも立体視対応です。
3DS内蔵ソフトのeショップから購入・ダウンロードできます。

さて、遊んでみた感想は…
当時の思い出がない分、新規ゲームとして遊ぶのは画質的にちょっと厳しい気がしますが、
3Dスペースハリア同様、迫りくるものが立体視により認識しやすくなっています。
個人的には移動と速度調整が操作し辛いですが、
3DS用拡張スライドパッド/3DSLL用拡張スライドパッドで改善する可能性はあります。
総合的には、ちょっとあそぶにはまあまあ面白いぐらいですね。
価格が800円と、当時のスーパーDX筐体での3プレー分ですのでお手頃でもあります。

もしこれで不満があるならSTARFOX64 3Dを遊んでみることをお勧めします。
内容的にもプレー感的にも似たタイプのゲームですが
表現が大量スプライトからポリゴンに変わっており、より洗練された見た目になっています。
私は思い出したように時々遊んでいます。

2013年7月25日木曜日

Adobe Flash で動画再生

自分で撮影した動画ファイルをネット上で見れるようにするならYouTubeにアップするのが簡単ですが、
あまり公開したくないならAdobe Flashで再生できるようにするのが簡単です。
もちろんFlashに対応している機器でしか再生できませんが。

まずは動画ファイルを変換する必要があります。
例えばLUMIX GF5で撮影したようなAVCHD形式の動画ファイルなら、
Full Video ConverterでFLV形式に変換できます。
[File]-[Add File(s)]メニューで"00001.MTS"のような動画ファイルを選択し、
画面下の[Profile]ドロップダウンリストで[General Video Format]の[FLV]を選択し、
その[Edit]ボタンを押してビデオの画素数を指定した上で、
[Actions]-[Convert Checked Item(s)]メニューを実行すれば、
[Destination]に設定したディレクトリにFLV形式のファイルが作成されます。
以下このファイルを"movie.flv"とあらわします。

それではFlashで先に作成したFLVファイルを再生してみましょう。
先日紹介したFlashDevelopを立ち上げます。
[Project]-[New Project]メニューで開くダイアログボックスで、
[ActionScript 3]-[AS3 Project]を選んで[Name]テキストボックスに
プロジェクトの名前を適当に入力し[OK]をクリックします。ここでは名前を"movie"にすることにします。
必要なら[Create dirctory for project]のチェックを入れておきます。
[Project]ペインに作成したプロジェクトの構成要素が表示されるはずです。
"src/Main.as"がメインのソースコードとなるのでこれを開きます。
元の内容は
package 
{
 import flash.display.Sprite;
 import flash.events.Event;
 
 /**
  * ...
  * @author ---------
  */
 public class Main extends Sprite 
 {
  
  public function Main():void 
  {
   if (stage) init();
   else addEventListener(Event.ADDED_TO_STAGE, init);
  }
  
  private function init(e:Event = null):void 
  {
   removeEventListener(Event.ADDED_TO_STAGE, init);
   // entry point
  }
  
 }
 
}
なかんじのはずなので、ちょっと追加して以下のようにします。
package 
{
 import flash.display.Sprite;
 import flash.events.Event;
 import flash.events.AsyncErrorEvent;
 import flash.events.NetStatusEvent;
 import flash.events.SecurityErrorEvent;
 import flash.media.Video;
 import flash.net.NetConnection;
 import flash.net.NetStream;
 
 /**
  * ...
  * @author ---------
  */
 public class Main extends Sprite 
 {
  private var videoURL:String = "movie.flv";
  private var netConnection:NetConnection;

  public function Main():void 
  {
   if (stage) init();
   else addEventListener(Event.ADDED_TO_STAGE, init);
  }
  
  private function init(e:Event = null):void 
  {
   removeEventListener(Event.ADDED_TO_STAGE, init);
   // entry point

   netConnection = new NetConnection();
   netConnection.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler);
   netConnection.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler);
   netConnection.connect(null);
  }
  private function connectStream():void
  {
   var netStream:NetStream = new NetStream(netConnection);
   netStream.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler);
   netStream.addEventListener(AsyncErrorEvent.ASYNC_ERROR, asyncErrorHandler);
   
   var video:Video = new Video();
   video.attachNetStream(netStream);
   netStream.play(videoURL);
   addChild(video);
  }

  private function netStatusHandler(event:NetStatusEvent):void
  {
   switch (event.info.code) {
    case "NetConnection.Connect.Success":
     trace("connectStream");
     connectStream();
     break;
    case "NetStream.Play.StreamNotFound":
     trace("Unable to locate video: " + videoURL);
     break;
   }
  }

  private function securityErrorHandler(event:SecurityErrorEvent):void
  {
   trace("securityErrorHandler: " + event);
  }

  private function asyncErrorHandler(event:AsyncErrorEvent):void
  {
   
  }
 }
 
}
これで[Project]-[Build Project]メニューを実行すれば、
"bin/movie.swf"ができているはずです。
"movie.flv"を"bin"("movie.swf"と同じ)ディレクトリにコピーし、
binディレクトリ以下を丸ごと(実際は"movie.swf"と"movie.flv"だけでよい)ウェブサーバに置き、
ウェブブラウザから"index.html"(または"movie.swf")にアクセスすれば動画が再生されます。
もちろんFlashプラグインがインストールされたウェブブラウザである必要はあります。
動画ファイルのありかはソースコード中の
private var videoURL:String = "movie.flv";
で指定しているので画像だけ別のサーバに置いているなら、
private var videoURL:String = "http://<サーバ名gt;/<ディレクトリ名gt;/movie.flv";
のようにURLとして指定してビルドしなおせば実現できます。

2013年7月24日水曜日

outlook.comの改悪

一ヶ月ほど前、outlook.comで使っているアカウント(ホスティング含む)に
Microsoftから「アカウントのリンクは間もなく解除されます」
というメールが届きました。
そしてそれがついに実施されてしまいました。

outlook.comでは複数のアカウントを紐付けておき、
どれか1つのアカウントでログインすれば
アカウントの切り替えが2クリックでできて便利だったのですが、
これができなくなってしまいました。
まあ前々からセキュリティ上よくはないとは思っていたので仕方ないでしょう。
しかし、せっかくの便利な機能がセキュリティーの名の下に廃止されていくのは、
時代の流れとはいえ残念でなりません。

ところでoutlook.comにはGmail(Google Apps)のように
ブラウザのタブ毎に別のアカウントを開くことができません。
今期の改悪により一度ログオフしないと別アカウントにアクセスできなくなってしまいました。
これはあんまりです。
アカウントのリンクを廃止するのならせめてこれは直してほしいです。
一応複数の Microsoft アカウントのメールを 1 か所で送受信する方法はありますが、
私は使うつもりはありません。

2013年7月23日火曜日

Adobe Flash/AIR

私はJavaが登場当初からあまり好きではありません。
JavaといってもJava scriptではないバーチャルマシン上で動かすほうの本物のJavaです。
"Write once, run anywhere"という理念はすばらしいと思いますが、
基本的に人の土俵の上に新たな土俵を作るようなやり方は私の好みではありません。
この点はApple創業者の故スティーブ・ジョブス氏と同意見です。

同じ理由でAdobeのFlash/Airも好きではありません。
それを言い出すとMicrosoftの.Net Frameworkや、
個人的にGoogleが買っちゃえよと思っているQt、
あるいはPHPやPythonだって見方によれば"土俵の上の土俵"ですが、
そっちはあまり気になりません。
なぜかって、それは単なる私の好みの問題です。

さて、あまり好みでないAdobe Flash/Airもちょっと使う分には便利だったりします。
Androidアプリケーションを作るにも普通にJavaを使っていますし、
別に嫌いなものは絶対使わないということでもないんですよね。
単なるツールですから適材適所で使えばいいわけです。

で、Flash/Airの開発環境についてちょっとだけ書いてみたいと思います。
いや、実際には大して知識も無いのでそれぐらいしか書けないのですが。
もちろんAdobeの利益にならないよう(?)に開発環境は無料でそろえます。
といってもFlashDevelopをインストールするだけで自動的にそろいます。
現時点での最新バージョンは4.3.0です。
デフォルト設定でインストールすれば必要なものが自動的にダウンロードされます。
ただ.Net FrameworkとJavaは手動でのインストールになります。

はまったのがWindows8へのインストールです。
FlashDevelopでは.Net Framework 2.0 SP1相当(4.0でもOK)が必要らしいのですが、
これがいろいろ試してもインストールできません。
[コントロールパネル]の[プログラムと機能]から
[Windowsの機能の有効化または無効化]をクリックし、
[.NET Framework 3.5(.NET 2.0 および3.0を含む)]を有効にすることで解決できました。
って、そんなの気付かないって。

他のトラブルとしてFlashDevelopのデフォルトの設定ではインストールの途中で
Flex SDK(flex_sdk_4.6.0.23201B.zip)、AIR SDK(air_sdk_3.6.0.zip)、
デバッガ(FlashPlayerDebugger.exe)をダウンロードしようとするのですが、
プロキシ経由でのダウンロードはできないようで失敗してしまいます
(FlashDevelopのインストール自体は成功)。
私の場合はflex_sdk_4.6.zipを手動でダウンロードし適当なディレクトリに展開し、
FlashDevelopの[Tools]-[Programs Settings]メニューで[Settings]ウィンドウを開き、
Pluginsの[AS3Context]を選択して[Installed Flex SDKs]プロパティを選択し、
値の右端[...]ボタンをクリックすると[IntsalledSDKコレクション]ダイアログボックスが表示されるので、
それの[Location]-[Path]プロパティにflex SDKへのパスを設定するとうまく動きました。
試していませんがflex SDKを"C:\Program Files\FlashDevelop\Tools\flexsdk"に
展開するだけでいいような気もします。

なお、AIRアプリケーションからプロキシを介してインターネットにアクセスする必要があるなら、
[コントロールパネル]-[Java]から[Javaコントロール・パネル]ウィンドウを開き、
[一般]タブの[ネットワーク設定]ボタンをクリックして開いたダイアログボックスから
プロキシサーバを設定しておきましょう。

2013年7月22日月曜日

MacBook Proを使ってみて

MacBook Pro(HDD付き)を購入して一ヶ月ほど使った感想など書いてみます。

何年か前Googleの開発者カンファレンスに個人的に参加したとき、
周りのかなり多くの方がMacBook Air(時期的には初代、もしかしたら2代目)を使っていて、
バッテリーの不安もあってDELLの11inchノートPCとASUSのネットブックを持って行っていた私ですが、
なんだか恥ずかしくて(DELLさん、ASUSさんすいません)、
弁当を隠しながら食べる女子学生のような気分でこっそりPCを使っていたことを思い出します。
その頃はまだクラウドという言葉は一般的でなかったと記憶していますが、
私の個人的コンピュータ環境はすでにウェブブラウザとUNIXコマンドさえあれば
結構何とかなる状況になっており、もはやWindowsにこだわる必然性もなく、
このときの体験によるMacへの憧れも加わって、
次にノートPCを買うならMacBookだと心に決めていました。
それから実際に買うまでは本当に長かったのですが…

さて、しばらく使ってみたMacBook Proは私が通常使用するには十分に早く快適です。
Windowsとの勝手の違いから手間取ることもありますが、おおむね満足です。
ちなみにその辺のノウハウについてはまた後日書き残しておくつもりです。

ハード的に一番気に入っているのはキーボードが光るLED照明です。
このところ猛暑が続いており、LED照明といえどもつけると暑いので、
テレビの光のみですごすことも少なくないのですが、
PCを使うときキーボードが光ると暗い中でも文字入力が問題なくできて大変助かります。
もちろんバッテリーの駆動時間に大いに影響する可能性があるのですが、
私は普段ACアダプタを挿しつつ使うことが多いですし、
キーボード照明の明るさは変えられるので明るい場所では切っておけばいいですし。

ACアダプタの話題が出ましたが、このACアダプタもなかなか気に入っています。
サイズ的には超小型とはいえませんが、iPad用のACアダプタをそのまま大きくしたような
側面が正方形の薄型形状で、コンセントへの差込電極は折りたためる一体型と
延長用のACケーブルとが付け替えられる仕組みになっています。
残念なのはACアダプタと本体と接続するためのDCケーブルが取り外し不可となっていることで、
DCケーブルがかなり細いことは携帯するにはいいのですが、
ACアダプタとつながっている根元をぞんざいに扱うと故障の原因になりそうです。
差込電極一体型で運用する場合はACアダプタの形状により出先で困る可能性も考えられるので、
短い電源延長コードを一緒に持ち歩くのがよさそうです。

ACアダプタを気に入っているもうひとつの理由はMagSafe(MagSafe2ではありません)です。
本体との接続保持が磁石の引力によっており、
接続するときのカチッという小気味よい音や、外す時の感触がなんだか気持ちよくて。
鋼鉄ジーグのテーマ曲が頭をぐるぐる回ってしまうのは年齢から来るものでしょう。
実用上は事故等で起こりえる強すぎる力でコードを引っ張っても磁力が引き剥がされるだけで、
本体やコネクタに与える物理的ダメージを最小限にできますし、
iPad miniLightningケーブルのように裏表を気にせず接続できるのも便利です。

なんだか細かいところばかり書いてしまいましたが、
普通のノートPCとしての使用感もよく、大変満足しています。皆さんにもお勧めします。
ただし、私のMacBook Pro(HDD付き)は世代的に古いのと、思ったより重いので、
HDDにこだわらない方、持ち歩くことが多い方は、
素直に最新のMacBook Airをチョイスするのがいいでしょう。
あるいはRetinaを優先するならRetinaなMacBook Proもいいのではないでしょうか。

2013年7月18日木曜日

AccessファイルからCSVファイルをエクスポート

Accessを多用する上で最も困るのが、
Accessを持っている人が少ないということです。
Office Proにしか付いてきません。

ということでAccessを持ってない人のために表形式のデータ(テーブル/クエリ)を
Excelで読めるCSVとして出力する方法を紹介します。

その方法は[マクロ]で[新規作成]を選び、
その一行目のアクション列を[テキスト変換]、
その[変換の種類]プロパティを[区切り記号付きエクスポート]、
[テーブル名]プロパティにテーブル名、またはクエリ名、
[ファイル名]プロパティに出力ファイルをフルパス
(環境依存性をなくすためCドライブのルートフォルダがいいかも)で設定します。
作成したマクロを実行すればCSVファイルが生成されます。
もちろんスナップショットに過ぎないのですが、見れないよりはましです。

2013年7月17日水曜日

svnの競合状態の解消

svnを多人数で使っていると、自分が手元で更新したファイルを
他の人も更新してコミットしているなんてことはよく起きます。
そういうファイルは普段なら手元でアップデートしたときに競合警告が出るので
その場で対処してしまうのですが、
時間がなくてちょっと手抜きをして放っておいたりすると
次にコミットするときに
svn: コミットに失敗しました (詳しい理由は以下のとおりです):
svn: コミットを中断しています: '<ファイル名>' がまだ競合しています
なんて警告が出てしまいます。
そういう時はその<ファイル名>を手動編集するなり、
svn revert <ファイル名>
で元に戻したりしてつじつまを合わせた上で
svn resolved <ファイル名>
を実行すればコミットできるようになります。
なお、くれぐれも変な内容のファイルをコミットしないよう注意しましょう。
svn diff <ファイル名>
で差分確認するだけで十分でしょうから。

2013年7月16日火曜日

ピクミン3

私がWiiUを購入した一番の動機とも言える
ピクミン3がようやく発売されました。
今年もクラブニンテンドーはすでにプラチナ会員で急いで買う必要もなく、
夏休みにでも買おうかなとか思っていたのですが、血迷って発売日に購入してしまいました。
早速ゲームディスクをWiiUに入れるといきなりアップデートが始まり、バージョンは1.1.0へ。
まあお約束ですね。
で、ゆっくり遊ぼうかなとか思いつつ、とりあえずさわりだけやってみたのですが…止まりません。
3連休でかなりやりこんでしまいました。
11日(ゲーム内時間)でキャプテンと合流し、22日でオリマー(?)を助け、
26日でピクミン全5種と出会い、31日でオリマー(?)をもう一度助け、
最後はかなりグダグダになりながらも36日(プレイ時間約13時間)でクリアしてしまいました。
うーん、こんなつもりではなかったのですが、面白くって、
そして攻略法を忘れないうちに進めたいということでなかなかやめられません。
なお果実はまだ半分まで集めていないので、32日目あたりからまたやり直そうかと思っています。
果実を全部集め終わってマップを網羅したらもう一度最初から遊んでもいいですね。
やることやマップの全体像がわかっていればもっと短期間でクリアもできるでしょう。
ただセーブが1つしかできないのでそのときは以前のプレーを削除することになります。
WiiUの設定からバックアップしておけばいいのかな?

さて、こんなふうに短期間でクリアできたと書くと
簡単ですぐに終わってしまうゲームと思われるかもしれませんが、
ピクミン3は繰り返し遊ぶのが楽しそうです。
スーパーマリオギャラクシースーパーマリオギャラクシー2
ゼルダの伝説 スカイウォードソードのように
同じマップを繰り返し遊ぶようになっており、あまり奇抜な地形はあまり見られませんし、
リアルタイムの戦略性があるところが繰り返し遊んでも飽きない理由なのかもしれません。
正直Wii版のピクミン2では
地下にもぐっていくところの終わりの見えなさ加減がいやで、クリア後2度と遊ぶことはなかったですし、
Wii版のピクミンは30日間(ゲーム内時間)という制限がきつくて
そもそもゆっくり遊ぶことができず、遊びのバリエーションがタイムアタックぐらいになってしまうので
何度も遊ぶことはありませんでした。
ピクミン3はこのあたりかなり改善されているように感じます。

ところでピクミン3を遊ぶにはWiiリモコンプラスヌンチャクは必需品だと思います。
WiiUに付属のWiiU GamePadでもアナログスティックを駆使して遊ぶことはできますが、
私には無理そうです。
まあGameCubeのピクミン2を遊んだときに1面で挫折した過去を考えれば
最初からわかっていたことですが。
ということでWiiリモコン等持っていないという方はセンサーバーとセットになった
Wiiリモコンプラス追加パックを購入することをお勧めします。
もちろんテレビを使わずWiiU GamePadの画面だけで遊ぶこともできます。
もしアナログスティックでの操作でよければGamePad単体で寝転がりながら遊べますし、
WiiU GamePadの画面だけを見ながらWiiリモコンで操作することもできます。
この場合センサーバーはテレビにあるものを使うので、
WiiリモコンはGamePadに向けるのではなくテレビに向けることになります。

でもやはりテレビ+Wiiリモコン+WiiU GamePadのフルセットで遊ぶのが基本でしょう。
このときGamePadにはマップが表示され、タッチパネルでの移動のサポートもでき大変便利です。
ただ問題なのはGamePadを立てて目の前に置かないと使いにくいと言うことです。
こういうときのためWiiUプレミアムセットにはスタンドが同梱されていますが、 ベーシックセットには付いていないので
純正スタンドセットを購入するのがいいかもしれません。
私はiPad用に持っているスタンドを流用しています。

このピクミン3、New スーパーマリオブラザーズ U
Nintendo Landのような敷居の低さはないので、
操作もルールも慣れるまで辛いかもしれませんが、
ストーリーモード序盤やミッションモードを通じてわかってくるとかなり楽しくなります。
WiiUを持っている方はぜひ遊んでみてください。
またピクミン3とある意味似たところのあるThe Wonderful 101がもうすぐ発売されますが、
こちらもちょっと面白そうかもと思っているところです。

2013年7月15日月曜日

Accessで改行

世の中表形式のデータと言えばExcelで作る傾向があって、
数値処理やグラフ表示が必要ないWordの表で書けばいいようなものまでExcelで作って、
その説明文を職人芸的にセルに書き込んだりしているのをよく見かけます。
DOS版Lotus1-2-3から表計算を使い始めた私としてはいちいち突っ込みたいところです。
ちなみに私はWordもあまり好きではなく、
基本プレーンテキスト、必要ならHTMLをソースで書いています。
さすがにTeXを使うことはありませんが、今も一応DVIビュアーはインストールしています。

さて、逆方向から見るとExcelよりデータベースのAccessを使ったほうがデータ処理がしやすいことも多く、
こういうものをExcelで書いていたりすると、
データベーススペシャリストな私としてはそれにもまたげんなりさせられます。
まあもっと言うとAccessより
MySQLなんかをバックエンドとしたWebアプリケーションのほうがいいんですけどね。

さて、Accessを使用するに当たって、
データ入力用にフォームを作ってしまうのが一般的だと思いますが、
このフォーム内のテキストボックスに改行を入れるのがめんどくさかったりします。
[Ctrl]+[Enter]で改行できるのですが、
実は[Enter]だけで改行するように設定変更できます。

その方法は、フォームをデザインモードで開いて設定したいテキストボックスを選択し、
コンテキストメニューをから[プロパティ]を選びます。
[すべて]タブの[Enterキー入力動作]プロパティを
[フィールドに行を追加]に設定すれば完了です。
これでメモ型に文章を打ち込むのが楽になります。

2013年7月11日木曜日

はやぶさの映画

早いもので小惑星探査機はやぶさが帰還(実際には燃え尽きましたが)してから3年経っています。
直後に映画化の話があり、以下の3本が製作されました。

私としてはこれは当時からドキュメンタリーに近い連続ドラマ向きの話であって、
たかだか2時間ほどの映画には向かないのではと感じており、
特に積極的に見るつもりもなかったのですが、
先日3作目を観る機会があり、これで全作観たことになります。

で、感想ですが、予想通り面白くありませんでした。
3作ともはやぶさブームに乗っかってとりあえず映画化を決定したけど、
ベストセラーの原作があるわけでもなく、
プロジェクト実施当事に科学者や技術者をしっかり取材したわけでもなく、
表面上の出来事と明らかになっている裏話をつなぐだけでは展開する物語が希薄なので、
その外にある人間物語に終始している印象があります。
開発や運用の現場については事実を基にしたのだとは思いますが、
例えば会議の場面ひとつとっても、ホワイトボードへの書きなぐりも、
軌道や確率のその場での計算も、まくし立てるプレゼンテーションもなく、
まあ日本らしいといえばそうかもしれませんが地味すぎて映画に見えません。
同じ宇宙開発関連映画のアポロ13と比べると…
もちろん国も危機感も時間的密度も違うのはわかっているのですが。

2013年7月10日水曜日

静的ライブラリから動的ライブラリを作る

先日Linuxの静的ライブラリ(*.a)を動的ライブラリ(*.so)に変換する必要に迫られました。
最初は豆鉄砲喰らった鳩になってしまったのですが、
ネット検索していくうちに、よく考えたら簡単なことだと気がつきました。

そもそも静的ライブラリ(*.a)は複数のオブジェクトファイル(*.o)を
単に1つにまとめただけのファイルで、
コンパイラで作成したオブジェクトファイルや静的ライブラリをリンカは同列に扱います。
正確に言えば、静的ライブラリはコンパイラで作成したオブジェクトファイルを
arコマンドでまとめたものとなります。

となるとオブジェクトファイルを共有ライブラリ(*.so)に変換するのはリンカの仕事なので、
静的ライブラリを共有ライブラリに変換するのも同様にリンカの仕事ということになります。

具体的にはそれなりのCのソースコード(ここでは"test.c")を共有ライブラリにするには
$ gcc -shared -o libtest.so test.c
を実行すればいいのですが、静的ライブラリ(ここでは"libtest.a")を共有ライブラリにするには
$ ld -shared -o libtest.so --whole-archive libtest.a
を実行すればいいということになります。
大体の環境では
$ gcc -shared -o libtest.so --whole-archive libtest.a
で問題ないということでこれが正解です。
別解として、
$ ar x libtest.a
で複数のオブジェクトファイルに展開した上で、改めて共有ライブラリを作ることができます。
例えばlibtest.aに含まれるtest1.o、test2.o、test3.oが展開されたなら、
$ ld -shared test1.o test2.o test3.o -o libtest.so
で生成できます。

2013年7月9日火曜日

F1の安全性がひどい

先日もF1の安全性について書いたのですが、
先日またもひどい状況を目にしたのでイギリスGPとドイツGPについて書いておきます。

イギリスGPではタイヤのバーストが頻発しました。
そしてバーストしたタイヤが後方に飛んでいくと言う恐ろしい光景を目にしました。
2009年のハンガリーGPでバリチェロが落としたボルトが
マッサのバイザーを直撃する事故がありましたが、
もしあのバーストしたタイヤを喰らったら即死でしょう。
幸いにもアロンソらはうまくよけていましたが、
場合によってはマーシャルや観客に被害が起こっていた可能性もあるわけで、
タイヤメーカーのピレリや各チームにはこのようなことが起こらないようにしてもらいたいものです。

ドイツGPについてはピット作業で交換できていなかったウェーバーのタイヤが外れて
カメラマンを直撃しました。
テレビ中継ではほとんど写されていなかったのですが、
どうもヘリコプターで病院に運ばれたようです。
骨折や脳震盪はあったものの幸い命に別状はない模様です。
ピットクルーとドライバーどちらに非があるのかはわかりませんが、
危険な状態でのリリースが起きないよう技術的工夫やレギュレーションの強化を願います。

また、エンジンブロー(?)で止まったビアンキの車が坂道をころがってコースを横切るという
前代未聞な事も起こりました。恐ろしすぎます。
ドライバーが乗っていない状態の車を周りにだれもいない状態で放置しておくのは
ドライバーもマーシャルもどうかしてるとは思いますが、
こういうのを見ると、万一の状況に備えて強制レッドフラッグボタンを
各係員の判断で押せるようなシステムの導入さえ必要な気もします。

どうも最近のF1はあらゆるところで危険が顕在化しているようです。
シーズン途中ではありますが、もっと恐ろしいことが起きる前に予防を図るべきでしょう。
ドイツGPでは最後の数週ベッテルとライコネンのバトルで手に汗握りましたが、
別のところで脂汗をかくのは本意ではありません。

2013年7月8日月曜日

クォーターパウンダー ジュエリー ゴールドリング

マクドナルドから1個1000円の高級バーガーが先週土曜に1日限定で発売されました。
クォーターパウンダージュエリーシリーズのゴールドリングです。
いつもは株主優待券とJAFの機関紙についてくるコーヒー無料券しか使わない、
店頭では迷惑な株主なのですが、
ゴールドリングは株主優待券等は使えないとの事前情報があったので
仕方なく現金で購入してみました。

持ち帰りで頼んだところ

な専用紙袋で手渡されました。しかもハンバーガー自体も

なふうに宝石箱をイメージした箱に入っています。
なるほど、価格が高いのは材料だけでなくこういうところにもコストをかけているからなんですね。
こういう演出私は好きです。
先日手に入れたNintendoの紙袋もそうですが、
アップルストア、ルイ・ヴィトン、ティファニーなどの袋もとっておく癖があり、
これもコレクションに加えたいと思います。

肝心の中身はと言うと

な感じで、特徴的なのはゴールドリングの由来となる焼きパイナップルです。
ビーフパテとパイナップルを中心にチーズとベーコンが入りBBQソースがかかっています。
私は酢豚やハンバーグのパイナップル肯定派なので結構好きな組み合わせです。
ちょっとBBQソースが濃すぎのような気もしますが、
べったりかかっているわけではないのでそんなにしつこくなく、
パイナップルの酸味で中和もされていてわりとおいしかったです。
ただし、個人的にはベーコンは要らなかったかなと。
というのも食感的に違和感があるのもさることながら、
厚切りベーコンのせいで厚くなりすぎ食べにくくて仕方ありません。
ファーストフードのハンバーガーとしてではなく、
アメリカのレストランなんかで皿に盛られて出てきて
ナイフとフォークで食べるのならいいかもしれません。

さて、クォーターパウンダージュエリーシリーズは今週土曜日限定でブラックダイヤモンドが、
その次の土曜限定でルビースパークが販売されます。
両方とも私の嫌いなタマネギが入っているので購入するかどうかはわかりませんが、
ドリンク等とのセットで1200円なので、ちょっと贅沢なランチと考えれば払えない金額ではありません。
興味があるならぜひ食してみてください。

2013年7月4日木曜日

WebPを作る

自然画(フルカラー)の画像ファイルといえばやっぱりJPEGです。
そもそも256色までのGIFや、標準では無圧縮のBMPはおいておくとして、
可逆圧縮が必要ならPNGは悪くないものの、圧縮率を考えるとやっぱりJPEG一択です。
過去ウェーブレット変換なJPEG2000も登場してちょっとだけ期待した時期もありましたが、
最近は名前すら聞かない寂しい状態です。
そんな画像フォーマット対決にGoogleがWebPで挑んですでに2,3年が立ちますが、
やっぱりお世辞にも普及したとはいえません。

しかし前日使ってみてびっくりしました。
カメラで撮った6MBのJPEGをWebPにすると320KBに縮まりました。
あまりの小さくなりようににわかには信じられなかったのですが、
画像サイズはそのまま保持されています。
拡大して比べるとたしかに看板の小さな文字がつぶれていたりはしますが、
普通に見る分には私の目はほぼ節穴なので大して気にもなりません。

もちろんWebPに対応したソフトは多くなく、互換性の面で問題もありますし、
いろんな意味でいまさら数MBを必死に節約しようとも思わないのですが、
Chromeブラウザが対応してくれているので私にとってはそれで十分だったりします。
個人的に活用してみようかと考えているところです。

ところで先に話題にしたJPEGをWebPに変換する方法について書いておきます。
WebP関連のダウンロードページで、
[Search] "All downloads" [for] "webpconv" を検索すると、
"webpconv-win-0.0.5.zip"がダウンロードできるので解凍して、
そのディレクトリに適当なJPEGファイルをコピーし、
そのJPEGファイルを"webpconv.exe"にドラッグ&ドロップすると
拡張子webpの同名ファイルが出来上がります。これがWebPの画像です。
Chromeにドラッグ&ドロップすると表示できます。
もちろんWebサーバ上においておけばネットワーク越しに閲覧できます。
コマンドラインで引数をつけるといろいろできるみたいなので興味のある方は遊んでみてください。

2013年7月3日水曜日

codebreak

最近codebreakという無料で無制限なgitサーバサービスが登場しました。
とりあえずここから登録してみます。
ただし、レジュメで[基本情報]と[スキル]を入力して
運営サイドから承認してもらわないといろいろ制限がかかるようです。
正直この時点で登録やめようかとも思ったのですが、
しょうがないので入力してみました。
その日のうちに承認してもらえ、gitのプライベートリポジトリ数が無制限となりました。
ただし総容量は200MBまでのようです。

で、ダッシュボードから
[My Gitリポジトリ]の[作成する]リンクをクリックし、
適当に名前を付けてリポジトリを作成します。
なお、このリポジトリにアクセスするURLは
https://git.codebreak.com/<ユーザ名(メールアドレスじゃないほう)>/<リポジトリ名>.git
となります。
とりあえず手元のマシンから
$ mkdir test
$ git init
$ git config user.email "<メールアドレス>"
$ git config user.name "<ユーザ名>"
$ echo 1 > README
$ git add README
$ git commit -m 'Created.'
$ git remote add origin https://git.codebreak.com/<ユーザ名(メールアドレスじゃないほう)>/<リポジトリ名>.git
$ git push -u origin master
を実行すれば、あとは通常のgitサーバにアクセスするように使えます。
もちろんウェブインターフェイスからもいろいろできるようになっています。

もし他のgitサーバ(VPS等)と組み合わせて利用するとすれば、
codebreakを親にしてVPSから"git clone --mirror"してVPS側をバックアップサーバにするか、
普段はVPSをマスターサーバにして時々codebreakにpushするような使い方になるんでしょうかね。
なんだか使いにくそうです。

2013年7月2日火曜日

RSAで公開鍵暗号

ちょっと必要があってデータを暗号化するツールをCで実装しようとRSAを使ってみました。
と言っても独自に実装したわけではなくOpenSSLを利用しました。
RSAはすでに特許が切れているので自由に使えはしますが、
各実装には著作権等が絡んできますのでその辺はご注意を。

さて、Ubuntu 12.04であれば
# apt-get install libssl-dev
を実行した後に、
#include <stdio.h>
#include <openssl/rsa.h>

int main(void)
{
 int i;
 FILE *fp;
 RSA *rsa;

 SSL_library_init();
 rsa = RSA_generate_key(1024,65537,NULL,NULL);
 RSA_print_fp(stdout,rsa,0);
 fp=fopen("public.pem","w");
 PEM_write_RSAPublicKey(fp,rsa);
 fclose(fp);
 fp=fopen("private.pem","w");
 PEM_write_RSAPrivateKey(fp,rsa,NULL,NULL,0,NULL,NULL);
 fclose(fp);
 RSA_free(rsa);
 return EXIT_SUCCESS;
}
を中身とするファイル"gen.c"を作成して
$ gcc gen.c -lcrypto -lssl
$ ./gen
とすれば、秘密鍵ファイル"private.pem"と公開鍵ファイル"public.pem"が生成されます。
生成される鍵データは毎回異なります。
なお、エラーハンドリングは一切してませんがご容赦を。

続いて
#include <stdio.h>
#include <openssl/rsa.h>

int main(void)
{
 int i,j,size;
 FILE *fp;
 RSA *rsa=NULL;
 unsigned char *rb=NULL,*wb=NULL;

 SSL_library_init();
 fp=fopen("private.pem","r");
 PEM_read_RSAPrivateKey(fp,&rsa,NULL,NULL);
 fclose(fp);
 size=RSA_size(rsa);
 rb=malloc(size);
 wb=malloc(size);
 size-=11;
 while((i=fread(rb,1,size,stdin))>0){
  j=RSA_private_encrypt(i,rb,wb,rsa,RSA_PKCS1_PADDING);
  if(j<=0)
   return EXIT_FAILURE;
  fwrite(wb,1,j,stdout);
 }
 free(rb);
 free(wb);
 RSA_free(rsa);
 return EXIT_SUCCESS;
}
を中身とするファイル"enc.c"を作成して
$ gcc enc.c -lcrypto -lssl
$ ./enc < 1 > 2
とするとファイル"1"を秘密鍵ファイル"private.pem"で暗号化したファイル"2"が得られます。

さらに
#include <stdio.h>
#include <openssl/rsa.h>

int main(void)
{
 int i,j,size;
 FILE *fp;
 RSA *rsa=NULL;
 unsigned char *rb=NULL,*wb=NULL;

 SSL_library_init();
 fp=fopen("public.pem","r");
 PEM_read_RSAPublicKey(fp,&rsa,NULL,NULL);
 fclose(fp);
 size=RSA_size(rsa);
 rb=malloc(size);
 wb=malloc(size);
 while((i=fread(rb,1,size,stdin))>0){
  j=RSA_public_decrypt(i,rb,wb,rsa,RSA_PKCS1_PADDING);
  if(j<=0)
   return EXIT_FAILURE;
  fwrite(wb,1,j,stdout);
 }
 free(rb);
 free(wb);
 RSA_free(rsa);
 return EXIT_SUCCESS;
}
を中身とするファイル"dec.c"を作成して
$ gcc dec.c -lcrypto -lssl
$ ./dec < 2 > 3
とするとファイル"2"を公開鍵ファイル"public.pem"で暗号化したファイル"3"が得られ、
"1"と"3"の内容は同一となります。

もし公開鍵をCのソースファイルに埋め込みたいなら、
先の"dec.c"で鍵をファイルから読み込んだ後のrsa->n->dの指し示すメモリから256バイトを
読み取ってメモしておき、
 fp=fopen("public.pem","r");
 PEM_read_RSAPublicKey(fp,&rsa,NULL,NULL);
 fclose(fp);
の代わりに
 unsigned char pubkey[]={
  <256バイトの鍵データ>
 };      
 rsa = RSA_generate_key(1024,65537,NULL,NULL);
 memcpy(rsa->n->d,pubkey,sizeof(pubkey));
を実行してやればうまくいくっぽいです。結構強引ですが動いています。
ちなみにこれの代わりに
 unsigned char pubkey[]={
  <256バイトの鍵データ>,
  <16バイトのダミーデータ(0x00)>
 };      
        RSA rsa1;
        BIGNUM e,n;
        RSA_METHOD method;
        unsigned long long ed=65537;

        rsa = RSA_generate_key(1024,65537,NULL,NULL);
        if(!rsa){
                fprintf(stderr,"failed to generate\n");
                return EXIT_FAILURE;
        }
        memset(&rsa1,0,sizeof(RSA));
        memcpy(&method,rsa->meth,sizeof(RSA_METHOD));
        rsa1.meth=&method;
        RSA_free(rsa);
        rsa=&rsa1;
        memset(&e,0,sizeof(BIGNUM));
        memset(&n,0,sizeof(BIGNUM));
        rsa->references=1;
        rsa->flags=6;
        rsa->e=&e;
        rsa->e->d=&ed;
        rsa->e->top=1;
        rsa->e->dmax=1;
        rsa->e->flags=1;
        rsa->n=&n;
        rsa->n->d=pubkey;
        rsa->n->top=16;
        rsa->n->dmax=17;
        rsa->n->flags=1;
でもいけました。ただし64ビット処理系です。
なおRSA_generate_key()は処理関数へのポインタを得るためだけに実行しています。
実体はライブラリ上でstatic宣言されているので直接関数名を指定することができず、
このような形になっています。

また、試していませんが秘密鍵を埋め込みたい場合は、
rsaポインタのe,d,p,q,dmp1,dmq1,iqmpの各メンバ変数のdプロパティについて
同様に処理するといけるような気がします。
もしやるなら"bn.h"の"struct bignum_st"や"rsa.h"の"struct rsa_st"を見ながら
トライしてみてください。

2013年7月1日月曜日

任天堂第73期定期株主総会参加記

先週任天堂の株主総会が開催されました。そして参加してきました。
場所は京都の任天堂本社社屋です。

なお、総会の内容については、当日少し書いていますし、
発表内容は基本的に同社のIRサイト
第73期 定時株主総会招集ご通知で公開されていますし、
質疑応答も文書化されているのでそちらをご覧ください。
ここではそういうことには触れません。
なお質疑応答の文書についてはその場の雰囲気はともかく、
私が読む限りプライバシーに関わる部分をのぞけば内容的にほぼ加工なくまとめられています。
いやまあトンカツの件はさすがに削られてますが。

私は開始一時間ほど前に最寄り駅に着いたのですが、
改札を出ると社員の方が案内板を持って立っておられたので、
もう会場に入れるか訪ねたところ、大丈夫との返事をもらいました。
もしまだならどこかで時間を潰そうかと考えていたのですが、
途中にはコンビニぐらいしか見当たりません。
京都駅から歩いても20分ぐらいの所なので喫茶店くらいあるかと思っていたのですが、
東京や大阪のど真ん中のようにはいかないようです。
で、歩いていくと曲がり角ごとに案内係が配置されていました。

本社の門の前に行くと、警備の方や社員の方の案内でロビーに通されます。
窓越しに見るとロビーにソファーがあったので少し休もうかと思ったのですが、
議決権行使書を確認後有無を言わさず7階の大会議室に通されました。
もちろん株主総会なので総力を上げてはいるのでしょうが、
結構な社員の方が案内等しており、
なんだか間接部門が肥大化しているようにも見え、
今後の業績が若干心配になったのは私だけでしょうか?
これほどの大規模な株主総会に参加するのは初めてなので驚きましたが、
こんなものなのかもしれません。

エレベータを7階で降りると議決権行使書と引き換えにお土産をもらいました。
Wiiをイメージしたような(勝手な思い込み?)任天堂印の白い紙バックに
ペットボトルのお茶とポケモントランプと缶入りのポケモンのお菓子が入っていました。

紙バックとお菓子の空き缶は何かに使いまわすつもりです。

大会議室はかなりの広さがありましたが、
私は早く着いたこともあってかなり前のほうに座ったため、
総会中の後ろのほうの様子は確かめられませんでした。
開始前は一心不乱にすれちがい通信の処理をしていましたし、
終了後はエレベータ2基でのピストン輸送が予想されたため、
混雑が解消されるまでそのまま座っており、会議室の全体像は把握できませんでした。
よくわかりませんが、質疑応答の際に聞こえた整理番号から察するに
株主は1000人ぐらい参加していたかもしれません。
ちなみに、現本社社屋のすぐ近くにさらに大きな自社ビルが建設中で、
その様子からすると来年の総会の会場は新しい社屋になるかもしれません。



こちらのほうが最寄り駅に近くてよさそうです。

総会は会社側からの業績や議案についての説明をとっとと行い、
びっくりするぐらい早く質疑応答へと入りました。
株主は大きく分けると完全に投資目的な方とゲームファンよりの方の二種になるようですが、
後者と思われる質問者はちょっとしたネタを入れてきたりして会場の笑いを誘うような場面もありました。
株価は上場来高値から比べると恐ろしく沈んでおり、
比較的高値でつかんだ前者にとっては笑ってる場合でないと言いたいでしょうが、
後者は私と同様比較的安価になってから買った方も多いと想像でき、
そういうのもあってわりと和やかだったのかもしれません。
正午には終了し、隣に座っておられた投資目的の年配の男性に話しかけられて、
5分ほど意見(自論を展開?)を交わしましたが、
会場でNintendo3DSを開いて遊んでいる
多数のゲームファンとのギャップを感じておられるようでした。

建物から出ると多数の株主が社屋の写真を撮っておられ、
いつでもストリートビューで見られるのに、と思いつつ私もパチリ。



その後の京都観光のために一眼ミラーレスLUMIX GF3を持っていたのでした。
ついでに3DSで立体写真もパチリ。




さて、株主総会では多数の3DSユーザがすれちがいまくっていました。
昨年ならピース集めとすれちがい伝説だけだったので処理はすばやくできたのでしょうが、
この一週間ほど前からすれちがい通信がパワーアップし、
増えた4つのゲームを処理するのが大変でした。
とにかく"すれちがいシューティング"には時間がかかり、
"すれちがい迷宮"も最適化しようとするといろいろ手間がかかります。
ということで一部のMiiにはピース集めだけでスルーしてもらいました。
岩田社長の発言(口頭)によれば新しいすれちがいの有料コンテンツは
一週間で20万ほどのユーザが購入したそうです。

株主総会(前後含む)で結果的には46人のMiiとすれちがうことができました。
おかげでいろいろとゲームが進みました。
みなさん全国各地からいらしていたようで、北海道の方ともすれちがえました。
一番遠かったのはなんとニューヨークです。が、どうも違うような…
ちなみにスペシャルMiiは宮本専務(緑+ルイージ帽)だけでした。
岩田社長のは配ってなかったんですかね?
もしかするともっと出入り口の近くに座ったほうが数を稼げたのかも、
と思っても後の祭りです。

任天堂の株式については長期保有を前提に所有しているので、
来年の株主総会にも出る気満々なのですが、
今期はWiiUをトントンにまで持っていけないとしても、
3DSで稼ぐ利益を大きく削るような状況は脱してほしいものです。
年末にはWiiUのゲームもそろってきますし、そんなに悲観はしていないんですけどね。