retrorocket.bizのSSL証明書を再発行しました。

SSLサーバ証明書再発行のお願い – さくらのサポート情報
retrorocket.bizも対象なので再発行しました。これから3年間分無料とはありがたいです…。期限ギリギリまで発行を粘ってちょっとでも証明書の有効期限を伸ばそうかと思いましたが、引き伸ばしてるうちに対応を忘れてしまいそうなのでやめました。
nginxの場合、ssl_certificateに中間証明書を設定しないとサーバから中間証明書が送付されないのですが、完っ全に失念してまして30分くらい本気で悩みました。次の移行時にまた忘れそうですね。

再発行に至った背景は以下の記事がとてもわかりやすいです。
Symantecが再びGoogleの信頼を失った件についてのメモ – Technically, technophobic.
個人的に「シマンテックの言い分が大変うんこである」以外の感想はないです。ブラウザベンダー側が拒否らないと改善されないのもひどい。でもお金払っちゃったから使います。

retrorocket.bizのSSL証明書をラピッドSSLに移行しました。
去年くらいにラピッドSSLに移行したものだと思っていたら2年前でビビりました。

とりあえずOCSP Responseが返ってくるかは確認しました。

$ openssl s_client -connect retrorocket.biz:443 -status -servername retrorocket.biz < /dev/null | head
depth=2 C = US, O = GeoTrust Inc., CN = GeoTrust Global CA
verify return:1
depth=1 C = US, O = GeoTrust Inc., CN = RapidSSL SHA256 CA
verify return:1
depth=0 CN = retrorocket.biz
verify return:1
CONNECTED(00000003)
OCSP response:
======================================
OCSP Response Data:
    OCSP Response Status: successful (0x0)
    Response Type: Basic OCSP Response
    Version: 1 (0x0)
    Responder Id: 04F2100E425F1B9605707A171B87FDED0C1A9B92
    Produced At: Jul 20 09:29:11 2017 GMT
    Responses:
DONE

問題ないですね。

Amazon Dash ButtonとIRKitとLINE Message APIでバルスダッシュボタンを作る。

プライムデーでダッシュボタンが1個100円だったので、IRKitとLINEBotと連携して部屋の家電の電源を全部消すバルスダッシュボタンを作ることにしました。

使用したもの

  • Raspberry Pi 3
  • 天然水ダッシュボタン

今回はLINE botでCallbackを使用しないため、ローカルホストに適当にhttpで通信できるWebサーバが立っていれば十分です。

準備

ボタンのセットアップと、ボタン押下を検出してくれるdasherのインストールは以下の記事の内容をそのまま実施しました。ありがたいです。
Amazon Dash ButtonをただのIoTボタンとして使う – Qiita

ダッシュボタンが押された時に動作するWebhookの立ち上げ

(私が最速で作れる方法なので)hypnotoadとMojolicious::Liteでセットアップしました。
ローカルホストのポート8093で立ち上げてダッシュボタンの押下を待ち受けます。
動作としては、IRKitに家電の消灯信号を送った後、LINEの特定グループトーク宛にdasherからPOSTされたJSONの内容を送信します。

ソースはこんな感じ。

#!/usr/bin/perl
use utf8;
use strict;
use warnings;

use LINE::Bot::API;
use LINE::Bot::API::Builder::SendMessage;
use LWP::UserAgent;
use Mojolicious::Lite;

### CONSTS
my $ua   = new LWP::UserAgent();
my $log = app->log;
my $CHANNEL_ACCCESS_TOKEN = "xxx"; # LINE developersから取得したtokenを指定
my $CHANNEL_SECRET="xxx";

# API認証情報
my $bot = LINE::Bot::API->new(
    channel_secret       => $CHANNEL_SECRET,
    channel_access_token => $CHANNEL_ACCCESS_TOKEN,
    );

app->config(
    hypnotoad => {
      listen => ['http://*:8093'],
      workers => 2,
    },
);

sub call_api(){
  my $url = shift;
  my $method = shift;
  my $headers = shift;
  my $content = shift;

  my $req = HTTP::Request->new($method, $url);
  while (my ($key, $value) = each(%$headers)){
    $req->header($key => $value);
  }
  $req->content($content);
  return $ua->request($req);
}

my $IRKIT = "http://192.168.xx.xxx/messages"; # IRKitのエンドポイント
my %IRKIT_H = ("X-Requested-With" => "curl");
sub call_irkit(){
  my $content = shift;
  return &call_api($IRKIT, "POST", \%IRKIT_H, $content);
}

post '/barusu' => sub {
  my $self = shift;
  my $messages = LINE::Bot::API::Builder::SendMessage->new;
  my $data = $self->req->json; # dasherから送られたJSON

  my $light_off = '{"format":"raw","freq":38,"data":[消灯用データ]}';
  my $aircon_off = '{"format":"raw","freq":38,"data":[消灯用データ]}';
  # 他の消したい家電
  &call_irkit($light_off);
  &call_irkit($aircon_off);
  # 以下略
  $messages->add_text( text => $data->{text} );
  $bot->push_message("Cxx投稿先のグループID", $messages->build);
  return $self->render(json => {'status' => "OK. BARUSU."});
} => 'barusu';

app->start;

投稿先のグループIDだけはwebhook-event-object以外の確認方法がわからなかったので、適当にhttpsで通信できるサーバを立てて取得しました。
自分だけに飛ばすなら、自分のUserIdをLINE developersから確認できるのでここまでめんどくさくないと思います。

dasherの設定をする

dasherの設定(config/config.json)は以下のような感じです。

{"buttons":[
  {
    "name" : "天然水バルスダッシュボタン",
    "address": "ダッシュボタンのMACアドレス",
    "url": "http://127.0.0.1:8093/barusu",
    "method": "POST",
    "json": true,
    "body": {"text":"バルス!"}
  }
]}

使ってみる

dasherのREADMEどおり起動させました。

コマンドラインはこんな感じ

ボタンを押したところ電気が消えてエアコンも消えてテレビも消えました。(画像クリックでGIFアニメが再生されます。)

ポチッとな。

LINEには通知が飛びました。

LINEのようす。

これ、サーバで処理できることはなんでもボタン一つでできますね。とりあえずバルスボタンは玄関に設置しました。あと、作ってからLINEはあんまり関係なかったなと思いました。
もう1個ポテチのダッシュボタンがあるので何か別のものを作りたいですね。夢が広がります。

Twitterで強制的にPNG32でアップロードするツールを作った。

Twitterに画像をPNGでアップロードするツール
作りました。左上1pxの透明度を1%だけ落として強制的にPNG32でアップロードします。

Lenna(元画像)

Lenna(アップロード後)

差分

RGBAだと1だけ下がってるように見えます。ソースは以下。
retrorocket/twimage: Twitterで画像を強制的にPNGでアップできるようにする
PerlMagick便利ですね。

画像の引用元は以下です。
Lenna – Wikipedia

TimeLine Copierで1000人近くリストに入れようとするとTwitter側から不審なアクティビティ扱いされる。

お問い合わせがあったのですが、たまたま今日早く帰ってくることになってたので調査しました。
事象としては、3000人近いフォロワーがいるユーザがTimeLine Copierでリストを作ると、1000人超えた当たりでアカウントがロックされるというものです。
とりあえずガチャピンのフォロワーでリストを作ったのですがなるほど1000人くらいになったところでtwitterを覗くと以下の画面に飛ばされました。

ロックされた

私としてはどうしようもないので、800人位登録したら一旦登録を打ち切って、しばらく経った後に既存リストに追加してもらう機能を使ってもらうしかないですね。アプリは修正します。

追記(2017/06/28)

一回アカウントロックされるとしばらくcreate_allエンドポイントが使用不能になるみたいですね。めちゃくちゃ不便だ…。テスト用のアカウントで試したら500人でアウトだったので大事をとって300人位にしておくことにしました。

【未解決】WPtouch Mobile Pluginが適用されたモバイルページでContact Form 7が動作しない。

未解決です。このサーバでしか起こらない問題かどうかすらもわかってません…。
Contact Form 7のv4.8とWPtouch Mobile Pluginのv4.3.18を導入している環境で、かつモバイルページからContact Form 7を使用して問い合わせを送信した場合、メールが送信されません。
WordPressのバージョンは4.8です。

最初nginxのキャッシュフラグの設定がおかしいかと思ったのですが、curlコマンドでPOSTした場合は正しく問い合わせが送信できるためWPtouchとの組み合わせが悪いと判断しました。(curlでUAをモバイル系にすると送信されないが、適当な文字列にすると送信できる)

php-fpmのログにもnginxのログにも何も出てないし、POSTを送信すると200OKしか返ってこないのでデバッグが面倒です。いま適用しているテーマはありがたいことにレスポンシブデザインなので、とりあえずWPtouchを無効にしました。

この現象がいつから起こっていたか把握できないため、過去スマホ・タブレット経由でcontactからお問い合わせを送信された方につきましては、お手数ですが再度送信をお願いいたします。すみません…。