【bat】Oracleサービスとリスナー起動停止

Oracleサービスとリスナーをbatファイルで起動する。
起動順序としてはリスナー起動、サービス起動となる。
停止順序は逆順となる。

Oracleリスナー起動
@echo off
setlocal
REM Oracleリスナー起動
set ROOT_DIR=D:/batch
set BIN_DIR=%ROOT_DIR%/bin
set LOG_FILE=%ROOT_DIR%log/%~n0.log
 
echo [ INFO ] %DATE% %TIME% Oracleリスナー起動開始>>%LOG_FILE%
cd D:/Product/Ofs41_1\FailSafe\Client
FSCMD ONLINERESORCE FslDBServer /CLUSTER=DBServer>>%LOG_FILE%

if NOT %ERRORLEVEL%==0 goto ERR_END

timeout /t 120 /nobreak

echo [ INFO ] %DATE% %TIME% Oracleリスナー起動終了>>%LOG_FILE%
exit /b

:ERROR_END
echo [ ERROR ] %DATE% %TIME% Oracleリスナー起動失敗>>%LOG_FILE%
exit

endlocal
Oracleサービス起動
@echo off
setlocal
REM Oracleサービスー起動
set ROOT_DIR=D:/batch
set BIN_DIR=%ROOT_DIR%/bin
set LOG_FILE=%ROOT_DIR%log/%~n0.log
 
echo [ INFO ] %DATE% %TIME% Oracleサービス起動開始>>%LOG_FILE%
cd D:/Product/Ofs41_1\FailSafe\Client
FSCMD ONLINERESORCE IFSDB /CLUSTER=DBServer>>%LOG_FILE%

if NOT %ERRORLEVEL%==0 goto ERR_END

timeout /t 120 /nobreak

echo [ INFO ] %DATE% %TIME% Oracleサービス起動終了>>%LOG_FILE%
exit /b

:ERROR_END
echo [ ERROR ] %DATE% %TIME% Oracleサービス起動失敗>>%LOG_FILE%
exit

endlocal

【bat】サーバ再起動

batファイルでサーバを再起動させます。

@echo off
setlocal

set ROOT_DIR=D:/batch
set BIN_DIR=%ROOT_DIR%/bin
set LOG_FILE=%ROOT_DIR%log/%~n0.log

echo [ INFO ] %DATE% %TIME% サーバ再起動開始>>%LOG_FILE%
SHUTDOWN /r /f /c "batファイルによるリブート"
if NOT %ERRORLEVEL%==0 goto ERR_END
echo [ INFO ] %DATE% %TIME% サーバ再起動終了>>%LOG_FILE%
exit /b

:ERR_END
echo [ ERROR ] %DATE% %TIME% サーバ再起動失敗>>%LOG_FILE%
exit /b

endlocal

【bat】共有フォルダへの接続

共有フォルダへの接続をbatファイルで自動化する。
[bat]
@echo off
rem 接続解除
net use /delete \\server\dir$ /yes

rem 接続
net use /presistent:yes “\\server\dir” /user:testuser@testdom.local password
[/bat]

上記のbatファイルをタスクスケジューラでSYSTEMユーザ実行などで登録する。
起動するとSYSTEMユーザが「\\server\dir」に接続できるようになる。
net useの「/user」はあくまでも共有フォルダへ接続するための
ユーザIDとパスワードになる。

上記の例でいうと「testuser」が共有フォルダに接続できるようになるわけではない点に注意。
(元々、ログインするためのユーザなので勘違いしやすい)

【bat】サービス起動バッチ

サービスの状態を確認し、「STATE」になっている場合、
サービスを起動します。

前提
サービス名は「TES_SER」とします。

FOR /f "usebackq tokens=1,2,3,4,5 delims=: " %%A IN (`sc query "TES_SER" ^| findstr -i "STATE"`) DO if "%%A"=="STATE" if "%%C"=="STOPPED" sc start TES_SER TES_SERの起動引数(任意)

【PowerShell】ファイルサイズが大きいファイルの分割

ファイルサイズが2GBを超えるファイルは開けないため、ファイルを分割します。
Linuxではsplitがありますが、windowsでは存在しないコマンドのため、
他の方法でファイルを分割します。

前提
ファイルが「C:/log/test.log」にあるとし、
このファイルを10万行ごとのファイルに分割する。

cd C:/log
$i=0; cat ./test.log -ReadCount 100000 | % {$_ > test$i.log; $i++;

【Oracle】PLSQLでBLOBデータを出力

PLSQLでBLOBデータを出力します。

CREATE OR REPLACE PROCEDURE testBlobOut (kanriNo IN VARHCAR) AS
CURSOR C_CONTROL IS
  SELECT
    TB1.IMAGE_NAME, 
    TB1.IMAGE
  FROM
    SAMPLE TB1
  WHERE
    TB1.KANRI_NO = kanriNo;

v_blob_locater BLOB;
v_offset INTEGER := 1;
v_buffer LONG RAW;
v_file_buffer_size INTEGER := 32000;
v_amount INTEGER := 32000;
v_totalsize INTEGER;
v_filetype UTL_FILE.FILE_TYPE;
v_filename VARCHAR2(1000) := '';
v_openmode VARHCAR2(2) := 'wb';
v_dir VARCHAR2(1000) := 'C/temp';

BEGIN
  OPEN C_CONTROL;
  LOOP
    FETCH C_CONTROL INTO v_blob_locater, v_filename;
    EXIT WHEN C_CONTROL%NOTFOUND;
    DBMS_OUTPUT.PUTLINE('fileName:' || v_filename);
    v_totalsize := DBMS_LOB.GETLENGTH(v_blob_locater);
    v_filetype := UTL_FILE.FOPEN(
      v_dir,
      v_filename,
      v_openmode,
      v_file_buffer_size
    );
    while v_offset < v_totalsize loop
      if v_offset + v_amount > v_totalsize then
        v_amount := v_totalsize - v_offset + 1;
      end if;
      DBMS_LOB.READ(
        v_blob_locater,
        v_amount,
        v_offset,
        v_buffer
      );
      UTL_FILE.PUT_RAW(
        v_filetype,
        v_buffer,
        true
      );
      v_offset := v_offset + v_amount;
      DBMS_OUTPUT.PUT_LINE('Offset :' || v_offset);
    end loop;
    UTL_FILE.FFLUSH(v_filetype);
    UTL_FILE.FCLOSE(v_filetype);

    DBMS_OUTPUT.PUT_LINE('fileSize :' || v_totalsize);
  END LOOP;
  CLOSE C_CONTROL;
EXCEPTION WHEN OTHERS THEN
  UTL_FILE.FCLOSE_ALL;
  RAISE;
END;
/

PLSQLの実行方法

set serveroutput ON
execute testBlobOut('000010');

【Java】PDFからJPG変換

PDFファイルに利用されている画像をJPG変換します。
以下のライブラリが必要です。
pdfbox-2.0.7.jar
commons-logging-1.2.jar

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Iterator;

import javax.imageio.ImageIO;

import org.apache.pdfbox.cos.COSName;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDPageTree;
import org.apache.pdfbox.pdmodel.PDResources;
import org.apache.pdfbox.pdmodel.graphics.PDXObject;
import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject;

public class TestPDFBoxPdfToJpg {

    public static void main(String[] args) {
        //PDFドキュメントをロード
        try (PDDocument document = PDDocument.load(new File("D:\\test\\pdf\\e-ticket.pdf"));) {

            //ページのリストから最初の1ページを取得する
            PDPageTree pageTree = document.getDocumentCatalog().getPages();
            PDPage page = pageTree.get(0);

            //ページからリソースを取得し、最初のイメージを取得する。
            PDResources resources = page.getResources();
            Iterator<COSName> ite = resources.getXObjectNames().iterator();

            int i = 0;

            while (ite.hasNext()) {

                COSName name = ite.next();

                //取得したイメージをファイルに出力
                PDXObject xobject = resources.getXObject(name);

                if (xobject instanceof PDImageXObject) {
                    PDImageXObject image2 = (PDImageXObject) resources.getXObject(name);
                    ImageIO.write(image2.getImage(), "jpg", new FileOutputStream("D:\\test\\pdf\\e-ticket" + i + ".jpg"));
                }

                i++;
            }

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

【Excel】圧縮解凍処理

VBAで圧縮解凍処理を行います。

'オプションの意味:変数宣言必須
Option Explicit

'圧縮処理(実行)
Public Sub ZipSample()
  ZipFileOrFolder "C:\Test\Files" 'フォルダ圧縮
  MsgBox "処理が終了しました。", vbInformation + vbSystemModal
End Sub

'解凍処理(実行)
Public Sub UnZipSample()
  UnZipFile "C:\Test\Files\Test.zip"
  MsgBox "処理が終了しました。", vbInformation + vbSystemModal
End Sub

'圧縮処理
Public Sub ZipFileOrFolder(ByVal SrcPath As Variant, _
                           Optional ByVal DestFolderPath As Variant = "")
  'ファイル・フォルダをZIP形式で圧縮
  'SrcPath:元ファイル・フォルダ
  'DestFolderPath:出力先、指定しない場合は元ファイル・フォルダと同じ場所
  Dim DestFilePath As Variant

  With CreateObject("Scripting.FileSystemObject")
    If IsFolder(DestFolderPath) = False Then
      If IsFolder(SrcPath) = True Then
        DestFolderPath = SrcPath
      ElseIf IsFile(SrcPath) = True Then
        DestFolderPath = .GetFile(SrcPath).ParentFolder.Path
      Else: Exit Sub
      End If
    End If
    DestFilePath = AddPathSeparator(DestFolderPath) & _
                     .GetBaseName(SrcPath) & ".zip"
    '空のZIPファイル作成
    With .CreateTextFile(DestFilePath, True)
      .Write ChrW(&H50) & ChrW(&H4B) & ChrW(&H5) & ChrW(&H6) & String(18, ChrW(0))
      .Close
    End With
  End With
   
  With CreateObject("Shell.Application")
    With .NameSpace(DestFilePath)
      .CopyHere SrcPath
      While .Items.Count < 1
        DoEvents
      Wend
    End With
  End With
End Sub

'解凍処理
Public Sub UnZipFile(ByVal SrcPath As Variant, _
                     Optional ByVal DestFolderPath As Variant = "")
  'ZIPファイルを解凍
  'SrcPath:元ファイル
  'DestFolderPath:出力先、指定しない場合は元ファイルと同じ場所
  '※出力先に同名ファイルがあった場合はユーザー判断で処理
  With CreateObject("Scripting.FileSystemObject")
    If .FileExists(SrcPath) = False Then Exit Sub
    If LCase(.GetExtensionName(SrcPath)) <> "zip" Then Exit Sub
    If IsFolder(DestFolderPath) = False Then
      DestFolderPath = .GetFile(SrcPath).ParentFolder.Path
    End If
  End With
   
  With CreateObject("Shell.Application")
    .NameSpace(DestFolderPath).CopyHere .NameSpace(SrcPath).Items
  End With
End Sub

'フォルダチェック処理
Private Function IsFolder(ByVal SrcPath As String) As Boolean
  IsFolder = CreateObject("Scripting.FileSystemObject").FolderExists(SrcPath)
End Function

'ファイルチェック処理
Private Function IsFile(ByVal SrcPath As String) As Boolean
  IsFile = CreateObject("Scripting.FileSystemObject").FileExists(SrcPath)
End Function

'ファイルパスセパレータ追加処理
Private Function AddPathSeparator(ByVal SrcPath As String) As String
  If Right(SrcPath, 1) <> ChrW(92) Then SrcPath = SrcPath & ChrW(92)
  AddPathSeparator = SrcPath
End Function

【Excel】ライブラリ参照

Excelでオブジェクトを変数宣言するには
遅延バインディングと事前バインディングの2種類の方法がある。

実装の違い(例として、FileSystemObjectを利用)

  • 遅延バインディング
  • Dim objFSO As Object
    Set objFSO = CreateObject("Scripting.FileSystemObject")
    
  • 事前バインディング
  • 「ツール」→「参照設定」で
    「Microsoft Scripting Runtime」にチェックを付ける。

    Dim objFSO As New FileSystemObject
    または、
    Dim objFSO As FileSystemObject
    Set objFSO = New FileSystemObject
    

一言で言えば、変数宣言の型が
遅延バインディングはObject型
事前バインディングは特定のオブジェクト型
となっている。

  • 遅延バインディング(実行時バインディング)
  • オブジェクトが Object 型として宣言された変数に代入する場合、
    遅延(実行時)にバインディングされる。
    この型のオブジェクトは、任意のオブジェクトへの参照を保持できるが、
    事前バインディングされたオブジェクトの利点をほとんど持たない。

  • 事前バインディング
  • 特定のオブジェクト型として宣言された変数に代入する場合、
    オブジェクトは事前(コンパイル時に)バインディングされる。
    事前バインディングされたオブジェクトでは、アプリケーションが実行される前に、
    コンパイラによってメモリの割り当てとその他の最適化が実行される。
    また、自動クイックヒントが表示されるようになる。