2014年6月8日日曜日

Spotifyを使ってみて思った。音楽にお金を出すということ。

Spotifyを使ってみた

音楽ストリーミングサービスのSpotifyを使ってみました。Spotify日本では消費者を置き去りにした業界の事情によりまだ使えないみたいですが、すでに全世界で2000万人を越えるユーザがいる大人気サービスです。

僕はいまアメリカにいるので、何も後ろめたいこともせずに普通に楽しめているわけですが、正直な感想としてこれがタダで使えるのは非常に革新的に思えます。

Spotify自体は日本にいることから知ってましたが、実はYoutubeやTuneInで音楽は聞いていたので、まあ同じようなもんだろうと思って大して期待してませんでした。

しかしながら使ってみると、使い勝手の満足度として大きな違いがあります。
理由としては大きく以下の2つがあげられると思います。

1. 配信している楽曲数が多い
2. 楽曲の選び方の自由度が高い

Spotifyでは1500万以上の楽曲があるようです。
音楽というのは気分や日によって聞きたいものが全く違ったりするので、やはりバラエティは非常に重要です。

またアーティスト・楽曲を選択して再生できます。
ときどきピンポイントで聞きたくなる曲があるので、これは個人的に非常に満足度が高いです。

加えてロック、ポップなど「ジャンル」で指定できるもはもちろんのこと、パーティやロマンティックなど「気分」で指定することも可能です。指定すれば、適当に選択された音楽がエンドレスに流れるのでなんとなく音楽を流したいときとしては最適です。

TuneInとかYoutubeよりも多数の楽曲の選択肢の中から、聴きたい曲をきめ細やかに選べるので、これも非常に満足度が高いです。


楽曲購入はiPhoneの有料アプリを買うくらい抵抗がある行為になる

無料でここまで音楽が自由自在に聴けることを考えると、今後はますます音楽を購入するハードルが高くなる気がします。CD不況は久しく騒がれてますが、かと言って多少安いデジタルデータならば売れるという状況にもならなそうです。

楽曲を購入するという需要は決してなくならないとは思いますが、お金を出すという意味において、配信サービスと楽曲の購入という関係は、iPhone(Andoroid)の無料アプリと有料アプリのような関係になるのではないかな、と想像しています。

つまりリスナーにとって配信サービスを利用するのはiPhoneの無料アプリを使うようなもので、逆に音楽を購入するというのは有料アプリを買うようなもの。

現在、多数の高品質な無料アプリが手に入るようになったがために、100円のアプリですら購入のハードルが高く感じる方は多くいると思います。同様に、今後は音楽にお金を出すのに非常に抵抗を感じる方が多くなってくるのではないでしょうか。特にCDを購入した経験がほとんどない若い人たちを中心に。


おまけ

spotifyの感想ブログを貼っておく。










2014年6月5日木曜日

html5のcanvasで多角形を書いてみた

html5のcanvasタグを使って3角形,4角形,5角形といった多角形を書いてみました。

一応999角形まで表示できますが、これくらいの大きさだと50角形を超える辺りで全部円にしか見えなくなりますね。

三角形

 六角形

 十二角形

 五十角形




<!DOCTYPE html>
<html>

<head>
<script language="javascript">
var radius = 150;
var center_x = 200;
var center_y = 150;

function draw_polygon(){
    var vertex = document.forms["vertex"]["quantity"].value;

 var a = 2 * Math.PI / vertex;
 var arr_x = [];
 var arr_y = [];

 for(var i= 0; i < vertex; i++){
   var rad =(i + 1) *  2 * Math.PI / vertex;
   arr_x[i] = center_x + radius * Math.cos(rad);
   arr_y[i] = center_y + radius * Math.sin(rad);

 }

 var canvas = document.getElementById("myCanvas");
 var ctx = canvas.getContext("2d");
 ctx.clearRect(0,0,canvas.width,canvas.height);
 ctx.beginPath();
 ctx.moveTo(arr_x[0],arr_y[0]);
 for(var i= 1; i < vertex; i++){
     ctx.lineTo(arr_x[i],arr_y[i]);
 }
 ctx.lineTo(arr_x[0],arr_y[0]);
 ctx.stroke();
}
</script>
</head>
<body>
<form id = "vertex" onsubmit="draw_polygon();return false;">
  Specify the Quantity (between 1 and 999): <input type="number" name="quantity" min="1" max="999" placeholder="4">
  <input type="submit">
</form>
<canvas id="myCanvas" width="600" height="300" style="border:1px solid #c3c3c3;">
Your browser does not support the HTML5 canvas tag.
</canvas>

</body>


</html>

2014年5月13日火曜日

Puppet Enterprise と Puppet Open Sourceの違い

オープンソースなIT自動化ソフトウェアとして有名なpuppetですが、2つのエディションがあるようです。

Puppet Enterprise

  •  Graphical User Interface
  •  Event Inspector - Visualize Infrastructure Changes
  •  Supported Modules
  •  Provisioning - Amazon EC2
  •  Provisioning - Google Compute Engine
  •  Provisioning - VMware VMs
  •  Configuration management - Discovery
  •  Configuration management - User accounts
  •  Configuration management - Operating systems & applications
  •  2,000+ pre-built configurations on Puppet Forge
  •  Orchestration - Task automation
  •  Role-Based Access Control - Now with external authentication support
  •  Unified cross-platform installer of all components
  •  Support  - Option for 24 x 7 x 365
  •  Support  - Defined SLA
  •  Certified by Puppet Labs engineers
  •  Pre-packaged dependencies in one directory
  •  Smooth upgrade and maintenance path
(*)太字はOpen Source版にもある機能を示しています


Puppet Open Source

  •  Provisioning - Amazon EC2
  •  Provisioning - Google Compute Engine
  •  Configuration management - Operating systems & applications
  •  2,000+ pre-built configurations on Puppet Forge


こうして比較してみると、結構Open Source版は機能が劣る印象があります。
Supportがないのはまあ当然としても、GUIとかVMwareのプロビジョニングぐらいはOpenSource版でも欲しい気がします。


ちなみにEnterprise版のお値段ですが10ノードまでは無料。
それ以降は下記のようになってます。

ノード数 Standard Support(1ノードあたり) Premium Support(1ノードあたり)
1-10 Download FREE N/A
11-99 $112 要問い合わせ
100-249 $105 $199
250-499 $99 $135
500-999 $95 $119
1000-2499 $93 $112
2500+ 要問い合わせ 要問い合わせ

Standard Supportでもノード一台あたり100ドル前後ってかなり高い気がしますが、Enterprise版は売れてるんですかね。


参考

2014年5月10日土曜日

TomcatとFirefoxのCache設定

Tomcatなどを使ってWeb開発をしていると、htmlとかwarの修正が、ブラウザ上に反映されなくて悩むことがたまにある。

以前からちょくちょく悩んでは適当に対応していたのだが、この度本格的に困ったので方法を探してみた。

Webを探しても、あまり情報が無かったり、なぜか私の環境では有効でなかったりしたので備忘録としてまとめる。


環境

 OS       Macbook Air 10.8.5 Mountain Lion
 ブラウザ  Firefox 28
 サーバ   Tomcat 7.0.52

Firefoxの設定

  1. ブラウザのアドレスバーにabout:configと入れる。
  2. 「動作保証対象外になります」とメッセージが出るので、「最新の注意を払って使用する」をクリックする。
  3. 「検索」にbrowser.cache.memory.enableを入力する。
  4.  browser.cache.memory.enableが表示されるので、ダブルクリックをして設定値をdisableにする。
  5.  同様にbrowser.cache.memory.enableの値もdisableにする。
  6.  Firefoxを再起動する

Tomcatでデプロイ時にやること


Webを探した限りではデフォルトの設定では特にcache等してないようだった。
ただし、webapp配下にデプロイするwarを置き換えて、tomcatを再起動しただけだと、なぜかwebapp配下に自動unpackされるはずのディレクトリの内容が更新されていなかった。

そのため、warを置き換える前に、自動unpackされるディレクトリを削除しておいた。

例を上げて説明すると、example.warを配置する場合下記の手順で行った。

  1. example.warを作る
  2. <tomcatのホームディレクトリ>/webapp/exampleディレクトリを削除
  3. example.warを<tomcatのホームディレクトリ>/webapp/example.warに配置
  4. tomcatの再起動



今回は、terminalでtomcatを起動してごにょごにょやっているんですが、Eclipseからtomcatを起動した時はここまで更新されない現象に悩まされなかった気がします。
Eclipseさんはなにか特別なことをやってるんだろうか。





2014年4月4日金曜日

java.lang.IllegalStateExceptionの対処法

JavaEE7のRemoteEndpoint.Async.sendText()を連続して呼び出すと、java.lang.IllegalStateExceptionがスローされることがあります。

これは、sendText()の処理が終わる前に、再度sendText()が呼び出されたためです。
sendText()の処理は非同期で行われるために、メソッドが戻ってきたとしてもメッセージ送信が終了している保証はありません。

これを防ぐためには、sendText()の戻り値であるFutre型のオブジェクトのget()を呼び出して、処理が終わるのを待つ必要があります。



 public void sendMessageToBrowser(String message) {
  for (Session s : sessions) {
   Future future = s.getAsyncRemote().sendText(message);
   try {
    future.get();
   } catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   } catch (ExecutionException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
  }
 }

2014年4月1日火曜日

websocketのサンプルコードをJavaEEで書いた

JavaEE7にはwebsocketを実装したパッケージ(javax.websocket)が提供されています。

これを使ったサンプルコードを書いてみました。
ブラウザから入力された数字の数だけ、適当な文字列(数字列)を接続している全ブラウザに表示するコードです。

まずはJava側。Servletクラスとかを継承しなくていいみたいです。
注意が必要なのは、RemoteEndpoint.Async.sendText()はFuture型のオブジェクトを返すということ。つまり、sendText()メソッドの処理は非同期で行われます。

sendText()はその仕様として処理が終わる前に、再び呼び出されるとjava.lang.IllegalStateExceptionを送出します。そのため、for文などを用いて繰り返し、メッセージを送りたい場合はFuture.get()などを用いて、処理が終わるのを待ってから次のメッセージを送るようにします。

import java.util.Collections;
import java.util.HashSet;
import java.util.Random;
import java.util.Set;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;

import javax.websocket.OnClose;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;

@ServerEndpoint("/endpoint")
public class Main {
    static Set<session> sessions = Collections.synchronizedSet(new HashSet<session>());
    @OnMessage
    public void onMessage(String message) {
        int count = Integer.valueOf(message);
        run(count);
    }

    @OnOpen
    public void open(Session sess) {
        sessions.add(sess);
    }

    @OnClose
    public void close(Session sess) {
        sessions.remove(sess);
    }

    public void sendMessageToBrowser(String message) {
       for (Session s : sessions) {
           Future future = s.getAsyncRemote().sendText(message);
           try {
                   future.get();
           } catch (InterruptedException e) {
                  // TODO Auto-generated catch block
                  e.printStackTrace();
           } catch (ExecutionException e) {
                 // TODO Auto-generated catch block
                 e.printStackTrace();
           }
       }
    }
 
    private void run(int count){
        Random rnd = new Random();
  
        for(int i = 0; i &lt count; i++){
                 String s = String.valueOf(rnd.nextInt());
                sendMessageToBrowser(s);
        }
    } 
}

続いてhtml。

<!DOCTYPE html>
<html>
    <head>
        <title>WebSocketテスト</title>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <script src="http://code.jquery.com/jquery-1.9.0.js"></script>
        <script type="text/javascript">
            var socket;
            $(document).ready(function(){
             var server="ws://localhost:8080/temporary/endpoint";
                socket = new WebSocket(server);
                
                socket.onmessage = function(message){
                    $('#messageFromServer').append(message.data + "<br/>");
                };

                $('#send').click(function(){
                    var text = $('#msg').val();
                    socket.send(text);
                })

            });
        </script>        
    </head>
    <body>
        <div id="messageFromServer">
        input the integer</div>
        <input id="msg" type="text"/>
        <button id="send">go</button>
    </body>
</html>

参考文献
WebSocketをネタにJava EE 7正式版を試してみる

2014年3月14日金曜日

Mac X 10.8.5(Mountain Lion)のEclipseでJDK7を利用する方法

Mac OS X上のEclipseでJDK7を入れる方法をググると情報が錯綜しているようなので私がやった方法をまとめてみた。

1. まずOracleのサイトからJDKを取得(*)

2. dmgを叩いてインストール。

3. Eclipse->Preference->Java->Installed JREを開き、下記の場所をJRE Homeに指定。

Library/Java/JavaVirtualMachines/jdk1.7.0_51.jdk/Contents/Home/

(*)Apple公式から落とすとの情報もあったが、ファイル名にバージョンの表記がなくよくわからなかったので、Oracleから落とした。

JDKのインストール場所がわからなくって結構困った。

またjava preferences というアプリが、/Utility/Application配下にあり、ここにパス情報が書かれているとの情報が良く出てくるが、最近ではなくなっているようだ。

参考文献。
MacにJDK7をインストールしたからといってAppleのJDK6を消してはいけない

java preferencesがない