load data local infile で文字化け対応

MySQLのload data local infileの際に文字化けする対策
ポイントはcharacter_set_databaseパラメタを確認することでした

環境

  • MySQL 5.5.43
  • 文字コード utf8

テーブル作成

まずはUTF8でテーブルを作成します。なおデータベースエンジンにはInnodbを使用します

create table TEST(
  id integer not null,
  name varchar(32) null,
  kana varchar(32) null
)engine=innodb default charset=utf8
;

ファイルの確認

インポートするファイルの文字コードをUTF8にします

$ head TEST.txt |nkf --guess
UTF-8 (LF)

UTF8でない場合には以下のコマンドで変換します

$ cat TEST.txt |nkf -w > TEST.txt.utf8
$ mv TEST.txt.utf8 TEST.txt

データベースの設定

データベースの設定を確認します。なおmysqlコマンド起動時に –local-infile をつけないとload data local infileコマンドがエラーになります。5.5あたりからの仕様変更でしたっけ?

$ mysql -uroot -hlocalhost -ppassword --local-infile=1
mysql> show global variables like "character%";
+--------------------------+----------------------------+
| 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     | latin1                     |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.01 sec)


mysql> set global  character_set_database=utf8;

一時的に変更したい場合にはこちらのコマンドです。このセッションのみで有効です

mysql> set character_set_database=utf8;

インポート

それではインポートします

mysq>load data local infile "/path/to/file/TEST.txt" into table TEST;

これで文字化けせずインポートできます

ubuntu14.04のDockerのipアドレスを変更

dockerはdocker0インターフェースに自動で172.17.42.1のIPアドレスを割り当てます。
これで困るのが、実際のネットワーク上にこのセグメントがある場合。
dockerを起動したこのサーバに、リモートからアクセスできなくなります。

デフォルトの設定
# ifconfig
docker0   Link encap:Ethernet  HWaddr 56:84:7a:fe:97:99  
          inet addr:172.17.42.1  Bcast:0.0.0.0  Mask:255.255.0.0
          UP BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

そこで、docker0のIPアドレスを変更します

修正

/etc/default/dockerファイルに追加

DOCKER_OPTS="--bip=172.66.33.0/24"

リブートします

$ sudo reboot
確認

再度ログインし確認します

$ ifconfig
docker0   Link encap:Ethernet  HWaddr 56:84:7a:fe:97:99  
          inet addr:172.66.33.0  Bcast:0.0.0.0  Mask:255.255.255.0
          UP BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

ubuntu14.04のDockerをubuntuユーザで起動

ubuntu14.04にDockerをインストールし、一般ユーザで動かします。

インストール
$ sudo apt-get install docker.io

面倒になると困るのでiptablesを削除します

$ sudo iptables -F -t nat
$ sudo iptables -F 
起動

こちらを参考に

$ sudo groupadd docker   # これは不要かもしれない
$ sudo gpasswd -a ${USER} docker
$ sudo /etc/init.d/docker restart

一度ログアウトしもう一度ログインします

$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

Atomのlatexで日本語表示

ちょっとはまっていたのでメモ。

環境:MacOS 10.11

こちらを参考に。

$ cat $HOME/.atom/packages/latex/lib/builders/latexmk.js


'use babel'

import childProcess from 'child_process'
import path from 'path'
import Builder from '../builder'

export default class LatexmkBuilder extends Builder {
  constructor () {
    super()
    this.executable = 'latexmk'
  }

  static canProcess (filePath) {
    return path.extname(filePath) === '.tex'
  }

  run (filePath) {
    const args = this.constructArgs(filePath)
    const command = `${this.executable} ${args.join(' ')}`
    const options = this.constructChildProcessOptions()

    options.cwd = path.dirname(filePath) // Run process with sensible CWD.
    options.maxBuffer = 52428800 // Set process' max buffer size to 50 MB.
    options.env.max_print_line = 1000 // Max log file line length.

    return new Promise((resolve) => {
      // TODO: Add support for killing the process.
      childProcess.exec(command, options, (error) => {
        resolve((error) ? error.code : 0)
      })
    })
  }

//  constructArgs (filePath) {
//    const outputFormat = atom.config.get('latex.outputFormat') || 'pdf'
////    const args = [
//      '-interaction=nonstopmode',
//      '-f',
//      '-cd',
//      `-${outputFormat}`,
//      '-file-line-error'
//    ]
//
//    const enableShellEscape = atom.config.get('latex.enableShellEscape')
//    const enableSynctex = atom.config.get('latex.enableSynctex') !== false
//    const engineFromMagic = this.getLatexEngineFromMagic(filePath)
//    const customEngine = atom.config.get('latex.customEngine')
//    const engine = atom.config.get('latex.engine')
//
//    if (enableShellEscape) {
//      args.push('-shell-escape')
//    }
//    if (enableSynctex) {
//      args.push('-synctex=1')
//    }
//
//    if (engineFromMagic) {
//      args.push(`-pdflatex="${engineFromMagic}"`)
//    } else if (customEngine) {//      args.push(`-pdflatex="${customEngine}"`)
//    } else if (engine && engine !== 'pdflatex') {
//      args.push(`-${engine}`)
//    }
//
//    let outdir = this.getOutputDirectory(filePath)
//    if (outdir) {
//      args.push(`-outdir="${outdir}"`)
//    }
//
//    args.push(`"${filePath}"`)
//    return args
//  }

  constructArgs (filePath) {
    const args = [
      '-interaction=nonstopmode',
      '-f',
      '-cd',
      '-synctex=1',
      '-file-line-error',
      '-pdfdvi',
      '-latex=platex',
      '-e \'$dvipdf="dvipdfmx %O -o %D %S";$bibtex="pbibtex %O %B";$makeindex="mendex %O -o %D %S";\''
    ]

    const enableShellEscape = atom.config.get('latex.enableShellEscape')
    if (enableShellEscape) {
      args.push('-shell-escape')
    }

    let outdir = this.getOutputDirectory(filePath)
    if (outdir) {
      args.push(`-outdir="${outdir}"`)
    }

    args.push(`"${filePath}"`)
    return args
  }
}


こんな感じで修正。

AtomのメニューPackages->Latex->build
で日本語コンパイルできました

Atomで”markdown-pdf referenceerror callback is not defined”

Atomとは、Github謹製のリッチなエディターです。SublimeTextの対抗といったところでしょうか?
プラグインも豊富でかなり使い勝手がいいです。特にMarkdownで文章を書いたりするのが非常に便利

markdown-previewプラグインを入れればctrl+shift+mでMarkdownで書いたドキュメントの成形したプレビューを見ることができます。また、MarkdownからPDFを作成することもできるので非常に便利です

ただし、この設定を上手くしておかないとエラーが出ます。

markdown-pdf referenceerror callback is not defined

このエラーが出た場合には、markdown-pdfとmarkdown-preview-plusというプラグインがEnableになっていると思いますので、markdown-preview-plusをdisableにして、markdown-prevewをenableにすれば治ります

参考URL