スポンサーサイト
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
super と this の違い Java
super と this の違いがわからんかったのだが、名前空間の問題であろうことがわかった。

同じ名前があったら、困るよね。 super もしくは this でどっちのメンバーか教えてあげようってことだろう。

Main.java
class Parent {
public String Say(){
return "I'm parent.";
}
}
class Child extends Parent {
public void Hoge(){
System.out.println(super.Say());
System.out.println(this.Say());
}
}
class Main {
public static void main(String[] args){
new Child().Hoge();
}
}
C:\Java実験>javac Main.java

C:\Java実験>java Main
I'm parent.
I'm parent.



Main.java
class Parent {
public String Say(){
return "I'm parent.";
}
}
class Child extends Parent {
public void Hoge(){
System.out.println(super.Say());
System.out.println(this.Say());
}

// ココ付けたし!!
public String Say(){
return "I'm child.";
}

}
class Main {
public static void main(String[] args){
new Child().Hoge();
}
}
C:\Java実験>javac Main.java

C:\Java実験>java Main
I'm parent.
I'm child.




Main.java
class Parent {
public String hoge = "I'm parent!";
}
class Child extends Parent {
public void Hoge(){
System.out.println(super.hoge);
System.out.println(this.hoge);
}
}
class Main {
public static void main(String[] args){
new Child().Hoge();
}
}
C:\Java実験>javac Main.java

C:\Java実験>java Main
I'm parent!
I'm parent!



Main.java
class Parent {
public String hoge = "I'm parent!";
}
class Child extends Parent {
// ココ付けたし!
public String hoge = "I'm child!";
public void Hoge(){
System.out.println(super.hoge);
System.out.println(this.hoge);
}
}
class Main {
public static void main(String[] args){
new Child().Hoge();
}
}
C:\Java実験>javac Main.java

C:\Java実験>java Main
I'm parent!
I'm child!



おまけ:
thisはインスタンスだが、superはインスタンスでないらしい

Main.java
class A {
public String name = "A!";
public void hoge(){
new B().say(this);
}
}

class B{
public void say(A a){
System.out.println(a.name);
}
}

class Main {
public static void main(String[] args){
new A().hoge();
}
}
C:\Java実験>javac Main.java

C:\Java実験>java Main
A!


Main.java
class A {
public String name = "A!";
public void hoge(){
new B().say(this);
}
}

class B{
public void say(A a){
System.out.println(a.name);

// 代入してみよう!!
a.name = "B!";
}
}

class Main {
public static void main(String[] args){
A a = new A();
a.hoge();
// a.hoge() でごにょごにょなって
// a.nameが変更されている
System.out.print(a.name);
}
}
C:\Java実験>javac Main.java

C:\Java実験>java Main
A!
B!



ちなみに、以下のようにも書ける。

Main.java
class A {
public String name = "A!";
public void hoge(A a){
new B().say(a);
}
}

class B{
public void say(A a){
System.out.println(a.name);
a.name = "B!";
}
}

class Main {
public static void main(String[] args){
A a = new A();
a.hoge(a);
System.out.print(a.name);
}
}
C:\Java実験>javac Main.java

C:\Java実験>java Main
A!
B!

なんだか、 a.hoge(a) あたりがものすごく明示的だけどこんな書き方は見たことがないなぁ。

参考資料:
http://www.hym.ic.kanagawa-it.ac.jp/~furui/semi/
スポンサーサイト
実装しました
以下のソースを実装しました。IEの方は

← → を押していただくと、記事を移動できます。

トップからだと、一番古い記事へいっちゃうので、
http://bingobingobingo.blog49.fc2.com/blog-entry-689.html
↑これをクリックしてからお初めください。

ただ、コメント書くときに ← → を押しちゃうとページを遷移してしまう・・・ Ctrキー押しながらとかのほうがいいのかも・・・・
もしくは フォーカスをみるとかかな(できるかしらんが)

IEだけつーのもちょっとね・・・

もしかしたら、実装はずすか、改良するかどっちかだな。

<script type="text/javascript" defer="defer">
//<![CDATA[
function preAndForword(){
// 現在のURL取得
var nowUrl = location.href;

// 正規表現で \d.htmlとなっている \dを取得
nowUrl.search(/(\d+)\D*$/);
var number = RegExp.$1;

if( nowUrl == "http://bingobingobingo.blog49.fc2.com/" &&
(event.keyCode == 37 || event.keyCode == 39)){
location.href = "http://bingobingobingo.blog49.fc2.com/blog-entry-1.html";
return;
}

if (event.keyCode == 37) {
number--;
location.href = nowUrl.replace(/(\d+)\D*$/, number + '.html');
return;
}
if (event.keyCode == 39) {
number++;
location.href = nowUrl.replace(/(\d+)\D*$/, number + '.html');
return;
}
}

window.document.onkeydown = preAndForword;
//]]>
</script>
XHTMLじゃなくてもCSSは使えます
俺の言語をブラウザで表示させるんだ!


<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<?xml-stylesheet type="text/css" href="nakanishi.css"?>
<!DOCTYPE root [
<!ELEMENT root (nakanishi)>
<!ELEMENT nakanishi (hoge)>
<!ELEMENT hoge (#PCDATA)>
]>

<root>
<nakanishi>
<hoge>ビンゴ</hoge>
</nakanishi>
</root>


nakanishi.css
root {
padding: 50px;
}

nakanishi {
background-color: #000000;
}

hoge {
color : #ffffff;
}


見た目はこんな感じ。
yokuwakarannga.jpg

よくわからん理由によりブラウザによって見た目が違ってるが、今回の趣旨とは関係ないので、原因究明は今のところしない。
Haskell で カリー化体験
# まちがってるかもしれないけど 覚書

Haskell はデフォルトでカリー化されてる。

型の定義は -> を使う。 

Int -> Int -> Int みたいになる
なんで -> で繋がるのか? Int Int Int って記法になんでしなかったの?

Maby Int みたいな記法があってそれと混乱するからであろう。

そもそも -> で繋がるのは、Haskellがデフォルトでカリー化をするから。

カリー化とは 1引数しかとらず1値しか返さない関数ってこと(嘘だったらごめんなさい)

えー!! いっぱい引数取ってるようにしか見えないけど!!

うーん。だから、なんか関数が返ってきてる。


add :: Integer -> Integer -> Integer -> Integer
add x y z = x+y+z

inc_first = add 1

-- inc_first は Integer -> Integer -> Integer型
-- inc_first は Integer型を受け取り Integer型とInteger型を受けとりInteger型を返す関数を返す
-- わかりにくすぎる・・・
-- inc_first(int) は return function(int, int) するってこと(厳密には嘘)
-- 厳密に書くように頑張ってみると・・・
-- function(int) で return fucntion(int) する関数を返すとなるのか、ならんのか・・・

inc_second = inc_first 1

*Main> inc_second 1
3


注意)Haskellでは Int型とInteger型は別です。
クロージャの使いどころ
クロージャはどういうときに使うんだろう。
mapに目を向けると、ちょっとだけ答えが見えるかもしれない。

Perlだと
use strict;

my @a = (1, 2, 3);
{
my $plus = 1;
@a = map { $_ + $plus } @a;
}
print join ' ', @a;


JavaScriptだと
function map(f, arr)
{
var result = new Array;
for(var i=0; i<arr.length;i++) {
result[i] = f(arr[i]);
}
return result;
}

function foo()
{
var plus = 1;
return map(function(x) {return x + plus}, [1, 2, 3]);
}

print (foo().join(' '));
それじゃあ 破壊的なのは駄目みたいなので
Haskellでは破壊的な行為は嫌なようだ。

ということで、Haskell JavaScript Perl で、破壊的でないクロージャを書いてみよう。

まずHaskell
add x y = x + y
inc = add 1
*Main> inc 1
2


同じことをJavaScriptで
function add(p) {
return function(o){
print(o+p);
}
}

var inc = add(1);
inc(1);


と、思ったら、「同じじゃない」とツッコミが。
printしちゃ駄目だと。外でやれと。
気を取り直して、JavaScriptだと
function add(p) {
return function(o){
return o+p;
}
}

var inc = add(1);
inc(1);



Perlだと
use strict;

sub add{
my $plus = $_[0];

return sub {
print $_[0] + $plus;
}
}

my $inc = add(1);

$inc->(1);


同様にして、Perlだと
use strict;

sub add{
my $plus = $_[0];

return sub {
$_[0] + $plus;
}
}

my $inc = add(1);

print $inc->(1);
JSとPerlでクロージャをやってみよう!
JavaScriptでクロージャを体験してみるとこんな感じ。
function DataAndFunction(){
var text = "aa";

return function(t){
print(text);
text = t;
}
}

var f = DataAndFunction();

f("bb");
f("cc");
f("ee");



Perlで体験するとこんな感じ。
use strict;

sub data_and_function{
my $text = "aa";

return sub {
print "$text\n";
$text = $_[0];
}
}

my $f = data_and_function();

$f->("bb");
$f->("cc");
&$f("ee");


出力結果はともに
aa
bb
cc
じゃあ 言語を作ってみようよ!! それでいいじゃない(妥当だ)
おし、じゃあ自分でXMLの言語つくってみよう。話はそれからだよ。

参考資料:
子要素の指定
XML入門:DTDの記述:妥当性の検証


<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!DOCTYPE root [
<!ELEMENT root (nakanishi)>
<!ELEMENT nakanishi (hoge)>
<!ELEMENT hoge (#PCDATA)>
]>

<root>
<nakanishi>
<hoge>ビンゴ</hoge>
</nakanishi>
</root>

Your XML is well formed and is validated

よし、満足。




○整形式 (well-formed)
○妥当性 (valid)

「整形式」より「妥当性」の方が強力。

XHTMLを書くなら「妥当性」を求めるんだ!!!!


しかし、俺はJavaのためにXMLを学ぶ!!!!
XMLにマジになる Javaのために!
1.XMLは要素よりなる
 <hoge>ビンゴ</hoge> ← 要素

2.型があったりする
 <hoge>ビンゴ</hoge> ← hoge型

3.要素は要素を持てる
 <nakanishi><hoge>ビンゴ</hoge></nakanishi> ← 入れ子

4.忘れるなそもそもデータに意味付けしたいんだ!!!(だから型か!!)
 <hoge>ビンゴ</hoge> ← 「ビンゴ」というデータをhoge型にする

# 型といっときながら DTD の力不足によりいい加減なことに。

5.順番も大切
 <love><Perl ref="foo.pl" /><Java ref="Bar.java" /></love>
レコード指向とセット指向
リレーショナルなデータベースは「セット指向」であって、テーブルとしてまとまったデータを取ってくるという話。

それに対して、CSVファイルみたいなものは1行ずつ取り出してくるので、「レコード指向」だという話。


でもJavaやPerlでデータベースに問い合わせた結果返ってきた「結果セット」はどうやって扱うかというと「レコード指向」。
相方のソースをゆっくり読む
どう書く?org kolshicaを読んでみましょう。
お題は、ピラミッドを作る どう書く?org みたいですね。

相方のソースはこれ。
js> function pyramid(n) {
var a = new Array(n*2+1).join('*') + "\n";
return (function(n) {
if (n < 1) return "";
return a.replace(new RegExp('\\*{'+(n*2-1)+'}'),
new Array(n).join(' ')) + arguments.callee(n-1);
})(n);
}
js> print(pyramid(4));
*
***
*****
*******

わけがわからんので、ひとつずつ読む。

js> new Array(1).join('*')

js> new Array(2).join('*')
*
js> new Array(3).join('*')
**
js> new Array(4).join('*')
***
つまり、Arrayは引数で与えられたぶん要素をもってて、joinで*が間に入るからひとつ少ない個数*が生成される。

js> var n = 4
js> new RegExp('\\*{'+(n*2-1)+'}')
/\*{7}/
正規表現もオブジェクトなんだろう、きっと。

js> var a = new Array(4).join('*')
js> a
***
js> a.replace(new RegExp('\\*{'+(2)+'}'),new Array(2).join(' '));
*
始めの2つの*を、1つの' 'に置換。

js> (function(c){
if ( c == 0 ) return ;
print(c);
c--;
arguments.callee(c);
})(2);
2
1
無名関数と arguments.callee( ) の使い方。

js> var a = new Array(2*2+1).join('*') + "\n";
js> a
****

js> a.replace( RegExp('\\*{' + (2*2-1) + '}'), new Array(2).join(' '));
*
3つの*が1つの' 'と置き換わる。

ということで、
js> function pyramid(n) {
var a = new Array(n*2+1).join('*') + "\n";
return (function(n) {
if (n < 1) return "";
return a.replace(new RegExp('\\*{'+(n*2-1)+'}'),
new Array(n).join(' ')) + arguments.callee(n-1);
})(n);
}
js> print(pyramid(4));
*
***
*****
*******



読んだ時間 1時間半ぐらいかしら。



ちなみに、本日は飲み会がありまして、
お酒の席で、少々プログラムの話を。

うーん。酒の席でプログラムの話したら駄目なのかなぁと思って
返ってきてから pit に聞いってみる。

ビンゴ中西:「プログラム好きって酒の席でもプログラムの話しちゃうよね」
pit: 「そりゃ、家に帰ってまでプログラムする人種だから」

納得した。



そして、今日私はJavaのすばらしさを飲み会のときに語ってもらった。頑張ろうと思った。
た、楽しすぎるぜRhino
Rhino - Java による JavaScript

使い方は、こちら
Rhinoに関する覚え書き

君のプログラミング言語で、これ、できる? - The Joel on Software Translation Project

alert( )  を print( )に変えて実行してみるんだ!!!

JSでプログラミングが楽しめるぜー。


言語を楽しむ
くそー Perl やりてぇ
Perlがやりたくなった。

私が、初めてコンピュータを買ったとき、メモ帳も開いたことがないのに、CGIの本を買ってきて Apache と ActivePerl を入れた。

インストール中、ときどき、DOSの黒い画面が開いて壊れたかと思った。

当時は、自分が入れたものが Apache だってのに気づくわけもないし、それが ActivePerlだってわかるわけもない。

何日も、わけがわからず手の付けられない日々が続いた。

なんだか、エディタっていうのが要るらしいと気づいて、サクラエディタを入れた。インターネットはウイルスがどうとか騒がれてたからおっかなびっくりだった。


その後も、知らないことの連続だった。



だが、私は今、こうしてエンジニアとして働いている(見習いだが)。

言語はJavaだ。エクリプスっていうなんか超すごいエディタで開発してる(統合開発環境っていうんだよ)。


俺が、自らの意思で初めて触れた言語Perlも、ちょっとだけど参照物なしでも書けるようになった。

Perlには思い入れが他の言語よりもちょっとだけ、いや、結構深い。

Perlやりてーなーー

Perlができるようになったら、みんなに使ってもらえるものが作れるようになると思ってた。

未だに、人に使ってもらえるものを作れる実力がない・・・
push と pop が関係ないスタック
TCP/IPスタックの概要

TCP/IPスタックとは、LANを使った通信を行うアプリケーションを作るとき必要とされる、TCP/IP通信のプロトコルに関するプログラムをまとめて1つのプログラム群としたものです。



Rubyでアジャイルプロトタイピング(1) - @IT

「フルスタックな」Webシステムフレームワークです。つまり、Webシステムのすべての層に対してフレームワークが提供され、それらがシームレスに統合されています



つまり、「なんかの集まり」という意味合いの「スタック」 orz

もうやめようかなぁ。。。と思いたくなるよね orz

スタック領域とかね、あのあたりの知識つけるのも非常に苦労したよね orz
超混乱!! I/O と ファイルシステムのブロック
「New I/Oで高速な入出力」第5回 処理をブロックしないI/O:ITpro

C言語の read と write で ブロッキングするとかしないとかの知識をつけた。

で、世の中にはブロック型デバイスというのがあるらしい。このブロックはたぶん、ファイルとしての読み出しの最小単位という意味のブロックだと思う。

で、 read とか write の方は、 処理が止るとか止らないとかの意味でブロックが使われてると思う。


もうレゴブロックでも持ってきてくれと言わんぐらい混乱してきた。
ファイルシステムとブロック
ファイルとは単なる、2次記憶装置(ハードディスクとか)に蓄えられたバイナリのデータだと思われる。

Linuxカーネル読解室には「バイトストリームである」(26ページ)とあったが、たぶん、バイナリのデータだよという意味だと思うのだけど・・・ 違うのだろうか・・・

# バイトとバイナリの言葉の使われ方の違いが、
# 未だによくわからん・・・


とまあ、俺らは、ハードディスク上に存在するデータ(バイト?)を取り出したいのだが、この取り出す最小単位を「ブロック」と呼んでいるように思える。それは、Oracleも同じ発想のようだ。

オラクルが好き! - セグメントとエクステント


とかく、今まで 私は「ページ」はハードディスクの話だと思ってたのだが、「ページ」は実メモリについての話であり、「ブロック」はファイルがらみのハードディスクについての話であるという結論に今のところ達した。

追記:
でも、ブロック型デバイスの項で、
大きな単位での入出力がしたいから、複数ページを1まとめにして~~
っとあった。 一体全体ページってなんなんだ!!!

いや待て、そもそもブロック型デバイスってなんなんだ?
http://www.tron.org/tron-s/btron/os_spec/kernel/device.html
http://docs.hp.com/ja/B2355-60104-09/intro.7.html
もしかして read とか write のとき使う ブロッキングの意味でブロック使ってる???
OSから見たメモリ
ページ → 実メモリを扱う最小単位

たぶん、絵にするとこんな感じだと思う。

memory_os.png
(クリックすると拡大表示)

過激な言い方をするなら、OSにとってのメモリの最小単位はページであって、ワードは関係ないと言えるのかもしれない。
中途な考察
うーん。

この業界は、アニメ好きばっかかと思ったら F1 とかのメカ系が好きな人も多いようだ。特にハードウェア系好きに多い気がするような、しないような。 そういえば、研究室では、きゅん氏が F1好きだったなぁ。

でも、我が大学はどう考えても、アニメ好きが(ry


きゅんもそうだったが、F1方面の方々は アニメには特にそれほど興味がなさそうだ。


どっかで、これ系統の記事みたなぁー
どこだっけかなぁ。
マイクロカーネル vs モノリシックカーネル
IT用語辞典 e-Words : マイクロカーネルとは 【micro-kernel】 ─ 意味・解説
モノリシックカーネルとは 【monolithic kernel】 - 意味・解説 : IT用語辞典

やっぱり、プロセス間通信で時間がとられるのが問題か。
勘がさえてきた。

たぶん、マイクロカーネルを学べば、どの部分が重要で、どの部分が分離可能で(ひとつのモノととられれて) っといったように機能に着目した学習がしやすいんだろうね。
それにしても
どうして、うちの会社は、
俺が、データベース履修漏れ(単位はとったけど)で
型に関する知識も履修漏れなの知ってたんだ。

DB使いまくりの、強烈に型付されたJava

明らかに足りなかったスキルをくれている。


そして、相方の得意言語が、俺とまったく逆順だという事実。
伸びる要素が多すぎる。知りたいことが多すぎる。

# だが、今日はもう寝よう

# まあ、どこの部署いっても
# 知らないことばかりだったとは思うが
俺だってもぐってゆく
070721_2010~01.jpg


知っていなければいけないことなのだろう。エンジニアとして。


# ビンゴ中西を、誰か休憩させてあげてください
バイトコードとバイナリって違うのね
バイトコードとバイナリって違うのね。ってそりゃそうか!

なにやらPythonもJavaと同じような実行環境の気配だな。

バイトコードをVM(仮想マシーン)が解釈して実行するようだ。(まだ「初めてのPython」1章目の知識)


今のところ、

バイトコード → VMが解釈できるモノ
バイナリ → CPUが解釈できるモノ

という解釈で間違いはないだろう。

ビンゴ中西のほげほげ 型について

で、 pit と出した結論は、これからのプログラム言語を習得する過程で非常に重要な前提条件になるような気がする。

それにしても、プログラム言語の差異を学ぶのはなぜ、これほどまでに楽しいんだ。
本が買えるというのは本当に素晴らしいことだ
本が好きだ。
飲み会
プログラム言語の話題が一切出ずに終わった。

そんなことが可能だったのか。

エンジニアリングで食ってるやつらと、またこうして食っていく。

黙って画面に向かってるやつらは、よくしゃべるんだよ、実は。

てか、1部すげーーw
OS周り積み残してた
履修漏れだよ・・・・

リアルタイムオペレーティングシステム

が、いまさら超気になる。


就職活動と、かぶったんだよーーーー
と言うのは言い訳で、当時はあんまり興味がなかった。。。

組み込み系いった、ろんごん先生は今どんな感じなんだろう。

つーか、当時、プロセスとスレッドの区別がやっとついたかついてないかじゃないかな・・・・ はっきり覚えとらんが。

と、思って 検索してみた

http://bingobingobingo.blog49.fc2.com/blog-entry-164.html

2006/10/13 (金)!! 就職活動終わってからだな。
よく作ったな、スレッド走りまくりのプログラム・・・
そりゃ 疲れたわけだ・・・

いやはや お恥ずかしい限りです・・・


あ、さらに よくよく考えてみると、組み込み系はドライバ周りなので(いや一概にそうとは言えないだろうが)、OSの管轄というよりは、OSよりちょっと外側??

なんだか、自分の実力が情けなくなってきたぞ・・・
学びたいことが多すぎる
君のプログラミング言語で、これ、できる? - The Joel on Software Translation Project

やっと無名関数の使いどころと、高階関数の意義がわかった。

すごいね。
LL恋し 型想い
LL恋し 型想い(型重い)

070718_2204~01.jpg


どう考えても本買いすぎ、寝不足だ。今日こそは早く寝よう。

Javaも楽しくなってきましたよ。
Wiki
Wikiについて勉強不足なだけのせいかも知らんが、Wikiはブログのように時系列でデータ(記事)を保存しておくのに向いてない気がする。というかそういうようには作られていないのだろう・・・

だが、使うツールは限定されている。

ブログがよいなぁ・・・

Wikiの効率のよい使い方がわからん。ブログにこれだけ覚書を書いてきたもんだから、なんかWikiに納得ができない・・・

Wikiに書くときはブログに書くときと書き方の発想を変えねばならない気がするが、どう変えればいいのか掴めん。。。
プリエンプティブ or ノンプリエンプティブ
プリエンプティブ と ノンプリエンプティブ という言葉がある。

語弊を恐れずいうのなら、プリエンプティブは任意の段階で制御を別のスレッド(もしくはプロセス)に移すことができる。しかし、ノンプリエンプティブは、ここからここまでと決まったところまで処理が終わらないと、制御を別のスレッド(もしくはプロセス)に移せない。

ということで、

スレッドではなさそうだ

のソースは、一見、ノンプリエンプティブなように見えるのではないかという話。でもまぁ、JavaScriptにはスレッドはなさそうなんで、純粋に、割り込まれると考えるのがよさそうだ。


# 正直、プリエンプティブはまだ、あんまり調べられてません・・・
ブログ検索

プロフィール

ビンゴ中西
Perlが好きである。
プログラミング言語のほとんどは独学。独学の過程で多くのプログラム仲間にも色々教わりました。

FC2カウンター

カレンダー

06 | 2007/07 | 08
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31 - - - -

ブロとも申請フォーム

この人とブロともになる

| ホーム | 次のページ
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。