RewriteCond の「!-f」

Flaskをレンタルサーバで動かすにあたって、.htaccessを作成するがそこで詰まったので備忘録

Flask CGI

RewriteCond %{REQUEST_FILENAME} !-f

上述のページで書かれていたRewriteCondのルール。
RewriteCondのルールって、正規表現じゃなかったけ?と思っていたので「!-f」がさっぱりわからなかった。

で、調べたら「!-f」はファイルの存在有無のルールとのこと。
mod rewrite

ずっと正規表現のルールを調べて、わからないって頭を抱えていたよ・・・

Core-XでFlaskの稼働で躓いた点

Core-XにPythonをインストールし、ローカル環境で作成したFlaskアプリを動かす。(CGIモードで)
そのさいにハマったことをメモ書き。なお解決していないものもあります。(原因がなんだか分からない・・・)

でも端的に言ってしまえば、ローカル環境でもしっかり同じような環境を組み立てて試験しておこうね。という話です。

■1.サーバエラー(HTTPステータス:500)になる

ローカル環境では動く(wsgiで)のに、CORE-XでCGIモードで動かすとHTTPステータス:500となる。
で、エラーログを確認しようとするが、エラーログ自体が出力されていない。。。

最初はパスが誤っているせいかと思い、venvのなかのpthファイル等を確認するが問題なさそう、テストファイルを用意してパスを出力するがそれで見ても問題なさそう、、、原因が分からないので、仕方なくソースコードを削って一つ一つ実行。

で分かったのはルートロガーにおいて、設定ファイルを読むこむ時点でエラーになっていること。
ログ出力先に対して権限が無いのかなぁ…と思ったがそうでもない。設定ファイル自体が見えてない?と思い読み込み時のパスを絶対バスのハードコードにしてみるが同じまま。

かれこれ2時間近くウーンウーンとやりながら気がついたのは、ログ出力において
ファイル出力とコンソール出力が設定されていること。

●ロガー設定ファイル

[logger_root]
level=DEBUG
handlers=consoleHandler,fileHandler ←このconsoleHandlerが原因で動かなかった

[handler_consoleHandler]
class=StreamHandler
level=INFO
formatter=simpleFormatter
args=(sys.stdout,)

確かにFlaskのページを見ても、CGIで動かす際にはコードの中にprintなど入れるなと書かれている。

Flask CGI

このこと自体は知っていたが、ログ出力は見落としていた。。。
・・・なおただ単にprintを入れた場合、responseに追加される? jsonifyで返すところで、パース用のクラス(defaultの処理)においてprintを追加したら、jsonのあとにprintの出力が追加され、javascriptでparsererrorになった。
だけどコンソールのログ出力だとエラーになるのか?

今後気をつけたい。

■2.URL_FOR のパスが合わない

Jinjaテンプレートで良く使う”URL_FOR”。
ローカル環境ではwsgiで作成していたため、特段問題なくurl_forで正しいURLを指し示してくれるのだが、
CGIモードで稼働させると正しいURLを示さない。

まぁ理屈で考えるとCGIモードで稼働させるために、.htaccessファイルにおいてrewriteモージュルでURLを変更しているため、変更されたurlが追加されパスが合わなくなる。

●.htaccess

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f # Don't interfere with static files
RewriteRule ^(.*)$ index.cgi/$1 [L]

●index.cgi

from wsgiref.handlers import CGIHandler
from test.web_app import app

CGIHandler().run(app)

●wsgiのとき
url_for(“static” , filename=”test.css”) ⇒ https://xx.xx.xx/static/test.html

●cgiのとき
url_for(“static” , filename=”test.css”) ⇒ https://xx.xx.xx/index.cgi/yyyy.html/static/test.html

のように、wsgiでは正常だったが、cgiでは余計なパスがついて上手く動かない。

.htaccessで変換ルールをちゃんと作れば上手く出来るのかもしれないが、
rewriteの変換ルールの記述がよくわからず、めんどうになったため、結局url_forで記述していた部分をハードコードでパスを記載した。

[Core-X]pythonの状態

作業メモ

core-x においてpythonの仮想環境を(venv)を作ろうとする。
以下のエラーが出て失敗。

python -m venv venv
Error: Command '['/home/cvcln4/work/python/test01/venv/bin/python3', '-Im', 'ensurepip', '--upgrade', '--default-pip']' returned non-zero exit status 1.

このエラー自体は –without-pip で解消出来るが、そもそもpip使えないの?
やりたいこととして、そこらのライブラリをpipでインストールすることを考えているため、ちと不便

そもそもpip自体がもともとあるのか確認

pip3 -version
-bash: pip3: コマンドが見つかりません

python --version
Python 3.6.8

あれ?Pythonのバージョンもちょっと古い?
古くてもそんなに困ることは無い(大したことするわけではない)が、一応上げておいたほうが良くないか?
と思い、pythonのソースコードをダウンロード、参照ページを参考にconfigure , make でエラーが出てくる。

非公式Pythonダウンロードリンク

...
/home/****/work/module_src/python_src/Python-3.8.13/Modules/_ctypes/_ctypes.c:107:10: 致命的エラー: ffi.h: No such file or directory
 #include <ffi.h>
          ^~~~~~~
コンパイルを停止しました。

Python build finished successfully!
The necessary bits to build these optional modules were not found:
_gdbm                 _tkinter              nis                
To find the necessary bits, look in setup.py in detect_modules() for the module's name.


The following modules found by detect_modules() in setup.py, have been
built by the Makefile instead, as configured by the Setup files:
_abc                  atexit                pwd                
time                                                           


Failed to build these modules:
_ctypes                                                        

running build_scripts
…

あれ?ctypesとかってmysqlconectorとかで必要なやつじゃなかったけ?
うつろな覚えだが、ctypesが無くてなんかいろいろ引っかかったような覚えがあるから、結構大事なやつじゃないかと思える。

で、どうにかならないかとネットを検索、以下のページが参考になりそうだったので、今度やってみようと思う。

さくらレンタルサーバーに libffi をインストールする

Mysql workbenchでMariaDBに接続

※自分の環境下でなんとなく接続出来ただけです。環境やバージョンで接続出来ないケースなどは当然あると思いますが、メモとして。

経緯

開発でdockerで立てたMariaDBを使用するが、管理ツールとしてDBeaverなどを試していたものの、やはりMysql workbenchが使えるといいなぁと。(個人の好みの問題だが、ER図が見やすいと感じるので)
なんとなくMysqlコマンドで一応MariaDBにも接続出来ることを考えると、Mysql workbenchからでも接続出来るるかな?と思って試しにMariaDBに繋いで見たところ、Mysql workbenchからはSSLでの接続が行われているようで、エラーとなり接続が出来ない。(逆に言えばSSL以外は問題ないの?と思った。)

なのでMysql workbenchでSSL接続を無効にしたいが、設定項目で基本的に「require」が設定されており、SSLを介さず接続することが出来ない感じ。

諦めようかと思ったが、やはりER図とかはworkbenchが使いやすく感じていたので、
なんとか接続出来ないかなぁと、適当に情報を漁って接続してみた。

環境

・Linux Mint 20.3 Una

・Mysql workbench 8.0

・MariaDB 10.8.3 (dockerコンテナ)

参考サイト

How to set up MariaDB SSL and secure connections from clients

How to configure MySQL Workbench to not require SSL encryption

要約

dockerでの立ち上げ時に証明書などを設定出来るようだけど、開発でちょっと利用するだけのものなので、
証明書作成がめんどくさい・・・(そしてズボラな自分は再度利用しようとしたとき、その証明書がどこだかわからなくなる可能性が高い)

なので参考サイトにあったMysql Workbenchの接続オプションでSSLを無効とすることにした。

■Mysql Workbench でのSSL無効

接続のプロパティにおいて、Advanceの項目に以下を指定する。

useSSL=0

上記を指定することで、無事?接続することが出来た。(ただサポートされていないよ、みたいな警告は出てくる。)

一応Server Statusもある程度は見れてるみたい。

で、単純なテーブルとかだとデータベースからのリバースでER図が作れた。
ただ都度 接続のさいにAdvanceでuseSSLを指定しないとダメみたいだけど。
その他、mariaDB独自の実装されているような関数を含むようなものがある場合、リバース出来るのか?
流石に出来なそうに思うが今度試してみよう…メモ:MysqlとMariaDBの関数の違い

まぁ一先ず個人的にはシンプルな構造であればER図にすることが出来るようであれば満足。

設定方法が単純でよかった。これぐらいなら覚えていられそう。

Linux Mint キーマップの変更

経緯

現在ノートパソコンにLinux Mintを入れていて、それで作業を行うことが多い。
ただ今まで利用していたPCがThinkpad X220 であり、古くなってきたこともあってかここ最近調子が悪いことが多くなった。

そのため新しくThinkpad T480に移行することにしたが、従来のX220の7段キーボードにあった、アプリケーションキーが、新しいT480にはない。

個人的に1つのキーでコンテキストメニューを呼び出せるアプリケーションキーがとても便利で利用することが多いため、なんとかT480でも同じことが出来るようにしたかった。

環境

・Thinkpad T480 (日本語キーボード)

・Linux Mint 20.3 Una

参考サイト

Linux MintでSuperキーを無変換キーに割り当て

キーボードマッピングの仕組み

XmodMap

Ubuntu documentation キーボード

要約

以下のファイルを作成、再読込を行うことで

普段あまり使わない右シフトキーを、アプリケーションキー(LinuxではMenuキーというのか?)として利用できるようになった。

■.Xmodmap

keycode 62 = Menu

keycode 62 は右シフトキー 、機種によって違うのかは不明(参考サイトを見る限り、違いそうな気はする)

■作成した.Xmodmapの読み込み

$ xmodmap .Xmodmap

設定手順

■1.キーコードの確認

一先ず参考サイトを参照し、キーコード一覧を見てみる

$ xmodmap -pke
keycode   8 =
keycode   9 = Escape NoSymbol Escape
keycode  10 = 1 exclam 1 exclam
keycode  11 = 2 quotedbl 2 quotedbl
keycode  12 = 3 numbersign 3 numbersign
keycode  13 = 4 dollar 4 dollar
keycode  14 = 5 percent 5 percent
keycode  15 = 6 ampersand 6 ampersand
keycode  16 = 7 apostrophe 7 apostrophe
keycode  17 = 8 parenleft 8 parenleft
keycode  18 = 9 parenright 9 parenright
keycode  19 = 0 asciitilde 0 asciitilde
keycode  20 = minus equal minus equal
keycode  21 = asciicircum asciitilde asciicircum asciitilde
keycode  22 = BackSpace BackSpace BackSpace BackSpace
keycode  23 = Tab ISO_Left_Tab Tab ISO_Left_Tab

うーん、一覧を見てもピンと来ない、、、

なのでxevから該当キーのコードを探す。なおT480にアプリケーションキーは無いため、別途キーボードを繋いで確認した。

$ xev

表示されたウィンドウの黒枠にカーソルを合わせ、該当キーを押す。

●右シフトキーを押したとき

KeyPress event, serial 37, synthetic NO, window 0x5a00001,
    root 0x7b8, subw 0x5a00002, time 5646504, (39,54), root:(2830,522),
    state 0x10, keycode 62 (keysym 0xffe2, Shift_R), same_screen YES,
    XLookupString gives 0 bytes: 
    XmbLookupString gives 0 bytes: 
    XFilterEvent returns: False

KeyRelease event, serial 37, synthetic NO, window 0x5a00001,
    root 0x7b8, subw 0x5a00002, time 5646646, (39,54), root:(2830,522),
    state 0x11, keycode 62 (keysym 0xffe2, Shift_R), same_screen YES,
    XLookupString gives 0 bytes: 
    XFilterEvent returns: False

よくわからんが “keycode 62” と表示されているので、62なのだろう・・・

同じようにアプリケーションキーを押してみる。

●アプリケーションキーを押したとき

KeyPress event, serial 37, synthetic NO, window 0x5a00001,
    root 0x7b8, subw 0x5a00002, time 5761550, (25,46), root:(2816,514),
    state 0x10, keycode 135 (keysym 0xff67, Menu), same_screen YES,
    XLookupString gives 0 bytes: 
    XmbLookupString gives 0 bytes: 
    XFilterEvent returns: False

KeyRelease event, serial 37, synthetic NO, window 0x5a00001,
    root 0x7b8, subw 0x5a00002, time 5761712, (25,46), root:(2816,514),
    state 0x10, keycode 135 (keysym 0xff67, Menu), same_screen YES,
    XLookupString gives 0 bytes: 
    XFilterEvent returns: False

こちらはkey codeが135らしく、keysym 0xff67 , Menu となっている。

■2.設定ファイルの作成

上記でそれぞれのkey code が分かったので、設定ファイルを作成。

記載方法については、参考サイトのxmodmapコマンドを見たところ

keycode NUMBER = KEYSYMNAME

で、指定するみたい。

keysym と言うのがよく分かっていなかったが、参考サイトをみたところ

X window system 上では、そのボタンが押されたさいの役割を定義しているようなものをkeysymというらしく、

物理配置上のkey codeに、このkeysymを関連付けることで、動作するもののようだ・・・

(初めて知った、こんな仕組みになっていたのね)

なので.xmodmapのファイルに記載するkeysymについては、前項のxevより得られた結果より、

以下のように記載した

●.Xmodmap

keycode 62 = Menu

■3.設定の適用

作成したファイルを適用する

$ xmodmap .Xmodmap

適用後、右シフトキーを押して見る。

・・・

アプリケーションキーと同様にキー押下でコンテキストメニューが表示されることが確認出来た。

もともとThinkpadの7段キーボードが使いやすく感じており、アイソレーションキーで アプリケーションキーが無い最近のThinkpadへの移行をためらっていたが、これで少しは使いやすくなったかな・・・

でも未だプリントスクリーン キーがなんでこんなところにあるの?ホーム・エンドキーが打ちにくいなぁ、などと思うことも多いが・・・慣れの問題なのだろうか?

7段キーボードが復活してほしい・・・

【Core-X】viのローカルインストール、syntax on

経緯

CoreServer core-xを契約し、適当なPHPを書いてみたが、core-xにデフォルトで備わっているviだとシンタックスが有効にならない・・・。 ってかそもそもviにsyntaxが入っていないよう。(syntax が – になっている)

機能的には最低限のviみたい。

> vi --version
VIM - Vi IMproved 8.0 (2016 Sep 12, compiled Mar 16 2022 02:51:40)
Included patches: 1-1763
・・・

-ebcdic            -mouse             -statusline        -xsmp
-emacs_tags        -mouse_dec         -sun_workshop      -xterm_clipboard
-eval              -mouse_gpm         -syntax            -xterm_save
+ex_extra          -mouse_jsbterm     +tag_binary 
・・・

>

最終的にはGitからpullしてくることがほとんどだと思うので、たいしてviを使うこともないだろうし、そのままでも良いかと思ったけど、出来ればシンタックスが有効になっってくれるとありがたいなぁと思い、viをローカルにインストールし、syntaxを効かせることが出来るか試してみた。

環境

・CoreServer core-x

参考サイト

Vimのローカルインストール

要約

以下のコマンドでインストール、bashrc、vimrcを設定すれば出来た。

■vimのインストール

> mkdir -p ~/local          # ローカルvimの置き場
> mkdir -p ~/work/vim_src   # 一時作業ディレクトリ
> cd ~/work/vim_src


> wget ftp://ftp.vim.org/pub/vim/unix/vim-8.1.tar.bz2
> bzip2 -d ./vim-8.1.tar.bz2
> tar xf ./vim-8.1.tar
> ./configure --enable-multibyte --enable-xim --enable-fontset --with-features=big --prefix=$HOME/local
> make
> make install

■~/.bashrc

alias vim='~/local/bin/vim -u ~/.vimrc'

■~/.vimrc

set nocompatible
set backspace=indent,eol,start
syntax on

設定手順

参考サイトを見て、同じ手順で出来そうに思ったので、以下の手順で行った。

■1.viのソースインストール

viの公式サイトよりファイルをダウンロードする。

Vim the editor – Vim source archives

最新バージョンは、8.1? よく分かっていないが、”All Files”となっているもののリンクを取得。

取得したリンクをもとに、ダウンロードを行う。

mkdir local
mkdir -p ~/work/vim_src
cd ~/work/vim_src
wget ftp://ftp.vim.org/pub/vim/unix/vim-8.1.tar.bz2

■2.configure , make

ダウンロードしたファイルを解凍し、configure ,make を行っていく。

configure の実行時に、prefixを指定し、インストール先を指定しておく。

> bzip2 -d ./vim-8.1.tar.bz2
> tar xf ./vim-8.1.tar
> ./configure --enable-multibyte --enable-xim --enable-fontset --with-features=big --prefix=$HOME/local

configure: creating cache auto/config.cache
checking whether make sets $(MAKE)... yes
checking for gcc... gcc
checking whether the C compiler works... yes
checking for C compiler default output file name... a.out
checking for suffix of executables... 
・・・
configure: creating auto/config.status
config.status: creating auto/config.mk
config.status: creating auto/config.h

> 

エラーが出ずにconfigureが出来た。

…一応ローカルPCで同じことをやったさいには、以下のようなエラーが出た。(ncursesが足りないみたいに言われた)

なので同じようなエラーが出たら、ここで諦めようと思っていた。

checking for tgetent in -ltermcap... no
checking for tgetent in -lcurses... no
no terminal library found
checking for tgetent()... configure: error: NOT FOUND!
      You need to install a terminal library; for example ncurses.
      Or specify the name of the library with --with-tlib.

続けてmakeを行う

> make

Starting make in the src directory.
If there are problems, cd to the src directory and run make there
cd src && make first
make[1]: ディレクトリ '/home/****/work/vim_src/vim81/src' に入ります
/bin/sh install-sh -c -d objects
touch objects/.dirstamp
CC="gcc -Iproto -DHAVE_CONFIG_H       " srcdir=. sh ./osdef.sh
gcc -c -I. -Iproto -DHAVE_CONFIG_H     -g -O2 -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=1        -o objects/arabic.o arabic.c
gcc -c -I. -Iproto -DHAVE_CONFIG_H     -g -O2 -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=1        -o objects/beval.o beval.c
gcc -c -I. -Iproto -DHAVE_CONFIG_H     -g -O2 -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=1        -o objects/buffer.o buffer.c
・・・

cd xxd; CC="gcc" CFLAGS=" -g -O2 -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=1" LDFLAGS="-L/usr/local/lib -Wl,--as-needed" \
	make -f Makefile
make[2]: ディレクトリ '/home/****/work/vim_src/vim81/src/xxd' に入ります
gcc  -g -O2 -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=1 -L/usr/local/lib -Wl,--as-needed -DUNIX -o xxd xxd.c
make[2]: ディレクトリ '/home/****/work/vim_src/vim81/src/xxd' から出ます
make[1]: ディレクトリ '/home/****/work/vim_src/vim81/src' から出ます

>

makeも問題無く出来ていそうな感じ。

・・・正直エラーが出ているのかも分からないが、そんなクリティカルな表示が出てないのを見ると出来ていそう。

■3.make install

make が出来たので、install する前にテストを行う。

…一応インストール先がローカルになっているか確認したいこともあったので。

> make -n install

if test ! -f src/auto/config.mk; then \
	cp src/config.mk.dist src/auto/config.mk; \
fi
echo "Starting make in the src directory."
echo "If there are problems, cd to the src directory and run make there"
cd src && make install
make[1]: ディレクトリ '/home/****/work/vim_src/vim81/src' に入ります
/bin/sh install-sh -c -d /home/****/local/bin
chmod 755 /home/****/local/bin
if test -f /home/****/local/bin/vim; then \
  mv -f /home/****/local/bin/vim /home/****/local/bin/vim.rm; \
  rm -f /home/****/local/bin/vim.rm; \
fi
cp vim /home/****/local/bin
strip /home/****/local/bin/vim
chmod 755 /home/****/local/bin/vim
echo >/dev/null
/bin/sh install-sh -c -d /home/****/local/share/vim
chmod 755 /home/****/local/share/vim
・・・

if test -d /home/****/local/share/applications -a -w /home/****/local/share/applications; then \
   cp ../runtime/vim.desktop \
	../runtime/gvim.desktop \
	/home/****/local/share/applications; \
   if test -z "" -a -x ""; then \
       -q /home/****/local/share/applications; \
   fi \
fi
make[1]: ディレクトリ '/home/****/work/vim_src/vim81/src' から出ます

> 

処理を見ていると、configureのさいにprefixで指定したディレクトリに対して、色々処理が行われているのがわかる。

このままインストールしても問題無さそうと判断し、installを実行する。

> make install

Starting make in the src directory.
If there are problems, cd to the src directory and run make there
cd src && make install
・・・

make[1]: ディレクトリ '/home/****/work/vim_src/vim81/src' から出ます

インストールされたか確認し、syntaxが有効になっているか確認する。

> cd ~/local/bin
> ls
ex  rview  rvim  view  vim  vimdiff  vimtutor  xxd

> ./vim --version
VIM - Vi IMproved 8.1 (2018 May 18, compiled May 29 2022 22:00:57)
Included patches: 1
・・・

-dnd               +mouse             +startuptime       +xsmp_interact
-ebcdic            -mouseshape        +statusline        +xterm_clipboard
+emacs_tags        +mouse_dec         -sun_workshop      -xterm_save
+eval              -mouse_gpm         +syntax 

>

Vimがあること、またsyntax が + になっているので、シンタックスが使えそう。

■4.bashrc , vimrc の設定

とりあえずインストールしたvimが使えるようにbashrcを編集する。

core-xだと、デフォルトだと”vim”コマンドは無いよう(”vi”コマンドのみ)なので、alias で “vim”として指定してみる。

> vi ~/.bashrc


# Uncomment the following line if you don't like systemctl's auto-paging feature:
# export SYSTEMD_PAGER=
 
# User specific aliases and functions
alias vim='~/local/bin/vim -u ~/.vimrc'  <--追加

保存したら、bashrcを読み直す。

次にvimrcで、nocompatible 、backspace 、syntax を設定する。

> vi ~/.vimrc

set nocompatible    <--追加
set backspace=indent,eol,start    <--追加
syntax on    <--追加

※vimrcにnocompatibleが設定されていないため、bashrcもvimrcも 一先ずviで編集した。矢印キー効かないと駄目な人間なので・・・

■5.syntaxの確認

設定が出来たら、適当にvimrcをvimで開いてみる。

●従来のviで開いた状態

通常のviで開いたvimrc

●ローカルインストールしたvimで開いた状態

vimで開いたvimrc

syntaxが効いていて見やすくなった!!

やはり個人的にはviにはsyntaxで色がついてほしいのです^^