ぜんぶウケる
心に響く、プログラム、コンピューターに関する優れた格言、名言 - 涙目で仕事しない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つを実行時に指定させるよう変更
- テンプレートファイル
- テンプレートに差し込む文字列
コード
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
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>
こーなる
Block selection からの Insert @Vim
Vim - 複数行に対して矩形選択からの挿入 - Qiita [キータ]
C-v -> (移動) -> Shift-i -> (入力) -> ESC