「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の公式サイトのサンプルを見ると、いろいろ出来そう使いこなせると楽しそう。
だたの棒グラフの描画でも、それなりにロジックを書かないと行けないので、
使いこなせるようになるには、それなりに頑張る必要がありそう。
インタラクティブ・データビジュアライゼーション ―D3.jsによるデータの可視化
- 作者: Scott Murray,長尾高弘
- 出版社/メーカー: オライリージャパン
- 発売日: 2014/02/19
- メディア: 大型本
- この商品を含むブログ (2件) を見る
「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