GoogleCL(Googleコマンドライン)のインストールと少々

ご存知の方も多いと思いますが以前Googleからこんな朗報が.

Googleは6月18日(現地時間)、コマンドラインからGoogleのサービスを操作するためのツール「GoogleCL」をリリースしたと発表した。Google Codeのプロジェクトページからダウンロードできる。Linux、Windows、Macに対応し、利用するにはPythonGoogle Data APIs Python Client Libraryのインストールが必要。

Google、コマンドラインツール「GoogleCL」を公開 - ITmedia エンタープライズ

エンジニアにはたまらんツールですね.

ほんとうに便利なGoogleコマンドライントリック5選! : ライフハッカー[日本版]という良記事があがっていたので触発されて使ってみました.

環境

  • Ubuntu10.04(LTS) (Linux系ならなんでも)
  • Python 2.5.6 (利用するためには2.5以上が必要)

バージョンの確認は以下のコマンド

$ python --version 
Python 2.6.5

なければ入れてください.Ubuntuの場合はapt-getでinstallできます。

$ sudo apt-get install python 

インストール

  1. 必要なファイルをgooglecl - Command line tools for the Google Data APIs - Google Project Hostinggdata-python-client - Google Data APIs Python Client Library - Google Project Hostingからダウンロードする(ここではtar.gzを利用)
  2. ダウンロードしたファイルを展開,インストール
# ファイルの展開
$ tar zxvf gdata-2.0.10.tar.gz 
$ tar zxvf googlecl-0.9.7.tar.gz

# 展開したフォルダに移動してインストール(Gdata)
$ cd gdata-2.0.10/
$ sudo python setup.py install

# GoogleCLも同様にしてインストール
$ cd ../googlecl-0.9.7/
$ sudo python setup.py install

インストールが終われば全部消しちゃってOKです(googleclはsudo付けないと消えません).

$ sudo rm -rf gdata-2.0.10.tar.gz googlecl-0.9.7.tar.gz gdata-2.0.10/ googlecl-0.9.7/ 

非常に簡単ですね.

使ってみる

ここではドキュメント(Docs)とカレンダー(Calendar)を使ってみます.

# testという名前のドキュメントをvimエディタで編集する
$ google docs edit --title "test" --editor vim
    • エディタにはemacs,nanoなど,自分が普段使っているものを指定してみてください
    • 基本的にエディタを終了した場合に反映されます
    • 同じファイルをブラウザ上で開いている場合はコリジョンを起こします(当然ながら)

なお,初回起動時にはユーザ名を聞かれます.

Please specify user:
# 入力するとブラウザ上でGoogleアカウントが立ち上がるので[アクセスを許可]をクリックして承認

これでエディタが立ち上がり,ドキュメントの編集が可能.サービスごとに承認してやる必要がありそうです.

その他のコマンド

# ファイル名を指定してdelete
$ google docs delete --title "test"

# ファイル名を指定してダウンロード(便利!)
$ google docs get --title "Homework [0-9]*" 

$ google docs list title,url-direct --delimiter ": " # list docs
$ google docs upload the_bobs.csv ~/work/docs_to_share/* 
# 6時から7時までに"Dinner party with George today at"が追加される(うまく動いてない..)
$ google calendar add "Dinner party with George today at 6pm"

# 今日のスケジュールを確認(なぜか時間の表示はない)
$ google calendar today
Dinner party with George today at,http://www.google.com/calendar/event?eid=OHFibWU3NzNmcnJjMGg0ZGJvcHQya3ZxaDQga3lvaGVpLmhhbWFkYUBt

# タイトルを指定してイベントを削除(のはずなんだけど何度やってもできなかったです..)
$ google calendar delete --title "Dinner party with George"

$ google calendar list --date 2010-06-01,2010-06-30 # List events.

ちなみに日本語でもいけます

$ google calendar add "午後7時から9時まで美容院"
$ google calendar today
Dinner party with George today at,http://www.google.com/calendar/event?eid=OHFibWU3NzNmcnJjMGg0ZGJvcHQya3ZxaDQga3lvaGVpLmhhbWFkYUBt
美容院,http://www.google.com/calendar/event?eid=YWIwcGs1NmhuNWVnam91ZzQ1aWFrc2tta28ga3lvaGVpLmhhbWFkYUBt

うーん,これはすごい.しかし相変わらず削除ができない.できた人いたら教えてください.
ふだん

感想

  • Googleドキュメントは使いやすい上に便利で何かと応用が利きそうと感じましたが,カレンダーに関しては狙いどおりに動かず今一歩でした(日本語で時刻を指定できるのはすごかったが).
  • Googleドキュメントを自分の好きなエディタでいじれるのは結構うれしいし,"google docs get"を用いてファイルをダウンロードをすることができるので,wget コマンドを使ってダウンロードできないGoogleドキュメント上のファイルをとってくるのに使えるなぁと思いました.普段からGmailの添付ファイルをGUIでダウンロードするのが煩わしく感じているので,添付ファイルをGoogleドキュメントに全部流してくれたらさらに使い勝手が向上するなぁとも思いました.もしくはGmailもGoogleCLに対応してもらうとか...今後のupdateに期待したいところです.

以上.

CLでのサービス起動時などにUbuntuがserviceコマンドを推奨してきた

環境

  • Ubuntu10.04

以前は

mysql, cron などのサービスの起動,停止,再起動,状態確認をするために以下を用いていた(例としてmysql)

$ sudo /etc/init.d/mysql start
$ sudo /etc/init.d/mysql stop
$ sudo /etc/init.d/mysql restart
$ sudo /etc/init.d/mysql status

今日,同じコマンドを打ち込むと以下のメッセージが表示された

Rather than invoking init scripts through /etc/init.d, use the service(8)
utility, e.g. service mysql start

Since the script you are attempting to invoke has been converted to an
Upstart job, you may also use the start(8) utility, e.g. start mysql
mysql start/running, process 7336

/etc/init.d を使うよりも service(8) utility を使った方がスマートなんじゃない?とのこと(前半のみ).初めは"e.g."以下がコマンド例を挙げていることに気付かずにググることに.参考ページはなくしちゃいましたが理解できました.また,ただのメッセージなので動作自体は正常に動いているようですが(最後の行からして),とっても気持ち悪い.
ということで

今後は

$ sudo service mysql start
mysql start/running, process 7144

このようなコマンドを使います.なーんだ.あまり変わらないですね.

ちなみに

apache2 については従来の

$ sudo /etc/init.d/apache2 start

を使用してもメッセージを出さなかったです(なぜか).もちろん

$ sudo service apache2 start

は使えるので今後はこれを使うことにします.

ゴミ箱をコマンドラインから扱う

環境

trash-cli のインストール

Ubuntuではパッケージ化されているので以下のコマンドのみでOK*1

$ sudo apt-get install trash-cli

消費された容量は143kBでした.
また,trash-cli - Command line interface to the freedesktop.org trashcan. - Google Project Hostingからファイルを落としてきてインストールすることもできます.

コマンド

# 対象のファイル/フォルダをゴミ箱へ送る
$ trash ファイル名/フォルダ名
# 中身の確認
$ list-trash
# 空にする
$ empty-trash
# ファイルを元に戻す
$ restore-trash

おまけ

~/.bashrc に以下のaliasを記述しておけばrmしてうっかりファイルを削除してしまうことを防げるでしょう.

$ vim ~/.bashrc

aliasの記述

alias rm='trash'

反映させる

$ source ~/.bashrc

これで,間違えて

$ sudo rm -rf /

とかしても大丈夫なはずですw多分

*1:最近気づいたのですが,パッケージ名末尾に「cli」がくっついているのはコマンドで使えることを示しているようですね.

PHPではてなブックマークエントリー取得情報APIを使う

参考
はてなブックマークエントリー情報取得APIとは - はてなキーワード
PHP: インストール手順 - Manual
PHP: cURL 関数 - Manual

環境

OS :Ubuntu 10.04
PHP:php5, php5-cli

getHatenar.php

<?php
/* はてなブックマークエントリー情報取得APIを用いてブックマーク情報を取得する
 * "http://www.hatena.ne.jp/"の情報を取得するサンプル
 */

// curlを利用するためには以下のコマンドでインストールが必要
// $ sudo apt-get install php5-curl

// とりあえず関連エントリーは使わないので,より高速なレスポンスの /entry/jsonlite/ を利用 
$c = curl_init("http://b.hatena.ne.jp/entry/jsonlite/http://www.hatena.ne.jp/");
// curl_exec()の返り値を文字列で返すためのパラメータ
curl_setopt($c, CURLOPT_RETURNTRANSFER, true);
$json = curl_exec($c);
curl_close($c);

$jsonObj = json_decode($json);

// 表示
var_dump($jsonObj);

// 各要素には以下の様に参照する
/*
echo 'title:' . $jsonObj->title . "\n";
echo 'count:' . $jsonObj->count . "\n";
echo 'url:' . $jsonObj->url . "\n";
echo 'entry_url:' . $jsonObj->entry_url . "\n";
echo 'screenshot:' . $jsonObj->screenshot . "\n";
echo 'eid:' . $jsonObj->eid . "\n";
foreach($jsonObj->bookmarks as $k => $bv){
	echo $k . "\n";
	echo 'timestamp:' . $bv->timestamp . "\n" ;
	echo 'comment:' . $bv->comment . "\n";
	echo 'user:' . $bv->user . "\n";
	echo 'tags:';
	foreach($bv->tags as $tv){
		echo $tv . ' ';
	}
	echo "\n";
}
*/
?>

実行

$ php getHatenar.php
object(stdClass)#1 (7) {
  ["count"]=>
  string(4) "3935"
  ["bookmarks"]=>
  array(2696) {
    [0]=>
    object(stdClass)#2 (4) {
      ["timestamp"]=>
      string(19) "2010/06/04 18:44:07"
      ["comment"]=>
      string(0) ""
      ["user"]=>
      string(10) "shuuheihei"
      ["tags"]=>
      array(0) {
      }
    }
    [1]=>
    object(stdClass)#3 (4) {
      ["timestamp"]=>
      string(19) "2010/06/03 23:58:24"
      ["comment"]=>
      string(0) ""
      ["user"]=>
      string(8) "kinneko2"
      ["tags"]=>
      array(1) {
        [0]=>
        string(15) "webサービス"
      }
・
・
・
    [2695]=>
    object(stdClass)#2697 (4) {
      ["timestamp"]=>
      string(19) "2004/12/22 01:52:20"
      ["comment"]=>
      string(0) ""
      ["user"]=>
      string(10) "kalamucho1"
      ["tags"]=>
      array(2) {
        [0]=>
        string(2) "PC"
        [1]=>
        string(11) "PC DIY Info"
      }
    }
  }
  ["url"]=>
  string(24) "http://www.hatena.ne.jp/"
  ["eid"]=>
  string(3) "370"
  ["title"]=>
  string(9) "はてな"
  ["screenshot"]=>
  string(95) "http://screenshot.hatena.ne.jp/images/200x150/c/2/6/b/d/f015f87fcf44a513f4744d853fe22504bc3.jpg"
  ["entry_url"]=>
  string(45) "http://b.hatena.ne.jp/entry/www.hatena.ne.jp/"
}

こんな感じ
変なところあったら指摘お願いしますー

コマンドラインでPHP

微妙なバグ(?)があったのでメモ.
OSはUbuntu10.04,'apt-get install' で 'php5, php-cli' を入れています.

手順

PHPCLIであることを確認

$ php -v
PHP 5.3.2-1ubuntu4.2 with Suhosin-Patch (cli) (built: May 13 2010 20:01:00) 
Copyright (c) 1997-2009 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2010 Zend Technologies

hoge.php

<?php echo"hoge"; ?>

実行

$ php hoge.php
PHP Deprecated: Comments starting with '#' are deprecated in /etc/php5/cli/conf.d/mcrypt.ini on line 1 in Unknown on line 0

コメントが'#'で始まっているとおこられる
/etc/php5/cli/conf.d/mcrypt.ini の編集

# configuration for php MCrypt module
extension=mcrypt.so

↓ 変更

; configuration for php MCrypt module
extension=mcrypt.so

もう一度php

$ php hoge.php
hoge

おしまい

プロセスの話

psコマンドで動作中のプロセスを確認する(一部)(ubuntu10.04)

$ ps x
  PID TTY      STAT   TIME COMMAND
 1461 ?        S      0:05 update-notifier
 1463 ?        S      0:00 /usr/lib/indicator-messages/indicator-messages-service
 1465 ?        S      0:00 /usr/lib/indicator-application/indicator-application-service
 1467 ?        S      0:00 /usr/lib/indicator-sound/indicator-sound-service
 2065 ?        S      0:00 /bin/sh /usr/lib/firefox-3.6.3/firefox
 2070 ?        S      0:00 /bin/sh /usr/lib/firefox-3.6.3/run-mozilla.sh /usr/lib/firefox-3.6.3/firefox-bin
 2074 ?        Sl   124:01 /usr/lib/firefox-3.6.3/firefox-bin
 2076 ?        Sl     0:40 gnome-terminal
 2080 ?        S      0:00 gnome-pty-helper
 2081 pts/0    Ss     0:01 bash
 3308 pts/0    R+     0:00 ps x

「STAT」のところが「S」になっているものが待ちの状態のプロセスで,「R」になっているものが実行可能な状態.見て分かるとおり,psコマンドを実行している間はpsコマンドのみが実行されています.こうしてプロセスが次々と切り替わっていくわけか.

今現在,56個のプロセスが動いていることが確認できました.へぇー結構たくさんのプロセスが動いているんですねー

それだけ

プロセス、リンク、task_struct構造体より抜粋

CSV形式のファイルをDBに突っ込む

データベースの生成

create database LDclip;

テーブルの生成

create table clips (
  user_id int not null,
  url varchar(255) not null,
  timestamp timestamp not null default CURRENT_TIMESTAMP,
  tags text,
);

CSVファイルの読み込み

セキュリティ上の理由から、サーバに存在するテキストファイルを読み取るときには、そのファイルがデータベースディレクトリに存在するか、または全ユーザがそのファイルを読み取り可能でなければなりません。

MySQL :: MySQL 4.1 リファレンスマニュアル :: 6.4.8 LOAD DATA INFILE 構文より引用

ということなので,CSVファイルをデータベースディレクトリに移動

$ sudo mv CSVファイル名 /var/lib/mysql/LDclip/

読み込み

load data infile 'CSVファイル名' ignore
   into table clips
   character set utf8
   fields terminated by ',' enclosed by '"'
   (user_id, url, @var1, tags)
   set timestamp = str_to_date(@var1, "%Y-%m-%d %T")

というわけで

自力でCSVをパースしようと試みたり,OpenCSVライブラリの存在を知って使ってみたり,250万レコードのブックマークデータをファイルから読み込んで使おうとしてメモリが足らなくなったりしたわけだが,DBを使えばいーじゃんってことになったわけです.