2013/05/20

[groovy] ファイルを特定の行数に分割する

絶対にもっといい方法があるんだろうけど、groovyを使ってファイルを特定の行数に分割してみた。
ちなみに、1分割する毎にファイルを先頭から読み直しているため、分割する毎に処理が遅くなっていく。
行をスキップできればいいんだけど、途中で調べるのを辞めてしまった。。。

以下ソース
class FileUtils {

 /**
  * ファイルの行数を返却する
  * 
  * @param filePath
  * @param encode
  * @return
  */
 static def countLines(def filePath, def encode) {
  def lineCount = 0
  new File(filePath).eachLine(encode) { lineCount++ }
  lineCount
 }

 /** 
  * 指定の行数にファイルを分割する
  * 分割したファイルは分割元ファイルと同じディレクトリに書き出す
  * @return
  */
 static def splitFiles(def dstDir, def filePath, def encode, def lineSplitSize) {
  
  // 行数を取得する
  def lineSize = countLines(filePath, encode)

  // 分割数を計算する
  def splitSize = (lineSize / lineSplitSize).toInteger() + (lineSize % lineSplitSize == 0 ? 0 : 1)
  println "総行数:${lineSize}/分割行数:${lineSplitSize}/分割ファイル数:${splitSize}"
  
  // ファイルを分割する
  (0..
   def dstFile = new File("${dstDir}/${new File(filePath).name}.${idx}").withWriter(encode) { out ->
    
    // 開始行数
    def startLine = idx * lineSplitSize
    def writeLines = 0
    
    def start = new Date().time
    try {
     int procLine = 0
     new File(filePath).eachLine(encode) { line ->      
      
      // 開始行に至ったら、内容を書き込む
      if (procLine >= startLine) {
       out << "${line}\n"
       writeLines++
       
       // 分割行数に至ったら、ループから抜ける
       if (writeLines == lineSplitSize) {
        throw new RuntimeException()
       }
      }
      procLine++
     }
    } catch (e) {}
    println "実行時間:${new Date().time - start}"
   }
  }
 }
}

2013/05/16

Jenkinsで役に立ちそうなプラグイン

CIツールとして名高い「Jenkins」。
プラグインが大量に出回っているので役に立ちそうなのをいくつか紹介します。

JOBの横っちょにcronの設定を表示してくれるプラグイン
https://wiki.jenkins-ci.org/display/JENKINS/Cron+Column+Plugin

これを入れるとcronの設定が一目で確認できるようになります。

次に実行されるジョブをサイドバーに表示してくれるプラグイン
https://wiki.jenkins-ci.org/display/JENKINS/Next+Executions

次に実行されるジョブが簡単に確認できるので、タイマー代わりに使用できそうです。

コンソール出力に時間を表示するプラグイン
https://wiki.jenkins-ci.org/display/JENKINS/Timestamper


各プロジェクトの設定を一括変更できるプラグイン
https://wiki.jenkins-ci.org/display/JENKINS/Configuration+Slicing+Plugin

ファイルをトリガーにジョブを実行できるようにするプラグイン
https://wiki.jenkins-ci.org/display/JENKINS/FSTrigger+Plugin

ファイル監視ジョブを簡単に作れそうです。


ジョブの上下関係を視覚的に表示できるプラグイン

https://wiki.jenkins-ci.org/display/JENKINS/Build+Pipeline+Plugin

上記の他にも見切れないくらいプラグインがあります。
jenkinsは組み合わせ次第で様々な使用方法できそうで、ますます依存してしまいそうです。

2013/01/09

[Ubuntu12.04] IPアドレスを固定する方法

1. 下記のファイルを編集する。 sudo vi /etc/network/interfaces
auto eth0
iface eth0 inet static
address 192.168.1.200
netmask 255.255.255.0
network 192.168.1.0
broadcast 192.168.1.255
gateway 192.168.1.1
2. ネットワークをrestartする
sudo /etc/init.d/networking restart

2013/01/08

MacOSXのターミナルでSSH接続してみる

こんな感じのコマンドをターミナルで入力すれば接続できた。

ssh ログイン名@ホスト名

2012/07/06

Grailsでファイルアップロードするには

リファレンスに記載してあった。
http://grails.org/doc/latest/guide/theWebLayer.html#uploadingFiles

リファレンスのようにこんな感じで実装すればうまく動作した。

GSPに以下のようなタグを記述する。
Upload Form: <br />
    <g:uploadForm action="upload">
        <input type="file" name="myFile" />
        <input type="submit" />
    </g:uploadForm>
Controllerを以下のように実装する。
def upload() {
    def f = request.getFile('myFile')
    if (f.empty) {
        flash.message = 'file cannot be empty'
        render(view: 'uploadForm')
        return
    }
    f.transferTo(new File('/some/local/dir/myfile.txt'))
    response.sendError(200, 'Done')
}

Grailsのログ設定について

ここに詳しく掲載されていた。
http://grails.org/doc/latest/guide/single.html#logging


プロジェクトの作成時にConfig.groovyに以下のような設定がされているので、
あとは適切に設定すればいいみたい。
// log4j configuration
log4j = {
    // Example of changing the log pattern for the default console
    // appender:
    //
    //appenders {
    //    console name:'stdout', layout:pattern(conversionPattern: '%c{2} %m%n')
    //}

    error   'org.codehaus.groovy.grails.web.servlet',  //  controllers
           'org.codehaus.groovy.grails.web.pages'     //  GSP,
           'org.codehaus.groovy.grails.web.sitemesh', //  layouts
           'org.codehaus.groovy.grails.web.mapping.filter', // URL mapping
           'org.codehaus.groovy.grails.web.mapping', // URL mapping
           'org.codehaus.groovy.grails.commons', // core / classloading
           'org.codehaus.groovy.grails.plugins', // plugins
           'org.codehaus.groovy.grails.orm.hibernate', // hibernate integration
           'org.springframework',
           'org.hibernate',
           'net.sf.ehcache.hibernate'
}

2012/07/03

[Grails] validationエラー時のメッセージを変更するには

概要

Domainクラスに定義できる制約(validation)でエラーが発生すると以下のようなメッセージが出力されます。
[class jp.co.wave.dsam.Test]クラスのプロパティ[name]の空白は許可されません。
これだとユーザーに全然優しくないので、分かりやすいメッセージに変更する方法を照会します。

検証環境

項目内容
OSMac OS X 10.06
Grails2.0.4

内容

リファレンスの7.5節に変更する方法が記載されていました。 抜粋します。
If a constraint is violated Grails will by convention look for a message code of the form:

[Class Name].[Property Name].[Constraint Code]
In the case of the blank constraint this would be user.login.blank so you would need a message such as the following in your grails-app/i18n/messages.properties file:

user.login.blank=Your login name must be specified!
The class name is looked for both with and without a package, with the packaged version taking precedence. So for example, com.mycompany.myapp.User.login.blank will be used before user.login.blank. This allows for cases where your domain class message codes clash with a plugin's.

For a reference on what codes are for which constraints refer to the reference guide for each constraint.
Googleで翻訳してみますと、
制約が違反している場合は、Grailsは慣例により、フォームのメッセージコードを探します。
[Class Name].[Property Name].[Constraint Code]

このようなあなたのgrails-app/i18n/messages.propertiesファイルに次のようなメッセージが必要になりますので、空白の制約の場合、これはuser.login.blank次のようになります。

user.login.blank=Your login name must be specified!

クラス名が優先してパッケージ化されたバージョンでは、とと、パッケージなしの両方で検索されます。したがって、たとえば、com.mycompany.myapp.User.login.blankはuser.login.blank前に使用されます。これは、ドメインクラスのメッセージコードは、プラグインのと衝突例が可能になります。

制約は、それぞれの制約のためにリファレンスガイドを参照しているコードが何であるかに参考のため。


これを自分なりに読み解きますと、
validationでエラーが発生すると、
grails-app/i18n/messages.propertiesから、
[Class Name].[Property Name].[Constraint Code]
という形式のメッセージコードを探します。

独自に定義することにより、プラグインで表示するメッセージとと異なるメッセージを出力することができます。
試しにやってみると、追加したメッセージが出力されることを確認しました。

参考情報

7 Validation - Reference Documentation

最後に