tag:blogger.com,1999:blog-35120991122185232622024-03-06T02:01:53.002+09:00プログラムのメモLinuxやプログラムの調べたことをメモしていますUnknownnoreply@blogger.comBlogger55125tag:blogger.com,1999:blog-3512099112218523262.post-14433163520882744112012-04-27T17:43:00.000+09:002012-04-27T17:43:31.854+09:00Ubuntuでandroidの実機を認識させるAndroid端末がDDSでNameが「?????????」となっている時の対応方法<br />
<img border="0" height="60" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjAzwi6Iq1Y-iBXbaZvpo4Tg-20Xe25lZSeeduSLUXvDOZ1V0nu2G_bO9fvdmJmBlS10JlkaV4p4YsYWFJk-WpbPorINK_yhC7VCHU1fh3TP9do7hreR0xr4BxxqGw1fe11XUThB95P8dAJ/s320/dds.png" width="320" /><br />
<br />
<a name='more'></a><br /><br />
(<a href="http://developer.android.com/intl/ja/guide/developing/device.html">参考ページ</a>)<br />
<br />
1.実機をusbで接続し、terminalからlsusbでベンダーIDを調べる<br />
例: この場合「ID 1004:61a3」の「1004」がベンダーIDになります。<br />
<pre>lsusb
.
.
.
Bus 002 Device 005: ID 1004:61a3 LG Electronics, Inc.
.
.
</pre>
<br />
2.スーパーユーザーで/etc/udev/rules.d/51-android.rulesファイルを開く。<br />
なければ新規作成<br />
<pre>sudo emacs /etc/udev/rules.d/51-android.rules
</pre>
<br />
3.以下を追加し、保存<br />
<pre>SUBSYSTEM=="usb", ATTR{idVendor}=="ベンダーID", MODE="0666", GROUP="plugdev"
</pre>
<br />
4.パーミッションの変更<br />
<pre>chmod a+r /etc/udev/rules.d/51-android.rules
</pre>
<br />
5.一旦実機をUSBから取り外し、再接続すると認識されるUnknownnoreply@blogger.com0tag:blogger.com,1999:blog-3512099112218523262.post-18661140657950563112012-04-27T17:39:00.000+09:002012-04-29T13:46:47.491+09:00Ubuntu 11.10でemacs+android開発環境の構築2Ubuntu 11.10でemacs+android開発環境構築時のemacsの設定・プロジェクトの作成までのメモ。<br />
JDK・AndroidSDKのインストール・設定は<a href="http://programing-memo.blogspot.jp/2012/04/ubuntu-1110emacsandroid.html">こちら</a><br />
<br />
<a name='more'></a><br />
<br />
<br />
<h3>
・android-modeのインストール</h3>
gitで取得するので、android-modeを置くディレクトリから<br />
<pre>git clone git://github.com/remvee/android-mode.git
</pre>
を入力すると、[android-mode]のディレクトリが作成される。<br />
<br />
emacsに以下を追加した後にemacsを立ち上げると<br />
emacsからエミュレータの起動・コンパイル・エミュレータへのインストールなどが行える。<br />
<pre>;; android-mode
(add-to-list 'load-path "~/android-modeへのパス")
(require 'android-mode)
(setq android-mode-sdk-dir "~/android-sdkへのパス")
</pre>
<br />
<br />
<h3>
Androidエミュレータの起動方法</h3>
emacs上で<br />
M-x android-start-emulator<br />
と入力すると「Android Virtual Device」と聞かれるので<br />
『Create new Android Virtual Device(AVD)』で作成したデバイスの名前を入力すると<br />
エミュレータが起動する。<br />
<br />
<br />
<h3>
DDMS(Androidのデバッギングツール)の起動</h3>
<br />
emacs上で<br />
M-x android-start-ddms<br />
と入力するとDDMSが起動する。<br />
<br />
<br />
<h3>
TestProjectの作成</h3>
<br />
ターミナルから以下のコマンドを入力してTestプロジェクトを作成する。<br />
<pre>android create project -n Test -t 1 -p Test -k jp.test -a TestActivity
</pre>
上記の意味は以下のとおり<br />
android create project <br />
-n プロジェクト名<br />
-t 上記で調べたID<br />
-p 新しいプロジェクトのディレクトリ名<br />
-k パッケージ名<br />
-a Activity名<br />
<br />
例:<br />
android create project -n HelloWorld -t 1 -p HelloWorld -k jp.test -a HelloWorldActivity<br />
<br />
<br />
emacsで作成したプロジェクトのディレクトリに移動して、<br />
<pre>M-x android-ant
</pre>
と入力すると、「Task:」と表示されるので<br />
<pre>debug install
</pre>
と入力するとエミュレータに『TestActivity』がインストールされる。Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-3512099112218523262.post-77642196776597773762012-04-27T17:38:00.000+09:002012-04-28T03:19:14.256+09:00Ubuntu 11.10でemacs+android開発環境の構築1Ubuntu 11.10でemacs+android開発環境構築時の<br />
JDKとAndroidSDKのインストール・設定までのメモ。<br />
emacsの設定はこちら<br />
<br />
<a name='more'></a><br />
<br />
<h3>
1.Javaとantのインストール</h3>
<pre>sudo apt-get install openjdk-6-jdk ant
</pre>
<br />
<br />
<h3>
2.Android SDKのインストール</h3>
<a href="http://developer.android.com/sdk/index.html">http://developer.android.com/sdk/index.html</a>からSDKをダウンロードし、解凍<br />
<br />
./~bashrcにPATHを追加<br />
PATH=$PATH:~/上記で解凍したパス/tools<br />
<br />
パスを反映させる<br />
<pre>source .bashrc
</pre>
<br />
3.Android SDK Managerの設定<br />
<br />
Android SDK Managerをコマンドラインから開く<br />
<pre>androide
</pre>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhbOzvn5v-sS4FmDssdvm84M_GAINRsDr_rKdq5zERkV0zwAjf0cgXJTEY46BnRYi8I2xPTb3-HYSx8dxgrMDNr8eMazeWXVJzpgu7QM4NzZtOjzYgPfbsw0SjMzl_okqCWI7loLU_3tM2D/s1600/AndroidSDKManager.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="211" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhbOzvn5v-sS4FmDssdvm84M_GAINRsDr_rKdq5zERkV0zwAjf0cgXJTEY46BnRYi8I2xPTb3-HYSx8dxgrMDNr8eMazeWXVJzpgu7QM4NzZtOjzYgPfbsw0SjMzl_okqCWI7loLU_3tM2D/s320/AndroidSDKManager.png" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<br />
<br />
[tools]とインストールするAndroid APIをチェックしてインストールする。<br />
(かなり時間がかかります。)<br />
<br />
<br />
Androidエミュレータ用のデバイスを作成する為、<br />
[Android SDK Manager]-[tools]-[Manage AVDs...]を選択し<br />
『Android Virtual Device Manager』を開き、[New...]をクリックする<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEibTuwKRGwuLF8RW8pnd1W-klfNhqrQuX8ic1McSpHJ7j385sS0V91WMmQ7D480bSJr9nZpoetRbg1sG2rExGbNo3bVawytqTJOC6JwJmIbPWyrsjsGepz79Hgm-PftI_4DDqrPfmyG7Twk/s1600/AndroidVirtualDeviceManager.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="220" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEibTuwKRGwuLF8RW8pnd1W-klfNhqrQuX8ic1McSpHJ7j385sS0V91WMmQ7D480bSJr9nZpoetRbg1sG2rExGbNo3bVawytqTJOC6JwJmIbPWyrsjsGepz79Hgm-PftI_4DDqrPfmyG7Twk/s320/AndroidVirtualDeviceManager.png" width="320" /></a></div>
<br />
『Create new Android Virtual Device(AVD)』の以下の項目を入力し、<br />
[Create AVD]をクリックしエミュレータ用のデバイスを作成する。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjWZRHuOjKqzQcK9bGWN8cG3uKtbkYaO1aa9HPGu9NoU6IqkT9UUrR58oGETPL-oxxc_tHp8y9KeM2jPNKUhyphenhyphen9i-9h45LNMmJI_LIJBSwE927ecmlz5PPrV-V9qgK9icqZDMc2nwIIDUVP9/s1600/CreateNewAVD.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjWZRHuOjKqzQcK9bGWN8cG3uKtbkYaO1aa9HPGu9NoU6IqkT9UUrR58oGETPL-oxxc_tHp8y9KeM2jPNKUhyphenhyphen9i-9h45LNMmJI_LIJBSwE927ecmlz5PPrV-V9qgK9icqZDMc2nwIIDUVP9/s320/CreateNewAVD.png" width="274" /></a></div>
<br />
・Name : 任意の名前<br />
・Target : Androidのヴァージョンを選択<br />
・SD Card: なくても可<br />
<br />
<br />
作成したら『Android SDK Manager』を閉じて、<a href="http://programing-memo.blogspot.jp/2012/02/ubuntu-1110emacsandroid2.html">emacsの設定</a>をする。Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-3512099112218523262.post-11355835780892458772012-03-09T15:46:00.002+09:002012-03-09T15:49:31.455+09:00Ubuntu11.10でgitを設定した時のメモUbuntu11.10でgitのインストール・エディタの設定・P4Megrgeの設定をした時のメモ<br />
<br />
<a name='more'></a><br />
<h4>・インストール</h4><pre>sudo apt-get install git-core
</pre><br />
<h4>・ユーザー名とメールアドレスの設定</h4><pre>git config --global user.name "ユーザー名"
git config --global user.email メールアドレス
</pre><br />
<h4>・editorの設定</h4>~/.bashrcに<br />
<pre>export EDITOR=emacs
</pre>もしくは、ターミナルから<br />
<pre>git config --global core.editor "emacs"
</pre>と入力<br />
<br />
<h4>・marge/diffをGUIツール(P4Merge)で表示する設定</h4><br />
1.<a href="http://www.perforce.com/downloads/complete_list">ここから</a>[User Essentials]-[Linux]をダウンロードし、解凍する。<br />
<br />
2.スーパーユーザで/usr/local/bin/extMergeファイルを作成<br />
<pre>sudo emacs /usr/local/bin/extMerge
</pre>以下を記述<br />
<pre>#!/bin/sh
[1で解凍したディレクトリ]/bin/p4merge $*
</pre><br />
3. スーパーユーザで/usr/local/bin/extDiffファイルを作成<br />
<pre>sudo emacs /usr/local/bin/extDiff
</pre>以下を記述<br />
<pre>#!/bin/sh
[ $# -eq 7 ] && /usr/local/bin/extMerge "$2" "$5"
</pre><br />
4. 2と3で作成したファイルに実行属性を追加<br />
<pre>sudo chmod +x /usr/local/bin/extMerge
sudo chmod +x /usr/local/bin/extDiff
</pre><br />
5.~/.gitconfigに以下を追記<br />
<pre>[merge]
tool = extMerge
[mergetool "extMerge"]
cmd = extMerge "$BASE" "$LOCAL" "$REMOTE" "$MERGED"
trustExitCode = false
[diff]
external = extDiff
</pre>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-3512099112218523262.post-62263739978348684792011-12-07T18:03:00.001+09:002011-12-07T18:30:10.338+09:00xfceでcapsLockとctrlキーを入れ替えるxfce4.8で<a href="http://serverfault.com/questions/10437/how-do-you-swap-the-caps-lock-to-control-in-xfce">こちら</a>を見ながらcapsLockとctrlキーを入れ替えた時のメモです。<br />
<br />
<br />
<a name='more'></a><br />
<br />
1.[設定]-[設定マネージャ]を開く<br />
2.[セッションと起動]の[自動開始アプリケーション]タブを選択<br />
3.[追加]ボタンをクリックし、『アプリケーションの追加』ダイアログを開く<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjlZ332GjuKmWC3a7JzIDAZlzCh8D7IYOh07yHLIQ4Q1_v187Ig1xIyhCVrlKaaTptRq2PzuJmvCBPcbELHdeBS2DP9ddCDUFzE-8PvjWDORVzunUKCj4VrjR9SGxzIMgwBVJWA1rXijOHU/s1600/xfce_autostart.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjlZ332GjuKmWC3a7JzIDAZlzCh8D7IYOh07yHLIQ4Q1_v187Ig1xIyhCVrlKaaTptRq2PzuJmvCBPcbELHdeBS2DP9ddCDUFzE-8PvjWDORVzunUKCj4VrjR9SGxzIMgwBVJWA1rXijOHU/s1600/xfce_autostart.png" /></a></div><br />
4.名前と説明を適当に入力し、コマンドに<br />
<pre>/usr/bin/setxkbmap -option "ctrl:nocaps"
</pre>と入力し、[OK]をクリックする<br />
<br />
5.一旦ログアウトし、再度ログインするとcapsLockとctrlキーが入れ替わるUnknownnoreply@blogger.com0tag:blogger.com,1999:blog-3512099112218523262.post-61408957989269457952011-09-19T16:32:00.000+09:002011-09-19T16:32:43.733+09:00jQuery CSSの値を削除要素に指定したcssの値を削除する方法<br />
<br />
<pre class="javascript" name="code">$( "#test" ).css( "color", "red" ); // 文字色を赤に設定
$( "#test" ).css( "color", "" ); // 文字色の指定を削除
</pre>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-3512099112218523262.post-89135846243023482762011-07-21T22:33:00.000+09:002011-07-21T22:33:49.450+09:00Firefoxで壊れた画像のアイコンを表示Firefoxでは、壊れた画像は何も表示されないので<br />
壊れたアイコン<img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEirVrczcUW4bbPHyG7UcRhiUGCBHcTiDxipTI8negMNiRMo0t3g2piZz_XaFwuiAytdXHP4Vj07Qpor7U2dyiaFgkGVEqBbyGTSOXHN29r6989WCDkL30We6uh9pBfW7h47ca-h5KLMEBKL/s1600/broken.jpg" />をCSSで表示する方法<br />
<br />
<a href="http://blog.doxmart.com/2009/08/11/a-quick-tip-on-enabling-broken-image-placeholders-in-firefox-3-and-beyond/">参考にしたページ</a><br />
<a name='more'></a><br />
<pre class="css" name="code">img:-moz-broken{
-moz-force-broken-image-icon:1;
width:24px;
height:24px;
}
</pre>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-3512099112218523262.post-23843838625446096892011-06-25T17:44:00.000+09:002011-06-25T17:44:33.934+09:00Javascript DOMのノードプロパティノードから他のノードを取得するプロパティ<br />
<span class="Apple-style-span" style="font-size: x-small;">リンク先はGecko DOM リファレンスです。</span><br />
<table border="0" cellpadding="5" cellspacing="1" style="background-color: #404040;"><caption> </caption> <tbody>
<tr><td colspan="2" style="background-color: #525252; text-align: center;"><span class="Apple-style-span" style="color: white;"><b>親子ノード</b></span></td></tr>
<tr><td style="background-color: #ededed;"><b><a href="https://developer.mozilla.org/ja/DOM/element.childNodes">childNodes</a></b></td> <td style="background-color: #ededed;">子ノードの配列</td></tr>
<tr><td style="background-color: #cccccc;"><b><a href="https://developer.mozilla.org/ja/DOM/element.firstChild">firstChild</a></b></td> <td style="background-color: #cccccc;">最初の子ノード。なければnull</td> </tr>
<tr> <td style="background-color: #ededed;"><b><a href="https://developer.mozilla.org/ja/DOM/element.lastChild">lastChild</a></b></td> <td style="background-color: #ededed;">最後の子ノード。なければnull</td> </tr>
<tr><td style="background-color: #cccccc;"><b><a href="https://developer.mozilla.org/ja/DOM/element.parentNode">parentNode</a></b></td> <td style="background-color: #cccccc;">親ノード</td> </tr>
<tr> <td colspan="2" style="background-color: #525252; text-align: center;"><b><span class="Apple-style-span" style="color: white;">兄弟ノード</span></b></td> </tr>
<tr> <td style="background-color: #ededed;"><b><a href="https://developer.mozilla.org/ja/DOM/element.previousSibling">previousSibling</a></b></td> <td style="background-color: #ededed;">前のノード。なければnull</td> </tr>
<tr> <td style="background-color: #cccccc;"><b><a href="https://developer.mozilla.org/ja/DOM/element.nextSibling">nextSibling</a></b></td> <td style="background-color: #cccccc;">終了ノードとオフセットを設定</td> </tr>
</tbody> </table><br />
<br />
ノードの情報を取得するプロパティ<br />
<table border="0" cellpadding="5" cellspacing="1" style="background-color: #404040;"><caption> </caption> <tbody>
<tr><td style="background-color: #ededed;"><b><a href="https://developer.mozilla.org/ja/DOM/element.nodeType">nodeType</a></b></td> <td style="background-color: #ededed;">ノードの種類の数値<br />
divなどの要素は1、テキストノードは3</td></tr>
<tr><td style="background-color: #cccccc;"><b><a href="https://developer.mozilla.org/ja/DOM/element.nodename">nodeName</a></b></td> <td style="background-color: #cccccc;">ノードの名前</td></tr>
<tr><td style="background-color: #ededed;"><b><a href="https://developer.mozilla.org/En/DOM/Node.nodeValue">nodeValue</a></b><br />
<div style="text-align: center;"><span class="Apple-style-span" style="font-size: x-small;">(英語)</span></div></td> <td style="background-color: #ededed;">ノードの値。<br />
テキストノードならば文字列、<br />
divなどの要素はnull</td> </tr>
</tbody> </table>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-3512099112218523262.post-64975261273947737462011-05-17T17:53:00.002+09:002011-05-17T17:57:52.899+09:00c++でcgi ー ファイルのアップロードC++でファイルのアップロードを受け取り、ファイルの中身をHTMLで表示するプログラムです。<br />
<br />
参考にしたページ<br />
<a href="http://www-cms.phys.s.u-tokyo.ac.jp/%7Enaoki/CIPINTRO/CCGI/multdisp.html">http://www-cms.phys.s.u-tokyo.ac.jp/~naoki/CIPINTRO/CCGI/multdisp.html</a><br />
<a name='more'></a><br />
<br />
<div style="color: blue;"><span style="font-size: large;"><b>・HTML</b></span></div><pre class="html" name="code"><!DOCTYPE html>
<html>
<head>複数ファイルのアップロード
<meta charset="utf-8">
</head>
<body>
<form action="upload.fcgi" method="POST" enctype="multipart/form-data">
<input type="file" name="files" multiple>
<input type="submit" value="submit">
</form>
</body>
</html>
</pre><br />
<div style="color: blue;"><b><span style="font-size: large;">・C++ソースコードの説明</span></b></div><div style="color: blue;"><br />
</div><br />
<span style="font-size: large;"><b>・12~85行目:Requestがアップロードかを判定</b></span><br />
<br />
環境変数<b>[CONTENT_TYPE]</b>の文字列から<br />
<ul><li>[multipart/form-data]が含まれているか</li>
<li>[boundary]の文字列を取得できるか</li>
</ul>を調べてRequestがアップロードかを判定しています。<br />
<br />
<br />
例としてGoogle ChromeでアップロードをするとCONTENT_TYPEは、以下のようになります。<br />
<span style="font-size: small;">(<b>WebKitFormBoundary7uUEXkjnVYxPBKMI</b>は、ユニークな値がはいります。)</span><br />
<br />
<pre>multipart/form-data; boundary=----WebKitFormBoundary7uUEXkjnVYxPBKMI, referer: 呼び出し元のURL
</pre><br />
boundaryの文字列は、アップロードされた各ファイルの本体と、フッタの区切りに使うので覚えておきます。<br />
<br />
<br />
<span style="font-size: large;"><b>・90~123行目:ファイルの中身まで標準入力を進める</b></span><br />
<br />
アップロードされたファイルは、標準入力stdinから以下の順で取得できます。<br />
(複数ファイルがアップロードされた時は、この順に繰り返されます。) <br />
<ol><li>ヘッダ</li>
<li> ファイル本体</li>
<li>フッタ</li>
</ol><br />
例えば2つのファイルをアップロードすると、以下のように情報が送られてきます。 <br />
<br />
<pre>------WebKitFormBoundary7uUEXkjnVYxPBKMI[\r][\n]
Content-Disposition: form-data; name="files"; filename="ファイル1"[\r][\n]
Content-Type: application/octet-stream[\r][\n]
[\r][\n]
ファイル1の中身
[\r][\n]
------WebKitFormBoundary7uUEXkjnVYxPBKMI[\r][\n]
Content-Disposition: form-data; name="files"; filename="ファイル2"[\r][\n]
Content-Type: application/octet-stream[\r][\n]
[\r][\n]
ファイル2の中身
[\r][\n] </pre><br />
<br />
ヘッダの構成は以下のようになっています。<br />
<ol><li> <b>[--]</b>+<b>[CONTENT_TYPEのboundary]</b>で指定されるユニークな文字列<b>[\r][\n]</b></li>
<li> Content-Disposition<b>[\r][\n]</b></li>
<li> Content-Type<b>[\r][\n]</b><b>[\r][\n]</b></li>
</ol><br />
<b>[\r][\n][\r][\n]</b>の後からがファイル本体になるので、そこまでスキップしています。<br />
<br />
送信されたフォームのフィールド名やファイル名などを取得する際には、2の[Content-Disposition]から取得する必要がありますが、本記事では行っていません。<br />
<br />
<br />
<span style="font-size: large;"><b>・136~174行目</b></span><br />
<br />
ファイル本体とヘッダをstdinから取得し、HTMLとし標準出力に表示しています。<br />
また、stdinから文字を取得する際に[boundary]の文字列と比較し、ヘッダは表示せずに終了します。<br />
<br />
<br />
<div style="color: blue;"><span style="font-size: large;"><b>・C++</b></span></div><br />
<pre class="c++" name="code">#include <string>
#include <stdio.h>
#include <iostream>
#include <stdlib.h> // getenv
const int BOUNDARY_LENGTH = 8; // boundaryの文字数
using namespace std;
// ========================================================
// Requestがアップロードか調べ、boundaryの文字列を返します。
// ========================================================
bool isUploadRequest( std::string & boundaryStr )
{
/*
環境変数[REQUEST_METHOD]に送信されたメソッド[GET/POST]が入ります。
アップロードは、[POST]で送信されてきます。
*/
std::string request_method = getenv( "REQUEST_METHOD" );
if ( request_method != "POST" )
{
fprintf( stderr, "REQUEST_METHOD isn't POST.\n" );
return false;
}
/*
Uploadでは、環境変数[CONTENT_TYPE]に[multipart/form-data]が含まれています。
*/
std::string content_type = getenv( "CONTENT_TYPE" );
if ( content_type.empty() ||
content_type.find( "multipart/form-data" ) == std::string::npos )
{
fprintf( stderr, "CONTENT_TYPE is error.\n" );
return false;
}
fprintf( stderr, "%s\n", content_type.c_str());
/*
boundaryを取得します。
*/
std::string::size_type index = content_type.find( "boundary" );
if ( index == std::string::npos )
{
return false;
}
// boundaryの文字列より後に[=]があるかを調べます。
index = content_type.find( "=", index + BOUNDARY_LENGTH );
if ( index == std::string::npos )
{
return false;
}
// [=]の後からboundaryを取得します。
index++;
if ( index >= content_type.size())
{
return false;
}
std::string::size_type end_index = std::string::npos;
if ( content_type[ index ] == '"' )
{
// [boundary="XXXXXX"]形式は、["]内の文字列を取得します。
end_index = content_type.find( '"', index + 1 );
if ( end_index == std::string::npos )
{
return false;
}
index++;
}
else
{
// [boundary=XXXXX, XXXX=XXXX]形式は、[,]までの文字列を取得します。
end_index = content_type.find( ',', index + 1 );
}
/*
ファイル本体とフッタの区切り文字列を作成します。
区切りの文字列は、[\r\n--]+[boundaryの文字列]の形式です。
*/
boundaryStr = "\r\n--";
boundaryStr += content_type.substr( index, end_index - index );
return true;
}
// ========================================================
// ファイルの中身の直前には、[\r\n\r\n]があるので、そこまで進めます。
// ========================================================
bool skipHeader()
{
char buf;
while ( 1 )
{
if ( fread( &buf, 1, 1, stdin ) != 1 )
return false;
if ( buf != '\r' )
continue;
if ( fread( &buf, 1, 1, stdin ) != 1 )
return false;
if ( buf != '\n' )
continue;
if ( fread( &buf, 1, 1, stdin ) != 1 )
return false;
if ( buf != '\r' )
continue;
if ( fread( &buf, 1, 1, stdin ) != 1 )
return false;
if ( buf == '\n' )
{
// [\r\n\r\n]が見つかったので、ループを抜けます。
return true;
}
}
return false;
}
// ========================================================
// アップロードされたファイルの中身を表示します。
// ========================================================
bool printFile( const std::string & boundaryStr )
{
// ヘッダ部分をスキップし、ファイルの中身まで進めます。
if ( !skipHeader())
{
return false;
}
// ファイルの中身を表示します。
char buf;
string tmpStr;
string::size_type boundaryLength = boundaryStr.size();
string::size_type index = 0;
while ( 1 )
{
if ( fread( &buf, 1, 1, stdin ) != 1 )
return true;
if ( buf == boundaryStr[ index ] )
{
/*
boundaryの文字なので、一旦tmpStrに保存し、比較するboundaryのインデックスを進めます。
*/
index++;
tmpStr += buf;
if ( index >= boundaryLength )
{
// boundaryの文字が全て見つかったので、ループを抜けます。
break;
}
}
else
{
if ( index > 0 )
{
// boundaryでない文字列が見つかったので、tmpStrの文字列を表示しインデックスを0に戻します。
printf( "%s", tmpStr.c_str());
index = 0;
tmpStr.clear();
}
putchar( buf );
}
}
return true;
}
// ========================================================
// main
// ========================================================
int main()
{
// Requestsがアップロードかを調べます。
std::string boundaryStr;
if ( !isUploadRequest( boundaryStr ))
{
return -1;
}
// HTMLを出力します。
printf( "Content-Type: text/html\n\n" );
printf( "<html>" );
printf( "<head><title>test</title></head>" );
printf( "<body>" );
std::string boundary;
if ( !isUploadRequest( boundary ))
{
printf( "error\n" );
}
else
{
while ( 1 )
{
if ( !printFile( boundaryStr )) break;
}
}
printf( "</body>" );
printf( "</html>" );
return 0;
}
</pre>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-3512099112218523262.post-3913093896681588472011-05-14T15:03:00.000+09:002011-05-14T15:03:16.452+09:00さくらVPS c++でfcgiさくらVPS: CentOS5.5でfcgiをインストールしてc++をFastCGIとして動かしてみます。<br />
<a name='more'></a><a href="http://px.a8.net/svt/ejp?a8mat=1TQA91+N7Y56+D8Y+BXB8X" target="_blank"><br />
<img alt="" border="0" height="60" src="http://www25.a8.net/svt/bgt?aid=110401381039&wid=002&eno=01&mid=s00000001717002003000&mc=1" width="468" /></a><br />
<img alt="" border="0" height="1" src="http://www13.a8.net/0.gif?a8mat=1TQA91+N7Y56+D8Y+BXB8X" width="1" /><br />
<br />
FastCGIとは、<a href="http://ja.wikipedia.org/wiki/FastCGI">wiki</a>から引用すると<br />
<blockquote><br />
CGIは、ユーザーから要求がある度に、プロセスの生成と破棄が行われる。大量の要求があればその分だけプロセスの生成と破棄が実施され、この事がパフォーマンスの悪化に繋がっている。<br />
FastCGIは、プロセスをメモリ上に永続化させることで、その起動と終了にかかる時間をカットし、結果としてプログラム動作速度の向上および サーバ負荷の低下が可能となる。最初にプロセスが実行された段階で、そのプロセスはメモリ上に格納され、次の要求に対してはそのメモリに格納されたプロセ スを実行する。</blockquote><br />
とあり、サーバにアクセスがある度にCGIプロセスを立ち上げるのではなく、CGIプロセスを立ち上げたままにすることで、パフォーマンスを向上させるものです。 <br />
<br />
<br />
<span style="font-size: large;"><b>・fcgiのインストール</b></span><br />
ソースをダウンロードしようとしたところ、<a href="http://www.fastcgi.com/">FastCGIのサイト</a>が変わって(?)ソースが見つからなかったのでrpmパッケージからインストールします。<br />
<br />
<pre>wget http://download.fedora.redhat.com/pub/epel/5/x86_64/fcgi-2.4.0-12.el5.x86_64.rpm
wget http://download.fedora.redhat.com/pub/epel/5/x86_64/fcgi-devel-2.4.0-12.el5.x86
yum install --nogpgcheck fcgi-2.4.0-12.el5.x86_64.rpm fcgi-devel-2.4.0-12.el5.x86_64.rpm
</pre><br />
<br />
<span style="font-size: large;"><b>・mod_fcgidのインストール</b></span><br />
apacheでFastCGIを使う為にmod_fcgidモジュールをインストールします。<br />
<pre>wget http://www6.atomicorp.com/channels/atomic/centos/5/x86_64/RPMS/mod_fcgid-2.3.5-2.el5.art.x86_64.rpm
yum install --nogpgcheck fcgi-2.4.0-12.el5.x86_64.rpm fcgi-devel-2.4.0-12.el5.x86_64.rpm
/etc/init.d/httpd restart
</pre>インストールすると、設定ファイル/etc/httpd/conf.d/fcgid.confが作成されるので、<br />
/etc/httpd/conf/httpd.confを設定する必要はありません。<br />
<br />
<br />
<span style="font-size: large;"><b>・C++でfcgiを使う</b></span><br />
設定ができたので、c++から呼び出してみます。<br />
<br />
ファイル名:test.cpp<br />
<pre class="c++" name="code">#include <fcgi_stdio.h>
#include <unistd.h> // getpid
int main()
{
while ( FCGI_Accept () >= 0 )
{
printf( "Content-Type: text/html\n\n" );
printf( "<html>\n" );
printf( "<head><title>test</title></head>\n" );
printf( "<body>Hello world. pid=%d</body>\n",
getpid());
printf( "</html>\n" );
}
return 0;
}
</pre><b><br />
</b><br />
<b>・コンパイル</b><br />
<pre>g++ -o test.fcgi test.cpp -lfcgi
</pre><br />
ブラウザから、test.fcgiを呼び出すと<br />
[<b>Hello world.pdi=プロセスのID</b>]<br />
と表示され、再読み込みをしてもプロセスのIDは同じままになります。<br />
<br />
<b><br />
</b><br />
<b>・ソースコードの説明</b><br />
fastcgiとして動作するにはfcgi_stdio.hをincludeする必要があります。<br />
(パスは/usr/include/fcgi_stdio.hです。)<br />
<br />
fcgi_stdio.hはstdio.hをラップし、printf、freadなどの標準入出力関数をfastcgiとして動かします。<br />
<br />
6行目ではFCGI_Acceptを使用し、リクエストがあった時にループ内の処理を行うようにしています。<br />
<br />
8~13行目のprintfは、stdio.hのprintfではなく、fcgi_stdio.hのprintfを呼び出してHTMLを出力しています。Unknownnoreply@blogger.com2tag:blogger.com,1999:blog-3512099112218523262.post-64584943332546495982011-05-11T23:52:00.000+09:002011-05-11T23:52:18.064+09:00c++でcgi ー POSTメソッドでデータを受け取るHTMLのformからPOSTメソッドでデータを取得してみます。<br />
<a name='more'></a><br />
<br />
<b>・HTML</b><br />
<pre class="html" name="code"><!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
</head>
<body>
<form action="cgiへのパス" method="post">
<textarea name="test1"></textarea>
<textarea name="test2"></textarea>
<input type="submit" value="送信">
</form>
</body>
</html></pre>form内にテキストエリアが2つ(<b>name</b>は"<b>test1</b>"と"<b>test2</b>")あり、8行目で呼び出すCGIへのパスとPOSTメソッドを指定しています。<br />
<br />
<br />
<b>・C++</b><br />
<pre class="c++" name="code">#include <iostream>
#include <string>
#include <stdlib.h> // getenv
using namespace std;
//! 文字列から値に変換します。
template < typename T > T convert( const std::string & str )
{
std::istringstream istream( str );
T type = 0;
if ( !str.empty())
{
istream >> type;
}
return type;
};
int main()
{
// 環境変数[REQUEST_METHOD]に送信されたメソッド[GET/POST]が入ります。
std::string request_method = getenv( "REQUEST_METHOD" );
if ( request_method != "POST" )
{
cout << "REQUEST_METHOD : " << request_method << endl;
return 0;
}
// 送信されたサイズを取得します。
std::string lengthStr = getenv( "CONTENT_LENGTH" );
unsigned long length = convert< unsigned long >( lengthStr );
if ( length > ( 1024 * 1024 /* 1M byte*/))
{
cout << "CONTENT_LENGTH : " << lengthStr << endl;
return 0;
}
// 送信されたデータを保存する文字列のメモリを確保します。
char * tmpBuf = new char[ length + 1 ];
if ( !tmpBuf )
{
cout << "Allocate is failed." << endl;
return 0;
}
// 標準入力からPOSTされたデータを取得します。
if ( fread( tmpBuf, 1, length, stdin ) != length )
{
cout << "fread is failed." << endl;
return 0;
}
tmpBuf[ length ] = '\0';
// HTMLを出力します。
cout << "Content-Type: text/html" << endl << endl;
cout << "<html>" << endl;
cout << "<head><title>test</title></head>" << endl;
cout << "<body>" << endl;
cout << tmpBuf << "<br>" << endl;
cout << "</body>" << endl;
cout << "</html>" << endl;
return 0;
}
</pre><br />
9行目から20行目までは、<a href="http://programing-memo.blogspot.com/2011/05/c.html">文字列から数値に変換する関数</a>です。<br />
送信されたサイズを数値に変換するのに使用しています。<br />
<br />
25行目で環境変数[<b>REQUEST_METHOD</b>]からGET/POSTのどちらのメソッドかを取得しています。<br />
<br />
32~39行目までは環境変数[<b>CONTENT_LENGTH</b>]から送信されたサイズを文字列で取得した後、数値に変換しています。<br />
<br />
42行目で、送信されたデータを保存する文字列のメモリを確保し、<br />
50行目で<b>fread</b>を使用して送信されたデータを確保したメモリに書き込んでいます。<br />
<br />
57行目移行は、送信されたデータをHTMLとして書き出しています。<br />
<br />
<br />
GETメソッドと同様、送信されたデータはURLエンコードされ<b>nameと内容が[</b><b>=]</b>で結ばれ、<b>各項目が[&]</b>で結ばれます。<br />
<br />
最初の テキストエリア(<b>test1</b>)に[<b>123</b>]、次のテキストエリア(<b>test2</b>)に[<b>test</b>]を入力した時は、<br />
送信される文字列は[<b>test1=123&test2=test</b>]になります。<br />
<br />
実際に使用する時は、文字列を<a href="http://programing-memo.blogspot.com/2011/05/ccgi-url_11.html">URLデコード</a>し文字列を[&]と[=]で区切る必要があります。Unknownnoreply@blogger.com1tag:blogger.com,1999:blog-3512099112218523262.post-5330589237710781482011-05-11T20:59:00.000+09:002011-05-11T20:59:07.299+09:00c++でcgi ー GETメソッドでデータを受け取るHTMLのformからGETメソッドでデータを取得してみます。<br />
<br />
<a name='more'></a><br />
<b>・HTML</b><br />
<pre class="html" name="code"><!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
</head>
<body>
<form action="CGIへのパス" method="get">
<input type="text" name="text1">
<input type="text" name="text2">
<input type="submit" value="送信">
</form>
</body>
</html>
</pre><br />
form内にテキスト入力欄が2つ(<b>name</b>は"<b>text1</b>"と"<b>text2</b>")あり、8行目で呼び出すCGIへのパスとGETメソッドを指定しています。<br />
<br />
<br />
<b>・c++</b><br />
<pre class="c++" name="code">#include <iostream>
#include <string>
int main()
{
// 環境変数[REQUEST_METHOD]に送信されたメソッド[GET/POST]が入ります。
std::string request_method = getenv( "REQUEST_METHOD" );
std::string query_string;
if ( request_method == "GET" )
{
query_string = getenv( "QUERY_STRING" );
}
cout << "Content-Type: text/html" << endl << endl;
cout << "<html>" << endl;
cout << "<head><title>test</title></head>" << endl;
cout << "<body>" << endl;
cout << query_string << endl;
cout << "</body>" << endl;
cout << "</html>" << endl;
return 0;
}
</pre><br />
6行目で環境変数<b>[REQUEST_METHOD]</b>からGET/POSTのどちらのメソッドかを取得しています。<br />
<br />
11行目で、GETメソッドなら環境変数<b>[QUERY_STRING]</b>から送信されたデータを取得しています。<br />
<br />
<b>[QUERY_STRING]</b>には、送信された文字列(<span style="color: #cc0000;">URLエンコードされています</span>)が入ります。<br />
送信された文字列はnameと内容が[<b>=</b>]で結ばれ、各項目が[<b>&</b>]で結ばれています。<br />
<br />
formのtext1に[<b>abc</b>]、text2に[<b>123</b>]と入力して送信すると<br />
QUERY_STRINGには[<b>text1=abc&text2=123</b>]という文字列が入ります。<br />
<br />
<br />
実際に使用する時は、文字列を<a href="http://programing-memo.blogspot.com/2011/05/ccgi-url_11.html">URLデコード</a>し文字列を[&]と[=]で区切る必要があります。Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-3512099112218523262.post-10554160529269020922011-05-11T17:05:00.001+09:002011-05-11T17:07:20.775+09:00c++でcgi ー URLデコードHTMLのフォームからGETやPOSTで送られてくる文字列は、<a href="http://ja.wikipedia.org/wiki/URL%E3%82%A8%E3%83%B3%E3%82%B3%E3%83%BC%E3%83%89">URLエンコード</a>されてくるので、デコードして元の形に戻すプログラムです。<br />
<br />
( <a href="http://www.kinet.or.jp/hiromin/cgi_introduction/appendix/url_encode.html">こちら</a>のページを参考にしました。)<br />
<br />
引数で渡された文字列から、以下の変換を行った文字列を返します。 <br />
<ul><li>[+] → [ ](半角スペース)</li>
<li>[%○○](○は16進数) → 2桁の16進数の文字 </li>
<li>[%0A][%0D%0A](改行コード) →<br></li>
</ul><br />
<a name='more'></a><br />
<br />
<pre class="c++" name="code">#include <iostream>
#include <string>
#include <ctype.h> // toupper
//! %XXのXXをchar型にして返します。
char hexToChar( char first, char second )
{
int digit;
digit = ( first >= 'A' ? (( first & 0xDF ) - 'A') + 10 : ( first - '0' ));
digit *= 16;
digit += ( second >= 'A' ? (( second & 0xDF ) - 'A' ) + 10 : ( second - '0' ));
return static_cast< char >( digit );
}
//! 改行コードか判定します。
bool isLF( const std::string & str,
const std::string::size_type & length,
std::string::size_type & index,
char * tmpStr )
{
if ( tmpStr[ 0 ] != '0' )
return false;
tmpStr[ 1 ] = toupper( tmpStr[ 1 ] );
if ( tmpStr[ 1 ] == 'A' )
{
// [0A]は改行コード
return true;
}
if ( tmpStr[ 1 ] == 'D' )
{
// [0D]も改行コード
if (( index + 3 ) < length && str[ index + 1 ] == '%' )
{
// [0D]の後に[%0A]がある時は、[%0A]の後までインデックスを進めます。
tmpStr[ 0 ] = str[ index + 2 ];
tmpStr[ 1 ] = str[ index + 3 ];
if ( tmpStr[ 0 ] == '0' &&
( tmpStr[ 1 ] == 'A' || tmpStr[ 1 ] == 'a' ))
{
index += 3;
}
}
return true;
}
return false;
}
/**
URLデコードをした文字列を返します。
改行コード(0x0A, 0x0D)は'\n'にします。
**/
std::string UrlDecorde( const std::string & str )
{
std::string retStr;
char tmpStr[ 2 ];
std::string::size_type length = str.size();
for ( std::string::size_type i = 0 ; i < length ; i++ )
{
if ( str[ i ] == '+' )
{
// [+]は半角スペース
retStr += ' ';
}
else if ( str[ i ] == '%' && ( i + 2 ) < length )
{
tmpStr[ 0 ] = str[ i + 1 ];
tmpStr[ 1 ] = str[ i + 2 ];
if ( std::isxdigit( tmpStr[ 0 ] ) && std::isxdigit( tmpStr[ 1 ] ))
{
i += 2;
// 改行コードのチェック
if ( isLF( str, length, i, tmpStr ))
{
retStr += "<br>";
}
else
{
retStr += hexToChar( tmpStr[ 0 ], tmpStr[ 1 ] );
}
}
else
{
// no digit
retStr += '%';
}
}
else
{
retStr += str[ i ];
}
}
return retStr;
}
int main()
{
std::cout << UrlDecorde( "%E3%81%82%E3%81%84%E3%81%86%E3%81%88%E3%81%8A%0D%0A%E3%81%8B%E3%81%8D%E3%81%8F%E3%81%91%E3%81%93" ) << std::endl;
return 0;
}
</pre>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-3512099112218523262.post-33594707979261918212011-05-10T21:00:00.002+09:002011-05-10T21:02:58.568+09:00c++でcgi ー URLエンコード<a class="external mw-magiclink-rfc" href="http://tools.ietf.org/html/rfc3986">RFC 3986</a>にしたがってURLエンコードをするプログラムです。<br />
<br />
数字/アルファベット/[-](ハイフン)/[.](ピリオド)/[_](アンダーバー)/[~](チルダ)以外の文字を<br />
『%○○(○は16進数)』に変換します。<br />
(PHP5.3移行のrawurlencodeと同じ動作になるはずです。)<br />
<br />
<br />
<a name='more'></a><br />
<br />
※ 半角スペースを[+]、[~]を[%7E]に変換する仕様は、application/x-www-form-urlencodedによるエンコード方法(PHPのurlencode関数)です。<br />
<br />
<br />
<pre class="c++" name="code">#include <string>
std::string UrlEncode( const std::string & str )
{
std::string retStr;
std::string::size_type length = str.size();
for ( std::string::size_type i = 0 ; i < length ; i++ )
{
if (( '0' <= str[ i ] && str[ i ] <= '9' ) ||
( 'a' <= str[ i ] && str[ i ] <= 'z' ) ||
( 'A' <= str[ i ] && str[ i ] <= 'Z' ) ||
str[ i ] == '-' || str[ i ] == '.' ||
str[ i ] == '_' || str[ i ] == '~' )
{
// 数字/アルファベット/[-][.][_][~]はそのまま
retStr += str[ i ];
}
else
{
retStr += '%';
char tmp[ 3 ];
snprintf( tmp, 3, "%X", static_cast< unsigned char >( str[ i ] ));
retStr += tmp;
}
}
return retStr;
}
</pre>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-3512099112218523262.post-84034689328059665432011-05-10T17:58:00.002+09:002011-05-10T18:11:04.387+09:00c++で文字列から数値に変換c++でstd::istringstreamを使用して文字列から数値に変換するプログラムです。<br />
templateを使用しているので、様々な型で変換できます。<br />
<br />
<a name='more'></a><br />
<pre class="c++" name="code">#include <iostream>
#include <string>
#include <iomanip> // setprecision
#include <sstream>
using namespace std;
//! 文字列から値に変換します。
template < typename T > T convert( const std::string & str )
{
std::istringstream istream( str );
T type = 0;
if ( !str.empty())
{
istream >> type;
}
cout << type << endl;
return type;
};
int main()
{
unsigned long val = convert< unsigned long >( "12345678901" );
cout << val << endl;
long double tmp = convert< long double >( "123.45678" );
cout << setprecision( 10 ) << tmp << endl;
return 0;
}
</pre><br />
28行目のcoutでsetprecisionで有効桁数を指定しないと、小数点4桁目(環境によります)が四捨五入されて表示されます。<br />
(指定し忘れてて、はまりました。。)Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-3512099112218523262.post-4432811901805319172011-05-08T14:45:00.007+09:002011-05-10T21:04:30.264+09:00さくらVPS c++でcgiせっかくのVPSなので、c++でcgiを書いてみます。<br />
環境はCentOS5.5で、<a href="http://programing-memo.blogspot.com/2011/04/vpslamp.html">apache</a>・<a href="http://programing-memo.blogspot.com/2011/04/vpsc.html">g++</a>がインストール済みとします。<br />
<br />
<a name='more'></a><a href="http://px.a8.net/svt/ejp?a8mat=1TQA91+N7Y56+D8Y+BXB8X" target="_blank"><br />
<img alt="" border="0" height="60" src="http://www25.a8.net/svt/bgt?aid=110401381039&wid=002&eno=01&mid=s00000001717002003000&mc=1" width="468" /></a><br />
<img alt="" border="0" height="1" src="http://www13.a8.net/0.gif?a8mat=1TQA91+N7Y56+D8Y+BXB8X" width="1" /><br />
<br />
<span style="font-size: large;"><b>・ソースコード</b></span><br />
test.cpp<br />
<pre class="c++" name="code">#include <iostream>
using namespace std;
int main()
{
cout << "Content-Type: text/html" << endl << endl;
cout << "<html>" << endl;
cout << "<head><title>test</title></head>" << endl;
cout << "<body>Hello world!</body>" << endl;
cout << "</html>" << endl;
}
</pre><br />
ソースコードで行っていることは、最初に<br />
<pre class="c++" name="code">cout << "Content-Type: text/html" << endl << endl;</pre>で、HTTPヘッダを出力します。(これを記述しないと、500-Internal Server Errorになります。)<br />
<br />
後はHTMLを出力しています。<br />
<br />
<br />
<span style="font-size: large;"><b>・コンパイル</b></span><br />
<pre>g++ -o test.cgi test.cpp </pre>test.cppからcgi: test.cgiを作成します。<br />
<br />
<br />
<span style="font-size: large;"><b>・apacheの設定</b></span><br />
/etc/httpd/conf/httpd.confを開き<br />
<pre><Directory "/cgiを置くディレクトリ">
AllowOverride None Options None ExecCGI
Order allow,deny Allow from all
</Directory></pre>を追加。<br />
<br />
<pre>#AddHandler cgi-script .cgi</pre>のコメントを外し、apacheを再起動。<br />
(コメントを外さないと、ブラウザでアクセスした時にcgiが実行されずにダウンロードダイアログが表示されます。)<br />
<br />
ブラウザからcgiにアクセスし、[Hello world!]と表示されれば成功です。Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-3512099112218523262.post-86526037790296866512011-05-06T22:11:00.003+09:002011-05-07T00:15:34.044+09:00さくらVPSでWordPressをインストールさくらVPS CentOS5.5にWordPressをインストールした時のメモです。<br />
<a name='more'></a><br />
<a href="http://px.a8.net/svt/ejp?a8mat=1TQA91+N7Y56+D8Y+BXB8X" target="_blank"><br />
<img alt="" border="0" height="60" src="http://www25.a8.net/svt/bgt?aid=110401381039&wid=002&eno=01&mid=s00000001717002003000&mc=1" width="468" /></a><br />
<img alt="" border="0" height="1" src="http://www13.a8.net/0.gif?a8mat=1TQA91+N7Y56+D8Y+BXB8X" width="1" /><br />
<br />
<span style="font-size: large;"><b>1.WordPressをダウンロード</b></span><br />
<a href="http://ja.wordpress.org/">こちら</a>からWordPress日本語版をダウンロードし、解凍<br />
<br />
<b><span style="font-size: large;">2.MySQLにWordPress用のデータベースとユーザを作成</span></b><br />
<a href="http://programing-memo.blogspot.com/2011/05/wordpressmysql.html">別記事のこちら</a>を参考にしてください。<br />
<br />
<b><span style="font-size: large;">3.WordPressの設定</span></b><br />
解凍したディレクトリにある「wp-config-sample.php」をエディタで開き、<br />
<pre>// ** MySQL 設定 - こちらの情報はホスティング先から入手してください。 ** //
/** WordPress のためのデータベース名 */
define('DB_NAME', 'database_name_here');
/** MySQL データベースのユーザー名 */
define('DB_USER', 'username_here');
/** MySQL データベースのパスワード */
define('DB_PASSWORD', 'password_here');
</pre>を2で作成したデータベース・ユーザ名で書き換え、wp-config.phpとして保存<br />
<br />
保存したら、ブラウザからWordPressのアドレスを入力すると、設定画面が表示されます。<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgRrTgTMeaXpCG7k8VM-Hz70vBb288pqbHcBNvVs7ZjGgkZ538W0bLqugA2QGi3h_WHQFEGpNSdbLdEi8bZ1s74oTlZDtXzbcN-ogtQFGGBWUOMtbU1rJIYFuJIt8IYHPlonyYi9ApUVFTi/s1600/wordpress_install.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="150" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgRrTgTMeaXpCG7k8VM-Hz70vBb288pqbHcBNvVs7ZjGgkZ538W0bLqugA2QGi3h_WHQFEGpNSdbLdEi8bZ1s74oTlZDtXzbcN-ogtQFGGBWUOMtbU1rJIYFuJIt8IYHPlonyYi9ApUVFTi/s320/wordpress_install.png" width="320" /></a></div>必要情報の[ブログタイトル]・[ユーザ名]・[パスワード]・[メールアドレス]を設定すればインストールは完了です。Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-3512099112218523262.post-48963782368265112052011-05-06T22:11:00.001+09:002011-05-06T22:11:35.281+09:00WordPress用のMySQLの設定さくらVPS CentOS5.5でWordPress用のMySQLのデータベース・ユーザをコマンドラインから作成した時のメモです。<br />
<br />
<a name='more'></a><br />
<a href="http://px.a8.net/svt/ejp?a8mat=1TQA91+N7Y56+D8Y+BXB8X" target="_blank"><br />
<img alt="" border="0" height="60" src="http://www25.a8.net/svt/bgt?aid=110401381039&wid=002&eno=01&mid=s00000001717002003000&mc=1" width="468" /></a><br />
<img alt="" border="0" height="1" src="http://www13.a8.net/0.gif?a8mat=1TQA91+N7Y56+D8Y+BXB8X" width="1" /><br />
<br />
<span style="font-size: large;"><b>・mysqlにログインする</b></span><br />
<br />
<pre>mysql -u root -p
</pre><br />
初期状態では、パスワードが設定されていないので「Enter」キーを入力してmysqlにログインします。<br />
<br />
ログインすると、プロンプトに<br />
<pre>mysql >
</pre>と表示されコマンドを入力できるようになります。<br />
<span style="font-size: large;"><br />
</span><br />
<b><span style="font-size: large;">・パスワードの設定</span></b><br />
rootのパスワードがないのは嫌なので、とりあえず設定します。<br />
<br />
<pre>SET PASSWORD FOR root@localhost=PASSWORD('設定するパスワード');
</pre><br />
パスワードを設定したら、確認の為<br />
<pre>exit
</pre>で一旦mysqlからログアウトし、設定したパスワードで再度ログインします。<br />
<br />
<b><span style="font-size: large;">・WordPress用のデータベースを作成</span></b><br />
<pre>CREATE DATABASE データベース名;
</pre>で新しいデータベースを作成<br />
<br />
<b><span style="font-size: large;">・ユーザを作成</span></b><br />
<pre>grant create,select,insert,update,delete on データベース名.* to 新規ユーザ名@localhost identified by '設定するパスワード';
</pre><br />
※ ここで作成したデータベース・ユーザ名・パスワードは、WordPressのインストール時に必要になります。Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-3512099112218523262.post-40929291203640643832011-04-28T01:04:00.000+09:002011-04-28T01:04:38.629+09:00さくらVPSでC++の開発環境の構築さくらVPSのCentOS 5.5で、C++の開発環境をインストール<br />
<br />
<a name='more'></a><br />
<pre>yum install gcc-c++
</pre><br />
<br />
<a href="http://px.a8.net/svt/ejp?a8mat=1TQA91+N7Y56+D8Y+BXB8X" target="_blank"><br />
<img alt="" border="0" height="60" src="http://www25.a8.net/svt/bgt?aid=110401381039&wid=002&eno=01&mid=s00000001717002003000&mc=1" width="468" /></a><br />
<img alt="" border="0" height="1" src="http://www13.a8.net/0.gif?a8mat=1TQA91+N7Y56+D8Y+BXB8X" width="1" />Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-3512099112218523262.post-74958469189998195662011-04-28T00:57:00.000+09:002011-04-28T00:57:33.931+09:00Ubuntuでc++の開発環境を構築Ubuntu10.10のデフォルトでは、g++が入っていないので以下のコマンドでインストール。<br />
<a name='more'></a><br />
<br />
<pre>sudo apt-get install build-essential
</pre>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-3512099112218523262.post-43878040661374473252011-04-18T00:33:00.000+09:002011-04-18T00:33:07.609+09:00xfce4で付箋・カレンダープラグインの追加Ubuntu10.10でxfce4を使用していますが、付箋をインストールしてなかったので追加。<br />
ついでにカレンダー付きの時計をインストール<br />
<a name='more'></a><br />
<br />
<pre># 付箋
sudo apt-get install xfce4-notes-plugin
# カレンダー付きの時計
sudo apt-get install xfce4-datetime-plugin
</pre><br />
インストールしたらパネル上で[右クリック]ー[新しいアイテムの追加]をします。<br />
<br />
<ul><li>付箋 ー 「Notes ちょっとしたメモに最適です」を追加。</li>
<li>カレンダー付きの時計: 「DateTime シンプルなカレンダーと日付と時間用プラグイン」を追加</li>
</ul><br />
※ プラグインは<a href="http://wiki.fdiary.net/xfce/?XfcePlugins">XFce Wiki</a>のページがまとまっています。Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-3512099112218523262.post-86210318063298224852011-04-15T14:35:00.002+09:002011-04-20T02:17:12.772+09:00ユーザ追加時にpostfixのMailDirを作成Postfixのメールボックス形式がMailDirで、ユーザ追加時に自動的に/home/ユーザ/MailDirを作成する方法<br />
<a name='more'></a><br />
<br />
<pre>mkdir -p /etc/skel/Maildir/new
mkdir -p /etc/skel/Maildir/cur
mkdir -p /etc/skel/Maildir/tmp
chmod -R 700 /etc/skel/Maildir/
</pre><br />
確認<br />
<pre>useradd 新しいユーザ名
passwd 新しいユーザ名
</pre><br />
/home/新しいユーザ名/Maildirが作成されて、ローカルPCからThunderbirdでメールの送受信ができることを確認<br />
<br />
<a href="http://px.a8.net/svt/ejp?a8mat=1TQA91+N7Y56+D8Y+BXB8X" target="_blank"><br />
<img border="0" width="468" height="60" alt="" src="http://www25.a8.net/svt/bgt?aid=110401381039&wid=002&eno=01&mid=s00000001717002003000&mc=1"></a><br />
<img border="0" width="1" height="1" src="http://www13.a8.net/0.gif?a8mat=1TQA91+N7Y56+D8Y+BXB8X" alt="">Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-3512099112218523262.post-71922023089277697992011-04-14T23:50:00.004+09:002011-05-15T03:08:29.126+09:00さくらVPSでDovecotとPostfixの暗号化さくらVPSのCentOS 5.5にDovecotのインストールとPostfixの暗号化をした時のメモ<br />
<a name='more'></a><br />
<a href="http://px.a8.net/svt/ejp?a8mat=1TQA91+N7Y56+D8Y+BXB8X" target="_blank"><br />
<img border="0" width="468" height="60" alt="" src="http://www25.a8.net/svt/bgt?aid=110401381039&wid=002&eno=01&mid=s00000001717002003000&mc=1"></a><br />
<img border="0" width="1" height="1" src="http://www13.a8.net/0.gif?a8mat=1TQA91+N7Y56+D8Y+BXB8X" alt=""><br />
<br />
<b><span style="font-size: large;">・サーバー証明書の作成</span></b><br />
<pre>cd /etc/pki/tls/certs
make mail.pem
</pre>実行すると<br />
<pre>Country Name (2 letter code) [GB]:
</pre>と国をきかれるので[jp]と入力<br />
<br />
<pre>State or Province Name (full name) [Berkshire]:
</pre>ときかれるので、都道府県を入力<br />
<br />
<pre>Locality Name (eg, city) [Newbury]:
</pre>ときかれるので、市区町村を入力<br />
<br />
<pre>Organization Name (eg, company) [My Company Ltd]:
</pre>ときかれるので、サイト名を入力<br />
<br />
<pre>Organizational Unit Name (eg, section) []:
</pre>ときかれるので、Enter<br />
<br />
<pre>Common Name (eg, your name or your server's hostname) []:
</pre>ときかれるので、メールソフトで使用するメールサーバー名を入力<br />
<br />
<pre>Email Address []:
</pre>ときかれるので、管理者のメールアドレスを入力<br />
<br />
<br />
<b><span style="font-size: large;">・Dovecot</span></b><br />
<div style="color: blue;"><b>・インストール</b></div><pre>yum install dovecot
chkconfig dovecot on
</pre><br />
<div style="color: blue;"><b>・/etc/dovecot.confの編集</b></div>・受け付けるプロトコルを指定<br />
<pre>#protocols = imap imaps pop3 pop3s
</pre>のコメントを外す<br />
<br />
・sslを有効にする<br />
<pre>#ssl_disable = no
</pre>のコメントを外す<br />
<br />
・postfixのメールボックス形式と同じにする<br />
<pre>mail_location = maildir:~/Maildir
</pre><br />
<pre>#ssl_cert_file = /etc/pki/dovecot/certs/dovecot.pem
#ssl_key_file = /etc/pki/dovecot/private/dovecot.pem
</pre>を<br />
<pre>ssl_cert_file = /etc/pki/tls/certs/mail.pem
ssl_key_file = /etc/pki/tls/certs/mail.pem
</pre>に変更<br />
<br />
・Dovecotの再起動<br />
<pre>/etc/init.d/dovecot restart
</pre><br />
<br />
<div style="color: blue;"><b>・Postfixの暗号化</b></div>前提条件として、基本的な設定は、<a href="http://programing-memo.blogspot.com/2011/04/vpspostfix.html">こちら</a>で設定済みとします。<br />
<br />
・/etc/postfix/main.cfの設定<br />
ファイルの最後に以下を記述<br />
<pre>smtpd_use_tls = yes
smtpd_tls_cert_file = /etc/pki/tls/certs/mail.pem
smtpd_tls_key_file = /etc/pki/tls/certs/mail.pem
smtpd_tls_session_cache_database = btree:/etc/postfix/smtpd_scache
</pre><br />
・/etc/postfix/master.cfの編集<br />
<pre>#smtps inet n - n - - smtpd
# -o smtpd_tls_wrappermode=yes
# -o smtpd_sasl_auth_enable=yes
# -o smtpd_client_restrictions=permit_sasl_authenticated,reject
</pre>を<br />
<pre>smtps inet n - n - - smtpd
-o smtpd_tls_wrappermode=yes
-o smtpd_sasl_auth_enable=yes
# -o smtpd_client_restrictions=permit_sasl_authenticated,reject
</pre>に変更し、Postfixを再起動<br />
<br />
iptablesの設定で、25,110,465,995のポートを開け、ローカルPCからメールソフトで送受信を確認<br />
<br />
[2011.4.16追記]<br />
ローカルPCから外部のメールへ送信しようとすると<br />
<pre>NOQUEUE: reject: RCPT from XXX[IPアドレス]: <送信先メールアドレス>: Relay access denied; from=<送信元メールアドレス> to=<送信先メールアドレス> proto=ESMTP helo=<[192.168.11.X]>
</pre>と言われ拒否されるので、とりあえず/etc/postfix/main.cfのmynetworkにローカルPCのIPアドレスを追記<br />
<pre>mynetworks = 168.100.189.0/28, 127.0.0.0/8, ローカルPCのIPアドレス
</pre><br />
固定アドレスじゃない時の方法は、調べてません。。Unknownnoreply@blogger.com1tag:blogger.com,1999:blog-3512099112218523262.post-46851910515929253782011-04-14T16:04:00.003+09:002011-04-20T02:19:41.912+09:00さくらVPSでアクセス解析awstatsを使うさくらVPSのCentOS 5.5にアクセス解析awstatsをインストールした時のメモ。<br />
<a name='more'></a><br />
<br />
<div style="color: blue;"><span style="font-size: large;"><b>・awstatsの入手</b></span></div><br />
公式レポジトリには存在しないので、wgetで取得<br />
<pre>wget http://prdownloads.sourceforge.net/awstats/awstats-7.0-1.noarch.rpm
</pre><br />
署名がないので、nogpgcheckオプションをつけてインストール<br />
<pre>yum install --nogpgcheck awstats-7.0-1.noarch.rpm
</pre><br />
<b>・アクセスした国のリストを取得する為、perl-Geo-IPfreeをインストールする</b><br />
<pre>wget http://packages.sw.be/perl-Geo-IPfree/perl-Geo-IPfree-0.2-1.2.el5.rf.noarch.rpm
yum install --nogpgcheck perl-Geo-IPfree-0.2-1.2.el5.rf.noarch.rpm
</pre><br />
<br />
<div style="color: blue;"><span style="font-size: large;"><b>・設定ファイルの作成</b></span></div><pre>/usr/local/awstats/tools/awstats_configure.pl
</pre>を実行すると対話式に設定できます。<br />
<br />
<pre>Do you want to continue setup from this NON standard directory [yN] ?
</pre>と聞かれるので[y]<br />
<br />
<pre>Config file path ('none' to skip web server setup):
</pre>と聞かれるので<br />
<pre>/etc/httpd/conf/httpd.conf
</pre>と入力<br />
<br />
<pre>file (required if first install) [y/N] ?
</pre>と聞かれるので[y]<br />
<br />
<pre>Your web site, virtual server or profile name:
</pre>と聞かれるのでドメインを入力<br />
<br />
これ以降は、全てEnterキーでデフォルトの設定にすると<br />
/etc/awstats/awstats.ドメイン名.confファイルが作成される。<br />
<b><br />
</b><br />
<b><br />
</b><br />
<div style="color: blue;"><span style="font-size: large;"><b>・エディタで作成されたファイルを開き、以下を編集</b></span></div><b>・ログファイルの場所</b><br />
<pre>#LogFile="/var/log/httpd/mylog.log"
LogFile="/var/log/httpd/access_log"
</pre><br />
<b>・言語を日本語に設定</b><br />
<pre>#Lang="auto"
Lang="jp"</pre><br />
<b>・アクセス元の国情報を取得</b><br />
<pre>#LoadPlugin="geoipfree"
LoadPlugin="geoipfree"
</pre><br />
<b>・解析から外すIPアドレスを設定</b><br />
<pre>#SkipHosts=""
SkipHosts="IPアドレス"
</pre><br />
<b>・特定のIPアドレスのみ解析を閲覧できるように設定</b><br />
<pre>#AllowAccessFromWebToFollowingIPAddresses=""
AllowAccessFromWebToFollowingIPAddresses="IPアドレス"
</pre><br />
<br />
<div style="color: blue;"><span style="font-size: large;"><b>・/etc/httpd/conf/httpd.confを編集</b></span></div><pre>Alias /awstatsclasses "/etc/awstats/wwwroot/classes/"
Alias /awstatscss "/etc/awstats/wwwroot/css/"
Alias /awstatsicons "/etc/awstats/wwwroot/icon/"
ScriptAlias /awstats/ "/etc/awstats/wwwroot/cgi-bin/"
</pre>を<br />
<pre>Alias /awstatsclasses "/usr/local/awstats/wwwroot/classes/"
Alias /awstatscss "/usr/local/awstats/wwwroot/css/"
Alias /awstatsicons "/usr/local/awstats/wwwroot/icon/"
ScriptAlias /awstats/ "/usr/local/awstats/wwwroot/cgi-bin/"
</pre><br />
<Directory "/etc/awstats/wwwroot">以下を<br />
<pre><directory "="" awstats="" local="" usr="" wwwroot"="">
Options None
Order deny,allow
Deny from all
Allow from all
</directory>
</pre>と変更し、apacheの再起動<br />
<br />
<pre>/etc/init.d/httpd restart
</pre><br />
<br />
<div style="color: blue;"><span style="font-size: large;"><b>・awstats.plの実行</b></span></div><pre>mkdir /var/lib/awstats
/usr/local/awstats/wwwroot/cgi-bin/awstats.pl -update -config=ドメイン
</pre><br />
<br />
<div style="color: blue;"><span style="font-size: large;"><b>・1時間毎に解析するようにcrontabを設定 </b></span></div><pre>crontab -e
</pre><br />
<pre>00 * * * * /usr/bin/perl /usr/local/awstats/wwwroot/cgi-bin/awstats.pl -config=ドメイン
</pre><br />
<br />
[2011.4.15追記]<br />
cronが動作すると毎回root当てにメールが飛ぶので、<a href="http://mylinux.g.hatena.ne.jp/teraco/20081208/1228696758">ここ</a>を参考にし上記に[ > /dev/null]を追記<br />
<pre>00 * * * * /usr/bin/perl /usr/local/awstats/wwwroot/cgi-bin/awstats.pl -config=ドメイン > /dev/null
</pre><br />
※ デフォルトではviがエディタとして開くので、emacsに変更する為.bashrcに<br />
<pre>export EDITOR=emacs
</pre>を記述<br />
<br />
ブラウザから[http://アドレス/awstats/awstats.pl]でアクセスするとawstatsの解析結果が表示されます。<br />
<a href="http://px.a8.net/svt/ejp?a8mat=1TQA91+N7Y56+D8Y+BXB8X" target="_blank"><br />
<img border="0" width="468" height="60" alt="" src="http://www25.a8.net/svt/bgt?aid=110401381039&wid=002&eno=01&mid=s00000001717002003000&mc=1"></a><br />
<img border="0" width="1" height="1" src="http://www13.a8.net/0.gif?a8mat=1TQA91+N7Y56+D8Y+BXB8X" alt="">Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-3512099112218523262.post-31620321818468746022011-04-13T18:09:00.003+09:002011-05-15T03:09:21.028+09:00OP25B対策さくらVPSの本登録の完了前では、25番ポートからメールを送信できないのでgmail経由でメールを送信した時のメモ<br />
<a name='more'></a><br />
(本登録の申請中も送信できません。)<br />
<br />
<a href="http://px.a8.net/svt/ejp?a8mat=1TQA91+N7Y56+D8Y+BXB8X" target="_blank"><br />
<img border="0" width="468" height="60" alt="" src="http://www25.a8.net/svt/bgt?aid=110401381039&wid=002&eno=01&mid=s00000001717002003000&mc=1"></a><br />
<img border="0" width="1" height="1" src="http://www13.a8.net/0.gif?a8mat=1TQA91+N7Y56+D8Y+BXB8X" alt=""><br />
<br />
/etc/postfix/main.cfに<br />
<pre>relayhost = [smtp.gmail.com]:587
</pre>を記述<br />
<br />
/etc/postfix/main.cfの最後に以下を追加<br />
<pre>smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_sasl_mechanism_filter = plain
smtp_sasl_security_options = noanonymous
smtp_use_tls = yes
</pre><br />
/etc/postfix/にsasl_passwdファイルを作成し以下を記述<br />
<pre>[smtp.gmail.com]:587 gmailのメールアドレス:パスワード
</pre><br />
root以外見れなくする<br />
<pre>chmod 600 /etc/postfix/sasl_passwd
</pre><br />
<pre>postmap /etc/postfix/sasl_passwd
</pre>を実行し、パスワードをDB化する。<br />
<br />
postfixの再起動<br />
<pre>/etc/init.d/postfix restart</pre><br />
ターミナル上でmailコマンドで送信できることを確認。<br />
<br />
※ gmail経由で送信すると、差出人がgmailのアドレスになってしまうのでgmailの[設定] -[アカウントとインポート]-[名前]の[別のアドレスからメッセージを送信]にメールアドレスを追加する必要があります。Unknownnoreply@blogger.com0