どんなことでも

この人 blog を書くのだろうか?

エラトステネスのふるい その2

2014-10-14 03:12:00 | コンピュータ
MS Visual Studio Express 2013 for Windows Desktop とかってのを見つけたのでダウンロードしてみた。
しかしすることが無い。
ということで、C でエラトステネスの篩を書いてみた。

引数に求めたい素数の最大値を指定。
C:>Eratosthenes.exe 1000
1000 までの素数は大きい方から
997
991
983
977
971
967
953
947
941
C:>
と、でかい方から 10個表示する。
#include "stdafx.h"
#include <limits.h>
#include <stdlib.h>
#include <wchar.h>
#include <tchar.h>
#include <stdbool.h>

int _tmain(int argc, _TCHAR* argv[])
{
unsigned long long int prime_max;
bool *prime;
unsigned long long int i, j;

if (argc != 2){
puts("素数を求める最大値を 1つ指定して下さい");
return -1;
}
/* 引数を数値に変換 LLONG_MAX まで */
prime_max = _tstoi64(argv[1]);
printf("%llu までの素数は大きい方から\n", prime_max);
if (prime_max > LLONG_MAX || prime_max == 0){
puts("1以上の数値を 1つ指定して下さい。");
return -1;
}
/*
printf("LONG_MAX : %ld\n", LONG_MAX);
printf("ULONG_MAX : %lu\n", ULONG_MAX);
printf("LLONG_MAX : %lld\n", LLONG_MAX);
printf("ULLONG_MAX: %llu\n", ULLONG_MAX);
*/

/* 配列の領域を確保 & 初期化 */
prime = (bool *)malloc(sizeof(bool) * (prime_max + 1));
for (unsigned long long i = 0; i <= prime_max; ++i)
prime[i] = true;

/* さて、始めるよ! */
for (i = 2; i <= prime_max / 2; ++i){
if (!prime[i])
continue; /* 素数で無いなら次へ */

/* 素数の倍数 (=素数で無い) に false を代入 */
for (j = 2; prime_max >= i * j; ++j)
prime[i*j] = false;
}

/* 表示ルーチン
* 大きい方から j = 10 個表示 */
for (i = prime_max, j = 10; i > 1 && j > 1; --i){
if (!prime[i]) continue;
printf("%lld\n", i);
--j;
}
return 0;
}


若干ごみが残ってますが、こんな感じ。ヘッダーが大量に要りますねぇ(^^;
不思議なのは IDE からコンパイルするのと開発者コマンドプロンプトの cl でコンパ
イルするのではできた実行ファイルのサイズが倍以上違う。何故?

MS Visual Studio Express 2013 for Windows Desktop の統合環境版でコンパイル
 → 32,256バイト

開発者コマンドプロンプト for VS 2013 でコンパイル
 → 68,608バイト

DVD 2枚を 1枚の Blu-ray に纏める作業

2014-09-06 02:12:00 | コンピュータ
東京でやった発表会の DVD 2枚をダビングしてくれとの父の依頼。
暗に、2枚は面倒だから Blu-ray 1枚でと。
で、Web を眺めて multiAVCHD でできそうだなといじり回すが、良く分からん。

取り敢えず、DVD 1枚ならできるのかな?と DVDFab 9 ...試用期限切れ(>_<) DVDFab 8 QT を取ってきてインストール。

Work 1 failed, Error = 504.00 0

とかいうエラーが。
Avisynth とかいうソフトを入れないといけないらしい。
インストールして1枚にしてみるが...あれ?PC で再生できない?Blu-ray レコーダーで見ると最後が切れてる。つかえねー!
DVDFab HD Decrypter ってのが無料版みたいですねぇ。
1層 DVD → 2層 DVD じゃなく、1層 → 1層 なので、画質が悪くなるよなぁと Blu-ray へのコピーに方向転換

multiAVCHD (build771) をダウンロード。
DVD を DVDFab でリップした 2枚分を読み込ませる。
チャプターに名前を付けて取り敢えず Start

ImgBurn で、ISO ファイルを作って仮想ドライブでマウント...あ、消した気がするな。
取り敢えず、ImgBurn で Blu-ray に焼いて PC で見ると、まぁ、こんなもんかなぁ。
Blu-ray プレイヤーで見ると 4:3 画像に。
ってことは、16:9変換してから?って事で transcode の Resize で、1280x720 辺りにを指定。再度 start!

[01:53:13] *** Initiating video encoding:

[01:53:13] *** Original : 720x480
[01:53:13] *** Crop : 0
[01:53:13] *** Resize : 1280x720
[01:53:13] *** Uncrop to : 1280x720
[01:53:13] *** Sharpen : 0
[01:53:13] *** Bitrate : 8000 kbps
[01:53:13] *** Frame rate: Original (PDR: 23.976)
[01:53:13] *** Level : 4
[01:53:13] *** Quality : Two pass (normal quality)
[01:53:13] *** SAR : 1:1
[01:53:13] *** DAR : 1280x720

[01:53:13] *** Removing pulldown...
[01:53:20] *** Re-packing elementary V_MPEG-2 stream...
[01:53:31] *** Profile : Blu-ray

[01:53:31] *** Encoding : Pass one - content: [00:10:23]
[01:53:31] *** Encoding : x264 options:
...snip
[01:53:31] *** Speed P1 : 135791.35 fps (elapsed: 00:00:00)
...snip
[01:53:31] *** Transcoding failed!
[01:53:31] *** Check ffdshow/avisynth/haali (reinstall)!
[01:53:31] >>> Download links: http://multiforum.deanbg.com/viewtopic.php?f=7&t=17
[01:53:31] *** DEBUG: Try to play [E:\新しいフォルダ\multiAVCHD_TMP\multiTEMP-20140906\20140906-015313-uncrop-running.avs] in MPC or other player, which supports AviSynth scripts and report the error to the author!

とかいうエラーが。

x246.exe が悪いのかと、ググって x264 rev2431 tMod を取ってきて multiAVCHD\tools の仲にある x246_86.exe と差し替え。再度やってみるがやはり失敗。元に戻す。

エラーメッセージから、ffdshow (ffdshow_rev4532_20140717_clsid_x64.exe) をダウンロードしてインストール。
→取り敢えず成功。

でも x246.exe が 古いので x246win32 版 からダウンロードして差し替え。

添付されていたバージョン
x264 0.93.1542M 5b86182
built on Apr 15 2010, gcc: 4.4.3 (x86.generic.Komisar)

ダウンロードしたバージョン
x264 0.142.2479 dd79a61
built on Aug 26 2014, gcc: 4.9.1

と、差し替えたところで実行中。

[06:00:40] *** Speed : 15.39 fps overall (elapsed: 00:08:51 - Realtime x 0.64)

[06:00:41] *** Transcoding successful!

[06:00:41] Detected frame reference count: 3 (max:6).
[06:00:41] Detected video: ID#0:V_MPEG4/ISO/AVC 1280x720, fps=23.976, ref=3
[06:00:41] Total of 1 tracks found in this file.
[06:00:41] Adding audio file (dvddump.001.jpn.ac3)
[06:00:41] Creating clip and playlist info (tsMuxeR)...
[06:00:41] Media split set at 4000MiB point...

tsMuxeR (Version 1.10.6) output:
===============================================================================
PROCESSING ERROR: No data received from tsMuxeR!
Trying again...
===============================================================================
MUXOPT --no-pcr-on-video-pid --new-audio-pes --blu-ray --vbr --custom-chapters=00:00:00.000 --split-size=4000MiB --vbv-len=500
V_MPEG4/ISO/AVC, "E:\新しいフォルダ\multiAVCHD_TMP\multiTEMP-20140906\dvddump.[1280x720-23.976].264", insertSEI, contSPS, fps=23.976
A_AC3, "E:\新しいフォルダ\multiAVCHD_TMP\multiTEMP-20140905\dvddump.001.jpn.ac3", lang=jpn
===============================================================================

[06:00:42] tsMuxeR failed to process [DVD (03) V:\Nomura\FullDisc\NOMURA45_01\VIDEO_TS\]...
[06:00:42] Processing (DVD (04) V:\Nomura\FullDisc\NOMURA45_01\VIDEO_TS\)...
[06:00:42] Pre-processing DVD input (V:\Nomura\FullDisc\NOMURA45_01\VIDEO_TS\)...
[06:00:45] *** Detected duration: 00:05:32
[06:00:45] !!! No subtitles found!
[06:00:45] *** Extracting video (mplayer)...
[06:00:55] Pre-processing completed!
[06:00:55] This title is marked for reencoding / uncropping...
[06:00:55] Encoding process may take 10 min to 10 hours, so be patient...

はい、撃沈。何が悪いのかなぁ。

マトリョーシカは使ってないので関係ないだろうけど Haali Media Splitter 23/06/2013 (MatroskaSplitter.exe) を入れて、ついでに tsMuxeR 2.6.12 も差し替えてみる。

元々入ってた奴
V:\>tsMuxeR.exe --version
SmartLabs tsMuxeR. Version 1.10.6 http://www.smlabs.net

V:\>tsMuxeR199.exe --version
SmartLabs tsMuxeR. Version 1.9.9 http://www.smlabs.net
の2つ

取ってきた奴
V:\>tsMuxeR.exe --version
Network Optix tsMuxeR. Version 2.6.12. www.networkoptix.com


ついでに tsdemuxer も差し替え。
元々のバージョン
V:\>tsdemux_orig.exe --version
tsdemux 1.02 AVCHD/Blu-Ray HDMV Transport Stream demultiplexer

取ってきた奴
V:\>tsdemux.exe --version
tsdemux 1.52 AVCHD/Blu-Ray HDMV Transport Stream demultiplexer


TMP ディレクトリを覗いてみると .ac3 (音声) ファイルができていない。うーん、.ac3 を作るのってどこ?

ActivePerl のアップデート方法

2014-08-02 00:55:00 | perl
物のついでなので書いておく。
ActivePerl のアップデートの仕方 ~俺の方法編~


というツイートをヒントに調べてみた。
1. 古いバージョンのパッケージが混ざると面倒な気がするので、ActivePerl のバージョンアップの前に ppm を起動し最新のパッケージへ更新。

2. コマンドプロンプトを開き、以下のコマンドで XML 形式のインストール済みパッケージ一覧をファイルに保存。
ppm profile save %USERPROFILE%\Desktop\ActivePerl_PPM_profile.xml

これで、デスクトップの ActivePerl_PPM_profile.xml というファイルにインストール済みパッケージの一覧が保存されました。
  ※既存のファイルがある場合は上書きされます

3. ActivePerl をアンインストールし、指示に従わず再起動しない。
  ※普通の人は再起動した方が良いと思います。

4. やらなくても良いと思うけど
  C:\Perl とか、D:\Perl64 辺りの、Perl を入れたディレクトリを丸ごと消す。
  ※私の場合は V:\Perl64 でした。

5. 最新の ActivePerl をダウンロードしてきてインストール
  ※2014/08/01時点で
   5.16.3.1604(5.16系), 5.18.2.1802 (5.18系)
   の二つが最新版でした。

6. インストールパッケージの情報を ppm に読み込ませる。
コマンドプロンプトから以下のコマンドを入力。
ppm profile restore %USERPROFILE%\Desktop\ActivePerl_PPM_profile.xml


7. ppm を起動し、パッケージのアップデートをかけると、先ほどの一覧の中でインストールされていないパッケージがインストールされます。

めでたくアップデート完了。

私は上記の方法で 5.14.2 から、5.18.2 へアップグレードしました。

ppm を起動 = スタートメニューから Perl Package Manager を起動するか、「ファイル名を指定して実行」で、ppm と入力すると起動します。

エラトステネスのふるい

2014-08-01 04:39:00 | perl
ActivePerl で書いてみたエラトステネスの篩
# perl
use strict;
use warnings;

# エラトステネスの篩 (Sieve of Eratosthenes)
my $MAX = 10000000;
my @Prime = ();
for (my $i = 2 ; $i <= sqrt($MAX) ; $i++){
# マークが付いていたら (=素数でなかったら) 次へ
if (defined($Prime[$i])){next;}

# 素数の倍数にマークを付ける
for (my $j = 2 ; $MAX >= ($i * $j) ; ++$j ){
$Prime[$i * $j] = 1;
}
}

# マークされていない素数を表示する
for (my $i = 2 ; $i <= $MAX ; ++$i){
if(!defined($Prime[$i]) ){
print "$i,";
}
}


と、ネットで調べてみるともっと短いスクリプトを発見。
grep で、倍数を消してる?さっぱり分からんけど、間違ってはなさそう。悔しいので速度比較をしてみた。
Erat_1 がネットから拾ってきたスクリプト。Erat_2 が私の書いた奴
# perl

use strict;
use warnings;
use Benchmark qw/timethese cmpthese/;

# エラトステネスの篩 (Sieve of Eratosthenes)
my $MAX = 10000000;

my $results = timethese( 1,{
Erat_1 =>
sub {
my $x = $MAX;
my @numbers = (2 .. $x);
my @prime_numbers;
while(1){
if($numbers[0] > sqrt $x){
push @prime_numbers, @numbers;
last;
}
my $number = shift @numbers;
push @prime_numbers, $number;
@numbers = grep { $_ % $number != 0 } @numbers;
}
},

Erat_2 =>
sub {
my $x = $MAX;
my @Prime = ();
for (my $i = 2 ; $i <= sqrt($x) ; $i++){
# マークが付いていたら (=素数でなかったら) 次へ
if (defined($Prime[$i])){next;}

# 素数の倍数にマークを付ける
for (my $j = 2 ; $x >= ($i * $j) ; ++$j ){
$Prime[$i * $j] = 1;
}
}
},

});

cmpthese $results;


表示部分はメインではないので省略。(join が早いのは分かってますが、まぁ、それは置いといて)
Benchmark: timing 1 iterations of Erat_1, Erat_2...
Erat_1: 57 wallclock secs (56.39 usr + 0.08 sys = 56.47 CPU) @ 0.02/s (n=1)
(warning: too few iterations for a reliable count)
Erat_2: 5 wallclock secs ( 5.82 usr + 0.11 sys = 5.93 CPU) @ 0.17/s (n=1)
(warning: too few iterations for a reliable count)
s/iter Erat_1 Erat_2
Erat_1 56.5 -- -90%
Erat_2 5.93 853% --

おぉ、俺の書いた方が 10倍ぐらい早い。push や、shift の配列操作、剰余の計算が重い感じですかねぇ?
って、剰余求めたらエラトステネスの篩じゃない気がする。割り算使っちゃ駄目でしょ。←気づくのが遅い。

そして、100000000 まで求めようとするとネットで調べた方はメモリーを 3G 程使ってまだ足らないと、落ちてしまいました(>_<)
私が書いた方は動いて、99999989 がその中で最大の素数と出ました。メモリの使い方も違いがあるのですねぇ。

正規表現のエラトステネスのふるいを発見。メモリーは使わないですが...鬼のように遅い! (Erat_3)
my $MAX = 20000;
my $results = timethese( -30,{
Erat_1 =>
sub {
...snip...
},

Erat_2 =>
sub {
...snip...
},

Erat_3 =>
sub {
grep { (1 x $_) !~ /^(11+)\1+$/ } (2..$MAX);
},

});

cmpthese $results;

と、2万までの素数を30秒で何回求められるか試したら、
Benchmark: running Erat_1, Erat_2, Erat_3 for at least 30 CPU seconds...
Erat_1: 33 wallclock secs (32.56 usr + 0.02 sys = 32.57 CPU) @ 52.62/s (n=1714)
Erat_2: 33 wallclock secs (32.37 usr + 0.00 sys = 32.37 CPU) @ 141.24/s (n=4572)
Erat_3: 36 wallclock secs (35.60 usr + 0.00 sys = 35.60 CPU) @ 0.03/s (n=1)
(warning: too few iterations for a reliable count)
Rate Erat_3 Erat_1 Erat_2
Erat_3 2.81e-002/s -- -100% -100%
Erat_1 52.6/s 187228% -- -63%
Erat_2 141/s 502721% 168% --

配列 & 剰余 : 32.57秒で1714回 / 1秒間に 52.62回
私の書いたの: 32.37秒で 4572回 / 1秒間に141.24回
正規表現 : 35.60秒で 1回 / 1秒間に 0.03回

EAC

2014-07-28 05:19:00 | コンピュータ
時々発生して、そのたびにどのファイルだっけ?と探すので、メモ

Extrace Audio Copy を起動しています・・・
しばらくおまちください!

と出たまま起動しない場合。
曲名リストのデータベースが壊れている可能性があります。
私の環境の場合、大体半年に一度発生します。

まず、EAC のプロセスを殺す
(タスクマネージャで「EAC.exe *32」を選択して「プロセスの終了(E)」)

[Win]キーと、[R] を押して、「ファイル名を指定して実行」に
%APPDATA%\EAC
と入力して「OK」
を押すとフォルダが開きます。

そのフォルダにある「CDDB.sdf」を
「CDDB.sdf_」等という別の名前に変更。

これで、無事 EAC が起動するようになります。