Integromat で Gmail の特定フォルダのメールを slack に投稿

Integromatというのは,IFTTTとかzapierみたいなwebサービスの連携サービス.
かなり細やかに設定できるというか,もはやプログラミングするような感じで構成しないと動かない.

Gmailをslackに投稿する時のハマりポイント

  1. 日本語の文字化け
  2. 長いとslackに拒否られる

対策

文字列変換してちょんぎる.

wordpress でクォートが全角になったりする問題

再々追記
wordpress 4.0 から, run_wptexturize フィルターが追加され,簡単に止められるようになった.
もはやプラグイン公開の価値があるかは知らないけど,いちおうアップデートしておいた.
また,機能に合わせて,プラグインの名前を変えた → Disable wptexturize

再追記
リンクのパスを間違えていた…すみません。以下、復旧済です。

追記
とりあえず作ったよ。
下記を解決するプラグインは、機能を殺す部分だけなら簡単に実装できたが、plugin の体裁にするのに手がかかった。公式にアップするのもまだちょっとかかりそう。
とりあえずすぐ解決したい人は、どうぞ → [Disable Auto Replacement]
解凍してできるディレクトリを、wp-content/plugins へ配置すれば OK。
これを使うと、クォーテーションもハイフネーションもアスキー文字のまま出力されるが、三連ピリオドを三点リーダーへ置換する機能も死ぬので、注意すること。

私は、プログラムのコードを本文中に書くことが多い。
しかし wordpress を使うと勝手に全角に置き換えられるのが不満で、回避策として " などを使うようにしていた。これは面倒くさい。
まだ文字実体参照の用意されている文字コードなどなら良いが、ハイフンみたく用意されてないと (正確には、ndash と mdash はあるが、これはハイフンではない)、不便で仕方がない。
(wordpress は二連ハイフンを mdash か何かに置き換えてくれる)

さっきも NOOK の記事を書こうとしていい加減に腹が立ってきたので、そういうのを抑制する plugin でもないか検索したら、原因が見付かった。
wordpressで”ダブルクォーテーションが全角になっちゃう” | IT勉強するコタツネコ
この人、置換行をコメントアウトしているので他の問題が出そうだなー、と思いつつそれはさておき、この記事にある

$curl = preg_replace($dynamic_characters, $dynamic_replacements, $curl);

というのが問題の行で、dynamic_replacements の中身を見れば簡単に分かるはず…

小足見てから昇龍余裕でした。
例えば、シングルクォートは ’ に置き換えちゃ、だめだろ JK
’引用符 - Wikipedia が詳しい。
どうダメかというと、' と比較するとこんな感じくらいダメ。
ダメさが伝わりやすいように、MS Pゴシックにフォントを変えてみる。
apos版 → He's a student.
8217版 → He’s a student.

もー! 半角文字を全角文字に置き換えるコーディングするやつは、コーディングやめちまえ!

といいたい。
でも本体に手を入れるとアップデートや鯖移行の度に面倒くさいので、plugin で何とかしたい。
この程度、どっかに転がってないかな。
PS Disable autoformatting ではダメだった。
これいじって、作るか…

以下、作っている間のテスト用文字列…
---He's a student.

StartSSLでSHA2署名の証明書

最近のChromeはSHA1署名の証明書に厳しいので,SHA2署名の証明書を発行しようとしたが,StartSSLでうまく認識できなくて困っていた.
この記事の通りにやってみたら,うまくSHA2の証明書として認識された.→ StartSSLで取得した証明書がsha1で認証されてしまう - Qiita
なんか,公式が証明書出してたので修正しました→StartCom • View topic - can I use a SHA256 Intermediate certificate
なんか,crtのダウンロード形式が変わったので修正しました

以下,nginxでsslを使う場合.
apacheで使う場合は,中間証明書をリンク先のものと差し替えるだけなんだけど,apache2.4以降の設定をほとんど真面目にやったことないので,詳しくは分かんない.

$ openssl genrsa -aes256 2048 > server.key
$ openssl req -new -sha256 -key server.key -out server.csr

StartSSLで証明書を発行したあと…
fqdn.zip 的なアーカイブをダウンロードできるようになるので,落として,解凍すると有名なhttpdサーバ毎に必要ファイルをまとめたzipが入っているので,必要なやつを更に解凍する.
なければ,OtherServer.crtにルート・中間認証局の証明書と,fqdn用に発行された証明書があるので,それを使う.

dovecotとかならパスフレーズを指定できるらしいけど,nginxはできんかった気がするので

$ openssl rsa -in server.key.org > server.key

普通のhtmlなどでsyntaxhighlighterを読み込んで使う時のメモ

不明なところは,SyntaxHighlighterを参考にすれば良い.

  • 解凍したディレクトリ内のscriptsディレクトリを./scriptsへ,stylesディレクトリを./cssへ展開したとする.
  • html-script: trueオプションを有効にするために,shBrushXml.shは常時読み込む.
    
    
    
    
    
    
  • オートローダの実行など.
    ここは,適宜,対応するjsファイルを追加する.
    diff,dos,json,lisp,python,texとかがあると便利かも.
    個人的にはhaskellなんかも.

    
    
  • スタイルの修正.
    --- ../syntaxhighlighter_3.0.83/styles/shCoreDefault.css        2010-07-02 12:59:00.000000000 +0900
    +++ shCoreDefault.css   2015-10-21 18:56:36.000000000 +0900
    @@ -58,6 +58,7 @@
       position: relative !important;
       overflow: auto !important;
       font-size: 1em !important;
    +  border: 1px solid #ddd !important; /* added */
     }
     .syntaxhighlighter.source {
       overflow: hidden !important;
    @@ -229,7 +230,7 @@
       background-color: white !important;
     }
     .syntaxhighlighter .line.alt1 {
    -  background-color: white !important;
    +  background-color: #e0e0e0 !important; /* added */
     }
     .syntaxhighlighter .line.alt2 {
       background-color: white !important;
    @@ -242,6 +243,7 @@
     }
     .syntaxhighlighter table caption {
       color: black !important;
    +  background-color: #e0e0e0 !important; /* added */
     }
     .syntaxhighlighter .gutter {
       color: #afafaf !important;
    

Redmine on Debian がアップデートでごちゃごちゃしたので整理

追記:
最近はrbenv+ruby-buildが流行りらしい.apt-getで入るけど,それで入れたら入れられるrubyは古いものしかなかった.

前提:サーバで動作している rubygems, ruby 系は全部消した上で,autoremove した状態.
それまで動いていた,redmine の環境はいじってない.

ruby
rvmでインストールする.
環境が整っていれば,webにあるように

root# curl -L https://get.rvm.io | bash -s stable

でいいんだけど,最初はうまくいかないので,インストール用のシェルスクリプトを落としてきて何度も実行することになる.

$ wget -L https://get.rvm.io
$ cat index.html | bash -s stable

そうしたら色々と足りないものを入れろと言われる.
RedmineをDebianに導入する - Qiita を見て入れたものは,これら.
make環境が入ってたので,少なめ.

root# apt-get install git
root# apt-get install libssl-dev
root# apt-get install libreadline-gplv2-dev
root# apt-get install libyaml-dev
root# apt-get install curl

んで,もういっかい,

$ cat index.html | bash -s stable

そしたら環境を読み込んでrubyを入れる.

$ source $HOME/.rvm/scripts/rvm
$ rvm install x.x.x # <- 入れたいバージョン

この辺りで,rootになってないことに気付いたけど,$HOME/.rvm 以下にインストールされてたので,いいやと思うことにする.

$ rvm list

として,インストールされたrubyが出てきたらOK.

mysql関連gems
これはスキップできなかった.

$ sudo apt-get install libmysqlclient-dev
$ gem install mysql2
bundler
$ gem install bundler --no-rdoc --no-ri

これでローカルに入るはず.

redmine用のgems
なんか gemset とか使って,環境を切り替えられるらしいんだけど,使わないことにする.

$ cd /path/to/redmine
$ bundle install --without development test postgresql sqlite3 rmagick

なぜか,sqlite3 はインストールされてしまう…

起動スクリプト
source コマンドでスクリプトを読み込めるbashにする.

#!/bin/bash
source /home/username/.rvm/scripts/rvm
cd /path/to/redmine
bundle exec unicorn_rails -D -E production -c config/unicorn.rb

nginx+fastcgi+pukiwiki

nginx で pukiwiki を起動する時、web 上のレシピによっては fastcgi_param の設定が適切にできず、アンカーの張るパスがファイルシステム上のフルパスになってしまう場合がある。
正:

fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;
fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;

誤:

fastcgi_param  SCRIPT_NAME        $document_root$fastcgi_script_name;
fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;

要は、phpinfo() の環境変数などが正しくセットされればいいわけで、正常な例とにらめっこしながら設定してみると良いのでは。

設定は、fastcgi_param で正しくやっておけば、nginx.conf だったり各サイトの server ディレクティブ内でだったりで設定しなくていいはず。

Greasemonkey で Google Track Link を削除

基本的にはGoogle Remove Junk Liteを入れれば良いが、私の環境では以下の2点の手を加えないと使えなかった。

  1. 実行ページに http://*.google.*/search*https://*.google.*/search*を加える.
  2. QUERY_STRING の順番が異なる場合も動作するように修正する.例えば,
    else if(a.href.match(/\/url\?.*&url=/)){
      var url = this.qs('url',a.href);
      a.href = decodeURIComponent(url.replace(/\+/g, '%20'));
    }
    

    を条件判定の最後に追加するなど.

特定ドメインでアクセスされた場合のみ、移転後ページへのリンクを張った移転メッセージを表示

前使っていたドメインから現在のドメインへリダイレクトをしていたが、どうにもアクセスが完全には途絶えていないらしい。
んで、リダイレクトしているホストやリファラから、古いドメインへリンクしているサイトを特定するために、また移転したよメッセージを表示するために、ワンクッションはさむことにした。←ほぼ検索エンジンか更新されていない掲示板等であることが判明したので,rewriteはやめた
なんとなくのイメージだけで作業開始したものの、実際に作業してみるとハマりポイントがいくつかあったため、メモに残す。

やったこと

  • 旧ドメイン配下の任意ページ(存在の有無によらず)へのアクセスがあった場合、移転メッセージを提示する。
  • 同居する他のドメイン名で80番ポートにアクセスが飛んだ時は、明らかに存在するはずのルートへのリクエストのみ403を返し、他のリクエストの場合は404を返す。
  • 移転メッセージには、http[s]://新ドメイン/元リクエストのパス?元リクエストのQUERY_STRING へのリンクを貼っておく。
  • アクセスログを mysql に残す。

ハマりポイント

任意ページへのアクセスの受け方
分かりにくいけど,これはもう使ってない方法.
任意ページへのアクセスを、上の処理を行なうスクリプトへ元のGET文字列も含めて飛ばすのは意外と難しい。
.htaccess を使って、Rewrite でリクエストを書き換えると簡単にできる。ただし REFERER はこの時点で死ぬので、REFERER を取りたい場合は他の手段を講じる必要がある。
具体的な記述は、例えば

RewriteEngine On
RewriteCond %{HTTP_HOST} ^(old\.domain\.com)(:80)?
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ http://redirect.domain.com/?$1 [QSA,R=301,L]

といった感じ。
QSA は QUERY_STRING を最後に付与する指示。

php での HTTP ヘッダの返し方
php で HTTP ヘッダを返して、特定のアクセスの場合に 404 とか 403 を返す方法はいくつかある。
詳しくは php 公式ページのリファレンスを見るとして、私の環境では次のコードがうまく動いた。
あらゆる出力 (HTML の DOCTYPE や XML 宣言を含む) より前に記述しないと意味がないことに注意。

header("HTTP",true,404);
header("Content-type: text/html; charset=iso-8859-1");
include('./404.php');

404.php は、httpd の 404 ドキュメントを模したファイルで、上の .htaccess を用いた場合は QUERY_STRING に アクセスパスがついてくるので、展開して使えば、それっぽく表示できる。
apache2 の場合、404 や 403 はブラウザの設定に依らず charset が iso-8859-1 で返っていたので、ヘッダに入れた。

今時のmysql

なんか php 公式のリファレンスに mysql は古いから mysqli を使え、と書かれていたので、使うことにしたが、ちょっと梃摺った。

$mysqli = new mysqli("DBHOST", "DBUSER", "DBPASS", "DBNAME");
$mysqli->query($query);

mysqli では、特段の理由がない限りはセッションの close をしないらしい。
$query は使いたい SQL をそのまま書いたもの。

いざ文書にしてみると、迫力のない tips だな。
他にも元アクセスのパターンによって何度か print デバッグしないといけないと思うけど、頑張れ!

管理者ユーザ名の変更

wordpress が、ハッキング集団によりクラックされているようなので、対策をちょこっとだけしてみる。
もともと、管理者ユーザの slug を変更することはしていたが、ユーザ名がデフォルトの「admin」だったので、変えた。
ユーザを新しく作る方法だとユーザIDが変更されてしまうため、sql で DB を直接編集することにした。

> update PREFIX_users set user_login = 'NEWUSERNAME' where ID = IDnumber;

ついでにパスワードも記号の混じったものに変更した。
wordpress でパスワードに使える記号の一覧が得られなかったので、これまた DB を直接編集して書き込むことにした。
私が使っている記号群は、認証は通った。

> update PREFIX_users set user_pass = MD5('NEWPASSWORD') where ID = IDnumber;

ID は簡単に bruteforce attack で割り出されてしまうので、凝ったことはしていない。

あとは、admin でログイン仕掛けて来た PC に zip 爆弾でも返したいところ。
まだやってないけど。

ufw の kern.log への出力を抑制する

/etc/rsyslog.d/20-ufw.conf で、 #&~ と書かれている行のコメントアウト「#」を消す。
rsyslog を再起動。
デフォルトのままで、/var/log/ufw.log にログは出ているので、そっちを見れば問題なし。