山田 啓介 のすべての投稿

jpaについてInsetとSelectについて調べてみました。

Java eeとかJSFとかについて調べてみるとデータベースにアクセスするためのJPAという技術を使っているようです。

java ee, JSFの簡単なチュートリアルから始めてみました。

実際に試してみるとコードをほとんど書くことなく、データベースの一覧の表示からデータの投入ができるので本当にびっくりしました。

ただ、JPAではSQL文をそのまま使うのではなくjpqlで書くようです。

ちょっとネットで役に立ちそうなページを探してみました。

Using Java Persistence API for Java SE 7 Desktop applications in NetBeans 7

JPQLでのデータベースの参照および更新方法

ここで一番目のページからソースをとってきて2番めのページに書いてあることを試してみました。

試して作ったコード

Netbeans 8であれば動作すると思います。一番目のページを元にDerbyでデータベースを作成したあと試してみてください。

InsertについてはCreatePlayers.javaを実行すれば新しいデータを追加します。

情報の検索についてはselectPlayers.javaを実行すればSelectを使用できます。

まず試してみたのは、IDを元にデータを取る方法です。selectPlayers.javaでは以下のように書きました。

        Query q = em.createNamedQuery("Player.findById").setParameter("id", 1);

        Player p2 = (Player) q.getSingleResult();

        System.out.println(p2.getFirstname());
        System.out.println(p2.getId());
        System.out.println(p2.getLastname());

クエリーの指定は “Player.findById”にしていますが、これは自分で作ったものではなく、Netbeansで「データベースからのエンティティクラス」により新規作成した時に生成されたものになります。

@NamedQueries({
    @NamedQuery(name = "Player.findAll", query = "SELECT p FROM Player p"),
    @NamedQuery(name = "Player.findById", query = "SELECT p FROM Player p WHERE p.id = :id"),
    @NamedQuery(name = "Player.findByLastname", query = "SELECT p FROM Player p WHERE p.lastname = :lastname"),
    @NamedQuery(name = "Player.findByFirstname", query = "SELECT p FROM Player p WHERE p.firstname = :firstname"),
    @NamedQuery(name = "Player.findByJerseynumber", query = "SELECT p FROM Player p WHERE p.jerseynumber = :jerseynumber"),
    @NamedQuery(name = "Player.findByLastspokenwords", query = "SELECT p FROM Player p WHERE p.lastspokenwords = :lastspokenwords")})

ここで生成されたものから、必要に応じて利用しています。ここでjpql文については自分で作成することもできるのでJoinしたものやLikeなどを使用したものを利用できるみたいです。これについてはまた改めて調べてみたいと思います。

ここでidによる検索を選択し、IDをsetParameterで指定することで検索します。IDはユニークなキーなのでgetSingleResult()を指定しました。

複数の結果が出てくる場合にはこのような方法ではなくListでデータが渡されるようなのでまた違う方法が必要になります。

selectPlayers.javaでは以下のように書きました。

        Query q2 = em.createNamedQuery("Player.findAll");
        List results = q2.getResultList();
        if (!results.isEmpty()) {
            Iterator itr = results.iterator();
            while (itr.hasNext()) {
                Player p3 = (Player) itr.next();
                System.out.print("ID:" + p3.getId());
                System.out.print("   NAME:" + p3.getFirstname() +":" + p3.getLastname());
                System.out.println();
            }
        } else {
            System.out.println("There is no any record.");
        }

getSingleResult()の代わりにgetResultList()を使用しています。またデータの方がlistなのでIteratorを利用して複数のデータを処理しています。

他にも方法があれば調べてみたいと思います。

あとはUpdateと複雑な検索について調べてみたらまたアップしたいと思っています。

java ee ログインでのユーザー名の表示とログアウトさせる方法について

ユーザーログインを必要とするサイトを作るときにJava EEだと比較的に簡単に作れると思います。

Java eeでユーザー認証の機能を試してみました。

java ee でユーザー認証をderbyを使って行ってみる

これらのサンプルを試してみて、疑問に思うことがありました。

  • ユーザー名の表示はどうするのだろう。
  • ログアウトする方法

jsp /Servletで作った時はユーザー名は変数に割り当てていまししたし、ログイン状況の確認はクッキーを使用していたので特に何も考えなくても問題はありませんでした。

java eeの場合、ある程度その辺りについては部品化されているので、それを行うのにはコードが用意されているようです。

jspの場合

Java eeでユーザー認証の機能を試してみました。」を試してみるとadminでログインをした後にuserにログインし直したい場合、ブラウザーを閉じるなどしないとログインしなおせませんでした。

また、ロールごとに表示させるページを指定するのはweb.xmlでできるのですが、ユーザーごとに表示させる内容を変えたい場合にはユーザー名をシステム側で認識する必要があります。

ユーザー名を表すもの

私が試したのは

  • request.getRemoteUser()
  • request.getUserPrincipal().toString()

で、どちらもユーザー名が表示させることが出来ました。

HttpServletRequestを利用しているようですがjspの場合だと、明示的にインポートしなくてもそのまま利用できました。

ログアウトの方法

ログイン状態の管理はクッキーか、ローカルに何か情報を持っているのかとChromeで調べてみましたが、見つかりませんでした。

インターネットで調べてみたところ、

  • session.invalidate();

を実行することで、ログアウトはできるようになるようです。

セッションで管理していてセッションごと無効にすることで対応するみたいです。

JSFの場合

java ee でユーザー認証をderbyを使って行ってみる」の場合、JSFで作成されています。ユーザー名を調べる場合には

ログインユーザ名:<h:outputLabel value=”#{request.userPrincipal.name}”/>

とすることでユーザー名が表示されます。

このチュートリアルではログアウトでは、「<h:commandButton value=”ログアウト” action=”#{indexPage.logout()}”/>」で実現しています。このIndexPage.javaのlogout関数では

    public String logout() {
        ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext();
        externalContext.invalidateSession();
        HttpServletRequest request = (HttpServletRequest) externalContext.getRequest();
        try {
            request.logout();
        } catch (ServletException ex) {
            Logger.getLogger(IndexPage.class.getName()).log(Level.SEVERE, null, ex);
        }
        // return "index.xhtml?faces-redirect=true";
        return "/faces/login/index.xhtml?faces-redirect=true";
    }

コードを読んでいくとJSPと同様にセッションを無効にしたあと、HttpServletRequestにはlogoutという関数を実行しているようです。

jspでもこの関数が使えるか試してみました。

<% session.invalidate();%>の代わりに<% request.logout(); %>を入れてみたところ想定通りに動きました。

まとめ

Java EEだとログインとそれに伴うログイン管理は入っているので開発は楽だなと思いました。

これらの情報は自分にとってはまとめられているようにも見えないのでちょっとずつ自分でも調べていきたいと思います。

関連リンク

glassfish – How can I get j_username on my index.jsp after successful authentication with j_security_check? – Stack Overflow

java – How to get login attributes from a servlet/jsp – Stack Overflow

How do I log out of an application that uses Form authentication? – Web Tutorials – avajava.com

java ee, JSFの簡単なチュートリアルから始めてみました。

Java eeでユーザー認証の機能を試してみました。」と「java ee でユーザー認証をderbyを使って行ってみる」でJava eeでできる認証について調べてみましたが、そもそも基本がわかっていないので、細かいところがわかりませんでした。

最初は「Java EE 7 入門 〜 NetBeansで始めるJavaEE7 First Tutorial #javaee7 #jjug #j…」をみてやったのですが、色々盛り込み過ぎていて理解しきれなかったのと、コードを見ながら書いたのですが、どこかで間違ったのか正常に動かなかったので、githubにあるソースを使い検証しました。jsf でのデータベースアクセスとwebsocketを利用したものでチュートリアルとしては素晴らしい物でした。

けど簡単なところから始めよう。

続きを読む java ee, JSFの簡単なチュートリアルから始めてみました。

java ee でユーザー認証をderbyを使って行ってみる

この前書いた記事ではglassfishにあるfile realmを利用してのログインを検証しました。fileベースなのでユーザーが増えた時や、利用者がパスワードを変更したい時などは何かと運用が難しいと思いました。

そこでjava ee でDerbyを利用したユーザー認証の例があるか検索したところ簡単に見つかりました。

たかがレルムされどレルム GlassFish で始める詳細 JDBC レルム | 寺田 佳央 – Yoshio Terada

またgithubなどでコードもあるので利用しました。

結果から言うと無事に動きました。以前、「エンタープライズシングルサインオン USO」の動作を説明するために動画を作ったのですが、その際にはJSP + Derbyで認証システムを構築しました。

デモ用なのでパスワードの暗号化などは行っていませんが、データベースと接続するための仕組みや、パスワードの変更などはDerbyと接続してSQL文で命令を作りました。

その時と比較するとJSFとかmavenとかの機能を利用したことは殆どなかったのですが結構簡単にできるのかなと思いました。

このチュートリアルで迷ったところ

とりあえずチュートリアルを作った時期にはNetbeans 8ではなかったので動作環境が違うからなのかちょっと変更した部分がありました。

うえの動画の認証の仕組みはとりあえずSQL文を直接実行する形になっているのでサーバー側の設定は必要がありませんでしたが、こちらのチュートリアルのP.29ではデータベースとの接続には接続「jdbc/__default」をしていたのですが私の環境ではなぜかうまくいかなかったのでデーターソースを作りなおしました。

20140521-s01

チュートリアル通りにしようと思うと上の画面が出てくました。そこでNetbeans データ・ソースを指定するとき「新しいデータ・ソース」を選択することで解消しました。

20140521-s02

ここから実際のデータ・ソースを選択してください。20140521-s03

ここで設定した内容についてはGlassFishの管理コンソールで簡単に確認できるかと思います。Web管理コンソールはNetbeansから起動できるのですがhttp://localhost:4848/にアクセスすれば利用できます。

そこで、左側のメニューから リソース→JDBCリソース、JDBC接続プールで確認できます。

なぜ上のようなエラーが表示されたのかはわかりませんが、今度またしらべて見たいと思います。

もう一つはp.94あたりで権限がないユーザーがアクセスした時に通常であれば403エラーが表示されるのですが、それは利用者にとってわからないのでそのエラーページ用のページを作成しています。

私が試してみたところ、このページが表示された時でも権限のないユーザーとしてはログインしているのでログインページに戻ってもこのページにアクセスすることになります。

そこで、このページが表示された時にログオフすることが必要だと思いました。

error-403.xhtmlに「<h:commandButton value=”ログアウト” action=”#{indexPage.logout()}”/>」を追加し、ログオフボタンを表示させました。

この場合、ボタンを押したらログオフができるのですが、ページが見つからないとエラーが出たので「IndexPage.java」のlogout()関数を調べると、「return “index.xhtml?faces-redirect=true”;」とありましたが、error-403.xhtmlがあるディレクトリーにindex.xhtmlがないのでエラーになるはずです。そこで「return “/faces/login/index.xhtml?faces-redirect=true”;」 としたところ期待した動きになりました。

チュートリアルでわかったこと

JSPとサーブレットだけでゴリゴリ書けば同じことができるのはわかっていたのですが、これほど高度なことをつくろうと思うと結構な手間がかかるような気がします。

ログインのパスワードもパスワードを生で入れているわけではなくハッシュで対応し、パスワードの検証ができるのは結構驚きました。

このチュートリアルでJSFやmavenなどに触れてみましたが、やはりいろいろなことをするのであればこのような技術について勉強したほうがいいなと思った次第です。

このチュートリアルでは認証だけでなくデーターベースへの追加の方法なども書いてあるのでコードを見てみて勉強してみたいと思いました。

 

Java eeでユーザー認証の機能を試してみました。

仕事柄「AccessMatrix USO」を扱っているのでユーザー認証の仕組みの作り方は知っているのですが、GlassFishでJava eeで比較的簡単にユーザー認証の仕組みが作れるようなので試してみました。

とりあえず認証ができたらということで「Securing a Web Application in NetBeans IDE」を参考にしてみました。

環境は、Netbeans 8.0/ GlassFish 4/ JDK 1.8.5で行いました。 続きを読む Java eeでユーザー認証の機能を試してみました。

#偽2ch騒動 西村博之はどこまで2chに依存しているのか考察してみる。(確認編

西村はネットで2ちゃんねるがなくてもそれ以外にもすることがあるとネットで語っています。

雑 談 専 用 ス ッ ド レ ★ 24
(http://sweet.2ch.sc/test/read.cgi/patisserie/1398291398/)

156 名前:ひろゆき@どうやら管理人 ★:2014/04/24(木) 15:14:26.43 ???
削除人を専業の人にするのが良くないって話もそうなんだけど、
2chの作業しか出来ない人って人として駄目だと思うんですよね。

157 名前:ひろゆき@どうやら管理人 ★:2014/04/24(木) 15:15:39.14 ???
おいらは、ニコ動にかかわってみたりとか、
ブラジルは、検索エンジン作ってたり、ガジェット通信やってたりとか、
社会といろんな接点を持っていたりとか、
2chが無くても困らないようになってたりするわけですよ。

311 名前:名無しさん:2014/04/24(木) 16:27:11.51 LUfIm1Slq
>>156-157
西村博之は長期にわたって2chを放ったらかしてたのに、
2chの作業すらできてなかったね

薬違法板の件は依頼メールを放置してたからああなったわけだと思うし、
scみたいな本来不要なものを作る羽目になったのも、
抜け道みたいな邪道なことばかりやってたからかなと

んで、2chが無くても困らないと言いつつ、急に権利がどうこうとか主張してておかしな話だ
個人にしろ企業にしろ、無くなったら困るから裁判どうこう言ってるんだろうに
確かに権利はあるのかもしれないけど、
あまりにも2ちゃん住民を軽視しすぎてる気がするわ

ここで冷静にじゃなんで「急に権利がどうこうとか主張してておかしな話だ」と返されています。ここまで検証しているのと同様西村はいつもの様に質問者が求めている回答には程遠い回答をします。

335 名前:ひろゆき@どうやら管理人 ★:2014/04/24(木) 16:32:03.31 ??? ?S★(1144903)
>>311
依頼メールって実際に存在したんですか?
削除の窓口も複数あって、警察の人も知ってたのに、
誰一人、そのメールは見てないんですよね。

引用;省略

質問者に一番の疑問はなぜ今になって権利を主張するのだということだと思うのですが、実際にあったであろう事柄についてのみ回答しています。

西村は常に回答に困ると話をはぐらかしますが、はぐらかすということは逆に彼が触れてほしくないところについて質問しているとも取れます。

2ちゃんねる以外にも仕事はあるが、2ちゃんねるは重要なパートであるからこそ、今になって権利を主張しているのだろうと考えています。

今回の騒動で西村が失う収益の確認

続きを読む #偽2ch騒動 西村博之はどこまで2chに依存しているのか考察してみる。(確認編

wordpressのGoogle XML Sitemaps プラグインの設定をちょっとだけ変えました。

当ブログはご覧になって分かる通りwordpressを利用しています。

ブログで記事を上げるたびに、httpdとmysqlがメモリーを食いつぶした結果最終的にはhttpd/ mysqlが自動的に再起動になっていましたが、その再起動がかかるまで1時間ほどダウンタイムがありました。

詳細については検証していないので理由までは突き止めていないですがタイミングがブログを書いて「公開」ボタンをクリックしたタイミングで発生していたことから、そのタイミングで実行される「Google XML Sitemaps」がおかしいのではないかと思い設定を変更しました。

ログをみるとメモリーを食いつぶして、処理が終わらず永久ループになっていたのでメモリーと実行時間の長さを指定できる項目があるのを確認したので設定を追加しました。

20140518-xml-sitemap-config

とりあえずメモリーの上限を16Mにして実行時間を10秒にして試したところハングアップはしませんでした。

とりあえずこれでしばらく試してみたいと思います。この設定でしばらく立って良かったらまた報告したいと思います。

#偽2ch騒動 西村博之の誤算は何だったのだろう?

いままで何回かに分けて偽2ch騒動について書いてきました。もともと書き始めた理由はなんか興味があったからですが、思いのほかアクセスがあったのと、調べていくうちにいろいろ書きたいことがでてきたから書き続けています。

そろそろいままで書いてきた内容について整理したいと思っていましたが、その前に西村が取った行動を振り返ってみてなにが彼の誤算であったかについて考察してみたいと思います。

西村は2ch.netの権利を主張し、実際に運用管理しているジムの悪口を言っています。ただし現実としては西村の発言に対して多くの人はリスペクトしていないようです。

なぜリスペクトされていないかを考察する前に西村が想定していたであろうことと現実起こっていることの違いについて考察したいと思います。

想定していたことは何だっただろう

続きを読む #偽2ch騒動 西村博之の誤算は何だったのだろう?

#偽2ch騒動 株式会社ホットリンクの発言について思ったこと

いままで、何回か2ch.netのことについて書いてきました。

いままで西村がどのように「2ちゃんねる」の責任についてどのように考えているか考察を続けていて、それを●やp2にの話とあわせて考察しようと思っていましたが、昨日ある発表があったので予定を変更して「ホットリンク」について書きたいと思います。

Twitterと2ch専門「炎上検知サービス」始まる–24時間365日監視 – CNET Japan

株式会社ホットリンクはソーシャルメディアの書き込みを分析する会社です。個人的にはそのようなニーズはあんまりないと思っています。

ゴミの中から宝は見つかるの?-ソーシャルメディアのビッグデータってなんだろう

実は今回発表された内容について、2ちゃんねるを対象にしたサービスであることを謳っていますが、彼らがいう「2ちゃんねる」とは何か?というところに疑問点が持たれる可能性があることが問題だと思っています。

そのことについて言及した記事は、問題の発表前にアップされています。

echo-news – ホットリンク社「2chデータは.netとsc双方から取得中」「 ガーラは14、5年前から2chデータを商用利用」「西村氏らによれば、所有権の問題はない。弊社も同意見」続きを読む #偽2ch騒動 株式会社ホットリンクの発言について思ったこと

#偽2CH騒動 ひろゆきこと西村博之がいいたいことを整理してみる 3) 権利は西村にあると思っているのは自由だがそれに対する責任はどう考えているのか?

西村が2ちゃんねると2ch.netに対しての主張によると諸権利はすべて西村と彼の会社であるパケットモンスターがあるらしいです。

けど権利がある以上、普通に考えればそれに伴う責任があるのも事実です。これは法的な話しだけではなく、一般常識といってもいいかもしれません。

そもそも管理者が悪かった場合、最終的な責任を追求されるのはその組織で一番権限がある人だからです。大企業でも問題が起きたとき担当者だけではなくその組織のトップが対応するところから見てもそれはおかしいことではありません。

西村の書き込みを見ていると責任を問われたくないのか権利と管理の問題をごっちゃにしているといって話しをはぐらかしていますが、本当にはぐらかしているのは西村といってもいいでしょう。

「昨今の2ちゃんねるの現状に関して。」(http://www.2ch.sc/www2chscindex.html)で西村はこういっています。

2ちゃんねるのサーバとドメインは株式会社ゼロのレンタルサーバサービスを借りて運営されてきました。
月額2万ドルという契約で10年以上その関係は続いてきました。

これは契約内容について記載されています。ここからいろいろいくら支払ったか書いています。このあと権利について書いています。

2ちゃんねるの諸権利は、西村博之ないしパケットモンスター社に帰属するものであり、株式会社ゼロ及び、NTテクノロジー社に権利を譲渡したことはありません。

よって、彼らはサービスとドメインの違法な乗っ取りをしているというのが、現状の2ちゃんねるです。

以上のように、彼らは2ちゃんねるの正当な権利者ではなく、サービスを乗っ取った不法行為者ですので、2ちゃんねるに関して、なんらかの方針を主張したとしても、なんの効力も発揮しません。

彼らが正当な所有者であると主張する可能性はありますが、西村博之ないしパケットモンスター社からの権利移転の契約書並びに対価の支払い証明を提示できるか確認して頂ければ、どちらの主張が真実かは明らかであると思います。

この文章を読むと西村は株式会社ゼロ経由で契約していたことを説明していますが、株式会社ゼロはレンタルサーバーの業者にようにしか見えません。

この文章を見ると西村は2ちゃんねるの最高責任者であるように思えるのですが、2ch.scでの書き込みをみると管理責任はないと考えているような書き込みもあります。

「不具合報告スレッド2」
(http://sweet.2ch.sc/test/read.cgi/patisserie/1397265138/)

401 名前:名無しさん:2014/04/14(月) 23:47:12.83 dliX6adlh
>>391
まだ権利が云々言ってる人がいるので確認ですが
管理運営はやめたが諸権利はずっとひろゆきorパケモンが所持しているって理解であってます?

419 名前:ひろゆき@てすとくん ★:2014/04/15(火) 00:27:45.80 ???
>>401
権利所有者と管理人って別の事柄なんですけど、
ごっちゃにしてる人が多いようで。
んで、権利はおいらとパケモンで持ってますよと。

省略

このやり取りを見ていると管理に対しての責任はないと考えているようにも見えます。一方で運用についてはジムにはないと説明しています。

「雑 談 専 用 ス ッ ド レ ★ 5」
(http://sweet.2ch.sc/test/read.cgi/patisserie/1397402663/)

807 名前:ひろゆき@どうやら管理人 ★:2014/04/16(水) 08:27:55.26 ???
>>794
>あなたは、2ちゃんの開設当時から現在まで、2ちゃんの所有権は自分にあると考えていますか?

法廷で明らかにー。

>あなたは、今でもJim氏に、2ch.netの運営を委託しているという認識でしょうか?

過去から現在まで、運営を委託したことはないですー。
>あなたは、現在Jim氏に対して民事訴訟を起こす準備をしていますか? それはなぜですか?

ドメインの管理権および、サーバ内のデータの利用権の復帰ですね。

掲示板で書き込んでいるので西村がどこまで責任があると思っているのかわかりませんがこのあたりは明確に説明する必要があると思います。

2ちゃんねるが西村に戻ってくるには?

続きを読む #偽2CH騒動 ひろゆきこと西村博之がいいたいことを整理してみる 3) 権利は西村にあると思っているのは自由だがそれに対する責任はどう考えているのか?