Loading web-font TeX/Math/Italic

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