" perl(으)로 태그된 글들"

Perl One Liner

1월 28, 2009   //   alexken작성   //   기술  //  No Comments

주로 하는 짓거리가 텍스트를 가지고 조물락 거리는 거라,
Unix에서 find, sed, awk 조합으로 어지간 한거는
bash/perl/ruby까지 가지 않고 처리하고 있지만,

파일을 열어, 수정하고, 다시 저장하려면, open 한 파일과 save할 파일이 동일해서,
파이프( | ) 를 이용해서 tmp파일을 만들고는 하지만,
find -exec 속에서 파이프를 쓸 수가 없어서 이럴때는 perl one liner가 제격이다.

자주 쓰는 Perl one liner…

find . -name "file.*" -exec perl -i -pe 's|BEFORE|AFTER|g' {} ;

그 밖의 perl one liner
링크1, 링크2

[ruby] ruby 몰입교육중…

5월 14, 2008   //   alexken작성   //   기술  //  No Comments

회사 업무에, 용도에 따라 주로 다양한 언어를 사용하지만,
한번 쓰고 말거나, 간단한 처리는 주로 perl을 이용한다.
주로 하는 일이 UI가 필요없고,
주로 Unix환경인데다가,
text처리가 대부분이라 regula expression 이 강력해서 perl이야 말로 아주 적격이다.

ruby란 언어를 처음 접한건 1999년도 일본서 공부할때다.
자연어처리 연구실이라 그곳 역서 text처리가 대부분이다.
ruby 공부하던 인간도 몇 있었지만, 그저 취미 일뿐,
실용적인 측면에서는 그 연구실 조차 perl이었다.

그래서 나도 perl을 그곳에서 배우기 시작했다.
Unix + Emacs + Perl.

그랬던 ruby가 몇년 전 부터 하도 유행이라, 나도 공부해 보고 업무에도 적용해 보고 싶었지만,
팀에 초 고수 perl 본좌가 2명이나(noise & gogma) 있는 바람에
혼자서만 ruby코드를 양산할 수 없어서, 나도 친숙하고 모두가 다 아는 perl 이 주종이었다.

최근에 이 둘을 꼬셔서 루비 공부 시작…

꼬시는데 뭐 어려운거 없었다.
황대산 님의 20분짜리 가이드한번 보여줬더니
바로 루비 광신도로 변신…

회사 도서관에 있는 ‘Programming Ruby’를 죄다 빌려다 모두 공부 중.

근데 도대체 대충 읽을 수가 없다.

한줄 한줄 의미를 곱씹으니 아주 오묘하다는 것.
특히 문법 설계가 아주 예술이다.

예전에 신군이랑 메신저로 잠깐 나눴던, Code Block이랑 Meta Programming이 왜 필요한지 왜 써야 하는지 이해가 가지 않았는데,
이것참 물건이다.

당분간 루비 얘기로 블로그가 도배될꺼 같다.

iPod touch 프로그램 설치 공간 확보

1월 8, 2008   //   alexken작성   //   기술  //  3 Comments

iPod touch를 jail break하고 난후 BSDSubsystem 만 달랑 깔고, ssh 로 접속후 df 해보니 담과 같다.

# df
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/disk0s1            307200    278396     25732  92% /
devfs                       15        15         0 100% /dev
/dev/disk0s2           7622368     28144   7594224   1% /private/var

즉 app + os 용으로 할당된 파티션은 벌써 92%나 차 있다.
그리고 perl등을 installer로 깔면 100% 설치가 안된다.

고로 해결책은

cd /
mv Applications /private/var
ln -s /private/var/Applications Applications

해줘야 touch 용 어플리케이션을 마음껏 사용할 수 있게 된다.
foo_1.png

여기(야옹이님)에서 좀 더 많은 공간을 확보할 수 있는 팁이 있다.

iPod touch 1.1.2 탈옥기

1월 8, 2008   //   alexken작성   //   기술, 인생  //  2 Comments

alexken의 새 장난감
지난 10월달 콜로라도 출장때 applestore에서 iPod touch를 샀다.
iPhone과 touch 사이에서 1시간을 넘게 고민하다가, 카메라는 별 필요가 없고, 전화는 무용지물이고, bluetooth 때문에 10만원이란 거액과 저울질 하다가 bluetooth가 되어도 keyboard는 사용할 수 없다는 이유로 touch로 결정.

사자마다 1.1.1 jailbreak 해서 재밌게 잘 사용하다가, 어느날 우연히 iTune가 1.1.2로 업글 하겠냐는 메시지에 무심고 OK.
바로 밋밋한 오리지널 touch로 복귀후 한달 이상을 처박아 놓고 사용않다가, 최근에 다시 이것저것 설치후 휴대용 웹브라우저+장난감으로 사용중…

웹에 글들이 Windows기준이라, 다시 정리.
1. iPod touch 종료
2. 슬립+홈 버튼을 누른채 10초후 슬립버튼만 해제
3. 복구 모드로 iTunes 실행
4. option + 복원 클릭(Windows는 shift + 복원 클릭)
5. ~/Libraries/iTunes/iPod Software Updates/에 백업되어 있는 1.1.1 이미지로 복원
6. iPod에서 safari 실행후 http://jailbreakme.com에서 Installer 설치
7. Installer 로 Tweaks(1.1.1)안에 있는 OktoPrep 설치
8. iTunes에서 1.1.2로 업데이트 후 iTunes 종료

9. 1.1.2용 jailbreak download 후 안에 있는 jailbreak.jar 더블클릭
(http://conceitedsoftware.com/iphone/site/112jb.html 에서 다운)
jail2.png
10. http://codedesign.tistory.com/16 에서 한글 입력기 설치
(두번의 재시동 꼭 지켜야 함 – 이거 땜에 복원만 두번함.)
10. http://repo.us.to에서 iPhone 용 프로그램 설치
11. Unix subsystem 설치
12. iPod touch 프로그램 설치 공간 확보 에 있는 글대로 설치 공간 확보
13. Perl설치
– Installer 로 perl 설치 (PATH에 대제로 추가되지 않는거 같음.)
– ssh 로 접속
– vi /etc/profile 에서 PATH opt/iphone/bin 추가

* 벽돌시 복구 방법 : http://blog.kimtree.net/19
더 보기 >>

[perl]콜라츠 추측(3n+1)

1월 10, 2007   //   alexken작성   //   기술  //  No Comments

콜라츠 추측 (Collatz conjecture)은 1937년에 처음으로 이 추측을 제기한 로타르 콜라츠의 이름을 딴 것으로 3n+1 추측, 울람 추측, 혹은 헤일스톤(우박) 수열 등 여러 이름으로 불린다. 콜라츠 추측은 임의의 자연수가 다음 조작을 거쳐 항상 1이 된다는 추측이다.

짝수라면 2로 나눈다.
홀수라면 3을 곱하고 1을 더한다.
1이면 조작을 멈추고, 1이 아니면 첫 번째 단계로 돌아간다.

무지 간단해 보이는 데 타이틀 까지 건 이유가 뭔지 궁금해 호기심에서 짜 보았다.
게다가 정말 간단해 보이는데 이문제가 NP 문제라는게 더욱이 그러했다.

내가 짠 perl code는 이렇다. (짜는데야 타이핑 시간 1분여가 소요되었지만, 원 문제를 곱씹어 보면서 영어 해석하는데 좀 시간이 걸렸다. 쉽다고 댐볐지만, 내용의 깊이는 그리 간단한게 아니었다.)

#!/usr/bin/perl
use strict;

sub three_n_plus_one($){
  my ($n) = @_;
  print $n . " ";
  exit 0 if $n == 1;

  if($n % 2 == 1){
    three_n_plus_one(3 * $n + 1);
  }else{
    three_n_plus_one( $n2 );
  }
}

sub main(){
  three_n_plus_one(22);
}

main();

문제의 특징은:

  • 가정: 자연수를 주면 반드시 끝난다.
  • 간단해 보이는 알고리즘에도 불구하고, 이 가정이 사실인지는 알려져있지 않다.(아직은??? 영원히…)
  • 0 < n < 1,000,000사이에서는 그렇다는게 알려져 있다.

이정도???….

여러 숫자를 넣어 보니, 원 글에서 처럼,
… 5 16 8 4 2 1 로 수렴하며 끝나긴 끝났다.

참고로, 입력이 1,000,000,000,000,000였을 때
결과는

더 보기 >>

Perl에서 Getopt::Std 사용하기

8월 30, 2006   //   alexken작성   //   기술  //  No Comments

Unix스타일의 프로그램 파라미터 처리를 해주는 모듈이 Getopt인데
자주 사용하다 보니 codesnipet으로 사용하려고, 내가 사용하는 템플릿을 여기에 등록해 둔다.

main::HELP_MESSAGE(), main::VERSION_MESSAGE()

를 구현해 두면 – -help, – -version 옵션에 반응하고, getopts(c:hv)에 사용할 옵션들을 나열하면 된다.
위 예에서 c뒤에 : 의 의미는 파라미터를 받는 다는 의미이다.
입력된 파라미터는 $Getopt::Std::opt_c로 사용할 수 있다.

#!/usr/bin/perl
# vim: set sw=4 ts=4 si et nu:

use strict;
use Getopt::Std;

########################################################
# Global settings
########################################################
$Getopt::Std::STANDARD_HELP_VERSION = 1;

sub main::VERSION_MESSAGE(){
  print "$0 Version 0.5 hyeonkwen@gmail.com";
}

sub main::HELP_MESSAGE(){
  print <<END;
Description of this program.
Usage: $0 OPTION DIRECTORY

OPTION
    -c             description of c option
    -h             view help message
    -v             view version information
END

}

########################################################
# main()
########################################################

sub main(){
  if(!getopts("c:hv") || $Getopt::Std::opt_h){
    main::HELP_MESSAGE();
    exit;
  }elsif($Getopt::Std::opt_v){
    main::VERSION_MESSAGE();
    exit;
  }
}

main();

Perl에 Hash는 없다???

6월 20, 2006   //   alexken작성   //   기술  //  3 Comments

Perl에서 array는

my @array = (1,2,3,4,5,6);

과 같이 정의하고 @를 앞에 붙여준다.
반면 hash는

my %capitals= ('china' => 'beijing', 'england' => 'london');

과 같이 정의하고 %를 붙여준다.

그리고 사용법은

my $a = $capitals{'china'};

$key로 $value 값을 읽어오는 문법이니, 영락없이 Java의 Hash Class같은 놈으로 생각하고 만 있었다…..
(array of ($key -> $val )) : 즉 각각의 $val을 refer하는 $key의 array

하지만 오늘 회사에서 perl로 hash를 함수의 인자로 넘기는데, 안넘어 가는 것이었다.

sub getHash(%){
  my %hash = %_;
  while ( my ($key, $val) = each (%hash)){}
}

가 안되는 것이다.
책을 뒤져봤는데도 없었다.

왜일까???

정답은 모든 Array와 Hash를 출력하는 두개의 함수를 보면 알수 있다.

use strict;

sub printHash(@){
  my %h = @_;

  while ( my ($key, $val) = each (%h))
  {
    print $key, " => ", $val, "\n";
  }
}

sub printArray(@){
  my @a = @_;
 
  print join("\n" , @a);
  print "\n";
}

그랬다. Perl에서 Hash는 Arrary 그 자체였다.

my %capitals= ('china' => 'beijing', 'england' => 'london');

my @capitals= ('china' , 'beijing' , 'england' , 'london' );

즉 둘중 아무렇게나 선언한뒤
%capitals라 선언하고 @captitals처럼 사용해도 되고,
반대로 @captitals로 선언하고, 이후에 %capitals처럼 써도 된다.

하지만 후자처럼 사용할 경우, 홀수개의 인자를 가진 array를 hash처럼 사용했을때 어떤 sideeffect 가 있는지 알수 없음.

Perl하는 사람중에서 나만 몰랐던 내용인가???
넘 당연한 거였나???
암튼 재미난거 하나 알았다.

블로그 카테고리

천체사진 갤러리