2011年11月5日土曜日

NetBeans でpython入門したら、出力が文字化けした。


OS:Windows Vista
開発環境:NetBeans 6.7.1
python:2.6.6

NetBeans(総合開発環境)を使い、pythonを入門していた。

(10日でおぼえる Python 入門教室: 穂苅 実紀夫, 寺田 学, 中西 直樹, 堀田 直孝, 永井 孝: 本 : http://goo.gl/TMLKk

上記の本の通り、IDLE(こっちも総合開発環境)だかなんだかを使って、素直にコードを打ち込んでいればよかったものの、コードを補完したり、打ち間違えを表示したりしてくれないので、NetBeansを使っている。

NetBeansのpythonプラグインをインストールし、さて頑張るかと思いコードを打ち込んでいたが、出力が文字化けした。
(その前に日本語部分でコンパイルエラーがあった。コメント部分でさえ。今回はこの部分の対処は書いていない。)

その対処について以下記載する。
参考サイト:
Python でUTF-8, shift_jis, euc_jpなど日本語を使う方法 : http://osksn2.hep.sci.osaka-u.ac.jp/~taku/osx/python/encoding.html

手順としては以下。
1.プロジェクトプロパティーからファイル自体のエンコードを指定する。
2.ソースにプロパティーで指定したエンコード情報で出力するように設定する。
3.プログラムを動作させ、表示を確認する。

Windowsなので、Shift_JISでやりました。
UTF-8がよかったものの、どうしても文字化けしてしまうので、やめた。


1.プロジェクトプロパティーからファイル自体のエンコードを指定する。




2.ソースにプロパティーで指定したエンコード情報を書き込む。
以下をソースに挿入する。
--------- ここから ----------
# coding: Shift_JIS

import sys
import codecs

sys.stdout = codecs.getwriter('shift_jis')(sys.stdout)
--------- ここまで ----------

実際にはこんな風になる。

ソース一部:

# To change this template, choose Tools | Templates
# and open the template in the editor.
# coding: Shift_JIS

__author__="andre"
__date__ ="$2011/11/05 9:28:16$"
import sys
import codecs
import urllib
from xml.etree.ElementTree import ElementTree
from xml.parsers.expat import ExpatError
sys.stdout = codecs.getwriter('shift_jis')(sys.stdout)
XML_BASE_URL = "http://weather.livedoor.com/forecast/webservice/rest/v1"
CITY_MAPS = [('wakkanai', '1'),('tokyo', '63'),('osaka', '81'),('fukuoka', '110'),('naha', '136')]


-----------------------------------


3.プログラムを動作させ、表示を確認する。
メニューの「実行」から「ファイルを実行(F)」を選択する。
下の方に標準出力が出るので、日本語が出ていることが確認できる。


2011年10月25日火曜日

Explorerが落ちてしまったときの起動方法

会社PCで、Explorerが落ちてしまったことがある。もうマウスでタスクバーから選択して仕事できない状態だった。

そのとき行った元に戻す方法を記す。

1.タスクマネージャを起動する。[Ctrl + Shift + Esc]キーを同時押し。
2.タスクマネージャの「ファイル」-「新しいタスクの実行」を押下する。




3.「新しいタスクの作成」画面の「参照」ボタンを押下する。


4.「ファイルの参照」画面が表示されるので、「C:\Windows」ディレクトリに移動し、「explorer.exe」を選択し、「開く」ボタンを押下する。

5.「新しいタスク作成」画面に戻るので、「OK」ボタンを押下する。

以上で、タスクバーからマウスでExcelとか選択できるようになり、仕事が再開できる。

Windows XPとかだと、explorer.exeの場所が違うと思う。System32ディレクトリとかにあるかも。

2011年10月19日水曜日

Erlang Dialog setLabel サンプル Sample


タイトルにある通りのサンプル。
Dialogの生成でタイトルを"Target Display"に設定しているが、setLabelで"setLabel"に再設定している。

表示される画面の左上が"setLabel"になっているはず。

ソース:

-module(dialogSetLabel).
-export([start/0]).
%%-export([new/2]). %% API
-include_lib("wx.hrl").

start()->
    Wx = wx:new(),
    Dialog = wx:batch(fun()->new(Wx, 100) end),
    wxWindow:show(Dialog),
    loop(Dialog).

new(Parent,Id)->
    Option = [ { size, {210, 100} } ],
    Head = "Target Display",
    Dialog = wxDialog:new(Parent, Id, Head, Option),
    wxDialog:setLabel(Dialog, "setLabel"),
    wxDialog:connect(Dialog, close_window),

    Dialog.

loop(Dialog)->
    receive
         %% Closeボタン押下時
        #wx{obj = Obj, event = #wxClose{}}->
            io:format("~p Closing window ~n", [self()]),
            wxWindow:destroy(Obj)
    end.

2011年10月18日火曜日

Erlang left click wxMouseEvent Sample サンプル

マウスの左クリックで、画面のテキスト文字列を再設定させるサンプルを書いた。

動作例:


eSample130.erlを実行すると、command Test画面が表示される。

show Windowボタンを押下すると、Target Display画面が表示される。

Target Display画面上の文字列上のテキストを左クリックすると、「Left Click! ~」が画面上に表示される。

下記にソースを表示する。
ダウンロードは以下から。
eSample130.erl:
https://docs.google.com/leaf?id=0B8Fi1kuQJgFrNmE1Yjc3MTYtYjMxOS00NzQyLWI0OTItMWM5NzAyNzU3NWJl&hl=ja

eSample130_1.erl(更新前):
https://docs.google.com/leaf?id=0B8Fi1kuQJgFrYzM4MGE4ZGUtMTU2NS00NzkzLWI4YjYtZGUyMTdlZmM1NTlj&hl=ja

eSample130_1.erl(更新後):
https://docs.google.com/leaf?id=0B8Fi1kuQJgFrYjJkYWI5NDgtNzBkMS00ZWUyLWI0M2YtYzA3ZWYzZjRlNGYx&hl=ja

ソース:

-module(eSample130).
-export([start/0]).
-include_lib("wx.hrl").
-define(wxIDButton, 10).

start()->
    Wx = wx:new(),
    {Frame, Pid} = wx:batch(fun()->create_window(Wx) end),
    wxWindow:show(Frame),
    loop(Pid),
    ok.
%% 画面を表示
create_window(Wx)->
    Option = [ { size, {310, 150 } } ],
    Str = "command Test.",
    Frame = wxFrame:new(Wx,
                        ?wxID_ANY,
                        Str,
                        Option),
    % Set Button On Frame
    %PnlOp = [ {pos, {120, 10}}, {size, {50, 10}}],
    BtnOp = [ {label, "show Window"} ],
    Panel = wxPanel:new(Frame, 120, 10, 50, 10),
    Button = wxButton:new(Panel, ?wxIDButton, BtnOp),
    % Create Status Bar
    wxFrame:createStatusBar(Frame, []),
    wxFrame:setStatusText(Frame, Str),

    %% Dialog生成
    Pid = spawn_link(fun() -> eSample130_1:start() end),

    %% イベントを登録
    wxFrame:connect( Frame, close_window ),%% Closeボタン
    wxButton:connect(Button, command_button_clicked),%% show Windowボタン

    {Frame, Pid}.

loop(Pid)->
    receive
        %% Closeボタン押下時
        #wx{obj = Obj, event = #wxClose{}}->
            io:format("~p Closing window ~n", [self()]),
            wxWindow:destroy(Obj);
        %% ボタン押下時
        #wx{ event = #wxCommand{} } ->
            Pid ! {visible, self()},
            io:format(" Clicked Button ~n"),
            loop(Pid);
        %% Dialogからのメッセージがあった時
        {reply, ok}->
            loop(Pid)
    end.

===============================//================================


-module(eSample130_1).
-export([start/0]).
%%-export([new/2]). %% API
-include_lib("wx.hrl").

start()->
    Wx = wx:new(),
    Dialog = wx:batch(fun()->new(Wx, 100) end),
    loop(Dialog).

new(Parent,Id)->
    Option = [ { size, {210, 100} } ],
    Head = "Target Display",
    Dialog = wxDialog:new(Parent, Id, Head, Option),

    %OPP = [{size,{100,50}}],
    %Panel = wxPanel:new(Parent,OPP),

    Str = "Push close Button.",
    OPST1 = [{pos, {50,10}}],
    ST = wxStaticText:new( Dialog, 1 , Str, OPST1),
    %ST = wxStaticText:new( Panel, 1 , Str, OPST1),

    wxDialog:connect(Dialog, close_window),
    %wxStaticText:connect(ST, left_down),
    wxDialog:connect(Dialog, left_down),
    wxDialog:connect(Dialog, left_up),
    wxDialog:connect(Dialog, middle_down),
    wxDialog:connect(Dialog, middle_up),
    wxDialog:connect(Dialog, right_down),
    wxDialog:connect(Dialog, right_up),
    wxDialog:connect(Dialog, motion),
    wxDialog:connect(Dialog, enter_window),
    wxDialog:connect(Dialog, leave_window),
    wxDialog:connect(Dialog, left_dclick),
    wxDialog:connect(Dialog, middle_dclick),
    wxDialog:connect(Dialog, right_dclick),
    wxDialog:connect(Dialog, mousewheel),
    wxDialog:connect(Dialog, nc_left_down),
    wxDialog:connect(Dialog, nc_left_up),
    wxDialog:connect(Dialog, nc_middle_down),
    wxDialog:connect(Dialog, nc_middle_up),
    wxDialog:connect(Dialog, nc_right_down),
    wxDialog:connect(Dialog, nc_right_up),
    wxDialog:connect(Dialog, nc_motion),
    wxDialog:connect(Dialog, nc_enter_window),
    wxDialog:connect(Dialog, nc_leave_window),
    wxDialog:connect(Dialog, nc_left_dclick),
    wxDialog:connect(Dialog, nc_middle_dclick),
    wxDialog:connect(Dialog, nc_right_dclick),


    Dialog.

%% 閉じるボタン押下時の動作
loop(Dialog)->
    receive
        %% closeボタン押下時
        #wx{event = #wxClose{ type = close_window }}->
            wxDialog:show(Dialog, [{show, false}]),
            loop(Dialog);
        #wx{obj = Obj, event = #wxMouse{ type = left_down}}->
            wxDialog:setLabel(Obj, "left_down!"),
            loop(Dialog);
        #wx{obj = Obj, event = #wxMouse{ type = left_up}}->
            wxDialog:setLabel(Obj, "left_up!"),
            loop(Dialog);
        #wx{obj = Obj, event = #wxMouse{ type = middle_down}}->
            wxDialog:setLabel(Obj, "middle_down!"),
            loop(Dialog);
        #wx{obj = Obj, event = #wxMouse{ type = middle_up}}->
            wxDialog:setLabel(Obj, "middle_up!"),
            loop(Dialog);
        #wx{obj = Obj, event = #wxMouse{ type = right_down}}->
            wxDialog:setLabel(Obj, "right_down!"),
            loop(Dialog);
        #wx{obj = Obj, event = #wxMouse{ type = right_up}}->
            wxDialog:setLabel(Obj, "right_up!"),
            loop(Dialog);
        #wx{obj = Obj, event = #wxMouse{ type = motion}}->
            wxDialog:setLabel(Obj, "motion!"),
            loop(Dialog);
        #wx{obj = Obj, event = #wxMouse{ type = enter_window}}->
            wxDialog:setLabel(Obj, "enter_window!"),
            loop(Dialog);
        #wx{obj = Obj, event = #wxMouse{ type = leave_window}}->
            wxDialog:setLabel(Obj, "leave_window!"),
            loop(Dialog);
        #wx{obj = Obj, event = #wxMouse{ type = left_dclick}}->
            wxDialog:setLabel(Obj, "left_dclick!"),
            loop(Dialog);
        #wx{obj = Obj, event = #wxMouse{ type = middle_dclick}}->
            wxDialog:setLabel(Obj, "middle_dclick!"),
            loop(Dialog);
        #wx{obj = Obj, event = #wxMouse{ type = right_dclick}}->
            wxDialog:setLabel(Obj, "right_dclick!"),
            loop(Dialog);
        #wx{obj = Obj, event = #wxMouse{ type = mousewheel}}->
            wxDialog:setLabel(Obj, "mousewheel!"),
            loop(Dialog);
        #wx{obj = Obj, event = #wxMouse{ type = nc_left_down}}->
            wxDialog:setLabel(Obj, "nc_left_down!"),
            loop(Dialog);
        #wx{obj = Obj, event = #wxMouse{ type = nc_left_up}}->
            wxDialog:setLabel(Obj, "nc_left_up!"),
            loop(Dialog);
        #wx{obj = Obj, event = #wxMouse{ type = nc_middle_down}}->
            wxDialog:setLabel(Obj, "nc_middle_down!"),
            loop(Dialog);
        #wx{obj = Obj, event = #wxMouse{ type = nc_middle_up}}->
            wxDialog:setLabel(Obj, "nc_middle_up!"),
            loop(Dialog);
        #wx{obj = Obj, event = #wxMouse{ type = nc_right_down}}->
            wxDialog:setLabel(Obj, "nc_right_down!"),
            loop(Dialog);
        #wx{obj = Obj, event = #wxMouse{ type = nc_right_up}}->
            wxDialog:setLabel(Obj, "nc_right_up!"),
            loop(Dialog);
        #wx{obj = Obj, event = #wxMouse{ type = nc_motion}}->
            wxDialog:setLabel(Obj, "nc_motion!"),
            loop(Dialog);
        #wx{obj = Obj, event = #wxMouse{ type = nc_enter_window}}->
            wxDialog:setLabel(Obj, "nc_enter_window!"),
            loop(Dialog);
        #wx{obj = Obj, event = #wxMouse{ type = nc_leave_window}}->
            wxDialog:setLabel(Obj, "nc_leave_window!"),
            loop(Dialog);
        #wx{obj = Obj, event = #wxMouse{ type = nc_left_dclick}}->
            wxDialog:setLabel(Obj, "nc_left_dclick!"),
            loop(Dialog);
        #wx{obj = Obj, event = #wxMouse{ type = nc_middle_dclick}}->
            wxDialog:setLabel(Obj, "nc_middle_dclick!"),
            loop(Dialog);
        #wx{obj = Obj, event = #wxMouse{ type = nc_right_dclick}}->
            wxDialog:setLabel(Obj, "nc_right_dclick!"),
            loop(Dialog);
        %% 他ウィンドウのボタンが押下された時
        {visible, _From} ->
            %% Dialogを表示する
            wxDialog:show(Dialog, [{show, true}]),
            _From ! {reply, ok},
            loop(Dialog)
    end.

ncがいったい何を指しているのかわからない。



2011年10月16日日曜日

Erlang wxDialog showメソッド 表示/非表示

Java逆引き大全500の極意
http://goo.gl/JBiP9

上記Java本のサンプル129の「フレームウィンドウの表示/非表示を切り替える」というページをErlangで記述してみた。その表示例とソースを以下に掲載する。

表示例:


本サンプルの実行手順は以下。
1.setVisible.erlをコンパイルする。[c(setVisible).]
2.setVisible2.erlをコンパイルする。[c(setVisible2).]
3.[setVisible:start().]を実行すると、setVisible Test.画面(後ろの画面)が表示される。
4.[show Window]ボタンを押下すると、Target Display画面が表示される。
5.Target Display画面の×ボタンを押下すると、Target Display画面が非表示される。
6.setVisible Test.画面の×ボタンを押下すると、setVisible Test.画面が閉じる。

ソース:
setVisible.erl:https://docs.google.com/leaf?id=0B8Fi1kuQJgFrZmJjNzRlY2ItMWJkMC00NTljLWI5NTktYjBhMGFiN2Q4YTE3&hl=ja

setVisible2.erl:https://docs.google.com/leaf?id=0B8Fi1kuQJgFrYTIxMDk0MGYtMWE0ZS00YmI4LWIzMWYtNDUzNTkwY2VlOWZk&hl=ja

setVisible.erl:

-module(setVisible).
-export([start/0]).
-include_lib("wx.hrl").
-define(wxIDButton, 10).

start()->
    Wx = wx:new(),
    {Frame, Pid} = wx:batch(fun()->create_window(Wx) end),
    wxWindow:show(Frame),
    loop(Pid),
    ok.
%% 画面を表示
create_window(Wx)->
    Option = [ { size, {310, 150 } } ],
    Str = "setVisible Test.",
    Frame = wxFrame:new(Wx,
                        ?wxID_ANY,
                        Str,
                        Option),
    % Set Button On Frame
    %PnlOp = [ {pos, {120, 10}}, {size, {50, 10}}],
    BtnOp = [ {label, "show Window"} ],
    Panel = wxPanel:new(Frame, 120, 10, 50, 10),
    Button = wxButton:new(Panel, ?wxIDButton, BtnOp),
    % Create Status Bar
    wxFrame:createStatusBar(Frame, []),
    wxFrame:setStatusText(Frame, Str),

    %% Dialog生成
    Pid = spawn_link(fun() -> setVisible2:start() end),

    %% イベントを登録
    wxFrame:connect( Frame, close_window ),%% Closeボタン
    wxButton:connect(Button, command_button_clicked),%% show Windowボタン

    {Frame, Pid}.

loop(Pid)->
    receive
        %% Closeボタン押下時
        #wx{obj = Obj, event = #wxClose{}}->
            io:format("~p Closing window ~n", [self()]),
            wxWindow:destroy(Obj);
        %% ボタン押下時
        #wx{ event = #wxCommand{} } ->
            Pid ! {visible, self()},
            io:format(" Clicked Button ~n"),
            loop(Pid);
        %% Dialogからのメッセージがあった時
        {reply, ok}->
            loop(Pid)
    end.

setVisible2.erl:

-module(setVisible2).
-export([start/0]).
%%-export([new/2]). %% API
-include_lib("wx.hrl").

start()->
    Wx = wx:new(),
    Dialog = wx:batch(fun()->new(Wx, 100) end),
    loop(Dialog).

new(Parent,Id)->
    Option = [ { size, {210, 100} } ],
    Head = "Target Display",
    Dialog = wxDialog:new(Parent, Id, Head, Option),

    Str = "Push close Button.",
    OPST1 = [{pos, {50,10}}],
    wxStaticText:new( Dialog, 1 , Str, OPST1),
 
    wxDialog:connect(Dialog, close_window),

    Dialog.

%% 閉じるボタン押下時の動作
loop(Dialog)->
    receive
        %% closeボタン押下時
        #wx{event=#wxClose{ type = close_window }}->
            wxDialog:show(Dialog, [{show, false}]),
            loop(Dialog);
        %% 他ウィンドウのボタンが押下された時
        {visible, _From} ->
            %% Dialogを表示する
            wxDialog:show(Dialog, [{show, true}]),
            _From ! {reply, ok},
            loop(Dialog)
    end.





2011年10月15日土曜日

Erlang 固定サイズのFrameのサイズを表示する

そのFrame画面内に、wxStaticTextでFrameの幅と高さを表示させるサンプル。

表示画面:


ソース:


-module(getSize).
-export([start/0]).
-include_lib("wx.hrl").

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

create_window(Wx)->

    Option = [ { size, {310, 100 } } ],

    Frame = wxFrame:new(Wx,
                         ?wxID_ANY,
                        "show Size of Display!",
                       Option),

    %% get size
    [ { size, {X ,Y } } ] = Option,
    Width = string:concat("width = ", integer_to_list(X)),
    Height = string:concat("height = ", integer_to_list(Y)),

    %% create text
    OPST1 = [{pos, {110,10}}],
    OPST2 = [{pos, {110,30}}],
    wxStaticText:new( Frame, 1 , Width, OPST1),
    wxStaticText:new( Frame, 2 , Height, OPST2),

    wxFrame:connect( Frame, close_window ),

    Frame.

loop()->
    receive
        #wx{ obj = Obj, event = #wxClose{ type = close_window } } ->
            io:format("~p Closing window ~n",[self()]),
            wxWindow:destroy(Obj),
            ok
    end.

2011年9月11日日曜日

Erlang time() ローカル時刻 Sample サンプル string to_upperもね


Rubyのプログラミングの勉強をしている。
そこで参考書内のサンプルを打ち込んでいるが、それをErlangに置き換えてみている。
time関数とstring:to_upper関数を使っていた。サンプルとして載せる。

Erlangでコンパイルすると、warningが発生するが問題なし。
(上にあるif文において、1つ目のガードが必ずfalseになるという警告と、2つ目が必ずtrueなので、3つ目のガードが評価されないという警告が発生する。)

-module('Sample028').
-export([start/0]).

start() ->
    if
6 rem 4 == 0 ->
   S =  "six is a multiple of four.";
6 rem 2 == 0 ->
   S = "six is odd.";
true ->
   S = "six is even."
    end,
    io:format("a0:~p~n",[S]),

    {Hour,_,_} = time(),
 
    if
Hour >= 12 -> T = "good afternoon";
true -> T = "good morning"
    end,
    T1 = string:to_upper(T),
    io:format("a1:~p~n",[T1]).

2011年8月28日日曜日

Erlang re replace 正規表現 Sample サンプル 1つ以上を置換

前回だか、正規表現を使って文字列を置換しようとして、初めにパターンマッチしたものしか置換できなくて困っていた。
だが、パターンマッチしてヒットしたものすべてを置換することに成功。そのサンプルを。
しかし、もっと良いやり方があるのではと思う。reモジュールをもっと勉強しないと。だが、直近で正規表現は必要ない。正規表現はまた別の機会に。

ソース:

-module(re_replace_multi).
-export([start/0,binList_to_list/1]).

%%--------------------------------------------------------------------
%% @doc
%% @spec start() -> list() | error
%% @end
%%--------------------------------------------------------------------
start() ->
    Regexp = ["Erlang"],
    %% compile the Regular Expression
    case re:compile (Regexp) of
{ok,MP} ->
   Subject = ["My favorite Language is Erlang. Erlang. Erlang."],
   do_regexp (MP,Subject);
{error, ErrSpec} ->
   io:format ("Compile Error ~p~n",[ErrSpec]),
   error
    end.
 
%%--------------------------------------------------------------------
%% @doc
%% @spec do_regexp(MP) -> list() | error
%% @type MP = mp()
%% @end
%%--------------------------------------------------------------------
do_regexp (MP,Subject) ->
 
    io:format("subject:~p~n",[Subject]),

    case re:run(Subject, MP) of
{match, Captured} ->
   io:format ("match:~p~n",[Captured]),
   Rep = "Ruby",
   io:format("Replace to ~p from \"Erlang\".~n",[Rep]),
   Replace = re:replace(Subject, MP, [Rep]),
   %Tmp = [binary_to_list(X) || X <- Replace],
   %Replace1 = lists:append(Tmp),
   Sub = binList_to_list (Replace),
   do_regexp(MP,[Sub]);
nomatch ->
   io:format ("nomatch~n"),
   Subject
    end.
%%--------------------------------------------------------------------
%% @doc
%% @spec binList_to_list (list() | binary()) -> list()
%% @end
%%--------------------------------------------------------------------
binList_to_list ([]) ->
    [];
binList_to_list (Lists)
  when is_binary(Lists)
-> binary_to_list(Lists);
binList_to_list (Lists)
  when is_list(Lists)
-> [Head|Tails] = Lists,
  case is_binary(Head) of
      true ->
  HeadStr = binary_to_list(Head),
  HeadStr ++ binList_to_list(Tails);
      false ->
  Head ++ binList_to_list(Tails)
  end.

実行結果:
1> c(re_replace_multi).
{ok,re_replace_multi}
2> re_replace_multi:start().
subject:["My favorite Language is Erlang. Erlang. Erlang."]
match:[{24,6}]
Replace to "Ruby" from "Erlang".
subject:["My favorite Language is Ruby. Erlang. Erlang."]
match:[{30,6}]
Replace to "Ruby" from "Erlang".
subject:["My favorite Language is Ruby. Ruby. Erlang."]
match:[{36,6}]
Replace to "Ruby" from "Erlang".
subject:["My favorite Language is Ruby. Ruby. Ruby."]
nomatch
["My favorite Language is Ruby. Ruby. Ruby."]
3> 

Erlang re replace マッチした文字を置換する Sample サンプル

パターンマッチした文字を置換しようとしていたときのサンプル。
最初にマッチしたものしかできなかった。
エレガントじゃないので、あまり載せたくないけど。

ソース:

-module(re_replace).
-export([start/0,binList_to_list/1]).

%%--------------------------------------------------------------------
%% @doc
%% @spec start() -> list() | error
%% @end
%%--------------------------------------------------------------------
start() ->
    Regexp = ["Erlang"],
    %% compile the Regular Expression
    case re:compile (Regexp) of
{ok,MP} ->
   do_regexp (MP);
{error, ErrSpec} ->
   io:format ("Compile Error ~p~n",[ErrSpec]),
   error
    end.
   
%%--------------------------------------------------------------------
%% @doc
%% @spec do_regexp(MP) -> list() | error
%% @type MP = mp()
%% @end
%%--------------------------------------------------------------------
do_regexp (MP) ->
    Subject = ["My favorite Language is Erlang. Erlang. Erlang."],
    io:format("subject:~p~n",[Subject]),

    case re:run(Subject, MP) of
{match, Captured} ->
   io:format ("match:~p~n",[Captured]),
   Rep = "Ruby",
   io:format("Replace to ~p from \"Erlang\".~n",[Rep]),
   Replace = re:replace(Subject, MP, [Rep]),
   %Tmp = [binary_to_list(X) || X <- Replace],
   %Replace1 = lists:append(Tmp),
   binList_to_list (Replace);
nomatch ->
   io:format ("nomatch~n"),
   error
    end.
%%--------------------------------------------------------------------
%% @doc
%% @spec binList_to_list (list() | binary()) -> list()
%% @end
%%--------------------------------------------------------------------
binList_to_list ([]) ->
    [];
binList_to_list (Lists)
  when is_binary(Lists)
-> binary_to_list(Lists);
binList_to_list (Lists)
  when is_list(Lists)
-> [Head|Tails] = Lists,
  case is_binary(Head) of
      true ->
  HeadStr = binary_to_list(Head),
  HeadStr ++ binList_to_list(Tails);
      false ->
  Head ++ binList_to_list(Tails)
  end.

出力結果:
4> re_replace:start().
subject:["My favorite Language is Erlang. Erlang. Erlang."]
match:[{24,6}]
Replace to "Ruby" from "Erlang".
"My favorite Language is Ruby. Erlang. Erlang."
5> 

今ひらめいた。パターンマッチした文字を全て置換する方法。
今度載せようと思う。

Erlang re compile エラー サンプル Sample

Erlangのreモジュールのcompileメソッドでエラーを出してみた。

ソース:

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

%%--------------------------------------------------------------------
%% @doc
%% @spec start() ->
%% @end
%%--------------------------------------------------------------------
start () ->
    do_exception().

%%--------------------------------------------------------------------
%% @doc
%% @spec do_exception() -> ok | error.
%% @end
%%--------------------------------------------------------------------
do_exception () ->
    Regexp = "*Erlang",
    case re:compile(Regexp) of
{ok, MP} ->
   io:format("Success to compile MP:~p~n", [MP]),
   ok;
{error, ErrSpec} ->
   io:format("ErrSpec:~p~n", [ErrSpec]),
   error
end.

出力結果:
3> re_compile_exception:start().
ErrSpec:{"nothing to repeat",0}
error
4> 

Erlang re 正規表現 Sample サンプル

Erlangの正規表現モジュールであるreのサンプルを貼る。
1つの文の中で、マッチする部分が複数あった場合、すべてを箇所を抽出してほしいけど、それができない。勉強したいが、Erlangのドキュメントの英語がよくわからない。

ソース:

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

%%--------------------------------------------------------------------
%% @doc
%% @spec start() -> ok | error
%% @end
%%--------------------------------------------------------------------
start() ->
    Regexp = ["Erlang"],
    case re:compile (Regexp) of
{ok,MP} ->
   do_regexp (MP),
   ok;
{error, ErrSpec} ->
   io:format ("Compile Error ~p~n",[ErrSpec]),
   error
    end.
   
%%--------------------------------------------------------------------
%% @doc
%% @spec do_regexp(MP) ->
%% @type MP = mp()
%% @end
%%--------------------------------------------------------------------
do_regexp (MP) ->
    Subject = ["My favorite Language is Erlang."],
    Subject2 = ["I want to study Python."],
   
    case re:run(Subject, MP) of
{match, Captured} ->
   io:format ("match:~p~n",[Captured]);
nomatch ->
   io:format ("nomatch~n")
    end,
   
    case re:run(Subject2, MP) of
{match, Captured2} ->
   io:format ("match:~p~n",[Captured2]);
nomatch  ->
   io:format ("nomatch2~n")
    end.

出力結果:
1> c(re_Test).
{ok,re_Test}
2> re_Test:start().
match:[{24,6}]
nomatch2
ok

2011年8月21日日曜日

wxErlang 勉強するためのサイト

wxErlangに初めて手をつける人のためのサイトと思われるところを発見。
wxerlang workups : http://wxerlang.dougedmunds.com/

本ブログでは、基本的にサンプルしか載せず、その解説はしないため、こういうサイトは非常に役に立つ。

2011年8月20日土曜日

Erlang wx_object behaviour Sample サンプル

ビヘイビアを使ってみた。
まだまだよくわからない。
サンプルにもなるのかはわからない。


動作画面:

ソースサンプル:

-module(wx_objectTest).
-export([start/0]).
-export([new/2, show/1]).  %% API
-export([init/1, handle_call/3, handle_event/2]).
-export([terminate/2,handle_info/2,code_change/3]).
-include("wx.hrl").
-behaviour(wx_object).

start() ->
    Wx = wx:new(),
    new(Wx,?wxID_ANY).
   
%% Client API
new(Parent, Id) ->
    io:format("new~n"),
    %% @spec start(Mod, Args, Options) -> wxWindow().
    %% Starts a generic wx_object server
    %% and invokes Mod:init(Args) in the new process.
     wx_object:start(?MODULE, [Parent,Id], []).

show(Dialog) ->
    io:format("show~n"),
    wxWindow:show(Dialog).

%% Server Implementation ala gen_server
init([Parent, Id]) ->
    io:format("init~n"),
     Dialog = wxDialog:new(Parent, Id, "Testing", []),
    wxDialog:connect(Dialog,close_window),
    show(Dialog),
    MyState = "init",
    {Dialog, MyState}.

handle_call(show, _From, State) ->
    io:format("handle_call~n"),
    {reply, ok, State}.

handle_event(#wx{event=#wxClose{}}, State) ->
    io:format("handle_event~n"),
    io:format("~p Closing window ~n",[self()]),
    wx:destroy(),
    {noreply, State}.

code_change(OldVsn, State, Extra) ->
  io:format("Upgrading from ~p with extra data ~p~n", [OldVsn, Extra]),
  { ok, State }.

terminate(Reason,State) ->
    io:format("Terminating ~p for reason ~p state:~p~n", [ self(), Reason,State ]),
    ok.

handle_info(Msg, State) ->
  io:format("Unexpected Info ~p~n", [Msg]),
  { noreply, State }.

赤字が最低限定義しなければならないものかな。
wx.hrlはErlangインストールディレクトリ配下を検索して探してください。

wx_objectTest:start().を実行すると画面が表示される。
start
→new
→init
→show
の順で動作し、
画面を閉じると
handle_eventが動作する。

2011年8月15日月曜日

Erlang is_function Sample サンプル

手こずった。
サンプルは以下。

ソース:

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

start() ->
    Double = fun(X) -> double(X) end,
    if is_function(Double) =:= true ->
   funA;
true -> true
    end.

double(X) ->
    2 * X.

うまくいくと、端末に「funA」と表示される。

2011年8月8日月曜日

Erlang wxProgressDialog Sample サンプル

進捗バーのあれです。
サンプルできたので、貼っておく。無いよりまし。

今回は進捗バーがすぐに消えてしまうため、キャプチャはない。
じゃあ、キャプチャが取れるようにすればいいのだが、眠いのである。
(「眠い」と書くと、ブログ内の広告が「眠い」関連になる。)

ソース:

-module(progressdialogTest).
-include_lib("wx.hrl").

-export([start/0]).

start()->
    Wx = wx:new(),
    {Frame,PD} = wx:batch(fun() -> create_window(Wx) end),
    wxWindow:show(Frame),
    Count = 1,
    updater(Count,PD),
    loop(Frame),
    wx:destroy(),
    ok.

create_window(Wx)->

    Frame = wxDialog:new(Wx,
   -1,
   "Progress Test",
[{size,{300,200}}]),

    Option = [{maximum,100},{parent,Frame}],
    %%Option = [{maximum,100}],

    %% Create Dialog
    PDialog = wxProgressDialog:new("ProgressDialog Example",
 "Progress Test...",
 Option),
    %% insert sleep
    timer:sleep(300),

    %% Set Connect Close
    wxFrame:connect(Frame, close_window),

    {Frame,PDialog}.

loop(Frame) ->
    receive
% Window Close Event
#wx{event=#wxClose{}} ->
   io:format("~p Closing window ~n",[self()]),
   wxWindow:destroy(Frame),
   ok
    end.

updater(Count,PD) ->
    if Count =< 100 ->
   io:format("Count:~p~n",[Count]),
   wxProgressDialog:update(PD,Count),
   updater(Count + 1,PD);
true ->
   ok
    end.

wx.hrlはErlangインストールディレクトリを漁ってください。

参考:
nori's tech days: ProgressDialog(その2) : http://blog.tonic-water.com/2008/04/progressdialog_30.html

2011年8月7日日曜日

Erlang file set_cwd Sample サンプル

実行プログラムのカレントディレクトリを変更する関数set_cwd。
サンプル作った。

サンプル:

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

%% please create directory "zip_work" on current directory.
%% this program create directory "setcwdTest" on "zip_work".
%% warning : if you execute this program on EShell,
%%           Current directory at EShell exchange to "zip_work"
%%           directory.
start() ->
    case file:get_cwd() of
{ok,Cwd} ->
   io:format("Currnet:~p~n",[Cwd]),
   SetCwd = "zip_work",
   setTest(SetCwd);
{error,Reason} ->
   io:format("Error:~p~n",[Reason]),
   error
    end.

setTest(Cwd) ->
    try
case file:set_cwd(Cwd) of
   ok -> file:make_dir("setcwdTest");
   {error,Reason} -> io:format("set_cwd Error:~p~n",[Reason])
end
    catch
_ -> io:format("setTest throw exception~n")
    end.

Erlang file:get_cwd Sample サンプル

現在のカレントディレクトリのパスを取得する関数。
絶対パスで取得する。

ピクチャ:

ソース:

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

start() ->
    case file:get_cwd() of
{ok,Cwd} ->
   io:format("Currnet:~p~n",[Cwd]),
   ok;
{error,Reason} ->
   io:format("Error:~p~n",[Reason]),
   error
    end.
   

2011年7月31日日曜日

Erlang error Reason:enoent エラーについて

Reason:enoent

↑これは「そんなファイルねーよ」です。俺のソースで出てきたときは。

Erlang Crashdumpの表示方法

WindowsのbatファイルからErlangプログラムを起動することを試していた。
プログラムが落ちたとき、Erlangの情報がCrashdumpしかなかったので、それを表示させるべく、下記URLを参考に表示させてみた。

Erlang のクラッシュダンプ - Life Logging Life : http://blogs.asanegra.org/mnaniwa/entry/29

このとき、上記サイトの通りにいかなかった箇所を記述する。

サイトでは、EshellのカレントとCrashdumpの場所が同一の状態で、webtool:start().を行うと表示できるとある。

しかし、できなかった。
http://localhost:8888へアクセスし、Crashdumpを指定すると、C:\fakepathにCrashdumpないという表示が出る。
なので、C直下にfakepathを作成し、Crashdumpをそこに置いたら、できるようになった。

下記画像が表示できた様子:

これをどう解析して、落ちた原因を特定するのかは不明。

Erlang filename basename のサンプル sample

filename の basenameのサンプルだ。
注意点は「/(スラッシュ)」のパスしかダメなところ。

ソース:

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

start() ->
    Path = "C:/Dir/FileA.txt",
    File1 = filename:basename(Path),
    io:format("File1:~p~n",[File1]).

Erlang filenameのsplitとbinaryのsplit

splitでwindowsのパスを分割しようとして苦しんだ。
そのためのメモ。

動作結果:

ソース:

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

start() ->
    Path = "C:\Dir\File.txt",
    io:format("Path:~p~n",[Path]),
    Split = filename:split(Path),
    io:format("Split:~p~n",[Split]),
   
    Path1 = "C:/Dir/File.txt",
    io:format("~nPath1:~p~n",[Path1]),
    Split1 = filename:split(Path1),
    io:format("Split1:~p~n",[Split1]),
   
    Path2 = list_to_binary(Path),
    Splitter = <<" ">>,
    Split2 = binary:split(Path2, Splitter),
    io:format("~nSplit2:~p~n",[Split2]),
   
    AddPath = Path ++ " " ++ Path1,
    Path3 = list_to_binary(AddPath),
    Split3 = binary:split(Path3, Splitter),
    io:format("~nSplit3:~p~n",[Split3]).

   

2011年7月30日土曜日

Erlang Windows上でダブルクリックでErlangを実行する。

大層なことをタイトルに書いたが、要するに

batファイルをダブルクリックして、Erlangのプログラムを起動する

ってだけ。

test.batファイルの中身:

erl -noshell -s hello1 hello_out -s init stop

hello1.erlの中身:


-module(hello1).
-export([hello_out/0]).

hello_out() -> io:fwrite("Hello world!\n").

事前にhello1をコンパイルする必要がある。
そして、test.batファイルとhello1.beamを同一ディレクトリに配置して、test.batファイルをダブルクリックする。
そうすると、コマンドプロンプトが起動し、「Hello world!」が表示される。

2011年7月24日日曜日

Erlang zip sample サンプル

Erlangのzip:zipについてどう動作するのか確認したくて、プログラミングしたので、そのソースを載せる。

そのまとめみたいなメモをgoogle Docに作ったので、合わせて参照あれ。
https://docs.google.com/document/d/1lQmkEN8UxggewyHtPGLfwhW5_r8qR1e7yeedYkdnR2M/edit?hl=ja


ソース:

-module(zipTest).
-include_lib("wx.hrl").

-export([start/0]).

%% -*- coding: shift-JIS -*-
%% Current Directory -> C:\Users\andre\erlwork
start() ->
    %myzipMem().
    %myzipVerbose().
    %myzipCwd().
    %myzipUcp().
    myzipCmt().

%% @doc write to file on memory data that compress by zip:zip/3
%% in C:\Users\andre\erlwork\auiTest.erl
%% out C:\Users\andre\erlwork\ngs_bin.zip
myzipMem() ->
    Option = [memory],
    case zip:zip("ngs.zip",["auiTest.erl"],Option) of
{ok,{"ngs.zip",Mem}} -> file:write_file("ngs_bin.zip",Mem),
ok;
{error,Reason} -> io:format("Reason:~p~n",[Reason])
    end.

%% @doc compress the directory
%% in C:\Users\andre\erlwork\zip
%% out C:\Users\andre\erlwork\ngs.zip
myzipDrct() ->
    Option = [],
    case zip:zip("ngs.zip",["zip"],Option) of
{ok,"ngs.zip"} -> ok;
{error,Reason} -> io:format("Reason:~p~n",[Reason])
    end.

%% @doc compress the file
%% in C:\Users\andre\erlwork\auiTest.erl
%% out C:\Users\andre\erlwork\ngs.zip
myzip() ->
    Option = [],
    case zip:zip("ngs.zip",["auiTest.erl"],Option) of
{ok,"ngs.zip"} -> ok;
{error,Reason} -> io:format("Reason:~p~n",[Reason])
    end.

%% @doc compress the directory with option [verbose]
%% in C:\Users\andre\erlwork\zip
%% out C:\Users\andre\erlwork\ngs.zip
myzipVerbose() ->
    Option = [verbose],
    case zip:zip("ngs.zip",["zip"],Option) of
{ok,"ngs.zip"} -> ok;
{error,Reason} -> io:format("Reason:~p~n",[Reason])
    end.

%% @doc compress the directory and change current directory
%% in C:\Users\andre\erlwork\zip_work\test
%% out C:\Users\andre\erlwork\ngs_cwd.zip
myzipCwd() ->
    Option = [verbose,{cwd,"zip_work"}],
    case zip:zip("ngs_cwd.zip",["test"],Option) of
{ok,"ngs_cwd.zip"} -> ok;
{error,Reason} -> io:format("Reason:~p~n",[Reason])
    end.

%% @doc compress the directory but uncompress the extension "*.erl".
%% in C:\Users\andre\erlwork\zip
%% out C:\Users\andre\erlwork\ngs_ucp.zip
%% ucp -> uncompress
myzipUcp() ->
    ZipName = "ngs_ucp.zip",
    Option = [verbose,{uncompress,{add,[".erl"]}}],
    case zip:zip(ZipName,["zip"],Option) of
{ok,ZipName} -> ok;
{error,Reason} -> io:format("Reason:~p~n",[Reason])
    end.

%% @doc compress the directory but uncompress the extension "*.erl".
%% in C:\Users\andre\erlwork\zip
%% out C:\Users\andre\erlwork\ngs_cmt.zip
%% cmt -> comment
myzipCmt() ->
    ZipName = "ngs_cmt.zip",
    Option = [verbose,{comment,"This is test."}],
    case zip:zip(ZipName,["zip"],Option) of
{ok,ZipName} -> ok;
{error,Reason} -> io:format("Reason:~p~n",[Reason])
    end.

wx.hrlはErlangのインストールディレクトリ内を検索するとあるので、それを本ソースと同一ディレクトリに配置してください。

ディレクトリ構成がちょっと面倒かも。C:\Users\andre\erlwork\に実行モジュール(beam)がある。それと同一ディレクトリにzipディレクトリとかzip_workディレクトリとかある。

毎回のことだけど、解説がつかないブログで申し訳ありません :-<


2011年7月18日月曜日

Erlang zip ドキュメントの制限事項部分をgoogleで翻訳する。

Erlangのzipには制限事項がある。
その部分の翻訳をgoogleでやった。
それをコピペする。


ZIP64アーカイブは現在サポートされていません。

パスワードで保護し、暗号化されたアーカイブは、現在サポートされていません

のみDEFLATE(zlibの圧縮)とSTORE(非圧縮データ)ZIP方式がサポートされています。

アーカイブのサイズは2 Gバイト(32ビット)に制限されています。

zipアーカイブを作成するときに個々のファイルのコメントはサポートされていません。全体のZIPアーカイブのZIPアーカイブのコメントがサポートされています。

既存のzipアーカイブを変更するためのサポートはありません。アーカイブからファイルを追加または削除するには、アーカイブ全体を再作成する必要があります。

2011年7月17日日曜日

Erlang zip unzip sample サンプル

解凍・圧縮のサンプルを貼っておきます。
カレントディレクトリにある「auiTest.erl」というファイルを「ngs.zip」という名前の圧縮ファイルにし、圧縮に成功した場合、そのファイルを解凍する。

解凍時には、カレントディレクトリの同ファイルに上書き保存される。

ソース:

-module(zipTest).
-include_lib("wx.hrl").

-export([start/0]).

start() ->
    myzip().

myzip() ->
 
    case zip:zip(ngs.zip,["auiTest.erl"]) of
{ok,ngs.zip} -> ok,
zip:unzip("ngs.zip");
{error,Reason} -> io:format("Reason:~p~n",[Reason])
    end.

Erlang filename dirname 取得する

ソース内に直書きしたディレクトリ名の配下にあるファイル名およびディレクトリ名を表示するプログラムを書いた。
ファイル名に日本語があると落ちるけど。

ソース:

-module(filelibTest).
-include_lib("wx.hrl").

-export([start/0]).

start() ->
    % get file name
    Files = filelib:wildcard("C:/Users/andre/erlwork/*"),
    % print file name
    print(Files).

print([]) ->
    io:format("ok~n");
print([File|Files]) ->
    Filename = filename:basename(File),
    io:format("filename:~ts~n",[Filename]),
    print(Files).


wxErlang wxListCtrl Sample2 サンプル2 1x2に文字列をセットする。

前回の記事で、wxListCtrlの中に、縦にItemおよび文字列をセットするものはできた。
しかし、ほしいものは横にセットするものだった。
それができたので、貼っておく。

画像:

ソース:

-module(listCtrlTest).
-include_lib("wx.hrl").

-export([start/0]).

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

create_window(Wx)->  
    %% Create Frame
    Frame = wxFrame:new(Wx,
 -1,
 "wxListCtrl and wxListItem Example",
 %%[{size,{300,200}}]),
 [{size,{-1,-1}}]),

    % Create wxListCtrl
    ListCtrl = wxListCtrl:new(Frame,[{style,?wxLC_REPORT bor ?wxLC_HRULES}]),
    %ListCtrl = wxListCtrl:new(Frame,[{style,?wxLC_LIST}]),

    % Set Column Name
    Option = [{format,?wxLIST_FORMAT_LEFT}],
    Col0 = wxListCtrl:insertColumn(ListCtrl,0,"Column0",Option),
    Col1 = wxListCtrl:insertColumn(ListCtrl,1,"Column1",Option),

    % Create wxListItem
    Item1 = wxListItem:new(),
    wxListItem:setText(Item1,"Item1"),
    %wxListItem:setColumn(Item1,0),

    % Create wxListItem
    Item2 = wxListItem:new(),
    wxListItem:setText(Item2,"Item2"),
    %wxListItem:setColumn(Item2,0),

    % Insert Item to List
    %wxListCtrl:insertItem(ListCtrl,Item1),
    Index = wxListCtrl:insertItem(ListCtrl,Col0,"Item1s"),
    %wxListCtrl:insertItem(ListCtrl,Item2),
    %wxListCtrl:insertItem(ListCtrl,Col1,"Item2s"),
    wxListCtrl:setItem(ListCtrl,Index,Col1,"Item2s"),
 
    %% Set Connect Close
    wxFrame:connect(Frame, close_window),

    Frame.

loop(Frame) ->
    receive
% Window Close Event
#wx{event=#wxClose{}} ->
   io:format("~p Closing window ~n",[self()]),
   wxWindow:destroy(Frame),
   ok
    end.

wx.hrlはErlangのインストールディレクトリにある。検索してください。
それを本ソースと同一ディレクトリに配置してください。

参考:
How to add value to second column using wxListCtrl in wxWidgets (C++ code)?? - Stack Overflow : http://stackoverflow.com/questions/2962057/how-to-add-value-to-second-column-using-wxlistctrl-in-wxwidgets-c-code

2011年7月16日土曜日

wxErlang wxGrid Sample サンプル

いつもの通りサンプルを貼っておきます。

画面:


ソース:

-module(gridTest).
-include_lib("wx.hrl").

-export([start/0]).

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

create_window(Wx)->  
    %% Create Frame
    Frame = wxFrame:new(Wx,
 -1,
 "wxGrid Example",
 %%[{size,{300,200}}]),
 [{size,{-1,-1}}]),

    Grid = wxGrid:new(Frame,?wxID_ANY),
    Row = 2,
    Col = 2,
    wxGrid:createGrid(Grid,Row,Col),
    wxGrid:appendRows(Grid,[{numRows,2}]),
    wxGrid:appendCols(Grid,[{numCols,2}]),

    wxGrid:setCellValue(Grid,{2,2},"2x2"),
    wxGrid:setCellValue(Grid,{3,3},"3x3"),
 
    %% Set Connect Close
    wxFrame:connect(Frame, close_window),

    Frame.

loop(Frame) ->
    receive
% Window Close Event
#wx{event=#wxClose{}} ->
   io:format("~p Closing window ~n",[self()]),
   wxWindow:destroy(Frame),
   ok
    end.

wx.hrlはErlangのインストールディレクトリにあるので、検索してください。
そして、本ソースと同一ディレクトリに配置してください。

参考:
2007-11-23 - 理想のユーザ・インターフェイスを求めて : http://d.hatena.ne.jp/Megumi221/20071123

wxErlang wxListCtrl Sample サンプル

このサンプルが役に立つとは思えない。
wxErlangの使用例がないし、貼っておく。

動作画面:

ソース:

-module(listCtrlTest).
-include_lib("wx.hrl").

-export([start/0]).

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

create_window(Wx)->  
    %% Create Frame
    Frame = wxFrame:new(Wx,
 -1,
 "wxListCtrl and wxListItem Example",
 %%[{size,{300,200}}]),
 [{size,{-1,-1}}]),

    % Create wxListCtrl
    ListCtrl = wxListCtrl:new(Frame,[{style,?wxLC_REPORT}]),

    % Set Column Name
    Option = [{format,?wxLIST_FORMAT_LEFT}],
    wxListCtrl:insertColumn(ListCtrl,0,"Column0",Option),
    wxListCtrl:insertColumn(ListCtrl,1,"Column1",Option),

    % Create wxListItem
    Item1 = wxListItem:new(),
    wxListItem:setText(Item1,"Item1"),
    wxListItem:setColumn(Item1,0),

    % Create wxListItem
    Item2 = wxListItem:new(),
    wxListItem:setText(Item2,"Item2"),
    wxListItem:setColumn(Item2,0),

    % Insert Item to List
    wxListCtrl:insertItem(ListCtrl,Item1),
    %wxListCtrl:setItem(ListCtrl,Item1),
    wxListCtrl:insertItem(ListCtrl,Item2),
    %wxListCtrl:setItem(ListCtrl,Item2),  
 
    %% Set Connect Close
    wxFrame:connect(Frame, close_window),

    Frame.

loop(Frame) ->
    receive
% Window Close Event
#wx{event=#wxClose{}} ->
   io:format("~p Closing window ~n",[self()]),
   wxWindow:destroy(Frame),
   ok
    end.

本当は、左から右へItemを並べたかったけど、どうもできないらしい。
Itemは一行に一個で、Column2に何か表示させたければ、SetItemとかするのだと思う。
今度やってみる。

参考:
wxListCtrlで作成した表の値を編集 - 理想のユーザ・インターフェイスを求めて : http://d.hatena.ne.jp/Megumi221/20100225/1267592869

2011年7月10日日曜日

Windows Vistaでファイル名とファイル内文字列検索する方法

くそったれVistaでは初期設定で、インデックスが作成されている場所では、ファイル名とファイル内文字列が検索対象である。インデックスが作成されていない場所では、ファイル名のみ検索対象だ。

まさにダメ。これはWindows 7でも同じ気がする。

解決方法が下記URLでできる。参照あれ。
Windows Vista ファイル内容(文字列)検索 : http://ratan.dyndns.info/vista/kennsaku.html

俺はこれでもできなかったけど。どうすればいいんだ・・・


wxErlang wxChoice wxSpinCtrl wxListBox Sample サンプル

当初、wxErlangを勉強していたきっかけは、飛行機本のチャットのGUIをwxErlangで書き換えることだった。しかし、今やwxErlangのサンプルを貼ることが目的になってしまっている。

Erlangで何かツールを作ってみようと思っているので、今度からサンプルも貼りつつ、ツールの作成にも着手していく。

今回のソースはリストボックスとかその周辺のもの。

ソース:

-module(choicesTest).
-include_lib("wx.hrl").

-export([start/0]).

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

create_window(Wx)->  
    %% Create Frame
    Parent = wxFrame:new(Wx,
 -1,
 "ListBox Example",
 %%[{size,{300,200}}]),
 [{size,{-1,-1}}]),

    %% Create Panel
    Panel = wxScrolledWindow:new(Parent, []),

    %% Setup sizers
    MainSizer = wxBoxSizer:new(?wxVERTICAL),
    ListBoxSizer = wxStaticBoxSizer:new(?wxVERTICAL, Panel,
[{label, "wxListBox"}]),

    ChoiceSizer = wxStaticBoxSizer:new(?wxVERTICAL, Panel,
[{label, "wxChoice"}]),
    SpinSizer = wxStaticBoxSizer:new(?wxVERTICAL, Panel,
    [{label, "wxSpinCtrl"}]),
    ComboSizer = wxStaticBoxSizer:new(?wxVERTICAL, Panel,
    [{label, "wxComboBox"}]),
    Sizer = wxBoxSizer:new(?wxHORIZONTAL),
    Sizer3  = wxBoxSizer:new(?wxHORIZONTAL),

    Choices = ["one","two","three",
      "four","five","six",
      "seven","eight","nine",
      "ten", "eleven", "twelve"],

    %% Create a wxListBox that uses multiple selection
    ListBox = wxListBox:new(Panel, 1, [{size, {-1,100}},
      {choices, ["Multiple selection"|Choices]},
      {style, ?wxLB_MULTIPLE}]),
    wxListBox:setToolTip(ListBox, "A wxListBox with multiple selection"),

    %% Create a wxListBox that uses single selection
    ListBox2 = wxListBox:new(Panel, 2, [{size, {-1,100}},
{choices, ["Single selection"|Choices]},
{style, ?wxLB_SINGLE}]),
    wxListBox:setToolTip(ListBox2, "A wxListBox with single selection"),

    %% Create a wxChoice
    Choice = wxChoice:new(Panel, 4, [{choices, Choices}]),
    wxChoice:setToolTip(Choice, "A wxChoice"),

    %% Create a wxSpinCtrl with range between 0 and 100
    SpinCtrl = wxSpinCtrl:new(Panel, []),
    wxSpinCtrl:setRange(SpinCtrl, 0, 100),
    wxSpinCtrl:setToolTip(SpinCtrl, "A wxSpinCtrl with range from 0 to 100"),

    %% Create a wxComboBox and set the value to "Default value"
    ComboBox = wxComboBox:new(Panel, 5, [{choices, Choices}]),
    wxComboBox:setToolTip(ComboBox, "A wxComboBox"),


    wxChoice:connect(Choice,command_choice_selected),
    wxSpinCtrl:connect(SpinCtrl,command_spinctrl_updated),
    wxComboBox:connect(ComboBox, command_combobox_selected),


    %% Add to sizers
    Options = [{border,4}, {flag, ?wxALL}],
    wxSizer:add(Sizer, ListBox, Options),
    wxSizer:add(Sizer, ListBox2, Options),

    wxSizer:add(ChoiceSizer, Choice, Options),
    wxSizer:add(SpinSizer, SpinCtrl, Options),
    wxSizer:add(Sizer3, ChoiceSizer, []),
    wxSizer:add(Sizer3, SpinSizer, [{border, 4}, {flag, ?wxLEFT}]),

    wxSizer:add(ComboSizer, ComboBox, Options),

    wxSizer:add(ListBoxSizer, Sizer, Options),
    wxSizer:add(MainSizer, ListBoxSizer, Options),
    wxSizer:add(MainSizer, Sizer3, Options),
    wxSizer:add(MainSizer, ComboSizer, Options),

    wxScrolledWindow:setScrollRate(Panel, 5, 5),
    wxPanel:setSizer(Panel, MainSizer),

    %% Set Connect Close
    wxFrame:connect(Parent, close_window),

    Parent.

loop(Frame) ->
    receive
% Window Close Event
#wx{event=#wxClose{}} ->
   io:format("~p Closing window ~n",[self()]),
   wxWindow:destroy(Frame),
   ok
    end.

2011年7月8日金曜日

wxErlang wxTreeCtlr Sample サンプル

ツリーのサンプル。

ソース:

-module(wxTreeCtrlTest).
-include_lib("wx.hrl").

-export([start/0]).

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

create_window(Wx)->  
    %% Create Frame
    Frame = wxFrame:new(Wx,
 -1,
 "TreeCtrl Example",
 %%[{size,{300,200}}]),
 [{size,{-1,-1}}]),

    %% Create Panel
    %%Panel1 = wxPanel:new(Frame),
    Panel = wxPanel:new(Frame, []),

    %% Setup sizers
    MainSizer = wxBoxSizer:new(?wxVERTICAL),
    Sizer = wxStaticBoxSizer:new(?wxVERTICAL, Panel,
[{label, "wxTreeCtrl"}]),

    %% Setup treeCtrl
    TreeCtrl = wxTreeCtrl:new(Panel, []),
    RootId = wxTreeCtrl:addRoot(TreeCtrl, "Root"),
    %% Name the first items
    Items = ["item "++integer_to_list(Int)||
Int <- lists:seq(1,10)],
    %% Create the first items in the treeCtrl
    SubItems = [{wxTreeCtrl:appendItem(TreeCtrl, RootId, Item), Item}||
  Item <- Items],
    %% Create sub items
    [wxTreeCtrl:appendItem(TreeCtrl, ItemId, Item++" sub item "++integer_to_list(Int))||
{ItemId, Item} <- SubItems, Int <- lists:seq(1,10)],
    wxTreeCtrl:expand(TreeCtrl, RootId),

    %% Add to sizers
    Options = [{flag, ?wxEXPAND}, {proportion, 1}],
    wxSizer:add(Sizer, TreeCtrl, Options),
    wxSizer:add(MainSizer, Sizer, Options),

    wxTreeCtrl:connect(TreeCtrl, command_tree_item_collapsed),
    wxTreeCtrl:connect(TreeCtrl, command_tree_item_expanded),
    wxTreeCtrl:connect(TreeCtrl, command_tree_sel_changed),
    wxPanel:setSizer(Panel, MainSizer),
        %% Set Connect Close
    wxFrame:connect(Frame, close_window),

    Frame.

loop(Frame) ->
    receive
% Window Close Event
#wx{event=#wxClose{}} ->
   io:format("~p Closing window ~n",[self()]),
   wxWindow:destroy(Frame),
   ok
    end.

2011年7月3日日曜日

wxErlang wxAui と wxNotebook Sample サンプル

Erlangインストールディレクトリ配下にあるdemoディレクトリのex_aui.erlを参考に作ったものを載せる。
wxAuiとwxBoxSizerを混ぜたものである。


ソース:

-module(auiandboxTest).
-include_lib("wx.hrl").

-export([start/0]).

-define(pi, wxAuiPaneInfo).

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

create_window(Wx)->  
    %% Create Frame
    Frame = wxFrame:new(Wx,
 -1,
 "Aui and BoxSizer Example",
 %%[{size,{300,200}}]),
 [{size,{-1,-1}}]),

    %% Create Panel
    %%Panel1 = wxPanel:new(Frame),
     Panel = wxPanel:new(Frame, []),

    %% Setup sizers
    MainSizer = wxBoxSizer:new(?wxVERTICAL),

%% Create AuiManager
    Manager = wxAuiManager:new([{managed_wnd, Panel}
]),

%% Create wxAuiPaneInfo
    Pane = ?pi:new(),
    ?pi:closeButton(Pane),
    ?pi:right(Pane),
    ?pi:dockable(Pane, [{b, true}]),
    ?pi:floatingSize(Pane, 300,200),
    ?pi:minSize(Pane, {50,50}),
    ?pi:paneBorder(Pane),
    ?pi:floatable(Pane, [{b, true}]),

%% Create Pane Clone?
    create_pane(Panel, Manager, Pane),
    create_pane(Panel, Manager,
?pi:caption(?pi:top(?pi:new(Pane)), "One")),
    create_pane(Panel, Manager,
?pi:caption(?pi:left(?pi:new(Pane)), "two")),
    create_pane(Panel, Manager,
?pi:caption(?pi:bottom(?pi:new(Pane)), "Three")),
    create_pane(Panel, Manager,
?pi:caption(?pi:centre(?pi:new(Pane)), "Four")),

    wxPanel:setSizer(Panel, MainSizer),

    wxAuiManager:connect(Manager, aui_pane_button, [{skip,true}]),
    wxAuiManager:connect(Manager, aui_pane_maximize, [{skip,true}]),
    wxAuiManager:update(Manager),

    %% Set Connect Close
    wxFrame:connect(Frame, close_window),

    Frame.

loop(Frame) ->
    receive
% Window Close Event
#wx{event=#wxClose{}} ->
   io:format("~p Closing window ~n",[self()]),
   wxWindow:destroy(Frame),
   ok
    end.

create_pane(Parent, Manager, Pane) ->
    TextCtrl = wxTextCtrl:new(Parent, ?wxID_ANY, [{size, {300,200}},
 {value, "An empty pane"},
 {style, 0
  bor ?wxDEFAULT
  bor ?wxTE_MULTILINE}]),
    wxAuiManager:addPane(Manager, TextCtrl, Pane),
    TextCtrl.
   
wx.hrlはErlangのインストールディレクトリ内にあるものを使用している。検索をかけて見つけて。
それを本ソースと同一ディレクトリに配置する。

サンプルが長くなっていく。

wxErlang wxNotebook Sample サンプル

wxNotebookについては、wxWidgetsではこんな感じに記述されている。
「このクラスは、関連するタブで複数のウィンドウを管理するノートブックのコントロールを表します。」



ソース:
-module(notebookTest).
-include_lib("wx.hrl").

-export([start/0]).

-define(pi, wxAuiPaneInfo).

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

create_window(Wx)->    
    %% Create Frame
    Frame = wxFrame:new(Wx,
 -1,
 "NoteBook Example",
 %%[{size,{300,200}}]),
 [{size,{-1,-1}}]),

    %% Create Panel
    %%Panel1 = wxPanel:new(Frame),
     Panel = wxPanel:new(Frame, []),

%% Create AuiManager
    Manager = wxAuiManager:new([{managed_wnd, Panel}
]),

%% Create wxAuiPaneInfo
    Pane = ?pi:new(),
    ?pi:closeButton(Pane),
    %?pi:right(Pane),
    ?pi:dockable(Pane, [{b, true}]),
    ?pi:floatingSize(Pane, 300,200),
    ?pi:minSize(Pane, {50,50}),
    ?pi:paneBorder(Pane),
    ?pi:floatable(Pane, [{b, true}]),

    ?pi:centrePane(Pane),

    %Pane2 = wxAuiPaneInfo:new(Pane),
    %?pi:centrePane(Pane2),
    
    %% Create Pane2 Clone?
    create_notebook(Panel, Manager, Pane),

    wxAuiManager:connect(Manager, aui_pane_button, [{skip,true}]),
    wxAuiManager:connect(Manager, aui_pane_maximize, [{skip,true}]),
    wxAuiManager:update(Manager),

    %% Set Connect Close
    wxFrame:connect(Frame, close_window),

    Frame.

loop(Frame) ->
    receive
% Window Close Event
#wx{event=#wxClose{}} ->
   io:format("~p Closing window ~n",[self()]),
   wxWindow:destroy(Frame),
   ok
    end.

create_notebook(Parent, Manager, Pane) ->
    Style = (0
    bor ?wxAUI_NB_DEFAULT_STYLE
    bor ?wxAUI_NB_TOP
    bor ?wxAUI_NB_WINDOWLIST_BUTTON
    bor ?wxAUI_NB_CLOSE_ON_ACTIVE_TAB
    bor ?wxAUI_NB_TAB_MOVE
    bor ?wxAUI_NB_SCROLL_BUTTONS
   ),
    
    Notebook = wxAuiNotebook:new(Parent, [{style, Style}]),

    Tab1 = wxPanel:new(Notebook, []),
    wxPanel:setBackgroundColour(Tab1, ?wxBLACK),
    wxButton:new(Tab1, ?wxID_ANY, [{label,"New tab"}]),
    wxAuiNotebook:addPage(Notebook, Tab1, "You can", []),

    Tab2 = wxPanel:new(Notebook, []),
    wxPanel:setBackgroundColour(Tab2, ?wxRED),
    wxButton:new(Tab2, ?wxID_ANY, [{label,"New tab"}]),
    wxAuiNotebook:addPage(Notebook, Tab2, "rearrange", []),

    Tab3 = wxPanel:new(Notebook, []),
    wxPanel:setBackgroundColour(Tab3, ?wxGREEN),
    wxButton:new(Tab3, ?wxID_ANY, [{label,"New tab"}]),
    wxAuiNotebook:addPage(Notebook, Tab3, "these tabs", []),

    wxAuiManager:addPane(Manager, Notebook, Pane),

    wxAuiNotebook:connect(Notebook, command_button_clicked),
    wxAuiNotebook:connect(Notebook, command_auinotebook_page_close, [{skip, false}]),
    wxAuiNotebook:connect(Notebook, command_auinotebook_page_changed),
    Notebook.
    
    
wx.hrlはErlangのインストールディレクトリ配下を検索すると、みつかる。
本ソースと同一ディレクトリに配置する。
本サンプルはErlangインストールディレクトリ配下にあるdemoディレクトリのex_aui.erlを参考にしている。いや、ほぼ同じである。

「New Tab」ボタンを押下しても何も起きないので注意。