Debian WheezyのMySQL初期設定

Debian7(Vagrant上)にbundle install( gem 'mysql2', '0.3.11')でMySQLを入れた場合、

[vagrant@vagrantvlc: /vagrant/app]$ rails s
=> Booting Puma
=> Rails 4.0.1 application starting in development on http://0.0.0.0:3000
=> Run `rails server -h` for more startup options
=> Ctrl-C to shutdown server
Exiting
/home/vagrant/.rbenv/versions/2.0.0-p353/lib/ruby/gems/2.0.0/gems/mysql2-0.3.13/lib/mysql2/client.rb:58:in `connect': Access denied for user 'root'@'localhost' (using password: YES) (Mysql2::Error)

rails起動する際にMySQLAccess deniedエラーが出る。


どうやら

apt-get install mysql-server libmysqlclient-dev libmysql-ruby

MySQLを入れた際に設定したはずのrootパスワードがdatabase.ymlの設定と異なっている&初期設定値がわからない
というお粗末

debianは /etc/mysql/debian.cnf の設定もスーパーユーザになっているため、
そのため、まずmysqldをstop

$ sudo /etc/init.d/mysql stop
[FAIL] Stopping MySQL database server: mysqld failed!

おっとstopすらできない。しょうがないのでkill

sudo kill `sudo cat /run/mysqld/mysqld.pid`
    • skip-grant-tablesオプションつけて再起動
$ sudo /etc/init.d/mysql start --skip-grant-tables
[ ok ] Starting MySQL database server: mysqld ..
[info] Checking for tables which need an upgrade, are corrupt or were
not closed cleanly..

んん?
mysql_upgrade -pを実行

debian.cnfの設定でログイン

mysql -u debian-sys-maint -p
> SELECT Host,User,Password From mysql.user;
+------------+------------------+-------------------------------------------+
| Host       | User             | Password                                  |
+------------+------------------+-------------------------------------------+
| localhost  | root             | *81F5***** |
| vagrantvlc | root             | *81F5***** |
| 127.0.0.1  | root             | *81F5***** |
| ::1        | root             | *81F5***** |
| localhost  | debian-sys-maint | *A79***** |
+------------+------------------+-------------------------------------------+

一応、rootはあるようなので、

UPDATE mysql.user SET Password=PASSWORD('****') WHERE User='root';

※database.ymlに合わせる

通常モードで再起動

$ sudo /etc/init.d/mysql restart
[ ok ] Stopping MySQL database server: mysqld.
[ ok ] Starting MySQL database server: mysqld ..
[info] Checking for tables which need an upgrade, are corrupt or were
not closed cleanly..
[vagrant@vagrantvlc: /vagrant/app]$ mysql -u root -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 37
Server version: 5.5.33-0+wheezy1 (Debian)

Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> quit
Bye

でOK



 


 

Error installing eventmachine:エラー

Debian WheezyにてGemFile.lockを使ってbundle installした際に表題のエラー
eventmachineとはなんだろうか。。


ググったものの日本語での情報はほとんどなかったため、毎度StackOverflowのお世話に。


This issue is related with C++ on GCC and resolved by installing build-essential
GNU CコンパイラにあるC++に関する問題で、build-essentialで解決できるとのこと。

結果

sudo apt-get install build-essential

で無事bundle完了しました。




  


  


 

Homebrewインストールエラー -e:4: syntax error, unexpected '<'

"homebrew インストール"などでググって出てくるサイトの多くで

ruby -e "$(curl -fsSL https://raw.github.com/mxcl/homebrew/go)"

上記コマンドを叩く、と紹介されていますが、

正しくは

ruby -e "$(curl -fsSL https://raw.github.com/mxcl/homebrew/go/install)"

でないと、表題のエラーになります。
OS X 10.9 Marveriks現在)

追記

置き場所が変わったようです(2015/01現在)

Whoops, the Homebrew installer has moved! Please instead run:

ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

Also, please ask wherever you got this link from to update it to the above.
Thanks!

ということなので

ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

となりました。
 

Using where; Using index; Not exists

EXPLAINでExtraフィールドに表題のInfo『Using where; Using index; Not exists』が表示されていた場合
クエリチューニングの余地があります。

まいどお世話になります日本男児先生

  • Using where・・・頻繁に出力される追加情報である。WHERE句に検索条件が指定されており、なおかつインデックスを見ただけではWHERE句の条件を全て適用することが出来ない場合に表示される。
  • Using index・・・クエリがインデックスだけを用いて解決できることを示す。Covering Indexを利用している場合などに表示される。
  • Not exists・・・LEFT JOINにおいて、左側のテーブルからフェッチされた行にマッチする行が右側のテーブルに存在しない場合、右側のテーブルはNULLとなるが、右側のテーブルがNOT NULLとして定義されたフィールドでJOINされている場合にはマッチしない行を探せば良い・・・ということを示す。

SELECT st.* FROM staff st 
LEFT JOIN boss b ON st.id=b.staff_id
WHERE st.del_flg='NO' AND b.id IS NULL;

これは管理職でないスタッフを取得するクエリですが、LEFT JOINで右側のテーブルがNULLとして定義されたフィールドでJOINされていますね。

ここでSQLを速くするぞ先生の出番です。


サブクエリを引数に取る場合、IN述語よりもEXISTS述語を使う

 EXISTS の方が速いと期待できる理由は以下の二つです。
<中略>
 IN の引数にサブクエリを与える場合、DB はまずサブクエリから実行し、その結果を一時的なワーク・テーブル(インライン・ビュー)に格納し、その後、ビューを全件走査します。これは、多くの場合、非常にコストがかかります(特に大規模なビューをメモリ上に展開する場合は)。EXISTS ならば、上述のようにワーク・テーブルは作成されません。

 ただし、ソースコードの可読性という点において、IN は EXISTS に勝ります。要するに、IN で書いた方がぱっと見て意味が分かりやすいコードになります。そのため、IN を使っても十分短い応答時間が確保されているなら、その SQL を敢えて EXISTS で書き直す必要はありません。

今回はサブクエリではなく、JOINですが、同じくEXISTSのほうが早くなる

SELECT st.* FROM staff st 
LEFT JOIN boss b ON st.id=b.staff_id
WHERE st.del_flg='NO' AND b.id IS NULL;

↓↓↓

SELECT st.* FROM staff st 
WHERE st.del_flg='NO' AND NOT EXITS (SELECT * FROM boss WHERE staff_id=st.id);


下のほうが早く、可読性はどっこいどっこいと言えるので、総合で軍配は下のクエリとなる。



 

Notice: Memcache::getversion(): Server localhost (tcp 11211) failed with: Failed reading line from stream (0) in /home/hoge/bin/setMemcache.php on line 16

(Sorry this article is written in Japanese, If you need English explanation)*1

Memcacheを導入し、早速使おうとしたときに表題のエラーが。

スクリプト


実行すると

PHP Notice:  Memcache::getversion(): Server localhost (tcp 11211) failed with: Failed reading line from stream (0) in /home/hoge/bin/setMemcache.php on line 16
failed to memcache_set

となる。

これは起動時のオプションが原因で、localhostの指定が通らなくなっている。(127.0.0.1でも同じ)
現状、memcachedの仕様だろうとしか言えず。
(Memcache::connectだけ通るのも仕様でしょう)参考


というわけで

memcached -d -p 11211 -u memcached -m 1024 -c 1024 -P /var/run/memcached/memcached.pid -l 127.0.0.1 -B binary

 ↓ ↓ ↓

memcached -d -p 11211 -u memcached -m 1024 -c 1024 -P /var/run/memcached/memcached.pid

と起動オプションを変更し直すと、無事エラー解消
本件はググってもほぼ英文の情報しかなく、しかもnot sureな結論ばかりだった。

 

 

 

*1:Please comment in this article, then I'm going to write in English

土日祝の休日が途切れるまで翌日に繰り越すスクリプト

http://d.hatena.ne.jp/hi-hats/20130324/1364115800
にて、指定日が祝日かどうかを判定するスクリプトを作りました

function isJPNationalHoliday(){


これを利用して、指定日が土日祝日かどうかを判定するスクリプト


を作成し、さらにこれを利用して
次の営業日(休み明け日)を取得するよう拡張。



ex)
指定日が土曜日(2013/4/27)で3連休だったら火曜日(2013/4/30)の日付が返る。
GWの2013/5/3(Fri)を指定した場合、4連休後の5/7(Tue)が返る。


こんな感じです。
休みに入る前に、休み中のデータを全部取っときたいときなどに。
 

 

指定した日が祝日かどうかを判定する関数

Google Calendar API から日本の祝日データを取得
こちらに一定期間の祝日を全て取得するスクリプトを掲載していただいていました。感謝。

ただ個人的には、ずばりターゲットのその日一日が祝日かどうかだけを取りたかったので、若干カスタマイズさせていただきました。

ループで回すときなどは、GoogleCalendarのレスポンスタイムもポイントとなると思い、APIの取得時間をechoさせてます。
以上です。