vimスクリプトの練習-カンマの位置を取得-

妻のブログにも書かれているが、今日ダスキンにエアコンのクリーニングをしてもらった。
効果があるのか若干半信半疑な部分もあったのだが、効果は抜群だった。
クリーニング前はすっぱい臭いがしていたのだが、クリーニング後は全くすっぱい臭いがしなくなった。
おすすめです。何年かに一回でもクリーニングしてもらうと気持ちがよいと思う。
また利用したい。ダスキンすげえ。

///////////////////////////////////////
さてvimスクリプト。
次のスクリプトを実行すると、現在行のカンマの位置をechoします。

let str = getline('.')
let length = strlen(str)
let list = range(length)
let n = 0
let m = 0
while n < length
if str[n] == ','
let list[m] = n
let m += 1
endif
let n += 1
endwhile
let list[m] = -1

let n = 0
while list[n] != -1
echo list[n]
let n += 1
endwhile

 
ジャジャガッチ | Linux | 23:45 | comments(0) | trackbacks(0) |

今日は今日とてvimスクリプトの練習

この前家族3人で川沿いを散歩していたら鴨を発見した。
豪快に川にダイブするところを目撃できた。かわいい。
今日も鴨いるかなー、と3人で目撃地点に向かったのだが、虫がたくさん飛んでいたので諦めた。
鴨かわいい。蚊にかまれた。

//////////////////
文字列について理解を深めるためにgetlineで取得した文字列の各要素にアクセスして表示してみた。
let str = getline('.')
let length = strlen(str)
let n = 0

while n < length
echo str[n]
let n += 1
endwhile
実行結果↓
ジャジャガッチ | Linux | 22:12 | comments(0) | trackbacks(0) |

vimスクリプトでオイラー法

子供が出来てから笑いの沸点が下がった気がする。
僕は3年に一度程度のペースで死にそうなほど笑い転げるのだが、子供が産まれてからもう3度も抱腹絶倒している。
幸せだ。

////////////////////////////////////////////

vimいじるの面白い。
スクリプトで機能拡張も出来るということで、自分のvimを成長させていく楽しみがある。
とりあえずオイラー法でdf/dx = fを解いてみた。

function! Euler()
let f = 1.0
let dx = 0.01
let x = 0.0
let n = 1

while x < 1.0
call setline(n , string(x) . ' ' . string(f))
let f += f * dx
let x += dx
let n += 1
endwhile

endfunction

これをaaa.vimに保存し、別のテキストファイルで
:source aaa.vim
:call Euler()
とするとそれまでの編集内容に数値解を上書きします。
うーん、何の訳にも立たない機能。
 
ジャジャガッチ | Linux | 21:55 | comments(0) | trackbacks(0) |

Gtkmm-ボタンを表示する-

妻はとうもろこしが大好物だ。
時々コーン缶をむしゃむしゃ食べていてびっくりする。

彼女はとうもろこしを一粒ずつむしって食べる。これも衝撃だった。
その食べ方おいしいのか?

//////////////////////////////////////////
ボタンを表示する。表示するだけ。

#include <gtkmm/main.h>
#include <gtkmm/window.h>
#include <gtkmm/button.h>

class MyWindow : public Gtk::Window
{
private:
    Gtk::Button button;
public:
    MyWindow();
};

MyWindow::MyWindow() : button("hello world")
{
this->add(button)
button.show();
}

int main( int argc, char** argv )
{
    Gtk::Main kit( argc, argv );
    MyWindow mywindow;
    Gtk::Main::run( mywindow );
    return 0;
}

ウィンドウにボタンをつけたり豪勢にするにはWindowクラスを継承して新たなクラスを作ればよいらしい。
ウィンドウにボタンをつけたい場合はボタンオブジェクトをメンバとして持たせればよい。
ButtonクラスはWidgetクラスを継承して定義されていて、このようなクラスはWindow::add()、Widget::show()で表示できるようだ。
ちなみに実行結果は↓
ジャジャガッチ | Linux | 21:32 | comments(0) | trackbacks(0) |

Gtkmm-最もシンプルな例-

僕は本が好きだ。特に技術書。
購入にいたるには、1ページだけでも糧になればいいや、という極めて低いハードルを乗り越えればよいので次々に本が増えていく。
本との出会いは一期一会だと思っているので、ついつい買ってしまう。
ただ、収納スペースに限界が訪れつつあるので最近は自粛気味。
部屋を整理したついでに本も処分しようと意気込んだのだが、数冊しか処分出来なかった。
あまり売る気にもならないんだよなあ。
大衆向けの古本屋にこの本の価値が本当にわかるんだろうか、と思ってしまう。
収納スペースはないというのにまたついオライリーの「入門vi」を購入してしまった。
妻には1冊買ったから1冊捨てるよ!と調子こいて言ってしまったもののどれを捨てればよいのか・・・。

//////////////////////////////////
Gtkmmを用いた最もシンプルなプログラムは次のとおり。

#include <gtkmm/main.h>
#include <gtkmm/window.h>

int main( int argc, char** argv )
{
    Gtk::Main kit( argc, argv );
    Gtk::Window main_window;
    Gtk::Main::run( main_window );
    return 0;
}

Mainは必ず必要らしい。
ジャジャガッチ | Linux | 21:10 | comments(0) | trackbacks(0) |

CentOS6.5にadobe readerをインストール

この前の日曜日、妻に溶けるチーズを買ってきて、と言われおつかいに出た。
溶けないチーズがあるの?と妻に聞くと、「ある」という。
おつかいから帰り、僕が購入したチーズを見て妻が一言。
「これ溶けないチーズだよ」
マジか。
おつかいもろくに出来ない30才。
確実に溶けそうなやつを選んだのになあ。

//////////////////////////////////////////
ソースからadobe readerを入れようとしたら色々と他に必要なものがあってすんなり入らなかった。
clearlooksがどうたらこうたらと警告が出たのでgtk2-engines.i686をインストールした。
ようやく使えるようになった。
Linuxは好きだが、こういう簡単そうなもののインストールに意外と手間取るところが嫌い。
 
ジャジャガッチ | Linux | 20:38 | comments(0) | trackbacks(0) |

Gtkmm

昨晩、にゃんこが窓から脱走しました。
父の日ということで妻が唐揚げを作ってくれたのだが、そのときうっかり網戸をせずに窓を開けてしまったらしい。
夜寝ようと思って窓に手をかけると網戸がない。
あれ?そういえばしばらくにゃんこを見てない!
焦ってベランダをライトで照らすと優雅に涼んでいるにゃんこが!
無事に確保しました。

うちのにゃんこは時々脱走騒ぎを起こす。
来客があってドアを開けた途端に猛ダッシュで脱走する。
でもすぐそばの床でゴロゴロしてるのですぐに捕まえられる。
遠くへ行く意志はないらしい。
多分押入れを開けた途端に侵入を試みるのと同じだ。

//////////////////////////////////////
Gtk+はLinux界隈でよく使われるGUIプログラム作成用のライブラリだ。
wxWidgetsはclang_completeがうまく働かなかったため、試してみることにした。
これまでGtk+を試す気にならなかったのはGtk+がC言語用のライブラリだからだ。C++ではない。
でもオブジェクト指向で実装されているらしい。
オブジェクト指向ならば素直にC++から使いたいよ!ということで手を出す気にならなかった。

だが調べてみると、C++版もあるらしい。それがGtkmm。
CentOS6.5ではyumでインストール出来るのでwxWidgetsよりもお手軽。
yum install Gtkmm*
コンパイルはwxWidgetsに似ていて
g++ main.cpp `pkg-config gtkmm-2.4 --cflags --libs`
でok。
さて、clang_completeは働くかな、ということで
pkg-config gtkmm-2.4 --cflags
を実行した結果を.vimrcのg:clang_user_optionsに追記。
clang_completeが正しく動くことを確認しました。
少しいじってみることにしよう。

(2014/6/16追記:一部の状況で補完されないことを確認。g:clang_user_optionsに記述していた-stdlib=libc++を除くと正しく補完されました)
ジャジャガッチ | Linux | 20:20 | comments(0) | trackbacks(0) |

wxWidgetsをCentOS6.5にインストールしてみた

今日は父の日ということで、妻が唐揚げを作ってくれました。
さつまいもとジャガイモのチップスも作ってくれた!おいしかった。
ありがとう、妻よ!

息子は最近よく喋るようになり、一層かわいさが増している。
喋ると言ってもあー、とかうー、とかだが。
でもこちらがあー、とかうー、とか応じるといっそう良く喋るので会話している感じがする。

//////////////////////
2014.3.31の記事にwxWidgetsについて少し紹介した。
この度wxWidgetsをCentOS6.5にインストールして動作確認したので報告します。
インストールは簡単なので省略。

最小限のプログラムは次のような感じ。ただ空のウィンドウが表示されるだけ。

#include <wx/wx.h>

class Sample : public wxApp
{
public:
    virtual bool OnInit();
};

IMPLEMENT_APP(Sample)

bool Sample::OnInit()
{
    wxFrame *frame = new wxFrame(NULL , -1 , wxT("sample") , wxPoint(-1,-1),wxSize(600,400));
    frame->Show(TRUE);
    return TRUE;
}

特徴的なのはmain関数がないことだ。
wxAppクラスを継承したクラスのOnInitメソッドからプログラムは始まる。
これはIMPLEMENT_APPに与えておく必要がある。
コンパイルは次のようにすればよい。
 
g++ *.cpp `wx-config --cxxflags --libs` -o test.out
 
wx-configはコンパイルに必要なヘッダファイルやライブラリを教えてくれるプログラムらしい。
--cxxconfigはヘッダファイル、--libsはライブラリを教えてくれるみたい。

wxWidgetsはwindowsでも使えるし、メインで使ってもいいな、と思っていたのだがひとつ大きな問題が。
clang_completeで補完されない。
色々設定を試してみてはいるのだがうまくいかない。どうしたらいいのか。

(→2014/6/16追記:g:clang_user_optionsに記述していた-stdlib=libc++を除くと正しく補完されました)
ジャジャガッチ | Linux | 22:25 | comments(0) | trackbacks(0) |

vimでインテリセンスを使う

妻よ、カルメーンではない、カメルーンだ。

////////////////////////////////////
前にvimではインテリセンス(コード補完)は使えないと書いたが、clang_completeというプラグインをインストールすることで使えるようになった。
導入に結構手間取ったが、かなり便利。
Visual Studioのインテリセンスのように、クラス名のあとにドットを打つと候補が表示される。
細かい動作はオプションで変更可能。
これでかなり快適に開発出来るはず。

vimは中々よいな。
:r!pwd
みたいにすると外部コマンドを実行して結果を取りこめるのでかなり便利。
少しずつVisual Studioにはない便利な機能を使えるようになってきた。
このままいけばvimなしで生きられなくなる日も近いかもしれない。
ジャジャガッチ | Linux | 22:30 | comments(0) | trackbacks(0) |

クッキークリッカー攻略用ツールを作る(3)

子供が産まれてから回路をいじる余裕がないので情熱はLinuxの方へ注がれている。
環境構築って楽しいんだよな。
でもあんまり凝った環境にするのは好きではなかったりする。
エディタの設定とかいじりまくる人いるけど、僕は別のPCに環境を移行するのが面倒になるのでできる限りデフォルトに近い状態を維持する。
だがLinuxならば設定ファイルはただのテキストだし、環境移行用のスクリプトでも書いておけばよいので少し凝った設定にしてもよいかもしれない。
こういう部分がCUIの強みか。

/////////////////////////

前回作成したデスクトップキャプチャプログラムは遅しすぎて使い物にならなかった。
今回は実用になりそうなものを紹介する。

int WINAPI WinMain(HINSTANCE hInst , HINSTANCE hPInst , LPSTR lpCmd , int nCmd)
{
    HWND h_desktop = ::GetDesktopWindow();
    RECT rc;
    ::GetWindowRect(h_desktop , &rc);
    int width = rc.right;
    int height = rc.bottom;
    
    BITMAPINFO bmpInfo;
    bmpInfo.bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
    bmpInfo.bmiHeader.biWidth=width;
    bmpInfo.bmiHeader.biHeight=height;
    bmpInfo.bmiHeader.biPlanes=1;
    bmpInfo.bmiHeader.biBitCount=32;
    bmpInfo.bmiHeader.biCompression=BI_RGB;

    HDC hdc = ::GetDC(h_desktop);
    LPDWORD lpPixel;
    HBITMAP hBitmap=CreateDIBSection(hdc,&bmpInfo,DIB_RGB_COLORS,(void**)(&lpPixel),NULL,0);

    COLORREF color;
    HDC hdc2 = ::CreateCompatibleDC(hdc);
    ::SelectObject(hdc2,hBitmap);
    BitBlt(hdc2,0,0,width,height,hdc,0,0,SRCCOPY);
    
    FILE *fp = fopen("color.txt","w");
    for(int i=0;i<width;i++)
        for(int j=0;j<height;j++)
        {
            color = ::GetPixel(hdc2,i,j);
            fprintf(fp,"%d,%d,%d,%d,%d¥n",i,j,GetRValue(color),GetGValue(color),GetBValue(color));
        }
    fclose(fp);
    ::ReleaseDC(h_desktop , hdc);
    ::DeleteDC(hdc2);
    return 0;
}

前回はデスクトップのデバイスコンテキストハンドル(HDC)を取得してGetPixelしたら遅すぎて実用にならなかったのだった。
今回は、メモリデバイスコンテキストハンドルと呼ばれる、デバイスと直接関係しないメモリ上の仮想的なデバイスコンテキストハンドルを作成し、デスクトップのHDCの情報を転送し(BitBlt)、GetPixelすることで高速化を図っている。
メモリデバイスコンテキストハンドルの型もHDCなのだが、
SelectObjectでHBITMAPと関係付けておく必要があるらしく、そこらへんの準備ですこしややこしくなっている。
ちなみにキャプチャされていることの確認はcsv形式で数値を書き出してフリーソフト「TXT_to_BMP」でBMP画像化して確認している。
 
ジャジャガッチ | C/C++ | 22:09 | comments(0) | trackbacks(0) |
1/2PAGES | >> |

06
--
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
--
>>
<<
--
PR
RECOMMEND
RECENT COMMENT
MOBILE
qrcode
OTHERS
Since 2013/09/17
LATEST ENTRY
CATEGORY
ARCHIVE
LINKS
PROFILE
SEARCH