summaryrefslogtreecommitdiffstats
path: root/util/bin
diff options
context:
space:
mode:
Diffstat (limited to 'util/bin')
-rwxr-xr-xutil/bin/make-realwallpaper180
-rwxr-xr-xutil/bin/mobile.vvs.de167
-rwxr-xr-xutil/bin/vvs.de61
3 files changed, 370 insertions, 38 deletions
diff --git a/util/bin/make-realwallpaper b/util/bin/make-realwallpaper
index a195b5f1..837bd378 100755
--- a/util/bin/make-realwallpaper
+++ b/util/bin/make-realwallpaper
@@ -16,7 +16,7 @@ main() {
fetch clouds-raw.jpg \
http://user.chol.com/~winxplanet/cloud_data/clouds_2048.jpg &
fetch krebs.sat.tle \
- http://www.celestrak.com/NORAD/elements/stations.txt
+ http://www.celestrak.com/NORAD/elements/stations.txt &
wait
#check_type nightmap-old-raw.jpg image
@@ -24,7 +24,8 @@ main() {
check_type daymap-raw.png image
check_type clouds-raw.jpg image
- in_size=1466x1200
+ in_size=2048x1024
+ xplanet_out_size=1466x1200
out_geometry=1366x768+100+160
nightsnow_color='#0c1a49' # nightmap
@@ -39,24 +40,26 @@ main() {
;
do
normal=${raw%-raw.*}.png
- needs_rebuild $normal $raw || continue
- echo "make $normal; normalize $raw" >&2
- convert $raw -scale $in_size $normal
+ if needs_rebuild $normal $raw; then
+ echo "make $normal; normalize $raw" >&2
+ convert $raw -scale $in_size $normal
+ fi
done
# create nightmap-fullsnow
- needs_rebuild nightmap-fullsnow.png \
- && convert -size $in_size xc:$nightsnow_color nightmap-fullsnow.png
+ if needs_rebuild nightmap-fullsnow.png; then
+ convert -size $in_size xc:$nightsnow_color nightmap-fullsnow.png
+ fi
# extract daymap-snowmask from daymap-final
- needs_rebuild daymap-snowmask.png \
- daymap.png \
- && convert daymap.png -threshold 95% daymap-snowmask.png
+ if needs_rebuild daymap-snowmask.png daymap.png; then
+ convert daymap.png -threshold 95% daymap-snowmask.png
+ fi
# extract nightmap-lightmask from nightmap
- needs_rebuild nightmap-lightmask.png \
- nightmap.png \
- && convert nightmap.png -threshold 25% nightmap-lightmask.png
+ if needs_rebuild nightmap-lightmask.png nightmap.png; then
+ convert nightmap.png -threshold 25% nightmap-lightmask.png
+ fi
# create layers
make_layer nightmap-snowlayer.png nightmap-fullsnow.png daymap-snowmask.png
@@ -83,58 +86,160 @@ main() {
ln $normal $final
done
+ make_gcloud_cloudmask
+
+ map=daymap-final.png
+ night_map=nightmap-final.png
+ cloud_map=clouds-final.png
+ gcloud_map=gcloud-cloudmask.png
+ satellite_file=krebs.sat
+
# create xplanet output
- cat >xplanet.config <<EOF
+ cat >xplanet.config <<EOF
[earth]
"Earth"
-map=daymap-final.png
-night_map=nightmap-final.png
-cloud_map=clouds-final.png
+map=$map
+night_map=$night_map
+cloud_map=$cloud_map
cloud_threshold=10
shade=15
EOF
# create xplanet output satellite version
- cat >xplanet-sat.config <<EOF
+ cat >xplanet-sat.config <<EOF
+[earth]
+"Earth"
+map=$map
+night_map=$night_map
+cloud_map=$cloud_map
+cloud_threshold=10
+satellite_file=$satellite_file
+shade=15
+EOF
+
+ # create xplanet output gcloud version
+ cat >xplanet-gcloud.config <<EOF
[earth]
"Earth"
-map=daymap-final.png
-night_map=nightmap-final.png
-cloud_map=clouds-final.png
-satellite_file=krebs.sat
+map=$map
+night_map=$night_map
+cloud_map=$gcloud_map
cloud_threshold=10
shade=15
EOF
- needs_rebuild krebs.sat \
- && cat >krebs.sat <<EOF
+ # create xplanet output gcloud-satellite version
+ cat >xplanet-gcloud-sat.config <<EOF
+[earth]
+"Earth"
+map=$map
+night_map=$night_map
+cloud_map=$gcloud_map
+cloud_threshold=10
+satellite_file=$satellite_file
+shade=15
+EOF
+
+ cat >krebs.sat <<EOF
25544 "ISS" Image=none trail={orbit,-2,2,1} color=grey thickness=1 fontsize=10
37820 "T1" Image=none trail={orbit,-2,2,1} color=grey thickness=1 fontsize=10
-39175 "ATV-4" Image=none trail={orbit,-2,2,1} color=grey thickness=1 fontsize=10
39258 "CYG" Image=none trail={orbit,-2,2,1} color=grey thickness=1 fontsize=10
EOF
- needs_rebuild krebs.mar \
- && cat >krebs.mar <<EOF
+ cat >krebs.mar <<EOF
EOF
# rebuild every time to update shadow
- xplanet --num_times 1 --geometry $in_size \
- --output xplanet-output.png --projection merc -config xplanet.config
+ xplanet --num_times 1 --geometry $xplanet_out_size \
+ --output xplanet-output.png --projection merc \
+ -config xplanet.config
# rebuild everytime satellite version
- xplanet --num_times 1 --geometry $in_size \
- --output xplanet-sat-output.png --projection merc -config xplanet-sat.config
+ xplanet --num_times 1 --geometry $xplanet_out_size \
+ --output xplanet-sat-output.png --projection merc \
+ -config xplanet-sat.config
+
+ # rebuild every time to update shadow gcloud
+ xplanet --num_times 1 --geometry $xplanet_out_size \
+ --output xplanet-gcloud-output.png --projection merc \
+ -config xplanet-gcloud.config
+
+ # rebuild everytime satellite gcloud version
+ xplanet --num_times 1 --geometry $xplanet_out_size \
+ --output xplanet-gcloud-sat-output.png --projection merc \
+ -config xplanet-gcloud-sat.config
+
+ # trim xplanet output
+ if needs_rebuild realwallpaper.png xplanet-output.png; then
+ convert xplanet-output.png -crop $out_geometry \
+ realwallpaper.png
+ fi
+
+ # trim xplanet-sat output
+ if needs_rebuild realwallpaper-sat.png xplanet-sat-output.png; then
+ convert xplanet-sat-output.png -crop $out_geometry \
+ realwallpaper-sat.png
+ fi
# trim xplanet output
- needs_rebuild realwallpaper.png \
- xplanet-output.png \
- && convert xplanet-output.png -crop $out_geometry realwallpaper.png
+ if needs_rebuild realwallpaper-gcloud.png xplanet-gcloud-output.png; then
+ convert xplanet-gcloud-output.png -crop $out_geometry \
+ realwallpaper-gcloud.png
+ fi
# trim xplanet-sat output
- needs_rebuild realwallpaper-sat.png \
- xplanet-sat-output.png \
- && convert xplanet-sat-output.png -crop $out_geometry realwallpaper-sat.png
+ if needs_rebuild realwallpaper-gcloud-sat.png xplanet-gcloud-sat-output.png; then
+ convert xplanet-gcloud-sat-output.png -crop $out_geometry \
+ realwallpaper-gcloud-sat.png
+ fi
+}
+
+# generate clouds from google maps
+make_gcloud_cloudmask() {
+ echo 'fetch gcloud-*.png tiles' >&2
+ for y in $(seq -w 0 15); do
+ for x in $(seq -w 0 15); do
+ echo "curl -sS -o gcloud-$y-$x.png -z gcloud-$y-$x.png \\\"https://mts0.google.com/vt/lyrs=h@239000000,weather_nolabels,weather_0cloud&hl=en&src=app&x=$x&y=$y&z=4&s=Galil\\\""
+ done
+ done | xargs --max-args=1 -P 10 -I @ sh -c @
+ gcloud_tiles=$(find -name 'gcloud-[0-9][0-9]-[0-9][0-9].png'|sort)
+ if needs_rebuild gcloud-raw.png $gcloud_tiles; then
+ echo 'make gcloud-raw.png' &&
+ montage -mode Concatenate -background None \
+ $gcloud_tiles -tile x16 gcloud-raw.png
+ fi
+
+ check_type gcloud-raw.png image
+
+ gcloud_in_size=2048x2048
+ gcloud_out_size=2048x1024
+ gcloud_out_geometry=2048x1024+0+512
+ gcloud_base_color='#ffffff'
+
+ if needs_rebuild gcloud-normal.png gcloud-raw.png; then
+ echo "make gcloud-normal.png; normalize gcloud-raw.png" >&2
+ convert -flatten gcloud-raw.png \
+ -scale $gcloud_in_size gcloud-normal.png
+ fi
+
+ if needs_rebuild gcloud-distmap.png; then
+ convert -size 2048x2048 gradient: -rotate 180 \
+ -fx "p{i, (asinh(tan((j/h+0.5)*pi))/2.6+0.5) * h }" \
+ gcloud-distmap.png
+ fi
+
+ if needs_rebuild gcloud-cloudmask.png gcloud-normal.png; then
+ echo 'make gcloud-cloudmask.png' &&
+ convert gcloud-normal.png gcloud-distmap.png \
+ -fx 'p{i,v*h}' \
+ -crop $gcloud_out_geometry \
+ gcloud-cloudmask.png
+ fi
+
+ if needs_rebuild gcloud-fullcloud.png; then
+ echo 'make gcloud-fullcloud.png' &&
+ convert -size $gcloud_out_size xc:$gcloud_base_color gcloud-fullcloud.png
+ fi
}
# usage: getimg FILENAME URL
@@ -195,5 +300,4 @@ needs_rebuild() {
return $result
}
-
main "$@"
diff --git a/util/bin/mobile.vvs.de b/util/bin/mobile.vvs.de
new file mode 100755
index 00000000..fdc4cca2
--- /dev/null
+++ b/util/bin/mobile.vvs.de
@@ -0,0 +1,167 @@
+#! /bin/sh
+#
+# NAME
+# mobile.vvs.de - web scraper for VVS departure information
+#
+# SYNOPSIS
+# mobile.vvs.de ORIGIN [HH [MM [YYmmdd]]]
+#
+# DESCRIPTION
+# The mobile.vvs.de utility fetches departure information from the
+# Internet and prints the results to standard output.
+#
+# OPERANDS
+# ORIGIN The point of departure.
+#
+# HH, MM, YYmmdd
+# The time and date of departure. Defaults to the current
+# time and date.
+#
+# STDIN
+# Not used.
+#
+# INPUT FILES
+# None.
+#
+# ENVIRONMENT VARIABLES
+# The following environment variables affect the execution of mobile.vvs.de:
+#
+# limit Limits the number of entries to be fetched.
+#
+# origin, H, M, Ymd
+# Provide defaults operands. If origin is set, then ORIGIN
+# becomes optional. The order of the operands doesn't change
+# by these variables. These variables are overridden by the
+# operands.
+#
+# ASYNCHRONOUS EVENTS
+# Defaults.
+#
+# STDOUT
+# The first line has the format:
+#
+# "\e[4m%s:%s %s\e[m\n", H, M, origin_real_name
+#
+# where H and M are the corresponding provided or default operands.
+# origin_real_name is the real name of the point of departure.
+#
+# The subsequent lines specify the departing means of transport.
+# Each line has the format:
+#
+# "%s %s → %s\n", time_of_departure, line_number, destination
+#
+# where time_of_departure is self-evident, and line_number and
+# destination identify the route and direction.
+#
+# STDERR
+# Not used.
+#
+# OUTPUT FILES
+# None.
+#
+# EXTENDED DESCRIPTION
+# None.
+#
+# EXIT STATUS
+# 0 A departure board could be fetched.
+#
+# 1 ORIGIN doesn't specify an acceptable point of departure.
+#
+# EXAMPLES
+# 1. Get the top three current departures at Stuttgart, Hauptbahnhof:
+#
+# $ limit=3 mobile.vvs.de hauptbahnhof
+#
+# FUTURE DIRECTIONS
+# None.
+#
+# BUGS
+# The format of STDOUT suffers from bit rot.
+#
+# SEE ALSO
+# vvs.de
+#
+# COPYRIGHT
+# All departure information is copyrighted by Verkehrs- und
+# Tarifverbund Stuttgart GmbH. The original copyright statement can
+# be obtained online at http://www.vvs.de/impressum .
+#
+# The following code is your fault.
+#
+set -euf
+
+ltrim() {
+ sed "s/^[${1-$symbols}]*//"
+}
+
+POST() {
+ ## TODO url-encode, trim
+ tr '\n' '&' | sed 's/&$//' |
+ w3m -config /dev/null -cols 256 -post /dev/stdin -dump "${1-$URI}"
+}
+
+limit=${limit-10}
+origin="${1-$origin}"
+H="${2-${H-`date +%H`}}"
+M="${3-${M-`date +%M`}}"
+Ymd="${4-${Ymd-`date +%Y%m%d`}}"
+
+URI='http://mobil.vvs.de/mobile/XSLT_DM_REQUEST'
+
+echo "
+sessionID=0
+requestID=0
+language=de
+locationServerActive=1
+useRealtime=1
+anySigWhenPerfectNoOtherMatches=1
+limit=$limit
+deleteAssignedStops_dm=1
+mode=direct
+convertCrossingsITKernel2LocationServer=1
+convertStopsPTKernel2LocationServer=1
+convertAddressesITKernel2LocationServer=1
+convertPOIsITKernel2LocationServer=1
+itdLPxx_dest=
+useAllStops=1
+maxAssignedStops=1
+itOptionsActive=1
+trITMOTvalue100=5
+ptOptionsActive=1
+useProxFootSearch=0
+w_regPrefAm=1
+w_objPrefAl=2
+w_objPrefAl=12
+itdLPxx_script=true
+place_dm=
+placeState_dm=empty
+nameState_dm=empty
+nameInfo_dm=invalid
+typeInfo_dm=invalid
+placeInfo_dm=invalid
+reducedAnyWithoutAddressObjFilter_dm=103
+reducedAnyPostcodeObjFilter_dm=64
+reducedAnyTooManyObjFilter_dm=2
+anyObjFilter_dm=126
+type_dm=any
+name_dm=$origin
+itdTimeHour=`echo $H | ltrim 0`
+itdTimeMinute=`echo $M | ltrim 0`
+itdDate=$Ymd
+" | POST "$URI" | sed -rn '
+ s/^Von:[^[:alpha:]]+(.*)$/'$H:$M' \1/p
+ /Haltestelle/,/^ *$/{
+ /Haltestelle|^ *$/!{
+ s/[[:space:]]*\[info\][[:space:]]*$//
+ p
+ }
+ }
+' | {
+ read REPLY
+ echo "$REPLY"
+ while read time dev no dest ; do
+ printf "$time %3s → %s\n" $no "$dest"
+ done
+}
+
+####
diff --git a/util/bin/vvs.de b/util/bin/vvs.de
new file mode 100755
index 00000000..3b7ccf93
--- /dev/null
+++ b/util/bin/vvs.de
@@ -0,0 +1,61 @@
+#! /bin/sh
+#
+# NAME
+# vvs.de - web scraper for VVS departure information
+#
+# SYNOPSIS
+# vvs.de ORIGIN DESTINATION [HH [MM]]
+#
+# EXAMPLES
+# $ vvs.de Hauptbahnhof Renningen 13 37
+#
+# CAVEATS
+# Acceptable operands have to be found by trial and error.
+#
+# BUGS
+# Probably bit rot.^_^
+#
+# SEE ALSO
+# mobile.vvs.de
+#
+# COPYRIGHT
+# All departure information is copyrighted by Verkehrs- und
+# Tarifverbund Stuttgart GmbH. The original copyright statement can
+# be obtained online at http://www.vvs.de/impressum .
+#
+# The following code is your fault.
+#
+set -euf
+
+# <form action="./efaanyfield/anyfield.php" method="post" id="efaForm">
+ #s/itdDateDay=/&${3-$itdDateDay}/
+ #s/itdDateMonth=/&${4-$itdDateMonth}/
+ #s/itdDateYear=/&${5-$itdDateYear}/
+
+vvs_tmp=/tmp/vvs.tmp
+curl -Ss http://www.vvs.de/fahrplan/ |
+sed -rn "/<!-- EFA -->/,/<!-- \/EFA -->/{
+ s.*<input.*name=\"([^\"]*)\".*value=\"([^\"]*)\".*/>.*\1=\2;T
+ /itdTripDateTimeDepArr=arr/b
+ s/(name_origin=).*/\1${1-$name_origin}/
+ s/(name_destination=).*/\1${2-$name_destination}/
+ ${3+s/(itdTimeHour=).*/\1${3-$itdTimeHour}/}
+ ${4+s/(itdTimeMinute=).*/\1${4-$itdTimeMinute}/}
+ p
+}" | tr '\n' '&' | sed 's/&$//' >"$vvs_tmp"
+
+
+#while read line ; do
+# test -z "$line" || echo "$line"
+#done >"$vvs_tmp"
+
+echo from: ${1-$name_origin}
+echo \ \ to: ${2-$name_destination}
+echo '-------------------------------------'
+w3m -cols 9423 -post "$vvs_tmp" \
+ -dump http://www.vvs.de/./efaanyfield/anyfield.php |
+sed -rn "
+ s/^ +[0-9]+ +([0-9]+:[0-9]+) +([0-9]+:[0-9]+) +([A-Z0-9 ,]+) .*$/\1 \2 \3/p
+" | tr -d ,
+
+####