PeaZipを使ってファイルの展開をcliからバッチ実行する

PeaZipをコマンドラインを使用してcliで展開する方法です。圧縮ファイルのフォーマットは自動で認識してくれるようです。

圧縮ファイルの情報を表示する
peazip32.exe -ext2list filename.tgz
 
圧縮ファイルを、カレントディレクトリに展開する
peazip32.exe -ext2here filename.tgz



バッチファイルにする場合は、以下のような形にしておくと、圧縮ファイルをbatファイルにドラックするだけで展開が行えます。

peazip32.exe -ext2list %1
pause
peazip32.exe -ext2here %1



また、PeaZipはポータブル版がportableapps.comから入手できます。USBメモリなどに用意しておくと便利かもしれません。

WordPressの更新で”別の更新が現在進行中です。”エラーが出るときにすべき事

「別の更新が現在進行中です」エラーが出る理由

WordPressの更新を行った際に、下記のような”別の更新が現在進行中です。”エラーが出る場合があります。
161230_2


これは、直前にWordPressの更新を行いエラーが出たとき、直後に再実行すると発生するものです。二重で更新処理が行われないようWordPressの内部でロック処理が行われています。

通常であれば、15分放置した後に再実行すれば問題なく更新が行えます。

「別の更新が現在進行中です」ロックを今すぐ解除する方法

直ぐに再実行したい場合で、MySQLのデータベースにアクセスできる場合は下記の手順でこのロックを強制的に解除できます。

まずDBにアクセスし、下記のSQLを実行してみてください。

SELECT * FROM wp_options WHERE option_name LIKE 'core_updater%';


この時、下記のようにデータが出力されれば二重実行防止のロック用データが存在します。

161230_1


このデータを削除するために、下記のSQLを実行します。

DELETE FROM wp_options WHERE option_name LIKE 'core_updater%';



データ削除後に再度WordPressの管理画面から更新を行えば、エラーが表示されずに更新が行えます。



WordPress上におけるロック処理の実装

WordPressのプログラム上、このロック処理は下記のwp-admin/class-wp-updater.phpにあるcreate_lock()で実装されています。

create_lockの呼び元はclass-core-update.phpにあり、第二引数のrelease_timeoutパラメータに”15 * MINUTE_IN_SECONDS”を指定しているので、15分のロック時間が設定されています。

// Lock to prevent multiple Core Updates occurring
$lock = WP_Upgrader::create_lock( 'core_updater', 15 * MINUTE_IN_SECONDS );
if ( ! $lock ) {
    return new WP_Error( 'locked', $this->strings['locked'] );
}



create_lock()自体の実装は以下のような感じです。optionsテーブルに”core_updater.lock”をキーにしてロック用のレコードをinsertしていることが分かります。
ちなみにこのキーはWordPress4.5までは”core_updater.lock”ではなく”core_updater”となってるため、使用しているWordPressのバージョンによってパラメータのoption_nameは異なります。

/**
    * Creates a lock using WordPress options.
    *
    * @since 4.5.0
    * @access public
    * @static
    *
    * @param string $lock_name       The name of this unique lock.
    * @param int    $release_timeout Optional. The duration in seconds to respect an existing lock.
    *                                Default: 1 hour.
    * @return bool False if a lock couldn't be created or if the lock is no longer valid. True otherwise.
    */
public static function create_lock( $lock_name, $release_timeout = null ) {
    global $wpdb;
    if ( ! $release_timeout ) {
        $release_timeout = HOUR_IN_SECONDS;
    }
    $lock_option = $lock_name . '.lock';
 
    // Try to lock.
    $lock_result = $wpdb->query( $wpdb->prepare( "INSERT IGNORE INTO `$wpdb->options` ( `option_name`, `option_value`, `autoload` ) VALUES (%s, %s, 'no') /* LOCK */", $lock_option, time() ) );
 
    if ( ! $lock_result ) {
        $lock_result = get_option( $lock_option );
 
        // If a lock couldn't be created, and there isn't a lock, bail.
        if ( ! $lock_result ) {
            return false;
        }
 
        // Check to see if the lock is still valid. If not, bail.
        if ( $lock_result > ( time() - $release_timeout ) ) {
            return false;
        }
 
        // There must exist an expired lock, clear it and re-gain it.
        WP_Upgrader::release_lock( $lock_name );
 
        return WP_Upgrader::create_lock( $lock_name, $release_timeout );
    }
 
    // Update the lock, as by this point we've definitely got a lock, just need to fire the actions.
    update_option( $lock_option, time() );
 
    return true;
}

WordPressの更新で”Maximum execution time of 30 seconds exceeded “エラーが出たときにすべき事

WordPressの更新を行うときに、”Maximum execution time of 30 seconds exceeded”エラーが出る場合があります。

これは、WordPressが使っているphpの設定で、プログラムの実行時間の上限が30秒に制限されているためです。WordPressの更新では大きなファイルサイズのダウンロードが発生するため、30秒の制限に引っかかっています。

php.iniを更新して、制限時間を延ばす

このような場合、php.iniを変更可能な場合は、設定を変えることで対応可能です。xamppを使っている場合、ファイルははC:\xampp\php\php.iniにあります。

下記の設定だと、上限を30秒から無制限に変更しています。

max_execution_time = 30
↓
max_execution_time = 0



ファイルを保存後に再度WordPressの更新を行い、成功するか確認してみてください。

php.iniが変更できない場合は、wp-config.phpを書き換える

環境によっては、php.iniを変更できない場合があります。
このような場合は、代わりにwp-config.phpを変更することで制限時間を変更できる場合があります。下記の1行を追記してみてください。

set_time_limit(3600);



設定変更後に「別の更新が現在進行中です」エラーが出る場合

再度更新を行った時に、”別の更新が現在進行中です。”エラーが出るときには、こちらの記事を参考にしてください。

Google Cloud Platformのセミナー(CP100A)に行ってきた

先月、Googleのセミナーに行ってきたのでその時に取ったメモです。

行ってきたのはGoogle Cloud Platform(gcp)のCP100Aというセミナーで、沢山あるGoogleのクラウドサービスの概要を1日で教えてもらえる講座でした。
全機能を浅く広く全体的に紹介するセミナーなのですが、gcpを初めて使う人や、BigQueryやAppEngineなど一部の機能は使っているけど概要はあまり理解できてない人にはお勧めな内容でした。

項目によって細かく書いている部分と、雑な部分がありますが、セミナーの説明が雑だったわけではなくメモが取り切れなかった(集中して聞きたいor興味がない項目)為です。

Google Cloud Platformの基本について


gcpのアカウントについて

billingアカウントと、プロジェクトアカウントがある
billingアカウントは課金のもので、プロジェクトを跨げる

プロジェクトIdについて

プロジェクトIDは変更できず、世界中でユニークである
コマンドラインで操作する場合は、通常プロジェクトIDを使う

プロジェクトの権限について


権限は大きく分けて4つある

Owner: プロジェクトの作成者がデフォルトでOwnerになる
       なんでもできる
       インスタンスの追加・削除
       ユーザの招待
       他ユーザへの権限追加
    など
 
Editor: リソースの操作が可能
        他のユーザへの権限や、プロジェクトの削除はできない
 
Viewer: 参照専用のユーザ 
 
Billing: 課金を管理するもの
         プロジェクトをまたいで所属可能な権限
         経理の人とかを入れておくとよいかもしれない


通常、1つのアカウントにOwner権限のユーザは2人以上いた方が良い

Billingを除いて、プロジェクト単位の権限となる。


IAMについて

プロジェクト単位ではなく、もう少し細かめに権限管理したい場合にはIAMを利用する
(たとえばgcpは操作できないが、bigqueryはアクセス可能など)

IAMはリソース単位で権限を指定可能となる
例えば、gcpのインスタンスを削除、一覧取得したい場合は下記の権限を与えるといったことが可能

compute.instances.delete
compute.instances.list



IAMはGoogleアカウントや、Google Groupに紐づけることができる
部署単位で権限管理する場合はGoogle Groupで管理すると便利

IAMのリソース階層

1つの案件に関して、複数の(gcp上の)プロジェクトを作ることができる
例えば、1つの案件に対して、開発環境・ステージング・本番環境で3つgcpのプロジェクトを作るなど
“案件”の事をgcpではOrganaizationと呼んでいる


サービスアカウント

gcpのリソースは、人がGUI経由で操作するだけでなく、プログラムからAPI経由でアクセスすることも多い
このような場合のために、サービスアカウントというものがあります

リソースを作ったときに自動的にサービスアカウントが作られてたりする

サービスアカウントは、メールアドレスの形式になっていて、下記のようなルールになっている
project_number@developer.gserviceaccount.com
project_id@developer.gserviceaccount.com

プロジェクトを作ると、自動で”Compute Engine default service account”というサービスアカウントが1つ作られる
このアカウントは、gcpコンソールのIAMと管理->サービスアカウントから確認することができる

権限は、すでにあるサービスアカウントに付与することもできるし、”特定のバッチだけ限られた権限を付与したいので専用のサービスアカウントを作る”といった使い方も可能

また、サービスアカウントを利用することで、プロジェクトを跨いで権限付与することができる


gcpへのアクセス

gcpへのアクセスには大きく3つある

- webのgcpコンソールからGUIで操作する
 
- cloud sdk利用したコマンドライン操作
  cloud sdkが手元のPCにインストールされていない場合は、cloud shellを使うとweb画面からアクセス可能
 
- RESTベースのAPI経由でアクセスする


ユーザからみると3つありますが、最初の2つは裏でREST APIを実行している
REST APIを各種言語から使いやすくしたSDKも、もちろん用意されている

注意点としては、プロジェクトの追加・削除はguiからしかできない
また、細かな操作は、慣れるとコマンドラインから実行すると便利

cliのテストとして、例えばcloud shellから以下のコマンドを実行してみると、VMの一覧やクラウドストレージのバケット一覧を確認できたりする

gcloud compute instances list
gsutil ls


オプションなしでglcoudコマンドだけ打って実行すればヘルプが出るので、オプションは暗記しなくても大丈夫


Rest API

JSONベースでやり取りができる

API Explorer

簡単にRest APIをテストできる
https://developers.google.com/apis-explorer/#p/

Rest APIベースで開発中の場合はかなり便利

クライアントライブラリ

認証処理を簡単に実装できる
プログラムからアクセスする場合は、このライブラリを使うと便利

Google Cloud Client Libraries
    コミュニティ主導で、手作業で作られているライブラリ
    使いやすさはこちらが多少よいが、対応が遅い
 
Google APIs Client Libraries
    REST APIから機械的に生成されているライブラリ
    ちょっと使いづらいが、複数の言語が用意されている
    新しい機能は、こちらの方が速く対応される
    最初はちょっと面倒だが、慣れるとこちらの方が良い





AppEngineとデータの保存について


Google App Engine とデータストア


Google App EngineはPaaSサービス
サーバ構築やスケーリングの管理を行う手間がない
最近では、モバイルアプリのバックエンドとしても使われている

1日の無料枠があり、延べで28時間分までのCPUリソースであれば無料で利用可能
なので、VMが1台で収まるような小さなサービスなら無料で運用可能


AppEngineの環境


AppEngineの環境には大きく以下の2つがある
Google App Engine Standard Environment
Google App Engine Flexible Environment


Standard Environmentとは

開発、テストが可能なSDKがある
コマンド1つで本番にデプロイできる
ローカルなファイルに保存できない
リクエストは60秒以内に返す必要がある

関連する知識
タスクキュー
    重い処理を非同期で実行できる

スケジュールドタスク
    Cronのようなバッチ処理ができる


Flexible Environmentとは

現在ベータ版として提供されている
Node.jsなど、任意の言語で開発でき、環境の制限を取っ払える
Standard EnvironmentはBogueというコンテナサービスをベースにしているが、Flexible EnvironmentはDockerコンテナベースで動作する
1VMあたり1コンテナになるため、Standard Environmentほどは費用的に効率が良くない


Google Cloud Endpoints

APIの自動生成などを行ってくれるサービス
デフォルトでOAuth2.0ベースの認証がサポートされている
API単体でのテストが行いやすく、問題がある場合にも切り分けが行いやすい

Google Cloud Datastore

KVSベースのストレージ
スケールアウトは自動で行ってくれる



ストレージについて

Cloud Storage

ファイルのアップ・ダウンロードができる
実際はファイルシステムではないので、Windowsの共有フォルダのような使い方はできない

※Cloud strage Fuseを使うとLinuxならFileSystemとしてマウントは可能
インターネット越しのストレージなので、当然ながらローカルのストレージよりは遅い
Cloud strage Fuseはまだ実験的な実装なので、実用レベルではない

データの可用性は高いので、ハードウェア故障に備えたバックアップは不要(操作ミス対策のバックアップはもちろん必要)

マルチリージョンタイプの保存エリア(バケット)を作成すると、データセンターが1つ丸ごとダウンしても大丈夫なレベルでバックアップが取られる
Cloud Storageは、信頼性・パフォーマンス・費用に応じて複数の選択肢がある
Standard Storage
    本番環境で使えるレベルのもの

DRA
    少しパフォーマンスが悪いが、安い

Nearline strage
    バックアップ向け
    月に1回しかアクセスされないようなデータに向いている

非常にアクセスが多い場合は後述するCDNサービスも併用花王

Bigtable

get/putが高速に行える、KeyValueベースのストレージ
マネージドサービスとして利用できる
SQLのような形での検索処理は行えない
ApacheのHBaseはこのBigTableを元にしている

APIもHBaseと互換性があるので、HBaseクライアントも使用可能
ストリーミングインサートもがおこなえ、バッチ処理でデータ登録も可能

他のサービス(DatafrowやDataprocなど)と連携できる

Croud SQL

MySQLサービスのGoogle cloud版
マネージドサービスなので、パッチ当てなどの面倒な管理は不要
第一世代と第二世代があり、第一世代の時は遅かった(100Query/sec程度しか出ず、ストレージ容量も500Gぐらいまで)
第一世代のCroud SQLでも、規模なWordpressの運用程度なら問題なく利用できるレベルではある
MySQL WorkbenchやNavicatのようなクライアントツールも使用可能

第二世代の場合は下記のメリットがある
MySQL5.5ベース
速度が7~20倍速い
ストレージをオートスケール可能
大抵の場合で第一世代より安く利用できる
なので、特別な理由がなければ第二世代を使えばよい


コンテナエンジンについて



前置き:そもそもコンテナとは


なぜコンテナを使うのか
最近、1つのサービスを1つの環境で用意し、保守性を向上させようという考え方が広まってきた
サービスごとにサーバを立てているとコストがかかるため、仮想環境を用意すると効率が良い
Dockerなどの環境だと、起動が速いので必要な時のみ、サーバ台数を増やすといったスケールアウトが行いやすい
また、Dockerだとイメージを簡単に作れるので、開発と本番で同じ環境を簡単に作ることも可能

Kubernetes

Kubernetesというのは、Dockerイメージの管理ツール
オープンソースで提供されていて、Google内部で10年以上の利用実績がある
GoogleはDockerが出るよりかなり前より、Borgというコンテナサービスの研究を行っていた

コンテナエンジン

コンテナエンジンとは、Kubernetesをgcpで効率よく利用できるようにしたマネージドサービスで、gkeと略される
VMが異常終了したとき、自動で別のサーバに移動させる、ログの管理、VMのモニタリングなどを簡単に行える
gkeでは、Google Container Registryという、Dockerイメージのストレージも用意しています
通常Dockerだとイメージをダウンロードするのに時間がかかりますが、Google Container Registryだとイメージを非常に速く取得できます

Google App Engine Flexible Environmentと似ているサービスですが、Flexible Environmentは1VMあたり1コンテナなのに対して、gkeだと1VMあたり複数コンテナが動作できます


コンピューティングサービス(IaaS)とネットワーク


Google Compute Engine

IaaSでVMを提供するサービスで、AWSのEC2に相当する
インスタンスを起動したまま、ディスクを変更することができる
インスタンスのライブマイグレーション機能があるため、メンテナンス時にサーバを止めなくてよい
課金は1分単位で行われるので、バッチでの計算処理などで30分だけ動作させるといったことも可能
同じVMを使い続ける場合、自動で割引が適用されるので、1日のうちでほとんどの時間稼働させたい場合は、こまめに停止させなくてもよい
Google側に強制終了されてよいようなVMであれば、70%引きで利用できる



ネットワーク

インターネット経由でのアクセス以外に、Googleのデータセンターへ専用線で接続するという選択肢がある

Googleとの回線

Carrier Interconnectを利用
回線提供会社の専用線を利用してGoogleのサービスに接続できる

Cloud VPN

安全性を確保するために社内LANとVPN経由で接続できる

Google Cloud DNS

自分で取得したドメインに対するDNSサービス

ロードバランサ

HTTPベースで負荷分散を行える
スケール可能で、ウォームアップ不要で利用できる
TCPやUDPでもロードバランスできるが、リージョンは同じである必要がある




オペレーションとツール


Stackdriver

モニタリング、ロギング、診断用のサービス
gcpだけでなく、awsも監視できる
オープンソースのエージェントをインストールする
エラーが発生したときは、アラートを出してくれる
アプリログを転送して、検索を行える

Google Cloud Deployment Manager

yamlファイルのテンプレートを用意することで、プロジェクトのひな型を用意できる

Google Cloud Source Repositories Beta

privateなgitリポジトリや、デバッグ機能が用意されている

Google Cloud Functions

AWSのLambdaに相当するサービで、Node.js上で動作するJavascriptを実行可能



ビッグデータと機械学習


BigQuery

大量のデータを高速にオンラインで検索できるようにしたサービス
Googleのの中では人気がある
SQLを使ったクエリが実行可能(RDBでは無い)
ローコストで検索できる
課金額の上限を、アカウント・日別で指定可能で、コスト管理が容易

パフォーマンスが良く、indexを作るなどのパフォーマンスに関するオペレーションが不要

Pub/Sub

メッセージングのサービス
デフォルトで10,000メッセージ/秒のメッセージ送信が可能
Cloud Dataflowなどと組み合わせて使い、データ蓄積のパイプラインの1つとして利用できる

Dataflow

ETL処理など大量のデータを処理するためのサービス
BigQueryは、SQL一回で取得可能な検索は得意だか、手続き的な処理が必要な処理は不得意
このような場合、Pub/Sub経由で送られたデータをDataflowで処理して、データ保存するといったことが可能
バッチ処理、ストリーミングの両方が行える
Java/PythonのSDKが用意されており、これらの言語でプログラミングできる

Google Cloud Dataproc

Googleクラウドの中でMapReduce処理をgcpを利用して行いたい場合のサービス
Haddopクラスタ構築を行う必要がなく、簡単に安価で環境を構築できる
1分単位での課金で、クラスタのノードは高速(90秒以内)に起動できる
データ量に合わせて、何ノードのクラスタが必要かなどのキャパシティプランニングは自分で行う必要がある

Google Cloud Datalab

大量データの可視化をサポートするgcpのサービス
BigQueryや、Compute Engineのデータ,Cloud Strageなどをデータソースで使える
Datalab自体はOpen Sourceで提供されている

Machine Learning


学習のアルゴリズムをTensorFlowで構築する

Cloud MLを利用して学習処理を分散環境で高速に行える
Googleによって既に学習済みのパラメータを使って認識だけを使いたい場合は、Vision API、Speech API, Translate APIなどを利用できる


Speech API

話した文章を文字起こしできるサービス
80の言語を認識でき、リアルタイムで変換できる

Translate API

文章の翻訳を行ってくれるサービス

開発中、ChromeでERR_UNSAFE_PORTエラーが出たときにチェックすべきこと(312エラー)

開発中にローカルPCでWebサーバを立ててテストしようとしたところ、ERR_UNSAFE_PORTエラーが発生したので、そのときに調べたことと、対処方法のメモです。

ERR_UNSAFE_PORTは、STATUS CODE=312で、文字通り安全ではないポートにアクセスしようとしているというエラーです。

テストでチェックしていたのは、87番のポートでした。telnetで87番Portへ直接アクセスしたり、IEからアクセスすると接続できますが、なぜかChromeからのみ接続できません。また、Port87を88など別のポートに変更すると問題なくアクセスできました。


調べてみると、Chromeのセキュリティ機能で、Chromeが危険だと判断しているポートには接続できなくなっており、この条件に該当するときはchromeがERR_UNSAFE_PORTエラーを提示するようです。”危険”というのは、セキュリティホールがあるという意味ではなく、他の目的で使っていることが多いポートをさすようです。


ちなみに、ERR_UNSAFE_PORTエラーの対象となるポートは87番以外にも下記のポートが該当するようです。かなり多いですね。

  1,    // tcpmux
  7,    // echo
  9,    // discard
  11,   // systat
  13,   // daytime
  15,   // netstat
  17,   // qotd
  19,   // chargen
  20,   // ftp data
  21,   // ftp access
  22,   // ssh
  23,   // telnet
  25,   // smtp
  37,   // time
  42,   // name
  43,   // nicname
  53,   // domain
  77,   // priv-rjs
  79,   // finger
  87,   // ttylink
  95,   // supdup
  101,  // hostriame
  102,  // iso-tsap
  103,  // gppitnp
  104,  // acr-nema
  109,  // pop2
  110,  // pop3
  111,  // sunrpc
  113,  // auth
  115,  // sftp
  117,  // uucp-path
  119,  // nntp
  123,  // NTP
  135,  // loc-srv /epmap
  139,  // netbios
  143,  // imap2
  179,  // BGP
  389,  // ldap
  465,  // smtp+ssl
  512,  // print / exec
  513,  // login
  514,  // shell
  515,  // printer
  526,  // tempo
  530,  // courier
  531,  // chat
  532,  // netnews
  540,  // uucp
  556,  // remotefs
  563,  // nntp+ssl
  587,  // stmp?
  601,  // ??
  636,  // ldap+ssl
  993,  // ldap+ssl
  995,  // pop3+ssl
  2049, // nfs
  3659, // apple-sasl / PasswordServer
  4045, // lockd
  6000, // X11
  6665, // Alternate IRC [Apple addition]
  6666, // Alternate IRC [Apple addition]
  6667, // Standard IRC [Apple addition]
  6668, // Alternate IRC [Apple addition]
  6669, // Alternate IRC [Apple addition]



開発で使用するポートを変更できる場合は、変更してしまったほうが手っ取り早いです。

もしポートを変更できない場合は、chromeのコマンドライン引数で–explicitly-allowed-portsを指定することで、ERR_UNSAFE_PORTエラーのチェックを回避できます。下記の例は87番ポートへのチェックを回避しています。

chrome.exe --explicitly-allowed-ports=87



複数指定する場合は、下記のようにカンマでつなぎます

chrome.exe --explicitly-allowed-ports=87,95


[MySQL]mysqlコマンドで、日本語の出力が文字化けするときに行う事

まずは、show variablesコマンドで、SQLの結果出力を行う文字コードが何になっているか確認する。
下記の場合だとcharacter_set_resultsがlatin1になってしまっている。

> mysql -h localhost -u root -ppass SampleDB
 
mysql> show variables like "chara%";
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | latin1                     |
| character_set_connection | latin1                     |
| character_set_database   | utf8                       |
| character_set_filesystem | binary                     |
| character_set_results    | latin1                     |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)




DBの設定を変更可能な場合は、変えてしまえばよいが、変えたくない(or 変えられない)場合は、setコマンドで現在のセッションだけ変更することができる。下記の例では3つとも変更しているが、出力結果を変えたいだけなら、character_set_resultsだけ変更すればよい。

mysql> set character_set_results='utf8';
Query OK, 0 rows affected (2.27 sec)
 
mysql> set character_set_client='utf8';
Query OK, 0 rows affected (2.27 sec)
 
mysql> set character_set_connection='utf8';
Query OK, 0 rows affected (2.27 sec)




変更できたかは、再度show variablesを実行すれば確認できる。

mysql> show variables like "chara%";
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | utf8                       |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+



この後、再度SQLを実行すれば、期待した文字コードで出力できるはず。

Skia ライブラリについて

– android/iOSなどのOSや、firefoxなどのブラウザ内部で使われている
– ライブラリがCPUを効率よく使うようチューニングされている
– ImageMagicより速い(場合によるが5~6倍速いというレベル)
– BSDライセンスでFreeに使える
– バッチ処理で大量の画像変換が必要な時は、AWSのスポットインスタンスを使うと、安価でコスト的に効率よく作業を完了できる

– ちなみに、jpg画像をサーバで保存するならwebpフォーマットに変換した方が良い

画質がほぼ同じで20%ぐらいサイズが減らせる

GearBestで買い物したけど、商品が届かないので質問メールを投げてみた。

先日GearBestで買い物をしたのですが、InStockな商品を注文したにもかかわらず、注文のステータスがPayment Receivedから1週間以上変わらないという状況に遭遇しました。
なので、問い合わせのメールを送ってみました。

注文に対する問い合わせページは、下記の流れでたどり着けます。


サイトにログインし、MyOrdersのページから、問い合わせを行いたい注文の下にある”View More”をクリックします。



注文明細のページに行くので、右上にある”Send / View Message”をクリックします。
問い合わせのページに遷移したら質問を英文で送信します。



以下が、今回送った質問の内容です。
英語ができないので、要点だけの適当な英文です。

かなり適当ですが、意図は伝わってくれるかと思います…

I ordered "Wxxxxxxxx(注文No)" a week ago, but not yet shipped.
Could you inform us the shipment date of this order?



翌日には返答がありました。土曜日に送信して14時間後に返答がきたので、かなり早い方かと思います。

返ってきた内容は以下の通りでした。

Dear xxxx,
 
Thank you for contacting Gearbest about your order.
We are processing it.
 
However, please note for the item XXXXXXXXX is back-ordered.
 
We can offer you 3 options:
Option 1 Wait a little more
We expect to ship the item around date Oct 15 to Oct 20.
Once we ship it you will receive an email from us. 
 
Option 2 Exchange with another item of your choice
Please send us the URL of the product you would like to choose instead.
If there is any price difference with the original item, 
we will either refund it to you on your wallet or send you an invoice to pay for it.
 
Option 3 Cancel this order 
In this case, we will refund to you on your original account.
 
Can you please let me know your decision?
We are looking forward to hearing from you and will do our very best to assist you.
Thank you for your understanding. 
 
Best Regards



在庫が無くて入荷待ち状態なので、どうしてほしいか回答がほしいということでした。

Option 1 Wait a little more
-> もう少し待つ。
Option 2 Exchange with another item of your choice
-> 購入する商品を変更する
Option 3 Cancel this order
-> この注文をキャンセルする


購入した商品のページを見るとInStockとなっていたので、もう一回質問しようか…と考えていたら、back-orderedだったはずにも関わらず、10/10にPackedへステータスが変わってました。
結果的にステータスが進んだのでOKですが、適当に回答しているのでは?という印象でした。

[Visual Studio Code]git pushできないときは–set-upstreamが必要

Visual Studio Codeでは、git管理されたファイルを編集する場合Visual Studio Code内でgit commitやgit pushを行うことができます。

ですが、gitプロジェクトを初めてVisual Studio Codeで開いた時、git pushができない場合があります。

具体的には、下のようにSync/Pull/Pushがグレーアウトしている状態です。

このような場合は、下記の手順でリモートリポジトリにPush可能になります。

リモートリポジトリにPushできるようにする手順

VisualStudioCode上から、Ctrl-@を押して、コマンドプロンプトを開きます。


以下のコマンドを実行します。
–set-upstreamコマンドで、デフォルトのリモートリポジトリ(origin)を指定しています。
Pushアップしたいリモートリポジトリがorigin以外の場合は、適宜読み替えてください。

git push --set-upstream origin master


ちなみに上記のコマンド実行結果は、.git/configの中に保存されます。間違えて実行してしまった場合は、このファイルを直接変更して元に戻すことも可能です。


[branch "master"]
	remote = origin
	merge = refs/heads/master




コマンド実行後、再度Gitのメニューを見ると、Sync/Pull/Pushが有効化されています。



メニューよりPushを実行すると、Gitのアイコンが時計マークになり、Push作業が始まります。
また、ウィンドウ下部には、未Pushがある事を示す数字が1になっています。



しばらく待ってPushが完了すると、以下の画面に変わります。
時計マークがなくなり、ウィンドウ下部の数字が0になっています。

これで、Pushは完了です。リモートリポジトリのLogを確認し、ローカルでコミットした内容が反映されていれば成功です。

[vagrant]VMWareのようにポートフォワーディング、ホストオンリー、ブリッジネットワークを作る

Vagrantでvmの外部からネットワークにアクセスする方法は、VMWareと同じく以下の3つがあります。

  • ポートフォワーディング
  • ホストオンリー
  • ブリッジネットワーク

これらの設定を行うには、Vagrantfileを編集すればよいです。ファイルを編集後にvagrant reloadコマンドを実行すると、設定が反映されます。

ポートフォワード

vmのポート80を、ホストOSの8080にマッピングする

config.vm.forwarded_port 80, 8080



vmのポート80を、ホストOSの8080にマッピングするが、ホストOSのポートが使用中なら他の番号(8081~8089)に振り替える

config.vm.forwarded_port 80, 8080, auto_correct: true
config.vm.usable_port_range = (8081...8089)



TCPだけでなく、UDPのポートもフォワードさせたい時

config.vm.forwarded_port 80, 8080, protocol: "udp"




ホストオンリー

ホストからのみ、192.168.1.200で接続できるようにしたいとき

config.vm.network "hostonly", "192.168.1.200"




ブリッジ

ホストと同じネットワークに所属させ、他のPCからもアクセス出来るようにしたいとき

config.vm.network "bridged"




実践 Vagrant


小学生の娘に買った保温水筒 カルドカラーズ 2WAY キッズボトル 600ml パンダ

アマゾンで、小学生の娘のために購入した保温水筒を購入しました。
パンダのイラストが可愛い、ピンクの水筒です。


購入の理由

子供の水筒を購入するにあたり、保温・保冷ができるタイプのものを購入しようと思っていました。こちらの商品は、コップと直飲みの2ウェイタイプで、そのときによって変えられるのがとても便利だと思いました。


商品レビュー

こちらの水筒は、何より2ウェイタイプだというのがとても便利で気に入っています。夏場、冷たいものを歩きながらゴクゴクと飲みたいときは直飲みタイプ、暖かいものを入れたいときや、座ってゆっくり飲む時間があるのでコップがいい!というときはコップタイプ…など、事前にどのような状況で飲むのか(&子供の希望)で飲み口を変えています。

容量も600mlと、多すぎず少なすぎずでちょうど良いです(幼稚園のころに持っていたのは500mlで、夏場には少し足りないということもあったので)。また、お値段も比較的お手ごろなのにしっかりしている感じがします。

何より、デザインがとっても可愛いのが子供が気に入っているポイントです!

どんなに機能が良くても、子供が気に入るデザインでないとやはり子供に喜んでもらえないので。その点でもこの水筒は、動物好きのうちの子供にはとても気に入ってもらえました。

パンダさんがでんぐり返ししているユニークなイラストも「可愛い!」と気に入っています。学校に持っているために購入しましたが、普段のお出かけや公園遊び等、毎日使っています。


カルドカラーズ 2WAY キッズボトル 600ml パンダ

[FuelPHP]DB::query()を使って、SQL直書きでDBアクセスしたい

FuelPHPでDBをアクセスしたい場合、FuelPHP標準でO/Rマッパや、Model_Crud、クエリビルダー、DB::query()メソッドなど、様々なアクセス方法が用意されています。

簡単なプログラムを作る場合は、O/Rマッパ(ORMパッケージ)などを使ってもよいのですが、データのアクセスが多くなることが予測される場合、DBアクセスが抽象化された形での処理はパフォーマンスが低下する問題が後々出てきてしまいます。

このようなリスクがある場合、SQLを直接かけるDB::query()メソッドを使用すると、抽象化によるオーバーヘッドもないし、DBサーバの実行計画を見ながら詳細なクエリのチューニングが行えます。(一方で、もちろん、最初にシステム構築する際の開発コストが増えますが…)


今回は、DB::query()メソッドを使用したDBアクセスのサンプルを説明します。

DBへの接続定義

プログラム作成に先立ち、DBへの接続定義が必要です。
開発環境の場合は、fuel/app/config/development/db.phpを編集します。

仮に、ID/PASSがuser001/passで、データベース”TEST”に接続したい場合は、下記のような定義になります

<?php
/**
 * The development database settings. These get merged with the global settings.
 */
 
return array(
    'default' => array(
        'connection'  => array(
            'dsn'        => 'mysql:host=localhost;dbname=TEST',
            'username'   => 'user001',
            'password'   => 'pass',
        ),
    ),
);






DBクラスを使って検索を行う


最低限の検索処理は以下のような形になります

$sql = 'SELECT * FROM items WHERE id >= :min_id ORDER BY id';
$query = \DB::query($sql);
$query->parameters( array('min_id'=>10 ) );
 
$itemList = $query->execute()->as_array();
var_dump( $itemList );



DBクラスを使用する場合、データは配列として一度に取得されます。
ですので、結果が多くなる場合(10万行など)は、メモリ不足になってしまいます。
このような場合、他のフレームワークが用意しているDBアクセスクラスだとfetch()といったメソッドで、カーソルから1行づつ取得できたりしますが、FuelPHPの場合はカーソルを使用したデータアクセスはありません。





DBクラスを使って更新を行う


こちらはデータの追加・更新・削除する場合のサンプルです。
基本的にselectと同じですが、返される結果セットがないためas_array()は不要です。

$sql = 'UPDATE items SET name = :name WHERE id = :id';
$query = \DB::query($sql);
$query->parameters( array('name'=>'taro', 'id'=>1 ) );
 
$itemList = $query->execute();




200g以下の軽量10000mAh USBバッテリーを購入[TSUNEO 10000mAh]

重量が軽めで、10000mAh以上の大容量USBバッテリーを探していたのですが、先日Amazonで条件に合う商品を見つけたので買ってみました。

今回購入したのは、Amazonでの商品名はTSUNEO 10000mAhというもので、出品者は”成栄健康商品”というショップです。値段も¥2,500を切っていて、お手頃でした(最新の価格はAmazon上で確認してください)。


商品は段ボールで来ました。


段ボールに貼ってある商品のラベルを見ると、ROMOSSのpolymos 10 Airという製品名のようです。


こちらは、裏面のスペック表。商品名が違っていたので違うものが来たのかと不安になりましたが、容量は確かに10000mAhです。



箱の中身です。外装は少し角がつぶれていましたが、中身に影響はありませんでした。
バッテリー本体と、50cmぐらいのUSBケーブル、説明書が入っています。



こちらがバッテリー本体。確かにAmazonの商品画像と同じ物です。


裏面はこんな感じ。こちらも中国語表記でした。


スペック上は204gと記載されていましたが、実際に測ったら200gを切ってました。


マニュアルは1枚で、両面印刷されています。
内容は中国語で、何が書いてあるかよく分からないのですが、USBバッテリーを使うのに説明書は特に必要ないので、問題ありませんでした(クリックで拡大します)。






バッテリー本体への充電は、USB Microの形状です。


また、USBからスマホへの充電は2台同時に行えます。
片方は2.1A,もう一方は1Aの給電がMaxです。マニュアルによると両方同時に使った場合は、3.1Aではなく2.1Aとの表記でしたので両方とも1Aになるかと思われます。
どちらか2.1Aのポートなのかは、上についているマークで、一目で分かるようになってます(上記の写真だと左側です)。

側面にはスイッチがあります。押すと、どの程度充電されているか確認できます。


Amazonの商品ページには、他にも画像がいくつか上がっているので、気になる部分がある場合は参考になるかと思います。
TSUNEO 10000mAh 軽量 薄型 大容量 モバイルバッテリー 2ポート 2台同時充電 2.1A 急速充電

実際に何度か使ってみましたが、以前使っていたUSBバッテリーより充電時間も短くなり、満足です。
容量のわりに軽量で、価格も安かったので、国内メーカである事へこだわりがなければ良い商品かと思います。



TSUNEO 10000mAh 軽量 薄型 大容量 モバイルバッテリー 2ポート 2台同時充電 2.1A 急速充電



ヨジャチング[여자친구] 「あなた,そして私」 NAVILLERAの意味は何?(너 그리고 나:ナビレラ)

韓国のアイドルグループGFriend(여자친구:ヨジャチング)が2016/7/7に、新曲「あなた,そして私 NAVILLERA」(너 그리고 나)を発表しました。この中に出てくるナビレラという歌詞があるのですが、このナビレラに込めた意味を、韓国のテレビ局であるYTNニュースのインタビューでGFriendのメンバーであるソウォンが説明しました。


以下、説明の内容です。


조지훈 시인님의 시 ‘승무’의 시중에
詩人チョ・ジフン(趙 芝薰)の詩、スンム(僧舞)の中にある


‘나빌레라’라는 말을 인용해왔어요
ナビレラ(NAVILLERA)という言葉を引用しました。


인용을 해서 여자친구가 ‘나비처럼 날아가겠다!’
引用をしてGFriend(여자친구)が’蝶のように飛んでいきたい(羽ばたきたい)!’


그런 의미를 담고 있는
というそんな意味を込めた


정말 좋은 곡이니까요
本当に良い曲です。


インタビュー全体は下記より視聴できます(ナビレラの説明は0:22より)。




「ナビレラ」の引用元の詩、スンムとは…?


引用元となった詩人チョ・ジフンの詩、スンムですが、この詩を刻んだ碑が高麗大学にあり、こちらは詩の内容を読み上げた動画です。よく聞いてみると、12秒ぐらいの位置で”ナビレラ”と言ってます。

詩の内容は下記のとおりで、赤字の部分がナビレラ(나빌레라)と書かれている箇所です。
얇은 사(紗) 하이얀 고깔은 고이 접어서 나빌레라.
파르라니 깎은 머리 박사(薄紗) 고깔에 감추오고 두 볼에 흐르는 빛이 정작으로 고와서 서러워라.
빈 대(臺)에 황촉 불이 말없이 녹는 밤에 오동(梧桐)잎 잎새마다 달이 지는데,
소매는 길어서 하늘은 넓고, 돌아설 듯 날아가며 사뿐히 접어 올린 외씨보선이여.
까만 눈동자 살포시 들어 먼 하늘 한 개 별빛에 모두오고,
복사꽃 고운 뺨에 아롱질 듯 두 방울이야 세사(世事)에 시달려도 번뇌(煩惱)는 별빛이라.
휘어져 감기우고 다시 접어 뻗는 손이 깊은 마음 속 거룩한 합장(合掌)인 양하고,
이 밤사 귀또리도 지새우는 삼경(三經)인데,
얇은 사(紗) 하이얀 고깔은 고이 접어서 나빌레라.

こちらは、スンム《승무(僧舞)》の舞の様子です。蝶のような感じもしますね。



「あなた,そして私」(너 그리고 나)の関連動画

「あなた,そして私」(너 그리고 나)に関する動画も、たくさんYoutubeにアップされています。

この曲は韓国の番組、「週刊アイドル」という番組で2倍速での完璧なダンス披露した事でも話題になっています。


ファンによる「ナビレラ」の部分だけを無限ループさせた以下のような動画もアップされています。



こちらは、韓国の音楽番組「MV Bank」による、MV制作時のメイキングです。
3:05に出てくる、男の子のダンスが可愛いです。



KBSのFMラジオで歌ったライブの光景です。


KBSラジオでは過去の放送をネットで聞けるようにしてくれている為、ラジオでのトーク内容を下記のURLから聞くことができます。
박지윤의 가요광장
放送日は7/11だったので、20160711を探して再生すればよいです。ブラウザはChomeやEdgeだと再生できないのでIEで再生して下さい。(番組での登場は38:40~で、ライブで歌っているのは45:00~です)


韓国のTV局、KBSの朝番組に登場したときのインタビューです。(インタビューは3:13から)




また「あなた,そして私」は歌っていないのですが、プサンの近くにある金海ロッテウォーターパーク(김해 롯데워터파크)で行ったミニライブの様子も最近話題になっています。梅雨時のライブで途中から大雨になったのですが、雨にも負けずキレッキレのダンスを披露してくれています。
13:30あたりを再生すると、いかに大雨だったかが良く分かります…

160702 김해 롯데워터파크 – 여자친구 미니콘서트 by.Holic(폭우 맞으며 무대하는…)


여자친구 GFRIEND – 너 그리고 나 (NAVILLERA) M/V




「あなた,そして私」を含むファーストアルバム、LOLも発売中!!

この曲が入ったGFRIENDのファーストアルバムも発売中です。
アルバムのタイトルはLOLですが、Laughing Out Loud バージョンと、Lots of Love バージョンの2種類のパッケージで出ています。

両バージョンの開封動画もあるので、どっちを買おうか悩み中の方は参考にしてみるのも良いかもしれません。



曲のタイトル一覧は下記のとおりです。
1. Intro
2. 물들어요 (Fall in Love)
3. 너 그리고 나 (NAVILLERA)
4. LOL
5. 한 뼘 (Distance)
6. 물꽃놀이 (Water Flower)
7. Mermaid
8. 나의 일기장 (Sunshine)
9. 나침반 (Compas)
10. 찰칵 (Click)
11. 바람에 날려 (Gone with the wind)
12. 너 그리고 나 (NAVILLERA) (Inst.)

1. INTRO
2. 水に入る(Fall in Love)
3. あなた そして 私(NAVILLERA)
4. LOL
5. 一尺(Distance) #親指と人差し指を伸ばした、”ちょっとの距離”といった意味
6. 水花遊び(Water Flower)
7. Mermaid
8. 私の日記帳(Sunshine)
9. 羅針盤(Compas)
10. カチッ(Click)
11. 風に吹かれて(Gone with the wind)
12. あなた そして 私(NAVILLERA)(Inst.)

韓国の人気アイドルグループGFRIEND(ガールフレンド/ヨジャチング)が初のフルアルバムをリリース!
2015年末の各音楽賞では新人賞を総なめ、「時間を走って」が2016年上半期のNo.1ヒット曲となるなどデビュー1年半で瞬く間にトップアイドルとなったGFRIEND。ファーストアルバムのタイトル「LOL」には、「Laughing Out Loud(大きな声で笑う)」と「Lots of Love(たくさんの愛)」という二つの意味が込められている。今作でも爽やかなイメージでリスナーを癒してくれそうだ。「あなた そして 私」など全12曲を収録。 このアルバムには、バージョンごとに内容の異なる124ページのフォトブック、メンバー別メールメッセージ1枚(6種類よりランダム)、フォトカード2枚(全21種よりランダム)、ペーパードール1点(6種類よりランダム)付き。


GFRIEND ヨジャチング 1集 – LOL (韓国盤)Laughing Out Loud バージョン


GFRIEND ヨジャチング 1集 – LOL (韓国盤)Lots of Love バージョン

Google Koreaが2016年上半期の検索上位キーワードを発表

Google Koreaが、韓国の国内で2016年上半期の検索が多かったホットキーワードを発表しました。
以下、発表の内容です。








2016年も半年が過ぎ、梅雨の時期になりました。
2016년도 벌써 반이 훌쩍 지나고 어느덧 장마가 시작되었습니다.


これまでの6ヶ月間、google検索において、どのような検索キーワードに人気が集まったのでしょうか?
지난 6개월간 구글 검색에서는 어떤 검색어들이 인기를 끌었을까요?

このたび、上半期にホットだった検索キーワードのランキングを、総合順位、社会/一般、人物、TV番組、映画の分野別に分けて、整理してみました。
지난 상반기를 뜨겁게 달궜던 인기 검색어 순위를 종합 순위와 함께 사회/일반, 인물, TV프로그램, 영화 분야별로 나눠서 정리해봤습니다.

今回発表する人気検索キーワードは今年の1/1から6/26までにグーグルの検索サイトで、検索量が10倍以上急増したキーワードを集計した順位で、単なるウェブサイト名での検索(navigational query)と、一部成人(アダルト)関連キーワードなどは順位から除外しています。
이번에 발표하는 인기 검색어는 올해 1월 1일부터 6월 26일까지 구글 사이트에서 검색량이 10배 이상 급증한 검색어를 집계한 순위, 단순한 웹사이트명(navigational query)과 일부 성인 관련 검색어 등은 순위에서 제외되었습니다.

(韓国IP基準、モバイルとPCの検索数データを合算して集計)
(※ 한국 IP 기준, 모바일과 PC 검색량 데이터를 합산하여 집계)

2016年上半期のグーグル人気キーワード上位10位は 1.太陽の末裔| 2.オーバーウォッチ | 3.アガシ | 4.ソン・ジュンギ| 5.ズートピア| 6.応答せよ1988 | 7.プロデュース101 | 8.内部者たち| 9.イ・セドル| 10.デッドプールの順でした。
2016년 상반기 구글 인기 검색어 상위 10위는 1. 태양의 후예 | 2. 오버워치 | 3. 아가씨 | 4. 송중기 | 5. 주토피아 | 6. 응답하라 1988 | 7. 프로듀스 101 | 8. 내부자들 | 9. 이세돌 | 10. 데드풀 순으로 나타났습니다.






以下、各ランキングに名前が挙がった上位キーワードの簡単な解説です。


1.太陽の末裔

韓国のTV局KBSで放送されたドラマの名前です。最高視聴率38.8%を記録し中国でも話題になっています。

2.オーバーウォッチ

アメリカのゲームメーカーであるブリザードが開発したゲームの名前です。

3.アガシ

日本語に訳すと”お嬢さん”といった感じの意味で、韓国で制作された映画のタイトルです。
今年のカンヌ国際映画祭に進出したことが話題になりました。

4.ソン・ジュンギ

一位になった太陽の末裔に出ている役者さんの名前です。
主演の男優さんです。

5.ズートピア

ディズニーが作った3D CGの映画です。
日本でも放送されています。

6.応答せよ1988

韓国で以前より人気のドラマ「応答せよ」シリーズの新作です。
昔の青春時代を懐かしむ人も多く、1988年をテーマにした本シリーズも話題になりました。

7.プロデュース101

101人の練習生が集まって、アイドル歌手デビュー入りを目指す音楽のサバイバル番組です。
この番組から、I.O.Iというアイドルグループが登場しました。
話題の集め方が、AKBとちょっと似てるかもしれません。

8.内部者たち

韓国作の、政界、言論界、法曹界の不正を暴いた社会告発内容をテーマにした映画です。
こちらも話題の映画で、900万人の観客動員を達成しました。

9.イ・セドル

日本でも話題になった、Googleの人工知能であるアルファGOと対戦した囲碁の棋士の名前です。

10.デッドプール

マーベルコミックが原作のX-MENシリーズのスピンオフ作品となる映画です。
日本でも、デッドプールの名前で映画化されています。




2016년 대한민국 상반기를 구글 인기 검색어로 되돌아봅니다.
http://googlekoreablog.blogspot.jp/2016/07/trends-in-search-2016-1H.html

[C#]Form上の全TextBoxに対し、Ctrl-Aで全選択できるようにする方法

VisualStudioにてWinFormを使用したプログラムを作成時、TextBoxに対してCtrl-Aでテキストの全選択をしたい場合があります。

KeyDownイベントでSelectAll()させればよいのですが、対象となるTextBoxが多いときは、イベントハンドラを追加するのに手間がかかります。

このような場合は、下記のコードでForm上に存在する全てのTextBoxに対して、”Ctrl-Aで全選択”の機能をつけることができます。

private void Form1_Load( object sender, EventArgs e ) {
	// すべてのTextBoxへ、Ctrl-Aで全選択機能を付与する
    SetSelectAll( this );
}
 
private void SetSelectAll( Control target ) {
    foreach ( Control control in target.Controls ) {
        if ( control.HasChildren ) {
            // 子コントロールがある場合は再帰的に処理
            SetSelectAll( control );
        }
 
        // TextBox以外は何もしない
        if ( control is TextBox == false ) {
            continue;
        }
 
        // Ctrl-Aが押されたときに全選択させるハンドラを追加
        control.KeyDown += ( sender, e ) => {
            if ( e.Control && e.KeyCode == Keys.A ) {
                ( sender as TextBox ).SelectAll();
            }
        };
    }
}




作って覚えるVisual C#デスクトップアプリ入門

[MySQL]ERROR 2049エラーが出たときすべきこと “authentication protocol refused (client option ‘secure_auth’ enabled)”エラー

MySQLでデータベースに接続する際、エラーERROR 2049が発生する場合があります。
これは、クライアント側のmysqlコマンドでsecure_authオプションが有効になっているときに発生します。

このような場合にとりあえず接続したいときは、–skip-secure-authオプションをつければOKです。


普通に接続すると、ERROR 2049エラーが出ます。

$ mysql -u root -h localhost -p
Enter password:
ERROR 2049 (HY000): Connection using old (pre-4.1.1) authentication protocol refused 
(client option 'secure_auth' enabled)



mysqlコマンドに、–skip-secure-authオプションをつけたら接続可能になりました。
※ –secure-auth=0でもOKです。

$ mysql -u root -h localhost -p --skip-secure-auth
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 76561232
Server version: 5.1.72-community-log MySQL Community Server (GPL)
 
Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.
 
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
 
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
 
mysql>



基礎からのMySQL

–skip-secure-authオプションの意味は下記のとおりです。
ちなみに、MySQLの5.7.5以降のバージョンでは–skip-secure-authは非推奨となっており、将来のバージョンでなくなる予定です。

--secure-auth
Do not send passwords to the server in old (pre-4.1) format.
This prevents connections except for servers that use the newer password format.
 
As of MySQL 5.7.5, this option is deprecated and will be removed in a future MySQL release. 
It is always enabled and attempting to disable it 
(--skip-secure-auth, --secure-auth=0) produces an error. 
Before MySQL 5.7.5, this option is enabled by default but can be disabled.
 
Note
Passwords that use the pre-4.1 hashing method are less secure than passwords that 
use the native password hashing method and should be avoided. 
 
Pre-4.1 passwords are deprecated and support for them is removed in MySQL 5.7.5.
For account upgrade instructions, see Section 7.5.1.3, 
“Migrating Away from Pre-4.1 Password Hashing and the mysql_old_password Plugin”.




また、my.cnfの編集が可能な場合は、my.cnfへ下記の設定を追加してもOKです。

[mysqld]
skip-secure-auth




このエラーが出る理由は、古い形式のパスワードハッシュを使用しているためです。
セキュリティ上は好ましくないため、本来ならパスワード形式を変更しておくべきです。


MySQL 5.7以降で、あえて古い形式のパスワード管理をする必要がある場合は、下記のページの内容(mysql_old_passwordプラグイン)が参考になります。
http://dev.mysql.com/doc/refman/5.7/en/account-upgrades.html

参考:
Skip Secure Auth – MySQL 5.6.15
http://serverfault.com/questions/573809/skip-secure-auth-mysql-5-6-15/617108

MySQL 5.6で、コマンドラインに「–skip-secure-auth」を追加?
http://programmer-jobs.blogspot.jp/2014/06/mysql-community-server-5-6-skip-secure-auth.html

MySQL 5.7.5でsecure-authが軒並み使えなくなるはなし
https://yoku0825.blogspot.jp/2014/10/mysql-575secure-auth.html

<続>MySQL 5.6 old_passwords=1 環境へのユーザー情報移行が難しい
ttp://moontalk.hatenablog.com/entry/2013/12/16/221508

実践ハイパフォーマンスMySQL

WordPressにおけるフック処理の仕組みとは?

WordPressのフックとは何か?

WordPressにおけるフックとは、何でしょうか?
フックというのは、WordPressがページを表示する過程の特定のタイミングで、事前に登録された処理(関数)を実行することができる機能です。ほかのフレームワークでいうところのイベントハンドラ、イベントリスナに相当するものです。

フック機能を使うことでWordPressがページを表示する過程の特定のタイミングで、処理を追加したり変更したりすることができます。


WordPressではプラグインの仕組みがありますが、プラグインの作成者はこのフック処理を利用することで、標準のWordPressの処理を書き換えることでプラグインの機能を実装しています。つまりフック処理を自分で作ることで、WordPressが行っている処理の途中で、自分が作ったプログラムを実行することができます。

ただし、フック処理を実行できるタイミングは任意ではなく、WordPressがあらかじめ用意してくれたいるタイミングの中から、フックプログラムを作る人が選択する形となります。


WordPressに用意されているフックの種類は2つ

WordPressはフックを2種類用意しています。
その2つとはアクションフックと、フィルターフックです。

1.アクションフック

アクションフックというのは、WordPressページを表示する過程の、特定のタイミングで追加の処理を追加することができます。アクションフックは処理を差し込むだけですので、アクションフックの戻り値はありません。

アクションフックはWordPressが用意していいる、add_action()関数を使って登録します。
WordPress自体がPHPで作成されているため、フック処理ももちろんPHPのプログラムとして作成します。
関数は以下の形式で記述します。

add_action( 'フックさせたい場所の名前', 
            '呼び出してほしい関数名', 
            優先順位[省略可能],
            引数の数[省略可能] );


アクションフックは、function.phpに記述します。
フックは”どのタイミングで”、”何を実行してほしいか”を指定する必要があるため、最初の二つは必須です。

3つ目と4つの引数である、優先順位、引数の数は省略可能です。
優先順位というのは、同じフックポイントで複数のアクション/フィルターが登録された場合、WordPressがどの順序で呼び出すかよいかを判定するための順序です。数字が小さいほうが優先度が高く、同じ番号を複数指定された場合はadd_action/add_filterで先に登録されたフックのほうが優先して実行されます。優先順位は省略すると10になります。

引数の数、登録したいフック関数の引数の数で、省略すると1が指定されたとみなされます。


2.フィルターフック

もう一つのフックであるフィルターフックは、WordPressが元々行っている処理の結果を差し替える場合に使用します。もっと具体的に言うと、WordPressの特定の変数を書き換えるための仕組みです。
書き換えた後の値(=フィルタ後の値)はフィルターフック関数の戻り値としてWordPress本体に返します。
フィルターフックの登録は、add_filter()関数を使用します。

呼び出し形式は以下のような形です。関数名が違うだけで、引数はadd_action()と同じです。

add_filter( 'フックさせたい場所の名前', 
            '呼び出してほしい関数名', 
            優先順位[省略可能],
            引数の数[省略可能] );





アクションフックと、フィルターフックである、add_action()とadd_filter()の違いをまとめると、WordPress上の処理にいおいて処理が追加されるか?と、既存の処理を差し替えるか?です。


フック処理を利用すると何ができるか?

フック処理を利用することで、WordPressの本来の処理を変更することができます。
例えば、以下のようなことができます。
  • タイトルの入力欄の変更を行う。
  • 管理画面に項目を追加する。
  • 記事の内容(content)を差し替える。


WordPressで用意されているプラグインを入れると上記の様なことが行えると思いますが、これと同じことを自作することができます。(プラグイン自体がフック機能を使って実装しているので当たり前のことですね…)

試しにフック処理を作ってみる

では試しにフックを作ってみましょう。
今回は簡単に、タイトル入力欄の変更を行ってみます。

タイトル入力欄というのは、WordPressで新規投稿を行う際に出てくる、タイトル未入力時に表示される下記の赤枠内のメッセージの事です。



下記のプログラムを,function.phpのファイル名で保存してください。

<?php
function test_change_title( $name ) {
	$curr_screen = get_current_screen();
	if ( $curr_screen->post_type == "post" ) {
		$name = "タイトルを30文字以内で入力してください";
	}
 
	return $curr_screen;
}
 
add_filter( "enter_title_here", "test_change_title" );

 
今回は、test_change_title()というフック関数を作成しました。
関数名はなんでもよいですが、WordPressが最初から用意している関数の名前と重なるとエラーになってしまいます。サイトの名前を関数名の先頭につけるなどして、WordPressの関数名と重複しないようにしてください。

また今回のサンプルではフィルタフックを使っているのですが、フィルタフック(add_filter)の場合は、returnでフィルタ後の値を返す必要があるので、注意して下さい。


フック関数を作ったらadd_filter()でフック関数を登録します。
第一引数は、enter_title_hereとありますが、これはWordPress側で使用できる名前(=フック処理を挿入可能な場所)があらかじめ決められています。
第二引数は、先ほど作った関数の名前を指定します。

上記のプログラムが実行されると、先ほど”ここにタイトルを入力”となっていたのが、以下のようにメッセージが変わります。


本フックはあまり有用ではないですが、コンピュータに詳しくない人が記事投稿を受け持っている場合など、わかりやすいメッセージに変えてあげると親切かもしれません。例えば製品一覧のページを作っているのであれば、”製品名を入力してください”に変えるなどしておくとわかりやすいです。

フック処理の実装

アクションフック、フィルターフックに関する処理はWordPressのコアファイルである wp-includes/plugin.phpで実装されてい明日。
ファイル名はplugin.phpとなっていますが、WordPressのコアファイル内でもこの仕組みは利用されています。またテーマに入っているfunction.phpからもこの機能を利用している場合もあります。

フック処理がどのように実装されているかは、下記の書籍の2章に詳しく書かれています。他にもWordPressの仕組みが詳しく書いてあるので、プラグインを作る必要がある場合は一冊持っておくと良いです。。
詳解 WordPress

アクションフック/フィルタフックの探し方

WordPressには数多くのフックが準備されています。
自分が求めているタイミングでフックがあるかをまず探すことになるのですが、どのようなフックがあるかの一覧は、WordPressドキュメントのCodexで探すことができます。
フック名をクリックすると説明が表示されるのですが、ほとんどのフックは翻訳されていないため、横にあるenというリンクをクリックしてください。英語ですが説明が表示されます。
プラグイン API/アクションフック一覧

プラグイン_API/フィルターフック一覧


また、過去のバージョンごとのフック一覧は、下記のサイトで確認すると簡単です。
こちらのサイトではWordPressのバージョンアップに伴い、追加/削除されたフックの一覧や、該当のアクション・フィルタフックがWordPressコアファイルのどこから呼び出されているかを確認することができます。
WordPress Hooks Database

上記のドキュメント以外にWordPressのソースから調べることもできます。

add_action, add_filterで登録した関数は、WordPressのコアファイルから呼び出されています。
コアファイル側は、do_action(), apply_filters()関数で登録されたフックを実行しているので、この関数名とフック名で検索すると見つかります。
プログラムが読める方は、どのタイミングでフック処理が実行されているかや、各フック処理が何の引数を渡してもらえるかを確認できます。

サイトの拡張性を飛躍的に高める WordPressプラグイン開発のバイブル

[WordPress]Custom Post Type UIでタグとカテゴリをカスタム投稿タイプへ追加する方法

WordPressではCustom Post Type UIプラグインを使用することで、簡単にカスタム投稿タイプを作ることができます。
作成したカスタム投稿タイプに対して、通常の投稿と同様に、タグやカテゴリを作りたい場合の手順を説明します。


カスタム投稿タイプで、カテゴリを管理できるようにする


CPT UIのメニューより、 Add/Edit Taxonomiesをクリックします。
Taxonomiesの読み方は”タクソノミー”で、分類方法という意味です。


タクソノミーの追加タブのBasic Settingより、Slug,Labelの指定を行います。


次にAdditional labbelsより、メニューの名前を指定します。
メニュー名が英語のまま(Category)でも問題ない場合、ここは指定不要です。


最後にSettingより、HierarchicalをTrueに変更します。
ここをTrueにする理由は、カテゴリは階層化が可能な為です。



登録すると、カスタム投稿タイプにカテゴリが追加されました。



カスタム投稿タイプで、タグを管理できるようにする

タグ管理機能の追加も、カテゴリの管理とほぼ同じ手順で行えます。


先ほどと同様に、タクソノミーの追加タブのBasic Settingより、Slug,Labelの指定を行います。


メニューの名前の指定も同じです。


最後にSettingの、HierarchicalはFalseのままにしておきます。


登録すると、カスタム投稿タイプにカテゴリが追加されました。


これで、タグも追加されました。



Custom Post Type UIの管理画面で設定を確認する

Custom Post Type UIにて設定を行った場合、CPT-UIの管理画面から設定値を確認できます。
それぞれ以下のような設定値になっていればOKです(クリックで拡大します)。

カテゴリ:


タグ:


タクソノミーの定義はDBのどこに格納されるか

通常Wordpressを使用する上では知っておく必要のない知識ですが…
Custom Post Type UIでタクソノミーの定義を行った場合、定義内容はwp_optionsテーブルに格納されています。

option_nameはcptui_taxonomiesですので、下記のSQLで検索できます。
select * from wp_options where option_name =’cptui_taxonomies’;


データは以下のような感じになっています。


[RFC 7519] JSON Web Tokenが正しいか、Web上でチェックできるサイト

JWT.IOは、RFC 7519で規定されたJSON Web Tokenのデータが正しいかを確認できるサイトです。
JSON Web Tokenというのは、公開鍵認証を利用してサーバ間の認証機能で、大手では、AWSのAmazon API Gatewayなどでも利用されています。

JWT.IO


以下のような感じで、エンコードされた文字列と、認証用の公開鍵を入力することで、Web TokenがValidがInvalid化を判定してくれます。



Webを支える技術