wataruの部屋

20代駆け出しシステムエンジニア 低学歴な人生を歩んで来たため仕事させてくれる社会に感謝しています。 ブログの内容は映画やプログラミングに関することなど...

【Java】 JsoupによるHTMLファイルの操作

JavaでHTMLファイルを取り扱うには、Jsoupというライブラリがある。

これの使い方を備忘録として残す。

使い方としては、Jsoupで該当ファイルの読み込み
Parseして、Documentオブジェクトという形で扱うことができる。

URLで指定したWEBページ扱う

public class Main {

    public static void main(String[] args) throws IOException {
        Document document = Jsoup.connect("http://www.google.co.jp").get();
        System.out.println(document.html());
    }
}

connectでURLを指定して取ってきたページをDocument型の変数にParseして格納する。
DocumentオブジェクトでHTMLの情報を保持し操作することができる。

ファイルパスを指定して普通にParseして使う場合

public class Main {

    public static void main(String[] args) throws IOException {
        Document document = Jsoup.parse(new File("ファイルパス"),String,("文字コード"))
        System.out.println(document.html());
    }
}


Jsoupはファイルオブジェクトと文字コードを引数にHTMLファイルをParseすることができる。


HTMLのタグ(<>)を指定して要素の取り出し

public class Main {

    public static void main(String[] args) throws IOException {
        Document document = Jsoup.parse(new File("ファイルパス"),("文字コード"))
        document.select("br").forEach(System.out::println);
    }
}


HTMLをParseしてHTMLファイル内のbrタグの要素を取り出して出力まで行っている。
SelectでIDやタグを指定することでその要素と配下を取り出すことができる。

【Git】Gitのコマンド使い方 (備忘録)

Git歴の使用歴1ヶ月.. そろそろGitのリポジトリやブランチの仕組みを理解し始め、簡単なコマンドを使えるようになってきたところ。

よく使うコマンドから、あんまり使わないけど使いたいとき都度、調べてしまうコマンドをまとめていく


branch コマンド

現在、ブランチの情報を確認するコマンドと思ってよい。
各種option

オプションなし:現在向いている、ローカルブランチを確認

"-a オプション" :Git管理しているリモートにあるブランチ一覧を表示

"-vv オプション " : ローカルブランチの詳細まで表示するコマンドの認識でよい。 ローカルブランチの表示/追跡ブランチの表示/コミットIDの表示

checkout コマンド

branchの向きを変えるコマンドというコマンドの認識でよい
SVNでのcheckoutと意味が違うので最初は理解するのが難しい。

コマンド
git chekcout ブランチ名

git branchの結果が以下の時

* x.xx-xxx
y.yy-yyy

git chekcout y.yy-yyyでブランチを切り替えることができる。
※この時、今向いているブランチのコミットされていない修正があると、向き先のブランチにマージされてしまったり
修正が消えてしまうので必ずコミットするかstashをすること!

【Java】ユーティリティクラスとは便利なクラスである。ユーティリティそれは、有用性

f:id:koko55120:20190423234331j:plain



こんにちは!
Javaの開発でユーティリティクラスというものを聞いたことはありますか?
開発の現場で、まずユーティリティクラスってあるの?みたいなところから始めたり...

自分は、聞いたことなかったんですが、かなり便利なんです。

今回は、ユーティリティクラスってどんなものなのか?というのを現場で学んだことをアウトプットしていきます。



目次

  • ユーティリティクラスってなんなの?
  • ユーティリティクラスの構成
  • ユーティリティクラスのメリット



ユーティリティクラスってなんなの?


そもそもユーティリティという言葉は
”英単語で、「役に立つもの」「有用性」「効用」「公益」などの意味。 住宅建築におけるユーティリティールーム(家事室)のこと。”


という正直意味不明なんですが。
便利であるって感じですかね。

ユーティリティクラスも同じような意味でとにかく便利なクラスです!

特徴としては、便利なメソッド群をstaticな領域にまとめて、使いたい時に簡単に呼び出すという万能なクラスです。

例えばですが、いくつかのクラスでObjectがNullおよび空文字かどうかを判定して、booleanで返したい。そんなときにわざわざクラスごとにメソッドを定義するのはアホくさいですよね。

抽象クラスにまとめておくとかでも良いんですが、ObejectがNullおよび空文字かの判定って結構使いそうじゃないですか?

だったらstaticなクラスに定義してパラメータ渡して簡単に呼び出そうよって感じなのがユーティリティクラスです。



ユーティリティクラスの構成

ユーティリティクラスのイメージは説明したので次は構成です。

ちょこっと書くとこんな感じ。

public static class test {

 private test(){ //コンストラクタをprivateにしてインスタンス化させない
}

public static boolean method(String o){ //例えば引数に受け取ったオブジェクトのNull判定する場合とかね。
 if (o == null | o.equals("")){ 
return true;
}

public static int method(String o){ //例えば引数に受け取ったオブジェクトをintに変えて返すみたいな。
 { 
int a = Integr.parseInt(o);
 return  a;


}

クラスとメソッドのアクセスはstaticですね。インスタンス化しないで呼ぶようなイメージ

あと、インスタンス化させないようにコンストラクタはprivateですね。

なんかこういうのメソッド使うなぁみたいなのを定義しておくと良いですね。

ユーティリティクラスに定義しておきたいものとして
・文字列変換
・空白文字削除
・ソート
・日付インスタンス取得

とかですかね。




ユーティリティクラスのメリット


メリットとしては、共通の機能群みたいな位置づけでいろんなところで使いまわせるところではないでしょうか。

あとは、共通化することでソースコードが減ったり、インスタンス生成しないしゴミも増えない。

staticの呼び出しで何をしているかわかりやすいとかなどじゃないですかね。


しらんけど。

まとめ

ユーティリティクラスはstatic領域にある便利な機能群

現場によって、ユーティリティクラスは絶対違うと思うし。ネットで見ると反対派がいるんですね~

結構便利だと思ったんだけどなw

ユーティリティクラスについて認識間違ってたらコメントください。

<Java>private static finalな定数って何なの? staticにする意味あるんすか....

f:id:koko55120:20190330113116j:plain

こんにちは!
Javaのクラスのみで使う定数でアクセス修飾子で"private static final"ってやつ
見ますよね。
そもそもこのアクセス修飾子の本質的な意味を考えていませんでしたが、
staticにする意味あるのか...とか思ったのでいろいろ調べてみました。

class test {

private static final String = "HOHE_HOGE_HOGE”;

}


初めに結論から言うとprvate static final修飾子は

そのクラスでしかアクセスできない、かつクラスに1つである定数であり
staticにすることでメモリを抑えるというメリットがある。
インスタンスを複数生成することを前提とするクラスには効果があり


そもそも、private修飾子はそのクラス内でしかアクセスできません。
※サブクラスからもアクセスはできない。


次にstatic修飾子というのは、クラスに対して静的である。(意味不明)
簡単に言うとインスタンスをいくつ生成しようがそのクラスに1つしか存在しない
ことを担保する修飾子です。
アクセス修飾子については以下の記事で書いてあります。
wataru55120.hatenablog.jp


本題です。
privateでfinalというのはそのクラスでしかアクセスできない定数であるということ。

class test {

private  final String = "HOHE_HOGE_HOGE”;

}

とすれば、宣言したクラスでしかアクセスできない"HOHE_HOGE_HOGE"という初期値に変更が無いことを
担保していますよね。

つまりこの定数にアクセスするには、このクラス自体がstaticでない限り
インスタンス化をする必要があります。

しかし、インスタンス化するということは、定数がstaticである必要がないのでは...
と思いますよね。

調べた結果

static変数とインスタンス変数の違いは
クラスに対して1つであるか。インスタンスに1つであるという違いです。

クラスで複数のインスタンスを生成する場合は、それぞれ使い分ける
必要がありそこに意味があります。

定数をstaticにすれば、インスタンスごとではなくクラスの大して1つしか
存在しないためメモリを抑えられます。

つまり
インスタンスを複数生成することが前提なクラスにメモリを抑えるメリットがあり
1つしかインスタンスを生成しないことが前提あればstaticにする必要はそこまでない
ということになります。


うーん。調べながらなので間違ってたならすみません。

<SQL>テーブル結合 

データベースを扱う時、二つのテーブルからデータを取り出して結合したい時ってありますよね。
Joinという関数を使いましょう
あと、INNER JOIN句は結構使いますね...


内部結合

それぞれのテーブルから指定したカラム名の値が一致した箇所だけを結合する結合です。

INNER JOIN句を使用します。

構文
SELECT カラム名1,カラム名2, .... FROM テーブル名1
INNER JOIN テーブル名2 ON 結合する条件

上記の文で行っていることは、テーブル名1からカラム名1とカラム名2を取り出す
テーブル名2から テーブル名1と指定したカラム名が一致すればテーブル名1に結合しなさい。
という処理です。

具体的に説明しましょう。
以下のテーブルがあったとします。

USER_INFO

USER_NAME USER_ID CONFIG
wata A001 プロパー
koji B001 派遣
hoge C001 契約

USER_INFO_LOG

USER_ID FIXED_DAY
A001 YYYY/MM/DD
B001 YYYY/MM/DD
D001 YYYY/MM/DD

USER_INFOテーブルから値を取り出してUSER_INFO_LOGから同じUSER_IDがあれば結合したい...という時

SELECT * FROM USER_INFO As A
INNER JOIN USER_INFO_LOG As B ON A.USER_ID = B.USER_ID;


このSQLを流すと..

USER_NAME USER_ID CONFIG USER_ID FIXED_DAY
wata A001 プロパー A001 YYYY/MM/DD
koji B001 派遣 B001 YYYY/MM/DD

となる。USER_INFOのA001とB001がUSER_INFO_LOGのUSER_IDと一致するため結合される。

注目すべき点はC001が無いこと。
INNER JOINではベーステーブルから条件に一致しない箇所は削除されて結果出力します。

外部結合

内部結合と同様にそれぞれのテーブルの指定したカラムの値が一致するものを結合するの加え
どちらかのテーブルにしか存在しないものも取得する。

構文は以下

SELECT カラム名1,カラム名2, ...FROM テーブル名1
LEFT(RIGHT) OUTER JOIN テーブル名2 ON 結合の条件

LEFTとRIGHTとは何ぞやと...


LEFT OUTER JOIN → 左側のテーブルを軸にして外部結合
RIGHT OUTER JOIN → 右側のテーブルを軸にして外部結合

要はON句でどっちを基準にするかという話です。
具体的に書いてみます。


左から。LEFT OUTER JOIN

SELECT * FROM USER_INFO AS A
LEFT OUTER JOIN USER_INFO_LOG ON A.USER_ID = B.USER_ID

以下になります。

USER_NAME USER_ID CONFIG USER_ID FIXED_DAY
wata A001 プロパー A001 YYYY/MM/DD
koji B001 派遣 B001 YYYY/MM/DD
hege C001 派遣 NULL NULL


当然左を基準とするため、USER_INFOテーブルの値はすべて出力されます。
3行目です。NULLとなっている箇所はUSER_INFO_LOGで一致していない箇所になります。

OUTER JOINはINNER JOINと違って切り捨てません。
一致しない場合は結合相手のところをNULLで埋めます。



次です。RIGTH OUTER JOIN

SELECT * FROM USER_INFO AS A
RIGHT OUTER JOIN USER_INFO_LOG ON A.USER_ID = B.USER_ID

USER_NAME USER_ID CONFIG USER_ID FIXED_DAY
wata A001 プロパー A001 YYYY/MM/DD
koji B001 派遣 B001 YYYY/MM/DD
NULL NULL D001 YYYY/MM/DD

3行目はUSER_INFO_LOGと一致しない箇所をNULLで埋めています。


まとめ

以上が結合です。
仕事中にまじで意味不明すぎて調べたものをアウトプットしています。間違ってたらすみません....

Java 配列と繰り返し文間違えポイント

配列で間違えやすいポイントをまとめます

配列の宣言と初期化

・配列の初期化と要素の指定は同時にできない。

次の宣言はエラーになります。
例 int array[] = new int[3] {10,20};

new int[3]で要素数3の配列を生成した後、{10,20}で初期化しているのはエラーになります。

・基礎的な宣言の仕方

データ型 変数名 = new データ型;
 

・配列型変数の宣言と初期化する例

データ型 変数名[] = {10,20}

配列型の変数を宣言して、値を入れて代入しています。

・配列の生成と初期化する例

データ型 変数名 = new int {10,20,30}
 

・要素数0の配列の宣言

int array = {};

・多次元配列の宣言
int array = { {10,20},{30,40};

int array = new int;

int array = new int[1]; //問題なし

※配列の二次元目を空白にするのはエラーになります

int array = new int[1]; //問題なし

・繰り返し文のルール

・for文は式1、式3を省略できる。
※可読性が下がるため控えるほうがよい。

for(; i < 5; ;){}

・for文、while文、do while文は{}を省略できる

繰り返しをしたい処理が一行であれば省略することができるが
do while文の場合、doのブロックで2行の処理を記載するとエラーになる。

1 for(int i = 0; i < 5; i+) System.out.print("ここの一行が繰り返しの対象");
2 System.out.print("ここの一行が繰り返しの対象");

上記の例では、1行目の出力のみがfor文の繰り返しの対象になる。
繰り返し終了後、2行目の出力を行います。

7章<例外処理>

javaの例外処理の重要なポイントをまとめる。

もくじ

  • 例外クラス
  • try-chtch-finaly
  • throwsとthrow
  • 継承関係とオーバーライド時の注意


例外クラス

例外のクラスはthorwableクラスで全てそこから継承されている。
・メモリ不足などのエラーに関するクラスはErrorクラス
・アプリケーションで発生するエラーに関するクラスはException

例外が発生した際に例外に対する処理を必ずしなければならないものと任意のものがある。

・Exceptionクラスを継承したRuntaimeExceptionクラスおよびそのサブクラスは例外処理は任意

・ExceptionクラスおよびRuntaimeException以外のサブクラスの場合は例外処理は必ず記載する

try-chtch-finaly

Try文の記載には組み合わせルールがある
・try-catch-finalyの組み合わせ

・try-catchの組み合わせ

・try-finalyの組み合わせ

try文だけで記載するとコンパイルエラーになります。

finalyブロックは例外の発生有無にかかわらず必ず処理する。

catch文の中でreturn文がある場合。
finalyブロックが先に処理される

処理はcatch→finallyだがreturn文をする前にfinallyが実行されるということ。

catchブロックとfinallyにreturnがある場合
finallyの値で上書きされる。

catch文の戻り値があり、finallyで上書き処理をしても反映されるのは、プリミティブ型だけでcatch文の戻りを上書きしない。
参照型の場合は上書きされる。

throwsとthrow

throwsは呼び出し元に例外を投げる
f:id:koko55120:20190303151400p:plain


throwは例外を意図的に発生させる
f:id:koko55120:20190303151919p:plain


継承関係とオーバーライド時の注意

throws指定されたメソッドをオーバーライドした際のルール
・サブクラスがスローする例外は、スーパークラスのメソッドと同様かそのサブクラスとする。
・サブクラスのスローする例外はRuntimeExcepitonおよびRuntimeExcepitonのサブクラスの例外はスーパークラスに関係なくスローできる。
スーパークラスにスローがあってもサブクラスでスローしないことは可能。

スーパークラスでArrayindexoutofboundsexceptionをthrows
サブクラスでIndexoutofboundsexceptionをthrowsするのはエラーになる。

※ArrayindexoutofboundsexceptionはIndexoutofboundsexceptionのサブクラスであるため

try-catch文にも継承関係のルールがある。
・catch文でcatchする例外はサブクラスから順番に書く。

f:id:koko55120:20190303153109p:plain

スーパークラスで例外をcatchすると到達不可能になるため...