fc2ブログ
プロフィール

けい

Author:けい
公開したWebサービス・アプリ一覧はこちら

※2014年12月、私が個人で開発したWebサービス・アプリへの
累計アクセス数は8億を超えました。
負荷対策頑張ります。日々精進していきます!!


■■■ 業務経歴 ■■■
社会人1年目:携帯電話開発。画面周りを1年間
2年目 :海外向け携帯電話ミドルウェア開発
     ブラウザとプロトコルスタック周り
2年目後半~:携帯電話の通信専用チップ開発
3年目:カーナビ。画面周りの開発
3年目後半~:BDビデオカメラ
     組み込みLinux カーネルと
     ドライバの開発。
4年目12月:プロジェクト途中で退社
~ここまではC、またはC++で開発~

~ここからJavaがメインの開発~
4年目1月:Web系の会社に転職
       ~4ヶ月間の研修
5年目5月:製造業向け生産管理システム開発
6年目9月:証券会社向けシステム開発
7年目10月~携帯電話向けコミックサイトの運用・開発
8年目12月:プロジェクト途中で退社

~ここからPHPがメインの開発~
8年目1月~仲介手数料が無料の不動産屋の社内SEに転職
交渉しほぼ完全に裁量労働が可能な立場になる。
業務内容はシステム全般ですが、
最近はSEO対策の作業が多いです。
現在14年目 まだ、しばらくはこの会社に居るつもりです。

あと、全ての記事がリンクフリーです。

最近の記事

過去ログ

全ての記事を表示する

全ての記事を表示する

カテゴリー

FC2カウンター

RSSフィード

Vista到来。もうスワップ領域必要無い人多いよね?

どうも、新しいパソコンでVistaがものすごく快適に使えてしまっているけいです。
いや、今の言い方は御幣があるな。
Vistaの機能は全然使っていない。
むしろうざったいのでAeroもOFFだし、アニメーションも無しだ・・・これ何てwindows2000?
また、VistaではXP,2000で使用可能なのに起動できないソフトはいっぱいあるし、
正直、もうちょっと枯れてからインストールすればよかったかなーという、後悔の気持ちもあります。


前置きが長くなりました。
今日はメモリ大容量化時代のスワップパーティションの切り方、PCの使い方についてのお話です。

Vistaの発売により、PCの標準搭載メモリが大容量化しますが、
意外とパーティションの切り方にこだわりを持っている人が少ないようです。
というのも、最近自分の周りにもLinuxを使っている人が増えているんですが、
未だに雑誌とかにはスワップ領域はメインメモリの2倍とか書いてある雑誌が多いせいで
ありえねーというくらいのスワップ領域を切っている人がいたりします。
そもそもスワップの働きを知っていたら、そんなに大容量で切っても意味がないことはわかるはずなのですが。

2008/2/16 追記 前提知識
オペレーティングシステムによっては、
空きメモリがある場合でもスワップデバイスが使用されることがあります。
スワップデバイスを「使用しない」という選択肢は
高速化に繋がります。


1:メインメモリの容量とスワップの歴史
※1アクセスが集中するサーバー用途では
あらかじめスワップを使わないようにメモリ容量を把握して環境を設計するのが普通なので、
個人用用途に限定して記載いたします。

※2 windowsの場合にはカーネルが使用するメモリ量が不明で、
メジャーバージョンがあがるたびにメモリ使用量が増大するため、
Linuxを例にとって説明いたします(Linuxのカーネルサイズ、
インストール直後のメモリ使用量などはCUI環境ならば昔からほとんど変化が無いため)。

メインメモリ64MB以下時代
古いマシンでメインメモリが64MB以下の場合、
OS(カーネル)環境自体が結構メモリを使ってしまうため、
スワップ領域がメインメモリの2倍というのは仕方が無い状態でした。
そのためCUIをメインにする人が多く、
GUI環境を好んで使う人はそれほどいませんでした。
この時、重いウィンドウマネジャー(gnomeとか)を使っていた人は、
メインメモリがHDDだ!と言わんばかりのスワッパーでした。

メインメモリ128MB~384MB時代
これくらいの容量になってくると段々とスワップを減らすような方向に考える人が多くなってきました。
メインメモリの20倍以上も低速なHDDをメインメモリのように使うのはナンセンスだと考えたためです。
swap容量としては64MB~128MB程度。
このswap領域の用途は緊急時に無いと困るからなどの理由でとりあえず取っているだけで、
swap領域を使わないでも大丈夫なように、
メモリ量を意識した使い方をする人が増えました。
またウィンドウマネジャーを導入する人が増えました。

メインメモリ512MB時代
本格的にスワップが不要であると議論がなされるようになりました。
実際にスワップ領域を作らない人も多く、
スワップを使用しなければいけない使い方は、
そもそもの構成や環境の作り方が悪いのだというような意見が広がりました。

メインメモリ1024MB以上 近年
もはやスワップが不要であるとの認識が完全に広がっていて、
個人用PCで1024MB以上もあってメモリが足りないのならば、
プロセスが把握できていない、
もしくはリソースの構成が悪いとしか思われなくなりました。
これくらいのメモリ量になってくると、windowsでもスワップ不要だと考える人が多くなりました。
ただし、本日発売のVistaがメモリを600MB程度使用する勢いなので、
再度、スワップが必要だと言う議論が巻き起こりそうです。


2:パーティションの変化
スワップが不要となったことにより、
パーティションの切り方も変わりました。
そういえば、パーティションの切り方のコツってもう10年以上変わっていなないはずなので、
10年ぶりの変化となりますね。

旧来の理想的なパーティションの切り方
Windowsの場合もLinuxの場合ももっとも高速に動作する最初のパーティションをswap領域とします。
※Windowsの場合は、OSのインストール後にswapパーティションの変更を行う必要があります。
アプリやデータは全て3に置いておきます。

1 swap領域
2 OS領域
3 データ領域

新・理想的なパーティションの切り方
1 ブート・OS領域
2 データ領域


3:使用方法の変化
 使用方法に関してですが、これだけのメモリ量があるので、
HDDからのアクセスを可能な限り減らすように使うのがコツとなります。
つまり、最初にアプリを大量に立ち上げてパソコンの終了時まで閉じないような使い方です。
これだけのメモリ量があれば、メモリが足りなくなると言うことはそうそうないでしょう。


まとめ
メモリ大容量化時代でのパーティションの切り方、
パソコンの使い方は理解していただけたと思います。
常に以下のキーワードを頭に入れておくと、
もっと効率のいいパソコンの使い方ができるでしょう。

1:メモリの転送速度は平均的なデュアルチャンネルメモリPC2-5300(DDR2-667)ならば 10.6GB/s
2:HDDの転送速度は3.5インチならば良くて 60-70MB/s 程度
2.5インチならば 30-45MB/s程度

つまりHDDはメモリの160倍も遅い

さらにノートパソコンならば260倍も遅い

3:高速化するパソコンのパーツの中で、
主要パーツでありながら、この10年間でもっとも進化していないものはHDDの転送速度である。
その低速な進化はCPUが5年で10倍の速度になるのに対し、
HDDは2倍であるとよく対比される。

この先もHDDの転送速度と

メインメモリの転送速度差はさらに広がる


一応、RAID0とかを用いればこの辺の問題は少しだけ緩和されるのですが、
それでも遅いことには変わりませんし、
HDD 自体がそれほど安くないため、
「起動時アプリ大量立ち上げ方式」での使用がもっとも高速に使用できるのではないかと思っております。
いずれにしてもこれだけHDDが遅く、メモリが安いのならば
メモリを買い足したほうがいいです。
1Gで3500円くらいですし。
タスクマネージャー見てプロセスが~とか言っている方が
時間が勿体無いですよ。

・・・Vista発売後、「起動時アプリ大量立ち上げ方式」って言葉が流行しないかなぁ・・・
スポンサーサイト



トラックバック(0)   コメント(2)   2007.01.30    [ Myカテゴリ:試してみた ]

久しぶりにVeoh、stage6を使ってみる。

どうも。最近、国内でもyoutubeに似たサービスが星の数ほど出ているらしいですが、どうせ規制規制ばっかりでつまらないと思っているので試してみる気もしないけいです。

さて、今日は久しぶりに高画質動画配信サービスである stage6とveohを使ってみました。
以前veohを試したときには、まだベータ版という感じがありましたし、stage6のコンテンツ数も多くなかったため、
今はどうなっているのかが気になったからです。

まずveohを使って見たところ、
以前はブラウザ上では途中までしか見れなかった映像が、ブラウザ上で最後まで見れるようになっており、より使いやすくなっていました。

また、以前、怪しい動作をしていると書いた
veoh のダウンロードソフトである
veoh client service の動作はどうなっているかと言うと、

veoh


・・・相変わらず、読み取りバイトのほうが多いと言う奇妙な動作をしております。で、気になったのでネットワークに送信されているデータを調べたところ、ネットワーク上には受信データをアップロードはしていないことが確認できました。なので、このまま使い続けても問題なさそうです。


次にstage6を使ってみました。
一時間ほどみてみたところ、コンテンツ数も格段に増えており、コンテンツ数の問題は解消されたようです。ただし、ファイルの検索がveohに比べてやりずらく、目的のファイルを見つけにくく感じました。

veohならば、キーワードのほか、動画の再生時間、カテゴリー(ジャンル)、ファイルフォーマットなどの検索条件をつけられるのに対し、stage6ではジャンルとキーワード検索しかできません。
そのため、1分くらいの頭だしみたいなファイルと、2時間のファイルの区別ができませんでした。これは結構不便に思えます。ダウンロードはstage6の方がブラウザ上からそのままダウンロードできるので、専用ソフトが不要な分取っ付き易いですね。

またダウンロードに関してですが、veohには強力なSeriesダウンロード機能があります。これは特定のユーザーがアップロードしたファイルをすべてダウンロードすることができる機能です。
例えば「24」というドラマをSeason1~5まで誰かが字幕をつけてアップロードしたとします。するとこれらのファイル全てを、一括でダウンロードできます。これはかなり強力な機能です。


Series.jpg



ALLvideo





・・・ところで、Stage6に日本人が異常に多いのは気のせいなのだろうか・・・
popular tagにjapanese , japanとかが入っちゃっているし、特に何も考えずに、CMっていうタグを見てみると、

stage6.jpg


なんか9割方、日本人がアップしたんじゃないの?と思えるファイルしか出てこないんですけど・・・
最初は、きっとOSとか環境変数とかを見て、日本人だと判断しているのかなと思っていたのですが、ガチで8~9割がたのファイルが日本からっぽいです。veohもかなり日本からのファイルは多いのですが、stage6ほどではありません。

そういえばyoutubeでも日本のコンテンツが多いですね。
動画配信サービスに日本のコンテンツが多い理由はなんでなんだろと思って調べてみると、理由がわかりました。そもそも高速にアップロード、ダウンロードできる回線を個人が持っているのは日本人くらいであるっていうことが背景にあるようです。韓国などブロードバンド普及率85%のブロードバンド先進国と呼ばれている国でも、ブロードバンドはせいぜいADSLどまりでStage6やVeohの動画をブラウザで見るには速度的に厳しい環境が多いそうです。

veohやstage6のような、帯域を使うサービスはブラウザ上から見れない国の方が多く、ほとんどの国がダウンロード必須で、アップロードなどもってのほか(youtubeですら、ブラウザ上で見れない国も結構あるみたいです。)。

しかし日本の場合、アップロードの帯域が100Mbpsの回線を個人が普通に契約しており、ブラウザ上から当たり前のように見ることができる。これがここまで高画質動画配信サービスに日本のコンテンツが多い理由のようです。

まとめ
使用して見た感じでは、総合的にVeohの方が数倍使いやすく感じました。これからveohはもっともっと流行りそうな気がします。
トラックバック(0)   コメント(0)   2007.01.27    [ Myカテゴリ:試してみた ]

今年の目標・新しい会社・近況報告など

どうも。久しぶりにブログを更新します。
新年だからといって、今まで更新をサボっていたわけではなくて、
なんか最近私が書く内容の方向性がバラバラだなーと
感じて来たため軌道修正のつもりで更新を休んでいました。
今日のテーマとしては以下の3つです。

・近況報告
・新しい会社
・今年の目標

近況報告
 1月の20日に第一子が生まれました。私が12月というボーナスが減らされるかもしれない危険な時期に転職した最大の理由は、出産が1月だったからということがあります。正直な話、以前の会社では私の出産なんかはまったく考えてもらえる会社ではありません。
 会社の基本的なスタンスとしては「休みは取ってもいい。ただし取引先には自分で許可を取れ」という考え方なので、私のように二重派遣状態だと、誰もがめんどくさい態度をするのはわかっているんですよね。現場主義と言えば聞こえはいいですが、放置主義と言い換えてもいいかもしれません。本来は出産などの手続きは仕事を取ってきた営業が率先して交渉しなければいけないはずなのですが、そういう常識が通用しないことは経験から知っていました。

 思えば私の新婚旅行の時にも結局は自分で交渉しましたし(この時には一時受けだったのと、私もがむしゃらに働いてお客さんにも良い評価をいただいていたので休みを取ることができた)、自社との契約がどうなっているかもわからず、休みを取ることができるのかどうかもわからず、お客さんのご機嫌次第。
 こんな状況で出産に向かっていて、「休みは取れるのだろうか?」、「陣痛が始まったときに私は帰れるか?」、「本当に大切なことは家庭ではないのか?」などと、すごく悩みました。私の始めての就職先でしたし、仲のいい人もいる。入社当時は一生勤めようと本気で思っていた会社です。しかし、やはり出産という大仕事を行う妻には全力で協力する必要があるという結論に達し、そのための手段として転職と言う方法を選びました。
 休職などの方法も考えては見たのですが、子供の病院など今後もいきなり仕事に行けなくなることも多くなると考えたため、この決断はまったく後悔していません。


新しい会社
 予想以上にいい会社です。私には、以下の条件さえ満たしている会社があれば、そこに行きたいと思える条件がありました。その条件とは、以下の3つです。

1、残業がほとんど無いこと
2、家族が病気の時には休めること
3、有給・代休が使えること

 私はこの3つの条件さえ満たしていれば、給料は初任給程度で構わないすら思っていました。学生なんかが見たら、驚くほど当たり前に見えるのかもしれませんが、実際にはこの業界では中々無いものなんですよ。私自身、こんな会社が大企業以外で本当にあるのか?と驚いたほどです。
 ですが、今の会社では上記のことを本当に実践しています。平均残業時間が20時間以下で、月の労働時間が200時間(32時間残業)を越えたら、社長、取締役が対策を練るような習慣を持っている会社です。これだけ自由に時間が使えると、止めていた開発を続けるにはぴったりです。
 また既婚者がこの業界にしては多いように感じました。

今年の目標
 新しい会社では結構自由に時間が使えるので、自分で新しいWebサービスを作って最終的には会社の自社製品とすることを目標とします。もう、既にいくつかの案はあります。この辺は、お前にそんなことができるわけ無いだろ、というような意見を頂きそうですが、それは年末に結果を見てくださいとだけ書いておきます。


捕捉
 意外と優れた技術者であったとしても新しいサービスを提供することは下手だったりします。私はそれが昔から不思議でした。最近になり、一つの解となる結論に達したのは、設計能力、資格、プログラミング能力とコンピューターが好きということはまったく別物なのだなぁということ。
 例えば、私の以前働いていた会社では、自宅にPCを持っていないけれど、設計能力が非常に高い人がいました。ですが彼は仕事はできますが、新しいサービスやソフトウェアを作り出すことはできませんでした。なぜか?理由は単純なことで彼にはどんな市場があって、どんなサービスが既にあって、似たようなサービスや、海外の動向などが把握できていないからです。彼が知っているウェブサービス数も多くありません。これは興味の方向が完全に会社からの評価へと向いているからですね。

 実際に彼は業務外の知識であるLinuxの知識などはまったく持ち合わせておりませんでしたし、会社で話題に上がらないマイナーな技術などは技術的な興味を持っておりませんでした。

 そしてこの業界の中で周りを見回してみると、自分でアプリを作って公開している人、新しいサービスを作り出した人などは、ほぼ皆無です。資格を持っている人や、設計、プログラムができる人はたくさんいるのにもかかわらず、自分で世の中に無いアプリを公開したり、新しいサービスを提供したりしている人が少ないということは、それだけ希少価値があるといえるでしょう。

 逆に次々と新しいサービスを立ち上げることができる人は、どのような人かというと、既存のサービスを知り、不満を持ち、どうすれば実装可能かを考え、新しいサービスを立ち上げます。つまり新しいサービスに対してもっとも必要な能力とは「パソコンが好き」であると言うことがいえると思います。24時間パソコンの前に1年中張り付いているような人は、まさにうってつけです。そのような人は市場にどんなサービスがあるのかを非常に良く知っているでしょう。
 そして、自慢ではありませんが私もパソコンオタクです。自分の好きな分野に関しては市場にどんな製品があり、どういうサービスがあり、どんなサービスが無いのかというのはわかっています。なので、今年は自分のこの能力をフルに用いて、自社製品を作りにいきます。会社にも負担をかけたくないので、完全に個人開発です。うまく軌道に乗せられたらそのサービスを核として自社で仕事ができたらいいなぁと思っています。
トラックバック(0)   コメント(0)   2007.01.25    [ Myカテゴリ:時事・駄文 ]

公開中のWebサービス・アプリ一覧のページ

このページは私が公開したWebサービス、アプリケーションの一覧ページです。

初代W-ZERO3でYoutube(CGI)
開発言語:ruby, javascript
サービス名どおりです。思い出深い初めて公開したWebサービス。
アクセス数が一日1500人を超えてうれしかったのを覚えています。
もう手元にW-ZERO3が無いので、現在も動作するのかどうかは知りません。

2007/02/04 公開
2007/11/01 公開終了
平坦判定サービス
開発言語:ruby, javascript
入力した住所や、地名から最寄り駅までが平坦なのかを判定するサービス。
特に家探しなんかに使えるサービスです。
Mashup Award 3rdに応募して落選した作品

2007/07/28 公開
2009/07/05 公開終了
Linuxコマンドの簡単ソースコードダウンロードサービス
開発言語:perl, javascript
Linuxコマンドのソースコードをワンクリックで
パッケージ名検索+ダウンロードが可能なサービス。
予想以上に技術者からは重宝されているサービスであり、
毎日色々なコードがダウンロードされている。
2007/08/25 公開
2009/07/05 公開終了
ポートスキャンサービス
開発言語:perl, javascript
あなたのPCにポートスキャンを行うサービス。
自己責任で意味のわかる人のみ使ってください。
2007/08/26 公開
2009/07/05 公開終了
Aterm用 Asterisk接続パッチ
開発言語:C
Aterm用 Asterisk接続パッチを配布中です。2007/10/24 公開
YourFileCache
開発言語:Java
NicoCache+NicoCache_nlを改造してYoutube、YourFileHost、Youku、Tube8の動画をダウンロードできるようにして見た。
ネトランとか、PC Kingとか色んなPC系の雑誌に頻繁に掲載されているソフト。
2008/06/06 公開
FuzzyProxy
開発言語: Java
コンテンツファイルのキャッシュに特化したProxy。
仕組み的に全ての動画サイト、画像サイトに対応している。
一度アクセスしたコンテンツには次回以降は高速に閲覧することができる。
2010/08/08 公開
Skype-inを使わずに固定・携帯電話からSkypeへの通話
開発言語:AGI, AEL, perl
通常、Skype-inを使用しなければ電話からSkypeへの通話はできないのですが、
アジルフォン様が提供する無料相互接続機能を利用して
接続できるようにしてみました。
2008/08/15 公開
2008/09/末 サービス終了
BBモバイルポイントの自動再接続ツール
開発言語:ruby
BBモバイルポイントで頻繁にログイン画面に飛ばされてしまうアクセスポイントで有効なソフトウェア。
毎秒のログイン確認を行うためユーザー目には切断されていることに気がつかずに作業可能。
2009/08/27公開
電話で遊ぼう! IVR-Maker(β)
開発言語:Java, Spring, Struts, Javascript, AGI, AEL, perl
誰でも簡単に無料で電話サービスを作成できるサイト。子供の頃に遊んだアンパンマンテレホンなんかを簡単に実現できないか?という観点で作成。
IPAが主催する未踏IT人材発掘・育成事業に応募して落選したサービスをスケールダウンして提供。
構想から実装完了までに実に4年以上の歳月を費やしたサービス。
2009/09/22公開
2010/05/30 サービス終了
AnalyticsでIPアドレスを超簡単に表示できるタグ「analyticsIP」
開発言語:php, javascript
Google AnalyticsでIPアドレスとcookieを表示できるタグ。
IVR-Maker(β)の失敗で精魂尽き果てて、お金にならないプログラムに情熱と時間をかけるのは家族から禁止されています。
短期間で作れそうだったのでコッソリと作ってみました。
実装期間は環境構築を含めても2日くらい。

私が作った全てのソフトウェアやサービスの中で最も開発期間が短いWebサービスなのに、
最も多くの人から利用されており
月間アクセス数が5000万アクセス(2014年11月)を突破しているという・・・
この現実!!ありがとう!!そして負荷対策頑張ります!

2013/01/28 公開

コメント(0)   2007.01.22    [ Myカテゴリ:アクセス解析 ]

Caderna N170J-301EでVistaも動きました。

Caderna N170J-301E を購入し、Vistaも無事に動きました。

hdbenchでのベンチマーク結果を貼り付けておきますので、参考にしてください。なお、理由がVistaだからだと思うのですが、HDDの読み書き共に異常な数値をたたき出しています。HDの読み書きに関しては参考にしないでください
hdbench


以下は、Vista付属のパフォーマンス測定ツールで測定したものです。
評価が3以上なのでAeroも動きます。
パフォーマンス


良かった点
・静音
・ギガニック
・Express Card
・Core 2 Duo CPU
・メモリのデュアルチャンネルアクセス(今はもう普通なのかな?)
・17インチ液晶
・解像度が高い
・内蔵無線LAN(Centrinoモバイルテクノロジ)
ノートパソコンにしてはいい音が出ていると思う

悪かった点
・ちょっと高い(この辺は価値観の違いだと思うが、私は8万までに抑えたかった)
・液晶が光沢液晶
・BIOSの設定項目が少ない

「BIOSの設定項目が少ない」について捕捉すると、
使用しているBIOSはAMIなのですが、
なんとブートデバイスの順番と、
BIOSパスワードくらいしか設定できません。

そのため、私のようにGameをまったくやらないので
ビデオメモリにメインメモリを割り当てたくない人は
メモリをすごく無駄遣いしているような気がしてしまいます。

BIOS情報。メインメモリは2G積んでます。
システム


何も設定していないのに勝手に224MBもメインメモリに使われてしまいました。
メモリ

誰かビデオメモリの容量変更方法を教えてください。


2007/01/25 訂正
価格.comにレビューを書いたところ、2時間もしないうちに指摘を受けました。この画面で出ている、メモリ使用量とは最大値であって、正確な使用量ではないそうです。正確なビデオメモリ使用量を見るためには、「Intel GMA Driver for Mobile」の「情報」で、現在使用されているビデオメモリ量を確認する必要があります。

ビデオメモリー


ビデオメモリーはAeroをOFF、クラシック表示ならば11MBしか使っておりませんでした。

付けて欲しかった機能
・これだけのでかさがあるのだから、HDDはRAIDができるようにして欲しかった。

感想
高い金(メモリ2G積んで合計13万円程度)払っただけあって、かなりいいパフォーマンスにはなっています。Aeroも余裕で動きますし、機能的には不満はないです。
解像度が高くCPUも速いのでプログラマーにお勧めの一台です。何かこのPCについて質問がありましたら受け付けますので、コメントに書いておいてください。
トラックバック(0)   コメント(10)   2007.01.17    [ Myカテゴリ:時事・駄文 ]

ホワイトプラン ウィルコム窮地に立つ2

ホワイトプランを知ってから一日。
「こんなに安くて、利益がでるわけが無い。こんな値段でも利益がでるのならば既存の業者はぼったくり過ぎ。会社の存続をかけてツーカーの末期も値下げしまくってたけど、ここまで安くなかったぞ。」と思って調査した所、やっぱり儲かるサービスではないそうです。

孫社長のインタビュー

ホワイトプランは孫社長も言っている通り、データ通信を使ってもらえないと、利益がでないサービスだそうです。データ通信料は他社とたいして変わらない値段にすることで、データ通信で利益をあげようと。評判悪い社長だけど、このインタビューの中で孫社長が言っていることには100%賛成。

@@@ 孫社長インタビューより抜粋 @@@
 「これまでは機種変更するたびに1万円とか2万円とか取られていた。しかし、それでも、3ヵ月とか6ヵ月で機種を変える人がいる。それって、事業者から見ると絶対に採算が合わない赤字顧客なんです。だって4~5万円する端末に携帯事業者は販売奨励金を払って、回収前に短期間で機種を乗り換えられて。その分の赤字を補填するために、一般の平均的なユーザーは、高い基本料金を払わされてきた。通話料も」

 「それって、ぼくは正常な仕組みかなと疑問がある。統計では、普通の人は2年前後は使う。それが、一部の短期間乗り換えユーザーの赤字補填を、残り90何%かの人が、高い基本料払わせれて負担させられているというほうに、ぼくはむしろ問題があるんじゃないかと」
@@@ 孫社長インタビューより抜粋 ここまで@@@


学生とか電話番号が変わることに何のためらいも無い人達が、
魅力ある製品が欲しいからと言う理由で解約->新規契約する。
このときの料金は既存の加入者が払っている。
ウィルコムの端末も同じ。端末単体の価格は契約後6ヶ月以内の機種変更の値段を見れば端末単体の値段がわかる。あのシンプル携帯であるWX300Kですら端末価格は32300円もする。新規契約は6800円なので、差額の25500円は既存ユーザーが払っていることになる。これはウィルコム定額プランの約8ヶ月分の基本料金に相当する。ウィルコムもソフトバンクと比べると旧来の悪しき商習慣が残ったままになっている感はある。

・・・あれちょっと計算してみると・・・なんかすごくぼられている気がしてきた。10ヶ月毎に機種変するユーザーがいたとしたら、WX300Kユーザーの場合ウィルコムに支払う額は、

{10ヶ月毎に以下の機種変を繰り返すことが可能}
8800円(10ヶ月以上使用者の機種変更料金)
2900円 * 10ヶ月 = 29000円
合計37800円

これに対し端末価格は元々32300円なので、
37800円(期間中ユーザーが支払った金額) - 32300円(端末価格) = 5500円
実質このユーザーは基本料金としては、10ヶ月で5500円しかウィルコムに支払っていないのではないか?これはちょっと極端過ぎる計算結果になってしまったが、もし仮りに10ヶ月毎に端末を変えるユーザーがいたとすると、確かに既存ユーザーの負担は見過ごせない。

もうちょっと計算の制度をあげようと思い、携帯電話の平均買い替え状況を調べてみた。内閣府の消費動向調査「主要耐久消費財の買替え状況(一般世帯)」(2006年3月実施調査結果)によると、携帯電話の平均使用年数は2.6年となっている。約30ヶ月か。

とするとウィルコムの計算ではこんな感じになっているのだと思う。
{30ヶ月毎に以下の機種変を繰り返すとする}
8000~23000円(10ヶ月以上使用者の機種変更料金、ハイエンド機を含む)
2900円 * 30ヶ月 = 87000円
合計95000~110000円

@@@解約率の計算が漏れていたので1/8日 3:00 訂正致しました@@@
30ヶ月で既存加入者から約95000万円獲得し、そのうちの2万円ほどを加入者(自分)の機種変更のためにプールする。次に新規加入者のために既存加入者の負担額はどれくらいになるのかを計算する。ウィルコムの2005年度の純増は約70万人IRによれば解約率が上半期2.2%、下半期2.3%である。

年間解約者数 = (300万人 * 2.2%) + (340万人 * 2.3%) = 14万人

よって2005年に新規契約で加入した人は、
370万人(年度末加入者合計) - (300万人(年初の加入者数) - 14万人) = 84万人

既存加入者約300万人が84万人分の端末代を負担するとすると、
84万人(新規加入者) * 25000(新規加入者の端末代) / 300万人(既存加入者) = 7000円

既存加入者は年間7000円ほど、新規加入者のために支払っていることになる。
これを30ヶ月に直して計算すると、1万7500円。
計算は結構大雑把ですが、ウィルコム加入者が30ヶ月契約して機種変した場合、支払った金額95000円のうち45500円は端末代であることがわかる(機種変時の端末代8000円、自分の機種変用プール金20000円、新規加入者の端末代プール金17500円)。

ということは端末代を除けばウィルコムは総支払額のうち49500円しか得ていないことになる。ウィルコムの場合、基本料金の半分近くが何と自分や他人用の端末代だったんですね。
それでは端末代を基本料金から除外してみましょう。

49500円/30ヶ月 = 1650円
端末に関して既存ユーザーの負担が無くなれば、2900->1650円までは現状でも余裕で下げられることがわかる。


考察
端末代がかからなければソフトバンク並に980円くらいになるのかと思ったのですが、端末代だけでは難しいですね。しかしソフトバンクが980円で設備もサポートもできてしまうと公言しているのも事実なので、ここからどうやってウィルコムが対抗していくのか、ウィルコム140万人の音声定額層の行方はどうなるのかが楽しみです。

えーちなみに私はソフトバンクのサービスはアンテナ数から言っても一年くらいは不安定だとは思います。一つの基地局で可能な通話人数は限られているので、そんなに一度にユーザーが増えると繋がらない。うろ覚えですが、アンテナ一つの帯域5KHz毎に40人くらいしか通話できなかったはずなので、ホワイトプランの直前の時間帯18-21時くらいは繋がりにくい現象が各地で発生するでしょう。逆に考えるとアンテナが足りないから一番混雑する時間帯には有料としたようですね。

しかしながら、なんだかんだ言ってもソフトバンクは一年以内には設備を整えてしまうでしょう。YBBのときも色々と事件がおきましたが、一年もしないうちに安定したサービスを提供できるようになりました。ちなみに今はYBBは黒字で当時のADSL相場の半額という値段にも関わらず、立派に黒字化を達成しました。値段も当時から全く変わっておらず、今や一番値段が高いADSLと呼ばれているにも関わらず、国内最多の加入者数を誇ります。

ADSLのときとは違い競争が無い為、今後も巨人DocomoやAUが値段を下げてくることは無いでしょう。個人的には一つの端末を長く使いつづけたいと思っているのと、新規加入者、機種変ユーザーのために既存ユーザーがお金を払うのは納得できないということもあり、今の自分の気持ちは80%くらいソフトバンクに傾いています。ソフトバンクならば安心パックもあるので、壊れるまで何年でも使うことができます。

・・・でも、半年は様子見だな。多分ソフトバンクの事だからしばらくは安定しないサービスだとは思いますし、ウィルコムの対策も気になるので。
トラックバック(97)   コメント(3)   2007.01.07    [ Myカテゴリ:時事・駄文 ]

ソフトバンクのホワイトプラン。ウィルコム窮地に立つ。

昨日発表されたソフトバンクホワイトプラン。またあのソフトバンクが安く見せかけてるよと思って調べていたら、驚く程、魅力的な内容でした。このニュースはまさにソフトバンクの価格破壊と言えるでしょう。

ホワイトプランの内容
* 月額基本料 980円
* 通話料 1時~21時:ソフトバンク間無料 他社宛21円/30秒
      21時~翌1時(25時):一律21円/30秒
* ソフトバンク3G間メール無料 3G→2Gのメール無料
 それ以外とのメール 3.25~210円/通
* パケット通信料 0.21円/パケット
(他社宛メールWeb利用にはS!ベーシックパック315円/月への加入が必要)
* パケットし放題加入可能
* 無料通話・無料通信分は無し(21~25時の200分無料も無し)
* 2G/3Gどちらも対応

この内容を見てまっさきに思ったのが、ソフトバンクのターゲットは「ウィルコムユーザーなのか?」ということ。御存じのとおり、ウィルコムは最近どんどん新規加入者数を増やしております。
その理由は音声定額、ネット定額の格安なことです。逆に言うと音声定額が無いウィルコムなんて新規で加入したい人はいないと思えるくらい強烈なサービスでした(ネット定額は音声定額のかなり前から始まっていますが、加入者を大幅に伸ばすまでには至りませんでした。)。私も音声定額がはじまったのでAUからウィルコムにキャリアを変えました。
音声定額が始まった直後、みんなが「ウィルコムにすれば通話料は0円だよ」とか、クラス全員がウィルコムにすると「クラスでの通話料0円」、「会社で購入して、全員にウィルコムを持たせたら・・・・」とかそんな話題があちらこちらで聞こえてきました。
ところが結果として会社はともかく、個人ユーザーはそれほどウィルコムに雪崩込むという現象はおきませんでした。多くの人が番号が変えたくなかったり、家族割に入っていたりして、ウィルコムの純増は増えましたが携帯を脅かす程は増えなかったのです。

今回ソフトバンクがウィルコムと同様音声定額サービスを月980円という低価格で始めることになりました。私は、もはや携帯キャリアは全てソフトバンクの敵じゃないなと思いました。

携帯電話ユーザーに対するホワイトプランの利点
1、ソフトバンクの場合には携帯電話なので、既存の携帯ユーザーは番号を変更せずにキャリアを変えることができる。これによりウィルコムでは獲得できなかったより多くのユーザーを獲得することが可能。

2、圧倒的な値段の安さ。他社の一番安い携帯のプランでもホワイトプランの携帯が3~4台持ててしまう。通話料が無料なのでお互いに通話料が毎月1000円を越える相手がいるなら(つか、ほとんどの人がそうだとは思うが)、ソフトバンクの携帯を持ったほうがいいことに気がつくはず。
料金が980円なので2台持ちだとしても大した値段ではない。


ウィルコムユーザーに対するホワイトプランの利点
悔しいけどウィルコムがかなわない点がいっぱいある。
1、エリアはなんだかんだ言っても携帯電話。ウィルコムよりも圏外にならない場所が多い。
ウィルコムは地下や、高速での移動は厳しい。そして、出力数の関係から今後も厳しい。
ソフトバンクの場合、アンテナを増やせば地下でも繋がるので、今後はもっと繋がるようになる。

2、通信速度。ウィルコムは頑張っているがデータ通信は遅い。
そして現状わかっている限り、今後5年はデータ通信速度で携帯電話にはかなわない。
ちなみにドコモやソフトバンクは既に100Mbpsの通信に着手している。

3、ウィルコム定額プランとホワイトプランの競合。
専修大学の調査によると、よく電話連絡する相手の平均人数は6人以下が9割だそうです。
音声定額にする際、現状では選択肢はウィルコムとソフトバンクしかありません。その際に980円のソフトバンクを選ばずに、2900円のウィルコムを選ぶ理由がありません。


そして携帯、ウィルコムを含めてホワイトプランの利点
1、今後、ソフトバンク以外の携帯各社や、ウィルコムが980円以下で定額を始めることは無いと思います。ウィルコムならばともかく、巨人Docomo、AUが値段を大幅に下げるとは思えません。経験的にみんながそれを知っているから、(料金的には)安心してソフトバンクの携帯を買うことができます。またソフトバンクはこんなことを唱っています。

「他社が追従、対抗値下げした場合、24時間以内にさらに値下げする。」

値下げ競争には公務員的なNTT, KDDIが参加する訳がありません。


今後のウィルコムはどうなるか?


@@@1月10日訂正 訂正が遅くなり申し訳ございません@@@
コメント欄にて情報をいただきました。ウィルコムは元々黒字の会社なので
データ通信を行う加入者層である290万人が離れていかなければ、
潰れることはなさそうです。

私はウィルコムがすぐに手を打たないと、ウィルコムという会社が潰れると思います。
なぜならば私も私の回りの音声定額に惹かれて契約した友人たちも同じ意見だから。


もはやウィルコムに利点は無い。そう言える状況です。今後ウィルコムの純増は望めません。

私は早急に以下の対策をするべきだと思います。
500~1000円で音声+メール定額(ホワイトプラン対策、時間帯制限無し)
2000~4000円で音声定額+メール定額+データ通信定額(ホワイトプラン+パケ割対策)

ただでさえ、出力W数が不利なPHS。
これくらいやらないと、誰もウィルコムを使い続けません。
そもそも低価格音声定額で加入者を増やしたのだから、
低価格音声定額で加入者を減らすことは容易に予想できることです。
早急な対応を希望いたします。


@@@1月7日追記@@@
コメント欄にウィルコムは音声定額開始後に60万人以上加入者が増えたと書きましたが、2005年度しか計算していませんでした。訂正します。

正確に調査した所、音声定額をアナウンス後、140万人近くのユーザーが加入しています。
2001年から2005年1月まではユーザー数は290万人でほとんど変動無しなので、この290万人はデータ通信ユーザーだと思われ、新規加入の140万人は音声定額ユーザーと言えると思います。
既に音声定額ユーザーは加入者の3分の1にあたる大勢力ですね。
トラックバック(0)   コメント(6)   2007.01.06    [ Myカテゴリ:時事・駄文 ]

Javaのお勉強

以下はC,C++プログラマーが「独習Java」を読んで新しく学習したことのメモである。自分用のメモなので、多分読んでも面白くない。飛ばすべし。
また、fc2では行頭のインデントが無効になっているため、ソースも見にくい。

★キーワード
バイトコード VMで動かせるようにコンパイルされたオブジェクトファイル
メソッド   Cでいう関数のこと
シグネチャ  メソッド名とパラメーターの型を合わせたもの。

Javaの型変換
Javaの型変換のため、以下のような処理が問題となってしまう。

public class testClass {
public static void main(String args[]) {
short s1 = 1;
short s2 = s1 + 1;
System.out.println(s2);
}
}

一見、C、C++プログラマには問題に見えないこのソースをコンパイルすると、
「型の不一致: int から short には変換できません。」
というエラーが表示される。
このエラーが表示される理由はJavaの型変換という機能である。
C,C++では違う型同士の演算が可能である。
ところがJavaではint 以下のビット数の変数を演算すると、結果は全てintになるという特性がある。
よって以下のような処理もやはりエラーとなる。(short と shortでintに変わってしまうため)

public class testClass {
public static void main(String args[]) {
short s1 = 1;
short s2 = 1;
short s3 = s1+s2;

System.out.println(s3);
}
}

型変換の優先順位でいうと double > float > long > int > それ以外となる。そのため
double と何かを演算すると 必ず結果はdoubleとなる。
変数同士のビット演算などがやりたい場合はどうなるのだろうか・・・ @ 疑問点1 誰か教えて。@


Javaの配列
配列はC,C++とJavaでは作り方が違っていて、以下のような配列の取り方はNG.

public class testClass {
public static void main(String args[]) {
int array[10];
System.out.println("");
}
}

エラーメッセージ
「トークン "10" に構文エラーがあります。このトークンを削除してください。」
なんで上記のやり方ではいけないのかが、理解に苦しむ。

正解は以下
public class testClass {
public static void main(String args[]) {
int array[];
array = new int[10];
int array2[] = {1,2,3};
int array3[] = new int[10];
int array4[] = array;


System.out.println("array = " + array.length);
System.out.println("array2 = " + array2.length);
System.out.println("array3 = " + array3.length);
System.out.println("array4 = " + array4.length);
}
}

array.length で配列の個数が取得できるので便利ではあるが、配列がクラスっぽい動作をしているのは不思議。

/* 多次元配列の作り方 */
public class testClass {
public static void main(String args[]) {
int varName[][] = new int[5][10];

System.out.println("varName = " + varName.length);
System.out.println("varName = " + varName[0].length);
System.out.println("varName = " + varName.length * varName[0].length);
}
}

出力結果
varName = 5
varName = 10
varName = 50


また、Javaでは配列の要素が四角形の行列である必要がない。
よって、以下のような配列が作成可能
/* 多次元配列の作り方 */
public class testClass {
public static void main(String args[]) {
int myarray[][] = {
{22,31},
{33,44,55,4444},
{32,33,4444,5555}
};

System.out.println("myarray = " + myarray.length);
System.out.println("myarray = " + myarray[0].length);
System.out.println("myarray = " + myarray[1].length);
System.out.println("myarray = " + myarray[2].length);
}
}
出力結果
myarray = 3
myarray = 2
myarray = 4
myarray = 4


P48
★メソッドの例外指定
int func(int prm) throws exceptionList {
}

exceptionListは例外リストといえます。
この関数をコールしたときに起こりうるエラーをthrowsの後に書きます。

★静的メンバ、インスタンスメンバ、ローカルメンバ
静的メンバはわかりやすくいうと staticのメンバが静的メンバ。
ひとつのクラスで実体はひとつ

インスタンスメンバはクラスから生成されたオブジェクトの一つ一つに対して作成される、
クラス内でのグローバル変数みたいなもの。
ローカル変数はメソッド内部で宣言される、関数内変数のこと。
静的変数も静的メンバと同じ。クラスに結び付けられているので実体は一つしか存在しない。
インスタンスメンバとしてはインスタンス変数と、インスタンスメソッド
静的メンバは静的変数、静的メソッドという


★Javaプログラムにはmain() という静的メソッドが必ず存在する。
main()は一つのアプリで一つである。
このmain() にはCのように int main(int argc, char *argv[]) とはならず、
main(String args[]) となる。
この理由はJavaでは配列はメソッドを持つので、args.length とすれば引数の個数が取得できるからである。

引数の個数と、引数で受け取った文字列の出力
public class testClass {
public static void main(String args[]) {

System.out.println("args[0] = " + args[0] + " args[1] = " + args[1] + " args.length = " + args.length);
}
}

★オブジェクト指向においてクラス変数とは状態を表すらしい。
この考え方は面白い。
メソッドの動作は固定なので、変数が取りうるパターンだけ状態があると考えることができる。

★コンストラクタのオーバーロードとは複数のコンストラクタを使用可能なこと。
もっと正確な用語を使うとコンストラクタのシグネチャが異なる。
シグネチャとはコンストラクタ名とパラメーターの型を合わせたもの。

public class testClass {
public testClass(int i) {
}
public testClass(char b) {
}
public testClass(short c) {
}

public static void main(String args[]) {

System.out.println("args[0] = " + args[0] + " args[1] = " + args[1] + " args.length = " + args.length);
}
}

★コンストラクタは戻り値を返すことができない
ちなみにクラス内から、同じクラスのコンストラクタを呼ぶためにはthis を用いる。
呼び方としては
this(i);
this(b);
this(c);
これだけでよい。

★静的変数について P152
静的変数、インスタンス変数は初期化しなくても初期値が決まっている。
boolean の場合には偽、数値の場合には0が代入される。
変数の宣言時に値を代入することもできる。
C++と同様、静的処理と、非static処理は混ぜるな危険。
Javaでは自動的に初期化されないのはローカル変数のみである。

★ファイルスコープ
Cだと異なったファイルの関数、変数を参照するためにはincludeもしくはexternが必要になるが、
Javaの場合には同一ディレクトリのクラスを使用するために特別な処理を行う必要がない。
便利だが、ビルドに時間がかかったりはしないのだろうかと、不思議に思う。


★ローカル変数と静的変数、インスタンス変数を同名にすると
ローカル変数が優先される。普通こんなことやらないと思うが、一応。

★Javaでのポインタ渡し
Javaにはポインタが無いので、アドレス渡しができないものかと思っていたのだが、
参照渡しというテクニックがアドレス渡しと同様のようである。
ただし、参照渡しというのを明示的に行うわけではなくて、
配列やオブジェクトを引数として引き渡す場合に自動的に参照だけが渡される。


★継承
継承するためにはextends を用いる必要がある。
メソッドのオーバーライドによって実行時のポリモーフィズムが実現される。
スーパークラスのメソッドを呼び出すためにはsuperを用いる。

clsName2はclsName1から継承している。
clsName1はclsName2のスーパークラスである。↓

class clsName2 extends clsName1 {
}

clsName2 varName;

↑ これはオブジェクトを参照する変数を作成している。

★動的メソッドディスパッチ
適切なオーバーライドメソッドを動的に選択する機能。
ソースを見ると違和感を覚えるが、ポリモーフィズムには必要らしい。

class Thing {

Thing() {
}

void hello(){
System.out.println("Thing");
}
}

class X extends Thing{
public X() {
}

void hello(){
System.out.println("X");
}
}

public class testClass{
public static void main(String args[]) {
Thing var = new X(); //★ ここがキモ
var.hello();
}
}

出力結果
X

なんと親クラスが子クラスからnewされている。
ここで Thing var って何でもいいのではないかと思ってしまうので
何でもいいのかなーと思って試してみると
X var = new Y();
このXとYの部分は
X var = new Thing(); NG
Thing var = new X();  OK
Thing var = new Thing(); OK
Thing var = new Y();  NG(Yはhello()というメソッドを持つ、varとの継承関係に無いオブジェクト)

よって子クラスが親クラスのオブジェクトをnewすることは不可能だが
親クラスのオブジェクトが子クラスのオブジェクトをnewすることは可能である。
子は親のメソッドを呼べる。
親は全ての子を参照できる。
なんか面白い。

★継承したクラスのコンストラクタはどのように呼び出されるか
親クラス、子クラス、孫クラスがあって孫クラスのオブジェクトを作成すると、
コンストラクタは親クラス、子クラス、孫クラスの順番で呼ばれる。

★クラス修飾子(abstract, final, public)
final オーバーライドできないクラス
abstract 抽象クラス。インスタンス化できないクラス。オブジェクト指向プログラミングで重要。
public 他の全てのクラスから参照できるクラス。
無し    同じパッケージ内(ディレクトリ)からしかアクセスできない

P190 抽象クラスとはクラスの機能さえ定義すれば、
その機能をどのように実現するまで定義しなくていいという利点がある。
サブクラスでは同じ目的を達成するために複数の実装を使うことができる。
ようはIFのみが定義されているファイル。

finalは拡張できないクラス。クラスで実装したメソッドをオーバーライドできないようにする。
abstract とfinal を同時に指定することはできない。

有形クラス(concreteクラス)
abstractの反対でインスタンス化できるクラスのことを有形クラスという

★変数の修飾子
final 定数として使える変数。Cのconst と同じと考えていい
private 同じクラスのコードからしかアクセスできない変数
protected サブクラス、または同じパッケージ内のコードからしかアクセスできない変数
public 他のクラスからもアクセスできる変数
static インスタンス変数ではない変数(危険)
■transient クラスの永続的な状態の一部ではない変数??
■volatile 不意に値が変更されることがある変数。

下二つについては実プロジェクトではほとんど使わないらしい。
ちなみにvolatile は組み込みとはぜんぜん意味合いが違っている。
組み込みの場合にはvolatileは最適化しないという意味合いで使う。


void main() {
int i = 1;

while(i) {
xxx();
}
}

コンパイラが上記処理を最適化すると
void main() {
while(1) {
xxx();
}
}

となる。ところが組み込みの場合はiの取りうる領域をハードウェア的に直接書き換えることが可能なので
iという領域自体が無くなってしまうのは問題となる。
そういう場合にvolatileを使用する。volatileを使用するとコンパイラが最適化しない。


★コンストラクタの修飾子
private 同じクラスのコードからしかアクセスできないコンストラクタ
protected サブクラスまたは同じパッケージ内のコードからしかアクセスできないコンストラクタ
public 他のクラスからアクセスできるコンストラクタ

★メソッドの修飾子
■abstract このクラスでは実装しないメソッド (virtualのことみたい)
final オーバーライドできないメソッド
■native Javaのバイトコードではなく、ホストCPUで使われるマシン語で実装されるメソッド
private 省略
protected 省略
public 省略
static インスタンスメソッドではないメソッド
■synchronized 実行を開始するときにロックを取得するメソッド

abstractが宣言されているメソッドを含むクラスは、クラス自体もabstractにする必要がある。
synchronizedはマルチスレッドで用いる。
nativeってどうやってコンパイルするんだろ。コンパイラはなんだろ。

★singleton を用いると、オブジェクトの生成されているかとか
起動順序などを考慮しなくてよくなる。
例えば、通常ならばinitプロセスが起動するなどのルールがあるが、
この辺を考える必要が無くなる。

★ObjectクラスはJavaクラス階層の頂点に位置するオブジェクトである。
全てのオブジェクトはユーザーが作成したオブジェクトも含めて例外なく、Objectクラスの系列下にある。
Objectクラスが持つメソッドとしては以下がある。

clone() このオブジェクトのコピーを作成して返します。
equals(Object obj) このオブジェクトとほかのオブジェクトが等しいかどうかを示します。
finalize() このオブジェクトへの参照はもうないとガベージコレクションによって判断されたときに、ガベージコレクタによって呼び出されます。
getClass() オブジェクトの実行時クラスを返します。
hashCode() オブジェクトのハッシュコード値を返します。
notify() このオブジェクトのモニターで待機中のスレッドを1つ再開します。
notifyAll() このオブジェクトのモニターで待機中のすべてのスレッドを再開します。
toString() オブジェクトの文字列表現を返します。
wait() ほかのスレッドがこのオブジェクトの notify() メソッドまたは notifyAll() メソッドを呼び出すまで、現在のスレッドを待機させます。
wait(long timeout) 別のスレッドがこのオブジェクトの notify() メソッドまたは notifyAll() メソッドを呼び出すか、指定された時間が経過するまで、現在のスレッドを待機させます。
wait(long timeout, int nanos) ほかのスレッドがこのオブジェクトの notify() メソッドまたは notifyAll() メソッドを呼び出すか、ほかのスレッドが現在のスレッドに割り込みをかけたり、指定された量の実時間が経過するまで、現在のスレッドを待機させます。

パターン的にはObjectクラスはオブジェクト操作とスレッド関連のメソッドを持っているようだ。

★Classクラス とは実行中のプログラム内のクラスやインターフェイスに関する情報がカプセル化されます。
配列や、特定のデータ型、基本データ型と、voidのそれぞれにClassオブジェクトが存在するため、
配列でlengthとかが使えるようになる。


★インターフェイス
インタフェースとは定数とメソッド宣言をひとつにまとめたもの。
インターフェイスを変数の型に使用することもできる。
インターフェイスに別のインターフェイスを拡張することも可能。
instanceof を使用するとオブジェクトが特定のクラスであるか、
または特定のインターフェイスを実装しているかを調べることができる。
パッケージとはクラスとインターフェイスをひとまとめにしたものです。
パッケージを使って名前空間を体系化することが可能です。
CLASSPATH環境変数はJava2 SDKツールがパッケージを検索する場所を示します。
■クラスにインターフェースを実装する場合、そのインターフェイスで宣言されているメソッドを全て実装しなければならない。
インターフェイスは同名の変数、メソッドをもつとコンパイルエラーが発生する。

★クラスからインターフェイスを使用するにはimplements キーワードを用いる
public class clsName extends superName implements intfList {
}

★インターフェイスをimplementsでいっぱい書くのは手間がかかるので以下のように記載できる。
public interface interface0 extends interface1, interface2, interface3{
//インターフェイスの本体
}

上記インターフェイスを使用するとき
public class clsName extends superName implements interface0 {
}


★thisキーワードの勘違い
thisというキーワードはそのクラス内という意味合いだと思っていたが、
以下のようなコードで実行したところ、対象の変数が存在しない場合には
親クラスの変数がthis.変数 として使用されることがわかった。


abstract class MaterialObject {
String materials;
}

class Ball extends MaterialObject {
Ball() {
this.materials = "test2";
// materials = "test";  結局この3行は全て同じ変数にアクセスしている。
// super.materials = "test3";

System.out.println(materials);
System.out.println(this.materials);
System.out.println(super.materials);
}
}

public class testClass{
public static void main(String args[]) {
Ball ball = new Ball();
}
}

★抽象クラスの勘違い
抽象クラスでは変数を作成してはいけないものだと思っていた。
なぜならば抽象クラスをインスタンス化するとエラーが起きるからである。
しかし上記のように継承したクラスのインスタンスを生成することにより、
抽象クラスの変数も同時に作成されるような使い方をすることがわかった。


★★★★★抽象クラスとインターフェイスの違い★★★★★
抽象クラスとインターフェイスの違いがよくわからなかった。
インターフェイスは変数がpublic static final となり、
メソッドはpublic abstractとなる。
これらは抽象クラスでも実装できる。
それではなぜインターフェースを用いるのかというと、
Javaは複雑になるという理由で多重継承をサポートしていない。
そのため、制限をつけた継承をするといういみでインターフェースを用いる。
インターフェースならばいくらでも記述することができる。

★instanceof 演算子
演算子ということに注目
0xFFFF & 0x3333とかと同様、
オブジェクト instanceof オブジェクトのように使用するのだ。
変数を使用すると

if (He instanceof myfather) {
}

のように微妙な英文っぽいのを作成できる。
いやな感じだなこれ。
使い道としてはオブジェクトのクラスや、オブジェクトに実装されている
インターフェイスを確認することができる。
AとBが継承、またはインタフェースとして、関連付けられているのならばTRUEとなる。
よってinstanceof の後に来るものは、クラス名またはインターフェース名となる。

★パッケージとはクラスやインターフェイスの集まりのこと P221
使用方法は

package packageName;

のようにして用いる。
ひとつのファイルで用いることができるpackage文は一つのみ。
階層構造は.で区切る。

package folder1.folder2.signals;

ようは自分のファイルがあるディレクトリのことである。
普通にディレクトリを見ればわかるから, packageなんて書く必要ないのではないか?
と思えるが、書くらしい。
デフォルトパッケージを使っているとエラーが出ないので気がつかなかった。

★クラスパス
CLASSPATHは、.classファイルの検索先を指示するための環境変数。

★import とはCでいうインクルードと同じ
だが、*が使えるので、ディレクトリ以下を一度にインクルードすることもできる。

★P237 例外
Javaにはtry, catch, finallyという例外処理を行う手順が用意されている。
これは便利な機能だが、catchの数が多くなるとやはり見にくくなる気がする。
finallyは必ず実行される処理である。
switch文のdefaultとは違い、必ず実行される点に注意。
tryブロック内にreturn があったとしても、必ずfinallyが実行されてからreturnされる。
リソースを開放する目的で用いると便利。

★例外についての質問
例外がいっぱいあるようだが、catch節には全てのexceptionを網羅しなければならないのか?
->Exceptionを含めて例外は継承関係になっていて、
catch (Exception e) {
処理
}

と記載してあれば全ての例外を取得できる。ただし、Exceptionはほぼ最上位のエラーなので、
細かな処理を行いたいときには、

catch (例外 1) {
処理
}
catch (例外 2) {
処理
}
catch (例外 3) {
処理
}
catch (Exception e) {
処理
}

のように最後に記述する必要がある。
ただし、Javaコンパイラがcatchブロックの順序を判定してくれるので
意識しなくても大丈夫。
また、tryブロックで生成されない例外クラスに対応するcatch ブロックがある場合には
同じくコンパイラが発見してくれる
また、exceptionには検査例外とRuntiome Exceptionの2つがあるが、
Runtime Exceptionは0による除算や、不適当なキャストなどがあり、
検査例外は主にAPIのエラーである。
検査例外(API)はコンパイル時にチェックされ、なんらかの処置が必要である。


★throw ステートメント P246
前述の例ではJVMによって例外が生成されておりましたが、自分で作成するためには
throw ステートメントを使用する。

catch (ExceptionType param) {
throw param;
}

throw (スルー) を行うと、エラーをそこで消さないので、
以下のような処理を行うこともできる。

public static void c() {
try {
System.out.println("Before d");
d();
System.out.println("After d"); //1、この行は実行されない。
}
catch (ArithmeticException e) {
System.out.println("c: " + e);
throw e;
}
finally {
System.out.println("c: finally");
}
}

public static void d() {
try {
ゼロ割;
}
catch (ArithmeticException e) {
System.out.println("d: " + e);
throw e;
}
finally {
System.out.println("d: finally");
}
}

このようにエラー処理をd()で行い、さらにc()で行うこともできる。
また、注目してほしいのでは、1で1の行は実行されないのである。
JavaではCのようにネストを深くするのを避けるためにtry, catch, finallyをこのようにもちいる。


また、以下のように記載することで例外を生成することもできる。
class testClass {

public static void main(String args[]) {
try {
System.out.println("Before a");
a();
System.out.println("After a");
}
catch (Exception e) { //例外はすでに処理済なのでここの中には入らない。
System.out.println("main: " + e);
}
finally {
System.out.println("main: finally");
}
}

public static void a() {
try {
System.out.println("Before throw statement");
throw new ArithmeticException(); //例外生成
}
catch (Exception e) {
System.out.println("a: " + e); //ここで例外を処理している
}
finally {
System.out.println("a: finally");
}
}
}


★P252 catch節には必ずThrowable型のパラメータが必要です。
Throwable型のクラスには以下のよく使われるメソッドがあります。
getMessage() //コンストラクタから提供された文字列を返す
printStackTrace() //問題が発生した時点でのスタック情報を表示する。

Errorクラスは発生する可能性が低いので、考慮する必要はほとんど無し。
ExceptionクラスはThrowableクラスとは継承関係にあり、Throwableクラスを拡張します。
Exceptionクラスの主なサブクラスとしては、

ClassNotFoundException クラスが見つからなかった
IllegalAccessException クラスに不正にアクセスしようとした
メソッドが見つからなかった、スレッド割り込みが入った
などがある。


★P256 throwsステートメント
呼び出し元に対して例外を投げる可能性があるメソッドを書いた場合は、
他のプログラマにわかるようにどの例外が投げられるのかを明示しておくこと。
これはやらなければいけないことである。
試してみると、非常に便利なことがわかった。

class testClass {
public static void main(String args[]) {
a();
}

public static void a() {
try {
b();
}
catch (ClassNotFoundException e) { //?
System.out.println("test1 ");
e.printStackTrace();
}
}

public static void b() throws ClassNotFoundException { //?
c();
}

public static void c() throws ClassNotFoundException { //?
Class cls = Class.forName("こんな名前は無いよ");
System.out.println("test1 "+ cls.getName());
System.out.println("test2 "+ cls.isInterface());
}
}

例えば?の箇所の記載を
public static void c() throws ArithmeticException {
上記のように変更すると、処理されない例外の型 ClassNotFoundException というメッセージが出る。
よって、throws に記載できるものは起こりうるエラーしかかけないことがわかる。
そのため、この書き方では前頁のようにエラーメッセージを変更することはできない。

また?を以下のように変更すると
public static void b() {

「ClassNotFoundException の到達不可能な catch ブロック。
処理されない例外の型 ClassNotFoundException」
上記のようなエラーが出る。
かなりコンパイラが賢いようだ。

以下のように記載することにより、例外を作成することもできる。
static void c() throws ExceptionA, ExceptionB { //複数の例外が起きる可能性がある場合
Random random = new Random();
int i = random.nextInt();
if (i % 2 == 0) {
throw new ExceptionA("We have a problem"); //例外生成
}
else {
throw new ExceptionB("We have a big problem"); //例外生成
}
}


★マルチスレッドプログラミング
デッドロックの発生に注意する必要がある。
プロセスよりもコンテキストの切り替えにかかる時間が短い。
スレッドには優先順位が付けられる。
同じ優先順位のスレッドは時分割で実行される。
スレッドを使用するためにはThreadクラスを継承すればよい。

class sureddo extends Thread {
public void run() { //スレッドの処理はrun() という固定の名前を用いる
//スレッドの処理
}
}

スレッドの起動には次の構文を用いる。
sureddo tx = new sureddo();
tx.start();

スレッドを作成する方法はもう一つあって、
Runnableインターフェイスを実装したクラスを宣言する方法がある。

class testclass implements Runnable {
public void run() {
//スレッドの処理
}
}

上記文のスレッドの起動は次のとおり
testclass ry = new testclass();
Thread zy = new Thread(ry);
zy.start();

継承は一つしかできないので、制約があるときには便利かもしれませんね。
スレッドの優先度は実は3つしかない。
Threadクラスが持っている、静的メソッドには以下がある。
スレッドへの参照を返す。
スレッドをmsec秒間停止させる。
現在のスレッドから他のスレッドに制御を明け渡す。

Threadクラスに定義されている主なインスタンスメソッドには以下がある。
なぜインスタンスメソッドなのかというと、おそらくスレッドごとに変数を持っているから。
名前を返す
優先順位を返す。
スレッドが生きているか?
スレッドのrun()
スレッドの名前変更
スレッドを開始する
スレッドの優先順位を変更する


★データの同期
 マルチスレッドプログラミングではデータの同期が必要な場合がある。
その場合、synchronizedというキーワードを用いることにより、メソッドを同期させることが可能である。
読んでみたのだが、staticな変数と、synchronizedの処理、staticな関数などの使い分けが
よくわからない。P276
とりあえずsynchronizedの処理をはずして以下のコードとしてみたところ、
private int balance = 0;

/* synchronized */ void deposit(int amount) {
balance += amount;
System.out.println("amaunt = " + balance);
}

なんと結果は70程ずれが出てしまった。
単位は10単位で行っているので、実質7ずれがあることになる。
それではbalance に対してstatic な変数としてみる。

private static int balance = 0;

/* synchronized */ void deposit(int amount) {
balance += amount;
System.out.println("amaunt = " + balance);
}

すると、今度は、140(実質14)もずれた。
へーこんなにずれてしまうものなのかと、不思議に思う。
じゃあ、volatileはどうか?volatileの説明では「不意に値が変更されることがある変数。」と
記載されているので、今回の条件にぴったりだろうと思い以下のコードで試してみた。

class Account {
private volatile int balance = 0;

void deposit(int amount) {
balance += amount;

// 口座の残高を表示する
System.out.println("balance = " + balance );
}

int getBalance() {
return balance;
}
}

結果
驚くべきことに2380(実質238回)のずれが生じた。
・・・volatileのJavaの使い道がまったく持ってわからん・・・


スレッドを使用するプログラミングでは同期が必ず必要なようだ。

★デッドロック P277
スレッドが3以上の場合に起こる、三すくみ状態のこと。
AはBの開放を待ち、BはCの開放を待ち、CはAの開放を待つ状態。
A->B->C->A

これを回避するために全てのオブジェクトに優先順位を与えるとよい。
また、wait() メソッドを用いることにより、スレッドを待機させることができる。
notify()メソッドはロック開放を待機しているスレッドに対して通知を送ることができる


★クラスライブラリの説明 P290
Randomランダムクラス
Dateクラス
Calendarクラス
などがある。

★Vectorクラス、Enumerationインターフェイス
ベクトル、イナムレーションと読む

ベクトルとは動的配列のことである。
動的配列の個数はデフォルトでは10個である。
イナムレーションはオブジェクトに対して一定の処理を繰り返すために用いる。

サンプルコード
package testpackage;
import java.util.*;

class testClass {

public static void main(String args[]) {

// ベクトルとその要素を作成する
Vector vector = new Vector();
vector.addElement(new Integer(5));
vector.addElement(new Float(-14.14f));
vector.addElement(new String("Hello"));
vector.addElement(new String("konnichiwa"));
vector.addElement(new Long(120000000));
vector.addElement(new Double(-23.45e-11));

// ベクトルの全ての要素を表示する
System.out.println(vector);

// ベクトルに要素を挿入する
String s = new String("String to be inserted");
vector.insertElementAt(s, 1); //sを1番目のオブジェクトに対して上書きする。
System.out.println(vector);

// ベクトルから要素を削除する
vector.removeElementAt(3);  //3番目の要素を削除する。
System.out.println(vector);
}
}

結果
[5, -14.14, Hello, konnichiwa, 120000000, -2.345E-10]
[5, String to be inserted, -14.14, Hello, konnichiwa, 120000000, -2.345E-10]
[5, String to be inserted, -14.14, konnichiwa, 120000000, -2.345E-10]


import java.util.*;

class testClass {

public static void main(String args[]) {

// ベクトルとその要素を作成する
Vector vector = new Vector();
vector.addElement(new Integer(5));
vector.addElement(new Float(-14.14f));
vector.addElement(new String("Hello"));
vector.addElement(new Long(120000000));
vector.addElement(new Double(-23.45e-11));

// ベクトルの要素を表示する
Enumeration e = vector.elements(); //要素の列挙を返す
while(e.hasMoreElements()) { //次に要素があるか?
Object obj = e.nextElement(); //要素がある場合には次の要素を取得して出力
System.out.println(obj);
}
}
}

結果
5
-14.14
Hello
120000000
-2.345E-10

★Stackクラス P302
使わないみたいです。

★Hashtableクラス P303
ハッシュ表はオブジェクトの保存と取得で用いられるクラスです。
ハッシュ名と値に分離することができる。

★StringToknizerクラス P305
文字列をトークンに分解するために用いる。

この辺から、Cのライブラリにあるものとあまり変わらなくなってきたので、
いいペースで進む。

★入出力 P311 この辺もMFCとかで使っていたクラスと似たようなクラスばかりなので
飛ばせる。
とりあえず、バイナリデータの送信に用いるバイトストリームと
文字データの送信に用いる文字ストリームがあることがわかった。
★P340 ランダムアクセスファイル。
これまでの例ではファイルに読み書きはできても、
特定の文字の変更、置き換えなどはできなかった。
(例えば、一行読み書きなど)
しかし、ランダムアクセスファイルを使用すれば、ファイルのどの位置にもシークすることが可能である。
RandomAccessFileクラスを用いる。

★12章 ネットワーキング 面白そうなので最後に取っておく。
最後までとっておいたのに、ページ数は少ないし、目新しいことなし。



★13章 アプレット
特徴
ブラウザ環境で実行される"アプリ"である。
ローカルディスクにはアクセスできない。(サンドボックスの中でしか動けない)
Java以外の言語は実行できない。
ダウンロード先にホストにソケットを開くことはできるが、それ以外のホストには接続できない。
現在では信頼できる入手先からダウンロードされたアプレットのみ、他のホストに接続できます。
実行する環境はブラウザの環境で実行されるか、もしくはアプレットビューアーでも実行できます。
ですが、基本的にはブラウザで実行するものみたいです。
なお、アプレット内に記載されているHTMLはアプレットでもなく、アプレットビューアでのみ使用する。

画面の処理では、表示しながら処理を行うため、描画更新処理は必須となる。
ちらつき防止の方法として、ダブルバッファリングという手法を用いる。
イベントトリブン・・イベントが起きたときのみ、イベントハンドラからのイベントが通知されること。
これの逆で、定期的にちゃんと表示されているかなーとか確認したりすることをポーリング(定期調査)といいます。
ポーリングはCPUを非常に消費するので、通常イベントトリブンで処理が行われます。



★14章
代行イベントモデル 一つのソースから一つ以上のリスナに効率よく送信できるようにしたもの
イベントを生成するものをソース(ハンドラみたいなものか?)という。
ソースの責任は主に3つあり
1、 イベントに関する登録通知、登録解除
2、 イベント生成
3、 登録されている全てのリスナにイベントを送信すること。

送信する際にはユニキャストやマルチキャストの設定が可能。


アダプタクラス:マウスイベントを取得したいときなどに、クリック、押下、離したときなどさまざまなパターンがあるが、
インターフェースを用いた場合、これら全てを実装しなければならない(空関数でもいいので実装しなければならない)。
いちいち全てを実装するのはめんどくさい場合に、アダプタクラスを使用することができる。
アダプタクラスを使用すると、オーバーライドしたいメソッドのみを実装すればよくなるので、非常に便利である。

アダプタクラスには
KeyAdapter キー押下、
MouseAdapter マウスのボタン押下
MouseMotionAdapter マウスの移動
他、などが用意されている。
場所的にはjava.awt.event の下である。

★インナクラス
クラスの中にクラスがあるつくりである。
このクラスの使い道としてはアダプタクラスの作成が簡単になるということです。


public class testClass extends Applet {
public void init() {
setBackground(Color.green);
addMouseListener(new MyMouseAdapter());
}

class MyMouseAdapter extends MouseAdapter {

public void mousePressed(MouseEvent me) { //オーバーライドしたメソッド。アクションが起きるとコールされる
setBackground(Color.red); //継承なしにAppletクラスの親クラスが持つメソッドを利用している。
repaint();
}

public void mouseReleased(MouseEvent me) { //オーバーライドしたメソッド。アクションが起きるとコールされる
setBackground(Color.green); //継承なしにAppletクラスの親クラスが持つメソッドを利用している。
repaint();
}
}
}

★無名インナクラス
これはちょっと衝撃的なソースである。
やっていることは、一つ上のコードと同じこと。
クラスの中身を引数として箇所に書くと、名前を決めなくてもよい

package testpackage;

import java.applet.*;
import java.awt.*;
import java.awt.event.*;
/*


*/

public class testClass extends Applet {

public void init() {
setBackground(Color.green);

addMouseListener(
new MouseAdapter() { //ここにインスタンスを生成してしまうのは上記と変わらないが、クラスの中身まで書いてしまっている。

public void mousePressed(MouseEvent me) { //オーバーライドしたメソッド。アクションが起きるとコールされる
setBackground(Color.red);
repaint();
}

public void mouseReleased(MouseEvent me) { //オーバーライドしたメソッド。アクションが起きるとコールされる
setBackground(Color.green);
repaint();
}
});
}
}



★15章 AWT
画面関連なので、ここは流し気味で・・・


と言う研修を7日程度でやりました。
あれだけ読むのに苦労したJavaでも、仕事として学習を行うと結構あっという間に読めてしまうものですね。
コメント(0)   2007.01.04    [ Myカテゴリ:時事・駄文 ]

Caderna N170J-301E にしてよかったと思いました。

あけおめ。でも、新年なんてどうでもいいや。
先日のブログにCaderna N170J-301Eを注文しましたと書きましたが、優柔不断な性格なので他にもいいパソコンが無かったのかなーともっと色々見回してみた所、やっぱりCaderna N170J-301Eにしてよかったなと思いました。

それはなぜかというと、あんまり調べてなかったので知らなかったのですが(注文する前に調べろよ>俺)、ノートパソコンのCPUって今のAMDはダメダメなんですね。個人的にAthlonXP-MとかAthlon XP 2500+(barton) とか旧世代のAMDの名CPUと呼ばれるCPUばかり使ってきたのでイメージ的にはAMDの方が速くていい石ばっかりだと思っていたのですが、どうも最近AMDのノートパソコン用のCPUは大した性能向上もないようです。turionもちょっと方向性が違いますし、SempronもCeleronMにかないません。結局ノートパソコンのCPUの選択肢はintelしかないようでした。

またintelなんですが、CeleronM 410~430はベンチだけを見ると皆が思っているよりも全然高速に動作する石のようです。そして我が core2 duoはどうかというと、低価格ノートパソコンCPUの革命といえる程のベンチマークを出しています。

というより、私はAthlonXP 2500+(barton)以来、あまりCPUのベンチマークをしてこなかったのですが、ここ数年のCPUの進化ってこんなもんだったのでしょうか?AthlonXP 2500+やAthlonXP-M(モデルナンバー2200だったかな?)をHDBENCHすると普通にinteger 80000, float 80000位行っていたと記憶しているのですが、何でturion, sempronは若干マシというくらいのスコアしかでないのか。ムーアの法則ってノートパソコンだと通用していないんですかね。

ちなみにsempron 3400+とCore2 DuoのCPUベンチは以下のようです。


Core2 Duo T5600
Processor Dual Pentium III 1832.16MHz[
GenuineIntel family 6 model F step 6]
VideoCard NVIDIA GeForce Go 7400
Resolution 1280x800 (32Bit color)
Memory 1046,508 KByte
OS 5.1 (Build: 2600) Service P
ack 2
Date 2006/12/14 17:34

Intel(R) 82801GBM/GHM (ICH7-M Family) Se
rial ATA Storage Controller - 27C4
プライマリ IDE チャネル
MATSHITA DVD-RAM UJ-842S

Intel(R) 82801GBM/GHM (ICH7-M Family) Se
rial ATA Storage Controller - 27C4
セカンダリ IDE チャネル
TOSHIBA MK1032GSX

Intel(R) 82801G (ICH7 Family) Ultra ATA
Storage Controllers - 27DF
プライマリ IDE チャネル

ALL Integer Float MemoryR MemoryW
MemoryRW DirectDraw
58566 262705 174397 144587 94207
187289 59

Rectangle Text Ellipse BitBlt Read
Write Copy Drive
22983 36432 11900 738 32435
24357 2536 C:\100MB


sempron 3400+
★ ★ ★ HDBENCH Ver 3.40 beta 6 (C)EP82改/かず ★ ★ ★
M/B Name
Processor Sempron 3400+ @ 2.3G 2301.92MHz[AuthenticAMD family F model C step 2]
VideoCard NVIDIA GeForce4 Ti 4200
Resolution 1280x960 (32Bit color)
Memory 818,736 KByte
OS Windows 2000 5.0 (Build: 2195) Service Pack 4
Date 2006/03/11 18:36

VIA Bus Master IDE Controller
プライマリ IDE チャネル
_NEC DVD_RW ND-3520AW

VIA Bus Master IDE Controller
セカンダリ IDE チャネル
IC35L080AVVA07-0

VIA SATA RAID Controller
Maxtor 7L250S0 BACE

SCSI/RAID ホスト コントローラ
NP1301A RNU608B 1.0

ALL Integer Float MemoryR MemoryW MemoryRW DirectDraw
57911 106901 125555 122523 80461 152207 59

Rectangle Text Ellipse BitBlt Read Write RRead RWrite Drive
79744 68751 13920 299 42261 66149 20475 34664 C:\100MB


ずいぶん違いますよねぇ。
トラックバック(0)   コメント(0)   2007.01.01    [ Myカテゴリ:時事・駄文 ]
Template Designed By
ぐらいんだぁ