ラベル IT の投稿を表示しています。 すべての投稿を表示
ラベル IT の投稿を表示しています。 すべての投稿を表示

2011年10月13日木曜日

rpmが固まる


rpmが固まってしまい、無理矢理killするしかなくなってしまった…。
調べてみたら、
# rpm --rebuilddb
すれば直る、とあったのでやってみた。なんかDBがおかしくなっちゃったのね。
無理矢理killしたりも悪かったんだろう。

コマンド打って放置。
あれ、20分ぐらい経つけど、まだやってる…。
また固まってない??

さらに調べてみると、どうやらロックファイルが残っているため固まってしまうらしい。
http://his.luky.org/ML/linux-users.a/msg00348.html
# rm -f /var/lib/rpm/__db.*
# rpm -vv --rebuilddb
-vvを付けたので今度は動いているかは確認出来る。
お、5分もかからず復活!
よかったよかった!

しかし、killするしかないってのはキビシイ…。

Seleniumを使ってみた その3


前回前々回と引き続きSelenium 2.0の話。
Webアプリのテストに便利そうだけど、全部自分でスクリプト書くのはちょっと面倒だなぁ、なんて思っていたら、ちゃんとツールがあった。
Selenium IDE

Firefoxのアドインで、実際にブラウザ操作しながら記録できる。
しかも、その記録はJava, PHP, Perl, Rubyなど多種の言語にエクスポート可能!!
もちろんエクスポートしたコードはSeleniumが動いているサーバに置けば実行可能。
これはスゴイ!

自分でソース見ながら「このテキストボックスのIDがこれで、パスワードのIDがこれ…」とか地味な作業が一気になくなる。
なんて便利なんだ!!

とりあえずPerlでやってみる。
cpanでいろいろインストールが必要だったが、特に問題なく終了。
ただUTF8が前提なので、is_test_present_okなどで日本語の文字列の存在確認をしようとするとそのままだと失敗する。
use utf8;
を最初にくっつければ動くようになった!

2011年10月12日水曜日

Seleniumを使ってみた その2


前回は導入しただけなので、引き続き、Seleniumを使ってみる。

まずはWebDriverのドライバ(ややこしいな)を選ぶ。
大雑把に言ってしまうとWebDriverは、ブラウザの名前。
Firefox, IE, Chrome, Opera, iPhone, Android, それにHtmlUnitというのがある。
(2011年10月12日現在では、Opera, iPhone, Androidは使用不可)
例えば、Firefoxのドライバは、Firefoxをブラウザとして使用してテストする。
IE, Chromeもその名のとおり。
HtmlUnitというのはサーバから返されるHTML文書を解析して動くらしい。
テキストだけなのでやりやすいけど、実際の画面は見えないし、「本当にIEで動かしたらどう見えるか?」は分からないのが欠点。
でも、Rubyではサポートされてない…。

使い方は
driver = Selenium::WebDriver.for :<ドライバ名>
とすればロードされる。

テストしたいページを開くには
driver.get
となる。

さて、例えばログイン画面が出てきて、ちゃんとログインできるかテストするにはどうするか?
そんな難しい話ではなく、HTMLエレメントの名前やらIDを使って指定すればいい。

まずはエレメントを探す。
id = driver.find_element :name => "username"

そのエレメントに値を入力するには
id.send_keys <ユーザ名>

パスワードも同様に
pass = driver.find_element :name => "password"
pass.send_keys <パスワード>

でフォームの内容を送信。
pass.submit

divのcontentクラス内のh3を取得(10秒だけ待つような設定)
wait = Selenium::WebDriver::Wait.new(:timeout => 10 ) #10 秒
begin
  result = wait.until { driver.find_element(:xpath => "//div[@class='content']/h3") }
ensure
  driver.quit
end

これでassertとかすればよさそう。

Selenium 2.0は便利だけど、ドキュメントがまだまだ整備されていないのが残念。
これからどんどん増えることを希望。

さらに続きます。

Seleniumを使ってみた その1


最近リリースされたSelenium 2.0を使ってみた。
http://seleniumhq.org/
公式には前バージョンからいろいろ変わった点があるが、そもそも前バージョンを使ったことがないので、この辺は読み飛ばし。

テストプロジェクトの設定で、2011年10月12日現在ではJava, C#, Python, Rubyしかサポートされていないらしい。
この中じゃJavaが一番分かるかなぁ、と思いきやMavenを入れる必要があるっぽい。
いや、なくても出来るんだろうが大変らしい。
業務でJava使わないからそこで時間取られるのもなぁ。
う~ん、サンプルコードしか打ったことないけどRubyにするか(無謀?!)。

まずはインストール。
公式からSelenium Serverをダウンロードしたけど、要らなかったかも…。
http://seleniumhq.org/download/

単に
# gem install selenium-webdriver
でよかったみたい。

rubyのサンプルコードも公式にあったので、そのままコピペしてgoogleTest.rbというファイルに保存し動かしてみる。

% ruby googleTest.rb
/usr/local/lib/ruby/gems/1.8/gems/selenium-webdriver-2.8.0/lib/selenium/webdriver/firefox/binary.rb:116:in `path': Could not find Firefox binary (os=linux). Make sure Firefox is installed or set the path manually with Selenium::WebDriver::Firefox::Binary.path= (Selenium::WebDriver::Error::WebDriverError)

失敗。
firefoxを使ってテストしているのに、firefoxが入ってなかった…。
そういえばfirefoxがなかった。yumでインストール後、再度実行。
% ruby googleTest.rb
/usr/local/lib/ruby/gems/1.8/gems/selenium-webdriver-2.8.0/lib/selenium/webdriver/firefox/launcher.rb:77:in `connect_until_stable': unable to obtain stable firefox connection in 60 seconds (127.0.0.1:7055) (Selenium::WebDriver::Error::WebDriverError)
        from /usr/local/lib/ruby/gems/1.8/gems/selenium-webdriver-2.8.0/lib/selenium/webdriver/firefox/launcher.rb:37:in `launch'
        from /usr/local/lib/ruby/gems/1.8/gems/selenium-webdriver-2.8.0/lib/selenium/webdriver/firefox/socket_lock.rb:20:in `locked'
        from /usr/local/lib/ruby/gems/1.8/gems/selenium-webdriver-2.8.0/lib/selenium/webdriver/firefox/launcher.rb:32:in `launch'
        from /usr/local/lib/ruby/gems/1.8/gems/selenium-webdriver-2.8.0/lib/selenium/webdriver/firefox/bridge.rb:19:in `initialize'
        from /usr/local/lib/ruby/gems/1.8/gems/selenium-webdriver-2.8.0/lib/selenium/webdriver/common/driver.rb:29:in `new'
        from /usr/local/lib/ruby/gems/1.8/gems/selenium-webdriver-2.8.0/lib/selenium/webdriver/common/driver.rb:29:in `for'
        from /usr/local/lib/ruby/gems/1.8/gems/selenium-webdriver-2.8.0/lib/selenium/webdriver.rb:81:in `for'
        from googleTest.rb:4

またも失敗。
そうか、firefoxだからGUIが必要。CUIでやってたらそりゃ起動できないわ。

気を取り直してGUIで実行。
(TeraTerm + Xmingの環境構築はこちらを参考に。)
http://d.hatena.ne.jp/information-world/20090602/1243938029

firefoxが起動後、パパっと勝手に動いて結果出たら終了。
% ruby googleTest.rb
Page title is Cheese! - Google 検索
Page title is Cheese! - Google 検索

なかなかおもしろい!
続きます!

2011年9月29日木曜日

TestLinkのインストール


テスト管理ツールのTestLink、redmineとも連携できるらしいので思い立ってインストールしてみた。
マニュアルに従ってインストール。
https://sourceforge.jp/projects/testlinkjp/downloads/33628/install_manual.pdf

が、ブラウザで最初に開いたときにPHP 5.2移行が必要ということで躓いた。
CentOS 4系なので、公式yumではPHP5.1までしかない。
ソースからしかないのかなぁ、と思って調べたところ、REMIというレポジトリを使えばPHP5.2をCentOS4系からもインストール出来るらしい。
http://memorandum.yamasnet.com/archives/Post-165.html
これでOK!

さて、ブラウザからクリック一つで自動インストール、と思いきや、
Your PHP installation don't have PHP DB extension - without it is IMPOSSIBLE to use Testlink.Failed!

なんだかよく分からない。
とりあえずyumでphp-mysqlを入れて、php.iniもいじってみたけど、ダメ。

仕方ないので、マニュアルにある通り手動でやってみた。
クリック一発でもないけど、そんなに大変でもない。

設定完了でログイン成功!!
…あれ、一瞬でセッションが切れました、再度ログインしてください、になってしまう。
Your session has expired! Please login again

どうやら
/var/lib/php/session
に書き込み権限がなかったので、セッション切れ状態になってしまったみたい。
書き込み権限を付与したところ、正常に動くようになった!

とは言え、TestLinkに慣れなすぎてなにしていいかよくわらない…。

2011年9月13日火曜日

Exchange Server 2010の自動構成がうまく行かない

メールシステムがDomino ServerからExchange Server 2010に変わった。
本社から「Outlook起動すれば自動構成(autodiscover)が動くから考えることない」と言われていたが、うまく動かないユーザ(PC?)がある…。
まぁ、自分のPCもそうだったんだけど。
まずサーバの構成を探してる時に
0x80070057
のエラーが出てしまう…。

本社に問い合わせて、手動でサーバ名を設定したら、とりあえずメールの送受信はできるようになったけど、アドレス帳が見えない。
オフラインアドレス帳も取ってこれない。
これはちょっとマズイでしょ…。

Exchange Server 2010にはまだアクセス権限がないので、クライアント側で出来ることをやるしかない。
autodiscoverが動く人と動かない人の違いを突き止めたいけど、全員Outlook 2010なので、バージョンによるものではない。ネットワークも同じセグメント、PCもほぼ全員XP。Win7も一台あるけど、普通に動いてる。WSUSからパッチも当てていて、特に差異はない。
とりあえずOutlookでプロファイルを作り直したけど解決せず。
Outlookの再インストールもしたけど、変化なし。

パケットキャプチャを入れて動作を見てみたりもしたけど、なぜautodiscoverが届かないかはよく分からない。
ADで問い合わせをして、デフォルトサイトを見て、という基本の動作も見直して、pingやnslookupをしてみたり、一応dnsflushしてみたりもしたけど、おかしいところはないっぽい。

どうしたもんかと思い、いろいろ探しているうちにautodiscoverのファイルをローカルに置いて設定する方法が見つかった。
原因調査はさておき、とりあえず問題を解決しようと思い、やってみた。
http://support.microsoft.com/kb/2028193/en-us

まずはうまく行っているPCで
C:\Documents and Settings\ユーザ名\Local Settings\Application Data\Microsoft\Outlook\<不規則な文字列> - Autodiscover.xml
をうまく行っていないPCにコピー。

で、..タグ全体を削除。
さらにのユーザID部分を削除してAutodiscover.xmlとして任意の場所に保存(仮にC:\Autodiscover.xmlとする)。

そうしたら、regedit(バックアップは取ったほうがいいかも)で
HKEY_CURRENT_USER\Software\Microsoft\Office\14.0\Outlook\AutoDiscover





DWORD: 「PreferLocalXML」を作成。
値は「1」に。

さらに文字列: <企業のドメイン名>
値: さっき作成したAutodiscover.xmlのパス(C:\Autodiscover.xml)


これでOutlookに戻って、autodiscoverを行えば正常に通りました!

2011年8月26日金曜日

redmineのアップグレード


現在使用中のredmineは0.9.3で、既にかなり古い…。
機能も豊富になったらしいので、バージョンを上げたいが、いきなり稼働中のものに触るのは恐ろしいので、まずは開発環境に移してこちらを参考にしながらアップグレードを試みた。
http://redmine.jp/guide/RedmineUpgrade/

ruby, rails, rakeあたりは新しいのに上げておこう!とアップデートしてしまったのが運の尽き。
これが結構悪さした。

rake generate_session_store
これが失敗。
rake/rdoctask is deprecated.  Use rdoc/task instead (in RDoc 2.4.2+)
こういうエラーが出る。

ちょっと調べてみると、rakeのバージョンが新しすぎるらしい。
とにかく新しいものならいいってわけないか…。

ちょっと公式に戻ってみよう。
http://www.redmine.org/projects/redmine/wiki/RedmineInstall#Requirements

1.2.1は
ruby 1.8.6 か 1.8.7
rails 2.3.11
rack 1.1.1
が必要。
さらに
Rake 0.8.7 is required (rake 0.9.x is not supported by Rails yet)
と思いっきり書いてあった…。

この辺、揃えたらあっさり成功。
やっぱり公式はちゃんと読まないと。

2011年8月25日木曜日

COPY文に条件指定


PostgreSQLのCOPY文で条件指定が出来るらしい。
http://d.hatena.ne.jp/yuum3/20071213/1197535601

COPYはテーブル全体をファイルに落としたり、反対にファイルからテーブルに突っ込んだりできるが、条件指定は無理だと思ってた。
COPY ( SELECT ... ) TO '/tmp/filename';
とSELECTでなんでも出来るなら、これはいろいろ捗りそう!

と思い、やってみたけどダメ…。
なんで?COPY ( SELECT ...と打っても、SYNTAX ERRORに。
PostgreSQLのバージョンも8.1.4。8系なら大丈夫、とあったが、やっぱりこれかなぁ?

公式のドキュメントをみてみると
http://www.postgresql.jp/document/pg814doc/html/sql-copy.html
COPY文の定義として(SELECT のようなクエリは打ち込めなくなってる…。

いつから出来るようになったんだろう…?と探してみると
http://www.postgresql.jp/document/pg820doc/html/sql-copy.html

8.2.0からは可能になったみたい。
プロダクションなので簡単にバージョンアップは出来ないし、そこまでリスクを負うほどのことでもないし。

ということで、結局試さないままでした。


2011年8月3日水曜日

ostをpstに変換

Exchange Online(BPOS)を使っていたのだが、社内でExchange Server 2010を導入することになった。
現在のメールも移行させたいが、保存されているのはオフラインキャッシュであるostファイルにある。
pstファイルに変換しないといけないのかと思い、いろいろ調べてみた。

英語のソフトしかない。
とりあえずデモ版を使ってみる。

Advanced Exchange Recovery
日本語も大丈夫そう。だけど、受信トレイの下にユーザが作成したフォルダがない…。どこにも見当たらない…。
Recovered_FolderXXというフォルダがあるけど、中身は送信済みと削除済み。
Recorered_GoupXというフォルダもあるけど、会議室予約の応答とかでユーザが意識していない情報。
ユーザが作成したフォルダがないのはちょっと困る。

Recovery Toolbox for Outlook
これも日本語も大丈夫。文字化けも見当たらない。ただ復元されたフォルダは「ルートメールボックス」→「IPM_SUBTREE」の下だった。
ユーザが作成したフォルダもあったけど、何故か「削除済みアイテム」の下。変な構成だ。
ostを解析した後、変換するフォルダやアイテムを選べるのはありがたい。
pst変換だけじゃなくて、メールは.eml、コンタクトは.vcfに変換できるけど、こっちは文字化けしたりちゃんと変換出来ていなかったり。
おまけぐらいに思ったほうがいいのかも。

Convert ost to pst
たまに文字化けがある。まぁ、上の二つも全部見れるわけじゃないから、同じかもしれないけど。
かなり重い…。
デモ版だとpstが作れないからなんとも言えない。

と、こんなに調べちゃったわけですが、実は単に「エクスポート」すればpstが出来ることが判明…。
Outlook 2010なら「ファイル」→「開く」→「インポート」→「ファイルにエクスポート」で出来ちゃいます。

上のソフトは、もうOutlookからそのostでアクセス出来ず、ostにしかデータが残ってない時に使うのかな。
とにかく、ツールは買ってないのでそこまでのレビューは出来ません!

2011年7月26日火曜日

WSUSでクライアントPCの状態が「まだ報告されていません」のままになってしまう

今までWindows Server 2003で運用していたが、ついにWindows Server 2008 R2にした。
ほぼ順調だったが、WSUSで躓いた…。

WSUSのコンソールからクライアントPCは見えるのだが、いつまで経っても「まだ報告されていません」のまま。
40台あるうちの1台だけ何故か3%ほど報告しているのもよく分からないが完全に状態を報告したPCはない状態…。
ドメインコントローラは複数台あったので、GPOも今までのままでWSUSサーバの設定も原則的には変えていないはず。
何が悪いんだ…?!
wuauclt.exe /detectnow
wuauclt.exe /reportnow
やらはやってみたけど、状況は変わらない。

C:\Windows\WindowsUpdate.logを見ると
WARNING: WinHttp: SendRequestToServerForFileInformation failed with 0x801901f7
WARNING: WinHttp: ShouldFileBeDownloaded failed with 0x801901f7
WARNING: DownloadFileInternal failed for http://swptyo1ad1/selfupdate/wuident.cab: error 0x801901f7
とか
FATAL: IsUpdateRequired failed with error 0x80244022
WARNING: SelfUpdate: Default Service: IsUpdateRequired failed: 0x80244022
WARNING: SelfUpdate: Default Service: IsUpdateRequired failed, error = 0x80244022
WARNING: Skipping scan, self-update check returned 0x80244022
WARNING: Exit code = 0x80244022
とかある。調べたところ、503 Server Unavailableの状態ということので、多分WEBサーバの設定がおかしいんだろう…。
ちなみに、プロキシは使っていない。

IIS、正直あんまり触ったことない…。

とりあえずもっと情報が欲しいので、クライアントPCにclientdiag.exeをインストール
ダウンロードはこちらから
http://download.microsoft.com/download/9/7/6/976d1084-d2fd-45a1-8c27-a467c768d8ef/WSUS%20Client%20Diagnostic%20Tool.EXE

C:\TEMP>clientdiag
WSUS Client Diagnostics Tool
Checking Machine State
        Checking for admin rights to run tool . . . . . . . . . PASS
        Automatic Updates Service is running. . . . . . . . . . PASS
        Background Intelligent Transfer Service is running. . . PASS
        Wuaueng.dll version 7.4.7600.226. . . . . . . . . . . . PASS
                This version is WSUS 2.0
Checking AU Settings
        AU Option is 4: Scheduled Install . . . . . . . . . . . PASS
                Option is from Policy settings
Checking Proxy Configuration
        Checking for winhttp local machine Proxy settings . . . PASS
                Winhttp local machine access type
                       
                Winhttp local machine Proxy. . . . . . . . . .  NONE
                Winhttp local machine ProxyBypass. . . . . . .  NONE
        Checking User IE Proxy settings . . . . . . . . . . . . PASS
                User IE Proxy. . . . . . . . . . . . . . . . .  NONE
                User IE ProxyByPass. . . . . . . . . . . . . .  NONE
                User IE AutoConfig URL Proxy . . . . . . . . .  NONE
                User IE AutoDetect
                AutoDetect in use
Checking Connection to WSUS/SUS Server
                WUServer = http://<サーバ名>
                WUStatusServer = http://<サーバ名>
        UseWuServer is enabled. . . . . . . . . . . . . . . . . PASS
        Connection to server. . . . . . . . . . . . . . . . . . PASS
WinHttpDownloadFileToMemory(szURLDest, NULL, 0, NULL, NULL, NULL, &downloadBuffer) failed with hr=0x801901f7
No Error description could be found
Press Enter to Complete
あんまりよく分からないが、繋がってはいるもののそこから先がダメ。503 Server Unavailableって所で引っかかってるらしい…。

よく分からないので、一旦WSUSとIISの役割を削除して、再度追加。
それで直ればいいなぁ、と期待したものの、直らない…

そもそもIISがちゃんと構成されていないのでは?と思ったので、WSUSとIISを削除して、今度はIISのみ追加。

むむ、デフォルトウェブサイトにつないでもやっぱり503 Server Unavailable…。
やはりIISがおかしい。

IISが503を返す理由を調べているうちに、どうもサービスを起動する権限がおかしい可能性があることが分かった。


  1. 管理ツールから「インターネット インフォメーション サービス(IIS)マネージャ」を起動
  2. 中央部の接続ペインから実行サーバ名をクリックし、アプリケーションプールを選択
  3. 右ペインの「DefaultAppPool」を右クリックして、「詳細設定」を選択
  4. プロセスモデルのIDを「NetworkService」にする(本来はこれがデフォルトだが、このサーバではApplicationPoolIdentityとなっていた)
  5. OKで終了し、再度DefaultAppPoolを右クリックして、「再起動」させる

これでIISは正常になった。

もう一度、WSUSを追加したところ、正常に動作。

やっと終わった~!

2011年7月15日金曜日

印刷ジョブが消えない

Windows Server 2003 と2008 R2がプリントサーバになっているが、印刷ジョブが止まってしまうことがある。
まぁ、サーバに限らずクライアントPCでもよくあることではあるけれど…。

印刷ジョブが泊まってしまったら、削除するのに「キャンセル」を押す。
それでも、消えないまま固まってしまうことがある…。
プリンタの電源を切ってもジョブは残りっぱなしだし。
Linuxならコマンドでなんとかなるんだが…。

どうしたもんかと思い調べてみたら、こちらと同じ対処で出来た。
http://naosan.way-nifty.com/it/2009/05/post-88fa.html

Print Spoolサービスを止めて、C:\Windows\system32\spool\printersの*.SHDを削除、でPrint Spoolをまた開始、という流れ。
サーバなので、この間全部の印刷が出来なくなるけど、まぁ、仕方ない。
また、もしかしたら*.SHDだとその時スプールされているジョブが全部消えるかもしれない。
その辺は検証してくしかないかな…。

誰か、いい方法知ってたら教えてください!

2011年7月14日木曜日

PostgreSQLでpsql以外からCOPY FROM/TO を使う

PostgreSQLで便利なCOPY文。
でも、COPY FROM/TO 'ファイル名'を使うにはスーパーユーザ(superuser)権限が必要…。
ERROR: must be superuser to COPY to or from a file HINT: Anyone can COPY to stdout or from stdin. psql's \copy command also works for anyone.
なんでもかんでもスーパーユーザにするのはよくないので、なにか方法はないかと調べてみた。

一つは\copyを使う方法。
C言語でlibpqを使って繋げているので、「単純にcopyを\copyにすればいいのか?」と思い試してみたが、やっぱりダメ。
そう簡単ではありません。
要は\copyはpsqlのコマンドであり、PostgreSQLに取っては分からないコマンドになってしまうから。

もう一つは、ヒントにも書かれているstdout, stdinを使う方法。
C言語からどうやればいいんだろう?
ということで、公式のドキュメントを参照。
http://www.postgresql.jp/document/9.0/html/libpq-copy.html

PQPutCopyData関数を使えばいいらしい。
ただいきなり発行できるわけではなく、まずCOPY_IN状態にしなくちゃならない。
COPY_IN状態にするにはどうしたらいいかというと、普通にPQExecで"COPY FROM STDIN..."を実行させればいいだけ。
こうなってからPQPutCopyData関数を使えばstdinから入れているように見せられる、とそういうわけか。

ここまで調べて、さあ実装しよう!と思ったら、上司から「そのユーザ、スーパーユーザにしちゃっていいよ」とのお言葉…。
まぁ、他にもいろいろあるユーザだし、プログラムの実行しかしないログインも出来ないユーザだからいいっちゃいいけどね。

ちょっと拍子抜けでした!

gdbの使い方

C言語での開発は好きじゃない…。
比べればまだいいけど、Javaもあんまり好きじゃない。
気楽なスクリプト言語が一番好み。

でも、仕事では既にC言語で書かれちゃってて、さらにメモリ破壊なんてことが起きたりするわけで。
動かすマシンを買えたらアーキテクチャの違いか何かで、今まで動いていたプログラムが急に動かなくなったりする。
まぁ、潜在的に抱えてたんだろうけど…。

そんな時に使えるのがgdb。
gdbはソースレベルのエントリを利用してデバッグを行うシンボリックデバッガ。
ソースがなく、プログラムしかない場合は機械語レベルでデバッグを行うアブソリュートデバッガを使うけど、ずっと大変そう…。
幸いソースはあるので、gdbを使う。
何ができるかって、プログラムを一行ずつ動かしたりして、その都度変数やスタックなんかを見ることが出来る。

まずは下準備。
-g オプションを付けてコンパイル。
要はこのオプションを付けることで、デバッグに必要な情報を実行ファイルにいれていると思われる。

で、gdbの起動。引数としてデバッグしたいプログラムを渡しちゃうと楽。
$ gdb sample
次はブレイクポイントの設定。
ソースコードを見ながら、挙動を監視したい辺りにブレイクポイントを設定
(gdb) break 5
※短縮してb 5 でも動く

で、いよいよプログラムの実行。
引数はrunコマンドに渡せばいい。
(gdb) run parameter1 parameter2

もちろんブレイクポイントまでで止まる。それ以前にエラーがあればそこで止まるけど。

お次は変数の確認。
(gdb) print hoge
※短縮して p hogeでも動く

次の行に進むには
(gdb) next
※短縮してnでも動く
まとめてN行進むには
(gdb) step N
※短縮してs Nでも動く。Nを省略すると1行進む

次のブレイクポイントまで一気に進むには
(gdb) continue
※短縮してcでも動く

やめたくなったら
(gdb) kill
あるいは一気に
(gdb) quit
で抜けてもいい。gdbが動かしていたプログラムはquitすれば止まる。

以上、簡単な使い方。
もっと詳しく知りたい人は以下で!
http://cl.is.kyushu-u.ac.jp/Literacy/PP/H14/adp/program/compile.html
http://uguisu.skr.jp/Windows/gdb.html

2011年7月13日水曜日

tsharkでパケットキャプチャ

Ciscoのスイッチに大量のパケットが送られているようでネットワーク帯域のほとんどを消費してしまい、ネットワークが非常に遅くなってしまった。
どんなパケットが送られてきているのか調べるためにwiresharkのCUI版、tsharkでキャプチャしてみた。

まずはスイッチ上での設定。
FastEther0/1のポートが本番稼動しているが、そこにキャプチャ用のサーバを入れて、というわけにはいかないので、monitorコマンドを使用。
空いている10番ポートに同じパケットが流れるようにする
monitor session 1 source interface Fa0/1
monitor session 1 destination interface Fa0/10
キャプチャするサーバのeth1にはアドレスも何も振らず10番ポートと接続。
これで準備完了。
$ tshark -i eth1 -t ad -w <ファイル名>
これで指定したファイルにキャプチャが取られて行く。
止めないと永遠にキャプチャし続けるので適当なところでCtrl+Cで打ち切る。

キャプチャしたファイルを読み込むには
$ tshark -r <ファイル名>
で読める。

ただダラダラ読んでも解析が難しい…。
ログ集計スクリプトを組まなくちゃダメかなぁ、と思ったらちゃんとtsharkに統計機能があった!

というわけで、
$ tshark -r <ファイル名> -z conv,ip            # IPごとに集計
$ tshark -r <ファイル名> -z io,phs             # プロトコル階層で集計
$ tshark -r <ファイル名> -z io,stat,600,eth    # 600秒ごとにethフレームとして集計
とすればログのあとに統計情報が出てくる。
これは便利!

tsharkに関してはこちらを参考にしました。
集計の部分がすごく分かりやすい!
http://assimane.blog.so-net.ne.jp/2011-01-08

2011年7月7日木曜日

Windows Server 2008R2 SP1の日本語版を英語表示に

海外チームのサポートを得るためと、エラー情報を英語で探すために、Windows Server 2008 R2 SP1の日本語版を英語表示にしたい。
MicrosoftからMultilingual User Interface Language Packが出ているので、それをインストールするだけ。
と思いきや、取得した.exeを実行してlpファイルが出来上がるものの、数秒で消えてしまう…。

何故だ?!

と思って、イベントログを見てみると
イベントID: 1014
en-US 向け言語パックはこのシステムに適していません。お使いのシステムのアーキテクチャおよびエディションを対象とする適切な言語パックをダウンロードしてください。
とか言ってくれちゃう…。

もしかして、ia64版をダウンロードしたのか?と思って確認したが、やはりx64版。

調べてみたら、サーバのOSがSP1だった。
あ、SP1だと入らないものなのね…。

あとはこちらを参考に作業したら、正常に入った!

ダウンロードするファイルは、Windows Server 2008 R2の人はこちら
SP1の人はこちら

2011年7月5日火曜日

シェルスクリプトで最後の引数を取得したい

検証したのはKorn Shellだけど、bashやPOSIX準拠shでも動くはず。

最後の引数を取得するには、引数の数は$#に格納されているので、
$$#
とすればよさそうだが…?


!/bin/ksh
echo "Number of arg: $#"
echo "Value of last index: $$#"

(arg_test.sh)

実行すると
$ ./arg_test.sh a1 b2 c3 d4 e5
Number of arg: 5
Value of last index: 19401#
※本来はe5と出て欲しいのに…

考えて見れば分かるが、$$#はシェルが特殊変数$$と解析し、PIDを出力する。
さらに#が付いているので、リテラルとして追加してecho出力、となった。

エスケープすればいいのか?と思い、


echo "Value of last index: \$$#"


としてみても、
$ ./arg_test.sh a1 b2 c3 d4 e5
Number of arg: 5
Value of last index: $5
う~ん、もう少し。

いろいろ調べると、こういう時は組み込み関数evalを使えばいいらしい。


echo "Value of last index: `eval echo '$'$#`"


これでOK。
$ ./arg_test.sh a1 b2 c3 d4 e5
Number of arg: 5
Value of last index: e5
想定通り!


ただ、これだと引数が9個までならいいけれど、10個以上になるとうまく行かなくなってしまう。
$ ./arg_test.sh a1 b2 c3 d4 e5 f6 g7 h8 i9 j10 k11
Number of arg: 11
Value of last index: a11
これはeval echo '$'$#の中で$#が$11と置き換わったが、シェルスクリプトの引数は$1, $2, $3,...でアクセスできるが、$9までしかない。
$11は$1と1と解釈されたので、$1="a1"と"1"が出力されている。
10番目移行の引数にはshiftしていくか、${10}などとする必要がある。

なので、


echo "Value of last index: `eval echo '$'{$#}`"


にすれば
$ ./arg_test.sh a1 b2 c3 d4 e5 f6 g7 h8 i9 j10 k11
Number of arg: 11
Value of last index: k11
と10個を超えても大丈夫になった。

2011年7月1日金曜日

PostgreSQLで権限の確認

PostgreSQLでの権限の確認は以下が参考になった。
http://www.dbonline.jp/postgresql/role/index3.html

\zで見れる。

db=# \z
                              Access privileges
 Schema | Name | Type  |     Access privileges     | Column access privileges
--------+------+-------+---------------------------+--------------------------
 public | test | table | postgres=arwdDxt/postgres+|
        |      |       | =r/postgres              +|
        |      |       | dba=arwdDxt/postgres     +|
        |      |       | dml=arwdD/postgres        |
(1 row)

権限を付けたユーザ(ROLE)はそのまま削除できない。
なので、削除したい場合は先にREVOKEを行ってからDROP ROLEを行う流れとなる。

2011年6月30日木曜日

heartbeat + SVN でエラー

heartbeatでサービスが引き継がれた際に、Subversion(SVN)でエラーが出た。

コミット時にリポジトリのdb/txn-current-lock に書き込めない、とあった。

調べてみると、ファイル・ディレクトリのオーナーが違う人になっていた。
要は、稼動系のuidとgidが待機系と違っていた、ということ。
usermod, groupmodで合わせたらあっさりコミット出来た。

こういうことも気を付けないといけなかった…。

heartbeat で cron設定を引き継がせる

heartbeatでcron設定(crontab)を引き継がせたくていろいろ調べてみた。

アプローチしては、似通ってくるけど3つぐらい

  1. 別ユーザのcronで自分のノードの状態を監視し、状態に応じてcrontab -u <ファイル>を実行する方法
  2. ha.cfの外部スクリプトでノードの状態を監視し、状態に応じてcrontab -u <ファイル>を実行する方法
  3. /etc/init.dにcrontab -u <ファイル>を実行するスクリプトを書いて、haresourceから起動させる方法

3がキレイだと思ったので、これを採用。
/etc/init.d/hacrontabとして


#!/bin/bash
# get functions
. /etc/init.d/functions
# See how we were called.
case "$1" in
  start)
    logger -s -t "$0" "setting up root crontab: /data/crontab/hacrontab"
    /usr/bin/crontab -u root /data/crontab/hacrontab
    echo
  ;;
  stop)
    logger -s -t "$0" "removing root crontab"
    /usr/bin/crontab -u root -r
    echo
  ;;
  status)
    echo "$0 status: "
    echo "crontab -u root -l:"
    crontab -u root -l
    ;;
  *)
    echo "Usage $0 (start|stop|status)"
    ;;
esac
exit 0


適当だけど…。
これを両方のノードに置き、/etc/haresourcesの最後にhacrontabを追加してheartbeatを再起動。
これでOKでした!

heartbeat + drbd でクラスタ化…、なのに同期が取れていない?!

Linuxサーバ2台でheartbeat + drbd を使用して2ノードクラスタを作っている。
稼動系がサーバが落ちてしまい、ちゃんと待機系に切り替わったのはいいんだが、どうもディスクの同期が取れていないっぽい…。
「まさか、待機系のmysqlはdrbdでミラー化されたディスクじゃなくてローカルディスクを見ている?」
と思ったが、そんなことはない。ちゃんとdrbdを見ている。
では、なぜ?とdrbdのステータスを見たところ

# service drbd status
drbd driver loaded OK; device status:
version: 0.7.25 (api:79/proto:74)
GIT-hash: 3a9c7c136a9af8df921b3628129dafbe212ace9f build by root@linux01, 2009-11-05 10:46:57
 0: cs:WFConnection st:Primary/Unknown ld:Consistent
    ns:0 nr:0 dw:31412 dr:108445 al:308 bm:435 lo:0 pe:0 ua:0 ap:0

ん、St: Primary/Unknown?
確か、Primary/Secondaryだったはず。
調べてみると、Secondaryとなるべき相手が見つからない状態になっている。

通信に使うNICも動いているけど、なんでだろう?

こちらを参考にして以下をやってみた。


ひとまず今マウントされているPrimaryの方を外付けディスクにバックアップ

# dd if=/dev/drbd0 of=/dev/sdb bs=16384

バックアップされたのを確認後、Secondary側で今のデータを捨て、リソースに繋ぐようにコマンド実行

# drbdadm -- --discard-my-data connect r0
※すぐ終わる

そして、Primary側でリソースに繋ぐ(PrimaryのデータをSecondaryも持つはず)

# drbdadm connect r0
※データ量にもよると思うが、数秒で終わった

もう一度、ステータスを確認してみる。

# service drbd status
drbd driver loaded OK; device status:
version: 0.7.25 (api:79/proto:74)
GIT-hash: 3a9c7c136a9af8df921b3628129dafbe212ace9f build by root@linux01, 2009-11-05 10:46:57
 0: cs:SyncSource st:Primary/Secondary ld:Consistent
    ns:216312 nr:0 dw:144992 dr:410449025 al:490 bm:1064 lo:0 pe:299 ua:0 ap:0
        [====>...............] sync'ed: 24.5% (687712/902828)K
        finish: 0:00:19 speed: 35,852 (35,852) K/sec
よかった。