commit 0459e48e8242d058b1ec907744cd1606583d2b29 Author: SpaceFox Date: Mon Jan 23 23:06:59 2023 +0100 Version à l’ancienne diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..4361d2f --- /dev/null +++ b/.dockerignore @@ -0,0 +1,5 @@ +* +!build/*-runner +!build/*-runner.jar +!build/lib/* +!build/quarkus-app/* \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..285b6ba --- /dev/null +++ b/.gitignore @@ -0,0 +1,36 @@ +# Gradle +.gradle/ +build/ + +# Eclipse +.project +.classpath +.settings/ +bin/ + +# IntelliJ +.idea +*.ipr +*.iml +*.iws + +# NetBeans +nb-configuration.xml + +# Visual Studio Code +.vscode +.factorypath + +# OSX +.DS_Store + +# Vim +*.swp +*.swo + +# patch +*.orig +*.rej + +# Local environment +.env diff --git a/README.md b/README.md new file mode 100644 index 0000000..46659e1 --- /dev/null +++ b/README.md @@ -0,0 +1,60 @@ +# japon Project + +This project uses Quarkus, the Supersonic Subatomic Java Framework. + +If you want to learn more about Quarkus, please visit its website: https://quarkus.io/ . + +## Running the application in dev mode + +You can run your application in dev mode that enables live coding using: +```shell script +./gradlew quarkusDev +``` + +> **_NOTE:_** Quarkus now ships with a Dev UI, which is available in dev mode only at http://localhost:8080/q/dev/. + +## Packaging and running the application + +The application can be packaged using: +```shell script +./gradlew build +``` +It produces the `quarkus-run.jar` file in the `build/quarkus-app/` directory. +Be aware that it’s not an _über-jar_ as the dependencies are copied into the `build/quarkus-app/lib/` directory. + +The application is now runnable using `java -jar build/quarkus-app/quarkus-run.jar`. + +If you want to build an _über-jar_, execute the following command: +```shell script +./gradlew build -Dquarkus.package.type=uber-jar +``` + +The application, packaged as an _über-jar_, is now runnable using `java -jar build/*-runner.jar`. + +## Creating a native executable + +You can create a native executable using: +```shell script +./gradlew build -Dquarkus.package.type=native +``` + +Or, if you don't have GraalVM installed, you can run the native executable build in a container using: +```shell script +./gradlew build -Dquarkus.package.type=native -Dquarkus.native.container-build=true +``` + +You can then execute your native executable with: `./build/japon-1.0.0-SNAPSHOT-runner` + +If you want to learn more about building native executables, please consult https://quarkus.io/guides/gradle-tooling. + +## Related Guides + +- Kotlin ([guide](https://quarkus.io/guides/kotlin)): Write your services in Kotlin + +## Provided Code + +### RESTEasy Reactive Qute + +Create your web page using Quarkus RESTEasy Reactive & Qute + +[Related guide section...](https://quarkus.io/guides/qute#type-safe-templates) diff --git a/build.gradle.kts b/build.gradle.kts new file mode 100644 index 0000000..fae7d71 --- /dev/null +++ b/build.gradle.kts @@ -0,0 +1,45 @@ +plugins { + kotlin("jvm") version "1.7.21" + kotlin("plugin.allopen") version "1.7.21" + id("io.quarkus") +} + +repositories { + mavenCentral() + mavenLocal() +} + +val quarkusPlatformGroupId: String by project +val quarkusPlatformArtifactId: String by project +val quarkusPlatformVersion: String by project + +dependencies { + implementation(enforcedPlatform("${quarkusPlatformGroupId}:${quarkusPlatformArtifactId}:${quarkusPlatformVersion}")) + implementation("io.quarkus:quarkus-resteasy-reactive-qute") + implementation("io.quarkus:quarkus-kotlin") + implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8") + implementation("io.quarkus:quarkus-arc") + testImplementation("io.quarkus:quarkus-junit5") +} + +group = "fr.spacefox" +version = "1.0.0-SNAPSHOT" + +java { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 +} + +tasks.withType { + systemProperty("java.util.logging.manager", "org.jboss.logmanager.LogManager") +} +allOpen { + annotation("javax.ws.rs.Path") + annotation("javax.enterprise.context.ApplicationScoped") + annotation("io.quarkus.test.junit.QuarkusTest") +} + +tasks.withType { + kotlinOptions.jvmTarget = JavaVersion.VERSION_17.toString() + kotlinOptions.javaParameters = true +} diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 0000000..5e54733 --- /dev/null +++ b/gradle.properties @@ -0,0 +1,6 @@ +#Gradle properties +quarkusPluginId=io.quarkus +quarkusPluginVersion=2.15.3.Final +quarkusPlatformGroupId=io.quarkus.platform +quarkusPlatformArtifactId=quarkus-bom +quarkusPlatformVersion=2.15.3.Final \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000..62d4c05 Binary files /dev/null and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..ae04661 --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-7.5.1-bin.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew new file mode 100755 index 0000000..fbd7c51 --- /dev/null +++ b/gradlew @@ -0,0 +1,185 @@ +#!/usr/bin/env sh + +# +# Copyright 2015 the original author or authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin or MSYS, switch paths to Windows format before running java +if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=`expr $i + 1` + done + case $i in + 0) set -- ;; + 1) set -- "$args0" ;; + 2) set -- "$args0" "$args1" ;; + 3) set -- "$args0" "$args1" "$args2" ;; + 4) set -- "$args0" "$args1" "$args2" "$args3" ;; + 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=`save "$@"` + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100755 index 0000000..a9f778a --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,104 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windows variants + +if not "%OS%" == "Windows_NT" goto win9xME_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/settings.gradle.kts b/settings.gradle.kts new file mode 100644 index 0000000..2849291 --- /dev/null +++ b/settings.gradle.kts @@ -0,0 +1,13 @@ +pluginManagement { + val quarkusPluginVersion: String by settings + val quarkusPluginId: String by settings + repositories { + mavenCentral() + gradlePluginPortal() + mavenLocal() + } + plugins { + id(quarkusPluginId) version quarkusPluginVersion + } +} +rootProject.name="japon" diff --git a/src/main/docker/Dockerfile.jvm b/src/main/docker/Dockerfile.jvm new file mode 100644 index 0000000..6ea2129 --- /dev/null +++ b/src/main/docker/Dockerfile.jvm @@ -0,0 +1,93 @@ +#### +# This Dockerfile is used in order to build a container that runs the Quarkus application in JVM mode +# +# Before building the container image run: +# +# ./gradlew build +# +# Then, build the image with: +# +# docker build -f src/main/docker/Dockerfile.jvm -t quarkus/japon-jvm . +# +# Then run the container using: +# +# docker run -i --rm -p 8080:8080 quarkus/japon-jvm +# +# If you want to include the debug port into your docker image +# you will have to expose the debug port (default 5005) like this : EXPOSE 8080 5005 +# +# Then run the container using : +# +# docker run -i --rm -p 8080:8080 quarkus/japon-jvm +# +# This image uses the `run-java.sh` script to run the application. +# This scripts computes the command line to execute your Java application, and +# includes memory/GC tuning. +# You can configure the behavior using the following environment properties: +# - JAVA_OPTS: JVM options passed to the `java` command (example: "-verbose:class") +# - JAVA_OPTS_APPEND: User specified Java options to be appended to generated options +# in JAVA_OPTS (example: "-Dsome.property=foo") +# - JAVA_MAX_MEM_RATIO: Is used when no `-Xmx` option is given in JAVA_OPTS. This is +# used to calculate a default maximal heap memory based on a containers restriction. +# If used in a container without any memory constraints for the container then this +# option has no effect. If there is a memory constraint then `-Xmx` is set to a ratio +# of the container available memory as set here. The default is `50` which means 50% +# of the available memory is used as an upper boundary. You can skip this mechanism by +# setting this value to `0` in which case no `-Xmx` option is added. +# - JAVA_INITIAL_MEM_RATIO: Is used when no `-Xms` option is given in JAVA_OPTS. This +# is used to calculate a default initial heap memory based on the maximum heap memory. +# If used in a container without any memory constraints for the container then this +# option has no effect. If there is a memory constraint then `-Xms` is set to a ratio +# of the `-Xmx` memory as set here. The default is `25` which means 25% of the `-Xmx` +# is used as the initial heap size. You can skip this mechanism by setting this value +# to `0` in which case no `-Xms` option is added (example: "25") +# - JAVA_MAX_INITIAL_MEM: Is used when no `-Xms` option is given in JAVA_OPTS. +# This is used to calculate the maximum value of the initial heap memory. If used in +# a container without any memory constraints for the container then this option has +# no effect. If there is a memory constraint then `-Xms` is limited to the value set +# here. The default is 4096MB which means the calculated value of `-Xms` never will +# be greater than 4096MB. The value of this variable is expressed in MB (example: "4096") +# - JAVA_DIAGNOSTICS: Set this to get some diagnostics information to standard output +# when things are happening. This option, if set to true, will set +# `-XX:+UnlockDiagnosticVMOptions`. Disabled by default (example: "true"). +# - JAVA_DEBUG: If set remote debugging will be switched on. Disabled by default (example: +# true"). +# - JAVA_DEBUG_PORT: Port used for remote debugging. Defaults to 5005 (example: "8787"). +# - CONTAINER_CORE_LIMIT: A calculated core limit as described in +# https://www.kernel.org/doc/Documentation/scheduler/sched-bwc.txt. (example: "2") +# - CONTAINER_MAX_MEMORY: Memory limit given to the container (example: "1024"). +# - GC_MIN_HEAP_FREE_RATIO: Minimum percentage of heap free after GC to avoid expansion. +# (example: "20") +# - GC_MAX_HEAP_FREE_RATIO: Maximum percentage of heap free after GC to avoid shrinking. +# (example: "40") +# - GC_TIME_RATIO: Specifies the ratio of the time spent outside the garbage collection. +# (example: "4") +# - GC_ADAPTIVE_SIZE_POLICY_WEIGHT: The weighting given to the current GC time versus +# previous GC times. (example: "90") +# - GC_METASPACE_SIZE: The initial metaspace size. (example: "20") +# - GC_MAX_METASPACE_SIZE: The maximum metaspace size. (example: "100") +# - GC_CONTAINER_OPTIONS: Specify Java GC to use. The value of this variable should +# contain the necessary JRE command-line options to specify the required GC, which +# will override the default of `-XX:+UseParallelGC` (example: -XX:+UseG1GC). +# - HTTPS_PROXY: The location of the https proxy. (example: "myuser@127.0.0.1:8080") +# - HTTP_PROXY: The location of the http proxy. (example: "myuser@127.0.0.1:8080") +# - NO_PROXY: A comma separated lists of hosts, IP addresses or domains that can be +# accessed directly. (example: "foo.example.com,bar.example.com") +# +### +FROM registry.access.redhat.com/ubi8/openjdk-17:1.14 + +ENV LANGUAGE='en_US:en' + + +# We make four distinct layers so if there are application changes the library layers can be re-used +COPY --chown=185 build/quarkus-app/lib/ /deployments/lib/ +COPY --chown=185 build/quarkus-app/*.jar /deployments/ +COPY --chown=185 build/quarkus-app/app/ /deployments/app/ +COPY --chown=185 build/quarkus-app/quarkus/ /deployments/quarkus/ + +EXPOSE 8080 +USER 185 +ENV JAVA_OPTS="-Dquarkus.http.host=0.0.0.0 -Djava.util.logging.manager=org.jboss.logmanager.LogManager" +ENV JAVA_APP_JAR="/deployments/quarkus-run.jar" + diff --git a/src/main/docker/Dockerfile.legacy-jar b/src/main/docker/Dockerfile.legacy-jar new file mode 100644 index 0000000..d35b965 --- /dev/null +++ b/src/main/docker/Dockerfile.legacy-jar @@ -0,0 +1,89 @@ +#### +# This Dockerfile is used in order to build a container that runs the Quarkus application in JVM mode +# +# Before building the container image run: +# +# ./gradlew build -Dquarkus.package.type=legacy-jar +# +# Then, build the image with: +# +# docker build -f src/main/docker/Dockerfile.legacy-jar -t quarkus/japon-legacy-jar . +# +# Then run the container using: +# +# docker run -i --rm -p 8080:8080 quarkus/japon-legacy-jar +# +# If you want to include the debug port into your docker image +# you will have to expose the debug port (default 5005) like this : EXPOSE 8080 5005 +# +# Then run the container using : +# +# docker run -i --rm -p 8080:8080 quarkus/japon-legacy-jar +# +# This image uses the `run-java.sh` script to run the application. +# This scripts computes the command line to execute your Java application, and +# includes memory/GC tuning. +# You can configure the behavior using the following environment properties: +# - JAVA_OPTS: JVM options passed to the `java` command (example: "-verbose:class") +# - JAVA_OPTS_APPEND: User specified Java options to be appended to generated options +# in JAVA_OPTS (example: "-Dsome.property=foo") +# - JAVA_MAX_MEM_RATIO: Is used when no `-Xmx` option is given in JAVA_OPTS. This is +# used to calculate a default maximal heap memory based on a containers restriction. +# If used in a container without any memory constraints for the container then this +# option has no effect. If there is a memory constraint then `-Xmx` is set to a ratio +# of the container available memory as set here. The default is `50` which means 50% +# of the available memory is used as an upper boundary. You can skip this mechanism by +# setting this value to `0` in which case no `-Xmx` option is added. +# - JAVA_INITIAL_MEM_RATIO: Is used when no `-Xms` option is given in JAVA_OPTS. This +# is used to calculate a default initial heap memory based on the maximum heap memory. +# If used in a container without any memory constraints for the container then this +# option has no effect. If there is a memory constraint then `-Xms` is set to a ratio +# of the `-Xmx` memory as set here. The default is `25` which means 25% of the `-Xmx` +# is used as the initial heap size. You can skip this mechanism by setting this value +# to `0` in which case no `-Xms` option is added (example: "25") +# - JAVA_MAX_INITIAL_MEM: Is used when no `-Xms` option is given in JAVA_OPTS. +# This is used to calculate the maximum value of the initial heap memory. If used in +# a container without any memory constraints for the container then this option has +# no effect. If there is a memory constraint then `-Xms` is limited to the value set +# here. The default is 4096MB which means the calculated value of `-Xms` never will +# be greater than 4096MB. The value of this variable is expressed in MB (example: "4096") +# - JAVA_DIAGNOSTICS: Set this to get some diagnostics information to standard output +# when things are happening. This option, if set to true, will set +# `-XX:+UnlockDiagnosticVMOptions`. Disabled by default (example: "true"). +# - JAVA_DEBUG: If set remote debugging will be switched on. Disabled by default (example: +# true"). +# - JAVA_DEBUG_PORT: Port used for remote debugging. Defaults to 5005 (example: "8787"). +# - CONTAINER_CORE_LIMIT: A calculated core limit as described in +# https://www.kernel.org/doc/Documentation/scheduler/sched-bwc.txt. (example: "2") +# - CONTAINER_MAX_MEMORY: Memory limit given to the container (example: "1024"). +# - GC_MIN_HEAP_FREE_RATIO: Minimum percentage of heap free after GC to avoid expansion. +# (example: "20") +# - GC_MAX_HEAP_FREE_RATIO: Maximum percentage of heap free after GC to avoid shrinking. +# (example: "40") +# - GC_TIME_RATIO: Specifies the ratio of the time spent outside the garbage collection. +# (example: "4") +# - GC_ADAPTIVE_SIZE_POLICY_WEIGHT: The weighting given to the current GC time versus +# previous GC times. (example: "90") +# - GC_METASPACE_SIZE: The initial metaspace size. (example: "20") +# - GC_MAX_METASPACE_SIZE: The maximum metaspace size. (example: "100") +# - GC_CONTAINER_OPTIONS: Specify Java GC to use. The value of this variable should +# contain the necessary JRE command-line options to specify the required GC, which +# will override the default of `-XX:+UseParallelGC` (example: -XX:+UseG1GC). +# - HTTPS_PROXY: The location of the https proxy. (example: "myuser@127.0.0.1:8080") +# - HTTP_PROXY: The location of the http proxy. (example: "myuser@127.0.0.1:8080") +# - NO_PROXY: A comma separated lists of hosts, IP addresses or domains that can be +# accessed directly. (example: "foo.example.com,bar.example.com") +# +### +FROM registry.access.redhat.com/ubi8/openjdk-17:1.14 + +ENV LANGUAGE='en_US:en' + + +COPY build/lib/* /deployments/lib/ +COPY build/*-runner.jar /deployments/quarkus-run.jar + +EXPOSE 8080 +USER 185 +ENV JAVA_OPTS="-Dquarkus.http.host=0.0.0.0 -Djava.util.logging.manager=org.jboss.logmanager.LogManager" +ENV JAVA_APP_JAR="/deployments/quarkus-run.jar" diff --git a/src/main/docker/Dockerfile.native b/src/main/docker/Dockerfile.native new file mode 100644 index 0000000..6454e8e --- /dev/null +++ b/src/main/docker/Dockerfile.native @@ -0,0 +1,27 @@ +#### +# This Dockerfile is used in order to build a container that runs the Quarkus application in native (no JVM) mode. +# +# Before building the container image run: +# +# ./gradlew build -Dquarkus.package.type=native +# +# Then, build the image with: +# +# docker build -f src/main/docker/Dockerfile.native -t quarkus/japon . +# +# Then run the container using: +# +# docker run -i --rm -p 8080:8080 quarkus/japon +# +### +FROM registry.access.redhat.com/ubi8/ubi-minimal:8.6 +WORKDIR /work/ +RUN chown 1001 /work \ + && chmod "g+rwX" /work \ + && chown 1001:root /work +COPY --chown=1001:root build/*-runner /work/application + +EXPOSE 8080 +USER 1001 + +CMD ["./application", "-Dquarkus.http.host=0.0.0.0"] diff --git a/src/main/docker/Dockerfile.native-micro b/src/main/docker/Dockerfile.native-micro new file mode 100644 index 0000000..3fd7c87 --- /dev/null +++ b/src/main/docker/Dockerfile.native-micro @@ -0,0 +1,30 @@ +#### +# This Dockerfile is used in order to build a container that runs the Quarkus application in native (no JVM) mode. +# It uses a micro base image, tuned for Quarkus native executables. +# It reduces the size of the resulting container image. +# Check https://quarkus.io/guides/quarkus-runtime-base-image for further information about this image. +# +# Before building the container image run: +# +# ./gradlew build -Dquarkus.package.type=native +# +# Then, build the image with: +# +# docker build -f src/main/docker/Dockerfile.native-micro -t quarkus/japon . +# +# Then run the container using: +# +# docker run -i --rm -p 8080:8080 quarkus/japon +# +### +FROM quay.io/quarkus/quarkus-micro-image:1.0 +WORKDIR /work/ +RUN chown 1001 /work \ + && chmod "g+rwX" /work \ + && chown 1001:root /work +COPY --chown=1001:root build/*-runner /work/application + +EXPOSE 8080 +USER 1001 + +CMD ["./application", "-Dquarkus.http.host=0.0.0.0"] diff --git a/src/main/kotlin/fr/spacefox/japon/Resource.kt b/src/main/kotlin/fr/spacefox/japon/Resource.kt new file mode 100644 index 0000000..4a5adeb --- /dev/null +++ b/src/main/kotlin/fr/spacefox/japon/Resource.kt @@ -0,0 +1,67 @@ +package fr.spacefox.japon + +import fr.spacefox.japon.data.Category +import fr.spacefox.japon.data.Page +import fr.spacefox.japon.data.Place +import io.quarkus.qute.Template +import io.quarkus.qute.TemplateInstance +import javax.ws.rs.GET +import javax.ws.rs.Path +import javax.ws.rs.PathParam +import javax.ws.rs.Produces +import javax.ws.rs.core.MediaType + + +@Path("/") +class ListHtmlResource(val list: Template) { + + @GET + @Path("accueil") + @Produces(MediaType.TEXT_HTML) + fun accueil(): TemplateInstance = list.data("title", "Accueil") + .data("pages", Page.values()) + .withMenuData() + + @GET + @Path("category/{name}") + @Produces(MediaType.TEXT_HTML) + fun category(@PathParam("name") name: String): TemplateInstance { + val category = Category.valueOf(name) + return list + .data("title", "Catégorie :${category.displayName}") + .data("pages", category.pages()) + .withMenuData() + } +} + +@Path("/place/") +class ListWithMapHtmlResource(val listWithMap: Template) { + + @GET + @Path("{name}") + @Produces(MediaType.TEXT_HTML) + fun category(@PathParam("name") name: String): TemplateInstance { + val place = Place.valueOf(name) + return listWithMap + .data("title", "Lieu :${place.displayName}") + .data("place", place) + .data("pages", place.pages()) + .withMenuData() + } +} + + +@Path("/page/") +class PageResource(val detail: Template) { + + @GET + @Path("{name}") + @Produces(MediaType.TEXT_HTML) + fun page(@PathParam("name") name: String): TemplateInstance = detail.data("page", Page.valueOf(name)) + .withMenuData() +} + +private fun TemplateInstance.withMenuData(): TemplateInstance { + return this.data("categories", Category.values()) + .data("places", Place.values()) +} \ No newline at end of file diff --git a/src/main/kotlin/fr/spacefox/japon/data/Category.kt b/src/main/kotlin/fr/spacefox/japon/data/Category.kt new file mode 100644 index 0000000..498b127 --- /dev/null +++ b/src/main/kotlin/fr/spacefox/japon/data/Category.kt @@ -0,0 +1,15 @@ +package fr.spacefox.japon.data + +enum class Category(val displayName: String) { + chateaux("Châteaux"), + seulementaujapon("Seulement au Japon"), + temples("Temples"), + jardins("Jardins"), + panoramiques("Panoramiques"), + nature("Nature"), + shinto("Sintoïsme"), + quotidien("Vie quotidienne"), + francisla("Francis-La"); + + fun pages(): List = Page.values().filter { it.category == this } +} diff --git a/src/main/kotlin/fr/spacefox/japon/data/Content.kt b/src/main/kotlin/fr/spacefox/japon/data/Content.kt new file mode 100644 index 0000000..caf2b86 --- /dev/null +++ b/src/main/kotlin/fr/spacefox/japon/data/Content.kt @@ -0,0 +1,20 @@ +package fr.spacefox.japon.data + +interface Content { + fun render(): String +} + +data class Text(val text: String) : Content { + override fun render() = "

$text

" +} + +data class Image(val folder: String, val id: String, val title: String) : Content { + override fun render(): String { + return """
+
$title
+ + $title + +
""" + } +} \ No newline at end of file diff --git a/src/main/kotlin/fr/spacefox/japon/data/Page.kt b/src/main/kotlin/fr/spacefox/japon/data/Page.kt new file mode 100644 index 0000000..1377206 --- /dev/null +++ b/src/main/kotlin/fr/spacefox/japon/data/Page.kt @@ -0,0 +1,1773 @@ +package fr.spacefox.japon.data + +import java.time.LocalDate +import java.time.Month +import java.time.format.DateTimeFormatter + +enum class Page( + val category: Category, + val date: LocalDate, + val place: Place, + val title: String, + val content: Array +) {/* + * Nagano + */ + + ryokannagano( + category = Category.quotidien, + date = LocalDate.of(2013, Month.MAY, 22), + place = Place.nagano, + title = "Un ryokan (旅館), à Nagano", + content = arrayOf( + Text("Un ryokan est une auberge traditionnelle. Enfin, celle-ci n’en était pas vraiment une dans le sens où il n’y avait pas toutes les coutumes, mais surtout le bâtiment."), + Image("quotidien", "Nagano 24", "L’entrée de la chambre"), + Image("quotidien", "Nagano 25", "La chambre"), + Image("quotidien", "Nagano 26", "L’alcôve dans la chambre"), + Image("quotidien", "Nagano 27", "Un genre de pièce au fond"), + Image( + "quotidien", + "Nagano 28", + "Ce bâtiment est un vrai labyrinthe, avec par exemple ce genre d’escaliers" + ), + ), + ), + + zenkoji( + category = Category.temples, + date = LocalDate.of(2013, Month.MAY, 22), + place = Place.nagano, + title = "Zenkô-ji (善光寺), Nagano", + content = arrayOf( + Text("""Le Zenkô-ji est un temple bouddhiste de la ville de Nagano. Pour plus de détails, voyez avec Wikipédia ou votre source d’information préférée."""), + Image( + "temples", + "Zenko-ji 03", + "On y accède par l’inévitable allée touristique. Il n’y a pas grand monde dans cette ville de province à cette époque de l’année" + ), + Image("temples", "Zenko-ji 15", "La porte est… imposante."), + Text("""Ensuite on passe devant les 6 Roku Jizô, ce qui donne l’occasion de jouer au jeu des différences :"""), + Image("temples", "Zenko-ji 05", ""), + Image("temples", "Zenko-ji 06", ""), + Image("temples", "Zenko-ji 07", ""), + Image("temples", "Zenko-ji 08", ""), + Image("temples", "Zenko-ji 09", ""), + Image("temples", "Zenko-ji 10", ""), + Text("Puis devant un bronze de Nurebotoke, qui protège le temple de l’incendie (quand on sait qu’à peu près tous les monuments du Japon ont été incendiés et reconstruits plusieurs fois, sa présence ne surprend pas)"), + Image("temples", "Zenko-ji 21", ""), + Image("temples", "Zenko-ji 11", "On arrive enfin à l’immense bâtiment principal"), + Image("temples", "Zenko-ji 12", ""), + Image("temples", "Zenko-ji 13", ""), + Image("temples", "Zenko-ji 16", ""), + Image("temples", "Zenko-ji 17", ""), + Image("temples", "Zenko-ji 18", ""), + Image("temples", "Zenko-ji 19", ""), + Text("Comme dans l’immense majorité des temples bouddhistes, on ne photographie pas l’intérieur."), + Image("temples", "Zenko-ji 20", "Dans les jardins alentours, on trouve des annexes"), + Image("temples", "Zenko-ji 14", "Et, entre autres, la cloche principale"), + Image("temples", "Zenko-ji 01", "En partant, on tombe sur un Mujina en prière"), + Image("temples", "Zenko-ji 02", ""), + ), + ), + + wtfnagano( + category = Category.seulementaujapon, + date = LocalDate.of(2013, Month.MAY, 22), + place = Place.nagano, + title = "Curiosités de Nagano", + content = arrayOf( + Image("wtf", "WTF 29", "UNIX - salon et spa"), + Image("wtf", "WTF 32", "Prévention de l’incendie"), + Image("wtf", "WTF 31", """Happy Singer - 800 yens "seulement"…"""), + Image("wtf", "Matsumoto 046", "L’un des bus municipaux de Nagano"), + Image( + "wtf", + "Matsumoto 044", + "À Nagano, on fait des plaques d’égout à l’effigie du symbole locale (une grosse pomme) et surtout on les colorie" + ), + Image("wtf", "Matsumoto 045", "Ou alors, on a la plaque commémorative des jeux olympiques"), + ), + ), + + boissonsjaponaises( + category = Category.seulementaujapon, + date = LocalDate.of(2013, Month.MAY, 22), + place = Place.nagano, + title = "Boissons japonaises", + content = arrayOf( + Text("Il y aurait environ un distributeur automatique (自動販売機) pour 23 japonais au Japon. La plupart d’entre eux sont des distributeurs de boissons, bien pratique en été. On y trouve bien plus que le sempiternel cola. Bien trop de trucs en fait…"), + Image("wtf", "WTF 35", "La boisson Dragon Ball"), + Image( + "wtf", + "WTF 30", + "Boisson à la viande ou réduction dans un restau du coin ? Je ne sais pas trop, je n’ai pas testé - mais je n’ai vu cette chose qu’à Nagano, ce qui serait plutôt rassurant…" + ), + Text("Renseignements pris, il s’agirait simplement du thé. Le reste signifie que ça passe bien après un barbecue, ou quelque chose du genre."), + ), + ), + + memoriauxzenkoji( + category = Category.seulementaujapon, + date = LocalDate.of(2013, Month.MAY, 22), + place = Place.nagano, + title = "Hommages", + content = arrayOf( + Text("""A Zenkô-ji, outre le temple, on trouve divers mémoriaux, parfois surprenants…"""), + Image("wtf", "WTF 33", "Mémorial pour les pins et leurs aiguilles"), + Text("Ce monument a été construit en 1956 pour honorer l’esprit des pins et de leurs aiguilles. Chaque 8 avril se tient un rituel annuel pour qu’ils reposent en paix."), + Image("wtf", "WTF 34", """Monument à la chanson "Hato Poppo" (Pigeons mignons)"), + Text("Ceci est un monument à la chanson pour enfants "Hatto Poppo" (Pigeons mignons), texte de Higashi Kume et musique de Taki Rentaro. Il a été dit que Higashi Kume a écrit ce poème après avoir vu les pigeons de Zenkô-ji. Higashi Kume a écrit elle-même le texte sur le monument, et le dessin a été réalisé par Suzuki Manpei, natif de Nagano. Une compilation des chansons de Higashi Kume et Taki Rentaro appelée "Songs for kindergarteners" a été publiée en 1901."""), + Image("wtf", "WTF 36", "Tombe des outils"), + Text("Sous ces pierres sont enterrés les outils utilisés pour la construction du présent Hall Principal. En enterrant ces outils, les constructeurs du Zenkô-ji ont prié pour que les esprits des outils reposent en paix."), + Text("Les monuments en eux-mêmes n’ont aucun intérêt, donc pas de photos."), + ), + ), + + /* + * Matsumoto + */ + + sanctuairesmatsumoto( + category = Category.shinto, + date = LocalDate.of(2013, Month.MAY, 23), + place = Place.matsumoto, + title = "Sanctuaires shinto à Matsumoto", + content = arrayOf( + Image("shinto", "Matsumoto 037", "Un grand sanctuaire en centre ville"), + Image("shinto", "Matsumoto 038", "Et un petit perdu dans la forêt d’une colline d’un village à côté"), + ), + ), + + matsumotojo( + category = Category.chateaux, + date = LocalDate.of(2013, Month.MAY, 23), + place = Place.matsumoto, + title = "Le Matsumoto-jô (松本城)", + content = arrayOf( + Text("""Voilà un beau château noir (ce qui lui vaut son surnom de « corbeau ) planté au milieu des montagnes - à tel point qu’on se demande si le seigneur local n’a pas dit « Quelle belle vue ! Construisez-moi un château ici que je puisse en profiter ! ».

Plus de détails sur Wikipédia."""), + Image("chateaux", "Matsumoto 074", "Le donjon vu des jardins"), + Image("chateaux", "Matsumoto 084", ""), + Image("chateaux", "Matsumoto 079", "On approche de l’enceinte intérieure"), + Image("chateaux", "Matsumoto 078", ""), + Image("chateaux", "Matsumoto 077", "Entre la première et la seconde porte"), + Image("chateaux", "Matsumoto 080", "Depuis les jardins, le château est un peu timide"), + Image("chateaux", "Matsumoto 083", ""), + Image("chateaux", "Matsumoto 081", "On s’approche…"), + Image("chateaux", "Matsumoto 082", ""), + Text("Pas de photos à l’intérieur, c’est fort dommage, il y a des trucs rigolos. Comme les escaliers. Les japonais ont un problème avec les escaliers, j’y reviendrai. Là y’avait un étage haut comme un étage normal et demie. Donc ils ont du agrandir l’escalier. Non pas en rajoutant des marches, mais en agrandissant les marches - et en conservant l’encombrement horizontal de l’escalier normal. Ce qui donne donc un truc hybride escalier / échelle, très raide avec des marches qui approchent les 40 cm de haut…"), + Image( + "chateaux", + "Matsumoto 085", + "Il y a un pont pour traverser à un endroit - en zigzag, histoire de confusionner l’agresseur et le touriste. La zone était en restauration" + ), + Image( + "chateaux", + "Matsumoto 075", + "Pour finir, deux détails du toit, dont un avec le shachihoko protecteur anti-incendie (je ne sais plus si c’est le mâle ou le femelle par contre, il faudrait regarder sur un plan)" + ), + Image("chateaux", "Matsumoto 076", ""), + ), + ), + + jardinsmatsumoto( + category = Category.jardins, + date = LocalDate.of(2013, Month.MAY, 23), + place = Place.matsumoto, + title = "Dans les jardins de Matsumoto", + content = arrayOf( + Image("jardins", "Matsumoto 070", "Dans le parc du Matsumoto-jô"), + Image("jardins", "Matsumoto 071", ""), + Image("jardins", "Matsumoto 072", ""), + Image("jardins", "Matsumoto 073", "Dans un village à côté"), + ), + ), + + vuesmatsumoto( + category = Category.quotidien, + date = LocalDate.of(2013, Month.MAY, 23), + place = Place.matsumoto, + title = "Vues de Mastumoto et des environs", + content = arrayOf( + Text("""Depuis les bancs "pour admirer la vue" sur le pont"""), + Image("quotidien", "Matsumoto 039", ""), + Image("quotidien", "Matsumoto 040", ""), + Text("""Si on recule un peu lorsqu’on est dans le sanctuaire du centre-ville"""), + Image("quotidien", "Matsumoto 041", ""), + Text("""Depuis le 7ème étage du château (il y a bien 7 étages, il y en a un caché)"""), + Image("quotidien", "Matsumoto 069", ""), + Image("quotidien", "Matsumoto 042", "Vue sur le village à côté de Matsumoto, depuis la colline"), + Image("quotidien", "Matsumoto 043", ""), + ), + ), + + wtfmatsumoto( + category = Category.seulementaujapon, + date = LocalDate.of(2013, Month.MAY, 23), + place = Place.matsumoto, + title = "Curiosités de Matsumoto", + content = arrayOf( + Image("wtf", "Matsumoto 048", "On a trouvé Charlie !"), + Text("""Comme l’indique le petit logo, ces bancs sont là pour admirer les montagnes"""), + Image("wtf", "Matsumoto 047", ""), + Image( + "wtf", + "Matsumoto 049", + "Oui. Le logo de Matsumoto a un chapeau en forme de montagnes. Attendez de voir celui de Himeji." + ), + Text("Au Matsumoto-jô, il y a des consignes (comme à peu près partout en fait). Sauf qu’il y en a des cassées, qu’on ne peut pas le savoir avant d’avoir essayé et que si on tombe dessus, ben… tant pis. Pas de remboursement possible."), + Image("wtf", "Matsumoto 050", ""), + Image("wtf", "Matsumoto 051", "Et en cas d’incendie ?"), + Image("wtf", "Matsumoto 052", "Un immeuble de zombies ?"), + ), + ), + + campninja( + category = Category.seulementaujapon, + date = LocalDate.of(2013, Month.MAY, 23), + place = Place.matsumoto, + title = "Camp d’entraînement ninja", + content = arrayOf( + Text("""

Étant donné qu’on a vu personne, c’était un camp d’entraînement ninja, puisque par définition on ne voit pas les ninjas. Quoique prétende la série de petits panneaux « 3 à 12 ans », mais doit-on croire quelqu’un qui a une montagne sur la tête ?"""), + Image("wtf", "Matsumoto 053", """Déjà on y accède par un "escalier""""), + Image("wtf", "Matsumoto 054", "L’échelle horizontale, mais d’un accès… spécial ?"), + Image("wtf", "Matsumoto 055", "J’ai moyennement confiance en ce pont…"), + Text("Il faut marcher sur ces poteaux. Non seulement ils oscillent latéralement, mais en plus la corde qui les relie ne les maintient pas à distances égales, donc ils oscillent aussi d’avant en arrière. A moins de faire moins de 1m40, on ne peut pas se tenir aux poteaux latéraux."), + Image("wtf", "Matsumoto 056", " Je suis totalement incapable de venir à bout d’un tel obstacle"), + Image("wtf", "Matsumoto 057", "Un peu de classique"), + Image( + "wtf", + "Matsumoto 058", + "Vous aussi, marchez sur une corde raide avec seulement des bouts de ficelle qui pendouillent pour vous retenir" + ), + Image("wtf", "Matsumoto 059", "Apprenez à vous glissez silencieusement le long d’un mur…"), + Image("wtf", "Matsumoto 060", "… ou d’un filet."), + Image("wtf", "Matsumoto 061", "Passages d’obstacles. Ici, c’est soit raide, soit compliqué"), + Image("wtf", "Matsumoto 062", ""), + Image( + "wtf", + "Matsumoto 063", + "Accrochez-vous au premier, puis au second, etc. jusqu’au dernier. Pour vous donner une idée de la difficulté, je dois sauter pour attendre le plus haut alors que je mesure 1,87 m…" + ), + Image( + "wtf", + "Matsumoto 064", + "Ceci fait, on peut courir sur une poutre qui bouge latéralement et d’avant en arrière, sans rien pour se retenir (c’est beaucoup plus difficile qu’il n’y paraît). Et comme motivation, celui qui se loupe tombe dans le ravin" + ), + Image("wtf", "Matsumoto 068", "Au moins, on a le choix pour grimper à ce toboggan"), + Text("Pas assez fun ? Il y a l’autre<.strong> toboggan."), + Image("wtf", "Matsumoto 065", ""), + Image("wtf", "Matsumoto 066", ""), + Image("wtf", "Matsumoto 067", ""), + ), + ), + + /* + * Himeji + */ + + wtfhimejo( + category = Category.seulementaujapon, + date = LocalDate.of(2013, Month.MAY, 24), + place = Place.himeji, + title = "Curiosités de Himeji", + content = arrayOf( + Image( + "wtf", + "Himeji 114", + "Shiro-robot ! (Pris à la volée par la fenêtre du train, d’où la masse de câbles devant…)" + ), + Image( + "wtf", + "Himeji 115", + "Dans le jardin du château de Himeji, il est interdit de fumer le kiseru (pipe japonaise), de manger des boulettes sur un bâtonnet et de boire du saké. Quelle précision !" + ), + Image("wtf", "Himeji 118", "Le logo de Himeji"), + Text("Oui, c’est un blob avec une paire de fleurs de cerisiers dans les cheveux et avec un donjon sur la tête.

On pouvait l’acheter en peluche, mais hélas beaucoup trop cher."), + Text("L’apocalypse selon les Japonais :

Dans l’hôtel à Himeji, des bouquins. Parmi les bouquins, un Nouveau Testament, en japonais et en anglais (à côté d’un bouquin de méditations bouddhistes). Comme dans tout Nouveau Testament, on trouve l’Apocalypse, fort à propos placée page 666."), + Image("wtf", "Beppu1 132", ""), + ), + ), + + veritesamourails( + category = Category.seulementaujapon, + date = LocalDate.of(2013, Month.MAY, 24), + place = Place.himeji, + title = "La vérité sur les samouraïs", + content = arrayOf( + Text("Le samouraï se protège la tête avec un casque, qui permet aussi d’effrayer l’ennemi de part son design horrible et surprenant. Ou parfois, de le faire mourir de rire.

Par exemple, nous avons ce modèle de cornes géantes et rouges, spécial pour samouraïs cocus - pensez à l’enlever avant de passer dans une porte."), + Image("wtf", "Himeji 116", ""), + Text("Un modèle possédait des cornes bien plus grandes mais hélas totalement impossible à prendre en photo, parasité par le manque de lumière et les reflets de la vitrine.

Pour les amateurs de nourriture, voici les modèles à coquillage géant, ou où deux demi-coquilles d’oeuf (sans doute d’autruche, vue la taille :"), + Image("wtf", "Himeji 117", ""), + ), + ), + + ideestrains( + category = Category.quotidien, + date = LocalDate.of(2013, Month.MAY, 24), + place = Place.himeji, + title = "Les bonnes idées des trains Japonais", + content = arrayOf( + Image( + "quotidien", + "Himeji 104", + "Une tablette dans un Shinkansen. Une idée (parmi tant d’autres) à transmettre à la SNCF pour leurs TGV" + ), + Image("quotidien", "Beppu1 129", "Indications au sol pour les Shinkansen"), + ), + ), + + videosurveillance( + category = Category.quotidien, + date = LocalDate.of(2013, Month.MAY, 24), + place = Place.himeji, + title = "Souriez, vous êtes filmés !", + content = arrayOf( + Text("Parc du château de Himeji :"), + Image( + "quotidien", + "Himeji 107", + "Une tablette dans un Shinkansen. Une idée (parmi tant d’autres) à transmettre à la SNCF pour leurs TGV" + ), + Text("Notez le petit essuie-glace de la caméra, le projecteur et le haut-parleur permettant de communiquer avec le quidam malintentionné pris sur le fait.

D’une manière générale, le Japon est un pays sûr, mais très vidéo-surveillé."), + ), + ), + + vuehimeji( + category = Category.panoramiques, + date = LocalDate.of(2013, Month.MAY, 24), + place = Place.himeji, + title = "Vue sur Himeji", + content = arrayOf( + Image( + "quotidien", + "Himeji 106", + "Une tablette dans un Shinkansen. Une idée (parmi tant d’autres) à transmettre à la SNCF pour leurs TGV" + ), + ), + ), + + kansai( + category = Category.quotidien, + date = LocalDate.of(2013, Month.MAY, 24), + place = Place.himeji, + title = "Quelque part dans le Kansaï (関西地方)…", + content = arrayOf( + Image("quotidien", "Himeji 105", ""), + Text("En fait, la vie d’un Japonais ressemble souvent à ça. Coincé dans un minuscule appartement d’un énorme immeuble d’habitation, dans l’une des rares plaines (surpeuplées) du Japon. Les étendues d’eau au premier plan sont des rizières - le moindre mètre carré de terrain plat disponible a été transformé en rizière."), + ), + ), + + jardinshimejijo( + category = Category.jardins, + date = LocalDate.of(2013, Month.MAY, 24), + place = Place.himeji, + title = "Jardins du Himeji-jô", + content = arrayOf( + Image("jardins", "Himeji 112", ""), + Image("jardins", "Himeji 113", ""), + ), + ), + + himejijo( + category = Category.chateaux, + date = LocalDate.of(2013, Month.MAY, 24), + place = Place.himeji, + title = "Le Himeji-jô (姫路城)", + content = arrayOf( + Text("""Le superbe château du héron blanc était malheureusement en restauration au moment de la visite. Le toit du donjon et les murs qui n’étaient pas en pierre ont été entièrement démontées et mises à nu - pudique, le donjon s’est donc enveloppé dans un échafaudage géant. L’opération est lourde et doit être refaite tous les 50 ans en ce qui concerne les murs…"""), + Image("chateaux", "Himeji 086", ""), + Image("chateaux", "Himeji 089", ""), + Image( + "chateaux", + "Himeji 094", + "À l’arrière du donjon, un pont et un ascenceur géant pour les matériaux, visibles derrière ce pavillon" + ), + Text("Du coup, la visite est un peu amputée, même si l’échafaudage se visite, contient des explications intéressantes sur la restauration et un point de vue à peu près inexploitable pour cause de moult reflets.

Ça n’empêche pas le reste du domaine d’être visible, et il y a déjà de quoi faire (même si niveau superficie visitable, on reste très loin des grands châteaux français)."), + Image("chateaux", "Himeji 087", "Une porte"), + Image( + "chateaux", + "Himeji 088", + "Un mur d’enceinte, conçu pour des guerres sans armes de siège ni armes à feu de puissance. On devine les meurtrières, qui sont petites et de formes géométriques (ronds, carrés, triangles)" + ), + Image( + "chateaux", + "Himeji 090", + "La barrière et l’arbre donnent une idée des murs à escalader avant d’arriver aux murs blancs (eux munis de mâchicoulis) " + ), + Image("chateaux", "Himeji 101", ""), + Image( + "chateaux", + "Himeji 100", + "Une fois qu’on est arrivés au bout d’un mur… ben y’en a un autre. Ce truc est un labyrinthe, pour pouvoir tirer sur les ennemis le plus longtemps possible." + ), + Image("chateaux", "Himeji 095", ""), + Text("""Comme à Matsumoto, il y a des shachihokos protecteurs anti-incendie. Ici les trois dernières générations qui datent des trois dernières réfections du toit. En cadeau, un jeu des différences !"""), + Image("chateaux", "Himeji 091", ""), + Image("chateaux", "Himeji 092", ""), + Image("chateaux", "Himeji 093", ""), + Image("chateaux", "Himeji 098", "Diverses tours"), + Image("chateaux", "Himeji 099", ""), + Image( + "chateaux", + "Himeji 096", + "Au détour d’un coude, on a une vue sur les montagnes et la ville environnantes" + ), + Image( + "chateaux", + "Himeji 097", + "Du haut du château, une vue sur le Long Couloir (ne rigolez pas, c’est son vrai nom, et il le porte bien, puisqu’il fait environ 300 mètres…) avec le pavillon de la princesse au bout (en bas à droite sur la photo)" + ), + Image("chateaux", "Himeji 102", "Le même vu de l’intérieur"), + Image("chateaux", "Himeji 103", ""), + ), + ), + + /* + * Beppu + */ + + himejibeppu( + category = Category.quotidien, + date = LocalDate.of(2013, Month.MAY, 25), + place = Place.beppu, + title = "Entre Himeji et Beppu", + content = arrayOf( + Image("quotidien", "Beppu1 128", "Gare shinkansen"), + Image( + "quotidien", + "Beppu1 130", + "Des montagnes et des rizières dans tout ce qui est plat, un paysage caractéristique du Japon (en tous cas des morceaux qu’on traverse en shinkansen)" + ), + Image( + "quotidien", + "Beppu1 131", + "Appartements japonais. Oui, on voit bien 25 appartements sur cette photo…" + ), + ), + ), + + enfersbeppu( + category = Category.nature, + date = LocalDate.of(2013, Month.MAY, 25), + place = Place.beppu, + title = "Les Enfers de Beppu", + content = arrayOf( + Text("""Beppu est une ville thermale équipée de tout le confort moderne. À domicile sont fournis l’eau froide, l’électricité, les égouts, la vapeur soufrée et l’odeur d’œuf pas tout à fait frais (disponible selon le sens du vent).

On y trouve aussi et surtout moult sources chaudes qui ont fait la réputation de la ville ; celles « tièdes » où l’on peut se baigner, et les « chaudes » où seuls les démons peuvent se baigner, d’où leur nom de « Enfers »."""), + Image("nature", "Beppu1 137", "D’ailleurs, on y trouve pas mal de démons"), + Text("Sérieusement, j’espère que le kami planqué dans cette chose n’y est pas allé de lui-même…"), + Image( + "nature", + "Beppu1 136", + "Les 8 principaux ne sont pas d’intérêt égal. Par exemple, ça peut surtout faire du bruit et de la fumée" + ), + Image("nature", "Beppu1 135", "On en trouve aussi avec des nuances de bleu intéressantes"), + Image("nature", "Beppu1 139", ""), + Image("nature", "Beppu1 142", ""), + Image("nature", "Beppu1 146", ""), + Image( + "nature", + "Beppu1 145", + "Le japonais est quelqu’un de pragmatique. Non seulement ces trucs sont jolis, mais en plus on peut y faire cuire œufs, flans et sorcières (ce dernier type de cuisson est passé de mode)" + ), + Image( + "nature", + "Beppu1 140", + "Le kami qui habite ce rocher n’a pas vraiment de chance. Non seulement il doit subir des hordes de touristes, mais en plus la jolie eau bleue qui entoure sa demeure est à environ 95 °C - pas très pratique pour sortir." + ), + Image("nature", "Beppu1 154", "On y trouve aussi du rouge"), + Image("nature", "Beppu1 141", "Du très rouge"), + Image("nature", "Beppu1 152", "Et un genre de… truc gris bloblottant"), + Image( + "nature", + "Beppu1 138", + "Pourquoi s’embêter avec de l’eau ? La vapeur se suffit très bien à elle-même !" + ), + Image("nature", "Beppu1 153", "Pour vider les enfers et les nettoyer, tirez la bonde."), + Image("nature", "Beppu1 143", "Et dans tout ça, des gens festoient."), + ), + ), + + sanctuairebeppu( + category = Category.shinto, + date = LocalDate.of(2013, Month.MAY, 25), + place = Place.beppu, + title = "Visite d’un sanctuaire Shinto (神社)", + content = arrayOf( + Text("""Tiens, ne serait-ce pas un torii là au bord de cet Enfer de Beppu ?"""), + Image("shinto", "Beppu1 126", ""), + Image("shinto", "Beppu1 119", "Allons voir ! On commence par le torii principal"), + Image("shinto", "Beppu1 120", "Le bassin et les louches pour se purifier"), + Image( + "shinto", + "Beppu1 121", + "Une lanterne. Je serais curieux de savoir combien il y a de lanternes au Japon." + ), + Image("shinto", "Beppu1 125", "Une allée de torii avec des étendards sur le côté"), + Image("shinto", "Beppu1 122", ""), + Image( + "shinto", + "Beppu1 123", + "Une bestiole protectrice, qui ne fait pas partie de la paire de komainu protecteurs habituels (et d’ailleurs absents dans ce sanctuaire)" + ), + Image( + "shinto", + "Beppu1 124", + "Par respect pour le kami local (et aussi un peu parce que mes photos en clair-obscur violent sont complètement foireuses…) le sanctuaire principal ne sera pas illustré. Pour vous consoler, voici une photo d’un tout petit sanctuaire en arrière-plan" + ), + ), + ), + + tanuki( + category = Category.shinto, + date = LocalDate.of(2013, Month.MAY, 25), + place = Place.beppu, + title = "Un tanuki", + content = arrayOf( + Text("""Au détour du jardin d’un Enfer de Beppu, un tanuki à taille humaine."""), + Image("shinto", "Beppu1 127", ""), + Text("Oui, ce sont bien ses couilles…"), + ), + ), + + naturebeppu( + category = Category.nature, + date = LocalDate.of(2013, Month.MAY, 25), + place = Place.beppu, + title = "La nature à Beppu", + content = arrayOf( + Text("""En bordure d’un enfer"""), + Image("nature", "Beppu1 155", ""), + Image("nature", "Beppu1 137", ""), + Image("nature", "Beppu1 144", "Les collines alentours"), + Image("nature", "Beppu1 147", ""), + Image("nature", "Beppu1 148", "Dans une serre (quitte à avoir le chauffage par le sol…), des lotus"), + Image("nature", "Beppu1 149", ""), + Image("nature", "Beppu1 150", ""), + Image("nature", "Beppu1 151", "Et une orchidée (phalaenopsis pour les intimes)"), + ), + ), + + sourcesbeppu( + category = Category.quotidien, + date = LocalDate.of(2013, Month.MAY, 26), + place = Place.beppu, + title = "Les hauteurs de Beppu et les onsens", + content = arrayOf( + Text("""Les Enfers de Beppu se trouvent en fait dans la partie haute de la ville, dans laquelle on trouve aussi un grand nombre d’onsens de toutes sortes : du plus simple - parfois une simple mare volcanique en plein air vaguement aménagée jusqu’au complexe luxueux qui atteint la dizaine de bains. La plupart restent simples et très peu chers.Évidemment, il est complètement impossible de prendre la moindre photo de ces bains - l’extérieur n’a aucun intérêt, et l’intérieur ne se photographie pas, pour les raisons l’on imagine.

Par contre, ils sont tous très agréables (surtout ceux en plein air, mais attention aux coups de soleil !)."""), + Image( + "quotidien", + "Beppu2 163", + "Au pied de ce complexe, un ensemble de cahutes pas vraiment ancestrales, qui servent de sauna." + ), + Image("quotidien", "Beppu2 162", "Vue rapprochée"), + Image("quotidien", "Beppu2 164", "L’une d’elles est laissée ouverte pour les visiteurs"), + Image( + "quotidien", + "Beppu2 166", + "Beppu étant construite sur un volcan, on trouve des infiltrations de soufre sur les trottoirs" + ), + Image("quotidien", "Beppu2 167", "En fait, il y a des canalisations de vapeurs soufrées"), + Image( + "quotidien", + "Beppu2 168", + "En plus d’éviter les fuites en pleine rue, ces canalisations mênent à ces genres de cheminées dans lesquelles on peut faire cuire des oeufs ou des flans (les spécialités locales)" + ), + Text("Ajoutez les tremblements de terre, les tsunamis (dans la ville basse) et les typhons, et vous comprendrez que construire à Beppu ne doit pas être quelque chose de très simple. En plus de tout ça, il faut s’imaginer que toute la ville haute sent l’oeuf pas très frais (selon le sens du vent, c’est plus ou moins prenant)"), + Image("quotidien", "Beppu2 169", "L’un des ruisseaux qui dévalent la montagne"), + Image( + "quotidien", + "Beppu2 165", + "Une des nombreuses statues qui veillent sur l’habitant et le touriste" + ), + ), + ), + + naturehautbeppu( + category = Category.nature, + date = LocalDate.of(2013, Month.MAY, 26), + place = Place.beppu, + title = "Les collines au-dessus de Beppu", + content = arrayOf( + Image("nature", "Beppu2 178", "Le jardin des onsens tout en haut de la ville"), + Image( + "nature", + "Beppu2 179", + "Si on se retourne, on voit ça - je ne sais pas pourquoi ils ont rasé la colline en face…" + ), + Image("nature", "Beppu2 180", "La végétation est vite luxuriante dans le coin"), + Image("nature", "Beppu2 181", ""), + ), + ), + + wtfbeppu( + category = Category.seulementaujapon, + date = LocalDate.of(2013, Month.MAY, 26), + place = Place.beppu, + title = "Curiosités de Beppu", + content = arrayOf( + Image( + "wtf", + "Beppu1 133", + "Au Japon, des personnages de mangas accueillent les voyageurs dans les gares" + ), + Image("wtf", "Beppu2 171", "C’est spécialement vrai à Beppu, où ils ont institutionalisé le truc."), + Image("wtf", "Beppu2 170", "Oui, c’était bien Yatterman en yukata. Et voici Doronjo."), + Image("wtf", "Beppu2 176", "Et même toute la bande, soyons fous !"), + Image( + "wtf", + "Beppu2 175", + "Statue au fondateur de la ville de Beppu. Oui, il a un bébé accroché au pan de sa veste. Je n’ai pas l’explication." + ), + Image("wtf", "Beppu2 172", "Logo dans le bus qui monte au quartier des onsens"), + Image( + "wtf", + "Beppu2 174", + "En parlant de bus, voici le bouton pour demander au conducteur de s’arrêter" + ), + Text("""Les japonais aiment bien avoir un personnage rigolo pour représenter leur ville (par exemple, Matsumoto ou Himeji). Sauf qu’à Beppu, quelqu’un a cru intelligent d’essayer de placer tous les symboles de la ville.

On obtient donc un chat qui roule à vélo avec un sac à dos, qui a un nez en forme de symbole « onsen », avec une bassine pour se laver sur la tête, laquelle contient une serviette et un thermomètre en forme de tour de Beppu ; et qui aime toutes les spécialités locales."""), + Image("wtf", "Beppu2 177", ""), + Image("wtf", "Beppu2 173", "Le design, jusque dans les codes barre."), + ), + ), + /* + * Hiroshima + */ + + memorialpaix( + category = Category.jardins, + date = LocalDate.of(2013, Month.MAY, 27), + place = Place.hiroshima, + title = "Le Parc du Mémorial de la Paix de Hiroshima (広島平和記念公園)", + content = arrayOf( + Text("""Puisqu’on ne peut pas photographier dans le musée du mémorial, voici quelques photos du parc du Mémorial de la Paix de Hiroshima."""), + Image( + "jardins", + "Hiroshima1 199", + "Vue depuis l’un des deux bras de rivière qui entoure le parc. Ce dernier est à droite." + ), + Image( + "jardins", + "Hiroshima1 210", + "L’axe principal du parc est défini par l’alignement du musée du mémorial (derrière), du cénotaphe, de la flamme de la paix et du dôme de Genbaku." + ), + Image("jardins", "Hiroshima1 211", "Le cénotaphe"), + Image( + "jardins", + "Hiroshima1 212", + "La flamme de la paix, qui ne sera éteinte que lorsque sera éradiquée la dernière arme nucléaire (ce qui ne semble pas prêt d’arriver…)" + ), + Image( + "jardins", + "Hiroshima1 198", + "Le dôme de Genbaku. À ce moment là, bardé des échaffaudages des conservateurs : il a résisté à la bombe, mais a plus de mal à passer les années." + ), + Text("Dans le parc, on trouve énormément de monuments à différentes catégories de victimes - chaque corporation ayant fait ériger le sien. En voici quelques-uns."), + Image("jardins", "Hiroshima1 205", "Sans doute le plus célèbre, le monument de la paix des enfants"), + Image("jardins", "Hiroshima1 204", "Vue rapprochée"), + Image("jardins", "Hiroshima1 206", "La cloche de la paix"), + Image( + "jardins", + "Hiroshima1 207", + "En plus des très nombreux enfants (qui pour beaucoup travaillaient), Hiroshima avait une forte communauté coréenne" + ), + Image("jardins", "Hiroshima1 202", ""), + Image("jardins", "Hiroshima1 200", ""), + Image("jardins", "Hiroshima1 201", ""), + Image("jardins", "Hiroshima1 203", ""), + Image("jardins", "Hiroshima1 208", ""), + Image("jardins", "Hiroshima1 209", ""), + ), + ), + + hiroshima( + category = Category.quotidien, + date = LocalDate.of(2013, Month.MAY, 27), + place = Place.hiroshima, + title = "Dans la ville de Hiroshima", + content = arrayOf( + Image("quotidien", "Hiroshima1 187", "Le boulevard de la Paix au crépuscule"), + Image("quotidien", "Hiroshima1 188", "Un bateau-restaurant"), + Image("quotidien", "Hiroshima1 186", "Vue depuis la fenêtre de la chambre de l’auberge de jeunesse."), + Image( + "quotidien", + "Hiroshima1 190", + "Hiroshima est, paraît-il, une sorte de musée des tramways. Je veux bien le croire. Celui-ci est utilisé en service quotidien." + ), + Image( + "quotidien", + "Hiroshima1 189", + "La spécialité de Hiroshima est l’okonomiyaki (お好み焼き). Dans ce bâtiment, on trouve trois étages entiers de petits restaurants d’okomiyakis !" + ), + Image("quotidien", "Hiroshima1 184", "Passage piétons, vide…"), + Image("quotidien", "Hiroshima1 185", "… et avec les piétons dessus."), + ), + ), + + wtfhiroshima( + category = Category.seulementaujapon, + date = LocalDate.of(2013, Month.MAY, 27), + place = Place.hiroshima, + title = "Curiosités de Hiroshima", + content = arrayOf( + Image( + "wtf", + "Hiroshima1 193", + "Il me semble que Hiroshima doit être visité par tout élève Japonais au moins une fois pendant sa scolarité." + ), + Image( + "wtf", + "Hiroshima1 194", + "Les primaires en sortie scolaire ont rarement l’uniforme (mauvais exemple ici), mais presque toujours une casquette de couleur vive." + ), + Image("wtf", "Hiroshima1 191", "Enseigne de magasin"), + Image("wtf", "Hiroshima1 192", "Une autre enseigne"), + Image("wtf", "Hiroshima1 195", "D’une certaine manière, ça paraît logique…"), + Image("wtf", "Hiroshima1 196", "Choc des cultures ?"), + Image( + "wtf", + "Hiroshima1 197", + "Venez boire un verre en jouant à la NES (ou la SNES si vous voulez faire moderne) !" + ), + Image( + "wtf", + "Hiroshima2 233", + "Un panneau indicateur en pleine forêt. Pourquoi pas. Mais qui est assez tordu pour y avoir accroché une collection de DVD pornographiques ?!" + ), + ), + ), + + mitaki( + category = Category.quotidien, + date = LocalDate.of(2013, Month.MAY, 28), + place = Place.hiroshima, + title = "Balade à Mitaki", + content = arrayOf( + Text("""On nous avait conseillé, compte tenu des circonstances et ce ce qu’il y avait d’ouvert, d’aller faire un tour à Mitaki. Mitaki, c’est une ville de la banlieue de Hiroshima (10 minutes en train) où l’on trouve un complexe de temples, et une montagne avec un point de vue sur Hiroshima. Nous y sommes donc allés."""), + Image( + "quotidien", + "Hiroshima2 213", + "Le train à la gare de Mitaki. Il n’a a qu’une voie, qui se dédouble pour permettre le croisement dans les gares. Le quai unique est au milieu, on est obligés de traverser la voie pour entrer et sortir de la gare." + ), + Image("quotidien", "Hiroshima2 214", ""), + Image("quotidien", "Hiroshima2 215", "La ville derrière la colline"), + Image("quotidien", "Hiroshima2 216", "Vue sur Hiroshima"), + Text("À l’inverse de la veille où l’on a cuit, il faisait chaud mais couvert et très humide ce jour là (il a même délugé l’après-midi, la saison des pluies étant arrivée puis repartie en avance). D’où la piètre qualité de la vue."), + ), + ), + + mitakiforet( + category = Category.nature, + date = LocalDate.of(2013, Month.MAY, 28), + place = Place.hiroshima, + title = "Sur le Mitaki-Yama", + content = arrayOf( + Image( + "nature", + "Hiroshima2 217", + "Le plan de Mitaki. Les japonais semblant incapables de réaliser un plan clair, nous n’avons jamais trouvé mieux…" + ), + Image("nature", "Hiroshima2 218", "Un jardin"), + Text("Une forêt de bambous, c’est superbe mais horriblement compliqué pour que ça rende quelque chose en photo…"), + Image("nature", "Hiroshima2 219", ""), + Image("nature", "Hiroshima2 220", ""), + ), + ), + + templesmitaki( + category = Category.temples, + date = LocalDate.of(2013, Month.MAY, 28), + place = Place.hiroshima, + title = "Le complexe de temples de Mitaki", + content = arrayOf( + Text("Le complexe de temples de Mitaki comprends principalement des temples bouddhistes, mais aussi des temples shintô et des cimetières. Le tout est d’un calme absolu mais manque cruellement d’explications."), + Image( + "temples", + "Hiroshima2 229", + "Le plan du complexe. À l’ombre sous un toit, donc tellement sombre qu’illisible sans le photographier." + ), + Image("temples", "Hiroshima2 228", "Un gardien"), + Text("L’entrée."), + Image("temples", "Hiroshima2 221", ""), + Image("temples", "Hiroshima2 222", ""), + Image("temples", "Hiroshima2 223", ""), + Image("temples", "Hiroshima2 224", "L’allée principale"), + Image("temples", "Hiroshima2 225", ""), + Image("temples", "Hiroshima2 226", ""), + Image("temples", "Hiroshima2 227", ""), + Image("temples", "Hiroshima2 230", "À l’assaut de la montagne"), + Image("temples", "Hiroshima2 231", "Une pagode (à droite sur le plan)"), + Image( + "temples", + "Hiroshima2 232", + "Derrière la pagode, un cimetière (en réalité, il y a des petits cimetières de ce genre un peu partout dans le complexe" + ), + ), + ), + /* + * Miyajima + */ + + itsukushimaville( + category = Category.quotidien, + date = LocalDate.of(2013, Month.MAY, 29), + place = Place.itsukushima, + title = "Itsukushima et ses cerfs Sika", + content = arrayOf( + Text("""Itsukushima, plus connue sous le nom de Miyajima, est une île-sanctuaire Shintô. On y trouve en particulier le très célèbre Itsukushima-jinja (sanctuaire d’Itsukushima), qui est l’une des vues les plus célèbres du Japon."""), + Image("quotidien", "Miyajima 261", "Vu sur la ville"), + Text("""L’île est célèbre pour ses cervidés semi-sauvages. Enfin, « sauvages » parce qu’ils ne sont pas réellemnt apprivoisés, mais vivent librement. Ce qui ne les empêchent pas de traîner en ville et de quémander de la nourriture au touristes (ce qui pose quelques problèmes).

Contrairement à ce qu’on peut lire ou croire, ce ne sont pas des daims mais des cerfs Sika (le cousin japonais)."""), + Image("quotidien", "Miyajima 259", "*Rumine*"), + Image("quotidien", "Miyajima 260", "Je VEUX cette feuille !"), + Image("quotidien", "Miyajima 262", ""), + Image("quotidien", "Miyajima 263", ""), + Image("quotidien", "Miyajima 264", "Vue sur Hiroshima depuis le ferry du retour."), + ), + ), + + sanctuairemiyajima( + category = Category.shinto, + date = LocalDate.of(2013, Month.MAY, 29), + place = Place.itsukushima, + title = "Itsukushima-jinja (厳島神社)", + content = arrayOf( + Text("""Est-il vraiment nécessaire de présenter le Itsukushima-jinja (sanctuaire d’Itsukushima), étant donné qu’il s’agit de l’une des trois vues les plus célèbres du Japon ?"""), + Image("shinto", "Miyajima 234", "Arrivée depuis le ferry, en provenance de Hiroshima."), + Image("shinto", "Miyajima 235", ""), + Image( + "shinto", + "Miyajima 236", + "Le grand torii de l’entrée terrestre (moderne : historiquement il fallait passer en barque sous le torii flottant)." + ), + Image("shinto", "Miyajima 237", "Les deux gardiens"), + Image("shinto", "Miyajima 238", ""), + Image("shinto", "Miyajima 240", "Le très fameux torii flottant"), + Image("shinto", "Miyajima 241", ""), + Image("shinto", "Miyajima 248", ""), + Image("shinto", "Miyajima 242", "Le sanctuaire flottant"), + Image("shinto", "Miyajima 243", ""), + Image("shinto", "Miyajima 244", ""), + Image("shinto", "Miyajima 246", ""), + Image("shinto", "Miyajima 247", ""), + Image("shinto", "Miyajima 250", ""), + Image("shinto", "Miyajima 249", "Les chrétiens ont de l’eau bénite, les shintos du saké béni…"), + Image("shinto", "Miyajima 239", "Une lanterne à l’extérieur"), + Image("shinto", "Miyajima 245", "Une lanterne du temple"), + Text("Et maintenant la triste vérité : les images telles que vous les avez vues n’existent que la moitié du temps. Parce qu’en réalité tout ça est posé sur le fond, et ne donne l’illusion de flotter qu’à marée haute. L’autre moitié du temps, la marée est basse et ces endroits célèbrissimes ressemblent à ceci :"), + Image("shinto", "Miyajima 252", ""), + Image("shinto", "Miyajima 255", ""), + Image("shinto", "Miyajima 253", ""), + Image("shinto", "Miyajima 254", ""), + Image("shinto", "Miyajima 251", "En bonus, un sanctuaire tout neuf sur les hauteurs de l’île."), + ), + ), + + montmisen( + category = Category.nature, + date = LocalDate.of(2013, Month.MAY, 29), + place = Place.itsukushima, + title = "À l’assaut du Mont Misen (弥山)", + content = arrayOf( + Text("Le Mont Misen (弥山) est tout simplement le point culminant de l’île d’Itsukushima. Il culmine à 535 mètres."), + Image("nature", "Miyajima 294", "Ceci n’est pas le sommet principal."), + Text("Le concept est le suivant : on monte en téléphérique, et on descend à pieds. Depuis le sommet, la vue est superbe quoique brumeuse :"), + Image("nature", "Miyajima 305", "La mer intérieure"), + Image("nature", "Miyajima 306", "La ville"), + Image("nature", "Miyajima 309", "Le sanctuaire"), + Text("Ce qui n’est pas indiqué, c’est qu’il y a deux pièges. Le premier est que le téléphérique mène à un sommet secondaire, il faut descendre ~100 m puis remonter ~150 m pour arriver au vrai sommet (en dénivelé). Le second est que les 535 mètres de descente ne sont pas constitués par un chemin, mais par une série presque ininterrompue d’escaliers. Et d’escaliers japonais…"), + Image("nature", "Miyajima 299", ""), + Image("nature", "Miyajima 300", ""), + Image("nature", "Miyajima 301", ""), + Image("nature", "Miyajima 302", ""), + Image("nature", "Miyajima 303", ""), + Image("nature", "Miyajima 304", ""), + Image( + "nature", + "Miyajima 298", + "Ici on prévoit les grosses pluies (logique, quand il y a plusieurs cyclones par an…)" + ), + Image("nature", "Miyajima 307", "Cascades"), + Image("nature", "Miyajima 310", ""), + Image("nature", "Miyajima 308", "Soudain, au milieu du chemin"), + ), + ), + + jardinssanctuaire( + category = Category.nature, + date = LocalDate.of(2013, Month.MAY, 29), + place = Place.itsukushima, + title = "Les jardins du sanctuaire", + content = arrayOf( + Text("""Dans les jardins du Itsukushima-jinja."""), + Image("jardins", "Miyajima 297", "Bizarrement ce pont est connu."), + Image( + "jardins", + "Miyajima 296", + "Érable du Japon. Symbole de l’île, qui doit être bien plus joli en automne." + ), + Image("jardins", "Miyajima 295", "Un jardin d’un restaurant."), + ), + ), + + templesmiyajima( + category = Category.temples, + date = LocalDate.of(2013, Month.MAY, 29), + place = Place.itsukushima, + title = "Les temples d’Itsukushima", + content = arrayOf( + Text("Si Miyajima est très connue pour ses temples shintô (et le fait que l’île entière est considérée comme un sanctuaire), on trouve aussi pas mal de temples bouddhistes, surtout dans les hauteurs."), + Image("temples", "Miyajima 265", "Au moins, les escaliers des temples sont réguliers…"), + Image("temples", "Miyajima 266", ""), + Image("temples", "Miyajima 269", ""), + Image("temples", "Miyajima 267", "On peut passer en-dessous de ce temple"), + Image("temples", "Miyajima 268", ""), + Image("temples", "Miyajima 270", ""), + Image("temples", "Miyajima 271", ""), + Image("temples", "Miyajima 272", ""), + Image("temples", "Miyajima 273", ""), + Image("temples", "Miyajima 274", ""), + Image("temples", "Miyajima 275", ""), + Image("temples", "Miyajima 276", ""), + ), + ), + + wtfmiyajima( + category = Category.seulementaujapon, + date = LocalDate.of(2013, Month.MAY, 29), + place = Place.itsukushima, + title = "Curiosités d’Itsukushima", + content = arrayOf( + Image("wtf", "Miyajima 278", "Peut-être l’immeuble le plus étroit du Japon."), + Image("wtf", "Miyajima 279", "Puisque le cerf a décidé de squatter, il sera sur la photo de classe…"), + Image( + "wtf", + "Miyajima 293", + "Souvent, et en particulier lors des voyages scolaires, les primaires (équivalent CP --> 6ème inclus en France) ne sont pas en uniforme. Par contre, ils ont le sac de l’école. Car oui, les sacs de ces demoiselles sont bien le modèle de scolaire…" + ), + Image("wtf", "Miyajima 280", "Ce cheval est un kami…"), + Image("wtf", "Miyajima 281", ""), + Image("wtf", "Miyajima 282", "L’une des moult affiches publicitaires des produits locaux"), + Image( + "wtf", + "Miyajima 283", + """"Si ça existe, il existe aussi une version Hello Kitty". Ici les gâteaux-momiji (feuille d’érable) locaux.""" + ), + Image("wtf", "Miyajima 286", "La version pour amoureux"), + Image( + "wtf", + "Miyajima 284", + "La plus grande spatule à riz du monde : 7,7 m de long, 2,7 m de large, 2,5 tonnes." + ), + Image("wtf", "Miyajima 285", "Un dragon !"), + Image( + "wtf", + "Miyajima 287", + "Une longue vue ? Une table d’orientation ? Un tube métallique, c’est tellement plus simple !" + ), + Image("wtf", "Miyajima 288", "Le maillon faible."), + Image("wtf", "Miyajima 292", "Arbre, tu es ivre !"), + Image("wtf", "Miyajima 289", "Explications à l’aquarium de l’île."), + Image("wtf", "Miyajima 290", ""), + Image("wtf", "Miyajima 291", "Je n’aimerais pas poser le pied sur cet oursin…"), + ), + ), + + /* + * Kyôto + */ + + jardinkyoto( + category = Category.jardins, + date = LocalDate.of(2013, Month.MAY, 30), + place = Place.kyoto, + title = "Un jardin à Kyôto", + content = arrayOf( + Text("Un jardin à Kyôto dont j’ai totalement oublié le nom - les plus motivés pourront rechercher les jardins du côté de la gare centrale, il était par là…

Il aurait sans doute été beaucoup plus joli si le temps avait été plus clément."), + Image("jardins", "Kyoto1 315", "Vue générale"), + Image("jardins", "Kyoto1 316", ""), + Image("jardins", "Kyoto1 317", "Pont, tu es ivre !"), + Image("jardins", "Kyoto1 321", "Un autre pont, beaucoup plus compliqué."), + Image("jardins", "Kyoto1 318", "Nichée de grues (floues par manque de lumière et de matériel)"), + Image("jardins", "Kyoto1 319", "Le plan d’eau…"), + Image("jardins", "Kyoto1 320", "… est couvert de nénuphars !"), + Image("jardins", "Kyoto1 322", "Proche du jardin, une fontaine-lotus-géant."), + ), + ), + + higashihonganji( + category = Category.temples, + date = LocalDate.of(2013, Month.MAY, 30), + place = Place.kyoto, + title = "Le Higashi Hongan-ji (東本願寺)", + content = arrayOf( + Text("""Le Higashi Hongan-ji (東本願寺), ou « temple oriental du vœu originel », est l’un des deux temples dominants de la secte bouddhiste Jōdo shinshū au Japon et à l’étranger. Ce serait la plus grande construction en bois au monde (mais le Tôdai-ji revendique aussi ce titre).

Malheureusement, il était en rénovation, à l’exception du honden."""), + Image( + "temples", + "Kyoto1 323", + "Et je veux bien croire l’histoire de la taille (les personnages donnent une vague idée de l’échelle)." + ), + Image( + "temples", + "Kyoto1 324", + "Photo prise à hauteur d’yeux (les miens, donc ceux d’un type de 1,87 m)." + ), + Image("temples", "Kyoto1 325", "Intéressant système de gouttières."), + Image("temples", "Kyoto1 326", "Un dragon !"), + ), + ), + + garekyoto( + category = Category.quotidien, + date = LocalDate.of(2013, Month.MAY, 30), + place = Place.kyoto, + title = "Kyôto, sa gare ferroviaire et ses rues", + content = arrayOf( + Text("""La gare de Kyôto est un OVNI assez surprenant."""), + Image("quotidien", "Kyoto1 312", "Vue sur le hall principal."), + Image( + "quotidien", + "Kyoto1 314", + "Le grand escalier, qui va des étages 4 à 11. Oui, ce sont des diodes dans les marches. Et oui, les motifs changent." + ), + Image("quotidien", "Kyoto1 313", "Depuis le haut du même escalier."), + Text("La vue ne donne rien, à cause de la saleté des vitres qui donnent sur la ville ; et une vue de l’extérieur de la gare demandait un point de vue ou du matériel que je n’avais pas pour rendre quelque chose."), + Image("quotidien", "Kyoto1 311", "En réalité, Kyôto est plutôt un dédale de rues de ce genre."), + ), + ), + + + /* + * Nara + */ + + nara( + category = Category.quotidien, + date = LocalDate.of(2013, Month.MAY, 31), + place = Place.nara, + title = "Nara (奈良市)", + content = arrayOf( + Text("""Nara, près de Kyôto, fut la première capitale fixe du Japon. Elle a conservé un patrimoine historique très important."""), + Image("quotidien", "Nara 346", "Vue générale"), + Image("quotidien", "Nara 347", ""), + Image("quotidien", "Nara 348", "Une ruelle"), + Image( + "quotidien", + "Nara 349", + "La gare JR. Contrairement au reste du Japon, le Kansai a beaucoup de compagnies de chemin de fer privées." + ), + Image( + "quotidien", + "Nara 350", + "La ligne JR Nara <---> Kyôto, l’un des rares endroits sans passage à niveau visible." + ), + ), + ), + + jardinisuien( + category = Category.jardins, + date = LocalDate.of(2013, Month.MAY, 31), + place = Place.nara, + title = "Le jardin Isuien (依水園)", + content = arrayOf( + Text("""Le jardin Isuien (依水園) est sans doute le plus connu des jardins japonais à Nara, et l’un des plus beaux exemples de paysage emprunté existant."""), + Image("jardins", "Nara 351", "La mare"), + Image("jardins", "Nara 352", ""), + Image( + "jardins", + "Nara 353", + "Vue générale. Le jardin est en pleine ville, la limite jardin / paysage lointain se voit mieux sur la photo qu’en vrai." + ), + Image( + "jardins", + "Nara 354", + "Une autre vue générale. Le toit est celui du musée attenant, hors du jardin." + ), + Image("jardins", "Nara 355", ""), + Image("jardins", "Nara 356", ""), + ), + ), + + parcdescerfs( + category = Category.jardins, + date = LocalDate.of(2013, Month.MAY, 31), + place = Place.nara, + title = "Le parc des cerfs et la forêt primaire de Kasugayama", + content = arrayOf( + Text("""Les différents sites historiques de Nara sont entourés par un immense parc, le parc des cerfs, et prolongés par la forêt primaire de Kasugayama.

Contrairement à leurs cousins de Miyajima, les cerfs Sika de Nara sont apprivoisés depuis plus de mille ans."""), + Image("jardins", "Nara 364", "Conséquence : ces cerfs sont tout sauf farouches."), + Image("jardins", "Nara 365", "… non, impossible de parler d’une bête sauvage."), + Image("jardins", "Nara 357", "La rue pittoresque de Nara"), + Text("""Un bâtiment dont j’ai oublié la fonction, entre le temple et le Kasuga-taisha."""), + Image("jardins", "Nara 358", ""), + Image("jardins", "Nara 359", "Un palier ? Pour quoi faire ?"), + Image("jardins", "Nara 360", ""), + Image("jardins", "Nara 366", "L’étang à l’entrée est plein de tortues."), + Text("L’arrière du parc est en fait le début de la forêt primaire."), + Image("jardins", "Nara 361", ""), + Image("jardins", "Nara 362", ""), + Image("jardins", "Nara 363", ""), + ), + ), + + kasugataisha( + category = Category.shinto, + date = LocalDate.of(2013, Month.MAY, 31), + place = Place.nara, + title = "Le Kasuga-taisha (春日大社)", + content = arrayOf( + Text("""Le Kasuga-taisha (春日大社) est un santuraire shintô de Nara. Il est situé dans le parc des cerfs et est célèbre pour ses milliers de lanternes."""), + Image("shinto", "Nara 343", "L’arrivée au sanctuaire."), + Image( + "shinto", + "Nara 340", + "En fait, ici poussent deux arbres qui ne sont pas sensés pouvoir pousser ensemble." + ), + Image( + "shinto", + "Nara 342", + "Vue générale du sanctuaire. On voit bien les deux arbres qui partient du même endroit." + ), + Image("shinto", "Nara 341", "Oui, le bâtiment a été construit autour de l’arbre."), + Image("shinto", "Nara 339", ""), + Text("près les lanternes en pierre de l’extérieur, les lanternes en bronze de l’intérieur :"), + Image("shinto", "Nara 338", ""), + Image("shinto", "Nara 337", ""), + Image("shinto", "Nara 336", ""), + Image("shinto", "Nara 332", "Plus qu’un sanctuaire, c’est un complexe :"), + Image("shinto", "Nara 335", ""), + Image("shinto", "Nara 334", "Le kami local semble très apprécié"), + Image( + "shinto", + "Nara 333", + "Il paraît que plus les kamis sont petits, plus ils sont susceptibles. Je n’irais pas taquiner celui-ci…" + ), + Image("shinto", "Nara 331", "Gros plan sur une lanterne"), + Image("shinto", "Nara 344", "Un dragon !"), + ), + ), + + todaiji( + category = Category.temples, + date = LocalDate.of(2013, Month.MAY, 31), + place = Place.nara, + title = "Le Tōdai-ji (東大寺)", + content = arrayOf( + Text("""Le Tōdai-ji (東大寺) est le principal et plus connu temple bouddhiste de Nara."""), + Image("temples", "Nara 367", "Vendredi, outre les touristes on trouve beaucoup de scolaires."), + Text("""Le bâtiment principale, le Higashi Hongan-ji pour le titre de "plus grande construction en bois du monde"."""), + Image("temples", "Nara 368", ""), + Image("temples", "Nara 369", ""), + Image("temples", "Nara 370", "La cour"), + Image("temples", "Nara 381", ""), + Image( + "temples", + "Nara 371", + "L’immense, très connue et très compliquée à photographier statue de Bouddha Vairocana" + ), + Image("temples", "Nara 373", ""), + Image("temples", "Nara 372", "À côté, un plus petit Bouddha."), + Image("temples", "Nara 378", "Idem de l’autre côté"), + Image("temples", "Nara 374", "Le gardien de gauche…"), + Image("temples", "Nara 375", "… et celui de droite."), + Image("temples", "Nara 376", "Mais pourquoi diable tous ces enfants font la queue ?"), + Text("Pour passer dans ce trou, dont la taille est celle d’une narine du grand Bouddha. On dit qu’y arriver est gage de bonheur (mais ça nécessite d’etre un jeune enfant, ou de petit calibre et très souple)."), + Image("temples", "Nara 377", ""), + Image("temples", "Nara 379", ""), + Image( + "temples", + "Nara 380", + "Binzuru - le guérisseur : en le touchant où l’on est malade, la maladie disparaît." + ), + ), + ), + + kofukuji( + category = Category.temples, + date = LocalDate.of(2013, Month.MAY, 31), + place = Place.nara, + title = "Le Kōfuku-ji (興福寺)", + content = arrayOf( + Text("""Le Kōfuku-ji (興福寺) est un autre temple de Nara, malheureusement en travaux lorsque j’y étais."""), + Image("temples", "Nara 384", "La pagode"), + Image("temples", "Nara 382", "Une cloche géante"), + Image("temples", "Nara 383", "Un mini-Bouddha dans une niche de pierre"), + ), + ), + + wtfnara( + category = Category.seulementaujapon, + date = LocalDate.of(2013, Month.MAY, 31), + place = Place.nara, + title = "Curiosités de Nara", + content = arrayOf( + Text("""Un escalier à l’intérieur du Tôdai-ji."""), + Image("wtf", "Nara 388", ""), + Text("""À l’extérieur du Kôfuku-ji. C’est un vrai escalier, les natifs ont l’air de le trouver normal."""), + Image("wtf", "Nara 397", ""), + Text("""Ceci est une réponse à la question « Pourquoi y a-t-il si peu de gens sur tes photos ? ». Parce que par exemple, ici, je voulais photographier le cerf tranquillement installé au milieu de la foule, mais impossible de le faire : ces collégiennes ont insisté pour que je prenne cette photo."""), + Image("wtf", "Nara 386", ""), + Text("Vendeur de gâteaux pour cerfs. Parfois on voit les touristes les manger. Et il y a toujours un troupeau de cerfs gourmands qui ont parfaitement compris où les touristes achètent ces friandises.

À noter qu’à défaut de gâteaux, le cerf s’intéresse aussi aux papiers, aux tissus et à tout ce qui ressemble à une feuille ou une gaufrette - parfois au grand dam des enfants et au péril de l’intégrité de leurs goûters."), + Image("wtf", "Nara 387", ""), + Image("wtf", "Nara 396", "Ils peuvent se montrer très insistants."), + Text("Nara est une ville magique : quand vous avez nourri les cerfs, câjolé les cerfs et admiré les cerfs, vous pouvez acheter leur peau et leurs bois."), + Image("wtf", "Nara 392", ""), + Image("wtf", "Nara 389", "… sisi, ça se vends…"), + Image("wtf", "Nara 398", "Ceci aussi."), + Image("wtf", "Nara 390", "Cela dit, la mascotte de la ville explique bien des choses."), + Image( + "wtf", + "Nara 385", + "On peut être dans une ville historique et voir des sculptudes d’un goût étrange dans la rue." + ), + Image("wtf", "Nara 400", "Si on lève les yeux, ce n’est pas beaucoup mieux."), + Image("wtf", "Nara 391", ""), + Image("wtf", "Nara 393", "Ce caillou a l’air sacré."), + Image("wtf", "Nara 399", """Restau "français" (pas testé)"""), + Image( + "wtf", + "Nara 394", + "Toutes ces plaquettes votives pour demander l’amour ! C’est-y pas mignon ! Mais, qu’aperçois-je au fond ? Allons voir…" + ), + Image( + "wtf", + "Nara 395", + "… Oui. Ce sont bien des plaquettes votives. Avec des paires de nichons et ce qui ressemble à des penis habillés de kimonos. Je vous laisse imaginer le genre de demandes que l’on peut faire au kami sur ce genre de plaquette…" + ), + ), + ), + + /* + * Kyôto (nord-ouest) + */ + + nijojo( + category = Category.chateaux, + date = LocalDate.of(2013, Month.JUNE, 1), + place = Place.kyoto, + title = "Le Nijō-jō (二条城)", + content = arrayOf( + Text("""Le Nijō-jō (二条城) est un ancien palais impérial de Kyôto. Il est connu entre autres pour son parquet rossignol : toutes les lattes grincent volontairement à peine on y touche, et produisent des sons différents.

Malheureusement on ne peut pas photographier l’intérieur. Par contre, on peut en visiter les jardins."""), + Image("chateaux", "Kyoto2 448", "L’extérieur, côté cour."), + Image("chateaux", "Kyoto2 449", "L’extérieur, côté jardin"), + Image("chateaux", "Kyoto2 447", "Un détail"), + Image("chateaux", "Kyoto2 446", "Un pavillon dans un jardin"), + ), + ), + + nijojojardins( + category = Category.jardins, + date = LocalDate.of(2013, Month.JUNE, 1), + place = Place.kyoto, + title = "Les jardins du Nijō-jō (二条城)", + content = arrayOf( + Text("""Tout simplement les jardins du Nijō-jō."""), + Image( + "jardins", + "Kyoto2 405", + "Vue d’un bout du jardin, d’une partie du château. Kyôto en arrière-plan." + ), + Image("jardins", "Kyoto2 406", "Un angle de la muraille intérieure."), + Image("jardins", "Kyoto2 402", ""), + Image("jardins", "Kyoto2 403", ""), + Image("jardins", "Kyoto2 407", ""), + Image("jardins", "Kyoto2 404", "Cet étang m’a l’air poissonneux."), + ), + ), + + pavillondor( + category = Category.temples, + date = LocalDate.of(2013, Month.JUNE, 1), + place = Place.kyoto, + title = "Le Kinkaku-ji (金閣寺) « Temple du pavillon d’or »", + content = arrayOf( + Text("""Le Kinkaku-ji (金閣寺), ce qui signifie "Temple du pavillon d’or", est l’un des temples les plus connues de Kyôto, et donc l’une des attractions les plus touristiques."""), + Image( + "temples", + "Kyoto2 417", + "LA vue standard. Puisque prise du point de vue prévu à cet effet près de l’entrée." + ), + Image("temples", "Kyoto2 419", "Vu sous un autre angle"), + Text("En fait, ce truc est spécialement conçu pour impressionné (cf l’article Wikipédia pour les détails). Et ça marche. Conséquence : ça grouille de monde, donc prendre une photo potable est très difficile. Pour vous donner une idée, voici ce que je voyais en reculant de quelques pas après avoir pris la première photo :"), + Image("temples", "Kyoto2 418", ""), + Image("temples", "Kyoto2 420", "Vue générale du chemin…"), + ), + ), + + ryoanji( + category = Category.temples, + date = LocalDate.of(2013, Month.JUNE, 1), + place = Place.kyoto, + title = "Le Ryōan-ji (竜安寺 / 龍安寺)", + content = arrayOf( + Text("""Le Ryōan-ji (竜安寺 / 龍安寺) est un monastère Zen de Kyôto."""), + Image("temples", "Kyoto2 421", "Une porte du monastère"), + Image("jardins", "Kyoto2 409", "Vue du jardin sec"), + Image("jardins", "Kyoto2 410", ""), + Image("jardins", "Kyoto2 411", "Version miniature du jardin sec"), + Image("jardins", "Kyoto2 412", "Les jardins"), + Image("jardins", "Kyoto2 413", ""), + Text("La vérité sur le jardin sec Zen : il grouillait de monde, dont pas mal de scolaires bavards. Mais le pire restait sans doute la paire de vieilles peaux françaises qui n’arrêtaient pas de râler très fort que tous ces jeunes troublaient le calme des lieux…"), + Image("jardins", "Kyoto2 408", ""), + ), + ), + + ninnaji( + category = Category.temples, + date = LocalDate.of(2013, Month.JUNE, 1), + place = Place.kyoto, + title = "Le Ninna-ji (仁和寺)", + content = arrayOf( + Text("""Le Ninna-ji (仁和寺) est un temple de Kyôto. Pour une fois, on peut photographier l’intérieur ! Et bien sûr, il possède un jardin."""), + Image("temples", "Kyoto2 422", ""), + Image("temples", "Kyoto2 423", ""), + Image("temples", "Kyoto2 424", ""), + Image("temples", "Kyoto2 426", ""), + Image("temples", "Kyoto2 427", ""), + Image("temples", "Kyoto2 431", ""), + ), + ), + + ninnajijardins( + category = Category.jardins, + date = LocalDate.of(2013, Month.JUNE, 1), + place = Place.kyoto, + title = "Les jardins du Ninna-ji (仁和寺)", + content = arrayOf( + Text("""Tout simplement les jardins du Ninna-ji (仁和寺) ."""), + Image("jardins", "Kyoto2 414", ""), + Image("jardins", "Kyoto2 415", ""), + Image("temples", "Kyoto2 425", ""), + Image("temples", "Kyoto2 429", ""), + Image("temples", "Kyoto2 428", ""), + Image("temples", "Kyoto2 430", ""), + Image("jardins", "Kyoto2 416", ""), + ), + ), + + myoshinji( + category = Category.temples, + date = LocalDate.of(2013, Month.JUNE, 1), + place = Place.kyoto, + title = "Le complexe de Myōshin-ji (妙心寺)", + content = arrayOf( + Text("""Le complexe de Myōshin-ji (妙心寺) est un complexe de temples Rinzai Zen.

Ce fut sans doute l’une des expériences les plus bizarres du séjour : le lieu est bien indiqué sur le plan, mais une fois qu’on y arrive… plus rien. Pas une explication. Personne. Et contrairement aux autres temples de la journées, cela ne ressemble pas à un musée ou à un temple antique.

Pour commencer, le complexe est un dédale d’allées dans ce style :"""), + Image("temples", "Kyoto2 432", ""), + Image("temples", "Kyoto2 433", ""), + Image("temples", "Kyoto2 434", ""), + Image( + "temples", + "Kyoto2 435", + "Un temple. Ils sont tous fermés au public, ce sont de vrais temples, en foncitonnement." + ), + Image("temples", "Kyoto2 436", ""), + Image("temples", "Kyoto2 437", "Détail"), + Image("temples", "Kyoto2 438", "Passage entre deux temples, ou temple double ?"), + Image("temples", "Kyoto2 439", ""), + ), + ), + + /* + * Kyôto (sud-est) + */ + + fushimiinari( + category = Category.shinto, + date = LocalDate.of(2013, Month.JUNE, 2), + place = Place.kyoto, + title = "Le Fushimi Inari taisha (伏見稲荷大社)", + content = arrayOf( + Text("""Le Fushimi Inari taisha (伏見稲荷大社) est un sanctuaire Shinto de Kyôto. Il est très connu pour ses allées de torii qui courent jusqu’en haut de la montagne."""), + Image("shinto", "Kyoto3 475", ""), + Image("shinto", "Kyoto3 476", "L’entrée du sanctuaire"), + Image("shinto", "Kyoto3 495", ""), + Image("shinto", "Kyoto3 482", ""), + Text("On trouve beaucoup de statues du renard Inari (稲荷神), qui est selon les sources le kami lui-même ou le gardien du temple."), + Image("shinto", "Kyoto3 478", ""), + Image("shinto", "Kyoto3 479", ""), + Image("shinto", "Kyoto3 480", ""), + Image("shinto", "Kyoto3 481", ""), + Image("shinto", "Kyoto3 492", ""), + Image("shinto", "Kyoto3 493", ""), + Image("shinto", "Kyoto3 494", ""), + Image("shinto", "Kyoto3 484", ""), + Image("shinto", "Kyoto3 487", "Les plaquettes votives sont aussi en forme de renard"), + Image("shinto", "Kyoto3 485", "Les fameuses allées de torii"), + Image("shinto", "Kyoto3 488", ""), + Image("shinto", "Kyoto3 489", "Les textes sont les noms des donateurs"), + Image( + "shinto", + "Kyoto3 486", + "Vous pouvez acheter le vôtre pour agrandir la collection (divisez les prix par 130 pour convertir en euros)" + ), + Image("shinto", "Kyoto3 483", "Des plaquettes votives en forme de torii"), + Image("shinto", "Kyoto3 477", ""), + Image("shinto", "Kyoto3 490", ""), + ), + ), + + kiyomizydera( + category = Category.temples, + date = LocalDate.of(2013, Month.JUNE, 2), + place = Place.kyoto, + title = "Le Kiyomizu-dera (清水寺)", + content = arrayOf( + Text("""Le Kiyomizu-dera (清水寺) est l’un des temples bouddhiques les plus connus de Kyôto."""), + Image("temples", "Kyoto3 467", "Vue générale"), + Image("temples", "Kyoto3 466", "Vue plus rapprochée"), + Image("temples", "Kyoto3 462", "Ce que l’on voit depuis la plate-forme"), + Image("temples", "Kyoto3 465", "Le bâtiment principal est entouré de tout un complexe"), + Image("temples", "Kyoto3 463", "La chute Otowa-no-taki et l’impressionnante queue pour y accéder"), + Image( + "temples", + "Kyoto3 464", + "À l’intérieur du bâtiment principal. L’espèce de chaudron est en réalité une sorte de gong." + ), + ), + ), + + dimanchekyoto( + category = Category.quotidien, + date = LocalDate.of(2013, Month.JUNE, 2), + place = Place.kyoto, + title = "Un dimanche à Kyôto", + content = arrayOf( + Image("quotidien", "Kyoto3 452", "Vue générale de Kyôto"), + Image("quotidien", "Kyoto3 453", ""), + Text("""Gion (祇園) est un ancien quartier de Kyôto, connu entre autres pour ses Geishas."""), + Image("quotidien", "Kyoto3 458", ""), + Image("quotidien", "Kyoto3 459", ""), + Image("quotidien", "Kyoto3 460", ""), + Image( + "quotidien", + "Kyoto3 454", + "Ce ne sont pas des Geishas mais de jeunes femmes déguisées pour faire plaisir aux touristes. Les authentiques Geishas sont invisibles." + ), + Text("Le dimanche, on voit beaucoup de femmes en kimono (surtout dans les endroits touristiques ou on peut en louer). C’est très rare la semaine, et le samedi ce sont surtout de vieilles femmes."), + Image("quotidien", "Kyoto3 456", ""), + Text("""Un coin curieux : un grand complexe de sanctuaires shinto, qui laisse une impression de « banlieue pavillonnaire pour kamis »…"""), + Image("shinto", "Kyoto3 497", ""), + Image("shinto", "Kyoto3 496", ""), + Image("quotidien", "Kyoto3 455", "Kyôto est une ville touristique…"), + Image("quotidien", "Kyoto3 472", ""), + Image("quotidien", "Kyoto3 451", "Les inévitables escaliers"), + Image("nature", "Kyoto3 461", "Forêt près de Kyôto"), + Image("quotidien", "Kyoto3 457", "Ici, l’on prends les tremblements de terre au sérieux."), + ), + ), + + wtfkyoto( + category = Category.seulementaujapon, + date = LocalDate.of(2013, Month.MAY, 30), + place = Place.kyoto, + title = "Curiosités de Kyôto", + content = arrayOf( + Image("wtf", "Kyoto1 327", "Gouttières en cuivre. C’est joli mais nécessite d’avoir les moyens."), + Image("wtf", "Kyoto1 328", "Le temps de lire les noms, on a déjà dépassé le panneau."), + Image( + "wtf", + "Kyoto1 329", + "Ceci est une pompe à essence normale en ville au Japon. La photo est bien dans le bon sens." + ), + Image( + "wtf", + "Kyoto1 330", + """Lycéenne typique. Le Japon, le pays où se promener avec un parapluie et une foultitude de peluches accrochées au sac est considéré comme "normal".""" + ), + Image( + "wtf", + "Kyoto2 440", + "Jeu dans le jardin du temple du pavillon d’or : il s’agit de lancer une pièce dans un bol" + ), + Image("wtf", "Kyoto2 441", "Même les indications de toilettes ont des habits traditionnels ici…"), + Image( + "wtf", + "Kyoto2 442", + "Au détour d’un couloir, dans un temple classé au patrimoine mondial de l’humanité par l’UNESCO." + ), + Image("wtf", "Kyoto2 443", "Souriez !"), + Image("wtf", "Kyoto2 444", "C’est bien la peine de faire autant de fleur pour obtenir cette cerise…"), + Image("wtf", "Kyoto2 445", "Un volet d’un temple du complexe de Myōshin-ji."), + Image( + "wtf", + "Kyoto3 468", + "Interlude… (ceux qui ont vu des animés dans le japon contemporai comprendront)" + ), + Image("wtf", "Kyoto3 489", "Une gouttière. Sisi."), + Image("wtf", "Kyoto3 470", """Quand on appuie sur ce katana, il fait "pouet !"…"""), + Image("wtf", "Kyoto3 471", "Qu’a donc fait ce pauvre pigeon ?"), + Image("wtf", "Kyoto3 474", "Plot de signalisation du quartier de Gion."), + Image("wtf", "Kyoto3 473", "Hmmmm…"), + ), + ), + + /* + * Tôkyô + */ + + kanda( + category = Category.quotidien, + date = LocalDate.of(2013, Month.JUNE, 3), + place = Place.tokyo, + title = "Le quartier de Kanda et les alentours du palais impérial", + content = arrayOf( + Image("quotidien", "Tokyo 502", "Des immeubles tous neufs !"), + Image("quotidien", "Tokyo 532", ""), + Image("quotidien", "Tokyo 503", "Un peu plus loin, les douves du palais impérial"), + Image("quotidien", "Tokyo 504", "Le très grand torii du très controversé Yasukuni-jinja"), + Image("quotidien", "Tokyo 506", """Le cahier des charges de se sanctuaire devait être "Impressionnez !""""), + Image("quotidien", "Tokyo 505", "Une statue du même sanctuaire"), + ), + ), + + metrotokyo( + category = Category.quotidien, + date = LocalDate.of(2013, Month.JUNE, 3), + place = Place.tokyo, + title = "Le métro de Tôkyô", + content = arrayOf( + Text("Le métro de Tôkyô est sans doute le plus compliqué du monde. Plusieurs opérateurs, plans de lignes abscons, manque total d’homogénéité qui rend le repérage assez délicat."), + Image("quotidien", "Tokyo 509", "Sur certaines lignes, on a même de la publicité sur les poignées"), + Text("Sans doute la ligne la plus compliquée du métro le plus compliqué du monde. La ligne de métro se transforme en train aux deux bouts, tous les métros ne vont pas dans les mêmes directions, n’ont pas les mêmes terminus et ne s’arrêtent pas à toutes les stations."), + Image("quotidien", "Tokyo 518", ""), + Image("wtf", "Tokyo 584", ""), + ), + ), + + asakusa( + category = Category.quotidien, + date = LocalDate.of(2013, Month.JUNE, 4), + place = Place.tokyo, + title = "Asakusa (浅草)", + content = arrayOf( + Text("Asakusa (浅草) est un quartier de Tôkyô."), + Image("quotidien", "Tokyo 528", ""), + Image("quotidien", "Tokyo 530", "Rues typiques"), + Image("quotidien", "Tokyo 531", ""), + Image("quotidien", "Tokyo 529", "Le siège de la brasserie Asahi"), + ), + ), + + sensoji( + category = Category.temples, + date = LocalDate.of(2013, Month.JUNE, 4), + place = Place.tokyo, + title = "Le Sensō-ji (浅草寺)", + content = arrayOf( + Text("""Le Sensō-ji (浅草寺) est un temple bouddhique très touristique du quartier d’Asakusa."""), + Image("temples", "Tokyo 572", "L’une des lanternes géantes caractéristiques."), + Image( + "temples", + "Tokyo 573", + "Les marchands du temple. Habituels au Japon, mais pas dans ces proportions." + ), + Image("temples", "Tokyo 575", ""), + Image("temples", "Tokyo 576", "Les jardins"), + Image("temples", "Tokyo 574", "La pagode"), + Image("temples", "Tokyo 577", ""), + ), + ), + + skytree( + category = Category.quotidien, + date = LocalDate.of(2013, Month.JUNE, 4), + place = Place.tokyo, + title = "La Tokyo Skytree (東京スカイツリー) et Sumida", + content = arrayOf( + Text("""La Tokyo Skytree (東京スカイツリー) est une tour de radiodiffusion du quartier de Sumida. C’est aussi la 2ème plus haute structure au monde encore debout en 2013, juste derrière la Burj Khalifa, avec 643 mètres."""), + Image("quotidien", "Tokyo 521", "La Tôkyô Skytree"), + Image("quotidien", "Tokyo 523", ""), + Image("quotidien", "Tokyo 527", ""), + Image("quotidien", "Tokyo 524", "Sumida"), + Image("quotidien", "Tokyo 522", ""), + Image("quotidien", "Tokyo 525", ""), + Image("quotidien", "Tokyo 526", ""), + ), + ), + + jardinsimperial( + category = Category.jardins, + date = LocalDate.of(2013, Month.JUNE, 5), + place = Place.tokyo, + title = "Les jardins du Palais Impérial", + content = arrayOf( + Image("jardins", "Tokyo 554", ""), + Image("jardins", "Tokyo 555", ""), + Image("jardins", "Tokyo 557", ""), + Image("jardins", "Tokyo 561", ""), + Image("jardins", "Tokyo 563", ""), + Image("jardins", "Tokyo 567", ""), + Image("jardins", "Tokyo 568", ""), + Image("jardins", "Tokyo 556", "Japon ou Bretagne ?"), + Image("jardins", "Tokyo 560", ""), + Image("jardins", "Tokyo 562", ""), + Image("jardins", "Tokyo 564", ""), + Image("jardins", "Tokyo 558", "Les jardins sont encerclés d’immeubles modernes…"), + Image("jardins", "Tokyo 566", ""), + Image("jardins", "Tokyo 569", ""), + Image( + "jardins", + "Tokyo 570", + "Il y en avait des parterres entiers, mais il aurait fallu être là deux semaines plus tôt pour en profiter vraiment" + ), + Image("jardins", "Tokyo 571", ""), + Image("jardins", "Tokyo 565", "Une salle de concerts. Mais… pourquoi ?!"), + ), + ), + + akihabara( + category = Category.seulementaujapon, + date = LocalDate.of(2013, Month.JUNE, 5), + place = Place.tokyo, + title = "Akihabara (秋葉原)", + content = arrayOf( + Text("""Akihabara (秋葉原) est un quartier très particulier de Tôkyô. Connu depuis des décennies pour ses magasins d’électronique, on y trouve aussi un nombre incalculable de magasins de jeux, de vidéos, de mangas, de gadgets en tous genre dont raffolent les otakus, des maid cafés et des magasins de porno / sex shops en tous genre."""), + Image("quotidien", "Tokyo 533", "Façades d’immeubles"), + Image("quotidien", "Tokyo 535", ""), + Image( + "quotidien", + "Tokyo 534", + "Devantures de Maid Cafés (on ne photographie pas les maids, même dans la rue)" + ), + Image("quotidien", "Tokyo 537", ""), + Image("quotidien", "Tokyo 536", "Il y a beaucoup de monde ici…"), + Image("quotidien", "Tokyo 508", "Dans un magasin"), + Image("quotidien", "Tokyo 559", "Dans la rue…"), + Image("quotidien", "Tokyo 507", "Dans un magasin"), + Text("""Curieusement, ce masque Krauser (Detroit Metal City) a été trouvé à Asakusa…"""), + Image("wtf", "Tokyo 587", ""), + Image( + "wtf", + "Tokyo 594", + "Par contre on y trouve bien ce mélange improbable entre Krauser et Hatsune Miku de Vocaloid…" + ), + ), + ), + + museeghibli( + category = Category.seulementaujapon, + date = LocalDate.of(2013, Month.JUNE, 6), + place = Place.tokyo, + title = "Le musée Ghibli", + content = arrayOf( + Text("Le principal inconvénient de ce musée, c’est qu’y aller relève de l’expédition (achat des billets, temps de trajet jusqu’à Mitaka, dans la banlieue de Tôkyô, contraintes horaires sur la visite). Peu de photos : on ne photographie pas l’intérieur."), + Image( + "quotidien", + "Tokyo 538", + "Indications depuis la gare. Ah oui, c’est à 1,2 km de la gare. En fait, le transport depuis le centre de Tôkyô coûte plus cher que le billet." + ), + Image("quotidien", "Tokyo 539", ""), + Image( + "quotidien", + "Tokyo 540", + "Tant qu’à être le principal intérêt de la ville, Ghibli en a designé le blason" + ), + Image("quotidien", "Tokyo 541", "L’entrée, enfin !"), + Image("quotidien", "Tokyo 542", "Le bâtiment ressemble à… lui-même."), + Image("quotidien", "Tokyo 543", "Sur les toits, un robot du Château dans le Ciel…"), + Image("quotidien", "Tokyo 544", ""), + Image("quotidien", "Tokyo 546", ""), + Image( + "quotidien", + "Tokyo 545", + "… et un cube étrange (et des gamins, parce que ça grouille littéralement de gamins)" + ), + Text("""Boutique Ghibli (en fait celle de Sumida)"""), + Image("quotidien", "Tokyo 519", ""), + Image("quotidien", "Tokyo 520", ""), + ), + ), + + odaiba( + category = Category.quotidien, + date = LocalDate.of(2013, Month.JUNE, 7), + place = Place.tokyo, + title = "Odaiba (お台場)", + content = arrayOf( + Text("Odaiba (お台場) est une île artificielle de la baie de Tôkyô. On y trouve un complexe de bains publics, d’immenses centres commerciaux, des tours d’habitation et le siège de la Fuji TV. On y accède par le Rainbow Bridge. Un autre intérêt est l’excellente vue sur Tôkyô."), + Image("quotidien", "Tokyo 549", "Le Rainbow Bridge"), + Image("quotidien", "Tokyo 551", ""), + Image("quotidien", "Tokyo 549", "Depuis l’ancien fort"), + Image("quotidien", "Tokyo 550", "Vue sur Tôkyô"), + Image("quotidien", "Tokyo 553", "Les locaux de la Fuji TV"), + Image("quotidien", "Tokyo 552", "Une statue de la Liberté ?!"), + Image("quotidien", "Tokyo 547", "D’immenses tours d’habitations"), + Image( + "wtf", + "Tokyo 598", + """Les centres commerciaux sont en fait sans aucun intérêt, et ne vendent pratiquement que des fringues à l’occidentale. Par contre, l’ambiance "luxe" peut être… surprenante !""" + ), + ), + ), + + wtftokyo( + category = Category.quotidien, + date = LocalDate.of(2013, Month.JUNE, 3), + place = Place.tokyo, + title = "Curiosités de Tôkyô", + content = arrayOf( + Image("wtf", "Tokyo 578", "Automobilistes, lisez vite !"), + Image("wtf", "Tokyo 579", "Soudain, une école chic libère ses élèves."), + Image("wtf", "Tokyo 580", """"Sens interdit de 0 à 12 h et aliens de 12 à 13 h" ?!"""), + Image("wtf", "Tokyo 581", "Intéressant concept d’adaptateur électrique…"), + Image("wtf", "Tokyo 582", ""), + Image("wtf", "Tokyo 583", ""), + Image("wtf", "Tokyo 585", "Un genre de crèche ou de maternelle"), + Image("wtf", "Tokyo 586", "Si, ça roule…"), + Image("wtf", "Tokyo 588", ""), + Image("wtf", "Tokyo 589", ""), + Image("wtf", "Tokyo 590", """« La pizzeria sous le pont de chemin de fer », c’est une vraie adresse."""), + Image("wtf", "Tokyo 591", "Troupeau de toupies à béton"), + Image("wtf", "Tokyo 592", """« Interdit de tourner à droite », en somme."""), + Image("wtf", "Tokyo 593", "L’alliance de la tradition et de la modernité"), + Image("wtf", "Tokyo 595", "Ce carillon vous donne l’heure."), + Image("wtf", "Tokyo 596", "Entrée d’un neko café (café avec des chats)"), + Image("wtf", "Tokyo 597", "Bateau du maître des takoyaki (boulettes de poulpe)."), + ), + ), + + francisla( + category = Category.francisla, + date = LocalDate.of(2013, Month.MAY, 21), + place = Place.nagano, + title = "La page de Francis-La", + content = arrayOf( + Text("""Prêt pour une bonne nuit de sommeil dans le ryokan de Nagano."""), + Image("francisla", "Francis-la 157", ""), + Text("""Une Guiness à deux pas du château de Matsumoto."""), + Image("francisla", "Francis-la 158", ""), + Text("""Dans le bus pour les hauteurs de Mastumoto."""), + Image("francisla", "Francis-la 159", ""), + Text("""L’entrée du château de Himeji !"""), + Image("francisla", "Francis-la 160", ""), + Text("""Paré pour faire un tour aux onsens de Beppu !"""), + Image("francisla", "Francis-la 161", ""), + Text("""Devant le dôme de Genbaku."""), + Image("francisla", "Francis-la 183", ""), + Text("""Devant le torii flottant de l’Itsukushima-jinja."""), + Image("francisla", "Miyajima 256", ""), + Text("Non ?"), + Image("francisla", "Miyajima 257", ""), + Text("""Téléphérique pour le Mont Misen."""), + Image("francisla", "Miyajima 258", ""), + Text("""De retour de Nara, c’est Francis-La qui conduit le train !"""), + Image("francisla", "Nara 345", ""), + Text("""Le vélo, moyen de transport idéal à Kyôto (et très utilisé un peu partout au Japon)."""), + Image("francisla", "Kyoto2 401", ""), + Text("""Francis-la et sa nouvelle amie 雛菊 (Hinagiku), une renarde qu’il a rencontrée au Fushimi Inari taisha (伏見稲荷大社)"""), + Image("francisla", "Kyoto3 450", ""), + Text("""Francis-la et Hinagiku dans les jardins du Palais Impérial."""), + Image("francisla", "Tokyo 498", ""), + Text("""Francis-la à Asakusa."""), + Image("francisla", "Tokyo 499", ""), + Image("francisla", "Tokyo 500", ""), + Text("""En route pour le musée Ghibli !"""), + Image("francisla", "Tokyo 501", ""), + ), + ), + ; + + private val formatter = DateTimeFormatter.ofPattern("EEEE dd MMMM yyyy") + + fun dateHuman(): String = formatter.format(date) + + fun timestamp(): Long = date.toEpochDay() +} diff --git a/src/main/kotlin/fr/spacefox/japon/data/Place.kt b/src/main/kotlin/fr/spacefox/japon/data/Place.kt new file mode 100644 index 0000000..217b11e --- /dev/null +++ b/src/main/kotlin/fr/spacefox/japon/data/Place.kt @@ -0,0 +1,60 @@ +package fr.spacefox.japon.data + +enum class Place(val displayName: String, val iframeSrc: String, val link: String) { + nagano( + displayName = "Nagano", + iframeSrc = + "https://www.google.com/maps?f=q&source=s_q&hl=fr&geocode=&q=Nagano,+Pr%C3%A9fecture+de+Nagano,+Japon&aq=0&oq=nagano&sll=36.177791,137.80426&sspn=1.877743,4.22699&ie=UTF8&hq=&hnear=Nagano,+Pr%C3%A9fecture+de+Nagano,+Japon&t=p&ll=37.405074,139.855957&spn=6.979889,16.501465&z=6&output=embed", + link = + "https://www.google.com/maps?f=q&source=embed&hl=fr&geocode=&q=Nagano,+Pr%C3%A9fecture+de+Nagano,+Japon&aq=0&oq=nagano&sll=36.177791,137.80426&sspn=1.877743,4.22699&ie=UTF8&hq=&hnear=Nagano,+Pr%C3%A9fecture+de+Nagano,+Japon&t=p&ll=37.405074,139.855957&spn=6.979889,16.501465&z=6"), + matsumoto( + displayName = "Matsumoto", + iframeSrc = + "https://www.google.com/maps?f=q&source=s_q&hl=fr&geocode=&q=Matsumoto,+Pr%C3%A9fecture+de+Nagano,+Japon&aq=0&oq=matsumot&sll=37.0625,-95.677068&sspn=107.090143,270.527344&ie=UTF8&hq=&hnear=Matsumoto,+Pr%C3%A9fecture+de+Nagano,+Japon&t=p&ll=37.125286,138.22998&spn=7.005806,16.45752&z=6&output=embed", + link = + "https://www.google.com/maps?f=q&source=embed&hl=fr&geocode=&q=Matsumoto,+Pr%C3%A9fecture+de+Nagano,+Japon&aq=0&oq=matsumot&sll=37.0625,-95.677068&sspn=107.090143,270.527344&ie=UTF8&hq=&hnear=Matsumoto,+Pr%C3%A9fecture+de+Nagano,+Japon&t=p&ll=37.125286,138.22998&spn=7.005806,16.45752&z=6"), + himeji( + displayName = "Himeji", + iframeSrc = + "https://www.google.com/maps?f=q&source=s_q&hl=fr&geocode=&q=Himeji,+Pr%C3%A9fecture+de+Hy%C5%8Dgo,+Japon&aq=0&oq=himeji&sll=36.253133,138.850708&sspn=3.751586,8.453979&ie=UTF8&hq=&hnear=Himeji,+Pr%C3%A9fecture+de+Hy%C5%8Dgo,+Japon&t=p&ll=35.173808,135.834961&spn=3.59183,8.22876&z=7&output=embed", + link = + "https://www.google.com/maps?f=q&source=embed&hl=fr&geocode=&q=Himeji,+Pr%C3%A9fecture+de+Hy%C5%8Dgo,+Japon&aq=0&oq=himeji&sll=36.253133,138.850708&sspn=3.751586,8.453979&ie=UTF8&hq=&hnear=Himeji,+Pr%C3%A9fecture+de+Hy%C5%8Dgo,+Japon&t=p&ll=35.173808,135.834961&spn=3.59183,8.22876&z=7"), + beppu( + displayName = "Beppu", + iframeSrc = + "https://www.google.com/maps?f=q&source=s_q&hl=fr&geocode=&q=Beppu,+Pr%C3%A9fecture+d\'%C5%8Cita,+Japon&aq=0&oq=Beppu&sll=34.678394,134.351807&sspn=3.825721,8.453979&t=p&ie=UTF8&hq=&hnear=Beppu,+Pr%C3%A9fecture+d\'%C5%8Cita,+Japon&ll=33.28462,131.495361&spn=3.673271,8.22876&z=7&iwloc=A&output=embed", + link = + "https://www.google.com/maps?f=q&source=embed&hl=fr&geocode=&q=Beppu,+Pr%C3%A9fecture+d\'%C5%8Cita,+Japon&aq=0&oq=Beppu&sll=34.678394,134.351807&sspn=3.825721,8.453979&t=p&ie=UTF8&hq=&hnear=Beppu,+Pr%C3%A9fecture+d\'%C5%8Cita,+Japon&ll=33.28462,131.495361&spn=3.673271,8.22876&z=7&iwloc=A"), + hiroshima( + displayName = "Hiroshima", + iframeSrc = + "https://www.google.com/maps?sll=37.06250000000001,-95.67706800000002&sspn=76.93536935117227,102.44083790758059&t=p&q=hiroshima&dg=opt&ie=UTF8&hq=&hnear=Hiroshima,+Pr%C3%A9fecture+de+Hiroshima,+Japon&ll=34.134542,132.890625&spn=3.637121,8.22876&z=7&iwloc=A&output=embed", + link = + "https://www.google.com/maps?sll=37.06250000000001,-95.67706800000002&sspn=76.93536935117227,102.44083790758059&t=p&q=hiroshima&dg=opt&ie=UTF8&hq=&hnear=Hiroshima,+Pr%C3%A9fecture+de+Hiroshima,+Japon&ll=34.134542,132.890625&spn=3.637121,8.22876&z=7&iwloc=A&source=embed"), + itsukushima( + displayName = "Itsukushima (Miyajima)", + iframeSrc = + "https://maps.google.com/maps?f=q&source=s_q&hl=fr&geocode=&q=Itsukushima-jinja,+Hatsukaichi,+Pr%C3%A9fecture+de+Hiroshima,+Japon&aq=0&oq=Itsukushima&sll=37.0625,-95.677068&sspn=58.72842,107.841797&t=p&ie=UTF8&hq=Itsukushima-jinja,+Hatsukaichi,+Pr%C3%A9fecture+de+Hiroshima,+Japon&ll=34.307711,132.409973&spn=0.226874,0.514297&z=11&output=embed", + link = + "https://maps.google.com/maps?f=q&source=embed&hl=fr&geocode=&q=Itsukushima-jinja,+Hatsukaichi,+Pr%C3%A9fecture+de+Hiroshima,+Japon&aq=0&oq=Itsukushima&sll=37.0625,-95.677068&sspn=58.72842,107.841797&t=p&ie=UTF8&hq=Itsukushima-jinja,+Hatsukaichi,+Pr%C3%A9fecture+de+Hiroshima,+Japon&ll=34.307711,132.409973&spn=0.226874,0.514297&z=11"), + kyoto( + displayName = "Kyôto", + iframeSrc = + "https://maps.google.com/maps?f=q&source=s_q&hl=fr&geocode=&q=kyoto&aq=&sll=37.0625,-95.677068&sspn=61.452931,107.841797&ie=UTF8&hq=&hnear=Kyoto,+Pr%C3%A9fecture+de+Kyoto,+Japon&t=p&ll=35.012002,135.966797&spn=7.196108,16.45752&z=6&output=embed", + link = + "https://maps.google.com/maps?f=q&source=embed&hl=fr&geocode=&q=kyoto&aq=&sll=37.0625,-95.677068&sspn=61.452931,107.841797&ie=UTF8&hq=&hnear=Kyoto,+Pr%C3%A9fecture+de+Kyoto,+Japon&t=p&ll=35.012002,135.966797&spn=7.196108,16.45752&z=6"), + nara( + displayName = "Nara", + iframeSrc = + "https://maps.google.com/maps?f=q&source=s_q&hl=fr&geocode=&q=nara&t=p&ie=UTF8&hq=&hnear=Nara,+Pr%C3%A9fecture+de+Nara,+Japon&ll=34.669359,135.681152&spn=3.613962,8.22876&z=7&output=embed", + link = + "https://maps.google.com/maps?f=q&source=embed&hl=fr&geocode=&q=nara&t=p&ie=UTF8&hq=&hnear=Nara,+Pr%C3%A9fecture+de+Nara,+Japon&ll=34.669359,135.681152&spn=3.613962,8.22876&z=7"), + tokyo( + displayName = "Tôkyô", + iframeSrc = + "https://maps.google.fr/maps?f=q&source=s_q&hl=fr&geocode=&q=tokyo&aq=&sll=48.680792,2.502588&sspn=3.315151,8.453979&ie=UTF8&hq=&hnear=Tokyo,+Japon&t=p&ll=35.817813,139.658203&spn=7.124687,16.45752&z=6&output=embed", + link = + "https://maps.google.fr/maps?f=q&source=embed&hl=fr&geocode=&q=tokyo&aq=&sll=48.680792,2.502588&sspn=3.315151,8.453979&ie=UTF8&hq=&hnear=Tokyo,+Japon&t=p&ll=35.817813,139.658203&spn=7.124687,16.45752&z=6"),; + + fun pages(): List = Page.values().filter { it.place == this } +} diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties new file mode 100644 index 0000000..e69de29 diff --git a/src/main/resources/templates/base.qute.html b/src/main/resources/templates/base.qute.html new file mode 100644 index 0000000..85b39c3 --- /dev/null +++ b/src/main/resources/templates/base.qute.html @@ -0,0 +1,52 @@ + + + + + Un renard au Japon – {#insert title}Default Title{/} + + + + + + + + + + + + +

+

Un renard au Japon

+

Votre renard préféré au Japon. Un âne au nom comme un jeu de mots vaseux squatte...

+
+ + +
+ {#insert}No body!{/insert} +
+ + diff --git a/src/main/resources/templates/detail.qute.html b/src/main/resources/templates/detail.qute.html new file mode 100644 index 0000000..3f51c60 --- /dev/null +++ b/src/main/resources/templates/detail.qute.html @@ -0,0 +1,8 @@ +{#include base} + {#title}{page.title}{/title} +

{page.title}

+

Le {page.dateHuman} à {page.place.displayName}

+ {#for element in page.content} + {element.render().raw} + {/for} +{/include} \ No newline at end of file diff --git a/src/main/resources/templates/list.qute.html b/src/main/resources/templates/list.qute.html new file mode 100644 index 0000000..d3e9bc0 --- /dev/null +++ b/src/main/resources/templates/list.qute.html @@ -0,0 +1,30 @@ +{#include base} + {#title}{title}{/title} +

{title}

+ + + + + + + + + + + {#for page in pages} + + + + + + + {/for} + + + + +{/include} \ No newline at end of file diff --git a/src/main/resources/templates/listWithMap.qute.html b/src/main/resources/templates/listWithMap.qute.html new file mode 100644 index 0000000..35a31a3 --- /dev/null +++ b/src/main/resources/templates/listWithMap.qute.html @@ -0,0 +1,33 @@ +{#include base} + {#title}{title}{/title} +

{title}

+ + + + + + + + + + + {#for page in pages} + + + + + + + {/for} + + + +
Agrandir le plan + + +{/include} \ No newline at end of file