やったこと

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

このブログについて

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

最近作ったサイト
VTuberスパチャ一覧表
全国で発生した事件のデータベース「地域の事件簿」
みんなでなかよく政治の話!「なかよし討議!」
女子のつぶやきまとめ「Twiggy×Twiggy!」



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

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

IBM Cloudのヘンテコ動作、Bacic認証が失敗するぞ・・。

先日からIBM Cloudで開発をする羽目になり、かなり困ってる。
今日はBasic認証のページがうまく動作しなくて一日調べてた。

結論から言うと、「/.bp-config/httpd/extra/httpd-default.conf」なるファイルに、
以下の設定を追記しないとダメということだったらしい。

RewriteEngine on
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization},L]

「$_SERVER['PHP_AUTH_USER']」とか「$_SERVER['PHP_AUTH_PW']」の情報がセットされずに、認証失敗してしまうんだよね。

普通のサーバーだと当たり前に使えてたんだけど、本当はこんな設定が必要なんだね。

ググっても全然情報ないし、設定ファイルも俺様仕様の独自ファイルなので、つまづいたとこは全部気合で調べるしかない。

IBM Cloudのヘンテコ動作、デプロイするとデイレクトリが勝手に外に移動するゾ。

先日から「IBM Cloud」を使って開発してる。

お客さんがコードをそこへコミットしてくれというから、あまり深追いしたくないんだけど、仕方なくいろいろと調べながら開発してる。

無料会員登録をして借りた領域に、試しにPHPのテストコードをプッシュしてみると、いきなりエラーを吐いて動かなかった。

require_onceをしている箇所で「No such file or directory」となっていて、どうもディレクトリが見つからずにエラーしているみたい。

原因はドキュメントルートの下に作った「lib」というディレクトリが、本番環境にプッシュすると勝手にドキュメントルートの上に移動するからだった。

「require_once(__DIR__.'/lib/hoge.php')」などと書くところを「require_once(__DIR__.'/../lib/hoge.php」などと書き直すとやっと動いた。

たしかに普通は「lib」なんてディレクトリをドキュメントルートの下には作らないかもしれないけど、勝手に移動されちゃうなんてどういうことだろう。

自分が知らないだけで、こういう動作をするクラウドサービスってよくあるんだろうか・・?

ともあれこの原因を調べるのに一日費やしてしまったので、IBMはマジ訴訟。

【Wordpress】Smart Custom Fieldsで他人の関連投稿を表示させない!

「Smart Custom Fields」というワードプレスプラグインで、「関連投稿」というカスタムフィールドを作ることができる。
この「関連投稿」で、他人が作った投稿は表示させないで、自分が作った投稿だけを扱えるようにしたかった。
でもどうしてもそういう設定がなかった・・。

しかたがないのでプラグイン内のファイルに直接手を入れることにした。

修正するファイルは「/plugins/smart-custom-fields/classes/fields/class.field-related-posts.php

まずは、80行目あたりを下記のように書き換えた。
ajaxで動的に記事を読み込む箇所を、自分の記事限定とするように修正。
(でも管理者の権限の人だけは全ての記事を見ることができる)

        /**
         * Process that loading post when clicking post load button
         */
        public function relational_posts_search() {
                check_ajax_referer( SCF_Config::NAME . '-relation-post-types', 'nonce' );
                $_posts = array();
                if ( isset( $_POST['post_types'] ) ) {
                        $post_type = explode( ',', $_POST['post_types'] );
                        $args      = array(
                                'post_type'      => $post_type,
                                'order'          => 'ASC',
                                'orderby'        => 'ID',
                                'posts_per_page' => -1,
                                'post_status'    => 'any',
                        );

//MySetting
if (is_admin() && !current_user_can('administrator')){
  global $current_user;
  $args = array(
    'post_type'      => $post_type,
    'order'          => 'ASC',
    'orderby'        => 'ID',
    'posts_per_page' => -1,
    'post_status'    => 'any',
    'author'         => $current_user->ID
  );
}
//MySetting


あともう一か所、150行目あたりの以下の部分を書き換えた。
これは最初にページロードされたときにコンテンツを表示する部分。

        public function get_field( $index, $value ) {
                $name      = $this->get_field_name_in_editor( $index );
                $disabled  = $this->get_disable_attribute( $index );
                $post_type = $this->get( 'post-type' );
                $limit     = $this->get( 'limit' );
                if ( ! $post_type ) {
                        $post_type = array( 'post' );
                }
                if ( ! preg_match( '/^\d+$/', $limit ) ) {
                        $limit = '';
                }
                $posts_per_page = get_option( 'posts_per_page' );

                $args = array(
                        'post_type'      => $post_type,
                        'order'          => 'ASC',
                        'orderby'        => 'ID',
                        'posts_per_page' => $posts_per_page,
                        'post_status'    => 'any',
                );

//MySetting
if (is_admin() && !current_user_can('administrator')){
  global $current_user;
  $args = array(
    'post_type'      => $post_type,
    'order'          => 'ASC',
    'orderby'        => 'ID',
    'posts_per_page' => $posts_per_page,
    'post_status'    => 'any',
    'author'         => $current_user->ID
  );
}
//MySetting

この二か所を修正すればおk。

プラグインにはできるだけ手を入れたくなかったんだけど、他にいい方法思いつかなかったからしょうがないよね・・。

ツイアカがシャドウバンされてつらい。。

新しいサービスを作ったので、ツイッターのアカウントを作っていろいろ広報をしてる。

サイトの記事が更新されたタイミングでAPIを使って自分のツイアカから自動投稿、みんなに情報を周知しようとしてるんだけど、なぜかツイアカがすぐに運営側からシャドーバン(半凍結)扱いされてしまう。

おそらく自動投稿をするアカウントはスパムボットだとみなされて、ツイッター界から追放されてしまうのだろう。

なので、自動投稿はやめて手動投稿するようにした。下記の記事のように、コンテンツが更新されたら自分にLINEで通知するようにした。
LINE Messaging API を使ってLINEにメッセージ送信/メッセージ返信する - Qiita

LINEの通知が来たらその内容をコピペして、ツイッターに直接貼り付けてつぶやく。
食事中だろうが寝てようが風呂に入ってようが、通知が来たら即座につぶやく。

これを続けたら、二日くらいでシャドーバンが解除されて、またみんなにつぶやきを見てもらえるようになった。

めでたしめでたし。

【PHP】simple_html_domで国情報をセットする

PHPの「simple_html_dom」でスクレイピングをするときに、国の情報をセットする。
こうすると相手のサイトから日本語ベースのhtmlが返ってくる可能性ある。

以下のような感じで「Accept-language」に日本語をセットしてアクセスをするとよい。
(「user_agent」はiPhoneを偽装してる)

$url = "https://hogehoge.net/";
$context = stream_context_create();
stream_context_set_params($context, array('header' => 'Accept-language: ja\r\n', 'user_agent' => 'Mozilla/5.0 (iPhone; CPU iPhone OS 7_0 like Mac OS X) AppleWebKit/537.51.1 (KHTML, like Gecko) Version/7.0 Mobile/11A465 Safari/9537.53'));
$html = file_get_html($url, 0, $context);

国際的なサイトならば、日本人が来たと思って日本語のページを返してくれる。

【PHP】円マークを置換するのに一苦労。

テキストファイルの中にある円マーク「¥」をpreg_replaceで消そうとしたんだけども、どうも正規表現がマッチしなくてうまく消せない。

よくある話かもしれないけど、環境によって円マークはいろんな文字コードで表現される。

円マークについて | Fusic Developers Weblog

自分の場合、この円マークは「(c2a5)」という文字コードだった。
なので下記のようにして消したった。

    $str = preg_replace('/\xC2\xA5/', '', $str);

おしまい。