Jeen - Yet anothere techlog

STFUAWSC

App::Zamakist…

취미라고 할 것이 있다면 잠, 책, 드라마감상 정도라고 할까요.

걔중에 몇몇 미드들을 아직까지 꾸준하게 시간을 내면서 보고 있습니다.

걔중에는 가끔보면 자막이 없어서 일일이 자막찾으러 들어가고 받고 해야하는 지루한 클릭이 필요한 경우도 있습니다.

윈도라면 곰플레이어 로 이런 부분의 수고가 조금 줄어들기는 하지만 Mac 에서 Movist 를 통해서 주로 영상을 감상하려면 심히 신경쓰이지 않을리 없습니다.

그러니까 7월 20일경에 일단 이런 문제를 겪어서 잠깐 깨작거려서 만들어보기는 했지만 대놓고 앞에 내놓기도 그렇고해서 그냥 보류했었는데요. 뭐 물론 여전히 앞에 내놓는 게 좀 그렇기는 합니다.

일련의 과정을 말하자면…

bash $ ls -la
total 0 drwxr-xr-x 12 jeen staff 408 8 9 13:45 . drwxr-xr-x+ 52 jeen staff 1768 8 9 13:45 .. -rw-r—r— 1 jeen staff 0 8 9 13:45 NCIS.Los.Angeles.S03E01.720p.HDTV.X264-DIMENSION.avi -rw-r—r— 1 jeen staff 0 8 9 13:45 NCIS.Los.Angeles.S03E02.720p.HDTV.X264-DIMENSION.avi -rw-r—r— 1 jeen staff 0 8 9 13:45 NCIS.Los.Angeles.S03E03.720p.HDTV.X264-DIMENSION.avi -rw-r—r— 1 jeen staff 0 8 9 13:45 NCIS.Los.Angeles.S03E04.720p.HDTV.X264-DIMENSION.avi -rw-r—r— 1 jeen staff 0 8 9 13:45 NCIS.Los.Angeles.S03E05.720p.HDTV.X264-DIMENSION.avi -rw-r—r— 1 jeen staff 0 8 9 13:45 NCIS.Los.Angeles.S03E06.720p.HDTV.X264-DIMENSION.avi -rw-r—r— 1 jeen staff 0 8 9 13:45 NCIS.Los.Angeles.S03E07.720p.HDTV.X264-DIMENSION.avi -rw-r—r— 1 jeen staff 0 8 9 13:45 NCIS.Los.Angeles.S03E08.720p.HDTV.X264-DIMENSION.avi -rw-r—r— 1 jeen staff 0 8 9 11:44 NCIS.Los.Angeles.S03E09.720p.HDTV.X264-DIMENSION.avi -rw-r—r— 1 jeen staff 0 8 9 09:29 NCIS.Los.Angeles.S03E10.720p.HDTV.X264-DIMENSION.avi

이렇게 뭐 디렉토리에 영상자료들이 널부러져 있습니다. 하지만 자막은 없죠.

bash $ zamakist —dir . Found 10 subscriptions ┌────┬──────────────────────────────────────────────────────┐ │ id │ filename │ ├────┼──────────────────────────────────────────────────────┤ │ 1 │ NCIS.Los.Angeles.S03E01.720p.HDTV.X264-DIMENSION.avi │ │ 2 │ NCIS.Los.Angeles.S03E02.720p.HDTV.X264-DIMENSION.avi │ │ 3 │ NCIS.Los.Angeles.S03E03.720p.HDTV.X264-DIMENSION.avi │ │ 4 │ NCIS.Los.Angeles.S03E04.720p.HDTV.X264-DIMENSION.avi │ │ 5 │ NCIS.Los.Angeles.S03E05.720p.HDTV.X264-DIMENSION.avi │ │ 6 │ NCIS.Los.Angeles.S03E06.720p.HDTV.X264-DIMENSION.avi │ │ 7 │ NCIS.Los.Angeles.S03E07.720p.HDTV.X264-DIMENSION.avi │ │ 8 │ NCIS.Los.Angeles.S03E08.720p.HDTV.X264-DIMENSION.avi │ │ 9 │ NCIS.Los.Angeles.S03E09.720p.HDTV.X264-DIMENSION.avi │ │ 10 │ NCIS.Los.Angeles.S03E10.720p.HDTV.X264-DIMENSION.avi │ └────┴──────────────────────────────────────────────────────┘ Continue to download? [y/n] y Downloaded 10 subscriptions

그래서 뭐 App::Zamakist 라는 모듈을 사용하면 뭐 이렇게 자막을 한꺼번에 다운받을 수 있다 뭐 이런 거죠.

bash $ ls -la total 1592 drwxr-xr-x 22 jeen staff 748 8 9 13:46 . drwxr-xr-x+ 52 jeen staff 1768 8 9 13:46 .. -rw-r—r— 1 jeen staff 0 8 9 13:45 NCIS.Los.Angeles.S03E01.720p.HDTV.X264-DIMENSION.avi -rw-r—r— 1 jeen staff 63779 8 9 13:46 NCIS.Los.Angeles.S03E01.720p.HDTV.X264-DIMENSION.smi -rw-r—r— 1 jeen staff 0 8 9 13:45 NCIS.Los.Angeles.S03E02.720p.HDTV.X264-DIMENSION.avi -rw-r—r— 1 jeen staff 75041 8 9 13:46 NCIS.Los.Angeles.S03E02.720p.HDTV.X264-DIMENSION.smi -rw-r—r— 1 jeen staff 0 8 9 13:45 NCIS.Los.Angeles.S03E03.720p.HDTV.X264-DIMENSION.avi -rw-r—r— 1 jeen staff 84915 8 9 13:46 NCIS.Los.Angeles.S03E03.720p.HDTV.X264-DIMENSION.smi -rw-r—r— 1 jeen staff 0 8 9 13:45 NCIS.Los.Angeles.S03E04.720p.HDTV.X264-DIMENSION.avi -rw-r—r— 1 jeen staff 78550 8 9 13:46 NCIS.Los.Angeles.S03E04.720p.HDTV.X264-DIMENSION.smi -rw-r—r— 1 jeen staff 0 8 9 13:45 NCIS.Los.Angeles.S03E05.720p.HDTV.X264-DIMENSION.avi -rw-r—r— 1 jeen staff 94809 8 9 13:46 NCIS.Los.Angeles.S03E05.720p.HDTV.X264-DIMENSION.smi -rw-r—r— 1 jeen staff 0 8 9 13:45 NCIS.Los.Angeles.S03E06.720p.HDTV.X264-DIMENSION.avi -rw-r—r— 1 jeen staff 98759 8 9 13:46 NCIS.Los.Angeles.S03E06.720p.HDTV.X264-DIMENSION.smi -rw-r—r— 1 jeen staff 0 8 9 13:45 NCIS.Los.Angeles.S03E07.720p.HDTV.X264-DIMENSION.avi -rw-r—r— 1 jeen staff 76016 8 9 13:46 NCIS.Los.Angeles.S03E07.720p.HDTV.X264-DIMENSION.smi -rw-r—r— 1 jeen staff 0 8 9 13:45 NCIS.Los.Angeles.S03E08.720p.HDTV.X264-DIMENSION.avi -rw-r—r— 1 jeen staff 94320 8 9 13:46 NCIS.Los.Angeles.S03E08.720p.HDTV.X264-DIMENSION.smi -rw-r—r— 1 jeen staff 0 8 9 11:44 NCIS.Los.Angeles.S03E09.720p.HDTV.X264-DIMENSION.avi -rw-r—r— 1 jeen staff 69537 8 9 13:46 NCIS.Los.Angeles.S03E09.720p.HDTV.X264-DIMENSION.smi -rw-r—r— 1 jeen staff 0 8 9 09:29 NCIS.Los.Angeles.S03E10.720p.HDTV.X264-DIMENSION.avi -rw-r—r— 1 jeen staff 55905 8 9 13:46 NCIS.Los.Angeles.S03E10.720p.HDTV.X264-DIMENSION.smi

뭐 일단 CPAN 에 올릴 생각도 없는 토이모듈 겸 생활용품 모듈이라서…

아 물론 자막검색은 GOM 자막을 애용하고 있습니다.

검색방식은 뭐 파일이름에서 확장자만 떼서 검색날려서 뭐 여차저차해서 파일다운로드 하는 링크 빼서 일괄 다운로드 하는 것이죠.

이제 시작하려는 미드가 있는데 자막이 없다면 이거 한번만 돌려주면 앞으로 자막찾는 수고없어지겠습니다. :–)

Export Facebook Event Attending List - Perl-kr TeaTime

지난번 1회 티타임때의 문제가 제대로 참가비 징수를 못해서 비용정산에 어려움이 있었는데, 이 문제를 해결하기 위해서 간단하게 참가자 리스트를 A4 용지로 뽑아내서 체크하도록 하는 건 어떨까 하는 생각이 있었습니다.

아무튼 그런 생각을 잠깐 했다가 해볼까 해서 아래처럼 코드를 써넣었습니다.

~~~ use strict; use warnings; use Text::Xslate; use Data::Section::Simple; use Facebook::Graph;

my $fb = Facebook::Graph->new; $fb->access_token(“YOUR ACCESS TOKEN”); my $r = $fb->fetch(‘466164950078338/attending’); my @attendees; for my $person (@{ $r->{data} }) {

my $f = $fb->fetch($person->{id});
$f->{profile_image} = $fb->picture($person->{id})->get_large->uri_as_string;  
push @attendees, $f;

} push @attendees, {} for (1..3);

my $tx = Text::Xslate->new(

syntax => 'TTerse',
module => \[ 'Text::Xslate::Bridge::TT2Like' \],
path => \[
    Data::Section::Simple->new()->get_data_section()
\],

);

print $tx->render(‘template.tx’, { attendees => \@attendees });

DATA

@@ template.tx #perl-kr 티타임 #2

※ #perl-kr 티타임 #2

 <thead>
   <tr>
     <th class="span1">&nbsp;</th>
     <th class="span1">&nbsp;</th>
     <th class="span2">Name</th> 
     <th class="span1">Attend?</th>
   </tr>
 </thead>
 <tbody>
   \[% FOREACH p IN attendees %\]
   <tr>
     <td>\[% loop.count %\]</td>
     <td><img src="\[% p.profile_image %\]" width="30" height="30" /></td>
     <td>\[% p.name %\]\[% IF p.username %\](\[% p.username %\])\[% END %\]</td> 
     <td></td>
   </tr>
   \[% END %\] 
 </tbody>

@@ css.tx table { max-width: 100%; border-collapse: collapse; border-spacing: 0; }

.table { width: 100%; margin-bottom: 18px; } .table th, .table td { padding: 8px; line-height: 18px; text-align: left; vertical-align: top; border-top: 1px solid #ddd; } .table th { font-weight: bold; } .table thead th { vertical-align: bottom; } .table thead:first-child tr th, .table thead:first-child tr td { border-top: 0; } .table tbody + tbody { border-top: 2px solid #ddd; } .table-condensed th, .table-condensed td { padding: 4px 5px; }

.table-bordered { border: 1px solid #ddd; border-collapse: separate; *border-collapse: collapsed; -webkit-border-radius: 4px; -moz-border-radius: 4px; border-radius: 4px; } .table-bordered th + th, .table-bordered td + td, .table-bordered th + td, .table-bordered td + th { border-left: 1px solid #ddd; } .table-bordered thead:first-child tr:first-child th, .table-bordered tbody:first-child tr:first-child th, .table-bordered tbody:first-child tr:first-child td { border-top: 0; } .table-bordered thead:first-child tr:first-child th:first-child, .table-bordered tbody:first-child tr:first-child td:first-child { -webkit-border-radius: 4px 0 0 0; -moz-border-radius: 4px 0 0 0; border-radius: 4px 0 0 0; } .table-bordered thead:first-child tr:first-child th:last-child, .table-bordered tbody:first-child tr:first-child td:last-child { -webkit-border-radius: 0 4px 0 0; -moz-border-radius: 0 4px 0 0; border-radius: 0 4px 0 0; } .table-bordered thead:last-child tr:last-child th:first-child, .table-bordered tbody:last-child tr:last-child td:first-child { -webkit-border-radius: 0 0 0 4px; -moz-border-radius: 0 0 0 4px; border-radius: 0 0 0 4px; } .table-bordered thead:last-child tr:last-child th:last-child, .table-bordered tbody:last-child tr:last-child td:last-child { -webkit-border-radius: 0 0 4px 0; -moz-border-radius: 0 0 4px 0; border-radius: 0 0 4px 0; } .table-striped tbody tr:nth-child(odd) td, .table-striped tbody tr:nth-child(odd) th { background-color: #f9f9f9; }

.table tbody tr:hover td, .table tbody tr:hover th { background-color: #f5f5f5; }

table .span1 { float: none; width: 44px; margin-left: 0; } table .span2 { float: none; width: 124px; margin-left: 0; } table .span3 { float: none; width: 204px; margin-left: 0; } table .span4 { float: none; width: 284px; margin-left: 0; } table .span5 { float: none; width: 364px; margin-left: 0; } table .span6 { float: none; width: 444px; margin-left: 0; } table .span7 { float: none; width: 524px; margin-left: 0; } table .span8 { float: none; width: 604px; margin-left: 0; } table .span9 { float: none; width: 684px; margin-left: 0; } table .span10 { float: none; width: 764px; margin-left: 0; } table .span11 { float: none; width: 844px; margin-left: 0; }

table .span12 { float: none; width: 924px; margin-left: 0; } ~~~

급작스레 한 작업이라 그냥 간단히 HTML 로 뽑아버렸지만… 사실 꿈은 좀 더 아름다운 레이아웃으로 뙇하고 나와줬으면 했었지요.

일단 예정 참가자 이외에 예상치못한 참가자가 있을 것을 염두해서 3개정도의 행을 더 추가해주었구요;;

Text::Xslate + Data::Section::Simple 의 조합은 파일하나에 우걱우걱 템플릿까지 끼워넣고 이럴 경우에는 아주 좋았습니다.

CSS 도 그냥 별도의 섹션으로 나눠서 INCLUDE 해버릴 수도 있으니 :–)

Facebook::Graph 모듈은 생각보다 좀 변태같습니다. 그 이유는 Facebook Graph API 도 변태같다는 근본적인 …. 그리고 Access Token 은 뭐 적당하게 Developer 페이지 가서 줏어서 넣었습니다. :–)

MySQL::Diff - a vs B

최근에 유지보수 관련 일로 골머리를 싸고 있다가 겨우겨우 마무리하고 있는 일이 하나 있었습니다.

PHP 프로젝트였는데, 유지보수 관련해서 여러가지 이슈들이 나오기 마련이고, 그 때문에 잘 움직이던 기존의 DB구조를 변경해줄 필요가 있었습니다.

뭐 테이블을 추가하거나, 어떤 컬럼의 형식을 변경하거나, 혹은 인덱스를 추가하거나 하는 뭐 이런 경우 말이죠.

처음에는 개발환경아래에서 기존의 product 환경에서 운용중인 DB를 dump 떠와서 진행하고, 프로젝트를 진행하면서 변경되는 SQL 내용들을 일일이 적어주었습니다. 그러다가 뭐 이사람 저사람 손을 옮겨타다가 결국 최종 마무리단계에서 어떤 컬럼이 변경되었는지, 어떤 테이블이 추가되었는지에 대한 확신을 할 수 없었습니다.

그래서 기록된 SQL 을 기반으로 눈과 손으로 검수를 해야하는 지경에서 결국 실수가 생기기 마련이죠. 그리고 클레임이 발생했습니다.

자, 그럼 어떻게 하면 이런 상황에서 사태를 수습하느냐… 고심했습니다.

그 결과 혹시 이거라면 해서 찔러본 것이 빙고 였던 것이 MySQL::Diff 였습니다.

맨처음 덤프떠온 DB 를 DB_A 로 지정하고, 최종적으로 개발이 종료된 DB 를 DB_B 라고 놓습니다.

DB_ADB_B 를 서로 비교하는 것이죠. 그걸을 위해서 MySQL::Diff 모듈이 사용됩니다.

~~~ bash $ mysqldiff —host1 localhost —user1 root —password1 whatthehell —host2 localhost —user2 root —password2 whatthehell bto bto_test

mysqldiff 0.43

Run on Wed Jul 18 18:26:39 2012

Options: password2=whatthehell, password1=whatthehell, user1=root, host2=localhost, debug=0, host1=localhost, user2=root

#

—– db: bto (host=localhost user=root)

+++ db: bto_test (host=localhost user=root)

ALTER TABLE auth DROP COLUMN updated_on; # was datetime NOT NULL DEFAULT ‘0000-00-00 00:00:00’ ALTER TABLE auth DROP COLUMN created_on; # was datetime NOT NULL DEFAULT ‘0000-00-00 00:00:00’ ALTER TABLE auth ADD UNIQUE passwd (passwd); CREATE TABLE test1 ( test1 int(11) NOT NULL ) ENGINE=MyISAM DEFAULT CHARSET=utf8; ~~~

위처럼 컬럼의 삭제, 인덱스의 추가, 테이블의 추가 등 모든 변경 내역들이 나오게 됩니다.

다음부터는 이처럼 좀 더 간단하고 확실하게 할 수 있는 방법을 취해야 되겠습니다.