レス数が1スレッドの最大レス数(1000件)を超えています。残念ながら投稿することができません。
ヒッキープログラミングスレ
プログラミングの話題のスレ
質問・相談
初心者からプロまで
プログラミングに関することなら何でもOK
DocumentBuilderFactoryはスレッドセーフじゃないってあぶねえな
XML Schemaねぇ・・・
おまえらはプログラミングで何作るん?どのプログラミング言語習得中なの?
どうしてJaveでCookieが取得できないんだろう?(1): Javaでアプリケーション作りたい
ttp://tomott.cocolog-nifty.com/blog/2010/08/javecookie1-87d.html
なるほど、デフォルトのクッキーマネージャはメモリ上にクッキー情報を保管するのか他のJavaアプリと共有ってわけじゃないのね
クッキーストアを取得してクッキー情報を読み書きでファイル保存読込が楽そうなんだけど
普通はやっぱりクッキーストアを自分で作るのが普通なのかね・・・まぁ大半の処理をスーパークラスに投げちゃえば簡単だろうけど
つチラ裏
お堅いこといいなさんな
コテつけてNGしやすくするから許してちょんまげ
コテつけたお
ひとまず自前でCookieStoreを実装してみっか、てか全部superクラスの呼び出すだけのだけどw
addメソッドとremoveメソッドのとこにSystem.out.println("cookie add");とか入れてどのタイミングで呼び出されてるかチェキラ!
ん・・・?
ほぎゃああああああああ!CookieStoreってインターフェースかよ・・・全部自己実装が必要ジャマイカ・・・
一応でけた
public class MyCookieStore implements CookieStore {
HashSet<URI> uris = new HashSet<URI>();
HashMap<String, HttpCookie> cookies = new HashMap<String, HttpCookie>();
File cookiedir = null;
File uridir = null;
public MyCookieStore() {
System.out.println("MyCookieStore.Constractor");
this.cookiedir = new File(System.getProperty("user.dir"), "cookie");
if (this.cookiedir.exists() == false) this.cookiedir.mkdir();
try {
File[] files = this.cookiedir.listFiles();
for (int i = 0; i < files.length; i++) {
System.out.println("cookie["+i+"]="+files[i]);
BufferedReader reader = new BufferedReader(new FileReader(files[i]));
this.cookies.put(files[i].getName(), new HttpCookie(files[i].getName(), reader.readLine()));
reader.close();
}
this.uridir = new File(System.getProperty("user.dir"), "uri");
if (this.uridir.exists() == false) this.uridir.mkdir();
files = this.uridir.listFiles();
for (int i = 0; i < files.length; i++) {
System.out.println("uri["+i+"]="+files[i]);
BufferedReader reader = new BufferedReader(new FileReader(files[i]));
this.uris.add(new URI(reader.readLine()));
reader.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
public void add(URI uri, HttpCookie cookie) {
System.out.println("MyCookieStore.add("+uri+", "+cookie+")");
try {
this.cookies.put(cookie.getName(), cookie);
PrintWriter writer = new PrintWriter(new File(this.cookiedir, cookie.getName()));
writer.print(cookie.getValue());
writer.close();
if (this.uris.add(uri)) {
writer = new PrintWriter(new File(this.uridir, "uri"+this.uris.size()));
writer.print(uri.toString());
writer.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
public List<HttpCookie> get(URI uri) {
System.out.println("MyCookieStore.get("+uri+")");
return this.getCookies();
}
public List<HttpCookie> getCookies() {
System.out.println("MyCookieStore.getCookies()");
return new Vector<HttpCookie>(this.cookies.values());
}
public List<URI> getURIs(){
System.out.println("MyCookieStore.getURIs()");
return new Vector<URI>(this.uris);
}
public boolean remove(URI uri, HttpCookie cookie) {
System.out.println("MyCookieStore.remove("+uri+", "+cookie+")");
this.cookies.remove(cookie.getName());
return true;
}
public boolean removeAll() {
System.out.println("MyCookieStore.removeAll()");
this.cookies.clear();
File[] files = this.cookiedir.listFiles();
for (int i = 0; i < files.length; i++) {
files[i].delete();
}
return true;
}
}
クッキーの削除抜けてた
public boolean remove(URI uri, HttpCookie cookie) {
System.out.println("MyCookieStore.remove("+uri+", "+cookie+")");
this.cookies.remove(cookie.getName());
File file = new File(this.cookiedir, cookie.getName());
if (file.exists()) file.delete();
return true;
}
おお・・・クッキーのドメインとパスを保存してないからアカン・・・アカンのか
んお!?
PONのドメインは鯖別なのか?
Twitterでやれよ
ツイッターは知らん
ドメイン別に保存するよう作り変えるわ
ドメイン別クッキー保存に修正したお
public class MyCookieStore implements CookieStore {
HashSet<URI> uris = new HashSet<URI>();
HashSet<HttpCookie> cookies = new HashSet<HttpCookie>();
File cookiedir = null;
File uridir = null;
public MyCookieStore() {
System.out.println("MyCookieStore.Constractor");
try {
this.cookiedir = new File(System.getProperty("user.dir"), "cookie");
if (this.cookiedir.exists() == false) this.cookiedir.mkdir();
File[] dirs = this.cookiedir.listFiles(new FileFilter(){
public boolean accept(File pathname) {
return pathname.isDirectory();
}
});
HttpCookie cookie = null;
for (int i = 0; i < dirs.length; i++) {
System.out.println("cookiedir["+i+"]="+dirs[i]);
File[] files = dirs[i].listFiles(new FileFilter(){
public boolean accept(File pathname) {
return pathname.isFile();
}
});
for (int j = 0; j < files.length; j++) {
System.out.println("cookiefile["+j+"]"+files[j]);
BufferedReader reader = new BufferedReader(new FileReader(files[j]));
this.cookies.add(cookie = new HttpCookie(files[j].getName(), reader.readLine()));
cookie.setDomain(reader.readLine());
cookie.setPath(reader.readLine());
cookie.setVersion(Integer.parseInt(reader.readLine()));
reader.close();
}
}
this.uridir = new File(System.getProperty("user.dir"), "uri");
if (this.uridir.exists() == false) this.uridir.mkdir();
File[] files = this.uridir.listFiles();
for (int i = 0; i < files.length; i++) {
System.out.println("uri["+i+"]="+files[i]);
BufferedReader reader = new BufferedReader(new FileReader(files[i]));
this.uris.add(new URI(reader.readLine()));
reader.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
public void add(URI uri, HttpCookie cookie) {
System.out.println("MyCookieStore.add("+uri+", "+cookie+")");
try {
this.cookies.add(cookie);
File dir = new File(this.cookiedir, cookie.getDomain().replace(".", "_"));
if (dir.exists() == false) dir.mkdir();
PrintWriter writer = new PrintWriter(new File(dir, cookie.getName()));
writer.println(cookie.getValue());
writer.println(cookie.getDomain());
writer.println(cookie.getPath());
writer.println(cookie.getVersion());
writer.close();
if (this.uris.add(uri)) {
writer = new PrintWriter(new File(this.uridir, "uri"+this.uris.size()));
writer.print(uri.toString());
writer.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
public List<HttpCookie> get(URI uri) {
System.out.println("MyCookieStore.get("+uri+")");
ArrayList<HttpCookie> list = new ArrayList<HttpCookie>();
try {
for (Iterator<HttpCookie> i = this.cookies.iterator(); i.hasNext(); ) {
HttpCookie cookie = i.next();
if (HttpCookie.domainMatches(cookie.getDomain(), uri.toURL().getHost())) {
list.add(cookie);
}
}
} catch (Exception e) {
e.printStackTrace();
}
return list;
}
public List<HttpCookie> getCookies() {
System.out.println("MyCookieStore.getCookies()");
return new ArrayList<HttpCookie>(this.cookies);
}
public List<URI> getURIs() {
System.out.println("MyCookieStore.getURIs()");
return new ArrayList<URI>(this.uris);
}
public boolean remove(URI uri, HttpCookie cookie) {
System.out.println("MyCookieStore.remove("+uri+", "+cookie+")");
this.cookies.remove(cookie.getName());
File file = new File(this.cookiedir, cookie.getName());
if (file.exists()) file.delete();
return true;
}
public boolean removeAll() {
System.out.println("MyCookieStore.removeAll()");
this.cookies.clear();
File[] files = this.cookiedir.listFiles();
for (int i = 0; i < files.length; i++) {
files[i].delete();
}
return true;
}
}
removeとremoveAllの修正忘れてた
public boolean remove(URI uri, HttpCookie cookie) {
System.out.println("MyCookieStore.remove("+uri+", "+cookie+")");
this.cookies.remove(cookie);
File dir = new File(this.cookiedir, cookie.getDomain().replace(".", "_"));
if (dir.exists() == false) return true;
File file = new File(dir, cookie.getName());
if (file.exists()) file.delete();
if (dir.listFiles().length == 0) dir.delete();
return true;
}
public boolean removeAll() {
System.out.println("MyCookieStore.removeAll()");
this.cookies.clear();
File[] dirs = this.cookiedir.listFiles(new FileFilter(){
public boolean accept(File pathname) {
return pathname.isDirectory();
}
});
for (int i = 0; i < dirs.length; i++) {
File[] files = dirs[i].listFiles(new FileFilter(){
public boolean accept(File pathname) {
return pathname.isFile();
}
});
for (int j = 0; j < files.length; j++) {
files[j].delete();
}
if (dirs[i].listFiles().length == 0) dirs[i].delete();
}
return true;
}
DOMのAPIマニュアルだけ見て色々試行錯誤してみてるが
やはりちゃんとググるかしないとダメぽ・・・
DocumentBuilderFactoryからDocumentBuilder作るまではよかったが
単純にファイル渡したらUTF-8がどうのこうの出て、まぁ文字コードの問題かとCharsetとか色々見て回ったけど答えにたどり着くのにかなり時間がかかった
文字コードの変換はChareset使ったデコード以外に>>119 でつかったInputStreamReaderがあるってことに気づくのにかなり時間がかかった(>>119 のコードは大半コピペだしw)
で次なる問題はDocumentBuilderにReaderは直接は渡せないと、そこでInputStreamの引数でどうしたら渡せるかと結構悩んだ
実はInputSourceというDOM用のクラスがReader渡せると気づくのにすげえ時間かかった
まとめるとこんな感じ
Document dom = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(
new InputSource(new InputStreamReader(new FileInputStream(
new File(System.getProperty("user.dir"), "test.html")), Charset.forName("Shift_JIS"))));
ただ問題がそこじゃなくて、2chの書き込み確認ページのソースそのままコピーして作ったtest.htmlなんだけど
METAタグに終了タグがないというXMLのエラーが出て、エラーハンドラーなるもの設置すれば回避もできるような風なAPIドキュメントには書いてあるぽいというか
やはりググらなければ分からんだろうな、ってとこ
まさか厳格なXML定義に基づいてるのか、XMLにはあんまり明るくないのでよくは分からんが今調べてる最中
まぁ自分でドキュメント読んで調べながら作るって、ようは車輪の再開発とか言われる無駄行為なんだろうけどさ、
おそらくググれば一発解決するようなレベルなんだろうけどさ、自分で調べて考えて解決って楽しいよね?俺はそれが楽しいからやってる
Javadocっていうの?このAPIドキュメントってのは、これjavaSE1.6用の日本語のを昔DLした奴を読んでるんだが(ネットでも日本語版が公開されてるがしかも1.4〜1.6までw)
外部サイトへのリンクが死んでるの多いのな、java7用のドキュメントは全部英語で読む気しないのだが
まぁ使ってるjdkが1.7だから最新のドキュメントを読んだほうがいいのだが
あ、今気づいた、DocumentBuilderにsetErrorHandlerがあるじゃないか!これに適当なErrorHandler設定すりゃいいのかな?試してみる!
さっきのエラーメッセージからするとMETAの終了タグなしはFatal Errorらしいが、これって深刻なエラーってことだよな・・・
どうもFatalErrorはエラーハンドラー設定してもスルーできないようだ・・・パーサで何か設定するってことかな
なんと、APIドキュメントにあったDTDが気になってすべてのクラス一覧から見たらswingにhtmlの解析のパーサがあるじゃないか、これ使って試してみるか
3/5 HTML解析ツールを作る [Javaプログラミング] All About
ttp://allabout.co.jp/gm/gc/80633/3/
ここを参考にしてみたお
おーおーでけたでけt
titleタグ、inputタグ、そして2ch_X:???のコメント、body内の文章、全部簡単に取得できた・・・
DocumentBuilderとかで悩んでた苦労は何だったの一体・・・全く無意味だった・・・
今日一日必死で勉強してhtmlをマスターする
Borland C++ Compiler 5.5も入れてんだがそれのMakeでjavaもコンパイルできんのな
JC = javac
AllFiles: Test.class\
MyCookieStore.class
.path.class = class
.java class.class:
@if not exist class @mkdir class
$(JC) $. -d class
テスト用のバッチも作ってみた
j Test
で java Test を実行できる
コマンドプロンプトの補完機能で
j Test.java
でもjava Test を実行できるようにしてみた
@rem j.bat
@echo off
if "%~n1"=="" goto errorlabel1
if not exist class mkdir class
if not exist "class\%~n1.class" goto errorlabel2
java -cp class %~n1
goto endlabel
:errorlabel1
echo 引数が指定されてません
goto endlabel
:errorlabel2
echo %~n1.class が存在しません
goto endlabel
:endlabel
さっきのMakefileに合わせてmakeも簡単にできるようにバッチにしてみた
m のみで make
m Test もしくは m Test.java で make Test.class
を実行する
@rem m.bat
@echo off
if not exist class mkdir class
if "%~n1"=="" goto noargument
if not exist "%~n1.java" goto errorlabel1
make %~n1.class
goto endlabel
:noargument
make
goto endlabel
:errorlabel1
echo %~n1.java が存在しません
goto endlabel
:endlabel
初回投稿は成功したけど
2回目投稿ができないんだが・・・
ちょっと原因がわからない・・・初回投稿というのしかできない
クッキーはJava側がちゃんと処理してくれてるはずなんだが・・・
ERROR:ブラウザを立ち上げなおしてみてください。
というエラーなんだが、時間が進んでるとなるって?
unixタイム・・・って秒なのか?、つまりミリセコンドじゃないのか、そうかこれ直せばいいのかな
おお!System.currentTimeMillis()-2000が悪かったんだな!
System.currentTimeMillis()/1000-2にしたら書き込めたぞ!
念のため-2じゃなく-3600にしといた
1時間も時間がズレることはないだろうけど、10分くらいならズレそう
http://www1.axfc.net/uploader/so/2859854.zip
コードここに全部貼り付けるのは何なんで成果物をうpした
ファイル内容は
WritingTest.java
BBS2chWriter.java
MyCookieStore.java
Compile.bat
だ
compile.bat
でコンパイルして
cd class
java WritingTest
で実行な
WritingTest.javaのソースコードから鯖名や板名やスレ番を変えてくれ
ソースコードのスレは↓のスレ
てすとスレ
http://uni.2ch.net/test/read.cgi/entrance2/1341499475/
これはまだ決まったスレに書き込むことしかできないしアレだけどな
課題はまだあって忍法帖のクッキーのHAPがドメイン別に大量に発行されてまうのだが
これまとめたほうがいいんだろうな・・・
MyCookieStore.javaはまだ改良の余地が大量にあるな
やはりIEのクッキーファイルチェックしてみたが
.2ch.net指定のHAPはuni.2ch.netやtoro.2ch.netとかに保存されてないや
おお、クッキーの仕様に名前の重複はアカンとあるな、
MyCookieStore.javaがW3Cの仕様にそってないので>>167 は消した
PHPでテストしてみたが
IEもOperaもFireFoxも同名クッキーの処理してないくさいな
パスが同じ上位ドメインで同名クッキー発行しても両方送信してる・・・
同じ名前だと先に設定したクッキーのほうが前に設置され
それをPHPがクッキーだと認識してるな
パスが同じだと先に設定されたクッキーが前方に設置で送信されて
パスが違うとドメインが優先されてるのか
んん?そういうわけじゃないのか
2chのHAPだとIEもOperaもFireFoxも上位ドメインのほうのだけ記録されるけど
俺の作ったテスト用PHPだとIEもOperaもFireFoxも下位ドメインのクッキーも記録される・・・
これは一体どういうことだ!?
違うな、IEとかOperaとかFireFoxだとそもそも下位ドメインのクッキー要求が来ない
だけど俺の作ったやつだとCookieStoreのaddメソッドがHAPが2回呼ばれそれぞれドメインのレベルが違うわけだが
これはもしかしてJava側のHTTP通信の実装の問題か?
てかFireFoxにクッキーモンスターとかいう怖い仕様があったのな(7年前の記事にあった),
今はどうなんだろうか
もしかしてJavaのバグじゃなく2chのbbs.cgiのバグか?
そういえば作ったPHPのほうの挙動はIEとかと同じだった
もしbbs.cgiがUserAgentの違いで発行するクッキーが違うのだとしたら・・・
どうだろ
getHeaderFields()でヘッダを見てみたが
やはりSetCookieでドメイン指定と未指定のHAPが2つ発行されてるのな
monazilla公式だと.2ch.netのドメインが正しいようだから
HAP限定で別途処理するか・・・
HAPを2つも送信したら通信量がとんでもないからな(つかこちらからの送信は抑えられるが向こうからの送信は抑えられねえな)
今気づいたけど自作のMyCookieStoreはpathの違いを考慮してなかったな
ドメインの違いは考慮するけど、まぁ2chから発行されるクッキーにそんな考慮はいらんかもだけど
汎用性を持たせたいじゃん
今はドメイン名フォルダ別でクッキー名ファイルで直保存だけどこれだとパスの違いが考慮されんからなあ
パスフォルダでも作るか?
そうか、ドメイン+パス+クッキー名のキーとファイル名を対応させたマップ作って
ファイル名はクソ適当に連番でつけりゃいいか
いや、HttpCookieのインスタンスをそのままキーにすりゃいいのか
おお、HashSetの説明よく読んだら、HttpCookieのequals()仕様だとvalueが比較されないから新しいのに交換されないのな、
ここも変えないと・・・
おし、MyCookieStore改修成功!
CookieStoreのaddで送られてくるURIを保存してたがこれはちょっと違うかw
あとURIのtoString()で保存してたけど、URIはシリアライズできるからwriteObject()で保存してみたが、toString()と何ら変わらない感じだ・・・
MyCookieStoreに汎用性を付けるために大幅改造中
とはいえ大量のサイトアクセスしちゃうとHashMapとかで管理するのは微妙かなあ・・・メモリサイズ的に
とはいえほとんど終わっててあとはremoveとremoveAllのみ作ればいい
ちょい修正したがMyCookieStoreが完成した。
さて、2ch書き込みの通信はクリアしたので次は板一覧の取得に挑戦かな
monazillaでしたらばとまちBBSは2chと仕様がかなり違うみたい
しかもしたらばは文字コードが一部EUCとか・・・
書き込み用に作ったクラスの文字コードの処理が入ってねえな・・・
HAP値が2回来るって書いたけど、expiresの値を見たら片方は過去の日付が設定されてた
つまり一方はHAP値を消すために来てたというわけでそりゃIEやOperaやFireFoxでは表示されないわな
ただ問題は過去の期限が設定されてるHAP値がdomainを指定してないので同一のHttpCookieと認識されないこと
あとCookieの仕様からして過去の期限ならaddじゃなくremoveが呼び出されるべきなのにこれはJavaの仕様の問題か
あと値も期限もドメインもパスも変わってないのにPRENのSet-Cookieが書き込み成功時のたびに送信されてくるのな
書き込み頻繁に行うとHAP値の書き換えが頻出するなこれ
ディスクへの読み書きが増える現在の俺のMyCookieStoreじゃマズいなこれ
ブラウザ起動時と終了時にクッキーの読み込み保存するだけならデフォのCookieStoreでも問題ないしなあ・・・
しゃーない、せっかくMyCookieStoreを何時間も費やして作ったが
デフォのクッキーストア使うか・・・これはメモリ上だけに構築されるらしいしね
おお、CookieManagerのAPIドキュメントに書いてあった、addとgetしか使わないって・・・頑張ったのにMyCookieStore作ったけど結果無意味だったな・・・無駄な時間だった
デフォのCookieStoreの作りが気になったので
jdkフォルダ内にあるsrc.zipを展開してCookieManager.javaを見てみたら
デフォのCookieStoreはInMemoryCookieStore.javaということが分かり見てみた
全然作りが違った、期限切れのCookieは保存しないようにしてたしURIの管理方法も違った
何よりもちゃんと同期処理をしてた、同期処理はsynchronizedを使うもんだと思ってたが簡単にできるクラスがあったのな勉強になった
すげえな、確かにpure javaだったわ
あとInMemoryCookieStoreはドメイン管理に
HttpCookie.domainMatchesとは別のメソッドも用意してて
Cookieのバージョンに合わせて使い分けてた、domainMatchesがバージョン1用だなんてAPIドキュメントには書いてなかったぞ・・・
まぁおそらくCookieの仕様が書いてあるRFCとかに書いてあるんだろうけど・・・・
ソースコードの冒頭に
ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
とあったけど
分からなくてこのままググったら
なんかヤバそうだなこれ
ひとまずオリジナルでCookieStoreを作るのはかなりしんどそうだから
やはりデフォのCookieStore使うか・・・
ほげ
未だ規制がとけない
プログラミングの幅を広げるため今xmlを勉強中なり
難しいなこれ
マークアップ言語とかスキーマ言語とか
iPhoneアプリってマックが必要なのか・・・
gcc hello.c
最適化スイッチの違いでただのHello Worldでもバイナリサイズとか変わるんだね、へぇ・・
ってgccだけかよ!
borland c compilerで最適化スイッチ変えてもバイナリサイズ変わらねえ・・・(中身は変わったようだが・・・)
watcomのコンパイラでも最適化スイッチ関係なかった・・・(だがボーランドよりサイズが小さい?)
ライセンスってよく分からんちん
ライセンス条文そのものにも著作権があるとかで
自分の作ったものにライセンスをつけるとなると自前で書かなくちゃならんってことか?
オープンソースライセンス - Open Source Group Japan Wiki - Open Source Group Japan - SourceForge.JP
http://sourceforge.jp/projects/opensource/wiki/licenses
どのライセンスがよさそうか
メモ
XMLHTTP (MSXML)
・プロキシ、クッキーをIEと共用
WinHTTP
・プロキシ、クッキーは自前での実装が必要
・バイナリファイルを扱える
Java6まだ更新あってワロタ
更新打ち切りとか宣言してたのは何だったのか
DelphiでiOS開発か
http://ikura.2ch.net/test/read.cgi/hikky/1362050172/159
本スレの人すごいな
プログラミング言語自作とか
マジすげえわ
規制まだかよ
2ch書き込みの作っただけで
板一覧やスレ一覧やスレ取得はまだ作ってない
なんかやる気失せた
ヒキ板情報技術部
http://ikura.2ch.net/test/read.cgi/hikky/1348106094/
ヒッキーのプログラミングするスレ
http://ikura.2ch.net/test/read.cgi/hikky/1362050172/
プログラミングできる奴、一緒にアプリ作ろうぜ!!
http://ikura.2ch.net/test/read.cgi/hikky/1360671157/
プログラミング雑談 2013 Ver4.00
http://ikura.2ch.net/test/read.cgi/hikky/1366742736/
javaのコンパイルにmake使ってたけど
apacheのantとかいうのがあるのな
WM_IME_CHAR
メモ
ゲームでの IME の使用
http://msdn.microsoft.com/ja-jp/library/bb206300(v=vs.85).aspx
スマートフォン版
掲示板管理者へ連絡
無料レンタル掲示板