PGを目指す修行マン

PG修行中・転職活動中の備忘録

replaceAll

標準ライブラリについて調べていた中で、replaceとreplaceAllについてかなり重要な違いがあったのでメモです

replaceAllは正規表現を使えるのですね。(。_。)φジュウヨウ

 

参照先が詳しすぎて書くことが…ない!

java-beginner.com

URLが消えてしまったときのためにこちらにも自分でまとめます

サーバー開始に失敗

コンソールくん「重大:子コンテナの開始に失敗しました」

というわけでサーバーエラーでうんともすんとも言わなくなったTomcatさん。

正しくはこのときのプロジェクトに問題があったので、サーバー自体は正しく活動するし他のプロジェクトでなら大丈夫。

Tomcatのバージョン関係なく起こります。というか起こしてます。

ついでにこの後同様の理由でサーブレットへの遷移で404も起こしていました。

 

~解決~

いくつかのクラスでURLが正しく記述されていないことで起こっていました。

例えば./をつけ忘れていたとか。.jspつけていなかったとか。URLは間違っているはずがないとなぜか自信を持って思い込んでいたことがエラーでした。まさにヒューマンエラー!

この後、サーブレットの方はweb.xmlでURL管理することにしました。これまでは新規でサーブレットを作る際にURLパターンも記述していたのですが、やはり一括で確認できるほうが効率がよいので。

備忘録として書き方を残します。以下は例です。

<web-app~>
<servlet>
<servlet-name>Login</servlet-name>
<servlet-class>com.stockmanage.userEdit.Login</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Login</servlet-name>
<url-pattern>/Login</url-pattern>
</servlet-mapping>
サーブレット名は希望の名前、クラス名はパッケージ名から記述、URLパターンは希望のパス名で。
web.xml書いたら各サーブレットの記述済みアノテーションは削除しておきましょう。
なお、このurlパターン通りにjspにURLを記述したらドツボにはまってしまったのですが、上の例で、/サーブレット名だとlocalhost~/Loginになってしまい、404になります。正しくはlocalhost~/プロジェクト名/Loginでないといけません。jspに記述するときはhref="Login"となるように記述しましょう。(/をつけると直接指定することになってしまうそうです。web.xml関係なくなりますが、./Loginとしてもキチンと実行されます。)
 
本記事は下記を参考にしました。

SE8Silver黒本1周

総まとめ問題以外、9章までなんとか黒本1周しました!

以下解答と結果です。

f:id:naminokouji:20200706005227j:plain
f:id:naminokouji:20200706005231j:plain
f:id:naminokouji:20200706005234j:plain
f:id:naminokouji:20200706005237j:plain
f:id:naminokouji:20200706005241j:plain
f:id:naminokouji:20200706005244j:plain
f:id:naminokouji:20200706005248j:plain
f:id:naminokouji:20200706005252j:plain
f:id:naminokouji:20200706005256j:plain
各解答

正答数/問題数 正答率

1章Javaの基本
5/9 55%

2章データ型の操作
7/12 58%

3章演算子と判定構造の使用
7/22 31%

4章配列の作成と使用
5/11 45%

5章ループ構造の使用
9/17 52%

6章メソッドとカプセル化の操作
10/22 45%

7章継承の操作
2/17 11%

8章例外の処理
8/22 36%

9章Java APIの主要なクラスの操作
16/32(ラムダ抜き) 50%

総合
69/164 42%

9章は一応調べながらやりましたが理解が及んでいない感じです。解説を読んでもわからない感じのがありました。

切ない話ですが問題文読まずに回答数を間違えたり正しいもの正しくないものを逆に選んでいたりすることが多いのでここはとても気をつけましょう……

ラムダ式は今回は抜きで行きます。

あとは食事時にやさしくないJavaや解説動画を見て学習しています。

youtu.be

youtu.be

Javaのリテラルの見分け方

Silver対策の中でリテラルの見分けで躓きまくってしまったので備忘録です!以下は試験の中で思考するための説明になっております。

今回の題材

・2進数・8進数・16進数の整数リテラル

・intかLongか

・アンダースコアの使用

・文字リテラル

 

2進数

…先頭に0b、もしくは0Bがつく

例)10進数の0から100だと、0b0から始まって0b1100100で終わる

8進数

…先頭に0がつく

例)10進数の0から100だと、00から始まって0144で終わる。8、9は使えない

16進数

…先頭に0xがつく

例)10進数の0から100だと、0x0から始まって0x64で終わる。0から9までいくと、次はaからfに切り替わって数が増えていく。

 

次にintかlongかを見分ける方法ですが、long型はリテラルの末尾にLをつけなければいけません。(floatも末尾にFをつけなければいけません)

ちなみに、よく使うintの最大値は2147483647です。21億!大きな数字を扱う予定があるときに気を付けなければいけませんね。

 

次に、リテラルにアンダースコアを使用する場合です。

アンダースコアは桁数の多い整数リテラルの見やすさを向上させるために使用でき、ルールに則れば記述は自由です。

ルール)リテラルの先頭と末尾、記号の前後には使用できません。

 

最後に文字リテラルを数字で記述する方法です。

・シングルクォーテーションで囲った文字

・シングルクォーテーションで囲い、先頭が\uで始まるUnicode番号

・0から65535までの数字(char型に代入できる)

以上!

クエリストリング

URLリライティング、クエリストリング。ちぃ、おぼえた!

 

世代が割れそうです。今回はすっかり存在を忘れていて課題の中で苦戦した、クエリストリング(クエリパラメータ)についてです。

なんのことはない、リクエストスコープのように使えるデータを受け渡す方法です。(JSPサーブレットを使う前提です。)

 <a href="送りたいページのURL?id="指定したい値">ここをクリック</a>

idにあたる部分はクッキーやセッションの第1引数と同じように値を引き出すためのステッカーなので、nameでもなんでもOKです。

URLの後ろにこう記述することで、後ろに指定した値がformのactionのようにURL先に渡されます。

主な使い道は番号などを渡して該当者のデータをDBから探して詳細を表示する、などでしょうか。

サーブレットで受け取るときに、

request.getParameter("id");

と指定すれば受け取れます。

クッキーやセッションはsetAttributeしたりしなければいけないのに対し、URLで渡せてしまうのでお手軽ですね!

 

以下を参考にしました!

thinkit.co.jp

webtan.impress.co.jp

インスタンス生成メソッド

本日はコードの可読性を向上するアイディアを学んだので備忘録とします。

 

課題のとあるクラスで自分自身のインスタンスを作成して戻り値にするメソッドがあり、首を傾げたのでメンターさんに質問しました。

わざわざインスタンスをnewするなら使用するときにnewしてしまえばいいじゃない?と思ったからです。

結論として、このメソッドの作成目的は「ソースコードの可読性の向上」でした。

例えばクラスAとクラスBがあり、クラスAでクラスBのメソッドを使用するとします。

 

public class B{
    public static B getInstance(){ //戻り値の型B
    return new B(); //Bをnewして返す
    }
    public hoge(){
    何らかの処理
    }
}

public class A{
    public static void main(String[] args){
    B.getInstance().hoge(); //newとメソッド実行を1行に記述
    }
}

 

Bクラスのhoge()を使用するためには本来こう記述します。

 

B b = new B();

b.hoge();

 

2行になりました。

短い記述ですが確かに1行の方が即座にBクラスのメソッドだと分かるしスマートです。他人が書いていたらgetInstanceメソッドの内容を確認しに行かなければなりませんが、メソッド名である程度予想できるし最低でも詳細設計書を見ればわかるのではないでしょうか。

それに本来はクラスBのhogeメソッドを使うためにインスタンスを作らなければいけませんが、staticなgetInstance()ならさっと呼んでついでにhoge()…という具合です。(※new B().hoge();でも実行できるのでは?と思いましたがされないということは可読性が下がるかできないということでしょうね?)

使用頻度の低いメソッドだからこそこうやって近道する意味が生まれる、ということでした。なるほどです。

このときコードを短縮するのは処理を少しでも軽くするため?と思ったのですが、現代のPCスペックだと関係ないほど技術が向上しているようですね。たかだか十数年ですごいです。ですから、ソースコードを書くときは可読性第一で行きましょう。

 

ちなみに上記のように.(ドット)でメソッドをつなげていく方法をメソッドチェーンと呼ぶようです。

メソッドチェーンとは前のメソッドで返された値が持つメソッドを次々に実行していく方法です。必ず前のメソッドが返した値がメソッドを持っていること(つまりクラスのインスタンス?)が条件になります。

(そのインスタンス変数に対して複数の関係ないメソッドを使えるわけではないです!分解して式として考えるとよいでしょう)

 

下記URLはメソッドチェーンに関して参考にしました。

taiju.hatenablog.com

進捗

梅雨に入りそうな気配がしてきました。

時期的にはもう梅雨に入っているはずですが。

雨といえばネイチャー系ドキュメンタリーの雨と草原や林の映像が好きです。ジャンルから見ると写真家は結構いるものの、映像はなかなか撮る人が少ないですね……

 

Silver黒本は1周目6章まで終わりました。我ながら凄まじい誤答率です。(60%)基礎本やカリキュラムだけでは全く網羅できていないということになります。実際知らない知識がわんさか出てきました。やはり仕事にする前に試験を受けずとも2周はすべきかと思います。

6月中に試験を受けたいと思って進めていますが課題と並行するのは結構きついです。(復習もしなければいけないので)なんとか毎日2時間は確保しています。

カリキュラムではひとまとまりのプロジェクトのソースコードを修正する課題をしています。今までは1から作っていたので自分で修正ポイントを見つけるというのがなかなか難しいです。

 

課題の中で数時間かけてしょうもないミスをしていたことに気づいたんですが、DBに接続できているが、テーブルへの書き込みができない!ということがあって、いったいなぜ……と試行錯誤していたんですが、警告文にテーブルが存在していないよ!とのことでシェルで確認するとテーブルはある……なぜ……となっていたんですが、結局のところ、

まだテーブル作っていなかったんです。

DBの存在を何度も確認していました。わぁ………

英語力が低いので英語の意味がそのまま頭に浸透してこないようです…読めるんですけど……

慣れないうちはGoogle翻訳に毎度頼もうと思います。