Daily Grind

システム開発関連の忘備録です

SQLメモ

SQLメモ

■カラムの型の変更

ALTER TABLE my_table MODIFY (COL_A NUMBER(10));

カラム名の変更

ALTER TABLE my_table RENAME COLUMN time_col TO date_col ;

■カラムの削除

ALTER TABLE my_table DROP (char_col , number_col)

-- 以下はオプションなので必須ではない
CASCADE CONSTRAINT INVALIDATE;

■テーブル名の変更

ALTER TABLE table_A RENAME TO table_B;

■テーブルにつけた制約名の変更

ALTER TABLE my_table RENAME CONSTRAINT Z00X1T_PK TO Z00X2T_PK;

■カラムの追加(位置指定なし)

ALTER TABLE my_table ADD (
char_col VARCHAR2(200 byte) DEFAULT 'xxx' NOT NULL ,
number_col NUMBER(10)
);

■テーブル削除(制約も削除、ごみ箱に入れず完全削除)

DROP TABLE my_table CASCADE CONSTRAINTS PURGE ;

■テーブルからテーブル作成

CREATE TABLE table_name AS SELECT * FROM other_table;

■同じ定義のテーブルへ全コピー

INSERT into tblB SELECT * FROM tblA;

■シノニム作成

<XXXX側でシノニム作成>
CREATE OR REPLACE SYNONYM "XXXX"."TABLE_A" FOR "YYYY"."TABLE_B";

<YYYY側でXXXXにselect権限を付与>
GRANT SELECT ON "XXXX"."TABLE_A" TO YYYY ;

■シーケンス作成

CREATE SEQUENCE "XXXX"."XXXXSEQ_001"
MINVALUE 1 MAXVALUE 9999999999
INCREMENT BY 1
START WITH 1
NOCACHE NOORDER CYCLE ;

■登録日時とユーザの更新

update my_table set TS = '2017-12-22', USR = 'SYSTEM';

PL/SQLで例外を発生させる

RAISE_APPLICATION_ERROR(-20000, '独自のエラーメッセージ');

■Date型での検索

select begin_time, end_time, undotsn from dba_hist_undostat
where begin_time >= to_date('2018/02/05 00:00:00', 'yyyy/mm/dd hh24:mi:ss')
and begin_time <= to_date('2018/02/05 23:59:59', 'yyyy/mm/dd hh24:mi:ss');

■日付書式

 to_char(SYSDATE, 'YYYY"年"MM"月"DD"日"')
 --2018年05月23日

 --FM 接頭辞 字詰めモード (スペース/ゼロを挿入するのを無効にする)
 select to_char(now(),'YYYY/FMmm/FMdd');
 --2009/7/3

■BLOBのカラムの表領域変更

alter table テーブル名 move
lob(BLOBカラム名) store as ( tablespace テーブルスペース名);

Python + Selenium 環境構築

Python + Selenium 環境構築

0.はじめに

できるだけシンプルに動作できるように導入するのはPythonSelenium、WebDriverだけにとどめる。

 参考:https://www.inet-solutions.jp/technology/python-selenium/#i
 公式:https://seleniumhq.github.io/selenium/docs/api/py/api.html
 非公式(日本語):https://kurozumi.github.io/selenium-python/api.html

1.Pythonのインストール

 今回は、3.6.5をインストールした

2.Seleniumのインストール

 pip install selenium

 * pipはPythonのパッケージ管理ツール。標準でインストールされる。
 * seleniumは今回は3.11.0がインストールされた。
 * Proxy環境では、HTTP_PROXYを設定する必要あり。

3.WebDriverのインストール

 ブラウザを操作するには、各ブラウザに合わせてドライバーを用意する必要があります。
 今回は Chrome を使用するので 公式サイトから ChromeDriver をダウンロードします。

4.IEのセキュリティ設定

 インターネットオプションの「セキュリティ」タブで、各ゾーンの「保護モードを有効にする」の設定を
 合わせておかないと、find_element_by_id系のメソッドでNoSuchElementExceptionなどエラーが発生した。

 http://livedoor.blogimg.jp/kmiwa_project/imgs/8/2/82cbdbba.jpg

 ※今回はローカルイントラネットと信頼済みサイトの「保護モードを有効にする」のチェックを付けた。

5.レジストリの設定

 IEの場合はこれをやっておいたほうが安定するらしい?
 https://bitwave.showcase-tv.com/selenium%E3%81%A7internet-explorer11%E3%82%92%E5%8B%95%E3%81%8B%E3%81%99%E6%96%B9%E6%B3%95/

 レジストリにキーがなければ作成し、iexplore.exeというDWORD値を作成し、値を0にします。

 (32bitの場合)
   \HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\MAIN\FeatureControl\FEATURE_BFCACHE

 (64bitの場合)
   \HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Internet Explorer\MAIN\FeatureControl\FEATURE_BFCACHE

6.その他

6.1.IEでのファイルダウンロード

 ボタン操作でファイルをダウンロードする際にIEの「○○を開くか、または保存しますか?」の画面が出るとSelenium経由での制御ができなくなる。
 pyrobotというGUIを直接制御するクラス(JavaのRobot APIPython移植版)を使えば回避ができた。
 
 ■pyrobot
  https://github.com/chriskiehl/pyrobot

  テストスクリプトと同じディレクトリに「pyrobot.py」を配置。

7.参考文献

  ■Seleniumクイックリファレンス
   http://www.seleniumqref.com/

  ■Python unittestフレームワーク
   https://docs.python.jp/2/library/unittest.html#module-unittest

SandcastleによるAPIリファレンス作成方法

SandcastleによるAPIリファレンス作成方法

注意点として、 SHFB(Sandcastle本体)のインストールだけでなく、Microsoft Build Tools 2015もインストールしないと起動しませんでした。

Selenium環境作成

Selenium インストールメモ

1.Selenium IDEのインストール
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄

1.1 FireFoxをインストール
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄

 FireFoxをインストールします。
 Selenium IDEは、FireFoxバージョン55から対応していないので、54とかを入れること。

1.2 Selenium IDEをインストール
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄

 FireFoxプラグインで、Selenium IDEをインストールする。


2.環境セットアップ
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄

2.1 RubyChrome Driverをインストール
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄

 以下を参考に、RubyChrome Driver、selenium webdriverをインストールする。

 ■windowsならruby + selenium webdriverも環境設定は15分で終わる
 http://katsulog.tech/if-windows-ruby-selenium-webdriver-also-ending-the-configuration-in-15-minutes/


2.2 Gemをインストール
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
 RubyのGemはパッケージ管理ツールでインストールしたほうがいいので、bundlerをインストールする。

  #bundlerのインストール
   gem install bundler

  #Gemfileの作成
   bundle init

  #Gemfile編集
   以下を追加する
   
   gem "selenium-webdriver"
   gem "rspec"

  #Gemインストール
   bundle install

3.シナリオの作成
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
 FireFoxでテストケース相当の操作をして、シナリオを作成します。

 ①FireFoxを起動する。
 ②ツール‐Selenium IDEを起動する(記録が始まる)
 ③FireFoxで操作する。(これがシナリオになるので)
 ④Selenium IDEで記録を停止させる
 ⑤Selenium IDEでテストケースをエクスポートする(Ruby/RSpec/WebDriver)

 このテストケースはそのままでは実行できません。以下の変換を行います。

 ⑥シナリオ内の、${receiver}→@driverへ置換する。
 ⑦@driver = Selenium::WebDriver.for :firefox →:chrome へ置換します。


4 RSpecによるテスト実行
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
 作成したテストケースを以下のように配置します。
 (specフォルダ配下に配置)
  
  \---spec
test.rb

 シナリオを実行します。

  rspec spec/test.rb

大容量のダミーファイルを作成

各OSで、わりと大きめのダミーファイルを容量指定して作成する方法です。
Windows XPではコマンド・プロンプト上で利用できるツールとして、
「fsutil.exe」というコマンドが用意されている。

Windowsの場合、fsutilコマンドを使います。

    // 1Gのファイルを作る場合
    C:\>fsutil file createnew 1G.file 1073741824
    ファイル C:\1G.file が作成されました

Linuxの場合、ddコマンドを使います。

    # dd if=/dev/zero of=1G.file bs=1M count=1000
    1000+0 records in
    1000+0 records out
    1048576000 bytes (1.0 GB) copied, 38.5669 seconds, 27.2 MB/s


MacOS(UNIX)も、ddコマンドで作成できます。
bsにMの指定が出来ない違いがあるだけで、あとはLinuxの場合と一緒な感じ。

    $ dd if=/dev/zero of=1G.file bs=1024000 count=1000
    1000+0 records in
    1000+0 records out
    1024000000 bytes transferred in 27.326705 secs (37472502 bytes/sec)

.NET上アプリケーションのメモリ解析

http://moated.wordpress.com/2011/07/30/windows-net%E4%B8%...

.NET用のアプリケーションのパフォーマンスを改善する必要があって調べもの。
メモリ関連については、以下の記事が参考になった。
これ以外の記事もあって、VADumpやCLR profilerが紹介されていた。

Investigating Memory Issues
Claudio Caldato and Maoni Stephens
http://msdn.microsoft.com/en-us/magazine/cc163528.aspx
windbgやメモリダンプを使う方法が前半で少しだけ出てくる。

perfmonを使う方法のまとめ。

% Time in GC。これが50%を超えたままだと、managed heapがどうなっているのか見た方がいい。10%を超えていないならまず心配いらない。
Allocated Bytes/secを見る。メモリのallocation rate。正確ではないのでallocateしていても0になることがある。表示と数値の更新速度が違うからだ。低い数値は0になると考えておく。
85000バイト以上の大きいオブジェクトを作っている可能性があれば、Large Object Heapサイズを見る。
オブジェクトの生存期間が短ければGen 0のガーベジコレクションで回収される。

# Gen 0 Collection、# Gen 1 Collection、# Gen 2 Collectionは、プロセス開始からの各世代のGCの回数集計値。Gen 0, Gen 1は短時間で終了する。Gen2 は全部見るのでここで回収されるとコストが高い。
Gen 1 の回数とGen 2の回数のざっくりとした指標は10対1。

Allocation rateが高くないのにGCが多い(% Time in GCが大きい)ときは、次の世代に生き残るオブジェクトが大きいことがある。Promoted Memory from Gen 0とPromoted Memory from Gen 1でそれがわかる。特にGen 1からpromoteされてGen 2に上がり、そこで回収されるとパフォーマンスに影響がある。この状態はmidlife crisisと呼ばれるらしい。

promoteされるサイズが大きいとheapも大きい。これはGen 1 heap size と Gen 2 heap sizeで見る。Gen 0 heap sizeは次のGen 0 GCが開始される条件となるサイズ(ここまでallocできる)であり溜まっているサイズではない。
Promoted Finalization-Memory from Gen 0 はfinalizationが必要なオブジェクトの量。finalizeするまで再利用できないのでサイズが増加する要因になる。

# Total committed Bytes はGCヒープ上でcommitされたメモリ、 # Total reserved Bytesは同じくreserveされたメモリ。ヒープを広げて次のセグメントを確保すると、reserveされ、実際に使用するときまでcommitはされていない。

# Induced GC は、GCを要求した回数。これが多いのはバグの可能性もある。GCヒープを削減するためにinduceするよりはヒープを増やさないような方策を考えることで解決するべき。
.NETのGCとは別だが、memory カテゴリーのAvailable Bytesで使用可能な物理メモリがわかる。% Committed Bytesは、commit limitとcommited chargeの比率。90%を超えるとcommit エラーが発生するかもしれない。
Process カテゴリーのPrivate Bytes は、プロセスのprivate(共有不可能な)サイズ。大きいprivateサイズには注意が必要。これが増加していくときはメモリリークの可能性がある。
記事の後半はwindbgを使った解析について説明している。