20240528
ようやくWebアプリが何をしているのかおぼろげながらわかってきた気がする。遅すぎるくらいだが。
働くと覚えられると聞いていたが本当だ。以前よりも確実にできるようになっている。何せ一日中アプリのことを考えているのだから。研修がしっかりしているのも大きいだろうが。
前はGETリクエストとかPOSTリクエストが何をしているのかもよくわかっていなかった。更新するときはPOSTでページをそのまま見るときはGETというイメージはもちろんあったが。
Servletをさわってみて、これまで使ってきたRailsがどんなに裏でいろいろなことをやってくれていたかわかってきた。いちいちコネクションを作るとかもしなくてもいい(やったけどよくわからなかった)し、そもそもデータベースの存在を意識することがあまりない。僕はSQLをほとんど使わなかった。RailsはModelとControllerとViewとが密接に絡み合っていて、絶対にそこからは逃れられない。
ServletはJavaの部分は最悪一つのViewにつき一つのcontrollerのファイルがあればそれで済んでしまう。だから自分でディレクトリ構造を考えて機能ごとにクラスを作っていくわけだが、いろいろなデザインパターンがあることを学んだ。
オブジェクト指向言語というのがなぜ必要だったのかも少しずつわかってきた。今まで意味が全然わかっていなかった。簡単な競技プログラミングでは型だとかクラスだとかはあまり使わないが、あれは手続き型プログラミングというやつだったらしい。RubyでやってたのもRubyで手続き型プログラミングをやっていたにすぎない。
RailsでRails generate modelでモデルを作るとActiveRecord::Baseなるものを継承するが、どうやらこれが全部やってくれていたらしい。
Servletを操って思うのだが、クラス間のhas-to関係とデータベース間の関係が別なのが本当にうっとうしい。全部まとめて同じものとして扱いたい。そういうコードは書けるけど、本当にめんどくさい。データベースに既存のテーブルと関連した新しいテーブルでもできようものなら発狂しそうだ。DAOだとかEntityだとかFormだとか、いくつファイルを作り、いくつ修正するのだろうか。どこかいっぱいミスってバグばかりになるのが目に見えている。その気が遠くなる作業をRailsはわずか数十分とかで済ませられるようにしてくれていたらしい。そうだったのかーー!
ところで、このブログも最初の方は特徴を付けようと思って女の子になったりしてみたが、いつもの自分の文体でいいと気づいた。僕が演じていたあの女の子は偽物だ。何より自分が偽物だと思った。多分ずっとやっていればそのうちに本物になれるのだろうが、あまりモチベーションもわかない。ときどきなろうとは思うけど……。
20240527
ここ一週間ほど調子が悪く更新できなかった。電車の中でも技術書を読んでいたせいだろう。頑張ろうという気持ちでいすぎるとすぐにバテてしまう。
今日からはアニメや漫画を見ることにした。これは必要なことだ。
昔から気を張り詰めて頑張ろうというのがどうにもできない。頑張ろうと思って生きていると気づかないうちに一日の全部が義務で埋め尽くされて、すぐに限界がくる。
さて、今日の反省としては、(これまで散々言われてきたことなのだが)コードを書く前に細かくどういう順序で何を書くか決めておかなければならないということだ。
それを怠ったせいで、バグだらけのままlocalhostを立ち上げてひとつひとつ修正していくという無駄な工程を踏むことになった。ちゃんとしっかり決めていれば半分くらいの時間で同じ成果が出せたはずだ。今まで勉強(といっても大学でろくに勉強しなかったから受験のときに遡るのだが)をしてもボードゲームをやっても、綿密に工程を考えてこなかった。だからいつも下手を打つ。
手を動かさないと頭が働かないタイプで、いつもの感覚通りにコードをまずは書いて考えてみるのだが、そうするよりもおそらく詳細設計を詰めた方がいい。詳細設計を詰めるにしても、メモ書きを書いて書いて書きまくるくらいすれば頭も回るだろう。
20240524
今日の研修では自分でも全く意味のわからないファイルをいじって迷路に迷い込んでしまった。ちゃんとひとつひとるやファイルやコードやログの意味を確かめながらやっていくしかない。最終的にネットにどこの馬の骨ともわからないやつが書いてあることは頼りにならない。
20240518
昨日の続き
今日はセッションについて調べてみる。
HttpSession getSession()
Returns the current session associated with this request, or if the request does not have a session, creates one.
HttpServletRequestクラスのgetSession()で取り出すらしい。
そういえば、そもそもHttpsessionクラスってなんだっけ。それにHttpServletRequestクラスもよく知らない気がする。
ServletRequestクラスの説明を読む。
A ServletRequest object provides data including parameter name and values, attributes, and an input stream. Interfaces that extend ServletRequest can provide additional protocol-specific data (for example, HTTP data is provided by HttpServletRequest.
ServletRequestクラスはどうやらHTTP以外のデータをもつが、HTTPに関するデータはHttpServletRequestクラスがもつことになっているらしい。getSession()がHttpServletRequestの方に入っているのはそれに関連している気がする(セッションってHTTPに特有ってことなのかな……?)。
そこでHttpSessionクラスのドキュメントを見てきたが、あぅーっ…!
セッションへの理解がもう少し必要な気がしてきた。
なんか前も同じこと言ってたような気がするな。
それじゃまた明日~!
20240517
public class Sample1 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException{// request(HttpServletRequest)にいろいろ値を入れていく
// request変数とresponse変数を使ってなんかよくわからないけどHTTPリクエストを送る
}
大体こんな感じみたいだが、これ見たとき、Ruby on Railsに慣れていたので、かなりビビった。
requestにsetAttributeを入れていって好きな変数をjspで使えるようにする(フォワード?という仕組みを使うらしい)のはRailsと同じなんだけど、別のページにリダイレクトするときにパラメーターを送る方法がよくわからなかいのは困った。なんかパラメーターは付けれませんとか書いてあるサイトもあるし。なんでもsessionというものを使わざるえないらしいが……。
あぅーっ……、そんなぁ。Railsだとなんかすぐだったのにぃぃ。
とりあえず、一番よく使うHttpServletRequestクラスについて調べてみる。
Javaxって古いらしいけど、大丈夫かな…?
まあ、いったんいいか……。
待った!Jarkaraのドキュメントちゃんと見よう。
HttpServletRequestクラスのメソッドの中にはgetSessionというメソッドがあるから、sessionとやらを使うときはきっとこれを使うんだろうな。
で、いつもよく使うsetAttributeとかgetRequestDispatcherとかはどうやらHttpServletRequestクラスにextendされているservletRequestクラスに入っているらしい。getがつくのは50くらいあるのに、setがつくのはsetAttribute, setCharacterEncodingの二つしかないらしい。setAttributeは大好きだけど、setCharacterEncodingってなんかあんまりテンション上がらんなあ。大事やろけど。
おっと、主に知りたいのは別のページにどうやって値を渡すかなんだよな。
また明日考えようか。
20240516
昨日は意味のわからないORACLEのドキュメントを読んでいて、何の意味もなかった。もっと地に足がついたものを読むことにする。
データベーステーブルにどうやって一意のIDを振るかという話なのだが、どうやらSEQUENCEというものを使うのがいいらしい。
CREATE TABLE t1 (id NUMBER);
INSERT INTO t1 (id) VALUES (my_seq.NEXTVAL);
INSERT INTO t1 (id) VALUES (my_seq.NEXTVAL);
COMMIT;SELECT * FROM t1;
ID
----------
9
102 rows selected.
SQL>
でも、これってデータ入力のたびにmy_seq.nextvalってただ打ち込んでいればいいのかな。なんかの拍子にリセットされたりしない?
いや、リセットされるのは逆に意味わからんか。データ全部リセットされたら大変なことや。
How to Use Sequence Values
When you create a sequence, you can define its initial value and the increment between its values. The first reference to NEXTVAL returns the initial value of the sequence. Subsequent references to NEXTVAL increment the sequence value by the defined increment and return the new value. Any reference to CURRVAL always returns the current value of the sequence, which is the value returned by the last reference to NEXTVAL.
多分その理解で大丈夫な感じがする。そうか。データ入力のたびにmy_seq.nextvalをinsertすれば自動で1ずつ大きい番号が割り振れるのか。
今日はこの辺で。
20240515
昨日の続き。
昨日は最初の段落をちまちま読んでいたが、ちゃんと本文を読んでいこうと思う。
お、やっぱりConnection Stringsはdatabaseのサービスに固有(specific)のものだってやっぱり書いてある。昨日学んだことが出てくると嬉しいね。
さっそくわからない単語が出てきた。CDB level???
調べるとどうやらCDBというのはデータベースの集合らしい。PDB levelというのはそのデータベースの集積の中の一つ下の階層のようだ。
意味がわからない。
理解を諦めて先に進むことにする。
だんだんこの本文自体も僕の理解の遥か上にあることがわかってきた。
とりあえずデータベースとアプリがどうやって通信しているか大枠のイメージを掴めればいいかな。早く読んじゃおう。
と思ったけど、大体どこに僕が知りたいものが書いてあるかはわかったけど、書いてあることがあまりにも意味不明すぎる。ちゃんと読めたとして今の僕には意味ないだろ、これ。
明日からは読書に戻ります……。Oracleのドキュメントなんか読むんじゃなかった。