けつあご日記

tinojiはやみのふぃくさーにしかなりたくない.ひゃっぽゆずっててんほういは,あり.

Nginx(OpenResty)のLua shared dictionaryで無理やり配列を使う

配列はサポートされてないが、適当にシリアライザ/デシリアライザ的なの書いてやってみた。パフォーマンスはちゃんと見てないがまぁ動く。


サクッと試すnginx.confはこんな感じ。

worker_processes 12;

events {
    worker_connections 2048;
}


http {
    lua_shared_dict foo 10m;

    server {
        listen 80;

        location /test {
            content_by_lua_block {
                local function split(str, separator)
                    local result = {}
                    local pattern = '[^' .. separator .. ']+'

                    for tmp in string.gmatch(str, pattern) do
                        table.insert(result, tmp)
                    end

                    return result
                end

                local function trimBracket(str)
                    return (str:gsub("^{(.*)}$", "%1"))
                end

                local function arrayToString(array)
                    if #array == 0 then
                        return '{}'
                    end

                    return '{"' .. table.concat(array, '","') .. '"}'
                end

                local function removeQuatation(str)
                    local s = str:gsub('"', '')
                    return s:gsub("'", '')
                end

                local function stringToArray(str)
                    local s = trimBracket(str)
                    s = removeQuatation(s)
                    return split(s, ',')
                end

                local intbl = {"abc", "def"}
                -- add to shared
                ngx.shared.foo:add("key", arrayToString(intbl))
                ngx.say("stored")

                -- get from shared
                local outtbl = stringToArray(ngx.shared.foo:get("key"))
                ngx.say(table.concat(outtbl, ":"))
            }
        }
    }
}


マスタリングNginx

マスタリングNginx

Seleniumでスクリーンショット撮ってSlackに送るPythonスクリプト

毎回オプション周りでハマるのでメモ。


Selenium実践入門 ―― 自動化による継続的なブラウザテスト (WEB+DB PRESS plus)

Selenium実践入門 ―― 自動化による継続的なブラウザテスト (WEB+DB PRESS plus)

  • 作者: 伊藤望,戸田広,沖田邦夫,宮田淳平,長谷川淳,清水直樹,Vishal Banthia
  • 出版社/メーカー: 技術評論社
  • 発売日: 2016/02/02
  • メディア: 単行本(ソフトカバー)
  • この商品を含むブログ (4件) を見る

Dockerの「コンテナ間」でポートをバインドする

メモ。ゴリッとポートフォワーディングする。

起動。

#接続先コンテナB
docker run -it --privileged --name containerA -d <id> /sbin/init

#接続元コンテナA(/etc/hostsに追加するためにlink指定)
docker run -it --privileged --name containerA --link containerB:containerB -d <id> /sbin/init

ポートフォワーディング。

docker exec -it containerA bash
yum install -y iptables-services
systemctl start iptables

#localhostへの通信のポートフォワードを許可
sysctl -w net.ipv4.conf.eth0.route_localnet=1

#/etc/hostsからlink指定したcontainerBのIPを取得してiptablesに追加
iptables -t nat -A OUTPUT -p tcp -d 127.0.0.1 --dport 80 -j DNAT --to-destination `getent hosts containerB | cut -d ' ' -f 1`:80
iptables -t nat -A POSTROUTING -j MASQUERADE

確認。

curl -v http://localhost/


プログラマのためのDocker教科書 第2版 インフラの基礎知識&コードによる環境構築の自動化

プログラマのためのDocker教科書 第2版 インフラの基礎知識&コードによる環境構築の自動化

vscodeにRoslynatorのAnalyzerを入れる

現行のドキュメントの通りにインストールするとAnalyzerの指摘ルールが効かなくてツライ。

github.com これによると単純にdllが足りてないっぽい。

必要なdll:
https://github.com/OmniSharp/omnisharp-vim/issues/451#issuecomment-473727111

Jsonファイル:
https://github.com/OmniSharp/omnisharp-vim/issues/451#issuecomment-472426620

結局こんな感じにしたらちゃんと動いた。

[/usr/local/lib/roslynator]
$ tree
.
├── Roslynator.CSharp.Analyzers.CodeFixes.dll
├── Roslynator.CSharp.Analyzers.dll
├── Roslynator.CSharp.CodeFixes.dll
├── Roslynator.CSharp.Refactorings.dll
├── Roslynator.CSharp.Workspaces.dll
├── Roslynator.CSharp.dll
├── Roslynator.Common.dll
├── Roslynator.Core.dll
├── Roslynator.Workspaces.Common.dll
└── Roslynator.Workspaces.Core.dll
{
  "RoslynExtensionsOptions": {
    "EnableAnalyzersSupport": true,
    "LocationPaths": [
        "/usr/local/lib/roslynator"
    ]
  }
}

ドキュメントに書いといてほしいわ、、、ということでPR出しておいた。 github.com


実戦で役立つ C#プログラミングのイディオム/定石&パターン

実戦で役立つ C#プログラミングのイディオム/定石&パターン

基礎からしっかり学ぶC#の教科書

基礎からしっかり学ぶC#の教科書

AnsibleのhostにPythonのsystemdモジュールを入れたら名前衝突して死んだ

Pythonでjournaldにログを流したくて、何の気なしにコレを入れたらansibleが流せなくなった。

pypi.org

$ pip install systemd
TASK [ansible-role-foo : check pip] *********************************************************************************************************************************************************************************************************************************
fatal: [redis_2]: FAILED! => {"changed": false, "module_stderr": "Shared connection to 192.168.0.33 closed.\r\n", "module_stdout": "\r\nTraceback (most recent call last):\r\n  File \"/home/netcorp/.ansible/tmp/ansible-tmp-1563421779.05-167833696292502/AnsiballZ_command.py\", line 114, in <module>\r\n    _ansiballz_main()\r\n  File \"/home/netcorp/.ansible/tmp/ansible-tmp-1563421779.05-167833696292502/AnsiballZ_command.py\", line 106, in _ansiballz_main\r\n    invoke_module(zipped_mod, temp_path, ANSIBALLZ_PARAMS)\r\n  File \"/home/netcorp/.ansible/tmp/ansible-tmp-1563421779.05-167833696292502/AnsiballZ_command.py\", line 49, in invoke_module\r\n    imp.load_module('__main__', mod, module, MOD_DESC)\r\n  File \"/tmp/ansible_command_payload_1C43Pp/__main__.py\", line 327, in <module>\r\n  File \"/tmp/ansible_command_payload_1C43Pp/__main__.py\", line 228, in main\r\n  File \"/tmp/ansible_command_payload_1C43Pp/ansible_command_payload.zip/ansible/module_utils/basic.py\", line 691, in __init__\r\n  File \"/tmp/ansible_command_payload_1C43Pp/ansible_command_payload.zip/ansible/module_utils/basic.py\", line 1940, in _log_invocation\r\n  File \"/tmp/ansible_command_payload_1C43Pp/ansible_command_payload.zip/ansible/module_utils/basic.py\", line 1898, in log\r\n  File \"systemd/_journal.pyx\", line 68, in systemd._journal.send\r\n  File \"systemd/_journal.pyx\", line 32, in systemd._journal._send\r\nValueError: Key name may not begin with an underscore\r\n", "msg": "MODULE FAILURE\nSee stdout/stderr for the exact error", "rc": 1}
...ignoring

Ansible自体が使用していたsystemdモジュールが効かなくなって死んだぽい?

正解はこっちである。紛らわしい pypi.org

$ pip install systemd-python

前者の方、リポジトリを見たら最新版では名前衝突しないように?モジュール名が変わっている。バージョンが0系だった時点で疑うべきたった、、、 github.com

結局cythonのラッパーを使う必要は全く無いのでsystemd-pythonの方を使うことにした。解決。


Ansible実践ガイド 第2版 (impress top gear)

Ansible実践ガイド 第2版 (impress top gear)

Rundeckのプラグインをdockerでデバッグするときのメモ

dockerイメージはこれ。
https://hub.docker.com/r/rundeck/rundeck/

Dockerfile見たいときはココ。
https://github.com/rundeck/rundeck/tree/48693253ba60da666d5fc9b12d1922d039ef9583/docker/official

起動。

$ docker run --name rundeck -p 4440:4440 -it rundeck/rundeck:3.0.23

ブラウザで127.0.0.1:4440にアクセス(localhostだとなんか画面遷移がうまくいかないときがあった)。

シェル入りたいときは普通に、

$ docker exec -it rundeck /bin/bash

プラグインのディレクトリは/home/rundeck/libextなので、ローカルでプラグインをビルドしたあとそこにコピーする。 コンテナを再起動しなくてもプラグインは認識される。

$ docker cp build/libs/my-plugin-1.0.jar rundeck:/home/rundeck/libext

以上。


プログラマのためのDocker教科書 第2版 インフラの基礎知識&コードによる環境構築の自動化

プログラマのためのDocker教科書 第2版 インフラの基礎知識&コードによる環境構築の自動化

Docker/Kubernetes 実践コンテナ開発入門

Docker/Kubernetes 実践コンテナ開発入門