2011-11-29

【マンション管理士】試験の感想など

11月27日にマンション管理士の試験を受けてきました。
前回の試験では宮城野区の高校が会場だったのですが、今回は東北大学の川内キャンパスでした。バスに乗って行ってきました。

◆全体的な感想
昨年と比べ出題傾向が変わり、しかも難しくなったと感じました。
受験直前に「直前模試」的な問題集をやるのですが、掛かっても50分で解き終わるような問題が多いのです。
けれど、本試験では解き終わるのに1時間20分程度掛かってしまいました。
そこから見直しのために35分かかり、結局全て終わったのが試験終了5分前。大変でした。
4つの選択肢から正解肢を選ぶ形式の問題なのですが、2つまで絞り込んではどちらかで迷う、というパターンが多かった気がします。

◆解答速報での意見割れ
昨年の試験では解答速報に違いが見られず1つに収まったのですが、今回の試験では3問程度意見が割れています。
以下、問題文・選択肢と具体的に見ていきます。

・問3
--引用開始--
区分所有者又は管理者からの請求に関する次の記述のうち、区分所有法及び民法の規定によれば正しいものはどれか。ただし、別段の慣習は無いものとする。


1 区分所有者は、自己の専有部分を保存するために必要な範囲において、他の区分所有者の専有部分を請求することができるが、自己の専有部分を改良するためにはこのような請求をすることができない。
2 管理者は、共用部分ならびにマンションの敷地及び共用部分以外の付属施設の保存のために、必要な範囲において、区分所有者の専有部分の使用を請求することができる。
3 区分所有者は、マンションの敷地の境界線から50cm以上で1m未満の距離において、外壁に特定の専有部分を見通すことができる窓を設けようとする者に対して、その建築の中止を請求することができる。
4 他の土地の排水設備の閉塞によりマンションの敷地に損害が及び、又は及ぶ恐れがあっても、管理者は、他の土地の所有者に損害を除去させ又は必要な予防工事をさせることはできない。
--引用終了--
この問題で自分は「3」を正解として解答しました。各解答速報では「2/3/4」で割れています。おそらく正解が無い可能性が高いようですね。
自分では、今見ても正解が分かりませんw

・問29
--引用開始--
理事会の決議を経て通常総会に提出された議案について、理事長と監事が反対している場合において、理事長には受任者を理事長とした委任状が、監事には受任者を監事とした委任状が提出されているときの取り扱いに関する次の記述のうち、標準管理規約及び民法の規定によれば適切でないものはどれか。


1 理事長は、役員を辞任すれば、自分の1票を反対票として使うことができる。
2 監事は、自分の1票と委任状を反対票として使うことができる。
3 理事長は、自分の1票と委任状を賛成票として使わなければならない。
4 監事は、委任状を総会出席者の賛否の比率に応じて分けて使うことができる。
--引用終了--
この問題で自分は「4」を正解として回答しました。解答速報では「3/4」で割れているようです。
自分としては、そもそも委任状を、賛否の比率に応じて使い分ける、というのはおかしいんじゃないの?と思いましたね。

・問33
--引用開始--
住居・店舗併用のマンションにおける店舗の営業時間の制限と住宅一部共用部分であるエレベーターの更新を決議する総会の場に、理事会の要請により出席していたマンション管理士が、議長である理事長からの求めに応じて助言した次の記述のうち、マンション標準管理規約(複合用途型)の規定によれば、適切でないものはどれか。


1 区分所有者から専有部分を賃借して営業をしている賃借人が、事前の通知も無く総会に出席して店舗の営業時間の制限について、意見を述べようとしたので、「事前の通知が無い以上、意見を述べさせる必要はありません。もちろん決議に加わることもできません」と助言した。
2 数人の共有に属している店舗につき、あらかじめ届出があった議決権行使者以外の共有者が店舗の営業時間を制限する議案について議決権を行使したので、「共有者である以上、有効な議決権の行使として取り扱ってください」と助言した。
3 住戸の区分所有者から、住宅一部共用部分であるエレベーターの更新については、住戸部分の区分所有者のみで構成する団体の集会で決議すべきではないかと意見があったので、「当該エレベーターについては、規約の対象となる物件となっているので、当総会で決議することになります」と助言した。
4 総会の場において、ある区分所有者から、住宅一部共用部分であるエレベーターの利用細則が実態に合っていないとして、改正案を提示して同案を決議するよう求められたので「あらかじめ召集通知で通知していた事項ではないので、決議はしないでください」と助言した。
--引用終了--
この問題で自分は「2」を正解として回答しました。解答速報では「1/2」で割れているようです。
3と4の選択肢はどちらも「適切である」とすぐ分かります。1と2についてはホントに良く分かりません。判例でもあるんですかね?

このほかにも、自分がわからなかったのは「問12(民法・区分所有法)」「問17(不動産登記法)」などですね。

◆自分の解答
解答速報で自己採点したところ、30点~33点くらいの点数でした。
今回は「管理業務主任者試験合格」のため、5問免除が効きますので、大体35~38点くらいというところでしょうか。
受かっているといいのですが。

2011-11-07

【PHP】カレンダーの配列を作るプログラム

ブログ等に貼り付ける「カレンダーの配列」を簡単に作るクラスを作ってみた。
2次元の配列になってて、1次元目は「何週目」かをあらわす添え字で、2次元目は「曜日」の添え字。詳しくはコメントを読んでみてください。

可変引数の「$current_date」を指定するとその日付だったときに「c」へ「true」がセットされます。
これを利用すれば、「今日」や「どの日付のページを表示しているか」など応用が利くかな?とおもいます。

・使用方法
1)以下のプログラムを適当なファイルに保存
2)利用したいプログラム上でincludeやrequireを行い読み込む
3)$cal_array = Calendar::get_calendar( '2011-11-07' ); などど記載する。

・注意事項
引数の「$date」「$current_date」ともにチェックしてないので、必ずコメントにかかれたフォーマットで渡してください。
フォーマットを守らなかったときのテストはしていませんw

・販売中
プログラムはGumroadで販売中です。
※使い方はプログラムのコメントに書いてあります。

いわゆる、コントロールブレイク処理というやつなんですが、面倒くさくて嫌いっちゃ嫌いですねw

【マンション管理士】標準管理規約で規定されている「訴訟の追行」について

区分所有法に規定されている、管理組合の訴訟関係は「義務違反者」のみだけど、標準管理規約については3つある。

具体的には以下のとおり。

1)滞納している管理費等(管理費と修繕積立金や駐車場積立金など)がある区分所有者への訴訟
→これは「理事会の決議」で理事長が訴訟を追行できる。

2)規約や使用細則などに違反した区分所有者等(区分所有者&同居人や賃借人)への訴訟
→これも「理事会の決議」で理事長が訴訟を追行できる

3)区分所有法上の「義務違反者」に対する訴訟
→区分所有法上の「義務違反者」への訴訟は、法律どおり「集会の決議」による。理事会の決議ではないことに注意。

以上。

2011-09-09

【保育士試験】保育実習理論の移調問題について

保育実習理論にほぼ必ず出てくる移調の問題を解けるようにしておけば2問正解できる。これは大きいと思う。
なので、その解き方のメモを書いておきます。

---
※2012-07-22追記
最近このページへのアクセスが多いので、ちょっと追記しますね。

保育士試験の美術に関する知識は下の記事をご覧ください。
保育実習理論の画材・色の理論メモ http://tagajo.blogspot.jp/2012/06/blog-post.html

ちなみに、自分が使用した教材は以下の通りです。


   

※教材は最新版を使用してくださいね。
勉強の仕方は以下の記事をご覧くださいね。
丸暗記で乗り切る資格試験 http://tagajo.blogspot.jp/2012/05/blog-post_27.html
---


○前提知識
」のことを「」という。
」のことを「」という。
ドレミファソラシ」が「ハニホヘトイロ」と対応していることを覚える。
長2度上(下)」とは「全音上げる(下げる)こと」。
短2度上(下)」とは「半音上げる(下げる)こと」。

1)調号を暗記
調号とは、楽譜のト音記号の右にある「#」や「♭」のこと
これの個数で調を確認する。
実際の試験問題には長調の移調が出ると思うので、下の長調一覧で覚える。

2)長調一覧
過去問を見ても大体長調での移調を扱う問題ばかりなので以下の長調一覧を暗記する。

■長調一覧
#7ヶ→ハ(ド#)
#6ヶ→ヘ(ファ#)
#5ヶ→ロ(シ)
#4ヶ→ホ(ミ)
#3ヶ→イ(ラ)
#2ヶ→ニ(レ)
#1ヶ→ト(ソ)
なし→ハ(ド)←ハ長調は調号なし
♭1ヶ→ヘ(ファ)
♭2ヶ→ロ(シ♭)
♭3ヶ→ホ(ミ♭)
♭4ヶ→イ(ラ♭)
♭5ヶ→ニ(レ♭)
♭6ヶ→ト(ソ♭)
♭7ヶ→ハ(ド♭)
※()内は主音
※自分の覚え方としては、「ハヘロホイニトが2つ+最後のハ」、と覚えたw

3)移調してみる
例として「平成22年度の問4と5」を取り上げる。
問5は「問4の楽譜を長2度上(=全音あげる)に移調したものは、何調になるか」という問題で、問4は#が1つなので「ト長調」なのが分かる
ト長調の主音は、「ソ(つまりト)」でその長2度上は 「ラ(つまりイ)」。なのでラ=イだから「イ長調」に移調した、という解答になる。

また、問5を「問4の楽譜を短2度上に移調したものは、何調になるか」という問題にした場合、ト長調の主音「ソ(つまりト)」の短2度上(=半音あげる)は「ソ#(ト#)」か「ラ♭(イ♭)」ということになる。
前提知識から「」「」なので、上の 長調一覧には「嬰(#)ト長調」はないから「変(♭)イ長調」になる。

4)まとめ
以上で移調の問題の解き方解説は終了です。
手順としては、
1)「調号から調の主音を求める
2)「長2度 or 短2度を求める」
3)「上の長調一覧から該当のものを探す」
とやればいいです。


以上。

2011-09-05

【マンション管理士】相続と管理費の関係について

受験暦2年目にして始めて気づいたことをメモ。

1)相続
マンションの区分所有者が死亡したときに、「滞納管理費」があった場合のこと。
相続人が複数いたとして、その全員が「単純承認」した場合は滞納管理費の債務は「分割(分割債務という)」されて相続される。
なので、マンションの管理者や管理組合法人が「滞納管理費」を請求するときは、「相続人一人一人」へ「相続分ずつ」請求しなければならない。

2)相続後の管理費
マンションの区分所有者が死亡したとき、「相続人が複数」で相続した場合のこと。
相続した後に発生した「管理費債務(滞納管理費ではない)」は、共有と一緒で「不可分債務」となる。
「不可分債務」とは文字通り「分割できない」ということ。管理費は分割できず、請求や弁済は「連帯債務」の規定が準用される。
なので、マンションの管理者や管理組合法人が「相続人たちの共有している区分建物の管理費」を請求するときは「相続人全員または一人一人」に「同時または順次」、「全額または一部」を請求することができる。

以上。

2011-04-30

【津波】自分だったら、どう行動したか

大津波警報も33%が避難せず


http://mainichi.jp/select/weathernews/20110311/news/20110430k0000e040016000c.html


上のニュースをみて、自分ならどう行動したかを考えてみた。
まず自分の行動がどうだったかを言う前に、3月11日の地震直後の状態を前提条件にして箇条書きにしてみる。

自分の前提条件:
1)地震の途中に停電してテレビなどの情報が全て遮断された。
2)携帯電話は倒れたりした家具や本の下にあるので持ち出せなかった。
3)2軒隣の家ではガス管が破損したのかガス臭い。
4)遠くから何言ってるか分からないが、防災無線で市役所から何か放送しているのはわかった。
5)防災無線からかどうかも定かでないサイレンも遠くで鳴っている。
6)たまたま実家にいて、家族が買い物に出かけていて安否不明だった。
7)家の中はめちゃくちゃになっている。割れた瀬戸物やガラスが散乱して素足で歩けない。
その上実家の通帳や印鑑の場所はわからない。
8)車にはガソリンがあと数リットルしかない。
9)水道は出る(後から分かったけど、水道の受水槽にたまってた水が出てただけ。実は断水してる)
10)実家は海岸線から5キロ以内である。

さて、あなたならどうする?
自分の答えはしたにあります。











































自分は、水が出ることを確認したので、お風呂に水ためてた。10分くらい家で様子をみてた。
そのあと家族を探しに出た。徒歩ですぐに回れる範囲を回ってたけど見つからずじまいだった。家族が戻ってきたのは20分後くらい。この間ずっと震度4か3程度の余震に数分毎に見回れている。

おそらく、自分の家まで津波が来ていたら、道路上で流されるか家に取り残されてただろうと思う。

2011-04-14

震災の日から1週間くらい経った、ある日の記録

忘れないうちに書き留めておこうっと。

・朝の行動
朝はマジで「夜明けとともに起床」する。
このころは朝5時には起きて30分経ったら行動開始してた。

起床したら、まずは家族へ
1)食料は足りているか?飲料水は足りているか?
2)燃料(ガソリン、灯油)は売られる気配はあるか?
3)近所の人から他に何かめぼしい情報は入っているか?
を確認する。家族との情報共有は重要でうまく手分けすると効率的に物資が手に入る。

確認が済んだら手分けして
1)食料調達のために並ぶ
2)ガソリンや灯油調達のために並ぶ
のどちらかを選択して出かける。

・スーパーで食料調達編
ウチの近所のスーパーは9時に開くので5時半ころ並ぶと約20〜30人目に買い物ができた。
9時開店で30分くらい待つと入店できる。
近所のスーパーは一人20点までしか買えなかったので、買い物自体に時間はかからず、
朝10時には帰宅できた。
帰宅したらちょうど近所の集会所に給水車がくる時間なので、5リットルのペットボトル
を持参し給水を受けにいく。やっぱり並んでいるので2時間位待って給水してもらう。
ここでちょうどお昼になるので、昼食。

・ガソリンスタンドでガソリンを調達編
ガソリンスタンドの方は「携行缶もってこないと売らない」タイプだったので近所の人に
ガソリン携行缶を借りる交渉もしておかなければならない。
運良くウチの家族が借りる算段をつけてくれたので、その分自分が並ぶ役を買って出る。
自分の家族だけが携行缶を借りるわけではなく、10家族くらいで使いまわすので
・並ぶ役
・給油する役
・自動車を移動する役
というように手分けしておくことが重要だとわかった。
10家族分給油し終わるころにはお昼になっている。昼食。

午後は近所のお店の様子を見にいくか、近所のお年寄りの様子を見にいく。

・お店の様子を見にいく編
ウチの近所にはスーパーが3軒、ホームセンターが1軒、コンビニが2軒ほどある。
これをチャリンコで2時間かけて見回る。途中に市役所の前を通るのでついでにみておく。
開いてるお店があればすかさず並んで何かしらの物を買っておく。
帰ってくると4時か5時。もうそろそろ暗くなってくる時間。

・近所のお年寄りの様子を見にいく編
ウチの近所には一人暮らしのお年寄りが結構いて、水や食料がちゃんとあるかどうか心配
な方たちがいた。
なので、ウチの近くの2軒のおばあちゃんたちに飲料水を届けてあげたり、食料をわけてあ
げたりする。
このおばあちゃんたちは後に携帯電話で連絡をとってあげられて、親族の家へと一時避難した。

1週間経ってると電気は復旧していたので、夕方からテレビで情報収集。携帯も毎日充電。
夜の主な作業は、家の中で崩れてきそうな物を下ろしたり、家具を異動したりして過ごした。
次の日も朝が早いので9時か10時には寝ることにしてた。

こんな感じで水道が復旧する4月初めころまで過ごしていたよ。
3月最終週位にはだいぶ状況が落ち着いて、お店でも並ばなくてすむようになったりしてたん
だけどね。
ただ、4月7日の余震のあとはまたお店が被害を受けて、店内がこわれたりしてしまったみたい。
そのために、また並ぶ日々が始まったりしたけどねw

2011-04-13

【地震】備えリスト

mixiの日記に書いたものの転載ですが。
3月11日の地震では、このブログのタイトル通り宮城県多賀城にいました。
とりあえず、私と家族全員は皆無事です。
3月11日から1ヶ月間に及ぶライフラインの完全ではない生活で分かった必要な「備え」についてをつらつら書いてみます。


---
友達が「備えリスト」を作ってたので真似してみるw 

復旧が早かったのが電気なので今回に限っては「オール電化住宅」がほしかったかなw 
水と電気があれば普通の生活が営めることに驚愕したね。 
ただ、その分電気がなければ「ガスが復旧してもどうにもならない」ことに注意w 

○水関係 
・飲料水をいれるポリ容器 
・焼酎のでっかい(5リットルくらいの奴)ペットボトル 
・ビニール製のゴミ袋 

 これはガチ。 
 無いと給水車から水もらってこれない。ゴミ袋は水瓶の中敷きにして水を貯めておいたりした。 
・収納ボックス的な物 
 大量の水を汲んでおける。これにトイレ用水を近くの小川から毎日バケツで運んでた。 
 例としてウチにあるのと同じもの:http://www.amazon.co.jp/dp/B000VLF6S4/ 
・バケツ(2~4個はあると便利)ゴム手袋 
 トイレを流すための水を調達するのにバケツが便利。10リットルで1回分流せる。 
 水汲みにいって濡れたりするのを防ぐためゴム手が便利。 
・近所で飲料水が汲める場所の情報 
 給水車がくるのはウチの近所では1日1~2回のみ。しかも1回につき5リットルまでだった。 
 なので、足りない分は湧水などでまかなうしかない。その情報を日頃から収集する。 
・近所でトイレ用の水が汲める場所の情報 
 飲料水をトイレに使うのがもったいないわけです。そこで自分は近所にある小川から 
 毎朝トイレ用水を汲みにいってた。 

○照明関係 
・ランタン付き懐中電灯 
 電球だけでは1方向しか照らせないので、ランタン機能がついてると広い範囲を照らせて便利 
・ろうそく 
 ガスもれが無い場合はこれを使う。倒れないように必ず工夫すること 
 ウチの2軒隣で地震直後にガスもれしてしまったので、火のでる物を使用できなかったので辛かった。 
・単3乾電池で点くペンライト 
 夜トイレに行くにも明かりが全くないので、ポケットに入れたまま寝てた。 

○食関係 
・粉の紅茶やインスタントコーヒー 
 飲み物が水しかなくなることへの対処 
・ラップ 
 言わずと知れた食器に敷く。洗わなくてもすむように。 
・「深い」ホットプレート 
 深いと煮込み系の料理ができる。カレーうどん作りまくりw 
 例として:http://www.amazon.co.jp/dp/B002HL4BFK/ 
・カセットコンロ 
 ウチでは電気の復旧が早かったのでホットプレートで代用。ほとんど使わなかった。 
 でもあると安心ではある 
・反射式石油ストーブと灯油 
 ウチの暖房器具は全て反射式石油ストーブ。 
 ご飯を炊いたり焼き物やお湯を沸かすのに便利。微妙に照明にもなるw 
 18リットルの石油ポリタンク6本ほどの灯油備蓄を日常的にしてたから助かったw 

○防寒関係 
・反射式石油ストーブ 
 上と同様防寒にも優れもの。 
・ホットカーペットや電気毛布 
 ウチにコタツがなかったので、上にホットカーペットに布団などをかけて温まる。 
 皆で入ればコタツ風味。電気が戻ったあと石油の節約に役立ちまくり。 

○安全関係 
・靴下やサンダル 
 床に割れたガラスや瀬戸物が氾濫するので、素足は危険。 
 とりあえず掃除機が使えるようになるまで必要。 
・ながーいマジックテープ(ハサミで切って使う) 
 兄が東京で仕入れて持ってきてくれた。 
 本棚をグルッと巻いたり、観音開きの食器棚をロックするのに便利 
・電池式ワンセグテレビ 
 近所の人がもってて、見せてもらいにいったりしたw 情報収集に役立った。 

○その他 
・自転車 
 車は本当に必要な時しかのらないようにしてる。ガソリンがもったいないから。 
 そこで自転車。あるいは原付のカブがあれば非常に役立つかもしれない。 
・手回し携帯充電器 
 携帯の電池は重要。これが今欲しいw 
・毛糸の帽子 
 基本的にお風呂にはいれないので髪の毛がベタベタになる。恥ずかしい場合は帽子で隠そうw 
・アルコールが使用されたウェットティッシュ 
 手が洗えないので。 
・ポケットラジオ(単三乾電池のものがいい) 
 単一電池は懐中電灯に使いたいので、ラジオは小型でスピーカー付きのを選ぶといいかも 
・リュックサック 
 買い物や配給される食料をいれるのに必要。買い物にいってもお店はポリ袋をくれないんだよね。 
・携帯用小型の椅子 
 買い物やガソリンスタンドで並ぶときは便利。ウチの近所では平気で4~5時間並ばされたりしたし。 
・ガソリン携行缶(重要!) 
 震災直後のガソリンスタンドには、車で乗り入れられないことが多い。 
 しかも「携行缶もってこないと売らないよ」ということが多い。 

後は気づいたときに書きますね。

2011-03-03

【AmazonAWS】商品に付いたBrowseNodesのパース方法

AmazonAWSのItemLookupのResponseGroupにBrowseNodesを入れると、そのItemが属してるカテゴリを引っ張ってこれる。
でもこのXMLが結構複雑でなかなか手をつけられないでいたのだけど、思いのほか簡単な方法で何とかなったのでそのときのメモ。ちなみにそのときのサイトは「多賀城屋書店」というサイトで携帯サイトだった。

今回は例として「涼宮ハルヒの驚愕」を使って解説してみる。



AWSのBrowseNodesは下の例のような<BrowseNode></BrowseNode>が「複数」あることと、一番上にある階層のカテゴリがXML入れ子の一番深いところにあるのが特徴。
下の例だと「本→Featured Categories→文庫総合→ライトノベル→男性向け→角川スニーカー文庫」というならびになる。


--XML例はじめ--

<BrowseNode>
  <BrowseNodeId>2220015051</BrowseNodeId>
  <Name>角川スニーカー文庫</Name>
  <Ancestors>
    <BrowseNode>
      <BrowseNodeId>2189055051</BrowseNodeId>
      <Name>男性向け</Name>
      <Ancestors>
        <BrowseNode>
          <BrowseNodeId>2189052051</BrowseNodeId>
          <Name>ライトノベル</Name>
          <Ancestors>
            <BrowseNode>
              <BrowseNodeId>2189048051</BrowseNodeId>
              <Name>文庫総合</Name>
              <Ancestors>
                <BrowseNode>
                  <BrowseNodeId>202188011</BrowseNodeId>
                  <Name>Featured Categories</Name>
                  <Ancestors>
                    <BrowseNode>
                      <BrowseNodeId>465392</BrowseNodeId>
                      <Name>本</Name>
                    </BrowseNode>
                  </Ancestors>
                </BrowseNode>
              </Ancestors>
            </BrowseNode>
          </Ancestors>
        </BrowseNode>
      </Ancestors>
    </BrowseNode>
  </Ancestors>
</BrowseNode>

--XML例終わり--


タグの解説をすると、
・<BrowseNodeId>はカテゴリIDで数字のデータ
・<Name>はカテゴリ名
・<Ancestors>は、現在のカテゴリより「階層が上」のカテゴリ
という感じ。

実際にXMLをパースするときはおそらくDOMやらを使うんだろうけど、携帯サイトでそんなことやったら結構な負荷だし自分で実装するのもめんどくさい。
そこで、正規表現で切り出そうと考えた。

上のXMLをよく見ると、「</BrowseNode>」がはじめて出てくるのが「一番上の階層の閉じタグ」、ということに気づいた。
であれば、
「/<BrowseNode>(.*?)</BrowseNode>/」
というような正規表現パターンで「階層の上半分を取ってこれる(上の例の青い字の部分を取り出せる)。

ここからもう一度正規表現で<BrowseNodeId>と<Name>を切り出せばOK。
結構簡単なことだったんだなぁ、と思ったw


---注意----
BrowseNodeには「Children」という商品が属してるカテゴリよりも下位の階層のカテゴリも返してくれる。
今回はそこまで必要じゃなかったので割愛。

2011-02-11

【シェルスクリプト】Linuxサーバで自動的にFTPダウンロードする方法

Linuxサーバで自動的にFTPを実行するようなシェルスクリプト作ってみた。
簡単な定型処理だけならPerlとかよりシェルスクリプトのほうが手軽でいいよね。

今回のスクリプトの仕様は以下の通り。

◆仕様
・bashのシェルスクリプトで作成する
・何らかのログファイルを毎日ダウンロードする(今回はWebアクセスログ的なもの)
・ログファイル名には日付が入っており、実行する日の前日分のファイルをダウンロードする
・ログファイルをダウンロードしたら、リモートホストのファイルは削除する

というような感じにした。
各変数の説明は以下の通り。

◆変数の説明
・CURRENT_DIR
  実行時のディレクトリ。
・DEST_DIR
  ダウンロードしたファイルを保存するディレクトリ。必要ないなら指定しなくても良い。
・DATE_OF_YESTERDAY
  「YYYY-MM-DD」というフォーマットの「前日分日付」
・REMOTE_HOST
  接続するホスト名。IPアドレスも可能
・REMOTE_USER
  リモートホストのユーザ名
・REMOTE_PASS
  リモートホストのパスワード
・REMOTE_PATH
  リモートホストの対象ファイルが置いてあるディレクトリ。
・REMOTE_FILE_YESTERDAY
  リモートホストの「前日分」のログファイル名

◆使い方
以下のスクリプトをEUCエンコードと改行コード「LF」で保存し、パーミッションは「755」または「705」で保存して、クーロンに実行したい時間を指定して登録すればOK。

Gumroadで販売中(200円) → https://gumroad.com/l/ptKl

以上。

2011-01-20

【MySQL】バックアップ&レストアツール作ってみた。

ちょっと前からブログのネタにしてたMySQLだけど、結局MySQL附属の「mysqldump」とかではうまくいかなかったんだよね。
で、しょうがないからMySQLのバックアップとレストアツールを作ってみたよ。

まぁ、大規模なデータベースのバックアップはちょっとムリかもしれないけど、数百MBくらいのテーブルなら何とかなるかもしれない。

●仕様
・最大1つのデータベースのみバックアップ・レストアできる。
・必ずしも元のデータに復元できないことに注意すること!!
※複数のデータベースをバックアップしたいときは、このプログラムを複数の場所に入れればOK。

●バックアップの処理内容
全てのテーブル名を取得し、データを全件SELECTしてbase64でエンコードし保存するだけ。
テーブル1つに対しファイル2つが出来る。「CREATE文が入るファイル」と「データが入るファイル」となる。
たとえば「hoge」というテーブルがあるのであれば、「hoge_create.dat」と「hoge_data.dat」というファイルが出来る。
各レコードを各1行に収めるために改行文字を「¥r¥n」などに変換していることに注意。

●レストア処理の内容
ファイル名から「CREATE文」か「データ」かを区別しCREATE文から処理を始める。フラグを設定すれば「DROP TABLE IF EXISTS文」も入れられる。
データはbase64デコードしINSERT文を作って入れるだけ。データ項目に「'(シングルクォート)」が入ってる場合は二重化して回避。

●使い方
▲ダウンロードする
http://www.tagajo.tv/backuptool_ver01.zip
↑からツールをダウンロードして、展開する。このときディレクトリ構造をいじらないこと。


▲設定を環境に合わせる
「ダウンロードする」で展開したファイルの中に「config.php」というファイルがあるので、その中身を変更する。
具体的には以下の部分のみを変更すればOK。

---引用開始---
 // バックアップするデータベースの設定
 define( 'DATABASE_HOST',  'xxxxxxxxxxxxx' );
 define( 'DATABASE_USER',  'xxxxxxx' );
 define( 'DATABASE_PASS',  'xxxxxxx' );
 define( 'DATABASE_NAME',  'xxxxxxx' );

 // レストアするデータベースの設定
 define( 'RESTORE_HOST',   'xxxxxxxxxxxxx' );
 define( 'RESTORE_USER',   'xxxxxxx' );
 define( 'RESTORE_PASS',   'xxxxxxx' );
 define( 'RESTORE_NAME',   'xxxxxxx' );

 ~中略~

 // MySQLのクライアント文字コード(お使いのデータ本体の文字コードへ変更してください)
 // SET NAMES *** に使用されます。
 define( 'DATA_CHARACTER_CODE',  'sjis' );
---引用終了---

※注意
「DATABASE_XXXX」はバックアップするデータベースの設定
「RESTORE_XXXX」はレストアするデータベースの設定
なのを間違わないこと。

▲バックアップするサーバへアップロードする
設定を環境に合わせたら、バックアップ対象のデータベースがあるサーバへアップロードする。
アップロードする場所はどこでもOKだけど、Webで公開されているディレクトリはやめること。
セキュリティなんぞこのプログラムは考慮してないので。
アップロードするときも、ディレクトリ構造をいじらないこと。
アップロード先の「dat」ディレクトリには「700」等の書き込みできるパーミッションを設定しておくこと。

▲実行方法
PHPで記述されているのでPHPのインタプリタで実行する。
以下、PHPが「/usr/local/bin/」の下にあるとする。

・バックアップ実行コマンド
$/usr/local/bin/php -f /アップロードしたディレクトリ/backup.php

・レストア実行コマンド
$/usr/local/bin/php -f /アップロードしたディレクトリ/restore.php

以上。

2011-01-11

【MySQL】異なるサーバ間でのデータ移行方法について

Kagoyaのサーバで運営していたサイトを、さくらインターネットのレンタルサーバへ移動したときの作業メモです。
MySQLを使用してサイトを運営しているのですが、基本的にMySQL附属のダンプツールは文字化けなどの問題がたくさんあってあまり使えないですね。
さらにKagoyaサーバのmysqldumpは文字コードの指定を受け付けないようになってるみたいだし。

しょうがないので自分でダンプツールとレストアツールを作成し移行してみることにしました。

---
○サイトの仕様
・データベース数:1つ
・データベース容量:100MB程度
・レコード総数:26万件程度

○テーブルの移行方法
・テーブル自体の構造はphpMyAdminで構造だけ取り出し、移行する

○ダンプツールの仕様
・テーブル1つごとにダンプファイル1つで、テーブル名をファイル名とする
・ファイル内容は1行ごとに1レコード
・文字コードはデータに合わせる
・1行ごとに1レコードなので改行文字は「\r」や「\n」と表記し無理やり1行に収める

○レストアツールの仕様
・ダンプファイルから1行を読み出しINSERT文を作成しテーブルへINSERTする
・文字化けしないように、PHPの「mysql_escape_string関数」をかませる
・mysql_escape_stringを使用すると、ダンプツールで変換した「\n」が「\\n」と変換されてしまうので「\n」へ戻す
---

といった感じにしました。

---
○問題点と回避方法
・ダンプツールで大容量のテーブルをファイルに吐き出そうとするとメモリが足りない、とPHPに怒られる
→mysql_query関数を使用していたため、メモリに結果をバッファしようとして大量のメモリを使用していたことが分かり、メモリを極力使用しない「mysql_unbufferd_query関数」を使用することで回避。

・CSVでデータを吐き出すとデータ内のカンマなどで不整合がおきメンドイ
→「mysql_fetch_assoc関数」を使用し、「連想配列」で結果を返してもらうことにする。それを「serialize関数」で直列化して保存しておけば、読み出し側で「unserialize関数」で元に戻せる。
---

これでデータが全てダンプファイルに落とされたので、移動先のサーバへ持っていってレストアツールでレストアすれば作業完了。文字化けもしないはず。
あと、オマケとしてツールのソースコードを以下に掲載しておきますね。



○ダンプツールのソース
---
  function nl_2_char( &$item, $key )
  {
    $item = preg_replace( '/\r\n/i', '\r\n', $item );
    $item = preg_replace( '/\r/i', '\r', $item );
    $item = preg_replace( '/\n/i', '\n', $item );
  }
 
  define( 'DATABASE_HOST',    'ホスト名' );
  define( 'DATABASE_USER',    'ユーザ名' );
  define( 'DATABASE_PASS',    'パスワード' );
  define( 'DATABASE_NAME',    'データベース名' );
 
  $con = @mysql_connect( DATABASE_HOST, DATABASE_USER, DATABASE_PASS, false );
  mysql_select_db( DATABASE_NAME );
 
  $tables = array( テーブル名の配列 );
 
  foreach( $tables AS $tab    le ) {
    $file_name = dirname( __FILE__ ) . "/dat/" . $table . '.dat';
    @unlink( $file_name );
   
    $strSql  = "SELECT * FROM " . $table;
    $resource = mysql_unbuffered_query( $strSql, $con );
    if( !$resource ) {
      print( "ERROR!" );
      exit();
    }
    $table_data = array();
   
    print( $table . " START!\n " );
   
    while( $row = mysql_fetch_assoc( $resource ) ) {
      array_walk( $row, 'nl_2_char' );
      $buff = serialize( $row ) . "\n";
      file_put_contents( $file_name, $buff, FILE_APPEND );
    }
    unset( $resource );
   
    print( $table . " END!\n " );
  }
?>
---

○レストアツールのソース
---
  define( 'DATA_PATH',    dirname( __FILE__ ) . '/dat/' );
 
  define( 'DATABASE_HOST',    'ホスト名' );
  define( 'DATABASE_USER',    'ユーザ名' );
  define( 'DATABASE_PASS',    'パスワード' );
  define( 'DATABASE_NAME',    'データベース名' );

  // ファイルネーム取得
  $file_names = array();
  $d = dir( DATA_PATH );
  while ( false !== ($entry = $d->read()) ) {
    if( preg_match( '/[a-z0-9\_]+/', $entry ) ) {
      $file_names[] = $entry;
    }
  }
  $d->close();
 
  $con = @mysql_connect( DATABASE_HOST, DATABASE_USER, DATABASE_PASS, false );
  mysql_select_db( DATABASE_NAME );
  mysql_query( 'SET NAMES sjis' );    // データベースの文字コードにあわせて変更すること!
 
  foreach( $file_names AS $file_name ) {
    $table_name = basename( $file_name, '.dat' );
   
    // $rows = file( DATA_PATH . $file_name );
    $fp = fopen( DATA_PATH . $file_name, 'r' );
    if( !$fp ) {
      die( "DONT OPEN!\n" );
    }
   
    while( !feof( $fp ) ) {
      $row = fgets( $fp );
      if( trim( $row ) == "" ) {
        continue;
      }
      $fields = unserialize( trim( $row ) );
     
      $srcSql  = "INSERT INTO %s (%s) VALUES (%s)";
      $field_names = array();
      $field_values = array();
      foreach( $fields AS $field_name => $value ) {
        $field_names[]  = $field_name;
        $value = mysql_escape_string( $value );
        $value = str_replace( '\n', 'n', $value );
        $value = str_replace( '\r', 'r', $value );
        $field_values[]  = sprintf( ' %s ', $value );
      }
      $field_list = implode( ", ", $field_names );
      $value_list = sprintf( "'%s'", implode( "', '", $field_values ) );
      $strSql = sprintf( $srcSql, $table_name, $field_list, $value_list );
     
      $ret = @mysql_query( $strSql, $con );
      if( !$ret ) {
        print( $strSql . "\n" );
        print( mysql_error() );
        exit();
      }
    }
  }
?>
---

ZenBack

WebMoney ぷちカンパ