2014年12月14日日曜日

[mp3] ffmpeg, lame の windows binary

ffmpeg
Zeranoe FFmpeg

lame
RareWares
→MP3→LAME Bundles

[mp3] フォルダ内にある mp3 ファイルのCBR 48 kbps, Sampling rate 44.1 KHz, Monaural に一括変換

フォルダ内にある mp3 ファイルのCBR 48 kbps, Sampling rate 44.1 KHz, Monaural に一括変換する bat ファイル
for %%a in (*.mp3) do (
 rem mp3 ファイルを CBR 48 kbps, 44.1 KHz, mono に変更する
 rename "%%a" "back_%%a"
 lame.exe -b 48 -a --resample 44.1 "back_%%a" "%%a"
)

[mp3] flv ファイルから音声を抜き出して mp3 に変換する

  1. flv ファイルから音声を抜き出し wav に書き出す
    ffmpeg.exe -i .\test.flv test.wav
    
  2. wav ファイルを mp3 に変換する
    lame.exe test.wav test.mp3
    
mp3 変換時に CBR (constant bitrate, 固定ビットレート) 48 kbps, Sampling rate (サンプリング周波数) を 44.1 KHz, Stereo からモノラル (Monaural) にする。
lame.exe -b 48 -a --resample 44.1 test.wav test.mp3
フォルダ内にある flv ファイルを mp3 に変換する bat ファイル
for %%a in (*.flv) do (
 rem flv ファイルから音声を抜き出して wav ファイルに書き出す
 ffmpeg.exe -i "%%a" temp.wav
 rem wav ファイルを CBR 48 kbps, 44.1 KHz, mono にして mp3 に書き出す
 rem %%~na はファイル名部分のみ切り出している
 lame.exe -b 48 -a --resample 44.1 temp.wav "%%~na.mp3"
 del temp.wav
)

2014年12月9日火曜日

[awk]BEGINブロック, ENDブロック

BEGIN ブロック
初期化用のコードを定義する
END ブロック
入力ファイルのすべての行の処理が終了した後に実行される。一般的には最終的な計算や、出力ストリームの最後に合計を出力するために使用される。
入力ファイルの各行にある 1 つめの要素を表示する。
test02.awk
BEGIN {

}
{
 print $1
}
END {

}
a.txt
500 1000 1000
500 1001 1001
500 1002 1002
550 1500 1500
550 1500 1500
645 1800 1800
720 2000 2000
実行結果
> awk -f test02.awk a.txt
500
500
500
550
550
645
720
入力ファイルがコロン ":" で区切られている場合。
d.txt
500:1000:1000
500:1001:1001
500:1002:1002
550:1500:1500
550:1500:1500
645:1800:1800
720:2000:2000
実行結果
> awk -f .\test02.awk .\d.txt
500:1000:1000
500:1001:1001
500:1002:1002
550:1500:1500
550:1500:1500
645:1800:1800
720:2000:2000
BEGIN ブロックで FS (Field Separator) を使って区切り文字を指定する。
test03.awk
BEGIN {
 FS=":"
}
{
 print $1
}
END {

}
実行結果
> awk -f .\test03.awk .\d.txt
500
500
500
550
550
645
720

[awk]スクリプトを指定

-f で awk スクリプトを指定する。 test01.awk に記載されたスクリプトに a.txt を入力し、結果を a_new.txt に出力する。
awk -f test01.awk a.txt > a_new.txt

[awk]基本文法

printコマンドがa.txtの各行に対し順次実行される。
awk "{ print }" a.txt
a.txt
1 Hello
2 Good morning
3 Good night
実行結果
> awk "{ print }" a.txt
1 Hello
2 Good morning
3 Good night

2014年6月29日日曜日

[Python][SQLite]データ登録後 Commit を不要にする

DB を開く時に isolation_level=None を指定することでデータ登録後に Commit を実行する必要がなくなる。
con = sqlite3.connect("data.db", isolation_level=None)

[Python][SQLite]使い方

Python 2.5 から SQLite3 が標準で使えるようになっている。
# -*- coding: utf-8 -*-
import sqlite3

needCommit = 0

# Database を開く
if needCommit == 1:
    con = sqlite3.connect("data.db");
else:
    con = sqlite3.connect("data.db", isolation_level=None); # Commit 不要

# Table 作成
sql = u"CREATE TABLE test(ID INT PRIMARY KEY, NAME TEXT NOT NULL);"
con.execute(sql)

# データ登録
sql = u"INSERT INTO test(ID, NAME) values (0, 'aaa');"
con.execute(sql)

# データ登録 その 2
sql = u"INSERT INTO test(ID, NAME) values (?, ?);"
con.execute(sql, (1, "bbb"))
con.execute(sql, (2, "ccc"))

if needCommit == 1:
    con.commit()

# レコード取得
c = con.cursor()
c.execute("SELECT * FROM test")
for row in c:
    print row[0], row[1]

# Database を閉じる
con.close();
実行結果
> python sqlite.py
0 aaa
1 bbb
2 ccc
各処理を関数化、テーブルが作成済みの場合は最初に drop する処理を追加
# -*- coding: utf-8 -*-
import sqlite3

# Database を開く
def connectDb():
    print "Connect DB"
    con = sqlite3.connect("data.db", isolation_level=None);
    return con

# Table 作成
def createTable(con, name):
    print "Create table";
    sql = "CREATE TABLE %s(ID INT PRIMARY KEY, NAME TEST NOT NULL);" % name
    con.execute(sql)

# データ登録
def addData(con, id, name):
    print "Add data (%d %s)" % (id, name)
    sql = "INSERT INTO test(ID, NAME) values(%d, '%s');" % (id, name)
    print sql;
    con.execute(sql)

# 全レコード表示
def showAllRecord(con):
    c = con.cursor()
    c.execute("SELECT * FROM test")
    for row in c:
        print row[0], row[1]

# Database を閉じる
def closeDb(con):
    print "Close database"
    con.close()

# テーブル一覧表示
def showAllTables(con):
    c = con.cursor()
    c.execute("SELECT NAME FROM sqlite_master WHERE type='table'")
    for row in c:
        print row[0]

# テーブル作成済みか確認
def alreadyCreatedTable(con, name):
    c = con.cursor()
    c.execute("SELECT NAME FROM sqlite_master WHERE type='table'")
    for row in c:
        if row[0] == name:
            print "Found %s" % name;
            return 1
    return 0

# Drop table
def dropTable(con, name):
    print "Drop table %s" % name
    sql = "DROP TABLE %s;" % name
    con.execute(sql)

# メイン処理
con = connectDb()
showAllTables(con)
if alreadyCreatedTable(con, 'test') == 1:
    dropTable(con, 'test')
    createTable(con, 'test')

showAllTables(con)
alreadyCreatedTable(con, 'test')

addData(con, 0, 'aaa')
addData(con, 1, 'bbb')
addData(con, 2, 'ccc')

showAllRecord(con)
closeDb(con)
実行結果
> python sqlite2.py
Connect DB
Create table
test
Found test
Add data (0 aaa)
INSERT INTO test(ID, NAME) values(0, 'aaa');
Add data (1 bbb)
INSERT INTO test(ID, NAME) values(1, 'bbb');
Add data (2 ccc)
INSERT INTO test(ID, NAME) values(2, 'ccc');
0 aaa
1 bbb
2 ccc
Close database

> python sqlite2.py
Connect DB
test
Found test
Drop table test
Create table
test
Found test
Add data (0 aaa)
INSERT INTO test(ID, NAME) values(0, 'aaa');
Add data (1 bbb)
INSERT INTO test(ID, NAME) values(1, 'bbb');
Add data (2 ccc)
INSERT INTO test(ID, NAME) values(2, 'ccc');
0 aaa
1 bbb
2 ccc
Close database

[Python]FTP - カレントディレクトリのファイルをアップロードする

ソースコード
# -*- coding: utf-8 -*-
import os
import re
import ftplib

# カレントディレクトリのファイルをアップロードする

## Upload files
def uploadFiles(top, exp):
    for filename in os.listdir(top):
        if re.search(exp, filename):
            print top + filename
            f = file(filename, 'rb')
            ftp.storbinary('STOR ' + filename, f)
            f.close()

# カレントディレクトリのファイル一覧を取得
user='username'
password='password'
server='servername'

currentDir = ''
dstDir = ''

ftp = ftplib.FTP(server)
ftp.login(user, password)
uploadFiles('./', 'txt$')

ftp.quit()
実行結果
> python test02.py
./test.txt
./test02.txt
./test03.txt

[Python]FTP - サーバーにファイルを置く

ソースコード
# -*- coding: utf-8 -*-
import ftplib

# サーバーにファイルを置く (STOR)
user='username'
password='password'
server='servername'
filename='test.txt'

ftp = ftplib.FTP(server)
ftp.login(user, password)
f = file(filename, 'rb')
ftp.storbinary('STOR ' + filename, f)
f.close()
ftp.quit()
実行結果
> python test01.py

[Python]FTP - サーバーログイン/ログアウト

ソースコード
# -*- coding: utf-8 -*-
import ftplib

# サーバーにログインしファイルリストを取得する (LIST)
user='username'
password='password'
server='servername'

ftp = ftplib.FTP(server)
ftp.login(user, password)
ftp.retrlines('LIST')
ftp.quit()
実行結果
> python test00.py
drwxr-xr-x  19 username 503          4096 Sep 14 11:44 .
drwxr-xr-x  19 username 503          4096 Sep 14 11:44 ..
-rw-r--r--   1 username 503          4802 Sep 14 11:45 index.html

[MySQL][Python]MySQLdb

使い方 データ挿入 (INSERT) 後は commit しないと DB に登録されないので注意。
# -*- coding:utf-8 -*-
import MySQLdb

# DB に接続
db = MySQLdb.connect(user="user", passwd="password", db="test", charset="utf8")

# SELECT
db.query("SELECT * FROM score")
result = db.store_result()

# 表示
num = result.num_rows()
for row in result.fetch_row(num):
    print row

    # INSERT
    q = "INSERT INTO `test`.`score` (`id`, `user_id`, `score`)"
    q += " VALUES (NULL, '1', '97');"
    print "%s" % (q)
    db.query(q)

    # データ挿入後は commit
    db.commit()

# Close
db.close()

2014年1月20日月曜日

[CentOS] Postfix (MTA: Mail transfer agent) インストール

  1. yum を使ってパッケージをインストールする
    # yum -y install postfix
  2. postfix の設定 (/etc/postfix/main.cf)
    • サーバーのホスト名を追加
      # INTERNET HOST AND DOMAIN NAMES
      #
      # The myhostname parameter specifies the internet hostname of this
      # mail system. The default is to use the fully-qualified domain name
      # from gethostname(). $myhostname is used as a default value for many
      # other configuration parameters.
      #
      #myhostname = host.domain.tld
      #myhostname = virtual.domain.tld
      myhostname = testserver.local ★
    • ドメイン名を追加
      # The mydomain parameter specifies the local internet domain name.
      # The default is to use $myhostname minus the first component.
      # $mydomain is used as a default value for many other configuration
      # parameters.
      #
      #mydomain = domain.tld
      mydomain = local ★
    • ローカルからメールを送る時に送信元メールアドレスの @ 以降に追加するドメイン名を指定
      # SENDING MAIL
      #
      # The myorigin parameter specifies the domain that locally-posted
      # mail appears to come from. The default is to append $myhostname,
      # which is fine for small sites.  If you run a domain with multiple
      # machines, you should (1) change this to $mydomain and (2) set up
      # a domain-wide alias database that aliases each user to
      # user@that.users.mailhost.
      #
      # For the sake of consistency between sender and recipient addresses,
      # myorigin also specifies the default domain name that is appended
      # to recipient addresses that have no @domain part.
      #
      myorigin = $myhostname ★
      #myorigin = $mydomain
    • メールボックス形式を Maildir にする
      # DELIVERY TO MAILBOX
      #
      # The home_mailbox parameter specifies the optional pathname of a
      # mailbox file relative to a user's home directory. The default
      # mailbox file is /var/spool/mail/user or /var/mail/user.  Specify
      # "Maildir/" for qmail-style delivery (the / is required).
      #
      #home_mailbox = Mailbox
      home_mailbox = Mail/ ★
    • 外部からのメール受信を許可する
      # The inet_interfaces parameter specifies the network interface
      # addresses that this mail system receives mail on.  By default,
      # the software claims all active interfaces on the machine. The
      # parameter also controls delivery of mail to user@[ip.address].
      #
      # See also the proxy_interfaces parameter, for network addresses that
      # are forwarded to us via a proxy or network address translator.
      #
      # Note: you need to stop/start Postfix when this parameter changes.
      #
      #inet_interfaces = all
      #inet_interfaces = $myhostname
      #inet_interfaces = $myhostname, localhost
      #inet_interfaces = localhost
      inet_interfaces = all ★
    • 自ドメイン宛メールを受信できるようにする
      # The mydestination parameter specifies the list of domains that this
      # machine considers itself the final destination for.
      #
      # These domains are routed to the delivery agent specified with the
      # local_transport parameter setting. By default, that is the UNIX
      # compatible delivery agent that lookups all recipients in /etc/passwd
      # and /etc/aliases or their equivalent.
      #
      # The default is $myhostname + localhost.$mydomain.  On a mail domain
      # gateway, you should also include $mydomain.
      #
      # Do not specify the names of virtual domains - those domains are
      # specified elsewhere (see VIRTUAL_README).
      #
      # Do not specify the names of domains that this machine is backup MX
      # host for. Specify those names via the relay_domains settings for
      # the SMTP server, or use permit_mx_backup if you are lazy (see
      # STANDARD_CONFIGURATION_README).
      #
      # The local machine is always the final destination for mail addressed
      # to user@[the.net.work.address] of an interface that the mail system
      # receives mail on (see the inet_interfaces parameter).
      #
      # Specify a list of host or domain names, /file/name or type:table
      # patterns, separated by commas and/or whitespace. A /file/name
      # pattern is replaced by its contents; a type:table is matched when
      # a name matches a lookup key (the right-hand side is ignored).
      # Continue long lines by starting the next line with whitespace.
      #
      # See also below, section "REJECTING MAIL FOR UNKNOWN LOCAL USERS".
      #
      #mydestination = $myhostname, localhost.$mydomain, localhost
      mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
      #mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain,
      #       mail.$mydomain, www.$mydomain, ftp.$mydomain
  3. sendmail を停止する
    # /etc/rc.d/init.d/sendmail stop
    sm-client を停止中:                                        [  OK  ]
    sendmail を停止中:                                         [  OK  ]
    # chkconfig sendmail off
    # chkconfig --list sendmail
    sendmail        0:off   1:off   2:off   3:off   4:off   5:off   6:off
  4. システムで使用するメールサーバー機能を sendmail から Postfix に切り替える
    # alternatives --config mta
    
    2 プログラムがあり 'mta' を提供します。
    
      選択       コマンド
    -----------------------------------------------
    *+ 1           /usr/sbin/sendmail.sendmail
       2           /usr/sbin/sendmail.postfix
    
    Enter を押して現在の選択 [+] を保持するか、選択番号を入力します:2
  5. Postfix 起動
    # /etc/rc.d/init.d/postfix start
    postfix を起動中:                                          [  OK  ]
  6. Postfix を自動起動するように設定する
    # chkconfig postfix on
    # chkconfig --list postfix
    postfix         0:off   1:off   2:on    3:on    4:on    5:on    6:off

2014年1月12日日曜日

[CentOS] vsftpd インストール

  1. yum を使ってパッケージをインストールする
    # yum -y install vsftpd
  2. vsftpd の設定 (/etc/vsftpd/vsftpd.conf)
    • 変更前
      # Allow anonymous FTP? (Beware - allowed by default if you comment this out).
      anonymous_enable=YES
    • 変更後 (anonymous ユーザーのログインを禁止する)
      # Allow anonymous FTP? (Beware - allowed by default if you comment this out).
      anonymous_enable=NO
  3. vsfptd 起動
    # /etc/rc.d/init.d/vsftpd start
    vsftpd 用の vsftpd を起動中:                               [  OK  ]
  4. vsftpd を自動起動するように設定する
    # chkconfig --list vsftpd
    vsftpd          0:off   1:off   2:off   3:off   4:off   5:off   6:off
    # chkconfig vsftpd on
    # chkconfig --list vsftpd
    vsftpd          0:off   1:off   2:on    3:on    4:on    5:on    6:off
  5. 動作確認
    FTP クライアントソフトを使用してサーバーに FTP 接続できることを確認する

[CentOS] yum で proxy を使う

  1. /etc/yum.conf に以下を記載
    # proxy setting
    proxy=http://proxyserver.local:8080
    proxy_username=username
    proxy_password=password
  2. 動作確認
    # yum update