imadedede のブログ

今出川潤の出張所。

Apache + pukiwiki と Tomcat + GitBucket をポート80番で共存させる

Linuxデスクトップ環境で、ゆるく wiki と git を運用したい。というわけで、 localhostpukiwiki と GitBucket をインストールして起動してみる。

方針として、ゆるく運用&構築したいので、なるべく手軽にインストールして、デフォルト設定に近い状態で使う。

環境は Linux Mint 19 Tera の Mate で。それでは行ってみよう。

Apache + pukiwiki

まず Apache による wiki から設定していく。

インストールするパッケージ

必要なパッケージのインストールは Synaptic で行う。 GUI で楽したい。下記のパッケージをインストール指定して適用する。

インストールが終わったら http://localhost がすでに動いている。アクセスして動作を確認。

設定ファイル確認

主な設定があるファイルは /etc/apache2/apache2.conf にある。今回はこれは特にいじらないが、ざっくり見ておく。

また /etc/apache2/envvars を見て APACHE_RUN_USERAPACHE_RUN_GROUP が何になっているかを確認しておく。Linux Mint は元々は UbuntuDebian 系なので、これは www-data になっている。

念の為、

cat /etc/group

しておいて、 www-data ができていることを確認しておく。

pukiwiki のダウンロードと所有権の変更

pukiwiki をここからダウンロード。現在の最新版は1.5.1。 pukiwiki.php.ini の変更などインストールに関することは該当ページを参照。動作確認するだけならいじる必要はない。

解凍後にできたフォルダの名前を pukiwiki に変更。そして pukiwiki フォルダを Apache のデータ用フォルダにコピーする

sudo mv pukiwiki /var/www/html/

そして /var/www 以下の所有権の変更。

sudo chown -R www-data.www-data /var/www

動作確認

sudo systemctl restart apache2

apache を再起動。 http://localhost/pukiwiki/ にアクセスして、 pukiwiki が動いていることを確認する。

Tomcat + GitBucket

Apache の次は、 Tomcat で Git サーバを構築する。

インストールするパッケージ

Synaptic で以下のパッケージをインストール指定して適用。

  • default-jre
  • Tomcat8
  • Tomcat8-admin

Tomcat Web アプリケーションマネージャも一緒に入れる。なくてもいいけど、ゆるく運用するにはこういうの欲しい。

設定ファイル変更

/etc/tomcat8/tomcat.users.xml を編集する。コメントアウトを有効化して、管理人ロールとアカウントを追加。

 <role rolename="admin-gui"/>
 <user username="tomcat" password="password" roles="tomcat,admin-gui"/>

ポート設定を変更。 /etc/tomcat8/server.xml を編集して、デフォルトのポートを 8080 から 8081 に変更。

    <Connector port="8081" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />

これは必要ないけど、8080のままだと他のアプリのデフォルト設定とこの先ガンガンぶつかっていってしまうため。

GitBucket のダウンロードと所有権の変更

GitBucket の Release から gitgucket.war のダウンロード。http://localhost:8081/manager/ にアクセスしてWebアプリケーションマネージャから gitgucket.war ファイルをアップロード。そして現段階では起動しないことを確認しておく。

念の為、ウェブAPPマネージャからアップロードされた先のフォルダを見ておく。

ls -al /var/lib/tomcat8/webapps

gitbucket.war がちゃんとコピーできていて、かつ所有者が tomcat8 になっていることを確認する。

次に GitBucket のデータ用フォルダを作って、所有権をtomcat8に明け渡す。

sudo mkdir /var/lib/tomcat8/.gitbucket
sudo chown tomcat8:tomcat8 /var/lib/tomcat8/.gitbucket 

こうしてからだとWebアプリケーションマネージャでGitBucketを起動できる。

GitBucketがどこをデータ用フォルダとするかは環境によって異なるらしい。Ubuntu 16.04なら /usr/share/tomcat8/.gitbucketからしい(こちらのブログを参照)。 Webアプリケーションマネージャから一度起動に失敗しておくと、 /var/log/tomcat8/localhost.*.log にエラーログが残る。そのエラーログを読めば、どこにフォルダを作ろうとして失敗したのかがわかる。わかったら、あとはそこに作って所有権を渡せばいい。

まあ普通はいちいち失敗させて確認するより、予め環境変数によってフォルダを設定すると思う(こちらのブログ参照)。今回はゆるく運用ということでこのやり方はしないけど、ちゃんと運用するならちゃんとやろう。

動作確認

sudo systemctl restart tomcat8

tomcat を再起動。 http://localhost:8081/gitbucket/ にアクセスしてみる。動作していたらOK。

ポート80番で ApacheTomcat を共存させる

さて、ここからが本番。Tomcat から GitBucket を起動したものの、このままだといちいちURL にポート番号をいれる必要がある。これは面倒。なので、http のデフォルトポート80番からアクセスできるようにする。

方針としては、特定の URL にアクセスしたときのみ、Apache から Tomcat に切り替えてアクセスする。

Tomcat 側の設定

/etc/tomcat8/server.xml を編集する。AJP に関する部分がコメントアウトされているので、これを外して有効化する。

    <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />

Apache 側の設定

いくつかのモジュールを有効化する。

sudo a2enmod proxy proxy_http proxy_ajp

有効化したら、 /etc/apache2/mods-enabled/proxy.conf にファイルができているので、アクセスして編集する。 <IfModule> タグの内側に以下のように記述。

ProxyPass /gitbucket/ ajp://localhost:8009/gitbucket/
ProxyPassReverse /gitbucket/ ajp://localhost:8009/gitbucket/

動作確認

apachetomcat の再起動を行う。

sudo systemctl restart apache2 tomcat8

http://localhost/gitbucket/ にアクセスしてみる。アクセスできるならOK。

もちろん、既存の http://localhost/pukiwiki/ の方へも問題なくアクセスできることも確認しておく。

感想

apachetomcat もちゃんと使うのは初めてだったため、とても大変だった。 所有権に関するトラブルでだいぶ悩んだんだけど、検索する限りよくあるトラブルらしいので、今後とも気をつけていきたい。

それはそれとして、 Linux MintLinux デスクトップ環境としてかなり使いやすく感じた。元が Ubuntu でさらにその元は Debian なので、情報が検索してヒットしやすいし、様々なツールが既に用意されている。強力なバックアップツールまでついているので、ゆるく運用するにはもってこい。

というわけで、しばらくは Linux Mint を使ってみようと思った。

続・C言語で文字列を逆にする

昨日の記事の続き。
寝る前にふと、文字列長を取得する部分を改善できるのではないか、と思いついた。
しかしそれなら長さ0の文字列にどう対応するべきか。
しかたないので関数にして括り出して対応することにした。
以下、改善版のコード。

// 文字列を逆にする
// どうせなら string.h なしで
#include <stdio.h>

// 文字列のポインタを受け取って、その文字列の並びを逆にする
void strrev(char s[]){
	char temp = '\0';
	char *head = s;
	char *tail = s;
	
	// 長さ0の文字列なら操作せず返す
	if(*head == '\0'){ return; }

	// 文字列の最期の文字のポインタを取得する
	while( *(tail+1) != '\0'){ tail++; }

	// 逆にする
	while(head != tail){
		temp = *head;
		*head = *tail;
		*tail = temp;
		
		head++;
		if(head == tail){ break; }
		tail--;
	}
	return;
}

// a.out の後に続く文字列を逆順にする
int main(int argc, char* argv[]){
	char *s = argv[1];
	// 引数が足りないなら比較しない
	if(argc <= 1){ return 0; }

	// 操作前
	printf("Input: %s\n", s);
	// 文字列を逆にする
	strrev(s);
	// 操作後
	printf("Output: %s\n", s);
	return 0;
}

主な変更点は、文字列の長さを測らなくなったこと。
これによって int 型1つ分のメモリ消費がなくなった(その分文字列ポインタが2つ増えた)のと、入れ替えられる文字列の長さが int 型最大値に依存しなくなった。後者は明確な利点ではなかろうか。
計算量は特に変わらず O(n) のオーダのまま。
実行結果はこちら。

imadedede$ ./a.out a
Input: a
Output: a
imadedede$ ./a.out ab
Input: ab
Output: ba
imadedede$ ./a.out abc
Input: abc
Output: cba
imadedede$ ./a.out abcd
Input: abcd
Output: dcba

問題ない。これでよし。

追記:最新版はこちら

C言語で文字列を逆にする

最近 Joel on Software を紙で読んでいる。
その中に気になる一節があった。20章「採用面接ゲリラガイド」の中のこんな文章だ。
(※書籍版での更新日時は2004年6月4日となっており少し新しい。さらに更新された web 版の日記はこちら

4.プログラミングの質問
面接のこの部分には一番時間をかけるべきだ。私は候補者にC言語で(あるいは彼らがなじんでいる言語なら何でもいい)小さな関数を書くように求める。
以下に、私がよく出す問題の例を挙げる。

  1. 文字列をその場で逆にする
  2. 連結リストを逆にする
  3. バイトデータの中で経っているビットの数を数える
  4. 二文探索
  5. 文字列の中で同じ文字が一番長く続くところを見つける
  6. atoi
  7. itoa(スタックやstrrevを使う必要があるため、良い問題だ)

「文字列を逆にするのか・・・strlen() で計って、 malloc() をして・・・」
と考えながら読み進めると、まさにそれを先読みしたかのようなこんな記述が。

(中略)
1.の「文字列をその場で逆順にする」については、私がこれまで面接した候補者はみんな1度目には間違ったやり方をした。例外なく、彼らはもう1つのバッファを用意して、そこに逆順の文字列を作ろうとする。問題は、そのバッファのメモリ領域を誰が割り当てるのか? 誰がそのバッファを開放するのか?

間違ったやり方らしい。
そしてこう続いた。

この質問を何ダースもの候補者に出して気づいた興味深い事実がある。C言語を知っていると思っている人たちの多くが、メモリやポインタを本当には理解していない。彼らは単にそれが分からないのだ。そういう人たちがプログラマとして働いているというのも驚きだが、実際そうなのだ。この質問で候補者を判定する方法はいくつかある。

・・・と、いうことは、ポインタを使えばもっと早くメモリ消費も短くなるのかな?
そんなわけで、書いてみた。

// 文字列を逆にする
// どうせなら string.h なしで
#include <stdio.h>

// a.out の後に続く文字列を逆順にする
int main(int argc, char* argv[]){
	int len = 0;
	char temp = '\0';
	char *s = argv[1];
	char *head = NULL;
	char *tail = NULL;

	// 引数が足りないなら比較しない
	if(argc <= 1){ return 0; }

	// 操作前
	printf("Input: %s\n", s);
	
	// 文字列の長さを取得する
	len = 0;
	head = s;
	while(*head != '\0'){ head++; len++; }

	// 逆にする
	head = s;
	tail = &s[len-1];
	while(head != tail){
		temp = *head;
		*head = *tail;
		*tail = temp;
		
		head++;
		if(head == tail){ break; }
		tail--;
	}
	
	// 操作後
	printf("Output: %s\n", s);
	return 0;
}

実行結果はこんな感じ。

imadedede$ ./a.out a
Input: a
Output: a
imadedede$ ./a.out ab
Input: ab
Output: ba
imadedede$ ./a.out abc
Input: abc
Output: cba
imadedede$ ./a.out abcd
Input: abcd
Output: dcba

これだと、文字数が1文字でも奇数でも偶数でも入れ替えられる。
元の文字列が破壊されてしまうけど、特に制限はなかったからこれでも間違いではないはず。
・・・実のところ、書き始めでは文字列の長さをとった後で head ポインタの初期化を忘れており、そのデバッグに30分ほどかかってしまった。
まだまだ精進が足りませんなあ。
まあでも、たまにはこういうことを考えてみるのも一興ということで。

追記:最新版はこちら

NMeCab を .NET アプリに組み込んで形態素解析

MeCab というものがある。
誤解される恐れがあるのを承知で、かなりざっくりといいかげんに説明すると、これを使うと日本語の漢字の読みとかを文脈に沿って解析してくれる。

MacOS X には(10.5以降から?)標準で入っていて Spotlight 検索などに使われているし、ゆっくり MovieMaker はこれを使っていることが売りの一つになっている。

NMeCab とは、その MeCabC# で書き直されたもの。「ゆっくいち!」は C# 2.0 で開発しているので、試しに NMeCab を使ってみた。

準備

ダウンロードしてくる

NMeCab 配布ページにて最新版をダウンロード。

解凍して、フォルダ内からいくつかテストに必要なモノをもってくる。

現時点での最新版は 0.06.3 。解凍すると NMeCab0.06.3 というフォルダができる。

NMeCab.dll をとってくる

NMeCab0.06.3/trunk/bin にある。 NMeCab の核。

MMF 版もあるけど、これを使うなら C# 4.0 でないといけない。今回は C# 2.0 環境でやりたいのでとりあえずここにあるものを使う。

元々の MeCab に対してバインディングしているわけではないので、この DLL で機能が完結している。

WindowsFormsSample.exe.config をとってくる

NMeCab0.06.3/trunk/bin にある。要は DLL と同じ場所の XML 。辞書のパス指定に使う。

XML 内のシステム辞書を指定するパスの ..\dic\ipadic を、今回は .\dic\ipadic に変更。そしてファイル名を NMeCabTest.exe.config に変更する。

ダウンロードしたものには IPA 辞書が入っているが、自分で NAIST 辞書をダウンロードしてコンパイルしてこのファイルで指定すれば、 NMeCab で NAIST 辞書を使用することも可能。

NMeCab 自体には辞書のコンパイル機能はない。元々の MeCab を使わないといけない。

辞書をとってくる

NMeCab0.06.3/trunk/ にあるdicフォルダをフォルダごととってくる。
DLL の一つ上のフォルダにある。

とってきたものをあつめる

以上、用意したモノを一つのフォルダに集める。
最終的なフォルダ構成はこんな感じ。

temp
├─LibNMeCab.dll
├─NMeCabTest.cs
├─NMeCabTest.exe.config
└─dic
    └─ipadic
        ├─char.bin
        ├─dicrc
        ├─matrix.bin
        ├─sys.dic
        └─unk.dic

この LibNMeCab.dll と同じ場所に NMeCabTest.cs ファイルを作り、コーディングしていく。

テストコード

クラス名やコンストラクタが多少違うもの、基本的には他の MeCab バインディングと変わらない。

/*
 * NMeCab はクラス名が変更されている
 * MeCab::Tagger ⇒ NMeCab.MeCabTagger
 * MeCab::Node ⇒ NMeCab.MeCabNode
 * 
 * 詳しい実装やクラスメンバなどは NMeCab0.06.3/trunk/LibNMeCab/MeCabNode.cs など参照。
 * 
 * mono で使うなら、辞書ファイルパスのバックスラッシュをスラッシュに変更
 * コンパイルは
 * gmcs -r:module.dll use_module.cs
 * 
 */
using System;
using NMeCab;

public class NMeCabTest{
	static public void Main(){
		string sentence = "行く川のながれは絶えずして、しかも本の水にあらず。";
		
		// NMeCab はクラス名が変更されている
		MeCabTagger t = MeCabTagger.Create();
		
		// 形態素を一つずつたどっていく
		Console.WriteLine("形態素をひとつずつたどっていく");
		MeCabNode node = t.ParseToNode( sentence );
		while( node != null ){
			Console.WriteLine(node.Surface + "\t" + node.Feature);
			node = node.Next;
		}
		Console.WriteLine();
		
		// 一気に結果をもらう
		Console.WriteLine("一気に結果をもらう");
		string result = t.Parse( sentence );
		Console.WriteLine(result);
	}
 
}

コンパイル

DLL をライブラリとして指定するのを忘れずに。

csc \r:LibNMeCab.dll NMeCabTest.cs

あと実行前に EXE ファイル名と .exe.config のファイル名が対応していることを確認。

NMeCabTest.exe
NMeCabTest.exe.config

実行結果

コマンドを実行。

$ .¥NMeCabTest.exe
形態素をひとつずつたどっていく
行く川のながれは絶えずして、しかも本の水にあらず。	BOS/EOS,*,*,*,*,*,*,*,*
行く	動詞,自立,*,*,五段・カ行促音便,基本形,行く,イク,イク
川	名詞,一般,*,*,*,*,川,カワ,カワ
の	助詞,連体化,*,*,*,*,の,ノ,ノ
ながれ	動詞,自立,*,*,一段,連用形,ながれる,ナガレ,ナガレ
は	助詞,係助詞,*,*,*,*,は,ハ,ワ
絶えず	副詞,一般,*,*,*,*,絶えず,タエズ,タエズ
し	動詞,自立,*,*,サ変・スル,連用形,する,シ,シ
て	助詞,接続助詞,*,*,*,*,て,テ,テ
、	記号,読点,*,*,*,*,、,、,、
しかも	接続詞,*,*,*,*,*,しかも,シカモ,シカモ
本	名詞,一般,*,*,*,*,本,ホン,ホン
の	助詞,連体化,*,*,*,*,の,ノ,ノ
水	名詞,一般,*,*,*,*,水,ミズ,ミズ
に	助詞,格助詞,一般,*,*,*,に,ニ,ニ
あら	動詞,自立,*,*,五段・ラ行,未然形,ある,アラ,アラ
ず	助動詞,*,*,*,特殊・ヌ,連用ニ接続,ぬ,ズ,ズ
。	記号,句点,*,*,*,*,。,。,。
	BOS/EOS,*,*,*,*,*,*,*,*

一気に結果をもらう
行く	動詞,自立,*,*,五段・カ行促音便,基本形,行く,イク,イク
川	名詞,一般,*,*,*,*,川,カワ,カワ
の	助詞,連体化,*,*,*,*,の,ノ,ノ
ながれ	動詞,自立,*,*,一段,連用形,ながれる,ナガレ,ナガレ
は	助詞,係助詞,*,*,*,*,は,ハ,ワ
絶えず	副詞,一般,*,*,*,*,絶えず,タエズ,タエズ
し	動詞,自立,*,*,サ変・スル,連用形,する,シ,シ
て	助詞,接続助詞,*,*,*,*,て,テ,テ
、	記号,読点,*,*,*,*,、,、,、
しかも	接続詞,*,*,*,*,*,しかも,シカモ,シカモ
本	名詞,一般,*,*,*,*,本,ホン,ホン
の	助詞,連体化,*,*,*,*,の,ノ,ノ
水	名詞,一般,*,*,*,*,水,ミズ,ミズ
に	助詞,格助詞,一般,*,*,*,に,ニ,ニ
あら	動詞,自立,*,*,五段・ラ行,未然形,ある,アラ,アラ
ず	助動詞,*,*,*,特殊・ヌ,連用ニ接続,ぬ,ズ,ズ
。	記号,句点,*,*,*,*,。,。,。
EOS

解析できてる。

その他

ライセンスは GPL / LGPL のデュアルライセンス。アプリに組み込むのも悪くない。

そんな感じで、将来的には「ゆっくいち!」にも組み込みたい。

yukktalk の処理を助けるツールを作ってみた

ゆっくいち!

これは、動画製作ソフト yukktalk の Step1 での作業を補助するためのツールです。
ダウンロード

2012/10/28 更新

ver.1.3.0
・字幕
 形態素改行。
・そのほか
 辞書サイズを改善。台本タイトルを台本のファイル名から取得。

インストール

Vista 以降の人は、解凍してすぐ使えます。

Windows XP 以前の人は .NET 2.0 が必要です。
たぶんここらへん
http://www.microsoft.com/ja-jp/download/details.aspx?id=1639
http://www.microsoft.com/ja-jp/download/details.aspx?id=5913

アンインストールはゴミ箱に捨てるだけです。

あと前提として、 yukktalkAviUtl棒読みちゃんがインストール済みの環境を想定してます。

使い方

1. 台本テキストを用意します。
2. 台本テキストを EXE ファイルにドラッグ&ドロップします。
3. できたファイルを見直して、足りない部分を書き足します。
4. yukktalk の Step2 に進みます。

複数ファイルを同時に投げてもオッケーです。
たぶん「送る」に登録しても動くと思います。


台本テキストの書式について

台本の素.txt を実際に変換してみればだいたいわかると思います。
わかった人はこのセクションを読む必要ないです。

この「ゆっくいち!」は、普通に書いたシナリオを yukktalk で使えるように変換できればいいなあ、と思ったのが開発の動機です。
なので、だいたい一般的なシナリオの書き方に沿っていると思います。
具体的に例を挙げてみます。

カギ括弧

ゆっくり霊夢「ゆっくりしていってね!」

こう書いたときは、カギ括弧の手前を発言者として抜き取り、カギ括弧の内側を発言内容として抜き取っています。
字幕にも棒読みちゃん用台本にも、カギ括弧の中身が渡されます。

◆ゆっくり霊夢
[字幕]ゆっくり霊夢
[字幕]ゆっくりしていってね!
[音声]ゆっくりしていってね!

まる括弧

ゆっくり霊夢(どういうことなの……?)

こう書いたときは、マル括弧の手前を発言者として抜き取り、マル括弧つきの台詞を字幕として抜き取り、マル括弧の内側を棒読みちゃん用台本として抜き取っています。

◆ゆっくり霊夢
[字幕]ゆっくり霊夢
[字幕](どういうことなの……?)
[音声]どういうことなの……?

カギ括弧付きの字幕

もし字幕をカギ括弧付きで表示したいときは

ゆっくり霊夢:「ゆっくりしていってね!」

のように、カギ括弧と名前の間に全角コロンを挟んで下さい。これで、字幕にはカギ括弧つきで表示されるはずです。

◆ゆっくり霊夢
[字幕]ゆっくり霊夢
[字幕]「ゆっくりしていってね!」
[音声]ゆっくりしていってね!

名前にまる括弧つき

では、次のようなときはどう変換されるでしょうか。

村人(ゆっくり霊夢)「なんでしょうかな」

これは、このように変換します。

◆ゆっくり霊夢
[字幕]村人(ゆっくり霊夢)
[字幕]なんでしょうかな。
[音声]なんでしょうかな。

個人的に、動画の制作中に悩んだのはこういう表記のときです。このときは、発言者の括弧の内側を発言者として抜き出し、そして皮とゆっくり霊夢の声を統一しました。
ですがニコニコで他の方の動画を拝見している限り、それをあえて別々にする方も見受けられます。なので、そこらへんは設定で変えられるようになってます。


設定.txt について

書いてあるとおりです。
いろいろいじってみて下さい。
上記の作例では常に発言者を字幕表示しておりますが、設定で消すことはできます。

その他

MeCab 対応などは Python 版の方を使って下さい。他にもあっちの方が高機能な気がします。
将来的にはたぶんこっちも対応するんじゃないかな、とは思います。

2012年10月2日追記

棒読みちゃんの台詞部分の読み解析機能つきました。

たぶん今はあっちの Python スクリプトよりもこっちの方が高機能です。

サポート

とりあえずここのコメント欄にでも。


ツイッターとかはこらら
@imadedede

使用したライブラリなど

カタカナひらがな変換

kanaxs_ex-1.0.1.cs

http://wiki.dobon.net/index.php?free%2FkanaxsCSharp#extension

Copyright (c) 2011, DOBON! http://dobon.net
kanaxs_ex-1.0.1.cs は 修正 BSDライセンスで保護されています。

形態素解析

LibNMeCab.dll

http://sourceforge.jp/projects/nmecab/

NMeCab was ported from MeCab by Tsuyoshi Komuta, and is released under
any of the GPL (see the file GPL) or the LGPL (see the file LGPL).

MeCab is copyrighted free software by Taku Kudo and
Nippon Telegraph and Telephone Corporation, and is released under
any of the GPL (see the file GPL), the LGPL (see the file LGPL), or the
BSD License (see the file BSD).

LibNMeCab.dll は GPL / LGPL のデュアルライセンスで保護されています。
「ゆっくいち!」では LGPL にのっとり、動的なリンクで利用しています。

形態素解析用辞書

NAIST Japanese Dictionary

http://sourceforge.jp/projects/naist-jdic/

Copyright (c) 2009, Nara Institute of Science and Technology, Japan.
NAIST Japanese Dictionary は広告条項無しの BSD ライセンスで保護されています。

バージョン履歴

New! 2012/10/28 ver.1.3.0 ダウンロード
・字幕
 形態素改行。
・そのほか
 辞書サイズを改善。台本タイトルを台本のファイル名から取得。

2012/10/09 ver.1.2.0
・字幕
 半角文字は文字幅0.5として計算する設定を追加。

2012/10/03 ver.1.1.0
・そのほか
 設定.txt の読み込みを改善。
 読み解析と形態素置換の設定を改善。

2012/10/02 ver.1.0.0
棒読みちゃん用台本
 読み解析。形態素置換。
・そのほか
 エラーメッセージを修正。


2012/09/28 ver.0.4.1 ダウンロード
・全体
 アイコン変更

2012/09/28 ver.0.4.0
・全体
 エフェクトリスト。置換の不具合修正
・字幕
 置換の不具合修正
・設定.txt
 エフェクト設定を yukktalk 4f 台本を元に追加。

2012/09/26 夜くらい ver.0.3.0
・全体
 キャラ設定
・字幕
 表示速度の変更
・設定.txt
 キャラ設定を yukktalk 4f 台本を元に追加。
・そのほか
 台本の素を修正。設定.txt読み込みの不具合修正。

2012/09/26 ver.0.2.0
・全体
 置換。台本変換。
・字幕について
 置換。折り返し。禁則処理。はてな後空白。
棒読みちゃん用台本について
 置換
・そのほか
 初リリース

yukktalk の処理を助けるスクリプトを作ってみた

2012年10月2日追記

Windows アプリにしました。こちらをおすすめします。



yukktalk の処理を助けるスクリプトを作ってみました。

ダウンロード

ゆっくいち

yukktalk を便利にする Python スクリプトです。

これを使うと、 yukktalk の Step1 での作業が少し楽になります。

台本形式のテキストを yukktalk での Step1 の書式に変換します。

yukktalk の Step1 を助けるのでゆっくいちです。

Python 2.7.3 で動作確認してます。

使い方

Python をインストール

Windows 版。64bit でも動きますが、 MeCab (後述)を使うなら 32bit 版をインストールして下さい。
インストール後はパスを通しといてください。

Python スクリプトとして使う

コマンドプロンプトとかから Python スクリプトとして使ってください。

python yukk_ichi.py 台本テキスト.txt

ファイル名とかは適時読みかえて下さい。

できたファイルに適切なヘッダをつける

これだけだとまだ Step2 には足りないので、設定などのヘッダを手動でつけます。

◎タイトル/シーン
※共通,設定いろいろ・・・

これを追加すれば、 yukktalk の Step1 用台本として使えます。 Step2 に進んでください。

何が嬉しいの?

  • 台本を好きなエディタで書ける。
  • 字幕を自動で折り返しできる。

他にもいろいろおせっかいな機能付き。

使用例

変換前

霊夢「こんな感じで文章を書くと」
魔理沙「yukktalk書式に出力するよ!」
霊夢,効果=エコー「エコー指定だってかかるよ!」
魔理沙:「あえて括弧付きにしてみたり」
魔理沙,間=1.0「……とか間をとってみたり」
霊夢「そんな感じで変換できるよ」

変換後

◎

※魔理沙=,
※霊夢=,

◆霊夢
[字幕]霊夢
[字幕]こんな感じで文章を書くと。
[音声]こんな感じで文章を書くと
◆魔理沙
[字幕]魔理沙
[字幕]yukktalk書式に出力するよ!
[音声]yukktalk書式に出力するよ!
◆霊夢,効果=エコー
[字幕]霊夢
[字幕]エコー指定だってかかるよ!
[音声]エコー指定だってかかるよ!
◆魔理沙
[字幕]魔理沙
[字幕]「あえて括弧付きにしてみたり」
[音声]あえて括弧付きにしてみたり
◆魔理沙,間=1.0
[字幕]魔理沙
[字幕]……とか間をとってみたり。
[音声]…とか間をとってみたり
◆霊夢
[字幕]霊夢
[字幕]そんな感じで変換できるよ。
[音声]そんな感じで変換できるよ

ソースコード内で設定は変えられるので、いろいろ改造してみてください。

おまけ

MeCab 対応について

Python から MeCab を使って、音声台本の漢字の一部をカタカナに変換することができます。

Python

import MeCab

できる環境なら、 MeCab を使って棒読みちゃん用の音声台本部分を変換します。
MeCab を使うと「わ」と読む「は」と、「え」と読む「へ」は、ほぼ完璧に変換します。

UTF-8 辞書での動作確認しかしてません。

ここらへん参考にしました

ここらへんで紹介されている方法で MeCab Python をインストールするなら、 32bit Python でないとエラーがでると思います。

今後の予定

設定項目が多すぎるので GUI で設定できるようにしたい。
C# 難しい。