2013年10月16日水曜日

Surface Proを頂いたのでレビューしてみる

友人から格安でSurface Pro(以後Surface)を譲っていただいたので、早速レビュー記事をSurfaceで書いてみる。

前提

Surfaceは128GBモデル + Type Cover
普段はMBPR 13inchを使用。会社ではWindows7 ProでキーボードはFilcoのMINILAを利用。マウスはLogicoolのタッチパッド。

タブレットとしてみたSurface

非常に高機能。ポメラみたいな使いかたもやろうと思えば可能。ソフトウェアの拡張性は非常に高いが、MSのストアアプリは少ない気がする。RTを購入する場合、この部分に関して非常に気をつける必要があると思われ。


ストアアプリを使えばこのような画面レイアウトで使うことができるので、用途次第ではかなり使いやすいハードウェアになると思う。
手持ちする場合、タブレットにしては大きく、重いという印象は拭えない。片手間で情報を検索したり、見るためのタブレットとして見るよりは、タブレットをメインにして作業するための端末という方が正しいのかもしれない。

ノートパソコンとしてのSuface

本気のベンチマークを行っていないのでなんとも言えないが、スペックをみた感想としては普通にモバイルノート押して使うことは難しくないとおもう。タブレットとノートパソコンとの大きな差異であるキーボードに関しては、Type Coverがオプションといてあるので、タッチパネル特有の指先で認識できない感覚はないが、キーとキーとの間があまり開いていないので、指先でキーを認識するのには時間が掛かりそう。またパームレストが小さいので、手が大きかったり、指を伸ばしながら叩くような癖のある人はパームレストに無理やり手のひらを乗せながら打鍵するのは難しいかもしれない。
ノートパソコンはひざ上でも使うことができるが、Surfaceはキックスタンドでディスプレイの傾斜角が固定されているため、ひざ上でキックスタンドを使用すると非常に傾斜角がきつくて見づらい。また、キックスタンドはひざ上では非常に不安定。Type Coverは曲がりやすいため、これもまたひざ上で使いにくくしている要因の一つになっている。机以外の場所で使うときはCoverはとって使ったほうがいいと思われる。Coverが使える場所は非常に限定的と言っても言い過ぎではないだろう。
Coverに付いているタッチパッドは非常に使いにくい。二本指スクロールが認識されなかったり、タップによる左クリックも認識されないと、使ってて不満点がおおい。また、非常に小さいのでカーソル動かすにも、非常に疲れる。
ディスプレイにかんして、この小ささでFull HDをいれてきたのは非常にうれしい。表示できるデータ量が多くなるのでモバイル用途として使うにも満足したものになっている。また発色も鮮やかなので、動画を見るときにもすごく綺麗に見れて、非常に良い。ただし、やはり高解像度なので文字やボタン類が小さくなってしまうので、タッチやペンでは誤って操作してしまう可能性が高くなる。

2013年9月21日土曜日

【Cookie Clicker】Chromeの拡張機能で自動クッキークリックスクリプトを作ってみた【日本語ローカライズ版対応済み】

また久しぶりの投稿。今話題のCookie Clickerのクッキーを自動的にクリックするスクリプトを作成しました。(拡張機能を作成するのははじめて。)
注意:この拡張機能で何らかの不具合が発生しても、当方では一切の責任を負いません。
パッケージをダウンロード(v1.11)

導入方法

  1. Google Chromeでchrome://extensions/にアクセスする。
  2. DLしたパッケージを先にアクセスした拡張機能一覧ページにD&Dする。出てくるウィンドウにはOK等、承認する。
  3. Cookie Clickerにアクセスする。

停止方法

拡張機能を削除する。

何をするか?

  • 10ms間隔でクッキーをクリックする
  • クッキーシャワーなど、レタリングでかなりの処理を必要とするものに関しては、CSSで見えなくする(display:none)
  • クッキーカウント等がごちゃごちゃするのでカウント部分に関してはフォントを等幅フォントにする

動作確認済み

Mac OS X 10.8 + Chrome 29.0.1547.65
Ubuntu 13.04 + Chrom'ium' 28.0 (@_popopopoon_さんのご協力)

よくよく考えたら何番煎じだよって話ですよね。

もし動かないのであればソースマップの読み込みエラーが考えられるので、
ChromeでjQueryの「ソースマップ」読み込みがエラーを起こしていた件 | design programming
を試してみてください。

改変等したい場合は一度言ってくれればソース公開してライセンス明記します。いまはその必要も無いかなーと思うのでやってませんが。

【追記 2013/09/22 22:59】
Update v1.1
日本語ローカライズ版Cookie Clickerに対応しました。

【追記 2013/09/22 23:51】
Update v1.11
ソースマップの問題の改善

2013年8月13日火曜日

エラトステネスの篩(ふるい)をRで適当にコーディング

たまには投稿しないと忘れられそうなのでなんとなく書いたコードを一つ.

素数を求めるアルゴリズムとして有名なのに「エラトステネスの篩(ふるい)」というのがある.

参考: エラトステネスの篩 - Wikipedia

会社でなぜか素数が話題に上がっていたのを遠目で見ていたので,Rで簡単にコーディングしてみた.もっと簡単にコーディングできると思うが,とりあえず適当に.命名が適当なのを治したい.

sieve_of_Eratosthenes <- function(max_num){
    master_vector <- 2:max_num #自然数列
    temp_num <- 1 #素数初期値(2より小さい数を適当に指定)
    return_vec <- NULL #素数列格納用
    while(temp_num < max(master_vector)){
        temp_num <- min(master_vector) #対象素数の決定
        return_vec <- c(return_vec, temp_num) #対象素数を素数列に格納
        temp_times <- floor(max(master_vector) / temp_num) #対象素数の倍数の最大値
        temp_times_vec <- c(temp_num*(1 : temp_times)) #対象素数の倍数列
        for(i in temp_times_vec){
            master_vector <- master_vector[i != master_vector]
        }
        if(!length(master_vector)) break
    }
    return(return_vec)
}

実行例:
> sieve_of_Eratosthenes(200) #200までの素数を求める
[1] 2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67
[20] 71 73 79 83 89 97 101 103 107 109 113 127 131 137 139 149 151 157 163
[39] 167 173 179 181 191 193 197 199

2013年6月14日金曜日

jQueryの複数Version共存と無名関数

例えば,ある公開中の顧客のサイトで何かのPluginを動かしたいとする.そのPluginはjQuery1.9.1以降であれば動作するが,それ未満であった場合,動作しないことが確認されている.しかし,顧客のサイトはjQuery1.2.6が導入されており,そこですでに使用されているPluginはjQuery1.9.1では動作しないことがわかっている.次の場合,単純にjQuery1.9.1をjQuery1.2.6が読み込まれた後に読み込むと,jQuery1.9.1になってしまう.

<html>
<head>
  <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.2.6/jquery.min.js" type="text/javascript"></script>
  <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js" type="text/javascript"></script>
  <script type="text/javascript">
    alert($().jquery); // 1.9.1
  </script>
</head>
</html>

サンプルファイルDL : sample1.html

この場合,jQueryの共存を行うことが出来れば,ベストな解であるといえる.その方法は次のコードを導入することで,これを可能とする.

<html>
<head>
  <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.2.6/jquery.min.js" type="text/javascript"></script>
  <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js" type="text/javascript"></script>
  <script type="text/javascript">
    jQuery1_9_1 = jQuery.noConflict(true);
    alert($().jquery); // 1.2.6
    alert(jQuery1_9_1().jquery); // 1.9.1
  </script>
</head>
</html>

サンプルファイルDL : sample2.html

さて,これによって,jQueryが1.2.6と1.9.1の共存した状態になる.つまり,jQuery1.9.1の$関数をjQuery1_9_1関数に書き換えたようなイメージになる.このような場合,それぞれのVersionで動かすためにはjQuery1.2.6ならば$関数を用いて,jQuery1.9.1ならば$関数の代わりにjQuery.noConflict()関数で$関数の代わりに定義したjQuery1_9_1関数(?)を用いれば良い.しかし,このままではjQuery1.9.1を使う場合,通常ならば$(hogehoge)と書くところをjQuery1_9_1(hogehoge)と書かなければならないので,無名関数を用いてjQuery1.9.1でも$(hogehoge)とかけるようにすることができる.

<html>
<head>
  <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.2.6/jquery.min.js" type="text/javascript"></script>
  <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js" type="text/javascript"></script>
  <script type="text/javascript">
    jQuery1_9_1 = jQuery.noConflict(true);
    (function($){
      alert($().jquery); // 1.2.6
    })(jQuery);
    (function($){
      alert($().jquery); // 1.9.1
    })(jQuery1_9_1);
  </script>
</head>
</html>

サンプルファイルDL : sample3.html

ある関数はjQuery1.2.6で,ある関数はjQuery1.9.1で,それぞれを定義後,自由な位置で呼び出したい場合がある.これは連想配列内でそれぞれの定義を書けば,無名関数外でも,その関数を指定したjQueryのVersionで動かすことができる.

<html>
<head>
  <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.2.6/jquery.min.js" type="text/javascript"></script>
  <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js" type="text/javascript"></script>
  <script type="text/javascript">
    jQuery1_9_1 = jQuery.noConflict(true);
    (function($){
      a191 = {
        b : function(){
          return $().jquery;
        }
      }
    })(jQuery1_9_1);
    (function($){
      a126 = {
        b : function(){
          return $().jquery;
        }
      }
    })(jQuery);
    alert(a191.b()); // 1.9.1
    alert(a126.b()); // 1.2.6
  </script>
</head>
</html>

サンプルファイルDL : sample4.html

補足:無名関数とはこのような関数である.

<html>
<head>
  <script type="text/javascript">
    alert(
      (function(a){
        return a;
      })("aに入る値")
    );
  </script>
</head>
</html>

サンプルファイルDL : sample5.html

この無名関数を理解すると,$関数がなぜ無名関数を使うと jQuery1.2.6 が jQuery1.9.1 に変わったのかが良く分かる.

2013年1月26日土曜日

モンテカルロ法による円周率推定(R言語実装)

3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170.............

上の数字は円周率と呼ばれるものであるが,円周率π,円周長l,直径dの時,一番簡単な円周率の定義は,
π = l/d
である.d = 1である円の場合,lがそのまま円周率の値となる.

さて,このπを確率的な方法で”推定”してみる.
一辺が1の正方形に内接する半径r=1の円の扇型を考えてみよう.
正方形自体の面積は1であり,扇型の面積は
(扇型の面積) = (πr^2)/4 = π/4
である.さて,これの面積比を取ってみる.
面積比 = (扇型の面積)/(正方形の面積) = (πr^2)/4 = π/4

次に,この正方形のどこかランダムに点をn個打つとする.そのうち,扇型の中に入った個数をmとする.このランダムに点を打つとき,扇型の中に点が打たれる確率は,
(扇型の中に点が打たれる確率) = m/n
である.この確率は,先に出した面積比と等号で結ぶことができる.
(面積比) = (扇型の中に点が打たれる確率)
π/4 = m/n
∴π = 4m/n
つまり,扇型の中に点が打たれる確率で円周率を推定することができる.この方法を「モンテカルロ法」とよび,数値積分などの計算にも利用されている.

さて,ではR言語を用いてモンテカルロ法による円周率の推定を行なってみよう.次のプログラムを用いて推定を行った.
mcPi <- function(points){
  inR <- 0 #扇型に入った数
  cols <- NULL #plot色分け用
  range <- c(0,1) #plot時の描画範囲
  x <- runif(points,0,1) #一様乱数でx座標を決定
  y <- runif(points,0,1) #一様乱数でy座標を決定
  r <- x^2+y^2 #原点から各点がどのくらい離れているか
  for(i in r){
    if(i<=1){ #もし,原点からの距離が1以下であれば扇型の中
      inR <- inR + 1
      cols <- c(cols,"red") #扇型内であれば赤色でプロット
    }else{
      cols <- c(cols,"blue") #扇型外であれば青色でプロット
    }
  }
  return_data <- 4*inR/points #円周率計算
  plot(x,y,col=cols,xlim=range,ylim=range,pch=20,main="Estimate pi value with Monte Carlo method.",sub=sprintf("%s points. pi = %1.6f",points, return_data))
  return(return_data)
}
このmcPi()は引数に応じて点を打っていき,円周率を計算するプログラムである.
実行例:
mcPi(10000) #10000回点を打って円周率を推定

結果例:
[1] 3.1516 ←これが推定された円周率の値.毎回違う値になる.

次のような画像も一緒に出力される.

当然のことだが,打つ点が多ければ多いほどよい精度になりやすい(πの値により近づきやすくなる).

2013年1月19日土曜日

Javascriptのクロージャにおける変数のスコープ

Tips的なネタを一つ.
クロージャとは”関数の中の関数”という意味で見てほしい.
Javascriptのクロージャの引数をいちいち指定するのは書く方も面倒くさい.そこで気になるのはクロージャにおける変数のスコープである.それを説明するため,次のようなJavascriptコードを書いた.

message = "グローバル";
window.alert(message);

function test1(message){
  window.alert(message);//"グローバル"
  function test2(){
    window.alert(message);//"グローバル"
  }
  test2();
  
  var message = "ローカル1";
  window.alert(message);//"ローカル1"
  
  function test3(){
    var message = "ローカル2";
    window.alert(message);//"ローカル2"
  }
  test3();
  
  window.alert(message);//"ローカル1"
}
test1(message);

window.alert(message);//"グローバル"




実際に実行して遷移を見るとよく分かるはず.
簡単に解説すると,関数の引数は関数の中のグローバル変数になり,クロージャの変数に自動的に代入される.クロージャの中で変数を新たに代入すればクロージャの中のグローバル変数になり,クロージャの外の変数には影響を及ぼさない.
よくコードを追いながらアラートボックスのvalueを見てみてほしい.