【WordPress】ページ公開時のエラー「公開に失敗しました。 返答が正しい JSON レスポンスではありません。」について

※環境:WordPress 5.8

※現象:固定ページを下書きから公開する際に、
「公開に失敗しました。 返答が正しい JSON レスポンスではありません。」
というエラーが発生しました。

 

公開する直前に、パーマリンクの共通設定を「基本」から「投稿名」に設定変更したので、
再度パーマリンクの設定画面に入って確認した結果、最下部の注意書きに気付きました。

 

→ 原因は、.htaccessが作成されなかったからです。

→ textareaの中身を丸ごとコピーし、wordpressの直下に「.htaccess」を追加します。

 

→ それでエラー解消です。

【CakePHP】CakePHP4でAjaxからのPOSTが403(Forbidden)エラーになる現象の解決策

※環境:CakePHP 4.0.3

※現象:jQueryのajaxでPOSTを投げるとき、403(Forbidden)が返されました。

※原因:
「config/routes.php」に全体のCSRFチェックの処理がデフォルトで入っているため、フォーム以外からのPOSTはエラーになります。

※対策:
・「config/routes.php」の全体のCSRFチェックをコメントアウトします。
・「src/Application.php」で個別にホワイトリスト(CSRFのチェックを行わないコントローラとアクション)を設定します。

↓↓(例)

(1)「config/routes.php」の修正:4行コメントアウト

$routes->scope('/', function (RouteBuilder $builder) {

//    $builder->registerMiddleware('csrf', new CsrfProtectionMiddleware([ // ← この行をコメントアウト
//        'httpOnly' => true,                                             // ← この行をコメントアウト
//    ]));                                                                // ← この行をコメントアウト

//    $builder->applyMiddleware('csrf');                                  // ← この行をコメントアウト

    // ・・・以下省略・・・

});

(2)「src/Application.php」の修正:3ヶ所追加

use Cake\Http\Middleware\CsrfProtectionMiddleware;  // 名前空間の記述を追加


    // ・・・中略・・・
    
    
    public function middleware(MiddlewareQueue $middlewareQueue): MiddlewareQueue
    {
                // ↓↓ここから追加
        $csrf = new CsrfProtectionMiddleware(['httpOnly' => true]);
        $csrf->whitelistCallback(function ($request) {
            $controller = $request->getParam('controller');
            $action = $request->getParam('action');
            if (is_null($controller) || is_null($action)) {
                return false;
            }
            // ↓↓ホワイトリストの指定
            $aryOkControllersAndActions = [
                ['controller' => 'Articles', 'action' => 'add'],
                ['controller' => 'Articles', 'action' => 'edit'],
                ['controller' => 'Articles', 'action' => 'delete'],
                ['controller' => 'Users', 'action' => 'add'],
            ];
            // ↑↑ホワイトリストの指定
            foreach($aryOkControllersAndActions as $aryOkControllerAndAction) {
                if (strcmp($controller, $aryOkControllerAndAction['controller']) == 0 && strcmp($action, $aryOkControllerAndAction['action']) == 0) {
                    return true;
                }
            }
            return false;
        });
        // ↑↑ここまで追加
        
        
        $middlewareQueue
            // Catch any exceptions in the lower layers,
            // and make an error page/response
            ->add(new ErrorHandlerMiddleware(Configure::read('Error')))
            
            // Handle plugin/theme assets like CakePHP normally does.
            ->add(new AssetMiddleware([
                'cacheTime' => Configure::read('Asset.cacheTime'),
            ]))
            
            // Add routing middleware.
            // If you have a large number of routes connected, turning on routes
            // caching in production could improve performance. For that when
            // creating the middleware instance specify the cache config name by
            // using it's second constructor argument:
            // `new RoutingMiddleware($this, '_cake_routes_')`
            ->add(new RoutingMiddleware($this))
            ->add($csrf); // ← ここに「->add($csrf)」を追加(セミコロン「;」の記述に要注意)
            
        return $middlewareQueue;
    }

↑上記の例では、「Articles/add」「Articles/edit」「Articles/delete」「Users/add」に対してだけ、CSRFチェックを行いません。

【CakePHP】Warning「Declaration of App\Controller\<コントローラー名>::beforeFilter(Cake\Event\Event $event) should be compatible with Cake\Controller\Controller::beforeFilter(Cake\Event\EventInterface $event)」について

※環境:CakePHP 4.0.3

beforeFilterを呼び出すため、コントローラー「UsersController」の中に、公式ドキュメントの指示通りに、

use Cake\Event\Event;

class UsersController extends AppController
{
    public function beforeFilter(Event $event)
    {
        parent::beforeFilter($event);
    }
}

↑を書きしたが、
下記警告が表示されました。

Warning (2): Declaration of App\Controller\UsersController::beforeFilter(Cake\Event\Event $event) should be compatible with Cake\Controller\Controller::beforeFilter(Cake\Event\EventInterface $event)

解決策:
警告の内容をよく確認すれば、「Cake\Event\Event」ではなく「Cake\Event\EventInterface」であることがわかりました。

→ 下記通りに書き直せばエラーが解消されました。

//use Cake\Event\Event; //(誤)
use Cake\Event\EventInterface; //(正)

class UsersController extends AppController
{
//    public function beforeFilter(Event $event) //(誤)
    public function beforeFilter(EventInterface $event) //(正)
    {
        parent::beforeFilter($event);
    }
}

【メモ】【Linux】CentOSでのwkhtmltopdfのインストール

Webページ(html)をpdfにしたいため、wkhtmltopdfをインストールしました。
※環境:CentOS 6.4(64bit)

最初、下記コマンドでwkhtmltopdfをダウンロードします。

  cd /usr/local/src
  wget http://download.gna.org/wkhtmltopdf/0.12/0.12.2.1/wkhtmltox-0.12.2.1_linux-centos6-amd64.rpm

※OSやバージョンによってダウンロード対象が異なるため、下記ダウンロードページで確認する必要があります。
http://wkhtmltopdf.org/downloads.html

次は、ダウンロードしたwkhtmltopdfをインストールします。

  rpm -ivh wkhtmltox-0.12.2.1_linux-centos6-amd64.rpm

しかし、下記エラーが出て、インストールできませんでした。

  error: Failed dependencies:
      xorg-x11-fonts-Type1 is needed by wkhtmltox-1:0.12.2.1-1.x86_64
      xorg-x11-fonts-75dpi is needed by wkhtmltox-1:0.12.2.1-1.x86_64

→ 「xorg-x11-fonts-Type1」と「xorg-x11-fonts-75dpi」に依存しているようなので、yumでインストールします。

  yum install -y xorg-x11-fonts-75dpi
  yum install -y xorg-x11-fonts-Type1

再度rpmでwkhtmltopdfをインストールしたら、無事にインストールできました。

※インストールできたら、下記のような一行のコマンドだけで、Webページをpdfで保存することができます。(例えば、http://www.yahoo.co.jp → yahoo.pdf)

  wkhtmltopdf http://www.yahoo.co.jp yahoo.pdf

【iPhone】【Safari】【css】タップ(クリック)した時の灰色の影(highlight)の消し方

iPhoneのSafariでリンクやボタンをタップした時、一瞬だけ背景が暗くなります。「タップした!」という感覚は出ますが、タップ時のcssを具体的に指定したい場合(:activeの指定とか)には、出てほしくない場合もあります。

下記cssでhighlightを消すことができます。

  -webkit-tap-highlight-color: rgba(0,0,0,0);

highlightを完全透明にする記述です。同じように、rgbaの値を変更すれば、ほかの色を設定することもできます。

※参考記事
[CSS] iPhoneのSafariでタップした際に表示される暗めな影を消すCSS – YoheiM .NET

【メモ】【Android】【Eclipse】ActionBarを非表示にしたら、メニューボタンを押すと強制終了する問題。

requestWindowFeature(Window.FEATURE_NO_TITLE);

上記処理でタイトルバーを非表示にしようとします。
アプリを起動して、問題なくタイトルバーが消えていますが、
メニューボタンを押したら、いきなりアプリが落ちました。

ログを見て、「android.support.v7.app.ActionBarActivity」に問題があるようです。

【解決策】
下記サイトはいくつかの解決方法を紹介しています。
ActionBar を非表示にし、かつメニューも有効にしたい! – 自分の歩いた道に落ちてるコード

→ 下記のような感じでgetMenuInflaterをオーバーライドすればエラーを解消しました。

public class MainActivity extends ActionBarActivity {

  @Override
  public MenuInflater getMenuInflater() {
    try {
      return super.getMenuInflater();
    } catch (NullPointerException npe) {
      try {
        return (MenuInflater) Activity.class.getMethod(
            "getMenuInflater").invoke(this);
      } catch (Exception e) {
        return new MenuInflater(this);
      }
    }
  };
  
  // 以下省略・・・

※具体的なエラー原因やその他の解決策について、下記サイトを参照してください。
ActionBar を非表示にし、かつメニューも有効にしたい! – 自分の歩いた道に落ちてるコード

【Xcode】【iOS】ステータスバー(Status Bar)のカスタマイズ

ステータスバーの一括変更

・Info.plist(通常はSupporting Filesの中に入っています。ファイル名は「xxx-Info.plist」)に
「View controller-based status bar」という項目があります(ない場合には追加する必要があります)。
「View controller-based status bar」をNOに設定します。
・適切なところに(例えば、AppDelegate.mのapplication:didFinishLaunchingWithOptions ← はじめて起動時呼び出される処理)、
下記処理を書きます↓↓

//  UIStatusBarStyleDefault:デフォルト
//  UIStatusBarStyleLightContent:フォント白
//  UIStatusBarStyleBlackOpaque:黒
//  UIStatusBarStyleBlackTranslucent:透明
    [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];

ViewController単位でのステータスバー変更

・Info.plistで「View controller-based status bar」をYESに設定します。
・対象ViewControllerに、下記のような処理を書きます↓↓

- (void)viewDidLoad {
    [super viewDidLoad];
    
    if ([self respondsToSelector:@selector(setNeedsStatusBarAppearanceUpdate)]) {
        // ViewControllerでステータスバーの更新を宣言
        [self setNeedsStatusBarAppearanceUpdate];
    }
}

- (BOOL)prefersStatusBarHidden {
//  YES:ステータスバー非表示
//  NO:ステータスバー表示
    return NO;
}

- (UIStatusBarStyle)preferredStatusBarStyle {
//  UIStatusBarStyleDefault:デフォルト
//  UIStatusBarStyleLightContent:フォント白
//  UIStatusBarStyleBlackOpaque:黒
//  UIStatusBarStyleBlackTranslucent:透明
    return UIStatusBarStyleLightContent;
}

【Xcode】【AdMob】エラー「unrecognized selector sent to instance XXXXXX」について

Xcode 5.0.2で、AdMobのiOS版SDK(Version:6.7.0)を入れて実装しようとしているとき、

[[GADBannerView alloc] initWithAdSize:kGADAdSizeBanner];
または
[[GADBannerView alloc] initWithFrame:CGRectMake(......)];

↑↑といったような処理でエラーになって落ちました。
大体のエラー内容:

unrecognized selector sent to instance XXXXXX
(詳細は省略)

サンプルコードとほぼ同じ実装ですがなぜかうまくいきませんでした。
色々悩んで調べた結果、
問題はソースではなく設定にありました:

TARGETSの
Build Setting → Linking → Other Linker Flags
↑↑の値が空白でした。
サンプルの設定にしたがって「-ObjC」にしたら一瞬で解決しました。
(下記画像を参照してください)

→ 結論、Other Linker Flagsに「-ObjC」か「-all_load」を設定することが必須のようです。

※参考サイト:
iPadな日記 : AdMob 6.1.4 実行時エラー

※Other Linker Flagの設定について
A-Liaison BLOG: -ObjC とか -all_load って何をやってるのか調べてみた
Technical Q&A QA1490: Building Objective-C static libraries with categories

【メモ】【Linux】【sudo】sudoユーザーの設定

※OS:CentOS

例えば、aaaaaというユーザーをsudoユーザーとして追加したい場合:

(1)root権限を持つユーザーでログインして、visudoコマンドを実行します。

  [root@XXXXXXX ~]# visudo

(2)エディタが自動に開きますので、下記の行を追加します。

  aaaaa ALL=(ALL) ALL

ただ、上記の設定だと、aaaaaがsudoする際にパスワードの入力が求められます。パスワード入力なしの設定をする場合、下記のようにします。

  aaaaa ALL=(ALL) NOPASSWD:ALL

※実際編集されたファイルは/etc/sudoersですが、viでの直接編集は危ないですのでやめましょう。必ずvisudoで行います。
※sudoがインストールされたかどうかの確認は下記のコマンドです。

  [root@XXXXXXX ~]# yum list installed | grep sudo

※インストールされていない場合、まずyumでインストールします。

  [root@XXXXXXX ~]# yum install sudo