VMware Fusion上のWindows10が調子悪かったのでVMwareに問い合わせてみた件

VMware Fustion上のWindows10がストールしてしまうことが時々あったので、問い合わせしたところメールをいただいた結果が以下。

VMware Fusionのスナップショットの意味

メールでは

  • バックアップを取り
  • スナップショットを消してみて

とのことだったので、それをして様子見している。と回答した。

でもじゃあ、スナップショットは何個とれるの?って質問したら 100まで取れるけど、スナップショットからの起動(そうなの?)はパフォーマンスに影響があり、 そもそもスナップショットは未知や危険な何かのテストのためのもので テスト終わったら消せとのこと。ストール時は12,13個スナップショットが溜まっていた状態。

要はバックアップの意味合いはまったくないということ(バックアップは仮想マシンのファイルをまるごとコピーで対処)。

https://kb.vmware.com/selfservice/microsites/search.do?language=en_US&cmd=displayKC&externalId=2076998

によると、最初のVMからの差分らしい。 バックアップしたいのならやはり、

https://kb.vmware.com/selfservice/microsites/search.do?language=en_US&cmd=displayKC&externalId=2078674

https://kb.vmware.com/selfservice/search.do?cmd=displayKC&docType=kc&docTypeID=DT_KB_1_1&externalId=2078257

を参考に仮想マシンをコピーするべき。

Oracle CREATE DIRECTORYでディレクトリオブジェクトを使用

PL/SQLでUTL_FILE()なんかを使う場合に便利なディレクトリオブジェクト

CREATE DIRECTORY オブジェクト名 AS '/path/to/foo/bar';
GRANT READ ON DIRECTORY オブジェクト名 TO ユーザ名;
GRANT WRITE ON DIRECTORY オブジェクト名 TO ユーザ名;

こうしておくと「オブジェクト名」でアクセスできる。

CREATE OR REPLACE PROCEDURE FOO_BAR
AS
    vHandle     UTL_FILE.FILE_TYPE;
BEGIN
    vHandle := UTL_FILE.FOPEN('オブジェクト名(大文字)', 'foo.txt', 'a');
        ....
END;
/

大文字ってのがミソ。

参考は以下。

Oracleでディレクトリ・オブジェクトの作成・削除・確認
UTL_FILEの使い方 (CREATE DIRECTORY 編)

Markdown 記法で書いて見た

はてな記法も好きなんですけど、はてなでしか使えないので、今回は、githubなどでも使っているmarkdownにしてみた。以下の記事が秀逸。

本当にh2ははてなでは使えていないの?

上記はh2になるはずだけどデフォルトのcssではh3とはfont-sizeが150%か140%の違いみたいですね。

プログラム系は以下

バッククォート3つの後に言語名称を書く。

/**
 * テスト
 */
int main(void) {
    return 0;
}

先頭に4つのスペース

先頭4つをスペースにするとpreで囲まれるみたい。

'''c
/**
 * テスト
 */
int main(void) {
    return 0;
}
'''

引用

引用は先頭に>をつけるだけでいいっていいよね。二行目以降には>があってもいいみたい。

ここが引用です。 メールの引用もそのままいけそう。 連続行も対象になります。

注意

途中で改行したいときは行の最後にスペース2つが必要。

バルクバインド(BULK BIND)の例

セレクト結果を一行づつ処理したいってとき、BULK BIND(BULK FETCHもあるみたい)っていうこともoracleではできるんですね。

-- バルクバインドの例
SET SERVEROUTPUT ON

DECLARE
  TYPE TLINE IS TABLE OF テーブル名%ROWTYPE INDEX BY BINARY_INTEGER;
  vLINE TLINE;
BEGIN
  SELECT * BULK COLLECT INTO vLINE FROM テーブル名;
  FOR i IN 1 .. vLINE.COUNT
  LOOP
    DBMS_OUTPUT.PUT_LINE('No=' || vLINE(i).カラム名);
  END LOOP;
  DBMS_OUTPUT.PUT_LINE('取得行=' || vLINE.COUNT);
END;
/

参照は以下。

連載 PL/SQLを使ってみよう!第61回「バルク・バインド(SELECT BULK COLLECT INTOの場合)」 | 集合研修 システム・テクノロジー・アイ銀座会場

ちなみに、BULK FETCHは以下。

バルクフェッチ - オラクル・Oracle PL/SQL 入門

SQLで2つのカラムに分割された最後のCR、最初のLFを調べる方法

oracleで2つのカラムにCRLFが分割されて保存されてしまった場合を調べる方法。

select id from テーブル
  where desc1 like '%' || chr(13) and desc2 like chr(10) || '%';

ちなみに以下の正規表現ではできなかった。

select id from テーブル
  where regexp_like(desc1, '\r$');

レコード確認してからのINSERT

レコードがない場合に限りinsertする方法。キーにしてエラーにすればよいって言われるのはわかっているけど、エラーメッセージ見たくない(見せたくない)人向け。

INSERT INTO テーブル(col1, col2)
  SELECT '値1', '値2' FROM DUAL
    WHERE NOT EXISTS(SELECT 'X' FROM テーブル WHERE col1 = '確認したい値');

テーブルの検索結果をNOT EXISTSで判定して、INSERT SELECTでインサートする。

参考サイトは以下。

http://scrap.php.xdomain.jp/exists_insert/

Oracle NVARCHAR2(1600)で1600文字入らない件

NVARCHAR2のカラムを大きくして大量文字を入力しようとすると以下のエラーが発生して入力できない。

エラー:: ORA-01461 : LONG値はLONG列にのみバインドできます。

ググってみたところ、

http://www.projectgroup.info/tips/Oracle/errorcode/ORA01461.html

のサイトが出てきた。

Oracle 11G R2 Client (11.2.0.1) のODBCドライバーの不具合

とのことでバージョンを確認したところ、こちらの環境はOracle Clientは11.2.0.4でした。残念。で、エラーメッセージが崩壊しているのは置いておいて、どこまで入るのだろうと根気強く入力値を変化した結果、1333文字までしか入らないことがわかった。

NLS_LANG=JAPANESE_JAPAN.JA16SJISTILDE

と指定しているのでShift_JIS(2byte)なんだけど、1333×3=3999つまり4000byte境界があるっぽい(内部で3byteで計算してるのか?)。
なんだかとても納得行かない仕様。

ちなみに確認したOracleサーバ側のバージョンは11.2。