やったこと

webサービスを作るときに考えたことを垂れ流します

AGデスクトップレコーダーが開始処理中となって動かない!

「AGデスクトップレコーダー」というデスクトップ画面をキャプチャできる便利なソフトがあります(このソフトです!)

AG-デスクトップレコーダー ダウンロードページ

このソフトはPCのキャプチャ動画をツイッターにアップロードするときにめちゃくちゃ役に立ちます。コーデック設定画面で「H.264/AAC」を選択すれば、難しいこと抜きで一発でツイッターにアップロード可能な動画がキャプチャできるからです。

しかしこのソフト、時々動作不良になって「録画する」ボタンを押しても「開始処理中」のまま固まって動かなくなってしまうことがあります・・。

この状態になるとなかなか復旧が困難なので、私はしょうがないのでソフトを一旦アンインストールして、もう一度インストールしなおすことにしています。

再インストールすると、再び正常にキャプチャを取ることが可能になります。

とても不便ですがしょうがないですね・・。一発でサクッとツイッターにキャプチャをアップできるソフトはなかなかありませんから・・。とても貴重な存在です・・。

PHPで全部nullで埋められたn個の配列を生成する!

PHPで全部nullで埋められた配列(n個)を生成する方法です。

「array_fill」という関数を使うと簡単にできます。

以下のコードでは「インデックス0」を先頭にして、10個分の配列を生成してくれます。中身は全部nullで埋められてます。

$test_array = array_fill(0, 10, null);

めっちゃ簡単なことですが、ちょっと調べてしまいました・・。

以上!

PHPで2chの書き込みIDのような文字列を生成するアルゴリズム!

PHP2chの書き込みID風のユニークな文字列を生成するアルゴリズムです。

以下のような感じのやつを出力します。

id:kh9D1A2c


コメント投稿者の「IPアドレス」と「書き込み時刻」を連結した文字列をsha1-hmacでハッシュ化します。
同じ日付で同じIPアドレスから書き込みをすると、同じIDが生成されるという訳です。

コードは以下の通り。

  //初期パラメータ
  $ip = "192.168.1.1";
  $timestamp = "2017-10-06";
  $secret = "hogegefugagapiyoyo"; 

  //sha1を使ってハッシュ化
  $id_hash = hash_hmac("sha1", $timestamp.$ip, $secret);

  //base64の形式に変換
  $id_base64 = base64_encode($id_hash);

  //先頭の8文字だけ抜き取る
  $id =  substr($id_base64, 0, 8);

天文学的な確率でIDが被る可能性があると思いますが、まあそれはヨシとします・・。
ハッシュのsecretが他人にバレてしまうとIPアドレスを推測されてしまいそうなので、これは絶対漏らさないようにしたいところです・・。

以上!

ツイッター広告で自分のツイートが表示されない!

先ほどツイッター広告の「ツイートのエンゲージメント」という機能を使って広告を打とうとしたのですが、困ったことが起きてしまいました…。

「クリエイティブを選択」の画面で自分のツイートを選択しようとしたのですけども、自分が先ほどつぶやいた一番最新のツイートだけが表示されないのです(更新ボタンを押してもダメでした…)

DBの登録が遅延してるのかな?と思って10分、20分と待ってみたのですが、なかなか自分のツイートが画面に表示されません。

業を煮やした私は、自分の一番最近のツイートを削除して、もう一度同じ内容をつぶやき直しました。

そうしたら、やっとこさ広告画面で自分のお目当てのツイートが選択できるようになりました。

ツイッター広告で自分のツイートが表示されないときは「もう一度つぶやき直す」

この方法がよさそうです…。

【CakePHP3】Shellでデータを追加しようとしたらエラー発生!

CakePHP3でシェルを叩いて実験用のレコードを追加しようとしたら、以下のようなエラーが発生しました。

$ ./cake DataAdd
Warning Error: /var/www/hogegege/tmp/cache/persistent/ is not writable in [/var/www/hogegege/vendor/cakephp/cakephp/src/Cache/Engine/FileEngine.php, line 429]


どうも「tmp/cache/persistent/」以下に書き込みができないと怒っているようです。

「persistent」のディレクトリの権限を見ると以下のように「755」になっていました。

$ ll
total 8
drwxr-xr-x 2 apache apache 4096 Apr 10 20:10 persistent

これは「apache」は読み書き実行なんでもできるけども、それ以外のユーザーは書き込みができないことを意味しています。

たしかにこれじゃ書き込めないですね・・。なのでroot権限でシェルを叩いちゃいました。

$sudo ./cake DataAdd


これで無事に実験データを挿入することができました。よかったよかった。

Twitter BootstrapのツールチップでAリンクを無効にする!

ツイッター・ブートストラップに「Tooltip」という機能があります。

これを使うと、例えば「ヘルプ」みたいな文章にマウスをフォーカスすると、フワっと覆いかぶさるように説明文が表示される、とってもかっこいい効果ができます。

使い方は以下のような感じです。

★HTML
<a href="#" class="setumei" data-toggle="tooltip" data-placement="bottom" data-original-title="説明文だよ!">ヘルプ</a>

★Javascript
$(function(){
  $('.setumei').tooltip();
});

※Bootstrap公式サイト

Javascript · Bootstrap

ここでちょっとやっかいなのが「a href="#"」の箇所です。こう書くと文章をクリックしたときに画面がトップに遷移してしまって、ちょっとうざいんですよね・・。
なので以下のようにして、クリックしたときに画面の移動を中止してしまいましょう。

★Javascript
$(function(){
  $('.setumei').tooltip();
  $('.setumei').click(function(){
        return false;
  });
});

これで画面が移動しなくなって、だいぶ使い勝手が良くなりました・・。

ツイッターのストリーミングAPIが401エラーで使えない!

ツイッターの「ストリーミングAPI」を使ってつぶやきを採取する実験をしているんですが、いつも使えてるAPIがいきなり使用不能になってしまいました・・。

私は「Phirehose」というPHPのライブラリでAPIを利用しているのですが、以下のようなエラーが出て接続失敗していまいます・・。

Phirehose: HTTP failure 1 of 20 connecting to stream: HTTP ERROR 401: Authorization Required (<html>\n<head>\n<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>\n<title>Error 401 Unauthorized</title></head><body><h2>HTTP ERROR: 401</h2><p>Problem accessing '/1.1/statuses/sample.json'. Reason:<pre>    Unauthorized</pre></body></html>). Sleeping for 10 seconds.

なんだかツイッターの認証が「401」のエラーで失敗してるみたいですね・・。

いろいろググってみたところ、どうやらこのエラーの原因、私のサーバー(CentOS6)の時刻が狂っているせいみたいです。

たしかに、サーバに入って以下のようにdateコマンドで時刻を表示してみると、時計が一時間くらい狂っていました(状態もINITというあやしげな表記になっています・・)

# date
Mon Jul  3 18:41:39 JST 2017

# ntpq -p
     remote           refid      st t when poll reach   delay   offset  jitter
============================================================================== 
     hogege          .INIT.      16 u    - 1024    0    0.000    0.000   0.000


そこでntpdを再起動して時計の調整を試みます。

# service ntpd restart
Shutting down ntpd:                                        [  OK  ]
Starting ntpd:                                             [  OK  ]


しかし、ntpdを再起動しても時刻を調整してくれません、困りました・・。

ntpってなんだか難しいんですよね・・。
時刻が調整されるのにすごい時間がかかったり、時刻がズレすぎてると調整をしてくれなかったり、とっても複雑でよく分らない動きをするプロトコルみたいです・・。

# date
Mon Jul  3 18:42:40 JST 2017

# ntpq -p
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
    hogegege         1.1.1.1      2 u    3   64    3    8.212  4530468   0.071


仕方がないので手動で時刻を設定する作戦に打って出ます。

手元の時計を見計らって「えいっ!」とdateコマンドを押し込みます(ntpってこういうことしても大丈夫なんでしたっけ・・?)

# date -s "07/03 20:03 2017"
Mon Jul  3 20:03:00 JST 2017

# service ntpd restart
Shutting down ntpd:                                        [  OK  ]
Starting ntpd:                                             [  OK  ]

# date
Mon Jul  3 20:03:15 JST 2017

# ntpq -p
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
    hogegege         1.1.1.1     2 u   11   64    1    8.083  -96.873   0.000

上記のように手動で強引に時刻を修正したところ、無事にツイッターAPIが使えるようになりました。

NTPもとくエラーとか吐かずに無事に動いてくれている様子です。

たぶんこれでよかったんだと思います、たぶん・・。


※P.S.
先日、ntpとはまた別の理由で、ストリーミングAPIが使用不能になってしまいました・・。

原因がまだはっきり特定できていないのですが、おそらく私のツイッターアカウントのメールアドレスの設定を変えてしまったことによって、なにかエラーが発生してしまった可能性があります・・。

ツイッターって、ひょっとしてメールアドレスを変えると、認証のための「Access Token」や「Access Token Secret」の値が変更される仕様になっているんでしょうか?ツイッターの開発者ページにログインして確認したところ、以前使っていた値が新しく変更されてしまっている気がします・・。

新しく発行された「Access Token」や「Access Token Secret」の値を使用してアクセスしたところ、無事にAPIが使えるようになりました・・。

なんだかモヤモヤしますが、とりあえずはこれで良しとします・・。