Love澤's Room

技術系ネタをまとめていたブログ。現在はカテゴリにこだわらず更新中。

LaTeXiTで日本語を含む数式を生成する

新サイトへ移転しました
約3秒後に自動的にリダイレクトします。

  • やりたいこと

LaTeXiTで日本語を含む数式を生成する.

  • 方法

まず,LaTeXiTの設定を以下の画像のようにする.変更したのはLaTeXとdvipdfのパス.インストール環境によってパスも変わってくると思うので,その辺りは各自の環境に合わせる.

次にエディタ上で日本語の部分を\text{}でくくってやるとちゃんと出力される.

\text{日本語}i

◯参考サイト
LaTeXiTの数式で日本語を通す方法 | メモlog

ファイル名を連番に変更する方法(CentOS, Mac)

新サイトへ移転しました
約3秒後に自動的にリダイレクトします。

やりたいこと

複数のファイルのファイル名を連番に変更する。

> ls
test1.png test4.png test5.png test10.png

上記を下記のようにする。

> ls
test001.png test002.png test003.png test004.png

方法

以下のコマンドで変更前後を確認

> ls *.csv | awk '{ printf "mv %s test%03d.png\n", $0, NR }'
mv test1.png test001.png
mv test4.png test002.png
mv test5.png test003.png
mv test10.png test004.png

問題なければ次のように、パイプを使って実行

> ls *.csv | awk '{ printf "mv %s test%03d.png\n", $0, NR }' | sh

また、printfの部分を変更することで柔軟な連番付けが可能となる。

## 連番を1000番台にする
> ls *.csv | awk '{ printf "mv %s test%03.2f.png\n", $0, NR+1000.03 }'
mv test1.png test1001.03.png
mv test4.png test1002.03.png
...
## 偶数の連番にする
> ls *.csv | awk '{ printf "mv %s test%03d.png\n", $0, NR+NR }'
mv test1.png test002.png
mv test4.png test004.png
...
## 奇数の連番にする
> ls *.csv | awk '{ printf "mv %s test%03d.png\n", $0, NR+NR-1 }'
mv test1.png test001.png
mv test4.png test003.png
...

Rの演算子「<-」と「=」と「<<-」の違い

新サイトへ移転しました
約3秒後に自動的にリダイレクトします。


Rをいじっているのだが、タイトルの通り、代入演算子の違いがわからなかった。それぞれ以下のように呼ぶそう。

  • 「<-」:代入演算子
  • 「=」:代入演算子
  • 「<<-」:永続代入演算子

(参考サイト)
http://isyus2.yz.yamagata-u.ac.jp/xoops/Data/R_v3.pdf
http://cse.naro.affrc.go.jp/takezawa/r-tips/r/28.html


通常の代入操作については、「<-」「=」のどちらを使っても構わないそう。いわゆる、プログラミングで一般的に使われる代入と同じイメージ。ただし、S4クラスやS5クラスの中でデータの型を指定するときは「<-」ではエラーとなり「=」を使用しなければならないっぽい。気を使うのが面倒。

永続代入演算子は、あるメソッドの中からメソッド外の変数に値を代入する際に使用する演算子。個人的にはメソッドの中からメソッド外の変数に代入なんてすんなよって思う(古い考え?)。使う場面としては、S5クラスで定義されているフィールドに代入する際など。

下記サイトに載っているプログラム例を参考にしながら、自分なりに少しずつ手を加えたプログラムを以下に示す。
「<-」「=」「<<-」の使い方を示せればと。
biunit.dev

Asagao = setRefClass(
  # クラス名
  Class = "Asagao",     # 通常の記述法
  # Class <- "Asagao",  # Asagaoという値をもつClassという変数が生成される。ただし、クラスとしての機能は実装できる。
  # 上記どちらかの記述がなければ、クラスとして実装できない(エラーがとなる)。

  # 継承
  contains = c("Flower"),     # 通常の記述法
  # contains <- c("Flower"),  # Flowerという値を持つcontainsという変数が生成される。
  
  # フィールド
  fields = list (     # 通常の記述法
  # fields <- list (  # seeds, speciesという変数(カラム?)を持つlistが生成される。
                      # また、seedsは"numeric"という値をspeciesは"character"という値をもつ
    seeds   = "numeric",   # 種の数
    species = "character"  # 種類
  ),

  # フィールド                           # この書き方だと、エラーとなる
  # fields = list (  # 通常の記述法      # |
  #   seeds   <- "numeric",   # 種の数  # |
  #   species <- "character"  # 種類    # |
  # ),                                 # |
  
  # method
  methods = list (
    # コンストラクタ
    initialize = function(color=NULL, leaves=NULL, species=NULL) {    # 通常の記述法
    # initialize = function(color=NULL, leaves=NULL, species=NULL) {  # エラー
      if (is.null(color)) {
        color <<- "skyblue"   # 通常の記述法
        # color <- "skyblue"  # エラー
      } else {
        color <<- color
      }
      
      if (is.null(leaves)) {
        leaves <<- 50
      } else {
        leaves <<- leaves
      }
      
      if (is.null(species)) {
        species <<- "昼顔"
      } else {
        species <<- species
      }
    },
    
    # 葉っぱの枚数から生育状態を計算して、その状態を conditions 変数に保存
    CalcConditions = function() {
      x = 2
      y = 4
      conditions <<- leaves * x - y
    },
    
    # 現在の生育状態から種子数を予測し、予測した種子数を seeds に保存
    EstimateSeeds = function() {
      seeds <<- round(conditions / 10 + 50)
    },
    
    getConditions = function() {
      conditions <<- leaves * 2
      return(conditions)
    },
    getConditions2 = function() {
      conditions <<- CalcConditions()
      return(conditions)
    }
  )
)

SourceTree + backlog と SourceTree + codebreak; を試す

新サイトへ移転しました
約3秒後に自動的にリダイレクトします。


今日は短め。

やりたいこと

かねてより、試してみたいと思っていたGitによるソースコード管理。これまで面倒だという理由でとくに利用してこなかったが、WindowsからMacに乗り換えたついでに設定してみた。

環境

コマンドラインでのGitは敷居が高いので、GUIで使えるGitクライアントのSourceTreeを導入した。
Sourcetree - 無料の Git & Mercurial クライアント | Atlassian

使い方などはこちらのページが大変分りやすかった。
サル先生のGit入門〜バージョン管理を使いこなそう〜【プロジェクト管理ツールBacklog】

Gitホスティグサービスは、下記の2つを試しているところ。


使用雑感

両方ともまだ全然触ったわけではない、ということを断っておいた上での雑感。

backlogはリポジトリの公開・非公開設定ができない(?)っぽい。デフォルトが非公開リポジトリなのであればよいのだけど、ググってもよくわからなかった。また、ネットでプランの機能一覧などを見ると、アクセス制限などはフリープランではできないようなので、その辺りが気になっているところ。

codebreak;はリポジトリの公開・非公開の設定がはっきりしているので大変ありがたい。利用人数も無制限だそう。自分の場合はまだ使い始めたばかり&共同開発の予定はないので、あまり関係はないが。

今後の予定

他にも試してみたいのが
Bitbucket - Pricing | Atlassian

どのサービスが使いやすいのか、自分に合っているかはわからないので、これから色々と試していくつもり。何かあれば比較記事でもあげようかな。

(おまけ)
Gitホスティングサービス5選【比較表付き】 | FINDJOB! Startup
dfltweb1.onamae.com – このドメインはお名前.comで取得されています。

JpGraph Error: 25049が出た時の対処方法

新サイトへ移転しました
約3秒後に自動的にリダイレクトします。

やりたかったこと

JpGraphを使って折れ線グラフを描画する。

エラーが起きた状況

PHPでJpGraphを利用する際に、以下のように記述。フォントは明朝体に設定。

<?php
(中略)
// グラフの描画先
$g = new Graph(400, 400); // サイズ
$g->setScale('textlin'); // 目盛り
$g->title->setFont(FF_MINCHO, FS_NORMAL, 14); // タイトルフォント
$g->title->set('テストタイトル'); // タイトル
$g->legend->setFont(FF_MINCHO, FS_NORMAL, 14); // 凡例フォント
(中略)
?>

エラー内容

以下の様なエラーが出た。

画像ではipampp.ttfとなっているが、エラーを起こすためにわざとそのようにした。実際のエラーは以下のとおり。

JpGraphError: 25049
Font file "/usr/share/fonts/ipa-gothic/ipam.ttf" is not readable or does not exist.

エラー文をみると、「ipa-gothic」ディレクトリに明朝体フォント「ipam.ttf」を探しに行っていることがわかる。

対策(簡単)

必要フォントを、「JpGraphに関するファイルが保存されているディレクトリ/fonts/」に配置する。

色々と試行錯誤したが、結局はこちらの対策に落ち着いた。

自分の場合だと、以下の様な構成になっている。

  • public_html/
    • line.php
    • JpGraph/
      • jpg-config.inc.php, jpgraph_ttf.inc.php, など
      • fonts/
        • ipag.ttf, ipagp.ttf, ipam.ttf, ipamp.ttf

JpGraphでは、JpGraph/Fonts/にフォントがあるか読み込みに行き、ない場合にはシステムのフォントディレクトリにを読み込みに行く。そのため、JpGraph/Fonts/に必要フォントを配置することで、問題が解決される。

対策(ちょっと面倒)

jpg-config.inc.phpとjpgraph_ttf.inc.phpの設定を調整する。

設定ファイル類を直接いじることになるので、ちょっと面倒。上でも書いたが、エラー文をみると、「ipa-gothic」ディレクトリに明朝体フォント「ipam.ttf」を探しに行っているため、それを解消することを試みる。

まずjpg-config.inc.phpは40行目あたりを以下のように設定する。

<?php
// define('MBTTF_DIR','/usr/share/fonts/ipa-gothic/');  // delete
// define('TTF_DIR','/usr/share/fonts/ipa-gothic/');    // |
define('TTF_DIR_M', '/usr/share/fonts/ipa-mincho/');    // add
define('TTF_DIR_PM', '/usr/share/fonts/ipa-pmincho/');  // |
define('TTF_DIR_G', '/usr/share/fonts/ipa-gothic/');    // |
define('TTF_DIR_PG', '/usr/share/fonts/ipa-pgothic/');  // |
?>

上記からもわかるように、なぜかTTF_DIRやMBTTF_DIRがipa-gothicに設定されていた。今回、JpGraphは古いサーバで使っていたものを新しいサーバへコピーしてきたものである。おそらく、これはデフォルトでこのようになっていたのではなく、古いサーバにあわせて書き換えられていたのだと思う。

次に、ipgraph_ttf.inc.phpは495行目あたりを以下のように設定する。

<?php
// check jpgraph/src/fonts dir
$jpgraph_font_file = $jpgraph_font_dir . $font_file;
if (file_exists($jpgraph_font_file) === true && is_readable($jpgraph_font_file) === true) {
    $font_file = $jpgraph_font_file;
    break;
}

// check OS font dir
// if ($family >= FF_MINCHO && $family <= FF_PGOTHIC) {  // delete
//     $font_file = MBTTF_DIR.$font_file;                // |
if ($family == FF_MINCHO) {              // add
    $font_file = TTF_DIR_M.$font_file;   // |
}                                        // |
else if ($family == FF_PMINCHO) {        // |
    $font_file = TTF_DIR_PM.$font_file;  // |
}                                        // |
else if ($family == FF_GOTHIC) {         // |
    $font_file = TTF_DIR_G.$font_file;   // |
}                                        // |
else if ($family == FF_PGOTHIC) {        // |
    $font_file = TTF_DIR_PG.$font_file;  // |
}
// else {                                // delete
//     $font_file = TTF_DIR.$font_file;  // |
// }                                     // |
?>

以上の設定で、フォントをJpGraph/fonts/以下に配置しなくてもよくなった。


なお、FF_**という変数がでてきたが、これらは同ファイル32行目あたりに以下のように定義されている。

<?php
define("FF_MINCHO",40);
define("FF_PMINCHO",41);
define("FF_GOTHIC",42);
define("FF_PGOTHIC",43);
?>

また、同ファイル348行目あたりには

<?php
$this->font_files= array(
    中略
    /* Japanese fonts */
    FF_MINCHO  =>  array(
        FS_NORMAL =>MINCHO_TTF_FONT,
        FS_BOLD =>'',
        FS_ITALIC =>'',
        FS_BOLDITALIC =>''
    ),
    FF_PMINCHO => array(
    中略
);
?>

と定義されており、その中で出てくる、MINCHO_TTF_FONTなどは同ファイル137行目あたりに以下のように定義されている。

<?php
define('MINCHO_TTF_FONT','ipam.ttf');
define('PMINCHO_TTF_FONT','ipamp.ttf');
define('GOTHIC_TTF_FONT','ipag.ttf');
define('PGOTHIC_TTF_FONT','ipagp.ttf');
?>

SESSION情報を維持したままAjaxな処理を行う方法

新サイトへ移転しました
約3秒後に自動的にリダイレクトします。

やりたいこと

Ajaxな処理をする際にも、SESSIONを維持出来るようにする。

(参考サイト)
ajax版できたよー - スキマハコ

どうするか

jQueryを用いている場合、以下のように記述すると良い。PHP側は特に特別な記述はなく、普通にSESSION変数を使用できる。

  • 変更前(SESSION情報維持できない)
$.ajax({
    url: "hogehoge.php",
    type: "POST",
    data: {
        "foo" : "bar"
    },
    success: function(json_result) {
        // 中略
    },
    error: function() {
        // 中略
    },
    complete: function(() {
        // 中略
    }
});
  • 変更後(SESSION情報維持できる)
$.ajax({
    url: "hogehoge.php",
    type: "POST",
    data: {
        "foo" : "bar"
    },
    beforeSend: function(xhr) {
        xhr.setRequestHeader('X-CSRF-Token', $('meta[name="csrf-token"]').attr('content'));
    },
    success: function(json_result) {
        // 中略
    },
    error: function() {
        // 中略
    },
    complete: function(() {
        // 中略
    }
});

追加した部分が何を意味するか

セキュリティに関することなので、この部分は理解しておきたいのだけど、まだまだ及ばない。

  • CSRFという攻撃がある。
  • CSRF攻撃に対する策として、GET以外のメソッドでデータを送信する際にはトークンが必要である。
  • 「xhr.setRequestHeader('X-CSRF-Token', $('meta[name="csrf-token"]').attr('content'));」の部分でそのトークンを発行している。

上記は間違っている可能性があるので、調べたら、随時追記・修正する。

以下に説明してくれているサイトをメモする。

vimの設定をする方法(MacOS X Yosemie)

新サイトへ移転しました
約3秒後に自動的にリダイレクトします。


MacBookProを購入しました。年初めに高価な買い物をしてしまったので、今年は節約志向でいこうと思います

やりたいこと

vimのシンタックスハイライトをonにするなど、自分好みにカスタマイズする。

手順

  1. terminalを開く
  2. rootディレクトリ~に移動して、そこで.vimrcを作成する(/user/share/vim/vimrcをコピーしても良い*1)
  3. .vimrcに「syntax on」と記述するなどお好みで

上記*1:コピーしたのちに.vimrcに名前を変更しないと、設定が反映されませんでした。

僕の設定は以下な感じ。その昔どちらかのサイトで公開されていたものを利用しています。ありがたいことです。どこのサイトだったかは忘れたので、また見つけたらリンク貼ろうと思います。

" vim の独自拡張機能を使う(viとの互換性をとらない)
set nocompatible
" 文字コードを指定する
set encoding=utf-8
" ファイルエンコードを指定する
set fileencodings=iso-2022-jp,sjis,euc-jp,utf-8
" 自動認識させる改行コードを指定する
set fileformats=unix,dos
" バックアップをとる
" 逆は [ set nobackup ]
set backup
" バックアップを作るディレクトリを指定する
set backupdir=~/backup
" 検索履歴を50個残す
set history=50
" 検索時に大文字小文字を区別しない
set ignorecase
" 検索語に大文字を混ぜると検索時に大文字を区別する
set smartcase
" 検索語にマッチした単語をハイライトする
" 逆は [ set nohlsearch ]
set hlsearch
" インクリメンタルサーチを使う (検索語を入れている途中から随時マッチする文字列の検索を開始)
" 逆は [ set noincsearch ]
set incsearch
" 行番号を表示する
" 逆は [ set nonumber ]
set number
" 改行 ( $ ) やタブ ( ^I ) を可視化する
"set list
" 括弧入力時に対応する括弧を強調する
set showmatch
" 構文ごとに色分け表示する
" 逆は [ syntax off ]
syntax on
" [ syntax on ] の場合のコメント文の色を変更する
highlight Comment ctermfg=LightCyan
" ウィンドウ幅で行を折り返す
" 逆は [ set nowrap ]
set wrap
" タブを表示するときの幅
set tabstop=2
" タブを挿入するときの幅
set shiftwidth=2
" 改行時に入力された行の末尾に合わせて次の行のインデントを増減する
set smartindent

以上な感じです。これであなたも(というか僕が)快適vimライフ!!