CentOS5.11へgcc-4.8.5をインストール

たまたま余っていたCentOS5.11のサーバにpython2.7.12をインストールし、pylabをインストールしようとするとエラー。

 error: ‘SOCK_CLOEXEC’ was not declared in this scope
    error: command 'gcc' failed with exit status 1

どうもOSが古いと色々問題があります。

そこでこちらを参考にGCCをインストールします

ダウンロード

以下のサイトからダウンロードします。とりあえず最新版をダウンロードしました。

コンパイル

# mkdir /usr/local/gcc-4.8.5
# export LD_LIBRARY_PATH=/usr/local/gcc-4.8.5/lib:$LD_LIBRARY_PATH
# bunzip2 gmp-6.1.1.tar.bz2 
# tar xvfp gmp-6.1.1.tar
# cd gmp-6.1.1
# ./configure --prefix=/usr/local/gcc-4.8.5
# make && make install
# xz mpfr-3.1.4.tar.xz 
# cd mpfr-3.1.4
# ./configure --prefix=/usr/local/gcc-4.8.5 --with-gpm=/usr/local/gcc-4.8.5
# make && make install
# tar zxvfp mpc-1.0.3.tar.gz 
# cd mpc-1.0.3
# ./configure --prefix=/usr/local/gcc-4.8.5 --with-gmp=/usr/local/gcc-4.8.5 --with-mpfr=/usr/local/gcc-4.8.5
# make && make install
# tar zxvfp gcc-4.8.5.tar.gz 
# cd gcc-4.8.5
# ./configure --prefix=/usr/local/gcc-4.8.5 --enable-checking=release --with-gpm=/usr/local/gcc-4.8.5 --with-mpfr=/usr/local/gcc-4.8.5 --with-mpc=/usr/local/gcc-4.8.5 --enable-languages=c,c++
# make && make install

環境設定

使う際には、環境変数に入れて使い分けます

$ export LD_LIBRARY_PATH=/usr/local/gcc/lib:/usr/local/gcc/lib64:$LD_LIBRARY_PATH
$ export PATH=/usr/local/gcc/bin:$PATH
$ alias gcc="gcc-4.8.5"
$ alias g++="g++-4.8.5"

RでLDA

自分用メモ

こちらのRでLDAのサンプルがありますが、うまく動かなかったので修正メモ

環境

  • MacOS10.11
  • RStudio 0.99.484
  • R version 3.3.0

エラー

こちらのスクリプトを順番に実行していくと

# ggplotで可視化
ggplot(topic.proportions.df, aes(x=topic, y=value, fill=document)) + geom_bar() + facet_wrap(~ document, ncol=N) + coord_flip()

この部分で以下のエラーが出ます

 eval(expr, envir, enclos) でエラー:  オブジェクト 'topic' がありません 

以下のように修正します

# ggplotで可視化
ggplot(topic.proportions.df, aes(x=variable, y=value, fill=document)) + geom_bar() + facet_wrap(~ document, ncol=N) + coord_flip()

次はこのエラーです

 エラー: stat_count() must not be used with a y aesthetic.

ここを参考に修正します

修正スクリプト

# coraデータの読み込み(2410の科学記事のデータセット。LISTで2410成分ある)
data(cora.documents)
head(cora.documents, n = 2)

# 科学記事で使われているユニーク単語(2910個)のベクトル
data(cora.vocab)
head(cora.vocab)

# 科学記事で使われているタイトル(2410個)のベクトル
data(cora.titles)
head(cora.titles)

# 分析データの作成(トリッキーな参照をしているので注意)
# 1列目がcora.documentsの第一成分で使われる単語のリスト、2列目がその出現回数
data_cora <- as.data.frame(cbind(cora.vocab[cora.documents[[1]][1, ] + 1], cora.documents[[1]][2,]))
# coreの1番目の記事はこれらの単語とその出現回数で構成されていることが分かる。
head(data_cora)

### LDA
# 推定するトピック数の設定
k <- 10

# ldaパッケージはギブスサンプラーでやるようです。
# ギブスサンプラーの中でも3つくらいmethodがあるようです。
result <- lda.collapsed.gibbs.sampler(cora.documents, 
                                      k,
                                      cora.vocab,
                                      25,  # 繰り返し数
                                      0.1, # ディリクレ過程のハイパーパラメータα
                                      0.1, # ディリクレ過程のハイパーパラメータη
                                      compute.log.likelihood=TRUE)

# サマリを見ると、10成分のリストで構成されている。
# assignments:文書Dと同じ長さのリスト。値は単語が割り当てられたトピックNoを示す。
# topic:k × vの行列。値はそのトピックに出現する単語数を表す。
# topic_sums:それぞれのトピックに割り当てられた単語の合計数
# document_sums:k × Dの行列。割り振られたトピックにおける一文章内の単語数を示す。
summary(result)

# 各クラスターでの上位キーワードを抽出する
# 例は各トピックにおける上位3位の単語の行列。
top.words <- top.topic.words(result$topics, 3, by.score=TRUE)
top.words

# 最初の3記事だけトピック割合を抽出してみる
N <- 3
topic.proportions <- t(result$document_sums) / colSums(result$document_sums)
topic.proportions <- topic.proportions[1:N, ]
topic.proportions[is.na(topic.proportions)] <-  1 / k

# 上位3番までのトップワードを用いて列名をつけて、意味付けを行う。
colnames(topic.proportions) <- apply(top.words, 2, paste, collapse=" ")
par(mar=c(5, 14, 2, 2))
barplot(topic.proportions, beside=TRUE, horiz=TRUE, las=1, xlab="proportion")


###
# ggplotで可視化するために、meltを駆使してデータを作成(トリッキーなので注意)
topic.proportions.df <- melt(cbind(data.frame(topic.proportions), document=factor(1:N)), variable.name="topic", id.vars = "document")

# ggplotで可視化  この部分がうまく動かないので修正
#http://tutorials.iq.harvard.edu/R/Rgraphics/Rgraphics.html
ggplot(topic.proportions.df, aes(x=variable, y=value, fill=document)) + geom_bar(stat="identity") + facet_wrap(~ document, ncol=N) + coord_flip()

# 予測はこんな感じ
predictions <- predictive.distribution(result$document_sums[,1:2], result$topics, 0.1, 0.1)
top.topic.words(t(predictions), 5)


まとめ

Rのパッケージは時々仕様が変わってしまいますので自分でコードを修正する必要があります。

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

macにwgetを入れてみた

MacOSX10.8にはデフォルトでwgetが入っていません。必要ならばソースコードからコンパイルする必要があります。

まず手始めにはgccをインストールする必要があります。こちらを参考にコマンドライン版gccもいれます

wgetはソースコードからコンパイルするため、ブラウザでGNUのページからダウンロードします

$ cd /Users/UserName/Downloads
$ tar zxvfp wget-1.14.tar.gz
$ cd wget-1.14
$ ./configure --with-ssl=openssl
$ make
# su
# make install

こんな感じでインストールできます。

ちなみに–with-ssl=opensslをつけないとconfigureに失敗しました

KH CoderをMacにインストール

KH Coderという、自然言語の解析用の統合ソフトウエアをMacにインストールする際のメモ

環境

    • MacOS10.11
  • 関連モジュールのインストール

    まず、関連するモジュールをインストールします。KH Coderは内部でR,MySQL,mecab,Perlを使用しますのでMacにあらかじめこれらを入れておく必要があります。

    mysql

    brewで入れるのが簡単です
    brewって何って言う人はこのあたりを参考に入れてみてください
    このあたりを参考にインストールします。DBのユーザ名、パスワードは任意に決めておきます

    $ brew install mysql
    $ echo "[mysqld]" > /usr/local/etc/my.cnf
    $ echo "sql_mode = \"\"" >> /usr/local/etc/my.cnf
    $ mysql.server start
    

    KH CoderはMySQL5.7だと不具合が出るのでsql_modeをブランクにしておきます
    確認します

    $ mysql -uroot
    Welcome to the MySQL monitor.  Commands end with ; or \g.
    Your MySQL connection id is 243
    Server version: 5.7.12 Homebrew
    
    Copyright (c) 2000, 2016, 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> 
    
    

    R

    同じくBrewが簡単です

    $ brew install r
    

    mecab

    $ brew install mecab
    $ brew install mecab-ipadic
    

    Perl

    Macには初めからPerlがインストールされているので、今回は関連するモジュールを追加します。

    $ sudo su -
    # perl -MCPAN -e shell
    

    初めて起動する際には色々聞かれますがデフォルトで全てOKです。黙ってリターンキーを押しましょう
    CPANのシェルが起動すれば黙々と以下インストールします

    cpan> install Jcode
    cpan> install Tk
    cpan> install DBD::CSV
    cpan> install Net::Telnet
    cpan> install YAML
    cpan> install Spreadsheet::ParseExcel
    cpan> install Spreadsheet::ParseXLSX
    cpan> install Clipboard
    cpan> install Statistics::Lite
    cpan> install Algorithm::NaiveBayes
    cpan> install Text::Iconv
    

    こんな感じでインストールしていきます。
    たまにエラーが出る場合にはあわてず以下の通りにします

    例えば Spreadsheet-ParseExcelがエラーになった場合には

    # cd ~/.cpan/build
    # cd Spreadsheet-ParseExcel-0.65-OEiGuu
    # perl Makefile.PL
    # ./configure
    # make
    # make install
    

    こんな感じです。

    KH Coder

    こちらからソースコードをダウンロードして解凍しておきます
    KH Coderをダウンロードしたディレクトリに移動し一度起動します。こすればconfigいかにファイルが作成されます

    $ perl kh_coder.pl
    

    そのあと設定ファイルを設定します。インストールした際のMySQLのユーザ名とパスワード、Mecabを設定します。

    $ vi kh_coder/config/config.ini
    c_or_j          mecab
    sql_username    ユーザ
    sql_password    パスワード
    

    設定ファイルの文字コードを修正します。nkfが入っていない場合にはbrew でインストールしてください

    $ cd config
    $ nkf -s hinshi_mecab > /tmp/$$ && mv -f /tmp/$$ hinshi_mecab
    

    起動

    KH Coderをダウンロードしたディレクトリに移動します

    $ perl kh_coder.pl
    

    これで起動できるはずです。

    こんな感じでPerlのエラーが出た際には、Perlのモジュールを入れてください。以下の例だとDBD/CSV.pmが足りないので install DBD::CSVをインストールします

    $ perl kh_coder.pl 
    Can't locate DBD/CSV.pm in @INC (you may need to install the DBD::CSV module) (@INC contains: /Users/utsubo/Downloads/kh_coder/kh_lib /Library/Perl/5.18/darwin-thread-multi-2level /Library/Perl/5.18 /Network/Library/Perl/5.18/darwin-thread-multi-2level /Network/Library/Perl/5.18 /Library/Perl/Updates/5.18.2/darwin-thread-multi-2level /Library/Perl/Updates/5.18.2 /System/Library/Perl/5.18/darwin-thread-multi-2level /System/Library/Perl/5.18 /System/Library/Perl/Extras/5.18/darwin-thread-multi-2level /System/L
    
    cpan> install DBD::CSV
    

    おまけ

    mysql5.7でのエラーについて

    前処理を実行するとこういうエラーが出ます

    DBD::mysql::db do failed: Expression #3 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'khc0.hinshi.id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by at /Users/utsubo/Downloads/kh_coder/kh_lib/mysql_exec.pm line 256.
    Exit (gui_errormsg.pm)
    

    こちらによると5.7からGroupBYの仕様が変わったらしいです。

    Day Of Yearカレンダープラグイン

    WordPressのプラグインでDayOfYearを表示するものを作成してみました

    プラグイン作成準備

    最初にディレクトリを作成します。今回は自分用に作成するので特に名前も気にしていないのですが、公開する場合には名前のかぶらないものにすることをお勧めします。

    $ mkdir utbt_doycalendar
    

    このディレクトリにplugin.phpファイルを作成しヘッダを作成します。
    この辺りはお決まりですので、このあたりのサイトに書かれている通りにします

    
    
    
    

    こんな感じで十分でしょうか?

    ショートコード対応

    今回はWordpressのプラグインとしてショートコードをページに記入レバ表示できるような仕様にします。
    また、ページには1年間分のカレンダーを表示し、年をテキストボックスでフォーム入力し、Submitすることにより切り替えます。
    この際に、FormからはGetパラメタで送信し、プラグイン内でGetパラメタを取得して年を切り替えます。

    カレンダー作成

    最初から作ってもいいのですが、こちらを参考にさせていただきました。

    ソースコード

    で、完成したコードがこちら

    
    
    calendar($year);
    }
    
    add_shortcode('utbt_calendar','utbt_calendar_func');
      class UtbtCalendar{
    
        function calendar($year=''){
    
    
            if (empty($year) && empty($month)) {
                $year = date('Y');
            }
            $html="
    Input Yea r:"; for($i=1;$i<=12;$i++){ $html.=$this->calendar_exec($year,$i); } $html.="
    "; return $html; } //http://shanabrian.com/web/php_calendar.php private function calendar_exec($year = '', $month = '') { $tab=""; $str=""; if (empty($year) && empty($month)) { $year = date('Y'); $month = date('n'); } //月末の取得 $l_day = date('j', mktime(0, 0, 0, $month + 1, 0, $year)); //初期出力 $html = << {$year}/{$month} Sun Mon Tue Wed Thr Fri Sat \n EOM; $lc = 0; // 月末分繰り返す for ($i = 1; $i < $l_day + 1;$i++) { $classes = array(); $class = ''; // 曜日の取得 $week = date('w', mktime(0, 0, 0, $month, $i, $year)); // 曜日が日曜日の場合 if ($week == 0) { $str .= $tab."\t\t\n"; $lc++; } // 1日の場合 if ($i == 1) { if($week != 0) { $str .= $tab."\t\t\n"; $lc++; } $str .= $this->repeatEmptyTd($week); } if ($week == 6) { array_push($classes, '#0000FF'); } else if ($week == 0) { array_push($classes , '#FF0000'); } if (count($classes) > 0) { $class = '"'.implode(' ', $classes).'"'; } $doy = date('z', mktime(0, 0, 0, $month, $i, $year))+1; $str .= $tab."\t\t\t".''.$i.'('.$doy.')'."\n"; // 月末の場合 if ($i == $l_day) { $str .= $this->repeatEmptyTd(6 - $week); } // 土曜日の場合 if ($week == 6) { $str .= $tab."\t\t\n"; } } $html .=$str; $html .= "\n"; return $html; } private function repeatEmptyTd($n = 0) { return str_repeat("\t\t \n", $n); } } ?>

    リリース

    できたコードをディレクトリごとZIPファイルにし、Wordpressのプラグインに追加します。
    また、ページにはこんな感じで書けば無事カレンダーが表示されます

    [utbt_calendar]
    

    デモ

    作成したデモサイトはこちらになります