2013年1月30日水曜日

SNSやめよう

最近意味なくFacebook/Twitter(たまにmixi..)のTLを見ている気がしてきた。 気づいてみるとときどき役に立ちそうなものもあったがほとんどが意味のない投稿を見ていた。 特に携帯のアプリの場合は暇なときにいつでも見えてしまうので気づいたら見ているといったことも多い。  メッセージに対応したりとまったく見ないわけではないけど時間がもったいないのでSNSは一旦辞めようと思う。
その代わり時間があったら上記に書いた問題に対応できるようなSNSを作ってみたいなあ。。最近は一日一枚だけ写真が投稿できるMy365とかPathなどのクローズドなSNSができたりと もう少し有意義なやり取りができるものもあるらしいですね。

2013年1月27日日曜日

山括弧(</>)をviでエスケープ処理するように一括置換する。

なんだかんだで毎回調べているのでメモ。 置換後の文字列に&を入れると置換前の文字列が入るのでエスケープしないといけない。

:%s/</\&lt;/g
:%s/>/\&gt;/g

jQueryからServletを呼び出すHelloWorld

jQueryからServletを呼び出すサンプルを作りました。 あとで書くけど直接JavaScriptからServletを呼び出すより格段に簡単に書けることが分かるかと思います。 Servlet側はHello,World返すだけだけど一応載せておきます。
index.html
<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>Hello</title>
<script type="text/javascript" src="http://code.jquery.com/jquery-latest.js"></script>
<script type="text/javascript">
$(function() {
 $("button").click(function() {
  $.get("/hello", function(data) {
   $("div").text(data);
  });
 });
});
</script>

</head>
<body>
 <button>Submit</button>
 <div></div>
</body>
</html>

Hello.java
package com.test;

import java.io.IOException;

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@SuppressWarnings("serial")
public class Hello extends HttpServlet {
 public void doGet(HttpServletRequest req, HttpServletResponse resp)
   throws IOException {
  resp.setContentType("text/plain");
  resp.getWriter().println("Hello, world");
 }
}
web.xml
<web-app version="2.5" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemalocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
 <servlet>
  <servlet-name>Hello</servlet-name>
  <servlet-class>com.test.Hello</servlet-class>
 </servlet>
 <servlet-mapping>
  <servlet-name>Hello</servlet-name>
  <url-pattern>/hello</url-pattern>
 </servlet-mapping>
 <welcome-file-list>
  <welcome-file>index.html</welcome-file>
 </welcome-file-list>
</web-app>
jQueryを利用しないでJavaScriptのみで書こうとした場合、以下のようになります。 buttonタグのonclick属性とメソッド名を紐づけないといけない、XMLHttpRequestを理解して書かないといけない、IEの対応などブラウザごとの対応も必要になってくるなど大変ですね。
<html>
<head>

<title>Hello</title>
<script type="text/javascript">
function submit(){
 if(window.XMLHttpRequest){
  req = new XMLHttpRequest();
 }else if(window.ActiveXObject){
  req = new ActiveXObject("Microsoft.XMLHTTP");
 }else{
  return false;
 }
 req.onreadystatechange=callback;
 req.open("GET","/hello",true);
 req.send(null);
}
function callback(){
 if(req.readyState==4 && req.status==200){
  document.getElementById("result").innerHTML=req.responseText;
 }
}
</script>
</head>
<body>
 <button onclick="submit()">Submit</button>
 <div id="result">
</div>
</body>
</html>

2013年1月4日金曜日

JavaScriptでJavaのString#hashCode()を実装する。

普段Javaを利用している人がJavaScriptを利用するとJavaだとすぐにできるのにといったことがよくある。(逆もあるかもしれないが。) そのなかでJavaのString#hashCode()に相当するものがないので作りました。
String.prototype.hashCode = function(){
 var hash = 0;
 for(var i=0 ; i < this.length; i++){     
  hash = hash * 31 + this.charCodeAt(i);
  hash = hash | 0; //符号付き32bit整数にする。
 }
 return hash; 
}
こんな感じでかくとJavaScriptのString型でhashCodeメソッドを使えるように拡張できるようです。 使い方は以下。
"abc".hashCode()
ちなみにJavaのString#hashCode()は以下です。
public int hashCode()
{
  int hashCode = 0;
  int limit = count + offset;
  for (int i = offset; i < limit; i++)
    hashCode = hashCode * 31 + value[i];
  return hashCode;
}
JavaScriptではint型に強制的に変換する場合、ビット演算を行う必要があるらしいのでそれを利用した。ただ後でみて分かりづらいのであまりよくないノウハウではある気がする。