40歳からのキャリアチェンジ

20代はエンジニア・PM、30代はWeb系エンジニア向けのキャリアアドバイザー。40代の今はフリーランスで開発含めて色々やってます。技術ネタとしてはRuby/RailsとJavaScript関連あたり

環境構築で最近はまった事のまとめ

サーバ側の環境構築してる時に最近はまっていたことをいくつか

Apacheのプロセスがどのユーザで起動されているか確認する

Linux/BSDな環境のサーバ管理している人には常識なんだろうけど、実はこれがすぐわからなかった。こちらのページ見たらpsコマンドの一覧まとめていて「u」オプション付けることでプロセスの実行ユーザ確認できるとのこと。なので

ps aux | grep apa

みたいな感じにすればOK

Sinatraのクエリーパラメータ取得した後に、数値→時刻への変換処理でErrorになる

実はこれに随分悩まされた。やりたかったことは

http://h5y1m141.info/entry/oyamada/1330000000

みたいなURLにアクセスした時に、

  • ブロガー名:oyamada
  • ブログの投稿日:Unix time(=1330000000)を変換して得られる結果。具体的には2012-02-23 21:26:40 +0900 以降。

というクエリーを発行して該当するエントリをDBから得ることをやろうと思ってました。

require 'sinatra'
get '/entry/:blogger/:num' do
  t = Time.at(params[:num])

みたいな感じでクエリーパラメータ取得して変換すればOKかと思っていたのですが「TypeError - can't convert String into an exact number:」と怒られてしまいました。params[:num]を数値変換すれば良かったみたいで、具体的には

require 'sinatra'
get '/entry/:blogger/:num' do
  t = Time.at(params[:num].to_i)

で解決しました。

ただ、http://h5y1m141.info/entry/oyamada/1330000000 みたいなURLにアクセスしてデータ取得するよりも、DBのlimit句などを駆使してpagination実装したほうがシンプルなことについさっき気づいたので、このURLにアクセスするのはやめることにしようと思います

MongoDBのpagination

どうやるんだろうとググっていたら、Stack Overflowにそのものズバリなことがあったけど1年ほど前にすでにはてブしてたのを忘れていた・・

MongoDBインストールしたLinux上でmongoシェル起動して

db.entries.find({"blogger":"oyamada"},{"title":1})
{ "_id" : ObjectId("4f860b45b8dac929af000001"), "title" : "まずは、自己紹介" }
{ "_id" : ObjectId("4f86114db8dac92c71000001"), "title" : "まずは、自己紹介" }
{ "_id" : ObjectId("4f86114fb8dac92c71000003"), "title" : "新しい職場で働く時" }
{ "_id" : ObjectId("4f861152b8dac92c71000005"), "title" : "Relax" }
{ "_id" : ObjectId("4f861154b8dac92c71000007"), "title" : "イチローにみるリーダーシップ" }
{ "_id" : ObjectId("4f861156b8dac92c71000009"), "title" : "Sun Grid から見るネットワークインフラ展望" }
{ "_id" : ObjectId("4f861158b8dac92c7100000b"), "title" : "何を勉強するか考える前に" }
{ "_id" : ObjectId("4f86115bb8dac92c7100000d"), "title" : "MicrosoftのOfficeの牙城を切り崩そうとするサービスの登場" }
{ "_id" : ObjectId("4f86115db8dac92c7100000f"), "title" : "メールとの付き合い方" }
{ "_id" : ObjectId("4f86115fb8dac92c71000011"), "title" : "お金のことについて" }
{ "_id" : ObjectId("4f861161b8dac92c71000013"), "title" : "セミナーやイベント参加時のちょっとした準備" }
{ "_id" : ObjectId("4f861163b8dac92c71000015"), "title" : "オープンソースといえば?" }
{ "_id" : ObjectId("4f861166b8dac92c71000017"), "title" : "お客さんの期待感" }
{ "_id" : ObjectId("4f861168b8dac92c71000019"), "title" : "身になる読書のための5つのTips" }
{ "_id" : ObjectId("4f86116ab8dac92c7100001b"), "title" : "パッケージングの妙" }
{ "_id" : ObjectId("4f86116cb8dac92c7100001d"), "title" : "実務経験xx年以上という”モノサシ”" }
{ "_id" : ObjectId("4f86116fb8dac92c7100001f"), "title" : "Winny対策PC導入。でもその前に・・" }
{ "_id" : ObjectId("4f861171b8dac92c71000021"), "title" : "時間の流れの見方を変えてみませんか?" }
{ "_id" : ObjectId("4f861173b8dac92c71000023"), "title" : "情報漏えい対策セミナー" }
{ "_id" : ObjectId("4f861175b8dac92c71000025"), "title" : "情報漏えい対策セミナーまとめ" }

となっている状況で先頭の5件取得するには

db.entries.find({"blogger":"oyamada"},{"title":1}).skip(0).limit(5)
{ "_id" : ObjectId("4f860b45b8dac929af000001"), "title" : "まずは、自己紹介" }
{ "_id" : ObjectId("4f86114db8dac92c71000001"), "title" : "まずは、自己紹介" }
{ "_id" : ObjectId("4f86114fb8dac92c71000003"), "title" : "新しい職場で働く時" }
{ "_id" : ObjectId("4f861152b8dac92c71000005"), "title" : "Relax" }
{ "_id" : ObjectId("4f861154b8dac92c71000007"), "title" : "イチローにみるリーダーシップ" }

でOK。6件目から10件目を取得したい場合には

db.entries.find({"blogger":"oyamada"},{"title":1}).skip(5).limit(5)
{ "_id" : ObjectId("4f861156b8dac92c71000009"), "title" : "Sun Grid から見るネットワークインフラ展望" }
{ "_id" : ObjectId("4f861158b8dac92c7100000b"), "title" : "何を勉強するか考える前に" }
{ "_id" : ObjectId("4f86115bb8dac92c7100000d"), "title" : "MicrosoftのOfficeの牙城を切り崩そうとするサービスの登場" }
{ "_id" : ObjectId("4f86115db8dac92c7100000f"), "title" : "メールとの付き合い方" }
{ "_id" : ObjectId("4f86115fb8dac92c71000011"), "title" : "お金のことについて" }

でOK。