CentOSにMoinMoinを導入

1.yum install moin

/usr/share/moinが作成される

2.以下のコマンドを実行

mkdir -p /var/www/mywiki
cp -a /usr/share/moin/{data,underlay} /var/www/mywiki
cp -a /usr/share/moin/server/moin.cgi /var/www/mywiki
cp -a /usr/share/moin/config/wikiconfig.py /var/www/mywiki/cgi-bin
chown -R apache:apache /var/www/mywiki/{data,underlay}

3.設定ファイルの作成(/etc/httpd/conf.d/mywiki.conf)

ScriptAlias /mywiki "/var/www/mywiki/cgi-bin/moin.cgi"

    Options Indexes FollowSymLinks ExecCGI
    AllowOverride None
    Order allow,deny
    Allow from all


Alias /wiki/ "/usr/share/moin/htdocs/"

    Options Indexes FollowSymLinks
    AllowOverride None
    Order allow,deny
    Allow from all

4.httpdを起動

5.http://localhost/mywiki/にアクセス

6.403 Forbiddenと表示された場合の対処

SELinuxhttpdを保護していることが原因。
SELinuxによるhttpdの保護を以下の手順で無効にする。

  1. policycoreutils-guiをインストール
  2. システム->設定->SELinux Management
  3. Boolean->HTTPD Service->Disable SELinux protection for httpd daemon
  4. チェックを外す

CentOSにvsftpdを導入するときのつまりどころ

 CentOS5.4にFTPサーバのvsftpdを導入した。
導入にあたり2点つまった所があったので、それについて書く。

問題1:chroot_local_user=YESを設定するとログインできなくなる

詳細

 vsftpdの設定ファイル中でchroot_local_user=YESを指定した状態で、
FTPクライアントからログインすると、"500 OOPS: chroot"というエラー
メッセージが表示されてログインできない。

設定ファイルの内容(関連箇所のみ)
chroot_local_user=YES
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list
原因

 SELinuxFTPによるユーザのホームディレクトリの読み書きを禁止しているため

対処方法

 SELinuxの設定をFTPによるユーザのホームディレクトリの読み書きを許可に変更する。
対処手順の例を以下に示す。

  1. SELinuxGUI設定ツール(policycoreutils-gui)を導入する
  2. メニュー「システム」中の管理から「SeLinux Managment」を開く
  3. 左側のメニュー「Select」から「Boolean」を選択する
  4. FTPの設定項目「Allow ftp to read/write files in the user home directories」にチェックする

問題2:FileZillaからFTPSでログインできない

詳細

 FTPクライアントFileZilla(Ver.3.1.0以降)からFTPSでアクセスすると、
ディレクトリ一覧の取得に失敗しました」とエラーメッセージが表示され、ログインできない。

原因

 FileZillaとvsftpdのSSL/TLS通信に関する仕様の違いが原因らしい

対処方法

 FTPクライアントFileZillaから最新のWINSCPに変える。

Google Web履歴ダウンローダー

 WebブラウザChromeのエクステンションとしてGoogle Web履歴ダウンローダーを作成してみた。

作成した動機

  1. リア充ではないので連休中は暇だった
  2. Google Web履歴をダウンロードすることに微妙なニーズがありそうだった
  3. 以前作成したGoogle Web履歴のダウンロードプログラムの不具合や使用しづらさ

以前作成したダウンロードプログラムとの違い

  1. ダウンロードオプションの設定をGUIでできるようになった
  2. プロキシ環境下でも動作する(多分)

Scalaのvim用の設定

はじめに

 Windows用のvimにて、Scalaプログラムの編集時に、シンタックスハイライト、インデントルールを適用するための設定を行った。また、エラーの修正の効率を上げるために、QuickFixコマンドを利用可能にするための設定も行った。細部は異なるが、Linuxなどのvimでも利用できるはず。
 記事中で設定ファイルを3つダウンロードし、2つのファイルを記述するけど、面倒くさいので、必要なファイルを用意しておく。

シンタックスハイライトやインデントルールの設定

 Scalaのプロジェクトの公式のvim用設定があるのでそれを利用する。

 まず、公式vim用設定ファイルのページにアクセスする。このページには、3つのサブディレクトリ「ftdetect」、「indent」、「syntax」があるので、それぞれの配下にある「scala.vim」をダウンロードする。名前が同じで、それぞれの名前を「scala-ftd.vim」「scala-ind.vim」「scala-syn.vim」としておく。

 次に、ダウンロードしたvim用の設定ファイルを配置するためのフォルダ「$HOME/vimfiles/ftdetect」「 $HOME/vimfiles/indent」「$HOME/vimfiles/syntax」を作成する($HOMEはホームフォルダを意味する)。そして、3つのvim用の設定ファイル「scala-ftd.vim」「scala-ind.vim」「scala-syn.vim」を対応するフォルダに「scala.vim」というファイル名で保存する。

 以上で、vimscalaのファイルを編集するときに、シンタックスハイライトや専用のインデントルールが適用される。

Scalaプログラムの編集時に独自設定を利用する

 上記のシンタックスハイライトやインデントルールの設定を行った後に、「$HOME/vimfiles/ftplugin」を作成する。そして、そのフォルダにScala用の独自設定を「scala.vim」というファイル名で保存する。

Scalaプログラムのエラー修正の効率向上(QuickFixコマンドを利用できるようにする)

 Vimには編集-コンパイル-編集のサイクルを加速するための特別なQuickFixコマンド(たとえば、cw、clなど)がある。これを利用すると、編集中のプログラムのコンパイル、エラー箇所の修正が容易になる。QuickFixコマンドは、CやJavaといった有名言語なら最初から利用可能である。しかし、Scalaに対してQuickfixは利用できない。以下、Scalaプログラムの編集中にQuickfixコマンドを利用するための手順を述べる。

 まず、Scalaコンパイラ用の設定ファイル「scalac.vim」を作成する。下にファイル内容を示す。「scalac.vim」を「vimのインストールフォルダ/runtime/compiler」に保存する。これで、Scalaプログラムの編集時でもQuickFixコマンドが使用可能になる。なお、作成にあたり、ほぼJavaコンパイラの設定ファイル「javac.vim」を流用した。

scalac.vim
if exists("current_compiler")
  finish
endif
let current_compiler = "scalac"

if exists(":CompilerSet") != 2		" older Vim always used :setlocal
  command -nargs=* CompilerSet setlocal <args>
endif

CompilerSet makeprg=scalac

CompilerSet errorformat=%f:%l:\ error:\ %m,%-Z%p^,%-C%.%#,%-G%.%#

 

 適当なエラーが含まれるScalaプログラムを開き、以下の手順でコマンドを実行する。すると、コンパイル時のエラーが表示される。エラー表示ウィンドウに移動し、「Enter」を押すと、実際にエラーがある行にジャンプできる(便利!)。

:compiler scalac
:make 編集中のScalaプログラムの名前
:cw

Scalaプログラムのコンパイルと実行の簡略化

 vimを開くたびに、「:compiler scalac」を実行するのは面倒くさい。また、makeコマンドを実行するのも面倒くさい。なので、Scalaプログラムを開いたときに、自動で「:compiler scalac」を実行し、ワンタッチでmakeコマンドの実行をできるようにする。そのために、「$HOME/vimfiles/ftplugin」に下の設定ファイルを「scala.vim」として保存する。

Scala専用の設定
compiler scalac

"コンパイル
map <F5> <ESC>:w<CR>:cd %:h<CR>:make -sourcepath . %:p<CR>:cd -<CR>
map! <F5> <ESC>:w<CR>:cd %:h<CR>:make -sourcepath . %:p<CR>:cd -<CR>

"実行
map <F6> <ESC>:w<CR>:cd %:h<CR>:!scala %:r<CR>:cd -<CR>
map! <F6> <ESC>:w<CR>:cd %:h<CR>:!scala %:r<CR>:cd -<CR>

"コンパイル+実行
map <F7> <ESC>:w<CR>:cd %:h<CR>:make -sourcepath . %:p<CR>:!scala %:r<CR>:cd -<CR>
map! <F7> <ESC>:w<CR>:cd %:h<CR>:make -sourcepath . %:p<CR>:!scala %:r<CR>:cd -<CR>

MS-DOSからjavacとjavaの同時実行する

コーティング中のjavaプログラムをコマンドラインから実行するときに、javacとjavaを毎回別々に実行するのが面倒になった。

なので、javacとjavaコマンドを同時実行する簡単なMS-DOS用のバッチを作成した。

使用例

myjava.bat XXX.java

myjava.batは上のソースコードのファイル名。
XXX.javaは実行したいjavaプログラム

ソースコード

javac %~nx1
java %~n1

1行目の%~nx1で1番目のコマンドライン引数からファイル名を取得(XXX.java)
2行目の%~n1で1番目のコマンドライン引数から拡張子抜きのファイル名を取得(XXX)

Scalaの導入時にはまったところ

 暇なので、最近話題(?)のプログラミング言語Scalaを使ってみることにした。


 そのために、ITProで行われているScala講座の第一回なぜ Scalaなのか?を見ながら、Scalaをインストールし、Scalaプログラム「HelloWorld.scala」を実行させた。


 このとき、「scala HelloWorld」を実行しても「no such file: HelloWorld」というエラーが表示されるだけだった。


 この原因は、scalaコマンドを実行するときに、カレントディレクトリのクラスファイルをサーチしていないことだと分かった。


 これに対する解決方法は2つあった。
1、scalaコマンドの実行時にオプションでクラスパスを指定する。例えば、「scala -classpath . HelloWorld」
2、環境変数classpathにカレントディレクトリを表す「.」を追加


 scalaコマンドを実行する度に、オプション指定するのは面倒なので、classpathにカレントディレクトリを指定することにした。これにより、「scala HelloWorld」によりHelloWorld.scalaが実行できるようになった。めでたしめでたし。

Chrome Extentionの作成メモ

現在閲覧中のページに自分のExtentionのContentScriptが埋め込まれているか埋め込まれていないかで、BackgroudnPageでの処理を変える方法についてのメモ。

それには、javascriptの組み込み関数setTimeoutを利用する。そして、BackgroundPageからContentScriptにメッセージを送り、一定時間内に返信が来るかどうかで処理を分けるようにする。

実際には、こんな方法でなくてもAPIとして用意されてそうなので、しっかり調べる。

記述例

ContentScriptsの記述
chrome.extension.onRequest.addListener(function(req, sender, sendResponse) {
  /*
    具体的な処理 ...
  */
  
  //BackgroundPageへ返信
  sendResponse(str);
});
BackgroundPageの記述
var timerId;

//閲覧中のページにコンテンツスクリプトを埋め込めなかった場合の処理
var f = function(...) {
  /*
    具体的な処理 ...
  */
}

chrome.tabs.getSelected(null, function(tab) {
  //閲覧中のページから、一定時間(50ミリ秒)返信が来なかったら実行
  timerId = setTimeout(f, 50);
  
  //BackgroundPageから閲覧中のページのContentScriptsに対してリクエストを送る
  chrome.tabs.sendRequest(tab.id, req, function(text) {
      //以下の処理は、一定時間内に返信が来た場合に実行
      //つまり、閲覧中のページにContentScriptsが存在する
      
      //最初に、閲覧中のページにコンテンツスクリプトを埋め込めなかった場合の処理をキャンセル
      clearTimeout(timerId);
      
      /*
       具体的な処理 ...
      */
    })
  });
}