2011年3月21日月曜日

YUI Live DVD iPod に入れる方法

YUIのライブDVDを音声だけ抽出して、iPodで聞きたかったので、その手順を示す。

1.DVD Decrypterを使って音声だけ抽出する。(VOBファイルができる)
2.http://www.zamzar.com/でファイルを変換する。

以上が大きな流れです。

DVD Decrypterは下記アドレスからDownLoadする。日本語化したほうがわかりやすくなるかも。
http://www.gigafree.net/media/ripping/dvddecrypter.html

OSがWindows Vistaの方は下記の対応しなければならない。
難しいことはしません。
http://dvddecrypter.livedoor.biz/

要は実行権限を実行ファイルに付けないとエラーになるので、その対応をするということ。

DVD Decrypterの使い方。
http://www.oshiete-kun.net/archives/2007/12/30_0022.html
(手順内の最後の「HeadAC3heを起動し~」はやってません。)



注意点をあげると、最後の画像のチェックするところ。
ストリーム処理タブ内のAudio部分をチェックするが、AC3だと副音声で、LPCMは主音声である。

無責任にも、この記事を書いているときは、2.の部分でうまく行っていない。ファイルがコンバートできるやつとできないやつがある。

そして、最終的にはできあがった複数mp3ファイルを1つにまとめる必要があると思う。


3/22
上記VOB→mp3の変換はうまくいかなかったので、違う方法を紹介。
woopiedesktopというツールを使います。フリーです。
http://www.woopiedesktop.com/extension/vob

ダウンロードとインストールは普通にやればうまくいきます。
あとは、woopiedesktopを起動して、そこからwoopie動画変換ツールを起動して、変換します。



違うソフトをインストールし、複数のmp3ファイルをひとつにしたら、iTunesで認識しなかった。ででーん。

Erlang Vista 権限付与して実行

Erlangをインストールして、デフォルトの設定でやる。
すると、ソースをコンパイルしたとき、Erlangのwerl.exeに権限がないため、実行モジュールができないでエラーになる。

回避策がわかったので、記述します。

1.「C:\Program Files\erl5.8.2\bin」にある「werl.exe」において、右クリック→プロパティを選択する。
2.「互換性」タブの1番下にある「特権レベル」の「管理者としてこのプログラムを実行する」にチェックを入れる。
3.OKボタンでプロパティを終了する。

これで、どのフォルダでもソースをコンパイルできるようになるはず。

Erlang Module モジュール

4 Modules

4.1  Module Syntax
(モジュールの構文)

Erlang code is divided into modules.
(Erlangのコードはモジュールで分割される。)

A module consists of a sequence of attributes and function declarations,
(モジュールは関数宣言と属性を順序立てて構成されている。)

each terminated by period (.).
(それぞれの関数や属性はピリオドで締めくくられる。)

Example:

-module(m).          % module attribute
-export([fact/1]).   % module attribute

fact(N) when N>0 ->  % beginning of function declaration
    N * fact(N-1);   %  |
fact(0) ->           %  |
    1.               % end of function declaration
  
See the Functions chapter for a description of function declarations.
(関数宣言の詳細はFunctions章をみて。)

Erlang データタイプ 文字列 String

2.11  String
(文字)

Strings are enclosed in double quotes ("),
(文字列はダブルクオートで囲まれる。)

but is not a data type in Erlang.
(しかし、Erlangのデータタイプではない。)

Instead a string "hello" is shorthand for the list [$h,$e,$l,$l,$o], that is [104,101,108,108,111].
("hello"はリストの[$h,$e,$l,$l,$o]つまり[104,101,108,108,111]の簡略形である。)

Two adjacent string literals are concatenated into one.
(隣り合う文字リテラルが1つに連結される。)

This is done at compile-time and does not incur any runtime overhead.
(これによってオーバーヘッドが生じることはない。)

Example:

"string" "42"
is equivalent to

"string42"

"string" "42" は "string42" と同じ

Erlang データタイプ リスト

2.10  List
(リスト)

Compound data type with a variable number of terms.
(termsの数が可変であるデータ型)

[Term1,...,TermN]
Each term Term in the list is called an element.
(リスト内の各Termはエレメントと呼ばれる。)

The number of elements is said to be the length of the list.
(エレメントの数はリストの長さと同値)

Formally,
(形式として)

a list is either the empty list [] or consists of a head (first element) and a tail (remainder of the list) which is also a list.
(リストが空である もしくは 先頭とそれ以外の部分で構成されている)

The latter can be expressed as [H|T].
(後者は[H|T]のように表現することができる。)

The notation [Term1,...,TermN] above is actually shorthand for the list [Term1|[...|[TermN|[]]]].
([Term1,...,TermN]のような表記は実際には[Term1|[...|[TermN|[]]]]の簡潔な表現である。)

Example:
[] is a list, thus
[c|[]] is a list, thus
[b|[c|[]]] is a list, thus
[a|[b|[c|[]]]] is a list, or in short [a,b,c].


A list where the tail is a list is sometimes called a proper list.
(tailがあるリストは適切なリストと呼ばれる。)

It is allowed to have a list where the tail is not a list, for example [a|b].
(tailがリストでないリストもあることが許されている。[a|b]のように)

However, this type of list is of little practical use.
(しかしながら、そのようなリストはあまり実用的でない)

Examples:

1> L1 = [a,2,{c,4}].
[a,2,{c,4}]
2> [H|T] = L1.
[a,2,{c,4}]
3> H.
a
4> T.
[2,{c,4}]
5> L2 = [d|T].
[d,2,{c,4}]
6> length(L1).
3
7> length([]).
0

A collection of list processing functions can be found in the STDLIB module lists.
(リストを処理する関数系はSTDLIBモジュールで見ることができる。)

Erlang データタイプ Tuple

2.9  Tuple
(タプル)

Compound data type with a fixed number of terms:
(?)

{Term1,...,TermN}
Each term Term in the tuple is called an element.
(tuple内の各Termはエレメントと呼ばれる)

The number of elements is said to be the size of the tuple.
(エレメントの数はtupleのサイズである。)

There exists a number of BIFs to manipulate tuples.
(tupleを操るBIFsは多く存在する。)

Examples:

1> P = {adam,24,{july,29}}.
{adam,24,{july,29}}
2> element(1,P).
adam
3> element(3,P).
{july,29}
4> P2 = setelement(2,P,25).
{adam,25,{july,29}}
5> tuple_size(P).
3
6> tuple_size({}).
0

2011年3月20日日曜日

Erlang Bit Strings と Binary

過去にも同様の記事を書いているが気にしない。


2.4  Bit Strings and Binaries
(Bit 文字列とバイナリ)

A bit string is used to store an area of untyped memory.
(bit 文字は型のないメモリ領域に保存するのに使われる)

Bit Strings are expressed using the bit syntax.
(Bit 文字列はBit構文を使って表現される。)

Bit Strings which consists of a number of bits which is evenly divisible by eight are called Binaries
(8で割り切れるBit 文字列はバイナリと呼ばれる。)

Examples:

1> <<10,20>>.
<<10,20>>
2> <<"ABC">>.
<<"ABC">>
1> <<1:1,0:1>>.
<<2:2>>

More examples can be found in Programming Examples.
(その他の参考例はプログラミング例で見つけられる。)

Erlang データタイプ アトム

2.3  Atom
(アトム)

An atom is a literal, a constant with name.
(atomは定数リテラルである。)

An atom should be enclosed in single quotes (')
(atomはシングルクォートで囲む必要がある。)
if it does not begin with a lower-case letter
(それは、もし小文字で始まらない場合 もしくは)

or if it contains other characters than alphanumeric characters,
(アンダーバーやアットマートを除く、英数字以外の文字が含まれている場合である)
underscore (_), or @.


Examples:

hello
phone_number
'Monday'
'phone number'

Erlang データタイプ 数値型

2.2  Number
(数値型)

There are two types of numeric literals, integers and floats.
(数値のデータタイプは2つある。整数と実数だ。)

Besides the conventional notation,
(さらに、従来の表記に加えて、

there are two Erlang-specific notations:
(Erlangには2つの固有の表記がある。
ASCIIコードと基数表記だ。)

$char
ASCII value of the character char.
(文字のASCII値)

base#value
Integer with the base base, which must be an integer in the range 2..36.
(2~36の基数をもとにした整数)

In Erlang 5.2/OTP R9B and earlier versions, the allowed range is 2..16.
(Erlang 5.2/OTP R9B とその前のversionでは、基数は2~16しか許されていない)

Examples:

1> 42.
42
2> $A.
65
3> $\n.
10
4> 2#101.
5
5> 16#1f.
31
6> 2.3.
2.3
7> 2.3e3.
2.3e3
8> 2.3e-3.
0.0023

Erlang Term データタイプ

ドキュメントの訳

2 Data Types

2.1  Terms

Erlang provides a number of data types which are listed in this chapter.
(Erlangは、この章に記載されているデータ型を提供しています。)

A piece of data of any data type is called a term.
(これらのデータタイプはtermと呼ばれる。)

つまり、データ型全体をtermと呼び、各データ型をatomとかlistとか呼ぶ。

Erlang Booleanについて

いつものErlangドキュメントからの抜粋です。


Boolean

There is no Boolean data type in Erlang. 
(ErlangにはBooleanデータタイプがない。)

Instead the atoms true and false are used to denote Boolean values.
(そのかわりにtrueとfalseのアトムがあって、それがBooleanの値を印である。)

Examples:
1> 2 =< 3.
true
2> true or false.
true

Erlang GUI Buttonをつけてみる

ErlangをインストールするとGUIのサンプルが付いてくる。
そこにボタンを埋めこんでみた。
だけど、画面いっぱいにボタンが表示される。
どうすれば、サイズが変更できるのか。
Optionに{size,{Width,Height}}があるのだが、変更できなかった。


%%
%% %CopyrightBegin%
%%
%% Copyright Ericsson AB 2009. All Rights Reserved.
%%
%% The contents of this file are subject to the Erlang Public License,
%% Version 1.1, (the "License"); you may not use this file except in
%% compliance with the License. You should have received a copy of the
%% Erlang Public License along with this software. If not, it can be
%% retrieved online at http://www.erlang.org/.
%%
%% Software distributed under the License is distributed on an "AS IS"
%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
%% the License for the specific language governing rights and limitations
%% under the License.
%%
%% %CopyrightEnd%
%%
%%%-------------------------------------------------------------------
%%% File    : hello.erl
%%% Author  : Matthew Harrison <harryhuk at users.sourceforge.net>
%%% Description : _really_ minimal example of a wxerlang app
%%%
%%% Created :  18 Sep 2008 by  Matthew Harrison <harryhuk at users.sourceforge.net>
%%%-------------------------------------------------------------------
-module(hello).

%-include_lib("wx/include/wx.hrl").
-include_lib("C:/Users/andre/erlwork/wx.hrl").

-export([start/0]).
-compile(export_all).

start() ->
    Wx = wx:new(),
    Frame = wx:batch(fun() -> create_window(Wx) end),
    wxWindow:show(Frame),
    loop(Frame),
    wx:destroy(),
    ok.

create_window(Wx) ->
    Frame = wxFrame:new(Wx,
-1, % window id
"Hello World", % window title
[{size, {600,400}}]),

%追加
wxButton:new(Frame, %% Parent::wxWindow()
-1, %% Id::integer()
[{label,"Button"}] %%Options::[Option]
),

    wxFrame:createStatusBar(Frame,[]),

    %% if we don't handle this ourselves, wxwidgets will close the window
    %% when the user clicks the frame's close button, but the event loop still runs
    wxFrame:connect(Frame, close_window),

    ok = wxFrame:setStatusText(Frame, "Hello World!",[]),
    Frame.

loop(Frame) ->
    receive
   #wx{event=#wxClose{}} ->
      io:format("~p Closing window ~n",[self()]),
      ok = wxFrame:setStatusText(Frame, "Closing...",[]),
   wxWindow:destroy(Frame),
   ok;
Msg ->
   io:format("Got ~p ~n", [Msg]),
   loop(Frame)
    end.

表示結果:

Erlang エスケープシーケンス

Escape Sequences

Within strings and quoted atoms, the following escape sequences are recognized:
(文字列内またアトム内で、エスケープシーケンスは認識される。)


Sequence Description
\b:backspace
\d:delete
\e:escape
\f:form feed
\n:newline
\r:carriage return
\s:space
\t:tab
\v:vertical tab
\XYZ, \YZ, \Z:character with octal representation XYZ, YZ or Z(8進数表示)
\xXY:character with hexadecimal representation XY(16進数表示)
\x{X...}:character with hexadecimal representation; X... is one or more hexadecimal characters(16進数)
\^a...\^z
\^A...\^Z:control A to control Z
\':single quote
\":double quote
\\:backslash

Erlang データタイプ 変換

Erlangのマニュアルからの抜粋。

Type Conversions

There are a number of BIFs for type conversions. Examples:
(BIFsにはデータタイプ変換メソッドが多くある。例えば、)


1> atom_to_list(hello).
"hello"
2> list_to_atom("hello").
hello
3> binary_to_list(<<"hello">>).
"hello"
4> binary_to_list(<<104,101,108,108,111>>).
"hello"
5> list_to_binary("hello").
<<104,101,108,108,111>>
6> float_to_list(7.0).
"7.00000000000000000000e+00"
7> list_to_float("7.000e+00").
7.0
8> integer_to_list(77).
"77"
9> list_to_integer("77").
77
10> tuple_to_list({a,b,c}).
[a,b,c]
11> list_to_tuple([a,b,c]).
{a,b,c}
12> term_to_binary({a,b,c}).
<<131,104,3,100,0,1,97,100,0,1,98,100,0,1,99>>
13> binary_to_term(<<131,104,3,100,0,1,97,100,0,1,98,100,0,1,99>>).
{a,b,c}

2011年3月19日土曜日

Erlang wxFrame wxEventType()

これは自分の為のメモ。

wxEventTypeの一覧。


calendar_day_changed
calendar_doubleclicked
calendar_month_changed
calendar_sel_changed
calendar_weekday_clicked
calendar_year_changed
char
char_hook
close_window
command_button_clicked
command_checkbox_clicked
command_choice_selected
command_colourpicker_changed
command_combobox_selected
command_dirpicker_changed
command_filepicker_changed
command_fontpicker_changed
command_list_begin_drag
command_list_begin_label_edit
command_list_begin_rdrag
command_list_cache_hint
command_list_col_begin_drag
command_list_col_click
command_list_col_dragging
command_list_col_end_drag
command_list_col_right_click
command_list_delete_all_items
command_list_delete_item
command_list_end_label_edit
command_list_insert_item
command_list_item_activated
command_list_item_deselected
command_list_item_focused
command_list_item_middle_click
command_list_item_right_click
command_list_item_selected
command_list_key_down
command_listbox_doubleclicked
command_listbox_selected
command_menu_selected
command_notebook_page_changed
command_notebook_page_changed
command_notebook_page_changing
command_notebook_page_changing
command_radiobox_selected
command_radiobutton_selected
command_scrollbar_updated
command_slider_updated
command_text_enter
command_text_updated
command_togglebutton_clicked
command_tree_begin_drag
command_tree_begin_label_edit
command_tree_begin_rdrag
command_tree_delete_item
command_tree_end_drag
command_tree_end_label_edit
command_tree_get_info
command_tree_item_activated
command_tree_item_collapsed
command_tree_item_collapsing
command_tree_item_expanded
command_tree_item_expanding
command_tree_item_gettooltip
command_tree_item_menu
command_tree_item_middle_click
command_tree_item_right_click
command_tree_key_down
command_tree_sel_changed
command_tree_sel_changing
command_tree_set_info
command_tree_state_image_click
command_vlbox_selected
context_menu
create
date_changed
destroy
detailed_help
display_changed
end_session
enter_window
erase_background
grid_cell_begin_drag
grid_cell_change
grid_cell_left_click
grid_cell_left_dclick
grid_cell_right_click
grid_cell_right_dclick
grid_col_size
grid_editor_created
grid_editor_hidden
grid_editor_shown
grid_label_left_click
grid_label_left_dclick
grid_label_right_click
grid_label_right_dclick
grid_range_select
grid_row_size
grid_select_cell
help
iconize
idle
joy_button_down
joy_button_up
joy_move
joy_zmove
key_down
key_up
kill_focus
kill_focus
leave_window
left_dclick
left_down
left_up
maximize
menu_close
menu_highlight
menu_open
middle_dclick
middle_down
middle_up
motion
mouse_capture_changed
mousewheel
move
navigation_key
nc_enter_window
nc_leave_window
nc_left_dclick
nc_left_down
nc_left_up
nc_middle_dclick
nc_middle_down
nc_middle_up
nc_motion
nc_paint
nc_right_dclick
nc_right_down
nc_right_up
paint
paint_icon
palette_changed
query_end_session
query_new_palette
right_dclick
right_down
right_up
sash_dragged
scroll_bottom
scroll_changed
scroll_linedown
scroll_lineup
scroll_pagedown
scroll_pageup
scroll_thumbrelease
scroll_thumbtrack
scroll_top
scrollwin_bottom
scrollwin_linedown
scrollwin_lineup
scrollwin_pagedown
scrollwin_pageup
scrollwin_thumbrelease
scrollwin_thumbtrack
scrollwin_top
set_cursor
set_focus
set_focus
show
size
stc_autocomp_selection
stc_calltip_click
stc_change
stc_charadded
stc_do_drop
stc_doubleclick
stc_drag_over
stc_dwellend
stc_dwellstart
stc_hotspot_click
stc_hotspot_dclick
stc_key
stc_macrorecord
stc_marginclick
stc_modified
stc_needshown
stc_painted
stc_romodifyattempt
stc_savepointleft
stc_savepointreached
stc_start_drag
stc_styleneeded
stc_updateui
stc_uridropped
stc_userlistselection
stc_zoom
sys_colour_changed
update_ui

Erlang record Erlangドキュメントの訳

ダメダメな訳だが、まぁないよりはマシ?


Record

A record is a data structure for storing a fixed number of elements.
(recordは固定された数値のエレメントを記憶するためのデータ構造)

It has named fields and is similar to a struct in C.
(C言語の構造体と似ている。)

However, record is not a true data type.
(しかしながら、recordはtrueデータタイプではない。)

Instead record expressions are translated to tuple expressions during compilation.
(recordの表現方法はtupleの表現方法に翻訳される。)

Therefore, record expressions are not understood by the shell unless special actions are taken. See shell(3) for details.
(recordの表現ほうほうはシェルに理解されない。特別な動作をしない限り。詳しくはshell(3)を見てくれ)

Examples:

-module(person).
-export([new/2]).

-record(person, {name, age}).

new(Name, Age) ->
    #person{name=Name, age=Age}.

1> person:new(ernie, 44).
{person,ernie,44}


Read more about records in Records. More examples can be found in Programming Examples.
(もっと知りたい場合、Recordsのrecordsを見てほしい。プログラミング例をもっと見れるぞ。)

2011年3月13日日曜日

Erlang time() sample

time() -> {Hour, Minute, Second}
Types:
Hour = Minute = Second = int()

Returns the current time as {Hour, Minute, Second}.
(現在の時間を{Hour, Minute, Second}として返す)

The time zone and daylight saving time correction depend on the underlying OS.
(タイムゾーンとかはOSのものに依存する)



5> {H,M,S} = time().
{11,1,19}
6> io:format(~p時~p分~p秒~n,[H,M,S]).
* 1: illegal character
6> ~p分~p秒~n,[H,M,S]).
* 1: illegal character
6> ~p秒~n,[H,M,S]).
* 1: illegal character
6> ~n,[H,M,S]).
* 1: syntax error before: '~'
6> io:format(~p:~p:~p,[H,M,S]).
* 1: syntax error before: '~'
6> io:format(~p:~p:~p~n,[H,M,S]).
* 1: syntax error before: '~'
6> H
6> .
11
7> io:format("~p:~p:~p~n",[H,M,S]).
11:1:19
ok
8> io:format("~p時~p分~p秒~n",[H,M,S]).
11時1分19秒
ok
9>

Erlang throw sample

参考URL:
http://erlangworld.web.fc2.com/sequential_programming/error_handling.html

ソース:
-module(try_test).
-compile(export_all).

demo1() ->
     [catcher(I) || I <- [1,2]].

catcher(N) ->
   try generate_exception(N) of
       Val -> {N, normal, Val}
   catch
       throw:X -> {N, caught, thrown, X}
   end.
  
generate_exception(1) -> a;
generate_exception(2) -> throw(b).

実行結果:

3> c(try_test).
{ok,try_test}
4> try_test:demo1().
[{1,normal,a},{2,caught,thrown,b}]
5>

2011年3月12日土曜日

Erlang term_to_binaryとbinary_to_term

日本語訳は直訳ですので注意です。

binary_to_term(Binary) -> term()
Types:
Binary = ext_binary()
Returns an Erlang term which is the result of decoding the binary object Binary,
(Binaryオブジェクトのバイナリをデコードした結果であるErlang Termを返す)

which must be encoded according to the Erlang external term format.
(Erlang の外部term formatにしたがってエンコードされる)


term_to_binary(Term) -> ext_binary()
Types:
Term = term()
Returns a binary data object which is the result of encoding Term according to the Erlang external term format.
(外部termフォーマットにしたがってエンコードされた結果であるバイナリデータを返す)

This can be used for a variety of purposes,
(このメソッドは様々な目的で使われる)

for example writing a term to a file in an efficient way,
(たとえば、効率よくファイルにtermを書きこんだり)

or sending an Erlang term to some type of communications channel not supported by distributed Erlang.
(Erlangをサポートしていないチャネルでのコミニュケーションのいくつかの方法でErlang termを送信したり)



8> TERM = term_to_binary({"E","r","l","a","n","g"}).
<<131,104,6,107,0,1,69,107,0,1,114,107,0,1,108,107,0,1,97,
  107,0,1,110,107,0,1,103>>
9> binary_to_term(TERM).
{"E","r","l","a","n","g"}

Erlang "Erlang" バイナリ

2> <<"Erlang">>.
<<"Erlang">>
3> <<$E,$r,$l,$a,$n,$g>>.
<<"Erlang">>
4> <<"E","r","l","a","n","g">>.
<<"Erlang">>
5>

Erlang binary と bitstringの違い

http://idocsq.net/page/461
ここを見るとわかる。

<<Y>>
とバイナリがあるとする。
Yのビット数が8の倍数ならバイナリ。
8の倍数でないならbitstring。

2011年3月10日木曜日

Erlang binary_to_existing_atom

binary_to_existing_atom(Binary, Encoding) -> atom()
Types:
Binary = binary()
Encoding = latin1 | utf8 | unicode

Works like binary_to_atom/2, but the atom must already exist.
(binary_to_atom/2と同様の動作をする、しかし、アトムじゃないとダメ)

Failure: badarg if the atom does not already exist.
(引数のバイナリはアトム以外があるとNG)


36> binary_to_existing_atom(<<"Erlang">>,latin1).
'Erlang'
37> binary_to_existing_atom(<<100>>,latin1).    
d
38> binary_to_existing_atom(<<67>>,latin1).
** exception error: bad argument
     in function  binary_to_existing_atom/2
        called as binary_to_existing_atom(<<"C">>,latin1)
39> binary_to_existing_atom(<<67>>,latin1).
** exception error: bad argument
     in function  binary_to_existing_atom/2
        called as binary_to_existing_atom(<<"C">>,latin1)
40> binary_to_existing_atom(<<69>>,latin1).
** exception error: bad argument
     in function  binary_to_existing_atom/2
        called as binary_to_existing_atom(<<"E">>,latin1)
41> binary_to_existing_atom(<<109>>,latin1).
m
42> binary_to_existing_atom(<<109>>,utf8).
m
43> binary_to_existing_atom(<<69>>,utf8).
** exception error: bad argument
     in function  binary_to_existing_atom/2
        called as binary_to_existing_atom(<<"E">>,utf8)
44> binary_to_existing_atom(<<"E">>,utf8).
** exception error: bad argument
     in function  binary_to_existing_atom/2
        called as binary_to_existing_atom(<<"E">>,utf8)
45> binary_to_existing_atom(<<"e">>,utf8).
e
46> binary_to_existing_atom(<<"Er">>,utf8).
** exception error: bad argument
     in function  binary_to_existing_atom/2
        called as binary_to_existing_atom(<<"Er">>,utf8)
47>

なぜ”Erlang”がOKで”Er”はNGなのか謎。

Erlang binary_to_atom

binary_to_atom(Binary, Encoding) -> atom()
Types:
Binary = binary()
Encoding = latin1 | utf8 | unicode

Returns the atom whose text representation is Binary.
(バイナリで表されたものをアトムにして戻す)

If Encoding is latin1, no translation of bytes in the binary is done.
(エンコードがlatin1なら、バイナリの各バイトはなんら置換されない)

If Encoding is utf8 or unicode, the binary must contain valid UTF-8 sequences;
(もし、utf8 or unicodeなら、バイナリはutf8の文字列になる)

furthermore, only Unicode characters up to 0xFF are allowed.
それ以上に、16進数でFFまでならUnicodeが許容される)


Note:
(参考)
binary_to_atom(Binary, utf8) will fail if the binary contains Unicode characters greater than 16#FF.
(binary_to_atom(Binary, utf8)は落ちる。16進数のFFより大きなUnicode文字が含まれていると)

In a future release,
(将来的に)

such Unicode characters might be allowed and binary_to_atom(Binary, utf8) will not fail in that case.
(そのようなUnicode文字は許容される。そして、binary_to_atom(Binary, utf8)は落ちることがないようになる)

実験結果:

7> binary_to_atom(<<100,102,103>>,latin1).
dfg
8> binary_to_atom(<<1,2,3>>,latin1).    
'\001\002\003'
9> binary_to_atom(<<257,2,3>>,latin1).
'\001\002\003'
10> binary_to_atom(<<256,2,3>>,latin1).
'\000\002\003'
11> binary_to_atom(<<"Erlang">>,latin1).
'Erlang'
12> binary_to_atom(<<1024/utf8>>, utf8).
** exception error: bad argument
     in function  binary_to_atom/2
        called as binary_to_atom(<<208,128>>,utf8)
13> binary_to_atom(<<1024/unicode>>, utf8).
* 1: bit type unicode undefined
14> binary_to_atom(<<10/unicode>>, utf8).
* 1: bit type unicode undefined
15> binary_to_atom(<<10/unicode>>, unicode).
* 1: bit type unicode undefined
16> binary_to_atom(<<192>>, unicode).    

** exception error: bad argument
     in function  binary_to_atom/2
        called as binary_to_atom(<<"À">>,unicode)
17> binary_to_atom(<<192>>, latin1).
'À'
18> binary_to_atom(<<102/utf8>>, utf8).
f
19> binary_to_atom(<<16#FF>>, utf8).  
** exception error: bad argument
     in function  binary_to_atom/2
        called as binary_to_atom(<<"ÿ">>,utf8)
20> binary_to_atom(<<16#FF>>, unicode).
** exception error: bad argument
     in function  binary_to_atom/2
        called as binary_to_atom(<<"ÿ">>,unicode)
21> binary_to_atom(<<16#1A>>, unicode).
'\032'
22> binary_to_atom(<<16#41>>, unicode).
'A'
23> binary_to_atom(<<16#FE>>, unicode).
** exception error: bad argument
     in function  binary_to_atom/2
        called as binary_to_atom(<<"þ">>,unicode)
24> binary_to_atom(<<16#256>>, unicode).
'V'
25> binary_to_atom(<<256>>, unicode).   
'\000'
26> binary_to_atom(<<255>>, unicode).
** exception error: bad argument
     in function  binary_to_atom/2
        called as binary_to_atom(<<"ÿ">>,unicode)
27> binary_to_atom(<<128>>, unicode).
** exception error: bad argument
     in function  binary_to_atom/2
        called as binary_to_atom(<<128>>,unicode)
28> binary_to_atom(<<127>>, unicode).
'\d'
29> binary_to_atom(<<16#7F>>, unicode).
'\d'
30> binary_to_atom(<<16#7E>>, unicode).
'~'
31> binary_to_atom(<<16#80>>, unicode).
** exception error: bad argument
     in function  binary_to_atom/2
        called as binary_to_atom(<<128>>,unicode)
32> binary_to_atom(<<16#7F>>, latin1). 
'\d'
33> binary_to_atom(<<16#80>>, latin1).
'\200'
34> binary_to_atom(<<16#0>>, latin1). 
'\000'
35> binary_to_atom(<<16#80>>, utf8).  
** exception error: bad argument
     in function  binary_to_atom/2
        called as binary_to_atom(<<128>>,utf8)
36> 

1.unicodeで16#FFまでOKってあると思ったけど、16#7Fまでしかできないみたい。
2.latin1の場合、256=0なので N % 256なのでしょう。

ちょっと長くてすみません。

Erlang binary_part

binary_part(Subject, PosLen) -> binary()
Types:
Subject = binary()
PosLen = {Start,Length}
Start = int()
Length = int()


Extracts the part of the binary described by PosLen.
(PosLenでバイナリの一部を抜き出す)

Negative length can be used to extract bytes at the end of a binary:
(負の値であれば、バイナリの最後から抜き出すこともできる)

If PosLen in any way references outside the binary, a badarg exception is raised.
(もし、PosLenがバイナリの外を参照しようとすると、引数エラーでエラーを発する)

Start is zero-based
(1番左のバイナリは0である)

結果:

2> Bin = <<1,2,3,4,5,6,7,8,9,10>>.
<<1,2,3,4,5,6,7,8,9,10>>
3> binary_part(Bin,{byte_size(Bin), -5)).
* 1: syntax error before: ')'
3> binary_part(Bin,{byte_size(Bin), -5}).
<<6,7,8,9,10>>
4> binary_part(Bin,{1,8}).
<<2,3,4,5,6,7,8,9>>
5> binary_part(Bin,{0,byte_size(Bin)}).
<<1,2,3,4,5,6,7,8,9,10>>
6> binary_part(Bin,{0,byte_size(Bin)+1}).
** exception error: bad argument
     in function  binary_part/2
        called as binary_part(<<1,2,3,4,5,6,7,8,9,10>>,{0,11})
7>

Erlang atom_to_list

atom_to_list(Atom) -> string()
Types:
Atom = atom()
Returns a string which corresponds to the text representation of Atom.
(アトムに一致する文字列を返す)

結果:

1> atom_to_list('Erlang').
"Erlang"
2>

Erlang atom_to_binaryを訳す

atom_to_binary(Atom, Encoding) -> binary()
Types:
Atom = atom()
Encoding = latin1 | utf8 | unicode

実験結果:

1> atom_to_binary('Erlang',latin1).
<<"Erlang">>
2> atom_to_binary('Erlang',utf8).
<<"Erlang">>
3> atom_to_binary('Erlang',unicode).
<<"Erlang">>

4> atom_to_binary('»',latin1).
<<"»">>
5> atom_to_binary('ア',latin1).
* 1: illegal character
5> ',latin1).
5> atom_to_binary('ア',latin1).
* 2: illegal character
5> ',latin1).
5>


以下Erlangのドキュメントに書いてある文章の訳です。

Returns a binary which corresponds to the text representation of Atom.
(アトムのテキスト表現に一致したバイナリを返す)

If Encoding is latin1, there will be one byte for each character in the text representation.
(もし、latin1であれば、テキスト表現内の各文字は1バイト)

If Encoding is utf8 or unicode, the characters will encoded using UTF-8
 (meaning that characters from 16#80 up to 0xFF will be encode in two bytes).
(もし、utf8もしくはunicodeなら、utf8にエンコードされる。
つまり、各文字(ASCIIコード表参照)が16進数で80からFFまで(10進数表記で128から255まで)のものは2バイトでエンコードされる)


これにはNoteってやつがあるので、ここも訳す。


Note:
(参考)
Currently, atom_to_binary(Atom, latin1) can never fail because the text representation of an atom can only contain characters from 0 to 16#FF.
(現在、atom_to_binary(Atom, latin1)は落ちることがない。なぜなら、アトムのテキスト表現は16進数で0からFFの文字だけ含んでいるから)

 In a future release,
(将来的に)

the text representation of atoms might be allowed to
contain any Unicode character and atom_to_binary(Atom, latin1) will fail if the text representation
for the Atom contains a Unicode character greater than 16#FF.

(アトムのテキスト表現はUnicode文字が含まれても許容される。またatom_to_binary(Atom, latin1)は16進数表記でFF以上のUnicode文字が含まれても落ちないようになる。)

2011年3月8日火曜日

Erlang apply(Module, Function, Args) -> term() | empty() 動的に関数実行

実行結果:

3> apply(erlang:append_element,[{one,two},three]).
* 3: illegal expression
4> apply(erlang,append_element,[{one,two},three]).
{one,two,three}
5>

3>は失敗。apply(Function,Args)を実行しようとしたらNGだった。
erlangがmoduleだからです。

Erlang erlang:append_element(Tuple1, Term) -> Tuple2 タプルに要素を加える

実行結果:


1> erlang:append_element({one, two}, three).
{one,two,three}
2> erlang:append_element({one,{two,three}},four).
{one,{two,three},four}
3>

Erlang erlang:adler32_combine 2つのデータのチェックサム(checksum)

実行結果:


Erlang R14B01 (erts-5.8.2) [smp:2:2] [rq:2] [async-threads:0]

Eshell V5.8.2  (abort with ^G)
1> Data1 = <<"Erlang">>.
<<"Erlang">>
2> Y = erlang:adler32(Data1).
133431898
3> Data2 = <<"andre">>
3> .
<<"andre">>
4> Z = erlang:adler32(Y,Data2).
432538724
5>
5> X = erlang:adler32(Data1).
133431898
6> Y1 = erlang:adler32(Data2).
102171147
7> Z1 = erlang:adler32_combine(X,Y,iolist_size(Data2)).
463799475
8> Z2 = erlang:adler32_combine(X,Y1,iolist_size(Data2)).
432538724
9>

要は
erlang:adler32/2とerlang:adler32_combine/3は同じ。

4>と7>戻り値のところで同じはずの数字が違うので、何だ?って思ったけど、
erlang:adler32_combineの第2引数を「Y1」じゃなくて「Y」にしていたのが原因でした。

2011年3月7日月曜日

Erlang erlang:adler32(X,Data) = erlang:adler32([Data1,Data2])

adler32について
引数が2のものと、リストで2つデータを指定するものは同じ。
下記の下線部分をみて、感じ取ってほしい。
ちょっと眠いのである。もう寝なきゃなのである。

5> Data1 = <<"Erlang">>.
<<"Erlang">>
6> erlang:adler32(Data1).
133431898
7> X =  erlang:adler32(Data1).
133431898
8>
8> Y = erlang:adler32(X,<<"Erlang">>).
503186611
9> erlang:adler32([X,Y]).
** exception error: bad argument
     in function  erlang:adler32/1
        called as erlang:adler32([133431898,503186611])
10> erlang:adler32([Data1,<<"Erlang">>]).
503186611
11>

Erlang erlang:adler32 checksum チェックサム

参考:http://ja.wikipedia.org/wiki/Adler-32

sample:

4> erlang:adler32(<<"Erlang">>).
133431898

ASCIIコード表を参考に
E:69
r:114
l:108
a:97
n:110
g:103

A = 1 + 69 + 114 + 108 + 97 + 110 + 103 = 602
B = 6 * 69 + 5 * 114 + 4 * 108 + 3 * 97 + 2 * 110 + 1 * 103 + 6 = 2036

X = A + B * 65536 =  133431898

Erlang abs 絶対値

サンプル(sample):


1> abs(-10.0).
10.0
2> abs(4.9).
4.9
3> abs(3-5).
2

2011年3月6日日曜日

Erlang io_lib fread sample

サンプル:

-module(fread_test).
-export([start/0]).

start() ->
    io_lib:fread("~16u", "100"),      % {ok,[256],[]}
    % 256 = 16^2
    io_lib:fread("~2u", "100abc"),     % {ok,[4],"abc"}
    % 4 = 2^2
    io_lib:fread("~36u", "100%%%10").    % {ok,[1296],"%%%10"}

Erlang 文字列を数値へ変換する list_to_integer

サンプル:


-module(s_to_i).
-export([start/0]).

start() ->
    X = list_to_integer("234"),
    io:format("list_to_integer:~p~n",[X]),
    Y = list_to_integer("-100"),
    io:format("list_to_integer:~p~n",[Y]).
出力:

10> c(s_to_i).    
{ok,s_to_i}
11> s_to_i:start().
list_to_integer:234
list_to_integer:-100
ok