それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

ActiveRecord単体で、Sqliteにテーブルを作る。

ActiveRecordの単体でSQLiteにテーブルを作るとかしてみた。

データベースにテーブル作るのすらActiveRecordを使ったら楽な気がする。

  1 #!/usr/bin/env ruby
  2
  3 require 'rubygems'
  4 require 'active_record'
  5
  6 ActiveRecord::Base.establish_connection(
  7     "adapter"=>"sqlite3",
  8       "database" => "./data.sqlite"
  9 )
 10
 11 class TestCreation < ActiveRecord::Migration
 12   def self.up
 13     create_table :entries do|t|
 14       t.string :title
 15     end
 16   end
 17 end
 18
 19
 20 TestCreation.new.up
 21
 22 

結果

テーブルできた。

SQLite version 3.7.3
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> .schema
CREATE TABLE "entries" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "title" varchar(255));
sqlite> .tables
entries
sqlite> 

できた。

アダプタ名

 18
 19 ActiveRecord::Base.establish_connection(
 20   "adapter"=>"sqlite3",
 21   "database" => "./ndl_data.sqlite"
 22 )


なんか adapter 名が sqliteから sqlite3に変わったみたい。



苦労したけどなんとか動かせたみたい。

simpletestの使い方

PHPにも数あるテストツール(unittest)だけど、今のところ。これが手軽で便利そう
(63d7cb68b612441ee851c5a020fa64b5)

インストールと使い方

  1. 最新版のtgz を取得する。
  2. require する
  3. 特定のclassをextendsする。
  4. 作ったクラスをnewする。

以上

インストール

wget http://downloads.sourceforge.net/project/simpletest/simpletest/simpletest_1.1/simpletest_1.1.0.tar.gz -O - | tar zxvf -

インクルード

<?php
require_once('simpletest/autorun.php’);

クラス。

class SampleTest extends UnitTestCase{
    public function __construct(){
        //
        $this->dsn = "sqlite::memory:";
    }
    public function test_insert_and_select_one(){
    }
}
//newする
$test = new SampleTest();

実行

php test.php

またはブラウザで開く

記述規約

class SampleTest extends UnitTestCase{

クラスは UnitTestCaseを exntendsして使う。

テスト関数は、testXXXXXXで testから始める。

セットアップと、終了には

  • funciton setup
  • function teardown

を使えば前処理、後処理が出来る。
クラスのコンストラクタは、セットアップにも使える。
このあたりは通常のUnittestと変わらない。

WEBで見た場合は

これで見える。
(a5346ffadb3f7dddca226cfe3f7ad9ff)

Mechanize(ruby)でUserAgent詐称

MechanizeでUserAgentを切り替える方法。


MechanizeでScrapingしていると、時々UAチェックで弾かれることがある。

UserAgentを切り替える方法

mech = Mechanize.new
mech.user_agent_alias = 'Windows IE 7' #キーを指定。

ちなみに使えるUserAgent

UserAgentはこんな感じで、定数に展開されている。

AGENT_ALIASES = {
  'Windows IE 6' => 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)',
  'Windows IE 7' => 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)',
  'Windows Mozilla' => 'Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.4b) Gecko/20030516 Mozilla Firebird/0.6',
  'Mac Safari' => 'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_2; de-at) AppleWebKit/531.21.8 (KHTML, like Gecko) Version/4.0.4 Safari/531.21.10',
  'Mac FireFox' => 'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; en-US; rv:1.9.2) Gecko/20100115 Firefox/3.6',
  'Mac Mozilla' => 'Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en-US; rv:1.4a) Gecko/20030401',
  'Linux Mozilla' => 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.4) Gecko/20030624',
  'Linux Firefox' => 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.1) Gecko/20100122 firefox/3.6.1',
  'Linux Konqueror' => 'Mozilla/5.0 (compatible; Konqueror/3; Linux)',
  'iPhone' => 'Mozilla/5.0 (iPhone; U; CPU like Mac OS X; en) AppleWebKit/420+ (KHTML, like Gecko) Version/3.0 Mobile/1C28 Safari/419.3',
  'Mechanize' => "WWW-Mechanize/#{VERSION} (http://rubyforge.org/projects/mechanize/)"
}

Mechanizeに指定するのは、上記のキーだけでいいみたい。



詐称と呼ぶけど、悪いことじゃないよ。そもそもUserAgentがオレオレなんだぜ。


UA詐称しないとデータ取れないWikipediaとかマジ鬼畜。

DDコマンドでWrite速度測定:ddでHDDやNASの書き込み速度を見てみる。

ddでHDDやNASの速度を見てみる。

ディスクの速度を見たいなぁと思ったんですけど、いちいち測定ソフト入れるのも面倒くさい。
書きこんで速度がわかれば・・・そうかddで良いじゃん。

ddでやってみた。

5回書き込み

takuya@air:~/Desktop$ dd if=/dev/zero of=./test count=5 bs=1024
5+0 records in
5+0 records out
5120 bytes (5.1 kB) copied, 0.000198 s, 25.9 MB/s

50回書いた

takuya@air:~/Desktop$ dd if=/dev/zero of=./test count=50 bs=1024
50+0 records in
50+0 records out
51200 bytes (51 kB) copied, 0.000732 s, 69.9 MB/s

ある程度のサイズを書きこまないと、正しく測定できない模様。
ファイルサイズを増やしていくよ。

500回書いた。

takuya@air:~/Desktop$ dd if=/dev/zero of=./test count=500 bs=1024
500+0 records in
500+0 records out
512000 bytes (512 kB) copied, 0.004786 s, 107 MB/s

1000回書いた

takuya@air:~/Desktop$ dd if=/dev/zero of=./test count=1000 bs=1024
1000+0 records in
1000+0 records out
1024000 bytes (1.0 MB) copied, 0.007525 s, 136 MB/s

2000回

takuya@air:~/Desktop$ dd if=/dev/zero of=./test count=2000 bs=1024
2000+0 records in
2000+0 records out
2048000 bytes (2.0 MB) copied, 0.014717 s, 139 MB/s

3000回

takuya@air:~/Desktop$ dd if=/dev/zero of=./test count=3000 bs=1024
3000+0 records in
3000+0 records out
3072000 bytes (3.1 MB) copied, 0.034717 s, 88.5 MB/s
takuya@air:~/Desktop$ dd if=/dev/zero of=./test count=2000 bs=1024
2000+0 records in
2000+0 records out
2048000 bytes (2.0 MB) copied, 0.014924 s, 137 MB/s

さらに小さいファイルにしてみた

takuya@air:~/Desktop$ dd if=/dev/zero of=./test count=100 bs=512
100+0 records in
100+0 records out
51200 bytes (51 kB) copied, 0.000996 s, 51.4 MB/s
takuya@air:~/Desktop$ dd if=/dev/zero of=./test count=1000 bs=512
1000+0 records in
1000+0 records out
512000 bytes (512 kB) copied, 0.004781 s, 107 MB/s
takuya@air:~/Desktop$ dd if=/dev/zero of=./test count=10000 bs=512
10000+0 records in
10000+0 records out
5120000 bytes (5.1 MB) copied, 0.047248 s, 108 MB/s

MACのSSDは書き込み136MBくらいですね。

NAS(テラステーション)にも書き込めている。

takuya@air:/Volumes/takuya$ dd if=/dev/zero of=./test count=10000 bs=512
10000+0 records in
10000+0 records out
5120000 bytes (5.1 MB) copied, 0.947956 s, 5.4 MB/s

takuya@air:/Volumes/takuya$ dd if=/dev/zero of=./test count=1000 bs=1024
1000+0 records in
1000+0 records out
1024000 bytes (1.0 MB) copied, 0.335269 s, 3.1 MB/s
takuya@air:/Volumes/takuya$ dd if=/dev/zero of=./test count=1 bs=1048576
1+0 records in
1+0 records out
1048576 bytes (1.0 MB) copied, 0.833249 s, 1.3 MB/s
takuya@air:/Volumes/takuya$ dd if=/dev/zero of=./test count=10 bs=1048576
10+0 records in
10+0 records out
10485760 bytes (10 MB) copied, 3.38667 s, 3.1 MB/s
takuya@air:/Volumes/takuya$ dd if=/dev/zero of=./test count=100 bs=1048576
100+0 records in
100+0 records out
104857600 bytes (105 MB) copied, 30.6982 s, 3.4 MB/s

テラステーション遅い・・・3MB/s

同じようにすればUSBメモリも測定できる。

読み込みは?

なんかおっきいファイル作って

dd if=/path/to/sample_file of=/dev/null

で出来るんじゃないの?

phpのSqliteでの「謎」のエラー unable open database

PHPSQLiteには謎のエラーがあって、

unable to open database file

になります。

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY000]: General error: 14 unable to open database file

と出てきます。しかし・・・

[mi@www-mini db]$ ls -alt
合計 92
drwxrwxrwx  9 root root  4096  223 19:58 ..
drwxrwxr-x  2   mi   mi  4096  221 22:57 . #←これが原因
-rwxrwxrwx  1   mi   mi 36864  221 22:57 development.sqlite3
-rwxrwxrwx  1   mi   mi 29696  211 00:57 development.sqlite3.default

ファイルは777なんですね。でも動かない。

ディレクトリにも書き込み権限が必要

こっちは動く。
ファイルだけでなく、ディレクトリにも書き込み権限が必要。

[mi@www-mini db]$ ls -alt
合計 92
drwxrwxrwx  9 root root  4096  223 19:58 .. 
drwxrwxrwx  2  mi   mi  4096  221 22:57 .#←このパーミッションの注目
-rwxrwxrwx  1   mi   mi 36864  221 22:57 development.sqlite3
-rwxrwxrwx  1   mi   mi 29696  211 00:57 development.sqlite3.default

”. ”のパーミッションに注目! "drwxrwxr-x" → "drwxrwxrwx"だと書き込める。

あれれ、ディレクトリって、"rwx"の"x"さえアレばいいんだよね。って思ってたら、ディレクトリに書き込み権限つけたら治った。
まさか。まさかですよね。これはバグ?なのかな?

watch コマンドのオプション

watchコマンド:コマンドを定期実行し結果を淡々と表示するコマンドで--differences=cumulativeとすれば、毎秒変わっていくところがハイライトされて便利なんですが。

--differences=cumulative が長くて覚え得られないと思ってたら、
-dc でも同じらしい

watch -n 1 -dc date

Macの場合はbrewで入るよ

brew install watch

SQLiteでテーブルヘッダを表示する。

カラムを使って表示すると、JOINの時とかに便利でしょ。

.headers ON

設定前

sqlite> SELECT *  from B inner join C on c.id = b.c_id inner join D on c.d_id = D.id ;

20|100||100|1000||1000|1

設定後

sqlite> .headers ON
sqlite> SELECT *  from B inner join C on c.id = b.c_id inner join D on c.d_id = D.id ;

id|c_id|date|id|d_id|price|id|a_id
20|100||100|1000||1000|1

ちょっとだけ見やすくなる。

Alternativeに項目を追加する

alternatives を使って使うプログラムを切替えるにはの続き。

切替する選択肢を増やしたい。

alternativesを使うと同じ名前の別プログラムを切り替えられる。これにプログラムを追加したい。

記述方法

alternatives --install $PATH_TO_LINK $ALTER_NAME $PATH_TO_REAL_PATH $PROIORITY

現在の設定。

takuya@letsnote:~$ update-alternatives --config gcc

1 プログラムがあり 'gcc' を提供します。

  選択       コマンド
-----------------------------------------------
*+ 1           /usr/bin/gcc-4.exe


Enter を押して現在の選択 [+] を保持するか、選択番号を入力します:

追加してみる。

追加

takuya@letsnote:~$ alternatives --install /usr/bin/gcc.exe  gcc  /usr/bin/gcc-3.exe 10

追加後

takuya@letsnote:~$ update-alternatives --config gcc

2 プログラムがあり 'gcc' を提供します。

  選択       コマンド
-----------------------------------------------
*+ 1           /usr/bin/gcc-4.exe
   2           /usr/bin/gcc-3.exe


Enter を押して現在の選択 [+] を保持するか、選択番号を入力します:

無事追加された。OK

まとめ

 /usr/sbin/alternatives --install /usr/sbin/sendmail mta /usr/sbin/sendmail.postfix 30
                --install [バイナリのシンボリックリンク名][名前][指定したいバイナリ本体][優先度]

MacでRPMファイルを展開するには

RPMファイルを貰ったけど、いちいちRedhatCentOS)に転送して展開するのも馬鹿らしい。

rpm2cpioで形式を変換したらいい。

brewにrmpをcpioに変換

brew install rpm2cpio

展開。

rpm2cpio hoge.rpm | cpio -id

以上。簡単です。

RPMファイルの中身を見るのにもコマンドだけでいけるのが便利ですね。

cpioはちなみに次のようなオプションになっています。

-i : ファイルを読み込む(標準入力から)
-d:ディレクトリを作って展開する。

この場合rpmなので、usr/local/的なフォルダが作られることが多いです。

XMLを整形(tidy)して読みやすく、貼りつけやすくする。

XMLをもらったけど、階層ツリーがむちゃくちゃでわからない

tidy -utf8  -i --input-xml true  --indent-cdata true  ./sample.xml 


しかも昔にエントリ書いてるし。www


tidy のインストール。

mac
はじめから
linux
debian gnu/linuxは aptで
windows
コンパイル済みバイナリをどこかでダウンロードしてくる
cygwin
setup.exeや apt-cyg で

XMLの整形

tidyでxmlを整形するには・

 -xml オプションを付ける。

tidy -xml ./sample.xml

または tidy-configを使う。( --input-xml true)

出力

takuya@air:~/Desktop$ tidy -q -xml sample.xml  | head
line 164 column 40 - Warning: replacing invalid character code 151

<?xml version="1.0" encoding="utf-8"?>
<PMML version="4.0">
<Header copyright="BMRC">
<Application name="mclassify" version="1.0" />
<Timestamp>15 Jun 2010 17:54:26</Timestamp>
</Header>
<DataDictionary numberOfFields="7">
<DataField name="&#230;&#176;&#8212;&#230;&#184;&#169;"
optype="continuous" dataType="double"></DataField>
<DataField name="&#230;&#185;&#191;&#229;&#186;&#166;"

あちゃっ文字化けだ。*1

文字コードを指定する。


line 164 column 40 - Warning: replacing invalid character code 151

のように文字コードに問題があるときはちゃんと指定する。

 -utf8オプションを付ける。

結果

takuya@air:~/Desktop$ tidy -q -utf8 -xml sample.xml  | head
<?xml version="1.0" encoding="utf-8"?>
<PMML version="4.0">
<Header copyright="BMRC">
<Application name="mclassify" version="1.0" />
<Timestamp>15 Jun 2010 17:54:26</Timestamp>
</Header>
<DataDictionary numberOfFields="7">
<DataField name="気温" optype="continuous" dataType="double">
</DataField>
<DataField name="湿度" optype="continuous" dataType="double">

インデントを指定する。

takuya@air:~/Desktop$ tidy -q -i -utf8 -xml sample.xml  | head
<?xml version="1.0" encoding="utf-8"?>
<PMML version="4.0">
  <Header copyright="BMRC">
    <Application name="mclassify" version="1.0" />
    <Timestamp>15 Jun 2010 17:54:26</Timestamp>
  </Header>
  <DataDictionary numberOfFields="7">
    <DataField name="気温" optype="continuous" dataType="double">
    </DataField>
    <DataField name="湿度" optype="continuous" dataType="double”>

余計なメッセージを消す。

標準エラーに出力される、メッセージがうざったいので消す。

 -q : quiet 黙れ。 

出力ファイルを指定する。

単純にリダイレクをする。

tidy -q -i -utf8 -xml sample.xml  > neat.xml

または出力ファイルを指定する。

tidy -q -i -utf8 -xml  -o neat.xml sample.xml 

このときの注意点は、 -o text.xmlを sample.xml(入力ファイル)より先に指定する。

この指定がうざったい・・・

インデントの細かいオプションをつける。

タグの階層でインデントをする。

tidy -utf8  -i --input-xml true  --indent-cdata true  ./sample.xml 

さらに属性でインデントもつけたい。

tidy -q -utf8  -i --input-xml true  --indent-cdata true --indent-attributes true ./sample.xml  

これで、インデントが属性にも適用されて読みやすくなる。

出力結果。

takuya@air:~/Desktop$ tidy -q -utf8  -i --input-xml true  --indent-cdata true --indent-attributes true ./sample.xml  | head -n 20
<?xml version="1.0" encoding="utf-8"?>
<PMML version="4.0">
  <Header copyright="BMRC">
    <Application name="mclassify"
                 version="1.0" />
    <Timestamp>15 Jun 2010 17:54:26</Timestamp>
  </Header>
  <DataDictionary numberOfFields="7">
    <DataField name="気温"
               optype="continuous"
               dataType="double"></DataField>
    <DataField name="湿度"
               optype="continuous"
               dataType="double"></DataField>
    <DataField name="天候"
               optype="categorical"
               dataType="string">
      <Value value="晴れ" />
      <Value value="曇り" />
      <Value value="雨" />

--indent-xxxなどのオプションを全部みたい。

tidy -show-config 

で設定項目が分かる。




ま、こんなコトしなくても、見るだけなら、Opera/Safari/Firefoxなどブラウザで開くのが手っ取り早いんだけどね。

*1:文字化けというより、XMLのUTF8の文字符号になってるんだけどさ。

ffmpeg で指定時間だけエンコード

ffmpeg で、指定時間だけエンコードする。

-t オプションを使う

./ffmpeg/ffmpeg -y    -i out.mp4 -vcodec libx264 -acodec libfaac -t 00:00:03  out.ts


この場合3秒


ffmpeg で、開始時間から、指定時間までだけエンコードする。

-ss オプションを使う

./ffmpeg/ffmpeg -y    -i out.mp4 -vcodec libx264 -acodec libfaac -ss 3 -t 00:00:33  out.ts


この場合3秒〜33秒までをエンコード

ffmpeg をcygwinでコンパイルする。

Corei7マシンをwindowsに使っちゃったので、しかたなく、cygwin利用を継続している。最近はSetup.exeでCygwinを最新版にしたらなんかコンパイルが速いので、FFMpegコンパイルをしてみた。

入れたパッケージ

多分これくらいアレば大丈夫。(なんか余計なものもおおいけど)

apt-cyg install autoconf automake binutils gcc gcc-core gcc-g++ gcc-mingw gcc-mingw-core gcc-mingw-g++ gdb gettext gettext-devel git libgcrypt-devel libiconv libtool make mingw-runtime nasm patchutils pkg-config subversion ncurses expat libgcrypt curl wget zip unzip

コンパイルの流れ

  • ビルド用のGCCとか準備。
  • 必要なコーデックのライブラリを準備
  • ffmpegをインストール

yasmのインストール

#yasm
wget -O - http://www.tortall.net/projects/yasm/releases/yasm-1.2.0.tar.gz  |tar zxvf -
cd yasm-1.2.0
./configure --prefix=/usr
make && make install
cd

libx264のインストール

cd ~
git clone git://git.videolan.org/x264
cd x264
./configure --prefix=/usr --enable-shared
make && make install
cd ~

lameのインストール

wget -O - 'http://downloads.sourceforge.net/project/lame/lame/3.99/lame-3.99.4.tar.gz' | tar zxvf -
cd lame-3.99.4/
./configure   --prefix=/usr && make  &&make install

libfaacのインストール

wget -O - http://downloads.sourceforge.net/faac/faac-1.28.tar.gz | tar xzvf -
cd faac-1.28/
chmod +x ./bootstrap
./bootstrap && ./configure --prefix=/usr 
make && make install
cd ~

faacだけはgcc4でコンパイルしてる。

ffmpegをインストール

cd ~
git clone --depth 1 git://source.ffmpeg.org/ffmpeg
cd ffmpeg 
./configure --prefix=/usr/local  --enable-gpl --enable-version3 --enable-nonfree --enable-postproc --enable-pthreads --enable-libfaac  --enable-libmp3lame  --enable-libx264 
make && make install 


できたーーーーーーーーー!!

cygwinビルドと、既存のmingwとの比較。

いまのffmpegは。windowsimagemagickについてきたものを使ってる。

takuya@host:~/ffmpeg$ which ffmpeg
/cygdrive/c/programfiles/ImageMagick-6.6.7-Q16/ffmpeg

オプション

takuya@host:~/ffmpeg$ ffmpeg.exe
Hyper fast Audio and Video encoder
usage: ffmpeg [options] [[infile options] -i infile]... {[outfile options] outfile}...

FFmpeg version SVN-r23418, Copyright (c) 2000-2010 the FFmpeg developers
  built on Jun  2 2010 04:12:01 with gcc 4.4.2
  configuration: --target-os=mingw32 --enable-runtime-cpudetect --enable-avisynth --enable-gpl --enable-version3 --enable-bzlib --enable-libgsm --enable-libfaad --enable-pthreads --enable-libvorbis --enable-libtheora --enable-libspeex --enable-libmp3lame --enable-libopenjpeg --enable-libxvid --enable-libschroedinger --enable-libx264 --extra-libs='-lx264 -lpthread' --enable-libopencore_amrwb --enable-libopencore_amrnb --enable-librtmp --extra-libs='-lrtmp -lssl -lcrypto -lws2_32 -lgdi32 -lwinmm -lcrypt32 -lz' --arch=x86 --cross-prefix=i686-mingw32- --cc='ccache i686-mingw32-gcc' --enable-memalign-hack
  libavutil     50.16. 0 / 50.16. 0
  libavcodec    52.72. 1 / 52.72. 1
  libavformat   52.67. 0 / 52.67. 0
  libavdevice   52. 2. 0 / 52. 2. 0
  libavfilter    1.20. 0 /  1.20. 0
  libswscale     0.11. 0 /  0.11. 0
Use -h to get full help or, even better, run 'man ffmpeg'

今回ビルドしたffmpeg

takuya@host:~/ffmpeg$ ./ffmpeg.exe
ffmpeg version git-2012-02-27-a4c22e3 Copyright (c) 2000-2012 the FFmpeg developers
  built on Feb 28 2012 04:01:16 with gcc 3.4.4 (cygming special, gdc 0.12, using dmd 0.125)
  configuration: --prefix=/usr/local --enable-gpl --enable-version3 --enable-nonfree --enable-postproc --enable-pthreads --enable-libfaac --enable-libmp3lame --enable-libx264
  libavutil      51. 41.100 / 51. 41.100
  libavcodec     54.  4.100 / 54.  4.100
  libavformat    54.  1.100 / 54.  1.100
  libavdevice    53.  4.100 / 53.  4.100
  libavfilter     2. 62.101 /  2. 62.101
  libswscale      2.  1.100 /  2.  1.100
  libswresample   0.  7.100 /  0.  7.100
  libpostproc    52.  0.100 / 52.  0.100
Hyper fast Audio and Video encoder
usage: ffmpeg [options] [[infile options] -i infile]... {[outfile options] outfile}...

Use -h to get full help or, even better, run 'man ffmpeg’

若干コーデックが減ってるけど、まぁそりゃ入れてないので仕方ない。いままではビルドなんて無理だろう。と諦めてたけど、新しいCygwinとCorei7パワーで30分もかからない。便利〜。

触れてはいけないこと。

 些細な一言が他人を傷つけたり、些細な一言が心に刺さって、傷が深く立ち上がれない。そんな経験は誰しもあると思います。僕もたくさん経験してきました。言いたい放題言ってるわけだし、他人を傷つけたり、問題を起こすこともある。たくさんの人を傷つけたり、たくさん傷ついた。

言葉はナイフ。

 言葉はナイフです。言葉は世界を切り取り、理解の補助する。言葉がなければ何も生まれない。ナイフを他人に向けないよう教わるのに、僕らは言葉を他人に向けないよう、明確に習うことはないかな。言葉は便利な道具です。使い方を誤ると、心に深く突き刺さる。

殴ってもいい場所と、ダメな場所。

 喧嘩はしてもいい。でも目を狙っちゃいけない。頭を殴っちゃいけない。そうならなうよね。なぜ目を狙っちゃいけないか?それは取り返しがつかないからだ。簡単に傷つけられるのに、永遠に取り返しが付かない。骨は折れても元通り。でも目はダメだ。拳は武器だ。凶器だ。そう身体の使い方を習うよね。小さな力で相手を再起不能にできちゃうんだから。。

発していい言葉と、ダメな言葉。

 口喧嘩もしてもいい。でも、相手の内面やコンプレックスをついちゃダメだ。性格を否定したらダメだ。なぜか、それは取り返しがつかない。自尊心を傷つけたら元通りにはならない。コンプレックスを増やすだけだからだ。そうすると人間関係も壊れてしまう。「食べ過ぎたらダメだよ。」この程度ならいい。でも「食べ過ぎて我慢出来ない、お前はダメだ。」「我慢のないやつは最低だ。」と言っちゃだめだ。言葉も凶器だ。身体の使い方を習うように、言葉の使い方を学ばなくちゃいけない。

触れてはいけないこと

 相手の身体のデリケートな部分に触れたらダメだよね。相手が大事してる部分に触れてはいけないこと。言葉だって同じだ。相手の大事にしているもの、大切にしている思い出に安易に触れちゃいけない。相手の思い出に触れる言葉は慎重に、それは相手の外性器を触るように慎重に。距離を縮めるんだよ。

心は目に見えない。

 だから我慢しなくていいんだよ。言われたときは、相手の見えるよう主張しよう。心が辛い時は我慢しちゃダメ。ちゃんと目に見える形で主張しよう。言葉以外もアリだ。相手の些細な一言が突き刺さったら、ちゃんとそれを眼に見えるように態度にだそう。そういう我慢はしなくてもいい。でもね、出来る限り笑顔でいてほしいな。笑顔で不快な思いをしたことを伝えるのが理想だよ。笑顔で拒否の気持ちを伝えられたら、その時にオトナとして一人前らしいよ。

言葉は自分に向けよう。

 たとえば、相手が食欲を我慢出来ない人だとしても、「我慢出来ないの?」って聞くのではなく、「食べ過ぎちゃうアナタを見ていて心配だな。心が痛いな。」なんて言えたらいいよね。夜更かししちゃう人がいたら、「眠れないの?そっか。それは不安が募るよね、まぁ眠くなるまで一緒にいるわ」と言えばいい。たとえ先に寝ちゃったとしても、心は何故か温かい。俺はガチホモかと思ったほど、そいつの存在が有難かった。

言葉の使い方を学ぼう。

 「何大卒ですか?」なんて聞くバカが居る。「部活とかやってました?」って聞けばいい。相手に学歴コンプレックスがあったり、望んで無い大学進学だってあるよね。だから遠回しに聞くんだ。「なんか筋肉多いよね。部活とかやってました?」って。もし「はい、大学時代にアメフトを。」って回答があれば、大卒ってわかるよね。質問は上手にやろう。知りたいことを知るために質問は別にストレート聞く必要はない。

だけど、想像と、読み取ることは違う。

 蛇足だけど、想像をふくらませたらいけない。相手は「大学時代にアメフト」と答えただけで、卒業したとは言ってない。だから質問を注ぐんだ「最近はやってないんですか?」って、「卒業してからはやってないなぁ。卒業ぎりぎりまでやってましたよ。単位やばかった」って答えがあれば、卒業したとわかる。うっかり前の質問で、早とちりで卒業と想像してたら、中退のコンプレックスを啄いちゃうかもしれない。言葉と質問は武器だから上手に使うといい。

だけどもし傷つけたら?

 すぐに謝ろう。すぐにだ。その場で。たとえ仲裁があってその場が収まっても、相手に直接謝ろう。

なんでコイツ怒ってるかわからないんだけど。

 それもすぐに、笑顔で「ごめんね。」という。

なんでこれくらいで怒るの?

 いやそれは相手にとって、触れてほしくないことだったんだよ。だからまず謝ろう。

些細な冗談でマジギレして空気壊すなよ。

 いやそれは、相手にとって、言われたくなかったことだから、空気を盾にしてもだめだ。相手に空気嫁というまえに、自分の行動を振り返えるほうが建設的かな。それくらいでマジギレすんなよ。と思う前に、「ちゃんと目に見える形で表現してくれてよかった」と思うほうが建設的。

時に言葉は凶器だから。

 基本笑顔。そしてコンプレックスには触れない。別の質問で代替できるなら、ストレートには聞かない。そして笑顔で。これが日本という人口高密度社会で生きる上の知恵だとおもう。欧米人から見ると婉曲的で面倒かもしれないけど。それは社会と人間関係をうまく回す知恵なんだよ。

部活を聞くテクニックは。

日野原重明先生の本から習いました。こうやって「ワンパターンな質問」を飛躍的に膨らますことが出来るよ。「大学は?研究は?どこ出身?何が好き?」なんて質問は飽き飽きだよねー

ワンパターンな質問になってないかい?質問が何故必要か?その質問は別の質問で代替できないかな?。ずっと遠まわしにでもいいんだ。聞くんだったら色々な質問で代替してみよう。そのほうが話が膨らむよ。

コンプレックスを煽っちゃいけない。

誰しもコンプレックスや劣等感はあるし、自尊心がなければ死んでしまう。「泥棒といえば人は盗む。」これが真実。出来ない出来ないって言い続けたら本当に出来ない子になる。僕の友人のある人は、無理して身長を伸ばそうとしたし。*1ある人は空を飛ぼうとした、ある人は献血に挑戦したし、ある人は電車に勝負を挑んだ。強くないのに強くなろうとして無茶な勝負をしたもんだ。ある人は、早く良くなろうとより多めに薬を飲んだ。みんな早く良くなって認めてもらおうと必死だっった。必死だったよ。
 コンプレックスを刺激しちゃダメなんだよ。何より怖いのはコンプレックスが何処にあるか見えないことなんだ。だから傷つけたらすぐに謝ろう。出来ることなら傷つけないように慎重に言葉を選ぼう。
 貴方がつらい言葉を言われたら、その場で脊髄反射して拒否を明確にしよう。目に見えない心だから、ちゃんと眼に見えるよう主張してみよう。我慢しちゃダメ。我慢して考えて悩むくらいならその場で喧嘩したほうがすっきりするから。

 そしてもし、他人の主張を見かけたら、「よく言ってくれたね」って受け入れてあげて欲しい。どうしてそんな事言うの、言い訳すんなとか、空気嫁とか、我慢しろとか言っちゃだめだよ。コンプレックスを煽るとコンプレックスを克服するために、すぐ無茶をするからね。

甘えじゃない。

 甘えじゃない。若い人には辛く当たることが教育だと勘違いしてる人がよくいる。アレさ家族がいる若い人ならいいんだよ。仕事でいくら厳しいことを言われてもちゃんと帰る場所があって、ちゃんと家族がいれば。自尊心はちゃんと貯金されるから。仕事で自尊心をすり減らそうが、またきっと貯金して出なおしてくるんだ。だから若い人に厳しく言うと育つんだ。それは「厳しく」が有効じゃなくて、若いうちは家族のサポートがあるからなんだよ。よく思い上がってる人がいるけど、、、ね






 

*1:アレは本当に悲しかった。

サンプルで使って慣れる。ffmpeg の使い方。

ffmpeg って色々出来るんだけど、オプションが慣れないとわからないというか。コンテナとかフォーマットとかコーデックとか色々あってね。ちょっと取っ掛かりが分かり難い。僕も色々やってみたけど、「習うより慣れ」でした。

ffmpegの基本

ffmpeg -i 入力ファイル名   その他いっぱいオプション  "出力ファイル名.拡張子"

です。最初は上記の構文だけ頭に入れておきます。ffmpeg は使いかたも概念もややこしいので、とりあえずパターンで覚えて、その後に理屈を攻めていけばいいさ

本エントリの目標

基本的な使い方を覚えて、2パスで高画質エンコード*1のオプションを暗記する。地デジのTSをエンコード出来るように。

2パス エンコードまでやります。

ffmpeg で動画を変換してみる。

適当な動画を一本用意する。とりあえずニコニコ動画から、なんかFLVを一本ダウンロードして用意。
あんまり長いファイルだと、変換時間が長くて勉強テンポが悪い。短すぎるとわかりづらいので1分くらいの動画でいい。

ffmpegのインストールは別に何でもいい。OSに入ってるものや、適当にダウンロードしたバイナリではじめるといいさ。

flvをmp4にに変換する

ニコニコ動画のflvをMP4形式に変換してみます。

ffmpeg -i sm1715919.flv out.mp4

mp4をflvに

逆に、MP4のファイルをflvに変換してみます。

ffmpeg -i sm1715919.mp4 out.flv

mp4 を movに

MP4形式をQuickTimeのMOV形式に変換してみます。

ffmpeg -i sm1715919.mp4 sm1715919.mov

形式の変換ができるようなった?

形式の変換のまとめ

ffmpeg -i 入力ファイル名  " 出力ファイル名.拡張子"

の「拡張子」で自動で決定されるの。僕らは、拡張子だけ意識していればいい。

拡張子とコンテナ。

実は先ほどの例、これらはコンテナを変えた。動画・音声を変換するオプションは指定してない。*2

ffmpegで動画の情報を見る。

動画形式が変換されたら、どの辺が変わるか。それを見てみます。

動画の情報を見る。
 ffmpeg -i ファイル名 

flvの情報を見てみる。

まず元になった動画のファイル形式を見てみる。

ffmpeg -i sm1715919.flv
(ry
    Stream #0:0: Video: flv1, yuv420p, 320x240, 200 kb/s, 29.97 tbr, 1k tbn, 1k tbc
(ry
    Stream #0:1: Audio: mp3, 44100 Hz, stereo, s16, 128 kb/s

movファイル

flv→movに変換したものを見てみる。

 ffmpeg -i sm1715919.mov
    Stream #0:0(eng): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 320x240, 137 kb/s, 29.97 fps, 29.97 tbr, 30k tbn, 59.94 tbc
    Stream #0:1(eng): Audio: aac (mp4a / 0x6134706D), 44100 Hz, stereo, s16, 128 kb/s

mp4ファイル

flv→mp4に変換したものを見る

ffmpeg -i sm1715919.mp4
    Stream #0:0(und): Video: mpeg4 (Simple Profile) (mp4v / 0x7634706D), yuv420p, 320x240 [SAR 1:1 DAR 4:3], 214 kb/s, 29.97 fps, 29.97 tbr,            
  Stream #0:1(und): Audio: aac (mp4a / 0x6134706D), 44100 Hz, stereo, s16, 64 kb/s

mpeg2に変換したもの

ffmpeg -i sm1715919.mpeg
    Stream #0:0[0x1e0]: Video: mpeg1video, yuv420p, 320x240 [SAR 1:1 DAR 4:3], 104857 kb/s, 29.97 fps, 29.97 tbr, 90k tbn, 29.97 tbc
    Stream #0:1[0x1c0]: Audio: mp2, 44100 Hz, stereo, s16, 128 kb/s

情報の読み方。

Streamで始まる項目が音声・動画の形式。

    Stream #0:0(und): Video: mpeg4 (Simple Profile) (mp4v / 0x7634706D), yuv420p, 320x240 [SAR 1:1 DAR 4:3], 214 kb/s, 29.97 fps, 29.97 tbr,            
  Stream #0:1(und): Audio: aac (mp4a / 0x6134706D), 44100 Hz, stereo, s16, 64 kb/s

Video:XXXXのXXXが動画のコーデック
Audio:YYYYのYYYYが音声コーデック

コーデックとコンテナに付いての簡単な説明。

あくまでイメージですが、、、こんな感じ。

\int_0^x\{video(t)+audio(t)\}dt

動画と音声を数秒ごとに分割して、数秒単位に動画+音声が繰り返し現れる。ってイメージ。
この時の切り方、ファイルの折り返し方を定義したのがコンテナ(数式の\int_0^tdtの部分)


ffmpeg で動画ファイルから音声を抜き出す

Mp3を動画ファイルから作ります。

ffmpeg -i sm1715919.mp4 sample.mp3

出来上がり。簡単ですねー。

ファイルをチェックしてみる。

takuya@air:~/Desktop$ ffmpeg -i sm1715919.mp4 sample.mp3
    Stream #0:0: Audio: mp3, 44100 Hz, stereo, s16, 128 kb/s

ちゃんとMp3だけのファイル。簡単ですねー

音無しの絵の動画だけにする。

逆に、音無し。絵だけにする。動画から音を消してしまう。

ffmpeg -i sm1715919.mp4 -an -vcodec libx264 test-noaudito.mp4 
-an
audio none とかそういうこと:

これで音声をカットして、動きだけの動画ファイルにする。

画面サイズを変える。

元ファイルがこれ
(377fc0e4a622e8f01669f72de39def5f)

フォーマット(コンテナ)はそのままに画面サイズを変える。

拡大してみた
ffmpeg -i sm1715919.mp4 -s 640x480 out.mp4

結果
(d848c7a0d43044a4b16d5754856b4997)

縮小してみた
ffmpeg -i sm1715919.mp4 -s 160x120 out.mp4

(73af0174edf49db3f3b4f6fd32710699)

縦横比を維持して自動計算

横幅を指定して、残りを自動計算させる。アスペクト比だとか、縦横の比率とか、空白とかちょっと考えたくない。

ffmpeg -i sm1715919.mp4  -vf scale=640:-1   out.mp4

縦横の長さは自動計算。

これも簡単ですね。

ビデオ・コーデックの変換

ファイルのコンテナはそのままに、ビデオのコーデックだけを変換します。

ffmpeg -i sm1715919.mp4 -vcodec libx264 test.mp4

mp4コンテナのビデオ部分は、Mp4コーデックやH264コーデックでもどちらでも構わないので、変換してみる。

変換前
takuya@air:~/Desktop$ ffmpeg -i sm1715919.mp4
    Stream #0:0(und): Video: mpeg4 (Simple Profile) (mp4v / 0x7634706D), yuv420p, 320x240 [SAR 1:1 DAR 4:3], 214 kb/s, 29.97 fps, 29.97 tbr,        
    Stream #0:1(und): Audio: aac (mp4a / 0x6134706D), 44100 Hz, stereo, s16, 64 kb/s
変換後
takuya@air:~/Desktop$ ffmpeg -i test.mp4
    Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 320x240 [SAR 1:1 DAR 4:3], 120 kb/s, 29.97 fps, 29.97 tbr, 30k tbn,       
    Stream #0:1(und): Audio: aac (mp4a / 0x6134706D), 44100 Hz, stereo, s16, 128 kb/s


ビデオコーデックが変換されている

最後に、ビットレート

ビットレートはkbpsで表現する。違い、一秒再生するのに何ビットいるか

つまり平均何ビットあれば一秒再生できるかってことらしい。

通信とは単位が似ているが・・・ちょっと違う。


2pass はVBRで。

2パスとは、2回エンコードして、2回目に目標のビットレートで最高の画質を追求する

CBRだと無駄が多い。
VBRで圧縮するときに静止してる場面を固定するから、2回やったほうがいい。インターレースをいっぱい作る。

まぁ、とにかく一回エンコードしたものを、可変レートのために読み込みながらもう一回エンコードかけて圧縮率を上げるってことで。

画質が最高とは、同じファイルサイズでも、より高画質。ってことです。

動画を2パスでエンコードすることで画質の向上を狙います。そのかわり処理時間は約2倍になります。

http://nicowiki.com/エンコード設定(中画質〜高画質).html#teeca4db

音声と動画を別々にエンコードするらしいよ。

MPEG2 TSを変換する。

2パスで変換する。

1パス目
ffmpeg -i $INPUT -vcodec libx264 -an -pass 1 -passlogfile "./pass.log" -s 1280x720 test.mp4
2パス目
ffmpeg -i $INPUT -vcodec libx264  -b:v 500k -acodec libfaac -pass 2 -passlogfile "./pass.log" -s 1280x720 test.mp4


ポイント、2パス目にはVBR(可変レート)のレートを指定する事になる。ビットレートの目標値を目指してファイルを圧縮。


500kだと画面も明らかに汚い。

画質を上げてみた。
time ffmpeg -i $INPUT -vcodec libx264 -b:v 5000k -acodec libfaac -pass 2 -passlogfile "./pass.log" -s 1280x720 test.mp4

5Mでやり直してみよう。

時間は掛かったけど、ファイルサイズの割にすごく綺麗です。
出来上がりは、

500k   で   27MB
5000k で 180MB

でした。

変換元ファイルからして25%程度に減ったのでとてもいいと思います。*3

ただし、サンプルがアニメで動きが少ないので、圧縮率は高いと思います。

時間を指定して分割する方法

-t で秒数
-ss で切り出す頭秒数

ffmpeg -i input.mp4 -t 10 -ss 60 out.mp4

単純に切り出したいときは 再エンコ省略すると速い

ffmpeg -i input.mp4 -vcodec copy -acodec -c -t 10 -ss 60 out.mp4


ffmpeg で指定秒数を切り出して動画を時間で分割する - それマグで!

*1:高画質ってのは、同じファイルサイズなのにスゲー綺麗ってことで、画質が向上するってことではないんですよ

*2:実際にはコンテナに従って決めるんだけど、一応そういうことにしておいて。

*3:TSの1440を1280にしてるからそれだけでもかなり落ちてるけどね。

Ubuntuでh264のffmpegを使う。

標準仕様のffmpeg は何も入ってないのです。

ubuntuffmpegで、h264動画をつくろうとしたら、できないって言われたので、コンパイルだわ。ビルドしてインストール。でもやり方面倒だよね。ってこと調べた

ffmpeg を non-freeでビルドする方法

参考資料にすげー丁寧に書いてあった。

0.The instructions on the page are for Ubuntu Oneiric Ocelot 11.10, Ubuntu Natty Narwhal 11.04 and Ubuntu Maverick Meerkat 10.10. Separate instructions are also available for older, supported releases:

http://ubuntuforums.org/showthread.php?t=786095

自分でビルドすればいいんです。

ビルド専用のスクリプト書いてみた。

urlの記事を参考に、シェルスクリプトにまとめておいた。
ffmpeg_install.sh

  1 ##uninstall
  2 sudo apt-get remove ffmpeg x264 libx264-dev -y
  3 ## install build-tools and library
  4 sudo apt-get update
  5 sudo apt-get install build-essential checkinstall git libfaac-dev libjack-jackd2-dev \
  6   libmp3lame-dev libopencore-amrnb-dev libopencore-amrwb-dev libsdl1.2-dev libtheora-dev \
  7   libva-dev libvdpau-dev libvorbis-dev libx11-dev libxfixes-dev texi2html yasm zlib1g-dev
  8 #install x264
  9 cd
 10 git clone git://git.videolan.org/x264
 11 cd x264
 12 ./configure --enable-static
 13 make
 14 sudo checkinstall --pkgname=x264 --pkgversion="3:$(./version.sh | \
 15     awk -F'[" ]' '/POINT/{print $4"+git"$5}')" --backup=no --deldoc=yes \
 16     --fstrans=no --default
 17 #install ffmpeg
 18 cd
 19 git clone --depth 1 git://source.ffmpeg.org/ffmpeg
 20 cd ffmpeg
 21 ./configure --enable-gpl --enable-libfaac --enable-libmp3lame --enable-libopencore-amrnb \
 22     --enable-libopencore-amrwb --enable-libtheora --enable-libvorbis --enable-libx264 \
 23     --enable-nonfree --enable-postproc --enable-version3 --enable-x11grab
 24 make
 25 sudo checkinstall --pkgname=ffmpeg --pkgversion="5:$(date +%Y%m%d%H%M)-git" --backup=no \
 26   --deldoc=yes --fstrans=no --default
 27 hash x264 ffmpeg ffplay ffprobe
 28
 29
 30

実行結果

(ry
tripping ELF binaries and libraries...OK
manページを圧縮..OK
ファイルリストを作成..OK
Debianパッケージを作成..OK
Debianパッケージをインストール..OK
tempファイルを削除..OK
doc-pakディレクトリを削除..OK
temp dirを削除..OK
**********************************************************************
 Done. The new package has been installed and saved to

 /home/takuya/ffmpeg/ffmpeg_201202232008-git-1_amd64.deb

 You can remove it from your system anytime using:

      dpkg -r ffmpeg

**********************************************************************

インストールされた先。

/usr/local/bin/ffmpeg

に新しいイケテルffmpegがインストールされてます。


楽ちんですね。