pxkw.hatenadiary.com

めもめも

ぜんぶウケる

心に響く、プログラム、コンピューターに関する優れた格言、名言 - 涙目で仕事しないSE

デバッグ作業が、バグを取り除く過程であるならば、プログラミングとは、バグを入れ込む過程でないとおかしい。

初めの90%のコードは、開発時間の90%を占める。残りの10%のコードは、他の90%の開発時間を占める。

fprintfとかのstreamにNULLを渡した時の挙動は未定義

C Language, Using fprintf() with a NULL-stream

Section 4.1.6 Use of Library Functions
Each of the following statements applies unless explicitly stated otherwise
in the detailed descriptions that follows. If an argument to a function has
an invalid value (such as a value outside the domain of the function, or a
pointer outside the address space of the program, or a null pointer), the
behavior is undefined.
4.9.6.1 The fprintf Function {says nothing about a NULL stream}
4.9.6.5 The sprintf Function {says nothing about a NULL buffer pointer}
Ergo, in both cases, the behavior is undefined.


書いてないものは動作を規定しないってスタンスか。

Hello Velocity Advanced

Hello Velocity
http://pxkw.hatenadiary.com/entry/2013/12/07/113648
をちょっとだけ発展させたもの。

下記2つを実行時に指定させるよう変更

  1. テンプレートファイル
  2. テンプレートに差し込む文字列

コード

HelloVelocityAdvanced.java

package hello;
import java.io.File;
import java.io.IOException;
import java.io.StringWriter;
import java.io.Writer;

import org.apache.velocity.Template;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.app.Velocity;


public class HelloVelocityAdvanced{

    public static void say( final String templateFilePath, final String name )
            throws IOException{

        File templateFile = new File(templateFilePath);

        Velocity.setProperty("file.resource.loader.path", templateFile.getParent());
        Velocity.init();
        VelocityContext context = new VelocityContext();

        context.put("name", name);

        Writer   writer   = new StringWriter();
        Template template = Velocity.getTemplate(templateFile.getName(), "UTF-8");
        template.merge(context, writer);

        System.out.print(writer.toString());

        writer.close();
    }

    public static void showUsage(){
        System.out.println("args[0] : /path/to/template.vtl");
        System.out.println("args[1] : your_name");
    }

    public static void main(String[] args) throws IOException {
        if( args.length<2 || args[0].trim().isEmpty() || args[1].trim().isEmpty() ){
            showUsage();
            return;
        }
        HelloVelocityAdvanced.say( args[0], args[1] ); 
    }

}

実行例

$ java -cp (略) hello.HelloVelocityAdvanced res/hello.vtl Velocity
Hello, Velocity!
$ java -cp (略) hello.HelloVelocityAdvanced res/goodnight.vtl Hatena
Good night, Hatena!
$

Hello Velocity

Velocityのミニマムなコード.
できるだけミニマムに.

HelloVelocity.java

package hello;
import java.io.IOException;
import java.io.StringWriter;
import java.io.Writer;
import org.apache.velocity.Template;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.app.Velocity;

public class HelloVelocity{
	
    public static void say() throws IOException{
    	Velocity.init();
        VelocityContext context = new VelocityContext();
        context.put("name", "Velocity");
        
        Writer   writer  = new StringWriter();
        Template template = Velocity.getTemplate("hello.vtl", "UTF-8");

        template.merge(context, writer);
        System.out.print(writer.toString());
        
        writer.close();
    }

    public static void main(String[] args) throws IOException {
        HelloVelocity.say();
    }
	
}

hello.vtl (テンプレートファイル)

Hello, $name!

実行例

javaコマンドでクラスファイルを実行する例.

.を実行ディレクトリとした時の構成

./hello.vtl
./bin/hello/HelloVelocity.class
/path/to/velocity-X.X-dep.jar

実行コマンドと実行結果

$ java -cp bin:/path/to/velocity-X.X-dep.jar hello.HelloVelocity
Hello, Velocity!
$

備考

テンプレートのパスを指定する場合は, Velocity.init();の前にディレクトリを指定する。

Velocity.setProperty("file.resource.loader.path", "/path/to/dir");

参 考 文 献

一番簡単なApache Velocityの使い方 - KnowledgeFort
Apache Velocity の一番簡単な使用例。

-mxxと-Oxをターゲットに指定したいときのMakefile

32/64bitと最適化オプションをターゲットにmakeするときのMakefile.
こんな感じで良いのかなぁ.泥臭いな.

Makefile

DIR_SRC=./src
DIR_HDR=./include
DIR_BIN=.

m32o0suf = m32o0
m32o1suf = m32o1
m32o2suf = m32o2
m64o0suf = m64o0
m64o1suf = m64o1
m64o2suf = m64o2

INCLUDES = -I${DIR_HDR}
CFLAGS_m32o0 = -m32 -O0 -g 
CFLAGS_m32o1 = -m32 -O1 
CFLAGS_m32o2 = -m32 -O2 
CFLAGS_m64o0 = -m64 -O0 -g 
CFLAGS_m64o1 = -m64 -O1 
CFLAGS_m64o2 = -m64 -O2 

BIN_m32o0 = ${DIR_BIN}/bin.${m32o0suf}
BIN_m32o1 = ${DIR_BIN}/bin.${m32o1suf}
BIN_m32o2 = ${DIR_BIN}/bin.${m32o2suf}
BIN_m64o0 = ${DIR_BIN}/bin.${m64o0suf}
BIN_m64o1 = ${DIR_BIN}/bin.${m64o1suf}
BIN_m64o2 = ${DIR_BIN}/bin.${m64o2suf}

HDR = ${DIR_HDR}/header.h
SRC = ${DIR_SRC}/src.c
OBJ_m32o0 = ${DIR_SRC}/src.${m32o0suf}
OBJ_m32o1 = ${DIR_SRC}/src.${m32o1suf}
OBJ_m32o2 = ${DIR_SRC}/src.${m32o2suf}
OBJ_m64o0 = ${DIR_SRC}/src.${m64o0suf}
OBJ_m64o1 = ${DIR_SRC}/src.${m64o1suf}
OBJ_m64o2 = ${DIR_SRC}/src.${m64o2suf}

ALL_OBJ = \
    ${OBJ_m32o0} ${OBJ_m32o1} ${OBJ_m32o2} \
    ${OBJ_m64o0} ${OBJ_m64o1} ${OBJ_m64o2} 

.SUFFIXES: .c .${m32o0suf} .${m32o1suf} .${m32o2suf} .${m64o0suf} .${m64o1suf} .${m64o2suf}
.c.${m32o0suf}:
	gcc ${INCLUDES} ${CFLAGS_m32o0} -c -o $@ $<
.c.${m32o1suf}:
	gcc ${INCLUDES} ${CFLAGS_m32o1} -c -o $@ $<
.c.${m32o2suf}:
	gcc ${INCLUDES} ${CFLAGS_m32o2} -c -o $@ $<
.c.${m64o0suf}:
	gcc ${INCLUDES} ${CFLAGS_m64o0} -c -o $@ $<
.c.${m64o1suf}:
	gcc ${INCLUDES} ${CFLAGS_m64o1} -c -o $@ $<
.c.${m64o2suf}:
	gcc ${INCLUDES} ${CFLAGS_m64o2} -c -o $@ $<
${OBJ_m32o0}: ${SRC} ${HDR}
${OBJ_m32o0}: ${SRC} ${HDR}
${OBJ_m32o0}: ${SRC} ${HDR}
${OBJ_m64o0}: ${SRC} ${HDR}
${OBJ_m64o1}: ${SRC} ${HDR}
${OBJ_m64o2}: ${SRC} ${HDR}
${m32o0suf}:${OBJ_m32o0}
	gcc ${INCLUDES} $^ ${CFLAGS_m32o0} -o ${BIN_m32o0}
${m32o1suf}:${OBJ_m32o1}
	gcc ${INCLUDES} $^ ${CFLAGS_m32o1} -o ${BIN_m32o1}
${m32o2suf}:${OBJ_m32o2}
	gcc ${INCLUDES} $^ ${CFLAGS_m32o2} -o ${BIN_m32o2}
${m64o0suf}:${OBJ_m64o0}
	gcc ${INCLUDES} $^ ${CFLAGS_m64o0} -o ${BIN_m64o0}
${m64o1suf}:${OBJ_m64o1}
	gcc ${INCLUDES} $^ ${CFLAGS_m64o1} -o ${BIN_m64o1}
${m64o2suf}:${OBJ_m64o2}
	gcc ${INCLUDES} $^ ${CFLAGS_m64o2} -o ${BIN_m64o2}
clean:
	rm -rf ${ALL_OBJ}

めいくする

$ make m32o1
gcc -I./include -m32 -O1  -c -o src/src.m32o1 src/src.c
gcc -I./include src/src.m32o1 -m32 -O1  -o ./bin.m32o0

かくにんする

$ file bin.m32o1
bin.m32o1: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=0xhogehoge, not stripped

  1. 上記はUbuntu 13.04 64bitでうごかしてます.
  2. 64bit環境で32bitコンパイルするときは,libc6-dev-i386パッケージが必要みたい.

Text in oval

こーすると

<div id="div_tio" ><div>
<script src="http://d3js.org/d3.v3.min.js" charset="utf-8"></script>
<script type="text/javascript">


var dataset = [ {'name':'v1', 'x':1, 'y':0},
                {'name':'v2', 'x':2, 'y':0},
                {'name':'v3', 'x':3, 'y':0},
                {'name':'v4', 'x':4, 'y':0},
                {'name':'v5', 'x':5, 'y':0},
                {'name':'v6', 'x':6, 'y':0},
                {'name':'v7', 'x':7, 'y':0},
                {'name':'v8', 'x':8, 'y':0},
                {'name':'v9', 'x':9, 'y':0} ];
var radius  = 10;
var fill    = 'yellow';
var stroke  = 'black';

var width   = 200;
var height  = 20;
var padding = 10;

var domain = { 'x' : [ d3.min( dataset, function(d){ return d.x; }),
                       d3.max( dataset, function(d){ return d.x; } ) ],
               'y' : [ d3.min( dataset, function(d){ return d.y; }),
                       d3.max( dataset, function(d){ return d.y; } ) ] };
var range  = { 'x' : [ padding, (width  - padding) ] ,
               'y' : [ padding, (height - padding) ] };
var scale = {  'x' : d3.scale.linear().domain( domain.x ).range( range.x ),
               'y' : d3.scale.linear().domain( domain.y ).range( range.y ) };

var svg = d3.select('#div_tio').append('svg');
svg.selectAll('g').data( dataset ).enter()
    .append('g')
        .append('circle')
            .attr('cx', function(d){ return scale.x(d.x); } )
            .attr('cy', function(d){ return scale.y(d.y); } )
            .attr('r',  radius )
            .attr('fill', fill )
            .attr('stroke', stroke )
    .select( function(){ return this.parentNode; } ) // g
        .append('text')
            .attr('x', function(d){ return scale.x(d.x); } )
            .attr('y', function(d){ return scale.y(d.y)+radius/2; } )
            .attr("text-anchor", "middle")
            .text( function(d){ return d.name; } );

</script>

こーなる