約 3,497,520 件
https://w.atwiki.jp/nozick/pages/13.html
JavaとはSun Microsystems社(現Oracle)により開発されたオブジェクト指向プログラミング言語であり、 Javaは従来のあらゆる言語の良い部分を引き継ぎ、欠点を克服するよう設計された言語である。 開発環境には統合開発環境(IDE)のEclipseが使用可能。コマンドプロンプトでも可。 構文は C および C++ から多くを引き継いでいる。 従来のプログラムは対応した基本ソフト上でしか動かせなかったが、JavaはJavaVMという実行環境があればどこでも動かせる。 プラットフォームに依存しない為、組み込みシステムからAndroidのアプリケーション開発や企業の情報システムを担うサーバにも活用される。 記法 javadoc 配列 コレクション 拡張for文 論理型 ポインタ 列挙型 スレッド 記法 +... 変数名等は小文字から始め、以降の単語の頭文字のみ大文字にするのがベター private int playerNum; 変数宣言は初めにまとめてではなく、必要な段階で記述する。 (個人的には流れるように動作するならば最初にまとめた方が良いと思う。) 変数宣言A 処理A 変数宣言B 処理B javadoc HTML形式でドキュメントを吐く機能 +... コメント始めを/**にすることでjavadocコメントを打てる。 HTML形式なので、 br で改行も可能。 以下例 /** * ○○メソッド br * @param 引数内容 * @return 返り値内容 */ 配列 +... C言語とは記述法が異なるので注意。 型 [] 配列名 = new演算子 型 [要素数]; 同時に初期化も可能だが、自動的にデータ数から要素数を決定する為[]内に要素数を書いてはならない。 型 [] 配列名 = new演算子 型 []{データ, データ}; コレクション オブジェクトの集合を扱うための仕組み。 +... リストとセットがありそれぞれ複数種ありますが、 ここではリストのArrayListを説明します。 ArrayList list = new ArrayList(); // リスト生成list.add("A"); // リストに追加list.add("B"); // 同上list.add("C"); // 同上list.get(n); // n番目の要素を取得list.remove(n); // n番目の要素を削除list.size(); // 要素の個数を取得list.isEmpty(); // 空か調べる 記述したものの他にも色々機能があるので必要に応じてググる事。 拡張for文 配列やコレクションと呼ばれる複数の要素を持っているものから全ての要素に含まれる値を順に取り出して処理するために使われる。 +... int data[] = {78, 54, 91}; for (int result data){ System.out.println(result);} 論理型 +... C++とは記述法が異なるので注意。 boolean 変数名; 値はtrueかfalse(小文字で)のどちらかを持つ。 ポインタ +... ガベージコレクションである為、C言語などとは違い、ポインタ演算は不可能である。 列挙型 +... ユーザー独自の定数を持たせる事の出来る型。 列挙型の宣言 修飾子 enum 列挙型名 { 定数, 定数, 定数 } ・カンマで区切ります。 列挙型変数の宣言と代入 列挙型名 列挙型変数名 = 列挙型名.定数; ・ピリオド スレッド +... スレッドを用いる事で、ひとつのプログラム(プロセス)の中で複数の処理の流れを走らせることが可能。 スレッドを作成するには、Threadのサブクラスを作成する方法と、Runnableインタフェースを実装したオブジェクトを用いる方法がある。 詳しくは書籍もしくはググる事。
https://w.atwiki.jp/takeiy/pages/4.html
Javaのネイティブ技術要素とか ・セッションはシリアライズしないとダメ? セッションは画面遷移をまたいでオブジェクトを保存できる便利な「入れ物」ですが、基本的にメモリ領域の一部を割り当てて使っているため、 (1)割り当て領域が満杯になってしまったとき (2)サーブレットコンテナを停止するときに、セッション上の保存オブジェクトをいったんDiskに書き出して退避させる。 このようなオブジェクトのDisk書き出し処理をシリアライズといす。シリアライズするにはSerializeを実装しないといけない。 シリアライズが必要な場合はNotSerializableException という例外が発生する。本番環境などで連続稼働していないと気づきにくいので注意。 【対処法】 セッションに保存し得る自作クラスと、そのクラスの中にメンバー変数として含まれる自作クラスを、すべて implements Serializable する。 あらかじめ用意されているクラスについては、シリアライズ可能でなければセッションに保存しないよう注意する。 Javaで用意されている基本的なクラスはシリアライズされえいるか個々については要確認。 ・@Stateless(ステートレスセッションBean) このクラス内での各メソッドはトランザクション管理され、メソッド開始時にトランザクション開始、正常終了時にコミットされる。 途中でRuntimeExceptionが発生した場合トランザクションがロールバックされる。 ・GlassFishのアプリケーション配置の設定 起動中のドメイン(%glassfish%/domains/domain1/)のlibにpostgreのJDBCドライバを置いて再起動する。 接続プールを選択し、名前(任意)、リソースタイプ(javax.sql.DataSource、ベンダ=ポスグレを選択。 データソースクラスのプルダウンをorg.postgresql.ds.PGSimpleDataSourceとなっていることを確認。 ページ下部のプロパティ設定欄に PostNumber=5432 DatabaseName=データベース名 User=ユーザ名 Password=パスワード を入力。必要ならServerName等も入力。 Pingテストがエラーにならないことを確認。 JDBCリソースを設定する。 アプリケーションをデプロイして完了。 命名規約 http //forfreesoft.blog106.fc2.com/blog-entry-7.html http //local.joelonsoftware.com/mediawiki/index.php/%E9%96%93%E9%81%95%E3%81%A3%E3%81%9F%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AF%E9%96%93%E9%81%95%E3%81%A3%E3%81%A6%E8%A6%8B%E3%81%88%E3%82%8B%E3%82%88%E3%81%86%E3%81%AB%E3%81%99%E3%82%8B http //www.namesearch.jp/html/tips/makeVar.html#iroiro_camel JSF http //okazuki.hatenablog.com/entry/20130413/1365845120 http //d.hatena.ne.jp/jabaraster/20110403/1301827221 http //n-agetsuma.hatenablog.com/entry/2013/02/11/134531 http //d.hatena.ne.jp/jabaraster/20110301/1299001527 http //d.hatena.ne.jp/jabaraster/20110301/1299001527 http //d.hatena.ne.jp/jabaraster/20110221/1298299536 http //d.hatena.ne.jp/Yosuke_Taka/20120131/1327983465 JPA http //kenro.biz/blog/?p=178 Jasper http //blogs.yahoo.co.jp/dk521123/folder/760635.html http //galasufish.sblo.jp/ http //nishija.exblog.jp/4526418/ http //d.hatena.ne.jp/Kazuhira/20130413/1365872385 http //another.maple4ever.net/archives/1181/ http //www.posttips.net/main/getpage.php?id=1228093883_1266451705 http //araistudy.g.hatena.ne.jp/czk-htn/20080302/1263764565 http //d.hatena.ne.jp/Kazuhira/20111010/1318254988 http //kaede.jp/2013/03/13232706.html デザインパターン http //www.geocities.jp/ky_webid/design_pattern/index.html http //mojix.org/2013/02/10/design-pattern-refactoring 正規表現 http //daipresents.com/2008/java_regex/ http //java-reference.sakuraweb.com/java_string_regex.html enum http //bleis-tift.hatenablog.com/entry/20090916/1253084400 JavaFX http //kazyury.hatenadiary.jp/entry/2013/04/07/101748 http //meow.arrow.jp/javafx/ http //www.coppermine.jp/docs/programming/2012/12/javafx.html http //yumix.hatenablog.jp/entry/2012/12/15/021946 http //itpro.nikkeibp.co.jp/article/COLUMN/20130430/474261/ http //d.hatena.ne.jp/a-know/20120513/1336893171 Jenkins http //futurismo.biz/archives/335 http //d.hatena.ne.jp/dkfj/20130303/1362274256 http //es.slideshare.net/int128/jenkins-14810610 http //forza.cocolog-nifty.com/blog/2012/06/jenkins-e76c.html http //codezine.jp/article/detail/2345 http //wiki.nonip.info/work/index.php?jenkins%2F%E7%AE%A1%E7%90%86%E7%94%BB%E9%9D%A2%E4%BD%BF%E3%81%84%E6%96%B9 http //appkitbox.com/knowledge/test/2012/11/12/jenkins-first http //nigohiroki.hatenablog.com/entry/2012/12/30/023035 http //blog.gigei.jp/tech/000053.html http //d.hatena.ne.jp/smallplace/20130124/1359047011 Selenium http //richtext.jp/pukiwiki/index.php?%B3%D0%BD%F1%A4%AD%2FSelenium http //acro-engineer.hatenablog.com/entry/20110820/1313802144 http //atmarkplant-dj.blogspot.jp/2011/10/selenium-with-junit.html http //hellfield.blog102.fc2.com/blog-category-11.html http //www.storklab.com/seleniumhq.org/docs/06_test_design_considerations.html http //d.hatena.ne.jp/language_and_engineering/20081016/1224123118 http //jigsaw.hatenablog.jp/entry/2013/04/11/233222 http //d.hatena.ne.jp/jappy/20130525/1369490309 http //codezine.jp/article/detail/2345 http //hellfield.blog102.fc2.com/blog-category-11.html ジェネリクス http //javazuki.wiki.fc2.com/wiki/%E3%82%B8%E3%82%A7%E3%83%8D%E3%83%AA%E3%82%AF%E3%82%B9 http //www.slideshare.net/nagise/jjug-ccc-2012-fall http //d.hatena.ne.jp/Nagise/20101105/1288938415 http //javatechnology.net/java/generics-method/ effective java http //blog.livedoor.jp/mocoh/tag/EffectiveJava http //d.hatena.ne.jp/amachang/20100215/1266245521
https://w.atwiki.jp/johzue/pages/25.html
参考にしたページ http //www.hellohiro.com/ マニュアル Tomcat4.0 ServletAPI(ちょっと古いかな) http //www.jajakarta.org/tomcat/servletapi/servletapi-4.0/docs-ja/index.html JDK5.0 http //java.sun.com/j2se/1.5.0/ja/docs/ja/api/index.html Tomcat5.5設定 ApacheもTomcatも無事に連携ができたら、JSPとサーブレットの動作確認 サーブレット デフォルトだと、http //ipaddress/servlets-examples/servlet/HelloWorldExample これでHello World !!とか表示される。 Javaのクラスファイル自体は /usr/local/tomcat5/webapp/servlets-examples/WEB-INF/classes/HelloWorldExample.class に、置かれており http //ipaddress/(ルート)が/usr/local/tomcat5/webapp/ROOTディレクトリに 対応づいており http //ipaddress/servlets-examplesが/usr/local/tomcat5/webapp/servlets-examples/ に対応づいている。 servlet-name HelloWorldServlet /servlet-name servlet-class HelloWorldServlet /servlet-class /servlet servlet-mapping servlet-name HelloWorldServlet /servlet-name url-pattern /servlet/HelloWorldServlet /url-pattern /servlet-mapping /web-app ファイルはclassesフォルダの中にHelloWorldServlet.classを置いて 読み出すときは前述の通り。 web.xmlのinvokeの項目(確か2つある)の コメント部分を解除すると、マッピングを関係なく表示できる。 これはセキュリティのため、公開時は元に戻す(コメント化)する必要がある。 ディレクトリを指定して、その中身を見るにはserver.xmlを init-param param-name listings /param-name param-value true /param-value /init-param trueに変更する必要がある 必要なければやらなくて良い。 jspファイルはマッピング関係なく直接読みにいけばよい 文字化け Debian文字化け DebianではJ2SDKパッケージで日本語文字化けするので、それの対応 cp $JAVA_HOME/jre/lib/fontconfig.Redhat.8.0.properties.src \ $JAVA_HOME/jre/lib/fontconfig.properties コピーしたら、それをviで開いて %s /misc-kochi /-sazanami-/g (kochiの後にスペースが必要) 入力フォームの文字化け(GET) Tomcat5.XからsetCharEncodingメソッドの文字コードの適応がなくなった。 クリの文字コードはUTF-8を使うのがルールらしくて、Tomcatもそれに対応したみたい。 それでもやっぱり、基本EUC-JPで統一したいから tomcatのconfディレクトリにあるserever.xmlの一部を編集しなければならない Connector port="8080" maxThreads="150" minSpareThreads="25" maxSpareThreads="75" enableLookups="false" redirectPort="8443" acceptCount="100" debug="0" connectionTimeout="20000" disableUploadTimeout="true" useBodyEncodingForURI="true"/ 最後にあるuseBodyEncodingForURIの項目を追加すればOK これでGETでとっても文字化けしなくなる 参考:http //www.atmarkit.co.jp/fjava/rensai3/mojibake03/mojibake03.html Netbeansについて Javaの開発環境といえばElipseだったが、最近はNetBeansがSunのサポートとなってシェアが伸びてきている。 利点:標準でTomcat等がバンドルされており導入が楽 欠点:モジュールが少ない NetBeansのコンパイル文字コード指定 「ツール」→「詳細オプション」→「編集」→「Javaソース」→「デフォルトエンコーディング」で指定 コンパイル時のエンコード指定は 「プロジェクトプロパティ」→「構築」→「コンパイル」の追加のコンパイラオプションで指定 -encoding EUC-JP 参考:http //www.deftrash.com/blog/archives/2006/05/netbeans_1.html
https://w.atwiki.jp/tonojava/pages/13.html
オブジェクト指向言語 オブジェクト指向言語とは、「オブジェクト」を単位としてプログラムを構成することが出来る言語のこと。 オブジェクトは「いくつかの機能」を持った「入れ物」。 その基本的な特徴は、「入れ物」の中に「状態(メンバ変数)」と「振る舞い(メソッド)」を持つこと。 JAVAで「オブジェクト」に相当するものは「クラス」であり、 この2つの機能は「変数」と「メソッド」という形で実現されている。 クラスの構成要素 JAVAでクラスを作成する上で、メンバ変数・メソッド・コンストラクタが主要な構成要素となる。 【例】 public class test{ int abc; bold(){//メンバ変数} test(){ abc = 10; bold(){//コンストラクタ} bold(){//メソッド} void testMethod(){ System.out.println(abc); } bold(){//メインメソッド} public static void main(String[] args){ Test testObject = new Test(); testObject.testMthod(); } } メンバ変数 メンバ変数は、オブジェクトの状態を保持する変数。 オブジェクトに属し、どのメソッド・コンストラクタにも属さない。 その為、メンバ変数は複数のメソッド、コンストラクタで共通して使用することが出来る。 コンストラクタ クラスからオブジェクトをnewで作成した際に、自動的に実行されるメソッドのことで、 メンバ変数の初期化などの主に行う。 クラス名と同じメソッド名で戻り値の宣言が無い。(戻り値の型宣言もしちゃ駄目) 引数を受け取る事&オーバーロードが出来る。 メソッド メソッドとは、一連の処理・操作がまとめられた小さな部品のようなもの。 メソッドの処理で材料となる値のことを引数といい、結果の値を戻り値、または返り値という。 戻り値を返すときは「return 戻り値;」または「return(戻り値)」とする。 インスタンスとオブジェクト インスタンス化をすると、1つのオブジェクトとなる。 例えて言うなら、インスタンスは「存在」、オブジェクトは「実態」として考える。 オブジェクトは、インスタンス化の集まりで、その集まりをオブジェクトの型に当てはめる。 アノテーション 宣言された変数を使用しないと、Eripseだと黄色い線がひかれる。 使用しなくても大丈夫なように「@SuppressWarnings」をつける。 基本型のキャスト キャストは、プログラマが意識的に行う変換処理。 型変換では、変数の変換処理を行えない場合にキャストを使用する。 キャストは変換したい型を()で囲み、変換元の変数の前に指定することで行える。 (変換したい型)変換元の変数; 【例】getSouse()を使用して取得したオブジェクトをJButtonへ変換 (JButton)e.getSource();
https://w.atwiki.jp/asayamayuki/pages/12.html
Javaについて3回生同士の情報共有に使ってください。 test2 -- asayamayuki (2007-02-26 17 08 52) 名前 コメント
https://w.atwiki.jp/ktonegaw/pages/99.html
クワイン https //ameblo.jp/zigeunerseele/entry-10078813278.html Quine.java https //introcs.cs.princeton.edu/java/54computability/Quine.java.html My Adventure Writing My First Quine in Java https //blogs.adobe.com/charles/2011/01/my-adventure-writing-my-first-quine-in-java.html benjholla/Quine.java https //gist.github.com/benjholla/9dd76ca9269e8c9af99a 50言語で構成された「Quine リレー」がスゴイ https //www.softantenna.com/wp/software/quine-relay/
https://w.atwiki.jp/xronia/pages/20.html
Java3Dを使ってみる。 キッカケ 2Dで無理やりクオータービューにして3Dっぽく見せてるフリーのゲームを見てて なぜ3Dにしないのか!などと不満に思ったのでちょっと3Dの勉強をしてみようなどと なぜJava? 仕事でやたらと使うから。 環境依存が少ないから。 性能面はそりゃCとかに劣る可能性は否定できないが、最近は差があんまり無さそうだし GJCのようなコンパイラもあるし。 Javaがなぜ遅いかというと、現代の工場制手工業によるただ納期に追われて馬鹿みたいにコピペしまくり 動けばいいやというコーディングが平気でまかり通り、実績があるからという理由で改善しないためであり 別にJavaが遅い訳ではない。 でJava3D? JOGLを使ってみたが、CでGLを使うのとあまり変わらない。 ならもちっと使いやすそうなものはということでたどり着いただけ。 インストール うちはUbuntuなので、synapticとかで検索してJava3D周りのパッケージをもってくればOK docパッケージはただのJavaDocしかも英語なので好みに応じて Ubuntu以外の人のことは知らんw プロジェクトを作る Ubuntuの場合、導入したJarは、/usr/share/javaの下に配置されるので、 Java3D用のプロジェクトを作ったらビルドパスにこれらのjarをいきなり足してしまう。 足すのは、j3dcore.jar,j3dutils.jar,vecmath.jarの3つとなる。 使うかどうか謎だが、java3ds-fileloader.jarも入れておくか。 その他必要に応じて、 log4j Logを出したいなら CommonsLang 文字列加工したいとかなら Junit テストしたいなら・・・
https://w.atwiki.jp/naobe/pages/25.html
言語に戻る EJB JavaEE5 MBean JMX JNDI サーブレット 言語仕様 項目 説明 transient 修飾子。Seriariseオブジェクトの保管しないフィールドを修飾する。 クラスローダ http //www.techscore.com/tech/Java/JavaEE/Servlet/supplement-1/ 参照 目的 同じ名前でバージョンの異なるクラスを使用するために使う。クラスローダが異なればバージョンが異なっても良い。自分自身のクラスローダを得るにはgetClassLoader()メソッドを用いる。 クラスローダには親子関係があり、子クラスローダがクラスをロードするときには、親クラスローダにロードを依頼してロードできなければ、子クラスローダがロードする。 Class#getClassLoader()は、このクラスをロードしたクラスローダを返す クラスローダによってロードされたClassはパーマネント領域に格納される。ClassLoaderがGCされるとGCから解放される。 VMのクラスローダ ブートストラップクラスローダ JAVA_HOME /lib下のJARファイルに含まれるクラスをロードする。JDK6は、 JAVA_HOME /jre/lib下? 親はいない 拡張クラスローダ JAVA_HOME /lib/ext下のJARファイルに含まれるクラスをロードする。JDK6は、 JAVA_HOME /jre/lib/ext下?親はいない システムクラスローダ CLASSPATHで指定した位置からクラスをロードする。親は拡張クラスローダ。ブートストラップクラスローダは親子関係なしでも委譲されるということでは? 通常のnew Foo()ではこのクラスローダが使われる。 ブートストラップクラスローダ、拡張クラスローダ、システムクラスローダの順番でクラスをロードする。 コンテキストクラスローダ(JDK6 API Threadより) コンテキスト ClassLoader は、クラスおよびリソースをロードするときに、このスレッドで実行中のコードが使用するためにスレッドの作成側によって提供されます。コンテキスト ClassLoader が設定されていない場合、デフォルトでは親 Thread の ClassLoader コンテキストになります。通常、親スレッドのコンテキスト ClassLoader は、アプリケーションのロードに使用されるクラスローダーに設定されます。 なので、設定しなければシステムクラスローダがコンテキストクラスローダになる。 コンテキスト・クラスローダを設定・取得するには、java.lang.Thread#setContextClassLoader,getContextClassLoaderメソッドを使う。 クラスローダ作成 JDK6 APIより たとえば、アプリケーションはネットワーククラスローダーを作成して、サーバーからクラスファイルをダウンロードできます。コードは次のようになります。 ClassLoader loader = new NetworkClassLoader(host, port); Object main = loader.loadClass("Main", true).newInstance(); . . . ネットワーククラスローダーのサブクラスは、ネットワークからクラスをロードするために findClass メソッドと loadClassData メソッドを定義しなければなりません。クラスを作成するバイトを一度ダウンロードしたら、defineClass メソッドを使ってクラスインスタンスを生成する必要があります。実装の例を次に示します。 class NetworkClassLoader extends ClassLoader { String host; int port; public Class findClass(String name) { byte[] b = loadClassData(name); return defineClass(name, b, 0, b.length); } private byte[] loadClassData(String name) { // load the class data from the connection . . . } } 特定のディレクトリからクラスをロードするクラスローダを作成してみる。 MyClassLoaderのmainメソッドで、test.MyClassLoaderTargetをロードしClassを作成する MyClassLoaderはClassLoaderを継承したクラスで、loadClassメソッドをオーバライドし、c /mydoc/tmp/を優先的にロードするディレクトリとしている。c /mydoc/tmp/にクラスがない場合は、ClassLoaderのloadClassメソッドを実行する ClassLoaderのloadClassメソッドでは、キャッシュにあれば、そのクラスを返す。なければ親クラスローダに移譲する。なければシステムクラスローダを使ってクラスをロードする Class#newInstance()を実行して、インスタンスを生成する MyClassLoaderTarget#execute()を実行し、MyClassLoaderTarget2をnewしてexecute()を実行する 実行結果を見ると、MyClassLoaderTarget2のクラスローダは、MyClassLoaderであることがわかる。つまりクラスローダを使ってロードしたクラスから別のクラスをnewするときはそのクラスローダを使うことがわかる。クラスローダを作成すると親クラスローダはシステムクラスローダになる。 コンテキストクラスローダは明示的に使用しない限り、使われることはなさそう。 package test; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; public class MyClassLoader extends ClassLoader { private static final int BUFSIZE = 1024; private byte[] result; private int last = 0; @Override public Class ? loadClass(String name) throws ClassNotFoundException { Class ? c = null; try { c = findClass(name); } catch (ClassNotFoundException e) { c = super.loadClass(name); } return c; } private void dbg(String string) { System.out.println(string); } @Override protected Class ? findClass(String name) throws ClassNotFoundException { try { byte[] b = loadClassData(name); return defineClass(name, b, 0, b.length); } catch (Exception e) { throw new ClassNotFoundException(e.getMessage(), e); } } private byte[] loadClassData(String name) throws IOException { result = new byte[0]; last = 0; FileInputStream ins = null; try { byte[] buf = new byte[BUFSIZE]; int readSize = 0; name = name.replace('.','/'); File classFile = new File("c /mydoc/tmp/" + name + ".class"); ins = new FileInputStream(classFile); while((readSize = ins.read(buf)) != -1 ) { moveToResult(readSize, buf); } return result; } finally { if(ins != null) { ins.close(); } } } private void moveToResult(int readSize, byte[] buf) { byte[] tmp = new byte[last + readSize]; // 結果バイト配列をtmp配列の先頭にコピー System.arraycopy(result, 0, tmp, 0, result.length); // bufをtmp配列にコピー System.arraycopy(buf, 0, tmp, last, readSize); result = tmp; last += readSize; } public static void main(String[] args) { try { MyClassLoader loader = new MyClassLoader(); System.out.println("parent " + loader.getParent().getClass().getName()); Class ? clazz = loader.loadClass("test.MyClassLoaderTarget"); System.out.println("target class loader name " + clazz.getClassLoader().getClass().getName()); ((Executor)clazz.newInstance()).execute(); } catch (Exception e) { e.printStackTrace(); } } } package test; public class MyClassLoaderTarget implements Executor { @Override public void execute() { System.out.println("AAA"); MyClassLoaderTarget2 target2 = new MyClassLoaderTarget2(); target2.execute(); System.out.println("target2 class loader name " + target2.getClass().getClassLoader().getClass().getName()); } public static void main(String[] args) { MyClassLoaderTarget target = new MyClassLoaderTarget(); target.execute(); } } package test; public class MyClassLoaderTarget2 implements Executor { @Override public void execute() { System.out.println("BBB"); } public static void main(String[] args) { MyClassLoaderTarget2 target = new MyClassLoaderTarget2(); target.execute(); } } package test; public interface Executor { public void execute(); } 実行結果 parent sun.misc.Launcher$AppClassLoader target class loader name test.MyClassLoader AAA BBB target2 class loader name test.MyClassLoader ThreadLocal スレッドに固有のオブジェクトを保管するために使う(Thread Singleton)。Servletの中で、使用例としてDBに対するConnectionをスレッド毎に保管する場合があげられる。この場合、引数にConnectionを作成すると全てのメソッドにConnectionの引数が必要になり手間がかかる。スレッドにプライベートフィールドを作成して保管できないときに使える。 JDBC 参照 タイプ 説明 備考 type2 ベンダのライブラリと共同して、DBと通信。ベンダのクライアントアプリが必要。 type4 直接DBと通信。JDBCドライバサイズが大きい バッチ insert, updateが連続して行われるときにネットワークトラフィックを削減するために使う。PreparedStatementオブジェクトに対して、addBatch(), executeBatch()メソッドを使うと複数のステートメントをまとめてDBサーバ送信する。 言語コード コード名 説明 Windows-31J ShiftJISの拡張。NEC特殊コードもサポート。 スレッドダンプ 稼働中のスレッドを標準出力にダンプする。 kill -3 プロセス番号 出力例 daemon以外のスレッドを見る。以下の例ではSNMP APIで停止している。 Full thread dump Java HotSpot(TM) Server VM (11.2-b01 mixed mode) "RMI Scheduler(0)" daemon prio=10 tid=0x0955e000 nid=0x15db waiting on condition [0x30cd1000..0x30cd1fa0] java.lang.Thread.State TIMED_WAITING (parking) at sun.misc.Unsafe.park(Native Method) - parking to wait for 0x37f243d8 (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject) at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java 198) at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java 1963) at java.util.concurrent.DelayQueue.take(DelayQueue.java 164) at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java 583) at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java 576) at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java 947) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java 907) at java.lang.Thread.run(Thread.java 619) "Thread-7" prio=10 tid=0x0954bc00 nid=0x15bf in Object.wait() [0x30eb7000..0x30eb7ea0] java.lang.Thread.State TIMED_WAITING (on object monitor) at java.lang.Object.wait(Native Method) - waiting on 0xa89ec300 (a com.adventnet.snmp.snmp2.SnmpCallback) at com.adventnet.snmp.snmp2.SnmpCallback.sleepUntilNotified(SnmpCallback.java 166) - locked 0xa89ec300 (a com.adventnet.snmp.snmp2.SnmpCallback) at com.adventnet.snmp.snmp2.SnmpCallback.run(SnmpCallback.java 152) アノテーション 注釈。プログラムに影響を与えない。プログラムから読める。コンパイラの動作に影響を与える。 @Override Overrideアノテーションを付加したメソッドがオーバライドメソッドでなければコンパイルエラーになる。 @SuppressWarning Xlintを指定したときに発生する警告メッセージを抑制する。 アプレット jarファイルを指定するには、ARCHIVEタグを使う。CLASSPATHはきかない。 セキュリティポリシー java.policyファイルの構文 grant signedBy "signer_names", codeBase "URL", principal principal_class_name "principal_name", principal principal_class_name "principal_name", ... { permission permission_class_name "target_name", "action",signedBy "signer_names"; permission permission_class_name "target_name", "action",signedBy "signer_names"; ... }; ここで、"signer_names"、"URL"、principal_class_name、"principal_name"、permission_class_name、"target_name"、"action"、"signer_names"は、変数。 signedBy 、codeBase、、principal は省略可能。 意味は、signer_namesで署名されたURLにあるプログラムが、permission_class_nameで規定されるtarget_nameに対して、actionすることを許可する。target_name, actionについては、permission_class_nameのAPIを参照。 http //java.sun.com/j2se/1.5.0/ja/docs/ja/guide/security/PolicyFiles.html 参照。 例 permission java.io.FilePermission "\\\\192.168.1.40\\-", "read,write"; 192.168.1.40のリモートファイルに対する読み書きを許可する。 Linux firefoxへのJava Plugin インストール 例 # ln -s /usr/java/jdk1.6.0_20/jre/lib/i386/libnpjp2.so /opt/firefox/plugins インストールの確認 urlにabout pluginsを設定して開く Linuxでのplugin コントロールパネル 起動 $JAVA_HOME/bin/ControlPanel を実行 最大メモリ容量の修正 "-XX MaxPermSize=256m"をJavaタブのアプレットパラメータに追加 その他 スタックトレースをStringに変換する 仕事の都合で、最後の行で改行を削除してタブをスペースに変換している。 private String getStackTraceAsString(Exception e) { ByteArrayOutputStream ostream = new ByteArrayOutputStream(100); e.printStackTrace(new PrintStream(ostream)); String sep = System.getProperty("line.separator"); return ostream.toString().replaceAll(sep, "").replace("\t", " "); } 固定長レコードのファイルを出力 package test; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.UnsupportedEncodingException; public class SingleFille { private BufferedOutputStream bstream; /** * ファイルに書き込むデータ * 桁数 * 内容 */ private String[][] data = { {"aaa1", "bbb1", "ccc1"}, {"漢字2", "bbb2", "ccc2"}, {"aaa3", "漢字3", "ccc3"}, {"aaa4", "bbb4", "漢字4"}, }; /** 列の桁数 */ private int[] length = {10, 20, 30}; /** ファイルオフセット */ private int offset = 0; private static final String FILE_PATH = "singleFile.dat"; public static void main(String[] args) { SingleFille sfile = new SingleFille(); try { sfile.execute(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } public void execute() throws IOException { File file = new File(FILE_PATH); try { FileOutputStream stream = new FileOutputStream(file); bstream = new BufferedOutputStream(stream); for(int i = 0; i data.length; i++) { String[] line = data[i]; putFile(line); } } catch (IOException e) { throw e; } finally { if(bstream != null) { try { bstream.close(); } catch (IOException e) { throw e; } } } } /** * @param line * @throws IOException */ private void putFile(String[] line) throws IOException { for(int i = 0; i line.length; i++) { //各列を桁数になるように整形 byte[] term = createTerm(line[i], i); bstream.write(term); offset += term.length; } } /** * @param term * @param index * @return * @throws UnsupportedEncodingException */ private byte[] createTerm(String term, int index) throws UnsupportedEncodingException { //項目を格納するバイト byte[] outterm = new byte[length[index]]; //項目をShift_JISのバイトに変換 byte[] interm = term.getBytes("SJIS"); for(int i = 0; i outterm.length; i++) { if( i interm.length) { outterm[i] = interm[i]; } else { //残りはスペース outterm[i] = 0x20; } } return outterm; } }
https://w.atwiki.jp/cappu/pages/48.html
クライアント package com.javaagogo.postjavaobject.httpclient; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.net.HttpURLConnection; import java.net.URL; import com.javaagogo.postjavaobject.data.DataObject; public class Main { public static void main(String[] args) { try { URL url = new URL("http //localhost 8080/postjavaobject"); HttpURLConnection con = (HttpURLConnection) url.openConnection(); con.setDoInput(true); con.setDoOutput(true); DataObject data = new DataObject(); data.setName("I am client."); data.setId(1); // DataObjectを送信 ObjectOutputStream out = new ObjectOutputStream(con .getOutputStream()); out.writeObject(data); out.flush(); out.close(); ObjectInputStream in = new ObjectInputStream(con.getInputStream()); DataObject response = (DataObject) in.readObject(); in.close(); System.out.println("name=" + response.getName() + " id=" + response.getId()); } catch (Exception e) { e.printStackTrace(); } } } サーブレット package com.javaagogo.postjavaobject; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.javaagogo.postjavaobject.data.DataObject; @SuppressWarnings("serial") public class PostJavaObjectServlet extends HttpServlet { public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException { try { // アプレットから要求を受信する ObjectInputStream in = new ObjectInputStream(req .getInputStream()); DataObject inData = (DataObject) in.readObject(); in.close(); // アプレットに返す文字列を作る DataObject outData = new DataObject(); outData.setName("サーブレット エコー " + inData.getName()); outData.setId(inData.getId()); // アプレットに送信する ObjectOutputStream out = new ObjectOutputStream(resp .getOutputStream()); out.writeObject(outData); out.flush(); out.close(); } catch (Exception e) { e.printStackTrace(); } } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } } データ package com.javaagogo.postjavaobject.data; import java.io.Serializable; public class DataObject implements Serializable{ /** * */ private static final long serialVersionUID = -6534725917724535071L; private int id ; public int getId() { return id; } public void setId(int id) { this.id = id; } public static long getSerialVersionUID() { return serialVersionUID; } public String name; public String getName() { return name; } public void setName(String name) { this.name = name; } }
https://w.atwiki.jp/thiroyoshi/pages/47.html
senでwiki辞書を使う 以下で紹介されてる方法でできるらしい http //d.hatena.ne.jp/nodchip/20090309/1236615706 形態素解析 これまで、形態素解析にcabochaを使ってたわけですが、javaでMecabを実装したとかいうのがあったみたいで…。 http //ultimania.org/sen/ つーかYahoo!がそういうのしてくれるAPIを公開していたらしい。アンテナは大きく広げておかないといかんもんだなぁ… http //developer.yahoo.co.jp/webapi/jlp/da/v1/parse.html 下のサイトはサンプル公開してる。 http //www.nilab.info/zurazure2/001036.html 形態素解析の辞書 ChasenとMecabの辞書として使えるものだそうな。公開されてる精度がよすぎてびっくり。 http //www.tokuteicorpus.jp/dist/ Java使う人にはとてもよい http //nextindex.jp/java/ Stringの文字エンコーディング 普通にプログラムするには大して問題にならないファイル名の文字コード。 webでデータ公開するとかなるとなんかこれをよくミスる。 で、見つけたよさげなサイト。参考に http //hp.vector.co.jp/authors/VA017148/java/encoding.html デーモンスレッド 使えれば使う 参考URL http //memolet.blog22.fc2.com/blog-entry-792.html GC overhead limit exceeded 調べてみたら、ガベージコレクションに時間かかりすぎやから止まった、ってことらしい。 ガベージコレクション自体はメモリの自動解放とかしてくれるけど、メモリ使用量が多いとかでスワップが多くなったりすると処理がかかるみたいだ。 で、その時間がかかりすぎるとエラー吐いて止まるってのが上のメッセージらしい。 解決にはメモリをしっかり確保すればいいってのは当たり前だが、どうしても頻発する場合などには実行時の引数に以下のものを加えるといい。 -XX -UseGCOverheadLimit 参考URL http //confluence.atlassian.co.jp/display/DOC/Fix+Out+of+Memory+errors+by+Increasing+Available+Memory#FixOutofMemoryerrorsbyIncreasingAvailableMemory-OutOfMemoryError%3AGCoverheadlimitexceeded http //ameblo.jp/f-o-p/entry-10537149611.html MySQLと連携 javaのコードからMySQLを使う場合に、JDBCドライバが必要になる。 これはMySQLのサイトからダウンロードができる。 Javaとの連携なので、downloadの中の「Connector/J」をダウンロードする。 ダウンロードしたファイルを解凍すると、いろいろ入っているが、その中にjarがある。 名前は、「mysql-connector-java-5.0.8-bin.jar」だ。 これのクラスパスを通せば、あとはjavaのファイルの中で適切なコマンドを使っていけばいい。 参考URL http //mountainbigroad.jp/fc5/mysql_java.html MySQLからの日本語が文字化け まだいろいろ試していないもののメモ。 文字化けなので文字コードに問題があることは明白。 この場合にするべきは、各所での文字コードの設定。 「MySQLのデフォルト設定」 「javaコード内でのurl指定時」 くらいだが、これでも文字化けする場合があるのだ。 これはMySQLのバージョンを下げればいいこともあるらしい。 この問題があるのは、4.1.7でらしい。これをバージョンダウンすれば解消されるとさ。 またちょっとしたコードの書き換えでもいけるらしい。 str = new String(str.getBytes("ISO-8859-1"), "JISAutoDetect"); みたまんま、コード変換するみたいだ。これを取得した値に対して行ってやると解消されるとか。 でも、バージョンを下げるとこんなもんは必要ないみたい。 参考URL http //oshiete.goo.ne.jp/qa/1118005.html javaをコマンドラインで サーバーなどでjavaを動かすために覚えた。 しかし、コマンドを詳しく覚えているはずもなく… パスを通す .bashrcにjarファイルのパスをかたっぱしから通すように指定。 これぐらい重くもなんともないだろ! 実際に使ってるスクリプトは以下 jars=`ls /home/hiroyoshi/system/jar` for jar in ${jars[@]} do export CLASSPATH=$CLASSPATH /home/hiroyoshi/system/jar/$jar done やってることは簡単で、jarのファイル名を配列で全部とってきて、それにパスを当てはめてexportしてるだけ。 これでディレクトリjarにjarを追加するだけで、ログインするときに毎回読み込んでくれる。 もうパスを通す必要はない!便利! コンパイル 使ったのは実際には以下のコマンド javac -sourcepath XX/src -d XX/bin/ XX/src*/*.java XXはディレクトリ名(プロジェクト名とか) javac javaのコンパイルコマンド -sourcepath ソースファイルの場所指定オプション -d クラスファイルの出力場所指定オプション これで、srcに保存されいるパッケージでまとめられているjavaソースファイルをきちんとコンパイルできる。 また、このコンパイル時にbin内にパッケージも作られる。 ただし、srcとbinは事前に作っておく必要があるのは言うまでもない。 実行 ちょっと泥臭い方法になってしまったというか、メモるほどの事ではないが一応。 java -Xmx1g main/Main これをbinで行う。ほんとはプロジェクトのホームで実行したかったけど仕方ない…。 ファイルなどを生成するのでも、プログラム内でディレクトリ指定すればbin内には作らなくて済むので。 RSSリーダー 研究でブログを扱っているので作ってみたところのメモ。 ほとんどコピペやけど、プログラムってそんなもん。 使ってるライブラリ ROME:本プログラムのキモ。RSSを扱うためのメソッドが揃ってるみたい。 基本はこのROMEで処理します。依存とかの関係で ROME-Fetcher JDOM も必要です。JDOMはxmlを扱うライブラリで、これがないとROMEは動かない。 それぞれのライブラリはバイナリをダウンロードする。 JDOMは圧縮形式でダウンロードでき、解凍するとディレクトリができる。 この中からjdom.jarを見つけ出す。 サンプル public class RSSReader { @SuppressWarnings("unchecked") public static void main(String[] args) { //rdfでもxmlでもOK String url = "http //blog.livedoor.com/xml/article_ranking.rdf"; try { URL feedUrl = new URL(url); SyndFeedInput input = new SyndFeedInput(); SyndFeed feed = input.build(new XmlReader(feedUrl.openStream())); ArrayList SyndEntry entries = (ArrayList SyndEntry ) feed.getEntries(); System.out.println("Blog Title:" + feed.getTitle()); System.out.println("======================="); Iterator SyndEntry it = entries.iterator(); SyndEntry entry; while(it.hasNext()){ entry = it.next(); System.out.println("Title:" + entry.getTitle()); System.out.println("Date:" + entry.getPublishedDate()); System.out.println("Link:" + entry.getLink()); System.out.println("URI:" + entry.getUri()); System.out.println("Description:" + entry.getDescription().getValue()); System.out.println("---------------------"); } System.out.println("size = " + entries.size()); } catch (FeedException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } } 参考URL スマートネットワーク開発ブログ JavaでRSSのパースをしてくれるライブラリ ROME 正規表現 すごく便利な正規表現。でもすごくわかりにくい正規表現。 そんな正規表現のメモ。 (特にJavaで使えるというものです) 全角記号 [^ぁ-んァ-ヴ一-龠0-90-9a-zA-Zー〜、] 総当たりではあるが、使えるのでよし。 意味は「ひらがなとかカタカナとか以外」 半角記号 \p{Punct} javaのAPIで定義されているものそのまま。 ただし、使うときにはこれをこのまま書くだけだと、「エスケープシーケンスは…」と怒られるので、こいつをエスケープしてやる。 つまり、 line = line.replaceAll("\\p{Punct}",""); ってすると、line内の半角記号は一掃される。 半角カタカナ [。-゚+] そのまま文字コードにのっとったもの。つまり、意味は ー。「」、・ヲァィゥェォャュョッタアイウエオカキクケコサシスセソミチツテトナニヌネノハヒフヘホマムメモヤユヨラリルレロワン゙゚ です。 また、正規表現の[a-z]のような「-」(ハイフン)の範囲表現はASCIIコードに準じたものをなっている。(参考URL参照) 例えば、コード表によると「!」から「/」を続けて範囲指定([!-/])できるが、「?」までする([!-?])と数字も選択されてしまう。 参考URL フジハラボ:Javaで入力チェックに使える正規表現まとめ ASCII文字コード