おれのメモ帳_φ(-ω-`*)メモメモ

フリー Git クライアントの SourceTree が使いやすい

"A free Git client for Windows or Mac" な Windows版の SourceTree がリリースされていたので1週間ほど使ってみた。Mac 版は入れていたけど使ってなかった。

結果

これはめっちゃいい。オススメ。

コマンドライン大好きなので、gitもコマンドラインでしか使っていなかったけど、コミット前に差分をひと通り確認するのがちょっと面倒だった。git diff から WinMerge を起動して差分を確認するようにしていたけど、ひと通り確認しようとすると、開かれるファイルの順番がよく分からなかったり、あといくつファイルがあるのか分からなかったりして軽くストレスを感じてた。

GUIには頼りたくない的なこだわりはあったものの、SourceTree は差分が簡単キレイに確認できるし、ソースの一部だけ(Hunk)を add したり取り消したりも簡単。

これから参画する gitナニソレ な人にも入れてもらおう。

What’s coming next?

Windows

We received great feedback from the SourceTree for Windows private beta users (a huge thank you). We will continue to push frequent updates and features to SourceTree for Windows users. We plan to bring all the great features that are part of SourceTree for Mac to Windows as well. What can you expect in the near future:

  • Mercurial support
  • Git-flow support
  • Custom actions
  • JIRA integration
  • and heaps more
Introducing SourceTree for Windows – a free desktop client for Git | SourceTree Blog

Git-flow と JIRA連携に期待。

EC-CUBEの商品並び順の連番を振り直した

EC-CUBE で、商品並び替えがうまくいっていなかったので処理を修正した(2.12.2)。
原因は商品削除時と、商品をカテゴリから取り除いたときの処理で dtb_product_categories がきちんと更新されていないこと。

  • 商品削除時: 余分なレコードが上記テーブルに残ったままになる
  • 商品をカテゴリから取り除いたとき: 上記テーブルが歯抜け状態になる

そのため、商品並び替えをしようとして、上へ、下へ、○番目へ移動、としても、不要なレコードが残っていたり逆に抜けていたりして、狙ったところに移動してくれない。


処理を修正したはいいけど、既におかしくなっているテーブルもきれいにしないといけない。

試行錯誤した結果、以下で並び順を振り直せた。けどもし使う場合は自己責任で。

UPDATE dtb_product_categories
   SET rank = (SELECT COUNT(DISTINCT T.rank)
                 FROM (SELECT * FROM dtb_product_categories) AS T
                WHERE dtb_product_categories.category_id = T.category_id
                  AND dtb_product_categories.rank > T.rank ) + 1;

実は ADMIN_MODE にすると、商品並び替え画面に「内部順位再割り当て」のボタンが出てきて、似たようなことができるみたいだけど、使わなかった。理由は

  • ADMIN_MODE にするとフロント画面にデバッグ表示が出てきちゃうから本番環境で使えない
  • 選んでるカテゴリだけが対象なので、全カテゴリやるのは大変
  • ローカルで試してみたら MySQL では動かなかった(参考サイトのエラーが出た)

上記SQLと「内部順位再割り当て」のSQLは大体同じだけど、再割り当てSQLのOR句でなにしてるかよく分からなかった。上のSQLだとOR句を入れてないので、何かしら考慮漏れがある可能性がある。

あと、カテゴリ内商品数の集計もしなおさないといけないけど、適当に商品情報を更新しておけば再集計されるはず。


【2013/04/19追記】
やっぱり漏れがあった。上記SQLだと連番の隙間は埋めるけど、残ってるゴミレコードがそのままになっている。

なので、一旦以下のSQLで余計なレコードを削除してから、上記SQLで隙間を埋めるのがよい。

DELETE FROM dtb_product_categories
 WHERE product_id IN (
           SELECT cat.product_id
             FROM (SELECT * FROM dtb_product_categories) AS cat,
                  dtb_products AS prd
            WHERE cat.product_id = prd.product_id
              AND prd.del_flg = 1
           );

一応、上記2つのSQLを実行する前にはバックアップを取っておく。

$ mysqldump -u root -p データベース名 dtb_product_categories > dtb_product_categories.sql

問題があったら、以下で戻す。

$ mysql -u root -p データベース名 < dtb_product_categories.sql

Windows に wget を入れた

msysgit環境に突っ込んだだけで動いた。

Wget for Windows の Binaries と Dependencies の zip をダウンロードして、その中の bin, share/locale, etc の中身を git の同じ構成のフォルダにコピー。

[~]$ wget http://downloads.sourceforge.net/project/gnuwin32/sed/4.2.1/sed-4.2.1-setup.exe
SYSTEM_WGETRC = c:/progra~1/wget/etc/wgetrc
syswgetrc = C:\Users\username\Dropbox\Tools\Develop\Git/etc/wgetrc
--2013-04-09 10:36:59--  http://downloads.sourceforge.net/project/gnuwin32/sed/4.2.1/sed-4.2.1-setup.exe
downloads.sourceforge.net をDNSに問いあわせています... 216.34.181.59
downloads.sourceforge.net|216.34.181.59|:80 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 302 Found
場所: http://jaist.dl.sourceforge.net/project/gnuwin32/sed/4.2.1/sed-4.2.1-setup.exe [続く]
--2013-04-09 10:36:59--  http://jaist.dl.sourceforge.net/project/gnuwin32/sed/4.2.1/sed-4.2.1-setup.exe
jaist.dl.sourceforge.net をDNSに問いあわせています... 150.65.7.130
jaist.dl.sourceforge.net|150.65.7.130|:80 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 2038876 (1.9M) [application/x-msdownload]
`sed-4.2.1-setup.exe' に保存中

100%[==============================================================================>] 2,038,876   1.54M/s 時間 1.3s

2013-04-09 10:37:02 (1.54 MB/s) - `sed-4.2.1-setup.exe' へ保存完了 [2038876/2038876]

Windows用バイナリのせいか、環境変数が C:\ ではじまっていて wgetrc はうまく見えてないっぽい(msysgit環境だと、/c/ から始まるパスになってくれないとダメ)。

wgetrc なんて今まで設定したこともないのでとりあえず気にしない。

あと make を入れたい。

Gehirn で MongoDB でユーザ認証とか

前回、他のユーザの mongod に接続できちゃったのもあるし、ユーザ認証を入れることにする。以下、作業ログ垂れ流し。

ユーザを追加する(失敗)

接続して、

$ mongo localhost:42998
MongoDB shell version: 2.2.3
connecting to: localhost:42998/test

admin データベースにユーザを追加する

> use admin
switched to db admin
> db.addUser("USER", "PASSWORD")
{
"user" : "USER",
"readOnly" : false,
"pwd" : "13b909a63833a3a8020a73815ce031f7",
"_id" : ObjectId("51260c4176c2330fa4c5d994")
}
Thu Feb 21 21:00:01 Socket recv() errno:104 Connection reset by peer 127.0.0.1:42998
Thu Feb 21 21:00:01 SocketException: remote: 127.0.0.1:42998 error: 9001 socket exception [1] server [127.0.0.1:42998] 
Thu Feb 21 21:00:01 DBClientCursor::init call() failed
Thu Feb 21 21:00:01 query failed : admin.$cmd { getlasterror: 1.0, w: "majority", wtimeout: 30000.0 } to: localhost:42998
could not find getLastError object : {
"message" : "error doing query: failed",
"fileName" : "src/mongo/shell/collection.js",
"lineNumber" : 155,
"stack" : "find(\"admin.$cmd\",[object Object],undefined,-1,0,0,0)@:0\n([object Object])@src/mongo/shell/collection.js:155\n([object Object])@src/mongo/shell/db.js:49\n(\"majority\",30000)@src/mongo/shell/db.js:623\n(\"USER\",\"PASSWORD\")@src/mongo/shell/db.js:99\n@(shell):1\n",
"name" : "Error"
}
Thu Feb 21 21:00:01 trying reconnect to localhost:42998
Thu Feb 21 21:00:01 reconnect localhost:42998 failed couldn't connect to server localhost:42998
Thu Feb 21 21:00:01 Error: 9001 socket exception [6] server [localhost:42998]  src/mongo/shell/collection.js:155

できない!なぜ!てかエラーで mongod が落ちた!
そこはかとなく昨日の path 問題と同じ香りがする。

実環境で起動しなおし

仮想 root 環境で mongod を上げたせいかもしれないので、実環境で上げなおしてみる。

$ ~/root/usr/bin/mongod -f ~/root/etc/mongodb.conf
all output going to: /var/log/mongodb/mongodb.log
can't open [/var/log/mongodb/mongodb.log] for log file: errno:2 No such file or directory
Thu Feb 21 21:54:45 [initandlisten] MongoDB starting : pid=6519 port=42998 dbpath=/home/****/root/var/lib/mongodb 64-bit host=s11
Thu Feb 21 21:54:45 [initandlisten] db version v2.2.3, pdfile version 4.5
Thu Feb 21 21:54:45 [initandlisten] git version: f570771a5d8a3846eb7586eaffcf4c2f4a96bf08
Thu Feb 21 21:54:45 [initandlisten] build info: Linux ip-10-2-29-40 2.6.21.7-2.ec2.v1.2.fc8xen #1 SMP Fri Nov 20 17:48:28 EST 2009 x86_64 BOOST_LIB_VERSION=1_49
Thu Feb 21 21:54:45 [initandlisten] options: { config: "/home/****/root/etc/mongodb.conf", dbpath: "/home/****/root/var/lib/mongodb", logappend: "true", logpath: "/var/log/mongodb/mongodb.log", port: 42998 }
Thu Feb 21 21:54:46 [initandlisten] journal dir=/home/****/root/var/lib/mongodb/journal
Thu Feb 21 21:54:46 [initandlisten] recover begin
Thu Feb 21 21:54:46 [initandlisten] info no lsn file in journal/ directory
Thu Feb 21 21:54:46 [initandlisten] recover lsn: 0
Thu Feb 21 21:54:46 [initandlisten] recover /home/****/root/var/lib/mongodb/journal/j._0
Thu Feb 21 21:54:46 [initandlisten] recover cleaning up
Thu Feb 21 21:54:46 [initandlisten] removeJournalFiles
Thu Feb 21 21:54:46 [initandlisten] recover done
Thu Feb 21 21:54:46 [initandlisten] preallocateIsFaster=true 2.26
Thu Feb 21 21:54:47 [websvr] admin web console waiting for connections on port 44984
Thu Feb 21 21:54:47 [initandlisten] waiting for connections on port 42998

上がったけどログ出力先が仮想 path のままなので標準出力に出てきてしまってる。
そういえば昨日 dbpath しか変更してなかった。

ログ出力パスを変更

パスを変更して

$ vi ~/root/etc/mongodb.conf
#logpath=/var/log/mongodb/mongodb.log
logpath=/home/*my_gehirn_username*/root/var/log/mongodb/mongodb.log

もう一度起動する

$ ~/root/usr/bin/mongod -f ~/root/etc/mongodb.conf
all output going to: /home/****/root/var/log/mongodb/mongodb.log

&つけ忘れたので、Ctrl+Zしてバックグラウンドにする。

^Z
[1]  + 31993 suspended  ~/root/usr/bin/mongod -f ~/root/etc/mongodb.conf
$ bg
[1]  + 31993 continued  ~/root/usr/bin/mongod -f ~/root/etc/mongodb.conf

今度こそユーザを追加する

接続する。

$ mongo localhost:42998
MongoDB shell version: 2.2.3
connecting to: localhost:42998/test
>

もう一度ユーザを作成してみる。

> use admin
switched to db admin
> db.addUser("USER","PASSWORD")
{
        "user" : "USER",
        "readOnly" : false,
        "pwd" : "7926766159abc3621e45745bcbd9485f",
        "_id" : ObjectId("512626fa7e1e58618ddbf680")
}
> db.system.users.find()
{ "_id" : ObjectId("512626fa7e1e58618ddbf680"), "user" : "USER", "readOnly" : false, "pwd" : "7926766159abc3621e45745bcbd9485f" }
>

できた。

ユーザ認証を有効にする

最後に conf ファイルでユーザ認証設定を有効にして mongod を起動しなおす。

$ vi ~/root/etc/mongodb.conf
#noauth = true
auth = true

認証テスト

起動しなおしたら接続する。

$ mongo localhost:42998
MongoDB shell version: 2.2.3
connecting to: localhost:42998/test
> show dbs
Thu Feb 21 23:13:59 uncaught exception: listDatabases failed:{ "errmsg" : "need to login", "ok" : 0 }
> 

need to login てエラーが出てるので認証は有効になっているぽい。

認証してみる。

> db.auth("USER","PASSWORD")
1
> show collections
system.indexes
system.users
>

できた。

Windows 7 で XAMPP の Apache が起動しない

原因

「Web Deployment Agent Service」というサービスが port:80 を使っていたため。
Visual Studio をインストールしたときに一緒にインストールされ、自動起動されるようになっていたらしい。

一応だれかのために手順

  1. 「サービス」を起動する(以下いずれかの方法で。)
    • 「Win + R キー」→「services.msc」と入力
    • 「スタートメニュー」→「管理ツール」→「サービス」
    • 「スタートメニュー」→「コントロールパネル」→「管理ツール」→「サービス」
    • 「スタートメニュー」→「コントロールパネル」→「システムとセキュリティ」→「管理ツール」→「サービス」
  2. 「Web Deployment Agent Service」を停止する
    1. 上記サービスをダブルクリック
    2. サービスの状態を「停止」にする
    3. スタートアップの種類を「手動」or「無効」に設定