2014年5月30日金曜日

動画 画像から動画を生成する 個人用メモ

各フレームの画像を用意して以下のコマンドをたたけばおk

ffmpeg -r 30 -i images2/image_%3d.jpeg test.avi

2014年5月29日木曜日

動画フェードアウトと連結、個人用メモ

実行する際には、1回でやることが出来る。エンコード回数を減らすほうが良い。

それぞれの機能用コマンドを見る意味で分けた。


フェイドアウト
ffmpeg.exe -i [src_file_path] -vf "fade=out:810:90:" -af "afade=t=out:ss=27:d=27" -vcodec libx264 -acodec libvo_aacenc -y [dst_file_path]

連結
ffmpeg -i [src_file_path] -i [src_file_path2] -filter_complex concat=n=2:v=1:a=0 [dst_file_path]

2014年5月27日火曜日

Google App Engine SDKをEclipseで動かす

GAEのSDKをEclipseで起動する場合のメモ。
まずは以下のPyDevプラグインを追加します。



















以下はRun設定です。














引数は以下の用に指定します。














実行に成功した場合のコンソール出力です。














ここまでできたら、local:8080 に接続しましょう。

2014年5月24日土曜日

はじめてのPython GoogleAppEngineのチュートリアル 1

はじめてのPython フレームワーク

webapp2 は google app engine のフレームワークです。
他にも Django や CherryPy、Pylonsなどが使えますが、webapp2 は Google App Engineの
環境を作成するときにインストールされるので、すぐ使えます。

webapp2
* RequestHandlerクラス:リクエスを処理してレスポンスを生成
* WEGIアプリケーションインスタンス:受信リクエストをURLに基づきハンドラに割り振る

# もっとも単純な例
以下がもっとも単純な例です。

import webapp2
class MainPage(webapp2.RequestHandler):
def get(self):
self.response.headers['Content-Type'] = 'text/plain'
self.response.write('Hello, masahiro\'s World!')
application = webapp2.WSGIApplication([
('/', MainPage),
], debug=True)
RequestHandlerを継承したクラスのgetメソッドを作成すると、self.requestを通してリクエスト情報を取得出来ます。
通常は、self.response にプロパティを設定して終了します。

webapp2.WSGIApplication インスタンスがアプリケーションです。
debug=trueで、ハンドラにエラーが発生したり、キャッチされない例外が発生した場合にブラウザに出力します。

# ユーザ認証

以下の例は、ユーザのログイン認証機能を追加したものです。

#codint: UTF-8
from google.appengine.api import users
import webapp2
class MainPage(webapp2.RequestHandler):
def get(self):
user = users.get_current_user()
if user:
self.response.headers['Content-Type'] = 'text/plain'
self.response.write('Hello,' + user.nickname())
else:
self.redirect(users.create_login_url(self.request.uri))
application = webapp2.WSGIApplication([
('/', MainPage),
], debug=True)
users.get_current_user() で サインイン済みなら Userオブジェクトが、違う場合は None を得られます。


# フォーム
以下がフォームを使った例です。

#coding: UTF-8
'''
Created on 2014/05/24
@author: masahiro
'''
import cgi
from google.appengine.api import users
import webapp2
MAIN_PAGE_HTML = """\
<html>
<body>
<form action="/sign" method="post">
<div><textarea name="content" rows="3" cols="60"></textarea></div>
<div><input type="submit" value="何か書いてください。"></div>
</form>
</body>
</html>
"""
class MainPage(webapp2.RequestHandler):
def get(self):
self.response.write(MAIN_PAGE_HTML)
class Guestbook(webapp2.RequestHandler):
def post(self):
self.response.write('<html><body>あたなの文章:<pre>')
self.response.write(cgi.escape(self.request.get('content')))
self.response.write('</pre></body></html>')
application = webapp2.WSGIApplication([
('/', MainPage),
('/sign', Guestbook),
], debug=True)


また、webapp2のimportをyamlファイルに移動しています。

application: guestbook-app
version: 1
runtime: python27
api_version: 1
threadsafe: yes
libraries:
- name: webapp2
version: latest
handlers:
- url: /.*
script: guestbook.application


この例にはハンドラが2つ出てきます。
MainPageとGuestbookです。それぞれURL、/ と /sign に対応しています。
Guestbookではpostのみが定義されています。
cgi.escape()は、HTMLの特殊文字をエスケープします。ユーザに入力された文字が、HTMLとして動作するのを防いでいます。

cgiはPythonの標準ライブラリです。

○cgiドキュメント
https://docs.python.org/release/2.7.2/library/cgi.html


今日はここまで、次はDatastoreにデータを永続化してみます。

はじめてのPython 書式編

Pythonの書式についてひと通り見たまとめ。
最初のうちの備忘録。

標準出力・演算・ループ

新鮮です。主に扱ってきた言語が C++、C#、Java だからでしょうか。
でも拒否感は無いですし、行が少なくなるのはいいですね。
# coding: UTF-8
# HelloWorld
print "Hello World"
# 変数データについて
# 大文字、小文字は区別される
#ex)
msg = "Hello World2"
print msg
# 数値 整数、小数、複素数
# 真偽値 True False
# None
# 関数・オブジェクト
# 要素が並んだもの
# 文字列:文字
# リスト:データ(配列)
# タプル:データ変更不可
# セット:データ重複不可
# 辞書:key と value のペア
# 演算子 + - * / // 商 % 余り ** べき乗
print 10 * 5
print 10 // 3
print 10 % 3
print 2 ** 3
print 5 + 1.3
print 5 + 2.0
print 5 / 3
print 5 / 3.0
# 文字列
# 日本語 u"こんにちは"
print "こんにちは"
print u"こんにちは"
print "hello" + "world3"
print u"無駄!" * 10
print "hello\nwor\tld3"
print """
<html>
<body>
</body>
</html>
"""
# 文字数 len 、検索 find 、切り出し []
s = "abcdefghijklmn"
print len(s)
print s.find("c")
print s.find("x")
print s[2]
print s[2:5]
print s[:5]
print s[2:]
print s[2:-1]
print len("こんにちは")
print len(u"こんにちは")
# 型の変換
print 5 + int("5")
print 5 + float("5")
age = 20
print "I am " + str(age) + " year old"
# リスト
sales = [255, 100, 353, 400, "aba"]
print len(sales)
print sales[2]
print 100 in sales
sales[1] = 10000
print sales[1]
print 100 in sales
print range(1, 10)
print range(3, 10)
print range(3 ,20 ,2)
sales2 = [50, 100, 80, 45]
print sales2
sales2.sort()
print sales2
sales2.reverse()
print sales2
day = "2013/12/15"
print day.split("/")
a = ["a", "b", "c"]
print "-".join(a)
# タプル
t = (2, 5, 8)
print len(t)
print t * 3
b = list(t)
print b
t2 = tuple(b)
print t2
# セット (集合型)
s1 = set([1, 2, 3, 4, 3, 2])
print s1
s2 = set([3, 4, 5])
print s2
print s1 - s2
print s2 - s1
print s1 | s2
print s1 & s2
print s1 ^ s2
# 辞書
sales = {"taguchi":200, "imai":400, "dotinst":500}
print sales
print sales["imai"]
sales["imai"] = 1000
print sales
print "taguchi" in sales
print "test" in sales
print sales.keys()
print sales.values()
print sales.items()
v1 = 10
v2 = 1.234234
v3 = "imai"
v4 = {"imai":400, "brian":500}
print "age: %d" % v1
print "age: %10d" % v1
print "age: %010d" % v1
print "price: %f" % v2
print "price: %.2f" % v2
print "name: %s" % v3
print "sales: %(imai)d" % v4
print "%d and %f" % (v1, v2)
# 条件分岐
score = 70
if score > 60:
print "OK!"
print "OK2!"
if score > 60 and score < 80:
print "OK3!"
score2 = 40
if 60 < score2 < 80:
print "OK4!"
elif score > 30:
print "OK?"
else:
print "NG!"
print "OK5!" if score > 60 else "NG2!"
print "OK5!" if score2 > 60 else "NG2!"
# ループ
f = [13, 3435, 31, 876]
sum = 0
for sale in f:
sum = sum + sale
print sale
else:
print sum # ループが終わったら一度処理する
for i in range(10):
if i == 3:
continue
if i == 5:
break
print i
# 辞書型ループ
dic = {"imai":1000, "brian": 300, "claud": 900, "mark": 130, "dave": 487}
for key, value in dic.iteritems():
print "key: %s, value: %d " % (key, value)
for key in dic.iterkeys():
print key
#whileループ
n = 100
while n < 110:
if n == 103:
n += 1
continue
if n == 106:
break
print n
n += 1
else :
print "end"
print n
view raw python1.py hosted with ❤ by GitHub

関数

Java8でラムダ式が追加されたのを機に使おう!と思っていてあまり使っていないラムダ式。

# coding: UTF-8
# 関数
def hello(name, num=5):
print "hello %s! " % name * num
def hello2(name, num=4):
return "hello %s!" % name * num
#pass
def hello3():
pass
hello("brain", 2)
hello("cluad", 4)
hello("david")
print hello2("mark")
# 変数スコープ
name = "imai"
def hello():
name = "mark"
print name
def double(x):
return x ** 2
print map(double, [2, 5, 8])
print map(lambda x:x * x, [2, 5, 8])
view raw python2.py hosted with ❤ by GitHub

クラス・オブジェクト

特に無し。

# coding: UTF-8
__author__ = 'masahiro'
class User(object):
def __init__(self, name,):
self.name = name
def greet(self):
print "my name is %s!" % self.name
nico = User("Nico")
brian = User("Brian")
print nico.name
nico.greet()
brian.greet()
view raw python3.py hosted with ❤ by GitHub

継承

上のクラスを継承したクラス。

# coding: UTF=8
import DotInstall3
__author__ = 'masahiro'
class SuperUser(DotInstall3.User):
def shout(self):
print "%s! is SUPER!" % self.name
tom = SuperUser("tom")
tom.shout()
view raw python4.py hosted with ❤ by GitHub


インポート方法

なるほど、こうやってモジュールの中の一部をロード出来るんですね。

#coding: UTF=8
__author__ = 'masahiro'
import math, random, numpy
from datetime import date
print math.ceil(5.2)
for i in range(5):
print random.random()
print date.today()
view raw python5.py hosted with ❤ by GitHub

2014年5月23日金曜日

Python for Google App Engine

出来るだけシンプルにPythonでWEBアプリ実装したいと思い、いままで使ってこなかったGoogle App Engine を使ってみようと思います。


Google のドキュメントを訳してくれている素晴らしい方がいました。
参考にさせてもらいながら、環境を作成します。

○Python for Google App Engine : Python tutorial の和訳



○インストール時の注意点

インストールディレクトリはデフォルトのままよりも、C:\GoolgleAppEngine などに変更しましょう。
ホワイトスペースを間に含むとあまり良くないです。


○pycharm の CE は Google App Engine プロジェクトに対応していない。

うーん、楽に開発したいので、どうしよ。

2014年5月19日月曜日

はじめての python 環境作成

python 開発環境を作成しよう


時系列解析環境を作成するため、python 環境を作成する。

pythonの日本コミュニティ
http://www.python.jp/

インストール


2系の最新版、python 2.7.6 にすることにしました。

https://www.python.org/downloads/

※python3系の対応ライブラリの件がよくわからなかったので、2系を選択。
慣れてきたら3系環境も構築しよう。

インストールはダウンロードした実行ファイルを使用するだけ。
インストールフォルダは変更しない方が良いようです。というのも、他の数値計算ライブラリをインストールするとき便利だからです。

ライブラリ


今回導入するライブラリは以下です。

pyaudio 音声ライブラリ
http://people.csail.mit.edu/hubert/pyaudio/


Numpy & Scipy 科学計算ライブラリ
http://www.scipy.org/scipylib/download.html

全部、exeを実行するだけでOK。

matplotlib グラフプロットライブラリ
http://matplotlib.org/

IDE

PyCharmをインストールします。
http://www.jetbrains.com/pycharm/

昔は有料版しかなかったようですが、CE(無料版)が出ています。

有名なIDEのコマンドを使えるようです。
使い慣れたIDEを選ぶと良いと思います。


PyCharmを初回起動すると、Pythonの実行ファイルを設定するように求められます。
以下を設定します。

[Pythonインストールフォルダ]/python.exe


以上で、開発環境の構築が完了です。

2014年5月12日月曜日

動画音声のノーマライズ

プログラムに組み込むため、dll もしくは コマンドライン(exe) で動画音声調整する方法。

(今回は、音声コーデックが AAC の動画が対象)

aacgain というソフトウェアを使用した。

下記のページの AACGain v1.9が最新

http://www.rarewares.org/aac-encoders.php

dll では libFAAC があったが、今回は使用せず。

【aacgainを使うことのメリット】


  • mp4を指定すると、直接音声のノーマライズが可能。
  • 動画の映像が劣化しない ← これは効きますね。
  • プログラムに組み込むのが容易



○音声ノーマライズ


aacgain /r /c /k /p [filepath] ...

/r :トラックゲインを音声個別に指示 89db → /a に変えると、指定した全ての音声の相対的な音量を保って指示 
/c :クリッピングが発生しても確認メッセージを出さないオプション。クリッピング:音が大きすぎて許容値を超えていて、音の割れ、歪の発生の可能性がある。指定しないと、確認メッセージへの応答が必要。
/p :ファイルのタイムスタンプを変更しないオプション
/k :クリッピングしないギリギリまでゲインを自動で下げる
/d トラックゲインの指定 89dbに対して増減を指定する。/d 5 とすれば、89 + 5 = 94 となる。



○音声の分析のみ


・分析のみを行う

aacgain /s s [filepath] ...

Recommended "Track" dB change: -0.370000
Recommended "Track" mp3 gain change: 0
Max PCM sample at current gain: 19850.775391
Max mp3 global gain field: 180
Min mp3 global gain field: 115
Recommended "Album" dB change for all files: -0.370000
Recommended "Album" mp3 gain change for all files: 0

・/d で指定した変更を行うとどうなるかを解析する

aacgain /s s /d 5 [filepath] ...

Recommended "Track" dB change: 4.630000
Recommended "Track" mp3 gain change: 3 ← /d は目標のdbまで1.5db刻みで最も近いものを計算する。
WARNING: some clipping may occur with this gain change!
Max PCM sample at current gain: 19850.775391
Max mp3 global gain field: 180
Min mp3 global gain field: 115

Recommended "Album" dB change for all files: 4.630000
Recommended "Album" mp3 gain change for all files: 3
WARNING: with this global gain change, some clipping may occur in file after_converter.mp4 ← /d 5 するとクリッピングすることを示す

LaTeX を Windows で使う ShareLaTeX

WindowsにTeXをインストールして~、とかやろうと思ったけど、けっこう時間かかりそう。
時間の無い社会人院生にとっては結構無駄な時間。

オンラインで良いツールがありました。ShareLaTeX。デザインもブートストラップで少なくともここ3年くらいのものだろうし、ありがたく使わせていただこうと。


数学記号の入力にまずは慣れるために参考になるリンク。



後は習うより慣れろ、ですね。



2014年5月6日火曜日

MySQL 2つのカラムデータをお互いに入れ替える

2つのカラムデータを入れ替えたいこと。

最大値と最小値を間違えたりすると発生します。

以下のように入れ替える事ができます。

set @str = 0;
update table `column1` = (@str := `column1`)*0+`column2`, `column2` = @str
where id > 0;

以上です。
ユーザ変数を定義する機会ってあまりないので、思いつかなかった。