<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-3512099112218523262</id><updated>2024-12-19T12:27:36.965+09:00</updated><category term="jQuery"/><category term="さくらVPS"/><category term="CentOS"/><category term="c++"/><category term="ubuntu"/><category term="cgi"/><category term="php"/><category term="form"/><category term="postfix"/><category term="android"/><category term="apache"/><category term="css"/><category term="emacs"/><category term="javascript"/><category term="ssh"/><category term="automake"/><category term="dom"/><category term="mysql"/><category term="nfs"/><category term="unix"/><category term="xfce"/><category term="WordPress"/><category term="awstats"/><category term="dovecot"/><category term="range"/><title type='text'>プログラムのメモ</title><subtitle type='html'>Linuxやプログラムの調べたことをメモしています</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://programing-memo.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3512099112218523262/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://programing-memo.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/3512099112218523262/posts/default?start-index=26&amp;max-results=25&amp;redirect=false'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>55</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-3512099112218523262.post-1443316352088274411</id><published>2012-04-27T17:43:00.000+09:00</published><updated>2012-04-27T17:43:31.854+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="android"/><category scheme="http://www.blogger.com/atom/ns#" term="ubuntu"/><title type='text'>Ubuntuでandroidの実機を認識させる</title><content type='html'>Android端末がDDSでNameが「?????????」となっている時の対応方法&lt;br /&gt;
&lt;img border=&quot;0&quot; height=&quot;60&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjAzwi6Iq1Y-iBXbaZvpo4Tg-20Xe25lZSeeduSLUXvDOZ1V0nu2G_bO9fvdmJmBlS10JlkaV4p4YsYWFJk-WpbPorINK_yhC7VCHU1fh3TP9do7hreR0xr4BxxqGw1fe11XUThB95P8dAJ/s320/dds.png&quot; width=&quot;320&quot; /&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;
(&lt;a href=&quot;http://developer.android.com/intl/ja/guide/developing/device.html&quot;&gt;参考ページ&lt;/a&gt;)&lt;br /&gt;
&lt;br /&gt;
1.実機をusbで接続し、terminalからlsusbでベンダーIDを調べる&lt;br /&gt;
例: この場合「ID 1004:61a3」の「1004」がベンダーIDになります。&lt;br /&gt;
&lt;pre&gt;lsusb

.
.
.
Bus 002 Device 005: ID 1004:61a3 LG Electronics, Inc. 
.
.
&lt;/pre&gt;
&lt;br /&gt;
2.スーパーユーザーで/etc/udev/rules.d/51-android.rulesファイルを開く。&lt;br /&gt;
なければ新規作成&lt;br /&gt;
&lt;pre&gt;sudo emacs /etc/udev/rules.d/51-android.rules
&lt;/pre&gt;
&lt;br /&gt;
3.以下を追加し、保存&lt;br /&gt;
&lt;pre&gt;SUBSYSTEM==&quot;usb&quot;, ATTR{idVendor}==&quot;ベンダーID&quot;, MODE=&quot;0666&quot;, GROUP=&quot;plugdev&quot; 
&lt;/pre&gt;
&lt;br /&gt;
4.パーミッションの変更&lt;br /&gt;
&lt;pre&gt;chmod a+r /etc/udev/rules.d/51-android.rules
&lt;/pre&gt;
&lt;br /&gt;
5.一旦実機をUSBから取り外し、再接続すると認識される</content><link rel='replies' type='application/atom+xml' href='http://programing-memo.blogspot.com/feeds/1443316352088274411/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://programing-memo.blogspot.com/2012/04/ubuntuandroid.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3512099112218523262/posts/default/1443316352088274411'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3512099112218523262/posts/default/1443316352088274411'/><link rel='alternate' type='text/html' href='http://programing-memo.blogspot.com/2012/04/ubuntuandroid.html' title='Ubuntuでandroidの実機を認識させる'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjAzwi6Iq1Y-iBXbaZvpo4Tg-20Xe25lZSeeduSLUXvDOZ1V0nu2G_bO9fvdmJmBlS10JlkaV4p4YsYWFJk-WpbPorINK_yhC7VCHU1fh3TP9do7hreR0xr4BxxqGw1fe11XUThB95P8dAJ/s72-c/dds.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3512099112218523262.post-1866114065795056311</id><published>2012-04-27T17:39:00.000+09:00</published><updated>2012-04-29T13:46:47.491+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="android"/><category scheme="http://www.blogger.com/atom/ns#" term="emacs"/><category scheme="http://www.blogger.com/atom/ns#" term="ubuntu"/><title type='text'>Ubuntu 11.10でemacs+android開発環境の構築2</title><content type='html'>Ubuntu 11.10でemacs+android開発環境構築時のemacsの設定・プロジェクトの作成までのメモ。&lt;br /&gt;
JDK・AndroidSDKのインストール・設定は&lt;a href=&quot;http://programing-memo.blogspot.jp/2012/04/ubuntu-1110emacsandroid.html&quot;&gt;こちら&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;






・android-modeのインストール&lt;/h3&gt;
gitで取得するので、android-modeを置くディレクトリから&lt;br /&gt;
&lt;pre&gt;git clone git://github.com/remvee/android-mode.git
&lt;/pre&gt;
を入力すると、[android-mode]のディレクトリが作成される。&lt;br /&gt;
&lt;br /&gt;
emacsに以下を追加した後にemacsを立ち上げると&lt;br /&gt;
emacsからエミュレータの起動・コンパイル・エミュレータへのインストールなどが行える。&lt;br /&gt;
&lt;pre&gt;;; android-mode
(add-to-list &#39;load-path &quot;~/android-modeへのパス&quot;)
(require &#39;android-mode)
(setq android-mode-sdk-dir &quot;~/android-sdkへのパス&quot;)
&lt;/pre&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;






Androidエミュレータの起動方法&lt;/h3&gt;
emacs上で&lt;br /&gt;
M-x android-start-emulator&lt;br /&gt;
と入力すると「Android Virtual Device」と聞かれるので&lt;br /&gt;
『Create new Android Virtual Device(AVD)』で作成したデバイスの名前を入力すると&lt;br /&gt;
エミュレータが起動する。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;

DDMS(Androidのデバッギングツール)の起動&lt;/h3&gt;
&lt;br /&gt;
emacs上で&lt;br /&gt;
M-x android-start-ddms&lt;br /&gt;
と入力するとDDMSが起動する。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;






TestProjectの作成&lt;/h3&gt;
&lt;br /&gt;
ターミナルから以下のコマンドを入力してTestプロジェクトを作成する。&lt;br /&gt;
&lt;pre&gt;android create project -n Test -t 1 -p Test -k jp.test -a TestActivity
&lt;/pre&gt;
上記の意味は以下のとおり&lt;br /&gt;
android create project &lt;br /&gt;
-n プロジェクト名&lt;br /&gt;
-t 上記で調べたID&lt;br /&gt;
-p 新しいプロジェクトのディレクトリ名&lt;br /&gt;
-k パッケージ名&lt;br /&gt;
-a Activity名&lt;br /&gt;
&lt;br /&gt;
例：&lt;br /&gt;
android create project -n HelloWorld -t 1 -p HelloWorld -k jp.test -a HelloWorldActivity&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
emacsで作成したプロジェクトのディレクトリに移動して、&lt;br /&gt;
&lt;pre&gt;M-x android-ant
&lt;/pre&gt;
と入力すると、「Task:」と表示されるので&lt;br /&gt;
&lt;pre&gt;debug install
&lt;/pre&gt;
と入力するとエミュレータに『TestActivity』がインストールされる。</content><link rel='replies' type='application/atom+xml' href='http://programing-memo.blogspot.com/feeds/1866114065795056311/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://programing-memo.blogspot.com/2012/02/ubuntu-1110emacsandroid2.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3512099112218523262/posts/default/1866114065795056311'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3512099112218523262/posts/default/1866114065795056311'/><link rel='alternate' type='text/html' href='http://programing-memo.blogspot.com/2012/02/ubuntu-1110emacsandroid2.html' title='Ubuntu 11.10でemacs+android開発環境の構築2'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3512099112218523262.post-7764219677659777376</id><published>2012-04-27T17:38:00.000+09:00</published><updated>2012-04-28T03:19:14.256+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="android"/><category scheme="http://www.blogger.com/atom/ns#" term="emacs"/><category scheme="http://www.blogger.com/atom/ns#" term="ubuntu"/><title type='text'>Ubuntu 11.10でemacs+android開発環境の構築１</title><content type='html'>Ubuntu 11.10でemacs+android開発環境構築時の&lt;br /&gt;
JDKとAndroidSDKのインストール・設定までのメモ。&lt;br /&gt;
emacsの設定はこちら&lt;br /&gt;
&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;



1.Javaとantのインストール&lt;/h3&gt;
&lt;pre&gt;sudo apt-get install openjdk-6-jdk ant
&lt;/pre&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;



2.Android SDKのインストール&lt;/h3&gt;
&lt;a href=&quot;http://developer.android.com/sdk/index.html&quot;&gt;http://developer.android.com/sdk/index.html&lt;/a&gt;からSDKをダウンロードし、解凍&lt;br /&gt;
&lt;br /&gt;
./~bashrcにPATHを追加&lt;br /&gt;
PATH=$PATH:~/上記で解凍したパス/tools&lt;br /&gt;
&lt;br /&gt;
パスを反映させる&lt;br /&gt;
&lt;pre&gt;source .bashrc
&lt;/pre&gt;
&lt;br /&gt;
3.Android SDK Managerの設定&lt;br /&gt;
&lt;br /&gt;
Android SDK Managerをコマンドラインから開く&lt;br /&gt;
&lt;pre&gt;androide
&lt;/pre&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhbOzvn5v-sS4FmDssdvm84M_GAINRsDr_rKdq5zERkV0zwAjf0cgXJTEY46BnRYi8I2xPTb3-HYSx8dxgrMDNr8eMazeWXVJzpgu7QM4NzZtOjzYgPfbsw0SjMzl_okqCWI7loLU_3tM2D/s1600/AndroidSDKManager.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;211&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhbOzvn5v-sS4FmDssdvm84M_GAINRsDr_rKdq5zERkV0zwAjf0cgXJTEY46BnRYi8I2xPTb3-HYSx8dxgrMDNr8eMazeWXVJzpgu7QM4NzZtOjzYgPfbsw0SjMzl_okqCWI7loLU_3tM2D/s320/AndroidSDKManager.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
[tools]とインストールするAndroid APIをチェックしてインストールする。&lt;br /&gt;
（かなり時間がかかります。）&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Androidエミュレータ用のデバイスを作成する為、&lt;br /&gt;
[Android SDK Manager]-[tools]-[Manage AVDs...]を選択し&lt;br /&gt;
『Android Virtual Device Manager』を開き、[New...]をクリックする&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEibTuwKRGwuLF8RW8pnd1W-klfNhqrQuX8ic1McSpHJ7j385sS0V91WMmQ7D480bSJr9nZpoetRbg1sG2rExGbNo3bVawytqTJOC6JwJmIbPWyrsjsGepz79Hgm-PftI_4DDqrPfmyG7Twk/s1600/AndroidVirtualDeviceManager.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;220&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEibTuwKRGwuLF8RW8pnd1W-klfNhqrQuX8ic1McSpHJ7j385sS0V91WMmQ7D480bSJr9nZpoetRbg1sG2rExGbNo3bVawytqTJOC6JwJmIbPWyrsjsGepz79Hgm-PftI_4DDqrPfmyG7Twk/s320/AndroidVirtualDeviceManager.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
『Create new Android Virtual Device(AVD)』の以下の項目を入力し、&lt;br /&gt;
[Create AVD]をクリックしエミュレータ用のデバイスを作成する。&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjWZRHuOjKqzQcK9bGWN8cG3uKtbkYaO1aa9HPGu9NoU6IqkT9UUrR58oGETPL-oxxc_tHp8y9KeM2jPNKUhyphenhyphen9i-9h45LNMmJI_LIJBSwE927ecmlz5PPrV-V9qgK9icqZDMc2nwIIDUVP9/s1600/CreateNewAVD.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjWZRHuOjKqzQcK9bGWN8cG3uKtbkYaO1aa9HPGu9NoU6IqkT9UUrR58oGETPL-oxxc_tHp8y9KeM2jPNKUhyphenhyphen9i-9h45LNMmJI_LIJBSwE927ecmlz5PPrV-V9qgK9icqZDMc2nwIIDUVP9/s320/CreateNewAVD.png&quot; width=&quot;274&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
・Name   : 任意の名前&lt;br /&gt;
・Target : Androidのヴァージョンを選択&lt;br /&gt;
・SD Card: なくても可&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
作成したら『Android SDK Manager』を閉じて、&lt;a href=&quot;http://programing-memo.blogspot.jp/2012/02/ubuntu-1110emacsandroid2.html&quot;&gt;emacsの設定&lt;/a&gt;をする。</content><link rel='replies' type='application/atom+xml' href='http://programing-memo.blogspot.com/feeds/7764219677659777376/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://programing-memo.blogspot.com/2012/04/ubuntu-1110emacsandroid.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3512099112218523262/posts/default/7764219677659777376'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3512099112218523262/posts/default/7764219677659777376'/><link rel='alternate' type='text/html' href='http://programing-memo.blogspot.com/2012/04/ubuntu-1110emacsandroid.html' title='Ubuntu 11.10でemacs+android開発環境の構築１'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhbOzvn5v-sS4FmDssdvm84M_GAINRsDr_rKdq5zERkV0zwAjf0cgXJTEY46BnRYi8I2xPTb3-HYSx8dxgrMDNr8eMazeWXVJzpgu7QM4NzZtOjzYgPfbsw0SjMzl_okqCWI7loLU_3tM2D/s72-c/AndroidSDKManager.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3512099112218523262.post-1135583578089245877</id><published>2012-03-09T15:46:00.002+09:00</published><updated>2012-03-09T15:49:31.455+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="ubuntu"/><title type='text'>Ubuntu11.10でgitを設定した時のメモ</title><content type='html'>Ubuntu11.10でgitのインストール・エディタの設定・P4Megrgeの設定をした時のメモ&lt;br /&gt;
&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;h4&gt;・インストール&lt;/h4&gt;&lt;pre&gt;sudo apt-get install git-core
&lt;/pre&gt;&lt;br /&gt;
&lt;h4&gt;・ユーザー名とメールアドレスの設定&lt;/h4&gt;&lt;pre&gt;git config --global user.name &quot;ユーザー名&quot;
git config --global user.email メールアドレス
&lt;/pre&gt;&lt;br /&gt;
&lt;h4&gt;・editorの設定&lt;/h4&gt;~/.bashrcに&lt;br /&gt;
&lt;pre&gt;export EDITOR=emacs
&lt;/pre&gt;もしくは、ターミナルから&lt;br /&gt;
&lt;pre&gt;git config --global core.editor &quot;emacs&quot;
&lt;/pre&gt;と入力&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;・marge/diffをGUIツール(P4Merge)で表示する設定&lt;/h4&gt;&lt;br /&gt;
1.&lt;a href=&quot;http://www.perforce.com/downloads/complete_list&quot;&gt;ここから&lt;/a&gt;[User Essentials]-[Linux]をダウンロードし、解凍する。&lt;br /&gt;
&lt;br /&gt;
2.スーパーユーザで/usr/local/bin/extMergeファイルを作成&lt;br /&gt;
&lt;pre&gt;sudo emacs /usr/local/bin/extMerge
&lt;/pre&gt;以下を記述&lt;br /&gt;
&lt;pre&gt;#!/bin/sh
[1で解凍したディレクトリ]/bin/p4merge $*
&lt;/pre&gt;&lt;br /&gt;
3. スーパーユーザで/usr/local/bin/extDiffファイルを作成&lt;br /&gt;
&lt;pre&gt;sudo emacs /usr/local/bin/extDiff
&lt;/pre&gt;以下を記述&lt;br /&gt;
&lt;pre&gt;#!/bin/sh
[ $# -eq 7 ] &amp;&amp; /usr/local/bin/extMerge &quot;$2&quot; &quot;$5&quot;
&lt;/pre&gt;&lt;br /&gt;
4. 2と3で作成したファイルに実行属性を追加&lt;br /&gt;
&lt;pre&gt;sudo chmod +x /usr/local/bin/extMerge
sudo chmod +x /usr/local/bin/extDiff
&lt;/pre&gt;&lt;br /&gt;
5.~/.gitconfigに以下を追記&lt;br /&gt;
&lt;pre&gt;[merge]
  tool = extMerge
[mergetool &quot;extMerge&quot;]
  cmd = extMerge &quot;$BASE&quot; &quot;$LOCAL&quot; &quot;$REMOTE&quot; &quot;$MERGED&quot;
  trustExitCode = false
[diff]
  external = extDiff
&lt;/pre&gt;</content><link rel='replies' type='application/atom+xml' href='http://programing-memo.blogspot.com/feeds/1135583578089245877/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://programing-memo.blogspot.com/2012/03/ubuntu1110git.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3512099112218523262/posts/default/1135583578089245877'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3512099112218523262/posts/default/1135583578089245877'/><link rel='alternate' type='text/html' href='http://programing-memo.blogspot.com/2012/03/ubuntu1110git.html' title='Ubuntu11.10でgitを設定した時のメモ'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3512099112218523262.post-6226373997834868479</id><published>2011-12-07T18:03:00.001+09:00</published><updated>2011-12-07T18:30:10.338+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="xfce"/><title type='text'>xfceでcapsLockとctrlキーを入れ替える</title><content type='html'>xfce4.8で&lt;a href=&quot;http://serverfault.com/questions/10437/how-do-you-swap-the-caps-lock-to-control-in-xfce&quot;&gt;こちら&lt;/a&gt;を見ながらcapsLockとctrlキーを入れ替えた時のメモです。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
1.[設定]-[設定マネージャ]を開く&lt;br /&gt;
2.[セッションと起動]の[自動開始アプリケーション]タブを選択&lt;br /&gt;
3.[追加]ボタンをクリックし、『アプリケーションの追加』ダイアログを開く&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjlZ332GjuKmWC3a7JzIDAZlzCh8D7IYOh07yHLIQ4Q1_v187Ig1xIyhCVrlKaaTptRq2PzuJmvCBPcbELHdeBS2DP9ddCDUFzE-8PvjWDORVzunUKCj4VrjR9SGxzIMgwBVJWA1rXijOHU/s1600/xfce_autostart.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjlZ332GjuKmWC3a7JzIDAZlzCh8D7IYOh07yHLIQ4Q1_v187Ig1xIyhCVrlKaaTptRq2PzuJmvCBPcbELHdeBS2DP9ddCDUFzE-8PvjWDORVzunUKCj4VrjR9SGxzIMgwBVJWA1rXijOHU/s1600/xfce_autostart.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
4.名前と説明を適当に入力し、コマンドに&lt;br /&gt;
&lt;pre&gt;/usr/bin/setxkbmap -option &quot;ctrl:nocaps&quot;
&lt;/pre&gt;と入力し、[OK]をクリックする&lt;br /&gt;
&lt;br /&gt;
5.一旦ログアウトし、再度ログインするとcapsLockとctrlキーが入れ替わる</content><link rel='replies' type='application/atom+xml' href='http://programing-memo.blogspot.com/feeds/6226373997834868479/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://programing-memo.blogspot.com/2011/12/xfcecspdlockctrl.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3512099112218523262/posts/default/6226373997834868479'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3512099112218523262/posts/default/6226373997834868479'/><link rel='alternate' type='text/html' href='http://programing-memo.blogspot.com/2011/12/xfcecspdlockctrl.html' title='xfceでcapsLockとctrlキーを入れ替える'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjlZ332GjuKmWC3a7JzIDAZlzCh8D7IYOh07yHLIQ4Q1_v187Ig1xIyhCVrlKaaTptRq2PzuJmvCBPcbELHdeBS2DP9ddCDUFzE-8PvjWDORVzunUKCj4VrjR9SGxzIMgwBVJWA1rXijOHU/s72-c/xfce_autostart.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3512099112218523262.post-6140895798926945795</id><published>2011-09-19T16:32:00.000+09:00</published><updated>2011-09-19T16:32:43.733+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="jQuery"/><title type='text'>jQuery CSSの値を削除</title><content type='html'>要素に指定したcssの値を削除する方法&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;javascript&quot; name=&quot;code&quot;&gt;$( &quot;#test&quot; ).css( &quot;color&quot;, &quot;red&quot; ); // 文字色を赤に設定

$( &quot;#test&quot; ).css( &quot;color&quot;, &quot;&quot; ); // 文字色の指定を削除
&lt;/pre&gt;</content><link rel='replies' type='application/atom+xml' href='http://programing-memo.blogspot.com/feeds/6140895798926945795/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://programing-memo.blogspot.com/2011/09/jquery-css.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3512099112218523262/posts/default/6140895798926945795'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3512099112218523262/posts/default/6140895798926945795'/><link rel='alternate' type='text/html' href='http://programing-memo.blogspot.com/2011/09/jquery-css.html' title='jQuery CSSの値を削除'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3512099112218523262.post-8913584624302348276</id><published>2011-07-21T22:33:00.000+09:00</published><updated>2011-07-21T22:33:49.450+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="css"/><title type='text'>Firefoxで壊れた画像のアイコンを表示</title><content type='html'>Firefoxでは、壊れた画像は何も表示されないので&lt;br /&gt;
壊れたアイコン&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEirVrczcUW4bbPHyG7UcRhiUGCBHcTiDxipTI8negMNiRMo0t3g2piZz_XaFwuiAytdXHP4Vj07Qpor7U2dyiaFgkGVEqBbyGTSOXHN29r6989WCDkL30We6uh9pBfW7h47ca-h5KLMEBKL/s1600/broken.jpg&quot; /&gt;をCSSで表示する方法&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://blog.doxmart.com/2009/08/11/a-quick-tip-on-enabling-broken-image-placeholders-in-firefox-3-and-beyond/&quot;&gt;参考にしたページ&lt;/a&gt;&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;pre class=&quot;css&quot; name=&quot;code&quot;&gt;img:-moz-broken{
    -moz-force-broken-image-icon:1;
    width:24px;
    height:24px;
  }
&lt;/pre&gt;</content><link rel='replies' type='application/atom+xml' href='http://programing-memo.blogspot.com/feeds/8913584624302348276/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://programing-memo.blogspot.com/2011/07/firefox.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3512099112218523262/posts/default/8913584624302348276'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3512099112218523262/posts/default/8913584624302348276'/><link rel='alternate' type='text/html' href='http://programing-memo.blogspot.com/2011/07/firefox.html' title='Firefoxで壊れた画像のアイコンを表示'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEirVrczcUW4bbPHyG7UcRhiUGCBHcTiDxipTI8negMNiRMo0t3g2piZz_XaFwuiAytdXHP4Vj07Qpor7U2dyiaFgkGVEqBbyGTSOXHN29r6989WCDkL30We6uh9pBfW7h47ca-h5KLMEBKL/s72-c/broken.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3512099112218523262.post-2384383862544609689</id><published>2011-06-25T17:44:00.000+09:00</published><updated>2011-06-25T17:44:33.934+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="dom"/><category scheme="http://www.blogger.com/atom/ns#" term="javascript"/><title type='text'>Javascript　DOMのノードプロパティ</title><content type='html'>ノードから他のノードを取得するプロパティ&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: x-small;&quot;&gt;リンク先はGecko DOM リファレンスです。&lt;/span&gt;&lt;br /&gt;
&lt;table border=&quot;0&quot; cellpadding=&quot;5&quot; cellspacing=&quot;1&quot; style=&quot;background-color: #404040;&quot;&gt;&lt;caption&gt; &lt;/caption&gt;   &lt;tbody&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; style=&quot;background-color: #525252; text-align: center;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;color: white;&quot;&gt;&lt;b&gt;親子ノード&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;background-color: #ededed;&quot;&gt;&lt;b&gt;&lt;a href=&quot;https://developer.mozilla.org/ja/DOM/element.childNodes&quot;&gt;childNodes&lt;/a&gt;&lt;/b&gt;&lt;/td&gt;    &lt;td style=&quot;background-color: #ededed;&quot;&gt;子ノードの配列&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;background-color: #cccccc;&quot;&gt;&lt;b&gt;&lt;a href=&quot;https://developer.mozilla.org/ja/DOM/element.firstChild&quot;&gt;firstChild&lt;/a&gt;&lt;/b&gt;&lt;/td&gt;    &lt;td style=&quot;background-color: #cccccc;&quot;&gt;最初の子ノード。なければnull&lt;/td&gt;   &lt;/tr&gt;
&lt;tr&gt;    &lt;td style=&quot;background-color: #ededed;&quot;&gt;&lt;b&gt;&lt;a href=&quot;https://developer.mozilla.org/ja/DOM/element.lastChild&quot;&gt;lastChild&lt;/a&gt;&lt;/b&gt;&lt;/td&gt;    &lt;td style=&quot;background-color: #ededed;&quot;&gt;最後の子ノード。なければnull&lt;/td&gt;   &lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;background-color: #cccccc;&quot;&gt;&lt;b&gt;&lt;a href=&quot;https://developer.mozilla.org/ja/DOM/element.parentNode&quot;&gt;parentNode&lt;/a&gt;&lt;/b&gt;&lt;/td&gt;    &lt;td style=&quot;background-color: #cccccc;&quot;&gt;親ノード&lt;/td&gt;   &lt;/tr&gt;
&lt;tr&gt;    &lt;td colspan=&quot;2&quot; style=&quot;background-color: #525252; text-align: center;&quot;&gt;&lt;b&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;color: white;&quot;&gt;兄弟ノード&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;   &lt;/tr&gt;
&lt;tr&gt;    &lt;td style=&quot;background-color: #ededed;&quot;&gt;&lt;b&gt;&lt;a href=&quot;https://developer.mozilla.org/ja/DOM/element.previousSibling&quot;&gt;previousSibling&lt;/a&gt;&lt;/b&gt;&lt;/td&gt;    &lt;td style=&quot;background-color: #ededed;&quot;&gt;前のノード。なければnull&lt;/td&gt;   &lt;/tr&gt;
&lt;tr&gt;    &lt;td style=&quot;background-color: #cccccc;&quot;&gt;&lt;b&gt;&lt;a href=&quot;https://developer.mozilla.org/ja/DOM/element.nextSibling&quot;&gt;nextSibling&lt;/a&gt;&lt;/b&gt;&lt;/td&gt;    &lt;td style=&quot;background-color: #cccccc;&quot;&gt;終了ノードとオフセットを設定&lt;/td&gt;   &lt;/tr&gt;
&lt;/tbody&gt; &lt;/table&gt;&lt;br /&gt;
&lt;br /&gt;
ノードの情報を取得するプロパティ&lt;br /&gt;
&lt;table border=&quot;0&quot; cellpadding=&quot;5&quot; cellspacing=&quot;1&quot; style=&quot;background-color: #404040;&quot;&gt;&lt;caption&gt; &lt;/caption&gt;   &lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;background-color: #ededed;&quot;&gt;&lt;b&gt;&lt;a href=&quot;https://developer.mozilla.org/ja/DOM/element.nodeType&quot;&gt;nodeType&lt;/a&gt;&lt;/b&gt;&lt;/td&gt;    &lt;td style=&quot;background-color: #ededed;&quot;&gt;ノードの種類の数値&lt;br /&gt;
divなどの要素は1、テキストノードは3&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;background-color: #cccccc;&quot;&gt;&lt;b&gt;&lt;a href=&quot;https://developer.mozilla.org/ja/DOM/element.nodename&quot;&gt;nodeName&lt;/a&gt;&lt;/b&gt;&lt;/td&gt;    &lt;td style=&quot;background-color: #cccccc;&quot;&gt;ノードの名前&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;background-color: #ededed;&quot;&gt;&lt;b&gt;&lt;a href=&quot;https://developer.mozilla.org/En/DOM/Node.nodeValue&quot;&gt;nodeValue&lt;/a&gt;&lt;/b&gt;&lt;br /&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: x-small;&quot;&gt;(英語)&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;    &lt;td style=&quot;background-color: #ededed;&quot;&gt;ノードの値。&lt;br /&gt;
テキストノードならば文字列、&lt;br /&gt;
divなどの要素はnull&lt;/td&gt;   &lt;/tr&gt;
&lt;/tbody&gt; &lt;/table&gt;</content><link rel='replies' type='application/atom+xml' href='http://programing-memo.blogspot.com/feeds/2384383862544609689/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://programing-memo.blogspot.com/2011/06/javascriptdom.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3512099112218523262/posts/default/2384383862544609689'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3512099112218523262/posts/default/2384383862544609689'/><link rel='alternate' type='text/html' href='http://programing-memo.blogspot.com/2011/06/javascriptdom.html' title='Javascript　DOMのノードプロパティ'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3512099112218523262.post-6497526127394773746</id><published>2011-05-17T17:53:00.002+09:00</published><updated>2011-05-17T17:57:52.899+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="c++"/><category scheme="http://www.blogger.com/atom/ns#" term="cgi"/><title type='text'>c++でcgi ー ファイルのアップロード</title><content type='html'>C++でファイルのアップロードを受け取り、ファイルの中身をHTMLで表示するプログラムです。&lt;br /&gt;
&lt;br /&gt;
参考にしたページ&lt;br /&gt;
&lt;a href=&quot;http://www-cms.phys.s.u-tokyo.ac.jp/%7Enaoki/CIPINTRO/CCGI/multdisp.html&quot;&gt;http://www-cms.phys.s.u-tokyo.ac.jp/~naoki/CIPINTRO/CCGI/multdisp.html&lt;/a&gt;&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;color: blue;&quot;&gt;&lt;span style=&quot;font-size: large;&quot;&gt;&lt;b&gt;・HTML&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;pre class=&quot;html&quot; name=&quot;code&quot;&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
  &amp;lt;head&amp;gt;複数ファイルのアップロード
 &amp;lt;meta charset=&quot;utf-8&quot;&amp;gt;
  &amp;lt;/head&amp;gt;

  &amp;lt;body&amp;gt;
 &amp;lt;form action=&quot;upload.fcgi&quot; method=&quot;POST&quot; enctype=&quot;multipart/form-data&quot;&amp;gt;
   &amp;lt;input type=&quot;file&quot; name=&quot;files&quot; multiple&amp;gt;
   &amp;lt;input type=&quot;submit&quot; value=&quot;submit&quot;&amp;gt;
 &amp;lt;/form&amp;gt;
  &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/pre&gt;&lt;br /&gt;
&lt;div style=&quot;color: blue;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: large;&quot;&gt;・C++ソースコードの説明&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div style=&quot;color: blue;&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;b&gt;・12～85行目：Requestがアップロードかを判定&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
環境変数&lt;b&gt;[CONTENT_TYPE]&lt;/b&gt;の文字列から&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;[multipart/form-data]が含まれているか&lt;/li&gt;
&lt;li&gt;[boundary]の文字列を取得できるか&lt;/li&gt;
&lt;/ul&gt;を調べてRequestがアップロードかを判定しています。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
例としてGoogle ChromeでアップロードをするとCONTENT_TYPEは、以下のようになります。&lt;br /&gt;
&lt;span style=&quot;font-size: small;&quot;&gt;(&lt;b&gt;WebKitFormBoundary7uUEXkjnVYxPBKMI&lt;/b&gt;は、ユニークな値がはいります。)&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;multipart/form-data; boundary=----WebKitFormBoundary7uUEXkjnVYxPBKMI, referer: 呼び出し元のURL
&lt;/pre&gt;&lt;br /&gt;
boundaryの文字列は、アップロードされた各ファイルの本体と、フッタの区切りに使うので覚えておきます。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;b&gt;・90～123行目:ファイルの中身まで標準入力を進める&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
アップロードされたファイルは、標準入力stdinから以下の順で取得できます。&lt;br /&gt;
(複数ファイルがアップロードされた時は、この順に繰り返されます。) &lt;br /&gt;
&lt;ol&gt;&lt;li&gt;ヘッダ&lt;/li&gt;
&lt;li&gt; ファイル本体&lt;/li&gt;
&lt;li&gt;フッタ&lt;/li&gt;
&lt;/ol&gt;&lt;br /&gt;
例えば2つのファイルをアップロードすると、以下のように情報が送られてきます。 &lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;------WebKitFormBoundary7uUEXkjnVYxPBKMI[\r][\n]
Content-Disposition: form-data; name=&quot;files&quot;; filename=&quot;ファイル1&quot;[\r][\n]
Content-Type: application/octet-stream[\r][\n]
[\r][\n]
ファイル1の中身
[\r][\n]
------WebKitFormBoundary7uUEXkjnVYxPBKMI[\r][\n]
Content-Disposition: form-data; name=&quot;files&quot;; filename=&quot;ファイル2&quot;[\r][\n]
Content-Type: application/octet-stream[\r][\n]
[\r][\n]
ファイル2の中身
[\r][\n]&amp;nbsp;&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
ヘッダの構成は以下のようになっています。&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;&amp;nbsp;&lt;b&gt;[--]&lt;/b&gt;+&lt;b&gt;[CONTENT_TYPEのboundary]&lt;/b&gt;で指定されるユニークな文字列&lt;b&gt;[\r][\n]&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&amp;nbsp;Content-Disposition&lt;b&gt;[\r][\n]&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&amp;nbsp;Content-Type&lt;b&gt;[\r][\n]&lt;/b&gt;&lt;b&gt;[\r][\n]&lt;/b&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;br /&gt;
&lt;b&gt;[\r][\n][\r][\n]&lt;/b&gt;の後からがファイル本体になるので、そこまでスキップしています。&lt;br /&gt;
&lt;br /&gt;
送信されたフォームのフィールド名やファイル名などを取得する際には、2の[Content-Disposition]から取得する必要がありますが、本記事では行っていません。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;b&gt;・136～174行目&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
ファイル本体とヘッダをstdinから取得し、HTMLとし標準出力に表示しています。&lt;br /&gt;
また、stdinから文字を取得する際に[boundary]の文字列と比較し、ヘッダは表示せずに終了します。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;color: blue;&quot;&gt;&lt;span style=&quot;font-size: large;&quot;&gt;&lt;b&gt;・C++&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;
&lt;pre class=&quot;c++&quot; name=&quot;code&quot;&gt;#include &amp;lt;string&amp;gt;
#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;iostream&amp;gt;
#include &amp;lt;stdlib.h&amp;gt; // getenv

const int BOUNDARY_LENGTH = 8; // boundaryの文字数
using namespace std;

// ========================================================
//   Requestがアップロードか調べ、boundaryの文字列を返します。
// ========================================================
bool isUploadRequest( std::string &amp;amp; boundaryStr )
{
 /*
   環境変数[REQUEST_METHOD]に送信されたメソッド[GET/POST]が入ります。
   アップロードは、[POST]で送信されてきます。
 */
 std::string request_method = getenv( &quot;REQUEST_METHOD&quot; );
 if ( request_method != &quot;POST&quot; ) 
 {
  fprintf( stderr, &quot;REQUEST_METHOD isn&#39;t POST.\n&quot; );
  return false;
 }

 /*
   Uploadでは、環境変数[CONTENT_TYPE]に[multipart/form-data]が含まれています。
 */
 std::string content_type = getenv( &quot;CONTENT_TYPE&quot; );
 if ( content_type.empty() || 
   content_type.find( &quot;multipart/form-data&quot; ) == std::string::npos )
 {
  fprintf( stderr, &quot;CONTENT_TYPE is error.\n&quot; );
  return false;
 }

 fprintf( stderr, &quot;%s\n&quot;, content_type.c_str());

 /*
   boundaryを取得します。
  */
 std::string::size_type index = content_type.find( &quot;boundary&quot; );
 if ( index == std::string::npos )
 {
  return false;
 }

 // boundaryの文字列より後に[=]があるかを調べます。
 index = content_type.find( &quot;=&quot;, index + BOUNDARY_LENGTH );
 if ( index == std::string::npos )
 {
  return false;
 }

 // [=]の後からboundaryを取得します。
 index++;
 if ( index &amp;gt;= content_type.size())
 {
  return false;
 }

 std::string::size_type end_index = std::string::npos;
 if ( content_type[ index ] == &#39;&quot;&#39; )
 {
  // [boundary=&quot;XXXXXX&quot;]形式は、[&quot;]内の文字列を取得します。
  end_index = content_type.find( &#39;&quot;&#39;, index + 1 );
  if ( end_index == std::string::npos )
  {
   return false;
  }
  index++;
 }
 else
 {
  // [boundary=XXXXX, XXXX=XXXX]形式は、[,]までの文字列を取得します。
  end_index = content_type.find( &#39;,&#39;, index + 1 );
 }

 /*
   ファイル本体とフッタの区切り文字列を作成します。
   区切りの文字列は、[\r\n--]+[boundaryの文字列]の形式です。
 */
 boundaryStr = &quot;\r\n--&quot;;
 boundaryStr += content_type.substr( index, end_index - index );
 return true;
}

// ========================================================
// ファイルの中身の直前には、[\r\n\r\n]があるので、そこまで進めます。 
// ========================================================
bool skipHeader()
{
 char buf;
 while ( 1 )
 {
  if ( fread( &amp;amp;buf, 1, 1, stdin ) != 1 )
   return false;

  if ( buf != &#39;\r&#39; )
   continue;

  if ( fread( &amp;amp;buf, 1, 1, stdin ) != 1 )
   return false;
  
  if ( buf != &#39;\n&#39; )
   continue;

  if ( fread( &amp;amp;buf, 1, 1, stdin ) != 1 )
   return false;
  
  if ( buf != &#39;\r&#39; )
   continue;

  if ( fread( &amp;amp;buf, 1, 1, stdin ) != 1 )
   return false;
  
  if ( buf == &#39;\n&#39; )
  {
   // [\r\n\r\n]が見つかったので、ループを抜けます。
   return true;
  }
 }
 return false;
}
 
// ========================================================
// アップロードされたファイルの中身を表示します。
// ========================================================
bool printFile( const std::string &amp;amp; boundaryStr )
{
 // ヘッダ部分をスキップし、ファイルの中身まで進めます。
 if ( !skipHeader())
 {
  return false;
 }

 // ファイルの中身を表示します。
 char buf;
 string tmpStr;
 string::size_type boundaryLength = boundaryStr.size();
 string::size_type index          = 0;

 while ( 1 ) 
 {
  if ( fread( &amp;amp;buf, 1, 1, stdin ) != 1 )
   return true;

  if ( buf == boundaryStr[ index ] )
  {
   /*
     boundaryの文字なので、一旦tmpStrに保存し、比較するboundaryのインデックスを進めます。
   */
   index++;
   tmpStr += buf;

   if ( index &amp;gt;= boundaryLength )
   {
    // boundaryの文字が全て見つかったので、ループを抜けます。
    break;
   }
  }
  else
  {
   if ( index &amp;gt; 0 )
   {
    // boundaryでない文字列が見つかったので、tmpStrの文字列を表示しインデックスを0に戻します。
    printf( &quot;%s&quot;, 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( &quot;Content-Type: text/html\n\n&quot; );
 
 printf( &quot;&amp;lt;html&amp;gt;&quot; );
 printf( &quot;&amp;lt;head&amp;gt;&amp;lt;title&amp;gt;test&amp;lt;/title&amp;gt;&amp;lt;/head&amp;gt;&quot; );
 printf( &quot;&amp;lt;body&amp;gt;&quot; );

 std::string boundary;
 if ( !isUploadRequest( boundary ))
 {
  printf( &quot;error\n&quot; );
 }
 else
 {
  while ( 1 )
  {
   if ( !printFile( boundaryStr )) break;
  }
 }
 printf( &quot;&amp;lt;/body&amp;gt;&quot; );
 printf( &quot;&amp;lt;/html&amp;gt;&quot; ); 
 return 0;
}
&lt;/pre&gt;</content><link rel='replies' type='application/atom+xml' href='http://programing-memo.blogspot.com/feeds/6497526127394773746/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://programing-memo.blogspot.com/2011/05/ccgi.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3512099112218523262/posts/default/6497526127394773746'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3512099112218523262/posts/default/6497526127394773746'/><link rel='alternate' type='text/html' href='http://programing-memo.blogspot.com/2011/05/ccgi.html' title='c++でcgi ー ファイルのアップロード'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3512099112218523262.post-391309389668158847</id><published>2011-05-14T15:03:00.000+09:00</published><updated>2011-05-14T15:03:16.452+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="c++"/><category scheme="http://www.blogger.com/atom/ns#" term="cgi"/><category scheme="http://www.blogger.com/atom/ns#" term="さくらVPS"/><title type='text'>さくらVPS c++でfcgi</title><content type='html'>さくらVPS: CentOS5.5でfcgiをインストールしてc++をFastCGIとして動かしてみます。&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;a href=&quot;http://px.a8.net/svt/ejp?a8mat=1TQA91+N7Y56+D8Y+BXB8X&quot; target=&quot;_blank&quot;&gt;&lt;br /&gt;
&lt;img alt=&quot;&quot; border=&quot;0&quot; height=&quot;60&quot; src=&quot;http://www25.a8.net/svt/bgt?aid=110401381039&amp;amp;wid=002&amp;amp;eno=01&amp;amp;mid=s00000001717002003000&amp;amp;mc=1&quot; width=&quot;468&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;img alt=&quot;&quot; border=&quot;0&quot; height=&quot;1&quot; src=&quot;http://www13.a8.net/0.gif?a8mat=1TQA91+N7Y56+D8Y+BXB8X&quot; width=&quot;1&quot; /&gt;&lt;br /&gt;
&lt;br /&gt;
FastCGIとは、&lt;a href=&quot;http://ja.wikipedia.org/wiki/FastCGI&quot;&gt;wiki&lt;/a&gt;から引用すると&lt;br /&gt;
&lt;blockquote&gt;&lt;br /&gt;
CGIは、ユーザーから要求がある度に、プロセスの生成と破棄が行われる。大量の要求があればその分だけプロセスの生成と破棄が実施され、この事がパフォーマンスの悪化に繋がっている。&lt;br /&gt;
FastCGIは、プロセスをメモリ上に永続化させることで、その起動と終了にかかる時間をカットし、結果としてプログラム動作速度の向上および サーバ負荷の低下が可能となる。最初にプロセスが実行された段階で、そのプロセスはメモリ上に格納され、次の要求に対してはそのメモリに格納されたプロセ スを実行する。&lt;/blockquote&gt;&lt;br /&gt;
とあり、サーバにアクセスがある度にCGIプロセスを立ち上げるのではなく、CGIプロセスを立ち上げたままにすることで、パフォーマンスを向上させるものです。 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;b&gt;・fcgiのインストール&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
ソースをダウンロードしようとしたところ、&lt;a href=&quot;http://www.fastcgi.com/&quot;&gt;FastCGIのサイト&lt;/a&gt;が変わって(？)ソースが見つからなかったのでrpmパッケージからインストールします。&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;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
&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;b&gt;・mod_fcgidのインストール&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
apacheでFastCGIを使う為にmod_fcgidモジュールをインストールします。&lt;br /&gt;
&lt;pre&gt;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
&lt;/pre&gt;インストールすると、設定ファイル/etc/httpd/conf.d/fcgid.confが作成されるので、&lt;br /&gt;
/etc/httpd/conf/httpd.confを設定する必要はありません。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;b&gt;・C++でfcgiを使う&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
設定ができたので、c++から呼び出してみます。&lt;br /&gt;
&lt;br /&gt;
ファイル名:test.cpp&lt;br /&gt;
&lt;pre class=&quot;c++&quot; name=&quot;code&quot;&gt;#include &amp;lt;fcgi_stdio.h&amp;gt;
#include &amp;lt;unistd.h&amp;gt; // getpid

int main()
{
&amp;nbsp;&amp;nbsp;&amp;nbsp; while ( FCGI_Accept () &amp;gt;= 0 )
&amp;nbsp;&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; printf( &quot;Content-Type: text/html\n\n&quot; );
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; printf( &quot;&amp;lt;html&amp;gt;\n&quot; );
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; printf( &quot;&amp;lt;head&amp;gt;&amp;lt;title&amp;gt;test&amp;lt;/title&amp;gt;&amp;lt;/head&amp;gt;\n&quot; );
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; printf( &quot;&amp;lt;body&amp;gt;Hello world. pid=%d&amp;lt;/body&amp;gt;\n&quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; getpid());
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; printf( &quot;&amp;lt;/html&amp;gt;\n&quot; );
&amp;nbsp;&amp;nbsp;&amp;nbsp; }

&amp;nbsp;&amp;nbsp;&amp;nbsp; return 0;
}
&lt;/pre&gt;&lt;b&gt;&lt;br /&gt;
&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;・コンパイル&lt;/b&gt;&lt;br /&gt;
&lt;pre&gt;g++ -o test.fcgi test.cpp -lfcgi
&lt;/pre&gt;&lt;br /&gt;
ブラウザから、test.fcgiを呼び出すと&lt;br /&gt;
[&lt;b&gt;Hello world.pdi=プロセスのID&lt;/b&gt;]&lt;br /&gt;
と表示され、再読み込みをしてもプロセスのIDは同じままになります。&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;br /&gt;
&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;・ソースコードの説明&lt;/b&gt;&lt;br /&gt;
fastcgiとして動作するにはfcgi_stdio.hをincludeする必要があります。&lt;br /&gt;
(パスは/usr/include/fcgi_stdio.hです。)&lt;br /&gt;
&lt;br /&gt;
fcgi_stdio.hはstdio.hをラップし、printf、freadなどの標準入出力関数をfastcgiとして動かします。&lt;br /&gt;
&lt;br /&gt;
6行目ではFCGI_Acceptを使用し、リクエストがあった時にループ内の処理を行うようにしています。&lt;br /&gt;
&lt;br /&gt;
8～13行目のprintfは、stdio.hのprintfではなく、fcgi_stdio.hのprintfを呼び出してHTMLを出力しています。</content><link rel='replies' type='application/atom+xml' href='http://programing-memo.blogspot.com/feeds/391309389668158847/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://programing-memo.blogspot.com/2011/05/vps-cfcgi.html#comment-form' title='2 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3512099112218523262/posts/default/391309389668158847'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3512099112218523262/posts/default/391309389668158847'/><link rel='alternate' type='text/html' href='http://programing-memo.blogspot.com/2011/05/vps-cfcgi.html' title='さくらVPS c++でfcgi'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3512099112218523262.post-6458494333254649598</id><published>2011-05-11T23:52:00.000+09:00</published><updated>2011-05-11T23:52:18.064+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="c++"/><category scheme="http://www.blogger.com/atom/ns#" term="cgi"/><title type='text'>c++でcgi ー POSTメソッドでデータを受け取る</title><content type='html'>HTMLのformからPOSTメソッドでデータを取得してみます。&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;・HTML&lt;/b&gt;&lt;br /&gt;
&lt;pre class=&quot;html&quot; name=&quot;code&quot;&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
  &amp;lt;head&amp;gt;
 &amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
  &amp;lt;/head&amp;gt;

&amp;lt;body&amp;gt;
 &amp;lt;form action=&quot;cgiへのパス&quot; method=&quot;post&quot;&amp;gt;
   &amp;lt;textarea name=&quot;test1&quot;&amp;gt;&amp;lt;/textarea&amp;gt;
   &amp;lt;textarea name=&quot;test2&quot;&amp;gt;&amp;lt;/textarea&amp;gt;
          &amp;lt;input type=&quot;submit&quot; value=&quot;送信&quot;&amp;gt;
 &amp;lt;/form&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/pre&gt;form内にテキストエリアが2つ(&lt;b&gt;name&lt;/b&gt;は&quot;&lt;b&gt;test1&lt;/b&gt;&quot;と&quot;&lt;b&gt;test2&lt;/b&gt;&quot;)あり、8行目で呼び出すCGIへのパスとPOSTメソッドを指定しています。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;・C++&lt;/b&gt;&lt;br /&gt;
&lt;pre class=&quot;c++&quot; name=&quot;code&quot;&gt;#include &amp;lt;iostream&amp;gt;
#include &amp;lt;string&amp;gt;

#include &amp;lt;stdlib.h&amp;gt; // getenv

using namespace std;


//! 文字列から値に変換します。
template &amp;lt; typename T &amp;gt; T convert( const std::string &amp;amp; str )
{
 std::istringstream istream( str );
 T type = 0;

 if ( !str.empty())
 {
  istream &amp;gt;&amp;gt; type;
 }
 return type;
};

int main()
{
 // 環境変数[REQUEST_METHOD]に送信されたメソッド[GET/POST]が入ります。
 std::string request_method = getenv( &quot;REQUEST_METHOD&quot; ); 
 if ( request_method != &quot;POST&quot; )
 {
  cout &amp;lt;&amp;lt; &quot;REQUEST_METHOD : &quot; &amp;lt;&amp;lt; request_method &amp;lt;&amp;lt; endl;
  return 0;
 }

 // 送信されたサイズを取得します。
 std::string lengthStr = getenv( &quot;CONTENT_LENGTH&quot; );
 unsigned long length  = convert&amp;lt; unsigned long &amp;gt;( lengthStr );
 if ( length &amp;gt; ( 1024 * 1024 /* 1M byte*/))
 {
  cout &amp;lt;&amp;lt; &quot;CONTENT_LENGTH : &quot; &amp;lt;&amp;lt; lengthStr &amp;lt;&amp;lt; endl;
  return 0;
 }

 // 送信されたデータを保存する文字列のメモリを確保します。
 char * tmpBuf = new char[ length + 1 ];
 if ( !tmpBuf )
 {
  cout &amp;lt;&amp;lt; &quot;Allocate is failed.&quot; &amp;lt;&amp;lt; endl;
  return 0;
 }

 // 標準入力からPOSTされたデータを取得します。
 if ( fread( tmpBuf, 1, length, stdin ) != length )
 {
  cout &amp;lt;&amp;lt; &quot;fread is failed.&quot; &amp;lt;&amp;lt; endl;
  return 0;
 }
 tmpBuf[ length ] = &#39;\0&#39;;

 // HTMLを出力します。
 cout &amp;lt;&amp;lt; &quot;Content-Type: text/html&quot; &amp;lt;&amp;lt; endl &amp;lt;&amp;lt; endl;

 cout &amp;lt;&amp;lt; &quot;&amp;lt;html&amp;gt;&quot; &amp;lt;&amp;lt; endl;
 cout &amp;lt;&amp;lt; &quot;&amp;lt;head&amp;gt;&amp;lt;title&amp;gt;test&amp;lt;/title&amp;gt;&amp;lt;/head&amp;gt;&quot; &amp;lt;&amp;lt; endl;
 cout &amp;lt;&amp;lt; &quot;&amp;lt;body&amp;gt;&quot; &amp;lt;&amp;lt; endl;
 cout &amp;lt;&amp;lt; tmpBuf &amp;lt;&amp;lt; &quot;&amp;lt;br&amp;gt;&quot; &amp;lt;&amp;lt; endl;

 cout &amp;lt;&amp;lt; &quot;&amp;lt;/body&amp;gt;&quot; &amp;lt;&amp;lt; endl;
 cout &amp;lt;&amp;lt; &quot;&amp;lt;/html&amp;gt;&quot; &amp;lt;&amp;lt; endl;
 return 0;
}
&lt;/pre&gt;&lt;br /&gt;
9行目から20行目までは、&lt;a href=&quot;http://programing-memo.blogspot.com/2011/05/c.html&quot;&gt;文字列から数値に変換する関数&lt;/a&gt;です。&lt;br /&gt;
送信されたサイズを数値に変換するのに使用しています。&lt;br /&gt;
&lt;br /&gt;
25行目で環境変数[&lt;b&gt;REQUEST_METHOD&lt;/b&gt;]からGET/POSTのどちらのメソッドかを取得しています。&lt;br /&gt;
&lt;br /&gt;
32～39行目までは環境変数[&lt;b&gt;CONTENT_LENGTH&lt;/b&gt;]から送信されたサイズを文字列で取得した後、数値に変換しています。&lt;br /&gt;
&lt;br /&gt;
42行目で、送信されたデータを保存する文字列のメモリを確保し、&lt;br /&gt;
50行目で&lt;b&gt;fread&lt;/b&gt;を使用して送信されたデータを確保したメモリに書き込んでいます。&lt;br /&gt;
&lt;br /&gt;
57行目移行は、送信されたデータをHTMLとして書き出しています。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
GETメソッドと同様、送信されたデータはURLエンコードされ&lt;b&gt;nameと内容が[&lt;/b&gt;&lt;b&gt;=]&lt;/b&gt;で結ばれ、&lt;b&gt;各項目が[&amp;amp;]&lt;/b&gt;で結ばれます。&lt;br /&gt;
&lt;br /&gt;
最初の テキストエリア(&lt;b&gt;test1&lt;/b&gt;)に[&lt;b&gt;123&lt;/b&gt;]、次のテキストエリア(&lt;b&gt;test2&lt;/b&gt;)に[&lt;b&gt;test&lt;/b&gt;]を入力した時は、&lt;br /&gt;
送信される文字列は[&lt;b&gt;test1=123&amp;amp;test2=test&lt;/b&gt;]になります。&lt;br /&gt;
&lt;br /&gt;
実際に使用する時は、文字列を&lt;a href=&quot;http://programing-memo.blogspot.com/2011/05/ccgi-url_11.html&quot;&gt;URLデコード&lt;/a&gt;し文字列を[&amp;amp;]と[=]で区切る必要があります。</content><link rel='replies' type='application/atom+xml' href='http://programing-memo.blogspot.com/feeds/6458494333254649598/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://programing-memo.blogspot.com/2011/05/ccgi-post.html#comment-form' title='1 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3512099112218523262/posts/default/6458494333254649598'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3512099112218523262/posts/default/6458494333254649598'/><link rel='alternate' type='text/html' href='http://programing-memo.blogspot.com/2011/05/ccgi-post.html' title='c++でcgi ー POSTメソッドでデータを受け取る'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3512099112218523262.post-533058923771078148</id><published>2011-05-11T20:59:00.000+09:00</published><updated>2011-05-11T20:59:07.299+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="c++"/><category scheme="http://www.blogger.com/atom/ns#" term="cgi"/><title type='text'>c++でcgi ー GETメソッドでデータを受け取る</title><content type='html'>HTMLのformからGETメソッドでデータを取得してみます。&lt;br /&gt;
&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;b&gt;・HTML&lt;/b&gt;&lt;br /&gt;
&lt;pre class=&quot;html&quot; name=&quot;code&quot;&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
  &amp;lt;head&amp;gt;
 &amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
  &amp;lt;/head&amp;gt;

  &amp;lt;body&amp;gt;
 &amp;lt;form action=&quot;CGIへのパス&quot; method=&quot;get&quot;&amp;gt;
   &amp;lt;input type=&quot;text&quot; name=&quot;text1&quot;&amp;gt;
   &amp;lt;input type=&quot;text&quot; name=&quot;text2&quot;&amp;gt;

   &amp;lt;input type=&quot;submit&quot; value=&quot;送信&quot;&amp;gt;
 &amp;lt;/form&amp;gt;
  &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/pre&gt;&lt;br /&gt;
form内にテキスト入力欄が2つ(&lt;b&gt;name&lt;/b&gt;は&quot;&lt;b&gt;text1&lt;/b&gt;&quot;と&quot;&lt;b&gt;text2&lt;/b&gt;&quot;)あり、8行目で呼び出すCGIへのパスとGETメソッドを指定しています。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;・c++&lt;/b&gt;&lt;br /&gt;
&lt;pre class=&quot;c++&quot; name=&quot;code&quot;&gt;#include &amp;lt;iostream&amp;gt;
#include &amp;lt;string&amp;gt;
&amp;nbsp;int main()
{
 // 環境変数[REQUEST_METHOD]に送信されたメソッド[GET/POST]が入ります。
 std::string request_method = getenv( &quot;REQUEST_METHOD&quot; );
 std::string query_string;

 if ( request_method == &quot;GET&quot; )
 {
  query_string = getenv( &quot;QUERY_STRING&quot; );
 }
 
 cout &amp;lt;&amp;lt; &quot;Content-Type: text/html&quot; &amp;lt;&amp;lt; endl &amp;lt;&amp;lt; endl;
 
 cout &amp;lt;&amp;lt; &quot;&amp;lt;html&amp;gt;&quot; &amp;lt;&amp;lt; endl;
 cout &amp;lt;&amp;lt; &quot;&amp;lt;head&amp;gt;&amp;lt;title&amp;gt;test&amp;lt;/title&amp;gt;&amp;lt;/head&amp;gt;&quot; &amp;lt;&amp;lt; endl;
 cout &amp;lt;&amp;lt; &quot;&amp;lt;body&amp;gt;&quot; &amp;lt;&amp;lt; endl;
 cout &amp;lt;&amp;lt; query_string &amp;lt;&amp;lt; endl;

 cout &amp;lt;&amp;lt; &quot;&amp;lt;/body&amp;gt;&quot; &amp;lt;&amp;lt; endl;
 cout &amp;lt;&amp;lt; &quot;&amp;lt;/html&amp;gt;&quot; &amp;lt;&amp;lt; endl;

 return 0;
}
&lt;/pre&gt;&lt;br /&gt;
6行目で環境変数&lt;b&gt;[REQUEST_METHOD]&lt;/b&gt;からGET/POSTのどちらのメソッドかを取得しています。&lt;br /&gt;
&lt;br /&gt;
11行目で、GETメソッドなら環境変数&lt;b&gt;[QUERY_STRING]&lt;/b&gt;から送信されたデータを取得しています。&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;[QUERY_STRING]&lt;/b&gt;には、送信された文字列(&lt;span style=&quot;color: #cc0000;&quot;&gt;URLエンコードされています&lt;/span&gt;)が入ります。&lt;br /&gt;
送信された文字列はnameと内容が[&lt;b&gt;=&lt;/b&gt;]で結ばれ、各項目が[&lt;b&gt;&amp;amp;&lt;/b&gt;]で結ばれています。&lt;br /&gt;
&lt;br /&gt;
formのtext1に[&lt;b&gt;abc&lt;/b&gt;]、text2に[&lt;b&gt;123&lt;/b&gt;]と入力して送信すると&lt;br /&gt;
QUERY_STRINGには[&lt;b&gt;text1=abc&amp;amp;text2=123&lt;/b&gt;]という文字列が入ります。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
実際に使用する時は、文字列を&lt;a href=&quot;http://programing-memo.blogspot.com/2011/05/ccgi-url_11.html&quot;&gt;URLデコード&lt;/a&gt;し文字列を[&amp;amp;]と[=]で区切る必要があります。</content><link rel='replies' type='application/atom+xml' href='http://programing-memo.blogspot.com/feeds/533058923771078148/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://programing-memo.blogspot.com/2011/05/ccgi-get.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3512099112218523262/posts/default/533058923771078148'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3512099112218523262/posts/default/533058923771078148'/><link rel='alternate' type='text/html' href='http://programing-memo.blogspot.com/2011/05/ccgi-get.html' title='c++でcgi ー GETメソッドでデータを受け取る'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3512099112218523262.post-1055416052926902092</id><published>2011-05-11T17:05:00.001+09:00</published><updated>2011-05-11T17:07:20.775+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="c++"/><category scheme="http://www.blogger.com/atom/ns#" term="cgi"/><title type='text'>c++でcgi ー URLデコード</title><content type='html'>HTMLのフォームからGETやPOSTで送られてくる文字列は、&lt;a href=&quot;http://ja.wikipedia.org/wiki/URL%E3%82%A8%E3%83%B3%E3%82%B3%E3%83%BC%E3%83%89&quot;&gt;URLエンコード&lt;/a&gt;されてくるので、デコードして元の形に戻すプログラムです。&lt;br /&gt;
&lt;br /&gt;
(&amp;nbsp;&lt;a href=&quot;http://www.kinet.or.jp/hiromin/cgi_introduction/appendix/url_encode.html&quot;&gt;こちら&lt;/a&gt;のページを参考にしました。)&lt;br /&gt;
&lt;br /&gt;
引数で渡された文字列から、以下の変換を行った文字列を返します。 &lt;br /&gt;
&lt;ul&gt;&lt;li&gt;[+] → [ ](半角スペース)&lt;/li&gt;
&lt;li&gt;[%○○](○は16進数) → ２桁の16進数の文字 &lt;/li&gt;
&lt;li&gt;[%0A][%0D%0A](改行コード) →&amp;lt;br&amp;gt;&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;c++&quot; name=&quot;code&quot;&gt;#include &amp;lt;iostream&amp;gt;
#include &amp;lt;string&amp;gt;
#include &amp;lt;ctype.h&amp;gt; // toupper

//! %XXのXXをchar型にして返します。
char hexToChar( char first, char second )
{
 int digit;
  
 digit = ( first &amp;gt;= &#39;A&#39; ? (( first &amp;amp; 0xDF ) - &#39;A&#39;) + 10 : ( first - &#39;0&#39; ));
 digit *= 16;
 digit += ( second &amp;gt;= &#39;A&#39; ? (( second &amp;amp; 0xDF ) - &#39;A&#39; ) + 10 : ( second - &#39;0&#39; ));
 return static_cast&amp;lt; char &amp;gt;( digit );
}

//! 改行コードか判定します。
bool isLF( const std::string            &amp;amp; str, 
     const std::string::size_type &amp;amp; length,
     std::string::size_type       &amp;amp; index,
     char                         * tmpStr )
{
 if ( tmpStr[ 0 ] != &#39;0&#39; )
  return false;

 tmpStr[ 1 ] = toupper( tmpStr[ 1 ] );
 if ( tmpStr[ 1 ] == &#39;A&#39; )
 {
  // [0A]は改行コード
  return true;
 }
 
 if ( tmpStr[ 1 ] == &#39;D&#39; )
 {
  // [0D]も改行コード
  if (( index + 3 ) &amp;lt; length &amp;amp;&amp;amp; str[ index + 1 ] == &#39;%&#39; )
  {
   // [0D]の後に[%0A]がある時は、[%0A]の後までインデックスを進めます。
   tmpStr[ 0 ] = str[ index + 2 ];
   tmpStr[ 1 ] = str[ index + 3 ];
   
   if ( tmpStr[ 0 ] == &#39;0&#39; &amp;amp;&amp;amp; 
     ( tmpStr[ 1 ] == &#39;A&#39; || tmpStr[ 1 ] == &#39;a&#39; ))
   {
    index += 3;
   }
  }
  return true;
 }

 return false;
}

/**
   URLデコードをした文字列を返します。 
   改行コード(0x0A, 0x0D)は&#39;\n&#39;にします。
**/
std::string UrlDecorde( const std::string &amp;amp; str )
{
 std::string retStr;
 char tmpStr[ 2 ];
 std::string::size_type length = str.size(); 

 for ( std::string::size_type i = 0 ; i &amp;lt; length ; i++ )
 {
  if ( str[ i ] == &#39;+&#39; )
  {
   // [+]は半角スペース
   retStr += &#39; &#39;;
  }
  else if ( str[ i ] == &#39;%&#39; &amp;amp;&amp;amp; ( i + 2 ) &amp;lt; length )
  {
   tmpStr[ 0 ] = str[ i + 1 ];
   tmpStr[ 1 ] = str[ i + 2 ];

   if ( std::isxdigit( tmpStr[ 0 ] ) &amp;amp;&amp;amp; std::isxdigit( tmpStr[ 1 ] ))
   {
    i += 2;

    // 改行コードのチェック
    if ( isLF( str, length, i, tmpStr ))
    {
     retStr += &quot;&amp;lt;br&amp;gt;&quot;;
    }
    else
    {
     retStr += hexToChar( tmpStr[ 0 ], tmpStr[ 1 ] );
    }
   }
   else
   {
    // no digit
    retStr += &#39;%&#39;;
   }
  }
  else
  {
   retStr += str[ i ];
  }
 }
 return retStr;
}

int main()
{
 std::cout &amp;lt;&amp;lt; UrlDecorde( &quot;%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&quot; ) &amp;lt;&amp;lt; std::endl;

 return 0;
}
&lt;/pre&gt;</content><link rel='replies' type='application/atom+xml' href='http://programing-memo.blogspot.com/feeds/1055416052926902092/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://programing-memo.blogspot.com/2011/05/ccgi-url_11.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3512099112218523262/posts/default/1055416052926902092'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3512099112218523262/posts/default/1055416052926902092'/><link rel='alternate' type='text/html' href='http://programing-memo.blogspot.com/2011/05/ccgi-url_11.html' title='c++でcgi ー URLデコード'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3512099112218523262.post-3359470797926191821</id><published>2011-05-10T21:00:00.002+09:00</published><updated>2011-05-10T21:02:58.568+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="c++"/><category scheme="http://www.blogger.com/atom/ns#" term="cgi"/><title type='text'>c++でcgi ー URLエンコード</title><content type='html'>&lt;a class=&quot;external mw-magiclink-rfc&quot; href=&quot;http://tools.ietf.org/html/rfc3986&quot;&gt;RFC 3986&lt;/a&gt;にしたがってURLエンコードをするプログラムです。&lt;br /&gt;
&lt;br /&gt;
数字/アルファベット/[-](ハイフン)/[.](ピリオド)/[_](アンダーバー)/[~](チルダ)以外の文字を&lt;br /&gt;
『%○○(○は16進数)』に変換します。&lt;br /&gt;
(PHP5.3移行のrawurlencodeと同じ動作になるはずです。)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
※ 半角スペースを[+]、[~]を[%7E]に変換する仕様は、application/x-www-form-urlencodedによるエンコード方法(PHPのurlencode関数)です。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;c++&quot; name=&quot;code&quot;&gt;#include &amp;lt;string&amp;gt;

std::string UrlEncode( const std::string &amp;amp; str )
{
 std::string retStr;

 std::string::size_type length = str.size(); 
 for ( std::string::size_type i = 0 ; i &amp;lt; length ; i++ )
 {
  if (( &#39;0&#39; &amp;lt;= str[ i ] &amp;amp;&amp;amp; str[ i ] &amp;lt;= &#39;9&#39; ) ||
   ( &#39;a&#39; &amp;lt;= str[ i ] &amp;amp;&amp;amp; str[ i ] &amp;lt;= &#39;z&#39; ) ||
   ( &#39;A&#39; &amp;lt;= str[ i ] &amp;amp;&amp;amp; str[ i ] &amp;lt;= &#39;Z&#39; ) ||
   str[ i ] == &#39;-&#39;   || str[ i ] == &#39;.&#39;   ||
   str[ i ] == &#39;_&#39;   || str[ i ] == &#39;~&#39; )
  {
   // 数字/アルファベット/[-][.][_][~]はそのまま
   retStr += str[ i ];
  }
  else
  {
   retStr += &#39;%&#39;;
   char tmp[ 3 ];
   snprintf( tmp, 3, &quot;%X&quot;, static_cast&amp;lt; unsigned char &amp;gt;( str[ i ] ));
   retStr += tmp;
  }
 }

 return retStr;
}
&lt;/pre&gt;</content><link rel='replies' type='application/atom+xml' href='http://programing-memo.blogspot.com/feeds/3359470797926191821/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://programing-memo.blogspot.com/2011/05/ccgi-url.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3512099112218523262/posts/default/3359470797926191821'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3512099112218523262/posts/default/3359470797926191821'/><link rel='alternate' type='text/html' href='http://programing-memo.blogspot.com/2011/05/ccgi-url.html' title='c++でcgi ー URLエンコード'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3512099112218523262.post-8403468932805966543</id><published>2011-05-10T17:58:00.002+09:00</published><updated>2011-05-10T18:11:04.387+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="c++"/><title type='text'>c++で文字列から数値に変換</title><content type='html'>c++でstd::istringstreamを使用して文字列から数値に変換するプログラムです。&lt;br /&gt;
templateを使用しているので、様々な型で変換できます。&lt;br /&gt;
&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;pre class=&quot;c++&quot; name=&quot;code&quot;&gt;#include &amp;lt;iostream&amp;gt;
#include &amp;lt;string&amp;gt;
#include &amp;lt;iomanip&amp;gt; // setprecision
#include &amp;lt;sstream&amp;gt;

using namespace std;

//! 文字列から値に変換します。
template &amp;lt; typename T &amp;gt; T convert( const std::string &amp;amp; str )
{
 std::istringstream istream( str );
 T type = 0;

 if ( !str.empty())
 {
  istream &amp;gt;&amp;gt; type;
 }
 cout &amp;lt;&amp;lt; type &amp;lt;&amp;lt; endl;
 return type;
};

int main()
{
 unsigned long val = convert&amp;lt; unsigned long &amp;gt;( &quot;12345678901&quot; );
 cout &amp;lt;&amp;lt; val &amp;lt;&amp;lt; endl;

 long double tmp = convert&amp;lt; long double &amp;gt;( &quot;123.45678&quot; );
 cout &amp;lt;&amp;lt; setprecision( 10 ) &amp;lt;&amp;lt; tmp &amp;lt;&amp;lt; endl;
 return 0;
}
&lt;/pre&gt;&lt;br /&gt;
28行目のcoutでsetprecisionで有効桁数を指定しないと、小数点4桁目(環境によります)が四捨五入されて表示されます。&lt;br /&gt;
(指定し忘れてて、はまりました。。)</content><link rel='replies' type='application/atom+xml' href='http://programing-memo.blogspot.com/feeds/8403468932805966543/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://programing-memo.blogspot.com/2011/05/c.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3512099112218523262/posts/default/8403468932805966543'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3512099112218523262/posts/default/8403468932805966543'/><link rel='alternate' type='text/html' href='http://programing-memo.blogspot.com/2011/05/c.html' title='c++で文字列から数値に変換'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3512099112218523262.post-443281190180531917</id><published>2011-05-08T14:45:00.007+09:00</published><updated>2011-05-10T21:04:30.264+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="c++"/><category scheme="http://www.blogger.com/atom/ns#" term="CentOS"/><category scheme="http://www.blogger.com/atom/ns#" term="cgi"/><category scheme="http://www.blogger.com/atom/ns#" term="さくらVPS"/><title type='text'>さくらVPS c++でcgi</title><content type='html'>せっかくのVPSなので、c++でcgiを書いてみます。&lt;br /&gt;
環境はCentOS5.5で、&lt;a href=&quot;http://programing-memo.blogspot.com/2011/04/vpslamp.html&quot;&gt;apache&lt;/a&gt;・&lt;a href=&quot;http://programing-memo.blogspot.com/2011/04/vpsc.html&quot;&gt;g++&lt;/a&gt;がインストール済みとします。&lt;br /&gt;
&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;a href=&quot;http://px.a8.net/svt/ejp?a8mat=1TQA91+N7Y56+D8Y+BXB8X&quot; target=&quot;_blank&quot;&gt;&lt;br /&gt;
&lt;img alt=&quot;&quot; border=&quot;0&quot; height=&quot;60&quot; src=&quot;http://www25.a8.net/svt/bgt?aid=110401381039&amp;amp;wid=002&amp;amp;eno=01&amp;amp;mid=s00000001717002003000&amp;amp;mc=1&quot; width=&quot;468&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;img alt=&quot;&quot; border=&quot;0&quot; height=&quot;1&quot; src=&quot;http://www13.a8.net/0.gif?a8mat=1TQA91+N7Y56+D8Y+BXB8X&quot; width=&quot;1&quot; /&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;b&gt;・ソースコード&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
test.cpp&lt;br /&gt;
&lt;pre class=&quot;c++&quot; name=&quot;code&quot;&gt;#include &amp;lt;iostream&amp;gt;

using namespace std;

int main()
{
cout &amp;lt;&amp;lt; &quot;Content-Type: text/html&quot; &amp;lt;&amp;lt; endl &amp;lt;&amp;lt; endl;

cout &amp;lt;&amp;lt; &quot;&amp;lt;html&amp;gt;&quot; &amp;lt;&amp;lt; endl;
cout &amp;lt;&amp;lt; &quot;&amp;lt;head&amp;gt;&amp;lt;title&amp;gt;test&amp;lt;/title&amp;gt;&amp;lt;/head&amp;gt;&quot; &amp;lt;&amp;lt; endl;
cout &amp;lt;&amp;lt; &quot;&amp;lt;body&amp;gt;Hello world!&amp;lt;/body&amp;gt;&quot; &amp;lt;&amp;lt; endl;
cout &amp;lt;&amp;lt; &quot;&amp;lt;/html&amp;gt;&quot; &amp;lt;&amp;lt; endl;
}
&lt;/pre&gt;&lt;br /&gt;
ソースコードで行っていることは、最初に&lt;br /&gt;
&lt;pre class=&quot;c++&quot; name=&quot;code&quot;&gt;cout &amp;lt;&amp;lt; &quot;Content-Type: text/html&quot; &amp;lt;&amp;lt; endl &amp;lt;&amp;lt; endl;&lt;/pre&gt;で、HTTPヘッダを出力します。(これを記述しないと、500-Internal Server Errorになります。)&lt;br /&gt;
&lt;br /&gt;
後はHTMLを出力しています。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;b&gt;・コンパイル&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;pre&gt;g++ -o test.cgi test.cpp &lt;/pre&gt;test.cppからcgi: test.cgiを作成します。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;b&gt;・apacheの設定&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
/etc/httpd/conf/httpd.confを開き&lt;br /&gt;
&lt;pre&gt;&amp;lt;Directory &quot;/cgiを置くディレクトリ&quot;&amp;gt;
AllowOverride None    Options None ExecCGI
Order allow,deny    Allow from all
&amp;lt;/Directory&amp;gt;&lt;/pre&gt;を追加。&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;#AddHandler cgi-script .cgi&lt;/pre&gt;のコメントを外し、apacheを再起動。&lt;br /&gt;
(コメントを外さないと、ブラウザでアクセスした時にcgiが実行されずにダウンロードダイアログが表示されます。)&lt;br /&gt;
&lt;br /&gt;
ブラウザからcgiにアクセスし、[Hello world!]と表示されれば成功です。</content><link rel='replies' type='application/atom+xml' href='http://programing-memo.blogspot.com/feeds/443281190180531917/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://programing-memo.blogspot.com/2011/05/vps-ccgi.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3512099112218523262/posts/default/443281190180531917'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3512099112218523262/posts/default/443281190180531917'/><link rel='alternate' type='text/html' href='http://programing-memo.blogspot.com/2011/05/vps-ccgi.html' title='さくらVPS c++でcgi'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3512099112218523262.post-8652603779029686651</id><published>2011-05-06T22:11:00.003+09:00</published><updated>2011-05-07T00:15:34.044+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="CentOS"/><category scheme="http://www.blogger.com/atom/ns#" term="WordPress"/><category scheme="http://www.blogger.com/atom/ns#" term="さくらVPS"/><title type='text'>さくらVPSでWordPressをインストール</title><content type='html'>さくらVPS CentOS5.5にWordPressをインストールした時のメモです。&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://px.a8.net/svt/ejp?a8mat=1TQA91+N7Y56+D8Y+BXB8X&quot; target=&quot;_blank&quot;&gt;&lt;br /&gt;
&lt;img alt=&quot;&quot; border=&quot;0&quot; height=&quot;60&quot; src=&quot;http://www25.a8.net/svt/bgt?aid=110401381039&amp;amp;wid=002&amp;amp;eno=01&amp;amp;mid=s00000001717002003000&amp;amp;mc=1&quot; width=&quot;468&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;img alt=&quot;&quot; border=&quot;0&quot; height=&quot;1&quot; src=&quot;http://www13.a8.net/0.gif?a8mat=1TQA91+N7Y56+D8Y+BXB8X&quot; width=&quot;1&quot; /&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;b&gt;1.WordPressをダウンロード&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;a href=&quot;http://ja.wordpress.org/&quot;&gt;こちら&lt;/a&gt;からWordPress日本語版をダウンロードし、解凍&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;span style=&quot;font-size: large;&quot;&gt;2.MySQLにWordPress用のデータベースとユーザを作成&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;a href=&quot;http://programing-memo.blogspot.com/2011/05/wordpressmysql.html&quot;&gt;別記事のこちら&lt;/a&gt;を参考にしてください。&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;span style=&quot;font-size: large;&quot;&gt;3.WordPressの設定&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
解凍したディレクトリにある「wp-config-sample.php」をエディタで開き、&lt;br /&gt;
&lt;pre&gt;// ** MySQL 設定 - こちらの情報はホスティング先から入手してください。 ** //
/** WordPress のためのデータベース名 */
define(&#39;DB_NAME&#39;, &#39;database_name_here&#39;);

/** MySQL データベースのユーザー名 */
define(&#39;DB_USER&#39;, &#39;username_here&#39;);

/** MySQL データベースのパスワード */
define(&#39;DB_PASSWORD&#39;, &#39;password_here&#39;);
&lt;/pre&gt;を2で作成したデータベース・ユーザ名で書き換え、wp-config.phpとして保存&lt;br /&gt;
&lt;br /&gt;
保存したら、ブラウザからWordPressのアドレスを入力すると、設定画面が表示されます。&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgRrTgTMeaXpCG7k8VM-Hz70vBb288pqbHcBNvVs7ZjGgkZ538W0bLqugA2QGi3h_WHQFEGpNSdbLdEi8bZ1s74oTlZDtXzbcN-ogtQFGGBWUOMtbU1rJIYFuJIt8IYHPlonyYi9ApUVFTi/s1600/wordpress_install.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;150&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgRrTgTMeaXpCG7k8VM-Hz70vBb288pqbHcBNvVs7ZjGgkZ538W0bLqugA2QGi3h_WHQFEGpNSdbLdEi8bZ1s74oTlZDtXzbcN-ogtQFGGBWUOMtbU1rJIYFuJIt8IYHPlonyYi9ApUVFTi/s320/wordpress_install.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;必要情報の[ブログタイトル]・[ユーザ名]・[パスワード]・[メールアドレス]を設定すればインストールは完了です。</content><link rel='replies' type='application/atom+xml' href='http://programing-memo.blogspot.com/feeds/8652603779029686651/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://programing-memo.blogspot.com/2011/05/vpswordpress.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3512099112218523262/posts/default/8652603779029686651'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3512099112218523262/posts/default/8652603779029686651'/><link rel='alternate' type='text/html' href='http://programing-memo.blogspot.com/2011/05/vpswordpress.html' title='さくらVPSでWordPressをインストール'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgRrTgTMeaXpCG7k8VM-Hz70vBb288pqbHcBNvVs7ZjGgkZ538W0bLqugA2QGi3h_WHQFEGpNSdbLdEi8bZ1s74oTlZDtXzbcN-ogtQFGGBWUOMtbU1rJIYFuJIt8IYHPlonyYi9ApUVFTi/s72-c/wordpress_install.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3512099112218523262.post-4896378236826511205</id><published>2011-05-06T22:11:00.001+09:00</published><updated>2011-05-06T22:11:35.281+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="CentOS"/><category scheme="http://www.blogger.com/atom/ns#" term="mysql"/><category scheme="http://www.blogger.com/atom/ns#" term="さくらVPS"/><title type='text'>WordPress用のMySQLの設定</title><content type='html'>さくらVPS CentOS5.5でWordPress用のMySQLのデータベース・ユーザをコマンドラインから作成した時のメモです。&lt;br /&gt;
&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://px.a8.net/svt/ejp?a8mat=1TQA91+N7Y56+D8Y+BXB8X&quot; target=&quot;_blank&quot;&gt;&lt;br /&gt;
&lt;img alt=&quot;&quot; border=&quot;0&quot; height=&quot;60&quot; src=&quot;http://www25.a8.net/svt/bgt?aid=110401381039&amp;amp;wid=002&amp;amp;eno=01&amp;amp;mid=s00000001717002003000&amp;amp;mc=1&quot; width=&quot;468&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;img alt=&quot;&quot; border=&quot;0&quot; height=&quot;1&quot; src=&quot;http://www13.a8.net/0.gif?a8mat=1TQA91+N7Y56+D8Y+BXB8X&quot; width=&quot;1&quot; /&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;b&gt;・mysqlにログインする&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;mysql -u root -p
&lt;/pre&gt;&lt;br /&gt;
初期状態では、パスワードが設定されていないので「Enter」キーを入力してmysqlにログインします。&lt;br /&gt;
&lt;br /&gt;
ログインすると、プロンプトに&lt;br /&gt;
&lt;pre&gt;mysql &amp;gt;
&lt;/pre&gt;と表示されコマンドを入力できるようになります。&lt;br /&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;b&gt;&lt;span style=&quot;font-size: large;&quot;&gt;・パスワードの設定&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
rootのパスワードがないのは嫌なので、とりあえず設定します。&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;SET PASSWORD FOR root@localhost=PASSWORD(&#39;設定するパスワード&#39;);
&lt;/pre&gt;&lt;br /&gt;
パスワードを設定したら、確認の為&lt;br /&gt;
&lt;pre&gt;exit
&lt;/pre&gt;で一旦mysqlからログアウトし、設定したパスワードで再度ログインします。&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;span style=&quot;font-size: large;&quot;&gt;・WordPress用のデータベースを作成&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;pre&gt;CREATE DATABASE データベース名;
&lt;/pre&gt;で新しいデータベースを作成&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;span style=&quot;font-size: large;&quot;&gt;・ユーザを作成&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;pre&gt;grant create,select,insert,update,delete on データベース名.* to 新規ユーザ名@localhost identified by &#39;設定するパスワード&#39;;
&lt;/pre&gt;&lt;br /&gt;
※ ここで作成したデータベース・ユーザ名・パスワードは、WordPressのインストール時に必要になります。</content><link rel='replies' type='application/atom+xml' href='http://programing-memo.blogspot.com/feeds/4896378236826511205/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://programing-memo.blogspot.com/2011/05/wordpressmysql.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3512099112218523262/posts/default/4896378236826511205'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3512099112218523262/posts/default/4896378236826511205'/><link rel='alternate' type='text/html' href='http://programing-memo.blogspot.com/2011/05/wordpressmysql.html' title='WordPress用のMySQLの設定'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3512099112218523262.post-4092929120364064383</id><published>2011-04-28T01:04:00.000+09:00</published><updated>2011-04-28T01:04:38.629+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="c++"/><category scheme="http://www.blogger.com/atom/ns#" term="さくらVPS"/><title type='text'>さくらVPSでC++の開発環境の構築</title><content type='html'>さくらVPSのCentOS 5.5で、C++の開発環境をインストール&lt;br /&gt;
&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;pre&gt;yum install gcc-c++
&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://px.a8.net/svt/ejp?a8mat=1TQA91+N7Y56+D8Y+BXB8X&quot; target=&quot;_blank&quot;&gt;&lt;br /&gt;
&lt;img alt=&quot;&quot; border=&quot;0&quot; height=&quot;60&quot; src=&quot;http://www25.a8.net/svt/bgt?aid=110401381039&amp;amp;wid=002&amp;amp;eno=01&amp;amp;mid=s00000001717002003000&amp;amp;mc=1&quot; width=&quot;468&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;img alt=&quot;&quot; border=&quot;0&quot; height=&quot;1&quot; src=&quot;http://www13.a8.net/0.gif?a8mat=1TQA91+N7Y56+D8Y+BXB8X&quot; width=&quot;1&quot; /&gt;</content><link rel='replies' type='application/atom+xml' href='http://programing-memo.blogspot.com/feeds/4092929120364064383/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://programing-memo.blogspot.com/2011/04/vpsc.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3512099112218523262/posts/default/4092929120364064383'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3512099112218523262/posts/default/4092929120364064383'/><link rel='alternate' type='text/html' href='http://programing-memo.blogspot.com/2011/04/vpsc.html' title='さくらVPSでC++の開発環境の構築'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3512099112218523262.post-7495846918999819566</id><published>2011-04-28T00:57:00.000+09:00</published><updated>2011-04-28T00:57:33.931+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="c++"/><category scheme="http://www.blogger.com/atom/ns#" term="ubuntu"/><title type='text'>Ubuntuでc++の開発環境を構築</title><content type='html'>Ubuntu10.10のデフォルトでは、g++が入っていないので以下のコマンドでインストール。&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;sudo apt-get install build-essential
&lt;/pre&gt;</content><link rel='replies' type='application/atom+xml' href='http://programing-memo.blogspot.com/feeds/7495846918999819566/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://programing-memo.blogspot.com/2011/04/ubuntuc.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3512099112218523262/posts/default/7495846918999819566'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3512099112218523262/posts/default/7495846918999819566'/><link rel='alternate' type='text/html' href='http://programing-memo.blogspot.com/2011/04/ubuntuc.html' title='Ubuntuでc++の開発環境を構築'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3512099112218523262.post-4387804066137447325</id><published>2011-04-18T00:33:00.000+09:00</published><updated>2011-04-18T00:33:07.609+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="xfce"/><title type='text'>xfce4で付箋・カレンダープラグインの追加</title><content type='html'>Ubuntu10.10でxfce4を使用していますが、付箋をインストールしてなかったので追加。&lt;br /&gt;
ついでにカレンダー付きの時計をインストール&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;# 付箋
sudo apt-get install xfce4-notes-plugin
# カレンダー付きの時計
sudo apt-get install xfce4-datetime-plugin
&lt;/pre&gt;&lt;br /&gt;
インストールしたらパネル上で[右クリック]ー[新しいアイテムの追加]をします。&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;付箋 ー 「Notes ちょっとしたメモに最適です」を追加。&lt;/li&gt;
&lt;li&gt;カレンダー付きの時計: 「DateTime シンプルなカレンダーと日付と時間用プラグイン」を追加&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
※ プラグインは&lt;a href=&quot;http://wiki.fdiary.net/xfce/?XfcePlugins&quot;&gt;XFce Wiki&lt;/a&gt;のページがまとまっています。</content><link rel='replies' type='application/atom+xml' href='http://programing-memo.blogspot.com/feeds/4387804066137447325/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://programing-memo.blogspot.com/2011/04/xfce4.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3512099112218523262/posts/default/4387804066137447325'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3512099112218523262/posts/default/4387804066137447325'/><link rel='alternate' type='text/html' href='http://programing-memo.blogspot.com/2011/04/xfce4.html' title='xfce4で付箋・カレンダープラグインの追加'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3512099112218523262.post-8621031806329822485</id><published>2011-04-15T14:35:00.002+09:00</published><updated>2011-04-20T02:17:12.772+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="CentOS"/><category scheme="http://www.blogger.com/atom/ns#" term="postfix"/><title type='text'>ユーザ追加時にpostfixのMailDirを作成</title><content type='html'>Postfixのメールボックス形式がMailDirで、ユーザ追加時に自動的に/home/ユーザ/MailDirを作成する方法&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;mkdir -p /etc/skel/Maildir/new
mkdir -p /etc/skel/Maildir/cur
mkdir -p /etc/skel/Maildir/tmp
chmod -R 700 /etc/skel/Maildir/
&lt;/pre&gt;&lt;br /&gt;
確認&lt;br /&gt;
&lt;pre&gt;useradd 新しいユーザ名
passwd 新しいユーザ名
&lt;/pre&gt;&lt;br /&gt;
/home/新しいユーザ名/Maildirが作成されて、ローカルPCからThunderbirdでメールの送受信ができることを確認&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://px.a8.net/svt/ejp?a8mat=1TQA91+N7Y56+D8Y+BXB8X&quot; target=&quot;_blank&quot;&gt;&lt;br /&gt;
&lt;img border=&quot;0&quot; width=&quot;468&quot; height=&quot;60&quot; alt=&quot;&quot; src=&quot;http://www25.a8.net/svt/bgt?aid=110401381039&amp;wid=002&amp;eno=01&amp;mid=s00000001717002003000&amp;mc=1&quot;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;img border=&quot;0&quot; width=&quot;1&quot; height=&quot;1&quot; src=&quot;http://www13.a8.net/0.gif?a8mat=1TQA91+N7Y56+D8Y+BXB8X&quot; alt=&quot;&quot;&gt;</content><link rel='replies' type='application/atom+xml' href='http://programing-memo.blogspot.com/feeds/8621031806329822485/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://programing-memo.blogspot.com/2011/04/postfixmaildir.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3512099112218523262/posts/default/8621031806329822485'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3512099112218523262/posts/default/8621031806329822485'/><link rel='alternate' type='text/html' href='http://programing-memo.blogspot.com/2011/04/postfixmaildir.html' title='ユーザ追加時にpostfixのMailDirを作成'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3512099112218523262.post-7192202308927769799</id><published>2011-04-14T23:50:00.004+09:00</published><updated>2011-05-15T03:08:29.126+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="CentOS"/><category scheme="http://www.blogger.com/atom/ns#" term="dovecot"/><category scheme="http://www.blogger.com/atom/ns#" term="postfix"/><category scheme="http://www.blogger.com/atom/ns#" term="さくらVPS"/><title type='text'>さくらVPSでDovecotとPostfixの暗号化</title><content type='html'>さくらVPSのCentOS 5.5にDovecotのインストールとPostfixの暗号化をした時のメモ&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://px.a8.net/svt/ejp?a8mat=1TQA91+N7Y56+D8Y+BXB8X&quot; target=&quot;_blank&quot;&gt;&lt;br /&gt;
&lt;img border=&quot;0&quot; width=&quot;468&quot; height=&quot;60&quot; alt=&quot;&quot; src=&quot;http://www25.a8.net/svt/bgt?aid=110401381039&amp;wid=002&amp;eno=01&amp;mid=s00000001717002003000&amp;mc=1&quot;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;img border=&quot;0&quot; width=&quot;1&quot; height=&quot;1&quot; src=&quot;http://www13.a8.net/0.gif?a8mat=1TQA91+N7Y56+D8Y+BXB8X&quot; alt=&quot;&quot;&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;span style=&quot;font-size: large;&quot;&gt;・サーバー証明書の作成&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;pre&gt;cd /etc/pki/tls/certs
make mail.pem
&lt;/pre&gt;実行すると&lt;br /&gt;
&lt;pre&gt;Country Name (2 letter code) [GB]:
&lt;/pre&gt;と国をきかれるので[jp]と入力&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;State or Province Name (full name) [Berkshire]:
&lt;/pre&gt;ときかれるので、都道府県を入力&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;Locality Name (eg, city) [Newbury]:
&lt;/pre&gt;ときかれるので、市区町村を入力&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;Organization Name (eg, company) [My Company Ltd]:
&lt;/pre&gt;ときかれるので、サイト名を入力&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;Organizational Unit Name (eg, section) []:
&lt;/pre&gt;ときかれるので、Enter&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;Common Name (eg, your name or your server&#39;s hostname) []:
&lt;/pre&gt;ときかれるので、メールソフトで使用するメールサーバー名を入力&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;Email Address []:
&lt;/pre&gt;ときかれるので、管理者のメールアドレスを入力&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;span style=&quot;font-size: large;&quot;&gt;・Dovecot&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;div style=&quot;color: blue;&quot;&gt;&lt;b&gt;・インストール&lt;/b&gt;&lt;/div&gt;&lt;pre&gt;yum install dovecot
chkconfig dovecot on
&lt;/pre&gt;&lt;br /&gt;
&lt;div style=&quot;color: blue;&quot;&gt;&lt;b&gt;・/etc/dovecot.confの編集&lt;/b&gt;&lt;/div&gt;・受け付けるプロトコルを指定&lt;br /&gt;
&lt;pre&gt;#protocols = imap imaps pop3 pop3s
&lt;/pre&gt;のコメントを外す&lt;br /&gt;
&lt;br /&gt;
・sslを有効にする&lt;br /&gt;
&lt;pre&gt;#ssl_disable = no
&lt;/pre&gt;のコメントを外す&lt;br /&gt;
&lt;br /&gt;
・postfixのメールボックス形式と同じにする&lt;br /&gt;
&lt;pre&gt;mail_location = maildir:~/Maildir
&lt;/pre&gt;&lt;br /&gt;
&lt;pre&gt;#ssl_cert_file = /etc/pki/dovecot/certs/dovecot.pem
#ssl_key_file = /etc/pki/dovecot/private/dovecot.pem
&lt;/pre&gt;を&lt;br /&gt;
&lt;pre&gt;ssl_cert_file = /etc/pki/tls/certs/mail.pem
ssl_key_file = /etc/pki/tls/certs/mail.pem
&lt;/pre&gt;に変更&lt;br /&gt;
&lt;br /&gt;
・Dovecotの再起動&lt;br /&gt;
&lt;pre&gt;/etc/init.d/dovecot restart
&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;color: blue;&quot;&gt;&lt;b&gt;・Postfixの暗号化&lt;/b&gt;&lt;/div&gt;前提条件として、基本的な設定は、&lt;a href=&quot;http://programing-memo.blogspot.com/2011/04/vpspostfix.html&quot;&gt;こちら&lt;/a&gt;で設定済みとします。&lt;br /&gt;
&lt;br /&gt;
・/etc/postfix/main.cfの設定&lt;br /&gt;
ファイルの最後に以下を記述&lt;br /&gt;
&lt;pre&gt;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
&lt;/pre&gt;&lt;br /&gt;
・/etc/postfix/master.cfの編集&lt;br /&gt;
&lt;pre&gt;#smtps     inet  n       -       n       -       -       smtpd
#  -o smtpd_tls_wrappermode=yes
#  -o smtpd_sasl_auth_enable=yes
#  -o smtpd_client_restrictions=permit_sasl_authenticated,reject
&lt;/pre&gt;を&lt;br /&gt;
&lt;pre&gt;smtps     inet  n       -       n       -       -       smtpd
  -o smtpd_tls_wrappermode=yes
  -o smtpd_sasl_auth_enable=yes
#  -o smtpd_client_restrictions=permit_sasl_authenticated,reject
&lt;/pre&gt;に変更し、Postfixを再起動&lt;br /&gt;
&lt;br /&gt;
iptablesの設定で、25,110,465,995のポートを開け、ローカルPCからメールソフトで送受信を確認&lt;br /&gt;
&lt;br /&gt;
[2011.4.16追記]&lt;br /&gt;
ローカルPCから外部のメールへ送信しようとすると&lt;br /&gt;
&lt;pre&gt;NOQUEUE: reject: RCPT from XXX[IPアドレス]: &lt;送信先メールアドレス&gt;: Relay access denied; from=&lt;送信元メールアドレス&gt; to=&lt;送信先メールアドレス&gt; proto=ESMTP helo=&lt;[192.168.11.X]&gt;
&lt;/pre&gt;と言われ拒否されるので、とりあえず/etc/postfix/main.cfのmynetworkにローカルPCのIPアドレスを追記&lt;br /&gt;
&lt;pre&gt;mynetworks = 168.100.189.0/28, 127.0.0.0/8, ローカルPCのIPアドレス
&lt;/pre&gt;&lt;br /&gt;
固定アドレスじゃない時の方法は、調べてません。。</content><link rel='replies' type='application/atom+xml' href='http://programing-memo.blogspot.com/feeds/7192202308927769799/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://programing-memo.blogspot.com/2011/04/vpsdovecotpostfix.html#comment-form' title='1 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3512099112218523262/posts/default/7192202308927769799'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3512099112218523262/posts/default/7192202308927769799'/><link rel='alternate' type='text/html' href='http://programing-memo.blogspot.com/2011/04/vpsdovecotpostfix.html' title='さくらVPSでDovecotとPostfixの暗号化'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3512099112218523262.post-4685191051592925378</id><published>2011-04-14T16:04:00.003+09:00</published><updated>2011-04-20T02:19:41.912+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="apache"/><category scheme="http://www.blogger.com/atom/ns#" term="awstats"/><category scheme="http://www.blogger.com/atom/ns#" term="CentOS"/><category scheme="http://www.blogger.com/atom/ns#" term="さくらVPS"/><title type='text'>さくらVPSでアクセス解析awstatsを使う</title><content type='html'>さくらVPSのCentOS 5.5にアクセス解析awstatsをインストールした時のメモ。&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;color: blue;&quot;&gt;&lt;span style=&quot;font-size: large;&quot;&gt;&lt;b&gt;・awstatsの入手&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;
公式レポジトリには存在しないので、wgetで取得&lt;br /&gt;
&lt;pre&gt;wget http://prdownloads.sourceforge.net/awstats/awstats-7.0-1.noarch.rpm
&lt;/pre&gt;&lt;br /&gt;
署名がないので、nogpgcheckオプションをつけてインストール&lt;br /&gt;
&lt;pre&gt;yum install --nogpgcheck awstats-7.0-1.noarch.rpm
&lt;/pre&gt;&lt;br /&gt;
&lt;b&gt;・アクセスした国のリストを取得する為、perl-Geo-IPfreeをインストールする&lt;/b&gt;&lt;br /&gt;
&lt;pre&gt;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
&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;color: blue;&quot;&gt;&lt;span style=&quot;font-size: large;&quot;&gt;&lt;b&gt;・設定ファイルの作成&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;pre&gt;/usr/local/awstats/tools/awstats_configure.pl
&lt;/pre&gt;を実行すると対話式に設定できます。&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;Do you want to continue setup from this NON standard directory [yN] ?
&lt;/pre&gt;と聞かれるので[y]&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;Config file path (&#39;none&#39; to skip web server setup):
&lt;/pre&gt;と聞かれるので&lt;br /&gt;
&lt;pre&gt;/etc/httpd/conf/httpd.conf
&lt;/pre&gt;と入力&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;file (required if first install) [y/N] ? 
&lt;/pre&gt;と聞かれるので[y]&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;Your web site, virtual server or profile name:
&lt;/pre&gt;と聞かれるのでドメインを入力&lt;br /&gt;
&lt;br /&gt;
これ以降は、全てEnterキーでデフォルトの設定にすると&lt;br /&gt;
/etc/awstats/awstats.ドメイン名.confファイルが作成される。&lt;br /&gt;
&lt;b&gt;&lt;br /&gt;
&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&lt;br /&gt;
&lt;/b&gt;&lt;br /&gt;
&lt;div style=&quot;color: blue;&quot;&gt;&lt;span style=&quot;font-size: large;&quot;&gt;&lt;b&gt;・エディタで作成されたファイルを開き、以下を編集&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;b&gt;・ログファイルの場所&lt;/b&gt;&lt;br /&gt;
&lt;pre&gt;#LogFile=&quot;/var/log/httpd/mylog.log&quot;
LogFile=&quot;/var/log/httpd/access_log&quot;
&lt;/pre&gt;&lt;br /&gt;
&lt;b&gt;・言語を日本語に設定&lt;/b&gt;&lt;br /&gt;
&lt;pre&gt;#Lang=&quot;auto&quot;
Lang=&quot;jp&quot;&lt;/pre&gt;&lt;br /&gt;
&lt;b&gt;・アクセス元の国情報を取得&lt;/b&gt;&lt;br /&gt;
&lt;pre&gt;#LoadPlugin=&quot;geoipfree&quot;
LoadPlugin=&quot;geoipfree&quot;
&lt;/pre&gt;&lt;br /&gt;
&lt;b&gt;・解析から外すIPアドレスを設定&lt;/b&gt;&lt;br /&gt;
&lt;pre&gt;#SkipHosts=&quot;&quot;
SkipHosts=&quot;IPアドレス&quot;
&lt;/pre&gt;&lt;br /&gt;
&lt;b&gt;・特定のIPアドレスのみ解析を閲覧できるように設定&lt;/b&gt;&lt;br /&gt;
&lt;pre&gt;#AllowAccessFromWebToFollowingIPAddresses=&quot;&quot;
AllowAccessFromWebToFollowingIPAddresses=&quot;IPアドレス&quot;
&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;color: blue;&quot;&gt;&lt;span style=&quot;font-size: large;&quot;&gt;&lt;b&gt;・/etc/httpd/conf/httpd.confを編集&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;pre&gt;Alias /awstatsclasses &quot;/etc/awstats/wwwroot/classes/&quot;
Alias /awstatscss &quot;/etc/awstats/wwwroot/css/&quot;
Alias /awstatsicons &quot;/etc/awstats/wwwroot/icon/&quot;
ScriptAlias /awstats/ &quot;/etc/awstats/wwwroot/cgi-bin/&quot;
&lt;/pre&gt;を&lt;br /&gt;
&lt;pre&gt;Alias /awstatsclasses &quot;/usr/local/awstats/wwwroot/classes/&quot;
Alias /awstatscss &quot;/usr/local/awstats/wwwroot/css/&quot;
Alias /awstatsicons &quot;/usr/local/awstats/wwwroot/icon/&quot;
ScriptAlias /awstats/ &quot;/usr/local/awstats/wwwroot/cgi-bin/&quot;
&lt;/pre&gt;&lt;br /&gt;
&amp;lt;Directory &quot;/etc/awstats/wwwroot&quot;&amp;gt;以下を&lt;br /&gt;
&lt;pre&gt;&lt;directory &quot;=&quot;&quot; awstats=&quot;&quot; local=&quot;&quot; usr=&quot;&quot; wwwroot&quot;=&quot;&quot;&gt;
    Options None
    Order deny,allow
    Deny from all
    Allow from all
&lt;/directory&gt;
&lt;/pre&gt;と変更し、apacheの再起動&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;/etc/init.d/httpd restart
&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;color: blue;&quot;&gt;&lt;span style=&quot;font-size: large;&quot;&gt;&lt;b&gt;・awstats.plの実行&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;pre&gt;mkdir /var/lib/awstats
/usr/local/awstats/wwwroot/cgi-bin/awstats.pl -update -config=ドメイン
&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;color: blue;&quot;&gt;&lt;span style=&quot;font-size: large;&quot;&gt;&lt;b&gt;・1時間毎に解析するようにcrontabを設定 &lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;pre&gt;crontab -e
&lt;/pre&gt;&lt;br /&gt;
&lt;pre&gt;00 * * * * /usr/bin/perl /usr/local/awstats/wwwroot/cgi-bin/awstats.pl -config=ドメイン
&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
[2011.4.15追記]&lt;br /&gt;
cronが動作すると毎回root当てにメールが飛ぶので、&lt;a href=&quot;http://mylinux.g.hatena.ne.jp/teraco/20081208/1228696758&quot;&gt;ここ&lt;/a&gt;を参考にし上記に[ &amp;gt; /dev/null]を追記&lt;br /&gt;
&lt;pre&gt;00 * * * * /usr/bin/perl /usr/local/awstats/wwwroot/cgi-bin/awstats.pl -config=ドメイン  &amp;gt; /dev/null
&lt;/pre&gt;&lt;br /&gt;
※ デフォルトではviがエディタとして開くので、emacsに変更する為.bashrcに&lt;br /&gt;
&lt;pre&gt;export EDITOR=emacs
&lt;/pre&gt;を記述&lt;br /&gt;
&lt;br /&gt;
ブラウザから[http://アドレス/awstats/awstats.pl]でアクセスするとawstatsの解析結果が表示されます。&lt;br /&gt;
&lt;a href=&quot;http://px.a8.net/svt/ejp?a8mat=1TQA91+N7Y56+D8Y+BXB8X&quot; target=&quot;_blank&quot;&gt;&lt;br /&gt;
&lt;img border=&quot;0&quot; width=&quot;468&quot; height=&quot;60&quot; alt=&quot;&quot; src=&quot;http://www25.a8.net/svt/bgt?aid=110401381039&amp;wid=002&amp;eno=01&amp;mid=s00000001717002003000&amp;mc=1&quot;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;img border=&quot;0&quot; width=&quot;1&quot; height=&quot;1&quot; src=&quot;http://www13.a8.net/0.gif?a8mat=1TQA91+N7Y56+D8Y+BXB8X&quot; alt=&quot;&quot;&gt;</content><link rel='replies' type='application/atom+xml' href='http://programing-memo.blogspot.com/feeds/4685191051592925378/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://programing-memo.blogspot.com/2011/04/vpsawstats.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3512099112218523262/posts/default/4685191051592925378'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3512099112218523262/posts/default/4685191051592925378'/><link rel='alternate' type='text/html' href='http://programing-memo.blogspot.com/2011/04/vpsawstats.html' title='さくらVPSでアクセス解析awstatsを使う'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3512099112218523262.post-3162032181846874602</id><published>2011-04-13T18:09:00.003+09:00</published><updated>2011-05-15T03:09:21.028+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="CentOS"/><category scheme="http://www.blogger.com/atom/ns#" term="postfix"/><category scheme="http://www.blogger.com/atom/ns#" term="さくらVPS"/><title type='text'>OP25B対策</title><content type='html'>さくらVPSの本登録の完了前では、25番ポートからメールを送信できないのでgmail経由でメールを送信した時のメモ&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
(本登録の申請中も送信できません。)&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://px.a8.net/svt/ejp?a8mat=1TQA91+N7Y56+D8Y+BXB8X&quot; target=&quot;_blank&quot;&gt;&lt;br /&gt;
&lt;img border=&quot;0&quot; width=&quot;468&quot; height=&quot;60&quot; alt=&quot;&quot; src=&quot;http://www25.a8.net/svt/bgt?aid=110401381039&amp;wid=002&amp;eno=01&amp;mid=s00000001717002003000&amp;mc=1&quot;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;img border=&quot;0&quot; width=&quot;1&quot; height=&quot;1&quot; src=&quot;http://www13.a8.net/0.gif?a8mat=1TQA91+N7Y56+D8Y+BXB8X&quot; alt=&quot;&quot;&gt;&lt;br /&gt;
&lt;br /&gt;
/etc/postfix/main.cfに&lt;br /&gt;
&lt;pre&gt;relayhost = [smtp.gmail.com]:587
&lt;/pre&gt;を記述&lt;br /&gt;
&lt;br /&gt;
/etc/postfix/main.cfの最後に以下を追加&lt;br /&gt;
&lt;pre&gt;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
&lt;/pre&gt;&lt;br /&gt;
/etc/postfix/にsasl_passwdファイルを作成し以下を記述&lt;br /&gt;
&lt;pre&gt;[smtp.gmail.com]:587 gmailのメールアドレス:パスワード
&lt;/pre&gt;&lt;br /&gt;
root以外見れなくする&lt;br /&gt;
&lt;pre&gt;chmod 600 /etc/postfix/sasl_passwd
&lt;/pre&gt;&lt;br /&gt;
&lt;pre&gt;postmap /etc/postfix/sasl_passwd
&lt;/pre&gt;を実行し、パスワードをDB化する。&lt;br /&gt;
&lt;br /&gt;
postfixの再起動&lt;br /&gt;
&lt;pre&gt;/etc/init.d/postfix restart&lt;/pre&gt;&lt;br /&gt;
ターミナル上でmailコマンドで送信できることを確認。&lt;br /&gt;
&lt;br /&gt;
※ gmail経由で送信すると、差出人がgmailのアドレスになってしまうのでgmailの[設定] -[アカウントとインポート]-[名前]の[別のアドレスからメッセージを送信]にメールアドレスを追加する必要があります。</content><link rel='replies' type='application/atom+xml' href='http://programing-memo.blogspot.com/feeds/3162032181846874602/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://programing-memo.blogspot.com/2011/04/op25b.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3512099112218523262/posts/default/3162032181846874602'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3512099112218523262/posts/default/3162032181846874602'/><link rel='alternate' type='text/html' href='http://programing-memo.blogspot.com/2011/04/op25b.html' title='OP25B対策'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>