Xubuntuのxfceログイン画面の背景を変更する

何かのショートカットキーを押してしまったのか、ログイン画面の背景が変わってしまったので変更方法をメモ

1. lightdm-gtk-greeterをインストール

$ sudo apt install lightdm-gtk-greeter

2. [設定] > [LightDM GTK+ Greeterの設定] を起動

背景の「画像」を選んで、[ユーザーが壁紙を設定している場合は使用する]のチェックを外して[保存]。
これでログイン画面の背景が元にもどった。

LigtDM GTK+ Greeter

参考サイト
How To Change Login Screen View On Xubuntu Desktop – Fosslicious

WordPressの管理画面にBASIC認証を追加

WordPressを引越したので、改めてBASIC認証を追加。

まずはWordpressディレクトリに移動して、.htaccessファイルに下記を追記。

<Files wp-login.php>
AuthType Basic
AuthUserFile /var/www/html/.htpasswd
AuthName "Restricted"
Require valid-user
</Files>

次いで、.htpasswdファイルを生成。最後のfoobarはユーザー名。

$ sudo htpasswd -c .htpasswd foobar

そしてapacheを再起動

$ sudo systemctl restart apache2

以降、ログインする時にBASIC認証が必要。

BASIC認証を追加

ロリポップからGCPに乗り換えた

今までロリポップでWordpress使ってたが、せっかくGCP使ってるのでGCE+CloudSQLで構築したWordpressに移行した。

まずはGCEでUbuntuを立てる。
マシンタイプは f1-microで様子見。

CloudSQLはMySQLで立てて、これまたマシンタイプはf1-micro。
で、ネットワークはExternal IP使わないで、プライベートIP接続のみにして、GCE Ubuntuからだけアクセス出来るようにした。

あとは通常通りUbuntuでWordpress構築。
参考にしたのはこのサイト。
How To Install WordPress with LAMP on Ubuntu 18.04 | DigitalOcean

Let’sEncryptのcertbotの設定をする時に、DNSのAレコードを一時的にGCEのインスタンスに向けておかないとエラーになるので夜中にこっそりDNS設定を変えてササっとやる。。
certbotの設定が終わったらまたAレコードを戻す。

つぎに、Wordpressの引越し。
引越しはプラグイン使わないで実施。
ロリポップからFTPSで全ファイルをダウンロード。
それからWordpressのツール > エクスポートで全コンテンツをエクスポート。

GCP側のWordpressでツール > インポートするが、エラーがでてインポートできないメディアあり。
仕方ないので、ロリポップからダウンロードしておいたwp-content/uploads/配下のファイルを全部手動アップロードして画像の404を回避。

ここでブログの各記事が404になってしまう問題発生。
パーマリンク設定を反映するための.htaccessが効いてない。
で、原因は上記のリンク先のサイトに書いてある「Enabling .htaccess Overrides」の設定をすっとばしてたのが原因。。ドキュメント読め。

<Directory /var/www/html/>
    AllowOverride All
</Directory>

最後にムームーDNSの設定で、kwonline.orgのMXレコードだけ残してあとのAレコードをUbuntuのExternal IPアドレスに変更して無事移設完了。

Ubuntu: タイムゾーンをJSTにする

GCPでUbuntu鯖立ち上げるとタイムゾーンがデフォルトでUTCなのでJSTに変える。

$ sudo timedatectl set-timezone Asia/Tokyo

Ubuntu: RDPクライアントをインストールする

会社のGCP Windows鯖に家のLinuxからRDP接続するのでメモ
remminaを入れる。

$ sudo apt install remmina

 

しかし、remminaの中でRDP接続したWindows鯖デスクトップ上で、Alt+Tabでウィンドウ切り替えようと思ったらLinux側のウインドウが切り替わってしまう。

対策は、Ctrlボタンも同時に押す。

つまり、Ctrl+Alt+Tabで、remminaウィンドウ内でのAlt+Tabになる。

GCE Ubuntuでvsftpdサーバーを構築

SFTPがあるのに今さらレガシーFTP。
たまにGCPでFTP鯖立ててと言われる事があるのでメモ

vsftpdを入れる

まずはGCEのUbuntu鯖にvsftpdをインストール

$ sudo apt install vsftpd

次に、/etc/vsftpd.confをsudo vimで編集して、↓のようにする。

listen=YES
listen_ipv6=NO
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
use_localtime=YES
xferlog_enable=YES
xferlog_std_format=YES
connect_from_port_20=NO
ascii_upload_enable=YES
ascii_download_enable=YES
ssl_enable=NO
utf8_filesystem=YES
pam_service_name=vsftpd
tcp_wrappers=NO
pasv_enable=YES
pasv_promiscuous=YES
pasv_address=***.***.***.*** #このVMの External IP address を書く
pasv_min_port=60101
pasv_max_port=60110
force_dot_files=YES
listen_port=60021

これで、TCP:60021番ポートで待ち受けて、TCP:60101-60110番ポートでパッシブモード通信するという最低限のFTP鯖になる。

vsftpdを再起動して、OS起動時にvsftpdも起動するようにする。

$ sudo systemctl restart vsftpd
$ sudo systemctl enable vsftpd

ftp用のユーザーを作る

useraddでユーザー追加して、passwd設定する

$ sudo useradd -m -d /home/hoge -s /bin/bash hoge
$ sudo passwd hoge

VPC Firewallの設定を変える

tcp:60021,60101-60110 のIngressを許可する。
Target tagで「ftp」を指定。
で、vsftpdをインストールしたVMのnetwork tagにも「ftp」を追加。

あとはFileZillaなりncftpなり好きなFTPクライアントを使って、パッシブモードでtcp:60021番ポートにFTP接続すればOK。

Ubuntu: ffmpegでmp4のカットと結合

デスクトップ動画をkazamで撮影したんだが、余計な部分をカットしたかったのでメモ

動画をカット。
0秒から30秒間と、45秒から15秒間を切り出す。

$ ffmpeg -ss 0 -i source.mp4 -t 30 -c copy part1.mp4
$ ffmpeg -ss 45 -i source.mp4 -t 15 -c copy part2.mp4

この2つの動画を結合したいので、list.txtにファイル名を記述

file /hoge/fuga/part1.mp4
file /hoge/fuga/part2.mp4

そして結合

$ ffmpeg -safe 0 -f concat -i list.txt -c copy output.mp4

Ubuntu: USBメモリをexFATでフォーマットする

Ubuntu/XubuntuでUSBメモリをexFATでフォーマットしたのでメモ

インストール

$ sudo apt install exfat-fuse
$ sudo apt install exfat-utils

/dev/sdb2をUSBというラベルをつけてexFATでフォーマット

$ sudo mkfs -t exfat -n USB /dev/sdb2

Google Spreadsheetの1枚目シートをBigQueryの外部テーブルにする

社内の同テンプレのスプレッドシートまとめるのこれでやると楽だったのでメモ。

#!/bin/bash

SCHEMA=date:DATE,id:STRING,description:STRING
URL=https://docs.google.com/spreadsheets/hoge/fuga
PRJ=myproject
DS=mydataset
TBL=mytable

bq mk --external_table_definition=${SCHEMA}@GOOGLE_SHEETS=${URL} ${PRJ}:${DS}.${TBL}

データセットは先に作っておかないと怒られる。
しかしこの方法はシート1枚目しか対応してない仕様。

複数シートも扱うならAppsScriptでBQのネイティブテーブル直接作るしかない。
外部テーブルじゃないけどさ。

function main() {
  var projectId = 'myproject';
  var datasetId = 'mydataset';

  var app = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = app.getActiveSheet();
  var tableId = sheet.getSheetName();
  
  var table = {
    tableReference: {
      projectId: projectId,
      datasetId: datasetId,
      tableId: tableId
    },
    schema: {
      fields: [
        {name: 'date', type: 'date'},
        {name: 'id', type: 'string'},
        {name: 'description', type: 'string'}
      ]
    }
  };
  try{
    BigQuery.Tables.remove(projectId, datasetId, tableId); 
  } catch(e) {}
  table = BigQuery.Tables.insert(table, projectId, datasetId);
  
  var range = sheet.getDataRange();
  var blob = Utilities.newBlob(convCsv(range)).setContentType('application/octet-stream');
  var job = {
    configuration: {
      load: {
        destinationTable: {
          projectId: projectId,
          datasetId: datasetId,
          tableId: tableId
        },
        skipLeadingRows: 1
      }
    }
  };
  job = BigQuery.Jobs.insert(job, projectId, blob);
}

function convCsv(range) {
  try {
    var data = range.getValues();
    var ret = "";
    if (data.length > 1) {
      var csv = "";
      for (var i = 0; i < data.length; i++) {
        for (var j = 0; j < data[i].length; j++) {
          if (data[i][j].toString().indexOf(",") != -1) {
            data[i][j] = "\"" + data[i][j] + "\"";
          }
        }
        if (i < data.length-1) {
          csv += data[i].join(",") + "\r\n";
        } else {
          csv += data[i];
        }
      }
      ret = csv;
    }
    return ret;
  }
  catch(e) {
    Logger.log(e);
  }
}

bashでバックグラウンドジョブの終了を待つ

時間の掛かるプロセスを同時に複数実行して、全てのジョブが終わったら最後に仕上げの処理をやりたかったのでメモ

pids=()

./hoge.sh &
pids+=($!)

./fuga.sh &
pids+=($!)

for pid in ${pids[@]}; do
    wait $pid
done

./foobar.sh

$!で直前のPIDを取得して配列化して、waitで待つ。