2008年2月27日水曜日

3state HDL

module top;

initial begin
$dumpfile("a.vcd");
$dumpvars(0,top);
en=1;
repeat (10) #10 en=~en;
end
assign bd=(~en)? 3'b111 : 3'bzzz;

reg en;
wire [2:0] bd;

a a(en, bd);
endmodule

module a(en,bd);
input en;
inout [2:0] bd;
reg [2:0] r,s;
always @ (en)
if(en)
r=3'b101;
else
s=bd;
assign bd=(en)?r:1'bz;
endmodule

2008年2月26日火曜日

TD4.v 3段パイプランのブロック図





これらがブロック図と波形になります。特に3段パイプラインは難しいなぁって感じですが、一番難しいのは本当に正しい3段パイプ動作をしているのか、つまりは検証の網羅性を立証することではないでしょうか。
今回設計してみたTD4の3段パイプライン版は一応それらしく動いています。が、本当の意味でBUGが無い、なんて決して口に出しては言えません。(かつて技術者の後輩が「自分のプログラムにはBUGがありません」と言い切ったことがありましたが、「BUGの無いプログラムであることを証明できますか?」と聞き返したくなったのを覚えています)

検証技術はソフトウェアに比較して並列動作である分高度なものが要求されますよね。なのでソフトウェア以上にコードを良く見る、つまりはコードインスペクションが大切であると思います。また、デザインレビューが重要で、他人の目を通して自分の設計を見ることが非常に役に立ちます。これも、ひとえに、「BUGが無いことを立証することが出来ない」ことに寄ります。

TD4.v CPUの創り方 3段パイプライン版

module rom(oen, rom_address, rom_data);

/*
instruction decode
0000_0000 : add r0,r1
0001_0000 : add r1,r0
0010_.... : add r0,#i
0011_.... : add r1,#i
0100_0000 : move r0,r1
0101_0000 : move r1,r0
0110_.... : move r0,#i
0111_.... : move r1,#i
1000_.... : jmp #i
1100_.... : jnz #i

ld(on)
0001 : r0
0010 : r1
0100 : r2
1000 : r3(PC)
*/
input oen;
input [3:0] rom_address;
output [7:0] rom_data;

wire [3:0] rom_address;
reg [7:0] rom_data;

always @ (rom_address) begin
if (oen) begin
casez(rom_address)
4'h0: rom_data=8'b0110_0001; /* move r0,#0001 */
4'h1: rom_data=8'b0010_0010; /* add r0,#0010 */
4'h2: rom_data=8'b0111_0000; /* move r1,#0000 */
4'h3: rom_data=8'b1100_1111; /* jnz #1111 */
4'h4: rom_data=8'b1000_0001; /* jmp #0001 */
default:
rom_data=8'b0000_0000;
endcase
end else begin
rom_data=8'bxxxx_xxxx;
end
end

endmodule

module dec (
ck,
reset,
i_code,
imidiate,
co,
fetch_en,
ld,
ld_na,
on,
im,
oz,
oi
);
input ck, reset;
input [3:0] i_code, imidiate;
input co;
output fetch_en;
output [3:0] ld, ld_na, on, im;
output oz;
output oi;

reg [3:0] ld_c, on_c;
reg oz_c, oi_c, en_c;
reg [3:0] ld, ld_na, on, im;
reg oz, oi;
reg en, en_na;

always @ (i_code or co or en) begin
if (en) begin
casez (i_code)
4'b0000: begin /* add r0,r1 */ ld_c=4'b0001; on_c=4'b0010; oz_c=0; oi_c=0; en_c=1; end
4'b0001: begin /* add r1,r0 */ ld_c=4'b0010; on_c=4'b0001; oz_c=0; oi_c=0; en_c=1; end
4'b0010: begin /* add r0,#i */ ld_c=4'b0001; on_c=4'b0001; oz_c=0; oi_c=1; en_c=1; end
4'b0011: begin /* add r1,#i */ ld_c=4'b0010; on_c=4'b0010; oz_c=0; oi_c=1; en_c=1; end
4'b0100: begin /* move r0,r1 */ ld_c=4'b0001; on_c=4'b0010; oz_c=0; oi_c=0; en_c=1; end
4'b0101: begin /* move r1,r0 */ ld_c=4'b0010; on_c=4'b0001; oz_c=0; oi_c=0; en_c=1; end
4'b0110: begin /* move r0,#i */ ld_c=4'b0001; on_c=4'b0001; oz_c=0; oi_c=1; en_c=1; end
4'b0111: begin /* move r1,#i */ ld_c=4'b0010; on_c=4'b0010; oz_c=0; oi_c=1; en_c=1; end
4'b1000: begin /* jmp #i */ ld_c=4'b1000; on_c=4'bxxxx; oz_c=1; oi_c=1; en_c=0; end
4'b1100: begin /* jnz #i */
if (co) begin
ld_c=4'b1000; on_c=4'bxxxx; oz_c=1; oi_c=1; en_c=0;
end else begin
ld_c=4'b0001; on_c=4'b0001; oz_c=1; oi_c=0; en_c=1; /* add r0,#0 as NOP */
end
end
default: begin
ld_c=4'b0001; on_c=4'b0001; oz_c=1; oi_c=0; en_c=1; /* add r0,#0 as NOP */
end
endcase
end else begin
ld_c=4'b0001; on_c=4'b0001; oz_c=1; oi_c=0; en_c=1; /* add r0,#0 as NOP */
end
end

always @ (posedge ck or posedge reset) begin
if (reset) begin
ld<=4'b0001; on<=4'b0001; oz<=1; oi<=0; /* add r0,#0 as NOP */
im<=4'b0000;
en<=1;
end else begin
ld<=ld_c; on<=on_c; oz<=oz_c; oi<=oi_c;
im<=imidiate;
en<=en_c;
end
end

always @ (posedge ck) begin
en_na<=en;
end

assign fetch_en=en & en_na;

always @ (posedge ck or posedge reset) begin
if (reset) begin
ld_na<=4'b0000;
end else begin
ld_na<=ld;
end
end

endmodule

module registor (
ck,
reset,
r_bus,
r0_ld, r1_ld, r2_ld, r3_ld,
r0_ld_na, r1_ld_na, r2_ld_na, r3_ld_na,
r0_on, r1_on, r2_on, r3_on,
ra,
rb,
ia
);

input ck, reset;
input r0_ld, r1_ld, r2_ld, r3_ld;
input r0_ld_na, r1_ld_na, r2_ld_na, r3_ld_na;
input r0_on, r1_on, r2_on, r3_on;
input [3:0] r_bus;
output [3:0] ra, rb, ia;
reg [3:0] r0, r1, r2,r3;
wire [3:0] r0_bypass, r1_bypass, r2_bypass, r3_bypass;

always @ (posedge ck) begin
if (reset) begin
r0<=4'h0;
r1<=4'h0;
r2<=4'h0;
r3<=4'h0;
end else begin
if (r0_ld_na) r0<=r_bus;
if (r1_ld_na) r1<=r_bus;
if (r2_ld_na) r2<=r_bus;
if (r3_ld_na) r3<=r_bus; else r3<=r3+1;
end
end

assign r0_bypass = (r0_ld_na==1) ? r_bus : r0;
assign r1_bypass = (r1_ld_na==1) ? r_bus : r1;
assign r2_bypass = (r2_ld_na==1) ? r_bus : r2;
assign r3_bypass = (r3_ld_na==1) ? r_bus : r3;

assign ra =
(r0_on==1) ? r0_bypass :
(r1_on==1) ? r1_bypass :
(r2_on==1) ? r2_bypass :
(r3_on==1) ? r3_bypass : 4'bxxxx ;

assign rb =
(r0_ld==1) ? r0 :
(r1_ld==1) ? r1 :
(r2_ld==1) ? r2 :
(r3_ld==1) ? r3 : 4'bxxxx ;

assign ia = r3;

endmodule

module alu (ck, reset, a, b, im, oz, oi, q_na, of, co);
input ck, reset;
input [3:0] a, b, im;
input oz, oi;
output [3:0] q_na;
output of, co;

wire [3:0] q;
reg [3:0] q_na;

assign {of,q} =
(oi == 1 && oz == 1)? im :
(oi == 1)? a + im :
(oz == 1)? a :
a + b ;
assign co=| {of,q} ;

always @ (posedge ck or posedge reset) begin
if (reset) begin
q_na<=4'b0000;
end else begin
q_na<=q;
end
end

endmodule

module cpu(ck, reset) ;
input ck, reset;

wire fetch_en;
wire [3:0] rom_address;
wire [7:0] rom_data;
wire [3:0] ld_na, ld, on;
wire oz, oi;

wire [3:0] r_bus;
wire [3:0] ra, rb;
wire [3:0] im;
wire rc;
wire co;

rom rom ( .oen(fetch_en), .rom_address(rom_address), .rom_data(rom_data));

dec DEC (
.ck(ck),
.reset(reset),
.i_code(rom_data[7:4]),
.imidiate(rom_data[3:0]),
.co(co),

.fetch_en(fetch_en),
.ld(ld),
.ld_na(ld_na),
.on(on),
.im(im),
.oz(oz),
.oi(oi)
);

registor REG_ (
.ck(ck),
.reset(reset),
.r_bus(r_bus),
.r0_ld(ld[0]),
.r1_ld(ld[1]),
.r2_ld(ld[2]),
.r3_ld(ld[3]),
.r0_ld_na(ld_na[0]),
.r1_ld_na(ld_na[1]),
.r2_ld_na(ld_na[2]),
.r3_ld_na(ld_na[3]),
.r0_on(on[0]),
.r1_on(on[1]),
.r2_on(on[2]),
.r3_on(on[3]),
.ra(ra),
.rb(rb),
.ia(rom_address)
);

alu ALU (
.ck(ck),
.reset(reset),
.a(ra),
.b(rb),
.im(im),
.oz(oz),
.oi(oi),
.q_na(r_bus),
.co(co)
);

endmodule

2008年2月22日金曜日

TD4.v CPUの創り方 2段パイプライン版

module rom(oen, rom_address, rom_data);

/*
instruction decode
0000_0000 : add r0,r1
0001_0000 : add r1,r0
0010_.... : add r0,#i
0011_.... : add r1,#i
0100_0000 : move r0,r1
0101_0000 : move r1,r0
0110_.... : move r0,#i
0111_.... : move r1,#i
1000_.... : jmp #i
1100_.... : jnz #i

ld(on)
0001 : r0
0010 : r1
0100 : r2
1000 : r3(PC)
*/
input oen;
input [3:0] rom_address;
output [7:0] rom_data;

wire [3:0] rom_address;
reg [7:0] rom_data;

always @ (rom_address) begin
if (oen) begin
casez(rom_address)
4'h0: rom_data=8'b0110_0001; /* move r0,#0001 */
4'h1: rom_data=8'b0010_0010; /* add r0,#0010 */
4'h2: rom_data=8'b0111_0000; /* move r1,#0000 */
4'h3: rom_data=8'b1100_0001; /* jnz #0001 */
4'h4: rom_data=8'b1000_0001; /* jmp #0001 */
default:
rom_data=8'b0000_0000;
endcase
end else begin
rom_data=8'bxxxx_xxxx;
end
end

endmodule

module dec (
ck,
reset,
i_code,
imidiate,
co,
fetch_en,
ld,
on,
im,
oz,
oi
);
input ck, reset;
input [3:0] i_code, imidiate;
input co;
output fetch_en;
output [3:0] ld, on, im;
output oz;
output oi;

reg [3:0] ld_c, on_c;
reg oz_c, oi_c, en_c;
reg [3:0] ld, on, im;
reg oz, oi;
reg en;

always @ (i_code or co or en) begin
if (en) begin
casez (i_code)
4'b0000: begin /* add r0,r1 */ ld_c=4'b0001; on_c=4'b0010; oz_c=0; oi_c=0; en_c=1; end
4'b0001: begin /* add r1,r0 */ ld_c=4'b0010; on_c=4'b0001; oz_c=0; oi_c=0; en_c=1; end
4'b0010: begin /* add r0,#i */ ld_c=4'b0001; on_c=4'b0001; oz_c=0; oi_c=1; en_c=1; end
4'b0011: begin /* add r1,#i */ ld_c=4'b0010; on_c=4'b0010; oz_c=0; oi_c=1; en_c=1; end
4'b0100: begin /* move r0,r1 */ ld_c=4'b0001; on_c=4'b0010; oz_c=0; oi_c=0; en_c=1; end
4'b0101: begin /* move r1,r0 */ ld_c=4'b0010; on_c=4'b0001; oz_c=0; oi_c=0; en_c=1; end
4'b0110: begin /* move r0,#i */ ld_c=4'b0001; on_c=4'b0001; oz_c=0; oi_c=1; en_c=1; end
4'b0111: begin /* move r1,#i */ ld_c=4'b0010; on_c=4'b0010; oz_c=0; oi_c=1; en_c=1; end
4'b1000: begin /* jmp #i */ ld_c=4'b1000; on_c=4'bxxxx; oz_c=1; oi_c=1; en_c=0; end
4'b1100: begin /* jnz #i */
if (co) begin
ld_c=4'b1000; on_c=4'bxxxx; oz_c=1; oi_c=1; en_c=0;
end else begin
ld_c=4'b0001; on_c=4'b0001; oz_c=1; oi_c=0; en_c=1; /* add r0,#0 as NOP */
end
end
default: begin
ld_c=4'b0001; on_c=4'b0001; oz_c=1; oi_c=0; en_c=1; /* add r0,#0 as NOP */
end
endcase
end else begin
ld_c=4'b0001; on_c=4'b0001; oz_c=1; oi_c=0; en_c=1; /* add r0,#0 as NOP */
end
end

always @ (posedge ck or posedge reset) begin
if (reset) begin
ld<=4'b0001; on<=4'b0001; oz<=1; oi<=0; /* add r0,#0 as NOP */
im<=4'b0000;
en<=1;
end else begin
ld<=ld_c; on<=on_c; oz<=oz_c; oi<=oi_c;
im<=imidiate;
en<=en_c;
end
end
assign fetch_en=en;

endmodule

module registor (
ck,reset,r_bus,
r0_ld, r1_ld, r2_ld, r3_ld,
r0_on, r1_on, r2_on, r3_on,
ra,
rb,
ia
);

input ck, reset;
input r0_ld, r1_ld, r2_ld, r3_ld;
input r0_on, r1_on, r2_on, r3_on;
input [3:0] r_bus;
output [3:0] ra, rb, ia;
reg [3:0] r0, r1, r2,r3;

always @ (posedge ck) begin
if (reset) begin
r0<=4'h0;
r1<=4'h0;
r2<=4'h0;
r3<=4'h0;
end else begin
if (r0_ld) r0<=r_bus;
if (r1_ld) r1<=r_bus;
if (r2_ld) r2<=r_bus;
if (r3_ld) r3<=r_bus; else r3=r3+1;
end
end

assign ra =
(r0_on==1) ? r0 :
(r1_on==1) ? r1 :
(r2_on==1) ? r2 :
(r3_on==1) ? r3 : 4'bxxxx ;

assign rb =
(r0_ld==1) ? r0 :
(r1_ld==1) ? r1 :
(r2_ld==1) ? r2 :
(r3_ld==1) ? r3 : 4'bxxxx ;

assign ia = r3;

endmodule

module alu (a, b, im, oz, oi, q, of, co);
input [3:0] a, b, im;
input oz, oi;
output [3:0] q;
output of, co;
assign {of,q} =
(oi == 1 && oz == 1)? im :
(oi == 1)? a + im :
(oz == 1)? a :
a + b ;
assign co=| {of,q} ;
endmodule

module cpu(ck, reset) ;
input ck, reset;

wire fetch_en;
wire [3:0] rom_address;
wire [7:0] rom_data;
wire [3:0] ld, on;
wire oz, oi;

wire [3:0] r_bus;
wire [3:0] ra, rb;
wire [3:0] im;
wire rc;
wire co;

rom rom ( .oen(fetch_en), .rom_address(rom_address), .rom_data(rom_data));

dec DEC (
.ck(ck),
.reset(reset),
.i_code(rom_data[7:4]),
.imidiate(rom_data[3:0]),
.co(co),

.fetch_en(fetch_en),
.ld(ld),
.on(on),
.im(im),
.oz(oz),
.oi(oi)
);

registor REG_ (
.ck(ck),
.reset(reset),
.r_bus(r_bus),
.r0_ld(ld[0]),
.r1_ld(ld[1]),
.r2_ld(ld[2]),
.r3_ld(ld[3]),
.r0_on(on[0]),
.r1_on(on[1]),
.r2_on(on[2]),
.r3_on(on[3]),
.ra(ra),
.rb(rb),
.ia(rom_address)
);

alu ALU (.a(ra), .b(rb), .im(im), .oz(oz), .oi(oi), .q(r_bus), .co(co));

endmodule

2008年2月19日火曜日

TD4.v CPUの創り方

module top;

reg ck, reset;

initial begin

$dumpfile("cpu.vcd");
$dumpvars(0,CPU);

#0 ck=0;
#0 reset=1;

#100 ck=~ck;
#100 ck=~ck;

#0 reset=0;

#100 ck=~ck;
#100 ck=~ck;

#100 ck=~ck;
#100 ck=~ck;

#100 ck=~ck;
#100 ck=~ck;

#100 ck=~ck;
#100 ck=~ck;

#100 ck=~ck;
#100 ck=~ck;

#100 ck=~ck;
#100 ck=~ck;

#100 ck=~ck;
#100 ck=~ck;

#100 ck=~ck;
#100 ck=~ck;

$finish;

end

cpu CPU (.ck(ck), .reset(reset));

initial $monitor ("ck:rs = %b:%b", ck, reset);
endmodule

module rom(rom_address, rom_data);

/*
instruction decode
0000_0000 : add r0,r1
0001_0000 : add r1,r0
0010_.... : add r0,#i
0011_.... : add r1,#i
0100_0000 : move r0,r1
0101_0000 : move r1,r0
0110_.... : move r0,#i
0111_.... : move r1,#i
1000_.... : jmp #i
1100_.... : jnz #i

ld(on)
0001 : r0
0010 : r1
0100 : r2
1000 : r3(PC)
*/
input [3:0] rom_address;
output [7:0] rom_data;

wire [3:0] rom_address;
reg [7:0] rom_data;

always @ (rom_address) begin
casez(rom_address)
4'h0: rom_data=8'b0110_0001; /* move r0,#0001 */
4'h1: rom_data=8'b0010_0010; /* add r0,#0010 */
4'h2: rom_data=8'b0111_0000; /* move r1,#0000 */
4'h3: rom_data=8'b1100_0001; /* jnz #0001 */
4'h4: rom_data=8'b1000_0001; /* jmp #0001 */
default:
rom_data=8'bxxxx_xxxx;
endcase
/*$display("%h:%h",rom_address,rom_data);*/
end

endmodule

module dec (
i_code,
co,
ld,
on,
oz,
oi
);
input [3:0] i_code;
input co;
output [3:0] ld;
output [3:0] on;
output oz;
output oi;

reg [3:0] ld, on;
reg oz, oi;
always @ (i_code) begin
casez (i_code)
4'b0000: begin /* add r0,r1 */ ld=4'b0001; on=4'b0010; oz=0; oi=0; end
4'b0001: begin /* add r1,r0 */ ld=4'b0010; on=4'b0001; oz=0; oi=0; end
4'b0010: begin /* add r0,#i */ ld=4'b0001; on=4'b0001; oz=0; oi=1; end
4'b0011: begin /* add r1,#i */ ld=4'b0010; on=4'b0010; oz=0; oi=1; end
4'b0100: begin /* move r0,r1 */ ld=4'b0001; on=4'b0010; oz=0; oi=0; end
4'b0101: begin /* move r1,r0 */ ld=4'b0010; on=4'b0001; oz=0; oi=0; end
4'b0110: begin /* move r0,#i */ ld=4'b0001; on=4'b0001; oz=0; oi=1; end
4'b0111: begin /* move r1,#i */ ld=4'b0010; on=4'b0010; oz=0; oi=1; end
4'b1000: begin /* jmp #i */ ld=4'b1000; on=4'bxxxx; oz=1; oi=1; end
4'b1100: begin /* jnz #i */
if (co) begin
ld=4'b1000; on=4'bxxxx; oz=1; oi=1;
end else begin
ld=4'b0001; on=4'b0001; oz=1; oi=0; /* add r0,#0 as NOP */
end
end
default: begin
ld=4'bxxxx;
on=4'bxxxx;
oz=1'bx;
oi=1'bx;
end
endcase
end
endmodule

module registor (
ck,reset,r_bus,
r0_ld, r1_ld, r2_ld, r3_ld,
r0_on, r1_on, r2_on, r3_on,
co,
ra,
rb,
rc,
ia
);

input ck, reset;
input r0_ld, r1_ld, r2_ld, r3_ld;
input r0_on, r1_on, r2_on, r3_on;
input [3:0] r_bus;
input co;
output [3:0] ra, rb, ia;
output rc;
reg [3:0] r0, r1, r2,r3;
reg carry;

always @ (posedge ck) begin
#1;
if (reset) begin
r0=4'h0;
r1=4'h0;
r2=4'h0;
r3=4'h0;
carry=0;
end else begin
if (r0_ld) r0=r_bus;
if (r1_ld) r1=r_bus;
if (r2_ld) r2=r_bus;
if (r3_ld) r3=r_bus; else r3=r3+1;
carry=co;
end
$display("r0 = %h r1 = %h r2 = %h r3 = %h", r0,r1,r2,r3);
end

assign ra =
(r0_on==1) ? r0 :
(r1_on==1) ? r1 :
(r2_on==1) ? r2 :
(r3_on==1) ? r3 : 4'bxxxx ;

assign rb =
(r0_ld==1) ? r0 :
(r1_ld==1) ? r1 :
(r2_ld==1) ? r2 :
(r3_ld==1) ? r3 : 4'bxxxx ;

assign rc = carry;

assign ia = r3;

endmodule

module alu (a, b, im, oz, oi, q, of, co);
input [3:0] a, b, im;
input oz, oi;
output [3:0] q;
output of, co;
assign {of,q} =
(oi == 1 && oz == 1)? im :
(oi == 1)? a + im :
a + b ;
assign co=| {of,q} ;
endmodule

module cpu(ck, reset) ;
input ck, reset;

wire [3:0] rom_address;
wire [7:0] rom_data;
wire [3:0] ld, on;
wire oz, oi;

wire [3:0] r_bus;
wire [3:0] ra, rb;
wire rc;
wire co;

rom rom (.rom_address(rom_address), .rom_data(rom_data));

dec DEC (.i_code(rom_data[7:4]), .co(rc), .ld(ld), .on(on), .oz(oz), .oi(oi));

registor REG_ ( .ck(ck), .reset(reset), .r_bus(r_bus), .r0_ld(ld[0]), .r1_ld(ld[1]), .r2_ld(ld[2]), .r3_ld(ld[3]), .r0_on(on[0]), .r1_on(on[1]), .r2_on(on[2]), .r3_on(on[3]), .co(co), .ra(ra), .rb(rb), .rc(rc), .ia(rom_address));

alu ALU (.a(ra), .b(rb), .im(rom_data[3:0]), .oz(oz), .oi(oi), .q(r_bus), .co(co));

endmodule

2008年2月14日木曜日

startx/startxwin.bat/startwin.sh

この3つのスクリプトって、

startx :xinitを呼び出してXを起動(shellスクリプト)
startxwin.bat:XWinを呼び出してXを起動(.batファイル)
startxwin.sh :XWinを呼び出してXを起動(shellスクリプト)

がそれぞれの違いになります。
なのでぇ、cmdからはstartxwin.bat、bashからはstartx/startwin.sh、でCygwin Xを起動することになります。
っつと、もっとも大きな違いはと、xinitを使わないと$HOME/.xinitrcが読まれません。

当たり前なんですが、忘れがちです・・・

CygwinX.bat(startwin.bat日本語編)

@echo off
set DISPLAY=127.0.0.1:0.0
set CYGWIN_ROOT=\cygwin
set PATH=.;%CYGWIN_ROOT%\bin;%CYGWIN_ROOT%\usr\X11R6\bin;%PATH%

if not exist %CYGWIN_ROOT%\tmp\.X11-unix\X0 goto CLEANUP-FINISH
attrib -s %CYGWIN_ROOT%\tmp\.X11-unix\X0
del %CYGWIN_ROOT%\tmp\.X11-unix\X0

:CLEANUP-FINISH
if exist %CYGWIN_ROOT%\tmp\.X11-unix rmdir %CYGWIN_ROOT%\tmp\.X11-unix

REM =======================================================================
REM (1)ローカルでCygwinを起動する場合の設定です
REM (2)XWinの書式
REM -rootless:デスクトップが透過します
REM (3)ログイン後にxwinclipコマンドでWindows側とコピー&ペースト可能となります
REM =======================================================================
REM start XWin -engine 4 -clipboard -emulate3buttons
start XWin -engine 4 -clipboard -emulate3buttons -rootless
run xmodmap /home/Administrator/.Xmodmap
run wmaker
run xterm

REM =======================================================================
REM (1)ローカルでCygwinを起動する場合の設定です
REM (2)日本語環境が設定されている場合に利用します
REM (3)XWinの書式
REM -rootless:デスクトップが透過します
REM (4)ログイン後にxwinclipコマンドでWindows側とコピー&ペースト可能となります
REM =======================================================================
REM start XWin -engine 4
REM set LANG=ja_JP.EUC
REM set XMODIFIERS='@im=kinput2'
REM run /usr/local/canna/bin/cannaserver
REM run xset fp+ /usr/X11R6/lib/X11/fonts/TT
REM run xmodmap /home/Administrator/.Xmodmap
REM run xrdb -load /home/Administrator/.Xresources
REM run kinput2 -canna -cannafile /home/Administrator/.canna
REM run wmaker

REM =======================================================================
REM (1)Solarisログインサーバへ接続する場合の設定です
REM (2)XWinの書式(ホスト名を使用する場合はhostsへの登録が必要です)
REM -query :ログインサーバのIPアドレス or ホスト名
REM -from :ローカルのIPアドレス or ホスト名
REM -fp :ログインサーバのIPアドレス or ホスト名
REM -fullscreen -depth 8 :8bitカラーで利用する
REM =======================================================================
REM start XWin -kb -screen 0 -clipboard -emulate3buttons -query sv_lis4 -from 172.16.245.166 -fp tcp/sv_lis4:7100 -fullscreen -depth 8
REM start XWin -kb -screen 0 -clipboard -emulate3buttons -query sv_lis4 -from 172.16.245.166 -fp tcp/sv_lis4:7100
REM sleep 30
REM xmodmap /home/Administrator/.Xmodmap

REM =======================================================================
REM (1)Linuxログインサーバへ接続する場合の設定です
REM (2)XWinの書式(ホスト名を使用する場合はhostsへの登録が必要です)
REM -query :ログインサーバのIPアドレス or ホスト名
REM -from :ローカルのIPアドレス or ホスト名
REM -fullscreen -depth 8 :8bitカラーで利用する
REM =======================================================================
REM start XWin -kb -screen 0 -clipboard -emulate3buttons -query sv_lin11 -from 172.16.245.166 -fullscreen -depth 8
REM start XWin -kb -screen 0 -clipboard -emulate3buttons -query sv_lin11 -from 172.16.245.166
REM sleep 30
REM xmodmap /home/Administrator/.Xmodmap

REM =======================================================================
REM (1)HP-UXログインサーバへ接続する場合の設定です
REM (2)XWinの書式(ホスト名を使用する場合はhostsへの登録が必要です)
REM -query :ログインサーバのIPアドレス or ホスト名
REM -from :ローカルのIPアドレス or ホスト名
REM -fp :ログインサーバのIPアドレス or ホスト名
REM -fullscreen -depth 8 :8bitカラーで利用する
REM =======================================================================
REM start XWin -kb -screen 0 -clipboard -emulate3buttons -query sv_lih21 -from 172.16.245.166 -fp tcp/sv_lih21:7000 -fullscreen -depth 8
REM start XWin -kb -screen 0 -clipboard -emulate3buttons -query sv_lih21 -from 172.16.245.166 -fp tcp/sv_lih21:7000
REM sleep 30
REM xmodmap /home/Administrator/.Xmodmap

2008年2月13日水曜日

imeproxy で cygwin日本語入力

WindowsのIMEをproxyしてくれて、cygwinなどからIMEで日本語入力を可能にしてくれるもの、ん~っすばらしいぃ~考え方
ここにプロジェクトがあります。また、ここに解説があります。まだまだβ的ではありますが。

kinput2→canna

がUnix系日本語入力の基本(だった)なのですが、「IMEがある場合(つまりWindowsからLinuxを使用して仕事している場合っね)」辞書サーバが2つあるのも不経済かと思いますよ。なんでLinuxでの日本語入力もIMEで代用出ると経済的。

kinput2→imeproxy→IME

ってパスで日本語変換を達成してしまうようです。
まあ、FrontEndとしてkinput2が必要なことは致し方ない。英語圏の人はFrontEndなんて不要ですから、少なくともkinput2などは必要になってしまいますよねぇ。で、ご一緒に仕事しているメンバの中には、cannaサーバを立ち上げるのが面倒なので、Linux上では日本語一切使用しないって人もいます。昔は自分でcanna立ち上げて利用していたのに、いまや「Windowsでイイじゃん」ってことらしい。それと自分でIMEの辞書を鍛えてたりすると、「WindowsのIMEとcanna、両方を鍛えるのは面倒」となります。一番キツイのは人名シリーズではないでしょうか?。IMEでは出てくるのにcannaではダメっみたいなことが起こるという訳。

で、imeproxyの登場です。Linux上のEmacsからkinput2でWindows上の自分の辞書へアクセスできれば、とってもウレスィイー

2008年2月8日金曜日

dot ファイルにパスワードが散乱

メールサーバのパスワード、有効期限が来たので「変更」。
っとっとーう~ぅ メールが読めんし、送れん状態になったぞぉー

そう、私はズボラですから、パスワードなんてドットファイルに書いちゃってます。

.fetchmailrc
.muttrc
.nbsmtprc

それぞれのファイルにメールサーバのパスワードが散乱しておりました。(当然600ですがぁ)
これを一元管理しようとかなんとか考え出すとうっとおしい。
全部のファイルを書き換えましょう・・・

2008年2月7日木曜日

ベイズ統計理論とPush型情報提供

ディスプレイを眺めていて、コンピュータとのインタフェースについて考え込むことがしばしばあります。

見るために人がアクションする(Pull型)
見たくなくてもコンピュータが見せようと動く(Push型)

このPush型/Pull型という区別はかつて有名になったことがあります。元来はPull型が支配的であったコンピュータの世界に、テレビのようなPush型が加わってきたときに、「これは今までのコンピュータの概念とチト違うぞぉ」ってことで、話題になったと記憶しています。

①見たい情報は何かを人が考えて、アクションして取り出す

②見せたい情報は何かをコンピュータが考えて、画面に表示する

ところが②はうっとうしい場合が多々あります。これは当たり前ですねぇ。
「今は画面の別のところに意識が集中しているのだから、気を散らさないで!」
てなこと。しかし、「メールが届いたら教えてくれぇ」とコンピュータに指示しておいたくせに、教えられた時と場合により、うっとうしい、と感じるわけで、なんともしがたい。

やはり、人の指示に従うだけではなく、「時と場合をコンピュータが理解する、アクションを変える」ことが出来たら良いのでしょう。人の状況をコンピュータが理解できるかどうか。

"ベイズ統計理論"の出番なのかもしれません。

「明日死ぬ確率というのは、これから起こる現象の確からしさを表すものだが、確率は将来の予測ばかりに利用されるとは限らない。...既に起こった現象が特定の原因によってもたらされた確率というものもある。ベイズ Bayes,T.という統計学者は、この原因の確率を『ベイズの定理(Bayes' theorem)』として定式化した。」

とある通り、現象から原因の尤度(もっと(尤)もらしさ)を求めてしまう考え方だとさ。

Bなる現象が確認された場合、過去がAであった確率を P(A|B)
過去がAであったならばBの現象が起こる確率を P(B|A)
過去がAであった確率 P(A)
現在、Bが確認される確率 P(B)

このとき、P(A|B) は、
P(A|B) ∝ P(B|A)
P(A|B) ∝ P(A)
P(A|B) ∝ 1/P(B)
となるそうなぁ(これベイズの定理ね)。例えば、

A:インフルエンザに罹った
B:高熱が出ている

では、
P(A|B):高熱が出ているのだからインフルエンザに罹っていた。現在の高熱の原因はインフルエンザである確率
P(B|A):インフルエンザに罹ると高熱がでる確率(医学的に確率は求まるけれど個体差がある)
P(A):インフルエンザであった確率(インフルエンザ流行の度合いで確率は求まるけれども、最近インフルエンザの人と接触があった場合など個人差がある)
P(B):現在高熱が出ている確率(なぞの伝染病が高熱を伴って流行していると高熱出している人は沢山いる)
となるけど、それぞれの確率は主観的に決めてしまいましょってことぉ。

カッコ内を考察すると、現在の高熱の原因がインフルエンザである確率は、
昔インフルエンザに罹った経験があり、高熱を伴ったので、P(B|A)は高い
最近インフルエンザの流行は少ないが、インフルエンザに罹った友達がいるからP(A)は高い
昨日風呂上りに裸で眠ってしまい、寒くて目が覚めた。P(B)は高い

その他の例題と解説に感染者問題などが詳しく説明されてます。

主観的確率に従って「今の操作者の時と場合」を判断することはできないものでしょうか?
P(暇そう) P(忙しそう)
それぞれの主観的確率をはじき出して、アクションを変える。なんだかできそうな・できなさそうな。

procmail スプール先を毎月変える

けっこうズボラな私としては、たっくさん送られてくるメールを一々振り分けることはせず、ぜーんぶ、一箇所に集めてしまっています。.procmailrcがこう、

PATH=/bin:/usr/bin:/usr/local/bin:.
MAILDIR=$HOME/.Mail/Maildir # You'd better make sure it exists
DEFAULT=$MAILDIR/inbox/.
LOGFILE=$MAILDIR/from/procmail.log
LOCKFILE=$HOME/.lockmail

なんで全部のメールがinboxにMH形式で(/.)溜まってゆきます。さすがに数万通ではmuttで開くのが遅くて困るので、毎月溜める先を変えてみます(Maildir形式で)。

:0
$MAILDIR/inbox-`date +%Y%m`/

これを.procmailrcに足しておきます。procmailのログ(LOGFILE=$MAILDIR/from/procmail.log)を見ると、

Subject: [MFP09_ML:00892] Re: =?ISO-2022-JP?B?GyRCIVo+ZU4uQF8bKEI=?=
Folder: /svhome/ogurak/.Mail/Maildir/inbox-2008_02/new/1202364704.52 4361
Subject: [rt_jitsumu_caiman.maestro:10384] =?ISO-2022-JP?B?RFNN?=
Folder: /svhome/ogurak/.Mail/Maildir/inbox-2008_02/new/1202364705.52 3582
Subject: [MFP09_ML:00893] Re: =?ISO-2022-JP?B?GyRCIVpKIUtcJDUbKEI=?=
Folder: /svhome/ogurak/.Mail/Maildir/inbox-2008_02/new/1202364705.52 6964

どうやら振り分けられている様子。メデタイ

2008年2月6日水曜日

透明Window その2

透明Window その1でも触れましたが、「透明なWindow」に興味が湧く大きな理由に、

「WindowsやX Windowでの`枠(タイトルバーと言うのかしら)`が嫌いっ ダサイっ」

てのがありますねぇ。

このタイトルバーってダサいです。なぜかと言えば、飽きたから、そして、デザインが悪いから、そして、なーにもしないから。

もしタイトルバーが無いと、「マウスでWindowを操作できないじゃ~ん」などと考えません。マウスでWindowを操作すること自体がダサい。もちろん、マウスでなきゃ無理っつー作業も沢山あります。これを無理してキーボードで操作しようなんて考えません。

まず飽きが来ていることは確かでしょう。Mac Book Airの複数本指先インタフェースみたいな新しいものも出てきてます(実用的とは思えませんがぁ:-p)。それから皆がマウスでクリクリしながら仕事している姿を眺めていると、異常ーって感覚に陥ります(私だけ?)。キーボードを叩くのにも皆さん「無くて七癖」ですが、異常には感じません(これも私だけ?)。まあこれは個人の感覚的過ぎるので置いといて。マウスは未来的では無い、古びたものに感じられてしまいます。

タイトルバーのデザインは最悪です。滅多に使わないくせにいつも画面に表示されていて、好きに色を変えられてもあまり機能的な意味合いは無いですよねぇ。タイトルバーに、
「時間を表示する」
「アラーム機能がある」
「日程管理ができる」
「新着メールのヘッダーを表示する」
「季節や時間に応じて変化する」
「天気予報を表示する」
なんだって機能的にくっつけられそうなものではありませんかぁ~
ググってみますと、
MicroSoftではこーんなTipsがありますが、タイトルバーにフォルダーのフルパス表示しても嬉しさ微小ですねぇ~
こーんなフリーソフトもありますねぇ~

アクティブウィンドウのタイトルバーにランチャー機能を付加するソフト
日付や時間、モデムの送受信速度などをタイトルバーに表示「以心伝心」
タイトルバーでメールの着信通知を行ってくれるソフト
タイトルバーに列車が走る!?「何でも走る!!」(??電車マニアにはたまらん??/-)

色々できるじゃぁないですかっ。

ディスプレイの一部を常に占有しているわけですから、「もうちょっと働いてくれっ」と思うワケです。

2008年2月3日日曜日

w3m なぜか.tclファイルがWindowsへ転送されて・・・

hogehoge.tclファイルがWindowsへ転送されてしまう~

私はw3m設定の~/.w3./mailcapで、

application/* fview.tcl %s

としてあります。ところが、application/*とファイル・サフィックスの対応付けを示す~/.mime.type に、

application/x-tcl tcl

などと書き込んでしまっていたため、
w3m hogehoge.tcl でw3mを起動すると、

w3mの頭の中:「hogehoge.tcl は サフィックスが.tclなので~/.mime.typeを見ると mimeタイプがapplication/x-tclだなぁ・ならば~/.w3m/mailcapを見ると application/*に相当するから、fview.tclを起動してファイル名hogehoge.tclを渡そうぅ」

fview.tclの頭の中:「hogehoge.tclですかぁ、Windowsへ転送しておきましょう」

ってなわけで、hogehoge.tclがWindowsへ転送後適当なWindows上のアプリケーションで表示されていた、っつーワケでした。

~/.mime.type に.tclに関するエントリーを書き込んだの、誰だっ?私っ?
私が書き込んだわけではなく、~/.mime.typeは私が/etc/mime.typeからコピーして来たもので、/etc/mime.typeには、tclに関するエントリーがあったのです。

まあ私しか書き込み権ありませんから、犯人は自分ですね。
削除するとOKとなりました。