J'ai créé une image Docker pour la version japonaise de SDAPS

introduction

SDAPS est un logiciel OMR (lecture optique de marques) qui crée et compile des questionnaires pour les questionnaires en utilisant du papier à copie générale et des scanners de documents, qui ne nécessitent pas de papier spécial pour les feuilles de repères.

Il ne convient pas aux applications telles que les examens d'entrée qui nécessitent des résultats stricts, mais il présente des avantages tels que la non-nécessité de remplir (cela peut être modifié pour remplir avec checkmode = fill) et pas besoin de préparer de papier spécial. ..

image.png

Puisque SDAPS ne prend pas en charge le japonais, j'ai créé un questionnaire contenant du texte japonais et créé une image Docker qui exécute une commande sdaps modifiée afin de pouvoir générer un rapport.

L'image Docker créée est publiée sur Docker Hub, et le fichier Docker et les parties modifiées sont publiés sur Git Hub.

Livrables

Les parties modifiées sont publiées sur le Github et Docker Hub suivants.

Matériel de référence

J'ai répertorié les URL auxquelles j'ai fait référence lors de la rédaction de cet article.

Environnement de développement

Pour le développement, nous construisons et poussons l'image Docker dans l'environnement suivant. Le conteneur Docker que j'ai créé est également basé sur Ubuntu 20.04 pour cet environnement de développement.

environnement de test

Nous testons la capacité de créer des questionnaires, de lire et de modifier des images TIFF dans les environnements suivants.

L'équipement suivant est utilisé pour imprimer et lire le questionnaire.

À propos de l'utilisation d'un photocopieur

Jusqu'à présent, je n'ai pas utilisé de photocopieuse pour préparer le questionnaire. Dans le passé, nous avons rencontré des problèmes en raison de la faible qualité d'impression par défaut, mais ces dernières années, nous avons été en mesure de le gérer sans problème, même lorsque nous augmentons temporairement le nombre de feuilles à l'aide d'un photocopieur à la destination où nous avons demandé la distribution. Cependant, étant donné que la qualité d'impression dépend fortement des paramètres du photocopieur, il est recommandé de tester minutieusement à l'avance et d'enregistrer les paramètres pour garantir la reproductibilité afin que la sortie puisse être obtenue avec la définition la plus élevée possible. ..

Comment utiliser

Il peut y avoir des bogues dérivés de sdaps et un message d'erreur peut apparaître, mais je vais vous présenter comment utiliser la commande en les incluant.

Lors de l'exécution de la commande, utilisez la fonction de volume de Docker pour créer un répertoire de travail pour le fichier TeX de la feuille de réponses et le répertoire du projet, et assurez-vous de le monter sur / proj dans le conteneur.

Flux de travail

En gros, ils sont utilisés dans l'ordre suivant.

  1. Créez un répertoire de travail et déplacez-le (par exemple dev.proj1 /; cd dev.proj1)
  2. Créez un fichier TeX pour le questionnaire (par exemple, example-ja.tex)
  3. Exécutez la commande de configuration pour créer le répertoire du projet
  4. Scannez le questionnaire rempli et placez le fichier TIFF dans votre répertoire de travail (par exemple 01.tif, 02.tif, ...)
  5. Répétez la commande add pour enregistrer le fichier TIFF
  6. Exécutez la commande de reconnaissance pour extraire les données
  7. Créez un fichier de rapport avec la commande report_tex (par exemple report_1.pdf)
  8. Extraire les données brutes avec la commande csv (par exemple data_1.csv)

travail de préparation

L'image Docker à utiliser doit être extraite avant d'exécuter la commande.

Exemple d'exécution de pull


$ sudo docker pull yasuhiroabe/sdaps-ja:ub2004-2
ub2004-2: Pulling from yasuhiroabe/sdaps-ja
e6ca3592b144: Pull complete
...
Digest: sha256:26458bd39267149a3ccebc36f60a3082e0f519545596166accede1eac4eed8f7
Status: Downloaded newer image for yasuhiroabe/sdaps-ja:ub2004-2
docker.io/yasuhiroabe/sdaps-ja:ub2004-2

À propos du répertoire de travail

Bien qu'il ne soit pas enregistré dans GitHub, les répertoires dev.proj1 /, dev.proj2 / work sont créés pour le travail, et des exemples de fichiers TeX de feuille de réponses et de répertoires de projet sont placés.

Pour référence, je publierai l'état final du répertoire dev.proj2.

Résultat de sortie de la commande tree


$ tree dev.proj2
dev.proj2
├── 01.tif
├── 02.tif
├── 20200310_survey
│   ├── 1.tif
│   ├── 2.tif
│   ├── data_1.csv
│   ├── data_2.csv
...
│   ├── questionnaire.pdf
...
│   ├── report_1.pdf
│   ├── report_2.pdf
...
│   ├── translator-sdaps-dictionary-English.dict
...
└── 20200310_survey.tex

1 directory, 43 files

Exemple de questionnaire japonais

Le fichier utilisé pour le test est publié. Veuillez vous référer à l'original car certains commentaires et contenus ont été supprimés.

example.Exemple d'intégration du japonais basé sur tex


\documentclass[
  english,
  a4paper, 
  checkmode=check,
  pagemark,
  stamp]{sdapsclassic}
\usepackage[utf8]{inputenc}
% For demonstration purposes
\usepackage{multicol}

\usepackage{xltxtra}
\setmainfont{IPAPMincho}
\setsansfont{IPAPGothic}
\setmonofont{IPAGothic}
\XeTeXlinebreaklocale "ja"

\author{auteur}
\title{Titre}

\begin{document}
  \begin{questionnaire}
    \begin{info}
      \texttt{info}Vous pouvez ajouter n'importe quel texte en utilisant l'environnement.
    \end{info}

    \addinfo{Date}{10.03.2013}

    \section{Évaluation de 5e année}
    \singlemark{À quelle fréquence utilisez-vous SDAPS??}{rare}{tous les jours}

  \end{questionnaire}
\end{document}

Il est possible de remplacer certaines des phrases fixes prédéfinies.

translator-sdaps-dictionary-English.exemple de dict


\ProvidesDictionary{translator-sdaps-dictionary}{English}

\providetranslation{infotext}{Comment remplir/Instructions to fill out the form.}
\providetranslation{standard-deviation}{Standard-Deviation}
\providetranslation{info-cross}{Exemple de marque/Check}
\providetranslation{info-correct}{Exemple de modification/Uncheck to correct}
\providetranslation{answers}{Answers}
\providetranslation{questionnaireid}{Questionnaire-ID:}
\providetranslation{surveyid}{Survey-ID:}
\providetranslation{draft}{draft}
\providetranslation{info-mark}{For questions with a range (1-5) choose the answer the mark that fits best.}
\providetranslation{info-select}{Pour des choses comme la satisfaction, indiquez un sur une échelle de cinq.}
\providetranslation{mean}{Mean}

Voici comment example-ja.tex et Translator-sdaps-dictionary-English.dict sont placés dans le répertoire de travail (dev.proj1).

python


$ tree dev.proj1/
dev.proj1/
├── example-ja.tex
└── translator-sdaps-dictionary-English.dict

0 directories, 2 files

Suivez les étapes ci-dessous pour générer un questionnaire.

python


$ sudo docker run --rm -v `pwd`/dev.proj1:/proj \
  --name sdaps-ja \
  yasuhiroabe/sdaps-ja:ub2004-2 \
  setup --add translator-sdaps-dictionary-English.dict \
  work/ example-ja.tex

Le questionnaire est placé dans dev.proj1 / work / questionnaire.pdf dans cet exemple.

image.png

[Supplément] Comment obtenir l'original Translator-sdaps-dictionary-English.dict

Si vous pouvez l'installer à partir d'un package sur Ubuntu etc., vous pouvez le copier depuis / usr / share / sdaps / tex /, mais si ce n'est pas possible, notez comment l'extraire de l'image Docker.

Puisque "docker cp" ne peut pas être utilisé pour extraire des fichiers à partir d'images, c'est un peu gênant, mais vous pouvez extraire le fichier d'origine par la méthode suivante.

Copiez les fichiers à l'intérieur du conteneur dans votre système de fichiers local


##Exécutez la commande sdaps("-rm"Aucune option)
$ docker run yasuhiroabe/sdaps-ja:latest

##Vérifiez l'ID du conteneur
$ docker ps -a |grep sdaps-ja
a9e5dcb2a026        yasuhiroabe/sdaps-ja:latest   "/run.sh --help"         17 seconds ago      Exited (0) 16 s
econds ago                       eloquent_haibt

##Copiez les fichiers requis à l'aide de l'ID de conteneur
$ docker cp a9e5dcb2a026:/usr/share/sdaps/tex/translator-sdaps-dictionary-English.dict my-translator.dict

commande de configuration

Après avoir créé le fichier TeX pour la feuille de réponses, laissez la commande sdaps créer le répertoire du projet. La création d'un répertoire avec le nom du projet à l'avance entraînera une erreur.

exemple d'exécution de configuration


$ make proj1-setup
sudo docker run --rm \
        -v `pwd`/dev.proj1:/proj \
        --name sdaps-ja \
        yasuhiroabe/sdaps-ja:ub2004-2 \
        setup \
        --add translator-sdaps-dictionary-English.dict \
        work/ example-ja.tex

Message lors de l'exécution d'une commande


This is XeTeX, Version 3.14159265-2.6-0.999991 (TeX Live 2019/Debian) (preloaded format=xelatex)
 restricted \write18 enabled.
entering extended mode
This is XeTeX, Version 3.14159265-2.6-0.999991 (TeX Live 2019/Debian) (preloaded format=xelatex)
 restricted \write18 enabled.
entering extended mode
...
Running xelatex now multiple times to generate the questionnaire.
Running xelatex now multiple imes to generate the questionnaire.
Titre
Author:auteur
Date: 10.03.2013

Questionnaire.pdf sera placé dans le répertoire de projet spécifié (dev.proj1 / work /).

Dans cet exemple, Translator-sdaps-dictionary-English.dict est spécifié. (Optionnel) Ce fichier sera copié si vous créez le répertoire du projet, mais si vous souhaitez l'obtenir à l'avance, vous pouvez le faire de la manière suivante.

ajouter une commande

Scannez le questionnaire, placez un fichier multipage TIFF (01.tif dans cet exemple) dans le répertoire de votre projet, puis exécutez add.

ajouter un exemple d'exécution


$ make proj1-add
sudo docker run --rm \
        -v `pwd`/sdaps.proj:/proj \
        yasuhiroabe/sdaps-ja:ub2004-2 add work 01.tiff

Message lors de l'exécution d'une commande


Processing 01.tiff
Done

L'équipement que vous utilisez ne peut stocker que 25 pages de réponses dans un seul fichier, donc si vous dépassez ce seuil, exécutez la commande add plusieurs fois.

reconnaître la commande

Lorsque l'enregistrement de la feuille de réponses est terminé, c'est la phase d'analyse de la feuille enregistrée.

recognize


$ make proj1-recognize 
sudo docker run --rm \
        -v `pwd`/dev.proj1:/proj \
        yasuhiroabe/sdaps-ja:ub2004-2 \
        recognize work

Message lors de l'exécution d'une commande


Connection Error (Failed to connect to socket /var/run/dbus/system_bus_socket: No such file or directory)
Connection Null
...
Warning: 1.tif, 1: Matrix not recognized.
Warning: No page number for page 1.tif, 1 exists.
Warning: Got a wrong survey ID (1.tif, 1)! It is None, but should be 2449560734.
Warning: 1.tif, 3: Matrix not recognized.
Warning: No page number for page 1.tif, 3 exists.
Warning: Got a wrong survey ID (1.tif, 3)! It is None, but should be 2449560734.
4 sheets
Processed 4 of 4 sheets, took 1.852894 seconds
‘‘‘

## report_commande tex

Il est utilisé pour extraire le fichier PDF du rapport en fonction du résultat de l'analyse.


#### **`report_exemple d'exécution tex`**
```bash

$ make proj1-reporttex 
    sudo docker run --rm \
    -v `pwd`/dev.proj1:/proj \
    yasuhiroabe/sdaps-ja:ub2004-2 \
    report_tex work/ 

Message lors de l'exécution d'une commande


Unable to init server: Could not connect: Connection refused
Unable to init server: Could not connect: Connection refused
This is XeTeX, Version 3.14159265-2.6-0.999991 (TeX Live 2019/Debian) (preloaded format=xelatex)
 restricted \write18 enabled.
entering extended mode
...
Running xelatex now multiple times to generate the report.

Répertoire du projet une fois le traitement terminé(dev.proj1/work/)Dans le rapport_.Un fichier pdf a été généré. report_Dans les options de la commande tex,--create-tex*Il existe une option et une fonction pour extraire les fichiers TeX, mais c'est/Puisque la progression est sortie vers tmp, si vous voulez l'utiliser, sélectionnez un répertoire approprié./Montez-le sur tmp. Cet exemple est dans le makefile GNU, proj2-Décrit dans la tâche reporttex.

report_1.Le résultat est sorti au format pdf comme suit."Answers:", "Mean:", "Standard-Deviation:"Si vous souhaitez traduire de telles choses en japonais, traducteur-sdaps-dictionary-English.Veuillez changer le dict.

image.png

##commande csv

Il est utilisé lorsque vous souhaitez extraire des données brutes au format CSV. Utilisé pour vérifier que le contenu du rapport est correct. Lors du calcul des écarts avec Excel, des valeurs légèrement différentes peuvent être affichées en raison de différences dans les méthodes de traitement des erreurs.

exemple d'exécution csv


$ make proj1-csv 
sudo docker run --rm \
   -v `pwd`/dev.proj1:/proj \
   yasuhiroabe/sdaps-ja:ub2004-2 \
   csv export work/ 

Le fichier CSV généré correspond aux données du répertoire du projet._*.Il est sorti en csv.

text:dev.proj1/work/data_2.Contenu du csv


questionnaire_id,global_id,empty,valid,recognized,review,verified,1_review,1_1_review,1_1
None,None,0,1,1,,0,,,3
None,None,1,0,1,,0,,,-1
None,None,0,1,1,,0,,,4
None,None,1,0,1,,0,,,-1

C'est tout pour les principaux exemples d'utilisation.

#Problèmes rencontrés lors du travail

Notez le dernier problème rencontré en travaillant. s'il vous plaît venez si vous avez de l'intérêt.

##J'obtiens une erreur lorsque j'exécute le rapport sdaps

Uniquement lorsqu'il est exécuté depuis l'intérieur du conteneur"Unable to init server: Could not connect: Connection refused"Le message s'affiche.

Ligne de commande lorsqu'une erreur se produit


## Dans dev.proj2 / à l'avance, le fichier TeX du questionnaire et le répertoire 20200310_survey / avec sdaps ajoutés les réponses sont placés.
$ sudo docker run --rm -v `pwd`/dev.proj2:/proj \
        --name sdaps-ja \
        yasuhiroabe/sdaps-ja:ub2004-2 report 20200310_survey/

Je ne connaissais pas le moment de l'erreur, j'ai donc créé un script de démarrage et observé le processus avec strace.

Exécuter pour le débogage.sh


!/bin/bash

cd "${WORKING_DIR}"
strace sdaps "$@"

Un message y est émis

python


connect(6, {sa_family=AF_UNIX, sun_path=@"/home/sdaps/.cache/broadway1.socket"}, 38) = -1 ECONNREFUSED (Connection refused)

Apparemment, la bibliothèque que je charge dans le processus de traitement des images en coulisses semble ne pas se connecter au serveur X pendant le processus d'initialisation. Même dans un environnement local où les sdaps peuvent être exécutés correctement, si vous pointez la variable d'environnement DISPLAY vers la personne qui n'est pas en cours d'exécution, cela échouera.

Reproduction d'erreur


$ env DISPLAY="" sdaps report 20200310_survey
------------------------------------------------------------------------------
- SDAPS -- report
------------------------------------------------------------------------------
Unable to init server: Could not connect: Connection refused
Unable to init server: Could not connect: Connection refused

Par conséquent, lors de la définition de la variable d'environnement DISPLAY sur docker run--J'ai décidé de l'ajouter avec l'option env. Ubuntu 20.Puisque le serveur 04 X n'a que le socket de domaine unix ouvert(Le port 6000 est fermé)、/tmp/.X11-unix est monté. Cette zone est basée sur la sortie de lsof et le lien dans les informations de référence.

Pourtant, l'erreur autour de DBus demeure, mais je vais la passer pour le moment.

Erreur suivante autour de DBus


$ make proj2-report
sudo docker run --rm \
        -e DISPLAY=:0.0 \
        -v /tmp/.X11-unix:/tmp/.X11-unix \
        -v `pwd`/dev.proj2:/proj \
        --name sdaps-ja \
                sdaps-ja \
        report 20200310_survey/  

(sdaps:1): dbind-WARNING **: 13:41:40.375: Couldn't connect to accessibility bus: Failed to connect to socket 
/tmp/dbus-5MKrJQOOU3: Connection refused

Même si vous ne vous connectez pas au serveur X, le processus se termine normalement par une erreur, donc ces variables ne sont pas définies lors de l'utilisation réelle.

Recommended Posts

J'ai créé une image Docker pour la version japonaise de SDAPS
J'ai essayé de faire une version japonaise de la transmission automatique du courrier de Rails / devise
J'ai créé un plug-in pour IntelliJ IDEA
J'ai créé un outil Diff pour les fichiers Java
J'ai créé un conteneur Docker pour exécuter Maven
[RSpec] J'ai écrit un test pour télécharger une image de profil.
J'ai créé un outil de vérification pour le module de version
J'ai fait une méthode pour demander la prime vendredi
J'ai créé une bibliothèque pour afficher des tutoriels sur Android.
J'ai créé une application de chat.
Fait le côté serveur du jeu de cartes en ligne ⑤
J'ai créé le côté serveur du jeu de cartes en ligne ③
J'ai créé un environnement de développement avec rails6 + docker + postgreSQL + Materialise.
J'ai créé le côté serveur du jeu de cartes en ligne ⑥
J'ai essayé JAX-RS et pris note de la procédure
J'ai créé le côté serveur du jeu de cartes en ligne ④
J'ai créé le côté serveur du jeu de cartes en ligne ②
J'ai créé une application shopify @java
J'ai créé une interface graphique avec Swing
J'ai créé une fonction de réponse pour l'extension Rails Tutorial (Partie 1)
Une liste de rawValues pour UITextContentType.
J'ai fait un petit bijou pour poster le texte du mode org sur qiita
J'ai posé une question qui peut être utilisée pour des entretiens techniques
Création d'une méthode pour demander Premium Friday (version Java 8)
J'ai fait une simple fonction de recommandation.
J'ai créé une fonction de réponse pour l'extension Rails Tutorial (Partie 5):
Une demi-année d'auto-apprentissage fait du SPA avec Rails + Nuxt.js, alors jetez un œil
Créez une image Docker pour redoc-cli et enregistrez-la sur Docker Hub
J'ai créé un outil pour afficher la différence du fichier CSV
J'ai créé une application correspondante (application Android)
J'ai créé un outil de génération package.xml.
[Android] J'ai créé une application de podomètre.
J'avais des problèmes au travail, j'ai donc créé un plug-in IntelliJ
Création d'une image de conteneur Docker pour un serveur OpenLDAP basé sur Fedora
J'ai créé une fonction de réponse pour l'extension Rails Tutorial (Partie 2): Changer de modèle
[Ruby] J'ai créé un simple client Ping
J'ai fait une méthode pour le vendredi premium avec une doublure
J'ai fait une mort risquée avec Ruby
J'ai créé une application Janken avec kotlin
J'ai créé une application de calculatrice sur Android
J'ai créé un nouvel outil de déploiement Java
Manuel Docker Compact (4: Créer une image personnalisée)
Paramètres japonais pour mysql dans le conteneur Docker
J'ai créé une application Janken avec Android
Comment créer une petite image docker de l'application openjdk 11 (EA) (1 Go → 85 Mo)
J'ai créé un client API THETA qui peut être utilisé pour le développement de plugins
[Mémo personnel] Une petite histoire sur les paramètres du processeur de Docker Desktop pour Windows
J'ai créé une bibliothèque de graphiques simple pour les applications de smartphone [MP Android Chart Kai]
J'ai fait un exemple de la façon d'écrire un délégué dans Swift UI 2.0 à l'aide de MapKit
Une note rapide sur l'utilisation de jshell avec l'image Docker officielle du JDK
[Introduction à Docker] Créer une image Docker pour l'apprentissage automatique et utiliser le notebook Jupyter
Un exemple simple de servlet qui affiche le japonais
J'ai créé un programme de jugement des nombres premiers en Java
Créer un environnement de développement pour Docker + Rails6 + Postgresql