お決まりの関連機器や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層 | 物理層 | データを通信回線に送出するための電気的な変換や機械的な作業を受け持つ。 | リピータ | 回線 / 各種ケーブル | ビット |
<!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> |
<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> |
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); | |
} | |
} |
動的型付け言語 | 静的型付け言語 | ||
型が決まるタイミング | 型が実行時に決まる。 | 型がコンパイル時に決まる。 | |
採用している言語 | perl,python,php,ruby,javascript,LISP | C,C++,Java,Haskell,COBOL | |
メリット | 記述が簡潔になる。 | 実行速度が速い。 | |
デメリット | 実行速度が低下する。 | 記述が冗長になる。 | |
使いどころ | プロトタイプ型の開発を行うシステム | 大規模で厳密性を求められるシステム |
<!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>
:%s/</\</g :%s/>/\>/g
<!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>
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型に強制的に変換する場合、ビット演算を行う必要があるらしいのでそれを利用した。ただ後でみて分かりづらいのであまりよくないノウハウではある気がする。