保守から開発にジョブチェンジしたい人のブログ

保守をやっているので、なんとか開発にジョブチェンジできるように得た知見をアウトプットするブログです

【JAVA】ライブラリの使い方について

今日はライブラリの使用方法についてやっていきます。

開発時にエクリプスなどの開発ツールを利用している場合は、あまり意識することがないと思いますが、基礎を理解していないと応用が効かないので、基礎から理解していこうと思います。

 

----------------------------------------------------------------------------

さて、いつも通り、実際に実行してみながらトライアンドエラーでやっていきます。

今回はライブラリを使うことが目的なので、簡単な内容のzipファイルを作るライブラリを使います。

選択したのはこちら「zip4j」

フリーのライブラリで、暗号化zipの作成などに使えます。

「zip4j」とgoogleで検索すると最初に出てくるサイトでライブラリをダウンロードできますので、ダウンロードしていきます。

自分は「zip4j_1.3.2.jar」というのをダウンロードしました。

ここでダウンロードした「jarファイル」とはjavaのファイルで「classファイル」をまとめたファイルです。

「classファイル」は「javaファイル」をコンパイルしたファイルです。

このjavaファイルを実行していきます。

 

まず、jarファイルを展開します。

jarファイルは上に書いたように、単に「classファイル」を集めただけのファイルなので、zipなどと同じです。

「Lhaplus」というツールで解凍してみます。

自分は「G:\test」に設置しました。

これでライブラリの設置は完了です。

続いて、このライブラリを使用するための実行ファイルを設置します。

同じサイトのexampleという欄に、「zip4j_examples_1.3.2.zip」というのがあるので、こちらもダウンロードします。

ダウンロードしたファイルは先ほど設置した「G:\test」配下の「zip4j」に解凍します。

こんな感じになりました。

G:\test\net>tree
フォルダー パスの一覧: ボリューム ボリューム
ボリューム シリアル番号は 6040-5955 です
G:.
└─lingala
          └─zip4j
                   ├─core
                   ├─crypto
                   │      ├─engine
                   │     └─PBKDF2
                   ├─examples
                   │       ├─extract
                   │       ├─misc
                   │      └─zip
                   ├─exception
                   ├─io
                   ├─model
                   ├─progress
                   ├─unzip
                   ├─util
                         └─zip

では、ライブラリを使っていきます。

簡単な実行ファイルの「example/zip/AddFolder.java」を実行します。

 

ファイルを実行するために実行ファイルまで移動します。

cd G:\test\net\lingala\zip4j\examples\zip

続いて、ファイルをコンパイルです。

javac AddFolder.java

早速エラーです。

たくさん表示されましたが、最初の2行にはこんなことが書いてあります

AddFolder.java:19: エラー: パッケージnet.lingala.zip4j.coreは存在しません
import net.lingala.zip4j.core.ZipFile;

存在しませんと書いてあるので、存在しないのでしょう。

確認して見ます。

G:\test\net\lingala\zip4j\core

は存在しているようです。

ということは、「存在はしているけど認識していない」ということですね。

困ったらググりましょう。

「AddFolder.java:19: エラー: パッケージnet.lingala.zip4j.coreは存在しません」とそのままgoogleで検索します。

一つ目にterateilの記事が引っかかりました。

>>javaのプログラムをコンパイルする際、javacが「パッケージの起点となる

>>ディレクトリーがどこか」を正しく知らないと他のパッケージをうまく

>>importできずコンパイルに失敗します。 

なるほど。

では、「パッケージの起点となるディレクトリーがどこか」はどうやって認識するのでしょうか。

java パッケージの起点」で検索してみました。

上の方にはありませんでしたが、それっぽいのが載ってました。

>>CLASSPATH (クラスパス) 環境変数を設定することによって、

>>Java のシステムが class ファイルを探すパスの基点を設定することができます。

出ました。クラスパスです。

クラスパスを設定する必要があるようです。

環境変数の設定はwindowsではsetコマンドで設定可能です。

やってみます。

set CLASSPATH=.;G:\test\

「;」で区切っているので、これは2パターン設定しています。

「.」(カレントディレクトリ)と「G:\test\」ですね。

もともと、CLASSPATHは設定しなくてもカレントディレクトリを参照するようです。

なので、カレントディレクトリと指定した「G:\test\」がCLASSPATHになりました。

これで、「G:\test\」の配下においたフォルダが「java パッケージの起点」になります。

よって、CLASSPATHの「G:\test\」配下 「net」javaパッケージの起点として認識されるようになっています。

では、再度コンパイルしてみます。

javac AddFolder.java

今度はエラーが発生することなく実行できました。

「AddFolder.class」こんなファイルが生成されたと思います。

 では、実行してみます。

java AddFolder

またエラーです。

「エラー: メイン・クラスAddFolder.classが見つからなかったかロードできませんでした」

「見つからなかった」か「ロードできませんでした」とあります。

ファイルは確実に存在しているので、「ロードできなかった」のでしょう。

 また、google先生に聞いてみます。

一つ目にありました。

また、terateilです。便利ですね。

>>ソース中にpackage practice1とあるので、正式なクラス名は practice1.test1 です。

なるほど。

実行時にパッケージをフルパスで指定しないといけないようです。

こんな感じですかね。

java net.lingala.zip4j.examples.zip.AddFolder

また、エラーです。

net.lingala.zip4j.exception.ZipException: input folder does not exist

「インプットとなるフォルダーが存在しない」と出てます。

しかし今回はnet.lingala.zip4j.exception.ZipExceptionとライブラリに定義してあるような例外を出力しているようなので、実行はできています。

要は、機能を利用するための事前準備ができていないということです。

ここからはライブラリに依存する話なので、実際にソースを見て見ます。

大抵のプログラムには、中にコメントで利用方法や利用意図が簡単に記載されています。

* Demonstrated adding a folder to zip file
*
* @author Srikanth Reddy Lingala

「zipファイルをフォルダーに追加するデモンストレーションである」と書いてます。

もう少し読んで見ます。

// Initiate ZipFile object with the path/name of the zip file. 

ZipFile zipFile = new ZipFile("c:\\ZipTest\\AddFolder.zip");

// Folder to add

String folderToAdd = "c:\\FolderToAdd";

まず、path/nameのzipファイルオブジェクトを初期化するとあります。

そして、追加するフォルダーとあります。

つまり、「c:\\FolderToAdd」を「c:\\ZipTest\\」へ圧縮して「AddFolder.zip」にするということですね。

なので、「FolderToAdd」と「ZipTest」をCドライブに作ってみます。

ついでに、意図したフォルダが圧縮されたか確認のため「FolderToAdd」に中に適当なテキストファイルを作成しておきます。

では、実行です。

java net.lingala.zip4j.examples.zip.AddFolder

できました!

確認してみます。

「C:\ZipTest」に「AddFolder.zip」があります。

解凍してみると、作成しておいたテキストファイルも格納されていることが確認できました。

これで、ライブラリを利用することができました。

 

今回覚えたことは以下です。

・ライブラリの起点はクラスパスで設定する

・正式なクラス名で実行する

思ったより順調にできました。

今回は以上です。

【JAVA】とりあえずサクッと動作環境を作る

携わっている業務ではJAVAが使われています。

自分はインフラ(という名の何でも屋)部分に携わっているため、プログラムを書くことはないのですが、ライブラリ管理をやっていることもあり、環境については聞かれることが多いです。

プログラムも含めJAVAについて最低限の部分を少しずつ掘り下げて行こうと思います。

今日は実行環境の構築についてです。

------------------------------------------------------------------------------------------

さて、JAVAを動かすには動作ソフトウェアが必要です。

動かすだけならJREというソフトを入れればOKですが、今回は開発も含めた環境にしようと思うので、JDKというのを入れます。

JDKJREを内包しているので、JDKを入れればJREを導入したのと同じ状態です。

公式サイトからダウンロードしましょう。

詳細は割愛しますが、googleで「JDK」と入れれば第一候補に上がってくると思います。そちらからOSにあったJava SE Development Kitをダウンロードしてインストールしました。

 

javaが使えるようになったか確認します。

コマンドプロンプト(もしくはコマンドライン)を起動して、javaと入力し実行します。

色々説明表示が表示されれば問題なしです。同じくjavacと入力し実行します。

こちらも色々説明表示が表示されれば問題なしです。

javaコマンドとjavacコマンドが使えるようになりました。

javaコマンドはjavaファイルを実行するのに使います。

javacコマンドはjavaファイルをコンパイル(compile)するのに使います。

 

それでは実際にjavaファイルを作成して実行して見ます。

適当なフォルダを作りそこにHelloWorld.javaというファイルを作成します。

自分は「G:¥test¥HelloWorld.java」こんな感じです。

public class HelloWorld {
  public static void main (String[] args) {
    System.out.println("Hello World !!");
  }
}

ファイル名の通りHelloWorldするだけのソースです。

javaコンパイルが必要です。実行形式にする必要があります。

コンパイルには先ほど確認したjavacコマンドを利用します。

javac HelloWorld.java

同階層にclassファイルが作成されたと思います。

こんなファイルです。HelloWorld.class

これが実行形式のファイルです。

では、実行してみましょう。

G:\test>java HelloWorld
Hello world.

できました。

これだけです。ダウンロードとインストールを除けば5分ぐらいだと思います。

1. JDKの導入

2. javaファイルの作成

3. コンパイル

4. 実行

 

次回以降の記事でちょこちょこと環境や知識面のできることを増やしていこうと思います。

本日は以上です。

 

【データベース(oralce)】表領域の枯渇調査

ブログを作りました。

開発をやりたいですが、残念ながら保守業務に携わっています。

保守業務をやっていると、基本的に毎月同じことをするわけですが、トラブルなんかが発生すると、その時初めて試行錯誤しながら調査解決することも多いわけです。

(トラブル自体はいいことではないですが、トラブルが発生した時が一番知見が増えるので、個人的にはありがたいです)

 

というわけで保守をしていて、気なった内容や得た知見を載せていくブログです。

 

--------------------------------------------------

以前、表領域が枯渇しました。

表領域は、tablespaceとも言いますが、DB構築時にいくつかに分けて作られます。

実際に自分の検証用としてoracleDBをインストールして見たところ、

EXAMPLE、SYSAUX、SYSTEM、TEMP、UNDOTBS1、USERS

の表領域が作成されていました。

 

この時の表領域の枯渇原因は、業務SEが勝手に本番テーブルをバックアップしていたという、なんとも全くITリテラシーのない話でした。(そもそも本番環境に各担当が独自に操作できてしまうというのも問題なのですが、あまり制約をガチガチにすると、生産性が著しく低下するので難しいところではあるのですが。)

まず、createテーブルをする際には、当然どこかの領域にテーブルが作成されます。

じゃあどこの領域にテーブルが作成されているのかということですが、createテーブルする際に作成テーブルを指定できます。なので、環境が理解できていれば、そもそもバックアップしようとしたテーブルが元々存在する業務用の表領域にテーブルをバックアップするというのが普通なのですが、バックアップした担当者はそんなこともわかっていないため、適当にそのままcreateテーブルしてしまったため、デフォルト表領域にテーブルが作成されてしまいました。

各オラクルユーザ(スキーマ)はデフォルト表領域が設定されています。

設定値は下記で確認できました。

select username,default_tablespace from dba_users

USERNAME DEFAULT_TABLESPACE
------------------------------ ------------------------------
SCOTT USERS

このサンプルではSCOTTというスキーマのデフォルト表領域にUSERS表領域が指定されているため、指定なしにcreateテーブルするとUSERS表領域にテーブルが作成されるはずです。

試して見ましょう。

sqlplus scott/tiger as dba

create table emp

(

  emp_id char(3) ,

  emp_name varchar2(10),

  primary key( emp_id )

)

select OWNER,TABLE_NAME,TABLESPACE_NAME from dba_tables where table_name = 'EMP'

OWNER TABLE_NAME TABLESPACE_NAME
------------------------------ ---------------------------- ------------------------------
SCOTT EMP USERS

予想通りUSERS表領域にEMPというテーブルが作成されました。

調査の際には、OracleEnterpraseManagere(OEM)で表領域の枯渇を確認していましたので、あとは、「デフォルトの表領域に所属しているテーブルの一覧と、各テーブルが使用しているサイズ」がわかれば調査としてはOKです。

この時は、時間がなかったこともあり、適当に調べつつなんとかできたのですが、改めて調べて見るともう少しスマートな方法で調査できたようです。

まず、OEMで見ていた各表領域の使用量ですが、下記でリアルタイムに取得可能です。

 

select TABLESPACE_NAME,

       TABLESPACE_SIZE/1024/1024/1024 TOTAL(GB)”,

       USED_SPACE/1024/1024/1024 USED(GB)”,

       USED_PERCENT USED(%)”

from DBA_TABLESPACE_USAGE_METRICS;

 

TABLESPACE_NAME                 TOTAL(GB)   USED(GB) USED(%)

------------------------------ ---------- ---------- -------

EXAMPLE                        .003906248 9.3877E-06     0.2

SYSAUX                         .003906248 .000059411     1.5

SYSTEM                         .003906248 .000081286     2.1

TEMP                           .003906248          0     0.0

UNDOTBS1                       .003906248 1.7136E-07     0.0

USERS                          .003906248 4.9174E-07     0.0

 

例えば今回Scottのデフォルト表領域となっているUSERS表領域が枯渇していたならば、USEDが100.0となっているかと思います。

DBA_TABLESPACE_USAGE_METRICSというビューに表領域関連の情報があるので、これを見たら良かったようです。

続いて、USERS表領域に存在するテーブルの一覧取得です。

select OWNER,TABLE_NAME,TABLESPACE_NAME from dba_tables where tablespace_name = 'USERS';

OWNER TABLE_NAME TABLESPACE_NAME
------------------------------ ------------------------------ -----------------------------
SCOTT DEPT USERS

SCOTT EMP USERS

SCOTT BONUS USERS

取れました。一部省略してますが、USERS表領域を使用しているテーブルの一覧です。

(★残念ながら各テーブルサイズの取得方法がわかりませんでした。こちらは後日調べて記載したいと思います。。)

これで知りたい情報を取得できました。

あとは、それぞれのテーブルについて作成者に削除依頼をしてdropしてもらえれば完了です。

データベースについては、ほとんど触ることがないため、基本的な構文ぐらいしかわかりません。管理者としてシステムの色々な部分を知っておいたほうがいいとは思うので、データ・ディクショナリ・ビューなどの、管理部分については最低限理解しておこうと思います。