はらこメモ

プログラミングに関して調べたことについてのメモ書きです。言語はバラバラ…。

「Java」Listから配列に変換

List型(ArrayListなど)から配列に変換する場合は、toArrya()を使う。

ArrayList<String> arrayList = new ArrayList<String>();
arrayList.add("a");
arrayList.add("b");
arrayList.add("c");

String[] arrayString = (String[])arrayList.toArray(new String[arrayList.size()]);

System.out.println(Arrays.toString(arrayString)); //[a, b, c]

toArrayメソッドに引数を指定しない場合は、
java.lang.ClassCastExceptionが発生するので注意!

知らずに引数を指定せずに使用してClassCastExceptionが発生して調べてしまった。。。

また、配列の中身を出力したい場合は、for文で回さなくても
Arrays.toString()メソッドを使えば分かりやすく出力できる。

参考サイト
list.toArray(new String[list.size()])なの?list.toArray(new String[0)])なの? - 悪あがきプログラマー
Javaで配列を標準出力する - 勉強日記

D3.jsを少し使ってみた

■D3.jsについて
 ・JQuery風のJavaScriptライブラリ。
   ※メソッドチェーンで記述できる。
 ・JQueryと同じでDOMを簡単に操作できる。
 ・SVG(Scalable Vector Graphics)形式でグラフを描画したり操作したりすることができる。
・D3.jsはグラフ描画ライブラリではなく、
  データを可視化するための座標計算を行ってくれるライブラリ。
 ・複雑なグラフを描くには結構ロジックが難しい・・・。
 ・SVGについての知識が必要。
 ・canvas等で描画するグラフ等と違って、各オブジェクトの操作やイベント取得が簡単。
  たとえば、グラフに対してマウスオーバーした際に詳細情報を表示することができる。
 ・グラフに対してアニメーションも追加できる。
 ・修正BSDライセンスで商用利用可能。
 
公式サイト:http://d3js.org/

SVGについて
 ・ベクタ画像のため、拡縮してもきれいに表示することが出来る。
 ・IE9から対応している。

■レイアウト(グラフ)の種類

Bundle
Chord
Cluster
Force
Hierarchy
Histogram
Pack
Partition
Pie
Stack    
Tree     
Treemap

レイアウトについては下記ページを参照。
  https://github.com/mbostock/d3/wiki/Layouts

■棒グラフの描画例(SVG

ソースコード

<div id="Graph1"></div>
<script src="http://d3js.org/d3.v3.min.js" charset="utf-8"></script>
<script>

//データ
var dataset = [5,10,20,30,25,20,5];

//DIVタグ(id="Graph1")にSVG要素を追加
var svg = d3.select("#Graph1")
            .append("svg")
            .attr("width",500)
            .attr("height",50);

//SVG要素にグラフを描画
svg.selectAll("rect") //矩形要素を選択
   .data(dataset)   //データをバインド
   .enter()
   .append("rect")  //矩形要素を1つ選択
   .attr("x",function(d,i){ return i * 21; }) //X軸を計算(幅+1px)
   .attr("y",function(d,i){ return 50 - d;}) //y軸を計算(上から下へ描画するっぽい)
   .attr("width",20) //幅指定
   .attr("height", function(d){ return d;}); //高さ指定

</script>


・実行例


■ひとこと
D3.jsの公式サイトのサンプルを見ると、いろいろ出来そう使いこなせると楽しそう。
だたの棒グラフの描画でも、それなりにロジックを書かないと行けないので、
使いこなせるようになるには、それなりに頑張る必要がありそう。

「Java」例外チェーン

try-catch文でcatch文で例外が発生した場合、
そのままスローすると、元の例外を潰してしまう。

initCause()メソッドで元の例外のスタックトレース
catch文で発生した例外に追加することができる。

public class ExceptionTestMain {
	public static void main(String[] args) {
		try {
			System.out.println("exception test start");
			try{
				//例外1
				throw new Exception("exception 1");
			}catch(Exception e1){
				try{
					//さらに例外2が発生
					throw new Exception("exception 2");
				}catch(Exception e2){
					//例外2に例外1をチェインする。
					e2.initCause(e1);
					throw e2;
				}
			}
		} catch (Exception e) {
			//例外のスタックトレースを表示
			e.printStackTrace();
		}
	}
}

実行結果

exception test start
java.lang.Exception: exception 2
	at exceptionTest.ExceptionTestMain.main(ExceptionTestMain.java:16)
Caused by: java.lang.Exception: exception 1
	at exceptionTest.ExceptionTestMain.main(ExceptionTestMain.java:12)

node.jsメモ

■node.jsについて
JavaScriptで記述された処理をサーバーサイドで実行できるサーバのこと。
・Socket.Ioを利用してリアルタイム通信が可能(WebSocket通信)。
 →ブラウザでF5なのでサイトをリロードしなくても最新データが取得でき、
  非同期通信であるAjaxとは異なり、ブラウザからのリクエストのがなくてもサーバからプッシュできる。

■node.jsのインストール

node.jsのサイトでインストールをクリックしてファイルをダウンロードする。

tar.gzをダウンロードされるので解凍する。

 tar zxvf node-vxx.xx.xx.tar.gz
 cd node-vxx.xx.xx
 ./configure
 make
 make install

モジュールのインストール
・npmというコマンドでnodejsのモジュールをインストールすることができる。
・expressは、nodejsのWEBフレームワーク
・socket.ioは、WebScoketのモジュール

npm install socket.io express

※-gオプションありの場合は/usr/local/lib/node_modules/にインストールされる(CentOSの場合)

  • gオプションなしの場合はカレントディレクトリにインストールされる。

■チャットアプリ
Web+DB press Vol71にチャットアプリが紹介されていたので動かしてみた。
http://gihyo.jp/magazine/wdpress/archive/2012/vol71

σ(・_・)なりにコメントを"φ(・ェ・o)~メモメモ。

Server.js

// Expressフレームワークの生成
var express = require('express')
  , http = require('http')
  , app = express()
  ;

//公開ディレクトリ指定
app.use(express.static(__dirname + '/public'));

//ポートの指定
var server = http.createServer(app).listen(3000);
console.log('server start:', 3000);

// Socket.IOの生成
var io = require('socket.io')
  , io = io.listen(server)
  ;

//接続時の処理
io.sockets.on('connection', function(socket) {
 //ログインされたことを通知
  io.sockets.emit('login', socket.id);
 
  //書き込みがpostされたときの処理
  socket.on('post', function(data) {
  //postされたデータをすべてのユーザーに送信
    io.sockets.emit('post', { id: socket.id, post: data }); 
  });
});

クライアント側
chat.js

$(function() {
  var socket   = io.connect()
    , $posts   = $('ul#posts')
    , $message = $('input#message')
    ;

  //ログイン通知を受け取ったときの処理
  socket.on('login', function(data) {
    var $li = $('<li>').text(data + ' さんがログインしたよ');
    $posts.prepend($li);
  });

 //POST通知を受け取ったときの処理
  socket.on('post', function(data) {
    var $li = $('<li>').text(data.id + ' さんが言った ' + data.post);
    $posts.prepend($li);
  });

  //送信ボタンを押したときの処理
  $('input#update').on('click', function(e) {
    var message = $message.val();
    if (message.length === 0) return;
    socket.emit('post', message);
    $message.val('');
  });
});

index.html

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>chat</title>
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
    <script type="text/javascript" src="/chat.js"></script>
  </head>
  <body>
    <h1>chat</h1>
    <input id="message" type="text"></input>
    <input id="update" type="submit" value="update"></input>
    <ul id="posts"></ul>
  </body>
</html>

MongoDBについてメモ

・MongoDBはNoSQL(Not SQL)に分類されるデータベースの一つ。
・データをキーと値の組合せで記録する。
・BSON(Binary JSON)形式でデータを保存する。
例えば、

{name:"aaa",age:26,mail:["xxxx@aaa.com","yyy@xxx.jp","zzz@yyy.net"]}

スキーマレス
MySQL等のRDBでいうCREATE TABLEが必要ない。
同じコレクション(RDBでいうとテーブル)に異なる構造のBSONを保存できる。

トランザクション、表の結合はできない。

MongoDBをCentOS(64bit)にインストールしてみた。

YUMリポジトリが提供されているので、
下記に設定ファイルを新規に作成して登録する。

/etc/yum.repos.d/mongodb.repo
[mongodb]
name=MongoDB Repository
baseurl=http://downloads-distro.mongodb.org/repo/redhat/os/x86_64/
gpgcheck=0
enabled=1

yumコマンドでMongoDBをインストール

yum install mongo-10gen mongo-10gen-server

インストールが終わったらMongoDBサーバを実行する。

/etc/init.d/mongod start

次から自働的に起動するように設定する。

chkconfig --add mongod
chkconfig mongod on

参考:http://docs.mongodb.org/manual/tutorial/install-mongodb-on-red-hat-centos-or-fedora-linux/

使ってみる。

$ mongo
MongoDB shell version: 2.4.8
connecting to: test

#データベースの切り替え
>use memodb
switched to db memodb

#コレクションにデータの保存(userというコレクションにデータを保存する)
db.user.save({name:"aaa",age:26,
mail:["xxxx@aaa.com","yyy@xxx.jp","zzz@yyy.net"]});

#コレクションから検索
> db.user.find({name:"aaa"});
{ "_id" : ObjectId("5295f9fd14dc5c7c99bf9817"), "name" : "aaa", "age" : 26, 
"mail" : [  "xxxx@aaa.com",  "yyy@xxx.jp",  "zzz@yyy.net" ] }

> db.user.find({mail:"yyy@xxx.jp"});
{ "_id" : ObjectId("5295f9fd14dc5c7c99bf9817"), "name" : "aaa", "age" : 26, 
"mail" : [  "xxxx@aaa.com",  "yyy@xxx.jp",  "zzz@yyy.net" ] }
※配列のデータをキーにしても検索できた。

#コレクションからデータの削除
> db.user.remove({name:"aaa"})

PHPから利用できるようにしてみる。
PECLのmongoをインストールする。

pecl install mongo

gcc等がインストールされていないとエラーになる。

php.iniに下記を追加

extension=mongo.so

httpdの再起動をしてphpinfo()にmongoが表示されていればOKなのかな。

PHPからMongoDBを使ってみる。

<?php
  $mongo = new Mongo("localhost:27017");

  //DBの選択
  $db = $mongo->selectDB("memodb");

  //コレクションの選択
  $collection = $db->selectCollection("user");

  //コレクションにデータの保存
  $collection->insert(array("name"=>"aaa","age"=>26,
    "mail"=>array("xxxx@aaa.com","yyy@xxx.jp","zzz@yyy.net")));

  //コレクションからデータの検索
  $cursor = $collection->find(array("name"=>"aaa"));

  //検索結果を表示
  foreach($cursor as $cur){
    print_r($cur);
  }

  //コレクションからデータを削除
  $collection->remove(array("name"=>"aaa"));
?>

・実行結果

Array ( [_id] => MongoId Object ( [$id] => 529607a77f8b9aea1417e1b3 )  
[name] => aaa [age] => 26 
[mail] => Array ( [0] => xxxx@aaa.com [1] => yyy@xxx.jp [2] => zzz@yyy.net ) ) 

PHPでPermission deniedのエラーが発生した場合は下記を実行する。
 参考:http://php.net/manual/ja/class.mongoconnectionexception.php

$ /usr/sbin/setsebool -P httpd_can_network_connect 1
$ /etc/init.d/httpd restart