UbuntuでBitbucketからgit cloneできなくなったのはIPv6のせいらしい

一昨日の問題、解決した。どうも IPv6 で Bitbucket に接続しようとしていたかららしい。↓このページが役に立った。

cf. 突然Bitbucketにgitで接続できなくなったらIPv6関連を疑ってみるとよいかも 2016/07/20 – Qiita

IPv4 で接続するようにするには、下のような ~/.ssh/config ファイルを作ってやればいい。

Host bitbucket.org
HostName bitbucket.org
AddressFamily inet

これで bitbucket.org には IPv4 で接続するようになる。

takatoh@apostrophe $ git clone [email protected]:takatoh/grp.git
Cloning into 'grp'...
remote: Counting objects: 638, done.
remote: Compressing objects: 100% (392/392), done.
remote: Total 638 (delta 382), reused 343 (delta 229)
Receiving objects: 100% (638/638), 509.65 KiB | 658.00 KiB/s, done.
Resolving deltas: 100% (382/382), done.
Checking connectivity... done.

できた。

UbuntuでBitbucketからgit cloneできなくなった

今朝試したら、SSH での git clonegit pull ができなくなっていた。HTTPS では clone できる。git push は試してない。
また、Windows マシンでは SSH で問題なく clone できる。

SSH の鍵を変えたわけでも、他の設定を変えたわけでもない。確か先週は普通にできたはずだ。
GitHub では問題ない。

SSH の鍵を登録しなおしてもダメ。どうすりゃいいんだ?

症状はこんな感じ。Bitbucket。

takatoh@apostrophe $ git clone [email protected]:takatoh/grp.git
Cloning into 'grp'...
Connection to bitbucket.org closed by remote host.
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

Github は大丈夫。

takatoh@apostrophe $ git clone [email protected]:takatoh/jscale.git
Cloning into 'jscale'...
remote: Enumerating objects: 39, done.
remote: Counting objects: 100% (39/39), done.
remote: Compressing objects: 100% (15/15), done.
remote: Total 274 (delta 19), reused 36 (delta 19), pack-reused 235
Receiving objects: 100% (274/274), 34.27 KiB | 0 bytes/s, done.
Resolving deltas: 100% (115/115), done.
Checking connectivity... done.

NginxでCGIを動かす

Nginx では CGI は動かない。サポートしてないんだそうだ。まあ、いまどき CGI ってのも……という気はするけど、ちょっと古い CGI プログラムが必要になったのでやってみた。
参考にしたページはここ。

 cf. NginxでCGIを動かそうと頑張った話 – Qiita

これによると、fcgiwrap というのを使えば、CGI を FCGI にラップしてくれて、CGI プログラムを動かせるようだ。ラップするといってもインターフェイスの話で、中身はあくまで CGI なので FCGI なみに早く動作するわけではない。

とにかくやってみよう。
まずは fcgiwrap のインストール。apt でインストールできる。

takatoh@wplj $ sudo apt install fcgiwrap
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています                
状態情報を読み取っています... 完了
以下のパッケージが自動でインストールされましたが、もう必要とされていません:
  libllvm3.8 libllvm4.0 libllvm5.0 libmircommon5 libpango1.0-0 libpangox-1.0-0
  libqmi-glib1 libqpdf17 linux-headers-4.4.0-101
  linux-headers-4.4.0-101-generic linux-headers-4.4.0-103
  linux-headers-4.4.0-103-generic linux-headers-4.4.0-104
  linux-headers-4.4.0-104-generic linux-headers-4.4.0-109
  linux-headers-4.4.0-109-generic linux-headers-4.4.0-112
  linux-headers-4.4.0-112-generic linux-headers-4.4.0-116
  linux-headers-4.4.0-116-generic linux-headers-4.4.0-119
  linux-headers-4.4.0-119-generic linux-headers-4.4.0-121
  linux-headers-4.4.0-121-generic linux-headers-4.4.0-122
  linux-headers-4.4.0-122-generic linux-headers-4.4.0-124
  linux-headers-4.4.0-124-generic linux-headers-4.4.0-127
  linux-headers-4.4.0-127-generic linux-headers-4.4.0-128
  linux-headers-4.4.0-128-generic linux-headers-4.4.0-130
  linux-headers-4.4.0-130-generic linux-headers-4.4.0-131
  linux-headers-4.4.0-131-generic linux-headers-4.4.0-21
  linux-headers-4.4.0-21-generic linux-headers-4.4.0-64
  linux-headers-4.4.0-64-generic linux-headers-4.4.0-66
  linux-headers-4.4.0-66-generic linux-headers-4.4.0-67
  linux-headers-4.4.0-67-generic linux-headers-4.4.0-70
  linux-headers-4.4.0-70-generic linux-headers-4.4.0-71
  linux-headers-4.4.0-71-generic linux-headers-4.4.0-72
  linux-headers-4.4.0-72-generic linux-headers-4.4.0-75
  linux-headers-4.4.0-75-generic linux-headers-4.4.0-77
  linux-headers-4.4.0-77-generic linux-headers-4.4.0-78
  linux-headers-4.4.0-78-generic linux-headers-4.4.0-79
  linux-headers-4.4.0-79-generic linux-headers-4.4.0-81
  linux-headers-4.4.0-81-generic linux-headers-4.4.0-83
  linux-headers-4.4.0-83-generic linux-headers-4.4.0-87
  linux-headers-4.4.0-87-generic linux-headers-4.4.0-89
  linux-headers-4.4.0-89-generic linux-headers-4.4.0-91
  linux-headers-4.4.0-91-generic linux-headers-4.4.0-92
  linux-headers-4.4.0-92-generic linux-headers-4.4.0-93
  linux-headers-4.4.0-93-generic linux-headers-4.4.0-96
  linux-headers-4.4.0-96-generic linux-headers-4.4.0-97
  linux-headers-4.4.0-97-generic linux-headers-4.4.0-98
  linux-headers-4.4.0-98-generic linux-image-4.4.0-101-generic
  linux-image-4.4.0-103-generic linux-image-4.4.0-104-generic
  linux-image-4.4.0-109-generic linux-image-4.4.0-112-generic
  linux-image-4.4.0-116-generic linux-image-4.4.0-119-generic
  linux-image-4.4.0-121-generic linux-image-4.4.0-122-generic
  linux-image-4.4.0-124-generic linux-image-4.4.0-127-generic
  linux-image-4.4.0-128-generic linux-image-4.4.0-130-generic
  linux-image-4.4.0-131-generic linux-image-4.4.0-21-generic
  linux-image-4.4.0-64-generic linux-image-4.4.0-66-generic
  linux-image-4.4.0-67-generic linux-image-4.4.0-70-generic
  linux-image-4.4.0-71-generic linux-image-4.4.0-72-generic
  linux-image-4.4.0-75-generic linux-image-4.4.0-77-generic
  linux-image-4.4.0-78-generic linux-image-4.4.0-79-generic
  linux-image-4.4.0-81-generic linux-image-4.4.0-83-generic
  linux-image-4.4.0-87-generic linux-image-4.4.0-89-generic
  linux-image-4.4.0-91-generic linux-image-4.4.0-92-generic
  linux-image-4.4.0-93-generic linux-image-4.4.0-96-generic
  linux-image-4.4.0-97-generic linux-image-4.4.0-98-generic
  linux-image-extra-4.4.0-101-generic linux-image-extra-4.4.0-103-generic
  linux-image-extra-4.4.0-104-generic linux-image-extra-4.4.0-109-generic
  linux-image-extra-4.4.0-112-generic linux-image-extra-4.4.0-116-generic
  linux-image-extra-4.4.0-119-generic linux-image-extra-4.4.0-121-generic
  linux-image-extra-4.4.0-122-generic linux-image-extra-4.4.0-124-generic
  linux-image-extra-4.4.0-127-generic linux-image-extra-4.4.0-128-generic
  linux-image-extra-4.4.0-130-generic linux-image-extra-4.4.0-131-generic
  linux-image-extra-4.4.0-21-generic linux-image-extra-4.4.0-64-generic
  linux-image-extra-4.4.0-66-generic linux-image-extra-4.4.0-67-generic
  linux-image-extra-4.4.0-70-generic linux-image-extra-4.4.0-71-generic
  linux-image-extra-4.4.0-72-generic linux-image-extra-4.4.0-75-generic
  linux-image-extra-4.4.0-77-generic linux-image-extra-4.4.0-78-generic
  linux-image-extra-4.4.0-79-generic linux-image-extra-4.4.0-81-generic
  linux-image-extra-4.4.0-83-generic linux-image-extra-4.4.0-87-generic
  linux-image-extra-4.4.0-89-generic linux-image-extra-4.4.0-91-generic
  linux-image-extra-4.4.0-92-generic linux-image-extra-4.4.0-93-generic
  linux-image-extra-4.4.0-96-generic linux-image-extra-4.4.0-97-generic
  linux-image-extra-4.4.0-98-generic linux-signed-image-4.4.0-101-generic
  linux-signed-image-4.4.0-103-generic linux-signed-image-4.4.0-104-generic
  linux-signed-image-4.4.0-109-generic linux-signed-image-4.4.0-112-generic
  linux-signed-image-4.4.0-116-generic linux-signed-image-4.4.0-119-generic
  linux-signed-image-4.4.0-121-generic linux-signed-image-4.4.0-122-generic
  linux-signed-image-4.4.0-124-generic linux-signed-image-4.4.0-127-generic
  linux-signed-image-4.4.0-128-generic linux-signed-image-4.4.0-130-generic
  linux-signed-image-4.4.0-131-generic linux-signed-image-4.4.0-64-generic
  linux-signed-image-4.4.0-66-generic linux-signed-image-4.4.0-67-generic
  linux-signed-image-4.4.0-70-generic linux-signed-image-4.4.0-71-generic
  linux-signed-image-4.4.0-72-generic linux-signed-image-4.4.0-75-generic
  linux-signed-image-4.4.0-77-generic linux-signed-image-4.4.0-78-generic
  linux-signed-image-4.4.0-79-generic linux-signed-image-4.4.0-81-generic
  linux-signed-image-4.4.0-83-generic linux-signed-image-4.4.0-87-generic
  linux-signed-image-4.4.0-89-generic linux-signed-image-4.4.0-91-generic
  linux-signed-image-4.4.0-92-generic linux-signed-image-4.4.0-93-generic
  linux-signed-image-4.4.0-96-generic linux-signed-image-4.4.0-97-generic
  linux-signed-image-4.4.0-98-generic snap-confine ubuntu-core-launcher
これを削除するには 'sudo apt autoremove' を利用してください。
以下の追加パッケージがインストールされます:
  libfcgi0ldbl spawn-fcgi
以下のパッケージが新たにインストールされます:
  fcgiwrap libfcgi0ldbl spawn-fcgi
アップグレード: 0 個、新規インストール: 3 個、削除: 0 個、保留: 28 個。
193 kB のアーカイブを取得する必要があります。
この操作後に追加で 665 kB のディスク容量が消費されます。
続行しますか? [Y/n] Y
取得:1 http://jp.archive.ubuntu.com/ubuntu xenial/main amd64 libfcgi0ldbl amd64 2.4.0-8.3 [161 kB]
取得:2 http://jp.archive.ubuntu.com/ubuntu xenial/universe amd64 spawn-fcgi amd64 1.6.4-1 [14.5 kB]
取得:3 http://jp.archive.ubuntu.com/ubuntu xenial/universe amd64 fcgiwrap amd64 1.1.0-6 [17.5 kB]
193 kB を 0秒 で取得しました (1,165 kB/s)
以前に未選択のパッケージ libfcgi0ldbl を選択しています。
(データベースを読み込んでいます ... 現在 1351986 個のファイルとディレクトリがインストールされています。)
.../libfcgi0ldbl_2.4.0-8.3_amd64.deb を展開する準備をしています ...
libfcgi0ldbl (2.4.0-8.3) を展開しています...
以前に未選択のパッケージ spawn-fcgi を選択しています。
.../spawn-fcgi_1.6.4-1_amd64.deb を展開する準備をしています ...
spawn-fcgi (1.6.4-1) を展開しています...
以前に未選択のパッケージ fcgiwrap を選択しています。
.../fcgiwrap_1.1.0-6_amd64.deb を展開する準備をしています ...
fcgiwrap (1.1.0-6) を展開しています...
man-db (2.7.5-1) のトリガを処理しています ...
systemd (229-4ubuntu21.2) のトリガを処理しています ...
ureadahead (0.100.0-19) のトリガを処理しています ...
ureadahead will be reprofiled on next reboot
libfcgi0ldbl (2.4.0-8.3) を設定しています ...
spawn-fcgi (1.6.4-1) を設定しています ...
fcgiwrap (1.1.0-6) を設定しています ...
insserv: warning: script 'K01tonzlr' missing LSB tags and overrides
insserv: warning: script 'K01bruschetta' missing LSB tags and overrides
insserv: warning: script 'K01ellie' missing LSB tags and overrides
insserv: warning: script 'tonzlr' missing LSB tags and overrides
insserv: warning: script 'ellie' missing LSB tags and overrides
insserv: warning: script 'bruschetta' missing LSB tags and overrides
libc-bin (2.23-0ubuntu10) のトリガを処理しています ...
systemd (229-4ubuntu21.2) のトリガを処理しています ...
ureadahead (0.100.0-19) のトリガを処理しています ...

Nginx の設定。/etc/nginx/sites-available/default ファイルに以下を追記。

location ~ \.cgi$ {
    root /var/www/html;
    fastcgi_pass unix:/var/run/fcgiwrap.socket;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
}

これで .cgi 拡張子を持つファイルがすべて CGI プログラムとして認識されるはず。
/var/run/fcgiwrap.socket は fcgiwrap を apt でインストールすると自動的に作られている。

fcgiwrap の設定。/etc/init.d/fcgiwrap ファイルを編集する。

# FCGI_APP Variables
FCGI_CHILDREN="1"
FCGI_SOCKET="/var/run/$NAME.socket"
FCGI_USER="www-data"
FCGI_GROUP="www-data"
# Socket owner/group (will default to FCGI_USER/FCGI_GROUP if not defined)
FCGI_SOCKET_OWNER="www-data"
FCGI_SOCKET_GROUP="www-data"

デフォルトで上のようになっているのを下のように変えた。

# FCGI_APP Variables
FCGI_CHILDREN="1"
FCGI_SOCKET="/var/run/$NAME.socket"
FCGI_USER="www-data"
FCGI_GROUP="www-data"
# Socket owner/group (will default to FCGI_USER/FCGI_GROUP if not defined)
FCGI_SOCKET_OWNER="root"
FCGI_SOCKET_GROUP="root"

変えたのは FCGI_SOCKET_OWNER と FCGI_SOCKET_GROUP だ。

これで設定は終了のはず。fcgiwrap と Nginx を再起動しよう。

takatoh@wplj $ sudo systemctl restart fcgiwrap
takatoh@wplj $ sudo systemctl restart nginx

最後にテスト。/var/www/html ディレクトリにつぎのような hello.cgi ファイルを作って実行権限をつけた。

#!/usr/bin/ruby

print "Content-Type: text/html\n\n"
print ""
print ""
print ""
print "Hello CGI world!"
print ""
print ""

ブラウザでアクセスしてみると、ちゃんと Hello CGI world! と表示されたので OK。

Surface Goが届いたのでセットアップ

もうおとといの話になるけど、注文してあった Surface Go が届いたのでセットアップをした。
セットアップといっても Windows のそれは、画面の案内に沿ってやっていくだけなのでサクッと終了。どういうわけかホスト名を指定するところがなかったので、スタートメニューから[設定]→[システム]→[バージョン情報]と辿って、「このPCの名前を変更」ボタンを押して変更した。名前は flambay にした。

Surface Go の Windows は Sモードといって、Microsoft Store のアプリしか使えないようになている(その代わり安全でパフォーマンスも悪くならないらしい)ので、これを解除して普通の Windwos 10 Home にする。このページから Microsoft Store を開くとSモードを解除するページに飛んだので(今試したら出てこなかったけど)、「インストール」を押して解除。なんだかすぐに終わったので大丈夫か?と思ったけど、大丈夫らしい。後に書くどちゃんと Microsoft Store 以外のアプリもインストールできるようになったのでOKのようだ。
アプリのインストールには Chocolatey という、Windows 用のパッケージマネージャーを使った。

 cf. Chocolatey

要するに Ubuntu の apt や Mac の homebrew みたいなもの。インストールするには、PowerShell を管理者モードで開いて、インストールページにあるコマンドをコピペして実行する。インストール出来たら、いろんなアプリをコマンドだけでインストールできるようになる。とりあえずは次のアプリをインストールした。

  • Chocolatey GUI
  • Ruby
  • Go
  • GIt
  • Google Chrome
  • Sublime Text3
  • Dropbox
  • 秀丸エディタ

Gauche はパッケージがなかったので公式サイトから msi インストーラをダウンロードして普通にインストールした。
あと、Python をインストールしたいんだけど、今回は Jupyter notebook も使ってみたいので、どうしようか考えている。

とりあえずこんなところでいったん終了。

HTMLとJavaScriptで画像をリサイズ

HTML + JavaScript ツール第3弾。
HTML5 の canvas 要素で画像のリサイズができるというので、やってみた。

 cf. 画像のリサイズ

Size を指定しておいて、リサイズしたい画像を選ぶとリサイズされた画像が画面に並ぶようになっている。画像をクリックすればダウンロードもできる。

参考にしたページはいくつかあるけど、↓ここを挙げておこう。

 cf. クライアント側でcanvasを使って画像をリサイズする – Qiita

以下、ソース。

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title>Resize image</title>
    <script type="text/javascript">
      function resizeImage(base64image, callback) {
        const MAX_SIZE = Number(document.getElementById("size").value);
        let canvas = document.createElement("canvas");
        let ctx = canvas.getContext("2d");
        let image = new Image();
        image.crossOrigin = "Anonymous";
        image.onload = function(evt) {
          let dstWidth, dstHeight;
          if (this.width > this.height) {
            dstWidth = MAX_SIZE;
            dstHeight = this.height * MAX_SIZE / this.width;
          } else {
            dstHeight = MAX_SIZE;
            dstWidth = this.width * MAX_SIZE / this.height;
          }
          canvas.width = dstWidth;
          canvas.height = dstHeight;
          ctx.drawImage(this, 0, 0, this.width, this.height, 0, 0, dstWidth, dstHeight);
          callback(canvas.toDataURL("image/png"));
        };
        image.src = base64image;
      }

      function buildFilename(origname) {
        let re = /(.*)(?:\.([^.]+$))/;
        let basename = origname.match(re)[1];
        return "resized_" + basename + ".png";
      }

      function handleFileSelect(evt) {
        let files = evt.target.files;
        for (let i = 0, f; f = files[i]; i++) {
          let reader = new FileReader();
          reader.onload = (function(theFile) {
            return function(e) {
            resizeImage(e.target.result, function(imgUrl) {
              let dest = document.getElementById("list");
              let fig = document.createElement("figure");
              fig.style = "float: left;";
              let a = document.createElement("a");
              a.href = imgUrl;
              a.download = buildFilename(theFile.name);
              let image = document.createElement("img");
              image.src = imgUrl;
              let caption = document.createElement("figcaption")
              caption.innerHTML = theFile.name + " resized.";
              a.appendChild(image);
              fig.appendChild(a);
              fig.appendChild(caption);
              dest.appendChild(fig);
            });
          }})(f);
          reader.readAsDataURL(f);
        }
      }
 
      document.addEventListener("DOMContentLoaded", function() {
      document.getElementById("files").addEventListener("change", handleFileSelect, false);
      }, false);
    </script>
  </head>
  <body>
    <h1>Resize image</h1>
    <p>下のSizeで指定したサイズの正方形におさまるようにリサイズします。</p>
    <p>画像をクリックすればダウンロードできます。</p>
    Size: <input id="size" type="text" value="400"> pixel<br />
    <input id="files" multiple="multiple" name="files[]" type="file"><br />
    <div id="list"></div>
  </body>
</html>

HTMLとJavaScriptでMD5ハッシュ値の計算

先週、華氏度と摂氏度の換算をする WEB ページを作ってみて、HTML と JavaScript だけでページを作れば、サーバなしで簡単なツールを作れることが分かった。
そこで、いくつか同じように WEB ページで動くツールを作ってみている。今日は、ローカルファイルの MD5 ハッシュ値を計算するツール(ページ)を紹介しよう。

 cf. MD5ハッシュ値の計算

ページを作るにあたっては、次のページとそこからリンクされているページを参考にした。

 cf. ローカルバイナリファイルからMD5ハッシュ値を計算する

特にローカルファイルの扱い方が参考になった。また、MD5 ハッシュ値の計算は、次のページで公開されている JavaScript のライブラリをそのまま使わせてもらった。

 cf. 高度な JavaScript 技集

最後に HTML のソースを載せておく。

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title>MD5 calculator</title>
    <script type="text/javascript" src="js/md5.js"></script>
    <script type="text/javascript">
      const handleFileSelect = (evt) => {
        const files = evt.target.files;
        const output = document.getElementById("list");
        output.innerHTML = "<ul>";
        for (let i = 0, f; f = files[i]; i++) {
          const reader = new FileReader();
          reader.onload = ((theFile) => {
            return (e) => {
              const hexdigest = MD5_hexhash(e.target.result);
              output.innerHTML += "<li>" + hexdigest + "  " + theFile.name + "</li>";
            }
          })(f);
          reader.readAsBinaryString(f);
        }
        output.innerHTML += "</ul>"
      }
      document.addEventListener("DOMContentLoaded", () => {
        document.getElementById("files").addEventListener("change", handleFileSelect, false);
      }, false);
    </script>
  </head>
  <body>
    <h1>MD5 calculator</h1>
    <input type="file" id="files" name="files[]" multiple /><br />
    <output id="list"></output>
  </body>
</html>

華氏度と摂氏度の換算

「Fahrenheit 451」のTシャツを買ったんだ。ブラッドベリの「華氏451度」。白。カッコイイ。

で、華氏451度って、摂氏でいうと何度なの?という当然の疑問が。まあ、ググればすぐにわかるんだけど、せっかくなのでそれで終わりにするんじゃなくて、華氏と摂氏の換算をするページを HTML と JavaScript で書いてみた。

 cf. 華氏度↔摂氏度の換算

ソースも載せておく。

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title>Fahrenheit / Celsius converter</title>
    <script type="text/javascript">
      const convert = () => {
        const deg = document.getElementById("degree").value;
        const dest = document.getElementById("answer");
        const elements = document.getElementsByName("temperature");
        let a;
        for (let i = 0; i < elements.length; i++) {
          if (elements[i].checked) {
            a = elements[i].value;
            break;
          }
        }
        if (a === "fahrenheit") {
          dest.innerHTML = f2c(Number(deg));
        } else {
          dest.innerHTML = c2f(Number(deg));
        }
        
      }

      const f2c = (deg) => {
        return (deg - 32) * 5 / 9;
      }

      const c2f = (deg) => {
        return deg * 9 / 5 + 32;
      }

      const clearVals = () => {
        document.getElementById("degree").value = "";
        document.getElementById("answer").innerHTML = "";
      }

      document.addEventListener("DOMContentLoaded", () => {
        document.getElementById("convertButton").addEventListener("click", convert, false);
        document.getElementById("clearButton").addEventListener("click", clearVals, false);
      }, false);
    </script>
  </head>
  <body>
    <h1>Fahrenheit / Celsius converter</h1>
    <input type="radio" name="temperature" value="fahrenheit" checked />
      Fahrenheit into Celsius<br />
    <input type="radio" name="temperature" value="celsius" />
      Celsius into Fahrenheit<br />
    <input type="text" id="degree" />
    <button type="button" id="convertButton">convert</button><br />
    <output id="answer"></output><br />
    <button type="button" id="clearButton">clear</button>
  </body>
</html>

で、結局、華氏451度が摂氏何度なのかというと、四捨五入して約233度。

さくらVPSのRailsアプリをバージョンアップ

さくらの VPS で動かしている Rails アプリをバージョンアップした、その記録。
今回のバージョンアップでは、Rails のバージョンアップしないけど、データベースの変更をするので若干緊張しながらやった。

まずは、アプリを停止する。
で、万が一のためにデータベースのバックアップ。

[takatoh@tk2-254-36564 ~]$ mysqldump -u lathercraft -p lathercraft_production > lcp-20180502.sql

次に、アプリのディレクトリに移動して git fetchgit merge origin/master

[takatoh@tk2-254-36564 ~]$ cd /var/www/lathercraft
[takatoh@tk2-254-36564 lathercraft]$ sudo git fetch
Password: 
remote: Counting objects: 126, done.
remote: Compressing objects: 100% (126/126), done.
remote: Total 126 (delta 95), reused 0 (delta 0)
Receiving objects: 100% (126/126), 11.91 KiB | 6 KiB/s, done.
Resolving deltas: 100% (95/95), completed with 21 local objects.
From https://bitbucket.org/takatoh/lathercraft
   14f1281..7aecdc3  master     -> origin/master
 * [new branch]      support-release-datetime -> origin/support-release-datetime
 * [new tag]         v2.0.1     -> v2.0.1
From https://bitbucket.org/takatoh/lathercraft
 * [new tag]         v2.0.0     -> v2.0.0
[takatoh@tk2-254-36564 lathercraft]$ sudo git merge origin/master
Auto-merging .gitignore
Auto-merging db/schema.rb
CONFLICT (content): Merge conflict in db/schema.rb
Automatic merge failed; fix conflicts and then commit the result.

あれ、db/schema.rb がコンフリクトした?なんでだ?
中身を見てみると、文字列のカラムに limit:255 がついている。このファイルはデータベースをマイグレートすれば更新されるはずなので、元に戻しておく。

[takatoh@tk2-254-36564 lathercraft]$ sudo vim db/schema.rb

修正が済んだら commit

[takatoh@tk2-254-36564 lathercraft]$ sudo git add db/schema.rb
[takatoh@tk2-254-36564 lathercraft]$ sudo git commit -m "merge branch origin/master."

さて、いよいよデータベースのマイグレーション。

[takatoh@tk2-254-36564 lathercraft]$ sudo -s
[root@tk2-254-36564 lathercraft]# export SECRET_KEY_BASE=bundle exec rake secret
[root@tk2-254-36564 lathercraft]# bundle exec rake db:migrate RAILS_ENV=production
DEPRECATION WARNING: The configuration option `config.serve_static_assets` has been renamed to `config.serve_static_files` to clarify its role (it merely enables serving everything in the `public` folder and is unrelated to the asset pipeline). The `serve_static_assets` alias will be removed in Rails 5.0. Please migrate your configuration files accordingly. (called from block in  at /var/www/lathercraft/config/environments/production.rb:23)
== 20180430070208 AddReleaseDatetimeToItems: migrating ========================
-- add_column(:items, :release_datetime, :datetime)
   -> 1.5631s
== 20180430070208 AddReleaseDatetimeToItems: migrated (1.5635s) ===============

なんか警告が出てるけどまあいいや。次に進もう。

アプリを production 環境で立ち上げてみる。

[root@tk2-254-36564 lathercraft]# export SECRET_KEY_BASE=bundle exec rake secret
[root@tk2-254-36564 lathercraft]# bundle exec rake db:migrate RAILS_ENV=production

無事、立ち上がった。けど、あるページではエラーになってしまった。開発環境で修正して本番環境に反映すると、直った。多分これで大丈夫。

最後に本番用に立ち上げて完了。

[追記]

マイグレーションのところで出た警告だけど、ググってみたら config.serve_static_assets という設定項目が config.serve_static_files に名前変更されている、ということが分かった。なので、その通りに修正して完了。

ext4のUSB外付けHDDにラベルをつける

Linux の ext4 ファイルシステムのディスクにも NTFS のボリュームラベルのようにラベル(名前)をつけられることを知った。

 cf. Linuxでストレージのラベルを確認・変更する

メインマシンの envelopes に繋がってる外付け HDD は NTFS なので、もうひとつの Ubuntu マシンである wplj の外付け HDD で試してみる。

まずはデバイスの確認。

takatoh@wplj $ lsblk
NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda      8:0    0 465.8G  0 disk 
├─sda1   8:1    0   512M  0 part /boot/efi
├─sda2   8:2    0 461.4G  0 part /
└─sda3   8:3    0   3.9G  0 part [SWAP]
sdb      8:16   0   2.7T  0 disk 
└─sdb1   8:17   0   2.7T  0 part /media/opabinia
sdc      8:32   0   2.7T  0 disk 
└─sdc1   8:33   0   2.7T  0 part /media/aysheaia

sdb1 と sdc1 が USB の外付け HDD だ。df コマンドに -T オプションをつけるとファイルシステムの種類を表示してくれる。

takatoh@wplj $ df -T
Filesystem     Type      1K-blocks      Used  Available Use% Mounted on
udev           devtmpfs    1948676         0    1948676   0% /dev
tmpfs          tmpfs        393812     17240     376572   5% /run
/dev/sda2      ext4      476050488  17526428  434319056   4% /
tmpfs          tmpfs       1969056       216    1968840   1% /dev/shm
tmpfs          tmpfs          5120         4       5116   1% /run/lock
tmpfs          tmpfs       1969056         0    1969056   0% /sys/fs/cgroup
/dev/sdb1      ext4     2884152984 722813244 2014810080  27% /media/opabinia
/dev/sdc1      ext4     2884152984 981135372 1756487952  36% /media/aysheaia
/dev/sda1      vfat         523248      3496     519752   1% /boot/efi
tmpfs          tmpfs        393812        52     393760   1% /run/user/1000

ext4 ファイルシステムにラベルをつけるのは e2label コマンド。
e2label デバイス名で現在のラベルを表示し、e2label デバイス名 ラベルでラベルをつける(ないしは変更する)。

takatoh@wplj $ sudo e2label /dev/sdb1

ラベルがついていないので何も返ってこない。
じゃ、つけてみよう。

takatoh@wplj $ sudo e2label /dev/sdb1 OPABINIA
takatoh@wplj $ sudo e2label /dev/sdb1
OPABINIA

ついでに /dev/sdc1 にも。

takatoh@wplj $ sudo e2label /dev/sdc1 AYSHEAIA
takatoh@wplj $ sudo e2label /dev/sdc1
AYSHEAIA

無事、ラベルがついた。
ラベルは blkid コマンドでも確認できる。

takatoh@wplj $ sudo blkid
/dev/sda1: UUID="D17D-DA22" TYPE="vfat" PARTLABEL="EFI System Partition" PARTUUID="6fa2ce8f-fa84-4c97-8280-e58107f1f5f7"
/dev/sda2: UUID="55c35560-7f0d-42ea-895c-5522c3b0a757" TYPE="ext4" PARTUUID="2e419080-c527-4316-b546-f404b2974dc6"
/dev/sda3: UUID="fe038a20-aa4e-48d9-b98c-f8932b715370" TYPE="swap" PARTUUID="8383fce1-4445-419d-a75d-1e002ac985ef"
/dev/sdb1: LABEL="OPABINIA" UUID="cd8ae5c6-3931-4855-a60b-40f27b9bc518" TYPE="ext4" PARTUUID="76dd840a-3ce4-4092-9510-a127dd9f0297"
/dev/sdc1: LABEL="AYSHEAIA" UUID="4bd2ad4c-1acf-4468-847b-1dd0a0c474a2" TYPE="ext4" PARTUUID="33288db2-8046-449d-ae4f-03f23c3864b3"

MediaWikiでインターウィキの編集を出来るようにする

MediaWiki では、デフォルトでインターウィキ機能が使えるようになっているけど、接頭辞の追加とか編集とかはデータベースを直接操作する必要があるらしい。
そこでエクステンション(拡張機能)を有効にして、特別ページでインターウィキの編集を出来るようにする。

具体的には LocalSettings.php ファイルの末尾に次のように追記する。

require_once('extensions/Interwiki/Interwiki.php');
$wgGroupPermissions['*']['interwiki'] = false;
$wgGroupPermissions['sysop']['interwiki'] = true;

こうすることで、管理者でログインすると、特別ページに「インターウィキデータの閲覧と編集」というページができて、インターウィキの追加・編集・削除ができるようになる。