2023年10月31日火曜日

paramiko で古いサーバに ssh するときは disabled_algorithms を設定しなければならない

paramiko で古いサーバに ssh するときは disabled_algorithms を設定しなければならない

概要

古いサーバに接続するときに最新の openssh などが適用されていないので paramiko で使用されているデフォルトのアルゴリズムが使えません

環境

  • Python 3.11.3
  • paramiko 2.12.0

サンプルコード

ssh_client.connect(ip_address, port, user, pkey=rsa_key, disabled_algorithms=dict(pubkeys=['rsa-sha2-256', 'rsa-sha2-512']))

最後に

エラーは普通に Authentication failed. なのでかなりわかりづらいです

参考サイト

2023年10月30日月曜日

Company: frontend company-pseudo-tooltip-unless-just-one-frontend error "Company: backend company-capf error "Symbol’s function definition is void: string-lines" with args (match dataclass)" on command post-command

Company: frontend company-pseudo-tooltip-unless-just-one-frontend error "Company: backend company-capf error "Symbol’s function definition is void: string-lines" with args (match dataclass)" on command post-command

概要

タイトルのエラーが pyright + company で発生したので対応しました

環境

  • Ubuntu 22.04
  • emacs 27.1

対応方法

emacs を 29.1 にバージョンアップする

  • git clone --depth 1 --branch emacs-29.1 git://git.savannah.gnu.org/emacs.git emacs-29.1
  • cd emacs-29.1
  • sudo apt -y install autoconf textinfo libgnutls28-dev
  • ./autogen.sh
  • ./configure.sh
  • sudo make install

lsp-mode をアップグレードする

  • package-list-packages
  • Shift+U
  • x

あとは emacs を起動し直せば OK

最後に

emacs の最新版はソースインストールするしかないのでソースからインストールしましょう

足りないパッケージがあれば apt でインストールしてください

2023年10月27日金曜日

black + isort 設定メモ

black + isort 設定メモ

概要

いつも忘れるのでメモ

環境

  • Ubuntu 22.04
  • Python 3.11.3
    • black 23.10.1
    • isort 5.12.0

インストール

  • pipenv install black
  • pipenv install isort

設定ファイル

  • vim .isort.cfg
[tool.isort]
profile = "black"

実行

  • pipenv run isort . && pipenv run black .

2023年10月26日木曜日

python で gitlab api を操作する

python で gitlab api を操作する

概要

今回はユーザのアクティブを取得するサンプルコードを紹介します
ちなみに前回はRubyで取得しています

環境

  • Ubuntu 22.04
  • Python 3.11.3
  • python-gitlab 3.15.0

インストール

  • pipenv install python-gitlab

サンプルコード

import datetime
from dataclasses import dataclass

import gitlab


@dataclass
class Result:
    title: str
    web_url: str


@dataclass
class Event:
    project_id: int
    target_title: str
    target_type: str

    def __eq__(self, other):
        return self.target_title == other.target_title


gl = gitlab.Gitlab(
    url="https://your.gitlab.url.here", private_token="xxxx"
)

date = datetime.datetime.now() - datetime.timedelta(days=7)
user = gl.users.get(18)

events = []
gitlab_events = user.events.list(
    iterator=True,
    query_parameters={"after": date.strftime("%Y-%m-%d")},
)
for event in gitlab_events:
    e = Event(
        project_id=event.project_id,
        target_title=event.target_title,
        target_type=event.target_type,
    )
    if not e in events:
        events.append(e)

results = []
for event in events:
    if event.target_type in ["Note", "Issue", "MergeRequest"]:
        project = gl.projects.get(event.project_id)
        for issue in project.issues.list(iterator=True):
            if issue.title == event.target_title:
                r = Result(title=issue.title, web_url=issue.web_url)
                results.append(r)
        for mr in project.mergerequests.list(iterator=True):
            if mr.title == event.target_title:
                r = Result(title=mr.title, web_url=mr.web_url)
                results.append(r)

for r in results:
    print(f"* {r.title} -> {r.web_url}")

ちょっと解説

イベントを取得したあと同一タイトルのイベントをまとめています
そしてまとめたイベントを元にイベントが発生した Issue or MergeRequest の URL を取得しています

また取得する期間は一週間になります

参考サイト

2023年10月25日水曜日

cal-heatmap v4 でマウスホイールでカレンダーを移動する方法

cal-heatmap v4 でマウスホイールでカレンダーを移動する方法

概要

ボタンで前後するのは大変なのでマイスホイールで前後できるようにしてみました

環境

  • macOS 14.0
  • nginx 1.25.2
  • cal-heatmap 4.2.3

サンプルコード

<!DOCTYPE html>
<html>
<head>
  <title>cal-heatmap v4</title>
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <script src="https://d3js.org/d3.v7.min.js"></script>
  <script src="https://unpkg.com/cal-heatmap/dist/cal-heatmap.min.js"></script>
  <script src="https://unpkg.com/@popperjs/core@2"></script>
  <script src="https://unpkg.com/cal-heatmap/dist/plugins/Tooltip.min.js"></script>
  <script src="https://unpkg.com/cal-heatmap/dist/plugins/Legend.min.js"></script>
  <link rel="stylesheet" href="https://unpkg.com/cal-heatmap/dist/cal-heatmap.css">
  <style>
    .heatmap {
      width: 100%;
      overflow: hidden;
    }
  </style>
</head>
<body>
  <h1>Test</h1>
  <div>
    <div class="heatmap">
      <div id="cal-heatmap"></div>
    </div>
    <div>
      <button type="button" onclick="pre()">pre</button>
      <button type="button" onclick="next()">next</button>
    </div>
  </div>
  <script>
    const cal = new CalHeatmap();
    const data = [
      { date: '2023-10-18', value: 300 },
      { date: '2023-10-20', value: 600 },
      { date: '2023-11-01', value: 100 },
      { date: '2023-11-08', value: 200 },
      { date: '2023-11-15', value: 300 },
    ];
    cal.paint({
      data: {
        source: data,
        x: 'date',
        y: 'value',
        defaultValue: 0,
      },
      domain: { type: 'month' },
      subDomain: { type: 'day' },
      range: 40,
      date: {
        locale: 'ja',
        timezone: 'Asia/Tokyo',
        start: new Date(2023, 9, 1)
      },
    }, [[Tooltip, { enabled: true }], [Legend, { enabled: true, width: 1000 }]]);
    function pre(e) {
      cal.previous();
    };
    function next(e) {
      cal.next();
    };
    var calDiv = document.getElementById("cal-heatmap");
    calDiv.addEventListener("wheel",function(e) {
      e.preventDefault();
      if (event.deltaY < 0) {
        next(e);
      } else if (event.deltaY > 0) {
        pre(e);
      }
    });
  </script>
</body>
</html>

ちょっと解説

追加したのは addEventListener の部分です
wheel イベントを div に追加してマウスが上の場合は cal.next で下の場合は cal.previous をコールしています

イベントの直後で e.preventDefault() しないと画面ごとスクロールしてしまうので必須です

デモ

最後に

まだネット上にはない情報かなと思うので役に立てば幸いです

2023年10月24日火曜日

cal-heatmap v4 で tooltip が表示されないときの対象方法

cal-heatmap v4 で tooltip が表示されないときの対象方法

概要

高さがかなりあるサイトやスクロールバーが表示されるケースでなぜかツールチップが表示されない現象が確認できました
対処方法を紹介します

環境

  • macOS 14.0
  • nginx 1.25.2
  • cal-heatmap 4.2.3

対処方法

placement: 'auto' を指定します
例えば以下のように cal.paint で指定します

  cal.paint({
    data: {
      source: calData,
      x: 'date',
      y: 'value',
      defaultValue: 0,
    },
    domain: { type: 'month' },
    subDomain: { type: 'day' },
    range: 20,
    date: {
      locale: 'ja',
      timezone: 'Asia/Tokyo',
      start: start,
    },
    scale: {
      color: {
        scheme: 'OrRd',
        type: 'linear',
        domain: [0, 3150],
      },
    },
  }, [[Tooltip, { enabled: true, placement: 'auto' }], [Legend, { enabled: true, width: 1000 }]]);

最後に

内部的には popper を使っているので https://popper.js.org/docs/v2/constructors/#options のオプションが全部使えます

2023年10月22日日曜日

cal-heatmap v4 でレスポンシブデザインにする方法

cal-heatmap v4 でレスポンシブデザインにする方法

概要

機能としてはないので自分でそれっぽいのを作る必要があります

環境

  • macOS 14.0
  • nginx 1.25.2
  • cal-heatmap 4.2.3

サンプルコード

<!DOCTYPE html>
<html>
<head>
  <title>cal-heatmap v4</title>
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <script src="https://d3js.org/d3.v7.min.js"></script>
  <script src="https://unpkg.com/cal-heatmap/dist/cal-heatmap.min.js"></script>
  <script src="https://unpkg.com/@popperjs/core@2"></script>
  <script src="https://unpkg.com/cal-heatmap/dist/plugins/Tooltip.min.js"></script>
  <script src="https://unpkg.com/cal-heatmap/dist/plugins/Legend.min.js"></script>
  <link rel="stylesheet" href="https://unpkg.com/cal-heatmap/dist/cal-heatmap.css">
  <style>
    .heatmap {
      width: 100%;
      overflow: hidden;
    }
  </style>
</head>
<body>
  <h1>Test</h1>
  <div>
    <div class="heatmap">
      <div id="cal-heatmap"></div>
    </div>
    <div>
      <button type="button" onclick="pre()">pre</button>
      <button type="button" onclick="next()">next</button>
    </div>
  </div>
  <script>
    const cal = new CalHeatmap();
    const data = [
      { date: '2023-10-18', value: 300 },
      { date: '2023-10-20', value: 600 },
      { date: '2023-11-01', value: 100 },
      { date: '2023-11-08', value: 200 },
      { date: '2023-11-15', value: 300 },
    ];
    cal.paint({
      data: {
        source: data,
        x: 'date',
        y: 'value',
        defaultValue: 0,
      },
      domain: { type: 'month' },
      subDomain: { type: 'day' },
      range: 40,
      date: {
        locale: 'ja',
        timezone: 'Asia/Tokyo',
        start: new Date(2023, 9, 1)
      },
    }, [[Tooltip, { enabled: true }], [Legend, { enabled: true, width: 1000 }]]);
    function pre(e) {
      cal.previous();
    };
    function next(e) {
      cal.next();
    };
  </script>
</body>
</html>

ちょっと解説

cal-heatmap v4 は svg でヒートマップを作成します
range が多い場合に svg がとても大きくなり親要素の div を無視して横に伸び続けてしまします
それを overflow: hidden; で隠します (実際には横に伸び続けています)

legend はなぜかレスポンシブに対応しておりどんだけ横に伸ばしても自動で短くなってくれるのでそのままで OK です

あとは画面がはみ出た文をボタンで移動できるようにすれば OK です

最後に

そのうち公式の機能としてヒートマップもレスポンシブに対応するかもしれません

参考サイト

2023年10月20日金曜日

cal-heatmap v4 を試す

cal-heatmap v4 を試す

概要

v4 になっていたのでマイグレーション方法も含めて確認のため試してみました
node は使わずブラウザのみで試します

環境

  • macOS 14.0
  • nginx 1.25.2
  • cal-heatmap 4.2.3

Getting Started

  • cd /opt/homebrew/var/www
  • vim index.html
<!DOCTYPE html>
<html>
<head>
  <title>cal-heatmap v4</title>
  <script src="https://d3js.org/d3.v7.min.js"></script>
  <script src="https://unpkg.com/cal-heatmap/dist/cal-heatmap.min.js"></script>
  <link rel="stylesheet" href="https://unpkg.com/cal-heatmap/dist/cal-heatmap.css">
</head>
<body>
  <h1>Test</h1>
  <div id="cal-heatmap"></div>
  <script>
    const cal = new CalHeatmap();
    cal.paint({});
  </script>
</body>
</html>
  • /opt/homebrew/opt/nginx/bin/nginx -g "daemon off;"

データを登録してみる

<!DOCTYPE html>
<html>
<head>
  <title>cal-heatmap v4</title>
  <script src="https://d3js.org/d3.v7.min.js"></script>
  <script src="https://unpkg.com/cal-heatmap/dist/cal-heatmap.min.js"></script>
  <script src="https://unpkg.com/@popperjs/core@2"></script>
  <script src="https://unpkg.com/cal-heatmap/dist/plugins/Tooltip.min.js"></script>
  <link rel="stylesheet" href="https://unpkg.com/cal-heatmap/dist/cal-heatmap.css">
</head>
<body>
  <h1>Test</h1>
  <div id="cal-heatmap"></div>
  <script>
    const cal = new CalHeatmap();
    const data = [
      { date: '2023-10-18', value: 300 },
      { date: '2023-10-20', value: 600 },
      { date: '2023-11-01', value: 100 },
      { date: '2023-11-08', value: 200 },
      { date: '2023-11-15', value: 300 },
    ];
    cal.paint({
      data: {
        source: data,
        x: 'date',
        y: 'value',
        defaultValue: 0,
      },
      domain: { type: 'month' },
      subDomain: { type: 'day' },
      range: 20,
      date: {
        locale: 'ja',
        timezone: 'Asia/Tokyo',
        start: new Date(2023, 9, 1)
      },
    }, [[Tooltip, { enabled: true }]]);
  </script>
</body>
</html>

ちょっと解説

data で x, y で必ずデータの日付のキーと値のキーを指定する必要があります
domain, subDomain を使って表示する単位を日毎にしています
locale と timeZone を指定しましょう、デフォルトは日本になっていません
range を指定すると表示する月の数を指定することができます

最後に

一番はまったのは data で必ず x, y を指定する点でした
次回は v3 からのマイグレーション時のポイントを紹介します

参考サイト

2023年10月19日木曜日

john the ripper を mac で動かし zip パスワードを解析する

john the ripper を mac で動かし zip パスワードを解析する

概要

一連の流れをメモしておきます

環境

  • macOS 14.0 (m2mac pro 10cpu)
  • john-jumbo 1.9.0

インストール

  • brew install john-jumbo

/opt/homebrew/Cellar/john-jumbo/1.9.0_1/share/john/zip2john

使い方サンプル

zip ファイル作成

  • zip -e --password=xxx encrypt.zip app.py

暗号化情報取得

  • /opt/homebrew/Cellar/john-jumbo/1.9.0_1/share/john/zip2john encrypt.zip > pass_info.txt

総当り

  • john --fork=10 --incremental=ASCII pass_info.txt

CPU10 個フルに使っています

結果

8 桁のランダム文字列数字パスワードで1日ほどかかりました
スペックの低いマシンだともっとかかります

一応確認

  • unzip -P xxxx encrypt.zip

最後に

複雑なパスワードを解くのはマシンスペックがないとかなり非現実的な感じです

参考サイト

2023年10月16日月曜日

Wireshark で https を復号化する方法

Wireshark で https を復号化する方法

概要

よくSSLKEYLOGFILE を使う方法が紹介されていますが今回は pcap ファイルと鍵を使って復号化する方法を紹介します

環境

  • Windows 10
  • Wireshark 4.0.10

鍵の設定

編集 -> 設定 -> Protocols -> TLS

を開きます

RSA keys list の編集を選択します
そして復号化する通信先の設定を記載します

例えば以下のように記載します

  • IP Address -> 192.168.100.1
  • Port -> 443
  • Protocol -> http
  • Key file -> 秘密鍵が置いてあるパス

pcap ファイルを開く

あとは pcap ファイルを開けば OK です
復号化されたパケットは緑色のハイライトで表示されます

最後に

ブラウザや curl を使ってリアルタイムに復号化する場合は SSLKEYLOGFILE を設定しましょう

2023年10月10日火曜日

PowershellでGoogle日本語キーボードをインストールする方法

PowershellでGoogle日本語キーボードをインストールする方法

概要

この現象で日本語キーボードがなくなってしまうのでPowershellで自動インストールしてみます

環境

  • Windows 10

Google日本語キーボードを追加するスクリプト

# Get-WinUserLanguageList
$LanguageList = New-WinUserLanguageList ja-JP
$LanguageList[0].InputMethodTips.Clear()
$LanguageList[0].InputMethodTips.Add('0411:{D5A86FD5-5308-47EA-AD16-9C4EB160EC3C}{773EB24E-CA1D-4B1B-B420-FA985BB0B80D}')
Set-WinUserLanguageList $LanguageList -Force

説明

0411:{D5A86FD5-5308-47EA-AD16-9C4EB160EC3C}{773EB24E-CA1D-4B1B-B420-FA985BB0B80D} は Google 日本語キーボードのレイアウトコードになります

レイアウトコードは Get-WinUserLanguageList コマンドで確認できるので違う場合は上記コマンドで確認してください

一旦不要なキーボードを Clear で削除して再度 Google 日本語キーボードをインストールしているので最終的には日本語キーボードは Google 日本語キーボードのみになります

実行

実行方法やショートカットの作成はこちらを参考にしてください

直接実行はコマンドプロントからクリックで実行はショートカットを作成してください

最後に

なぜかなくなってしまうキーボードレイアウト問題はこれですべて解決です

2023年10月3日火曜日

dockle 超入門

dockle 超入門

概要

過去に同じようなツールでtrivyの使い方を紹介しました
今回はdockleの使い方を紹介します

環境

  • macOS 13.5.2
  • docker 24.0.6
  • dockle 0.4.3

インストール

  • brew install goodwithtech/r/dockle

使い方

イメージ名を指定するだけです

  • dockle kakakikikeke/request-dumper

あとは以下のように警告やらが出てきます

WARN    - CIS-DI-0001: Create a user for the container
        * Last user should not be root
WARN    - DKL-DI-0006: Avoid latest tag
        * Avoid 'latest' tag
INFO    - CIS-DI-0005: Enable Content trust for Docker
        * export DOCKER_CONTENT_TRUST=1 before docker pull/build
INFO    - CIS-DI-0006: Add HEALTHCHECK instruction to the container image
        * not found HEALTHCHECK statement
INFO    - CIS-DI-0008: Confirm safety of setuid/setgid files
        * setuid file: urwxr-xr-x usr/bin/chsh
        * setuid file: urwxr-xr-x usr/bin/gpasswd
        * setuid file: urwxr-xr-x usr/bin/passwd
        * setgid file: grwxr-xr-x sbin/unix_chkpwd
        * setuid file: urwxr-xr-x bin/su
        * setuid file: urwxr-xr-x bin/mount
        * setuid file: urwxr-xr-x usr/bin/chfn
        * setgid file: grwxr-xr-x usr/bin/expiry
        * setuid file: urwxr-xr-x usr/bin/newgrp
        * setgid file: grwxr-xr-x usr/bin/chage
        * setuid file: urwxr-xr-x usr/lib/openssh/ssh-keysign
        * setgid file: grwxr-xr-x usr/bin/ssh-agent
        * setuid file: urwxr-xr-x bin/umount
        * setgid file: grwxr-xr-x usr/bin/wall
INFO    - DKL-LI-0003: Only put necessary files
        * Suspicious directory : usr/local/lib/ruby/gems/3.1.0/gems/typeprof-0.21.2/vscode/.vscode

最後に

trivy と dockle の違いは主に脆弱性の参照先にあるようです
trivy は CVE などを検知してくれますが dockle は Dockerfile の記述がセキュリティ的に問題ないかという点で検知してくれます
どちらも簡単に導入できるので両方やってもいいのかもしれません

参考サイト

2023年10月2日月曜日

Pythonでセマンティクスバージョンをソートする方法

Pythonでセマンティクスバージョンをソートする方法

概要

普通に比較演算子が使えるので sort or sorted に投げるだけです

環境

  • Python 3.11.5

サンプルコード

from packaging import version

versions = [version.parse("10.1.2"), version.parse("14.7.7"), version.parse("2.3.1"), version.parse("14.6.8")]
# 昇順
print(sorted(versions, reverse=True))
# 降順
print(sorted(versions, reverse=True))