포켓몬 종족 값을 초속으로 확인할 수 있는 CLI 도구 만들기

포켓몬의 종족값 따위는 다 기억할 수 없어!


Pokemongal이 아니었다면 약 600종의 포켓몬스터의 종족치를 억지로 외우는 것은 상당히 어려웠을 것이다.
적어도 주류 포켓몬의 민첩함을 보여줘야 한다고 생각해도 포켓몬 대결에서 한 수 실수는 치명적이다.잘못 기억하면?그것도 실패의 원인이죠.
물론 기존 앱도 있지만 대전 시간이 엄격하고 속도도 중요해졌다.
그래서 나는 파시스트 파시스트처럼 포켓몬스터의 이름을 입력하고 종족치를 빠르게 확인할 수 있는 도구를 만들어 보았다(실제로 예전에 했던 것을 잊어버리고 기사를 쓰는 연습에서 소재로 삼았다).

sqlite3로 종족값표 만들기


문자로 종족치표를 만들고, 페코로 종족치표를 축소하는 방법도 쉽게 만들 수 있지만, 가까스로'HCD 합계가 가장 높은 포켓몬은?'이런 질문도 바로 대답할 수 있는 것처럼 미리 데이터베이스를 만들면 나중에 다른 도구를 만드는 꿈도 커진다.
책상은 이런 느낌으로 만들어 보았다.포켓몬 이름의 로마자 검색을 위해 primarykey에 로마자 이름을 입력하면 종족값 합계의 사용 빈도도 높아 SQL을 쓰기가 번거롭기 때문에 미리 계산해 넣는 것이 편리하다.너는 h와 a의 뜻을 알지?
create table status_list(
  jpromaji VARCHAR(255) primary key,
  jpname VARCHAR(255) not null,
  no integer not null,
  h integer not null,
  a integer not null,
  b integer not null,
  c integer not null,
  d integer not null,
  s integer not null,
  sum integer not null
);
데이터 원본은 전통적인 지원(yakkun.com)을 사용한다.
https://yakkun.com/swsh/stats_list.htm를 봉인하여 SQLpokemon.rb으로 변환해 보십시오.
노코지리로 커튼을 만들어 봤어요.또 로마자를 사용하기 때문에 로마지도 편리하다.
이렇게 curl https://yakkun.com/swsh/stats_list.htm | ruby pokemon.rb | sqlite3 pokemon언제든 다시 할 수 있으면 나중에 편할 거예요.(아푸다의 포켓몬이 늘어나기 때문이다...)
#! /usr/bin/env ruby

# curl https://yakkun.com/swsh/stats_list.htm | ruby pokemon.rb | sqlite3 pokemon
require 'nokogiri'
require 'romaji'

Encoding.default_external='euc-jp'
html = $stdin.read
doc = Nokogiri::HTML(html)
doc.css('.stupidtable > tbody > tr > td').each_slice(9) do |line|
  no, jpname, h, a, b, c, d, s, sum = line.map { |td| td.children.first.text }
  jpromaji = Romaji.kana2romaji(jpname)
  values = [
    no.to_i,
    "\"#{jpname}\"",
    "\"#{jpromaji}\"",
    h.to_i,
    a.to_i,
    b.to_i,
    c.to_i,
    d.to_i,
    s.to_i,
    sum.to_i,
  ]
  puts "insert into status_list (no, jpname, jpromaji, h, a, b, c, d, s, sum) values (#{values.join(',')}) on conflict(jpromaji) do nothing;"
end

CLI 툴을 함께 만들어 봅시다.


데이터베이스만으로도 충분히 편리하니 원래 목적의 CLI 도구를 만들어 보세요.
각 키보드가 작동하기를 원합니다io/console.
또한 sqlite3 명령open3을 내려야 하기 때문에 사용해야 합니다.sqlite3에만 LINE 검색을 수행합니다.
ANSI 도피 시퀀스.
그나저나 ANSI 회피 서열여기 기사.은 이해하기 쉬우니 감사합니다.
스크립트는 매우 신경을 쓰는 것 같지만, 표시 방식을 바꿀 수 있는 옵션만 보존되어 있습니다.
#! /usr/bin/env ruby

require 'io/console'
require 'open3'

sqlite_argument = ARGV[0] || '-list'

class Cursor
  def move_top
    print "\e[0H"
  end

  def line_on(i)
    print "\e[#{i}G"
  end

  def clear_line
    line_on(0)
    print "\e[2K"
  end

  def clear_after
    print "\e[0J"
  end

  def clear_all
    print "\e[2J"
  end
end

cursor = Cursor.new
columns = "jpname,jpromaji,h,a,b,c,d,s"
query_template = "select #{columns} from status_list where jpromaji LIKE \"%%%s%%\" limit 10"
cursor.clear_all
buff = []

$stdin.raw do |stdin|
  while true
    cursor.move_top
    cursor.clear_line
    print "> #{buff.join}"
    case c = stdin.getc
    when "\r", "\n"
      buff.clear
      cursor.clear_after
      next
    when "\u007F"
      # backspace
      buff.pop
    when "\u0003", "\u0004"
      # CTRL+C or CTRL+D
      exit 0
    else
      buff << c
    end
    puts

    query = sprintf(query_template, buff.join)
    ## debug
    # cursor.clear_line
    # puts query
    cursor.clear_line
    puts columns
    out, _status = Open3.capture2e("sqlite3 #{sqlite_argument} pokemon", stdin_data: query)
    out.each_line do |line|
      cursor.clear_line
      puts line
    end
    cursor.clear_after
  end
end

구실


괜찮은 gif 애니메이션을 붙일 수 있었으면 좋겠는데 ttygif에서 좋은 조작 인상을 주지 못했어요...

좋은 웹페이지 즐겨찾기