Processing math: 100%

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