node.websocketを試す。

HTML5の機能の一つWebSocketを試そうと思いました。その名の通りHTMLのスクリプト上でソケットを使う機能です。

こちらのページを大変参考にしました。ありがとうございます。
噂のnode.websocket.jsでサーバサイドJSとHTML5 WebSocketを体験してみたの巻 - ダウンロードたけし(寅年)の日記


基本的にはこの手引きのまま環境を整えていたのですが、いざWebSocketのサーバーを動かす件がうまくいきません。
READMEに従いportを指定しようとするとエラーが出てしまうのです。

$ node runserver.js --port='8888'
(evcom) bind() Permission denied
Error: Permission denied
    at new <anonymous> (/home/*/src/node.websocket.js/websocket.js:61:15)
    at Object.<anonymous> (/home/*/src/node.websocket.js/runserver.js:4:28)
    at Module._loadContent (node.js:942:21)
    at node.js:970:20
    at node.js:571:25
    at node.js:1031:9

nodeの仕様が変わったのか、node.websoketのオプションの解釈部分がうまく動いていないようです。
ざっくり修正ですがとりあえずtools.jsを以下のようにすると動きました。

diff --git a/tools.js b/tools.js
index 6c834ce..31d8d64 100644
--- a/tools.js
+++ b/tools.js
@@ -32,10 +32,10 @@ this.merge = function(obj, newobj){

 // reads argv, parses --option=value into {option: value}
 this.argvToObject = function(argv){
-  var obj = {}, regex = /\-\-(\w+)(\=(\\'.+\\'))?/;
+  var obj = {}, regex = /\-\-(\w+)=(.+)/;
   for (var i = 0, l = argv.length, match; i < l; i++){
     match = argv[i].match(regex);
-    if (match) obj[match[1]] = match[3] !== undefined ? eval(match[3]) : null;
+    if (match) obj[match[1]] = match[2] !== undefined ? match[2] : null;
   }
   return obj;
 };

swigのpointerサンプルをC#に移植

swigC#をちょこちょこ遊んでるんですがswigのExample/charpはいまいち数が少ない。でpointerサンプルもなかったのでJavaのを見ながら移植してみた。

class Program{
    static void Main(string[] args){
    // First create some objects using the pointer library.
    System.Console.WriteLine("Testing the pointer library");
    SWIGTYPE_p_int a = example.new_intp();
    SWIGTYPE_p_int b = example.new_intp();
    SWIGTYPE_p_int c = example.new_intp();
    example.intp_assign(a,37);
    example.intp_assign(b,42);

    System.Console.WriteLine("     a ={0:X}", example.intp_value(a));
    System.Console.WriteLine("     b ={0:X}", example.intp_value(b));
    System.Console.WriteLine("     c ={0:X}", example.intp_value(c));

    // Call the add() function with some pointers
    example.add(a,b,c);

    // Now get the result
    int res = example.intp_value(c);
    System.Console.WriteLine("     37 + 42 " + res);

    // Clean up the pointers
    example.delete_intp(a);
    example.delete_intp(b);
    example.delete_intp(c);

    // Now try the typemap library
    // Now it is no longer necessary to manufacture pointers.
    // Instead we use a single element array which in Java is modifiable.
    System.Console.WriteLine("Trying the typemap library");
    int r = 0;
    example.sub(37,42,out r);
    System.Console.WriteLine("     37 - 42 = " + r);

    // Now try the version with return value
    System.Console.WriteLine("Testing return value");
    int q = example.divide(42,37,out r);
    System.Console.WriteLine("     42/37 = " + q + " remainder " + r);
  }
}

コンパイル例。

swig -csharp  example.i
gcc -c -fpic *.c
gcc -shared *.o -o libexample.so
mcs -nologo -t:library -out:example_wrap.dll examplePINVOKE.cs example.cs SWIGTYPE_p_int.cs
mcs -nologo -r:example_wrap.dll -out:runme.exe runme.cs

実行結果。

Testing the pointer library
     a =25
     b =2A
     c =0
     37 + 42 79
Trying the typemap library
     37 - 42 = -5
Testing return value
     42/37 = 1 remainder 5

迷路といた。

人材獲得作戦・4 試験問題ほか: 人生を書き換える者すらいた。

前にやったやつを貼ってみようかと。
レベルがいくつになってんのかはしらねーです。アルゴリズムも名前があるものかないものかもしらねーです。
3時間以内には書けました。

require 'pp'

Maze = "
**************************
*S* *                    *
* * *  *  *************  *
* *   *    ************  *
*    *                   *
************** ***********
*                        *
** ***********************
*      *              G  *
*  *      *********** *  *
*    *        ******* *  *
*       *                *
**************************
"

def split(m)
  m.split(/\n/).map{|line|
    line.split(//)
  }
end

def join(m, width=1)
  m.map{|line|
    line.map{|c| sprintf("%0#{width}s", c.to_s)}.join
  }
end

def pos(c)
  @maze.each_with_index{|line, y|
    if x = line.index(c)
      return [x,y]
    end
  }
  nil
end


def fill(rute)
  x,y = *(rute[-1])
  len = rute.size

  case @maze[y][x]
  when "*"
    return
  when "S"
  when "G"
    @rute ||= rute
    @rute = rute if len < @rute.size
    return
  when " "
    @maze[y][x] = len
  else
    return if len >= @maze[y][x]
    @maze[y][x] = len
  end

  fill(rute+[[x+1,y]])
  fill(rute+[[x-1,y]])
  fill(rute+[[x,y+1]])
  fill(rute+[[x,y-1]])
end

@maze = split(Maze)
@rute = nil

fill([pos("S")])

pp join(@maze, 3)
p @rute

m = split(Maze)
@rute[1..-2].each{|x,y|
  m[y][x] = "$"
}

pp join(m)

乙女よ大志を抱け!!を演奏してみた。

D

演奏しました。紛らわしいタイトルですがアテフリは無しで動画と音と同時に撮ったものです。

収録時間は4時間くらい。っていってもTakeは一桁。演奏動画をちゃんと撮るのが初めてだったのでその環境準備にけっこう時間がかかりました。まずデジカメ探すところからスタートですからね。そのつぎ充電器。これかなり重い作業だった。満を持して充電。これがなげーなげー。おまけで収録。この画と音と同時にというのはなかなか幹部の辛いところでして、デジカメつないだTVをモニターしながら弾くんですが、ついつい動き回って演奏ぐだったりまた逆だったりとバランスが難しかったです。

中身的には構想は結構前からしてました。イメージとしてこの曲のたのしたのし感を出来るだけ表現したいナーと思ってました。でやっぱりアレンジが悩みどころで、とくにサビですねあれは結構考えた。小気味良い感じにしたかったんです。結果まあまあ気にいってはいます。逆にAメロあたりはその場の感でやっつけてたりしててだめだめですね。ごめんなさい。

ギターはIbanezeのRG、エフェクターはPOD、録音編集はCubaseLE。PODはLine 6 Spinel Puppetっていうつまみデザインがどくろの、メタルメタルしいアンプモデルで、ドライブ7ベース5ミドル6トレブル3プレゼンス4くらいのセッティング。他のエフェクトはOFF。つーかリバーブもOFFにしてたってさっき気づきました。このセッティングですが、撮り終えて聴いたらちょっとこもったのでCubeseのEQで高音足しました。

動画的には、デジカメからでたMOVファイルをAviutilで切って可逆圧縮で書き出し。それをCubase上で画にあわせて音のタイミング調節。CubaseLEさんはZOOMのマルチにただでついてきたっていうのに動画再生機能まであるんですよほんと便利。

ところがここで問題があってどうも画と音がずれる。5分弱の動画の最初と最後で0.数秒くらいずれる。画が早い。音が遅れる。検証はしてないけどたぶんこのデジカメの動画機能の特性なんだろうなーと思ってます。なんだども画を細かく伸び縮みさせる術を知らないので、またもCubaseさんに出張ってもらい、音のほうを99.8%ほどに縮めて解決しました。して出来た画と音をつんでれんこに突っ込んでmp4作成。つんでれんこはこまけーこと気にしないで良いので気に入ってます。

演奏してみたの方はまー昔から、アイドルマスターとか好きになる全然前からやってみてーと思っていたジャンルではありまして。でもまーあそこの人たちってちょーうめえ人ばっかだし、と思うにとどまっている俺でした。ところがなんかいつの間にかアイマスさんに乗っかる感じに支えてもらい、動画を上げることの壁をこえてしまっていたのでした。なので演奏もまあ俺の一ネタとして使えると思えるようになり、また憧れもやっぱりありますから、ここでもアイマスさん踏み台に上げさせたもらったのでした。ありがとうございました。

次の演奏は未定ですけど、でもまた何かは弾きたいですねー。

pixivをAutoPagerizeしてみた。

pixiv.ccのブログ用。なんかpixiv.ccでもブログによって中身が違うようなんでorとか使ってるし、見え方もちょっと微妙。

{
  url:          '^http://pixiv\\.cc/\\w+/archives/\\d+\\.html',
  nextLink:     '//li[@class="prev"]/a',
  pageElement:  '//div[@id="first" or @class="column"]',
}

www.pixiv.netイラスト観覧用。こっちもちょっと微妙だけど便利は便利。

{
  url:          '^http://www\\.pixiv\\.net/member_illust\\.php\\?mode=medium&illust_id=\\d+',
  nextLink:     '//div[@id="content2"]/div/a[last()]',
  pageElement:  '//div[@id="content2"]',
},

twitterのタイムラインをIDでフィルターする

タイムライン上にFF13の感想等がでるのがいやーなので
IDでフィルターしてしまうことにしましたすみません。
ネタバレ苦手なんですすみません。


って思ったけどこれニコニコかんけーねーなすみません。

しかも数分ためしてすでに使い物にならねーと思いましたすみません。

// ==UserScript==
// @name           twitter_filter
// @namespace      twitter
// @include        http://twitter.com/
// ==/UserScript==

//config
var ng_id_list = ["oscdis"]

//logic
function eval_xpath(rcv, doc, xpath){
  return rcv.evaluate(xpath, doc, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
}

function doc_xpath(xpath){
  return eval_xpath(document, document, xpath);
}

function ary_xpath(xpath){
  var ret = [];
  var a = doc_xpath(xpath);
  for (var i = 0; i < a.snapshotLength; i++){
    ret.push(a.snapshotItem(i));
  }
  return ret;
}

function ancestor(node, i){
  return i==0 ? node : ancestor(node.parentNode, i-1);
}

function is_ng_id(id){
  for (var i = 0; i < ng_id_list.length; i++){
    if (ng_id_list[i] == id) return true;
  }
  return false;
}

//main

var a = ary_xpath(&#39;//span[@class="status-body"]/strong/a&#39;);

for (var i = 0; i < a.length; i++){
  if (is_ng_id(a[i].text)){
    var li = ancestor(a[i], 3)
    li.parentNode.removeChild(li);
  }
}