やったこと

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

このブログについて

absgといいます。webサービスのこととかいろいろ書いてます。

最近作ったサイト
みんなでなかよく政治の話!「なかよし討議!」
女子のつぶやきまとめ「Twiggy×Twiggy!」
もブログ
ツイッターバトラーズ!
ニコニコ人気ユーザーランキング


連絡先
何かご相談がある人はご連絡ください。
http://absgexp.net/prof/con.html

    (⌒)
  ∧__∧ (~)
 (。・ω・。)( )
 { ̄ ̄ ̄ ̄}
 {~ ̄お__}  ゴユックリ ドゾー
 {~ ̄茶__}
 {____}
  ┗━━┛

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もとくエラーとか吐かずに無事に動いてくれている様子です。

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

twitter_idからプロフィールページにアクセスする方法!

あまりないケースだと思うのですが、ツイッターIDが分かっているけどもそのアカウントのページが分からない。

そういうときは、以下のURLにアクセスすると本人のプロフィールページを見ることができます。

https://twitter.com/intent/user?user_id=xxxxxxxx

※xxxxxxxxはツイッターIDです

以上!