2020年11月27日金曜日

Python で制御文字 (control character) を削除する方法

概要

制御文字は例えば改行やタブ文字のことを指します
Python で制御文字を操作する場合は unicodedata が便利です

環境

  • macOS 10.15.7
  • Python 3.8.5

サンプルコード

import unicodedata

def remove_control_characters(s):
    return "".join(ch for ch in s if unicodedata.category(ch)[0]!="C")

print('\r' + "return")
print('\t' + "tab")
print(remove_control_characters('\r') + "return")
print(remove_control_characters('\t') + "tab")

結果

こんな感じですべてブランクで置換してくれます

return
        tab
return
tab

参考サイト

2020年11月26日木曜日

cheat.sh を使ってみる

概要

cheat.sh は様々なプログラミング言語やツールのスニペットやショートカットコマンドを簡単に検索、表示することができるツールです
今回はインストールして使ってみました

環境

  • Ubuntu 18.04
  • cheat.sh

インストール

  • curl https://cht.sh/:cht.sh | sudo tee /usr/local/bin/cht.sh
  • chmod +x /usr/local/bin/cht.sh

使ってみる

  • cht.sh ruby

これで実行方法や REPL、ワンライナーのコマンドなどが表示されます
cht.sh は https://cht.sh/ に対してアクセスして情報を取得しています

サポートされている言語の一覧を表示する

  • cht.sh :list

ページの一覧を表示する

  • cht.sh ruby/:list
:learn
:list
Comments
case
classes
control_flow
hello
rosetta/

class の使い方を確認する

  • cht.sh ruby/classes

上記の /:list の結果から classes を指定して URI 形式で指定するだけです

TAB 補完をする

  • curl https://cheat.sh/:bash_completion >> ~/.bashrc

emacs で使う

  • cht.sh /:emacs

で表示される el 情報を .emacs なりに記載すれば OK です
package.el を使って cheat-sh というパッケージをインストールしても OK です

cheat-sh という関数が呼べるようになっているのでコマンドと同じように ruby/:list などをコールすると emacs のバッファで同じ情報が確認できます

Web で確認する

https://cht.sh にアクセスすればここでコマンドと同じ情報を取得することができます

最後に

cheat.sh を使ってみました
ふと言語の文法やオプションなどを確認したいときに使えるかなと思います

2020年11月25日水曜日

emacs で「error in process filter: Could not create connection to melpa.org:443」

概要

Mac 版の emacs で Homebrew でインストールした emacs で発生しました
http のリポジトリを設定すれば OK という記事をよく見かけるのですが
それだと対応できないケースがあるのでそういった場合の対処方法を紹介します

環境

  • macOS 10.15.7
  • emacs 25.3 -> 27.1

emacs を再インストールする

SSL のライブラリがうまくリンクしていないために https 通信がうまく行っていないのだと思います
再インストールするすることでリンクさせましょう

  • xcode-select --install
  • brew reinstall emacs


ただバージョンアップしてしまうのでバージョンを固定したい場合はバージョンを指定して brew install してください

動作確認

emacs を再度開いて package-list-packages などをコールしてみましょう

また brew info emacs で確認すると gnutls がちゃんとチェックになっているのが確認できると思います

2020年11月24日火曜日

Ubuntu18.04 で SSH デーモンを複数起動する方法

概要

異なるポートで複数の sshd を起動する方法を紹介します
単純に設定ファイルを複製しポート番号を書き換えてサービス起動するだけです

環境

  • Ubuntu 18.04

sshd_config の作成

  • cp /etc/ssh/sshd{,-second}_config

ポート番号の変更

  • vim /etc/ssh/sshd-second_config
Port 10022

サービスファイルの作成

  • cp /lib/systemd/system/ssh.service /lib/systemd/system/ssh-second.service

起動する際のコンフィグファイルを変更

  • vim /lib/systemd/system/ssh-second.service
ExecStart=/usr/sbin/sshd -D -f /etc/ssh/sshd-second_config $SSHD_OPTS

サービス登録される際の Alias も変更します

Alias=sshd-second.service

ついでに Description も変更します

Description=OpenBSD Secure second Shell server

systemd に反映させる

  • systemctl daemon-reload

サービス起動

  • systemctl enable ssh-second.service --now
  • systemctl status ssh-second.service

動作確認

  • ssh user@hostname
  • ssh -p 10022 user@hostname

最後に

設定ファイルが別々にあるので片方は鍵認証あり片方は鍵認証なしなども可能です
ポートによる IP 制限は ufw などを使えば良いかなと思います

参考サイト

2020年11月20日金曜日

certbot renew で証明書の自動更新メモ

概要

自分用のメモです
standalone プラグインを使って証明書を取得している場合はかなり簡単に自動更新できます
--pre-hook--post-hook を使って 80 を一瞬停止するのがポイントです

環境

  • Ubuntu18.04
  • certbot 1.9.0

cron 設定

2 ヶ月に 1 回 24:30 に更新する設定です
Lets’s Encrypt は 90 日で期限切れで残り 30 日から更新可能です

80 番はコンテナで動作しているので docker コマンドで停止しています
ここは自身の環境にあったコマンドに変更すれば OK です

30 15 25 */2 * cd /home/hawksnowlog/app; sudo certbot-auto renew --pre-hook "docker-compose stop proxy" --post-hook "docker-compose start proxy"

他にファイアウォールなどで 80 番ポートを制御している場合はそれも一瞬開放する必要があります

2020年11月19日木曜日

docker 上で squid を動かす

概要

前回 Ubuntu 上に squid を構築しました
今回は docker 上に構築してみたいと思います

環境

  • Ubuntu 16.04
  • docker 19.03.12

キャッシュ用のディレクトリ作成

squid がキャッシュした情報を永続化するためにホスト側にマウントします
ディレクトリは何でも OK です

  • mkdir /home/vagrant/cache

コンテナ起動

ではコンテナを起動します
先程作成したキャッシュ用のディレクトリを /var/spool/squid でマウントします

docker run --name squid -d --restart=always \
  -p 3128:3128 \
  -v /home/vagrant/cache:/var/spool/squid \
  sameersbn/squid:3.5.27-2

設定ファイルを使う

デフォルトだと http/https プロキシとして使えないので設定ファイルを変更します

  • mkdir /home/vagrant/config
  • vim /home/vagrant/squid.conf
http_access allow all
docker run --name squid -d --restart=always \
  -p 3128:3128 \
  -v /home/vagrant/config/squid.conf:/etc/squid/squid.conf \
  -v /home/vagrant/cache:/var/spool/squid \
  sameersbn/squid:3.5.27-2

使う

あとは普通に使うだけです
curl の場合は以下のように使えます

  • http_proxy=192.168.100.10:3128 https_proxy=192.168.100.10:3128 curl https://kaka-request-dumper.herokuapp.com/

設定ファイルをリロードするには

SIGHUP を送信します

  • docker kill -s HUP squid

おまけ: docker-compose で起動する

docker-compose で管理したい場合はこれを使いましょう

  • vim docker-compose.yml
version: '3'
services:
  squid:
    image: sameersbn/squid:3.5.27-2
    ports:
      - "3128:3128"
    volumes:
      - /home/vagrant/cache:/var/spool/squid
      - /home/vagrant/config/squid.conf:/etc/squid/squid.conf
    restart: always
  • docker-compose up -d

最後に

docker 上で squid コンテナを立ててみました
バージョンを上げたい場合はイメージを変更すれば動作すると思います

参考サイト

2020年11月18日水曜日

Ansible で環境変数を使って特定の環境ごとにタスクを切り替える方法

概要

例えばデプロイするファイルを動的に切り替えたい場合に毎回 playbook を変更するのは面倒です
また group_vars などで変数で定義してもいいですがそれも毎回変更するのは面倒です
そんなときは環境変数で playbook を実行するたびに別の値を設定しそれを参照するようにできます

環境

  • macOS 10.15.7
  • ansible 2.9.10

サンプルコード

HOGE という環境変数を設定することを想定しています
copy のファイル名や when の条件にも使えます
環境変数の設定を必須にしたい場合は playbook の冒頭で変数のチェックをして空であれば fail にするような処理を入れたほうが良いかなと思います

---
- hosts: localhost
  gather_facts: no
  vars_files:
    - vault.yml
  tasks:
    - name: Check HOGE env
      fail: 
        msg: The HOGE variable is an empty or None.
      when: lookup('env', 'HOGE') == ""

    - name: Print HOGE env
      debug:
        msg: "HOGE = {{ lookup('env', 'HOGE') }}"

    - name: Put a file
      copy:
        src: files/test_{{ lookup('env', 'HOGE') }}.txt
        dest: ~/Downloads/test.txt
        owner: hawksnowlog
        group: staff
        mode: '0644'

実行する場合はコマンドの前に環境変数をセットしてから実行しましょう

  • HOGE=fuga ansible-playbook -i hosts site.yml

特定の値が環境変数に設定されているか確認する場合は

サンプルコードは空の場合にエラーにしました
特定の値が入っていない場合はエラーにしたい場合は when を以下のように変更しましょう

when: lookup('env', 'HOGE') not in ["hoge", "fuga", "foo"]

参考サイト