2012/02/09


たとえばこういう XML があったとして、
<status><created_at>Mon Feb 06 21:07:52 +0000 2012</created_at><id>166629198054690816</id><text>Post-Bowl Twitter analysis http://t.co/OYYSRSew http://t.co/M0AtLQVd</text><source>web</source><truncated>false</truncated><favorited>false</favorited><in_reply_to_status_id></in_reply_to_status_id><in_reply_to_user_id></in_reply_to_user_id><in_reply_to_screen_name></in_reply_to_screen_name><retweet_count>454</retweet_count><retweeted>false</retweeted><user><id>783214</id><name>Twitter</name><screen_name>twitter</screen_name><location>San Francisco, CA</location><description>Always wondering what's happening. </description><profile_image_url>http://a0.twimg.com/profile_images/1124040897/at-twitter_normal.png</profile_image_url><profile_image_url_https>https://si0.twimg.com/profile_images/1124040897/at-twitter_normal.png</profile_image_url_https><url>http://blog.twitter.com/</url><protected>false</protected><followers_count>7625563</followers_count><profile_background_color>ACDED6</profile_background_color><profile_text_color>333333</profile_text_color><profile_link_color>038543</profile_link_color><profile_sidebar_fill_color>F6F6F6</profile_sidebar_fill_color><profile_sidebar_border_color>EEEEEE</profile_sidebar_border_color><friends_count>822</friends_count><created_at>Tue Feb 20 14:35:54 +0000 2007</created_at><favourites_count>16</favourites_count><utc_offset>-28800</utc_offset><time_zone>Pacific Time (US &amp; Canada)</time_zone><profile_background_image_url>http://a1.twimg.com/profile_background_images/378245879/Twitter_1544x2000.png</profile_background_image_url><profile_background_image_url_https>https://si0.twimg.com/profile_background_images/378245879/Twitter_1544x2000.png</profile_background_image_url_https><profile_background_tile>true</profile_background_tile><profile_use_background_image>true</profile_use_background_image><notifications>false</notifications><geo_enabled>true</geo_enabled><verified>true</verified><following>true</following><statuses_count>1266</statuses_count><lang>en</lang><contributors_enabled>true</contributors_enabled><follow_request_sent>false</follow_request_sent><listed_count>68708</listed_count><show_all_inline_media>true</show_all_inline_media><default_profile>false</default_profile><default_profile_image>false</default_profile_image><is_translator>false</is_translator></user><geo/><coordinates/><place/><possibly_sensitive>false</possibly_sensitive><contributors><user_id>7694352</user_id></contributors></status>
見づらいので vimrc に1行書いてあげると、 map <Leader>x !python -m BeautifulSoup<CR>
範囲選択してから <Leader> x でキレイに整形してくれます。 <status>
 <created_at>
  Mon Feb 06 21:07:52 +0000 2012
 </created_at>
 <id>
  166629198054690816
 </id>
 <text>
  Post-Bowl Twitter analysis http://t.co/OYYSRSew http://t.co/M0AtLQVd
 </text>
 <source>
  web
 </source>
 <truncated>
  false
 </truncated>
 <favorited>
  false
 </favorited>
 <in_reply_to_status_id>
 </in_reply_to_status_id>
 <in_reply_to_user_id>
 </in_reply_to_user_id>
 <in_reply_to_screen_name>
 </in_reply_to_screen_name>
 <retweet_count>
  454
 </retweet_count>
 <retweeted>
  false
 </retweeted>
 <user>
  <id>
   783214
  </id>
  <name>
   Twitter
  </name>
  <screen_name>
   twitter
  </screen_name>
  <location>
   San Francisco, CA
  </location>
  <description>
   Always wondering what's happening.
  </description>
  <profile_image_url>
   http://a0.twimg.com/profile_images/1124040897/at-twitter_normal.png
  </profile_image_url>
  <profile_image_url_https>
   https://si0.twimg.com/profile_images/1124040897/at-twitter_normal.png
  </profile_image_url_https>
  <url>
   http://blog.twitter.com/
  </url>
  <protected>
   false
  </protected>
  <followers_count>
   7625563
  </followers_count>
  <profile_background_color>
   ACDED6
  </profile_background_color>
  <profile_text_color>
   333333
  </profile_text_color>
  <profile_link_color>
   038543
  </profile_link_color>
  <profile_sidebar_fill_color>
   F6F6F6
  </profile_sidebar_fill_color>
  <profile_sidebar_border_color>
   EEEEEE
  </profile_sidebar_border_color>
  <friends_count>
   822
  </friends_count>
  <created_at>
   Tue Feb 20 14:35:54 +0000 2007
  </created_at>
  <favourites_count>
   16
  </favourites_count>
  <utc_offset>
   -28800
  </utc_offset>
  <time_zone>
   Pacific Time (US &amp; Canada)
  </time_zone>
  <profile_background_image_url>
   http://a1.twimg.com/profile_background_images/378245879/Twitter_1544x2000.png
  </profile_background_image_url>
  <profile_background_image_url_https>
   https://si0.twimg.com/profile_background_images/378245879/Twitter_1544x2000.png
  </profile_background_image_url_https>
  <profile_background_tile>
   true
  </profile_background_tile>
  <profile_use_background_image>
   true
  </profile_use_background_image>
  <notifications>
   false
  </notifications>
  <geo_enabled>
   true
  </geo_enabled>
  <verified>
   true
  </verified>
  <following>
   true
  </following>
  <statuses_count>
   1266
  </statuses_count>
  <lang>
   en
  </lang>
  <contributors_enabled>
   true
  </contributors_enabled>
  <follow_request_sent>
   false
  </follow_request_sent>
  <listed_count>
   68708
  </listed_count>
  <show_all_inline_media>
   true
  </show_all_inline_media>
  <default_profile>
   false
  </default_profile>
  <default_profile_image>
   false
  </default_profile_image>
  <is_translator>
   false
  </is_translator>
 </user>
 <geo>
  <coordinates>
   <place>
    <possibly_sensitive>
     false
    </possibly_sensitive>
    <contributors>
     <user_id>
      7694352
     </user_id>
    </contributors>
   </place>
  </coordinates>
 </geo>
</status>

ネタ元: http://wozozo.hatenablog.com/entry/2012/02/08/121504

ちなみに-mだけでやる場合は細かい制御はできなさそう。
Posted at by




Vimが良くも悪くも「エディタだ」と言われる要因として「画像や異なるグリフのフォントを同時に出せない」ことを上げられます。つまりVimはHTMLやマークダウン等のプレビューを確認する為にいちいちブラウザを起動して確認し、ファイルを更新した際には読み込み直すという面倒な手間が掛かる事を意味しています。
まぁ専用ブラウザを作ればいいんだけど面倒で腰が重かったんだけど、ちょいと作ってみました。

mattn/mkdpreview-vim - GitHub

MkdPreview Markdown previewer for vimmer

https://github.com/mattn/mkdpreview-vim
ファイルタイプがmarkdownなバッファで :MkdPreview!
と実行するとプレビューワが起動します。
mkdpreview-vim
プレビューワが一度起動している状態なら、以後は他のVimからでも :MkdPreview
でプレビューが表示される様になっています。MkdPreview!を実行したVimに関してはBufWritePostに 対してプレビュー更新が行われる様になっているので:wで自動更新されます。この辺は使い勝手で変えていくかも知れない。
仕組みはpythonスクリプトで書かれたウェブサーバ兼Qt4を使ったプレビューワになっていて POSTを受けたらそれをmarkdown-jsを使ってQtWebkitに反映させています。 複数起動とかうっとおしいだろうなと思ったので、ポートは固定にしています。 起動に必要な物としては
  • python (2.7 or later) http://python.org/
  • PyQt4 http://www.riverbankcomputing.co.uk/software/pyqt/download
  • curl command http://curl.haxx.se/libcurl/
  • webapi-vim http://github.com/mattn/webapi-vim
  • markdown-js https://github.com/evilstreak/markdown-js
となります。pythonスクリプトは短いのでコードを貼り付けておきます。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os
import sys
import json
import cgi
from threading import Thread
from PyQt4.QtCore import *
from PyQt4.QtGui import *
from PyQt4.QtWebKit import *
from PyQt4.QtNetwork import *
from BaseHTTPServer import HTTPServer
from SimpleHTTPServer import SimpleHTTPRequestHandler

os.chdir(os.path.dirname(__file__))

port = int(os.getenv("mkdpreview_port"or "8081")

QNetworkProxyFactory.setUseSystemConfiguration(True)
app = QApplication(sys.argv)
webview = QWebView()
webview.setWindowTitle('Markdown Previewer')
webview.load(QUrl("http://localhost:8081"))
def do_eval(js):
  webview.page().mainFrame().evaluateJavaScript(
      "preview(%s)" % json.dumps(unicode(js, 'utf-8')))
QObject.connect(webview, SIGNAL("preview(QString)"), do_eval)
webview.show()

class PreviewHandler(SimpleHTTPRequestHandler):
  def do_POST(self):
    s = self.rfile.read(int(self.headers.getheader('content-length')))
    p = cgi.parse_qs(s)
    webview.emit(SIGNAL("preview(QString)"), p["data"][0])
    self.wfile.write("")

class WebServer(QThread):
  def __init__(self):
    QThread.__init__(self)
    self.server = HTTPServer(("", port), PreviewHandler)

  def run(self):
    self.server.serve_forever()

server = WebServer()
server.start()

sys.exit(app.exec_())

# vim:set et sw=2 ts=2:
良かったら使ってみて下さい。 なお、ベースとなるHTMLはstaticフォルダにあるのでスタイル等をカスタマイズしたい人はじゃんじゃんやっちゃって下さい。 こうすればもっと使い勝手が良くなるよなどあればpull requestお願いします。

追記
Windowsじゃない人はstatic/mkdpreview.pyに実行権限与えて下さい。
markdown-jsじゃなくpython側でparseする様にしました。
Posted at by



2012/02/06


さっそく作ってみた。
Google Japan Blog: Google マップが携帯でも表示できるようになりました
HTTP::MobileAgent::Plugin::Locatorを使って緯度経度を取り、GoogleMapの静的画像を表示するサンプルを作ってみた。
ただGoogleMapの座標指定は測地系だったので
http://minken.net/mt/archives/locations.pl の一部を使わせて頂きました。
Perlで投影系変換出来るモジュール誰か知りませんか?

ソースは以下の様な感じ。
#!/usr/bin/perl

use strict;
use warnings;
use CGI;
use HTTP::MobileAgent;
use HTTP::MobileAgent::Plugin::Locator;


my $google_map_api_key = "ABQIAAAAS_2fKEdj-fsDOrnYqd4nthTGTkG1t9CC6WQns4yK382vvQcY9RS5JGW4WA0hwZKxfIpKeCjuMOMPIA";

sub geoconv {
    ...
}

sub llh2xyz { # 楕円体座標 -> 直交座標
    ...
}

sub xyz2llh { # 直交座標 -> 楕円体座標
    ...
}

sub deg2dms {
    ...
}

sub dms2deg {
    ...
}

my $q = CGI->new;
my $agent;
my $lat = '';
my $lng = '';
my $location = '';
eval {
  $agent = HTTP::MobileAgent->new;
  $location = $agent->get_location( $q );
  ($lng, $lat) = geoconv($location->lng, $location->lat, $location->datum)
};

print $q->header(-charset=>'Shift_JIS'),<<END;
<html>
<head>
<title>GoogleMap from GPS</title>
</head>
<body>
<h1>What is this?</h1>
Show the Google Map static image from your GPS location.<br />
END

if ($agent && $agent->is_non_mobile) {
  print "<b>Are not mobile agent?</b>";
} else {
  print "<a href=\"device:location?url=gmobile_map.cgi\" lcs>Where?</a>"
    if ($agent->is_docomo);
  print "<a href=\"device:location?url=gmobile_map.cgi\">Where?</a>"
    if ($agent->is_ezweb);
  print "<a href=\"gmobile_map.cgi\" z>Where?</a>"
    if ($agent->is_softbank && !$agent->is_type_3gc);
  print "<a href=\"location:auto?url=gmobile_map.cgi\">Where?</a>"
    if ($agent->is_softbank && $agent->is_type_3gc);
  if ($lat && $lng) {
    print << "END";
<img src="http://maps.google.com/staticmap?center=$lat,$lng&markers=$lat,$lng,red&zoom=18&size=300x200&key=$google_map_api_key"><br />
latitude: $lat<br />
longitude $lng<br />
END
  }
}

print "</body>\n</html>";
若干ずれるのはしょうがないか...
で、動いてる物は
http://mattn.kaoriya.net/cgi-bin/gmobile_map.cgi
携帯端末からアクセス下さい。
キャリア毎のアンカー作ってくれるモジュールも欲しいなぁ...

AWSWORD:google_map
Posted at by