간단한 문제 해결

저는 Perl을 많이 씁니다. 현재 저는 성공적인 금융 비즈니스를 이끄는 오래된 Perl 코드베이스를 유지 관리하는 고객을 위해 일주일에 이틀을 보내고 있습니다. 다른 요일에는 장차 비즈니스로 전환되기를 바라는 대규모 Dancer 애플리케이션을 작성하고 있습니다. 그러나 때로는 Perl을 사용하여 더 간단한 문제를 해결하는 것도 재미있습니다. 오늘 아침에 제가 15분 정도를 보낸 방법입니다.

일하면서 음악을 듣습니다. 재택근무의 즐거움 중 하나는 방을 음악으로 가득 채울 수 있고 헤드폰을 끼지 않아도 된다는 것입니다. 나는 한 번에 두 시간 동안 한 아티스트의 음악을 듣는 경향이 있습니다. "Hey Google, [누군가]의 음악 틀어 줘"라고 말하고 다른 음악이 마음에 들 때까지 듣습니다.

그러나 약간의 틀에 박히기 쉽습니다. 나는 내가 네다섯 명의 아티스트를 듣는 데 많은 시간을 보냈고, 따라서 내가 즐겨 듣는 다른 모든 아티스트를 무시했다는 것을 알아차렸습니다. 오늘 아침에 나는 그 문제를 해결할 수 있는 방법에 대한 아이디어가 있었습니다.

나는 약 15년 ​​동안 대부분의 청취를 스크로블링했습니다. 모르는 사람들을 위해 "스크로블링"은 외부 서비스를 사용하여 듣고 있는 내용을 기록하여 시간이 지남에 따라 듣는 사람에 대한 정확한 그림을 구축하는 행위입니다. 나는 Last.FM을 사용하고 당신은 그들의 사이트에서 what I've been listening to을 볼 수 있습니다.

사이트의 다른 페이지에는 my scrobbles by artist for all time 가 표시됩니다. 거기에서 최근 나에게 너무 많은 관심을 받고 있는 아티스트를 쉽게 찾을 수 있습니다.

그래서 저는 이 문제를 해결하기 위해 Perl 프로그램을 작성하기로 결정했습니다. 기본 디자인은 이랬습니다.
  • 내 "아티스트 scrobbled"페이지를 스크랩하여 아티스트 목록과 scrobbles 수를 가져옵니다.
  • 1,000개가 넘는 낙서가 있는 것은 모두 무시하십시오(제가 너무 많이 듣는 아티스트이기 때문에)
  • 500개 미만의 scrobble이 있는 모든 항목을 무시합니다(내가 그 아티스트를 얼마나 좋아하는지 잘 모르기 때문에).
  • 나머지 목록에서 무작위로 아티스트를 선택하십시오

  • 쓰는 데 오래 걸리지 않았습니다. code is on GitHub 그리고 나는 그것을 아래에 재현했습니다.

    #!/usr/bin/perl
    
    use strict;
    use warnings;
    use feature 'say';
    
    use HTML::TreeBuilder;
    
    my $username = shift || 'davorg';
    my $url = "https://www.last.fm/user/$username/library/artists";
    
    my $tree = HTML::TreeBuilder->new_from_url($url);
    
    my ($table) =  $tree->look_down(
      class => qr/\bchartlist\b/,
    );
    
    my @artists;
    
    my @rows = $table->look_down(_tag => 'tr', class => qr/chartlist-row/);
    for (@rows) {
      my $name = $_->look_down(_tag => 'td', class => qr/chartlist-name/);
      my $count = $_->look_down(_tag => 'span', class => qw/chartlist-count-bar-value/);
      my $x = $count->content->[0] =~ s/,//gr;
    
      next if $x >= 1000 or $x <= 500;
    
      push @artists, $name->look_down(_tag => 'a')->content->[0];
    }
    
    say $artists[ rand @artists ];
    


    나는 HTML::TreeBuilder 주초에 그 존재를 상기했기 때문에 사용했지만 솔직히 그것이 최선의 선택이었다고 확신하지 못합니다. 어느 시점에서 Web::Scraper과 같은 것을 사용하여 다시 작성할 수도 있습니다.

    그리고 이 글을 쓰면서 "Last.FM에 API가 있지 않습니까? 내가 그것을 사용했어야 하는 것 아닌가?"라고 생각합니다. (답변: yes it does 네, 그렇게 해야 합니다. 그래서 앞으로 수정해야 할 또 다른 문제입니다.)

    하지만 어쨌든 오늘 아침에 15분 만에 함께 던진 것입니다. 그것은 효과가 있으므로 많은 일을 할 동기가 별로 없습니다.

    나는 그것이 다른 사람에게 유용할 것이라고 기대하지 않았기 때문에 그것에 대해 트윗하는 것을 귀찮게 하지도 않았습니다. 그러나 오래지 않아 나는 그가 기본 논리를 취하고 실제로 음악을 재생하기 위해 Audio::MPD을 사용하는 프로그램의 기본으로 사용했다고 말했습니다.

    그래서 나는 그것에 대해 블로그에 올리겠다고 생각했습니다. a) 생각보다 유용하다는 것이 밝혀지고 b) 강력한 프로그래밍 언어를 사용하여 내 인생의 사소한 문제를 해결하는 기쁨을 공유하고 싶었기 때문입니다.

    삶을 개선하기 위해 Perl을 어떻게 사용합니까?

    업데이트: Last.FM API를 사용하도록 다시 작성하는 것을 거부할 수 없었습니다. 지금이 훨씬 멋져 보입니다.

    #!/usr/bin/perl
    
    use strict;
    use warnings;
    use feature 'say';
    
    use Net::LastFM;
    
    my $username = shift || 'davorg';
    my $method   = 'user.getTopArtists';
    
    my $lastfm = Net::LastFM->new(
      api_key    => $ENV{LASTFM_API_KEY},
      api_secret => $ENV{LASTFM_SECRET},
    );
    
    my $data = $lastfm->request_signed(
      method => $method,
      user   => $username,
    );
    
    my @artists;
    
    for (@{$data->{topartists}{artist}}) {
      next if $_->{playcount} >= 1000;
      next if $_->{playcount} <= 500;
    
      push @artists, $_->{name};
    }
    
    say $artists[ rand @artists ];
    


    물론 이제 Last.FM API key 에 등록해야 합니다.

    좋은 웹페이지 즐겨찾기