/var/log/soymsk

id:soy_msk


続]フォーマット別音楽管理

PCで聴く場合はFlacで、iPhoneなどで聴く場合はaac,mp3みたいにいろんな形式で音楽ファイルを持っていると、いざFlac形式の音楽だけを聴きたい場合にしっくり管理する方法がなかった、ということは過去記事にも書いた。


でも、foobarならいろいろカスタマイズできて、上手い具合に管理できそうなのでメモ。


環境

ディレクトリ:
[アーティスト]->[アルバム]->[音楽ファイル:*.flac, *.mp3]

プレイヤー:
[Foobar2000]



方法

"Preferences"->"Media Library"->"Album List" でViewsに以下のようなクエリを追加


name: by artist/filetype
query: %%|%album%|%codec%|[[%discnumber%.]%tracknumber%. ][%track artist% - ]%title%


%codec%を追加することでfoorbarのviewに

[アーティスト名]->[アルバム名]->[flac or mp3] ->[音楽ファイル]

という階層ができるので、flacだけ聴きたい場合はそのアルバム下のflacをまるごとプレイリストに放り込むだけ。

これでだいたいやりたいことを実現できた。


その他、使えるフォーマットについて公式?に書いてある。

eclipse CDTで実行エラー

CDTでバイナリを実行してもコンソール上ですぐに[terminated]となってしまい実行できなくなった件:

結論として、ライブラリが不足していると起こるらしい。スタックトレースには

のように表示されるはず。

一見コマンドプロンプトからは起動できていたので気付かなかった。
実行構成の環境に環境変数のPATHを追加してやったらちゃんとeclipse上から実行できたので解決!

前はこんな現象なかったように思うんだけどなんでだろ。というかライブラリが足りないならそれをちゃんと表示してほしいなぁ。

10進数->n進数

10進数->n進数(n = 2 ~ 35)の変換。ググッてもn進数というのはなかなかなかったので。STLは少しおおげさか。

const char *numset = "0123456789ABCDEFGHIJKLMNOPQRSTUVWYZ";
void cardinal_encode(int num, int ocar) {
	if(num == 0) {cout << "0" << endl; return;}
	if(ocar > strlen(numset) || ocar < 2) return;
	vector<int> nl;
	
	while(num / ocar != 0) {
		nl.push_back(num % ocar);
		num /= ocar;
	}
	nl.push_back(num);
	reverse(nl.begin(), nl.end());
	for(unsigned int i = 0; i < nl.size(); i++){
		cout << numset[nl[i]];
	}
	return;
}

C++からPythonモジュールを使う

C++ からPythonモジュールを使うのをやってみた。
id:Wackyさんの記事を参考にhttp://www.linuxjournal.com/article/8497からサンプルをそのまま流用。

まずPythonモジュールから。

def hello():
	print "Hello, Python!";
	return "Success";

続いてC++

#include <iostream>
#include <cstdio>
#include "python2.6/Python.h"
using namespace std;
void pyWraper() {
	FILE * exp_file;
	PyObject *module, *global_dict, *expression, *result;
	const char *exp = "pymodule.py";
	const char* func_name = "hello";

	exp_file = fopen(exp, "r");
	PyRun_SimpleFile(exp_file, exp);
	module = PyImport_AddModule("__main__");
	global_dict = PyModule_GetDict(module);

	expression = PyDict_GetItemString(global_dict, func_name);
	result = PyObject_CallObject(expression, NULL);
	if(PyString_Check(result)) cout << PyString_AsString(result) << endl;
}


int main() {
	Py_Initialize();
	pyWraper();
	Py_Finalize();
}

[出力]
Hello Python!
Success

もちろん引数を渡すこともできる。

Python C++

研究で大量のXMLファイルを処理しなければならなくなった。
XMLファイル自体はzip圧縮されていて、解凍すると100MBにもなる場合がある。(ほとんど冗長な情報が入ってるだけだけど。。)

なのでパースはC++でやらせたい。でもダウンロード、Zipの解凍、XMLの読み込みはPythonでやらせたいな、と思ったのでPython <=> C++の方法について調べてみる。

いろいろ試行錯誤中だけど、当面は
Python => C++:Pythonで標準のPython.h,libpython26.aを利用
C++ => BOOSTを使うor 標準の。

BOOSTをPythonのためだけに使うには重すぎる気がする。

[参考]
http://www.linuxjournal.com/article/8497

Snow Leopard & Python PIL

Oreilly ”集合知プログラミング”とかやってて、PILが必要になったのでインストール。


ソースからインストールしようかと思ったけど、改行コードがDOSばっかりになってたり、コンパイルエラーがイミフすぎだったので、おとなしくportsでインストール

インストールはなんなく終わってけど、なぜかimportできない。
どうやらports経由でインストールした場合はPYTHONPATHにパスを追加する必要があるらしい。

export PYTHONPATH=/opt/local/lib/python2.6/site-packages/:/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages

こんな感じのコードをbash_profileに追加

これでうまくいった!

macbook air

使ってたeee pcではさすがに使い続けるのはつらいので、インターンとかアルバイトでもらったお給料でMacBookAirを買った。

これまでメインで使ってたUbuntu&Ubuntuで弱かったマルチメディア関係が整ってる。ってことでとても使いやすい。

しばらくデスクトップの出番はないかなぁ。