Shell Scriptで書かれた作業時間管理ツールをPerlに書き直す (序章)

これはPerl Advent Calender 2017 20日目の記事です。

広告

YAPC::Okinawaは現在,カンファレンス参加チケット・トークプロポーザルを絶賛募集中です!

yapcjapan.org

この広告は,90日以上更新されていないブログにのみなんちゃらかんちゃr

はじめに

普段は南の島の大学の4年生やってます。絶賛卒業研kうっ...頭が..(ノートはここで途切れているようだ...)

よくバイトや研究をしていて,作業の開始時間と終了時間を簡単に記録できたらいいななんて思うことがありました。 Terminalで簡単に管理できる作業時間ツールでも作るか,と意気込んでいたその時。

タイミングよく友人がShell Scriptでそのツールを書いていたので,勉強がてらそれをPerlに書き直すことにしようと決めました(┐「ε:)

友人の作成した作業時間管理ツールがこちら。

github.com

checkは研究時間を記録するために作られました。基本的な使い方は指定したプロジェクトにcheck-in, check-outをするというシンプルな機能です。複数のプロジェクトに対応しているので毎日の活動を記録するのに最適です。check-inした後もバックグラウンドで動いていないのでコンピュータを再起動したりしても問題ありません。

ふむふむ,すごい(語彙ry..

Perlへ移行

僕がPerlで書き直す上で年内に移行したい機能たち

  1. check man
    使い方を表示してくれる help みたいなもの

  2. check in <project_name>
    作業時間の記録を開始。

  3. check out
    作業時間の記録を終了。


今回は序章ということもあり(オイオイ...),項目1. check manまでの移行に関してまで書きます。
生暖かい目で見守っていただけますと幸いです。

manオプションの移行

書き直す前のShell Scriptではこんな感じ
- 受け取ったオプションを if 文で分岐かけてそれぞれの処理に流す感じ。

main() {
  #$1がないなら終了する
  check_nonactive $1
  #コマンドの実行環境の確認
  check_database

  #$HOME/checkに移動する((
))  cd $dirpath
  #実行状態の確認
  if [ $1 = "in" ] ; then
    check_in  $1 $2

  elif [ $1 = "out" ] ; then
    check_out

~~ 省略 ~~
  
  elif [ $1 = "man" ] ; then
    check_man
  fi

  #元のディレクトリに移動する
  cd - > /dev/null
}

main $1 $2 $3

ひとまず,terminal上で check <オプション> てな感じでやりたい。 モジュールを自分で作って使ってみたいなとか考えて,Shell で書かれたものとは違うファイル構成にしました。下図がその構成f:id:sorehaedamame:20171220004113p:plain

CLI/ 以下にIN, OUT, Man, etc...とオプションごとに作る予定です。 と,ここで書き直した様子を。。

まずpcheck というファイルがこんな感じで。

1 #!/usr/bin/env perl
2 use File::Spec;
3 use Cwd 'getcwd';
4 unshift @INC, File::Spec->catfile(getcwd, "lib");
5 require Check::CLI;
6 
7 exit Check::CLI->commands(@ARGV);

モジュールが入ってる lib のPATHを@INCに入れてあげる。
最後に exit Check::CLI->commands(@ARGV); で入力したオプションをCLI.pmに渡してあげる

package Check::CLI;

use strict;
use warnings;
use utf8;
use Data::Printer;
use Check::CLI::Man;


sub commands {
    my ($self,$function,$project_name) = @_;

    exit print "check requires function name!\n" unless defined($function);

    # function によって,実行処理を変更
    for ($function) {
        # function が man なら各コマンドの説明
        if (/man/) {
            exit Check::CLI::Man->man();
                }elsif (/IN/){
                        # check in の処理
                }elsif (/OUT/){
                        # check out の処理
                }
    }
}


1;

$functionが定義済みか確認 受け取ったオプションが何か判断して,それぞれの処理を行うモジュールへ。

package Check::CLI::Man;

use strict;
use warnings;
use utf8;
use feature qw/say/;

sub man {
    my $self = shift;
    say " ";
    say "  check is a easy time logger tool.";
    say " ";
    say "    check has some functions.";
    say "      check in [project] : You can start logging time.";
    say "      check out : You can stop time logging.";
    say " ";
}

1;

man()が呼ばれたらとりあえず使い方をsaysaysayしていく。
これで簡単にmanオプションまでは移行しました。
現在はcheck-inの機能の移行を進めているのですが,SQL周りで苦戦してます。
現在移行中のリポジトリがこちら⬇︎

github.com

広告

YAPC運営ブログも更新中です!
移動手段や沖縄の美味しい料理のお店,治安のないお土産の情報などについても公開しております!
現在トークも絶賛募集中です!皆さん是非お応募しましょう!

docs.google.com

検討事項

  • SQLite3辛い....
    ただひたすらに書いて慣れるしかないんだ...( 返事がない,ただのしかばねのようだ )
  • Moo要素をどこに盛り込もうか
    実は当初の目的は, Mooを使って移行するぞ!っていう意気込みの元移行に取り掛かっていました....でも書いてるうちに,あれ,これMoo使わないで動くのでは?.....( use Moo; を消すたばの姿 ) あ....動いた...うっうっ...
    ドキュメントの流し見よくないですね。気をつけます。

最後に

ここまで読んでくださりありがとうございます。
年末に移行を終えたらブログを続けて書こうと思ってます。
( 投稿されなかったら誰か「移行終わった?」とか「ブログ書いた?」とかもうどんどんナイフを投げてください。)

明日はbooksさんです!お楽しみに!