터미널의 플래시 카드

6398 단어 bashlinux
몇 주 전에 저는 Clojure에 웹 드라이버 앱을 작성하여 집합 웹사이트에서 디렉토리 정보를 가져왔습니다. 일반적인 생각은 이랬습니다.

I have trouble remembering names and faces. What if I had a flashcard system to help me memorize them?



하지만 끝내기 전에 지루해졌습니다.

리벤델 업데이트



저는 이번 주에 Elvish v0.17용 Rivendell 업데이트 작업에 열중했습니다. 나는 최근에 대부분의 기능적 부분을 포함하는 fun 모듈의 테스트 및 문서화를 완료했습니다. 문서here를 볼 수 있습니다.

흥미 있는 문서를 생성한 방법에 대한 또 다른 블로그 게시물이 있습니다.




Rivendell의 발전으로 지금이 플래시 카드 앱을 완성하기에 좋은 시기라고 생각합니다.

설정 지침



Rivendell은 현재 개발 중이므로 Elvish의 기능rsync을 사용하고 있습니다.

rivendell을 복제하고 update-for-0.17 분기로 전환합니다. 그런 다음 이 파일을 ~/.local/share/elvish/lib/dev/epm-domain.cfg에 넣습니다.

{
    "method": "rsync",
    "location": <path to rivendell parent directory>,
    "levels": "1"
}


그런 다음 이것을 ~/.config/elvish/rc.elv 에 추가하십시오.

use epm
epm:install &silent-if-installed=$true dev/rivendell
epm:upgrade dev/rivendell
use dev/rivendell/fun


마지막으로 Terminal Graphics Protocol 을 이해하는 터미널이 필요합니다. Kitty을 사용하겠습니다.

필요한 기능



Rivendell에서 필요한 함수는 shuffledestruct 입니다. 다음으로 이미지를 표시하는 방법이 필요합니다. 내 환경을 복제하려는 경우 이미지 표시를 위해 내rc.elv에 이 기능을 정의했습니다.

fn icat {|@a| kitty +kitten icat $@a }


다음으로 추측 점수를 매기는 방법이 필요합니다. 이를 위해 간단한 Levenshtein 함수를 정의해 보겠습니다. 낮은 점수가 더 좋습니다.

use dev/rivendell/base b
use dev/rivendell/fun f
use math

fn levenshtein {|w1 w2|
  var cell-value = {|same-char prev-row cur-row col-idx|
    math:min (b:inc $prev-row[$col-idx]) ^
             (b:inc (b:end $cur-row)) ^
             (+ (if $same-char { put 0 } else { put 1 }) ^
                $prev-row[(b:dec $col-idx)])
  }

  var row-idx = 1
  var max-rows = (b:inc (count $w2))
  var @prev-row = (range (b:inc (count $w1)))

  while (!= $row-idx $max-rows) {
    var ch2 = $w2[(b:dec $row-idx)]
    set row-idx = (b:inc $row-idx)
    set prev-row = (f:reduce {|cur-row i|
        var same-char = (eq $w1[(b:dec $i)] $ch2)
        b:append $cur-row ($cell-value $same-char $prev-row $cur-row $i)
    } [$row-idx] (range 1 (count $prev-row)))
  }

  b:end $prev-row
}


이 코드는 Elvish의 모듈aliasing feature을 활용하고 몇 가지 더 간단한 Rivendell 함수reduce를 보여줍니다.

이 코드를 levenshtein.elv라는 파일에 넣고 use ./levenshtein l로 가져왔습니다.

다음으로 이들을 하나로 묶는 기능이 필요합니다. 화려하지 않습니다. 방금 터미널에서 이것을 정의했습니다.

fn guess {|name image|
  icat $image; echo
  var guess = (read-line)
  var score = (l:levenshtein $name $guess)
  put $name $score
}


이제 모든 구성 요소가 있습니다. 이제 디렉터리 정보를 가져와서 추측 점수를 매기도록 하겠습니다.

플래시 카드 "앱" 실행



이것이 앱과 범주적으로 다른가요? 아마.

첫 번째 게시물에서 congr 프로젝트를 빌드한 후 다음을 실행합니다.

var @directory = (java -jar target/uberjar/congr-0.1.0-SNAPSHOT-standalone.jar site username password)


마지막 명령은 몇 초가 걸릴 수 있습니다.

다음으로 섞습니다.

var @shuffled = (each {|x| echo $x | from-json} $directory | fun:shuffle)


마지막으로 추측을 시작하십시오.

each (fun:destruct $guess~) $shuffled


개인 정보 보호를 위해 디렉토리의 실제 이름과 사진은 표시하지 않지만 knowyourmeme.com에서 모의 ​​정보가 포함된 스크린샷을 볼 수 있습니다.



결론



나는 항상 이 프로젝트를 위한 어리석고 단순한 터미널 "앱"을 구상했기 때문에 성공한 것 같습니다. 또한 Clojure와 Elvish가 협력하여 진정으로 해커다운 경험을 하게 해준 점에 감사드립니다.

행복한 해킹!

좋은 웹페이지 즐겨찾기