R, Python, DB 備忘録

データベースとか、jupyter(Python)、Rとか色々

VairbleInspectorインストールメモ

jupyter labの拡張機能であるVariableInspectorをインストールする際にいくつか詰まった点

インストールのためのメモ

  • インストールのための必要条件
    • git拡張を外す
pip uninstall jupyterlab-git gitdb GitPython
    • latex拡張を外す:自分の環境には入っていなかったが、そうらしい
    • ver 3.0.7を使う:ver 3.0.9では‘AppOptions’ object has no attribute ‘extensions’が発生
jupyter labextension install @lckr/jupyterlab_variableinspector@3.0.7

その後

有効にして1~2週間ほど使ったが、何かが遅い。
df.shapesとか、df.dtypesしかしていないのに、数分固まることがある。
以前、Rカーネルと併用してはいけないという記事(RとvariableInspector混ぜるな危険 - R, Python, DB 備忘録)を書いたが、Pythonにおいてもオブジェクトを見に行っているんだろうな、だから遅いんだろうと思って無効にしてみたところ快適な挙動が復活。

結論

大きめ(100万行~)のデータを扱うなら、VariableInspectorは入れない方が良い。

Lubuntu 20.04 自宅サーバー構築メモ

全部きちんと書くと大変なので、とりあえずは自分用に殴り書き
少しずつ正確な手順に書き換えていきたい...

目的(用途)

  • VPNサーバー
  • ネットワークストレージ
  • pythonプログラムの定期実行(深夜ラジオの録音)

環境

  • マシン:LIVA X2
    • CPU:Intel Celeron
    • メモリ:2GB
    • ストレージ:eMMC 32GB

www.ecsjpn.co.jp

  • OS:Lubuntu 20.04

以下、手順

OSインストール

  • 言語:English、タイムゾーン:東京
  • 個人用のフォルダが「ダウンロード」等日本語名になるのがあまり好きではないため

初期準備

sudo apt update
sudo apt upgrade
sudo apt install gcc make ffmpeg

ファイアウォールの有効化

sudo ufw enable

日本語環境

sudo apt install fcitx-mozc

リモートデスクトップ(RDP)

  • とりあえず面倒な設定をしなくても、WindowsやRemminaで繋げることができた。
  • あ、でもポートは空けないとダメでした。
  • それと、なぜかRDPするとシェルでpipenvにパスが通っていなかった。
    • ポート番号はデフォルト値を記載
sudo apt install xrdp
sudo ufw allow 3389

VPNサーバー(サーバー側)

ja.softether.org

ダウンロード

解凍

tar xzvf softether-vpnserver-********.tar.gz

実行可能ファイルの生成

sudo make

VPN Server の配置

  • /usr/local/以下にvpnserverフォルダを移動する。
    • 以下、この場所にある前提での記載なので留意

vpncmd の check コマンドによる動作チェック

systemdへの登録

  • ドキュメントでは、「vpncmd の check コマンドによる動作チェック」の次は「スタートアップスクリプトの登録」となっているが、systemdに登録したいので以下のようにする。
  • サービス設定ファイルの作成
    • /etc/systemd/system/vpnserver.service
[Unit]
Description=SoftEther VPN Server
After=network.target

[Service]
Type=forking
User=root
ExecStart=/usr/local/vpnserver/vpnserver start
ExecStop=/usr/local/vpnserver/vpnserver stop
Restart=on-failure
RestartSec=3s

[Install]
WantedBy=multi-user.target
  • サービス登録
sudo systemctl enable vpnserver
sudo systemctl start vpnserver

各種設定

  • VPNサーバーの管理画面に入る
    • 1~3の選択肢では1を選ぶ
cd /usr/local/vpnserver
sudo ./vpncmd
サーバー管理者パスワードの設定
    • 全部小文字でもOK(以下、本節で同様)
ServerPasswordSet
HUBを選択
    • 新しく作ることもできるがDEFAULTでいいと思う。
Hub DEFAULT
グループ作成
    • グループ名は何でもよい。自分はdefaultにした。
GroupCreate
ユーザー作成
    • クライアント(ノートPCやiPhoneAndroid)でVPN設定する際に使う
UserCreate
    • パスワードを設定しておく
UserPasswordSet
IPsec / L2TP での通信を有効化
    • 下記を参考に入力
    • 事前共有キーは、vpnとかがよく紹介されていますけどどうなんですかね...
VPN Server/DEFAULT>IPsecEnable
IPsecEnable command - Enable or Disable IPsec VPN Server Function
Enable L2TP over IPsec Server Function (yes / no): yes

Enable Raw L2TP Server Function (yes / no): no

Enable EtherIP / L2TPv3 over IPsec Server Function (yes / no): no

Pre Shared Key for IPsec (Recommended: 9 letters at maximum): ********

Default Virtual HUB in a case of omitting the HUB on the Username: DEFAULT

The command completed successfully.
SecureNat を有効化
    • 仮想DHCPとNATみたいのが有効になるらしい(極めて雑な理解)
SecureNatEnable

ポート開放

sudo ufw allow 500/udp
sudo ufw allow 4500/udp

ポートフォワーディング(ポート変換)

  • ルーター管理画面で設定
  • ポート500と4500に入ってきたものを対象のマシンのローカルIPの500と4500に流す設定をする。
    • UDPだけでOK

DDNSの取得 ※1回だけでOK

0-59 * * * * wget -O DDNSNow_update.log "https://f5.si/update.php?domain=<ユーザー名>&password=<パスワード名>"

クライアント側の設定

  • iPhoneの例
    • General - VPN & Device Management
      • Type: L2TP
      • Server:
      • Account:<ユーザー名>@DEFAULT
      • RSA SecurID:なし
      • Password:
      • Secret:<事前共有キー>

ネットワークストレージ

自動マウント

  • LIVAは本体eMMCが32GBしかないので、USB HDDをつなげている。
  • サーバーとしては自動マウントしてほしいので以下の手順で
    • UUIDの確認
      • sda2かもしれないので、適宜
sudo blkid /dev/sda1
    • fstabに書き込み
      • ルートディレクトリにマウントする行を消してしまって全てやり直す羽目になったので注意して編集
sudo vi /etc/fstab
UUID=<確認したUUID> /mnt/abcdef<マウントポイント>  ext4    defaults   0 1

ssh/sftp

  • Lubuntu⇔Ubuntu間の共有用
    • Linux間は基本これでいけるのかな
sudo apt install openssh-server

smb

  • Lubuntu⇔Windows, Chromebook間の共有用
  • Sambaを使用するが、設定が複雑なので、WebminでGUI(ブラウザアプリ)から設定
smb用のユーザー作成
  • ユーザー名もパスワードもLubuntuと同じで作成した。
sudo pdbedit -a (ユーザー名)
Webmin
  • ダウンロードおよびインストール
echo "deb http://download.webmin.com/download/repository sarge contrib" | sudo tee /etc/apt/sources.list.d/webmin.list
wget http://www.webmin.com/jcameron-key.asc -O - | sudo apt-key add -
sudo apt update -y && sudo apt upgrade -y && sudo apt install -y webmin
  • 共有の作成
    • サーバー - Sambaファイル共有
    • マウントポイントは先ほどfstabに記載したもの
  • アクセス権限の編集
    • 書き込み可能:見るだけならNoでもいいのかもしれない。
    • ゲスト:基本は認証ありにしています。
  • Sambaサービスの再起動
ポート開放
sudo ufw allow 137:138/udp
sudo ufw allow 139/tcp
sudo ufw allow 445/tcp     # WindowsやiPhoneからアクセスするなら
クライアント側

AWS LambdaのLayer

Layerとして、Pythonパッケージを用意する場合のメモ

環境

Ubuntu 20.04 LTS

手順

  • Layerに用意したいパッケージ群をpipでフォルダを指定してインストールします。(ただ、所定のフォルダにインストールしていないので、このままpythonを起動しても使えるわけではないし、既存のパッケージを上書きもしない)
pip install -t <格納するパス> <パッケージ名1> <パッケージ名2> ...
  • 下記のフォルダ構成を作ります。(beautifulsoupの場合)
python/
    |- beautifulsoup4-4.10.0.dist-info/
    |- bs4/
    |- soupsieve/
    |- soupsieve-2.3.1.dist-info/
  • 上記のフォルダ構成のままzip化します。
  • Layerとしてアップロードします。

ffmpegは?

因みに、ffmpegはそこら中に記事が転がっているので割愛します。(例えば↓)
dev.classmethod.jp

ChromeRemoteDesktopを入れたらリアル端末の方からログインできなくなった。

現象

自宅のデスクトップPCにChromeRemoteDesktopをインストールして、iPhoneアプリのChromeRemoteDesktopを使ってリモートアクセスして以降、デスクトップPCでログインしても操作が一切効かない。
ただ、ログインがはじかれるというより、ログインはできているっぽい(私のはUbuntu 20.04なので、いつもの紫色のデスクトップ背景が見えている)が、操作が全くできない。

環境

  • リモート先(デスクトップPC):Ubuntu 20.04
    • Google Chrome:Version 98.0.4758.102 (Official Build) (64-bit)
    • ChromeRemoteDesktop(sudo apt installしたパッケージ):96.0.4664.9
  • リモート元:iPhone (ChromeRemoteDesktopアプリ)

気づき

iPhoneのChromeRemoteDesktopアプリ(以下、「リモート(側)」)でログインし、同時にデスクトップPC(以下、「リアル(側)」)でもログイン(ただし、前述の通り操作は効かない)した状態で、リモート側でTerminal(Ctrl + Alt + t)を立ち上げてもTerminalが出てこないなと思ったら、なんとリアル端末側でTerminalが出てきたので、リモート側とリアル側でセッションが同一になってしまっているんだな、ということは直感的に感じたものの、リモート側を切断してもリモート側の画面がリアル側に戻ってきてくれない(自分でも何を書いているのかよくわからないが、知識が貧弱すぎてこれしか書きようがないです)ので、どうするんだこれ、という感じ。

検索ワードも見当がつかないまま、手当たりしだいにググっているうちに、下記の公式ヘルプに辿り着いた。(この中の、「ステップ3(省略可):仮想デスクトップ セッションをカスタマイズする」)
support.google.com

解決策

上記の公式ヘルプの中で、ホームディレクトリに.chrome-remote-desktop-sessionを作れ、という下りがあるが、llした(リモートとリアルで同時にログインしてTerminalを立ち上げるとリアル側でTerminalが操作できる。キーボードもリアル側で叩く。)ところ、既に.chrome-remote-desktop-sessionは存在して、記載内容は下記の通りだった。

exec /etc/X11/Xsession 'env GNOME_SHELL_SESSION_MODE=ubuntu /usr/bin/gnome-session --systemd --session=ubuntu'

なお、作成日時はChromeRemoteDesktopをインストールした時刻あたりだったので、インストールの際に作成されたのだろう。

公式ヘルプには

ヒント: デスクトップ環境によっては、一度に複数のセッションを実行できない場合があります。この場合は、Chrome リモート デスクトップのセッションとローカル セッションで別のデスクトップ環境を使用するか、セッション選択ツールを使用することをおすすめします。

ともある。この.chrome-remote-desktop-sessionがあるせいでリモート側とリアル側のセッションが一体化してしまったのではないかと、適当かつ素人的なことを考え、消した(実際には_bakを付けてリネーム)ところリアル側でのログインが正常化した。
また、リモート側で改めてアクセスすると、下のスクリーンショットのように、セッション選択画面が表示されるようになった。(ちなみに、(default)ではなくUbuntuを選ばなければいけない)

ChromeRemoteDesktopのセッション選択画面

注意事項(自分のための備忘録)

公式ヘルプのヒントにもあるとおり、リモート側とリアル側で同時にログインすると、セッションが一体化してしまうため、リモートとリアルを切り替える場合はきちんとログアウトする。
※恐らく、きちんと設定すれば、リモートとリアルでセッションを分けられるのだろうと思いつつ、必要性を感じていないため、現時点では先送り。

その後(ubuntu / lubuntu 22.04)

Lubuntu 22.04で同じくChrome Remote Desktopを入れたところ、そもそもからして「リモートアクセスの設定 不明なエラーが発生しました。」というエラーが出て、インストールができない。
この記事(Google Chromeリモートデスクトップの設定)を参考に、スクリプトを走らせてなんとかインストールはできたものの、やはり以前と同じ現象が発生。
同じように、.chrome-remote-desktop-sessionを消したところ、リアル端末からのログインを完全に受け付けなくなってしまった(ログインしても何かはじかれてログイン画面に戻ってしまう)。

自分の中の勝手な結論として、少なくともUbuntuディストリビューションにはChrome Remote Desktopは向いていない。
Chrome Remote Desktopというのは、WindowsのHome版を使っていて、RDPが使えない場合の手段であって、リモート手段が豊富にあるLinuxでわざわざ使うことはなかろうと思うことにした。

結局、ChromebookからLubuntuへのデスクトップ環境への接続には、VNCを用いています。
下記の記事を参考にしました。ただ、「セキュアな接続」あたりは、真面目にやりませんでしたが。
www.digitalocean.com

クラウドの怖い話と権限管理

最近GIGAZINEでこんな記事を読みました。
gigazine.net

自分は個人利用だし、使っているサービスも非公開ばかりですので高を括っていたところはあるのですが、真剣に怖くなりましたね。
そして今更ながらググってまずはAWSの権限とかアラートとかを少しきちんとしてみました。

  • 主にやったこと
    • ルートユーザの2段階認証
    • IAMユーザの2段階認証
    • Cloud Trail
    • 管理者権限があるユーザがログインしたときのslack/メール通知
    • 予算アラート

※それにあたっては大いにこの記事を参考にさせてもらいました!
dev.classmethod.jp


これでAWSは一安心、GCPGoogle Cloud Platform)もやろうと思ったのですが個人の場合、GCPの権限管理は非常にやりづらい。
それは言うまでもなく、GoogleにログインしているアカウントがGCPのオーナーにもなっているためです。言い換えると、GCPに入るためにGoogleにログインすると、自動的にrootになってしまっている感じですね。

一番怖いのがマイニングのためにVMインスタンスをバンバン立てられることなので、インスタンス作成時にslack通知が来るようにCloud functionsを作るだけはしておきましたが...
GCPをやっている人がGoogleアカウント乗っ取られると冒頭の記事みたいなこともあっさり起こるよねって思うと、Googleアカウント周りのセキュリティはかなり高めにキープしておかないと危険だなと感じた話でした。

※じゃあGCP使わずにAWS一本でいけばいいというアドバイスもあると思うのですが、GCPには「e2-micro VMインスタンス1個無料(ただしリージョン限定)」があって、これは本当に魅力的というかGoogle様様という無料枠で、このためにGCP始めたと言っても過言ではない。笑

rename tips(連番etc)

準備

renameをインストールしていなければ導入

sudo apt install rename

使い方

基本的な使い方は

rename 置換する文字列 置換後の文字列 ファイル名1 ファイル名2 ...

ですが、これだと、拡張子を変更しようとすると怒られるし、使い勝手がよくない。

vim正規表現を使って

rename 's/置換する文字列/置換後の文字列' ファイル名(ワイルドカードOK)

または

rename 's/置換する正規表現/置換後の文字列(該当する文字列を$1として処理)/e' ファイル名(ワイルドカードOK)

とするほうが何かと便利ですね。

例1:拡張子の変更

rename 's/aaa/bbb' *.aaa

例2:連番のゼロ埋め(Zero padding)

file-1.txt, file-2.txt, …, file-999.txtfile-001.txt, file-002.txt, …, file-999.txtとするようなケース

rename 's/(\d+)/sprintf("%03d", $1)/e'' *.txt