【Eclipse】動的Webプロジェクトのコピー

Eclipseで動的Webプロジェクトをコピーしたい場合、以下を行う。

  • プロジェクト名のリファクタリング
    プロジェクトで右クリックし、リファクタリングを選択する。
    変更後のプロジェクトを入力する。
  • プロジェクトのコンテキスト名変更
    プロジェクトで右クリックし、「プロパティ」を選択する。
    Webプロジェクトの設定を選択し、コンテキスト・ルートを
    コピー後のプロジェクトに合わせて変更する。
  • ローカルのTomcat設定変更
    以下ファイルの「Context docBase」のプロジェクト名を変更する。

    /workspace/Servers/ローカル・ホスト の Tomcat v7.0 サーバー-config/server.xml
    

【VisualStudio】SQLServerCompact4.0導入

ローカルDBと呼ばれるSQLServerCompact4.0を使えるようにします。
SQLServerCompact4.0はVisual Studio 2013でサポートを打ち切ったようですが、
ツールを導入すれば利用できるようになります。

「ツール」-「拡張機能と更新プログラム」を選択し、
「オンライン」を選択し、右側の検索テキストボックスで
「SQL Server Compact / SQLite Toolbox」を入力し、検索する。

検索結果でHITした「SQL Server Compact / SQLite Toolbox」を選択し、
「ダウンロード」ボタンを押下する。

インストール後、Visual Studio 2015を再起動し、
サーバーエクスプローラーを開く。
サーバーエクスプローラーのミニツールバーの右側に追加された
「SQL Server Compact / SQLite Toolbox」のアイコンをクリックする。

「Data Connections」を選択し、右クリックし、
「Add SQL Server Compact 4.0 Connection」を選択する。
Filenameで任意のDB名を入力し、Passwordに任意のパスワードを入力し、
「Create」ボタンを押下する。
「Test Connection」ボタンを押下し、接続確認できれば問題なし。

作成したDB名.sdfを選択し、右クリックし、
「Build Table」選択し、テーブルを作成する。

このようにサーバーエクスプローラーと同じ感覚で
SQL Server Compactに対して操作が可能となる。

【VisualStudio】VisualStudio導入

  • VisualStudio導入
    Visual Studio Professional 2015と同機能を持つ
    個人専用のVisual Studio Community 2015を導入しました。
    公式サイトからダウンロードし、画面の指示に従い、
    カスタムで以下をインストールしました。

    Windows and Web Development - Microsoft SQL Server Data Tools
    Windows and Web Development - Microsoft Web Developer Tools
    Common Tools - Visual Studio Extensibility Tools Update 2
    

    インストール後、アカウントのSign inを促されますが、
    スキップしたまま起動できます。
    初期状態だと英語表示なので一旦終了し、日本語パッチを適用します。

    日本語パッチ適用後、Visual Studio Community 2015を再度起動し、
    「Tools」-「Options」-「Environment」-「International Setings」を選択し、
    プルダウンから「日本語」を選択し、
    再度、Visual Studio Community 2015を再起動します。

    補足ですが、Visual Studio Community 2015をインストールすると
    2つの統合開発環境(IDE)がインストールされます。
    Windowsの左下のメニューから確認できます。

    Blend for Visual Studio 2015
    Visual Studio 2015
    

    Blend for Visual Studio 2015はXAMLを使った開発でUIデザインを行うのに適したツールらしいです。
    また、同じプロジェクトファイルを参照できるという親和性があるとか。
    通常であれば、Visual Studio 2015で十分です。
    Blend for Visual Studio 2015はデータベースエクスプローラーがなかったりで
    しばらく困惑しました。

【Excel】アンスコ区切りをキャメルケースに変換する

Javaではクラス名はアッパーキャメルケース(パスカルケース)の形式にします。
メソッド名はローワーキャメルケースの形式にします。

アッパーキャメルケース:FirstExample
ローワーキャメルケース:firstExample

エクセルでA1に「FIRST_EXAMPLE」という文字列があると仮定し、
それをアッパーキャメルケース、ローワーキャメルケースに変換します。

' アッパーキャメルケース
=SUBSTITUTE(PROPER(A1),"_","")
' ローワーキャメルケース
=LOWER(LEFT(A1,1))&MID(SUBSTITUTE(PROPER(A1),"_",""),2,LEN(A1))

【Excel】フォルダ内のエクセルファイルのオブジェクトに対して検索を行う

Dir関数を用いるため、ネットワーク上の長いファイルパスには未対応です。

Sub Test()

    ' 画面チラつきを防止する。
    Application.ScreenUpdating = False

    ' フォルダパスとファイル名を宣言する。
    Dim strFilePath As String
    Dim strFileNmae As String
         
    ' テキストボックスかセル入力でフォルダを指定させる。
    strFilePath = "C:\Users\test\Desktop\テストディレクトリ"
    
    ' 末尾が\ではない場合、\を追加する。(未実装)
    strFilePath = strFilePath & "\"
    
    ' 指定フォルダ内のファイル名を取得する。
    strFileName = Dir(strFilePath, vbNormal)

    ' 結果シートを変数に設定する。
    Dim resultBookSheet As Worksheet
    Set resultBookSheet = Worksheets("sheet1")
   
    ' 結果シートの行数を宣言する。
    Dim longGyo As Long
    longGyo = 1

    ' 指定フォルダ内のファイルがなくなるまで繰り返す。
    Do While strFileName <> ""

        Dim result As Range
        Dim firstAddress As String

        ' ファイルを開く。
        With Workbooks.Open(Filename:=strFilePath & strFileName)

            ' ファイル内のシート数を取得する。
            Dim sheetCnt As Long
            sheetCnt = .Worksheets.Count

            ' 1シート目からnシート目まで繰り返す。
            Dim i As Long
            For i = 1 To sheetCnt

                Dim shp As Shape
                ' シートからオブジェクトがなくなるまで繰り返す。
                For Each shp In .Worksheets(i).Shapes

                    ' オブジェクトにテキストを書き込める場合
                    ' shp.TextFrameはテキストが書き込めないオブジェクトでエラーが発生してしまう。
                    ' shp.TextFrame2はOffice 2007以降で利用可能だが、
                    ' テキストが書き込めないオブジェクトでもエラーが発生しない。
                    If shp.TextFrame2.HasText = True Then

                        ' 検索文字列がオブジェクト内に存在する場合
                        If InStr(shp.TextFrame2.TextRange.Text, "Excute") > 0 Then
                            resultBookSheet.Cells(longGyo, 1).Value = strFilePath & strFileName
                            resultBookSheet.Cells(longGyo, 2).Value = .Worksheets(i).Name
                            resultBookSheet.Cells(longGyo, 3).Value = "セル(" & shp.TopLeftCell.Address & ") - オブジェクト"
                            resultBookSheet.Cells(longGyo, 4).Value = shp.TextFrame2.TextRange.Text
                            longGyo = longGyo + 1
                        End If
                    End If
                Next
            Next i
            
            ' 保存せずファイルを閉じる。
            .Close SaveChanges:=False
        End With

        ' 次のファイルを取得する。
        strFileName = Dir()
    Loop
        
    ' 画面チラつき防止を解除する。
    Application.ScreenUpdating = True
    
End Sub

【Excel】CSVファイルを開く

  • ダブルクリック
    ダブルクリックで開いた場合、数値などは自動判断する。
  • テキストファイルで読み取り
    ツールバーの「データ」-「外部データの取り込み」-「テキストファイル」から読み取り、
    区切り文字をカンマに指定し、全項目を文字列として読み取る。
    数値も文字列として読み取るので、先頭が0でも変換しない。
    項目間が”,”の場合、ダブルクォート内のカンマは区切り文字ではなく、
    文字としてのカンマとして扱う。

【Oracle】1ヵ月間の範囲に含まれるにデータの抽出

業務では適用開始年月日(VALID_START_YMD)と
適用終了年月日(VALID_END_YMD)を持つテーブルが多いですが、
そこから指定の1ヵ月間の範囲に含まれるデータを抽出します。

WHERE VALID_START_YMD <= '月末' AND VALID_END_YMD >= '月初'
適用開始年月日にあてるのが「月末」
適用終了年月日にあてるのが「月初」

逆にしてしまうと1ヶ月間のうち、月初~15日、16日~月末のような
2レコードがある場合、取得できなくなります。

【bat】フォルダの末尾に日付を追加してバックアップ

作業フォルダの末尾に日付を追加してバックアップします。
設計や開発時にファイルサーバーやSVNサーバが使えない場合、
日々のバックアップで利用しました。

@ECHO OFF
REM コピーします。
SET DIR_NAME=%date:~0,4%%date:~5,2%%date:~8,2%
SET DIR_FULL_NAME=D:\test_%DIR_NAME%

REM ディレクトリを作成する。実行結果をNULに流し、標準エラー出力および標準出力とする。
MKDIR %DIR_FULL_NAME% > NUL 2>&1
XCOPY /Y /D /E C:\Users\ユーザ名\Desktop\test %DIR_FULL_NAME%
REM /Y:同名のファイルが存在する場合、上書きの確認を行わない
REM /D:コピー先に同名のファイルが存在する場合に更新日が新しいファイルのみコピーする
REM /E:ファイルが存在しなくてもディレクトリごとコピーする
REM /EXCLUDE:file nameを使うとコピー除外もできる

【JScript】ファイル一覧とディレクトリ一覧

サブディレクトリ内は再帰しません。

// パスを指定する。
var target = "D:/Book/";

// ファイル一覧とディレクトリ一覧を取得する。
enumFiles(target);

function enumFiles(target) {

    // ファイルを扱う準備を行う。
    var fso = new ActiveXObject("Scripting.FileSystemObject");

    // FileExistsの第1引数がファイルの場合
    if (fso.FileExists(target) == true) {
        WScript.Echo("ファイルです。");
    }

    // FileExistsの第1引数がファイル以外の場合
    if (fso.FileExists(target) == false) {
        WScript.Echo("ファイルではありません。");
    }

    // FolderExistsの第1引数がディレクトリの場合
    if (fso.FolderExists(target) == true) {
        WScript.Echo("ディレクトリです。");

        // ディレクトリ内の一覧を取得する。
        var all = fso.GetFolder(target);

        // ディレクトリ内の一覧からファイルを取得する。
        var eFile = new Enumerator(all.Files);
        for ( ; !eFile.atEnd(); eFile.moveNext()) {
            var file = eFile.item();
            WScript.Echo(file.Path);
        }

        // ディレクトリ内の一覧からサブディレクトリを取得する。
        var eDir = new Enumerator(all.SubFolders);
        for ( ; !eDir.atEnd(); eDir.moveNext()) {
            var dir = eDir.item();
            enumFiles(dir.Path);
        }
    }

    // FolderExistsの第1引数がディレクトリ以外の場合
    if (fso.FolderExists(target) == false) {
        WScript.Echo("ディレクトリではありません。");
    }
}

【JScript】ディレクトリ内の全てのファイルを開き特定文字を置換する

保守開発において改修前後で比較することが多いですが、
ファイル内に自動で更新日時が入るようなファイルが大量にある場合、
更新日時をある一定の文字に置換し、改修前後で比較可能にします。

対象の大量ファイルは「C:/replaceBefore」にあるとし、
置換後の大量ファイルを作成するために「C:/replaceAfter」を作成しておきます。

var fso = new ActiveXObject("Scripting.FileSystemObject");
var files = fso.GetFolder("C:/replaceBefore").Files;
var e = new Enumerator(files);
// ディレクトリ内の全てのファイル分繰り返す。
for ( ; !e.atEnd(); e.moveNext()) {
    var file = e.item();
    var fileFullPathBefore = "C:/replaceBefore/" + file.Name;
    var fileFullPathAfter  = "C:/replaceAfter/" + file.Name;
    WScript.Echo(fileFullPathBefore + "を処理します。");

    // 入力ファイルの設定
    // Typeの設定値
    // 1:バイナリを表す。
    // 2:既定値。charsetで指定した文字セットで文字列を表す。
    var sr = new ActiveXObject("ADODB.Stream");
    sr.Type = 2;
    sr.charset = "utf-8";
    sr.Open();
    sr.LoadFromFile(fileFullPathBefore);

    // 入力ファイルの読込み
    // ReadTextの第1引数
    // -1:既定値。EOSマーカーに達するまですべてのバイトをストリームから読み取る。
    // -2:改行までの行をストリームから読み取る。改行はLineSeparatorの設定値依存。
    var temp = sr.ReadText(-1);
//  WScript.Echo(temp);
    sr.Close();
    sr = null;

    // 出力ファイルの設定
    var sw = new ActiveXObject("ADODB.Stream");
    sw.Type = 2;
    sw.charset = "utf-8";
    sw.Open();

    // 置換文字列検索用
    // RegExpの第2引数に'g'を指定すると全置換になる。
    var reg = new RegExp("[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}[.][0-9]{7}");
//  var reg = new RegExp("[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}[.][0-9]{7}", 'g');

    // 出力ファイルの書込み
    // WriteTextの第2引数
    // ActiveXObjectのTypeが文字列(2)の場合に利用する。
    // 0:既定値。文字列を書き込む。
    // 1:文字列+改行を書き込む
    sw.WriteText(temp.replace(reg, ""), 0);

    // 書き込みの文字コードがUTF-8の場合、BOMが付与されるため、除去する。
    // 書き込んだオブジェクトのポジションをゼロに戻し、
    // バイナリモードを指定した上で、ポジションを3byte分ずらし、再書き込みする。
    // この処理順序は変更不可。
    if (sw.charset == "utf-8") {
        sw.Position = 0;
        sw.Type = 1;
        sw.Position = 3;
        var textBinary = sw.Read();
        sw.Close();
        sw.Type = 1;
        sw.Open();
        sw.Write(textBinary);
    }

    // 出力ファイルの保存
    // SaveToFileの第2引数
    // 1:既定値。ファイルがない場合、新規作成する。ファイルがある場合、上書きしない。
    // 2:ファイルがない場合、新規作成する。ファイルがある場合、上書きする。
    sw.SaveToFile(fileFullPathAfter, 2);
    sw.Close();
    sw = null;
}
fso = null;