レコード毎のINSERT文になるようにmysqldumpでダンプする方法

先日、WordPressで作成したサイトのサーバ移設作業をしていたのですが、mysqldumpで作成したダンプファイルを移設先サーバのMySQLにロードしようとしたところ、「Got a packet bigger than ‘max_allowed_packet’ bytes」というエラーが出ました。

解決策を調べたところ、MySQLサーバの「max_allowed_packet」という値を変更する方法が見つかったのですが、今回その方法は使えませんでした。mysqldumpで生成したダンプファイルのエラーになった箇所を調べたところ、大きいテーブルのすべてのレコードをひとつの「INSERT INTO」文によって挿入するようになっていたため、この文のサイズが「max_allowed_packet」を超えているのがエラーの原因であることがわかりました。

そこで、mysqldumpでダンプファイルを生成するときに、レコード毎のINSERT文にする方法を調べました。具体的には、

のように生成されるのを、

のように生成されるようにする方法です。

その方法ですが、mysqldumpを実行するときに、「--skip-extended-insert」というオプションを付けるだけです。例えば、以下のように実行します。

このように生成したダンプファイルの難点は、ロードするのに時間がかかることですが、場面により、適宜使っていこうと思います。

WordPressで日本語名のファイルをアップロードするには

お客様から「日本語名のファイルをアップロードしようとしたらファイル名が文字化けしてしまった、どうにかならないか」とお問い合わせをいただき対策を行いました。

WP Multibyte Patch プラグインが影響

「WP Multibyte Patch」プラグインを有効化しているため起こった現象でした。「WP Multibyte Patch」プラグインを有効化していると、日本語のファイル名を md5ハッシュ値に変換するためだそうです。正確には文字化けではなく変換されたハッシュ値のようです。

対策

以下の通り、設定変更を行いました。

  1. wp-content/plugins/wp-multibyte-patch/wpmp-config-sample-ja.php を wp-content にコピーします。
  2. wp-content にコピーした wpmp-config-sample-ja.php を wpmp-config.php というファイル名に変更します。
  3. wpmp-config.php から $wpmp_conf[‘patch_sanitize_file_name’] の行を探し、値を「true」から「false」に変更します。

参考

以下のリンクを参考にさせていただいました。
WordPressで日本語のファイル名をアップロードする方法

Linuxをメインの作業環境としていると「ファイル名は英数字」と固定観念があり全く気づきませんでした。調べてみたところ、立ち上げ時にアップロードしたファイルはすべて英数字になっていました。習慣ってすごいですね。

WordPressで投稿した記事を自動的にTwitterに投稿するには

WordPressで投稿した記事を自動的にTwitterに投稿する方法です。
上記の機能を実現するプラグインはたくさんありますが、画像を一緒に投稿できる NextScripts: Social Networks Auto-Poster プラグインを使用しました。

プラグインのインストールと設定

  1. NextScripts: Social Networks Auto-Poster プラグインをインストールします。
  2. インストールが完了したら、サイドメニューの「設定」→「{SNAP} Social Networks Auto Poster」をクリックします。
  3. 連動するTwitterアカウントを登録します。「Add new account」をクリックします。
  4. 「Add NEW Network」から「Twitter」を選択します。
  5. Twitterアプリケーションの情報を入力します。
    ※事前にTwitterアプリケーションを作成しておく必要があります。Twitterアプリケーションの作成方法
  6. 連動するために作成されたTwitterアプリケーションをクリックします。
  7. 「Keys and Access Tokens」タブをクリックします。「Consumer Key(API Key)」および「Consumer Secret(API Secret)」に記載された情報をWordPressの設定に入力します。更に、画面をスクロールして「Your Access Token」にある「Create my access token」ボタンをクリックします。「Access Token」と「Access Token Secret」に記載された情報をWordPressの設定に入力します。

    Twitterに画像も一緒に投稿する場合は、WordPressの設定画面で「Attach Image to Twitter Post」をチェックします。

    すべての入力が完了したら「Update Settings」ボタンをクリックします。
  8. アカウントが追加されたことを確認してください。
  9. WordPressから投稿してTwitterに自動的に投稿されれば設定完了です。

Twitterアプリケーションの作成方法

Twitterアプリケーションは https://dev.twitter.com/ から作成します。
※Twitter ホームの「開発者」をクリックすると同じところに移動します。

  1. 画面右上の「My apps」をクリックします。
  2. 画面右上の「Create New App」をクリックします。
    ※既に登録済みのアプリケーションがある場合はその一覧も一緒に表示されます。
  3. 各項目を入力します。入力が完了したら、画面左下の「Developer Agreement」をチェックして「Create your Twitter application」をクリックします。

    ※Twitterアカウントに「携帯の電話番号」が登録されていない場合はエラーになります。
    その場合は、Twitterアカウントの「設定」→「モバイル」の「携帯の電話番号」に電話番号を追加してから有効化されたのを確認して、再度、設定してみてください。
  4. アプリケーションが一覧に作成されれば作成完了です。

GitLabのサーバ移設

GitLabを別のサーバに移設しました。その際の手順を以下にまとめます。
前提条件として、移設元のGitLabと移設先のGitLabがOmnibusパッケージからインストールした同じバージョンのものであるとします。
この条件の元だと、簡単にサーバ移設ができました。

まず、移設元サーバで、以下のコマンドにより、バックアップを作成します。

バックアップが作成されるのは、gitlab.rb の以下の場所に定義されているディレクトリです。
該当の行がコメントアウトされていれば、デフォルトの場所に保存されます。

実行したところ、「1480838198_gitlab_backup.tar」というファイルが作成されました。

次に、移設先サーバにバックアップファイル(「1480838198_gitlab_backup.tar」)を移設元サーバからコピーして、移設先サーバの gitlab.rb の「backup_path」で定義されている場所に置きます。

以降は移設先サーバでの作業になります。

まず、コピーしたバックアップファイルに対して、すべてに「read」のパーミッションを付けておきます。

次のコマンドで、データベースに接続しているプロセスを止めます。

プロセスが止まっているか確認します。

バックアップファイルからリストアします。「BACKUP=」の引数はバックアップファイルのタイムスタンプで、今回のバックアップファイルの場合は「1480838198」になります。

GitLabをリスタートして、チェックを実行して、動作を確認したら、終了です。

expectコマンドを使用してscpの実行をCronで実装するには

パスワード認証のsshサーバからscpでファイルをコピーする作業は、手動の場合は非常に単純なものです。しかしこれをCronで実装するには、対話型でパスワードの入力を求められるため、作成するシェルスクリプトに少し工夫が必要です。

このような場合、expectコマンド(対話型アプリケーションの自動化)を使用して、シェルスクリプト中で「パスワードの入力を行う」処理を行います。
expectコマンド
まず前提として、転送元ファイルが置いてあるサーバ名をcrestとします。アカウント名をcrest-user、転送元ファイルが置いてあるディレクトリを/home/crestとし、コピーするファイル名をexm.txtとします。また、転送先のPC名をbozとします。転送先のディレクトリを/home/bozとします。boz上でファイルをコピーしてくるシェルスクリプトをCronで動作させます。

シェルスクリプトは以下のようになります。

このシェルスクリプトは、コマンドラインでは問題なく実行できます。そのため、このままCronで動作させようとしたのですが、うまく動作しませんでした。ログインとCronでは動作環境が異なるため起こる現象のようです。そのような場合は、20行目の「interact」を「expect eof exit」に変更します。

シェルスクリプトにはパスワードを記述するため、アクセス制限されたネットワークでの使用に限るなど、セキュリティ上、十分に注意する必要があります。

MySQLのTEXT型データで大文字と小文字を区別できるようにするには

既に使用を開始しているシステムで、TEXT型で定義しているデータの大文字と小文字を区別しなければならなくなりました。その時に調べた内容のまとめです。

まず、非バイナリ文字列とバイナリ文字列の性質の比較です。

文字列の種類 文字列検索 大文字/小文字の区別
非バイナリ文字列 CHAR、VARCHAR、TEXT 比較オペランドの照合順序
を使用
なし
バイナリ文字列 BINARY、VARBINARY、BLOB オペランドのバイトの数値
を使用
あり

参照:B.5.5.1 文字列検索での大文字/小文字の区別

バイナリ文字列に区分されている型を使用していれば問題なかったのですが、既に使用を開始していたため、TEXT型のまま大文字と小文字を区別できるようにしました。

まず前提として、「exmtable01」という名前のテーブルがあるとします。

exmtable01のテーブル定義情報は以下のようになっています。

valueフィールドの型を「TEXT BINARY」に変更します。

そうすると、exmtable01のテーブル定義は以下のように変更されます。

以上の変更により、TEXT型でも大文字と小文字を区別することができるようになりました。

また、テーブルを作成する時に「TEXT BINARY」を指定すると同様の定義となります。

phpMyAdminを使用している場合は、変更したいフィールドを選択し属性を「binary」に指定すれば、同様の変更を行うことができます。

Sambaサーバ(パスワード認証なし)を立ち上げるには

Windows からパスワード認証なしでアクセス可能な Sambaサーバを立ち上げました。
環境
OS はLinux(Ubuntu 14.04LTS) を使用しました。必要なアプリケーションおよび今回使用したバージョンは以下の通りです。

名称 バージョン パッケージ
Samba 2:4.1.6+dfsg-1ubuntu2.14.04.8 Samba

設定および手順
Samba パッケージをインストール後、以下の設定を行います。
例として、ホスト名を Crestboz とし、/home に public ディレクトリを作成します。

  1. 公開用の共有ディレクトリ public を作成します。
  2. /etc/samba/smb.conf の設定を変更します。
    ● [global] の設定を追加および変更
    ※1「XX.XX.XX.0/25」の部分は、アクセス制限する IPアドレスを記述。
    ※2 認証なしとするため、ゲストアカウントでの接続とする。
    ● 公開ディレクトリ public の設定を追加
    ファイルの最後尾に以下を追加します。
    ※1 共有ディレクトリのパスを指定。
    ※2 ファイルの修正可。
    ※3 ゲストユーザとしてアクセス可。
    ※4 ゲスト接続のみ許可。
    ※5 ファイル作成時に付与されるパーミッション。
    ※6 ディレクトリ作成時に付与されるパーミッション。
  3. Sambaを再起動します。

Windows からのアクセス

  1. ネットワークを表示します。
    Sambaサーバのホスト名「CRESTBOZ」が表示されますので、ダブルクリックします。
    Windowsネットワーク01
  2. 共有ディレクトリ「public」が表示します。
    ダブルクリックすると、ディレクトリに保存されているディレクトリおよびファイルを表示します。
    Windowsネットワーク02

アンケートシステム LimeSurvey をローカルPCで立ち上げるには

オープンソースとして公開されている LimeSurvey をローカルPCにインストールして立ち上げました。
作業は、LimeSurvey Manual を参考に行いました。

環境
OS はLinux(Ubuntu 14.04LTS) を使用しました。必要なアプリケーションおよび今回使用したバージョンは以下の通りです。

名称 バージョン パッケージ
Apache 2.4.7-1ubuntu4.5 apache2
MySQL 5.5.44-0ubuntu0.14.04.1 mysql-server
PHP 5.5.9+dfsg-1ubuntu4.11 php5
PHP GD ライブラリ 5.5.9+dfsg-1ubuntu4.11 phpt5-gd
PHP MBString ライブラリ 5.5.9+dfsg-1ubuntu4.11 libapache2-mod-php5
PHP LDAP ライブラリ 5.5.9+dfsg-1ubuntu4.11 php5-ldap
PHP imap ライブラリ 5.4.6-0ubuntu5 php5-imap

php5-imap パッケージをインストールしたら、以下を実行します。

ダウンロードおよび前提
LimeSurvey をダウンロードして解凍します。LimeSurvey2.05plus日本語対応版
解凍したソース(LimeSurvey ディレクトリ)は /var/www に置きます。
(省略しますが、これに合わせて Apache の設定を行ないます。)

以下のディレクトリのパーミッションをすべて777とします。
(マニュアルには775との記述がありましたが、775ではエラーになりました。)

  • /var/www/limesurvey/tmp
  • /var/www/limesurvey/application/config
  • /var/www/limesurvey/upload

手順

  1. ブラウザで http://localhost/limesurvey/admin にアクセスします。
  2. 言語で「日本語」を選択し、「インストール開始」ボタンをクリックします。
    LimeSurveyインストール01
  3. ライセンスの確認画面が表示します。
    「同意する」ボタンをクリックします。
    LimeSurveyインストール02
  4. システム構成のチェックが行われます。
    問題なければ「次へ」ボタンをクリックします。
    LimeSurveyインストール03
  5. データベースの情報を入力します。今回は既存のデータベースを使用しました。
    情報を入力したら「次へ」ボタンをクリックします。
    LimeSurveyインストール04
  6. データベース設定の確認画面が表示します。
    「データベースを作成する」ボタンをクリックします。
    LimeSurveyインストール05
  7. オプション設定の入力画面が表示します。
    必要な部分を変更して「次へ」ボタンをクリックします。こちらについては、後からでも変更可能です。
    LimeSurveyインストール06
  8. インストール成功画面が表示します。
    管理画面を表示する場合は、「管理」ボタンをクリックします。
    LimeSurveyインストール07
  9. 管理画面が表示します。
    LimeSurveyインストール08

WordPressプラグイン「FancyBox for WordPress」がうまく動作しない場合の対応

弊社のホームページですが、画像の表示にWordPressのプラグイン「FancyBox for WordPress」を使用しています。WordPressのマルチサイト機能を使って、複数のサイトを管理しているのですが、「FancyBox for WordPress」がサイトAでは動作しているのに、サイトBでは動作していないという現象が起こりました。

いろいろ調べたところ、複数のプラグインをインストールするとjQueryが多重ロードされてしまい、それが競合して動作しなくなってしまう場合があるようです。

「FancyBox for WordPress」には、設定で項目をチェックするだけで多重ロードを避けてくれる便利な機能があります。私のような初心者にはとても助かります(^-^)

設定の変更方法です。

  1. 設定の変更を行うサイトのダッシュボードを開示します。
  2. メニューの[設定]→[Fancybox for WP]をクリックします。

    WordPress

  3. 設定画面が開示したら「Troubleshooting」タブを選択します。「Skip jQuery call.Use this only if jQuery is begin loaded twice(default: off)」にチェックし、「Save Changes」ボタンをクリックします。

    FancyBox設定画面

  4. 設定を変更しても現象が変わらない場合は、「Revert to defaults」ボタンをクリックして設定を初期化します。

WordPressで作成したページのサイドバーをページ毎に変更するには

まず、全てのページに共通のサイドバーを表示する方法です。

  1. サイドバーに表示する内容を記述した wp-content/themes/(テーマ)/sidebar.php を作成します。
  2. get_sidebar()関数をコールします。

次に、ページ01 とページ02 に別々のサイドバーを表示する方法です。
ページ01 には sidebar-pat01.php に記述された内容を、ページ02には sidebar-pat02.php に記述された内容を表示するものとします。

  1. wp-content/themes/(テーマ)/sidebar-pat01.php および wp-content/themes/(テーマ)/sidebar-pat02.php を作成します。
  2. 引数を指定して get_sidebar()関数をコールします。引数は、sidebar-{name}.php の {name} の部分になります。