2009년 11월 14일 토요일

RAMディスクの使い道2

RAMディスクの使い道

| | コメント(0) | トラックバック(0)

ちょいと前に余ってるメモリをRAMディスク化する方法を紹介しましたが、

今回は作ったRAMディスクの使い道についてです。

 

っても1Gにも満たない容量しかないので使い道は限られてくるのですが、

僕が使っているのは

 

  • IE、firefoxのキャッシュ
  • OSの仮想メモリ

 

ぐらいです。

 

IEやfirefoxの設定は簡単なので説明は省きますが、仮想メモリについては普段変更する機会がなく、すぐ忘れそうなので備忘録として下記に記します。

 

1.まず、「システムのプロパティ」を開きます。

「コントロールパネル」→「システム」→「システムの詳細」へと進んでください。

2.「詳細設定」のタブを開き、パフォーマンスの設定ボタンを押下します。

 

memory01.jpg

 

3.「パフォーマンス オプション」の窓が開くので、これまた「詳細設定」のタブを開き、

仮想メモリの設定ボタンを押下します。

 

memory02.jpg

 

4.「仮想メモリ」の窓が開くので、↓の画像のようにRamdiskに仮想メモリを割り当て、

その他のドライブは割り当てずにこれまた設定ボタンを押下。

 

memory03.jpg

 

5.設定できたらエクスプローラで割り当てたRamDiskに「TEMP」フォルダが出来ているか確認しましょう!

 

ほんとはメモリの1.5倍程度を仮想メモリに割り当てるといいらしいのですが、

さすがにそんなに余っているはずもなく・・・500MBしか割り当てられませんでした。

まぁ、OSに使用されるメモリが3Gもあるので仮想メモリなんていらないっちゃいらないんですがねw

RAMディスクの使い道

 前回作ったRAMディスクですが、私はかなり便利に使っています。2万円弱払って2GBx4のメモリに載せ替える程度には便利です。

1つは、圧縮ファイルの操作の時。一時的な展開先をRAMにしておけば、かなり高速に操作できます。特に小さいファイルが大量に含まれている物(プログラムのソースコードなんかその典型)には有効です。

また、一時的に圧縮したファイルを置いておいて、そこから目的の場所へ移動させるときにも使っています。(私はRAIDを組んでいるのですが、RAMからのコピーだと、この速度が遺憾なく発揮できるのがちょっと嬉しい(笑)。同じRAID内でのコピーだと速度でないんですよね〜)

もう一つはキャッシュ。画像ビュアーのキャッシュファイルやブラウザのキャッシュなどを置いておくと結構速度アップします。

でも、ブラウザのキャッシュ場所の変更って結構面倒なんですよね。その点、簡単なIEはちょっと良い感じです。これに関しては。

とりあえず、私が通常使うFirefoxと時々使うSafariのキャッシュ場所変更方法。

Firefoxはプロファイルディレクトリ(ちなみに、プロファイルの追加や編集はFirefoxの起動時に"-p"オプションを付けると可能です)に"user.js"というファイルを作り、

user_pref("browser.cache.disk.parent_directory","B:\\TEMP\\Firefox\\Normal");

と記述するだけ。私の場合、RAMをBドライブにしてあるので、上記のような感じ。 フォルダの作成は

mkdir b:\temp\Firefox\Normal

とでも記述したバッチファイルを作り、スタートアップに入れておけばいいでしょう。

Safariは結構面倒です。キャッシュファイルは"C:\Documents and Settings\[ユーザー名]\Local Settings\Application Data\Apple Computer\Safari\Cache.db"なのですが、これを移動する手段がありません(たぶん)。

仕方ないので、シンボリックリンクで回避します。まず、シンボリックリンクを作成するツールをインストールします(ツールについてはググってくださ い。注意書きとか良く読んで使いましょう)。次に、ほぼ空のキャッシュファイルを作ります。Safari上からキャッシュをクリアして、すぐに終了するの が良いでしょう(ちなみに、キャッシュファイルはSQLiteのデータベースファイルみたいです)。

できたファイルを適当な場所(私はCドライブのルート)にコピー、その後、スタートッアップで実行するバッチファイルを作ります。

mkdir b:\temp\safari
copy c:\Cache.db b:\temp\safari
ln -s "B:\TEMP\safari\Cache.db" "C:\Documents and Settings\[ユーザー名]\Local Settings\Application Data\Apple Computer\Safari\Cache.db"

まぁ、簡単ですね。1行目でキャッシュを置くフォルダを作り、2行目で上記のほぼ空のキャッシュファイルをコピー、3行目で、元のキャッシュファイルの場所にシンボリックリンクを作成しています(元のキャッシュファイルは削除しておきます)。

うーむ、Firefoxはともかく、Safariの方はもうちょっと簡単にキャッシュの場所を移動できればいいのに。もしかすると、隠しコマンドでもあるのかねぇ?

大容量のRAMディスクを作ってみる

32ビットのOSを使うと、環境によって若干違いますが、通常、3GB少々しか使用できません。

で、少しPCに詳しい人の一般的な発想として「OSの管理外でRAMにできないか」と思ったりするわけですが、今までは無理というのがほぼ常識でした。


Windowsの管理領域外をRAMディスクとして利用することも可能なRAMディスクソフトGavotte Ramdisk(ガボット・ラムディスク)を導入してみました。昨日PC Watchの記事を見てさっそく導入したい欲求に駆られ導入してみたわけです。

といっても僕のマシンはWindows2000でメモリも1GBしかないので相方のマシンに導入してみました。

相方のマシンのスペックは

AMD Athlon 64 3000+、メモリ4GB、ハードディスクはSATAの160GBを2台積んで有ります。マザーボードはECSのNFORCE4-A939です。確か、2006年6月頭に組んだものだと思います。OSはWindows XP Professional SP2でメモリは3Gまで認識しているので1G位使われていない領域があることになります。現在SP3が出ていますがとりあえずまだ当てていない状態です。

とりあえず、インプレスの記事を参考に導入してみることにしました。

Windows XP - システムプロパティ
Windows XP - システムのプロパティ

【特別レポート】32bit Windowsの管理外領域をRAM Diskに使う
http://pc.watch.impress.co.jp/docs/2008/0512/ramdisk.htm

※最初に断っておきますが、Gavotte Ramdiskを導入してOS管理外領域をRAMディスクとして利用するにはかなり利用しているパソコンの環境に左右されるようですので、導入を行おうと 思う場合やトラブルに遭遇した場合は、後述のまとめWikiやサイトまた、2ちゃんねるのスレッドなどを見て自分の環境にあった導入方法を取ってくださ い。ここから失敗した話も交えて書いていきますが、簡単なようで割と敷居が高い部分もありますので導入を考えられている場合はまずはこの記事を最後まで読 んで導入するかを検討されてみてください。結論をいっちゃうと一般的なパソコン利用者の方にお勧めできないですw。また、導入の際には自己責任でお願いし ます。あと、不確定な要素が多々あります。間違いを書いてしまう可能性もあるのでよろしく。

とりあえず、作業前に現在のシステムやメモリーの状態を保存しておく意味でスナップショットをいくつか撮った。

タスクマネージャーの状態
タスクマネージャーの状態

物理メモリが3,144,112KB、利用可能なメモリが2,110,056KBあることが判る。

システム情報
システム情報

システム情報も記録した。合計物理メモリは4,096,00MBとなっている。

現在の状態を記録した後、インプレスの記事を参考にGavotte Ramdiskの導入を開始した。

  1. まず、boot.iniの書き換えを行った。

    C:ドライブ直下のboot.iniをテキストファイル で直接書き換えてもいいが、マイコンピュータ>プロパティー>詳細設定タブ>起動と回復エリアの[設定]ボタン>起動と回復の画面の起動システムエリアの [編集]ボタンをクリックするとメモ帳が表示され編集可能となる。

    boot.iniファイルの編集
    boot.iniファイルの編集

    上 記の画像の様に /PAEを追記して再起動するとXPの物理アドレス拡張モードが有効になるとある。しかし、最初のシステムのプロパティの赤線で囲ったところを見てもらう と判るように物理アドレス拡張の文字が表示されているので、もしかして既に有効になってていらないんじゃないかなーと思ったりした。

  2. boot.iniの書き換え後PCを再起動。

    PCの再起動後なんだか常駐ソフトの常駐に失敗してるエラーが出るようになった。とりあえず無視して作業を進める。
  3. 下記のページからGavotte Ramdiskをダウンロードしてくる

    中国語のページなのでかなり不安になるwww。が、ドメインが.cnではなく.twなのでなんとなく安心するw。

    無聊人的無聊小站 - 實用軟體介紹 - Gavotte Ramdisk
    http://www.chweng.idv.tw/swintro/ramdisk.php

    上記ページでrramdisk.zipをダウンロードしてください。
  4. ダウンロードしたrramdisk.zipを解凍する。

    適当に解凍してください。
  5. レジストリの追加

    rramdisk.zipを解凍して中から出てくるファイルの中にram4g.regというファイルがあるのでこれをダブルクリックするとレジストリが追加される。

    レジストリ追加確認画面
    レジストリ追加時の確認画面。

    レジストリ追加完了
    レジストリ追加完了
  6. ramdisk.exeを実行する

    解凍したファイルの中にあるramdisk.exeを実行する。最初は下の様な画面になっているので[install Ramdisk]をクリックする。これでRAMディスクのドライバなどがシステムに導入される。
    ramdisk.exe
    ramdisk.exeを起動したところ
  7. ramディスクの領域を確保する。

    インストールが完了すると下記の様になるのでそのまま[OK]を押す。明示的にディスクサイズを指定する場合は[Disk Size]で容量を選択する。これでうまくramdiskが作成されていれば成功のはずです。PCを一応再起動した方がいいようですが、しなくてもOKな 場合もあるようです。OS管理外領域へのRAMディスクへの割り当てが成功した場合、16MBのまま[OK]を押してもOSの管理外の領域全てを自動的に RAMディスクに割り当ててくれるらしいです。うちの場合だと700MBから1GB近い値が確保されることが期待できるわけです。
    ramdisk.exe:その2
    ramdisk.exe:その2

    ※ちなみにアンインストールするにはこの画面で[Remove Ramdisk]をクリックしてPCを再起動すればOKです。追加したレジストリも削除されるらしいです。
  8. トラブル

    うまく導入できたかと思ってさっそく追加されているであろうRAMディスクをエクスプローラーで確認してみた。すると上記で設定したR:ドライブが作成されていたやったーと思ったが良く見ると何かおかしい。

    作成されたRAMディスクのプロパティを見るとramdisk.exeでRAMディスクを確保した時に指定したサイズ16MB分しかRAMディスクの容量 が確保されていない。うまくいけば少なくとも700MB以上の容量のRAMディスクが作成されるはず、それに常駐に失敗ソフトもある見たいだし何かおかし い。

    一旦、7.に書いた方法でアンインストールを行い、PCの再起動を行った。そしてboot.iniに追加した/PAEの記述を削除して再度PCの再起動。今度は常駐ソフトなどがエラーを出すことなく常駐に成功した。

    そして5.の手順からやり直した。が、しかし、問題は解決せず同じ状況。試しにramdisk.exeで700MBと指定してRAMディスクを作成した ら、700MBの容量のRAMディスクを作成することが出来た。が、タスクマネージャで確認するとその分のメインメモリが減少していた。orz
    これは、完全にOSの管理外メモリ領域へのRAMディスクの領域の確保に失敗してるなということがわかったわけです。

  9. トラブル解決編

    あれこれ考えているうちにPC Watchの記事に

    >BIOSの「Memory Remap Feature」を「Enable」にする必要があったり

    とあったのを思い出して、それを試してみることにした。

    PCを再起動して起動画面で[Delete]キーを連打してBIOS画面に入った。

    メニューから[Standard CMOS Features]の項目を開いてみた。
    BIOS:メニュー
    BIOS:メニュー

    [Standard CMOS Features]の画面で[Total Memory]の項目を見ると3,144,704Kつまり3GBしかBIOSがメモリーを認識していないことが判明。

    BIOS:[Standard CMOS Features][Total Memory]
    [Total Memory]の項目を見ると3,144,704K

    これが4GBにならなければいけないわけだ。問題の[Memory Remap Feature]やまとめWikiに書いてある[use 4G]の設定項目があるか注意深く探した。最悪BIOSを最新にアップデートする必要があるかもしれないのだが、このマザーボードは謎の原因(ボード上の ジャンパーはちゃんと書込み許可にしてある。たぶん故障)でBIOSの書き換えが失敗するのでそれは避けたい。

    メニューから[Advanced Chipset Feattures]を選択して画面に入った。
    BIOSメニュー:[Advanced Chipset Feattures]
    BIOSメニュー:[Advanced Chipset Feattures]

    [DRAM Configuration]の項目が妖しそうなので中を見てみることにする。
    BIOS:[DRAM Configuration]
    BIOS:[Advanced Chipset Feattures]>[DRAM Configuration]

    [DRAM Configuration]の画面でそれらしい設定項目を見つけた[H/W memory hole Remapping]の項目が[Disabled]になっている。

    BIOS:[H/W memory hole Remapping][Disabled]
    [H/W memory hole Remapping]が[Disabled]になっている。

    BIOS:[H/W memory hole Remapping][Enabled]
    [H/W memory hole Remapping]を[Enabled]に変更した。


    [F10]キーを押して[SAVE to CMOS AND EXIT]で[Y]を選択して変更した設定を保存してPCを再起動した。
    BIOS:[SAVE to CMOS AND EXIT]
    BIOS:[SAVE to CMOS AND EXIT]

    PCの起動時のメモリーテスト(Memory Testing)で4GB(4,194,304K)認識するようになった。
    PC起動画面
    PC起動画面

    このあと再度BIOS画面に入って[Standard CMOS Features]で[Total Memory]が4GB認識していることを確認した。これでうまくいくのではないかと思った。
  10. 再度RAMディスクの導入を試みる

    boot.iniに/PAEの追加は行わず。5.からRAMディスクの導入を行ってみた。結果は成功。下記の画像の様に0.99GBつまり約1GBの RAM Diskの確保に成功した。タスクマネージャで確認したところメインメモリの減少は確認されず。OS管理外領域へのRAMディスクの割り当てに成功した。

    Ramdiskのプロパティー:0.99GB
    Ramdiskのプロパティー:0.99GB
  11. 実はこれからが本番

    OS管理領域外へのRAMディスクの作成に成功して喜んでいるのもつかの間、実際に何に使おうかと考えた。電源が切れて消えてしまっても問題ないところ。 TMPやTEMPフォルダと思ったが、IEのキャッシュやクッキーが毎回消えてしまうのはちょっと問題。コンパイラのワークエリアや圧縮解凍のワークエリ ア、RAMディスクのエリアが大きい場合は、フォトショップやイラストレーターのテンポラリ、動画編集ソフトのワークエリアぐらいしか利用方法が思いつか ない。しかもこれだと一般的なパソコン利用者の場合、RAMディスク導入のメリットが少ない。実際他の人はどういう風にこのRAMディスクを利用している のか調べることにした。
  12. 実はRAMディスクの内容をレジュームする事ができる?

    PC Watchの記事を読んだ限りでは、一般的な常識のとおりRAMディスクの内容は電源を切ると消えることが書いてあり、僕もそういうものだと思っていたの で疑問に思わなかったが、いろいろ調べてみると何だかRAMディスク内容をOS終了時にハードディスクに退避して、パソコン起動時ハードディスクから RAMディスクに復元するレジューム機能がありそうな感じだった。

    結論としてはGavotte Ramdisk単体ではムリなようです。RAMDiskImage等のツールを使ったり、自分で独自にバッチを書いたりして、PC終了時にRAMディスク の内容をハードディスクに保存しておいて、PCの起動時にハードディスクに保存しておいたRAMディスクの内容をRAMディスクに再現するとかの様です。 でも、とりあえず保存できる方法もあるということで色々使える可能性もありそうです。

    Gavotte Ramdisk まとめWIKI - トップページ
    http://www10.atwiki.jp/gavotterd/

    Gavotte Ramdisk インストール 設定方法 使い方 - GeekなNooblog
    http://d.hatena.ne.jp/sona-zip/20080512

    上記のサイトを参考にさせていただいたが、見ていると何だかGavotte Ramdisk付属のrdutil.exeを使ってなにやらやっている。よくわからないが少しずつ調べることにした。
  13. ■61氏のバッチ

    色々な情報が入り乱れていて何を参考にすればいいのかわからないし、なぜそうするのか?それでどうなるのか?とか意味のわからない文言とか色々まだ混沌としているのでいろんなところを見ながら少しずつひも解いていった。

    Gavotte Ramdisk まとめWIKIの「まとめ(仮)」のページに
    「61 :名無し~3.EXE:2008/05/11(日) 17:47:56 ID:BMng+huz
    Readmeを参考にNTFSでフォーマット後、いくつかフォルダを作って、その状態をレジストリに保存し、再起動しても再現できるようにしてみた 」
    とある。

    まずNTFSでフォーマットする意味が最初わからなかった。これは、後でジャンクションを作成する為にNTFSフォーマットでなければならない為となんとなく判る。

    ジャンクションの意味が最初わからなかったが、これは、リンクとかショートカットとかエイリアスみたいなものだと考えればいい。C:\WINDOWS \TEMPに書き込もうとする処理があったらRAMディスク上のTMPフォルダに書き込むようにしたりできるようだ。またそのためにNTFSにRAMディ スクをフォーマットする必要があるようだ。

    ちなみに、RAMディスクが作成された直後の状態をエクスプローラーのプロパティーで見ると上の方の画像の様にフォーマットはFAT32になっていた。

    詳しくは上記のまとめWIKIの該当箇所を見ていただきたいと思うが、ぱっと見面倒臭そうだなーと思った。フォルダを再現するだけなら別にいらなくね?と 最初は思っていたからである。しかしまとめWIKIのQ&Aを見ると下記の様な記述もあり。フォルダだけならまだしもなぜフォーマット情報まで再現される のだろうかと疑問に思う。もしかして、RAMディスクの内容をレジュームみたいなことができるのではないかと考えてみる。

    Q .NTFSへのフォーマットは毎回やらないとだめなの?
    A .「rdutil R: registry」が成功していれば1回やればOK

    2 ちゃんねるのスレッドを色々読んでみると実際にレジュームは可能なようだがレジストリに保存しているらしいので、レジストリに保存できるイメージの容量は 64KBまでらしく、RAMディスクにデータが一杯入っている状態でイメージ化してそれをレジュームするような使用法は不可能なようだ。RAMディスクを 作成した直後で必要なフォルダを作成してそれをイメージ化して保存する程度の機能の様です。やっぱりRAMディスクの内容をレジュームするには前述の RAMDiskImageを利用するなどの方法を取るしかないようです。

    とりあえず、まとめWIKIの「61氏のバッチ」を試してみることにした。

    詳しくは下記のサイトを見てください。

    Gavotte Ramdisk まとめWIKI - まとめ(仮)
    http://www10.atwiki.jp/gavotterd/pages/11.html

    僕は一応上記のサイトで61氏のバッチの1行1行を調べながら実行したので解説だけしておこうと思う。61氏バッチはRAMディスクドライブのドライブレ ターがZ:なのでGavotte RamdiskデフォルトのR:でRAMディスクドライブを確保した人はZ:の部分をR:に書き変えて利用する必要がある。判らない単語などはググルよろ し。

    1行目:FORMAT /FS:NTFS /Q /V:RamDisk /A:512 Z:
    FORMAT...ディスクをフォーマットするコマンド
    /FS:NTFS...ファイルシステムをNTFS形式でフォーマットする指定
    /Q ...クイックフォーマットを行う。
    /V:RamDisk ...ボリュームネームをRamDiskに指定。
    /A:512...アロケーションエリアを512Byteに指定。(Ramディスクを無駄なく利用するためと思われる)
    Z: ... Z:ドライブをフォーマット

    2行目:CHKDSK /L:2048 Z:
    CHKDSK...チェックディスクコマンド
    /L:2048...チェックディスク時などに保存されるログの容量を2048KBに指定。(ログによってRAMDISKの容量を圧迫されない様にする為だと思われる。)
    Z: ... Z:ドライブに対してCHKDSKコマンドを実行

    3行目:CACLS Z:\ /G BUILTIN\Administrators:F
    CACLS...ACLを編集するコマンド(ACLはアクセス・コントロール・リストの略)、ファイルやフォルダのアクセス権限を制御する
    Z:\...Z:ドライブにたいしてCACLSコマンドを適用。
    /G BUILTIN\Administrators:F .../Gは許可、BUILTIN\AdministratorsはAdministratorsグループを示す、:Fはフルアクセス。
    つまり、Z:ドライブにAdministratorsグループはフルアクセスできる権限を与える。

    4行目:MKDIR Z:\TEMP
    MKDIR...ディレクトリ(フォルダ)作成コマンド
    つまり、Z:ドライブにTEMPという名前のフォルダを作成するということ。

    他の行のMKDIRコマンドは作るフォルダの名前が違うだけなので省略

    10行目あたり:rdutil Z: registry
    rdutil...Gavotte Ramdiskに付属のユーティリティーコマンド、あらかじめパスが通っているところにおいておく必要がある。よくわからない場合はrdutil.exe をC:\Windowsフォルダなどのパスが通っていると思われるところに移動しておく。
    Z:...Z:ドライブに対して実行する
    registry...状態をレジストリに保存
    つまり、Z:ドライブの状態をレジストリに保存することになる。

    PCを再起動してみるとフォルダが再現されていることを確認した。

    ここまでやったら、後は実際にWindowsが利用するテンポラリのフォルダをRAMディスク上のフォルダを利用するように変更してあげます。

    ●環境変数の変更
    マイコンピュータを右クリック>メニュー>プロパティ>システムプロパティ>詳細設定タブ>環境変数
    で、TEMPやTMPとなっている環境変数に定義されているパスをRAMディスク上のTMPやTEMPのパスに置き換えます。変更したい環境変数を選択し て[編集]をクリックすると編集画面になるので、書き換える。ユーザーの環境変数とシステムの環境変数があるので両方書き換える。
    初期値は
    %USERPROFILE%\Local Settings\Temp

    %SystemRoot%\TEMP
    となっていたのでこれを
    R:\TEMPやR:\TMPと言う風にRAMディスク上のフォルダのパスを指定した。

    環境変数の編集
    環境変数の編集

    環境変数
    環境変数

    ●プリンタのスプールフォルダの変更。
    プリンタのスプールについても変更した。プリンタのスプールは
    コントロールパネル>プリンタとFAX>ファイル(F)>サーバーのプロパティ>詳細設定>スプールフォルダのところをRAMディスク上のパスに書き換える。

    初期値は
    C:\WINDOWS\System32\spool\PRINTERS
    になっていたのを
    R:\SPOOL
    に変更した。

    これで印刷時にスプールの速度が改善されるはずである。

    スプールフォルダの変更
    スプールフォルダの変更

    ●インターネットエクスプローラーのキャッシュフォルダの変更
    Internet ExplorerのキャッシュフォルダもRAMディスクに割り当てた。僕の場合IE_TMPというフォルダをRAMディスク上に作成してそこに割り当てて しまったが、実際にはR:\TEMPフォルダで問題ない。(R:\TEMPの中にTemporary Internet Filesフォルダが作成されるので)
    変更方法は
    ツール>インターネットオプション>全般タブ>閲覧の履歴>設定>フォルダの移動>フォルダの参照
    で、RAMディスク上のR:\TEMPフォルダを指定する。

    フォルダの参照
    フォルダの参照

    これでIEのキャッシュがR:\TEMPフォルダ配下のTemporary Internet Filesフォルダに格納されるようになるフォルダオプションの表示で保護されたオペレーティングシステムファイルを表示しないに設定している場合 Temporary Internet Filesフォルダは表示されないので注意です。

    この設定を行うに当たって気になる事があった、Cookie(クッキー)の事である。もしかして電源切るとCookieが消えてしまうのではないかと思っ たからだ。それもしょうがないかなと思ってPC再起動してみたら消えていなかった。実はこの所為でもしかしたらレジュームされるんじゃないのかと勘違いし ていたのだが、実際にはCookieはDocuments and Settingsフォルダ配下のユーザーフォルダの中に格納されていて、そこからPC起動時にTemporary Internet Filesフォルダにコピーされる仕組みだ。なのでRAMディスクの内容がPCの電源を切って消えても復元されるというわけです。これをみて最初「RAM ディスクの内容レジュームされるじゃん」と勘違いしてしまいましたw。しかし、試しにTEMPフォルダに何かファイルを入れて再起動をするとしっかり消え ているのでレジュームされてません、はいw。

    とりあえず、Cookieが消えることはない様なので安心しました。

    RAMディスクをIEのキャッシュにしたことによる効果ですが、確かに表示がけっこう早くなったような気がしますが、そこまで猛烈に感動するほどでもない ようです。これは、割と最近のパソコンは結構高速なのでそこまで高速に感じないのではないかと思います。(通常でも僕のマシンよりは全然はやいしw)

    あと、IE7のフィッシング詐欺の検出機能やIEのキャッシュの更新の設定が何になっているか(自動的にチェックとかチェックしないとか)とかセキュリ ティーソフト等によってRAMディスクの効果が制限されている可能性もあるかと思います。ファイルのダウンロードやFlash等の再生には大きな効果があ るかもしれません。

    ●ジャンクションの作成
    C:\WINDOWS\Tempに無理やり書き込みを行ってくる行儀の悪いインストーラー対策の為にジャンクションを作成します。

    rdutil link C:\Windows\Temp TMP

    これで、C:\Windows\Tempへの書込みはRAMディスク上、つまりR:\TMPに買い込まれるようになります。
    あらかじめC:\Windows\Temp TMPの中身は空っぽにしておく必要があります。

    ※61氏のバッチではデスクトップも移動RAMディスクにしているようですが、これは流石に怖かったのでやりませんでしたw。

    一応2ちゃんねるのスレッドにあったrdutilの使い方を保存の意味で張っておく。

    44 名前: 名無し~3.EXE 投稿日: 2008/05/13(火) 02:47:52 ID:m4pWIYyO
    rdutil utlility の使い方:
    1) 保存した状態をバックアップする
    rdutil save filename

    2) バックアップしたファイルから状態をリストアする
    rdutil load filename

    3) 保存したイメージのサイズを表示する
    rdutil R:(Rドライブの情報
    rdutil registry(保存されている状態のドライブ
    rdutil unpacked_file(パックされていないファイルをパックする

    4) 状態をレジストリに保存する。
    rdutil R: registry

    5) 状態をファイルに保存する。
    rdutil R: packed_file

    6) パックされたものをアンパックする
    rdutil unpack packed_file unpacked_file

    7) ジャンクションを作成する。(NTFS
    rdutil link temp \

    修正してみた
    寝る

  14. おつかれさまでした。
    一応こんな感じで作業終了です。

    効果の程についての感想は、様々だと思います。僕としてはよくわからない方にはリスクが大きくあまりお勧めできないって言うのが感想です。メールやウェブ サーフィンなどの一般的な使い方の方にはあまり必要ないと思います。といいますか、まずメモリが4GB以上載ってないことには今回の話はあまり意味がない と思います。今回のこれはOSの管理外領域で今まで利用できなかったメモリーがRAMディスクとして利用できることになったことに大きな意味があるかと思 います。基本的にはメインメモリーが多い方が良いわけでメインメモリーを削ってまでRAMディスクを利用する価値はほとんどの場合ないと思います。それに 最近はCPUやハードディスクがかなり早くなっているので人間の感覚では効果をあまり体感できないかもしれませんね。

    また、RAMディスクも最低でも1GBないと現在のWindowsではあまり利用する価値がないかと思います。IEのテンポラリにするにしても最近では ネットゲーなど1GB近いサイズがあるようなファイルをダウンロードすることも割とあるかと思います。そういう場合直接空きのある場所にダウンロードされ るのか、ダウンロードがエラーになるのか判りませんが、ダウンローするにしてもインストールするにしてもRAMディスクの容量が少ないとなんらかの「ファ イルが書き込めないよエラー」になってトラブル可能性があるのではないかと思います。そういうわけで手放しで誰にでもお勧めというわけには行かないかと思 います。

    あと、フォトショップやイラストレーターの仮想記憶の領域として指定する場合も仕事でDTPしてる人には1GBでは少し心もとないかと思います。できれば 8GB積んで5GBとか指定したいですよねw。フォトショップやイラストレーターでは仮想記憶用のドライブを複数指定できるようなので、とりあえずうちで も仮想記憶用のドライブとして設定しました。複数指定した場合どういう風に使われるのかしりませんがw。お絵描きする程度なら1Gでも充分かと思います。 CSとかだとDTPでもかなりファイルのサイズが小さくなるらしいと聞いたことがあるのでもしかしたらCSなら1GBでも充分使用に耐えたりするのかな? わかりませんw。

    RAMディスク導入後、当の相方は特に変わったと感じなかったようです。orz
    ですが、今日変化がありました。今日Dreamweaver(Dreamweaver8かな)を使ってホームページを弄っていたらしいのですが、いつもな らマウスがフワフワするのが無くなったと言うのです。前にアドビに問い合わせたこともあったのですが解決しなくて困っていた問題でDreamweaver 上でマウスを動かすとフワフワというかカクカクというか兎に角マウスが自分の手の動きに追従してくれないのでかなり作業のストレスがたまるらしいのです が、今日それがなくなっていたらしいです。Dreamweaver8がTEMPを使ってるのかIEのキャッシュを見てるのか判りませんが、マウスオーバー で何かファイルを見たり書いたりしてるのでしょうかね?兎に角それが改善したと喜んでいました。少しはRAMディスクを導入した甲斐があったようです。だ とすれば、同じような問題で困っている人がいた場合、例えメインメモリーを削ってでもRAMディスクを導入してみる価値があるかもしれませんね。

    コンパイラで時間が掛かって困っている人の場合は少量でもRAMディスクを確保してそこをワークエリアにすれば多分効果があると思います。

    動画の編集やエンコーディングは僕はしないのでどれくらいのRAMディスクがあればいいのかわかりませんが、RAMディスクにして容量が問題ないレベルで あれば効果が期待できそうな気がします。そこらへんはベンチマークがでてそうですね。ちょっと調べてみます。(ぐぐり中)。ちょっと見た感じではCPUの 能力によるところが大きくてRAMディスクの効果は薄そうです。昔はかなりハードディスクの速度がボトルネックになっていたので最近の高速なハードディス クだとあまり効果が感じられないのかも知れませんね。

    テンポラリを多用するソフトには効果がありそうです。

 

最終的な結論としてはOSの管理領域外メモリーがある人意外はあまりお勧めしません。リスクも多少ある割にメリットもそんなにないと思います。マニア向けですw。

今後メモリーが更にたくさん安価に利用できる時代が来た場合にはRAMディスクがまた見直されるかもしれないですね。

それよりもSSDに期待したいですw。

長々と書きすぎてこれ書き込めるのかと不安になりながら終了です。おつかれさまでした。

2009년 11월 12일 목요일

■[Java][Javascript]Struts×JSON.simple×jQueryでJSONオブジェクトをajaxでやり取り

http://d.hatena.ne.jp/mtoyoshi/20080831/1220180428

[][]Struts×JSON.simple×jQueryJSONオブジェクトajaxでやり取りAdd Star

今更感ありありですが、これらの組み合わせでやったのは初めてだったのでメモしておきます。

やり取りするのはこんなJSONデータ。

[{"name":"太朗", "age":27}, {"name":"花子", "age":25}]

想定としては検索ボタンをクリックすると、上記データがサーバーから送られてきて以下のようにSELECTに展開するというものをやってみます。

<SELECT name="users" id="users">
  <OPTION value="0">太朗(27)</OPTION>
  <OPTION value="1">花子(25)</OPTION>
</SELECT>

クライアントサイド

まず用意しておくhtmlはこんな感じ。

<INPUT type="button" name="search_button" id="search_button" value="検索">
<SELECT name="users" id="users"></SELECT>

つづいてjavascriptはこんな感じ。

$(function(){
  $("#search_button").click(function(){
    $.getJSON(
      "http://localhost:8080/sample/user_search.do",
      function(result){
        for(var i=0; i<result.length; i++){
          $("<OPTION></OPTION>").val(i).text(resut[i].name + "(" + result[i].age + ")").appendTo("#users");
        }
      }
    );
  });
});

JSONオブジェクトをやり取りするのであれば、Ajax.getJSON関数が便利。いちいちevalしてオブジェクト化しなくても即使えます♪


サーバーサイド

JSON形式の文字列を返す際、自分で組み立ててもいいんですが既にライブラリがあるのでこれを利用します。

http://www.json.org/java/simple.txt

では、StrutsのActionクラスです。

public ActionForward execute(ActionMapping mapping,
                             ActionForm form, 
                             HttpServletRequest request, 
                             HttpServletResponse response) {
  JSONObject obj1 = new JSONObject();
  obj.put("name","太朗");
  obj.put("age",27);
  JSONObject obj2 = new JSONObject();
  obj.put("name","花子");
  obj.put("age",25);

  JSONArray json = new JSONArray();
  json.add(obj1);
  json.add(obj2);

  PrintWriter writer = response.getWriter();
  writer.print(json.toString());
  writer.close();

  return null;
}

最後をreturn null;とするところがポイントかな。

ArrayList#toArrayメソッドのキャスト

ArrayList#toArrayメソッドのキャスト

ArrayList#toArrayメソッドで、引数がないメソッドは戻り値がObject[]になる。
これを他の配列にキャストしようとするとClassCastExceptionが発生する。

× Integer[] integerArray = (Integer[])arrayList.toArray();

他のクラスにキャストしたいときは引数で空の配列を指定する。

○ Integer[] integerArray = (Integer[])arrayList.toArray(new Integer[]{});

2009년 11월 9일 월요일

[javascript][jqGrid] jsonフォーマットを配列からオブジェクトに変更する

[][] jsonフォーマット配列からオブジェクトに変更するAdd Star

json を取得してグリッドに表示するサンプルで使用した jsonフォーマットはちょっと使いにくい。

表示するカラムの順番通りに配置しないといけないし、もしデータが少ないとエラーが発生する。

そこで、カラム名と対応させるようなjsonフォーマットで受け取った方が何かと便利。

まぁごちゃごちゃ言うよりは、サンプルを見せた方が早い。

test3.json

{
  total   : 2,
  page    : 1,
  records : 15,
  rows    :
  [
    {employee_id:"0101", employee_no:"0001", name:"name0001"},
    {employee_id:"0102", employee_no:"0002", name:"name0002"},
    {employee_id:"0103", employee_no:"0003", name:"name0003"},
    {employee_id:"0104", employee_no:"0004", name:"name0004"},
    {employee_id:"0105", employee_no:"0005", name:"name0005"},
    {employee_id:"0106", employee_no:"0006", name:"name0006"},
    {employee_id:"0107", employee_no:"0007", name:"name0007"},
    {employee_id:"0108", employee_no:"0008", name:"name0008"},
    {employee_id:"0109", employee_no:"0009", name:"name0009"},
    {employee_id:"0110", employee_no:"0010", name:"name0010"},
    {employee_id:"0111", employee_no:"0011", name:"name0011"},
    {employee_id:"0112", employee_no:"0012", name:"name0012"},
    {employee_id:"0113", employee_no:"0013", name:"name0013"},
    {employee_id:"0114", employee_no:"0014", name:"name0014"},
    {employee_id:"0115", employee_no:"0015", name:"name0015"},
  ]
}

このフォーマットを利用するソース

注意点は「jsonReader」パラメータで、想定するjsonファイルフォーマットオブジェクト配列と指定する(repeatitems: false)ことです。

この例では、それに加えて、データベースの主キーに相当する「ID」を jqGrid の内部的に使用する行IDとして利用する設定もしています。(id : "employee_id")

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>jsonファイル読み込みサンプル</title>

<link rel="stylesheet" type="text/css" media="screen" href="css/jquery-ui-1.7.2.custom.css" />
<link rel="stylesheet" type="text/css" media="screen" href="css/ui.jqgrid.css" />

<script type="text/javascript" src="js/jquery-1.3.2.min.js"></script>
<script type="text/javascript" src="js/i18n/grid.locale-jp.js"></script>
<script type="text/javascript" src="js/jquery.jqGrid.min.js"></script>

<script type="text/javascript">//<![CDATA[
jQuery(document).ready(function()
{
	$("#list").jqGrid({
		datatype   :"local",
		jsonReader :{
				repeatitems: false,			// オブジェクトの配列をデータとして受け取る
				id         : "employee_id"	// ID列名の指定
		},
		colNames   :['従業員番号', '名前'],
		colModel   :[
				{name:'employee_no'},
				{name:'name'       },
		],
		rownumbers : true,
		caption    : 'jsonファイルにアクセスしてグリッド表示する'
	});

	$("#read_json").click( function(e)
	{
		// 指定されたJSON url を取得
		var json_url = $("#json_url").val();

		// jqGridに指定するオプション
		var opts = { url     : json_url,
		             datatype: "json"  };

		$("#list").setGridParam(opts);
		$("#list").clearGridData();
		$("#list").trigger("reloadGrid");
	});

	$("#read_row").click( function()
	{
		// 選択行ID取得
		var id = $("#list").getGridParam("selrow");
		if( id )
		{
			var row = $("#list").getRowData(id);
			alert("id, employee_no, name = " + id + ", " + row.employee_no + ", " + row.name);
		}
	});
});
//]]>
</script>
</head>
<body>

<table id="list" class="scroll" cellpadding="0" cellspacing="0"></table>
<br>

<div>
  <input type="text" id="json_url" value="test3.json" />
  <button id="read_json">JSONファイル読み込み</button>
</div>

<div>
  <button id="read_row">選択行読み込み</button>
</div>

</body>
</html>

2009년 11월 8일 일요일

JavaScriptでツールチップを表示するためのライブラリ

http://s2click.sandbox.seasar.org/

overLIB 4.21
JavaScriptでツールチップを表示するためのライブラリです。

Introduction

The best way to learn how to use something is to get your hands dirty and do it. Therefore this documentation isn't very long, but instead provides merely basic instructions. Then move on to the Command Reference where you want dig deep. That way you'll learn to do all the cool stuff yourself.

2. Preparing the page

First of all you need to prepare the page you will be using overLIB on. Add the following line in the HEAD section just somewhere prior to the closing tag, </head>:
  <script type="text/javascript" src="overlib.js"><!-- overLIB (c) Erik Bosrup --></script>

If you are using any plugins, then the links to their source code would be similar to the above line (replacing the src attribute value with the proper name) and should follow this statement so that the core module comes first.

Then place the following line inside the <body></body> section of your page--preferably immediately after the body section starts, i.e., just after the <body> tag (this is important!):

  <div id="overDiv" style="position:absolute; visibility:hidden; z-index:1000;"></div>

If you have other div layers (i.e., positioned DIV containers) on the page you might want to change the z-index value to avoid overlaps. You must also change the src attribute values to reflect the correct path if the files are not placed in the same directory as your web page.

[Note: with version 4.10, it is not really necessary to include the overDiv declaration statement since if it isn't present it will be dynamically created for you. However, it is a good idea to include it so that you are aware that it is needed.]

3. Two different behaviours

There are two different types of popups that you can make with overLIB. The first type is when the popup goes away after you move your mouse away from a link or other object. The other type 'sticks' around afterwards. We call these "sticky" links. See the differencehere and here.

4. Tooltip popups

Let's look into the code for the popup that went away quickly, or a tooltip which it often is called.
  <a href="javascript:void(0);" onmouseover="return overlib('This is an ordinary
  popup.');" onmouseout="return nd();">here</a>

As you see this is no ordinary hyperlink as we've placed javascript:void(0); instead of an url as href (one can also use javascript:; if they wish). This causes the browser not to load a new page when we click on the link. This is of course optional. You can link to a page or anything else if you want.

In the onmouseover part overLIB comes in. Whichever type of popup you want to make you call the overlib() function. It can take any amount of parameters. You'll understand why that is good soon. To make a simple popup we just pass the text we want to display to the function inside SINGLE quotes. If the string contains any embedded single quotes they must be escaped by prefacing them with the backslash (\'). Any double quotes (") in the string should be replaced by the entity reference, &quot;.

After that comes onmouseout. It contains one cryptic function that has to be there. The call to the nd() function makes the popup go away when you move the mouse outside the link. You still have to have it there when making stickies though. This function takes an optional time argument which delays the closing of the popup by the specified number of milliseconds.

5. Sticky popups

Now let's look at the popup that stayed after the mouse was moved away from the link - the sticky popup.
  <a href="javascript:void(0);" onmouseover="return overlib('This is what
  we call a sticky, since I stick around (it goes away if you move the mouse
  OVER and then OFF the overLIB popup--or mouseover another overLIB).',
  STICKY, MOUSEOFF);" onmouseout="return nd();">here</a>

The only difference between the two of them (except for the text passed) is that the 'sticky' one has more text after the text inside quotes, which are called commands. In this case it is the STICKY command which tells overLIB that we want the popup to stick around. And the MOUSEOFF command which allows you to close the popup by first mousing onto it and then off of it. NOTE: all commands are in UPPERCASE and can contain zero or more parameter values of different types. See the Command Referencepage for a description of the core module commands.

6. Clickable popups and commands

Now that you know the really basic parts lets look at a bit tougher stuff. You remember from the frontpage that you could click on links and make a popup show up then? This isn't hard either. You just place the overLIB code in onclick instead of onmouseover. (Or both.) Here is an example: Click here! Lets digest the code again:
  <a href="javascript:void(0);" onclick="return overlib('This is a sticky
   with a caption. And it is centered under the mouse!', STICKY, CAPTION,
   'Sticky!', CENTER);" onmouseout="nd();">Click here!</a>

Here we have the overlib() call in onclick instead of onmouseover, and we have lots more commands! Just as STICKY is a command that tells overLIB to make the popup 'sticky', the other commands tell overLIB to do other things. Normally, the first command to a popup is a text string inside of single quotes, but it is not always true. (See the detailed discussion contained in the Command Reference page). Following text, you can pass any command you want to overLIB, in any order you want. Some commands expect to receive more than just a command though, it also wants some data (like CAPTION, 'Insert witty caption here'. When that is the case the next parameter is expected to be that data. Some commands also expect more than just one parameter. (These are explained in the Command Reference).

Lets go through the commands in this call to see what actually happens. First we have STICKY that tells overLIB that this popup should be a sticky and stay around. Followed by that is CAPTION and its parameter 'Sticky!'. This tells overLIB that we want a CAPTION on the popup and that the caption text should be Sticky!. After that the last command is CENTER which tells overLIB to center the popup under the mouse pointer.

7. Customizing overLIB

You can customize overLIB in three different ways. The first method you already know: by passing commands. However if you want all the popups to be red and use a larger font, it isn't very fun to pass a bunch of commands for each and every popup. The commands you pass last for that specific popup. Commands are intended when you want something different than the ordinary.
  • In overlib.js
    To set site-wide defaults (used by all pages using the same overlib.js) open up overlib.js in your favourite text editor. In it, look for "Configuration". There you can change overLIB's JavaScript default variable settings. The variables you should change all start with ol_ and there is a description on how you change each of them. They look like this:

    // Font face for the main text
    if (typeof ol_textfont == 'undefined')
    { var ol_textfont="Verdana,Arial,Helvetica";}

    In the Command Reference you can also see which variable each command overrides. Changing settings in the "Configuration" section of overlib.js is an effective way of modifying overLIB to suit your needs.

  • On a page
    When you need to make changes to many popups on one specific page, you can do that on the page without affecting other pages in your site. Simply assign the variable you want to have a page default for and place that JavaScript code before loading overlib.js. Here's how it looks:

    <script type="text/javascript">
    var ol_textfont = "Courier New, Courier";
    </script>
    <div id="overDiv" style="position:absolute; visibility:hidden; z-index:1000;"></div>
    <script language="JavaScript" src="overlib.js"><!-- overLIB (c) Erik Bosrup --></script>

  • When calling overlib()
    Finally (as previously mentioned), you can pass commands to in the overlib() call itself to change settings as well. Here is the previous example as a command instead:

    <a href="javascript:void(0);" onmouseover="return overlib('Different font.',TEXTFONT,'Courier, Courier New');" onmouseout="return nd();">My link</a>

Each of these methods, along with use of the routine, overlib_pagedefaults, is explained further in the Command Reference.

8. Command reference

Now that you know the basics how the overlib() function works, as well as how you can change the settings in the script or on the page as well, you are ready to start having fun with all the advanced features overLIB has to offer. The Command Reference has all the commands overLIB understands (there are more than 50!) and it is where you will find information on how to use them.

9. overLIB Plugins

overLIB also has the capacity to be enhanced, through the use of Plugins. Plugins provide access to many more commands that a user may want his/her popups to have. The documentation for each plugin explains the commands each particular plugin supports. If you try to use a command without having its supporting module loaded, you'll get an error saying that XXXX is undefined. Also, if you find that overLIB doesn't have the specific, mission critical feature you're missing, you can always write a plugin module yourself (Plugin Writing Tutorial)!

10. Still don't understand?

Don't worry, you're not the first. Before you start looking for help though, try going through the manual again and trying out the examples etc. Also make sure you use an "empty" page that doesn't have any other JavaScript's, applets and the like on it. Make a page with just overLIB first and then try the more complex things.

When things just don't work, there are ways of getting help. Take a look at overLIB'sSupport page and see what fits you.

Welcome to overLIB!