Vimで矩形貼り付けをするプラグインを作ってみた - 改良版 -
Vimで矩形貼り付けをするプラグインを作ってみた - へきょのーと
以前作成した矩形貼り付けをするVim pluginを改良したので
改めて使い方をご紹介します。(まだhelpがないので...)
サクラエディタなどにある矩形貼り付けは
Vim標準では(おそらく)ないのでpluginとして実装しました。
※setreg()で可能なようですが、本pluginでは選択モード時とquickrun挿入で差別化を...
続きを読む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)にお返ししますー。
でいいのかな?
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 は使えなくてちょっとだけハマりました。