<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>softelメモ</title>
	<atom:link href="http://www.softel.co.jp/blogs/tech/feed" rel="self" type="application/rss+xml" />
	<link>http://www.softel.co.jp/blogs/tech</link>
	<description>システム開発 ソフテルの技術関連ブログ（php、Linux、Apache、MySQL、その他開発関連）</description>
	<lastBuildDate>Tue, 15 May 2012 01:15:30 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>【windows】デスクトップに年月日のフォルダを作るコマンド</title>
		<link>http://www.softel.co.jp/blogs/tech/archives/3171</link>
		<comments>http://www.softel.co.jp/blogs/tech/archives/3171#comments</comments>
		<pubDate>Tue, 15 May 2012 01:15:30 +0000</pubDate>
		<dc:creator>yoshimura</dc:creator>
				<category><![CDATA[windows]]></category>

		<guid isPermaLink="false">http://www.softel.co.jp/blogs/tech/?p=3171</guid>
		<description><![CDATA[問題 私は年月日（yyyymmdd）の名前のフォルダを作ることが多いんだけど、クリックするだけで「年月日」のフォルダが作れるといいなあ。oＯ○ 答え yoshimuraさんのデスクトップに年月日のフォルダを作るコマンドはこんな感じ。 mkdir C:\Users\yoshimura\Desktop\%date:~-10,4%%date:~-5,2%%date:~-2,2% 環境変数 %date% の部分文字列を使っている。 ※言語設定やOSのバージョンによって、多少違うことがあります 上記のコマンドだけを書いたバッチファイル（*.bat）を作っておけば、ダブルクリックするだけでデスクトップにフォルダが作られる。 クイック起動などに入れておくと、クリックするだけで起動する。]]></description>
			<content:encoded><![CDATA[<h3>問題</h3>
<p>私は年月日（yyyymmdd）の名前のフォルダを作ることが多いんだけど、クリックするだけで「年月日」のフォルダが作れるといいなあ。oＯ○</p>
<h3>答え</h3>
<p>yoshimuraさんのデスクトップに年月日のフォルダを作るコマンドはこんな感じ。</p>
<pre class="bash">
mkdir C:\Users\yoshimura\Desktop\%date:~-10,4%%date:~-5,2%%date:~-2,2%
</pre>
<p>環境変数 %date% の部分文字列を使っている。</p>
<p><span style="color:#999999;">※言語設定やOSのバージョンによって、多少違うことがあります</span></p>
<p>上記のコマンドだけを書いたバッチファイル（*.bat）を作っておけば、ダブルクリックするだけでデスクトップにフォルダが作られる。</p>
<p><img src="http://www.softel.co.jp/blogs/tech/wordpress/wp-content/uploads/2012/05/yyyymmdd-mkdir.png" alt="" title="yyyymmdd-mkdir" width="109" height="98" class="alignnone size-full wp-image-3172" /></p>
<p>クイック起動などに入れておくと、クリックするだけで起動する。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.softel.co.jp/blogs/tech/archives/3171/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>【eclipse】自動的にビルドをしない（動きが遅いときなどに）</title>
		<link>http://www.softel.co.jp/blogs/tech/archives/3163</link>
		<comments>http://www.softel.co.jp/blogs/tech/archives/3163#comments</comments>
		<pubDate>Mon, 14 May 2012 00:49:23 +0000</pubDate>
		<dc:creator>yoshimura</dc:creator>
				<category><![CDATA[eclipse]]></category>

		<guid isPermaLink="false">http://www.softel.co.jp/blogs/tech/?p=3163</guid>
		<description><![CDATA[問題 これがなんだか遅くて重い感じなんですけど。。。 　　　　↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ 答え その機能、OFFにできます。 単純にエディタとして使っている人や、phpの人ならそんなに困らないかも。 自動的なビルドを停止すると、コード補完などが効かなくなったりするので、それでは困る場合は、時々手動でビルドする（ctrl+b など）。]]></description>
			<content:encoded><![CDATA[<h3>問題</h3>
<p>これがなんだか遅くて重い感じなんですけど。。。</p>
<p><img src="http://www.softel.co.jp/blogs/tech/wordpress/wp-content/uploads/2012/05/buikding-workspace.png" alt="ワークスペースをビルド中" title="buikding-workspace" width="609" height="104" class="alignnone size-full wp-image-3164" /><br />
　　　　↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑</p>
<h3>答え</h3>
<p>その機能、OFFにできます。</p>
<p>単純にエディタとして使っている人や、phpの人ならそんなに困らないかも。</p>
<p><img src="http://www.softel.co.jp/blogs/tech/wordpress/wp-content/uploads/2012/05/build-automatically.png" alt="自動的にビルドをしない" title="build-automatically" width="618" height="497" class="alignnone size-full wp-image-3165" /></p>
<p>自動的なビルドを停止すると、コード補完などが効かなくなったりするので、それでは困る場合は、時々手動でビルドする（ctrl+b など）。</p>
<p><img src="http://www.softel.co.jp/blogs/tech/wordpress/wp-content/uploads/2012/05/build-project.png" alt="" title="build-project" width="406" height="261" class="alignnone size-full wp-image-3166" /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.softel.co.jp/blogs/tech/archives/3163/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>サマータイムで不具合</title>
		<link>http://www.softel.co.jp/blogs/tech/archives/3161</link>
		<comments>http://www.softel.co.jp/blogs/tech/archives/3161#comments</comments>
		<pubDate>Sat, 12 May 2012 23:29:56 +0000</pubDate>
		<dc:creator>yoshimura</dc:creator>
				<category><![CDATA[develop]]></category>
		<category><![CDATA[linux]]></category>

		<guid isPermaLink="false">http://www.softel.co.jp/blogs/tech/?p=3161</guid>
		<description><![CDATA[Linuxのタイムゾーンの設定で、サマータイムがあるタイムゾーン適用されていることで、とある案件で、以下の様な事象がありました。 概要 あるシステムＳは、外部のシステムＡから、毎日レポートを取得して処理をおこなう。 Ａについて Ａでは毎日0時に前日分のレポートを生成する。 レポートが出来上がるまでに数分程度のラグがある。 レポートのリクエストは日付が必須。 リクエストを受けたら該当日のレポートを返す。 Ｓについて crontabで毎日午前1時に、前日を指定してリクエストを行ない、レポートを受け取って処理をおこなう。 問題発生 実装したのが年末ごろ。最近になってレポートが取得できなくなった。 取得できなかったリクエストを手動で実行してみると、何故か取得できる… なんでだろう？なんでだろう？ 原因 サマータイムの影響でシステムＳの午前1時にリクエストしたのがシステムＡでは午前0時にリクエストを受けた結果となり、Ａでレポートが出来上がっていない状態になってしまったらしい。 システムＳの利用者が米国なのでLinuxのタイムゾーンを変更していたのですが、それによってサマータイムの影響がCRONの実行時間にも影響してしまいました。 取得時間をずらして対応しました。 メモ 各国のサマータイム実施状況についておおざっぱにメモ。 国によってまちまち。 正確な切り替え日は、その年に決定する国もある。 国の中でも一律ではなかったりする。 アメリカだと2007年以前と以後で変わった。 ロシアやめた。 第○週の○曜日って何月何日？ 南半球では逆。 ややこしいからやめようよ…と言いたくなる。 アメリカ合衆国（一部除く。2007年から）、カナダ（一部除く）、メキシコ（一部除く） 3月第2日曜日午前2時～11月第1日曜日 午前2時（現地時間基準） 開始日には2時が3時になり（1時59分59秒の次が3時00分00秒） 終了日は2時が再度1時（1時59分59秒の次が1時00分00秒）になるため、開始日は1日が23時間、終了日は逆に25時間になる） アメリカの場合だとハワイ、サモア、グアム、プエルトリコ、米領ヴァージン諸島とアリゾナ州などの地区を含まない。 ヨーロッパ各国（一部除く） 3月最終日曜日午前1時～10月最終日曜日午前1時（UTC/GMT基準、2006年から） ロシア 3月最終日曜日午前2時～10月最終日曜日午前3時（現地時間基準） だったけど、2011年、夏時間を廃止。 オーストラリア（北部は実施なし、西部は2006年度から3年間試行中） 10月第一日曜日午前2時～翌年4月第一日曜日 午前3時（現地時間基準、2008年から） ニュージーランド（一部除く） 9月最終日曜日午前2時～翌年4月第1日曜日午前3時（現地時間基準） ブラジル（一部除く） 10月第3日曜日午前0時～翌年2月第3日曜日午前0時（現地時間基準）]]></description>
			<content:encoded><![CDATA[<p>Linuxのタイムゾーンの設定で、サマータイムがあるタイムゾーン適用されていることで、とある案件で、以下の様な事象がありました。</p>
<h4>概要</h4>
<p>あるシステムＳは、外部のシステムＡから、毎日レポートを取得して処理をおこなう。</p>
<h4>Ａについて</h4>
<p>Ａでは毎日0時に前日分のレポートを生成する。<br />
レポートが出来上がるまでに数分程度のラグがある。<br />
レポートのリクエストは日付が必須。<br />
リクエストを受けたら該当日のレポートを返す。</p>
<h4>Ｓについて</h4>
<p>crontabで毎日午前1時に、前日を指定してリクエストを行ない、レポートを受け取って処理をおこなう。</p>
<h4>問題発生</h4>
<p>実装したのが年末ごろ。最近になってレポートが取得できなくなった。</p>
<p>取得できなかったリクエストを手動で実行してみると、何故か取得できる…</p>
<p>なんでだろう？なんでだろう？</p>
<h4>原因</h4>
<p>サマータイムの影響でシステムＳの午前1時にリクエストしたのがシステムＡでは午前0時にリクエストを受けた結果となり、Ａでレポートが出来上がっていない状態になってしまったらしい。</p>
<p>システムＳの利用者が米国なのでLinuxのタイムゾーンを変更していたのですが、それによってサマータイムの影響がCRONの実行時間にも影響してしまいました。</p>
<p>取得時間をずらして対応しました。</p>
<h3>メモ</h3>
<p>各国のサマータイム実施状況についておおざっぱにメモ。</p>
<p>国によってまちまち。<br />
正確な切り替え日は、その年に決定する国もある。<br />
国の中でも一律ではなかったりする。<br />
アメリカだと2007年以前と以後で変わった。<br />
ロシアやめた。<br />
第○週の○曜日って何月何日？<br />
南半球では逆。</p>
<p>ややこしいからやめようよ…と言いたくなる。</p>
<h5>アメリカ合衆国（一部除く。2007年から）、カナダ（一部除く）、メキシコ（一部除く）</h5>
<p>3月第2日曜日午前2時～11月第1日曜日 午前2時（現地時間基準）<br />
開始日には2時が3時になり（1時59分59秒の次が3時00分00秒）<br />
終了日は2時が再度1時（1時59分59秒の次が1時00分00秒）になるため、開始日は1日が23時間、終了日は逆に25時間になる）<br />
アメリカの場合だとハワイ、サモア、グアム、プエルトリコ、米領ヴァージン諸島とアリゾナ州などの地区を含まない。</p>
<h5>ヨーロッパ各国（一部除く）</h5>
<p>3月最終日曜日午前1時～10月最終日曜日午前1時（UTC/GMT基準、2006年から）</p>
<h5>ロシア</h5>
<p>3月最終日曜日午前2時～10月最終日曜日午前3時（現地時間基準）<br />
だったけど、2011年、夏時間を廃止。</p>
<h5>オーストラリア（北部は実施なし、西部は2006年度から3年間試行中）</h5>
<p>10月第一日曜日午前2時～翌年4月第一日曜日 午前3時（現地時間基準、2008年から）</p>
<h5>ニュージーランド（一部除く）</h5>
<p>9月最終日曜日午前2時～翌年4月第1日曜日午前3時（現地時間基準）</p>
<h5>ブラジル（一部除く）</h5>
<p>10月第3日曜日午前0時～翌年2月第3日曜日午前0時（現地時間基準）</p>
]]></content:encoded>
			<wfw:commentRss>http://www.softel.co.jp/blogs/tech/archives/3161/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>【php】何種類ある？</title>
		<link>http://www.softel.co.jp/blogs/tech/archives/3159</link>
		<comments>http://www.softel.co.jp/blogs/tech/archives/3159#comments</comments>
		<pubDate>Fri, 11 May 2012 23:14:23 +0000</pubDate>
		<dc:creator>yoshimura</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[未分類]]></category>

		<guid isPermaLink="false">http://www.softel.co.jp/blogs/tech/?p=3159</guid>
		<description><![CDATA[問題 ある変数がtrueであればfalse、falseであればtrue（1であれば0、0であれば1）に変えるコードを考えてみたとき、何種類かけるでしょうか？ 解答例 Perlの格言のTMTOWTDIではないですが、同じ処理でもいろいろ書き方を知ってると、応用が出来る場面があったりするかもしれません。 1.分岐 if($flag){ $flag = false; }else{ $flag = true; } 2.三項演算子 $flag = $flag ? false : true; 3.否定演算子 $flag = !$flag; 4.絶対値 $flag = abs($flag - 1); 5.ビット演算子(xor) $flag = $flag ^ 1;]]></description>
			<content:encoded><![CDATA[<h3>問題</h3>
<p>ある変数がtrueであればfalse、falseであればtrue（1であれば0、0であれば1）に変えるコードを考えてみたとき、何種類かけるでしょうか？</p>
<h3>解答例</h3>
<p>Perlの格言のTMTOWTDIではないですが、同じ処理でもいろいろ書き方を知ってると、応用が出来る場面があったりするかもしれません。</p>
<h4>1.分岐</h4>
<pre class="bash">
if($flag){
    $flag = false;
}else{
    $flag = true;
}
</pre>
<h4>2.三項演算子</h4>
<pre class="bash">$flag = $flag ? false : true;</pre>
<h4>3.否定演算子</h4>
<pre class="bash">$flag = !$flag;</pre>
<h4>4.絶対値</h4>
<pre class="bash">$flag = abs($flag - 1);</pre>
<h4>5.ビット演算子(xor)</h4>
<pre class="bash">$flag = $flag ^ 1;</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.softel.co.jp/blogs/tech/archives/3159/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>【MySQL】GROUP_CONCAT()を使ってみる</title>
		<link>http://www.softel.co.jp/blogs/tech/archives/3154</link>
		<comments>http://www.softel.co.jp/blogs/tech/archives/3154#comments</comments>
		<pubDate>Thu, 10 May 2012 23:00:11 +0000</pubDate>
		<dc:creator>yoshimura</dc:creator>
				<category><![CDATA[mysql]]></category>

		<guid isPermaLink="false">http://www.softel.co.jp/blogs/tech/?p=3154</guid>
		<description><![CDATA[以下のようなテーブルがあるとします。 Ａテーブル Ｂテーブル 以下のようなSQLを流すと、 SELECT A.id, GROUP_CONCAT(B.bname) as namae FROM A, B WHERE A.id = B.aid GROUP BY A.id こんな風に、まとめてくれました。 そのほか、以下のようなこともできます。 昇順・降順に並べてくれる GROUP_CONCAT(B.bname order by B.id) 重複する名前をまとめてくれる GROUP_CONCAT(distinct(B.bname)) 区切り文字指定もできる GROUP_CONCAT(B.bname separator '/') 参考 http://dev.mysql.com/doc/refman/5.1/ja/group-by-functions.html NULLを含む場合や、特別長くなりそうな場合は要注意。 MySQLの独自の関数なので、他のデータベースを使う場合は要検討（Oracleだとwmsys.wm_concatがあるなど）。 この関数は、グループからの連結された非 NULL 値を伴うストリング結果を戻します。非 NULL 値がない場合は NULL を戻します。 group_concat_max_len システム環境変数は、許可された最大の長さに設定することができます。 ( デフォルト値は 1024 ) 。 最大の長さが設定された場合、結果はその最大の長さに切り詰められます。 GROUP_CONCAT() によって戻されるタイプは、group_concat_max_len が 512 [...]]]></description>
			<content:encoded><![CDATA[<p>以下のようなテーブルがあるとします。</p>
<p>Ａテーブル<br />
<img src="http://www.softel.co.jp/blogs/tech/wordpress/wp-content/uploads/2012/05/group_concat-1.png" alt="GROUP_CONCAT 1" title="group_concat-1" width="126" height="57" class="alignnone size-full wp-image-3155" /></p>
<p>Ｂテーブル<br />
<img src="http://www.softel.co.jp/blogs/tech/wordpress/wp-content/uploads/2012/05/group_concat-2.png" alt="GROUP_CONCAT 2" title="group_concat-2" width="196" height="145" class="alignnone size-full wp-image-3156" /></p>
<p>以下のようなSQLを流すと、</p>
<pre class="bash">
SELECT
    A.id,
    GROUP_CONCAT(B.bname) as namae
FROM
    A, B
WHERE
    A.id = B.aid
GROUP BY
    A.id
</pre>
<p>こんな風に、まとめてくれました。</p>
<p><img src="http://www.softel.co.jp/blogs/tech/wordpress/wp-content/uploads/2012/05/group_concat-3.png" alt="GROUP_CONCAT 3" title="group_concat-3" width="228" height="60" class="alignnone size-full wp-image-3157" /></p>
<p>そのほか、以下のようなこともできます。</p>
<h4>昇順・降順に並べてくれる</h4>
<pre class="bash">GROUP_CONCAT(B.bname order by B.id)</pre>
<h4>重複する名前をまとめてくれる</h4>
<pre class="bash">GROUP_CONCAT(distinct(B.bname))</pre>
<h4>区切り文字指定もできる</h4>
<pre class="bash">GROUP_CONCAT(B.bname separator '/')</pre>
<h3>参考</h3>
<p><a href="http://dev.mysql.com/doc/refman/5.1/ja/group-by-functions.html">http://dev.mysql.com/doc/refman/5.1/ja/group-by-functions.html</a></p>
<p>NULLを含む場合や、特別長くなりそうな場合は要注意。</p>
<p>MySQLの独自の関数なので、他のデータベースを使う場合は要検討（Oracleだとwmsys.wm_concatがあるなど）。</p>
<blockquote><p>この関数は、グループからの連結された非 NULL 値を伴うストリング結果を戻します。非 NULL 値がない場合は NULL を戻します。</p></blockquote>
<blockquote>
<p>group_concat_max_len システム環境変数は、許可された最大の長さに設定することができます。 ( デフォルト値は 1024 ) 。</p>
<p>最大の長さが設定された場合、結果はその最大の長さに切り詰められます。</p>
<p>GROUP_CONCAT() によって戻されるタイプは、group_concat_max_len が 512 より大きい場合意外は常に VARCHAR になります。512 を越える場合は BLOB になります。 </p>
</blockquote>
]]></content:encoded>
			<wfw:commentRss>http://www.softel.co.jp/blogs/tech/archives/3154/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>【php】phpでカレンダーを表示したかったらこうしたらいいんじゃないか　の例</title>
		<link>http://www.softel.co.jp/blogs/tech/archives/3151</link>
		<comments>http://www.softel.co.jp/blogs/tech/archives/3151#comments</comments>
		<pubDate>Wed, 09 May 2012 23:20:41 +0000</pubDate>
		<dc:creator>yoshimura</dc:creator>
				<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://www.softel.co.jp/blogs/tech/?p=3151</guid>
		<description><![CDATA[問題 phpでカレンダーの表示をしたいのですが、日付判定、週末判定、for文、while文の嵐で壮大なプログラムになってしまいます。 なにげに難しいです。。。　(p_q) 解答例 phpの場合、便利なライブラリがあれば… なんて考えない方が早いと思う。php自体が関数盛りだくさんのライブラリみたいなものなので、標準の関数だけでほとんどのことができてしまう。 では、phpで書くときはどうするか。 ゴールから考えてみる。 目標設定 カレンダーをtableで表示する場合、週の繰り返しと、週の中の日の繰り返しがある。 それなら、このようなプログラムにできれば、きれいかな。 //外側のtableタグ echo '&#60;table&#62;'; //見出し echo '&#60;tr&#62;&#60;th&#62;日&#60;/th&#62;&#60;th&#62;月&#60;/th&#62;&#60;th&#62;火&#60;/th&#62;&#60;th&#62;水&#60;/th&#62;&#60;th&#62;木&#60;/th&#62;&#60;th&#62;金&#60;/th&#62;&#60;th&#62;土&#60;/th&#62;&#60;/tr&#62;'; //週のループ foreach ($data as $week) { echo '&#60;tr&#62;'; //週の中の日のループ foreach ($week as $date) { echo '&#60;td&#62;' . $date . '&#60;/td&#62;'; } echo '&#60;/tr&#62;'; } echo '&#60;/table&#62;'; ↑ そうするには？ こんなデータがあればいいだろう。 //例）2012年5月の場合（空文字''はカレンダー表示したときの余白を表す） $data = array( array('', '', 1, 2, 3, [...]]]></description>
			<content:encoded><![CDATA[<h3>問題</h3>
<p>phpでカレンダーの表示をしたいのですが、日付判定、週末判定、for文、while文の嵐で壮大なプログラムになってしまいます。</p>
<p>なにげに難しいです。。。　(p_q)</p>
<h3>解答例</h3>
<p>phpの場合、便利なライブラリがあれば… なんて考えない方が早いと思う。php自体が関数盛りだくさんのライブラリみたいなものなので、標準の関数だけでほとんどのことができてしまう。</p>
<p>では、phpで書くときはどうするか。</p>
<p>ゴールから考えてみる。</p>
<h4>目標設定</h4>
<p>カレンダーをtableで表示する場合、週の繰り返しと、週の中の日の繰り返しがある。</p>
<p>それなら、このようなプログラムにできれば、きれいかな。</p>
<pre class="bash">
//外側のtableタグ
echo '&lt;table&gt;';
//見出し
echo '&lt;tr&gt;&lt;th&gt;日&lt;/th&gt;&lt;th&gt;月&lt;/th&gt;&lt;th&gt;火&lt;/th&gt;&lt;th&gt;水&lt;/th&gt;&lt;th&gt;木&lt;/th&gt;&lt;th&gt;金&lt;/th&gt;&lt;th&gt;土&lt;/th&gt;&lt;/tr&gt;';
//週のループ
foreach ($data as $week) {
    echo '&lt;tr&gt;';
    //週の中の日のループ
    foreach ($week as $date) {
        echo '&lt;td&gt;' . $date . '&lt;/td&gt;';
    }
    echo '&lt;/tr&gt;';
}
echo '&lt;/table&gt;';
</pre>
<h4>↑ そうするには？</h4>
<p>こんなデータがあればいいだろう。</p>
<pre class="bash">
//例）2012年5月の場合（空文字''はカレンダー表示したときの余白を表す）
$data = array(
    array('', '', 1, 2, 3, 4, 5),
    array(6, 7, 8, 9, 10, 11, 12),
    array(13, 14, 15, 16, 17, 18, 19),
    array(20, 21, 22, 23, 24, 25, 26),
    array(27, 28, 29, 30, 31, '', ''),
);
</pre>
<h4>↑ そうするには？</h4>
<p>こうすると作れる。日付の一覧と、その前後に適切な余白の分をつけた配列を、7で割る。</p>
<pre class="bash">
//例）2012年5月の場合
//日付の一覧を
$data = array('', '', 1, 2, 3, 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, '', '');
//1週間の日数の7で割る
$data = <span style="color:#cc0000;">array_chunk</span>($data, 7);
</pre>
<h4>↑ そうするには？</h4>
<p>日付の一覧があれば、前と後ろに余白をつけるのは難しくない。phpでは配列操作の関数が70個以上あるという充実っぷり。やりたいことができる関数が探せば見つかる。関数が見つからなくても、date(&#8216;w&#8217;)で曜日が数字で取得できるのだから、あとは力技でやったっていい。</p>
<pre class="bash">
//例）2012年5月の場合
//日付の一覧をがあるとして
$data = array(1, 2, 3, 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);
//2012-05-01の曜日を見て前に余白を追加
if (date('w', strtotime('2012/05/01')) > 0) {
    $data = <span style="color:#cc0000;">array_merge</span>(<span style="color:#cc0000;">array_fill</span>(0, date('w', strtotime('2012/05/01')), ''), $data);
}
//2012/05/31の曜日を見て後ろに余白を追加
if (date('w', strtotime('2012/05/31')) < 6) {
    $data = array_merge($data, array_fill(0, 6 - date('w', strtotime('2012/05/31')), ''));
}
</pre>
<h4>↑ そうするには？</h4>
<p>日付の一覧を作ろう。</p>
<p>ここまでやってみて、日付の一覧は array(1,2,3…) ではなくて、array(その月の1日のタイムスタンプ, その月の2日のタイムスタンプ, その月の3日のタイムスタンプ…) がよさそうだと考え直す。</p>
<p>ということで、指定した年月の日付のタイムスタンプの一覧を作るプログラムを作ってみる。</p>
<p>60*60*24 とは1日の秒数のことで、これを足せば1日ずつ進んでいく。</p>
<pre class="bash">
//例）2012年5月の場合
$ymd = '2012-05-01';
//開始日のタイムスタンプ
$s = strtotime($ymd);
//日付リストを作る
//月が同じ日の日付のタイムスタンプを配列にしまう
$data = array();
for ($t = $s; date('m', $t) == date('m', $s); $t += 60*60*24) {
    $data[] = $t;
}
</pre>
<h4>↓ということは？</h4>
<p>以上を組み合わせるとこうなる。</p>
<pre class="bash">
&lt;?php
//例）2012年5月の場合
$ymd = '2012-05-01';
//開始日のタイムスタンプ
$s = strtotime($ymd);
//日付リストを作る
$data = array();
for ($t = $s; date('m', $t) == date('m', $s); $t += 60*60*24) {
    $data[] = $t;
}
//先頭の日の曜日を見て前に余白を追加
if (date('w', $data[0]) &gt; 0) {
    $data = array_merge(array_fill(0, date('w', $data[0]), ''), $data);
}
//末尾の日の曜日を見て後ろに余白を追加
if (date('w', end($data)) &lt; 6) {
    $data = array_merge($data, array_fill(0, 6 - date('w', end($data)), ''));
}
//7で割る
$data = array_chunk($data, 7);

//以上でデータは出来上がった

//カレンダーを表示する
echo '&lt;table&gt;';
//見出し
echo '&lt;tr&gt;&lt;th&gt;日&lt;/th&gt;&lt;th&gt;月&lt;/th&gt;&lt;th&gt;火&lt;/th&gt;&lt;th&gt;水&lt;/th&gt;&lt;th&gt;木&lt;/th&gt;&lt;th&gt;金&lt;/th&gt;&lt;th&gt;土&lt;/th&gt;&lt;/tr&gt;';
//週のループ
foreach ($data as $week) {
    echo '&lt;tr&gt;';
    //週の中の日のループ
    foreach ($week as $date) {
        if ($date) {
            echo '&lt;td&gt;' . date('j', $date) . '&lt;/td&gt;';
        } else {
    	    echo '&lt;td&gt;&amp;#160;&lt;/td&gt;';
        }
    }
    echo '&lt;/tr&gt;';
}
echo '&lt;/table&gt;';
</pre>
<p>実行するとこうなる。</p>
<p><a href="http://www.softel.co.jp/blogs/tech/wordpress/wp-content/uploads/2012/05/php-calendar.png"><img src="http://www.softel.co.jp/blogs/tech/wordpress/wp-content/uploads/2012/05/php-calendar.png" alt="" title="php-calendar" width="182" height="158" class="alignnone size-full wp-image-3153" /></a></p>
<p>カレンダー表示ができた♪</p>
<h3>補足</h3>
<p>今回はタイムスタンプを使用した。</p>
<p>人の誕生日や遠い未来の日付を扱うカレンダーの場合は、タイムスタンプだと問題が発生するので、日付の計算のところを<a href="http://jp.php.net/manual/ja/book.calendar.php">カレンダー関数</a>などでおこなうのがよい。</p>
<p>あくまでもひとつの例なので、場合に応じてプログラムを書くとよい。</p>
<p>日曜日が先頭じゃなくて、土日は右にしたいと言われたら？など考えてみるとよい。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.softel.co.jp/blogs/tech/archives/3151/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>条件付きコメントでIE9以降とIE以外のブラウザだけに表示する</title>
		<link>http://www.softel.co.jp/blogs/tech/archives/3150</link>
		<comments>http://www.softel.co.jp/blogs/tech/archives/3150#comments</comments>
		<pubDate>Wed, 09 May 2012 07:09:17 +0000</pubDate>
		<dc:creator>yoshimura</dc:creator>
				<category><![CDATA[html5]]></category>

		<guid isPermaLink="false">http://www.softel.co.jp/blogs/tech/?p=3150</guid>
		<description><![CDATA[問題 古いIEでは表示できないcanvasを使っていたり、古いIEではJavascriptの処理が遅すぎたりするとき、「古いIEの場合だけ非表示にする」みたいなことできるかな。 答え こんな条件付きコメントを書くと、IE9以降とfirefox、Chrome、Opera etc. のみに表示することができる。 &#60;!--[if (gte IE 9)&#124;!(IE)]&#62;&#60;!--&#62; &#60;div&#62; ここはモダンなブラウザにしか見えないんですよー &#60;/div&#62; &#60;!--&#60;![endif]--&#62;]]></description>
			<content:encoded><![CDATA[<h3>問題</h3>
<p>古いIEでは表示できないcanvasを使っていたり、古いIEではJavascriptの処理が遅すぎたりするとき、「古いIEの場合だけ非表示にする」みたいなことできるかな。</p>
<h3>答え</h3>
<p>こんな条件付きコメントを書くと、IE9以降とfirefox、Chrome、Opera etc. のみに表示することができる。</p>
<pre class="bash">
&lt;!--[if (gte IE 9)|!(IE)]&gt;&lt;!--&gt;
	&lt;div&gt;
		ここはモダンなブラウザにしか見えないんですよー
	&lt;/div&gt;
&lt;!--&lt;![endif]--&gt;
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.softel.co.jp/blogs/tech/archives/3150/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>【apache】.svnを見えなくする</title>
		<link>http://www.softel.co.jp/blogs/tech/archives/3137</link>
		<comments>http://www.softel.co.jp/blogs/tech/archives/3137#comments</comments>
		<pubDate>Sat, 05 May 2012 15:00:01 +0000</pubDate>
		<dc:creator>yoshimura</dc:creator>
				<category><![CDATA[apache]]></category>

		<guid isPermaLink="false">http://www.softel.co.jp/blogs/tech/?p=3137</guid>
		<description><![CDATA[問題 Subversionのリポジトリからチェックアウトしたソースは.svnディレクトリをいたるところに含んでしまうが、httpでブラウザから見えないようにしたい。Apacheで。 解答例 &#60;DirectoryMatch "/\.svn/"&#62; Order deny,allow Deny from all &#60;/DirectoryMatch&#62;]]></description>
			<content:encoded><![CDATA[<h3>問題</h3>
<p>Subversionのリポジトリからチェックアウトしたソースは.svnディレクトリをいたるところに含んでしまうが、httpでブラウザから見えないようにしたい。Apacheで。</p>
<h3>解答例</h3>
<pre class="bash">
&lt;DirectoryMatch "/\.svn/"&gt;
    Order deny,allow
    Deny from all
&lt;/DirectoryMatch&gt;
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.softel.co.jp/blogs/tech/archives/3137/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>【MySQL】「今月と来月」を表現する</title>
		<link>http://www.softel.co.jp/blogs/tech/archives/3169</link>
		<comments>http://www.softel.co.jp/blogs/tech/archives/3169#comments</comments>
		<pubDate>Sat, 05 May 2012 00:28:46 +0000</pubDate>
		<dc:creator>yoshimura</dc:creator>
				<category><![CDATA[mysql]]></category>

		<guid isPermaLink="false">http://www.softel.co.jp/blogs/tech/?p=3169</guid>
		<description><![CDATA[問題 ある日付型のカラムの値が「今月と来月」にマッチする行を取得したい。 解答例 SQLで書いた例。 SELECT * FROM T WHERE T.hoge_date &#62;= date_format(now(), '%Y-%m-01') and T.hoge_date &#60; adddate(date_format(now(), '%Y-%m-01'), interval 2 month) date_format(now(), &#8216;%Y-%m-01&#8242;) で今月の月初が取れるので、それ以上を条件に。 adddate(date_format(now(), &#8216;%Y-%m-01&#8242;), interval 2 month) でらい来月の月初が取れるので、それ未満を条件に。 注意 なお、phpなどが動いているWebサーバー側とMySQLなどが動いているデータベース側で時計がずれていると困ったことになる場合が想定されるので、無理して日付関数を使わないで、検索条件に使う日付はWebサーバー側で生成するのもよい方法だと思います。]]></description>
			<content:encoded><![CDATA[<h3>問題</h3>
<p>ある日付型のカラムの値が「今月と来月」にマッチする行を取得したい。</p>
<h3>解答例</h3>
<p>SQLで書いた例。</p>
<pre class="bash">
SELECT
    *
FROM
    T
WHERE
    T.hoge_date &gt;= date_format(now(), '%Y-%m-01')
    and T.hoge_date &lt; adddate(date_format(now(), '%Y-%m-01'), interval 2 month)
</pre>
<p>date_format(now(), &#8216;%Y-%m-01&#8242;) で今月の月初が取れるので、それ以上を条件に。</p>
<p>adddate(date_format(now(), &#8216;%Y-%m-01&#8242;), interval 2 month) でらい来月の月初が取れるので、それ未満を条件に。</p>
<h4>注意</h4>
<p>なお、phpなどが動いているWebサーバー側とMySQLなどが動いているデータベース側で時計がずれていると困ったことになる場合が想定されるので、無理して日付関数を使わないで、検索条件に使う日付はWebサーバー側で生成するのもよい方法だと思います。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.softel.co.jp/blogs/tech/archives/3169/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>【vim】指定した文字コードに変換して保存する</title>
		<link>http://www.softel.co.jp/blogs/tech/archives/3133</link>
		<comments>http://www.softel.co.jp/blogs/tech/archives/3133#comments</comments>
		<pubDate>Mon, 30 Apr 2012 01:18:52 +0000</pubDate>
		<dc:creator>yoshimura</dc:creator>
				<category><![CDATA[linux]]></category>

		<guid isPermaLink="false">http://www.softel.co.jp/blogs/tech/?p=3133</guid>
		<description><![CDATA[問題 viで指定した文字コードに変換して保存したい。 元がUTF-8のファイルを、Shift_JISにして保存するなど。 答え Shift_JIS（cp932）にするには以下のコマンドを実行する。 :set fileencoding=cp932 なお、この時点ではまだ保存していない。 :w することで、文字コードを変更して保存が完了する。 以下の省略形を使用してもよい。 :set fenc=euc-jp]]></description>
			<content:encoded><![CDATA[<h3>問題</h3>
<p>viで指定した文字コードに変換して保存したい。</p>
<p>元がUTF-8のファイルを、Shift_JISにして保存するなど。</p>
<h3>答え</h3>
<p>Shift_JIS（cp932）にするには以下のコマンドを実行する。</p>
<pre class="bash">:set fileencoding=cp932</pre>
<p>なお、この時点ではまだ保存していない。</p>
<p>:w することで、文字コードを変更して保存が完了する。</p>
<p>以下の省略形を使用してもよい。</p>
<pre class="bash">:set fenc=euc-jp</pre>
<p><img src="http://www.softel.co.jp/blogs/tech/wordpress/wp-content/uploads/2012/04/vi-fenc.png" alt="" title="vi-fenc" width="521" height="181" class="alignnone size-full wp-image-3135" /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.softel.co.jp/blogs/tech/archives/3133/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

