MySQLのload data infile文で文字化けする場合の対策

システムおよびデータベースの文字コードはすべて utf-8 を使用する前提とします。

既存のシステムからデータを移行するために「load data infile」文を使用すると、読み込んだデータが文字化けしてしまう場合があります。

原因は、「character_set_database」が utf-8 に設定されていないためです。
「load data infile」文は「character_set_database」の設定に従います。

「character_set_database」の設定を確認します。

以上のように出力された場合、「character_set_database」の設定は「latin1」となっているため、「utf8」に変更します。

もう一度「character_set_database」の設定を確認します。

「character_set_database」が「utf8」に変更されたため、文字化けを回避できます。

関連記事:PostgreSQL(EUC_JP)からMySQL(UTF-8)へのデータ移行

bashの脆弱性への対応(Ubuntu)

先週よりbashの脆弱性がニュースになっています。
GNU bash の脆弱性に関する注意喚起

弊社でも以下の通り対応を行ないました。

  • アップデートを実行
  • パッチのバージョンを確認

パッチのバージョン情報は以下のページにあります。
USN-2364-1: Bash vulnerabilities

MySQLでtext型の列にインデックスを作成する

MySQLでtext型の列にインデックスを作成する場合、サイズを指定する必要があります。

例えば、以下の内容のテーブルを作成します。

サイズの指定をせずにインデックスを作成するとエラーになります。

そこでサイズを指定します。
以下の指定では、name列の最初の100文字を使用したインデックスが作成されます。

PaaSの簡単な比較

PaaSがいくつかあるのですが,どれがいいのかよくわからなかったので,比較のために簡単な表を作ってみました.個人的に気になった以下の項目についての表になっています.

  • 無料枠があるかどうか
  • オートスケールするか
  • カスタムドメイン(独自ドメイン)を使えるか
  • 使えるプログラミング言語およびフレームワークは何か

それぞれサービス内容が違うので単純に比較できるものではありませんが,少しでも参考になれば幸いです.

PaaS 無料枠 オートスケール カスタムドメイン 言語/フレームワーク
Google App Engine ※1 ※2 ※3 Go, Java, PHP, Python ※4
Heroku ※5 ※6 ※7 Java, Node.js, PHP, Python, Ruby ※8
OpenShift Online ※9 ※10 ※11 Java, Node.js, PHP, Python, Ruby, Perl ※12
Nitrous.IO ※13 × ※14 ※15 Ruby/Rails, Node.js, Python/Django, Go, … ※16
AWS Elastic Beanstalk ※17 ※18 ※19 Java, Node.js, PHP, Python, Ruby, .NET ※20
Windows Azure (Web sites) ※21 ※22 ※23 ASP.NET, Java, Node.js, PHP, Python ※24

※1 → [出典]
※2 → [出典]
※3 → [出典]
※4 → [出典]
※5 750 Dyno時間/月 → [出典]
※6 「Adept Scale」という add-on で対応可 → [出典1] [出典2]
※7 → [出典]
※8 → [出典]
※9 3 small gears → [出典]
※10 → [出典]
※11 → [出典]
※12 → [出典]
※13 150 N2O units → [出典1] [出典2]
※14 Nitrous.IO自体にオートスケールの機能はないが,別のPaaSにdeployできるので,deploy先のPaaSがオートスケールに対応していればオートスケールする. → [出典]
※15 「Shift」と「Turbo」プランのみ利用可能. → [出典]
※16 「Box Template」として用意されている分.他の言語も利用可能. → [出典1] [出典2]
※17 使用するAWS リソース(Amazon EC2,Amazon S3,…)に対する AWS 無料利用枠の範囲内は無料.ただし Amazon EC2 や Amazon S3 などの主なリソースの無料利用枠を使えるのは,AWS にサインアップした日から 12 か月間のみ. → [出典1] [出典2]
※18 → [出典]
※19 → [出典]
※20 → [出典]
※21 「Free」というレベルが用意されている. → [出典]
※22 「Standard」プランのみ利用可能. → [出典]
※23 「Shared」「Basic」「Standard」プランのみ利用可能. → [出典]
※24 → [出典]

自作テーマでプラグインが動作しない時の対策

WordPressでトップへ戻るボタンを作成しようと、「Dynamic To Top」および「Scroll Top and Button」プラグインをインストールしました。

動作せず…。

自作テーマで作成していたため、以下のコードが抜けていた事が原因でした。

  • header.php の </head> 直前に以下のコードを追加。

  • footer.php の </body> 直前に以下のコードを追加。

以上のコードを追加すると、ページ先頭にツールバーが表示されます。
そのため、
ダッシュボード : 「ユーザ」→「あなたのプロフィール」から「サイトを見るときにツールバーを表示する」
のチェックをはずして、ツールバーを非表示にしました。

データをダンプ、リストアするには(02)

最高気温予想36度、今日も伊勢崎は暑いです。
ここ数日は、暑さ+WordPressと戦っております。

以前、データをダンプ、リストアするには(01)を書きました。

その時は、ホスティングサービス上にデータをリストアしなければならなかったのですが、どうしてもダンプファイルをそのまま読み込むことができず、苦肉の策としてダンプファイルからINSERT文だけ取り出して何とかリストアしました。

かなりの力技だと思います…。
作業はなるべくスマートに行ないたいものです。

それでは本題です。

ダンプデータをリストアしようとすると以下のエラーが発生。

エラーの原因としては、ホスティングサービスで「LOCK」「UNLOCK」ができないことでした。

以前の記事で書いたように、以下を実行してダンプファイルを作成した場合、作成されたファイル中に「LOCK」「UNLOCK」が含まれます。

この場合は、作成したダンプファイルの「LOCK」「UNLOCK」をコメントアウトしてからリストアするとエラーになりません。

また、オプション「–skip-add-locks」を追加すると、「LOCK」「UNLOCK」を含まずダンプファイルを作成することができます。

こちらの方法であれば、作成したダンプファイルの修正も必要なく、修正によるミスも減らせますね。

PostgreSQL(EUC_JP)からMySQL(UTF-8)へのデータ移行

localeがUTF-8の環境でEUC_JPのデータベースを作成するの続きです。

テーブル数がそれほど多くない環境での作業です。
もっと良い方法があったらぜひ教えてください。

それぞれの環境は以下の通りです。
【旧システム】 PostgreSQL、EUC_JP(locale、データベースの文字コードとも)
【新システム】 MySQL、UTF-8(locale、データベースの文字コードとも)

まず、【旧システム】での作業です。

  1. テーブル毎にcsvファイルを作成します。例として、テーブル名をcrestboz、csvファイル名をcrestboz.csvとします。

    この時点で、crestboz.csvの文字コードはEUC_JPです。

  2. 作成したcrestboz.csvから、先頭のカラム名が記述された行と最後尾の行数が記述された行を削除します。
  3. ファイルの文字コードをUTF-8に変換します。

次に、【新システム】での作業です。

  1. データのインポート対象のテーブルが既存の場合はDELETEします。
    (*テーブルをDROPして作成し直すと、ID値がリセットされます。)
  2. csvファイルをインポートします。

    関連記事:load data infile文で文字化けする場合の対策

以上の作業を、データを移行するすべてのテーブルについて実行します。

URLをリダイレクトする

URLの変更があった場合に、指定されたURLにリダイレクトする方法です。

Google App Engine/Python でサブディレクトリ内のスクリプトを実行する

Google App Engine/Python でサブディレクトリ内のスクリプトを呼び出して実行する方法です.

アプリケーション用のディレクトリとして,helloworld ディレクトリがあり,その中のサブディレクトリ subdir の中にある helloworld.py のコードを http://○○○/hello/ というURLで呼び出したいとします.

helloworld.py は特に変わったことをする必要はありません.
例えば以下のようなコードだとします.
webapp2.WSGIApplication のところでURLと一致するように注意してください( '/hello/' の部分).

helloworld ディレクトリ内に app.yaml ファイルを以下のように作成します.

次に,サブディレクトリ subdir 内に __init__.py ファイルを作成します.
このファイルの中身は空で構いません.

以上で準備は終了です.

Google App Engine SDKを用いて,ローカルでテストしてみます.

helloworld ディレクトリのひとつ上のディレクトリで以下を実行します.
このとき,dev_appserver.py コマンドのある場所へPATHを通しておくか,dev_appserver.py コマンドをフルパスで実行してください.

ブラウザで http://localhost:8080/hello/ にアクセスすると,「Hello, World!」と表示されます.

問題なければ,Google App Engine SDKを用いて,コードをアップロードすれば終了です.

アップロード後,ブラウザで http://[アプリケーションID].appspot.com/hello/ にアクセスすると,「Hello, World!」と表示されます.

localeがUTF-8の環境でEUC_JPのデータベースを作成する

10年ほど前に作成した予約システムの新バージョンを作成しています。
それに伴い、データベースの移行作業を行なっています。

それぞれの環境は以下の通りです。
旧システム:PostgreSQL、EUC_JP
新システム:MySQL、UTF-8

作業の準備のため、localeがUTF-8の環境でEUC_JPのデータベースを作成しました。

単純に文字コードを指定して作成しようとしたところ、以下のエラーが出力されました。

そのため、以下のような実行でデータベースを作成しました。

データの移行作業については、追々書いていきたいと思います。