VMware Shared Folder on FreeBSD Guest

VMware の共有フォルダは、以前はFreeBSDカーネルをパニックさせるので使ってなかったが、最近は問題なく利用できるようだ。

legacyos.ichmy.0t0.jp
www.isapon.com
などを参考にした。

emulators/open-vm-tools が導入され、起動されているのを前提として、/boot/loader.conf

fuse_load="YES"

を記述しておく。

マウント先のディレクトリとして

# mkdir /mnt/hgfs

を作成。

その上で、/etc/fstab に、以下を記述しておく。

.host:/ /mnt/hgfs       vmhgfs-fuse     rw,mountprog=/usr/local/bin/vmhgfs-fuse,allow_other,uid=1000,gid=1000,failok 0 0

これで、起動時に自動的にマウントされるはずだが、残念ながら自動的にはマウントされなかった。

# mount /mnt/hgfs

で問題なくマウントされるので、とりあえずこれで使ってみる。

% df -h
Filesystem            Size    Used   Avail Capacity  Mounted on
rpool/ROOT/default     39G    375M     38G     1%    /
devfs                 1.0K    1.0K      0B   100%    /dev
procfs                4.0K    4.0K      0B   100%    /proc
hpool/home             38G    4.7G     34G    12%    /home
rpool/var              56G     18G     38G    31%    /var
rpool/usr              59G     20G     38G    35%    /usr
rpool/tmp              38G    168K     38G     0%    /tmp
rpool/var/log          38G    592K     38G     0%    /var/log
rpool/var/mail         38G    120K     38G     0%    /var/mail
rpool/var/crash        38G     96K     38G     0%    /var/crash
rpool/var/tmp          38G     96K     38G     0%    /var/tmp
rpool/usr/ports        39G    946M     38G     2%    /usr/ports
rpool/usr/src          39G    736M     38G     2%    /usr/src
df: File system /mnt/hgfs does not have a block size, assuming 512.
/dev/fuse             238G    160G     78G    67%    /mnt/hgfs

ちょっと怖いので、使うときだけマウントする。

必要があれば WinSCP を使うし、数個のファイルならば Tera Term の SSH SCP も結構便利なので、特にファイル共有の必要性を感じていなかった。いつか必要になるかもしれないので、使えるようにしておいたほうがいいだろうと思う。

Build PDFBox in Ubuntu

前の記事の通り、FreeBSD で PDFBox をビルドできたので、Ubuntu でもやってみるかぁ、という感じで試してみたが、失敗。Java 8, Maven 3.6.3, Java Cryptography Extension も入ってる(ここ参照)ということで、何故失敗するのかわからず、とりあえず寝た。

朝起きて、エラーメッセージをGoogle先生に投入して、次の記事を発見した。
qiita.com

全く同じ問題でした。書いてくださって、本当にありがとうございます。

$ JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64 mvn clean install

$JAVA_HOME が定義されていないことが問題なので、一時的に定義すればビルドできた。

FreeBSD では、$JAVA_HOME は定義してないままビルドできたので、なにか違いがあるのだろう。

Apache PDFBox

Poppler の pdftotext は、「内容のコピーと抽出」という項目が許可しないになっていても、問題なくテキストを抽出してくれるので便利であったが、いくつかのPDFで厳密にテキストを抽出していないことに気がついた。問題の所在がはっきりしないのだが、ほとんどのPDFで厳密にテキストを抽出してくれている。しかし、一部のテキストしか抽出していない場合もあるようだ。そのようなPDFの特徴を特定できていない。

pdfbox.apache.org

PDFBox は Poppler が失敗するPDFであっても、テキストを抽出しているようにみえるので、こちらを利用したい。しかしながら、PDFBox は「内容のコピーと抽出」という項目が許可しないになっていると、抽出してくれない。それでは困るので、「内容のコピーと抽出」という項目が許可しないの場合でも抽出してくれるように、修正する。

PDFBox はJavaで書かれており、ビルドには Java Cryptography Extension (JCE) と Maven 3 が必要とある。FreeBSD の pkg で、devel/mavenjava/cryptix-jce を入れておく。devel/maven3 は 3.0.5、devel/maven33 は 3.3.9、devel/maven は 3.8.4。PDFBox のコンパイルには、3.1.0 以上が必要で、3.0.5 ではダメだった。

github.com

Tag を 2.0.25 にして pdfbox-2.0.25 のソースを github からもらってくる。修正するファイルは以下の通り。チェックをするところだけコメントアウト

./pdfbox-2.0.25/tools/src/main/java/org/apache/pdfbox/tools/ExtractText.java

                AccessPermission ap = document.getCurrentAccessPermission();
//                if( ! ap.canExtractContent() )
//                {
//                    throw new IOException( "You do not have permission to extract text" );
//                }

最新のものだと、チェックするif文のブロックの中身が少し違うが、if( ! ap.canExtractContent() ) の場所を探せば問題ないだろう。

% mvn clean install

とすると、pdfbox-app-2.0.25.jar をビルドしてくれる。

使い方は、

% java -jar pdfbox-app-2.0.25.jar ExtractText input.pdf output.txt

のように使う。

Ubuntu 20.04 install memo

UbuntuVMwareにインストールする手順をメモする。

方針

Desktop版をインストールするが、TeraTermを用いてsshでログインして利用することを前提にする。FreeBSDと同等の利用が可能な環境を、なるべくシンプルな方法で構築する。インストール後、

  1. $HOMEのディレクトリ名の英語への修正
  2. openssh-server のインストール
  3. 固定IPアドレスの設定

をした後、シェルスクリプトで必要なソフトウェアを一気にインストールする。

インストール

解像度が低くインストーラの操作ができない場合は、Alt+F7 を押しながらマウス操作で移動できる。
https://masaoo.blogspot.com/2021/07/ubuntu-2004-800x600.html?view=flipcard

インストールは指示通りに行う。「通常のインストール」を選択、「Ubuntuのインストール中にアップデートをダウンロードする」にチェックを入れ、「グラフィックスと...」にはチェックを入れない。「インストールの種類」では「ディスクを削除してUbuntuをインストール」を選択。ユーザーは通常通りの入力で、「ログイン時にパスワードを要求する」を選択する。

インストールが終わったら、オンラインアカウントのログインをスキップして、その後「次へ」を選び続けて終了する。その後、不完全な言語サポートの通知に関してインストールし、システムのアップデートを行う。

最低限の設定

端末を開き、
1. ディレクトリ名の英語への修正、(ターミナルからコマンド、GUI操作有)

$ LANG=C xdg-user-dirs-gtk-update

を実行すると、ウィンドウが現れる。Don't ask me this again にチェックして、Update Names を実行する。
2. openssh-server のインストール

$ sudo apt-get -y install openssh-server

とりあえず、設定は後回し。
3. 固定IPアドレスの設定
[設定]->[ネットワーク] からIPアドレス、デフォルトルート、DNSを設定。
を済ませて、再起動

最初のログイン

/etc/ssh/sshd_conf の設定をしなかった場合、TeraTerm 等の端末エミュレータからのログインは、プレインパスワードを用いることに注意する。下記の設定をして、チャレンジレスポンス認証を有効にする。

dotFiles

dotFiles (https://github.com/masakeida/dotFiles) から、.bash_aliases と .inputrc を $HOME にコピー。

$HOME

$HOME/bin
$HOME/public_html
$HOME/.local/bin
を作成する。$PATH は、.profile の記述により自動的に入る。

root パスワード設定

$ sudo passwd root

/etc/ssh/sshd_config 修正

$ diff /etc/ssh/sshd_config.ORG /etc/ssh/sshd_config
34c34
< #PermitRootLogin prohibit-password
---
> PermitRootLogin no
58c58
< #PasswordAuthentication yes
---
> PasswordAuthentication no
63c63
< ChallengeResponseAuthentication no
---
> ChallengeResponseAuthentication yes

sshd を再起動する。

$ sudo systemctl restart ssh

ubuntuPostInstall

github.com

root になって ubuntuPostInstall.sh を実行する。このスクリプトが実行することは基本的に2つ。

  1. pkg_list.txt に記載されたパッケージをインストールする。
  2. server_list.txt に記載されたサービスを disable する。

必要なパッケージを apt-get でインストールする。nis についてのみ、nisdomain 名を尋ねられ、その後「nis (3.17.1-3build1) を設定しています ...」でかなりの時間固まる。動き出すまで待つこと。それ以外は問題なくインストールできる。サーバースイートについては、インストールのみとし、すぐには使わないので disable する。現状、disable するものは以下の通り。
samba (smbd, nmbd)
apache2 (apache2)
nginx (nginx)
mysql (mysql)
unbound (unbound)
nfs (nfs-kernel-server)
nis (nis, rpcbind)
rpcbind を最後に disable するのがいいと思う。

pkg_list.txt に記載したもので必要ないものもありそう。php に依存して apache2 がインストールされるようだ。また、open-vm-tools-desktop は自動的に入っているようだ。

ここで再起動する。

感想

意外とシンプルな方法で、利用できる環境構築ができた。運用としては、

# apt-get -y update
# apt-get -y upgrade
# apt-get -y dist-upgrade

を繰り返して、LTSが出たら新規インストールをする、ということでやっていくのが楽なのではないかと思う。

細かい点
  • FreeBSD では、特にサーバースイートについては、インストールと起動が別なので、インストールして、設定ファイルを正しく書いて、起動する、という3ステップが必要になる。Ununtu の文化では、インストールすると自動的に起動されてしまう。適切な設定がなされるのだろうが、ちょっと困る。なので disable するようにしている。
  • インストール後、GUI 操作なしで済むといいのだけれど。「ディレクトリ名の英語への修正」と「固定IPアドレスの設定」を、どのように設定するのが正しいのか、要調査。
  • パッケージの存在、不存在をチェックする方法も、要調査。

Poppler

前回、xpdfのPermission Errorについて書いたが、xpdfはメンテナンスされておらず、後継のPopplerがあることを知った。
poppler.freedesktop.org


Popplerのpdftotextは、「内容のコピーと抽出」という項目が許可しないになっていても、問題なくテキストを抽出するので、前回書いたような修正は必要がないことがわかった。

xpdf: Permission Error

PDF文書によっては、xpdf の pdftotext で以下のようなエラーが出る

Permission Error: Copying of text from this document is not allowed.

PDF文書のセキュリティの一つとして「内容のコピーと抽出」という項目が許可しないになっていると、テキスト抽出できないようだ。

https://uchiuchiyama.hatenadiary.org/entry/20060509/1147184615

上記のリンクに対応策がある。xpdf-4.02 でも同じ対応ができるようだ。が、ソースからコンパイルするのをそのままインストールするのはしたくないので、portsから修正することにする。

対応策の中身は、要するに pdftotext.cc の以下のブロックをコメントアウトする。

  // check for copy permission
//  if (!doc->okToCopy()) {
//    error(errNotAllowed, -1,
//        "Copying of text from this document is not allowed.");
//    exitCode = 3;
//    goto err2;
//  }

久しぶりに ports をいじるので忘れてしまっていたが、ソースの一部を修正する場合、

# make BATCH=yes extract patch

*1、work ディレクトリ以下のソースを修正し、

# make BATCH=yes install

でインストールする必要がある。

xpdfの場合、japanese/xpdf は graphics/xpdf に依存していることに注意して、まずは graphics/xpdf をインストールするために必要なものをインストールする。

# cd /usr/ports/graphics/xpdf
# make BATCH=yes

で、buildするために必要なものが全てインストールされる。この場合はcmakeなど。ここで、graphics/xpdf でいったん make clean する。

pkg でインストールされた xpdf を、

# pkg delete -y xpdf-4.02,1

で、削除した後、

# cd /usr/ports/japanese/xpdf
# make BATCH=yes extract patch
# cd /usr/ports/graphics/xpdf
# make BATCH=yes extract patch

で、graphics/xpdf の work 以下のソースを修正し、

# cd /usr/ports/japanese/xpdf
# make BATCH=yes install

で、エラーが出ない修正版をインストールできた。

ports の使い方は man 7 ports https://www.freebsd.org/cgi/man.cgi?ports(7) を確認すること。

正直お行儀が悪いとは思うが、お行儀を良くしすぎると仕事にならないので、これで対応する。

*1:make BATCH=yes patch で十分だが、何をしてるのか忘れないために extract patch としている。

japanese/xpdf error message

PDFファイルからテキストを抜き出す必要があり、japanese/xpdfをインストールしている。基本的に /usr/local/etc/xpdfrcの

textEncoding            UTF-8

この行だけ、コメントアウトされているのを有効にして、利用できる。

ただ、最新のバージョンでは、

% /usr/local/libexec/xpdf/pdftotext hogehoge.pdf
Config Error: No paper information available - using defaults
% 

とのエラーメッセージが出る。エラーメッセージではあるが、hogehoge.txtは作成されているので、動いているようだ。using defaults と言ってるし。こういうのはerrorとは書かないでほしいというのはあるが、なぜこのエラーが出るのかは分からない。

/usr/local/etc/xpdfrc には、textEncoding のすぐ前に、

#psPaperSize            letter

という行があるので、この行を有効にしても変わらなかった。

エラーメッセージは出るが、このまま利用する。