Skip to main content

31 posts tagged with "Network"

View All Tags

サイトメンテナンスのお知らせ - 日→英翻訳スクリプト

· One min read
Yu Sasaki
Enterprise Security Manager / Advisor

↓使用時の図 JavaScriptでホップアップ翻訳 先日JavaScriptを学び始めてみたので、手始めにこのブログに翻訳スクリプトを付けてました。この機能は単一記事ページ上でテキストをドラッグするとマウスの近くに英訳が表示されます。まぁ自動翻訳の性能は・・・f^^;一応スクリプトのロードを計測したら、たいして時間と負荷がかからないようなのでしばらく様子みて、また私の学習度合いに合わせてUIを改良してみます。設置の動機は最近なぜか海外からのアクセスが増えてきているから。 追記: Google Chromeでは使えないみたいです。原因究明中です。 追記2: 使ってみて案外煩わしいので取り外します>_<

デジタルネイティブ達の行動力が凄い

· 7 min read
Yu Sasaki
Enterprise Security Manager / Advisor

一昨日NHKスペシャル|デジタルネイティブ ~次代を変える若者たち~を見ましたが彼らの行動力って凄い。私もいくつか見習いたい部分がありました。デジタルネイティブの特徴として主に以下の点があるかと思います。

  1. 現実で会った人とネットで知り合った人を区別しない
  2. 相手の所属や肩書、年齢に拘らない
  3. ネットで実名で活動している(その割合が多い感じ?調査中)
  4. 分野別SNSを使いこなして、国内外問わずネットワークを構築しビジネスやボランティア活動等をしている

2番目の特徴というのは、Webの情報がまだテキスト主体だった頃、2chの中にもあった文化だったかな。顔の見えない匿名の人間のバックグラウンドよりも掲示板に書いてある内容が重要、って感じで。3,4っ目の特徴は、これは特徴というか番組で紹介されている人達の共通点かと私が感じた項目です。 実名をネットに持ち込むのはメリット・デメリット双方の面があり未だリスクの方が大きいと思い、私はネット上でのブログやコミュニティ活動と本名を紐付けようとまったく思っていませんでした(番組を見るまでは)。それはネットに一度上がってしまった情報は瞬く間に拡散しそれを管理することは技術的に不可能に近いので(使用するサービスにもよりますが)、いったん実名を公開して不都合があったとき、やっぱやーめた、HNで活動しなおすってわけには簡単にはいかない不可逆なところが、実名での活動を躊躇させているのかもしれません。っていうか場合によっては現実生活に悪影響が出ることもありますし。極端な例では犯罪とか。 対して、番組で最初に紹介されたAlchemist Empire, Inc. CEOのAnshul Samar氏(15歳)は化学の教育用カードゲームを開発しネットで販売しています。彼は最初出資してくれる人を探し資金を調達し、開発者を雇うためFace BookなどのSNSをとおしてクリエイターの履歴書や作品を調査しました。そして、目星をつけたデザイナーにカードのイラスト制作を依頼し、また雑誌編集者に説明書の作成を依頼してゲームを完成、販売にこぎつけていました、開発中の連絡方法はメールだったそうです。字面だけ追えば確かに今あるインターネットやSNSがあればできるよね、と感じたと同時に、実際これだけネットと人材を使いこなしビジネスにもっていく行動力とマネジメント手法は凄いと感心しました。 上述の特徴を持っているからこその行動力なのかな。だとすると本当にそれは幼少からネット環境に触れていることで引き起こしたのか、それとも別の要因があるのか、色々検証したいこともあります。そういえば日本では実名によるネットでの活動を行っている人や英語を使える人の割合が低かったような。諸外国ではどうなのだろう。今回の彼はレアケースとして扱われているのか等の周りの反応も今度調べてみよう。 番組の途中ではてなの経営スタイルと近藤社長ついても特集していました。近藤社長へのインタビューの中で、何故ここまでプライベートをWebに公開できるんですか?のくだんかその前後の話しあたりで、「Webの向こう側にも同じ人間がいるので別に~」(ちょっと忘れてしまいました><;離れたところにいる人とつながれるとか、そんな感じの話だったかな)と普通の事のように話していたのが印象として残っています。 最近はビジネス型SNSのCUが始まったり、来年にはLinkedInが日本語の環境や企業データもろもろに対応していくみたいです。実名でWebの活動を行うことによる正負の影響と、仮にそれに抵抗を覚えるとしたらその原因と対処法は何なのかを今一度捉え直してみようかな。

そういえばゲームではありませんが元素や化合物を擬人化するアイディアは左の書籍「元素周期 萌えて覚える化学の基本」も採っていますね。Elementeoより後だけれど。でもなんか面白そう。説明文読んでみたい。 周期表とか見ると以前色鉛筆を使って作成したデータベース・ノートを思い出してなんだか懐かしいです。 話し変わりますが、プログラミングやソフトウェア開発を学べるカードゲームを妄想した。マジック・ザ・ギャザリング風に、 A: 元請予算(=土地カードの一種)をセット!タップして2人月(=マナ)を以って場のClassカードに「デザインパターンActive Object」を適応(カード反転?)!Classの性能、保守力up! B: レスポンス!3人月を以って「闇の自称助っ人コーダー」のタップアビリティを起動!対象のクラスのカプセル化を破壊!デザパタカードを剥ぎ取る。追加効果として相手のターンを1ターン飛ばす(なにこの足を引っ張る効果は)(=納期遅れる、みたいな?)! A: それにスタック乗っけて4人月で「藤田さん」をインスタントとしてプレイ!場に召喚されたときに、俺がコントロールする全てのClassカードはリファクタリングされ、能力と効果の対象にならない! B: 何ぃ!フェずったぜ。 あー色々間違っていますね。 でも複数のクラスカードとインスタンスカウンターと参照カードを合わせてどの業務用アルゴリズムにパターンを構築するかやリファクタリング、合致するかとかのゲームならいけそう(業務知識も学べます、みたいな)?え、まだいけない?また今度考えてみようかな。 参考: 1.デジタルネイティブ度チェック(私は60%でしたf^^;)自己評価もそんな感じなので現時点ではこれでいいかな。あ、なんか今夜再放送するみたいですね。番組の構成や映像クオリティも高いですし、おススメですよ。 2.Elementeo, The Chemistry Card Game Introduction to Elementeo Opening the Elementeo Game Box The Element Card of the Elementeo Game Elemente Level in the Elementeo Game

PHP: クライアントへのCookieの設定と削除 - setcookie()関数

· 3 min read
Yu Sasaki
Enterprise Security Manager / Advisor

クライアントのブラウザにCookieを保存・削除する手順の練習をしてみました。 Cookieはサーバからクライアントへレスポンスを送信する際にヘッダに含まれる情報で、Cookie受信以降のクライアントのリクエストにはCookieの情報が含まれます。これによって、クライアントの識別や状態を管理することが出来ます。 Cookieをクライアントに送信する際は有効期限を設定し、削除する際はその有効期限を過去のものとして期限オーバーを装い、ブラウザに削除させます。 具体的に以下の例では、setcookie(<cookie名>[, <値>[, <有効期限>[, <送信パス>[, <送信ドメイン>[, <httpsのときのみの送信?>]]]]])でCookieを設定、削除します。cookie名には変数の他に配列も使用することが出来ます。

ソースコード

Cookieを用いたクライアントへの情報の保存とアクセスのカウント例です。クライアントブラウザ側からのリクエストに含まれるCookieへのアクセスには配列$_COOKIEを用います。

クッキーの利用と削除 \n"; //echo $_COOKIE['login_info']['user_name'];などでアクセスしてもよい foreach ($_COOKIE['login_info'] as $key => $value) { echo $key . " → " . $value . "
\n"; } } else { echo "ユーザ情報のクッキーが保存されていません(初回読み込み時) or 削除されました)。
\n"; } echo $count . "回目のアクセスです。
\n"; ?>

実行結果

1回目のアクセス

ユーザ情報のクッキーが保存されていません(初回読み込み時) or 削除されました)。
1回目のアクセスです。

2回目以降のアクセス(偶数回)

ユーザ情報のクッキーがセットされています。
user_id → 59816
user_name → yukun
2回目のアクセスです。

3回目以降のアクセス(奇数回)

ユーザ情報のクッキーが保存されていません(初回読み込み時) or 削除されました)。
3回目のアクセスです。

このときのCookieの保持状況をブラウザで確認してみると、 ブラウザFirefoxでCookieを確認 確かに保存されていますね。次のアクセスの際、これを読み込み以下の項目を表示しますが、

user_id → 59816
user_name → yukun

直後に削除されます。 Cookieはクライアントを識別するのに便利な機能ですが、これは改ざんされる恐れもありセキュリティに注意して扱わなければなりません。なので、上の例のような分かりやすい配列名で重要なデータ(例えばパスワードなども)を扱うのも好ましくないようです。

クッキーを扱う際の注意点

  • ブラウザの設定によってはCookieをうけつけない。
  • 1つのCookieのサイズは最大4KBまで
  • 1つのドメインでは最大20個まで
  • Cookieの有効期限の判定はクライアントの時計に従う

Java: ローカルホスト名とIPアドレスを取得 - InetAddress.getLocalHost()メソッド

· One min read
Yu Sasaki
Enterprise Security Manager / Advisor

ローカルのホスト名とIPアドレスの取得方法です。 InetAddress.getLocalHost()メソッドでInetAddressクラスの唯一のインスタンスを取得し、getHostName()でホスト名を、getHostAddress()メソッドでIPアドレスをそれぞれ取得します。 これらの情報はコンピュータ一台に対して通常一つしかないので(LANカードが二枚以上さされている場合を除いて)InetAddressクラスはSingletonパターンを採っているようです。あー、アドレスを二つ以上持っている場合の手順忘れてしまいました。後でさらっておこう。

ソースコード

import java.net.InetAddress;
import java.net.UnknownHostException;
public class ShowInetAddress {
public static void main(String[] args) {
// ローカルホスト名とIPアドレスを取得
try {
InetAddress addr = InetAddress.getLocalHost();
InetAddress addr2 = InetAddress.getLocalHost();
if (addr.equals(addr2)) System.out.println("addrとaddr2は同じインスタンス");
System.out.println("Local Host Name: " + addr.getHostName());
System.out.println("IP Address : " + addr.getHostAddress());
} catch (UnknownHostException e) {
e.printStackTrace();
}
}
}

実行結果の一例

addrとaddr2は同じインスタンス
Local Host Name: Yukun-PC
IP Address : 192.168.1.10

java.io.StreamCorruptedExceptionが発生した原因とその解決策の一例

· 3 min read
Yu Sasaki
Enterprise Security Manager / Advisor

以前というかこの頃Javaで簡単な分散処理サーバ・クライアントシステムのモデルを実装中にこのjava.io.StreamCorruptedExceptionという例外が発生。

StreamCorruptedExceptionの発生原因

結論から言えば、恐らく実行中のスレッドの数がマシンスペックに対して多すぎたのではないかと推定(推定どまり)。 サーバが複数のクライアントを受け付けるので、クライアントのソケット接続(accept時)毎にスレッドを生成する方法を採った。この時はブロッキング型のモデル(この頃ノンブロッキング型は知らなかった)。 例外の発生状況はサーバプログラムをテスト動作時、絶えず約1000クライアントからのリクエストを受け付け、かつレスポンス等を行った場合。なお送受信データはシリアライズされたオブジェクトで、サイズは平均5KB。その時テストマシンで走らせたスレッド数が約5000。 シリアライズの復元の問題かと考えたが、送受信するオブジェクトのクラスとそのserialVersionUIDは揃えており、500クライアント位ではこれといった異常なく動作していた。 実際にある時間のクライアントの送信データ数とサーバの受信データ数を確認してみたら、両数値の差が生じていて、約200リクエストがソケット部分で溜まったところでダウンしました。 スレッド数が多いと、その分スレッドの切り替えが頻発したり、待たされるスレッドが出てくる。その為、ソケットの部分で受信データが許容量以上に溜まって、I/Oのどこかがオバーフローか変になった可能性もある。

例外発生時のスタックトレースの一部抜粋

java.io.StreamCorruptedException: unexpected reset; recursion depth: 1
at java.io.ObjectInputStream.handleReset(Unknown Source)
at java.io.ObjectInputStream.readObject0(Unknown Source)
at java.io.ObjectInputStream.skipCustomData(Unknown Source)
at java.io.ObjectInputStream.readNonProxyDesc(Unknown Source)
at java.io.ObjectInputStream.readClassDesc(Unknown Source)
at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
at java.io.ObjectInputStream.readObject0(Unknown Source)
at java.io.ObjectInputStream.readObject(Unknown Source)

また、これ以外にOptionalDataExceptionという例外も併発しましたが、これも同じ原因かと推定。

java.io.OptionalDataException
at java.io.ObjectInputStream.readObject0(Unknown Source)
at java.io.ObjectInputStream.readObject(Unknown Source)

試した解決策

スレッド数を抑える

これは解決策とは言えないが、マシンスペック(CPU[コア]数やクロックなど)に対してスレッド数が多すぎるのが問題だと推定したので、ある程度スレッド数を抑えて運用したところ例外は発生しなくなった。

もう一度接続しなおす

例外をtry-catchブロックでキャッチできるので、それに合わせて接続しなおしてリクエストorレスポンスを再送することで一時対処した。

ノンブロッキング型にする

nio(New I/O)ライブラリが用意されているので、それを用いたノンブロッキング型の機構にして、スレッドプールを用意することでスレッド数やコンテキストスイッチ、オーバヘッドをある程度抑えることが可能と考えるが、まだ未検証。 どちらにせよ、根本原因の究明にはkernel dump等の情報を取って解析していく必要がある。。。

Yahoo!検索 サイトエクスプローラー を利用するブックマークレット

· One min read
Yu Sasaki
Enterprise Security Manager / Advisor

追記:Yahoo!検索 サイトエクスプローラーのサービスって終了してしまったんですね。。 任意のWebページ上でワンクリックでサイトエクスプローラー - Yahoo!検索のインデックス検索が出来るブックマークレットを作ってみました。

別ウィンドウで開く

下のリンクをお気に入りにドラック&ドロップして下さい。 サイトエクスプローラー(別) IEの場合、その際のホップアップは許可してください。ホップアップ確認がわずらわしい場合は下の「同じウィンドウで開く」バージョンを利用してください。

同じウィンドウで開く

[サイトエクスプローラー(同)](javascript:(function(){ document.location.href='http://siteexplorer.search.yahoo.co.jp/advsearch?p='+escape\(document.location.href\) })();) コード

javascript:(function(){
document.location.href=
'http://siteexplorer.search.yahoo.co.jp/advsearch?p='+escape(document.location.href)
})();

使い方

任意のサイトで上述で作成したお気に入りをクリックすると、そのサイトのインデックス検索が行われます。

JavaプログラムからExcite翻訳を利用

· 3 min read
Yu Sasaki
Enterprise Security Manager / Advisor

POSTメソッドを用いてWebページのフォームにリクエストを送信し、そのレスポンスを取得するプログラム例として、エキサイト 翻訳を利用してみます。 送信クエリの1つは翻訳言語設定、2つ目は翻訳対象文字列でレスポンスのWebページから翻訳された文字列を抽出します。

ソースコード

import java.net.*;
import java.util.regex.*;
import java.io.*;
/**
* Excite翻訳(http://www.excite.co.jp/world/)を利用するクラス
*/
public class ExciteTrans {
private String direction; // 翻訳する言語設定 "ENJA" or "JAEN"
/** テスト用main() */
public static void main(String[] args) {
ExciteTrans et = new ExciteTrans();
System.out.println(et.getTransText("Hello!")); // 翻訳対象テキスト
}
/** コンストラクタ */
public ExciteTrans() { direction ="ENJA"; }
public ExciteTrans(String str) {
if (str.equals("JAEN") || str.equals("ENJA"))
direction = str;
else
direction ="JAEN";
}
/**
* テキストを翻訳
* @param before 翻訳前のテキスト
* @return 翻訳後のテキスト
*/
public String getTransText(String before) {
String afterText = null; // 翻訳されたテキスト
try {
// URLクラスのインスタンスを生成
URL exciteURL =
new URL("http://www.excite.co.jp/world/english/");
// 接続します
URLConnection con = exciteURL.openConnection();
// 出力を行うように設定
con.setDoOutput(true);
// 出力ストリームを取得
PrintWriter out = new PrintWriter(con.getOutputStream());
// クエリー文の生成・送信
out.print("before={"+ before +"}&wb_lp={"+ direction +"}");
out.close();
// 入力ストリームを取得
BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
// 一行ずつ読み込む
String aline;
// 抽出用の正規表現
String regex = "<textarea [^>].*after.*>(.*)";
Pattern pattern = Pattern.compile(regex);
while ((aline = in.readLine()) != null) {
Matcher mc = pattern.matcher(aline);
if(mc.matches()) {
afterText = mc.group(1);
}
}
in.close(); // 入力ストリームを閉じる
} catch (IOException e) {
e.printStackTrace();
}
return afterText;
}
}

実行結果

こんにちは!

Java MSN Messenger Library (JML)で翻訳ロボを作る

Java MSN Messenger Library (JML)とは Windows Live Messenger 上の通信プロトコルMSNP8-MSNP12をサポートするライブラリです。主に、メンバーの会話に自動応答するチャットボット(Chat Bot)や人工無脳などを作る際に用いられます。 今回は、ライブラリに付属しているサンプルプログラムのEchoMessengerクラスにこの翻訳クラスをかませて、メンバーの発言を翻訳し、その文字列色をランダムで選択した色で応答するチャットボットを作成してみました。 実行結果は下図になります。 ![JML翻訳ロボの実行結果例](./naiTrans-e1273383658134.png) コンストラクタでの翻訳言語設定が逆でも、文字列が英語or日本語に統一されていれば、Excite翻訳側がそれに合わせて適当な言語で翻訳するみたいです。 最後に、

礼儀正しくクローリングする際は

  • robots.txtやメタタグを守るように
  • 相手サーバに負荷をかけすぎないように
  • 相手Webサイトポリシー(利用規約)を守るように
  • 頻繁に使いたいモノなら、同機能のWebサービスを使うこと(利用規約内で)
うーん、今回のようなプログラムの利用はあまりよくないようでね。

java.lang.OutOfMemoryErrorが発生する原因とその解決法の一例

· One min read
Yu Sasaki
Enterprise Security Manager / Advisor

JVMがGCを行えるように、開放するインスタンスへの参照を切っていたのだけれど、なぜか例外が投げられ続けていました。色々調べてみたら、java.io.ObjectOutputStream#writeObject(Object obj)の部分で、書き出されたobjの状態が保持され続けるので、いつまでたってもGCが始まらなかったのが原因でした。 解決法は、java.io.ObjectOutputStream#reset()メソッドでストリームが保持している状態を無効にすることで、不要インスタンスをGCの対象に入れることでした。

Webページから指定したタグの要素を抜き出すRuby関数

· 2 min read
Yu Sasaki
Enterprise Security Manager / Advisor

単一のWebページから抜き出した複数の要素を配列に格納して返します。 以下の例はaタグの要素(エレメント)を抽出した場合です。

Rubyコード

require 'net/http'
require 'kconv'
def parse_array(string, beg_tag, close_tag)
array = Array.new
string.scan(/#{beg_tag}(.*?)#{close_tag}/sm) { |matched|
#puts matched
array = array | matched
}
return array
end
Net::HTTP.version_1_2
Net::HTTP.start('b.hatena.ne.jp', 80) {|http|
response = http.get('/hotentry/')
str = Kconv.tosjis(response.body)
a_tag_array = parse_array(str, "" )
puts a_tag_array
}

学んだこと

  • Net::HTTP.startメソッドをブロックを用いて呼び出すことによって、ブロックの間だけセッションを開いて接続し、ブロック終了とともに自動的にセッションを閉じる。Rubyに慣れてもJavaやCでの手続きを意識しておくこと。
  • 配列の結合には和集合(演算子は「|」)を用いた。この場合、重複する要素は1つとして数えられる。別々に数えたい場合は「+」演算子を用いる。
  • String#scanメソッドはブロックで用いるとブロック変数にマッチした部分を格納する。その際、正規表現の中で「()」が用いられると、()内の部分を配列にして返す。今回は別に配列にする必要はなかったかも。

参考サイト

Web サーバからドキュメントを得る - Rubyist Magazine - 標準添付ライブラリ紹介 【第 7 回】 net/http

POSTメソッドを用いてExcite翻訳を行うRubyコード

· One min read
Yu Sasaki
Enterprise Security Manager / Advisor

しかし、未完です。

Webの巡回などにはWWW::Mechanizeという便利なライブラリがありますが、あえてnet/httpのPOSTメソッドを使う理由は、単にPOSTそのものと正規表現の学習をするためです。

今回は正規表現で試行錯誤。

Rubyソースコード

#!/usr/bin/ruby
require 'net/http'
require 'kconv'
before = "hello"
http = Net::HTTP.new('www.excite.co.jp')
response = http.post('/world/english', "before=#{before}&wb_lp=ENJA")
result = Kconv.tosjis(response.body)
result =~ /"after"[^>]*>(.*)/ism
puts $1

実行結果

こんにちは
<中略>

ここで、正規表現

/"after"[^>]*>(.*)/ism

の部分を

/"after"[^>]*>(.*)< \/textarea>/ism

に変更するとマッチしなくなってしまいました。
オプション指定のmで複数行にマッチするはずなんですが・・・うーん、何を見落としているのだろう。