Loading [MathJax]/extensions/MathMenu.js

2013年7月7日日曜日

OSI参照モデルをまとめる

ネットワークスペシャリストを次は受けてみようかということで情報処理技術者試験では必ず出てくるOSI参照モデルについてまとめてみました。
お決まりの関連機器やTCP/IPとの対応付けについても書いているので分からなくなったら見返すことができるかと思います。
語呂合わせは作りづらいというのが正直なところですね。。

レイヤOSI参照モデル説明関連する機器TCP/IPモデルTCP/IPプロトコル群PDU
第7層アプリケーション層データ通信を利用した様々なサービスを人間や他のプログラムに提供する。ゲートウェイアプリケーション層HTTP / SMTP / POP / FTP / TELNET / DNS / DHCP / NTPメッセージ
第6層プレゼンテーション層第5層から受け取ったデータをユーザが分かりやすい形に変換したり第7層から送られてくるデータを通信に適した形に変換する。
第5層セッション層通信プログラム同士がデータの送受信を行うための仮想的な経路(コネクション)の確立や解放を行う。
第4層トランスポート層相手まで確実に効率よくデータを届けるためのデータ圧縮や誤り制御、再送制御などを行う。トランスポート層TCP/UDPセグメント
第3層ネットワーク層相手までデータを届けるための通信経路の選択や通信経路内のアドレスの管理を行う。ルータインターネット層IP / ARP / RARP / ICMPデータグラム
第2層データリンク層通信相手との物理的な通信路を確保し通信路を流れるデータのエラー検出などを行う。ブリッジネットワークインターフェイス層PPP / LANボードフレーム
第1層物理層データを通信回線に送出するための電気的な変換や機械的な作業を受け持つ。リピータ回線 / 各種ケーブルビット

2013年6月29日土曜日

Jetty9でWebSocketを使ってみる。

今、glassfish4でWebSocketのJavaEE7のWebSocket参照実装が出てきていますが、あえてここでJetty9でWebSocketを使って簡単なチャットアプリを作ってみました。 Jetty9.1ではJavaEE7のWebSocket仕様(JSR365)に対応するようですがJettyの仕様ともあまり変わらないので移行はそこまで大変じゃないと予想しています。
<!DOCTYPE html>
<html>
<head>
<title>WebSocket Chat</title>
<script type="text/javascript">
var ws = new WebSocket("ws://localhost:8080/WebSocketServlet");
ws.onmessage = function(msg) {
console.log("msg received" + msg.data);
var log = document.getElementById("log");
log.innerHTML += msg.data;
};
function send(){
var msg = document.getElementById("msg");
ws.send(msg.value + "<br>");
msg.value = "";
}
</script>
</head>
<body>
<h1>WebSocket Chat</h1>
<div id="log"></div>
<input id="msg" type="text"/>
<button id="send" onclick="send();">send</button>
</body>
</html>
view raw index.html hosted with ❤ by GitHub
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.sanofc</groupId>
<artifactId>JettyWebSocketChat</artifactId>
<packaging>war</packaging>
<version>0.0.1-SNAPSHOT</version>
<name>JettyWebsocketChat</name>
<url>http://maven.apache.org</url>
<properties>
<jettyVersion>9.0.3.v20130506</jettyVersion>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
<version>${jettyVersion}</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.1.1</version>
<configuration>
<failOnMissingWebXml>false</failOnMissingWebXml>
</configuration>
</plugin>
<plugin>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
<version>${jettyVersion}</version>
<configuration>
<scanIntervalSeconds>1</scanIntervalSeconds>
<webApp>
<contextPath>/</contextPath>
</webApp>
</configuration>
</plugin>
</plugins>
</build>
</project>
view raw pom.xml hosted with ❤ by GitHub
package com.sanofc;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
import org.eclipse.jetty.websocket.api.Session;
import org.eclipse.jetty.websocket.api.annotations.OnWebSocketClose;
import org.eclipse.jetty.websocket.api.annotations.OnWebSocketConnect;
import org.eclipse.jetty.websocket.api.annotations.OnWebSocketMessage;
import org.eclipse.jetty.websocket.api.annotations.WebSocket;
@WebSocket
public class WebSocketListener {
static Set<Session> sessions = Collections.synchronizedSet(new HashSet());
@OnWebSocketConnect
public void onConnect(Session session) {
System.out.println("MyWebSocket.onConnect()");
sessions.add(session);
}
@OnWebSocketMessage
public void onText(String msg) {
System.out.println("MyWebSocket.onText()");
System.out.println(msg);
for(Session session : sessions){
session.getRemote().sendStringByFuture(msg);
}
}
@OnWebSocketClose
public void onClose(Session session, int statusCode, String reason) {
System.out.println("MyWebSocket.onClose()");
sessions.remove(session);
}
}
package com.sanofc;
import javax.servlet.annotation.WebServlet;
import org.eclipse.jetty.websocket.servlet.WebSocketServlet;
import org.eclipse.jetty.websocket.servlet.WebSocketServletFactory;
@WebServlet("/WebSocketServlet")
public class WebSocketServletImpl extends WebSocketServlet{
private static final long serialVersionUID = 1L;
@Override
public void configure(WebSocketServletFactory factory) {
factory.register(WebSocketListener.class);
}
}

2013年5月26日日曜日

NetBeans7.3のキーをVim風にする。

EclipseだとVrapperでキーバインドをVim風にすぐにできたのですがNetBeans 7.3だと少し引っかかったのでメモ。

1)NetBeansだとVimにするためのプラグインがjViがあるのでダウンロード。
http://sourceforge.net/projects/jvi/files/jVi-for-NetBeans/NetBeans-7.0/nbvi-1.4.8.zip/download
2)Tools->PluginsからDawnloadedを選択してAdd Pluginsを選択してからダウンロードをしたnbvi-1.4.8.zipをインストールする。
3)NetBeansを再起動。

なぜかTools->Pluginsを選択してAvailable PluginsにあるjViからインストールしてもうまくVi化されないので注意が必要です。

あとCtrl-CやCtrl-[でノーマルモードに移行するような設定をするにはPreferencesでjVi Configを選択してからCtrl-Key Bindingを選択して有効にしたいCtrlキーバインディングを選択します。
またデフォルトの動作だと挿入した部分以外はbackspaceが効かなかったので効くようにするにはBuffer Modifications で‘backspace’ を 2 に設定します。

2013年3月4日月曜日

herokuのSpring MVC & Tomcat Applicationを読んでみた。

herokuはeclipseでプロジェクトを作るだけで公開されるのですごいと思います。
ただ新しい機能が使われており主にSpring関連の設定が逆に訳が分からなかったため確認してみました。

Spring MVC & Tomcat Applicationのテンプレートを確認しました。
ほとんどは以下のapplicationContext.xmlで分かりそうです。

https://github.com/heroku/template-java-spring-hibernate/blob/master/src/main/resources/applicationContext.xml

①ローカル環境とデプロイ環境でDBが違うのはどうやっている?

Spring3.1のBean Definition Profilesの機能を利用しているようです。
<beans profile="default"><beans profile="prod">
でローカル環境とデプロイ環境で読み込むbeanを切り替えているようです。
Procfileでは-Dspring.profiles.active=prod とオプションが設定されているので
デプロイ時には<beans profile="prod">が読み込まれるのでしょう。

②テーブルを作っていないのにアプリケーションを動作させた際にテーブルができているのはどうやってる?

Hibernateのアプリケーション起動時に自動でテーブルを作成する機能を利用しているようです。<prop key="hibernate.hbm2ddl.auto">をcreateもしくはupdateとすることでこの機能を有効にしていました。createとupdateの違いは起動時にDBを初期化するかしないかぐらいかなと思います。


2013年3月3日日曜日

動的型付け言語と静的型付け言語

bloggerでテーブルを試してみた。
お題は最近何故か話題になっている動的型付け言語と静的型付け言語です。
動的型付け言語静的型付け言語
型が決まるタイミング型が実行時に決まる。型がコンパイル時に決まる。
採用している言語perl,python,php,ruby,javascript,LISPC,C++,Java,Haskell,COBOL
メリット記述が簡潔になる。実行速度が速い。
デメリット実行速度が低下する。記述が冗長になる。
使いどころプロトタイプ型の開発を行うシステム大規模で厳密性を求められるシステム

WebシステムではWeb系だと動的型付け言語、SI系だと静的型付け言語を使うことが多いと思います。メリット、デメリット、使いどころは色々書くと面倒くさい人たちが出てくるので最低限書いています。あまり関係ないけど動画置いときます。

2013年2月4日月曜日

スマホから投稿

bloggerにもアプリがあったので試してみた。なんか普通過ぎる。

2013年2月3日日曜日

jQueryでAjax中にボタンを無効にする

TwitterBootstrap+jqueryでAjax後ボタンを押せなくするメモ
http://zenback.itmedia.co.jp/contents/logmemotips.com/archives/2938

上の肝心のソースが見えなくなっていたので書いてみました。
大事なところはjQuery.ajax()の前処理をするbeforeSendと後処理をするcompleteですね。

<!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() {
   $.ajax({
    beforeSend: function(){
     $("button").attr("disabled","true"); 
     $("div").text("Waiting...");
    },
    type:"GET",
    url:"hello",
    success: function(msg){
     $("div").text(msg);
    },
    complete: function(xhr,event){
     $("button").removeAttr("disabled");
    }
   });
  });
 });
</script>

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

URL短縮サービス作りました。

URL短縮サービスを作りました。

 furl.jp

もともとGAE、jQueryの勉強が目的でつくったので特に特徴はないですがシンプルでいいんじゃないかと思います。

実はRailsでも作ろうとしたことがあるのですがrubyに慣れていないのとRailsの複雑さに挫折した経緯があったので結局単純にServletで作りました。

今後直していきたい、解決したいところは以下です。
1)URL短縮処理中にボタンが押せるので 押せないように制御する。
2)URL短縮処理中なのかよく分からないので分かるようにする。
3)データアクセスにLow-Level APIを使って少しでも速くしてみる。

独自ドメインURLのリダイレクトにGoogle Appsを使っており無料版が1ヶ月しか使えないので続ける場合はお金が必要になるというところが一番の課題ですね。。

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型に強制的に変換する場合、ビット演算を行う必要があるらしいのでそれを利用した。ただ後でみて分かりづらいのであまりよくないノウハウではある気がする。