Kindle E-Ink 도움말 - 임의의 이미지 파일 표시

Kindle E-Ink 도움말 - 임의의 이미지 파일 표시

저는 이 분야에 완전히 익숙하지 않지만 탈옥된 Kindle 3(e-reader)에 다른 사람의 코드를 적용하려고 합니다.

다음 코드를 사용하여 0과 X(여기서 X는 내가 가지고 있는 이미지 수, 현재 33) 사이의 임의의 숫자를 생성하여 몇 시간마다(현재는 2시간마다) 임의의 이미지를 표시할 수 있습니다.cron스크립트를 실행합니다.

#generate random number between my 33 images (compatible with busybox)
n=32
while [ $n -ge 32 ]; do
n=1$(</dev/urandom tr -dc 0-9 | dd bs=5 count=1 2>/dev/null)
n=$((n-100000))
done
ImageNumber=$n

#My images are numbered as follows - pic_0.png, pic_1.png, pic_3.png... etc
SelectedImage=$( find /mnt/us/timelit/images/pic_${ImageNumber}*.png)

# clear the screen
eips -c

# show that image
eips -g $SelectedImage

작동하지만 해결해야 할 몇 가지 문제가 있습니다.

1) 스크립트의 난수 생성 부분이 숫자를 생성하기 전에 시간이 지남에 따라 변경되기 때문에 문제가 있는 것 같습니다(아래 로그 참조).

14:00:02: Script started
14:02:43: Random number is 2 
14:02:44: Image shown is pic_2.png 
15:00:02: Script started
15:00:19: Random number is 18 
15:00:20: Image shown is pic_18.png 
16:00:01: Script started
16:02:44: Random number is 10 
16:02:45: Image shown is pic_10.png  

2) Kindle에서는 이미지 중 하나가 아닌 빈 화면이 표시되는 경우가 있습니다. 생성된 난수에 문제가 있는 것 같습니다. 즉, 일치하는 숫자가 있는 PNG를 찾을 수 없어서 Kindle이 공백으로 표시됩니다.

어떤 도움이라도 대단히 감사하겠습니다.

답변1

#generate random number between my 33 images (compatible with busybox)
n=32
while [ $n -ge 32 ]; do
n=1$(</dev/urandom tr -dc 0-9 | dd bs=5 count=1 2>/dev/null)
n=$((n-100000))
done
ImageNumber=$n

따라서 여기서는 00000-99999의 난수를 생성하고 32 미만으로 떨어질 때만 종료됩니다. 확률은 100,000에 32입니다. 선행 0이 8진수로 해석되면 잘못된 산술 표현식 문제가 발생할 수도 있습니다. (편집: 아, 그래서 앞에 1을 추가한 것 같아요)

어쨌든...종료하는 데 시간이 좀 걸릴 것 같아요. 그리고 $RANDOM%32더 작은 숫자(0-32767로 제한)에 $RANDOM잘 작동하는 .

$RANDOMKindle의 비지박스(아마도 그럴 것임)에 없는 경우 CONFIG_ASH_RANDOM_SUPPORT=n...를 사용하여 단일 번호를 얻 tr거나 hexdump사용 가능한 경우 그냥 사용할 수 있습니다.

그럼에도 불구하고 while 루프는 매우 비효율적이고 무의미합니다.

루프가 없는 예:

random=1$(</dev/urandom tr -dc 0-9 | dd bs=5 count=1 2>/dev/null)
ImageNumber=$(($random % 32))

tr원하는 것보다 5개의 임의 바이트를 더 읽어야 하기 때문에 여전히 약간 비효율적입니다 (숫자 읽기 기회 256개 중 10개).

가능한 경우 hexdump(고정된 무작위 3바이트 읽기):

 random=0x$(hexdump -v -e '3/1 "%02x"' -n 3 /dev/urandom)
 ImageNumber=$(($random % 32))
#My images are numbered as follows - pic_0.png, pic_1.png, pic_3.png... etc
SelectedImage=$( find /mnt/us/timelit/images/pic_${ImageNumber}*.png)

ImageNumber가 1이면 표현식은 pic_1*.pngwhich might be but is pic_1.png등으로 변환됩니다. 파일 이름에 추가 문자가 없으면 *를 제거하십시오. 그렇지 않으면 다른 구분 기호가 필요합니다(유사한 파일 이름을 허용하려면).pic_10-19.pngpic-100-199.pngpic_${ImageNumber}_*.pngpic_1_spaceship.png

어느 쪽이든 조회를 건너뛰고 표현식을 직접 사용할 수 있습니다.

eips -g /mnt/us/timelit/images/pic_${ImageNumber}.png

답변2

바라보다프로스트슈츠의 답변코드가 제대로 작동하지 않는 이유 나는 다양한 해결책을 제시할 것이다.

BusyBox 환경에 awk가 포함된 경우 이 애플리케이션에 적합한 난수를 생성하는 더 쉬운 방법은 다음과 같습니다.

awk -v n=32 'BEGIN {srand(); print int(rand() * n); exit}'

srand()가장 가까운 초 단위로 반올림된 현재 시간만을 기준으로 하므로 많은 경우에 부적절합니다(보안과 관련된 모든 것, 초당 한 번 이상의 무작위 추첨이 있을 수 있는 모든 것). 하지만 여기서는 충분히 괜찮습니다.

각 사진에 번호를 할당하고 번호 범위를 하드 코딩하는 대신 파일을 나열하고 무작위로 하나를 선택하세요. 더 구체적으로:

  • 위치 인수를 파일 목록으로 설정합니다.
  • 위치 매개변수를 무작위로 선택하려면 awk를 사용하세요.
  • 위치 매개변수에서 파일 이름을 선택합니다.
set -- /mnt/us/timelit/images/pic*.png
i=$(awk -v n=$# 'BEGIN {srand(); print int(rand() * n ) + 1; exit}')
eval "SelectedImage=\${$i}"

eips -c
eips -g $SelectedImage

awk에게 이미지 파일을 직접 선택하도록 요청할 수도 있지만 파일이 많으면 명령줄 길이 제한이 발생할 수 있습니다.

SelectedImage=$(awk '
    BEGIN {srand(); print ARGV[int(rand() * (length(ARGV)-1) + 1)]; exit}
  ' /mnt/us/timelit/images/pic*.png)

(bash 및 GNU 유틸리티를 포함하는 보다 완전한 환경이 있는 경우 일부 작업을 수행하는 더 쉬운 방법이 있습니다. 내 대답은 모든 POSIX 셸 및 많은 BusyBox 설치에서 사용할 수 있는 기능에 충실합니다.)

관련 정보