Vimで矩形貼り付けをするプラグインを作ってみた - 改良版 -

Vimで矩形貼り付けをするプラグインを作ってみた - へきょのーと

以前作成した矩形貼り付けをするVim pluginを改良したので
改めて使い方をご紹介します。(まだhelpがないので...)

サクラエディタなどにある矩形貼り付けは
Vim標準では(おそらく)ないのでpluginとして実装しました。

※setreg()で可能なようですが、本pluginでは選択モード時とquickrun挿入で差別化を...

続きを読む

Vimで矩形貼り付けをするプラグインを作ってみた

Vimで矩形貼り付けをするプラグインを作ってみた - 改良版 - - へきょのーと

追記:2012-03-26
本記事の内容は古くなっているため上記リンク先の記事をご参照願います。

あるVimmerが矩形貼り付けをする時だけ
サクラエディタを起動しているのを見て

「それVimでできる(はず)よ」

と、つい言ってしまい(^^;
プラグインを探してみたのですが
探し方が悪いのか見つからず...


というわけで、自分で作ってみました。

続きを読む

Python3のprintを使ってみよう!

2011 Pythonアドベントカレンダー(Python3) 24日目です!

実はPython3は...というかPython自体ほとんど触ったことがなくて...
エキスパートPythonの読書会に2回(2章途中)参加したくらいの知識しかないのですが
急遽参加してみることにしました!大丈夫か!?

はじめに

記事のネタをどうしようか考えてたところに他の参加者様の記事を見て
Python3からprintが文から式に変わったというのを見つけたので
print文についてもうちょっと具体的に調べてみようかなと思いました。

環境

Mac OS X Snow Leopard 10.6.8
Python 3.2

インストール

sudo port install python32

調査結果

Python3での出力仕様

Python2までは

print "aaa"

だったのに対してPython3では

print("aaa")

となる。

Python3でのprintについて試したものを以下にまとめます。
各処理右側のコメントが処理の出力になります。

# endを指定しない場合は"\n"がdefaultとなり出力の最後で改行される
print("aaa") # -> aaa\n

# endに空文字を指定することで改行を防止できる
print("aaa", end="") # -> aaa

# 引数には出力用データを複数指定可能
# データの結合文字はsepで指定する。defaultは半角スペース
print("aaa", "bbb") # -> aaa bbb\n

# sepで結合文字を変更
print("aaa", "bbb", sep=",") # -> aaa,bbb\n

# sepとendは同時に設定可能
print("aaa", "bbb", sep=",", end="") # -> aaa,bbb

# fileで指定したファイルオブジェクトに出力できる
print("test", file=sys.stdout)
文から式へ

文は値を返さないもの。改行を伴うもの。
式は値を返すもの。文中で使用可能。

という認識だけど合ってるかな??

そこで

printが文から式になったことで何が便利かなぁと考えたときに
リスト内包表記内とかで使うと便利かも?と思いついたので試してみました。

# 単純出力
[print(x) for x in ("aaa", "bbb", "ccc")]
# -> aaa
#    bbb
#    ccc

# CSV風出力
[print(x, end=",") for x in ("aaa", "bbb", "ccc")]
# -> aaa,bbb,ccc,
# ※この場合、printが複数回呼ばれるため、sepではなくendです。

# format出力
[print("%03d" % (x * 2)) for x in (1, 2, 3)]
# -> 002
#    004
#    006

実際まだPythonのコードをほとんど書いたことがないので
本当に便利かは実感できてないですが...
こんなことも出来るようになったようです的なご紹介でした!

おまけ

下記、同じ結果になるのですが、どちらが良いのだろう??

print("aaa", "bbb", sep="")
print("aaa" + "bbb")

速度を簡単に測ってみたところ+演算子を使った方が若干速そうです。

+演算子未使用 +演算子使用
平均 0.3108s 0.2562s
1回目 0.312s 0.331s
2回目 0.298s 0.280s
3回目 0.354s 0.220s
4回目 0.271s 0.252s
5回目 0.365s 0.302s
6回目 0.295s 0.217s
7回目 0.355s 0.218s
8回目 0.292s 0.299s
9回目 0.278s 0.228s
10回目 0.288s 0.215s

テストコード

# +演算子未使用
for i in range(10000):
    print("aaa", "bbb", "ccc", sep="")

# +演算子使用
for i in range(10000):
    print("aaa" + "bbb" + "ccc")

最後25日目は2011 Pythonアドベントカレンダー(Python3)にお返ししますー。
でいいのかな?

pythonのジェネレータを使ってFizzBuzz

Pythonろくに出来もしないのに
急遽Advent Calendarに参戦してしまい
書く内容を考えないといけなくてかなり焦ってたのに

途中でつい遊んでしまい...

まあなんとか一応記事は書き終わったので
その時遊んだ内容について書きますw

続きを読む

Node.jsにてsocket.ioのjoinでチャットルーム実装!

JavaScript Advent Calendar 2011(Node.js/WebSocketsコース) 22日目です!
急遽参戦!そして初Advent Calendar...


Node.jsでのチャットルームの実装にsocket.ioのjoin()を使ってみます。

はじめに

socket.ioを利用したチャット機能の実装については
サンプルも多く結構簡単に実装が可能です。

ですが、チャットルームの実装方法については情報が少なく
やり方がわからなかったので色々調べつつ
RoomList, Room, User クラスを自作することで対応を行いました。

※sample
https://github.com/hekyou/socket_io-not-join-sample

ですが、、

最近socket.ioにjoinメソッドがあることを知りまして。

これなら簡潔に書けるじゃん...

と、思ったので試してみました。

環境

Mac OS X Snow Leopard 10.6.8 (Lionっておいしいの?)
Node.js 0.4.12 (0.6にしないと!)
socket.io 0.8.5

利用するメソッド

join(room)

roomに指定した部屋に参加することができる。

to(room).emit

roomに指定した部屋にのみメッセージを送れる。

実装

サーバ側
var io = require('socket.io').listen(app);

chat = io.sockets.on('connection', function(client) {
    // ※2 クライアントに接続成功を送信
    client.emit('connected');

    client.on('init', function(req) {
        client.set('room', req.room);
        client.set('name', req.name);
        chat.to(req.room).emit('message', req.name + " さんが入室");
        // ※4 クライアントを部屋に入室させる
        client.join(req.room);
    });

    client.on('message', function(data) {
        var room, name;

        client.get('room', function(err, _room) {
            room = _room;
        });
        client.get('name', function(err, _name) {
            name = _name;
        });

        // ※6 受け取ったメッセージを部屋の皆に送信
        chat.to(room).emit('message', name + ": " + data);
    });

    // ※8 退室
    client.on('disconnect', function() {
        var room, name;

        client.get('room', function(err, _room) {
            room = _room;
        });
        client.get('name', function(err, _name) {
            name = _name;
        });
        client.leave(room);
        chat.to(room).emit('message', name + " さんが退出");
    });
});
クライアント側
// ※1 サーバに接続リクエスト
var socket = io.connect('/');

function chat(room, name) {
    socket.on('connected', function() {
        // ※3 入室する部屋番号を送信
        socket.json.emit('init', { 'room': room, 'name': name });
    });

    // ※7 受け取ったメッセージを表示
    socket.on('message', function(data) {
        if (data) {
            update(data);
        }
    });
}
function send(name) {
    var data = $('#comment').val();

    // ※5 メッセージを送信
    socket.json.send(data);

    $('#comment').val("");
}
function update(data) {
    var obj = $(document.createElement('div'));
    obj.html(data);
    $('#view').append(obj);
}

大分すっきりしました!!
もっと早く知っていれば...

ちなみに、※番号は一応処理の順番になっています。


今回この記事用に作成したものが下記になります。
https://github.com/hekyou/socket_io-join-sample

ちなみに独自クラスを使って作成したサービスが下記になります。
blockdiagをみんなで編集しよう的なものです。
http://live-diag.herokuapp.com/

※blockdiagについてはこちらを参照してください。便利ですヨ!
http://blockdiag.com/ja/blockdiag/

後でjoinで書き直そうっと...

備考

to(room).send は使えなくてちょっとだけハマりました。

Macでupdatedbとlocateを使ってファイルをさくさく検索!

linuxではfindコマンドより高速にファイルを検索するために
locateコマンドを使いますが

macにもlocateコマンドはあります!

ただ、検索用のデータベースを作成する
updatedbがmacの場合linuxと異なります。。

macの場合
/usr/libexec/locate.updatedb

いつも忘れるので…

メモ!

でも、毎回調べるのも面倒くさいので...

aliasをつくります。

続きを読む

netcatを使わずにSSHのProxyCommandで多段ssh

AのサーバにBのサーバを経由してSSH接続する場合
今まではnetcatを利用していましたが
OpenSSH 5.4からはnetcatの機能が組み込まれたようです。

ということで試してみました。

続きを読む