SyntaxHighlighter

2014年12月3日水曜日

LDAP pwdExpireWarningが効かないんだけど(解決)

こんにちは。

OpenLDAPを使ってRHELとCentOS上でlinuxユーザーアカウントを管理しようと奮闘しています。

Web上のいろいろな記事をみて、ログインなんかはできるようになったんだけど、pwdExpireWarning が効かない!

pwdMaxAge=15552000
pwdExpireWarning=15551900

とか設定して、ログインしてもなーんも表示されん。


未だわからず。だれかぽすけて。 

できた!

/etc/pam_ldap.conf の中の次の1行をコメントインするだけでOKでした。

pam_lookup_policy yes 
 
 
 
後日…
 
やっぱりできてない! いや、開発環境では上記の方法でできたんだけど、テスト環境で同じ設定してもできなかった。
 
ううううう(*`ω´*) 
 
 
更に後日… 
次の書込みを見つけた!(英語)
http://www.openldap.org/lists/openldap-technical/201303/msg00196.html 

なんか、policyを定義する順番をuserを定義する順番より先にすれば良いみたい。もしくは、1回パスワード変更すればOKみたい。

実際、パスワード変更して100秒くらい経ったあとログインしたら、

Your LDAP password will expire in 179 days.
Last login: Thu Jan  8 18:19:05 2015 from h1-bs-ps1.hogehoge.jp

みたいに表示されたよ!いぇい!

# pam_lookup_policy yesは必要なのかな…?必要なんだろうなきっと。うん。

ちなみにgdmのログイン時も残りの有効期限が表示されるようになった。パスワード入れてエンターしたあと、1~2秒の間だけだけど(´ー`)

2014年11月26日水曜日

「mv: failed to preserve ownership for `ファイルパス': 無効な引数です」にハマったよー

こんばんは。

nfsの話です。

CentOS6.5同士でnfsによるファイル共有を行ってたときは全然問題なかったのですが、CentOS6.3同士でnfsファイル共有し、rwでno_root_squashなディレクトリに mv かけたら、

mv: failed to preserve ownership for `ファイルパス': 無効な>引数です

みたいなエラーがでて何じゃこりゃ、と。

見たところmv自体はできているのですが ownershipがpreserveできてないってことで、もともとはroot:rootのものだったふぁいるがnobody:nobodyになってました。

ググり倒したところ… nfsのバージョンによってポリシーが異なるとかなんとか。

んー、香ばしい。

ということで、クライアントからマウントするときに次のようにしたら、クライアント側からもroot:rootで見えるようになりました。

mount -t nfs 192.168.10.10:/src/dir /mnt/pos -o vers=3

明示的にnfsのversion 3としてマウントする、と。

ふう。

2014年11月21日金曜日

CentOS6のタイムゾーン変更するよー

時刻見たら、あー9時間前だ… ってことでタイムゾーンがずれてるな、と。

UTC → JSTにするなら下記でOK。下記はコピーしてるけどSymbolic Linkでも良いね!

[Fri Nov 21 02:05:54]root@devcent:[~] $ date
Fri Nov 21 02:06:35 UTC 2014
[Fri Nov 21 02:06:35]root@devcent:[~] $ cp /etc/localtime /etc/localtime.org
[Fri Nov 21 02:07:07]root@devcent:[~] $ cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
cp: overwrite `/etc/localtime'? y
[Fri Nov 21 11:07:33]root@devcent:[~] $ date
Fri Nov 21 11:07:43 JST 2014

2014年10月27日月曜日

Linuxのbashスクリプト内で使ったsedの正規表現でハマったよ

こんにちは。

Linuxでbashスクリプトを作っております。

変数の文字列(ファイルパス)を加工するにあたり、置換にsedを使うわけですが、ちょっとハマりましたのでφ(..)メモメモ。


マッチした部分を指し示すカッコ()は\でエスケープせねばならぬ。

直前の文字1つ以上を示すプラス+は\でエスケープせねばならぬ。


特にカッコの方でハマった。

2014年9月25日木曜日

tarコマンドの末尾についてるハイフン

おはようございます。

他人が書いたbashスクリプトを見てたら、

tar -cf ${tarFile} -T -

っていうコマンド発行してるところがあって、浅学な私は「なんだこのゴミ…」って思ってしまったわけです。

でも実際動いてるコードだからなぁと思って調べてみると、「アーカイブするデータを標準入力から受け取る」っていうオプションだったのです。

なんでこんな仕様にしたんだろ… 理由があるのかも知れないけど。

2014年9月4日木曜日

DBD driver has not implemented the AutoCommit attribute at なんじゃこりゃー

こんばんは。

CentOS + mysql + perlの環境です。

3000000件以上のレコードをdeleteする処理がありまして、トランザクション使って削除しようとしてました。まだ開発段階のコードです。

トランザクション開始して、delete、delete、delete deleteと4回めのdelete処理(1回めは1件、2回めは30件くらい、3回めは3000件くらい、4回めは3000000件くらい)を行ったら4回めでエラーになった。

DBD driver has not implemented the AutoCommit attribute at ほげほげ

と表示されている。なんじゃこれ?とググるが有用な日本語記事は1件しかない。英語も引っかかるけど、なんかピンと来ない感じ。

同時刻の/var/lib/mysql/hostname.errのログを見ると、mysqlが落ちて、mysql_safeが再起動したみたいな。

140904 18:05:27 mysqld_safe Number of processes running now: 0
140904 18:05:27 mysqld_safe mysqld restarted
2014-09-04 18:05:30 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
2014-09-04 18:05:31 21675 [Note] Plugin 'FEDERATED' is disabled.
2014-09-04 18:05:31 21675 [Note] InnoDB: The InnoDB memory heap is disabled
2014-09-04 18:05:31 21675 [Note] InnoDB: Mutexes and rw_locks use InnoDB's own implementation
2014-09-04 18:05:31 21675 [Note] InnoDB: Compressed tables use zlib 1.2.3
2014-09-04 18:05:31 21675 [Note] InnoDB: Using Linux native AIO
2014-09-04 18:05:31 21675 [Note] InnoDB: Not using CPU crc32 instructions
2014-09-04 18:05:31 21675 [Note] InnoDB: Initializing buffer pool, size = 128.0M

2014-09-04 18:05:31 21675 [Note] InnoDB: Compressed tables use zlib 1.2.3
2014-09-04 18:05:31 21675 [Note] InnoDB: Using Linux native AIO
2014-09-04 18:05:31 21675 [Note] InnoDB: Not using CPU crc32 instructions
2014-09-04 18:05:31 21675 [Note] InnoDB: Initializing buffer pool, size = 128.0M
2014-09-04 18:05:31 21675 [Note] InnoDB: Completed initialization of buffer pool
2014-09-04 18:05:32 21675 [Note] InnoDB: Highest supported file format is Barracuda.
2014-09-04 18:05:35 21675 [Note] InnoDB: The log sequence numbers 23781084774 and 23781084774 in ibdata files do not match the log sequence number 24879295225 in the ib_logfiles!
2014-09-04 18:05:35 21675 [Note] InnoDB: Database was not shutdown normally!
2014-09-04 18:05:35 21675 [Note] InnoDB: Starting crash recovery.
2014-09-04 18:05:35 21675 [Note] InnoDB: Reading tablespace information from the .ibd files...
2014-09-04 18:05:38 21675 [Note] InnoDB: Restoring possible half-written data pages
2014-09-04 18:05:38 21675 [Note] InnoDB: from the doublewrite buffer...
InnoDB: 1 transaction(s) which must be rolled back or cleaned up
InnoDB: in total 3033 row operations to undo
InnoDB: Trx id counter is 3525120
2014-09-04 18:05:41 21675 [Note] InnoDB: 128 rollback segment(s) are active.
InnoDB: Starting in background the rollback of uncommitted transactions
2014-09-04 18:05:41 8e985b70  InnoDB: Rolling back trx with id 3524767, 3033 rows to undo

InnoDB: Progress in percents: 12014-09-04 18:05:41 21675 [Note] InnoDB: Waiting for purge to start
2014-09-04 18:05:41 21675 [Note] InnoDB: 5.6.14 started; log sequence number 24879295225
 22014-09-04 18:05:42 21675 [Note] Server hostname (bind-address): '*'; port: 3306
2014-09-04 18:05:42 21675 [Note] IPv6 is available.
2014-09-04 18:05:42 21675 [Note]   - '::' resolves to '::';
2014-09-04 18:05:42 21675 [Note] Server socket created on IP: '::'.
 32014-09-04 18:05:42 21675 [Note] Event Scheduler: Loaded 0 events
2014-09-04 18:05:43 21675 [Note] /usr/sbin/mysqld: ready for connections.
Version: '5.6.14'  socket: '/var/lib/mysql/mysql.sock'  port: 3306  MySQL Community Server (GPL)
 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 1002014-09-04 18:06:22 21675 [Note] InnoDB: Rollback of trx with id 3524767 completed
2014-09-04 18:06:22 8e985b70  InnoDB: Rollback of non-prepared transactions completed
2014-09-04 18:14:34 21675 [Warning] IP address '10.0.2.2' could not be resolved: Name or service not known
2014-09-04 18:17:18 21675 [Note] /usr/sbin/mysqld: Normal shutdown


んー、、、 まぁmysqldがリスタートされて、トランザクションはRollbackされたんね。うん。

その後、同じことをやってもエラーはおきず。順調にコミットされる。

mysqldが腐ってた、ということなんだろうけど、なんで腐ったんじゃか。今はわかりません。






2014年9月1日月曜日

Vagrantで already locked for a session が出てあせった

おはようございます。

vagrantのVMをまるごとバックアップしようと思って、vagrant haltしたら、いつも終了するはずの時間が経過しても終わらない…

よく見たら、

C:\VM\hoge>vagrant halt
[default] Attempting graceful shutdown of VM...

の後に、Force shutdown的なメッセージが出てるじゃないですか、やだなあ。

で、しびれを切らしてctrl-c。vagrant statusすると、stoppingって出てる。普通に終了すると、

Current machine states:
default                   poweroff (virtualbox)


って出るはずだから、中途半端で終わってることは間違いない。ひぃー。

おそるおそるvagrant upしてみると、、、赤い字がでたあああ∑(´Д`;)

Vagrant: Stderr: VBoxManage: error: The machine ‘hogehoge’ is already locked for a session (or being unlocked)


うわあああ、と思ってググる。ググり方が悪くて英語のサイトしか出てこないけど…、ん?OS再起動すれば良いみたいなことが書いてあった。OS再起動。

で、見事に起動しました。

ポートの設定当たりでゴミが残ってたんですかねえ(´ー`) ふぅ

2014年8月26日火曜日

mysqlで大きなファイルのリストアをしてる途中のカウントを見たい

こんにちは。

mysqldumpしたデータをリストアする時、

# mysql -u hoge -p table_name < table_data.sql

なんてやったりしますね。私もやりました。で、今20時間ぐらい処理中…∑(´Д`;)


いま、どこまでいってんの!? とか知りたいわけでググると。-v オプションをつけると進行状況がでる…? 今更付けられん∑(´Д`;)

ログインしてみよう・・・

# mysql -u hoge -p

プロンプトが来ません∑(´Д`; Ctrl+C


まず mysql にログインします。その時 -A オプションをつけます。

# mysql -u hoge -p -A

こうすればプロンプトが来ます。ここで select count(*) from …とやっても結果が戻ってきません。

mysql> show table status like 'テーブル名'

これで、いろいろなテーブルの情報が見れますが、行数も入ってます。

(´∀`)

2014年7月24日木曜日

mysqldumpでデータベース丸ごとダンプ。そしてリストア

すぐ忘れるのでメモ。


mysqldump -u root -p -x --all-databases > all_db.sql
mysqldump -u root -p -x --allow-keywords mysql > mysql_user.sql


mysql -u root -p < all_db.sql
mysql -u root -p mysql <
mysql_user.sql


ユーザー情報は、--allow-keywordsってのを付けないと取り出せてないってことか。

2014年7月17日木曜日

CDやDVDからyumを使ってインストールするよ(CentOS6.5でやった)

こんにちは。

インターネットにつながってるPCやらサーバーからなら、yumを使えばコマンド一発でインストールができたりして、すごく便利ですね。たくさんのサーバを面倒みている人は、ネット上のリポジトリを自分の環境にミラーして、そのミラーのリポジトリからアップデートかけたりするみたいですが。

しかし、インターネットはおろかLANにも繋がっていない状態で必要なモジュールをインストールしたいって時もありますよね。ネットからだとバージョンコントロールしにくいという問題もあります。

そこで、 CDやDVDのようなメディアからyumをする方法をメモしときます。

こちらの記事が非常に参考になりました。ありがとうございます。
http://dotnsf.blog.jp/archives/2807753.html

上記の記事ではローカルHDD上にリポジトリを作ってますが、これをCDやらDVDやらに置けば、OKというだけなのです(^^ゞ ちゃんちゃん。

 
 以下、メモ。

CentOS6の場合、インストールDVDをyumで使えるようにするには、次のようにします。

1) CentOS6インストールDVDを入れる。
2) # mkdir /media/CentOS
3) # mount /mnt/cdrom /media/CentOS
4) # yum --disablerepo=\* --enablerepo=c6-media instal モジュール名 モジュール名


今回はrpmforegeからnrpeのインストールに必要なモジュールをとってきた。
URL、、、
http://apt.sw.be/redhat/el6/en/x86_64/rpmforge/



yumのリポジトリを作成するためのモジュール。

# rpm -ivh deltarpm-3.5-0.5.2009093git.el6.x86_64.rpm
# rpm -ivh python-deltarpm-3.5-0.5.20090913git.el6.x86_64.rpm
# rpm -ivh createrepo-0.9.8-4.el6.noarch.rpm
リポジトリを作成するには
# mkdir Packages
して、Packagesの中にrpmをぶちこむ。Packagesと同じディレクトリにcdし、
# createrepo .
でオッケー。


メモepelのリポジトリ

http://dl.fedoraproject.org/pub/epel/6/x86_64/

2014年7月11日金曜日

CentOSでiptables、ip6tablesがnot runningなのに、GUI(system-config-firewall)上だと稼働状態に見える謎

service iptables off しても GUI(system-config-firewall)上では稼働しているように見える。どういうことじゃい!!!

ということで調べてみた。

     → GUI上でEnable/Disableを切り替えると、次の変更が行われる。
     ・Enableにする
          → /etc/sysconfig/system-config-firewallの中身でが --enabled になる
   → /etc/sysconfig/iptablesが作成される
   → /etc/sysconfig/ip6tablesが作成される
          → iptables が起動される
          → ip6tables が起動される
     ・Disabledにする
          → /etc/sysconfig/system-config-firewallの中身でが --disabled になる
   → /etc/sysconfig/iptablesが削除(rename?)される
   → /etc/sysconfig/ip6tablesが削除(rename?)される
          → iptables が終了する
          → ip6tables が終了する
なお、GUIでのEnable/Disable操作とchkconfig on/offは連動していない。。
・chkconfig offにしてからGUI上でEnableにし、OS再起動するとiptablesは起動しない。
・chkconfig onにしてからGUI上でDisableにし、OS再起動するとiptablesは起動する。

結論
・GUI上のEnabled/Disabled表示切り替えは、/etc/sysconfig/system-config-firewallを見て判断しており、実際のiptablesサービスの稼働状態を見ていない。
 
まぎらわしいぜ(T_T)

2014年7月9日水曜日

vagrantのプラグイン、saharaをいれるよー

こんにちは。

Virtual Machineの管理にvagrantは大活躍しており、もはやこれなしでは生きられない体になっております。

しかし、人間の欲望は底なしだ。

VM上で何か実験し、元に戻し、実験し、元に戻し… という作業をするのに、initし、upし、削除し、みたいなことも面倒に思えてくる。


そうしたところで sahara の記事を見つけたわけです。


Windows上でインストールしてみました。

> vagrant plugin install sahara

Installing the 'sahara' plugin. This can take a few minutes...
Installed the plugin 'sahara (0.0.17)'!


あら、あっさり(´∀`)

コマンドプロンプトで確認。

> cd vm-centos   # VMのディレクトリに移動
> vagrant up
> vagrant sandbox on
> vagrant ssh
$ mkdir hogehoge
$ ls hogehoge
hogehoge
$ exit
> vagrant sandbox rollback
> vagrant ssh
$ ls hogehoge
ls: cannot access hogehoge: No such file or directory

おおー。hogehogeディレクトリ消えてる(´∀`)

VMが動いたままだとすごく時間がかかるが、VMを停止した状態だとちょっと早くなるらしい。
(でも今のところ、起動したままでもそれほど遅くなかった。onもrollbackも30秒くらい?VMが大きくなったら遅くなるんでしょうね)





2014年7月8日火曜日

udev の rule で ENV{ID_SERIAL}なんかが効かないとき

すげえ悩んだ。

ATTRS{serial}=="ほにゃらら" だとマッチするのに、 ENV{ID_SERIAL}だとマッチしない。

致命的バグなんじゃないかと疑った。


結論から申し上げると、ルールファイルを読み込む順番が重要。

10-local.rulesとかいうファイルでENV{ID_SERIAL}をかいて、反映されなくて、うーんうーんうなっていたが、これを99-local.rulesにしたら有効になった。それだけのことだ。





udevadm info --query=all -n /dev/scd1

とかやると環境の値がバラバラと表示される。

udevadm info --atribute-walk --name=/dev/scd1

とかやると親のデバイス情報とかたどってATTRSホニャホニャ表示されるみたい。


2014年5月29日木曜日

MySQL eventのlast_executedはUTCなんだそうだ

こんばんは。

mysqlで

select * from mysql.event;

とやりますとイベントの情報が見れるわけですが、どうもlast_executedのタイムゾーンが違う、、、というか日本からみると-9:00になっているわけで。

Webをあさりましたら、どうやらマニュアルに「UTCで表示する仕様なりよ。でも動作はちゃんとしてるよ」的なことが書いてあるらしく杞憂でした。(読んでない(´ー`))

小一時間無駄にしたし、my.cnfに default-time-zone='+9:00' とか余計なもの書いちゃったよちくしょう。
 


2014年5月27日火曜日

CakePHPで$this->Model->saveに失敗したとき

こんにちは。

またもハマりました…

CakePHPで$this->Model->saveに失敗しだしたのです。前はちゃんと動いてたのに。

結論から言うと、「Modelの $validate の設定を見直しな!と。

もしくは、saveの第2引数にfalseを渡してみましょう。つまりvalidationすんなこのやろう!ってことです。まずはfalseにして、通ったら$validateの設定をみなおす、という順番が良さそうです。

ふいー

2014年5月22日木曜日

CakePHPで$this->Session->read('Auth.User.id') 値が取れない?

Authコンポーネントを使用している環境です。

開発環境1で動いていたコード、$hoge = $this->Session->read('Auth.User.id')が、何故か開発環境2だと$hogeがnullになってしまっていたようで、null禁止のDBカラムを更新できないという自体に。

 同じコード、同じDBにしたはずなのに… と思いながら Config/core.phpを開き、    Configure::write('debug', 0); → Configure::write('debug', 1);  にしたら、あっさり期待する動作に。


えええ、debugでしか動かないのおおお∑(´Д`;) とか思いながら0に戻しても、動く。ブラウザ起動しなおしたり別のブラウザしても動く。サーバ側で何かが変わったんだろうな…


ということで、穴があくほどコードを見ても間違っていないと思った時、別の環境では動くのに、こっちの環境では動かない、と思った時、CakePHPご使用の場合はconfigのdebugをいじってみるのもありかと思います。
 


2014年5月13日火曜日

Linuxであるフォルダ以下に存在するファイルのサイズ合計を求めるよ

あるフォルダ以下のサイズを求めるのに du を使っていたが、どうもduはブロックサイズに影響されるようで、環境によってまちまちになる、と。

Webをあさったらlsの結果からファイルサイズを求める方法があったので、それをアレンジして find の結果から集計するようにしてみた。

find . -type f -printf "%s %f\n" | awk '{i+=$1}END{print i}'


サイズ出すだけなら%fはいらないっすよ。

2014年4月2日水曜日

CakePHPでConfigure::write('debug', 0); にしたら真っ白になったよー

頭も真っ白ですね。

さておき、

開発環境から本番環境へ持って行く時、debugを0にしてサイトアクセスしたら何も表示されないでやんの。

ひぃぃぃ、と思ってググるググる。

幾つか引っかかるけど、どれもピンとこない感じでして…




あれこれやってるうちに、debug 0でも表示出来てたヾ(o゚ω゚o)ノ゙


ググって出てきた対処法でもどうしてもダメなとき、app/tmp のしたのcacheを消したり、debugを2にしてみたり、0にしてみたりしてみて!!



2014年3月29日土曜日

redmine の DMSFをいれるよー

勢い、ドキュメント管理をredmine使ってやるよ!って言ってしまった。

そして、いざ使ってみるとredmineでは階層構造で文書を管理できない…。正確には「カテゴリ-タイトル-文書」という程度にはできるが、もっと柔軟なディレクトリは作れない。

そこで検索して出てきたのが、redmine_dmsfでした。


  • ドラッグ&ドロップによるファイル登録
  • ディレクトリ構造

が使えます。ファイルは一度に複数登録可能。ただし、ディレクトリをドラッグ&ドロップしてもダメでした。だから階層構造を作るには、ディレクトリを作り、ファイル投入、ディレクトトリを作り、ファイル投入を繰り返さないとだめなのねん(´ー`)

インストールは ここ のところにある通り。migrationとかやるのでちょっと怖かったですが、やってみたらあっさりうまくいきました。#でも実施前はバックアップしときなよ!

試したredmineのバージョンなど。


今のところ日本語ファイル名のものを登録してもちゃんと動いてる…(^ω^) イイネ!


なにげに迷ったのがディレクトリの作り方。

答えは簡単。リスト右上の+ボタンでした。



これでなんとかなりそうだ .。゚+.(・∀・)゚+.゚

2014年3月26日水曜日

CakePHP2.4 で userごとのpasswordハッシュ値をつくるよ

結論からいうとできませんでした。ゴリゴリとCakePHPのソースを侵食すれば行けるのかもしれませんが…

CakePHP2.4からパスワードのハッシュのカスタマイズはPasswordHasherクラスを基底としたクラスを作り、登録することで出来ます。

でもこのPasswordHasherのhash()っていうメソッド、$passwordっていうパスワード文字列しか渡せない。ユーザーIDが渡せない。

hash($password, $additional)みたいな感じでハッシュ生成時に追加できる文字列指定できればいいのに…。


ストレッチングはパスワード文字列があればまぁ簡単にできるんだけどなあ。CakePHP作ってる方面ではユーザーIDを混ぜ込む文化がないのかな?

結局 AuthComponentの_findUser()に手を入れないとダメな感じであきらめモード。残念。

2014年3月19日水曜日

CakePHP で modified が更新されない

すっかりCakePHPにおまかせで、その機能を疑ってもいなかったんですが。

よくよく見てみると、パスワード変更してusersテーブル見てみたら、modifiedが更新されてないでやんの。('A`)

ググってみたりしたけどイマイチわからず。


で、行き着いたところが、「updateするmodelのmodifiedに値が入ってると、その値でアップデートする」ということだ。


  $this->loadModel('User');
  $userInfo = $this->User->findById($this->Session->read('Auth.User.id'));
なんてやっといて、
  $userInfo['User']['password'] = $newPassword1;
  if (!$this->User->save($userInfo, array(
        'validate' => true,
        'fieldList' => array('password')))) {
      $this->tx->rollback();
      return $this->passwordChangeError('パスワードの変更でエラーが起きました。');
  }
ってやると、findByした時の値が入ってるから、更新されない。だからsave前にnullを突っ込んでやる。
  $userInfo['User']['password'] = $newPassword1;
  $userInfo['User']['modified'] = null; // ######################### ここ #####################
  if (!$this->User->save($userInfo, array(
        'validate' => true,
        'fieldList' => array('password')))) {
      $this->tx->rollback();
      return $this->passwordChangeError('パスワードの変更でエラーが起きました。');
  }
これで更新されるようになったよ… なんかイマイチな気がする。 他に手があるんだろうか?

Twitter Bootstrap と CakePHP ライセンスはどうなっているか

Twitter Bootstrap は Apache License 2 のようです。

CakePHP は MITライセンス とのこと。

どちらも商用利用可能。緩めのライセンスです。ありがたいことです。

2014年3月17日月曜日

MySQLのevent scheduler(イベントスケジューラー)を使うよ

イベントスケジューラ自体の動作確認

まず、my.cnfで不活性にしてないか確認する。
あればコメントアウトしておく。

[mysqld]
# event_scheduler=DISABLED


端末でMySQLにログインする。
次のコマンドを叩く。

mysql> select @@global.event_scheduler;
+--------------------------+
| @@global.event_scheduler |
+--------------------------+
| OFF                      |
+--------------------------+
1 row in set (0.00 sec)


ONにする。
mysql> set global event_scheduler=ON;
Query OK, 0 rows affected (0.01 sec)

mysql> select @@global.event_scheduler;
+--------------------------+
| @@global.event_scheduler |
+--------------------------+
| ON                       |
+--------------------------+
1 row in set (0.00 sec)


my.cnfに書いておく。

[mysqld]
event_scheduler=ON


どんなイベントが登録されているか見る。(参考 - http://dev.mysql.com/doc/refman/5.1-olh/ja/show-events.html

mysql> SHOW EVENTS;


各イベントの中身はSHOW CREATEで見ることができる。

mysql> SHOW CREATE EVENT <your_event_name>;


追記: イベントのステータス(最後に実行されたのはいつ?とか)はmysql.eventの中身でわかる。

select * from mysql.event;

2014年2月22日土曜日

CakePHP2のSecurityコンポーネントつかいこなせず



http://www.akiyan.com/blog/archives/2010/12/security-component-cakephp-advent-calendar-2010.html こちらのページを参考にさせていただき、CakePHPのSecurityコンポーネントをCSRF対策に使おうと、ここ1,2日トライしましたが使いこなせませんでした。

textareaを使うとなぜかblackhole。

elementを使うとなぜかblackhole。

しまいにゃ input type='text'をformに追加したらblackhole。

(´ー`)


gitで4つ前のコミットに戻して、下記の記事を参考に実装することにしました。

http://d.hatena.ne.jp/alexam/20120429/1335682689

(´ー`)

2014年2月15日土曜日

MySQLのeventで定期的なSQL実行をするよ

定期的にDBのデータを削除したい、なんて要求は結構あるんじゃないかと思います。

crondとかでやっても良いのでしょうが、SQL仕事はMySQLに任せるほうが役割分担としてスッキリすると思います。

まずは、イベントスケジューラの機能をONにします。

# mysql -u root -pyourpassword
mysql> SET GLOBAL event_scheduler=ON;

で、イベントを追加。10分ごとにBEGIN 以下のSQL文を実行するようになります。ちなみに、このSQL文は現在時間よりmodifiedの時間が20分より過去である場合、そのレコードをdeleteします。

mysql> DELIMITER $$
mysql>CREATE EVENT IF NOT EXISTS `sweeper_event` ON SCHEDULE EVERY 10 MINUTE STARTS '2012-02-15 15:31:00' ON COMPLETION NOT PRESERVE ENABLE DO BEGIN DELETE FROM target_tbl WHERE modified < (now() - INTERVAL 20 MINUTE); END$$
mysql>DELIMITER ;


START '時間' の部分をとっぱらうと、作成時間がSTART時間になるようです。


MySQLのtime_zoneを設定するよ

MySQLで select * now(); したら、見事にUTCの時刻になってるわー。

MySQLのデフォルトでのタイムゾーンはシステムと合わせる設定になってるから確認してみます。

# date
Sat Feb 15 03:00:34 UTC 2014

あ、UTCだ。OSのlocaltime変えられる状況なら、次のようにします。
# mv /etc/localtime /etc/localtime.org
# ln -s /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
# date
Sat Feb 15 12:01:04 JST 2014
よし。

しかし、OSの設定が変えられない場合はMySQLの設定をいじります。
my.cnfを開き、[mysqld]内に次の1行を追加。





# service mysqld restart

これでOKです。


2014年2月14日金曜日

東北ずん子のインストールで失敗!?

気の迷いで、東北ずん子買いました。Voiceroid+です。佐藤聡美です、はい。

で、インストールしたわけです。マイPCはCドライブがちょっと残り少ないので、Dライブにインストールしたのです。インストーラでインストール場所選べるんですよ。

インストーラはあっさり終了します。

デスクトップに出てきた実行ショートカットを叩くと、、、「zunko\voiceフォルダがありません」的なエラーダイアログが出ます。ダイアログを閉じるとアプリは起動するんですが、再生ボタンがdisableで実質使えません。

で、

もしや、と思ってCドライブの方見たらありました。voiceフォルダが。

Dドライブの適切な位置にコピーして、事なきを得ました。

(ヽ´ω`)

CakePHP2のh()の第2引数doubleって何だ?

セキュアなWebアプリを作るべくまい進する昨今。こんにちは。

ってことで、徳丸先生の


を激読みしてます。

htmlspecialcharsの話ももちろんでてきます。

CakePHPはh()っていう便利なメソッドがあって、こいつにはお世話になるでしょう。

でこのh()ですが、ソース見ますと定義は次のようになってるわけです。


1番目は処理対象の文字列と。2番目$double。なんだこれ??3番めは"UTF-8"とか指定するわけですね。徳丸先生も著書の中でcharsetを指定することの重要さを書かれておりました。(私は知らずに第1引数しか使ってませんでしたが、結果的にはCakePHPのcoreの指定でUTF-8になってたので良かった!)

さて、第2引数の$double。これなんだ?ってことでグーグル先生に聞くもなかなかヒットせず…

ソースのコメントやら仕様のページやら見てはたと気づいた!


要するに、&gt;とかを更にエスケープするか、そのままにしとくかってことなのね。
試してないけど間違いない。


ところで、htmlspecialcharsよりhtmlentities のほうがセキュアかしら?よくわからんが後で考えよう。

CakePHPでログインしようとしているユーザー名をとるよ

ログイン画面の総当たり攻撃対策で、ログイン失敗時に遅延処理を入れる、と。

なんかPHP 5.5からはpassword_hash()という関数が用意されて、ソルトやらストレッチやらでより強固な運用ができるみたいだけど、今回オレが相手にしているのはPHP5.3.3だ。だからだめっぽい。

ログイン失敗したらサーバ側で3秒スリープでもいいかなーって気もするんだが、ログイン試行回数でだんだん遅くしてよ!みたいなことを言ってくるめんどくさい意識の高い人の要求を満たさなきゃならん場合もあるわけで。

仕方がないんで、DBに試行されたログイン名とそれに対応する試行回数を記憶させるっつーやり方を。

で、

ここまでCakePHPのテンプレート任せなログインをしてきたのだが、ちょっと手をいれる必要があるわけだ。

とりあえずUserControllerのloginメソッドに処理書くかーと思って改めて見直すとログイン使用としてるユーザー名をどうやってとったらいいのかわからん。

結論としては、




で取れる、と。ググってもパッとは出てこなかった。きっと超基本的なことなんだろうな。

お陰で$this->Auth->login()を少し追ってみるという経験ができたわけだ。


しかし、総当たり攻撃対策なんてフレームワークとかプラグインでもっと簡単にできるのかと思ってたけど、まだ発展の余地ありなんですかね。こんなのでDBテーブル増やしたり50行ぐらい増やすのやだなあなんて思ったり。

bashのlocal 気をつけること

bashで関数書くとき、変数スコープを小さくしたいから local って書きますよね。書きますよね?

この local ですが、、、 ビルトインコマンドだったとは…(´д`) これを知らずに6時間ぐらい無駄にしたよー(´д`)

こんな感じ。ファイル名は適当にaa.sh。
 
#!/bin/sh

function hoge() {
  rt=`mkdir /dev/null`
  echo [$?]
}

echo start

hoge

echo end
で、実行
  
$ ./aa.sh
start
mkdir: cannot create directory `/dev/null': File exists
[1]
end
$
これは想定どおり。$?に1が入りますね。

ここで、変数 rt を local 宣言(実はコマンド)します。

#!/bin/sh

function hoge() {
  local rt=`mkdir /dev/null`
  echo [$?]
}

echo start

hoge

echo end

で、実行。

0]
end
$
えええええー。 $? が 0、つまり正常終了じゃないですかああああ┐(´д`)┌

無知とは怖いものです。localコマンドの実行で$?が0になってるんですなあ・・・たぶん。


この混乱で、∀ガンダム10話観れるぶんの時間無駄にしたわ。死ぬわー

次のようにすれば目的は達せる、と。
 
local rt
 rt=`mkdir /dev/null`
  echo [$?]
}

echo start

hoge

echo end

その他、bashのlocalは、「localを実行した変数は、その関数内だけでなく、その関数が呼び出す関数でも有効」という妙なスコープになっているとのこと。

気をつけましょう(´ー`)

CakePHPのpaginateするときデータのオーダーを変更するよ


  コントローラークラスのデフォルトとして設定するときは下記。
class PostsController extends AppController {
        var $name = 'Posts';
        var $paginate = array('order' => 'Post.created DESC');

        function index() {
                $this->Post->recursive = 0;
                $this->set('posts', $this->paginate());
        }
}
でもメソッドの中で臨機応変指定したくなるでしょう・・・
class PostsController extends AppController {
        var $name = 'Posts';

        function index() {
          $this->pagenate=array('order'=>'Post.created DESC');
                $this->Post->recursive = 0;
                $this->set('posts', $this->paginate());
        }
}

vimでLANGがeucの時にutf8のテキストを読めるようにするよ


こちら のサイト様を参考にしました…

utf8環境のターミナル(minttyとか)で、eucのテキストを開いて、文字がばけばけだよーっていうとき。
:set fencs=euc-jp
:e! 
とすると、読めるように表示してくれるとのこと。

じゃ、euc環境のターミナルで、utf8のテキスト開いちゃったら?
:set fencs=utf-8
:e! 
でいけましたよ、と。

あと、Cygwin mintty からutf8とeucの混在環境にアクセスしなきゃならんときの方策として、こちらのサイトがとっても参考になりました!!

感謝感激!!




 

vagrantはコマンドプロンプトからの起動時とcygwinからの起動時でなんかちがう

普段はWindows7のPCを使ってます。

でもCUIではUnixっぽく使いたいのでCygwinを入れてます。terminalはmintty。minttyは現在のCygwinの標準端末のようですね。

フォントいじったりカラー変えたり.bashrcにalias書いたりしてコンピュータとの対話を少しでも楽しくしたりしてます。


本題。

開発環境はこのWindows7をホストとしてVirtualBoxのVMをvagrantで管理しているわけです。

で、最初はコマンドプロンプトでvagrant upとかしてたわけです。

でも、最近minttyの環境が美しく使いやすくなってきたので、terminalといえばminttyを起動するように癖がついてきたわけです。

以前コマンドプロンプト上で vagrant up してたのと同じものをこのminttyからvagrant upしてみたわけですが、どういうわけか初期状態のboxをロードし始めるのです。つまり、いままで加えてきた変更があたかも消えたようになってしまう。冷や汗たらたらです。

.vagrant/machines/default/virtualbox/id

このファイルの中にid文字列らしきものが書いてあるのですが、それがコマンドプロンプトとcygwin環境上で変わっちゃうみたいなんですよねー。

ちょっと厄介です。 



 

vagrantのVMを強制終了しちゃって肝を冷やしたよ

vagrantでVMを立てて、そのうえでredmineを動かしております。

で、ホストPCのOSパッチを当てたんで再起動したわけですが、vagrant haltするのを忘れてたのです。

さらに、ホストOSの終了時に強制的にプロセス殺しちゃったので、VMが変な状態になってしまった、と。

ホストPCはWin7 Proでした。

vagrant upしてもダメ。Virtual BoxのGUIで、原因をみると・・・

今回は 「C:\Users\<user-name>\VirtualBox VMs\mycent6432_default_1385967619\mycent6432_default_1385967619.vbox ファイルがないよ!!」というエラーでした。

C:\Users\<user-name>\VirtualBox VMs\mycent6432_default_1385967619 ディレクトリの中を除くと、mycent6432_default_1385967619.vbox-tempというファイル、それから同じ名前で.vbos-prevという
拡張子のファイルがありました。

日付時刻をみると、mycent6432_default_1385967619.vbox-tempがホストをたたき落とした時刻らへんだったので、名前から「-temp」を削除しました。

vagrant up


起動したよー(T_T) 良かったー。 中のredmineのチケットなど確認したらどうやら結構直前まで記録されている見たい。助かったあああ。



シャットダウン時は気をつけましょう。
 

BoostCake(bootstrap3)にしたら上手く動かないぞ

(※一番アクセスされてるページなのに画像が死んでた。画像削除しました。)

bootstrap3のデザインでCakePHP使うってことで、BoostCake環境を作りました。

Webアプリを作り始めたんだけど… 静的なHTMLとbootstrap3とjqueryではできていた次の2点が動かないよー。困った。


1) responsibleデザインのcollapseが効かない


静的に作ってた時はぺろっとメニューがドロップダウンしたんだけど、うんともすんとも言わなくなった。


2) モーダルダイアログが表示されない



静的な環境では出るんだが・・・


さて、原因追求して直すか別の画面仕様にするか。うーん続報をお待ちください。


結局 BoostCakeやらbootstrap.js と jquery.js のバージョンの相性のようでした。


bootstrap.min.300.js
jquery.js
bootstrap.min.css

これらのファイルをjsはapp/webroot/jsディレクトリに、cssはapp/webroot/cssディレクトリに配置し、下記のような順番で読み込んだらOKでした。
   
 <head>  
  <meta charset="utf-8">  
  <meta name="viewport" content="width=device-width, initial-scale=1.0">  
  <!-- jequery の次に bootstrap.min.300 をロード。順番まもること -->
  <?php echo $this->Html->css('bootstrap.min'); ?>
  <?php echo $this->Html->script('jquery'); ?>
  <?php echo $this->Html->script('bootstrap.min.300'); ?>

  <title>Proto01</title>
 </head>





<head>内に書くとうまくいくのですが、<body>の最後の方に書くとうまく動きませんでした。


Raspberry Pi のeditorをvimにするよ

crontab -e したらなんか見慣れないエディタ起動してややこしい。vi (vim)にしたい。

root@raspberrypi [~] # update-alternatives --config editor
alternative editor (/usr/bin/editor を提供) には 4 個の選択肢があります。

  選択肢    パス              優先度  状態
------------------------------------------------------------
* 0            /bin/nano            40        自動モード
  1            /bin/ed             -100       手動モード
  2            /bin/nano            40        手動モード
  3            /usr/bin/vim.basic   30        手動モード
  4            /usr/bin/vim.tiny    10        手動モード

現在の選択 [*] を保持するには Enter、さもなければ選択肢の番号のキーを押してください: 3
update-alternatives: /usr/bin/editor (editor) を提供するために 手動モード で /usr/bin/vim.basic を使います


これでOK 

Raspberry Piにpv(pipe viewer)をインストールするよ


 これだけでOKだったよー。
pi@raspberrypi ~ $ sudo apt-get install pv

 で、cifsマウントは/etc/fstabに次の行を書き足しまして、

//192.168.11.4/aaa /mnt/family       cifs    username=my-user,password=my-pass,ro        0       0

で、

pi@raspberrypi ~ $ sudo mount /mnt/aaa

これでOK。

さて、どうやってコピーするかな… え? rsync !?

Raspberry Piにboxをマウントするよ

うちはnasでご家庭のデジタルデータを保管しています。

一応なくすと損失になるデータもありますんで、バックアップを取りたいわけです。以前はそのnasの機能で別途USB-HDDをつければバックアップしてくれてたのですが、過日お亡くなりになりまして。

新しくUSB-HDDをつければ良いわけですが、安上がりでちょっと面白い方法を思いついたと。

Raspberry Piを中継してnasからboxにバックアップを取ろうというわけです。差分コピーの方法はよくわかってませんが、きっとLinuxならなんかあるでしょう。

ということでまずはboxをマウントしたいのですが、こちらの記事 を参考にやってみたいと思います。

pi@raspberrypi ~ $ sudo apt-get install davfs2
うまくいった。

 
pi@raspberrypi ~ $ sudo mkdir /mnt/boxnet
うまくいった。

下記実施。

$ sudo mkdir /mnt/boxnet
 
/etc/fstab に https://www.box.com/dav /mnt/boxnet davfs  rw,user,noauto 0 0 を書く
 
/etc/davfs2/secrets ファイルに https://www.box.com/dav  user@email.com  password を書く
 
/etc/davfs2/davfs2.conf の # use_locks 1 のコメントアウトをはずし use_locks 0 に書き換える
 
$ sudo mount /mnt/boxnet 
 

/sbin/mount.davfsMounting failed302 Found

んんんー??? で、できねっす(´ー`)

で、英語圏のページなども漁ってたら、どうも接続先のURLが変わったみたいですね。www.box.net→www.box.com→dav.box.comと変遷してきてるみたい。

https://dav.box.com/dav
でいけましたよ!! ちょくちょく変わられると厄介w


 

Raspberry Pi を日本語化するよ

 Raspberry Pi ですが、OSをSDに入れ、電源入れたらあっさり起動しました。簡単ね!
(先人の方のブログ記事に感謝です)

ブラウザでFireFoxでもいれるかー、と思ってググったら、どうやらFireFoxじゃなくてIceweaselという代替手段をとるらしく?

ところで、Ice = 氷 ですが weaselは何かしらと。これもググったら「いたち」なんですね。火狐に氷いたちだと。

でインストールは 

sudo apt-get install iceweasel

でチョチョイのチョイです。 でも英語だ・・・。いや、アプリのメニューとかは英語でも構わないんですが、Google先生が教えてくれる検索結果が英語圏なのは困るぞ、と。

で、日本語化というかロケールをJPにしたい。こちらにわかりやすい記事があります。 

デフォルトのロケールはJa_JP.UTF-8を選択。

うちはapt-getもsudoじゃないとダメだ… まぁいいか( ´_ゝ`)





 

自宅PCを外出先から起動するよ

世知辛いご時世ですので、会社のPCよりうちのPCのほうが高スペックなんてことありますよね?

だからうちのパソコンを外から使いたい時があります。でもずーっとつけっぱなしは電気代もかかるし嫌だなぁと。

そんな時はWak-On-Lanってものがあるらしいことを知って試しました。設定は概ね次の通り。当然のことながらハードやらBIOSやらOSやらが対応してないとダメです。。

  1. 起動させられるPCのOSの設定(うちはWin7 Pro)
  2. BIOSの設定
  3. インターネット接続のルーター設定
  4. 起動する側の準備(アプリ導入とか)
で、ここの記事  に詳しく載っています。ありがたや。

だいたいはリンクした記事の通りなんだけど、2つほどちょっとつまづいた。

ひとつめは、「ルーターのNAT設定でうちのLANのブロードキャストアドレスを指定できなかった」問題。これは、起動したいパソコンのIPアドレスをそのまま書けばOKでしたよ、と。まぁそんなもんか。

ふたつめ。「電源OFFからは起動するけど、スリープからは起動しない」問題。これは、ハイブリッドスリープってのをオフにしないといけない、とのことです。

[コントロールパネル]-[電源オプション]を開き、現在のプランについて「プラン設定の変更」を開きます。

a

[詳細な電源設定の変更]をクリック。
b

電源オプションで、[スリープ]ノードの[ハイブリッドスリープを許可する]から、設定オフ!
c

 これでいけました。


起動はiPhoneアプリの「RemoteBoot WOL」で確認。Portは9番にしてみました。

Linuxから起動する場合は、こちらの記事が参考になりました。

MACアドレスはコロン区切りで入力するのがセオリーなんですなー。

Raspberry Pi と ARDUINO UNO がやってきた

写真

なんか、センサーみたいなものを使って遊んでみたいなあと、ふと思い立ってAmazonでポチってしまった。

Raspberry Piが4500円くらいで、ARDUINO UNO が3000円くらい。 ARDUINO UNOは Rev3かな?

届いて実物をみたら思ったより二回り小さかった。そしてパッケージが可愛らしかった。

とりあえずRaspberry PiにOS入れるところから始めるわけだ。モニターつなぎ変えるのが面倒だなー。早くsshできるようにしたい。