たきるブログ

C#やOracleなどの情報を書いています。

【VMware】ディスクの圧縮を行う

それぞれ、ゲストOS上で実行させる。 ほかにも方法があるけど、この方法が一番手っ取り早い。

ゲストがWindowsの場合
C:\Program Files\VMware\VMware Tools\VMwareToolboxCmd.exe disk shrink C:\

ゲストがLinuxの場合
sudo vmware-toolbox-cmd disk shrink /

ゲストがMacの場合
sudo /Library/Application\ Support/VMware\ Tools/vmware-tools-cli disk shrink /

VMware Fusionに限っては、ゲストOSの設定画面からクリーンアップができる。

qiita.com

【Windows】Windows10でUASP対応外付けSSDを使ったときの速度

OS:Windows 10 x64
SSD価格.com - インテル 520 Series SSDSC2CW120A3K5 スペック・仕様
ケース:1分BOX2.5 USB3.0 GREEN LINE(CGL25U3S6G)|センチュリー(CENTURY)

急きょ、外付けディスクが必要になり、SSDがいいなーと思ってA-DATAのSSDを買おうかと思ったけど、Intel SSD 520が1台余っていることを思い出し、UASP対応のケースだけ買って、UASPいかに!と思って試してみた。

このケースを買ったのは、量販店に売っている商品の中で、パッケージに表示されている速度が速かったから。 もう1段階+2MBくらい速いものもあったけど、そちらはWindows 7に繋いだ時の速度が10MBくらい違ったので、相対的に満足しそうなのがこちらだったため。

デバイスマネージャー上で、『USB接続SCSI(UAS)マス ストレージ デバイス』ってなってると、UASPで動作しているそうだ。 f:id:metroit:20151031004325p:plain

Crystal Disk Mark x64で試してみた結果、以下の通り。 f:id:metroit:20151031002857p:plain

ついでに、まったく同じSSDを内蔵しているので、それの結果を見ると、以下になる。 f:id:metroit:20151031003523p:plain

UASPすげえ・・・。 もはや、ムリに内蔵にこだわる必要はないかもしれない。 もちろん、マザボ側の対応とかもあるかもだけど。

てことで、Windows 8.1 x64の環境でも試してみた。 f:id:metroit:20151031011342p:plain

ダメじゃん・・・。 デバイスマネージャー上はマスストレージデバイスって入ってるけど、相性の問題なのか、全然ダメだった。 新しめなコンピュータで利用した方がいいかもね。

【Oracle】ビット数が混在する中でSI ObjectBrowserを利用する

開発アプリケーションはx64コンパイルのため、OCI、ODACともにx64環境を設定。
しかし、ObjectBrowserはx86で動作するため、OCIが読み込めない、という時に以下のページの内容が役に立った。

https://www.sint.co.jp/siob_bbs/bbs_disp.asp?current_page=1&disp_mode=2&detail_mode=1&message_id=4587

つまり手順はこう。

  1. ObjectBrowserインストーディレクトリにbinフォルダを作成。
  2. 作成したbinフォルダ内に、InstantClient x86のファイルを全てコピー。
  3. ObjectBrowserを起動し、エラーになるけどOK。
  4. ツール→オプション→詳細設定→ORACLE_HOME欄に、ObjectBrowserインストールディレクトリを指定してOK。
  5. ObjectBrowserを再起動。

これでObjectBrowserはx86のOCIを利用して起動することができる。
InstantClient x86は、別にObjectBrowserのフォルダ内でなくてもいいけど、直前のフォルダ名はbinでなければダメ。

【Windows】ディレクトリをすべて削除するバッチを作る

例えば
Dir1
 ├ Dir1-1
 │ └ File1-1-1
 ├ Dir1-2
 │ └ File1-2-1
 └ File1-1

というフォルダ構造があったとする。

Dir1配下を全て削除したい時、通常ならエクスプローラーでDir1まで遷移し、Dir1-1、Dir1-2、File1-1を選択して削除すればいいわけだけど、意外と構造を削除していいかという確認が出てきたりしてしまって、夜間に一発削除できてないというオチがある、かもしれない。

そこで、バッチファイルで一切何も聞かずに消す方法で夜間バッチとかで叩き、安心してスヤァする。

その方法は、これではダメ。

rmdir /S /Q D:\Dir1

なぜなら、これではDir1フォルダまで削除しようとするから。
(カレントディレクトリをD:\Dir1に移動しておけばエラーになって消えないけど、正しいアプローチとは言えない)

そこで、以下のようにすると、安心してスヤァできる。

@echo off

SET DIRECTORY=D:\Dir1

SET /p RESULT=%DIRECTORY%フォルダ内のファイルを全て削除します。よろしいですか (Y/N)? 
if /i "%RESULT%" neq "Y" exit

for /D %%d in (%DIRECTORY%*) do rmdir /S /Q "%%d"

echo.
echo %DIRECTORY%フォルダ内を全て削除しました。
pause

ただし、気をつけたいところは、バッチで全部走行させるので、フォルダ指定を誤っていると非常に残念な目に遭う。
一度きりとかではなくて、ちゃんとしたものを用意したいのなら、もうちょっと注意喚起してくれるようなものを用意した方がいいかも。

【Windows】Windows 10をアップグレード、クリーンインストールする方法

事前準備

元のOSのリカバリーディスクを作成する

出荷状態(つまり購入当時)の状態に戻す用のリカバリーディスクをちゃんと作っておく。

  • Windows 7の場合
     メーカー品なら、リカバリーディスクの作成ツールがインストールされているので、それを使ってリカバリーディスクを作成する。

  • Windows 8以降の場合
     メーカー品でリカバリーディスクの作成ツールがインストールされている場合は、それを使ってリカバリーディスクを作成する。
     それ以外の場合は、以下の機能を実行することで、USBメモリにリカバリーメディアを作成する。 コントロール パネル->システムとセキュリティ->アクションセンター->回復->回復ドライブの作成

いずれも、回復パーティションを意図的に削除していないことが前提

現在のシステム全体をバックアップする

今現在のコンピュータの状態を丸ごとバックアップする。
もしくは、データを退避させた上で、『よく利用するアプリケーションがインストール済みの状態にリカバリーする』ことを目的とし、コンピュータの状態を丸ごとバックアップする。
俺が使っているのは、True Image 2015 for PC and Mac - 3PC


Windows 10の入手

Windows 10 のダウンロードから、自分のOSのビット数にあったツールをダウンロードする。(64bitOSの人は、正直どっちでもいいと思う)

ツールを実行し、ISOイメージファイルをダウンロードする。 ダウンロードするビット数は、自分がインストールしたいWindows 10のビット数を選ぶ。

ダウンロードしたISOファイルを、DVD-Rに焼いておく。


アップグレード

焼いたDVDを実行すると、アップグレードが選べるので、アップグレードを選んで次へ次へでアップグレード完了。


復元

事前準備で用意しておいたリカバリーディスクでWindows 7とかに戻す。


こんなめんどくさいことをする理由

Windows 7以降の人は、Windows 10が1年間、無償アップグレード可能という話は有名。

しかし、ここでこんなことを考える。

  1. すぐにWindows 10を使いたいわけではない。
  2. Windows 10をアップグレードではなくクリーンインストールで利用したい。

これ実は、両方とも、一度アップグレードした方がよい。

すぐにWindows 10を使いたいわけではない

元々用意してたリカバリーディスクでリカバリーすれば済む話。
すぐWindows 10を使わないからといって思い切って一度はアップグレードしておかないと、忘れてて1年間経過してしまうという罠にハマってもったいないことになる恐れがある。
また、アップグレード後に前のOSに戻すメニューが存在するが、1ヶ月という制限付き、かつ失敗した人も出ている。
ちゃんと自らリカバリーディスクを用意することで、実質的にいつでも思い通りの状態に戻すということを可能にする。

Windows 10をアップグレードではなくクリーンインストールで利用したい

一度アップグレードしておくと、Windows 10のクリーンインストール時のプロダクトキーの入力をスキップしても、勝手に認証される。
これは、ハードウェア構成が変わらなければ、1年間の間にアップグレードしたコンピュータだという位置づけでアクティベーションをしてくれる。
ハードウェア(特にマザーボード)を変更したときにどうなるかという話は、Microsoftは明言していないようだし、実際試してみないとわからないけど、多分ダメなんだろう。

2015/10/30 追記
ハードウェアがかわるとアクティベーションが通りません。

つまり
ちゃんとリカバリーディスクを作っておいて、一度アップグレードすれば、やりたい放題

仮想OS

上記の理由から、仮想OS上のWindows 7などをアップグレードして利用するということは、あまり有効な手段には思えないように見える。
まだ検証していないけど、コンピュータA上でWindows 10へアップグレードして、その仮想OSのディスクファイルをコンピュータBへコピーして利用すると、ホストのハードウェア構成が変わるので、認証が外れるのでは、と思われる。

2015/10/30 追記
仮想OSの設定ファイルごとコピーしておいて、利用する際に聞かれる質問に『移動しました』を選択すればMACアドレスが変更されないので、アクティベーションは通ります。 間違っても『コピーしました』を選ばないように。 当たり前ですが、同じキーなので、複数仮想OSの同時起動はできません。

【Oracle】同じ行を複数件取得する

自分で何を言ってるか良く分からないタイトルだけど、言いたいことは以下のようなこと。

問題

通常の検索結果
col1   col2   col3
A      a      1
A      a      2
A      b      1
B      a      1
求めたい検索結果(1行につき、2行出力したい)
col1   col2   col3
A      a      1
A      a      1
A      a      2
A      a      2
A      b      1
A      b      1
B      a      1
B      a      1

解決方法

パッケージを作ればできる。
余計なワークテーブルを作る必要もなく、既存クエリへの影響も少なく済む方法は、以下の通り。

Package ROW_OPERATOR
CREATE OR REPLACE PACKAGE ROW_OPERATOR
IS
  TYPE REC_TYPE IS RECORD (
    ROW_NUM NUMBER
  );
  TYPE REC_TABLE_TYPE IS TABLE OF REC_TYPE;

  /**
   * 検索行した複数行に渡ってコピーするためのテーブルを取得します。
   * @param  A_CLONE_ROW_CNT  コピー件数
   * @return コピー用テーブル
   */
  FUNCTION GET_CLONE_ROW_TABLE(A_CLONE_ROW_CNT IN NUMBER) RETURN REC_TABLE_TYPE PIPELINED;

END;
/
Package Body ROW_OPERATOR
CREATE OR REPLACE PACKAGE BODY ROW_OPERATOR
IS
  /**
   * 検索行した複数行に渡ってコピーするためのテーブルを取得します。
   * @param  A_CLONE_ROW_CNT  コピー件数
   * @return コピー用テーブル
   */
  FUNCTION GET_CLONE_ROW_TABLE(A_CLONE_ROW_CNT IN NUMBER) RETURN REC_TABLE_TYPE PIPELINED
  IS
    L_CNT  NUMBER;
    L_REC  REC_TYPE;

  BEGIN
    L_CNT := 1;

    WHILE L_CNT <= A_CLONE_ROW_CNT LOOP
      L_REC.ROW_NUM := L_CNT;
      PIPE ROW(L_REC);
      L_CNT := L_CNT + 1;
    END LOOP;

    RETURN;
  END;

END;
/
使い方
SELECT WK.ROW_NUM, TBL.*
FROM   table1 TBL,
       TABLE(ROW_OPERATOR.GET_CLONE_ROW_TABLE(4)) WK

単純結合によって、求めたい行を複数行出力させるようにする。

【C#】EnterキーでTabキーを押した時と全く同じフォーカス遷移を行う

EnterキーでTabキーを押した時と同じフォーカス遷移を行いたいという要望は、案外多い。
古いシステムからの名残りだったり、そもそも提案した人が古い人だったりで。
果てはWebシステムでもそれを望むこともあるが、今回はWindows Formsアプリケーションの場合の解決方法を記す。

Enterキーでフォーカス遷移する方法は、難しく考えすぎて意外とハマる。
他のサイトで調べた結果、最適解を導き出した。

参考サイト

Enterキーを押した時、まるでTabキーを押したかのように、次のコントロールにフォーカスを移す: .NET Tips: C#, VB.NET
色々あって全部試したわけではないが、コンポーネント単位に継承するのは非効率。
コメント欄に[たきる]ってなってるのは俺^^;

.NET TIPS:Windowsアプリケーションで[Enter]キーによるフォーカス移動を行うには? - @IT
C# - フォームで [Enter] キーが押された時にフォーカスを遷移させる
SelectNextControlメソッドを利用すると、『自分のオブジェクト配下に存在するコントロールを遷移する』だけであり、Tabキーと全く同じにはならない。

続きを読む