(iOS) Facebook アプリ内ブラウザはこんなに仕様が違う

Facebook アプリ内ブラウザきらい! さっさと Safari で開け!

User Agent

通常は次の文字列。Twitter などほかのアプリでもこのような文字列になっている。

Mozilla/5.0 (iPhone; CPU iPhone OS 11_2_1 like Mac OS X) AppleWebKit/604.4.7 (KHTML, like Gecko) Version/11.0 Mobile/15C153 Safari/604.1

しかし Facebook のアプリ内でリンクを開くと次のように改変されている。

Mozilla/5.0 (iPhone; CPU iPhone OS 11_2_1 like Mac OS X) AppleWebKit/604.4.7 (KHTML, like Gecko) Mobile/15C153 [FBAN/FBIOS;FBAV/153.0.0.53.87;FBBV/84268146;FBDV/iPhone9,1;FBMD/iPhone;FBSN/iOS;FBSV/11.2.1;FBSS/2;FBCR/&#12489-&#12467-&#12514-;FBID/phone;FBLC/ja_JP;FBOP/5;FBRV/0]

(続きはまた来週)

macOS をアップデートしたときにしたこと(Sierra → High Sierra)

新年なのでめでたく macOS Sierra を High Sierra にアップデートした。そのときのメモ。

Dnsmasq の設定

まずは Web を快適に見るため、広告ブロックツールとして使っている Dnsmasq の設定を行う。

デーモンの plist などはそのまま残っているのでネットワークのプロキシ設定のみを行えばよい。

sudo networksetup -setdnsservers Wi-Fi 127.0.0.1

Apache の設定

macOS をアップデートすると同時に Apache が更新され httpd.conf がデフォルト状態になる。以前の設定は /etc/apache2/httpd.conf~previous として残っているので差分を更新する。

また High Sierra では PHP のバージョンが 7 になったので、モジュール名が php7_module になっていることに注意。

基本的にデフォルトの httpd.conf を使うようにし、モジュールのロードおよびローカル環境固有の項目をロードする。

LoadModule rewrite_module libexec/apache2/mod_rewrite.so
LoadModule php7_module libexec/apache2/libphp7.so

Include /etc/apache2/myconf/*.conf

apachectl configtest してから apachectl gracefulApache を再起動。

Adobe Creative Suite CS6 の設定

Adobe Creative Suite CS6 は正式には High Sierra に対応していないが、次の方法で使うことができる。詳細は元記事を参照。

  1. リカバリーモードでの起動 → Rootless の一時無効化
  2. ディレクトリの作成
    sudo mkdir -p /System/Library/Java/JavaVirtualMachines/1.6.0.jdk /System/Library/Java/Support/Deploy.bundle
  3. リカバリーモードでの起動 → Rootless の再有効化

macOS Sierra (10.12) で Photoshop CS6 / Illustrator CS6 を使う - TeX Alchemist Online

Atom Editor に xyzzy の filter-buffer 機能をつける

2018年1月10日追記:パッケージ化しました

Windows 用のテキストエディタ xyzzy にはバッファの内容を標準入力としてコマンドに渡し、その出力をバッファに書き込む filter-buffer というコマンドがある。

同じような機能を Atom でも探してみたが、どうやらまだ存在しないようだ。

そこで filter-text パッケージを作成した。

コマンド Settings View: Install Packages And Themes などでパッケージのインストール画面を開き、「Search packages」に「filter-text」と入力して Enter を押すと検索結果に表示されるはずだ。

Atom Editor で init.js を保存したら自動的に再読み込みする

テキストエディタ Atom では Emacs における init.el のように、~/.atom/init.js (init.coffee) にスクリプトを記述することによって自前のコマンドを定義できる。しかしながら Emcas のように load-file のようなコマンドが用意されていないため、書いたスクリプトを試すにはエディタの再起動が必要となる。

過去の方法

ここにファイルの保存を監視し require のキャッシュを消去する方法で実現する方法が紹介されている。

ところが2017年12月現在のバージョン 1.23.1 (x64) ではこの方法は使えなかった。 require のキャッシュを消去できないのである。2015年10月の情報だからだいぶシステムが変更されているのだろう。

別の方法

キャッシュを消去できないのであれば別のファイルを作ればいい。そう思い付き、次のような init.js を書いた。

var scriptId = 0;
var fnCache = {};

function reloadInitScript() {
	let srcFile = require.resolve("./siteinit"),
	destFile = srcFile.replace(/[.]js$/, "-cache/" + (scriptId + 1) + ".js");

	try {
		var fs = require("fs");
		let rs = fs.createReadStream(srcFile),
		ws = fs.createWriteStream(destFile);
		ws.on("close", () => {
			scriptId++;
			require("./siteinit-cache/" + scriptId).init();
		})
		rs.pipe(ws);
	} catch (error) {
		atom.notifications.addFatalError("Error on copying file to " + destFile);
	}
}

function defun(target, name, fn) {
	var fnKey = target + "\\" + name;
	if (!fnCache[fnKey]) {
		atom.commands.add(target, reffun(name, fnKey));
	}
	fnCache[fnKey] = fn;
}

function reffun(name, fnKey) {
	var cmd = {};
	cmd[name] = function() {
		fnCache[fnKey]();
	};
	return cmd;
}

Object.defineProperty(global, "user", {
	value: {
		defun: defun
	}
});

reloadInitScript();

atom.workspace.observeTextEditors(function(editor) {
	editor.onDidSave(function() {
		if (/[/\\][.]atom[/\\].+[.]js$/.test(editor.getPath())) {
			reloadInitScript();
		}
	});
});

このスクリプトの要点は次のようなところだ。

  • ユーザが編集するファイルは ~/.atom/siteinit.js とする
  • siteinit.js では user.defun() という函数でコマンドを定義する
  • fnCache というハッシュに函数の実体を保持しておき、 atom.commands.add() するのは実行時に fnCache に登録された関数を呼び出す函数
  • ファイルの保存を監視し、 ~/.atom/ 内の .js ファイルが更新されたら reloadInitScript() を呼び出す
  • reloadInitScript() が呼ばれるたびに scriptId を 1 ずつ増やしていき、 ~/.atom/siteinit-cache/(scriptId).js という連番のファイルを作る
  • ~/.atom/siteinit-cache/(scriptId).js を require し、その中の init() を呼び出す

そして siteinit.js は次のように使用する。

function init() {
	console.log("siteinit.js loaded.");

	user.defun("atom-text-editor", "user:insert-horizontal-bar", function() {
		let editor = atom.workspace.getActiveTextEditor();
		if (!editor) {
			return;
		}
		editor.insertText("----------------------------------------------------------------");
	});
}

exports.init = init;

init.js および siteinit.js を作成したら動作確認を行おう。

  1. Atom を再起動してから Ctrl+Shift+I でコンソールを開く
  2. siteinit.js の "siteinit.js loaded." というメッセージを書き換え、保存する

ここでコンソールに書き換えたメッセージが表示されれば設定は完了。快適な Atom ライフが待っている。

pg_dump を使って特定のテーブルのみをバックアップする

PostgreSQL で特定のテーブルをダンプするには次のコマンドを使用する。

pg_dump -U 接続ユーザ名 -t テーブル名 データベース名 > 出力.sql

テーブルの所有権に関する情報をダンプしない

pg_dump -U 接続ユーザ名 -t テーブル名 -O データベース名 > 出力.sql

データのみをダンプする

pg_dump -U 接続ユーザ名 -t テーブル名 -a データベース名 > 出力.sql

INSERT コマンドを出力する。PostgreSQL 以外のデータベースシステムにデータを移行する際に有用

pg_dump -U 接続ユーザ名 -t テーブル名 --column-inserts データベース名 > 出力.sql