さくらのmysqlで大きなファイルをインポートしたら後半のデータが文字化けした

サクラインターネットのレンタルサーバーをプラン変更したとき、古いデータベースサーバーから新しいデータベースサーバーにデータを移行する必要があった。古いデータを mysqladmin から sql ファイルとしてエクスポートして、新しいデータベースサーバーへはターミナルで接続して source コマンドでエクスポートした。

すると、いくつかあるテーブルの内、後半のテーブル内のデータが文字化けする現象に遭遇した。インポート中のターミナル画面を見ていると気になるエラー?を発見。

--------------------------------------------
Query OK, 870 rows affected (0.02 sec)
Records: 870 Duplicates: 0 Warnings: 0

ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...

Query OK, 850 rows affected (0.02 sec)
Records: 850 Duplicates: 0 Warnings: 0
--------------------------------------------

いったんデータベースサーバーへの接続が切断されて、その後再接続が行われている。そして、その再接続後から文字化けが起こっている?

このエラーは、インポートするデータが大きすぎると起こるらしい。

自分でいじれるサーバーであれば、max_allowed_packet の値を上げることで解決できるようだが(参考)、さくらの自分のプランでは、my.cnf をいじることができないため通用せず。

mysql の文字コードを確認してみる。

//コマンド
-------------------------------
mysql> show variables like "chara%";
-------------------------------

+--------------------------+----------------------------------+
| Variable_name | Value |
+--------------------------+----------------------------------+
| character_set_client | ujis |
| character_set_connection | ujis |
| character_set_database | ujis |
| character_set_filesystem | binary |
| character_set_results | ujis |
| character_set_server | ujis |
| character_set_system | utf8 |
| character_sets_dir | /usr/local/share/mysql/charsets/ |
+--------------------------+----------------------------------+

utf8 のデータだが、設定されている文字コードは ujis が多い。文字コードを変更する最も一般的な方法は my.cnf を書き換えることだが自分のプランではできない。ターミナルで mysqlサーバーへログインするときに 文字コードを指定してみる。

//ターミナルで文字コードを設定
-------------------------------
mysql -u ユーザー名 -p -h ホスト名 --default-character-set=utf8
-------------------------------

//設定後
+--------------------------+----------------------------------+
| Variable_name | Value |
+--------------------------+----------------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | ujis |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | ujis |
| character_set_system | utf8 |
| character_sets_dir | /usr/local/share/mysql/charsets/ |
+--------------------------+----------------------------------+

character_set_database は use でデータベースを選択すると、データベースの文字コードになる。

//最終的にこうなった
+--------------------------+----------------------------------+
| Variable_name | Value |
+--------------------------+----------------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | ujis |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | ujis |
| character_set_system | utf8 |
| character_sets_dir | /usr/local/share/mysql/charsets/ |
+--------------------------+----------------------------------+

この状態で sql ファイルを source で実行したら文字化けは起こらなかった。

さくらサーバーでpearのインストール 2016年10月版

さくらのレンタルサーバーをプラン変更した際、 pear の再設定に手間取ったので覚書。
php ファイル で、DB ライブラリとPager ライブラリを利用しているため、それぞれを利用可能にする必要があった。さくらのレンタルサーバーには、もともと pear がインストールされているが件のライブラリ は入っていない。もともと入っている pear は共有部分のに入っているため、ライブラリをインストールするには、 pear 自体も ローカル部分にインストール必要があった。

1.さくらサーバーに pear のインストール

pear のインストール方法はいくつかあるが、今回は go-pear を使った。
go-pear は古くてインストール途中で止まるものがインターネット上にたくさんある。

2016年10月3日現在有効な pear-go

上記リンクを右クリックして www フォルダ以下に「go-pear.php」という名前で保存。その後、ブラウザからアクセスする。

設定項目を埋めて、インストールボタンを押す。設定項目のインストール先は www フォルダ(Installation prefix($prefix))直下がデフォルトのようだが、移行元の pear が「/home/ユーザー名/」の直下だったので、同じようにした。

設定の参考にしたページ こちら

インストールは無事完了したが、Warning が出た。

----------------------------------------------
Warning: Can not determine the URL of the freshly installed Web Frontend
(file: /home/ユーザー名/index.php).
Please access it manually !
----------------------------------------------

これは「インストール後に生成された index.php ファイルが www フォルダより上にあるためアクセスできないよ」という内容のもの。ブラウザからライブラリをインストールするには、index.php へのアクセスが必要なので、www フォルダ直下に「gopear」というフォルダを作って、index.php ファイルをコピーした。

2.ライブラリのインストール

ライブラリをインストールするにはターミナルから操作する方法と 件の index.php へアクセスして操作する方法がある。

最初ターミナルからサーバーにログインしてコマンドを実施した

//DB ライブラリをインストールするコマンド
------------------------
% pear install -a DB
------------------------

インストールできたかは list でパッケージの一覧を取得すればいい
------------------------
% pear -c /home/acount_name/pear.conf list
------------------------
※pear.conf info のところが .pearrc になっている場合があるかも?find /home/acount_name -name '*pear*' で対象のファイルがあるか確認するといい。
※ -c file の詳細は pear help options で確認できる

これだとさくらサーバーに最初からある pear の情報が出る
------------------------
% pear list
------------------------

すると、エラーが出てインストールできなかった

//エラー内容
------------------------
Cannot install, php_dir for channel "pear.php.net" is not writeable by the current user
------------------------

書き込みができないという内容。どうもインストールを実施しようとしている pear が、さくらサーバーにもともとインストールされている pear らしい。

//pear のバージョンを調べるとどの pear に対して命令しているのか分かる
------------------------
% pear info PEAR
------------------------

自前のpearならこれ
------------------------
% pear -c /home/acount_name/pear.conf info PEAR
------------------------

自分でインストールした pear に対して命令してもいいが、index.php からライブラリをインストールする方法に変更。

pear インストール時に生成された index.php にブラウザからアクセス。
画面の右上にある「Search package by name」から、DB と Pager を検索してインストール。
DB と名前の入るライブラリがたくさんあって、検索結果が出るまで時間がかかった。読み込み中がずっと続いたのであせった。

インストールできたら、ドキュメントルートの php.ini を変更してpear を include して使う。

jQuery ui の dialog を最善面にする

jQuery ui の dialog が下に回り込んで見えなくなることがある。最善面にする方法は次のとおり。

css に設定する
-------------------------------
.ui-dialog { z-index: 1000 !important ;}
-------------------------------

z-index の値を大きくするほど前面に出る。

【Jquery】右クリックでイベントを発生させる

右クリックでイベントを発生させる記述

---------------------------------------
$(document).on('contextmenu', 'セレクター名', function() {

//イベントに対応して行うべき処理を記述

return false; //右クリックメニューを出さない処理

});
---------------------------------------

もしくは

---------------------------------------
$(document).bind('contextmenu', 'セレクター名', function() {

//イベントに対応して行うべき処理を記述

return false; //右クリックメニューを出さない処理

});
---------------------------------------

bindだと、ajax等で変更した要素にはイベントが発生しないので注意。

なお、contextmenu(コンテキストメニュー) とは、右クリックで出てくるメニューのこと。

textareaで一部の文字だけ装飾する

textareaで一部の文字だけ装飾する方法をネットで調べると Jquery を使った方法がいくつか見つかった。しかし自分のしたかったものとはちょっと違った。見つかった方法のソースをいじって自分のやりたかったことができればいいのだが、そこまで詳しくなので、理解するの時間がかかって面倒くさい。

で、タイトルとちょっと違うのだが、html や css で装飾した文字を textarea の文字のように簡単に編集できる方法を発見。やり方も超簡単だったので採用した。

サンプル

この文字は直接編集できます。textarea は使っていません。

html
--------------------------------
<div id="box" contenteditable=true>この文字は直接編集できます。textarea は使っていません。</div>
--------------------------------

css
--------------------------------
#Box {
border: 1px solid #999;
width:300px;
height:100px;
}

.font1 {
color: red;
}

.font2 {
color: blue;
}

.font3 {
font-weight: bold;
}
--------------------------------

大事なのは「contenteditable=true」の部分のみ。これは html5 の属性。たったこれだけで box 内の装飾された文字を、あたかも textarea 内に書かれた文字のように編集できる。

【css】フッターの文字を上下左右ともにセンタリング

フッターの文字を上下左右ともにセンタリングしたときの覚書

左右のセンタリングだけだと、footer にtext-align を指定するだけで簡単だった。上下のセンタリングだけも display: table-cell が有効だった。しかし、footer の width が 100% では、margin:0 auto が効かず、text-align と vertical-align の両立にてこずった...。

css
--------------------------------------------
#footer {
text-align:center; /* footer 内の div を左右中央にする */
border-top: 1px solid #009933;
background: #fff;
width:100%;
height: 30px;
box-sizing: border-box; /* パディングとボーダーを幅と高さに含める */
clear: both; /* 2カラム解除 */
}

#footer > div {
/* text-align:center を有効にするため inline 化 */
display: inline-block;
background: #999; /* 幅を視覚化するために色をつけている */
}

/* 上下のセンタリング */
#footerText {
height: 30px; /* footer と同じ高さを指定 */
display: table-cell;
vertical-align: middle;
}
--------------------------------------------

html
--------------------------------------------
<div id="footer">
<div>
<div id="footerText">フッターの文字</div>
</div>

</div>
--------------------------------------------

【秀丸エディタ】マクロで正規表現を使った置換をする

秀丸エディタのマクロで正規表現を使った置換をする記述

-----------------------------------------
//正規表現を使った置換を実行
replaceallfast"パターン","置換後の文字",regular;
-----------------------------------------

「.mac」などの拡張子で保存して、「マクロ」-「マクロ実行」からファイルを選択する

---メモ---

replacedown → 下方向に置換する
replaceup → 上方向に置換する
replaceall → すべて置換する
replaceallfast → すべてを高速に置換する

regular は正規表現を使うためのオプション。省略した場合は正規表現なしの置換になる。

//エスケープは¥¥ 例: 「.」ではじまる文字列
replaceallfast"^¥¥..*$","",regular;

//後方参照は¥¥1

【秀丸エディタ】マクロでのコメントアウト

秀丸エディタでマクロファイル内で使用できるコメントアウトの覚書

//一行のコメントです

/*

複数行の
コメントです

*/

【秀丸エディタ】正規表現で改行を含む一行を丸々削除する

秀丸エディタの正規表現で、改行をふくんだ一行をまるまる削除する記述

正解
------------------------------------
^なんらかパターン¥n
------------------------------------

以下のやり方だと改行が残ってしまうのでダメ

×
------------------------------------
^なんらかパターン$
------------------------------------

×
------------------------------------
^なんらかパターン¥n$
------------------------------------

jQuery uiのdialogでタイトルに変数を使って更新させる

jQuery ui の dialog で タイトルを設定する場所は主に二箇所ある。

ひとつは jQuery ファイル内
---------------------------
//jQuery_ui の詳細設定
$('#dialog').dialog({
autoOpen: false,
width: 600,
title: 'ここがタイトルになる',
modal:false,
resizable:false,
buttons: {
"元に戻す": function() {
//$(this).dialog("close");
alert('元に戻す');
},
"閉じる": function() {
$(this).dialog("close");
}
}
});

---------------------------

もうひとつは html(PHP)ファイル内
---------------------------
<div id="dialog" title="ここがタイトルになる">
<p>ここがダイアログの内容</p>
</div>
---------------------------

二箇所どちらにもタイトルを設定すると jQuery ファイルの情報が優先される。

このたび、タイトルに変数を用いて、条件によってタイトルの内容を変更したかったのだが少し苦戦した。上記二箇所をいじってもタイトル文章がうまく更新できなかったのだ。
結論だけ言うと、タイトルはオプションを使っても指定できる。

jQuery ファイル内でダイアログのタイトルを上書き
---------------------------
$('#dialog').dialog('option', 'title', '新しいタイトル');
---------------------------

ここに変数を持ってきて、希望通りに表示できた。

参考サイト

1 / 212