トップ «前月 最新 翌月»

たいぷらいたーざっき。

2010|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|09|

2012-01-01 二段組の論文PDFを段組解除して快適に読む。

_ [雑記] 二段組の論文PDFを段組解除して快適に読む。

段組されてるPDFがディスプレイで読みにくい。縦スクロールして右上にスクロールとかやってられない。

というわけで、縦スクロールだけでいけるようにする方法を探してみました。

つかいかたメモ。

$ sudo apt-get install texlive-extra-utils pdftk
$ vim splitter.sh
  (上記ページのスクリプトを、たとえば splitter.sh として保存する)
$ chmod +x splitter.sh
$ ./splitter.sh input.pdf output.pdf

左右が切れたり余りすぎたりするときは、 margin(大きいほど幅広になる?) とか splitの減算する値 を変えるといいようです。

evince(ドキュメントビューア)を使えばPDFが更新されたときに自動的に再読み込みしてくれるので、調整するときに楽です。


2012-01-14 Dropboxで「ファイルシステムを監視できません。」と出たときの対処法。

_ [Linux] Dropboxで「ファイルシステムを監視できません。」と出たときの対処法。 @Ubuntu Linux

ポップアップで対処方法が通知されますが、あれは一時的なもので再起動すると戻ってしまいます。というわけで恒久的に対処する方法。

/etc/sysctl.conf に以下の1行を追加します。数値はお好みで(Ubuntu 11.10はデフォルト 8192)。

fs.inotify.max_user_watches = 65536

sudo sysctl -pと実行し、sysctl.confに記述した内容が表示されればOKです。

$ sudo sysctl -p
fs.inotify.max_user_watches = 65536

inotifyは、ファイルシステムのイベントを監視・通知するLinuxカーネルのサブシステムです。fs.inotify.max_user_watches は、1ユーザあたりの監視可能数を指定するパラメータになっています。

Linux版Dropboxはこのinotifyを使っているようですが、おそらくはディレクトリ単位で監視しているようです。Dropboxに怒られたときにディレクトリ数をカウントしてみると、 8192 (デフォルトの監視可能数) を少し上回っていました。

# ドット付きを含むディレクトリを列挙し、カウントしてみる
~/Dropbox$ tree -ad | wc -l
8576

参考:


2012-01-16 Ajaxでリアルタイム検索出来るAPIリファレンスサイト。

_ [Web][Ruby][Rails] Ajaxでリアルタイム検索出来るAPIリファレンスサイト。

いわゆる『はてブのホッテントリ』で"最速な JavaScript のリファレンスマニュアルサイトをつくった - ”><xmp>TokuLog 改メ tokuhirom’s blog"というのを見つけて「おおー」と思ったので,ちょこっとリストアップしてみました.

jQuery
jQAPI - Alternative jQuery Documentation (ダウンロード可)
JavaScript
JSAPI - JavaScript Reference Manual (ダウンロード可 *1)
Ruby on Rails
Ruby on Rails Documentation
Ruby, RoR 2.x系, Haml, Hpricot, Nokogiri, Rack, RSpec, Sinatra, Thinなどなど
Rails Searchable API Doc (ダウンロード可)
HTML5, CSS3, SVGなどのブラウザ別対応状況
When can I use... Support tables for HTML5, CSS3, etc

これくらいの英語はさらさらと読めるくらいになりましょう。


2012-01-18 ファイルの更新を検出して,任意のコマンドを実行する (nosier)

_ [Linux] ファイルの更新を検出して,任意のコマンドを実行する (nosier)

inotifyでファイル監視して、引数のコマンド実行してくれるnosierが便利 | hexacosa.net そのままですが。

$ sudo apt-get install python-inotifyx
$ sudo easy_install -ZU nosier

これでインストールが出来ました.

$ nosier -r -b "*" -w "*.tex" "./compile_thesis.rb"
  • -r: 起動時の初期コマンド実行をしない
  • -b: ブラックリスト — 監視したくないもの(いったんすべて監視対象から外す)
  • -w: ホワイトリスト — 監視したいもの
  • 最後: 実行するコマンド

更新を検出すると,以下のように表示されてコマンドが実行されます.

================================================================================
Run Number : 2
Files      : ./thesis-utf8.tex
Command    : ./compile_thesis.rb

2012-01-19 ファイルの更新を検出して,任意のコマンドを実行する (inotifywait編)

_ [Linux] ファイルの更新を検出して,任意のコマンドを実行する (inotifywait編)

nosierがサブディレクトリ見てくれなくてなんだか微妙なので,inotifywaitを使うことにしました.

$ sudo apt-get install inotify-tools

以下のようなシェルスクリプト書いて,実行しておけばおっけーな感じで.

while inotifywait --exclude .swp -e modify ./sections/; do # スワップファイルは検出しない
    sleep 1
    ./compile_thesis.rb
done

2012-01-21 Ruby on Rails 3.2.0リリース。

_ [Rails][Ruby] Ruby on Rails 3.2.0リリース。

Ruby on Rails 3.2.0がリリースされました。さっそく某アプリを人柱にしてみましたが、特に何も起こりませんでした。


ここからは気になったところをいくつか抜粋&適当に意訳。

EXPLAIN

「このSQL文で、きちんとインデックスは使われるのかな~」とか、いわゆる「遅いクエリ(Slow query)」を調べるとか、そういう用途に使うのが、SQLのEXPLAIN文です。

1.9.2p290 :003 > puts User.limit(5).explain
  User Load (0.2ms)  SELECT "users".* FROM "users" LIMIT 5
  EXPLAIN (0.1ms)  EXPLAIN QUERY PLAN SELECT "users".* FROM "users" LIMIT 5
EXPLAIN for: SELECT  "users".* FROM "users"  LIMIT 5
0|0|0|SCAN TABLE users (~1000000 rows)

Automatic Query Explains

このEXPLAINですが、"Automatic Query Explains"と題して、一定時間以上かかったクエリを自動的にEXPLAINしてwarnレベルでログ出力してくれる機能がつきました。デフォルトで、developmentでは0.5秒以上、productionでは無効(時間計測の処理を省くためでしょうか)になっています。データベースアクセスまわりのパフォーマンス改善・検証にはもってこいです。

Faster Development Mode

これまで、development環境では毎回クラスをロードして解釈して云々とやっていたところ、書き換えられたクラスと関連クラスのみを再ロードするモードができました。これでdevelopment環境も速くなります。

このへんでうまくいかないなー、と思ったときは、 config.reload_classes_only_on_change を false にすると無効にできるようです。

rake routes が見やすくなった。

before
            user GET    /users/:id(.:format)            {:action=>"show", :controller=>"users"}
after
            user GET    /users/:id(.:format)            users#show

端末の横幅が狭くても折り返されないので、とっても見やすいです。

ActiveRecord::Relation#uniq

メソッドチェインができるクエリメソッドとして uniq が追加されています。SQLのDISTINCT指定に相当するものです。

    Before:
        Client.select('DISTINCT name')

    After:
        Client.select(:name).uniq

select(sql, ...) メソッドでSQL文を指定してもよいのですが、そうするとDBMS依存になってしまいがちなので,たぶんクエリメソッドを使ったほうがよいのかなと推測。いったん配列にしてArrayのuniqを使うのはDBMSの機能が生かせてなくてマイナスです。

ActiveRecord::Relation#first_or_create, first_or_create!, first_or_initialize

「あったら最初のものを、なかったら作ってくれ」メソッド。

ActiveSupport:TaggedLogging

タグ相当のものを先頭に付加したログを記録することができるようです。

Array#prepend, Array#append

prependは配列の先頭に追加するもので、unshiftのエイリアス。appendは配列の末尾に追加するもので、<<(push)のエイリアス。

まあ、unshiftって書かれるよりはわかりやすいかな。


2012-01-26 MongoDBが異常終了したときの修復方法 @Ubuntu

_ [Linux][雑記] MongoDBが異常終了したときの修復方法 @Ubuntu

ふつうにUbuntuを再起動したはずなのに、MongoDBに怒られてしまいました。

/var/log/mongodb$ sudo tail -f mongodb.log 

************** 
Unclean shutdown detected.
Please visit http://dochub.mongodb.org/core/repair for recovery instructions.
*************
Thu Jan 26 04:48:17 [initandlisten] exception in initAndListen: 12596 old lock file, terminating

ログファイルが示している http://dochub.mongodb.org/core/repair を見たものの、Ubuntuだと微妙にコマンド等々が異なるのでその辺りをメモっておきます。


データベースの修復: mongodbユーザで--repairする。

$ sudo -u mongodb mongod -f /etc/mongodb.conf --repair

all output going to: /var/log/mongodb/mongodb.log

修復結果はすべてログファイルに出力されるようです。

うっかりrootでrepairしてしまうと、データベースの所有者がrootになってMongoDBサービスが立ち上がらなくなります。そんなときは、慌てずに chown で強引に対処してしまいます。

/var/lib/mongodb$ ls -l
drwxr-xr-x 2 root    root        4096 2012-01-26 04:51 test
-rw------- 1 root    root    16777216 2012-01-26 04:51 test.0
-rw------- 1 root    root    33554432 2012-01-26 04:51 test.1
-rw------- 1 root    root    16777216 2012-01-26 04:51 test.ns

/var/lib/mongodb$ sudo chown -R mongodb:nogroup *

起動: たちあげる。

$ sudo service mongodb start
mongodb start/running, process 4248

$ sudo /etc/init.d/mongodb status
mongodb start/running, process 4248

お疲れ様でした。



2012-01-31 Ruby×Mongoid×MongoDB: 導入から動作確認まで (Ubuntu)

_ [Ruby][Linux] Ruby×Mongoid×MongoDB: 導入から動作確認まで (Ubuntu)

「なんかMongoDB使ってみたいんだけど,どこから手をつければいいのやら」という人向けの記事です.RubyからMongoDBを簡単に(ActiveRecordっぽく)扱えるMongoidを使います.Ubuntu 10.04以降が対象です.

MongoDBの導入

Ubuntuで用意されている mongodb パッケージは古いので,開発元の最新版パッケージを使います.下記リンク先に設定方法が書かれています.

まず,公開鍵(GPG key)を登録します.

$ sudo apt-key adv --keyserver keyserver.ubuntu.com --recv 7F0CEB10

つぎにapt-lineを編集します.Synapticパッケージマネージャを使ってリポジトリに下記を追加するか,/etc/apt/sources.listに直接書き足します.ただし,パッケージマネージャを使う場合は"ソース"のリポジトリも勝手に追加されてしまうので,外しておきます.

deb http://downloads-distro.mongodb.org/repo/ubuntu-upstart dist 10gen

いよいよMongoDBをインストールします.下記のようにいくつか種類がありますが,今回は新しい mongodb-10gen をインストールします.

  • mongodb: Ubuntuで用意されている古いパッケージ (Ubuntu 11.10では 1.8.2)
  • mongodb18-10gen: 開発元が用意している古いバージョン (1.8.4)
  • mongodb-10gen: 開発元が用意している新しいバージョン (2.0.2: 2012-01-16時点)
$ sudo apt-get install mongodb-10gen

コンソールから…

mongo というコマンドでコンソールから操作することができます.

$ mongo

デフォルトでは test というデータベースが操作対象になります.接続先やデータベースを変更したい場合は,次のように指定します.

$ mongo 127.0.0.1:27017/test   # <Hostname>:<Port>/<Database>
MongoDB shell version: 2.0.2
connecting to: 127.0.0.1:27017/test

コンソールからの操作方法はあんまり知りません.

> db  # いま接続しているデータベースを表示
test
> show collections  # DBに存在するコレクション(テーブル)を表示
demo
> db.demo.find()    # SELECT * FROM demo; 的な感じ
{ "_id" : ObjectId("4eed96d88aeb3fc15228666c"), "a" : 1 }

>> db.demo.insert({"b": 3})  # ドキュメント(レコード)を追加.スキーマレスなのでキー(フィールド)は自由に指定できる
> db.demo.find()
{ "_id" : ObjectId("4eed96d88aeb3fc15228666c"), "a" : 1 }
{ "_id" : ObjectId("4f25e5b937e9ec84c1dba9a4"), "b" : 3 }  # 追加されている

>> db.example.insert({ test: 2 })  # 存在しないコレクション(テーブル)は自動作成してくれる
>> db.example.find()
{ "_id" : ObjectId("4f25e5d337e9ec84c1dba9a5"), "test" : 2 }

Mongoidの導入

きっとこれだけです.

$ gem install mongoid

Mongoidを使う

まずは接続するホスト・ポート・データベースを指定します.

require 'mongoid'

Mongoid.configure do |config|
  config.master = Mongo::Connection.new('localhost', 27017).db("book_store")
end

つぎに,操作したいコレクション(テーブル)名に対応するクラスを作成し,Mongoid::Documentをincludeします. MongoidはODM(Object Document Mapper)なので,1つのドキュメント(レコード)とオブジェクトとが関連付けられます.

class Book # コレクション名は books (大文字の区切りはアンダーバーに,末尾は複数形になる)
  include Mongoid::Document
end

さあ,操作してみましょう.ActiveRecordっぽく操作できます.

> require './mongo_test.rb'
 => true
> Book.count  # レコード数
 => 0
> Book.create({ name: "MongoDB: The Definitive Guide", price: 39.99 })  # 作成
 => #<Book _id: 4f278d0a4a62136e61000001, _type: nil, name: "MongoDB: The Definitive Guide", price: 39.99>

> book = Book.first   # レコード取得
 => #<Book _id: 4f278d0a4a62136e61000001, _type: nil, name: "MongoDB: The Definitive Guide", price: 39.99>
> book.name   # フィールドには簡単にアクセスできる
 => "MongoDB: The Definitive Guide"

> Book.count   # レコード数
 => 1

本当に追加されたのかな? ということで,コンソールから確認してみます.

$ mongo 127.0.0.1:27017/book_store
MongoDB shell version: 2.0.2
connecting to: 127.0.0.1:27017/book_store

> show collections   # books コレクション(テーブル) は作られているかな?
books
system.indexes

> db.books.find()    # books コレクションにドキュメント(レコード)は追加されたかな?
{ "_id" : ObjectId("4f278d0a4a62136e61000001"), "name" : "MongoDB: The Definitive Guide", "price" : 39.99 }

無事に動作しているようです.おつかれさまでした.


参考


トップ «前月 最新 翌月»

operated by Kindai ECL

operated by Kindai ECL