<?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/"
		xmlns:xhtml="http://www.w3.org/1999/xhtml"
>

<channel>
	<title>Whimsical Kitteeeeen &#187; プログラミング</title>
	<atom:link href="http://www.witkitty.com/wordpress/category/computer/programing/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.witkitty.com/wordpress</link>
	<description>日々繰り返される失敗談と、その失敗を冷ややかな眼差しで見守る気まぐれ猫たちの近況・・・</description>
	<lastBuildDate>Thu, 02 Feb 2012 07:32:57 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://www.witkitty.com/wordpress/category/computer/programing/feed/" />
		<item>
		<title>可変構造データの扱い</title>
		<link>http://www.witkitty.com/wordpress/2011/05/20/for_access_random_structure_data/</link>
		<comments>http://www.witkitty.com/wordpress/2011/05/20/for_access_random_structure_data/#comments</comments>
		<pubDate>Fri, 20 May 2011 14:32:59 +0000</pubDate>
		<dc:creator>hiro</dc:creator>
				<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[openLDAP]]></category>
		<category><![CDATA[string]]></category>
		<category><![CDATA[vector]]></category>
		<category><![CDATA[構造体]]></category>

		<guid isPermaLink="false">http://www.witkitty.com/wordpress/?p=515</guid>
		<description><![CDATA[<a href="http://www.witkitty.com/wordpress/2011/05/20/for_access_random_structure_data/" title="可変構造データの扱い"></a>興味本位でWindowsでOpenLDAPのデータでも操作してみようかな～とプログラミングを開始してみた。基のソースはMicrosoft MSDNのライブラリからパクってきたのだが。（興味がある方はリンクにアクセスしてね &#8230;<p class="read-more"><a href="http://www.witkitty.com/wordpress/2011/05/20/for_access_random_structure_data/">Read more &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<a href="http://www.witkitty.com/wordpress/2011/05/20/for_access_random_structure_data/" title="可変構造データの扱い"></a><p style="padding-left: 30px; text-indent:1em;">
興味本位でWindowsでOpenLDAPのデータでも操作してみようかな～とプログラミングを開始してみた。基のソースはMicrosoft <a href="http://msdn.microsoft.com/en-us/library/aa367016%28v=VS.85%29.aspx" target="_blank">MSDNのライブラリ</a>からパクってきたのだが。（興味がある方はリンクにアクセスしてね）
</p>
<p></p>
<div style="padding-left: 30px;">
で、いきなりこのソースの注意点ですが、構造体：SEC_WINNT_AUTH_IDENTITYのPasswordは素のパスワードでは通用しないと思われ、HASH化した文字列が必要と思われます。パスワードのHASH化はslappasswdで得ることが可能ですので調べてくださいな。素のパスワードでアクセスしたい場合は、ldap_simple_bind_s()もしくはldap_simple_bind()を利用してくださいな。
</div>
<p></p>
<div style="padding-left: 30px;">
さて、順調にこのソースを咀嚼していき、何とか情報を引き出し表示させるまでに。そこで、表示されているデータをジッと見つめていると、アトリビュート（属性）数は可変だし、配下のデータ数も可変。<br />
さて、どうやってローカルに取り込もうか思いあぐねた結果、構造体＋std::vectorにすることに。理由は、vectorを利用することで可変データに対応するため。（無駄なメモリ使いたくないし、解放操作も面倒だしｗ）<br />
構造体は下記のような入れ子。（データ構造は本文最後の方で図を掲載してあります）
</div>
<p></p>
<div style="padding-left: 30px;">
<pre>
struct LDAP_ITEM
{
	string					attr;		// 属性名
	vector&lt;string&gt;		item;	// 属性配下のアイテム（vectorで可変に）
};

struct LDAP_DATA
{
	int						entrynum;	// エントリ番号
	vector&lt;LDAP_ITEM&gt;	data;		// エントリデータ内容（上記入れ子構造体をvectorで可変に）
};
</pre>
<p>で、次にどうやってこの構造体にデータをぶち込んでいるかは以下のソース。Microsoftのソースコードを基にしているので何を追加・変更しているかは大体察しが付くと思いますが、簡単にコメントも入れてみました。<br />
ソースが長いので、「ソースを表示」で伸張してくださいな。
</p></div>
<p></p>
<div style="padding-left: 30px;">
<pre>
	//----------------------------------------------------------
	// Get the number of entries returned.
	//----------------------------------------------------------
	ULONG numberOfEntries;

	numberOfEntries = ldap_count_entries(pLdapConnection, pSearchResult);

	if(numberOfEntries == NULL)
	{
		printf("ldap_count_entries failed with 0x%0lx \n",errorCode);
		ldap_unbind_s(pLdapConnection);
		if(pSearchResult != NULL)
			ldap_msgfree(pSearchResult);
			return -1;
	}
	else
		printf("ldap_count_entries succeeded \n");

	printf("The number of entries is: %d \n", numberOfEntries);

	//----------------------------------------------------------
	// Loop through the search entries, get, and output the
	// requested list of attributes and values.
	//----------------------------------------------------------
	LDAPMessage* pEntry = NULL;
	PCHAR pEntryDN = NULL;
	ULONG iCnt = 0;
	char* sMsg;
	BerElement* pBer = NULL;
	PCHAR pAttribute = NULL;
	PCHAR* ppValue = NULL;
	ULONG iValue = 0;

	// コメント：入れ子構造体データの一時的な保管場所。
	// これをあとで下の元データの一時的な構造体にpush_back。
	LDAP_ITEM		tmp_item;
	// コメント：元データの一時的な保管場所。あとで実データにpash_back。
	LDAP_DATA		tmp_ldap;

	for( iCnt=0; iCnt &lt; numberOfEntries; iCnt++ )
	{
		// Get the first/next entry.
		if( !iCnt )
			pEntry = ldap_first_entry(pLdapConnection, pSearchResult);
		else
			pEntry = ldap_next_entry(pLdapConnection, pEntry);

		// Output a status message.
		sMsg = (!iCnt ? "ldap_first_entry" : "ldap_next_entry");
		if( pEntry == NULL )
		{
			printf("%s failed with 0x%0lx \n", sMsg, LdapGetLastError());
			ldap_unbind_s(pLdapConnection);
			ldap_msgfree(pSearchResult);
			return -1;
		}

		tmp_ldap.entrynum = iCnt;    // コメント：エントリ番号を保存。

		// Get the first attribute name.
		pAttribute = ldap_first_attribute(pLdapConnection, pEntry, &amp;pBer);

		// Output the attribute names for the current object
		// and output values.

		while(pAttribute != NULL)
		{

			// コメント：一時的なアイテム保管場所。
			//                   アイテムがいくつあるか分からないのでvector使用。
			vector&lt;string&gt;		tmpItem;
			// コメント：属性を保存。
			tmp_item.attr = pAttribute;    

			// Get the string values.
			ppValue = ldap_get_values(pLdapConnection, pEntry, pAttribute);

			// Print status if no values are returned (NULL ptr)
			if(ppValue == NULL)
			{
				printf(": [NO ATTRIBUTE VALUE RETURNED]");
			}

			// Output the attribute values
			else
			{
				iValue = ldap_count_values(ppValue);
				if(!iValue)
				{
					printf(": [BAD VALUE LIST]");
				}
				else
				{
					tmpItem.push_back(*ppValue);    // コメント：最初のアイテムを保存。

					// Output more values if available
					ULONG z;
					for(z=1; z&lt;iValue; z++)
					{
						// コメント：残りのアイテムがあれば保存。
						tmpItem.push_back(ppValue[z]);
					}
					// コメント：push_backされてきたアイテムを入れ子構造体の
					//                   一時保管場所構造体データに。
					tmp_item.item = tmpItem;
					// コメント：一時的なアイテム保管場所のvector要素を消去。
					//                 （解放ではないですよ。かつ&lt;vector&gt;.clear()でもない）
					tmpItem.erase(tmpItem.begin(), tmpItem.end());
				}
			}
			// コメント：直前で入れ子の一時データができているので、
			//                   一時的な本営データ保管場所にpush_back。
			//                   なぜここで本営データに入れないかは本文で。
			tmp_ldap.data.push_back(tmp_item);    

			// Free memory.
			if(ppValue != NULL)
				ldap_value_free(ppValue);
			ppValue = NULL;
			ldap_memfree(pAttribute);

			// Get next attribute name.
			pAttribute = ldap_next_attribute(pLdapConnection, pEntry, pBer);
		}
		// コメント：本営データにpush_back。
		ldap_data-&gt;push_back(tmp_ldap);
		// コメント：本営データに入れたので一時データの要素を消去し、for続きへ。
		tmp_ldap.data.erase(tmp_ldap.data.begin(), tmp_ldap.data.end());    

		if( pBer != NULL )
			ber_free(pBer,0);
		pBer = NULL;
	}

	//----------------------------------------------------------
	// Normal cleanup and exit.
	//----------------------------------------------------------
	ldap_unbind(pLdapConnection);
	ldap_msgfree(pSearchResult);
	ldap_value_free(ppValue);
	return 0;
</pre>
<p>上のソースで、アイテムが全て揃ったところで、なぜ本営データにぶち込んでいないかと言えば、まだ属性データがあった場合、属性ごとに本営データができあがってしまい、意図する動作にならないためです。つまり、「１つのエントリに対し、複数の属性、１つの属性に対し複数のアイテム」といった可変データ（１ｘNｘN）構造と微妙に異なるからなんです。
</p></div>
<p></p>
<div style="padding-left: 30px;">
で、ここまできたところで、「ldap_data」ってどこで宣言してるんじゃ～ってお怒りかも知れませんが、本営データはこの関数に引数として渡ってきます。</p>
<pre>
int	GetLDAPData(const char* pHost, std::vector&lt;LDAP_DATA&gt; *ldap_data)
</pre>
<p>では、この関数の呼び元と出力事例のソースは以下の通りでやんす。<br />
ソースが長いので、「ソースを表示」で伸張してくださいな。</p>
<pre>
	// 本営データ作成（ここではメモリ確保もせずほったらかし）
	vector&lt;LDAP_DATA&gt;	ldap;
	// 本営データのアドレスを引数で渡してあげます
	GetLDAPData(ldap_host.c_str(), &#038;ldap);

	// データがあったら表示を開始します
	if(!ldap.empty())
	{
		// 本営データに対するイテレータを作成しポインターもどきにします
		for(vector&lt;LDAP_DATA&gt;::iterator iarray = ldap.begin(); iarray&lt;ldap.end() ; iarray++)
		{
			cout &lt;&lt; "ENTRY NUMBER: " &lt;&lt; iarray-&gt;entrynum &lt;&lt; endl;
			// 入れ子構造体データに対するイテレータを作成しポインターもどきにします
			for(vector&lt;LDAP_ITEM&gt;::iterator iattr = iarray-&gt;data.begin(); iattr&lt;iarray-&gt;data.end() ; iattr++)
			{
				cout &lt;&lt; "	ATTR: " &lt;&lt; iattr-&gt;attr &lt;&lt; ":";
				// アイテムデータに対しイテレータを作成しポインターもどきにします
				for(vector&lt;string&gt;::iterator iitem = iattr-&gt;item.begin(); iitem&lt;iattr-&gt;item.end() ; iitem++)
				{
					cout &lt;&lt; " " &lt;&lt; *iitem;
					if(iitem&lt;iattr-&gt;item.end()-1)
						cout &lt;&lt; ",";
				}
				cout &lt;&lt; endl;
			}
		}
	}
</pre>
<p>データ表示部分で、本営、入れ子構造体、アイテムに対しそれぞれイテレータを作成していますが、こうしておけば独立した形（表現は厳密ではないけれど）で各データにアクセス出来ます。配列カウンターで悩むことがないので便利なんです。まぁ、配列ポインタと変わりはないんですけど、プログラムを書く好みでdata[i][j][k]とか好きな方ではないので。OpenLDAPのデータ構造はこんな感じ。</p>
<div align=center><div id="attachment_625" class="wp-caption aligncenter" style="width: 160px"><a rel="lightbox" href="http://www.witkitty.com/wordpress/wp-content/uploads/2011/05/OpenLDAPDataStructure.jpg"><img src="http://www.witkitty.com/wordpress/wp-content/uploads/2011/05/OpenLDAPDataStructure-150x106.jpg" alt="" title="OpenLDAPDataStructure" width="150" height="106" class="size-thumbnail wp-image-625 colorbox-515" /></a><p class="wp-caption-text">OpenLDAPデータ構造</p></div></div>
<p>足早にざっと書いては見たけれど、OpenLDAPのアクセスなんて誰もやろうなんて考えないよね。と言うことで備忘録ということで。
</p></div>
]]></content:encoded>
			<wfw:commentRss>http://www.witkitty.com/wordpress/2011/05/20/for_access_random_structure_data/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://www.witkitty.com/wordpress/2011/05/20/for_access_random_structure_data/" />
	</item>
		<item>
		<title>WordPress &#8211; データベース バックアップ</title>
		<link>http://www.witkitty.com/wordpress/2009/06/26/wordpress-db-backup/</link>
		<comments>http://www.witkitty.com/wordpress/2009/06/26/wordpress-db-backup/#comments</comments>
		<pubDate>Fri, 26 Jun 2009 08:14:13 +0000</pubDate>
		<dc:creator>hiro</dc:creator>
				<category><![CDATA[WordPress]]></category>
		<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[mysqldump]]></category>
		<category><![CDATA[Perl]]></category>
		<category><![CDATA[シェルスクリプト]]></category>
		<category><![CDATA[バックアップ]]></category>
		<category><![CDATA[メール添付]]></category>
		<category><![CDATA[メール送信]]></category>

		<guid isPermaLink="false">http://www.witkitty.com/wordpress/?p=117</guid>
		<description><![CDATA[<a href="http://www.witkitty.com/wordpress/2009/06/26/wordpress-db-backup/" title="Wordpress - データベース バックアップ"></a>このサイトは、当方の自作サーバーで動いているので、レンタルサーバーのような制約が無い。 レンタルサーバを借りたことがないので、どこまでレンタルサーバーでどこまで制約があるか分からないが・・・ 以下は、レンタルサーバーでも &#8230;<p class="read-more"><a href="http://www.witkitty.com/wordpress/2009/06/26/wordpress-db-backup/">Read more &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<a href="http://www.witkitty.com/wordpress/2009/06/26/wordpress-db-backup/" title="Wordpress - データベース バックアップ"></a><p style="padding-left: 30px;">このサイトは、当方の自作サーバーで動いているので、レンタルサーバーのような制約が無い。<br />
レンタルサーバを借りたことがないので、どこまでレンタルサーバーでどこまで制約があるか分からないが・・・<br />
以下は、レンタルサーバーでも出来るかもしれないが、基本的に自鯖の方用ということで。<br />
また、<a href="http://www.ilfilosofo.com/blog/wp-db-backup/">WordPress Database Backupプラグイン</a>を入れている方も不要と思われるんですが、データベースが大きくなると、ブラウザでの処理中にタイムアウトが発生する可能性があります。（タイムアウトするほどポストしていないので何とも言えませんが・・・）</p>
<p style="padding-left: 30px;">日々のデータベースバックアップをどうするかというと、<span style="color: #888888;"><strong>mysqldump</strong></span>コマンドを使ってごっそり引っこ抜いてしまうという手法を使います。このコマンドで得られたダンプファイルというのは単なるテキストファイルなんですが、このフォーマットはリストアするときにMySQLが分かるような書式になっています。ということなので、このテキストファイルを圧縮し、メールで送れれば、ほぼ<a href="http://www.ilfilosofo.com/blog/wp-db-backup/">WordPress Database Backupプラグイン</a>と同じことをブラウザのタイムアウトを気にせずバックアップを取ることが可能でやんす。<br />
（当方はこのダンプファイルがテキストファイルであるということで、ブログの引っ越しにこの性質を利用して手間を掛けずに数時間で引っ越しを終わらせました。このことは後で記事にでもしてみます）</p>
<p style="padding-left: 30px;">さて、では順を追って簡単に説明します。</p>
<p style="padding-left: 30px;">まずは、mysqldumpコマンド例は以下の通りです。</p>
<div style="padding-left: 30px;">
<pre>
# mysqldump [DB name] --host=[hostname] -u [DB user name] --password=[DB password] > [backup file name]
</pre>
</div>
<p style="padding-left: 30px;">で、このままだと手動でコマンドを叩くしかないので、cronに任せたくなりますが、そこをちょっと我慢してメールの送信まで一気に処理しちゃうスクリプトを書いちゃいましょ。</p>
<p style="padding-left: 30px;">基本的にダンプファイルを作るまではシェルスクリプト（bash）で、メール送信だけPerlスクリプトで書きました。Perl部分は［<a href="http://www.bird-soft.net/mt/2009/06/gmailperl.html">Bird-Soft</a>］さんのコードを丸写しなので合体させました・・・orz</p>
<p style="padding-left: 30px;">とりあえず、スクリプト全体のコードはこれ。（エラー処理は端折ってます）</p>
<p><span id="more-117"></span></p>
<div style="padding-left: 30px;">
<pre>
#!/bin/bash

dumpdir='/tmp/'
dumpdate=`date +%Y%m%d`
dumpfilename=senjyuwpdb-$dumpdate.dump
#データベース名
dbname='dbname'
#ホスト名（ほとんどの場合localhost）
dbhost='localhost'
#データベースのユーザ名
dbuser='dbuser'
#データベースユーザのパスワード
dbpasswd='dbpassword'
#圧縮ファイルの拡張子
compress_ext='.tar.gz'
#送信先アドレス
mailtoaddr='hogehoge@foo.com'

#### dump wordpress database
mysqldump $dbname --host=$host -u $dbuser --password=$dbpasswd > $dumpdir$dumpfilename

#### compress to tar.gz
pushd .
cd $dumpdir
tar zcvf $dumpfilename$compress_ext $dumpfilename
popd
#### send a mail with dump file
perl pmail.pl $dumpdir$dumpfilename$compress_ext $mailtoaddr

#
#### End of script
</pre>
</div>
<p style="padding-left: 30px;">それでもって、メール送信側Perlスクリプト（pmail.pl）がこれ。だが何度も言いますが、［<a href="http://www.bird-soft.net/mt/2009/06/gmailperl.html">Bird-Soft</a>］さんの所のコードを丸写し・・・です。（ありがとうございます、Bird-Softさん）</p>
<div style="padding-left: 30px;">
<pre>

#!/usr/bin/perl
#
#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 添付ファイル付メール送信スクリプト
#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; メール送信については、LANからWANへ出来ているものとする
#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 尚、このスクリプトは、LAN内からのSMTP接続のみ想定している
#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ので、外のメールサーバを使う場合はNET::SMTP::SSL認証を
#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 必要とする場合がある

use Jcode;
use Net::SMTP;
use MIME::Entity;
use Net::SMTP::SSL;

#### 送信サーバ設定
#メールサーバ名
my $smtp_server = &#039;mail.foo.com&#039;;
#SMTPポート
my $smtp_port = &#039;25&#039;;

#SMTP::SSLが必要な場合
#認証ユーザメールアドレスとパスワード
#my $smtp_acc = &#039;user@foo.com&#039;;
#my $smtp_pwd = &#039;password&#039;;
####

#### 日時取得
( $sec, $min, $hour, $date, $month, $year, $youbi ) = localtime;

$year += 1900;
$month++;

@jweek = ( &quot;日&quot;, &quot;月&quot;, &quot;火&quot;, &quot;水&quot;, &quot;木&quot;, &quot;金&quot;, &quot;土&quot; );
$j_youbi = $jweek[ $youbi ];

$hour = sprintf &quot;%02d&quot;, $hour;
$min = sprintf &quot;%02d&quot;, $min;
$sec = sprintf &quot;%02d&quot;, $sec;

$event_time=&quot;$year/$month/$date（$j_youbi）$hour:$min:$sec&quot;;
print &quot;イベント発生：$event_time\n&quot;;
#### 日時取得ここまで

$event_name=$ARGV[0];&nbsp;&nbsp; #添付ファイル名
$event_mailto=$ARGV[1]; #送信アドレス

#### 添付ファイル名
my $file_path_mail=$event_name; #引数より
my $timestamp_string=$event_time;

#BCCが必要な場合
my $mail_bcc = $event_mailto;
#fromアドレス（ここがメールサーバドメインと違った場合は転送と見なされはじかれる場合があります）
my $mail_from = &#039;senduser@foo.com&#039;;

#### 件名
my $mail_subject = &#039;WordPressデータベースダンプ&#039;;

#本文
my $mail_body = &lt;&lt;&quot;_MAILBODY_&quot;;

時刻：$timestamp_string
に取得されたデータベースダンプです
_MAILBODY_

#文字コード変換
$mail_subject = jcode($mail_subject)-&gt;jis;
$mail_subject = jcode($mail_subject)-&gt;mime_encode;
$mail_to = jcode($mail_to)-&gt;jis;
$mail_to = jcode($mail_to)-&gt;mime_encode;
#$mail_bcc = jcode($mail_bcc)-&gt;jis;
#$mail_bcc = jcode($mail_bcc)-&gt;mime_encode;
$mail_from = jcode($mail_from)-&gt;jis;
$mail_from = jcode($mail_from)-&gt;mime_encode;
$mail_body = jcode($mail_body)-&gt;jis;

my $err;
my $oSmtp;
my $oMime;

#ここから送信処理
#SSL認証用
#$oSmtp = Net::SMTP::SSL-&gt;new($smtp_server,Port =&gt; $smtp_port, Debug =&gt; 1);
#SMTP認証用
$oSmtp = Net::SMTP-&gt;new($smtp_server);

#SSL認証が必要な場合のエラー処理
#if($oSmtp-&gt;auth($smtp_acc,$smtp_pwd)){
#サーバ内の特定ユーザからの送信なのでエラー処理は端折ってます
$oSmtp-&gt;mail($mail_from);
$oSmtp-&gt;to($mail_to);
#&nbsp;&nbsp; &nbsp;$oSmtp-&gt;bcc($mail_bcc);
$oSmtp-&gt;data();
$oMime = MIME::Entity-&gt;build(
From =&gt; $mail_from,
To =&gt; $mail_to,
#&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;Bcc =&gt; $mail_bcc,
Subject =&gt; $mail_subject,
Data =&gt; $mail_body
);
$oMime-&gt;attach(
Path =&gt; $file_path_mail,
Type =&gt; &quot;application/octet-stream&quot;,
Encoding =&gt; &quot;Base64&quot;
);
$oSmtp-&gt;datasend($oMime-&gt;stringify);
$oSmtp-&gt;dataend();
$oSmtp-&gt;quit;

print &quot;ok mail to $mail_to\n&quot;;
#}else{
#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $err = &#039;SMTP Server Authentication Error!!&#039;;
#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print &quot;NG \n&quot;;
#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print &quot;error : $err \n&quot;;
#}

print &quot;end... \n&quot;;
exit;
</pre>
</div>
<p style="padding-left: 30px;">論より証拠？で、Perlのコードは別として、シェルスクリプトの方は汚い・拙い書き方ですが、たいしたことしてません。後はこのスクリプトをcron.dailyなんかに放り込めば、日々のバックアップ処理が自動的に行われますです。と、ここで思い出した、<strong>最後にバックアップファイル消してねぇ～</strong>、各自適当に願いします・・・ぉぃ</p>
<p style="padding-left: 30px;">当方の環境は、サーバ内もしくはLAN内から特定のユーザにメールが送られると自動的に外部のアドレスに転送される設定になっているので、今回苦労しなかったが、DDNS等でメールサーバを運用している方は注意が必要かと。</p>
<p style="padding-left: 30px;">ではでは</p>
]]></content:encoded>
			<wfw:commentRss>http://www.witkitty.com/wordpress/2009/06/26/wordpress-db-backup/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://www.witkitty.com/wordpress/2009/06/26/wordpress-db-backup/" />
	</item>
	</channel>
</rss>

