Tekstklok in Geektool
19 maart 2016 - 21:35   
geplaatst door: MackeyV40
Hallo allen,

Sinds korte tijd ben ik weer eens aan het klooien met GeekTool. Veel dingen is me al gelukt maar er is één dingetje wat me nog niet echt wil lukken: een goede tekstklok.

Ik heb er nu wel eentje die werkt maar zodra het na 20 minuten over gaat worden, gaat het de mist in: het uur loopt dan feitelijk achter. En ik weet niet hoe ik dat op moet lossen. Wie heeft voor mij de oplossing?

Het gaat om de volgende code ('geleend' van iemand anders):

#!/bin/bash

# converts exact time to fuzzy format

export exact_time=$(date "+%I:%M")

export exact_hour=$(echo $exact_time | cut -c 1,2)

export exact_minute=$(echo $exact_time | cut -c 4,5)

nMinute=$(expr $exact_minute)
nHour=$(expr $exact_hour)

case $exact_minute in

00) export fuzzy_minute="uur";;

01) export fuzzy_minute="een over";;

02) export fuzzy_minute="twee over";;

03) export fuzzy_minute="drie over";;

04) export fuzzy_minute="vier over";;

05) export fuzzy_minute="vijf over";;

06) export fuzzy_minute="zes over";;

07) export fuzzy_minute="zeven over";;

08) export fuzzy_minute="acht over";;

09) export fuzzy_minute="negen over";;

10) export fuzzy_minute="tien over";;

11) export fuzzy_minute="elf over";;

12) export fuzzy_minute="twaalf over";;

13) export fuzzy_minute="dertien over";;

14) export fuzzy_minute="veertien over";;

15) export fuzzy_minute="kwart over";;

16) export fuzzy_minute="zestien over";;

17) export fuzzy_minute="zeventien over";;

18) export fuzzy_minute="achttien over";;

19) export fuzzy_minute="negentien over";;

20) export fuzzy_minute="tien voor half";;

21) export fuzzy_minute="negen voor half";;

22) export fuzzy_minute="acht voor half";;

23) export fuzzy_minute="zeven voor half";;

24) export fuzzy_minute="zes voor half";;

25) export fuzzy_minute="vijf voor half";;

26) export fuzzy_minute="vier voor half";;

27) export fuzzy_minute="drie voor half";;

28) export fuzzy_minute="twee voor half";;

29) export fuzzy_minute="een voor half";;

30) export fuzzy_minute="half";;

31) export fuzzy_minute="een over half";;

32) export fuzzy_minute="twee over half";;

33) export fuzzy_minute="drie over half";;

34) export fuzzy_minute="vier over half";;

35) export fuzzy_minute="vijf over half";;

36) export fuzzy_minute="zes over half";;

37) export fuzzy_minute="zeven over half";;

38) export fuzzy_minute="acht over half";;

39) export fuzzy_minute="negen over half";;

40) export fuzzy_minute="tien over half";;

41) export fuzzy_minute="elf over half";;

42) export fuzzy_minute="twaalf over half";;

43) export fuzzy_minute="dertien over half";;

44) export fuzzy_minute="veertien over half";;

45) export fuzzy_minute="kwart voor";;

46) export fuzzy_minute="veertien voor";;

47) export fuzzy_minute="dertien voor";;

48) export fuzzy_minute="twaalf voor";;

49) export fuzzy_minute="elf voor";;

50) export fuzzy_minute="tien voor";;

51) export fuzzy_minute="negen voor";;

52) export fuzzy_minute="acht voor";;

53) export fuzzy_minute="zeven voor";;

54) export fuzzy_minute="zes voor";;

55) export fuzzy_minute="vijf voor";;

56) export fuzzy_minute="vier voor";;

57) export fuzzy_minute="drie voor";;

58) export fuzzy_minute="twee voor";;

59) export fuzzy_minute="een voor";;

esac

case $nHour in

1) export fuzzy_hour="een";;

2) export fuzzy_hour="twee";;

3) export fuzzy_hour="drie";;

4) export fuzzy_hour="vier";;

5) export fuzzy_hour="vijf";;

6) export fuzzy_hour="zes";;

7) export fuzzy_hour="zeven";;

8) export fuzzy_hour="acht";;

9) export fuzzy_hour="negen";;

10) export fuzzy_hour="tien";;

11) export fuzzy_hour="elf";;

12) export fuzzy_hour="twaalf";;

esac

if [ $fuzzy_minute = "uur" ] ; then
 export fuzzy_time="$fuzzy_hour $fuzzy_minute"
else
 export fuzzy_time="Het is $fuzzy_minute $fuzzy_hour."
fi

echo $fuzzy_time

exit 0

MacBook Pro (13-inch, 2020, 4 Thunderbolt-3 ports. Intel Core i5 1,8 GHz, 16 GB, 500 gB SSD), iPhone 15 128 gB, iPad 6 (9.7 inch, 2018) 32 gB, iPad 8 (9.7 inch, 2020), 32 gB, Apple Watch 8 LTE, Apple Watch Ultra 2.
Tekstklok in Geektool
20 maart 2016 - 08:06    reactie #1
geplaatst door: MacFrankie
Dat is logisch, je corrigeert de uren niet als het aantal minuten 20 of meer is. Je moet er zoiets bijzetten:


if [[ nMinute > 19]] && [[ nHour < 12]]
then
 (( nHour = nHour + 1))
elif [[ nMinute > 19]] && [[ nHour = 12]]
then
 (( nHour = 1))
fi
Op mijn werk heb ik al Windows, thuis wil ik geen systeembeheerder meer zijn!
Tekstklok in Geektool
20 maart 2016 - 13:34    reactie #2
geplaatst door: MackeyV40
Zojuist even geprobeerd, krijg dan deze code:


#!/bin/bash

# converts exact time to fuzzy format

export exact_time=$(date "+%I:%M")

export exact_hour=$(echo $exact_time | cut -c 1,2)

export exact_minute=$(echo $exact_time | cut -c 4,5)

nMinute=$(expr $exact_minute)
nHour=$(expr $exact_hour)

if [[ nMinute > 19]] && [[ nHour < 12]]
then
(( nHour = nHour + 1))
elif [[ nMinute > 19]] && [[ nHour = 12]]
then
(( nHour = 1))
fi

case $exact_minute in

00) export fuzzy_minute="uur";;

01) export fuzzy_minute="een over";;

02) export fuzzy_minute="twee over";;

03) export fuzzy_minute="drie over";;

04) export fuzzy_minute="vier over";;

05) export fuzzy_minute="vijf over";;

06) export fuzzy_minute="zes over";;

07) export fuzzy_minute="zeven over";;

08) export fuzzy_minute="acht over";;

09) export fuzzy_minute="negen over";;

10) export fuzzy_minute="tien over";;

11) export fuzzy_minute="elf over";;

12) export fuzzy_minute="twaalf over";;

13) export fuzzy_minute="dertien over";;

14) export fuzzy_minute="veertien over";;

15) export fuzzy_minute="kwart over";;

16) export fuzzy_minute="zestien over";;

17) export fuzzy_minute="zeventien over";;

18) export fuzzy_minute="achttien over";;

19) export fuzzy_minute="negentien over";;

20) export fuzzy_minute="tien voor half";;

21) export fuzzy_minute="negen voor half";;

22) export fuzzy_minute="acht voor half";;

23) export fuzzy_minute="zeven voor half";;

24) export fuzzy_minute="zes voor half";;

25) export fuzzy_minute="vijf voor half";;

26) export fuzzy_minute="vier voor half";;

27) export fuzzy_minute="drie voor half";;

28) export fuzzy_minute="twee voor half";;

29) export fuzzy_minute="een voor half";;

30) export fuzzy_minute="half";;

31) export fuzzy_minute="een over half";;

32) export fuzzy_minute="twee over half";;

33) export fuzzy_minute="drie over half";;

34) export fuzzy_minute="vier over half";;

35) export fuzzy_minute="vijf over half";;

36) export fuzzy_minute="zes over half";;

37) export fuzzy_minute="zeven over half";;

38) export fuzzy_minute="acht over half";;

39) export fuzzy_minute="negen over half";;

40) export fuzzy_minute="tien over half";;

41) export fuzzy_minute="elf over half";;

42) export fuzzy_minute="twaalf over half";;

43) export fuzzy_minute="dertien over half";;

44) export fuzzy_minute="veertien over half";;

45) export fuzzy_minute="kwart voor";;

46) export fuzzy_minute="veertien voor";;

47) export fuzzy_minute="dertien voor";;

48) export fuzzy_minute="twaalf voor";;

49) export fuzzy_minute="elf voor";;

50) export fuzzy_minute="tien voor";;

51) export fuzzy_minute="negen voor";;

52) export fuzzy_minute="acht voor";;

53) export fuzzy_minute="zeven voor";;

54) export fuzzy_minute="zes voor";;

55) export fuzzy_minute="vijf voor";;

56) export fuzzy_minute="vier voor";;

57) export fuzzy_minute="drie voor";;

58) export fuzzy_minute="twee voor";;

59) export fuzzy_minute="een voor";;

esac

case $nHour in

1) export fuzzy_hour="een";;

2) export fuzzy_hour="twee";;

3) export fuzzy_hour="drie";;

4) export fuzzy_hour="vier";;

5) export fuzzy_hour="vijf";;

6) export fuzzy_hour="zes";;

7) export fuzzy_hour="zeven";;

8) export fuzzy_hour="acht";;

9) export fuzzy_hour="negen";;

10) export fuzzy_hour="tien";;

11) export fuzzy_hour="elf";;

12) export fuzzy_hour="twaalf";;

esac

if [ $fuzzy_minute = "uur" ]; then
export fuzzy_time="$fuzzy_hour $fuzzy_minute"
else
export fuzzy_time="Het is $fuzzy_minute $fuzzy_hour."
fi

echo $fuzzy_time

exit 0

maar dan krijg ik totaal geen output...

MacBook Pro (13-inch, 2020, 4 Thunderbolt-3 ports. Intel Core i5 1,8 GHz, 16 GB, 500 gB SSD), iPhone 15 128 gB, iPad 6 (9.7 inch, 2018) 32 gB, iPad 8 (9.7 inch, 2020), 32 gB, Apple Watch 8 LTE, Apple Watch Ultra 2.
Tekstklok in Geektool
20 maart 2016 - 17:30    reactie #3
geplaatst door: MacFrankie
Als ik iets met Unix shell scripts doe, dan is het altijd met Korn Shell (ksh), nooit met Bash. Probeer anders dit eens:

if [[ nMinute -gt 19]] -a [[ nHour -lt 12]]
then
(( nHour = nHour + 1))
elif [[ nMinute -gt 19]] -a [[ nHour -eq 12]]
then
(( nHour = 1))
fi
Op mijn werk heb ik al Windows, thuis wil ik geen systeembeheerder meer zijn!
Tekstklok in Geektool
20 maart 2016 - 20:37    reactie #4
geplaatst door: MackeyV40
MacFrankie, werkt ook nog niet, nog steeds geen output. Ik blijf vrolijk even verder puzzelen!
MacBook Pro (13-inch, 2020, 4 Thunderbolt-3 ports. Intel Core i5 1,8 GHz, 16 GB, 500 gB SSD), iPhone 15 128 gB, iPad 6 (9.7 inch, 2018) 32 gB, iPad 8 (9.7 inch, 2020), 32 gB, Apple Watch 8 LTE, Apple Watch Ultra 2.
Tekstklok in Geektool
20 maart 2016 - 20:48    reactie #5
geplaatst door: MackeyV40
Voorlopig even als volgt opgelost:


#!/usr/bin/osascript

set hrs to do shell script "date +%l"
set min to do shell script "date +%M"

# set hrs to 10
# set min to 0

set numwrds to {"een", "twee", "drie", "vier", "vijf", "zes", "zeven", "acht", "negen", "tien", "elf", "twaalf", "dertien", "veertien", "kwart", "zestien", "zeventien", "achttien", "negentien", "twintig", "eenentwintig", "tweeentwintig", "drieentwintig", "vierentwintig", "vijfentwintig", "zesentwintig", "zevenentwintig", "achtentwintig", "negenentwintig", "half"}
set headr to "Het is "

if min = 0 then
 set hr to item hrs of numwrds
 return headr & hr & " uur."
end if

if min = 30 then
 set hr to item (hrs + 1) of numwrds
 return headr & "half " & hr & "."
end if

if min < 20 then
 set hr to item hrs of numwrds
 set mn to item min of numwrds
 return headr & mn & " over " & hr & "."
end if

if min < 30 then
 set hr to item (hrs + 1) of numwrds
 set mn to item (30 - min) of numwrds
 return headr & mn & " voor half " & hr & "."
end if

if min > 30 then
 if min < 41 then
   set hr to item (hrs + 1) of numwrds
   set mn to item (min - 30) of numwrds
   return headr & mn & " over half " & hr & "."
 end if
end if

if min > 30 then
 if min > 40 then
   set hr to item (hrs + 1) of numwrds
   set mn to item (29 - min) of numwrds
   return headr & mn & " voor " & hr & "."
 end if
end if

Alleen op het halve uur gaat het even mis... Valt voorlopig mee te leven...

MacBook Pro (13-inch, 2020, 4 Thunderbolt-3 ports. Intel Core i5 1,8 GHz, 16 GB, 500 gB SSD), iPhone 15 128 gB, iPad 6 (9.7 inch, 2018) 32 gB, iPad 8 (9.7 inch, 2020), 32 gB, Apple Watch 8 LTE, Apple Watch Ultra 2.
Tekstklok in Geektool
20 maart 2016 - 20:51    reactie #6
geplaatst door: MacFrankie
Probeer het anders eens met enkele blokhaken ipv dubbele. Mogelijk kan Bash niet overweg met dubbele ronde haken voor numerieke bewerkingen, dus is het veiliger om LET te gebruiken. En misschien kent Bash ook geen EL(S)IF, dus met dat allemaal als uitgangspunten wordt de code als volgt:

if [ nMinute -gt 19 ]
then
 let nHour=$nHour+1
fi

if [ nHour -eq 13 ]
then
 let nHour=1
fi

Op mijn werk heb ik al Windows, thuis wil ik geen systeembeheerder meer zijn!
Tekstklok in Geektool
22 maart 2016 - 16:29    reactie #7
geplaatst door: MackeyV40
Helaas, MacFrankie, ook hier niet het beoogde resultaat mee... Bedankt voor het idee!

... en we denken en puzzelen vrolijk verder...

MacBook Pro (13-inch, 2020, 4 Thunderbolt-3 ports. Intel Core i5 1,8 GHz, 16 GB, 500 gB SSD), iPhone 15 128 gB, iPad 6 (9.7 inch, 2018) 32 gB, iPad 8 (9.7 inch, 2020), 32 gB, Apple Watch 8 LTE, Apple Watch Ultra 2.
Tekstklok in Geektool
22 maart 2016 - 16:57    reactie #8
geplaatst door: MacFrankie
De laatste post moet natuurlijk dit zijn:

if [ $nMinute -gt 19 ]
then
let nHour=$nHour+1
fi

if [ $nHour -eq 13 ]
then
let nHour=1
fi

De verschillen: twee $-tekens als er naar variabelen gerefereerd wordt.

Maar voel je vrij om zelf eens wat uit te proberen, zo leer je Bash en variabelen kennen!

Op mijn werk heb ik al Windows, thuis wil ik geen systeembeheerder meer zijn!
Tekstklok in Geektool
28 maart 2016 - 19:34    reactie #9
geplaatst door: MackeyV40
Dank je voor je tips, MacFrankie, het heeft me wel de nodige inzichten gegeven maar niet geleid tot een oplossing. Ik heb een andere variant gemaakt in Geektool: een analoge versie, dus met wijzers.
MacBook Pro (13-inch, 2020, 4 Thunderbolt-3 ports. Intel Core i5 1,8 GHz, 16 GB, 500 gB SSD), iPhone 15 128 gB, iPad 6 (9.7 inch, 2018) 32 gB, iPad 8 (9.7 inch, 2020), 32 gB, Apple Watch 8 LTE, Apple Watch Ultra 2.
Tekstklok in Geektool
28 maart 2016 - 23:25    reactie #10
geplaatst door: MacFrankie
Je moet gewoon wat uitproberen met shell scripting. Googlke op "bash if" of "bash assign" als je niet weet hoe een if of toekenning er in Bash uitziet, en probeer het uit in een simpel scriptje met een paar regels code, waarvan je zelf prima weet wat het moet doen.
Op mijn werk heb ik al Windows, thuis wil ik geen systeembeheerder meer zijn!