Processing math: 100%

2014年10月4日土曜日

放送大学大学院の過去問を解いてみる。

放送大学大学院の修士全科生入学者選考筆記試験問題の平成26年と平成25年の第2問ソフトウエア分野だけ一応解いてみました。

平成26年度大学院修士全科生入学者選考筆記試験問題 第2問
(1)
(ア)完全2分木の葉の数は2^n、葉以外のノードの数は2^n-1
(イ)木が持ち得る葉の最小の数は2^12、最大の数は2^\infty\inftyだろうか...
(2)
(ア)10011
(イ)引数の値を2進数に変換する

こういうのは実際に書くのが一番確実ですね。

#include<stdlib.h>
#include<stdio.h>
void func(int n){
int q,r;
if(n < 0){
return;
}
q = n / 2;
r = n % 2;
if(q > 0){
func(q);
}
printf("%d",r);
return;
}
int main(int argc, char *argv[]){
func(atoi(argv[1]));
}
view raw hoso.c hosted with ❤ by GitHub

平成25年度大学院修士全科生入学者選考筆記試験問題 第2問
(1)C言語の特徴とよく使われる分野はまとめるのは大変なのでwikipediaを見てね。
(2)
(ア)34512 -> 34152 -> 34125 -> 31425-> 31245 -> 13245 -> 12345
(イ)数字を降順にソートする機能。根拠は...すべての値に対してデータの比較と交換を行っているからでしょうか?
(ウ)(n-1)+(n-2)+\cdots+3+2+1=\dfrac{n(n-1)}{2}
(エ)O(n^2)

2014年9月27日土曜日

AsynchronousSocketChannelとAsynchronousServerSocketChannelを使ったサンプル

AsynchronousSocketChannelとAsynchronousServerSocketChannelを使って簡単なサーバクライアントサンプルを書いてみました。 Futureが返却されるので非同期タスクを細かく制御できるようです。これだけ長いクラスを使うのだから、それだけの恩恵は欲しいですね。
import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.AsynchronousSocketChannel;
import java.util.concurrent.ExecutionException;
public class AsynchronousSocketChannelClient {
public static void main(String[] args) {
try (AsynchronousSocketChannel channel = AsynchronousSocketChannel.open();) {
channel.connect(new InetSocketAddress("localhost",5000)).get();
channel.write(ByteBuffer.wrap("Hello".getBytes())).get();
} catch (IOException | InterruptedException | ExecutionException e) {
e.printStackTrace();
}
}
}
import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.AsynchronousServerSocketChannel;
import java.nio.channels.AsynchronousSocketChannel;
import java.nio.charset.Charset;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
public class AsynchronousSocketChannelServer {
public static void main(String[] args) {
try (AsynchronousServerSocketChannel server = AsynchronousServerSocketChannel.open();) {
server.bind(new InetSocketAddress(5000));
while (true) {
Future<AsynchronousSocketChannel> socket = server.accept();
try (AsynchronousSocketChannel channel = socket.get();) {
ByteBuffer buffer = ByteBuffer.allocate(1024);
Future<Integer> result = channel.read(buffer);
Integer i = result.get();
System.out.println("Read:" + i);
buffer.flip();
System.out.println(new String(buffer.array()));
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}

2014年9月15日月曜日

少しましなWebGLサンプル

はじめてのWebGLのサンプルはindex.htmlにGLSLもJavaScriptもすべて詰め込んでしまっていたので、GLSLをHTMLに書いて、JavaScriptは切り分けるように書き直した。webgl-debug.jsはDebugging - WebGL Public Wikiの物を使えばいいです。
<html>
<head>
<title>WebGL</title>
<script src="script.js" type="text/javascript"></script>
<script src="webgl-debug.js" type="text/javascript"></script>
<script id="shader-vs" type="x-shader/x-vertex">
attribute vec3 aVertexPosition;
void main(){
gl_Position = vec4(aVertexPosition, 1.0);
}
</script>
<script id="shader-fs" type="x-shader/x-fragment">
precision mediump float;
void main(){
gl_FragColor = vec4(1.0,1.0,1.0,1.0);
}
</script>
</head>
<body onload="startup();">
<canvas id="myGLCanvas" width="500" height="500"></canvas>
</body>
</html>
view raw index.html hosted with ❤ by GitHub
var gl;
var canvas;
var shaderProgram;
var vertexBuffer;
function createGLContext(canvas){
var context = null;
context = canvas.getContext("webgl");
if(context){
context.viewportWidth = canvas.width;
context.viewportHeight = canvas.height;
} else {
alert("Failed to create WebGL context");
}
return context;
}
function loadShaderFromDOM(id){
var shaderScript = document.getElementById(id);
if(!shaderScript){
return null;
}
var shaderSource = "";
var currentChild = shaderScript.firstChild;
while(currentChild){
if(currentChild.nodeType == 3){
shaderSource += currentChild.textContent;
}
currentChild = currentChild.nextSibling;
}
var shader;
if(shaderScript.type == "x-shader/x-fragment"){
shader = gl.createShader(gl.FRAGMENT_SHADER);
}else if(shaderScript.type == "x-shader/x-vertex"){
shader = gl.createShader(gl.VERTEX_SHADER);
}else{
return null;
}
gl.shaderSource(shader,shaderSource);
gl.compileShader(shader);
if(!gl.getShaderParameter(shader,gl.COMPILE_STATUS)){
alert("Error compiling shader " + gl.getShaderInfoLog(shader));
return null;
}
return shader;
}
function setupShaders(){
var vertexShader = loadShaderFromDOM("shader-vs");
var fragmentShader = loadShaderFromDOM("shader-fs");
shaderProgram = gl.createProgram();
gl.attachShader(shaderProgram,vertexShader);
gl.attachShader(shaderProgram,fragmentShader);
gl.linkProgram(shaderProgram);
if(!gl.getProgramParameter(shaderProgram,gl.LINK_STATUS)){
alert("Failed to setup shaders");
}
gl.useProgram(shaderProgram);
shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram,"aVertexPosition");
}
function setupBuffers(){
vertexBuffer = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer);
var triangleVertices = [
0.0, 0.5, 0.0,
-0.5,-0.5, 0.0,
0.5,-0.5, 0.0
];
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(triangleVertices),gl.STATIC_DRAW);
vertexBuffer.itemSize = 3;
vertexBuffer.numberOfItems = 3;
}
function draw() {
gl.viewport(0,0,gl.viewportWidth,gl.viewportHeight);
gl.clear(gl.COLOR_BUFFER_BIT);
gl.vertexAttribPointer(shaderProgram.vertexPositionAttribute,vertexBuffer.itemSize, gl.FLOAT, false, 0, 0);
gl.enableVertexAttribArray(shaderProgram.vertexPositionAttribute);
gl.drawArrays(gl.TRIANGLES,0,vertexBuffer.numberOfItems);
}
function startup(){
canvas = document.getElementById("myGLCanvas");
gl = createGLContext(canvas);
if(window.WebGLDebugUtils){
gl = WebGLDebugUtils.makeDebugContext(gl);
}
setupShaders();
setupBuffers();
gl.clearColor(0.0,0.0,0.0,1.0);
draw();
}
view raw script.js hosted with ❤ by GitHub

2014年9月8日月曜日

必要条件と十分条件

少し前に考えていたけど必要条件と十分条件という言葉を日常生活や仕事でドヤ顔で使ってしまうと数学ばっかりやってる人にとっては混乱すると思った。まず数学ではこんな感じで定義されていた。

p \rightarrow q が真のとき\\ pはqであるため十分条件である\\ qはpであるための必要条件である\\ 集合で表すとp \subset q

でも日常生活や仕事では

「ナシ(p)であるための必要条件は果物(q)であることだが十分条件ではない。
ナシ(p)であるための十分条件は果物(q)であることと黄緑(r)であることだ。」

のような使われ方をすることがあるんじゃないだろうか。(多分ない)
つまり何かを定義するために「必要な」条件と「十分な」条件という意味で使っている例をよく見る。 この文章を、論理式的に書くとこんな形になると思う。

q \rightarrow p = False \\ p \rightarrow q = True \\ q \land r \rightarrow p = True\\ 集合で表すとq \land r \subset p \subset q

このときqが必要条件となってq \land rが十分条件になるはずなので数学の意味とは若干乖離がある。ここで混乱するのは表現方法や発想は数学と全く異なるのに結果的には数学の必要条件、十分条件の意味としても辻褄があってしまうことだ。 また集合として表現する場合、必要条件が十分条件を含むので十分条件が小さいはずなのだが日常で使う方が条件が 多くなるので最初大きく見えてしまうのも混乱してしまう。
結論としては十分条件と必要条件という言葉は数学以外で使わない方がよいと思った。 あとmathjaxで論理式を使いたかっただけなので間違えていたら指摘してください。

2014年9月6日土曜日

対数微分法を試す

対数微分法はなんか難しそうな関数を微分する方法らしいです。 おそらく両辺をxで微分するところで左辺で合成関数の微分をするところが結構の数の受験生には分かりづらいと思うので式を略さないで書いてみた。

①関数 y = x^x を微分することにする\\
両辺の自然対数をとる \\ \log y = x\log x \\ 両辺をxで微分する \\ \dfrac{d}{dx} \log y = \dfrac{d}{dy} \log y \dfrac{dy}{dx} = \dfrac{1}{y} y' = \dfrac{y'}{y} ... 合成関数の微分 \\ \dfrac{d}{dx} x \log x = x' \log x + x(\log )' = 1 \log x + x \dfrac{1}{x} = \log x + 1 ... 積の微分 \\ 上記から \\ \dfrac{y'}{y} = \log x + 1 \\ y' = y(\log x + 1) = x^x (\log x + 1)

②関数 y = a^x を微分することにする\\
両辺の自然対数をとる \\ \log y = x\log a \\ 両辺をxで微分する \\ \dfrac{d}{dx} \log y = \dfrac{d}{dy} \log y \dfrac{dy}{dx} = \dfrac{1}{y} y' = \dfrac{y'}{y} ... 合成関数の微分 \\ \dfrac{d}{dx} x \log a = x' \log a + x(\log a)' = 1 \log a + x 0 = \log a ... 積の微分 \\ 上記から \\ \dfrac{y'}{y} = \log a \\ y' = y \log a = a^x \log a

2014年8月31日日曜日

両替問題を解いてみる。

両替問題を解いてみました。 やっていることは1000円を日本の硬貨(500円,100円,50円,10円,5円,1円)の6種類で払った場合の支払うすべての組み合わせの数を計算します。 アルゴリズムとしては高い硬貨から任意の数とっていくことを1000円になるまで再帰的に繰り返しています。 結果としては24万8908通りありました。手で計算するのはやり方が分かりませんが大変そうですね。あとなぜかC言語で書きましたが残念ながら完全に忘れていることが分かりました。
#include<stdio.h>
int coin[6]={500,100,50,10,5,1};
long cnt = 0;
void func(int N, int c){
if(c == (sizeof(coin)/sizeof(int) - 1)){
cnt++;
}else{
for(int i = 0; i <= N/coin[c]; i++){
func(N-coin[c]*i,c+1);
}
}
}
int main(){
func(1000,0);
printf("%ld\n",cnt);
}
view raw exchange.c hosted with ❤ by GitHub

2014年8月27日水曜日

2次方程式の解の証明をMathJaxで書く

MathJaxを試してみました。2次方程式の解の証明も簡単に書くことができました。

ax^2+bx+c=0\\ \Rightarrow x^2 + \dfrac{b}{a}x + \dfrac{c}{a}=0 \Rightarrow \displaystyle \left(x^2 + \dfrac{b}{a}x + \dfrac{b^2}{4a^2} \right)-\dfrac{b^2}{4a^2}+\dfrac{c}{a}=0\\ \Rightarrow \displaystyle \left(x + \dfrac{b}{2a} \right)^2 = \dfrac{b^2-4ac}{4a^2} \Rightarrow x + \dfrac{b}{2a}=\dfrac{\pm \sqrt{b^2-4ac}}{2a}\\ \Rightarrow x=\dfrac{-b \pm \sqrt{b^2 - 4ac}}{2a}

MathJaxの内容はこんな感じです。

$
ax^2+bx+c=0\\
\Rightarrow x^2 + \dfrac{b}{a}x + \dfrac{c}{a}=0 
\Rightarrow \displaystyle \left(x^2 + \dfrac{b}{a}x + \dfrac{b^2}{4a^2} \right)-\dfrac{b^2}{4a^2}+\dfrac{c}{a}=0\\
\Rightarrow \displaystyle \left(x + \dfrac{b}{2a} \right)^2 = \dfrac{b^2-4ac}{4a^2}
\Rightarrow x + \dfrac{b}{2a}=\dfrac{\pm \sqrt{b^2-4ac}}{2a}\\
\Rightarrow x=\dfrac{-b \pm \sqrt{b^2 - 4ac}}{2a}
$

2014年8月23日土曜日

はじめてのWebGL

かなり前だがOpenGLを少し触ったことがあるので、そのWeb版のWebGLを試してみた。 白い三角形を表示するだけど、さすがOpenGLでめちゃめちゃやることが多い。 ただthree.jsやglMatrix.jsは甘えの思想のもと素のJavaScript/htmlで書いたのでサンプル的にはいいと思います。
<!DOCTYPE HTML>
<html lang="en">
<head>
<title>WebGL Sample</title>
<meta charset="utf-8">
<script type="text/javascript">
var gl;
var canvas;
var shaderProgram;
var vertexBuffer;
function createGLContext(canvas){
var context = null;
context = canvas.getContext("webgl");
if(context){
context.viewportWidth = canvas.width;
context.viewportHeight = canvas.height;
} else {
alert("Failed to create WebGL context");
}
return context;
}
function loadShader(type, shaderSource) {
var shader = gl.createShader(type);
gl.shaderSource(shader,shaderSource);
gl.compileShader(shader);
if(!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {
alert("Error compiling shader" + gl.getShaderInfoLog(shader));
gl.deleteShader(shader);
return null;
}
return shader;
}
function setupShaders(){
var vertexShaderSource =
"attribute vec3 aVertexPosition;\n" +
"void main() {\n" +
" gl_Position = vec4(aVertexPosition,1.0);\n" +
"}\n";
var fragmentShaderSource =
"precision mediump float;\n" +
"void main() {\n" +
" gl_FragColor = vec4(1.0,1.0,1.0,1.0);\n" +
"}\n";
var vertexShader = loadShader(gl.VERTEX_SHADER, vertexShaderSource);
var fragmentShader = loadShader(gl.FRAGMENT_SHADER, fragmentShaderSource);
shaderProgram = gl.createProgram();
gl.attachShader(shaderProgram,vertexShader);
gl.attachShader(shaderProgram,fragmentShader);
gl.linkProgram(shaderProgram);
if(!gl.getProgramParameter(shaderProgram,gl.LINK_STATUS)){
alert("Failed to setup shaders");
}
gl.useProgram(shaderProgram);
shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram,"aVertexPosition");
}
function setupBuffers(){
vertexBuffer = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer);
var triangleVertices = [
0.0, 0.5, 0.0,
-0.5,-0.5, 0.0,
0.5,-0.5, 0.0
];
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(triangleVertices),gl.STATIC_DRAW);
vertexBuffer.itemSize = 3;
vertexBuffer.numberOfItems = 3;
}
function draw() {
gl.viewport(0,0,gl.viewportWidth,gl.viewportHeight);
gl.clear(gl.COLOR_BUFFER_BIT);
gl.vertexAttribPointer(shaderProgram.vertexPositionAttribute,vertexBuffer.itemSize, gl.FLOAT, false, 0, 0);
gl.enableVertexAttribArray(shaderProgram.vertexPositionAttribute);
gl.drawArrays(gl.TRIANGLES,0,vertexBuffer.numberOfItems);
}
function startup(){
canvas = document.getElementById("myGLCanvas");
gl = createGLContext(canvas);
setupShaders();
setupBuffers();
gl.clearColor(0.0,0.0,0.0,1.0);
draw();
}
</script>
</head>
<body onload="startup();">
<canvas id="myGLCanvas" width="500" height="500"></canvas>
</body>
</html>
view raw index.html hosted with ❤ by GitHub

2014年8月19日火曜日

ノンブロッキングチャネルを試す

SocketChannel/SocketServerChannelを使ってマルチスレッドでなくても複数のクライアントに対応できるようなサーバができます。これでNode.jsはいらないですね。それにしてもByteBufferは慣れない。
import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.SocketChannel;
public class SocketChannelClient {
public static void main(String[] args) throws IOException {
SocketChannel channel = SocketChannel.open(new InetSocketAddress("localhost", 5000));
ByteBuffer buf = ByteBuffer.allocate(1000);
channel.write(buf.wrap("Hello".getBytes()));
buf.clear();
if (channel.isConnected()) {
channel.read(buf);
}
buf.flip();
System.out.println(new String(buf.array()));
}
}
import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.util.Iterator;
public class SocketChannelServer {
private static Selector selector = null;
public static void main(String[] args) {
new SocketChannelServer().run();
}
public void run() {
ServerSocketChannel server = null;
try {
selector = Selector.open();
server = ServerSocketChannel.open();
server.configureBlocking(false);
server.bind(new InetSocketAddress(5000));
server.register(selector, SelectionKey.OP_ACCEPT);
while (selector.select() > 0) {
for (Iterator it = selector.selectedKeys().iterator(); it.hasNext();) {
SelectionKey key = (SelectionKey) it.next();
it.remove();
if (key.isAcceptable()) {
SocketChannel channel = server.accept();
channel.configureBlocking(false);
channel.register(selector, SelectionKey.OP_READ | SelectionKey.OP_WRITE);
} else if(key.isReadable() && key.isWritable()){
ByteBuffer buf = ByteBuffer.allocate(1000);
SocketChannel channel = (SocketChannel) key.channel();
channel.read(buf);
//System.out.println(new String(buf.array()));
buf.flip();
channel.write(buf);
}
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}

2014年8月14日木曜日

Javaだけで作るWebSocketサーバ

JavaだけでWebSocketを動かすサーバを作りました。 動作としてはブラウザでHTMLを表示した後にWebSocket経由でtestという文字を送受信するだけです。 後は双方向にメッセージをやり取りできるようにするのと、処理を汎用化すれば実用的に使えるようになるはず。 ほとんどはWebSocket サーバの実装とプロトコル解説を参考にさせてもらいました。 引っかかったところとしては、WebSocketのレスポンスヘッダの改行コードがCRLFじゃないといけないところ、慣れていないということもありましたがbyteを使ってバイナリ処理を書くところでした。Java(SE)だけで作ろうとしていたため暗号化部分の処理ができるか心配でしたが幸運なことにJava8でBase64の処理クラスが追加されていたのでBase64の処理を素で書かずにすんでよかったです。
<!DOCTYPE html>
<html>
<head>
<title>WebSocket Test</title>
<script type="text/javascript">
var ws = new WebSocket("ws://localhost:5000");
ws.onopen = function(){
ws.send("test");
console.log("open");
}
ws.onerror = function(){
console.log("error");
}
ws.onclose = function(){
console.log("close");
}
ws.onmessage = function(msg) {
console.log("msg received:" + msg.data);
var log = document.getElementById("log");
log.innerHTML += "msg received:" + msg.data;
};
</script>
</head>
<body>
<h1>WebSocket Test</h1>
<div id="log"></div>
</body>
</html>
view raw index.html hosted with ❤ by GitHub
package com.sanofc.ws;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.nio.ByteBuffer;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Base64;
import java.util.HashSet;
public class WebSocketServer {
private static HashSet<Socket> socketSet = new HashSet<Socket>();
public static void main(String[] args) throws IOException {
int port = 5000;
ServerSocket serverSocket = new ServerSocket(port);
while (true) {
Socket socket = serverSocket.accept();
System.out.println("accept");
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String line;
boolean isWebSocket = false;
String webSocketKey = "";
while (!(line = in.readLine()).equals("")) {
System.out.println(line);
String[] spLine = line.split(":");
if (isWebSocket && spLine[0].equals("Sec-WebSocket-Key")) {
webSocketKey = spLine[1].trim();
}
if (spLine[0].equals("Upgrade") && spLine[1].trim().equals("websocket")) {
isWebSocket = true;
}
}
if (isWebSocket) {
socketSet.add(socket);
WebSocketThread webSocketThread = new WebSocketThread(socket, webSocketKey);
webSocketThread.start();
} else {
HttpResponseThread httpRequest = new HttpResponseThread(socket);
httpRequest.start();
}
}
}
}
class HttpResponseThread extends Thread {
Socket socket;
public HttpResponseThread(Socket socket) {
this.socket = socket;
}
public void run() {
PrintStream client = null;
try {
Path indexPath = Paths.get("index.html");
byte[] indexBytes = Files.readAllBytes(indexPath);
client = new PrintStream(socket.getOutputStream());
client.println("HTTP/1.1 200 OK");
client.println("Content_type:text/html");
client.println();
client.write(indexBytes);
} catch (IOException e) {
e.printStackTrace();
} finally {
client.flush();
client.close();
}
}
}
class WebSocketThread extends Thread {
Socket socket;
String webSocketKey;
WebSocketThread(Socket socket, String webSocketKey) {
System.out.println("Start WebSocket Thread");
this.socket = socket;
this.webSocketKey = webSocketKey;
}
public void run() {
OutputStreamWriter os = null;
try {
//Create Sec-WebSocket-Accept field.
webSocketKey += "258EAFA5-E914-47DA-95CA-C5AB0DC85B11";
MessageDigest md = MessageDigest.getInstance("SHA-1");
byte[] cryptedKey = md.digest(webSocketKey.getBytes());
byte[] encodedKey = Base64.getEncoder().encode(cryptedKey);
System.out.println(new String(encodedKey));
//Response HTTP Upgrade Response Header.
StringBuffer header = new StringBuffer();
header.append("HTTP/1.1 101 Switching Protocols\r\n");
header.append("Upgrade: websocket\r\n");
header.append("Connection: Upgrade\r\n");
header.append("Sec-WebSocket-Accept: " + new String(encodedKey) + "\r\n");
header.append("\r\n");
os = new OutputStreamWriter(socket.getOutputStream());
os.write(header.toString());
System.out.println(header.toString());
os.flush();
//Parse received data.
byte[] b = new byte[1024];
socket.getInputStream().read(b);
ByteBuffer buf = ByteBuffer.wrap(b);
byte firstByte = buf.get();
int fin = (firstByte & 0x80) >>> 7;
int opcode = firstByte & 0x0F;
byte secondByte = buf.get();
int mask = (secondByte & 0x80) >>> 7;
int payloadLength = secondByte & 0x7F;
int maskingKey = buf.getInt();
int applicationData = buf.getInt();
int unmaskedData = applicationData ^ maskingKey;
byte[] unmaskedByteData = new byte[4];
unmaskedByteData[3] = (byte)(unmaskedData & 0xff);
unmaskedByteData[2] = (byte)(unmaskedData >> 8 & 0xff);
unmaskedByteData[1] = (byte)(unmaskedData >> 16 & 0xff);
unmaskedByteData[0] = (byte)(unmaskedData >> 24 & 0xff);
//Print received data.
System.out.println("fin:" + fin);
System.out.println("opcode:" + opcode);
System.out.println("mask:" + mask);
System.out.println("payloadLength:" + payloadLength);
System.out.println("maskingKey:" + maskingKey);
System.out.println("applicationData:" + new String(unmaskedByteData));
//Send data.
ByteBuffer ob = ByteBuffer.allocate(6);
ob.put((byte)0x81);
ob.put((byte)0x4);
ob.put("test".getBytes());
socket.getOutputStream().write(ob.array());
socket.close();
} catch (IOException | NoSuchAlgorithmException e) {
e.printStackTrace();
}
}
}

2014年8月13日水曜日

文字列の重複順列を出力する

文字列の重複順列を出力する例をerlangとJavaで書いてみました。 erlangのほうがJavaの5倍も短く書けるので5倍の生産性がありまぁす!といえば経営者たちもerlangを使うことに納得してくれることでしょう。

erlang版
-module(perm).
-export([rperm/1]).
rperm(List) -> rperm(List,0).
rperm(List,C) when C =:= length(List) -> [[]];
rperm(List,C) -> [[Head|Tail] || Head <- List, Tail <- rperm(List, C+1)].
view raw perm.erl hosted with ❤ by GitHub

Java版
public class RepeatedPermutation {
static int N;
static char[] c;
static int[] p;
public static void main(String[] args) {
c = args[0].toCharArray();
N = c.length;
p = new int[N];
for (int i = 0; i < N; i++) {
calc(0, i);
}
}
static void calc(int i, int j) {
p[i] = j;
if (i == N - 1) {
for (int n = 0; n < N; n++) {
System.out.print(c[p[n]]);
}
System.out.println();
}
if (i < N - 1) {
i++;
for (int k = 0; k < N; k++) {
calc(i, k);
}
}
}
}

2014年8月12日火曜日

intの数値をbyte配列に変換する

意外とこういうメソッドがなかったので作ってみた。mainメソッドだけ見ると回りくどいけど必要な人には価値が理解いただけるはず。最近気がついたけどblogに貼付けるだけだったらコメントが入れられるgistだけでいい気がしてきた。
import java.nio.ByteBuffer;
public class MyInteger {
public static void main(String[] args) {
int i = ByteBuffer.wrap("test".getBytes()).getInt();
System.out.println(new String(MyInteger.toByteArray(i)));
}
public static byte[] toByteArray(int i) {
byte[] b = new byte[4];
b[3] = (byte) (i & 0xff);
b[2] = (byte) (i >> 8 & 0xff);
b[1] = (byte) (i >> 16 & 0xff);
b[0] = (byte) (i >> 24 & 0xff);
return b;
}
}
view raw MyInteger.java hosted with ❤ by GitHub

2014年8月11日月曜日

byte型変数を2進数文字列に変換する

Javaのbyte変数をInteger#toBinaryStringで変換しても値がマイナスの場合はうまく変換できないし、8桁にならないので、byte変数を実際の2進数の文字列に変換するようなメソッドをいくつか作成した。最後のtoBinaryString4で0xFFとのANDをとっている理由はByte型からInt型への変換を本気で考えるに任せます。こうゆう知っている人にとっては当たり前だけど知らない人にとっては理解するのに時間がかかる「ちょっとしたこと」をインターネットで共有できるようになったのは大きいと思う。
public class MyByte {
public static void main(String[] args) {
byte b = (byte) 0b10101010;
System.out.println(MyByte.toBinaryString1(b));
System.out.println(MyByte.toBinaryString2(b));
System.out.println(MyByte.toBinaryString3(b));
System.out.println(MyByte.toBinaryString4(b));
}
public static String toBinaryString1(byte b) {
int[] i = new int[8];
StringBuffer bs = new StringBuffer();
i[0] = (b & 0x80) >>> 7;
i[1] = (b & 0x40) >>> 6;
i[2] = (b & 0x20) >>> 5;
i[3] = (b & 0x10) >>> 4;
i[4] = (b & 0x08) >>> 3;
i[5] = (b & 0x04) >>> 2;
i[6] = (b & 0x02) >>> 1;
i[7] = (b & 0x01) >>> 0;
for (int j = 0; j < 8; j++) {
bs.append(i[j]);
}
return bs.toString();
}
public static String toBinaryString2(byte b) {
int[] i = new int[8];
StringBuffer bs = new StringBuffer();
i[0] = (b & 0b10000000) >>> 7;
i[1] = (b & 0b01000000) >>> 6;
i[2] = (b & 0b00100000) >>> 5;
i[3] = (b & 0b00010000) >>> 4;
i[4] = (b & 0b00001000) >>> 3;
i[5] = (b & 0b00000100) >>> 2;
i[6] = (b & 0b00000010) >>> 1;
i[7] = (b & 0b00000001) >>> 0;
for (int j = 0; j < 8; j++) {
bs.append(i[j]);
}
return bs.toString();
}
public static String toBinaryString3(byte b) {
StringBuffer bs = new StringBuffer();
for (int j = 0; j < 8; j++) {
int k = (b & 1 << (7 - j)) >>> (7 - j);
bs.append(k);
}
return bs.toString();
}
public static String toBinaryString4(byte b) {
return String.format("%8s", Integer.toBinaryString(b & 0xFF)).replace(' ', '0');
}
}
view raw MyByte.java hosted with ❤ by GitHub

2014年8月9日土曜日

erlangで一行づつファイルを読む。

io:readだとerlang項とかいうので書かれたファイルしか読まないようなのでio:get_lineを使う必要があるみたいだ。 erlangの書き方は少しだけ分かってきた気がする。
-module(file_open).
-export([file_open/0,read_file/1]).
file_open() ->
{ok,S} = file:open("input.txt",read),
Val = read_file(S),
file:close(S),
{ok,Val}.
read_file(S) ->
case io:get_line(S,'') of
eof -> [];
Data -> [Data|read_file(S)]
end.
view raw file_open.erl hosted with ❤ by GitHub

2014年8月6日水曜日

Javaで作るシンプルなテキストチャット

WebSocketを実装しようとしたけど、双方向なプロトコルをいきなり作るのは大変そうだったので大昔に研修で見たことがあるようなテキストチャットをまず作ってみた。意外とクライアントがインプットとアウトプットでスレッドを分けないといけなかったので大変だった。ただクライアントだけが接続が切れた場合に例外が発生したりするので、タイミングによる制御が大切になってきそう。
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.InetSocketAddress;
import java.net.Socket;
public class ChatClient {
public static void main(String[] args) throws IOException {
Socket socket = new Socket();
socket.connect(new InetSocketAddress("localhost", 5000));
new Thread(new InputThread(socket)).start();
new Thread(new OutputThread(socket)).start();
}
}
class InputThread extends Thread {
Socket socket;
public InputThread(Socket socket) {
this.socket = socket;
}
public void run() {
try {
PrintWriter printWriter = new PrintWriter(socket.getOutputStream());
while (socket.isConnected()) {
InputStreamReader cin = new InputStreamReader(System.in);
BufferedReader br = new BufferedReader(cin);
String buf = br.readLine();
printWriter.println(buf);
printWriter.flush();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
class OutputThread extends Thread {
Socket socket;
public OutputThread(Socket socket) {
this.socket = socket;
}
public void run() {
try {
while (socket.isConnected()) {
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String message;
while ((message = br.readLine()) != null) {
System.out.println(message);
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
view raw ChatClient.java hosted with ❤ by GitHub
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.HashSet;
import java.util.Set;
public class ChatServer {
private static Set<Socket> socketSet = new HashSet<Socket>();
private static ServerSocket serverSocket;
public static Set<Socket> getSocketSet() {
return socketSet;
}
public static void main(String[] args) throws IOException {
serverSocket = new ServerSocket(5000);
while (!serverSocket.isClosed()) {
Socket socket = serverSocket.accept();
socketSet.add(socket);
new Thread(new ServerThread(socket)).start();
}
}
}
class ServerThread extends Thread {
Socket socket;
public ServerThread(Socket socket) {
this.socket = socket;
}
public void run() {
while (socket.isConnected()) {
try {
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String message = br.readLine();
System.out.println(Thread.currentThread().getId() + " " + message);
synchronized (this) {
for (Socket socket : ChatServer.getSocketSet()) {
if (!this.socket.equals(socket)) {
PrintWriter printWriter = new PrintWriter(socket.getOutputStream());
printWriter.println(message);
printWriter.flush();
}
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
view raw ChatServer.java hosted with ❤ by GitHub

2014年8月4日月曜日

純粋なJavaで作るHttpServer

WebサーバというとApacheやIISが必要と思うけど純粋なJavaでもHTMLを表示するだけであれば簡単に作ることができる。 com.sun.net.httpserverを使う手もあるけど勉強もかねてHttpServerを書いてみた。 ここではThreadを単純に使っているけどノンブロッキングチャネルを使う方法もあるのでこちらも試したい。
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
public class HttpServer {
public static void main(String[] args) throws IOException {
int port = 5000;
ServerSocket serverSocket = new ServerSocket(port);
while (true) {
Socket socket = serverSocket.accept();
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String line;
while (!(line = in.readLine()).equals("")) {
System.out.println(line);
}
HttpRequestThread httpRequest = new HttpRequestThread(socket);
httpRequest.start();
}
}
}
class HttpRequestThread extends Thread {
Socket socket;
public HttpRequestThread(Socket socket) {
this.socket = socket;
}
public void run() {
PrintStream client = null;
try {
Path indexPath = Paths.get("index.html");
byte[] indexBytes = Files.readAllBytes(indexPath);
client = new PrintStream(socket.getOutputStream());
client.println("HTTP/1.0 200 OK");
client.println("Content_type:text/html");
client.println();
client.write(indexBytes);
} catch (IOException e) {
e.printStackTrace();
} finally {
client.flush();
client.close();
}
}
}
view raw HttpServer.java hosted with ❤ by GitHub

2014年8月3日日曜日

erlangでネイピア数を求める

erlangでネイピア数を求めてみた。 指数表現やelseが使えなかったりとかするので、なかなか難しい。 もっと洗練された書き方ができそうだ。
-module(naipier).
-export([naipier/0,naipier/3]).
naipier() -> naipier(0, 1, 1).
naipier(N, I, J) ->
EPS = math:pow(10,-8),
if
EPS < 1 / I
-> naipier(N + 1 / I , I * J, J + 1);
true
-> io:format("~w~n",[N])
end.
view raw naipier.erl hosted with ❤ by GitHub

2014年8月2日土曜日

初めてのerlang

すこし前に話題になった気がするerlangを触ってみました。 色々と今までやってきた言語とは違うけどfor文がないのが辛いですね。。 そこでfor文ぽい処理を書いてみました。自分で書いたんだけどokって何だろう。。 関数脳になるのは長い道のりが必要そうです。
-module(for).
-export([for/0,for/1]).
for() -> for(0).
for(10) -> ok;
for(N) -> io:fwrite("~w~n",[N]),for(N+1).
view raw for.erl hosted with ❤ by GitHub

2014年7月30日水曜日

JavaFX8でPPMファイルのビューアを作る

JavaFX8でPPMファイルのビューアを作りました。 表示するだけであればこれで十分だと思います。 まじめに作るのであればPPMファイルの種類別の読み込み、ファイル形式のチェックなど色々細かいことをしないといけなさそうです。
package com.sanofc.ppm;
import java.io.IOException;
import java.io.RandomAccessFile;
import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.image.ImageView;
import javafx.scene.image.PixelWriter;
import javafx.scene.image.WritableImage;
import javafx.scene.paint.Color;
import javafx.stage.Stage;
public class PPMViewer extends Application {
public static void main(String[] args) {
Application.launch(args);
}
public void start(Stage stage) throws IOException {
String imageUrl = this.getParameters().getRaw().get(0);
RandomAccessFile raf = new RandomAccessFile(imageUrl, "r");
String magicNumber = raf.readLine();
String[] widthAndHeight = raf.readLine().split(" ");
String maxval = raf.readLine();
int width = Integer.parseInt(widthAndHeight[0]);
int height = Integer.parseInt(widthAndHeight[1]);
WritableImage wr = new WritableImage(width, height);
PixelWriter pw = wr.getPixelWriter();
for (int y = 0; y < width; y++) {
for (int x = 0; x < height; x++) {
int r = raf.read();
int g = raf.read();
int b = raf.read();
Color color = Color.rgb(r, g, b);
pw.setColor(x, y, color);
}
}
ImageView imageView = new ImageView(wr);
Group root = new Group(imageView);
Scene scene = new Scene(root, width, height);
stage.setTitle("PPM Viewer");
stage.setScene(scene);
stage.show();
}
}
view raw PPMViewer.java hosted with ❤ by GitHub

2014年4月13日日曜日

Jetty9.1でWebSocket(JSR365)を使ってみる

一年ぐらい前に書いたJetty9でWebSocketを使ってみる。だとWebSocketのJavaEE仕様であるJSR365には対応できていませんでした。Jetty9.1ではJSR365に対応したようでしたので、それに準拠するように書き直しました。あまりソースはあまり変わりませんが少しシンプルになった感じがします。pom.xmlはgradleを使おうとしたのですがgradleのjetty pluginがバージョン7以降に対応できていないようです。(update jetty plugin to current jetty)

<!DOCTYPE html>
<html>
<head>
<title>WebSocket Chat</title>
<script type="text/javascript">
var ws = new WebSocket("ws://localhost:8080/WebSocketEndpoint");
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>JettyWebSocket</artifactId>
<packaging>war</packaging>
<version>1.0</version>
<name>JettyWebSocket</name>
<properties>
<jettyVersion>9.1.3.v20140225</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>
<finalName>JettyTest</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.7</source>
<target>1.7</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.4</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.io.IOException;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
import javax.websocket.CloseReason;
import javax.websocket.OnClose;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;
@ServerEndpoint("/WebSocketEndpoint")
public class WebSocketEndpoint {
static Set<Session> sessions = Collections.synchronizedSet(new HashSet());
@OnOpen
public void onOpen(Session session) {
System.out.println("WebSocket opened:" + session.getId());
sessions.add(session);
}
@OnMessage
public void onMessage(String message) {
System.out.println("WebSocket received message:" + message);
for (Session session : sessions) {
try {
session.getBasicRemote().sendText(message);
} catch (IOException e) {
e.printStackTrace();
}
}
}
@OnClose
public void onClose(CloseReason reason) {
System.out.println("Closing a WebSocket due to " + reason.getReasonPhrase());
}
}

2014年3月5日水曜日

プロジェクトが遅延した場合の対処法

プロジェクト管理について珍しく考えていたので少しまとめたい。ここではプロジェクトが遅延した場合の対処法について書いてみる。ただし内容は経験のあるソフトウエア開発のみに特化しているかもしれない。

プロジェクトが遅延する理由


遅延が発生しないプロジェクトは見たことがない。なぜかを少し考えたところ当たり前だと気がついた。もし90%でできるタスクが100個あったとするとすべてうまくいってスケジュール通りに完了する可能性は0.002% (0.9^100*100) になりほぼ0%になる。だから何もしないでスケジュール通りにうまくいくということは嘘をついているか、すべてのタスクがほぼ機械的にできるようなものか、宝くじに当たるぐらい運がよい時になる。

プロジェクトが遅延した場合の対処法


プロジェクトは絶対に遅延が発生するのでもし発生した場合の対処法を考えたが魔法のような方法はなかった。もし遅延が発生した場合の対処で延々と悩むぐらいであればこの方法ぐらいしかないので機械的に対処するぐらいのほうが気が楽になるのではないかと思う。ここでは内部調整と外部調整に分けて記載してみる。

内部調整


現状の人員、納期、品質を変更しない前提での調整内容をここで記載する。

  • 残業する
  • 単純に作業時間を長くする方法である。いきなり残業するだったので落胆の声が聞こえそうだがもっとも簡単な方法で一番とられやすい対処法だと思う。あまりやり過ぎると体調を崩したり見積もりの基準が定まらなくなるので負担にならない程度で労働基準法の範囲内ですることが前提だ。かっこよくいうと稼働を上げるとか、クラッシング(人員の追加の意味も含むがここではその意味を除く)とも言う。

  • 並行作業する
  • すでに実施可能な先行タスクを並行的に行ってしまうことである。この対処法もよくとられるがうまくやらないと後戻りが発生するリスクもある。かっこ良く言うとファストトラッキングとも言う。PMBOKにもあるので真っ当な方法にも思えるが普通に考えると一人でこれをやろうとすると並行作業することになるので残業は不可避のように思う。

  • 平準化する
  • 一部の人に作業が集中している場合に暇な人ができるのであれば手伝ってあげる。ただ中々タスクを分解するのは難しいケースがあったり分解される方は気分はよくないように思うので皆の協力が必要だ。

  • 効率化する
  • 非効率なやり方をしていないかを見直して効率的なやり方があるのであればそれをもとに再見積もりをする。たとえば明らかに重複している作業がないか、自動化できないか考えてみる。


    外部調整


    もし自分の管理の範囲内で調整がつかない場合は QCD(品質、スコープ、コスト、納期)をステークホルダーと調整する。たとえば納期が絶対であればある機能をけずるとか、単純に納期を延ばしてもらうとかの調整になる。

    上記の対処法をうまくやればほとんどのケースは対応可能と考えられる。ただし最後の外部調整がうまくいかない場合は厄介なことになるだろう。正直言うと自分はこういう調整が好きじゃないしできればやりたくないので予防、調整しやすくする、メンバーで勝手にやれる方法を考えたい。