「class」を含む日記 RSS

はてなキーワード: classとは

2018-08-01

オブジェクト指向呪いと、その避け方」と、その読み方

http://mizchi.hatenablog.com/entry/2018/07/31/124354

念の為言っておきますOOP呪いについては特に異論はありません。

クラスしかメソッド所属できないモジュールシステム

古いJavaのような、クラスしかメソッド所属できないモジュールシステムばかりの時代じゃありません。 クラス基本的不要だと思います

Javaは今でも「クラスしかメソッド所属できないモジュールシステム」でしょ。クラスに属していないように見えるのは糖衣構文に過ぎない。

関数参照

https://twitter.com/mizchi/status/1024103868613812225]

オブジェクト指向呪いほとんどの言語モジュールシステムでは関数参照がそのままexportできるのに、すべての関数を static メソッドまたはクラスメソッドとして表現する人が未だに多く、見るたびに指摘してる…

関数参照ってなんですか?「exportする」ってそんなに一般的ではない気がする。

もしfunctionオブジェクトをimportするのを指しているのならば、所詮オブジェクトなので状態が含まれない保証はない。

関数参照 2

https://twitter.com/mizchi/status/1024104303907065856]

RubyJavaPHP でみたので一般的なアレなんだと思う

そりゃJSみたいに柔軟なインポートができる言語ばかりじゃないし…

classの導入

https://twitter.com/mizchi/status/1024151165703938048]

JS似非OOP慣習と向き合うのに class の導入は必要だったと思うけど、それはそれとして class 使わないのは別

これはそう。結果論的にはclassそもそも導入されるべきではなかった気もするけど。

ijk

https://twitter.com/mizchi/status/1024155163399876609]

Dijkstraのijkが好き

めちゃくちゃわかる

記事とは関係ない思い

湧いてきたら追加する

2018-06-29

from typing import Sequence


class ReverseSequence(object):
    def __init__(self, sequence: Sequence):
        self.sequence = sequence  # reference to container
        self.index = len(sequence)  # current index

    # Step 1. define __iter__ method whitch returns self.
    def __iter__(self):
        return self

    # Step 2. define __next__ method
    #             rasing StopIteration at the end of iteration.
    def __next__(self):
        if self.index > 0:
            self.index = self.index - 1  # next index
            return self.sequence[self.index]
        else:
            raise StopIteration


class ReverseSequenceGenerator(object):
    def __init__(self, sequence: Sequence):
        self.sequence = sequence
        self.index = len(sequence)

    def __iter__(self):
        while self.index > 0:
            self.index = self.index - 1
            yield self.sequence[self.index]
        raise StopIteration


assert list.__eq__(
    [element for element in ReverseSequence('spam')],
    [element for element in ReverseSequenceGenerator('spam')]
)

class Reverse:
    def __init__(self, data):
        self.data = data
        self.index = len(data)

    def __iter__(self):
        return self

    def __next__(self):
        if self.index == 0:
            raise StopIteration
        self.index = self.index - 1
        return self.data[self.index]


class ReverseGenerator:
    def __init__(self, data):
        self.data = data
        self.index = len(data)

    def __iter__(self):
        while True:
            if self.index == 0:
                raise StopIteration
            self.index = self.index - 1
            yield self.data[self.index]


assert [s for s in Reverse('spam')] == [s for s in ReverseGenerator('spam')]

2018-05-28

今日のできごと

t*お昼に書きます

name*ここは見出しです

[日記]

小見出しです。
さらに小さい小々見出しです。
名前個数
りんご1
みかんだいだい2

ここは引用文です。

ただのブロックとして使うこともできます

整形済みテキストです。
 class Foo
   def bar'baz' # return baz
   end
 end
 ||<

2018-05-23

[]uBlock Origin特定エントリーを隠す方法メモ

数ヶ月前のはてなブックマーク仕様変更で"はてなNG"などのChromeエクステンションが使えなくなったとかなんとかいう話を見た覚えがある。その後の展開は知らないけれど、今見たところ最終更新日2014年のままだからおそらくどうもなっていないのだろう。

WebExtensionsの知識もないので、出来合いの広告ブロックアドオンuBlock Originコスメティックフィルターを使って仕様変更後のはてなブックマークエントリーブロックする方法メモしておく。使ったブラウザFirefox 60だけど、他のブラウザでも似たような感じでできるのではないだろうか。

特定サイトエントリーブロックする方法

uBlock Originダッシュボードを開く。ツールバーアイコンアドオンメニューの設定ボタンから開くことができる。

My Filtersタブを開く。

例えば朝日新聞asahi.comブロックしたい場合、次の行を追加しApply Changesボタンを押して変更を確定する。

hatena.ne.jp##.js-keyboard-selectable-item:has(a[href*="asahi.com"])

ブロックしたいサイト増田(anod.hatelabo.jp)だとしたら次のような行を足すことになる。

hatena.ne.jp##.js-keyboard-selectable-item:has(a[href*="anond.hatelabo.jp"])

特定単語(NGワード)を含むエントリーブロックする方法

サイトブロックと同じくMy Filtersタブに移動する。

例えば「アメフト」を含むエントリーブロックしたい場合は、次の行を追加しApply Changesボタンを押して変更を確定する。

hatena.ne.jp##.js-keyboard-selectable-item:has-text(アメフト)

はてなブックマークエントリーリストページにはタイルリストヘッドラインと3種類の表示方法があり、htmlの書かれ方もそれぞれ違うが、class="js-keyboard-selectable-item"のli要素がどの表示方法でも共通して存在する。2018年3月以降のはてブページでエントリーブロックするためにはこの要素を指定して隠すのが手っ取り早い。広告ブロックソフトを使うにせよ、JavaScript自分で書くにせよそういう方針になると思う。

uBlock Originを使ったブロック欠点上記のように設定が若干難しいのと、はてなNGのようにID指定するだけでブコメブログも両方ブロックという芸当はできないことだろうか。ブコメブログをそれぞれブロックすることになる。利点は高速性を謳うuBlock Originなどの機能をそのまま使うので速度低下を最小限に抑えられることだろう。

anond:20180523190221

そこは枝葉末節で本題じゃないが、PHPであろうがそうでなかろうが

WEBにてロジックで表示を変更する場合classを追加するのが正道やぞ。

コードの中にガチでstyle書く奴いたら2018年の今はハンドスピナーの回転部分をミキサーの刃にしたやつを足元に大量に置いて回転させられるからな。

anond:20180523183538

俺は、設定にできるものロジックにするなと常々言ってるんだが、うちの若者にはあまり響かないんだよなー

$color_settings = [

  '土' => 'background-color:#ccf;',

  '日' => 'background-color:#fcc;'

];

$class = $color_settings[$day_list[$date]['week']] ?? '';

このほうがすっきりしていいじゃんかよー

日本語は、多言語対応する可能性が全く無いなら、書いてもいいと思う

2018-05-14

それを「見やすい」というのは残念ながら君含めてごく少数(たぶん5人くらい)

吉本コーディング

http://tsudoi.org/guide/detail/7.html

 

大前提として改行あけるよりもインデントの方が視覚的に分かりやすい、ソースを書いた本人だからそう思うだけ、親馬鹿効果

・インデントを前提とした設計がされているエディタをまるで考慮してない

・インデントを無くす代わりに余計なコメントを書いてソースを汚している

・みんなhtmlコーディングの話だと理解した上で言っている、自分が賢いと勘違いしすぎ、整形前のコードは万人に読みやすい支持のあるルール(W3C違反しない範囲)で記述するのは人として当たり前

自分けが分かりやすいと思うやり方にこだわるのは11年目からやめよう、製作必要なのは最適化自分が死んでも問題ない環境づくりの両立であって独りよがりの美しさは誰も求めてない

・インデントが多いと見づらいから勧めていたはずなのに、今はインデントが少ないから使え、という謎の野獣先輩理論、少ないからこそインデント問題ない

 

たぶん彼はある面では良い考えだがインデント排除することが見やすさの向上につながっていない、

もし少しでも記述を減らして早く書きたいのだったらコメントさえ使ってないはずだ。

ある程度の支持も得られたかもしれない。

特に開始タグの前にコメント必要ない、class名を見れば済む話なので必要なら閉じタグに書くべき。

コメント使用こそが薄々内心では分かりづらいと思った彼なりの妥協なのは明白。

 

あとどうしても深い階層になってしま場合スケールに合わせてファイルを分割したり共通かすればいいわけ

今どきhtmlだけしか使わないウェブサイトなんて存在せんだろう…。

 

それからアナティクスを下に書くな!

ちゃんGoogle推奨する位置に入れろ!

気に入らないなら無理に使わんでいい!

 

都合の悪いことは見なかったことにすんな

2018-05-13

いつもと違う言語コード書くのつらい(´;ω;`)

たまにRubyコード書いてるけど、毎回色々と忘れていてつらい。

はあ、やっぱりいつも書いてる言語でなんでも書きたいものだ。

2018-04-14

C言語とかJavaとかRubyAVが見たい(擬人化とかでなく)

C言語とかJavaAVが見たい。それは安易擬人化などでは決してなく、本当にC言語とかJavaとかRubyセックス描写しているものが見たい。

penis.insert(girl.getVagina());

とか

class Jk extends Woman implements Uniform

とか、

おっさんエンジニアが、上記のようなコードを黙々と書いていくのをひたすら鑑賞するの。

見たい。

2018-03-28

anond:20180328160908

デザインや見た目でclass名つけるなカス

お前は先方が「やっぱテーマカラーは赤じゃなくて緑にしてください」っていったらredクラスに緑のカラーコード入れるのか?

anond:20180328160144

CSSJavaScript(もしくはjQuery)とかじゃなくてHTML

HTML5リファレンス見ながら組むのと、class名に「背景が赤だからred」とかつけなかったらそれでいいんじゃね?

2018-03-22

プログラム勉強する人って、まず何するの?

本を読むとかネットで調べるっていうのも分かるんだけど

どうも身につかないというか、納得できなくて困る。

VBA簡単だけどさ…C#とかCとかJavaとかさ……Classとか訳分からなくなるわ。

皆どうやって勉強してるの?

ゲームエンジンとかその他も良くわかんない。

欲しい情報ピンポイントで手に入らなくてイラついて終わる。

2018-02-07

はてなブックマークタグを一括置換するiMacrosのコード(無保証)

何で一括置換機能消えたん……

VERSION BUILD=1001 RECORDER=CR
SET !REPLAYSPEED MEDIUM
SET !ERRORIGNORE YES
URL GOTO=http://b.hatena.ne.jp/username/OKIKAE/
TAG POS=1 TYPE=A ATTR=CLASS:js-keyboard-entry-page-openable
TAG POS=1 TYPE=IMG ATTR=ALT:ブックマーク編集
TAG POS=2 TYPE=LI ATTR=TXT:OKIKAE
TAG POS=1 TYPE=LI ATTR=TXT:オキカエ
TAG POS=1 TYPE=INPUT:SUBMIT FORM=ACTION:/my/bookmark ATTR=*
WAIT SECONDS=20

ユーザ名usernameで使用してる「OKIKAE」タグを「オキカエ」に一括置換する場合Chrome版で実行済み。最後20秒待ってるのは、置換後に一覧ページへ反映されるのが遅れる為。

ただ自分でやった時(当然ユーザ名・タグは別の名前)に、2013年11月頃の分で一向に置換されないままループしたりで安定しない。

2018-01-14

anond:20180114180633

classがあってprivateな変数メソッドがあるのがオブジェクト指向だと思ってる

クラスプロトタイプベースから無い。

ただES2015から糖衣構文としてClassは使えるようになった。

プライベート変数は今後実装される。プライベートメソッドは知らない。

まりES2015以降とそれ以前ではJavaScriptと言っても全く違う言語ってことだな。

anond:20180114175519

classがあってprivateな変数メソッドがあるのがオブジェクト指向だと思ってる

Typescritはそれっぽい(?)JSはそこまで詳しく知らない

2017-11-24

はてなブックマークCSSデザイン統一について

ここのところ思い出したかのように時々リニューアルが行われてるはてなブックマークデザインだけどさ。

少し前にリニューアルされたお気に入りページは、#left-container #center-container #right-container って、要するにdivタグidを振り分けて3ペインデザインを実現しているんだけれども、先日リニューアルされたユーザーブックマーク一覧ページは .left-container .center-container .right-container って、divタグclassを振り分けて3ペインデザインを実現しているのね。

こういう全体で1度しか使わないデザイン上の区切り指定するのにidを振るかclassを振るかってのは正直好みの問題でもあって、header,footer的なものidから3ペインidだろとか、優先順位とか管理やすいかclassでもいいだろとか宗教問題にもなりそうではあるんだけれど、同じ会社が作っている同じサービスほとんど同じページ表示に別の形式での記述がされているのはデザイナー間での事前定義と言うか意思疎通がされていないってことでもあってかなりマズいことじゃないのかな。

何かリニューアルするたびに「まともに仕事できないのかはてなデザイナーは」って揶揄されるけど、実際はてなデザイナーチーム、チーム内で大変なことになってるんじゃないか経営陣その辺ちゃんと把握してるか?

2017-09-14

引数が可変のメソッドを作りたい

引数がA,B,C,D,Eあるとして

A,Bだけ渡したら、内部でC,D,Eを自動的解釈するメソッドが作りたかった

 

これ、例えば

func hogeAll(A a, B b, C c, D d, E e) {

 全部入りメソッド

}

func hoge(A a, B b) {

 ここでhogeAllを呼べば解決する

}

 

んだけど、ABCDE全てに対して有/無のメソッドを全て定義すると果てしなくなる

これをスッキリ書ける言語ってのを知らない

 

方法があるとしたら引数Classを作ってしまう手がある

実際にこれはよくやられると思う

 

HikisuClass hikisu = HikisuClass.create(a,b)  // これで内部で自動的にc,d,eを解釈する

 

でもメソッド一個のためにクラスを作るのってクソ面倒だなと思う

もう一個方法があるとしたら、Classに値を入力したあとメソッドを実行する方法

 

Hoge hoge = new Hoge()

hoge.a = a

hoge.b = b

hoge.do()

 

しかしこれも長くなり煩雑だ、結局

hoge(a,b,null,null,null) みたいなことになりそう

 

ちなみに何でそういうことをしたいかと言えば、自然言語がそうなってるから

大抵の引数が省略されるし、省略されたりされなかったりする、非常に柔軟なんだ

もちろん受ける側の作り込みが大変になるが、ちゃんとリーダブルに作ろうとしたらそっちのほうが良いんじゃないかと思える

引数のoptional,require指定できればもっと良い

例えばコンソールで使うオプションとかって自由だよなあ

 

これってポリモーフィズムあたりの話か?

 

___

 

追記:

あ、DIコンテナみたいな話かな

でも結局煩雑だし使いたくない

2017-09-12

はてブスター通知がちらちらして心に悪い

のでAdblockで消してもらいましょう

hatena.ne.jp#span(class=notify-count)

すっきり

2017-06-06

ジェネリック医薬品.java

interface 頭痛薬 {}

class バファリン implements 頭痛薬 {}

class バッサニン implements 頭痛薬 {}

class 薬瓶<T> { /* 中略 */ }

public class Test {

  public static void main(String[] args) {

    薬瓶 頭痛薬入れ = new 薬瓶<頭痛薬>();

    頭痛薬入れ.add(new バファリン());

    頭痛薬入れ.add(new バッサニン()); // バファリンとバッサニンは成分が同じなので、同じ薬瓶に入れて混ぜて服用しても問題ない

    System.out.println(頭痛薬入れ.size()); // 2

  }

}

2017-05-10

トラバ書こうとすると元増田が何言ってたか一瞬で忘れる

greasemonkey書いて戻るボタンさなくて良くした。

// ==UserScript==
// @name         anond easy track back
// @description  anond easy track back
// @namespace    http://anond.hatelabo.jp/
// @include      http://anond.hatelabo.jp/*
// @require      https://code.jquery.com/jquery-3.2.1.min.js
// ==/UserScript==

(function() {
    var url = window.location.href, isEditPage = url.slice(url.lastIndexOf('/')).startsWith('/edit');
    if (isEditPage) {
        appendTrackBackContent();
    } else {
        appendEditLink();
    }
})();

function appendTrackBackContent(){
    var postId, match = $('#text-title').val().match(/anond:(\d{14})/);
    if (match.length>1){
        postId = match[1];
    } else {
        return;
    }
    jQuery.ajaxSetup({async:false});
    var content = '';
    $.get('http://anond.hatelabo.jp/' + postId, function(data){
        var section = $(data).find('.section');
        var title = $(section).children('h3').text().slice(1);
        $(section).children('p:not([class])').each(function(idx, val){
            content += $(val).text() + "<br/>";
        });
        content = '<hr><h4>' + title + '</h4><p><small>' + content + '</small></p>';
    });
    jQuery.ajaxSetup({async:true});
    $(content).insertAfter('.post-submit');
}

function appendEditLink () {
    var masudaId = $('#bannersub .username a').text();
    $('h3').each(function (idx, val){
        var postId = $(val).children(":first-child").attr("href").slice(1);
        $(val).append(' <a href="http://anond.hatelabo.jp/' + masudaId + '/edit?title=Re: [anond:' + postId + ':title]">\u2190</a>');
    });
}

タイトルに「anond:14桁の番号」があったらそっから引っ張ってきて画面下に表示する。

大なり小なりとかがエンコードされてるけど普通に表示する方法よくわからない。ちなみに直さないと使えない。

http://anond.hatelabo.jp/20070612084049

一部これの真似

2017-05-09

JavaScript簡単SPAフレームワークってありますか?

勉強が不得意な職業プログラマですが、WindowsアプリSPAに作り替えることになりそう。

プロジェクトメンバー積極的技術習得するような人はいないので、簡単フレームワークを探しています

↑に近いようなフレームワークありませんか?

2016-11-13

スパムの消し方を教える

1.TampermonkeyまたはGreasemonkeyを導入する

Tampermonkey

https://chrome.google.com/webstore/detail/tampermonkey/dhdgffkkebhmkfjojejmpbldmpobfkfo?hl=ja

Greasemonkey

https://addons.mozilla.org/de/firefox/addon/greasemonkey/


2.次のスクリプトを追加する

// ==UserScript==

// @name unvisualizer

// @namespace http://anond.hatelabo.jp/

// @description unvisualize section including specific word at Hatelabo::AnonymousDiary

// @include http://anond.hatelabo.jp/*

// @exclude http://anond.hatelabo.jp/hatena/*

// ==/UserScript==

(function() {

var target = document.evaluate(

"//div[@class='section' and descendant::*[contains(text(),'Troyes') or contains(text(),'fiorentina') or contains(text(),'genoa') or contains(text(),'forums.zoho') or contains(text(),'medhelp.zendesk') or contains(text(),'.co.uk/') or contains(text(),'elbertcountyrepublicans') or contains(text(),'purob.com') or contains(text(),'imvu.com') or contains(text(),'thelittleonescollection') or contains(text(),'nfyi.org') or contains(text(),'usa-fox-tv.kinja.com') or contains(text(),'livestream1.odiblogs.com') or contains(text(),'reddit.com') or contains(text(),'huffduffer.com') or contains(text(),'healthunlocked.com')or contains(text(),'surveymonkey.com')or contains(text(),'yakmari.kinja.com')or contains(text(),'putlockeronline') or contains(text(),'freefullmovies.website') or contains(text(),'change.org')or contains(text(),'nervefullmovie.com') or contains(text(),'navtv.co.za')or contains(text(),'Hrvatska')]]",

document,

null,

XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,

null);

for(var i=0; i<target.snapshotLength; i++) {</p>

target.snapshotItem(i).style.display = "none";

}

})();

// or contains(text(),'')


3.スパム投稿が表示されなくなる

ついでにこの記事も消える

NGワードは適宜追加してください

参考

http://anond.hatelabo.jp/20070517234726

2016-10-14

Bootstrapの div class="col-md-4" って font color="red" とどう違うの?

表示にの関係するclassって意味と見た目の分離も何もなくね?

classと別のstyleclassみたいな属性があってCSS適用させたいだけならそっち使うみたいにするのが理想

2016-06-17

1.0から学ぶJava

タイトルを見て釣られクマーな皆さんこんにちは

ホッテントリメーカーで作るような煽りタイトルって、みなさんもう見飽きてると思うんですよね。

今調べたらホッテントリメーカー2008年だそうで。どうりでねー。古臭いなーと思いましたよー。

「一から学ぶJava」ってのをね、1.0にするだけでこんなに素敵なタイトルになるんだから面白いですねー。

タイトルを思いついただけだったんですけど、思いついたらやっぱりちゃんと中身も書かないと行けないじゃないですか。やだー

面倒くさいんですけどね。ちょっと1.0から学んでみましょうか。

Java 1.0 1996年1月23日

Javaの1.0がリリースされたのは1996年1月23日ですね。発表されたのが1995年5月23日でJavaの誕生日といった場合にどちらを取るかで揉めることがあります。

かれこれ20年前なわけで、当時のパソコンというとハードウェアはCPU が Pentium 133MHz メモリ16M とかそんな感じだったかなあ。今どきの携帯電話の例としてiPhone 6sを挙げるとCPUが1.85GHz メモリ 2G ってんだから凄いですね。OSは1995年11月23日リリースされたWindows95とかそんな時代背景です。インターネットがようやく一般に普及し始めたところでしょうか。

今から思うと相当弱いハードウェアですけども、そろそろVM方式を採用しても良さそうな、そんな時代でした。インタープリタだと流石に遅い、でもC言語のようなコンパイル言語だと"Write once, run anywhere"とはいかない、という判断もあったのだろうと思います。Javaが純粋なオブジェクト指向言語ではなくintなどのプリミティブ型を持つというのは、当時のマシンスペックを考えた場合、ある程度妥当な判断だったと言えるでしょう。これが後々苦しくなってくるわけなのですが。

Javaを作った会社はSun Microsystems(サン・マイクロシステムズ)というアメリカの会社で、2010年1月27日オラクルにより吸収合併され今はありません。SolarisというOSとSPARCプロセッサでUNIXサーバーの販売で90年代後半までは一人勝ちのような状況だったと聞きます。当時にすでに「ネットワークこそがコンピュータ」(The Network is the Computer)というモットーを掲げてたんだからおかしい。1996年リリースのJavaが標準でネットワーク機能を備えていたのもこのあたりの思想から来ているのかもしれませんね。

当時のプログラミング言語としてC++が挙げられますが、C++でのプログラマへの負担といいますか、ヒューマンエラーの起きやすさといいますか、その辺を改善する目的で開発されたのがJavaだったわけです。

1996年の時点にこんな言語が登場したのですから革新的でした。

いろんな企業がJavaに賛同します。その中にはMicrosoftもありました。この時期、Microsoftは次期のWindows開発用のプラットフォームにJavaを据えようと考えていました。その後、袂を分かつことになるのですが……。

プログラム言語として構文などを見ると、C++を強く意識した構文なのは間違いなく、しかしポインタ演算を廃してポインタを機能を限定した「参照」に置き換えるなど簡素化が多く見られます。C++からはいろんな機能が削られています。関数ポインタ、構造体、演算子オーバーロードテンプレート((テンプレートについては実装が間に合わなかったという話を聞きます))などなど。そのためC++の劣化であるように揶揄する人もいますが、こうしたものを捨てて言語仕様を比較的小さくシンプルに抑えた点は評価に値すると思います。しかし、今でもこうした削減された機能を愛する人からはJavaを腐す要素として挙げられてしまうのでした。

Java 1.1 1997年2月19日

Wikipediaからピックアップすると1.1での大きな機能追加は

といったところです。当初よりJavaの内部文字コードUnicodeで文字を表すchar型は16bitで設計されていました。Unicodeは当時それほど普及しておらず、Unicode対応のテキストエディタさえ少なかったと記憶しています。時代を先取りしていると言えますが、大きな誤算はUnicodeが当初16bitのコードポイントに世界のあらゆる文字を格納しようとしていたことで、漢字圏の我々からすると16bit=65,536程度の空間に文字が全部入るわけないだろ!というものだったが故に早々に破綻し、Unicodeは21bitのコードポイントに拡張されることになるのです。これはまた後の話。

なんにせよ、日本語が対応されたのは1.1からで、日本でのJavaの採用が始まったのはこの頃からと言えましょう。

当時のJavaのGUIはAWTというものでしたが、これを用いたGUIの開発は当時は結構行われていたイメージですね。Visual BASIC でGUIを作るプロダクトも結構あったと思います。GUIのためのオブジェクト指向言語としてJavaが使われていたイメージがありますね。JavaBeansもそのための仕様でした。件のsetter/getterの話題に繋がっていくのですが。

JDBCはJavaとデータベースをつなぐインターフェースです。RMIではあるJava VMから別のJava VMにオブジェクトを送って実行する、といったことができます。こうした機能が用意されたことで、ソフトウェアフロントとしてのGUI、裏方の実装のためのネットワーク機能、データベース機能、さらにはソフトウェアを配布するためのJava Appletという布陣でJavaでのソフトウェア開発が加速していた時代といえます。

Microsoft Visual J++ もこの時代ですよ。

Java 1.1以降のバージョンのものは互換性確認のためにOracle Java Archiveからダウンロードすることができ、今でも入手することができます。もちろん、Java7ですら2015年4月にEOL(End of Life,サポート終了)となっているので、通常利用するのはJava8としてください(本稿執筆時点)。

当時のドキュメントを見るのも一興です。現在と比べると標準APIがかなり小さい。なお、当時のjavadocは今とはデザインが大きく異なります。

  • java.applet
  • java.awt
  • java.awt.datatransfer
  • java.awt.event
  • java.awt.image
  • java.beans
  • java.io
  • java.lang
  • java.lang.reflect
  • java.math
  • java.net
  • java.rmi
  • java.rmi.dgc
  • java.rmi.registry
  • java.rmi.server
  • java.security
  • java.security.acl
  • java.security.interfaces
  • java.sql
  • java.text
  • java.util
  • java.util.zip

この時代であれば、全パッケージを舐めて標準APIを学ぶこともそう難しくはありませんでした。この時代から触っている人間は新バージョンが出るたびに増えるAPIを順に学んでいけたのです。しかし、現代にJavaを学ぶ場合、どのバージョンでは何があって……というのをいちいち学ぶ必要はほぼありません。Java5以前は一緒くたでいいと思いますし、一部のAPIで歴史的経緯があってねーというのを知っていればおそらく十分ではないでしょうか。

Java 1.2 1998年12月8日

strictfpキーワード浮動小数点演算をやる人は覚えておきましょう。JavaはパフォーマンスのためにCPUの浮動小数点演算を扱うことが許されており、そのため実行するCPUによって精度が異なることがあるんですね。まあ今時のCPUだと大丈夫だとは思うんですが。

リフレクション機能ではJavaのクラスを抽象的に扱うことができます。設定ファイルに書かれたクラス名のclassロードして実行する……みたいなことができるんですね。フレームワーク的なものを作る場合には多用することになります。

1.2からは新しいGUIのSwingが採用されました。AWTがOSごとのGUIパーツを用いていたためデザインに違いがあったのに対し、Swingでは統一的なルック・アンド・フィールが用いられるようになりました。まぁ今ならJavaFXを使うのが良いと思います。

初期のJavaはやはりVM方式の実行速度の遅さが指摘されていました。実行時の構文解析を伴わないだけインタープリタよりは早いものの、実行バイナリを作るC/C++よりは遅い、そうした評価です。ここではサン・マイクロシステムズのVMにJIT(ジャストインタイムコンパイラ)が乗ったことが挙げられていますが、JIT自体は別の会社が先駆けて開発していたことは記しておきたいと思います。

JITコンパイラは実行時にJavaのバイトコードを環境のネイティブコードコンパイルして動かす技術です。この後、JITコンパイラ、動的再コンパイル技術、世代別ガベージコレクションを備えたHotspotといった様にJavaVMは進化していきます。現代では実行時の最適化が進み、大きなスケールで見た場合、Javaの実行速度はC/C++での実装と比べてそれほど遅れるものではありません。遅くても倍の時間は掛からない程度といったところでしょうか。

あとは特記すべきはコレクションフレームワークです。皆が多用しているであろうjava.util.Listやjava.util.Mapといったライブラリが整備されたのがこの時なのです。それ以前はjava.util.Vectorやjava.util.Hachtableというクラスが可変長配列の機能を一手に担っていました。今ではVectorやHashtableは使うべきではありません。

Microsoft 離反

Java の開発はSun Microsystems が主導していたけども、すべてがSunのものだったというわけでもなく。Javaには多くの会社が出資していてその中のひとつMicrosoftだったわけですね。

Microsoft の Visual J++ では delegate とか独自機能拡張もありましたけど、裁判で問題になったのは J++ でコンパイルしたclassファイルMicrosoftのVMでしか動かないという部分ですね(他社製のVMで動くclassファイルを作ることもできる)。classファイルがどこのVMでも動くの大事だろ、"Write once, run anywhere"だろ、お前何してくれてんの!と喧嘩になったわけです。当時のMicrosoftブラウザまわりでも独自拡張がやりたい放題、標準規格?なにそれ美味しいの?みたいなスタンスをあちこちで見せていたものです。

結局、この事件でMicrosoftのJavaはバージョン1.1相当でストップ。好き勝手にやれないなら独自に言語作るわーとばかりに.NET フレームワークと C# といった方向に舵を取ります。

JavaがPC上でのUI開発の主力になろうとした勢いはここで潰えます。

Java EE

Java SE とは別にこの時代に Java EEリリースされていることは特記しておきたいですね。これ以後、それまでのCGIに取って代わって、JavaはWebサービスの開発のプラットフォームとして多用されるようになります。

2000年あたりからはJavaはGUI開発というよりは、Webサービスの開発が主流という流れになっていきます。インターネットサービスが非常に発達していった時代、背後ではとてつもない量のJavaのプログラムが支えていたわけです。ただまあ、こうした産業利用は一般的ユーザーの目にはあまり入らないわけです。一般人からすればJavaといえばJava Appletみたいなイメージはずっと残っていたでしょうが、実体としてはJavaといえばServletという時代になっていたわけです。

企業で用いられる社内システムにもServletは多く採用されました。

理由はいろいろ挙げれると思うのですが

というのが大きな理由だろうと思います。JSPというテンプレートエンジンを用いてHTMLを整形してWebページを作り出す、というアーキテクチャある意味では便利で簡単でした。

もっともHTMLの表現力に足を引きずられるため、GUIの機能性という点では後退したわけなのですが。それでもメリットが大きいと判断されたのでしょう。というか、まともにGUIを組めるプログラマがほとんどいないから、GUIのシステム開発がなかなか成功しないってのもあったんでしょうけどね。

iアプリ Javaアプリ EZアプリ

2000年あたりというと携帯電話の普及も取り上げなければなりません。現代のスマホガラケーに比べれば非常に機能は貧弱で、まさに携帯「電話」でした。要するに電話とメールぐらいしかできなかったんですね。

そこにdocomoiアプリJフォン(ボーダフォンを経て現ソフトバンク)のJavaアプリ、auのEZアプリという携帯電話上でちょっとしたアプリが動くよ!というのが乗るようになってきたんです。これがJavaを組込み用途にコンパクトにしたJava MEというものが土台となっていて(正確にはiアプリちょっと違う)Servletと並ぶJava言語の大きなもうひとつの領域となっていました。

iアプリは当初は容量が10k byteまでといった制約があり、容量制限が非常に厳しかったのですが、新機種が出るたびに容量は緩和されていきました。

docomoiアプリ含めiモードによって一世を風靡します。こうした土台を作ると、その上で商売をしたい人がたくさんやってきて、勝手にコンテンツを作ってくれる。docomoはそれらから手数料を取るので労せずして大金を稼げるというわけです。賭場の胴元というわけです。

この賭場が、将来にAppleiPhone, GoogleAndroidに荒らされることになります。docomoがなかなかiPhoneを出さなかったのもiモードという自前の賭場を失うことを良しとしなかったためです。金づるを失ったdocomoSamsungと組んで独自の携帯向けOSであるTizenの開発に乗り出します。そんなTizenですが鳴かず飛ばず。噂ではインドあたりではリリースされたとか、なんとか。

RIA時代

話を2001年に戻しましょう。

Microsoft離反でGUIのプラットフォームとしてのJavaというものは存在感を弱めていました。この分野の復権に寄与したのはJava 1.4 (2002年2月6日)で導入されたJava Web Startです。

Java Appletブラウザ埋め込みで動作したのに対し、Java Web Startではブラウザから起動しつつも独立したアプリとして起動するのです。

Webシステムが企業の社内システムに採用された話は先に述べたとおりですが、やはりWebシステムのGUIというのはHTMLに引きずられて貧弱だったんですね。

端的に言えば入力値が数字かどうか?みたいなチェックがなかなか難しい。HTML上でJavaScriptでやるわけなんですが、なかなか気持よく入力できるような感じにはならなかったんですね。

また、Ajaxによるブラウザのページ遷移を伴わない通信というのが出てきたのも2005年ぐらいなので、入力値に対してサーバ問い合わせするようなことはできなかった。当時だと一旦画面遷移させないとできなかったわけです。

こうした事情から、クライアントサイド、要するにPC側でもっとリッチなUIが使いたい!という要望があったわけです。Webシステム使いにくい!という不満の噴出と言ってもいい。そこで出てきたのがRIA (Rich Internet Applications)というわけです。

Javaは1.0時代のAppletからそうですが、ネットワークを介して別のPCにプログラムを送り込み、そこで動作させるという能力を持っていました。それこそまさにRIAに求められる機能性だったわけですね。

RIAの代表とされるのは

あたりです。三つ巴の戦い、どこに軍配が上がるのか!?と注目されましたが、勝利したのはHTML / JavaScriptでした。

Google MAP で注目を浴びたAjax技術、それまでブラウザでは不可能と思われていた高級なGUIをHTML / JavaScriptで実現させました。もうやめて欲しいですよね。せっかく脱ブラウザの流れが来たと思ったのにまたWebシステムに逆戻りですよ。

RIAが失速した理由として考慮して置かなければいけないのはスマートフォンの台頭です。RIAでは端末を選ばずどこでも同じアプリが動かせる点がポイントひとつでしたが、スマートフォンではそうは行かない。"Write once, run anywhere"を破壊したのはスマートフォンだったというわけです。

しかし、先日インストールなしでアプリを実行するAndroid Instant Appsが発表されたりしまして、結局RIAの思想といいますか、要求というのは今でも息づいているのだなと思った次第です。

Java 5 (2004年9月30日)

1.3 / 1.4 では機能追加はあっても言語構文が大きく変わることはありませんでした。大きく変わったのはJava 5です。この時からバージョニングが変わって1.5ではなく5と表記されるようになりました。

Java5の特徴はなんといってもジェネリクス。それまでjava.util.Listにデータを出し入れするのにはキャストが必須だったわけですが、ようやくキャストから開放され型の安全度がぐっと高まりました。その他に以下のような変更があります。

言語としては随分変わっったわけですが、もうかれこれ10年以上前のことですからこれらの機能が「Java5から導入された」という知識は今となってはあまり必要とされません。これらの機能が使えないJava 1.4で開発をする事案が殆ど無いからです。0ではないのが悲しいところではありますが。

その後

Java 6 (2006年12月11日)がリリースされた後、Java 7 (2011年7月28日) が出るまでJavaは停滞してしまいます。その間にSun Microsystemsという会社がなくなってしまったためです。

Sun Microsystems の経営状況が悪化しており、ついに身売りをすることになりました。身売り先はIBMともGoogleとも噂されましたが結局2010年1月27日オラクル吸収合併されました。

Javaの停滞中にはJava VM上で動く非Java言語も台頭してきました。Scalaなどですね。

やや戻って2007年Androidが発表されます。Androidの開発言語にはJavaが採用されていますが、実行環境はJava VMではなく、ライセンス的な事情でJava(TM)は名乗らない微妙な位置関係にあります。

Java 5 以降で大きく言語仕様に手が入るのは Java 8 (2014年3月18日)です。並列処理を行うためのStream APIと、そのために簡易に関数を定義するためのラムダ式が導入された点が大きいですね。日付APIも刷新されました。

このように、Javaは1.1の黄金時代から今に至るまで利用ジャンルを転戦しながら産業の土台となって支えてきた歴史があります。ジャンルの趨勢により浮き沈みもあります。今後についても決して楽観視はできないでしょう。Javaを学ぶことはプログラミングを学ぶステップとしては意義はあると思いますが、Javaを学べばゴールというわけではありません。プログラム言語次世代へと移りつつあります。業界動向には注視していきましょう。

ログイン ユーザー登録
ようこそ ゲスト さん