トップ 最新 追記
【ソース+水=麦茶色の何か】

半期 四半期 全カテゴリ

今日の一言


2011/08/02(Tue) 蕎麦だと思って買ったものが、実は刻みハムだった件 [長年日記] 編集

_ [Windows][MSOffice]Windowsで複数のExcelをそれぞれ独立した新しいウィンドウで開くようにする

参考:

http://www.trickpalace.net/windows/tips/excel.open.window.htm
http://un-title.cocolog-nifty.com/blog/2010/09/windows-7-excel.html
http://www.nda.co.jp/memo/win7ext_edit/
http://sukumiu.blog99.fc2.com/blog-entry-921.html
http://www.excel.studio-kazu.jp/kw/20051025153207.html
http://pasofaq.jp/windows/mycomputer/vistafolderoptions.htm

注意点

本操作によって、ファイルが開けなくなる等の問題が起きる可能性があります。あくまで自己責任でお願いします。

特に、Vista以降については、直接レジストリを編集することになるため、XP以上に危険を伴います。

Windows XPの場合

Windows XPの場合は、GUIからコンテキストメニューの設定が出来る。

 1. エクスプローラのメニューバーから「ツール」⇒「フォルダ オプション」を開く
 2. 「ファイルの種類」タブを選択
 3. 「登録されているファイルの種類」から、拡張子が「XLS」で、ファイルの種類が
    「Microsoft Excel ワークシート」のものを探し出し、選択
 4. 「詳細設定」をクリックし、「ファイルの種類の編集」ダイアログを表示
 5. 「新規」をクリックし、「新しいアクション」ダイアログを表示
 6.  「アクション」に適当な名前(新しいウィンドウで開く、等)を入力
 7. 「参照」をクリックし、起動させたいExcelの実行ファイル(EXCEL.EXE)を開く
 8. 「アクションを実行するアプリケーション」にEXCEL.EXEのパスが入力されるので、
    それに続けて、半角スペース1個で区切りを入れて"%1"を入力
   (例)"C:\Program Files\Microsoft Office\OFFICE11\EXCEL.EXE" "%1"
    ※パスに半角スペースが入るため、ダブルクォーテーションは必須
 9. 「OK」をクリックし、フォルダオプションを閉じる

これで「.xls」ファイルを右クリックした際に表示されるコンテキストメニューに「新しいウィンドウで開く」が追加される。

また、ダブルクリックした際の動作に「新しいウィンドウで開く」を割り当てるには、上記の 9. に続けて、以下の設定を行えばいい。

10. 「アクション」に 6. で入力した名前(新しいウィンドウで開く、等)が追加されているので、それを選択。
11. 「規定に設定」をクリック
12. 「OK」をクリックし、フォルダオプションを閉じる

なお、Office 2007以降についても同様の手法で設定できるが、その場合、拡張子は「.xlsx」になることに注意する。

また、元に戻したい場合は、「開く」選択して「規定に設定」をクリックした後、新規で追加した「アクション」を(新しいウィンドウで開く、等)を削除すればいい。

Windows VistaおよびWindows 7の場合

Windows Vistaおよび7では、フォルダオプションから「ファイルの種類」タブが無くなっている。

そのため、ここでは直接レジストリをいじることで、コンテキストメニューの追加を行う。

なお、レジストリの操作は非常に危険なため、あくまで自己責任でお願いします。以下の作業によって何らかの不具合が起きたとしても、私は責任を持てません。

また、万が一に備え、作業前にレジストリ等のバックアップを取ることをおすすめします。

登録されているファイル拡張子への関連付けを確認する

コマンドプロンプトで以下のコマンドを実行する(実際に入力するのは>以降のみ)。

C:\> assoc .xls

すると、

.xls=Excel.Sheet.8

という答えが返ってくるので、「.xls」という拡張子は「Excel.Sheet.8」というファイルタイプに関連付けされていることが分かる。

また、

C:\> assoc .xlsx

と打つと、

.xls=Excel.Sheet.12

という答えが返ってくるので、「.xlsx」という拡張子は「Excel.Sheet.12」というファイルタイプに関連付けされていることが分かる。

レジストリの編集

先ほど得られたファイルタイプの情報を元に、レジストリを編集する。

1. 「スタートメニュー」の「プログラムとファイル名の検索」に「regedit.exe」と入力し、エンター
2. レジストリエディタが起動
3. 「HKEY_CLASSES_ROOT」中の「Excel.Sheet.8」の「shell」の下に、
   適当な名前(新しいウィンドウで開く、等)でキーを作成
4. 作成したキーの下に、更に「command」キーを作成
5. 「command」キーの「(既定)」の値を、次の様に変更する。
   "C:\Program Files (x86)\Microsoft Office 2003\OFFICE11\EXCEL.EXE" "%1"
    ↑自分の環境でEXCEL.EXEがインストールされているパスを指定すること。
   ※パスに半角スペースが入るため、ダブルクォーテーションは必須

これで「.xls」ファイルを右クリックした際に表示されるコンテキストメニューに「新しいウィンドウで開く」が追加される。

また、ダブルクリックした際の動作に「新しいウィンドウで開く」を割り当てるには、上記の 5. に続けて、以下の設定を行えばいい。

6. 「HKEY_CLASSES_ROOT」中の「Excel.Sheet.8」にある「shell」の「(既定)」の値を
   「Open」から、3. でつけたキーの名前(新しいウィンドウで開く、等)に変更する。

もし変更が反映されていない場合は、一度OSを再起動すれば反映されるはず。

また、Office 2007以降についても同様の手法で設定できる。

その場合には、拡張子は「.xls」だけでなく「.xlsx」もあるため、「Excel.Sheet.8」に加えて、「Excel.Sheet.12」にも同様の登録を行う必要がある。

なお、元に戻すには、「shell」の「(既定)」の値を「Open」に戻した後、3. で作成したキーを削除すればいい。

_ [Mac]Macでバイナリ形式のplist(プロパティリスト)をエディタで編集可能なXML形式に変換する

参考:

http://www.itmedia.co.jp/enterprise/articles/0705/14/news013_2.html
http://l-w-i.net/t/macosx/plist_002.txt
  • XML形式へ変換する場合
% plutil -convert xml1 -o <出力ファイル名> <変換元のplistファイル>

なお、「-o」オプションで出力ファイルを指定しないと、変換元のファイルに上書きされてしまうので注意すべし。

XML形式に変換した後は、emacs等のエディタで編集可能となり、Windows上でも編集できる。

なお、バイナリ形式への変換は以下のようにすればいい。

  • バイナリ形式へ変換する場合
% plutil -convert binary1 -o <出力ファイル名> <変換元のplistファイル>

こちらも、「-o」オプションで出力ファイルを指定しないと、変換元のファイルに上書きされてしまうので注意すべし。

また、「plutil」を使うことで、plistの文法チェックも可能である。

  • plistの文法チェック
% plutil -lint hogehoge.plist

2011/08/07(Sun) カラオケ行った! [長年日記] 編集

_ [Android][OpenAL][Linux][FC][Debian][Ubuntu][Windows]AndroidでOpenALを使ってオーディオアプリを作成する

参考:

http://pielot.org/2010/12/14/openal-on-android/
http://blog.livedoor.jp/itahidamito/archives/51671451.html

OpenAL (Open Audio Library)は、マルチチャンネル3次元定位オーディオを効率よく表現するように設計されたクロスプラットフォームのオーディオAPIです。

ここでは、Android上でこのOpenALを使う方法を説明します。

はじめる前に

ここで紹介する方法は、基本的には上記の参考URLで紹介されていた内容に、若干の修正と補足を加えたものです。

参考までに、私が作成したプロジェクトをこちら(http://akihiro-i.net/~akihiro-i/public_files/20110807_MyHelloOpenAL.zip)に置いておきます。

なお、Androidの開発環境とNDKは既に準備されているものとします。これらについては、以下のページを見てください。

Windows7(64bit)でAndroidの開発環境を整える

Windows7(64bit)でAndroid NDKを使ってみる

Ubuntu上でAndroidの開発環境を整える

Ubuntu11.04でAndroid NDKを使ってみる

説明はWindows上でcygwinを使った場合で書いていますが、Ubuntu等のLinuxからでも同様の方法で利用できると思います。

「MyHelloOpenAL」プロジェクトを作成する

eclipseの新規作成から、Androidプロジェクトを作成してください。特別な設定は不要です。

ただし、ndk-buildでエラーが出るため、プロジェクトはPATHに空白が含まれない場所に作成する必要があります。

Android用に修正されたOpenALのソースコードをダウンロード

こちら( http://repo.or.cz/w/openal-soft/android.git )から最新版のソースをDLします。

以下の説明ではこのバージョン(http://repo.or.cz/w/openal-soft/android.git/snapshot/ea44b95252ce15dd38fb7563477e9e35b1c147dc.tar.gz)のソースを使用します。

ダウンロードしたファイルを解凍し、先ほど作成した「HelloOpenAL」プロジェクトにコピーします。

OpenALをコンパイルための準備

コピーしたフォルダ名を「android」から「openal」へ変更してください。 さらに、サブフォルダの「android」も「openal」へ変更します。

<PROJECT_HOME>/android/android
⇒ <PROJECT_HOME>/openal/openal

次にconfig.hをincludeへコピーします。

<PROJECT_HOME>/openal/openal/jni/config.h

から、

<PROJECT_HOME>/openal/include/

へコピーしてください。

  • Android.mkの作成

まず<PROJECT_HOME>へjniフォルダを作成します。

 <PROJECT_HOME>/jni

その中に、下記の内容でAndroid.mk(makefileのようなもの)を作成します。

TARGET_PLATFORM := android-3
ROOT_PATH := $(call my-dir)


##################################################################################
include $(CLEAR_VARS)

LOCAL_MODULE     := openal
LOCAL_ARM_MODE   := arm
LOCAL_PATH       := $(ROOT_PATH)
LOCAL_C_INCLUDES := $(LOCAL_PATH) $(LOCAL_PATH)/../openal/include $(LOCAL_PATH)/../openal/OpenAL32/Include
LOCAL_SRC_FILES  := ../openal/OpenAL32/alAuxEffectSlot.c \
                   ../openal/OpenAL32/alBuffer.c        \
                   ../openal/OpenAL32/alDatabuffer.c    \
                   ../openal/OpenAL32/alEffect.c        \
                   ../openal/OpenAL32/alError.c         \
                   ../openal/OpenAL32/alExtension.c     \
                   ../openal/OpenAL32/alFilter.c        \
                   ../openal/OpenAL32/alListener.c      \
                   ../openal/OpenAL32/alSource.c        \
                   ../openal/OpenAL32/alState.c         \
                   ../openal/OpenAL32/alThunk.c         \
                   ../openal/Alc/ALc.c                  \
                   ../openal/Alc/alcConfig.c            \
                   ../openal/Alc/alcEcho.c              \
                   ../openal/Alc/alcModulator.c         \
                   ../openal/Alc/alcReverb.c            \
                   ../openal/Alc/alcRing.c              \
                   ../openal/Alc/alcThread.c            \
                   ../openal/Alc/ALu.c                  \
                   ../openal/Alc/android.c              \
                   ../openal/Alc/bs2b.c                 \
                   ../openal/Alc/null.c                 \

LOCAL_CFLAGS     := -DAL_BUILD_LIBRARY -DAL_ALEXT_PROTOTYPES
LOCAL_LDLIBS     := -llog -Wl,-s

include $(BUILD_SHARED_LIBRARY)

##################################################################################

OpenALのコンパイル

cygwinを起動し、プロジェクトのディレクトリへ移動

$ cd /cygdrive/c/eclipse/workspace/MyHelloOpenAL

ndk-buildにより、Android.mkの記述に従ってコンパイルを開始。

$ ndk-build

※nkd-buildが実行できない場合は、NDKがインストールされていないか、パスが取っていない可能性があります。

コンパイルが成功したら、「<PROJECT_HOME>/libs/armeabi」に「libopenal.so」が生成されます。

  • アクティビティにネイティブインタフェースを定義

MyHelloOpenAL Activityに、ネイティブメソッド「play」を定義します。

プロジェクトを以下のように修正してください。

※ package は自分の環境に合わせて書き直すこと。

※ play()で呼び出すwavファイルのパスと名前も、実際に使用するAndoridの環境にあわせて修正してください。

package net.akihiroi.MyHelloOpenAL;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;

public class MyHelloOpenAL extends Activity {
   /** Called when the activity is first created. */
   @Override
   public void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.main);

       System.loadLibrary("openal");
       System.loadLibrary("openaltest");
       int ret = play("/mnt/sdcard/external_sd/wav/test.wav");
       Log.i("HelloOpenAL", ""+ret);
   }

   private native int play(String filename);
}

ネイティブメソッドの作成

まず、<PROJECT_HOME>に移動し、

$ javah.exe -classpath bin -d jni net.akihiroi.MyHelloOpenAL.MyHelloOpenAL

として、<PROJECT_HOME>/jniに「net_akihiroi_MyHelloOpenAL_MyHelloOpenAL.h」というヘッダファイルを作成します。

続いて、<PROJECT_HOME>/jniフォルダに、ネイティブメソッドの元となるCのコードを作成します。

WindowsやLinux等では、ALUT(OpenAL Utility Toolkit)をしようすることで簡単にwavファイル等が扱えるのですが、現状では、ALUTをAndroidで動かすことは困難なため、wavファイルを読み込んでバッファに入れる関数も作成します。

ファイル名は「net_akihiroi_MyHelloOpenAL_MyHelloOpenAL.c」とし、以下の内容を記述します。

ここで、C/C++ の 「Java_net_akihiroi_MyHelloOpenAL_MyHelloOpenAL_play()」関数が、Javaの「net.akihiroi.MyHelloOpenAL.MyHelloOpenAL.play()」ネイティブメソッドと対応します。

プロジェクトのパッケージ名にあわせて関数名を修正してください。

#include "net_akihiroi_MyHelloOpenAL_MyHelloOpenAL.h"

#include <stdio.h>
#include <stddef.h>
#include <string.h>
#include <AL/al.h>
#include <AL/alc.h>


typedef struct {
  char  riff[4];//'RIFF'
  unsigned int riffSize;
  char  wave[4];//'WAVE'
  char  fmt[4];//'fmt '
  unsigned int fmtSize;
  unsigned short format;
  unsigned short channels;
  unsigned int samplesPerSec;
  unsigned int bytesPerSec;
  unsigned short blockAlign;
  unsigned short bitsPerSample;
  char  data[4];//'data'
  unsigned int dataSize;
}BasicWAVEHeader;


//WARNING: This Doesn't Check To See If These Pointers Are Valid
char* readWAV(char* filename,BasicWAVEHeader* header){
   char* buffer = 0;
   FILE* file = fopen(filename,"rb");
   if (!file) {
       return 0;
   }

   if (fread(header,sizeof(BasicWAVEHeader),1,file)){
       if (!(//these things *must* be valid with this basic header
           memcmp("RIFF",header->riff,4) ||
           memcmp("WAVE",header->wave,4) ||
           memcmp("fmt ",header->fmt,4)  ||
           memcmp("data",header->data,4)
       )){

           buffer = (char*)malloc(header->dataSize);
           if (buffer){
               if (fread(buffer,header->dataSize,1,file)){
                   fclose(file);
                   return buffer;
               }
               free(buffer);
           }
       }
   }
   fclose(file);
   return 0;
}

ALuint createBufferFromWave(char* data,BasicWAVEHeader header){

   ALuint buffer = 0;
   ALuint format = 0;
   switch (header.bitsPerSample){
   case 8:
       format = (header.channels == 1) ? AL_FORMAT_MONO8 : AL_FORMAT_STEREO8;
       break;
   case 16:
       format = (header.channels == 1) ? AL_FORMAT_MONO16 : AL_FORMAT_STEREO16;
       break;
   default:
       return 0;
   }

   alGenBuffers(1,&buffer);
   alBufferData(buffer,format,data,header.dataSize,header.samplesPerSec);
   return buffer;
}


JNIEXPORT jint JNICALL Java_net_akihiroi_MyHelloOpenAL_MyHelloOpenAL_play
 (JNIEnv * env, jobject obj, jstring filename) {

       // Global Variables
       ALCdevice* device = 0;
       ALCcontext* context = 0;
       const ALint context_attribs[] = { ALC_FREQUENCY, 22050, 0 };

       // Initialization
       device = alcOpenDevice(0);
       context = alcCreateContext(device, context_attribs);
       alcMakeContextCurrent(context);

       // Create audio buffer
       ALuint buffer;
       const char* fnameptr = (*env)->GetStringUTFChars(env, filename, NULL);
       BasicWAVEHeader header;
       char* data = readWAV(fnameptr,&header);
       if (data){
           //Now We've Got A Wave In Memory, Time To Turn It Into A Usable Buffer
           buffer = createBufferFromWave(data,header);
        if (!buffer){
               free(data);
               return -1;
           }

       } else {
           return -1;
       }

       // Create source from buffer and play it
       ALuint source = 0;
       alGenSources(1, &source );
       alSourcei(source, AL_BUFFER, buffer);

       // Play source
       alSourcePlay(source);

       int        sourceState = AL_PLAYING;
       do {
           alGetSourcei(source, AL_SOURCE_STATE, &sourceState);
       } while(sourceState == AL_PLAYING);

       // Release source
       alDeleteSources(1, &source);


       // Release audio buffer
       alDeleteBuffers(1, &buffer);

       // Cleaning up
       alcMakeContextCurrent(0);
        alcDestroyContext(context);
        alcCloseDevice(device);

        return 0;
}

ネイティブメソッドをコンパイル

下記の記述をAndroid.mkに追記してください。

###############################################################################

include $(CLEAR_VARS)

LOCAL_MODULE     := openaltest
LOCAL_ARM_MODE   := arm
LOCAL_PATH       := $(ROOT_PATH)
LOCAL_C_INCLUDES := $(LOCAL_PATH)/../openal/include
LOCAL_SRC_FILES  := net_akihiroi_MyHelloOpenAL_MyHelloOpenAL.c 	\

LOCAL_LDLIBS     := -llog -Wl,-s

LOCAL_SHARED_LIBRARIES := libopenal

include $(BUILD_SHARED_LIBRARY)

###############################################################################

書き直したら、再度コンパイルしてください。

$ ndk-build

エラーがなければ、libopenaltest.soが作成されるはずです。

実行前の準備

デバイスのSD Cardに、OpenALで再生するための.wavファイルを準備します。

上記のプロジェクトでは

       int ret = play("/mnt/sdcard/external_sd/wav/test.wav");

と記述しているため、外部SDカードの直下に"wav"という名前でフォルダーを作成し、「test.wav」という名前のモノラルの.wavファイルを置いてください。

※パスとファイル名は、自分の環境に合わせて変更していただいて結構です。

実機で実行してみる

Android端末を『USBデバック』モードで接続し、eclipseから実行。

もしくは、とりあえずエミュレータで動かし、「bin」以下に作成される「MyHelloOpenAL.apk」をAndroid端末にコピーしインストールして実行します。

問題がなければ、画面の生成時に、指定したwavファイルが読み込まれて音が鳴ります。

※音が鳴るのはアクティビティの生成時なので、画面を回転させた場合にも鳴る。

最後に

ここまでの説明で、AndroidでOpenALを使ったオーディオアプリの作成が出来るようになったはずです。

あとは斬新なアイデアを組み込むなり、OpenALを勉強するなりして、面白いアプリを作ってください。

本Wikiでも紹介しているOpenAL、OpenGL、OpenCVを組み合わせれば、大抵のAndroidアプリは簡単に作成できると思います。


2011/08/10(Wed) やべぇ、今日TOEICだ。 [長年日記] 編集

_ [Android][GALAXY S]AndroidでSkypeを自動的にオフライン(オンライン)にする方法

2011/08/10現在、AndroidマーケットからインストールできるSkype(Ver 2.1.0.46)の場合

Skypeは一度起動すると、基本的には裏で常駐し続けるためバッテリーの消費等が激しくなる。

Skypeを完全に終了させるには、Skypeからサインアウトしたあと、タスクキラー用のアプリでSkypeを完全に終了させる必要があるが、一度サインアウトしてしまうと、次に起動させた際に再度ユーザ名やパスワード等を入力してサインインする必要があるため、頻繁に使う場合はやや煩雑である。

そこで、ログアウトはせずに、必要なときだけSkypeをオンラインにすることを推奨する。

方法は以下のとおり。

1. Skypeを起動し、ホーム画面を開く
2. 『メニューボタン』を押し、「メニュー」から「設定」を開く
3. 「オフラインにする」を選択
4. 「今すぐ」にチェックを入れる

これで、Skypeが前面に表示されていない場合(例えば『ホームボタン』を押してSkypeをバックグラウンドに移動させた場合など)には自動的にSkypeが『オフライン』になり、Skypeのアイコン等をクリックしてホーム画面を表示すれば、自動的に『オンライン』になる。

具体的にどの程度の効果があるかは不明だが、常にオンラインよりは消費電力は少ないと思われる。


2011/08/19(Fri) GW3.5AX2-SU2のランプが明るすぎて夜でも安心! [長年日記] 編集

_ [Windows]Windows7でエクスプローラーの検索履歴を削除する方法

Windows 7では、エクスプローラの検索履歴が保存されるようになっている。

ここでは、その検索履歴を削除する方法を説明する

1. 検索窓を選択し、検索履歴を表示する
2. 削除したい文字列の上にマウスを持っていく
(選択した文字列の背景が青くなるはず)
3. DELキーを押す

また、DELキーを押し続けると連続して履歴を消すことが出来、消した場所には下の文字列が繰り上がってくる。

なので、全て消去したい場合は、一番上の文字列を選択してDELキーを押し続ければいい。


2011/08/22(Mon) あと4日でクエスト開始か。 [長年日記] 編集

_ [Windows]Microsoft Office Wordで見出しマップの章番号が表示されない場合

参考:

http://support.microsoft.com/kb/288830/ja

「改ページ」や「段区切り」の直後の段落の場合、章番号が表示されないという仕様のようだ。

(Word97、2003で確認。それ以外でも起きるのかは不明)

この場合、

改ページや段区切りの後に、一行以上の空白行を入れる

もしくは、

セクションで区切る

ことで章番号が表示されるようになる。

_ [Windows]無料で使える多言語対応のテキストエディタ(EmEditor)

フリーソフトのテキストエディタは多々あるが、Unicodeに対応したものとなるとかなり限定される。

そこで、ここではUnicode対応のテキストエディタである「EmEditor」を紹介する。

公式HPはこちら(http://jp.emeditor.com/)。

EmEditorには、基礎的な機能のみを備えた「EmEditor Free」(フリーウェア)と、より高性能な「EmEditor Professional」(シェアウェア)がある。

「EmEditor Free」へのリンクがやや見つけにくいので、以下にURLを載せる。

http://jp.emeditor.com/modules/download2/rewrite/tc_5.html

(問題があれば削除します)

もちろん「EmEditor Professional」のほうが圧倒的に優秀なエディタであるが、単にUnicodeのテキストを読み書きするだけであれば「EmEditor Free」でも十分使える。

多言語対応のテキストエディタが欲しいなら、おそらくコレを使うのが一番確実。