SlideShare a Scribd company logo
1 of 16
Download to read offline
 † Perl Beginners #15 † 
申し訳程度にPerl OOP 
での質問をします 
ほかは謎便利ツール?紹介 
2014/10/7 
大野義貴(CL)
私 
⿟⿟大野義貴(CL) twitter @CLCLCL 
⿟⿟五反田の派遣・アポイントマッチング会社のサーバエ 
ンジニア 
⿟⿟2000年くらいから地方の印刷屋でPerlやっていた 
⿟⿟iモードコンテンツ屋さんがHTTPで206 Partial 
Contentで戦っていたころ印刷屋さんではPDFのペー 
ジ毎分割配信で206と戦っていた 
⿟⿟CPAN Author流行ってた頃ノリでCPAN Author 
⿟⿟最近転職して東京出てきた
便利ツール 
を置く場所
CentOSのrootユーザはデ 
フォルトだと/root/binに 
pathが通っているからログ 
フィルタ系の便利ツールっ 
てPerlで作ったりするけれ 
ども/root/binをmkdirし 
たりしてそこに置くといいん 
じゃないかな(サーバ引越し 
時に紛失しにくい)root作 
業の是非の判断は置いておく
便利ツール
Arduino UNIX時間時計 
Perl無しで使える→便利! 
2038年問題をいやでも意 
識する→便利! 
UNIXエポックとか知識ある 
人が周囲にいないと変な目で 
見られる→便利!
便利ツール 
その2
Raspberry Pi AnyEvent::Twitter::Streamクライアント
Raspberry Pi AnyEvent::Twitter::Streamクライアント 
ストリーミング→便利! 
TL内の秒あたりツイート数表 
示→勢いが見られて便利! 
ふぁぼられたりメンション来 
ると色が変わる→便利! 
VoiceText読み上げ→便利!
今回はこのハードの 
Perlプログラムで 
質問が有り〼ハード 
あまり関係無いが
from Adafruit_I2C import Adafruit_I2C 
from time import sleep 
class Adafruit_CharLCDPlate(Adafruit_I2C): 
# --------------------------------------------- 
# Constructor 
def __init__(self, busnum=-1, 
addr=0x20, debug=False): 
self.i2c = Adafruit_I2C(addr, busnum, debug) 
[snip] 
self.displayshift = (self.LCD_CURSORMOVE | self.LCD_MOVERIGHT) 
self.displaymode = (self.LCD_ENTRYLEFT | self.LCD_ENTRYSHIFTDECREMENT) 
self.displaycontrol = (self.LCD_DISPLAYON|self.LCD_CURSOROFF|self.LCD_BLINKOFF) 
self.write(0x33) # Init 
self.write(0x32) # Init 
self.write(0x28) # 2 line 5x8 matrix 
self.write(self.LCD_CLEARDISPLAY) 
self.write(self.LCD_CURSORSHIFT|self.displayshift) 
self.write(self.LCD_ENTRYMODESET 
| self.displaymode) 
self.write(self.LCD_DISPLAYCONTROL 
| self.displaycontrol) 
self.write(self.LCD_RETURNHOME) 
# --------------------------------------------- 
# Write operations 
def write(self, value, char_mode=False): 
""" Send command/data to LCD """ 
[snip] 
液晶モジュール 
表示用プログラ 
ム:オリジナル 
はPython 
オブジェクトの 
コンストラクタ 
(初期化)部分 
で、メンバ関数 
を呼んでいる
package Adafruit_CharLCDPlate; 
use HiPi::Device::I2C; use HiPi::BCM2835::I2C; 
# ------------------------------------------------------ 
# Constructor 
sub new { 
my $class = shift; my %args = ( @_ ); my $self = {}; 
$self->{addr}= 0x20; 
$self->{i2c} = HiPi::Device::I2C 
->new(address => $self->{addr}); 
$self->{i2c}->smbus_write_byte_data(MCP23017_IOCON_BANK0, 0b10100000); 
$self->{displayshift} = (LCD_CURSORMOVE|LCD_MOVERIGHT); 
$self->{displaymode} = (LCD_ENTRYLEFT |LCD_ENTRYSHIFTDECREMENT); 
$self->{displaycontrol} = (LCD_DISPLAYON |LCD_CURSOROFF|LCD_BLINKOFF); 
return bless $self, $class; 
} 
# Constructor_2 
sub init { 
my $self = shift; 
$self->write(0x33); # Init 
$self->write(0x32); # Init 
$self->write(0x28); # 2 line 5x8 matrix 
$self->write(LCD_CLEARDISPLAY); 
$self->write(LCD_CURSORSHIFT |$self->{displayshift}); 
$self->write(LCD_ENTRYMODESET|$self->{displaymode}); 
$self->write(LCD_DISPLAYCONTROL|$self->{displaycontrol}); 
$self->write(LCD_RETURNHOME); 
} 
# ------------------------------------------------------ 
# Write operations 
sub write { 
my $self = shift; 
[snip] 
} 
液晶モジュール表示 
ライブラリを、 
Pythonから 
Perlにオレオレ移植 
オブジェクトのコン 
ストラクタ(初期化) 
部分でメンバ関数を 
呼べないので、オブ 
ジェクト生成後、 
$obj->init() 
を別口で呼ぶことで 
メンバ関数を利用
質問の 
まとめ
PerlのOOPにおいて、コンストラクタ 
内でメンバ関数を呼ぶ方法はないか? 
質問 
my $obj = HOGE->new(); 
$obj->write('done.'); 
exit; 
package HOGE; 
sub new { # Constructor 
my $class = shift; 
my $self = {}; 
$self->write('init...'); # ERROR!! 
return bless $self, $class; 
} 
sub write { # Member function 
my $self = shift; 
my $str = shift; 
print "$strn"; 
}
blessを変数に入れておいて、後で変数を 
returnする 
解決 
my $obj = HOGE->new(); 
$obj->write('done.'); 
exit; 
package HOGE; 
sub new { # Constructor 
my $class = shift; 
my $self = {}; 
my $obj = bless $self, $class; 
$self->write('init...'); #PASS! 
return $obj; 
} 
sub write { # Member function 
my $self = shift; 
my $str = shift; 
print "$strn"; 
}

More Related Content

What's hot (7)

Interactive Music II SuperCollider入門 2 - 関数とUGen
Interactive Music II SuperCollider入門 2 - 関数とUGenInteractive Music II SuperCollider入門 2 - 関数とUGen
Interactive Music II SuperCollider入門 2 - 関数とUGen
 
役に立ちそうだけど、やっぱり役に立たなそうな技術Quine
役に立ちそうだけど、やっぱり役に立たなそうな技術Quine役に立ちそうだけど、やっぱり役に立たなそうな技術Quine
役に立ちそうだけど、やっぱり役に立たなそうな技術Quine
 
Interactive Music II SuperCollider入門 3 - 音を混ぜる(Mix)、楽器を定義(SynthDef)
Interactive Music II SuperCollider入門 3 - 音を混ぜる(Mix)、楽器を定義(SynthDef)Interactive Music II SuperCollider入門 3 - 音を混ぜる(Mix)、楽器を定義(SynthDef)
Interactive Music II SuperCollider入門 3 - 音を混ぜる(Mix)、楽器を定義(SynthDef)
 
Immortal
ImmortalImmortal
Immortal
 
入門 超絶技巧プログラミング !
入門 超絶技巧プログラミング !入門 超絶技巧プログラミング !
入門 超絶技巧プログラミング !
 
Lightning introduction to CoffeeScript 20131005
Lightning introduction to CoffeeScript 20131005Lightning introduction to CoffeeScript 20131005
Lightning introduction to CoffeeScript 20131005
 
道具を磨き続ける
道具を磨き続ける道具を磨き続ける
道具を磨き続ける
 

Similar to PerlのOOPにおいて、コンストラクタ 内でメンバ関数を呼ぶ方法は?(Perl Beginners #15)

DE0でラジコンカー作ってみた 関西de0 fpga勉強会20120519
DE0でラジコンカー作ってみた 関西de0 fpga勉強会20120519DE0でラジコンカー作ってみた 関西de0 fpga勉強会20120519
DE0でラジコンカー作ってみた 関西de0 fpga勉強会20120519
Yasuhiro Ishii
 
今すぐ始めるArduino
今すぐ始めるArduino今すぐ始めるArduino
今すぐ始めるArduino
funa3
 
iReport Designerで幸せになりましょう
iReport Designerで幸せになりましょうiReport Designerで幸せになりましょう
iReport Designerで幸せになりましょう
雄介 荒川
 
HaskellではじめるCortex-M3組込みプログラミング
HaskellではじめるCortex-M3組込みプログラミングHaskellではじめるCortex-M3組込みプログラミング
HaskellではじめるCortex-M3組込みプログラミング
Kiwamu Okabe
 
スタート低レイヤー #0
スタート低レイヤー #0スタート低レイヤー #0
スタート低レイヤー #0
Kiwamu Okabe
 
Inside of excel 方眼紙撲滅委員会 #pyfes
Inside of excel 方眼紙撲滅委員会 #pyfesInside of excel 方眼紙撲滅委員会 #pyfes
Inside of excel 方眼紙撲滅委員会 #pyfes
Takeshi Komiya
 
関東GPGPU勉強会 LLVM meets GPU
関東GPGPU勉強会 LLVM meets GPU関東GPGPU勉強会 LLVM meets GPU
関東GPGPU勉強会 LLVM meets GPU
Takuro Iizuka
 
Scripting Layer for Android + Perl
Scripting Layer for Android + PerlScripting Layer for Android + Perl
Scripting Layer for Android + Perl
Naoya Ito
 

Similar to PerlのOOPにおいて、コンストラクタ 内でメンバ関数を呼ぶ方法は?(Perl Beginners #15) (20)

DE0でラジコンカー作ってみた 関西de0 fpga勉強会20120519
DE0でラジコンカー作ってみた 関西de0 fpga勉強会20120519DE0でラジコンカー作ってみた 関西de0 fpga勉強会20120519
DE0でラジコンカー作ってみた 関西de0 fpga勉強会20120519
 
仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)
仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)
仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)
 
【入門】Arduino勉強会
【入門】Arduino勉強会【入門】Arduino勉強会
【入門】Arduino勉強会
 
今すぐ始めるArduino
今すぐ始めるArduino今すぐ始めるArduino
今すぐ始めるArduino
 
ハードウェア脳とソフトウェア脳
ハードウェア脳とソフトウェア脳ハードウェア脳とソフトウェア脳
ハードウェア脳とソフトウェア脳
 
iReport Designerで幸せになりましょう
iReport Designerで幸せになりましょうiReport Designerで幸せになりましょう
iReport Designerで幸せになりましょう
 
OpenFlowで覚えるネットワーク
OpenFlowで覚えるネットワークOpenFlowで覚えるネットワーク
OpenFlowで覚えるネットワーク
 
HaskellではじめるCortex-M3組込みプログラミング
HaskellではじめるCortex-M3組込みプログラミングHaskellではじめるCortex-M3組込みプログラミング
HaskellではじめるCortex-M3組込みプログラミング
 
Androidとfpgaを高速fifo通信させちゃう
Androidとfpgaを高速fifo通信させちゃうAndroidとfpgaを高速fifo通信させちゃう
Androidとfpgaを高速fifo通信させちゃう
 
スタート低レイヤー #0
スタート低レイヤー #0スタート低レイヤー #0
スタート低レイヤー #0
 
Inside of excel 方眼紙撲滅委員会 #pyfes
Inside of excel 方眼紙撲滅委員会 #pyfesInside of excel 方眼紙撲滅委員会 #pyfes
Inside of excel 方眼紙撲滅委員会 #pyfes
 
関東GPGPU勉強会 LLVM meets GPU
関東GPGPU勉強会 LLVM meets GPU関東GPGPU勉強会 LLVM meets GPU
関東GPGPU勉強会 LLVM meets GPU
 
Apacheの展望とmod_perlの超絶技巧 #yapcasia
Apacheの展望とmod_perlの超絶技巧 #yapcasiaApacheの展望とmod_perlの超絶技巧 #yapcasia
Apacheの展望とmod_perlの超絶技巧 #yapcasia
 
CUDAを利用したPIV解析の高速化
CUDAを利用したPIV解析の高速化CUDAを利用したPIV解析の高速化
CUDAを利用したPIV解析の高速化
 
OSC Tokyo 2013 Spring JRPUG
OSC Tokyo 2013 Spring JRPUGOSC Tokyo 2013 Spring JRPUG
OSC Tokyo 2013 Spring JRPUG
 
自作RISC-VチップでLチカをやってみた
自作RISC-VチップでLチカをやってみた自作RISC-VチップでLチカをやってみた
自作RISC-VチップでLチカをやってみた
 
Scripting Layer for Android + Perl
Scripting Layer for Android + PerlScripting Layer for Android + Perl
Scripting Layer for Android + Perl
 
StackExchangeで見たシステムプログラミング案件
StackExchangeで見たシステムプログラミング案件StackExchangeで見たシステムプログラミング案件
StackExchangeで見たシステムプログラミング案件
 
Web技術勉強会 第37回
Web技術勉強会 第37回Web技術勉強会 第37回
Web技術勉強会 第37回
 
PHP7をDockerで動かしたという話
PHP7をDockerで動かしたという話PHP7をDockerで動かしたという話
PHP7をDockerで動かしたという話
 

PerlのOOPにおいて、コンストラクタ 内でメンバ関数を呼ぶ方法は?(Perl Beginners #15)

  • 1.  † Perl Beginners #15 † 申し訳程度にPerl OOP での質問をします ほかは謎便利ツール?紹介 2014/10/7 大野義貴(CL)
  • 2. 私 ⿟⿟大野義貴(CL) twitter @CLCLCL ⿟⿟五反田の派遣・アポイントマッチング会社のサーバエ ンジニア ⿟⿟2000年くらいから地方の印刷屋でPerlやっていた ⿟⿟iモードコンテンツ屋さんがHTTPで206 Partial Contentで戦っていたころ印刷屋さんではPDFのペー ジ毎分割配信で206と戦っていた ⿟⿟CPAN Author流行ってた頃ノリでCPAN Author ⿟⿟最近転職して東京出てきた
  • 4. CentOSのrootユーザはデ フォルトだと/root/binに pathが通っているからログ フィルタ系の便利ツールっ てPerlで作ったりするけれ ども/root/binをmkdirし たりしてそこに置くといいん じゃないかな(サーバ引越し 時に紛失しにくい)root作 業の是非の判断は置いておく
  • 6. Arduino UNIX時間時計 Perl無しで使える→便利! 2038年問題をいやでも意 識する→便利! UNIXエポックとか知識ある 人が周囲にいないと変な目で 見られる→便利!
  • 9. Raspberry Pi AnyEvent::Twitter::Streamクライアント ストリーミング→便利! TL内の秒あたりツイート数表 示→勢いが見られて便利! ふぁぼられたりメンション来 ると色が変わる→便利! VoiceText読み上げ→便利!
  • 11. from Adafruit_I2C import Adafruit_I2C from time import sleep class Adafruit_CharLCDPlate(Adafruit_I2C): # --------------------------------------------- # Constructor def __init__(self, busnum=-1, addr=0x20, debug=False): self.i2c = Adafruit_I2C(addr, busnum, debug) [snip] self.displayshift = (self.LCD_CURSORMOVE | self.LCD_MOVERIGHT) self.displaymode = (self.LCD_ENTRYLEFT | self.LCD_ENTRYSHIFTDECREMENT) self.displaycontrol = (self.LCD_DISPLAYON|self.LCD_CURSOROFF|self.LCD_BLINKOFF) self.write(0x33) # Init self.write(0x32) # Init self.write(0x28) # 2 line 5x8 matrix self.write(self.LCD_CLEARDISPLAY) self.write(self.LCD_CURSORSHIFT|self.displayshift) self.write(self.LCD_ENTRYMODESET | self.displaymode) self.write(self.LCD_DISPLAYCONTROL | self.displaycontrol) self.write(self.LCD_RETURNHOME) # --------------------------------------------- # Write operations def write(self, value, char_mode=False): """ Send command/data to LCD """ [snip] 液晶モジュール 表示用プログラ ム:オリジナル はPython オブジェクトの コンストラクタ (初期化)部分 で、メンバ関数 を呼んでいる
  • 12. package Adafruit_CharLCDPlate; use HiPi::Device::I2C; use HiPi::BCM2835::I2C; # ------------------------------------------------------ # Constructor sub new { my $class = shift; my %args = ( @_ ); my $self = {}; $self->{addr}= 0x20; $self->{i2c} = HiPi::Device::I2C ->new(address => $self->{addr}); $self->{i2c}->smbus_write_byte_data(MCP23017_IOCON_BANK0, 0b10100000); $self->{displayshift} = (LCD_CURSORMOVE|LCD_MOVERIGHT); $self->{displaymode} = (LCD_ENTRYLEFT |LCD_ENTRYSHIFTDECREMENT); $self->{displaycontrol} = (LCD_DISPLAYON |LCD_CURSOROFF|LCD_BLINKOFF); return bless $self, $class; } # Constructor_2 sub init { my $self = shift; $self->write(0x33); # Init $self->write(0x32); # Init $self->write(0x28); # 2 line 5x8 matrix $self->write(LCD_CLEARDISPLAY); $self->write(LCD_CURSORSHIFT |$self->{displayshift}); $self->write(LCD_ENTRYMODESET|$self->{displaymode}); $self->write(LCD_DISPLAYCONTROL|$self->{displaycontrol}); $self->write(LCD_RETURNHOME); } # ------------------------------------------------------ # Write operations sub write { my $self = shift; [snip] } 液晶モジュール表示 ライブラリを、 Pythonから Perlにオレオレ移植 オブジェクトのコン ストラクタ(初期化) 部分でメンバ関数を 呼べないので、オブ ジェクト生成後、 $obj->init() を別口で呼ぶことで メンバ関数を利用
  • 14. PerlのOOPにおいて、コンストラクタ 内でメンバ関数を呼ぶ方法はないか? 質問 my $obj = HOGE->new(); $obj->write('done.'); exit; package HOGE; sub new { # Constructor my $class = shift; my $self = {}; $self->write('init...'); # ERROR!! return bless $self, $class; } sub write { # Member function my $self = shift; my $str = shift; print "$strn"; }
  • 15.
  • 16. blessを変数に入れておいて、後で変数を returnする 解決 my $obj = HOGE->new(); $obj->write('done.'); exit; package HOGE; sub new { # Constructor my $class = shift; my $self = {}; my $obj = bless $self, $class; $self->write('init...'); #PASS! return $obj; } sub write { # Member function my $self = shift; my $str = shift; print "$strn"; }