やったこと

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

【MySQL】hostsファイルにアドレス追加したのにSQLで接続できないぞ!

SQLサーバーに外部からアクセスしようとしたけど、以下のようなエラーが出てはじかれてしまった・・。
「Host 'xxx.xxx.xxx.xxx' is not allowed to connect to this MariaDB server」

SQLサーバー側の「/etc/hosts」ファイルにはちゃんと接続元の情報を追加したはずなのに、なんかホスト情報を解決できてないみたい。なんでなんだろう?

答えはSQLを再起動してなかったから。

SQLには内部的に名前解決の情報がキャッシュされていて、「hosts」ファイルを書き換えてもこちらのキャッシュには反映されてなかったらしい。

「/usr/local/etc/rc.d/mysql-server restart」とコマンド叩いてSQLリスタートしたら、無事アクセスできるようなった。

めでたしめでたし。

AWSサーバーでディープフェイク動画を作ろうとしたら一苦労。

AWSサーバーに高級なGPUを積んであるプランがたくさんあるみたいなので、これを使って今流行りのディープフェイクの顔合成動画を遊んでみようと思った。

「g2.2xlarge」という一番安いEC2サーバーを借りて、もろもろのディープフェイク関連のライブラリをインストール。

いざ動画生成処理を走らせようとしたら、下記のようなエラーが出て怒られてしまった。

「Attempting to fetch value instead of handling error Internal: no supported devices found for platform CUDA」

どうも「Tensorflow」という機械学習のためのライブラリからエラーが出てるみたいなんだけど、正直原因よくわからん・・。

そんで結論から言うと、「g2.2xlarge」に積んであるGPU(GRID K520)が古いタイプなのがよくなかったみたい。
これはcapabilityという型番が3.0のものなんだけど、おそらくもっと新しい3.5以上のものでないと、自分が入れたディープラーニング処理は走らないみたい。

なので、もっと新しいGPUが積んである「p2.xlarge」のほうを借りて、実行してみたらうまくいった。

たぶんcapabilityの問題だと思うので、AWS機械学習処理がうまくいかなかった人は、最新仕様のサーバーを借りるようしてみてください・・。

以上!

【Wordpress】記事のコメント一覧に2chみたいに番号を振るよ!

ワードプレスの記事に付けられたコメント一覧に、2ch掲示板っぽく番号を付けるよ!

イメージとしてはこんな感じ・・。

1.名無しさん
 記念カキコ
2.名無しさん
 記念パピコ
3.名無しさん
 記念マキコ

functions.phpに以下のような関数を定義すると、そのコメントの番号を計算することができます!

//コメントIDから番号を計算して返却する
function get_comment_index($comment_id){
  global $wpdb;

  $result = $wpdb->get_results("SELECT * FROM wp_comments WHERE comment_ID='$comment_id'", ARRAY_A);
  if (!count($result)){
    return null;
  }

  $post_id = $result[0]['comment_post_ID'];
  $result = $wpdb->get_results("SELECT comment_ID, (SELECT COUNT(*)+1 FROM wp_comments B WHERE B.comment_post_ID='$post_id' AND B.comment_ID < A.comment_ID) AS 'index' FROM wp_comments A WHERE comment_ID='$comment_id'", ARRAY_A);

  if (!count($result)){
    return null;
  }
  return $result[0]['index'];
}


そして、コメント一覧を表示する処理の直前でこの関数をコールして、取得したコメント番号をechoで表示させてやります。

(うちが使っているテーマでは「class-twentytwenty-walker-comment.php」というファイルの中でコメント一覧を表示してた)

 $comment_index = get_comment_index($comment->comment_ID);
echo $comment_index.".";

 printf(
        '<span class="fn">%1$s</span><span class="screen-reader-text says">%2$s</span>',
        esc_html( $comment_author ),
        __( 'says:', 'twentytwenty' )
 );

これで名前の前に「.1」とか「.2」とかの番号が付くようになります!

以上!

【Wordpress】wp_usersで次に付与されるインクリメントIDを取得する!

wp_usersにユーザーを追加するときに、次に付与されるID(= last_insert_id + 1)を取得するコードだよ!

以下のようにすると次回のIDを取得できるからね!

  global $wpdb;
  $table_name = $wpdb->prefix.'users';
  $query = "SHOW TABLE STATUS LIKE '$table_name';";
  $ret_array = $wpdb->get_row($query, ARRAY_A);
  echo $ret_array['Auto_increment'];;

例えば、以前にID(3)のユーザがいたんだけど削除されていて、今はID(1)とID(2)しかいない・・。

こんなときもちゃんと次回付与されるID(4)を返すお利口な処理だよ!

以上!

【PHP】指定した日時の週の月曜日を求める!

指定した日時の週を計算して、その週の月曜日の日時を返却するよ!
コードは下記みたいな感じ!

//例えば2020年03月10日をセット
$ymd = "20200310";

$ymd_time = strtotime($ymd);
$week_num = date("w",$ymd_time);

if ($week_num == 0){
//日曜日だった場合
  $monday = date('Ymd', strtotime("-6 day", $ymd_time));
}else{
  $ymd_time = $ymd_time + 24*60*60;
  $monday = date('Ymd', strtotime("-{$week_num} day", $ymd_time));
}

//月曜日の日時を出力
echo $monday;

2020年3月21日(土曜)を入力すると → 2020年3月16日(月曜)が返却される。
2020年3月22日(日曜)を入力すると → 2020年3月16日(月曜)が返却される。
2020年3月23日(月曜)を入力すると → 2020年3月23日(月曜)が返却される。
2020年3月24日(火曜)を入力すると → 2020年3月23日(月曜)が返却される。

みたいな挙動になるよ!

もっとうまい計算方法あるかもしれないけど、頭悪いからよく分からなかった・・。
でも計算できたらかこれでいい!

以上!

アマゾンRDSに踏み台からリモート接続できなくなってしまった!

WorkbenchというDB管理ソフトを使って、いつもssh踏み台経由でRDSサーバーに接続してるんだけども、先日アクセスを試したら急に接続不能になってしまっていた。

エラー文には「SSL connection error: protocol version mismatch」と表示されているけども、なんだか原因がよくわからない・・。

結論からいうと、下記のAWSのアナウンスのように、RDSサーバーの証明書の期限が切れてしまっているのが原因だった。

Amazon RDS のお客様: 2020 年 3 月 5 日までに SSL/TLS 証明書を更新してください | Amazon Web Services ブログ

WorkbenchのSSLオプション設定をよく見ると、「if available」のチェックが有効になってるんだけども、要するにこれをオフにすればいいんだよね。

ポチッとボタンを押して無効化することで、無事MySQLにアクセスできるようになりました。

めでたしめでたし。

【MySQL】Like検索の失敗は日付型が原因だった

とあるサイトでユーザーを検索する処理を作っていたんだけど、
MySQLで「Illegal mix of collations for operation ‘like’」とエラーが出て処理が失敗してしまった・・。

「ユーザー名」とか「地域」とか「生年月日」とかでLike検索をしていたんだけど、原因は「生年月日」の項目だった。

日付型のカラムは照合順序の項目を持たないので、like検索できないんだって・・。

しょうがないので生年月日はlike検索の対象から外すことにしました。

これでOK!