スパコンにまつわる統計

スパコンの計算速度を基準としたランキングは、世間をにぎわせています。
このランキングは、Top500(http://www.top500.org/)にて閲覧、データダウンロードが可能です。

今回はこのサイトで実装されている解析機能を利用してスパコンに関する様々な統計(http://www.top500.org/statistics/list/)について見てみたいと思います。


/*----------------まずは2012年度のデータについて-----------------*/
http://www.top500.org/statistics/list/
#1.スパコンのベンダーについて(2012年)
巨人IBMがやはり最強といったところでしょうか。Fujitsu応援しています。
#2.OSについて(2012年)
Linuxが90%以上の圧倒的なシェアを占めています。Linuxはソースコードがオープンであるために、細かいチューニングが可能であり、ハイエンドユーザーにとって理想的なOSであるからだと考えられます。
#3.国別シェア
国別シェアでは予想されるようにアメリカが半分を占めています。中国がその次に来ていて日本は世界第3位です。GDPの順番を見ているような気持ちになります。


/*----------------各種データの経時的変化について(Development Over Time)-----------------*/

#4.ベンダーシェアの経時的変化
2008年頃からkaraIBMとHPが急速にシェアをのばしていることがわかります。Cray Inc.やSGIは一方でシェアを奪われてしまったようです。

#5.OSのシェアについて
ここ20年間の間でスパコンのOSはUNIX系OS(Unix, BSD, Linux)が圧倒的な地位を占めてきたことがわかります。その中でも面白いのがLinuxの急速な拡大です。Linuxは1991年に開発が開始されたとされていますが、それから10年もしないうちにスパコンで使用されるようになり、現在では90%を超えるスパコンに使用されていることがわかります。

Mac OS XのFilesystem Hierarchy


Mac OS XはUNIXベースのOSであることは周知の事実である。
Mac OS XはUNIXベースでありながら、Filesystem HierarchyはLinuxのそれとは若干異なっている。
詳しくは、
https://developer.apple.com/library/mac/#documentation/Darwin/Reference/ManPages/man7/hier.7.html
で確認することができる。
今回の環境はv10.6なので
https://developer.apple.com/library/mac/#documentation/Darwin/Reference/ManPages/10.6/man7/hier.7.html
が適している。


Terminal上でもMacのFilesystem Hierarchyの仕様は確認が可能である。

まず、実際のルート直下のディレクトリ構成を確認してみる。


$ ls /
Applications Library      System       Volumes      cores        etc          mach_kernel  private      tmp          var Developer    Network      Users        bin          dev          home         net          sbin         usr

manコマンドでhierを参照すると、各ディレクトリおよびファイルの内容が詳しく表記されている。

$ man hier
------------------------------------ここから-------------------------------
HIER(7)              BSD Miscellaneous Information Manual              HIER(7)

NAME
     h hi ie er r -- layout of filesystems

DESCRIPTION
     A historical sketch of the filesystem hierarchy.
     http://developer.apple.com/documentation/MacOSX/Conceptual/BPFileSystem/     outlines the modern Mac OS X filesystem.

     /             root directory of the filesystem

     /bin/         user utilities fundamental to both single-user and multi-
                   user environments
--------------------------------------以下省略-----------------------------

実際にはHIER(7)をベースとして大分変更がなされており、http://osxdaily.com/2007/03/30/mac-os-x-directory-structure-explained/で説明されているような構造となっている。

例のごとくFreemindを用いてMacのファイルシステムの階層を整理すると以下のようになる。




Filesystem Hierarchy Standard(FHS)

今回は、UNIX系OSのファイルシステムの標準規格であるFilesystem Hierarchy Standard(FHS) http://www.pathname.com/fhs/ について勉強しました。
FHSの目標はabstractにある以下の文章によって表現されています。

"This standard consists of a set of requirements and guidelines for file and directory placement under UNIX-like operating systems. The guidelines are intended to support interoperability of applications, system administration tools, development tools, and scripts as well as greater uniformity of documentation for these systems."

要するに、UNIXのファイルやディレクトリに関しての標準規格を定めることで、異なるUNIXシステム間の互換性を高めようと意図しているようです。

Freemindを用いてFHSの定めるファイルシステムの階層構造を表現してみました。



FHSの定める階層構造は、大変洗練されており、情報科学以外の他の学問領域にも応用が効くように思います。


【参考文献】
Filesystem Hierarchy Standard — Version 2.2 final Filesystem Hierarchy Standard Group edited by Rusty Russell and Daniel Quinlan  http://www.pathname.com/fhs/

UNIXコマンドのまとめ

UNIXコマンドをFreemindを用いて系統的にまとめました。

【参考文献】
林晴比古『Linux/UNIX入門』2000 SOFT BANK Publishing v - xx pp

Freemindで生物情報を階層化して整理

生物学の情報を整理する時は、「階層化」という方法を頻繁に用います。
今回は、Freemindというツールを用いて医学生物学の種々の学問領域間の関係性を描写してみました。


#インストールは下のサイトからインストラーをダウンロード
http://freemind.sourceforge.net/wiki/index.php/Main_Page

#Mac版のショートカットキーはこちら
http://freemind.asia/faqs/mac/mac-keys.html

ショートカットキーに関しては、

  • 並列にノードを足す:Enter
  • 直列にノードを足す:Tab
  •  ノードを上下左右に向けて動かす:Command + 矢印キー
  • ノードの削除:delete
  • 新しいファイルを作成:Command + n
  • ファイルを保存:Command + s
のことを知っておけば、基本的にはキーボードだけで操作できます。

File -> Export で好きなファイル形式で書き出すことが可能です。




java.awt.Frameの仕様を調べる方法

前回のブログでjava.awt.Frameクラスを題材にして、クラスやパッケージの概念について議路しました。
今回は、java.awt.Frameクラスの仕様をoracle社のサイト内から見つけ出す方法について書きます。
「このクラスの使い方知らないなあ」というときに、調べる癖をつけると良いと思います。

(1)Orcale社のトップページにいく
http://www.oracle.com/technetwork/java/index.html

(2)左下のEssential Links内の Java API'sをクリック
http://www.oracle.com/technetwork/java/api-141528.html
(3)自分の使用しているJavaのバージョンを選択。今回は、Java Standard Editionの中の
Java SE 7(http://docs.oracle.com/javase/7/docs/api/)を選択する。

(4)Packages内のjava.awtをクリック


(5)Class Summaryの中のFrameをクリック


やっとたどり着いた、Frameクラスの仕様を眺めてみると、クラス間の関係だったり、メソッドだったりと様々な情報を入手することができます。特に、冒頭の部分が役に立ちます。
Frameクラスは4つものスパークラスを持っていることがわかります。このため、Frameクラスがスーパークラスから継承したメソッドについては、スーパークラスのメソッドのページへのリンクを参照するような記載となっています。
また、以前議論したように、JFrameクラス(Swingパッケージに含まれる)は、Frameクラスを継承したサブクラスであることが一目瞭然でわかります。


AWTを題材にして、パッケージの概念について考える

AWTを題材にして、パッケージの概念について考えてみたいと思います。
何気なく、Javaの入門書に付属しているAWTの項目のソースコードを見ていると、

import java.awt.*;    //AWTの主要パッケージの取り込み

のような記述が目立ちます。今回はこの意味について考えてみたいと思います。
まずは、AWTプログラミングの原型を提示します。

///////////////////////////////////////////////////////////////////////////////////////////////////////////////

import java.awt.*; //AWTの主要なパッケージを読み込む

public class FrameTest
{
public static void main(String[] args) //main()メソッドからプログラムは開始される。
{
Frame f = new Frame("Hello"); //フレームを作成
f.setVisible(true); //フレームを可視化
}
}

///////////////////////////////////////////////////////////////////////////////////////////////////////////////

このソースコードは、
import java.awt.*;

import java.awt.Frame;
のように書き換えても正常に動作します。


///////////////////////////////////////////////////////////////////////////////////////////////////////////////


import java.awt.Frame; //AWTの主要なパッケージを読み込む

public class FrameTest
{
public static void main(String[] args) //main()メソッドからプログラムは開始される。
{
Frame f = new Frame("Hello"); //フレームを作成
f.setVisible(true); //フレームを可視化
}
}

///////////////////////////////////////////////////////////////////////////////////////////////////////////////


この説明には以下の図が助けになります。



import java.awt.*;    //AWTの主要パッケージの取り込み
というのは実は、java.awtパッケージに含まれているクラスの階層を丸ごと取り込んでいたいただけにすぎないのです。このことが理解できれば、

import java.awt.Frame;
のように、Frameクラスだけに狙いを定めてインポートすることが可能になります。



さらに興味深いこととして、プログラムの冒頭でインポートしなくても、Frameクラスのインスタントを生成するときだけ、Frameクラスを読み込むことが可能です。

///////////////////////////////////////////////////////////////////////////////////////////////////////////////


public class FrameTest
{
public static void main(String[] args)
{
java.awt.Frame f = new java.awt.Frame("Hello");   //Frameクラスを読み込んでフレームを生成
f.setVisible(true);
}
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////


ひとたびFrameクラスのインスタンスを生成してしまえば、その後は再度Frameクラスを読み込む必要はありません。下の例では、f.setSize()やf.setVisible()が、Frameクラスを呼び出さずにFrameクラスに定義されているメソッドを使用している例です。

///////////////////////////////////////////////////////////////////////////////////////////////////////////////

public class FrameTest
{
public static void main(String[] args)
{
java.awt.Frame f = new java.awt.Frame("Hello");
f.setSize(600,300);
f.setVisible(true);
}
}



///////////////////////////////////////////////////////////////////////////////////////////////////////////////

ちなみに、このプログラムの実行結果は以下のようになります。
$ javac FrameTest.java
$ java FrameTest



【参考文献】
アスキー書籍編集部『Java6 プログラミング講座』2007 ASCII 181 pp


AWTからSwingが開発されるに至った経緯

一般に、JavaでGUIを持つアプリケーションやアプレットを作成する、AWTとSwingを使用します。この二つの違いを理解するには、歴史的な流れを知る必要があるようです。

Javaができた当初から存在したのはAWTの方だったそうです。
AWTは、稼働するプラットフォームに処理をゆだねるという仕組みを採用していたために、次のような問題が生じました。

  1. パフォーマンスが悪い
  2. すべてのプラットフォームで一貫したGUIを提供するのが難しい
  3. プラットフォームの短所も引き継ぐ
そこでAWTの短所を克服する形で、Swingが開発されました。Swingは、AWTとな異なる仕組みを作用しており、Java対応のどのプラットフォームでプログラムを動かしてもまったく同じ外観と動作が得られます。Swingの利点を上げると、以下のようになります。
  1. ユーザーインターフェース要素の数が多く、各要素の機能も豊富である。
  2. プラットフォームへの依存度が少ないため、プラットフォームの機能に制限されることも少ない。また、各プラットフォームに固有のバグが少ない。
  3. すべてのプラットフォームで一貫したユーザーインターフェースを提供する。

このようにSwingはAWTを発展させる形で作られたため、現在ではGUIプログラミングを行う時は、Swingを用いるのが主流です。しかし、Swingは完全にSwingを置き換えているわけではなく、AWTの基本構造をベースにしているため、使用する上ではAWTの知識が必要となってきます。
【参考文献】
アスキー書籍編集部『Java6 プログラミング講座』2007 ASCII 178 - 180 pp

牛を描写するコマンド

牛を描写するコマンド、cowsayを紹介します。
このコマンドは、コメントと共にかわいい牛をターミナル内に描写することができます。
方法は簡単。
(以下はUbuntu 10.04の環境を前提とします)

# cowsayのインストール
$ sudo apt-get install cowsay

# cowsayの実行
$ cowsay "Hey, you"

 __________
< Hey, you >
 ----------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||

これはかわいいですね(^^)
こんなおちゃめなコマンドがソースコード付きで公開されているなんて楽しい世界ですね。この遊び心に、多くのことを学びました。




縦軸のログを取る意味の考察


単位が同じで異なる種類の変数を一つの折れ線グラフの中にプロットすることがあります。このとき、どうしても平均して大きい値を取る変数の方が大きな変化を示しているように錯覚しています。このようなことを防ぐには、縦軸のログを取ると良いです。

以下のグラフでは、upper, lowerのいずれも2倍、半分、2倍、半分、と変化しています。ログを取らないと、upperの方が大きく変化しているように見えてしまいます。そこで、ログを取ってみると、見事にそれぞれの群の変化が同じであることが可視化することが可能です。

#データの作成
upper <- rep(c(100,200), 10)
lower <- rep(c(10, 20), 10)

##データプロット(縦軸は通常のスケール)##
plot(upper, type = "l", ylim=c(0, 250), ylab = "Numbers")
lines(lower)
##データプロット((縦軸はログを取る)##
plot(log(upper), type = "l", ylim = c(1,6), ylab = "Log numbers")
lines(log(lower))


 縦軸のは通常のスケール


 縦軸のログを取ったグラフ
【参考文献】 Michael JC 著 野間口謙太郎他訳『統計学:Rを用いた入門書』2008 共立出33 - 34pp

Rによる中心値の計算 -関数定義の研究-

今回は、Rで中心値(算術平均、中央値)の計算を行う方法について検討したいと思います。Rには使い勝手の良い組み込み関数が存在しますが、アルゴリズムを知る意味で、ここは敢て関数を定義して使用します。

############関数の定義#############

##算術平均を計算する関数##
arithmetic.mean <- function(x) {
sum(x)/length(x)
}

##中央値を計算する関数##
mymedian <- function(x){
odd.even <- length(x)%%2    #要素数を2で割った時の余りを計算
    if(odd.even == 0)               #要素数が偶数のとき
        (sort(x)[length(x)/2] + sort(x)[length(x)/2 + 1])/2    #中央にある2値の算術平均を計算
    else                                    #要素数が奇数のとき
        sort(x)[ceiling(length(x)/2)] #ceiling(x)はx以上で最小の整数を返す
}

############関数のテスト#############

#データの作成
odd <- c(1,2,3,4,5,6,7) #奇数
even <- c (1,2,3,4,5,6) #偶数

##算術平均の計算##
arithmetic.mean(odd)

[1] 4
#Rの組み込み関数による計算
mean(odd)
[1] 4

##中央値の計算##
#要素数が偶数のデータ
mymedian(odd)
[1] 4
median(odd)  #組み込み関数medianで計算
[1] 4
#要素数がのデータ
mymedian(even)
[1] 3.5
median(even)  #組み込み関数medianで計算
[1] 3.5

【参考文献】
Michael JC 著 野間口謙太郎他訳『統計学:Rを用いた入門書』2008 共立出版  28 - 32pp