dak ブログ

python、rubyなどのプログラミング、MySQL、サーバーの設定などの備忘録。レゴの写真も。

apache 2.4系でのアクセス制限

2021-09-30 20:11:11 | linux
apache 2.4系でのアクセス制限の設定方法のメモ。

以下のようにして、特定の複数のIPからのみアクセスを許可する設定をしてみました。
<RequireAll>
  Require all granted
  <RequireAny>
    Require ip xx.xx.xx.xx
    Require ip yy.yy.yy.yy
    Require ip zz.zz.zz.zz
  </RequireAny>
<RequireAll>


apache のリバースプロキシの設定

2021-09-30 19:55:46 | linux
apache 2.4系のリバースプロキシの設定のメモ。

/foo/ へのリクエストを同一サーバの 9000 番ポートの /bar/ にアクセスするように以下の設定を行いました。
ProxyPass /foo/ http://localhost:9000/bar/
ProxyPassReverse /foo/ http://localhost:9000/bar/

しかし、apache の設定だけでは、http://localhost:9000/bar/ にはリクエストが送信されず、
エラーログに client denied by server configuration が出力されます。
httpd.conf での設定以外に apache の他サーバへの接続許可の設定を行う必要があります。
sudo setsebool -P httpd_can_network_connect on

設定を確認するには getsebool を使います。
sudo getsebool httpd_can_network_connect


flask-classy での Web サーバ作成

2021-09-28 23:08:31 | python
flask-classy での Web サーバ作成のメモ。

■test_api_view.py
from flask import Flask
from flask_classy import FlaskView

class TestApiView(FlaskView):
    def index(self):
        return "index() is called\n"

    def search(self):
        return "search() is called\n"

■test.py
from flask import Flask
from flask_classy import FlaskView
from test_api_view import TestApiView

def main():
    app = Flask(__name__)
    TestApiView.register(app)
    app.run()
    return 0

if __name__ == '__main__':
    res = main()
    exit(res)


■実行結果
curl "http://localhsot:5000/testapi/"
index() is called

curl "http://localhost:5000/testapi/search/"
search() is called


linux の chrome で html を pdf に変換する方法のメモ

2021-09-21 21:14:17 | linux
linux の chrome で html を pdf に変換する方法のメモ

■chrome のインストール
/etc/yum.repos.d/google.chrome.repo を作成します。
[google-chrome]
name=google-chrome
baseurl=http://dl.google.com/linux/chrome/rpm/stable/$basearch
enabled=1
gpgcheck=1
gpgkey=https://dl-ssl.google.com/linux/linux_signing_key.pub

安定版をインストールします。
sudo yum install google-chrome-stable

■chrome で html を pdf に変換
--print-to-pdf オプションを指定すると、html を pdf に変換することができます。
google-chrome \
    --disable-gpu \
    --headless \
    --print-to-pdf={pdf_file} \
    {url}

以下は、https://www.goo.ne.jp/ を pdf にする例です。
google-chrome \
    --disable-gpu \
    --headless \
    --print-to-pdf=www_goo_ne_jp.pdf \
    'https://www.goo.ne.jp'


Elasticsearch のインストール方法

2021-09-21 20:57:02 | perl
Elasticsearch のインストール方法のメモ。

■Elasticsearch のダウンロード
以下の URL から Elasticsearch の tar.gz ファイルをダウンロードします。
https://www.elastic.co/jp/downloads/elasticsearch
wget elasticsearch-7.14.1-linux-x86_64.tar.gz

■上記のファイルを解凍
gtar zxvf elasticsearch-7.14.1-linux-x86_64.tar.gz

■plugin のインストール
日本語の解析用に kuromoji と icu をインストールします。
cd elasticsearch-7.14.1/bin
elasticsearch-plugin install analysis-kuromoji
elasticsearch-plugin install analysis-icu

■Elasticsearch の起動
./elasticsearch


python で logging を使ってログ出力

2021-09-20 15:36:02 | python
python で logging を使ってログを出力する方法のメモ。

dictConfig() で yaml でのログ出力設定に従って、logger を初期化します。
import sys
import yaml
import logging
from logging.config import dictConfig
from foo import Foo

def main():
    conf_file = 'config.yml'
    with open(conf_file) as file:
        conf = yaml.safe_load(file)
        dictConfig(conf['logger'])
    logger = logging.getLogger(__name__)

    logger.info('*** main start ***')

    foo = Foo()
    foo.bar()

    return 0

if __name__ == '__main__':
    res = main()
    exit(res)

上記のプログラムから呼び出される Foo クラスでは、コンストラクタで logging.getLogger() で logger を取得し、
bar() メソッドで INFO ログを出力します。
import logging

class Foo:
    def __init__(self):
        self.logger = logging.getLogger(__name__)

    def bar(self):
        self.logger.info('*** bar info ***')

yaml の設定ファイルで logger、その他の設定を読み込みます。
settings:
  key1:
  key2:
  key3:

logger:
  version: 1
  formatters:
    file_log_format:
      format: '[{asctime}] [{levelname}] [{module}] [{funcName}] {lineno}: {message:s}'
      datefmt: '%Y-%m-%d %H:%M:%S'
      style: '{'
  handlers:
    file:
      class : logging.handlers.TimedRotatingFileHandler
      formatter: file_log_format
      filename: test.log
      when: MIDNIGHT
      backupCount: 7
      encoding: utf-8
  root:
      level: INFO
      handlers:
        - file
  disable_existing_loggers: False

上記のプログラムを実行すると、以下のようなログが出力されます。
[2021-09-19 23:32:45] [INFO] [test2] [main] 22: *** main start ***
[2021-09-19 23:32:45] [INFO] [foo] [bar] 13: *** bar info ***


python から kuromoji を実行

2021-09-20 02:41:29 | python
python から kuromoji を実行する方法のメモ。

以前の「python から java プログラムを実行」する方法を元にして、python から kuromoji を実行します。

まず、以下の URL から kuromoji をダウンロードします。
https://github.com/atilika/kuromoji/downloads

そして、パスの指定を簡単にするため、kuromoji の jar とpy4j の jar をカレントディレクトリにコピーします。
以前と同様に以下のプログラムをコンパイル・実行します。
import py4j.GatewayServer;

public class GwTest1 {
    public static void main(String[] args) {
        GwTest1 app = new GwTest1();
        GatewayServer server = new GatewayServer(app);
        server.start();
    }
}

java -classpath .:py4j0.10.9.2.jar:kuromoji-0.7.7.jar GwTest1

python から kuromoji を実行するプログラムは以下のようになります。
import sys
from py4j.java_gateway import JavaGateway

def main():
    gw = JavaGateway()

    str = 'サンプルプログラムを実行します。'

    tokenizer = gw.jvm.org.atilika.kuromoji.Tokenizer.builder().build()
    jtkns = tokenizer.tokenize(str)

    for i in range(len(jtkns)):
        jtkn = jtkns[i]
        tkn = {
            'form': jtkn.getSurfaceForm(),
            'base': jtkn.getBaseForm(),
            'read': jtkn.getReading(),
            'pos': jtkn.getAllFeatures(),
        }
        print(tkn)

    return 0

if __name__ == '__main__':
    res = main()
    exit(res)

上記のプログラムを実行すると、以下のように形態素解析結果が出力されます。
$ python kuromoji1.py
{'form': 'サンプル', 'base': 'サンプル', 'read': 'サンプル', 'pos': '名詞,一般,*,*,*,*,サンプル,サンプル,サンプル'}
{'form': 'プログラム', 'base': 'プログラム', 'read': 'プログラム', 'pos': '名詞,サ変接続,*,*,*,*,プログラム,プログラム,プログラム'}
{'form': 'を', 'base': 'を', 'read': 'ヲ', 'pos': '助詞,格助詞,一般,*,*,*,を,ヲ,ヲ'}
{'form': '実行', 'base': '実行', 'read': 'ジッコウ', 'pos': '名詞,サ変接続,*,*,*,*,実行,ジッコウ,ジッコー'}
{'form': 'し', 'base': 'する', 'read': 'シ', 'pos': '動詞,自立,*,*,サ変・スル,連用形,する,シ,シ'}
{'form': 'ます', 'base': 'ます', 'read': 'マス', 'pos': '助動詞,*,*,*,特殊・マス,基本形,ます,マス,マス'}
{'form': '。', 'base': '。', 'read': '。', 'pos': '記号,句点,*,*,*,*,。,。,。'}


python から java プログラムを実行

2021-09-20 00:20:09 | python
python から java プログラムを実行する方法のメモ。

python から java プログラムを実行するには、py4j を使います。
py4j のインストール方法は以下の通り。
pip install py4j

自分の環境では以下に jar ファイルがインストールされました。
/usr/local/share/py4j/py4j0.10.9.2.jar


まず、java プログラム(GwTest1.java)を作成します。
import py4j.GatewayServer;

public class GwTest1 {
    public static void main(String[] args) {
	GwTest1 app = new GwTest1();
	GatewayServer server = new GatewayServer(app);
	server.start();
    }
}

そして、java プログラムをコンパイル・実行します。
javac -classpath /usr/local/share/py4j/py4j0.10.9.2.jar GwTest1.java
java -classpath .:/usr/local/share/py4j/py4j0.10.9.2.jar GwTest1

次に、python プログラムを作成します。
ここでは、java の Date クラスで日付を取得します。
import sys
from py4j.java_gateway import JavaGateway

def main():
    gw = JavaGateway()

    date = gw.jvm.java.util.Date()
    print(date)

    return 0

if __name__ == '__main__':
    res = main()
    exit(res)

上記のプログラムを実行します。
$ python test1.py
Sun Sep 19 08:33:39 PDT 2021

java の Date クラスにより、python で日付情報を取得することが確認できました。

python での yaml ファイルの読み込み

2021-09-19 23:34:02 | python
python での yaml ファイルの読み込み方法のメモ。

python で yaml を処理するためのライブラリの pyyaml をインストールします。
pip install pyyaml

以下のようにして pyyaml で yaml ファイルを読み込めます。
import sys
import yaml

def main():
    file = sys.argv[1]
    try:
        with open(file) as f:
            obj = yaml.safe_load(f)
            print(type(obj))
            print(obj)
    except:
        sys.stderr.write('error: failed to open %s\n' % (file))
        return 1

    return 0

if __name__ == '__main__':
    res = main()
    exit(res)
 

上記のプログラムに以下の yaml ファイルを読み込ませてみます。
db:
  host: localhost
  port: 3306
  db:   test-user

vals1:
  - a
  - b
  - c

vals2: [a, b, c]

実行結果は以下のようになります。
'db': {'host': 'localhost', 'port': 3306, 'db': 'test-user'}, 'vals1': ['a', 'b', 'c'], 'vals2': ['a', 'b', 'c']}


python でのコマンドライン引数の取得

2021-09-19 23:19:41 | python
python でのコマンドライン引数の取得方法のメモ。

python でコマンドライン引数を取得するライブラリの OptionParser の使用例。
import sys
import os
from optparse import OptionParser

def get_opts():
    param = {
        'opts': None,
        'args': None,
    }
    
    try:
        optp = OptionParser()
        optp.add_option('-c', dest='config')
        optp.add_option('-i', dest='input')
        optp.add_option('-o', dest='output')
        (opts, args) = optp.parse_args()
        param['opts'] = opts
        param['args'] = args
    except:
        return None

    return param
    
def main():
    param = get_opts()
    if param is None:
        return 1
    
    print(param)
    return 0

if __name__ == '__main__':
    res = main()
    exit(res)


実行例:
$ python3 test1.py -c config.yaml -i input.txt -o output.txt arg1.txt arg2.txt
{'opts': <Values at 0x7fb0dbbe5b70: {'config': 'config.yaml', 'input': 'input.txt', 'output': 'output.txt'}>, 'args': ['arg1.txt', 'arg2.txt']}

-o を指定しない場合には output が None となります。
$ python3 test1.py -c config.yaml -i input.txt arg1.txt
{'opts': <Values at 0x7f1dd27e7b38: {'config': 'config.yaml', 'input': 'input.txt', 'output': None}>, 'args': ['arg1.txt']}

不要なオプション(-e)を指定するとエラーになります。
 python3 test1.py -c config.yaml -i input.txt -o output.txt -e else.txt arg1.txt arg2.txt
Usage: test1.py [options]

test1.py: error: no such option: -e


JavaScript で数値を桁数指定、桁区切りつきで表示する方法

2021-09-17 21:13:26 | javascript
JavaScript で数値を桁数指定、桁区切りつきで表示する方法のメモ。

JavaScript で数値を桁数指定して表示するには、toPrecision(桁数) を使います。
123.456.toPrecision(4);
> '123.5'

toPrecision() の結果は文字列です。

数値を桁区切りつきで表示するには、toLocaleString() を使います。
123456.789.toLocaleString();
> '123,456.789'

入力された数値を何らかの式で計算を行い、その結果を単純に表示すると、
桁数が長くなってしまうことがあります。
そのような場合、以下のようにすると桁数を抑えて表示することができます。
var org_val = 123.45;          // 元の値
var res_val = org_val * 0.777; // 計算後の値
console.log(res_val);
> 95.92065000000001            // そのまま出力すると桁数が多い

var size = String(org_val).length + 2;  // 元の値の桁数+2桁を表示
var cnv_val = res_val.toPrecision(size);
cnv_val = Number(cnv_val);
cnv_val.toLocaleString();
console.log(cnv_val);
> 95.92065                     // 桁数を抑えて出力


PCで最初に設定しておきたいこと

2021-09-10 20:51:48 | windows
PCで最初に設定しておきたいことのメモ。

■Acrobat Reader 編
・右のメニューを非表示にする方法
 編集 → 環境設定 → 文書 → ツールパネルの現在の状態を記憶

■Outlook
・メール一覧エリアでメール本文を非表示にする方法
 表示 → メッセージのプレビュー → 無効にする

・受信トレイの「優先」「その他」に分類しないようにする方法
 表示 → 「優先受信トレイを表示」でオフにする

・返信時に新たなウィンドウでメールを編集できるようにする方法
 ファイル → オプション → メール → 返信/転送 の「返信と転送を新しいウィンドウで開く」 をチェック

・オートコレクトを停止する方法
 ファイル → オプション → メール → スペルチェックとオートコレクト で各項目のチェックを外す

■Power Point
・オートコレクトを停止する方法
 ファイル → オプション → 文章校正 → オートコレクトのオプション で各項目のチェックを外す

pyenv のインストールと python のインストール方法

2021-09-09 23:20:27 | python
pyenv のインストールと python のインストール方法のメモ。

pyenv をインストールし、その後で python 3.9.7 をインストールします。

■pyenv のインストール
git clone https://github.com/yyuu/pyenv.git ~/.pyenv

echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile
echo 'eval "$(pyenv init -)"' >> ~/.bash_profile

source ~/.bash_profile


■python 3.9.7 のインストール
sudo yum install zlib-devel bzip2 bzip2-devel readline-devel sqlite sqlite-devel openssl-devel
pyenv install 3.9.7
pyenv global 3.9.7


CentOSのインストール後の設定

2021-09-09 23:13:28 | linux
CentOSのインストール後の設定に関するメモ。

■日本語の locale のインストール
sudo yum install glibc-langpack-ja

■日本語の設定
settings から Regin & Language を選択し、以下を設定
Language: 日本語
Formats: 日本語
input sources: 日本語