Ich habe ein Docker-Image für die japanische Version von SDAPS erstellt

Einführung

SDAPS ist eine OMR-Software (Optical Mark Reading), die Fragebögen für Fragebögen mit allgemeinen Kopierpapier- und Dokumentenscannern erstellt und tabelliert. Für Markierungsblätter ist kein spezielles Papier erforderlich.

Es ist nicht für Anwendungen wie Aufnahmeprüfungen geeignet, die strenge Ergebnisse erfordern, bietet jedoch Vorteile wie keine Notwendigkeit zum Ausfüllen (dies kann geändert werden, um mit checkmode = fill zu füllen) und keine Notwendigkeit, spezielles Papier vorzubereiten. ..

image.png

Da SDAPS kein Japanisch unterstützt, habe ich einen Fragebogen mit japanischem Text erstellt und ein Docker-Image erstellt, das einen geänderten Befehl sdaps ausführt, damit ein Bericht ausgegeben werden kann.

Das erstellte Docker-Image wird auf Docker Hub veröffentlicht, und die Docker-Datei und die geänderten Teile werden auf Git Hub veröffentlicht.

Ergebnisse

Die geänderten Teile werden auf dem folgenden Github und Docker Hub veröffentlicht.

Referenzmaterial

Ich habe die URLs aufgelistet, auf die ich beim Schreiben dieses Artikels verwiesen habe.

Entwicklungsumgebung

Für die Entwicklung erstellen und pushen wir das Docker-Image in der folgenden Umgebung. Der von mir erstellte Docker-Container basiert ebenfalls auf Ubuntu 20.04 für diese Entwicklungsumgebung.

Testumgebung

Wir testen die Fähigkeit, Fragebögen zu erstellen, TIFF-Bilder in den folgenden Umgebungen zu lesen und zu ändern.

Die folgenden Geräte werden zum Drucken und Lesen des Fragebogens verwendet.

Über die Verwendung eines Kopiergeräts

Bisher habe ich kein Kopiergerät verwendet, um den Fragebogen vorzubereiten. In der Vergangenheit hatten wir Probleme aufgrund der geringen Standarddruckqualität. In den letzten Jahren konnten wir jedoch problemlos damit umgehen, selbst wenn wir die Anzahl der Blätter mit einem Kopiergerät an dem Ort, an dem wir die Verteilung angefordert haben, vorübergehend erhöhen. Da die Druckqualität jedoch stark von den Einstellungen des Kopiergeräts abhängt, wird empfohlen, diese im Voraus gründlich zu testen und die Parameter zu speichern, um die Reproduzierbarkeit sicherzustellen, damit die Ausgabe mit der höchstmöglichen Definition erzielt werden kann. ..

Wie benutzt man

Möglicherweise sind einige Fehler von sdaps abgeleitet, und es wird möglicherweise eine Fehlermeldung angezeigt. Ich werde jedoch die Verwendung des Befehls einschließlich dieser Fehler vorstellen.

Verwenden Sie beim Ausführen des Befehls die Volume-Funktion von Docker, um ein Arbeitsverzeichnis für die TeX-Datei des Antwortbogens und des Projektverzeichnisses zu erstellen, und stellen Sie sicher, dass Sie es auf / proj im Container bereitstellen.

Arbeitsablauf

Sie werden ungefähr in der folgenden Reihenfolge verwendet.

  1. Erstellen Sie ein Arbeitsverzeichnis und verschieben Sie es (z. B. dev.proj1 /; cd dev.proj1).
  2. Erstellen Sie eine TeX-Datei für den Fragebogen (z. B. example-ja.tex).
  3. Führen Sie den Befehl setup aus, um das Projektverzeichnis zu erstellen
  4. Scannen Sie den ausgefüllten Fragebogen und legen Sie die TIFF-Datei im Arbeitsverzeichnis ab (z. B. 01.tif, 02.tif, ...).
  5. Wiederholen Sie den Befehl add, um die TIFF-Datei zu registrieren
  6. Führen Sie den Erkennungsbefehl aus, um die Daten zu extrahieren
  7. Erstellen Sie eine Berichtsdatei mit dem Befehl report_tex (z. B. report_1.pdf).
  8. Extrahieren Sie Rohdaten mit dem Befehl csv (z. B. data_1.csv).

Vorbereitungsarbeiten

Das zu verwendende Docker-Image sollte vor dem Ausführen des Befehls abgerufen werden.

Ausführungsbeispiel für 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

Über das Arbeitsverzeichnis

Obwohl es nicht in GitHub registriert ist, werden die Arbeitsverzeichnisse dev.proj1 /, dev.proj2 / für die Arbeit erstellt und TeX-Dateien und Projektverzeichnisse im Beispielantwortblatt abgelegt.

Als Referenz werde ich den endgültigen Status des Verzeichnisses dev.proj2 veröffentlichen.

Ausgabeergebnis des Baumbefehls


$ 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

Beispiel für einen japanischen Fragebogen

Die für den Test verwendete Datei wird veröffentlicht. Bitte beziehen Sie sich auf das Original, da einige Kommentare und Inhalte gelöscht wurden.

example.Beispiel für die Einbettung von Japanisch basierend auf 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{Autor}
\title{Titel}

\begin{document}
  \begin{questionnaire}
    \begin{info}
      \texttt{info}Sie können jeden Text mithilfe der Umgebung hinzufügen.
    \end{info}

    \addinfo{Date}{10.03.2013}

    \section{5 Notenbewertung}
    \singlemark{Wie oft verwenden Sie SDAPS??}{Selten}{jeden Tag}

  \end{questionnaire}
\end{document}

Es ist möglich, einige der vordefinierten festen Phrasen zu ersetzen.

translator-sdaps-dictionary-English.Beispiel diktieren


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

\providetranslation{infotext}{Wie ausfüllen/Instructions to fill out the form.}
\providetranslation{standard-deviation}{Standard-Deviation}
\providetranslation{info-cross}{Beispiel markieren/Check}
\providetranslation{info-correct}{Änderungsbeispiel/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}{Markieren Sie für Dinge wie Zufriedenheit eins auf einer Skala von fünf.}
\providetranslation{mean}{Mean}

So werden example-ja.tex und translator-sdaps-dictionary-English.dict im Arbeitsverzeichnis (dev.proj1) abgelegt.

python


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

0 directories, 2 files

Führen Sie die folgenden Schritte aus, um einen Fragebogen zu erstellen.

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

Der Fragebogen befindet sich in diesem Beispiel unter dev.proj1 / work / questionaire.pdf.

image.png

[Ergänzung] So erhalten Sie den Originalübersetzer-sdaps-dictionary-English.dict

Wenn Sie es von einem Paket unter Ubuntu usw. installieren können, können Sie es aus / usr / share / sdaps / tex / kopieren. Wenn dies jedoch nicht möglich ist, notieren Sie sich, wie Sie es aus dem Docker-Image extrahieren können.

Da "docker cp" nicht zum Extrahieren von Dateien aus Bildern verwendet werden kann, ist dies etwas mühsam. Sie können die Originaldatei jedoch mit der folgenden Methode extrahieren.

Kopieren Sie Dateien im Container in Ihr lokales Dateisystem


##Führen Sie den Befehl sdaps aus("-rm"Keine Optionen)
$ docker run yasuhiroabe/sdaps-ja:latest

##Überprüfen Sie die Container-ID
$ 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

##Kopieren Sie die erforderlichen Dateien mit der Container-ID
$ docker cp a9e5dcb2a026:/usr/share/sdaps/tex/translator-sdaps-dictionary-English.dict my-translator.dict

Setup-Befehl

Lassen Sie nach dem Erstellen der TeX-Datei für das Antwortblatt mit dem Befehl sdaps das Projektverzeichnis erstellen. Das Erstellen eines Verzeichnisses mit dem Projektnamen im Voraus führt zu einem Fehler.

Beispiel für die Einrichtung des Setups


$ 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

Meldung beim Ausführen eines Befehls


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.
Titel
Author:Autor
Date: 10.03.2013

Questionnaire.pdf wird im angegebenen Projektverzeichnis (dev.proj1 / work /) abgelegt.

In diesem Beispiel wird translator-sdaps-dictionary-English.dict angegeben. (Optional) Diese Datei wird kopiert, wenn Sie das Projektverzeichnis erstellen. Wenn Sie es jedoch im Voraus erhalten möchten, können Sie dies auf folgende Arten tun.

Befehl hinzufügen

Scannen Sie den Fragebogen, platzieren Sie eine mehrseitige TIFF-Datei (in diesem Beispiel 01.tif) in Ihrem Projektverzeichnis und führen Sie dann add aus.

Ausführungsbeispiel hinzufügen


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

Meldung beim Ausführen eines Befehls


Processing 01.tiff
Done

Das von Ihnen verwendete Gerät kann nur 25 Seiten mit Antworten in einer Datei speichern. Wenn Sie diesen Wert überschreiten, führen Sie den Befehl add mehrmals aus.

Befehl erkennen

Wenn die Registrierung des Antwortbogens abgeschlossen ist, ist es die Phase, in der das registrierte Blatt analysiert wird.

recognize


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

Meldung beim Ausführen eines Befehls


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_tex Befehl

Es wird verwendet, um die Berichts-PDF-Datei basierend auf dem Analyseergebnis zu extrahieren.


#### **`report_Tex Ausführungsbeispiel`**
```bash

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

Meldung beim Ausführen eines Befehls


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.

Projektverzeichnis nach Abschluss der Verarbeitung(dev.proj1/work/)Im Bericht_.Eine PDF-Datei wurde generiert. report_In den Optionen des Befehls tex wird--create-tex*Es gibt eine Option und eine Funktion zum Extrahieren von TeX-Dateien, dies ist jedoch der Fall/Da der Fortschritt an tmp ausgegeben wird, wählen Sie ein geeignetes Verzeichnis aus, wenn Sie ihn verwenden möchten./Montieren Sie es auf tmp. Dieses Beispiel befindet sich im GNU-Makefile proj2-Beschrieben in der Reporttex-Aufgabe.

report_1.Das Ergebnis wird wie folgt als PDF ausgegeben."Answers:", "Mean:", "Standard-Deviation:"Wenn Sie solche Dinge ins Japanische übersetzen möchten, Übersetzer-sdaps-dictionary-English.Bitte ändern Sie das Diktat.

image.png

##CSV-Befehl

Es wird verwendet, wenn Sie Rohdaten im CSV-Format extrahieren möchten. Wird verwendet, um zu überprüfen, ob der Inhalt des Berichts korrekt ist. Wenn Sie die Abweichung usw. mit Excel berechnen, wird möglicherweise aufgrund der unterschiedlichen Fehlerverarbeitungsmethode ein geringfügig anderer Wert angezeigt.

CSV-Ausführungsbeispiel


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

Die generierte CSV-Datei sind die Daten im Projektverzeichnis._*.Es wird an csv ausgegeben.

text:dev.proj1/work/data_2.Inhalt von 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

Das ist alles für die wichtigsten Verwendungsbeispiele.

#Probleme beim Arbeiten

Notieren Sie sich das letzte Problem, auf das Sie während der Arbeit gestoßen sind. Bitte kommen Sie, wenn Sie Interesse haben.

##Ich erhalte eine Fehlermeldung, wenn ich den sdaps-Bericht ausführe

Nur wenn aus dem Container ausgeführt"Unable to init server: Could not connect: Connection refused"Nachricht wird angezeigt.

Befehlszeile, wenn ein Fehler auftritt


## In dev.proj2 / im Voraus werden die TeX-Datei des Fragebogens und das Verzeichnis 20200310_survey / mit hinzugefügten sdaps die Antworten platziert.
$ sudo docker run --rm -v `pwd`/dev.proj2:/proj \
        --name sdaps-ja \
        yasuhiroabe/sdaps-ja:ub2004-2 report 20200310_survey/

Ich kannte den Zeitpunkt des Fehlers nicht, also erstellte ich ein Startskript und beobachtete den Prozess mit Strace.

Zum Debuggen ausführen.sh


!/bin/bash

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

Dort wird eine Nachricht ausgegeben

python


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

Anscheinend scheint die Bibliothek, die ich beim Verarbeiten von Bildern hinter den Kulissen lade, während des Initialisierungsprozesses keine Verbindung zum X-Server herzustellen. Selbst in einer lokalen Umgebung, in der sdaps ordnungsgemäß ausgeführt werden kann, schlägt die Umgebungsvariable DISPLAY auf die Person fehl, die nicht ausgeführt wird.

Reproduktion des Fehlers


$ 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

Wenn Sie daher die Umgebungsvariable DISPLAY auf Docker setzen, wird sie ausgeführt--Ich habe beschlossen, es mit der env-Option hinzuzufügen. Ubuntu 20.Da der 04 X Server nur den Unix Domain Socket geöffnet hat(Port 6000 ist geschlossen)、/tmp/.X11-Unix ist gemountet. Dieser Bereich basiert auf der Ausgabe von lsof und dem Link in den Referenzinformationen.

Der Fehler um DBus bleibt weiterhin bestehen, aber ich werde ihn vorerst weiterleiten.

Nächster Fehler um 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

Selbst wenn Sie keine Verbindung zum X-Server herstellen, endet der Prozess normalerweise mit einem Fehler, sodass diese Variablen während der tatsächlichen Verwendung nicht festgelegt werden.

Recommended Posts

Ich habe ein Docker-Image für die japanische Version von SDAPS erstellt
Ich habe versucht, eine japanische Version der Automatik-Mail von Rails / devise zu erstellen
Ich habe ein Plug-In für IntelliJ IDEA erstellt
Ich habe ein Diff-Tool für Java-Dateien erstellt
Ich habe einen Docker-Container erstellt, um Maven auszuführen
[RSpec] Ich habe einen Test zum Hochladen eines Profilbilds geschrieben.
Ich habe ein Check-Tool für das Release-Modul erstellt
Ich habe eine Methode entwickelt, um nach Premium Friday zu fragen
Ich habe eine Bibliothek zum Anzeigen von Tutorials auf Android erstellt.
Ich habe eine Chat-App erstellt.
Hat die Serverseite des Online-Kartenspiels gemacht ⑤
Ich habe die Serverseite des Online-Kartenspiels gemacht made
Ich habe eine Entwicklungsumgebung mit Rails6 + Docker + PostgreSQL + Materialise erstellt.
Ich habe die Serverseite des Online-Kartenspiels gemacht made
Ich habe JAX-RS ausprobiert und mir das Verfahren notiert
Ich habe die Serverseite des Online-Kartenspiels gemacht made
Ich habe die Serverseite des Online-Kartenspiels gemacht made
Ich habe eine shopify App @java erstellt
Ich habe mit Swing eine GUI erstellt
Ich habe eine Antwortfunktion für die Rails Tutorial-Erweiterung (Teil 1) erstellt.
Eine Liste der rawValues für UITextContentType.
Ich habe ein Juwel gemacht, um den Text des Org-Modus in Qiita zu posten
Erstellt eine Methode zum Anfordern von Premium Friday (Java 8-Version)
Ich habe eine einfache Empfehlungsfunktion erstellt.
Ich habe eine Antwortfunktion für die Rails Tutorial-Erweiterung (Teil 5) erstellt:
Ein halbes Jahr Selbststudium unerfahren gemacht SPA mit Rails + Nuxt.js, also schauen Sie bitte
Erstellen Sie ein Docker-Image für redoc-cli und registrieren Sie es auf Docker Hub
Ich habe ein Tool erstellt, um den Unterschied zwischen CSV-Dateien auszugeben
Ich habe eine passende App erstellt (Android App)
Ich habe ein Tool zur Generierung von package.xml erstellt.
[Android] Ich habe eine Schrittzähler-App erstellt.
Ich hatte Probleme bei der Arbeit und habe ein IntelliJ-Plug-In erstellt
Erstellt ein Docker-Container-Image für einen OpenLDAP-Server basierend auf Fedora
Ich habe eine Antwortfunktion für die Rails Tutorial-Erweiterung (Teil 2) erstellt: Modell ändern
[Ruby] Ich habe einen einfachen Ping-Client erstellt
Ich habe eine Methode für den Premium-Freitag mit einem Liner erstellt
Ich habe mit Ruby einen riskanten Würfel gemacht
Ich habe eine Janken App mit Kotlin gemacht
Ich habe eine Taschenrechner-App für Android erstellt
Ich habe ein neues Java-Bereitstellungstool erstellt
Docker Compact Manual (4: Erstellen eines benutzerdefinierten Bildes)
Japanische Einstellungen für MySQL im Docker-Container
Ich habe eine Janken App mit Android gemacht
So erstellen Sie ein kleines Docker-Image der openjdk 11 (ea) -Anwendung (1 GB → 85 MB)
Ich habe einen THETA API-Client erstellt, der für die Plug-Entwicklung verwendet werden kann
[Persönliches Memo] Eine kleine Geschichte über die CPU-Einstellungen von Docker Desktop für Windows
Ich habe eine einfache Grafikbibliothek für Smartphone-Apps erstellt [MP Android Chart Kai]
Ich habe ein Beispiel erstellt, wie ein Delegat in Swift UI 2.0 mit MapKit geschrieben wird
Ein kurzer Hinweis zur Verwendung von jshell mit dem offiziellen Docker-Image des JDK
[Einführung in Docker] Erstellen Sie ein Docker-Image für maschinelles Lernen und verwenden Sie das Jupyter-Notizbuch
Ein einfaches Beispiel für ein Servlet, das Japanisch anzeigt
Ich habe ein Programm zur Beurteilung von Primzahlen in Java erstellt
Erstellen Sie eine Entwicklungsumgebung für Docker + Rails6 + Postgresql