作成者別アーカイブ: skmk

Windows版Anacondaのsilent install

Anacondaとは

Anacondaは数値計算とかに便利なライブラリが一式つまったpythonのディストリビューションです。
Download Anaconda Python Distribution

Windows版Anacondaのsilent install

Windowsの場合exe形式のインストーラーがあります。GUIのウィザードで簡単にインストールできますが、 コマンドひとつでサイレントインストールすることもできます。

Anaconda Install — Continuum documentation

Anaconda-2.x.x-Windows-x86[_64].exe /S /D=C:\Anaconda

/Sというオプション(スイッチ)がポイントですね。 /Dには導入するフォルダを指定します。一番最後に指定しましょう。 これでインストールではできるのですが、PATHの設定や使用ユーザーを設定したいときには次のようなオプションを設定できます。

  • /InstallationType=AllUsers [default:JustMe]
  • /AddToPath=[0|1] [default:1]
  • /RegisterPython=[0|1] [default:AllUsers:1, JustMe:0]

ちなみにこれらは/?というオプションをつけて実行すると確認できます。

例えばすべてのユーザー用にインストールし、PATHやRegistryを登録するサイレントインストールの方法は以下のコマンドになります。
ただしPATHやRegistryにきちんと登録するためには、コマンドプロンプトのアイコンのコンテキストメニュー(右クリックメニュー)から「管理者として実行」(Run As Administrator)で起動してから以下のコマンドを実行してください。

Anaconda-2.x.x-Windows-x86[_64].exe /InstallationType=AllUsers /AddToPath=1 /RegisterPython=1 /S /D=C:\Anaconda

バッチファイルで実行する場合

コマンドは一瞬で終了しますが、実は裏側でインストーラーが動いています。
バッチファイルなどでインストールが完了するまで待つためにはstartコマンドの/waitオプションを使います。詳しくはstart /?を参照してください。

以下は、32bit版Anacondaの2.0.1版をすべてのユーザー用にC:\Anacondaにインストールし、PATHとレジストリの設定まで行うものです。

set FILENAME=Anaconda-2.0.1-Windows-x86.exe
set PATHTO=C:\Anaconda
start "Anaconda Install" /wait "%FILENAME%" /S /InstallationType=AllUsers /AddToPath=1 /RegisterPython=1 /D=%PATHTO%

上のようにインストール先を変数で渡す場合、/D="%PATHTO"と書くとうまく行きません。
C:\Program Files\Anacondaのようにパスに空白を含む場合でも/D=%PATHTO%と書きましょう。
変数で渡さず直接インストール先のパスを書く場合は、/D=C:\Program File\Anacondaと書いても/D="C:\Program Files\Anaconda\"と書いてもどちらでも大丈夫なようです。

参考

Windows silent installation

ruby2.0のインストール時rbenvがBUILD FAILEDになる、そんなとき

Ubuntuにrbenvを使ってruby2.0を入れようと思ったわけです。
OpenSSLがないっぽいと言われBUILD FAILEDになったのですけど、結論から言うとメッセージのとおりで前提のパッケージを諸々入れると良いです。

sudo apt-get install zlib1g-dev build-essential libssl-dev libreadline-dev git

これぐらい入れておけば大丈夫そう。

せっかくなのでインストールの手順を残しておきます。

やり方は以下のリンク先に従えばよくて、まずはrbenvruby-buildをインストールします。

https://github.com/sstephenson/rbenv

#rbenvのインストール
git clone git://github.com/sstephenson/rbenv.git ~/.rbenv
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.profile
echo 'eval "$(rbenv init -)"' >> ~/.profile
exec $SHELL -l

#ruby-buildのインストール
git clone git://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build

利用可能なバージョンの一覧を表示

rbenv install --list

バージョンを一覧から選んでインストール。今回は2.0.0-p247。

rbenv install 2.0.0-p247

ところが前提が足りずにBUILD FAILEDになります。

$ rbenv install 2.0.0-p247
Downloading ruby-2.0.0-p247.tar.gz...
-> http://ftp.ruby-lang.org/pub/ruby/2.0/ruby-2.0.0-p247.tar.gz
Installing ruby-2.0.0-p247...

BUILD FAILED

Inspect or clean up the working tree at /tmp/ruby-build.20130730092728.31571
Results logged to /tmp/ruby-build.20130730092728.31571.log

Last 10 log lines:
installing default gems:      /home/skmk/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0 (build_info, cache, doc, gems, specifications)
                              bigdecimal 1.2.0
                              io-console 0.4.2
                              json 1.7.7
                              minitest 4.3.2
                              psych 2.0.0
                              rake 0.9.6
                              rdoc 4.0.0
                              test-unit 2.0.0.0
The Ruby openssl extension was not compiled. Missing the OpenSSL lib?

OpenSSLをインストールしてあるはずなのにOpenSSLがないんじゃない?って言われてます。 実は足りないのはlibssl-devです。

sudo apt-get install libssl-dev

再度インストール

$ rbenv install 2.0.0-p247
Downloading ruby-2.0.0-p247.tar.gz...
-> http://ftp.ruby-lang.org/pub/ruby/2.0/ruby-2.0.0-p247.tar.gz
Installing ruby-2.0.0-p247...
Installed ruby-2.0.0-p247 to /home/skmk/.rbenv/versions/2.0.0-p247

rubyを使えるようにします。

rbenv global 2.0.0-p247
rbenv rehash

バージョン確認します。

$ ruby --version
ruby 2.0.0p247 (2013-06-27 revision 41674) [i686-linux]

OK、入った。 この辺に前提条件のパッケージが書かれてるので、入れとくとよいと思います。
https://github.com/wayneeseguin/rvm/blob/master/scripts/functions/requirements/ubuntu

おわり

GO言語を触ってみた

GO言語を触ってみた。 http://golang.jp/

試しに標準入力からファイルを読み込んで出力するプログラム

package main

import (
        "bufio"
        "fmt"
        "log"
        "os"
)

func main() {
        scanner := bufio.NewScanner(os.Stdin)
        for scanner.Scan() {
                fmt.Println(scanner.Text())
        }
        if err := scanner.Err(); err != nil {
                log.Fatal(err)
        }
}

BOMや改行コードCRはスキップされるので簡易正規化に使えるかもしれない。
引数に指定したURLの内容を出力する。

package main

import (
    "flag"
    "fmt"
    "io/ioutil"
    "net/http"
)

func getContent(url string) (body []byte, err error) {
    resp, err := http.Get(url)
    if err != nil {
        return
    }

    defer resp.Body.Close()
    body, err = ioutil.ReadAll(resp.Body)
    return
}

func main() {
    flag.Parse()
    url := flag.Arg(0)
    content, err := getContent(url)
    if err != nil {
        fmt.Println(err)
    }
    fmt.Println(string(content))
}

JSONとかに渡して何かできそうな気もする(けど今はあまりモチベーションないや)

svn log --xmlの結果を受け取る

package main

import (
        "encoding/xml"
        "fmt"
        "log"
        "os/exec"
)

type Data struct {
        XMLName xml.Name `xml:"log"`
        Entry   []Entry  `xml:"logentry"`
}

type Entry struct {
        Revision int    `xml:"revision,attr"`
        Author   string `xml:"author"`
        Date     string `xml:"date"`
        Message  string `xml:"msg"`
}

func main() {
        xmlFile, err := exec.Command("/usr/bin/svn", "log", "--xml").Output()
        if err != nil {
                log.Fatal(err)
        }
        var data Data
        xml.Unmarshal([]byte(xmlFile), &data)
        for index := range data.Entry {
                fmt.Printf("%#v\n", data.Entry[index])
        }
}

スクリプト言語の気軽さがあるコンパイル言語だけど、イマイチまだ使いどころが見いだせないでいる。

この言語でなければならないという確固たる理由が今のところないからだ。この先、書いてて気持ちよくなるかどうかにかかっているなあ。

Introduction to Node.js

社内勉強会で使用した資料。
すでにいろんな人が資料作ってるのでSlideShareとか漁れば同じようなものがたくさんあるです。
英語なのは、各所から拝借したのを翻訳するのが面倒だったので。その割に配色は本家と合わせたりムダなとこに時間かけてる。
基本的にJavaScriptは食わず嫌いしていて、なんとかこのNode.jsを以て始めるきっかけにしようと思ったけど、やっぱり食わず嫌いしている。
ホントはsocket.ioくらいまでは動かしたかったのだけれど、あまり時間もなかったのでまた改めて。

Failed to create the Java Virtual MachineでEclipseが起動しない、そんなとき

非力なネットブックにEclipseを入れて動かしてみたところ、
「Failed to create the Java Virtual Machine」と表示されて起動しませんでした。
どうやらメモリが足りないらしいです。

eclipse.iniファイルの

-Xms40m
-Xmx512m

の数字を小さくしてみるとよいです。(上はeclipse 4.2.1 JUNOのeclipse.iniのデフォルト値)
メモリ増設前のeeepcで-Xmx128mとかにして起動して喜んでいましたが、実際開発で使い物になるかはビミョウですね。

逆にメモリがふんだんにある環境ではこれらの値を大きくすることでパフォーマンスが改善すると思います。
メモリ増やしてもなんか調子悪い人は、さらに次の行を追加(-vmargsより後に)してパーマネントヒープ領域を確保するとよいらしいです。

--launcher.XXMaxPermSize
256M

ただし上のオプションはeclipse 3.3以上、Windows SUN VMsで有効。

-XX:PermSize=32m
-XX:MaxPermSize=256m

みたいな書き方もありますが、-Xオプションが有効なJVMじゃないとダメっぽいですね。
詳しくは、
FAQ How do I increase the permgen size available to Eclipse?
を見てください。

Apache Slingを動かしてみた2

Apache SlingのDiscover Sling in 15 minutes – the Sling Launchpad 前回の Apache Slingを動かしてみたの続き

Render your content using server-side javascript (ESP)

前回用意したcurlで次のコマンドを実行する。

curl -X MKCOL -u admin:admin http://localhost:8080/apps/foo
curl -X MKCOL -u admin:admin http://localhost:8080/apps/foo/bar
  • -X MKCOL でコレクションの作成。 Jackrabbitで言うノード、Windowsで言うフォルダの作成みたいなもの。 appsの下にfooを作って、さらにその下にbarというコレクションを作っている。
  • -u でユーザー名:パスワード を指定

カレントディレクトリ(C:\work)にhtml.esp という名前で次の内容のファイルを作成しておく。

<html>
  <body>
    <h1><%= currentNode.title %></h1>
  </body>
</html>

.espは Embedded Server Pages というもので、 HTMLに埋め込まれたスクリプトがサーバーサイドで処理されてクライアントに送られる。(Server Pages)

ファイルを作成したら次のコマンドでapps/foo/bar以下にアップロードする。

curl -u admin:admin -T html.esp http://localhost:8080/apps/foo/bar/html.esp

以下のURLにアクセスすると http://localhost:8080/content/mynode.html some title と表示される。

ちなみにhtml.espをアップロードするまえにhttp://localhost:8080/content/mynode.html へアクセスするとダンプ画面。

Resource Propertiesのtitle:”some title”がheader.espで処理されて表示されるのだね。titleは特に指定はしていないのでデフォルトでこの値になるのだろう。

Additional examples

Let Sling generate the path of a newly created node. 次の例はblogノードを作って、タイトルをつけている。

curl -X POST -u admin:admin "http://localhost:8080/content/blog"
curl -D - -u admin:admin -F"title=Adventures with Sling" "http://localhost:8080/content/blog/"

新しいノードを追加すると勝手にユニークな名前をつけてくれる。 curlの-Dオプションで以下のようなheaderもdumpも出力される。

HTTP/1.1 100 Continue

HTTP/1.1 201 Created
Location: /blog/adventures_with_slin
Content-Type: text/html; charset=utf-8
Transfer-Encoding: chunked
Server: Jetty(6.1.x)

Locationにあるとおり、adventures_with_slinという20文字の名前がついている。 http://localhost:8080/blog/adventures_with_slin.html

Add a page header with sling.include

あとは同じ要領でespとcurlを駆使してノードを追加したりファイルをアップロードしたりしている。 こうしてパーツを組み合わせていけば、ページのデザインが出来ていく。 それに上の新しいノード追加の例を組み合わせれば、簡易的なブログサービスが出来上がってしまう。 詳しくは

46 Line Blogを参照。 コンテンツを出し入れする仕組みはほぼ整っているので、入れ物(コンテンツリポジトリ)を決めるのととViewに専念すればよい。

Apache Slingを動かしてみた

http://sling.apache.org/

"Apache Sling"

Apache Slingはコンテンツの保存先としてJavaコンテンツリポジトリ(JCR)を利用とするWebフレームワーク。Slingを利用することで、コンテンツを管理・アップデートできるRESTful APIを提供する。アプリケーションコンポーネントをOSGiバンドルやスクリプト、テンプレートといった形でコンテンツリポジトリ内に格納でき、OSGiのメリットを利用できるのも特徴となる。2009年6月、ASFのトップレベルプロジェクトに昇格している。 ASFがWebフレームワーク「Apache Sling 6」を公開、22ヶ月ぶりのリリース

Discover Sling in 15 minutes

Discover Sling in 15 minutes の手順に従って、早速このApache Slingを動かしてみた。環境はWindows7(32bit)

Start the Launchpad

org.apache.sling.launchpad-6-standalone.jarC:\work 以下にダウンロード。

java -jar org.apache.sling.launchpad-6-standalone.jar

を実行してみると

14.10.2012 23:52:22.102 *ERROR* [main] Failed to Star
t OSGi framework org.osgi.framework.BundleException: Uncaught Instantiation Issu
e: java.lang.ArrayIndexOutOfBoundsException: -1

いきなりエラー。

Apache Sling – exception when starting

Javaのバージョンが1.7なのがいけないらしい。1.6で実行してみたら動いた。

C:\work>"C:\Program Files\Java\jdk1.6.0_35\bin\java.exe" -jar org.apache.
sling.launchpad-6-standalone.jar
14.10.2012 23:55:59.220 *INFO* [main] Setting sling.home=sling (default)
14.10.2012 23:55:59.234 *INFO* [main] Starting Sling in sling (C:\work\sling
)
14.10.2012 23:55:59.289 *INFO* [main] Renaming current launcher jar org.apac
he.sling.launchpad.base.jar.1350226341674 to org.apache.sling.launchpad.base.jar
14.10.2012 23:55:59.450 *INFO* [main] Checking launcher JAR in folder sling
14.10.2012 23:55:59.584 *INFO* [main] Existing launcher is up to date, using
it: 2.3.0 (org.apache.sling.launchpad.base.jar)
14.10.2012 23:55:59.592 *INFO* [main] Loading launcher class org.apache.slin
g.launchpad.base.app.MainDelegate from org.apache.sling.launchpad.base.jar
14.10.2012 23:55:59.648 *INFO* [main] Starting launcher ...
14.10.2012 23:55:59.664 *INFO* [main] HTTP server port: 8080
14.10.2012 23:56:07.375 *INFO* [main] Startup completed

実行したフォルダ以下に、C:\work\sling というフォルダが出来ているので中を覗いてみると

  • C:\work\sling\felix
  • C:\work\sling\jackrabbit

というフォルダがある。実はこれはそれぞれ以下のものに対応している。

Apache Felix

OSGi(Open Services Gateway initiative)仕様を実装したフレームワーク。OSGiは、Javaモジュールの実行や設定管理を行うフレームワーク。

Apache Jackrabbit

Java用コンテンツリポジトリ。JCR(JSR 170 および 283)に完全準拠している。

CRXArchitecture http://www.slideshare.net/paolomoz/jcr-and-sling-quick-dive

ベースにはコンテンツリポジトリのJackrabbitがいて、felixにより管理している。 ユーザーはSlingによりRESTful APIを通じてこれらを操作することができるものということらしい。

Create some content

次の手順を実行するためにcurlを用意しておく

http://curl.haxx.se/ 今回はWindows7環境なので、以下からcurlを入手した。ちょっと試すだけなのでSSL無しのバージョンでOK

http://www.paehl.com/open_source/?CURL_7.28.0 ダウンロードしてzipを展開し、curl.exeをC:\work直下へ置いた。ここで作業することにする。

http://localhost:8080/content/mynode.html へいきなりアクセスしてみると、当然コンテンツはないので No Resource Found(404)となる。

ここでコンテンツを作るcurlコマンドを実行してみる。

curl -u admin:admin -F"sling:resourceType=foo/bar" -F"title=some title" http://localhost:8080/content/mynode

実行するとHTMLがコンソールに出力される。

http://localhost:8080/content/mynode.html へアクセスすると今度はHtmlRedererServletがリソースをダンプして返す。

リソースのパス、メタデータ、タイプ、スーパータイプおよびリソースのプロパティが表示される。 リソースのプロパティはJSON形式で取得できる。 http://localhost:8080/content/mynode.json にアクセスするか、以下のcurlコマンドを実行する。

curl http://localhost:8080/content/mynode.json


$ curl http://localhost:8080/content/mynode.json
{"title":"some title","sling:resourceType":"foo/bar","jcr:primaryType":"nt:unstructured"}

ところでトップ(http://localhost:8080/)の「browse the resource tree by clicking here」から Sling Explorerというものが使える。

contentの下にmynodeがあることがわかる。 次回へ続く

Microsoft Office文書をOpenXML形式に変換する

Microsoft Office文書(Word,Excel,PowerPoint)をOpenXML形式に変換したい、そんなとき。

やりたいこと

要は次のようにしたい。

.doc
Microsoft Word 97-2003 文書
.docx
Microsoft Word 文書
.xls
Microsoft Excel 97-2003 ワークシート
.xlsx
Microsoft Excel ワークシート
.ppt
Microsoft PowerPoint 97-2003 プレゼンテーション
.pptx
Microsoft PowerPoint プレゼンテーション

もちろん、それぞれのソフトウェアを起動して「名前を付けて保存」するときに形式を指定してやればよいのだけれど、
ファイルが大量にあるときにはバッチ的に処理したい。

変換ツール

そこで、
2007 Microsoft Office System Migration Guidance: Microsoft Office Migration Planning Manager
Microsoft Office Compatibility Pack for Word, Excel, and PowerPoint File Formats
以上の2つをインストールすればそれができるらしい。

上のリンク先のガイド通りにインストールすると、 C:\ompm\ 以下にいろいろ展開される。
C:\ompm\Tools\ofc.ini の fldrに変換したい文書の入ってるフォルダを指定して実行。

ところが

PowerPoint(.ppt)がうまく変換されない。64bitマシンを使っていたせいか、C:\Program Files\Microsoft Office\Office14 に
Wordconv.exeとexcelcnv.exe はあるのに、PowerPointを変換しそうなヤツが見当たらないせいでエラーになる。
C:\Program Files (x86)\Microsoft Office\Office12 にPPCNVCOM.exeがいた。ついでにここにWordconv.exeとexcelcnv.exeもいた。

というわけでofc.exeなど使わずに、この3つを直接使うことに決めた。

それでコマンドプロンプトでなんとかしようとしたら、前記事「Windowsのコマンド・プロンプトの拡張子の取り扱い」の罠にはまった。
テキトーにやるとdocとdocx,xlsとxlsx,pptとpptxが区別できなくなったりするので注意。

変換コマンドの使い方

それぞれの使い方。出力ファイル名の拡張子にはxつけてあげる。

"C:\Program Files (x86)\Microsoft Office\Office12\Wordconv.exe" -oice -nme input_file output_file
"C:\Program Files (x86)\Microsoft Office\Office12\excelcnv.exe" -nme -oice input_file output_file
"C:\Program Files (x86)\Microsoft Office\Office12\PPCNVCOM.EXE" -oice input_file output_file

それにしてもこのコマンド群の統一感の無さ。とにかく見事にバラバラである。
● 変換の略し方(conv, cnv, CNVCOM)
● 大文字小文字(Word, excel PP)
● オプション引数の順序と数
オプションの意味はよくわからんのだが、順番がわりと大事だったりする。excelcnv.exe で -oice -nme って書いても動いてくれないのだ。
PowerPointでは-nme付かないし、いったいどうしてこんなことになちゃうんだろうか。

「こいつら全く別物だぜ!」というアピールなんだろうか。ユーザーはそんなの望んでないよね。
インターフェースの悪い例の良い見本だね。勉強になるね!

ところでこのdocx,xlsx,pptxにしたらサイズが小さくなったのだけど、これって要はzipでXMLファイルが圧縮されているのだね。
docx,xlsx,pptxをそれぞれzipという拡張子に変更して展開すれば、中にXMLファイルが入っているよ。

Windowsのコマンド・プロンプトの拡張子の取り扱い

[NT] コマンド プロンプトでの拡張子の取り扱い http://support.microsoft.com/kb/164351/ja

コマンド プロンプトからワイルドカードを使ってファイル管理を行う場合、3 文字を超える長い拡張子は、3 文字に切り詰められて取り扱われます。 というわけで、上のリンクのガイドに従って、レジストリエディタで HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem Win95TruncatedExtensions : REG_DWORD を 0 へ変更(デフォルトは 1)して、再起動 ところが、もう一度試してみても、やっぱり3 文字に切り詰められて取り扱われるのか、以下のようなコマンドを実行すると、ひっかかって欲しくない拡張子4文字以上のファイルもヒットしてしまう。

> dir /B *.htm
index.htm
index.html

このレジストリ値を変える以前に作ったファイルには効かないようだ。レジストリ変更後に作った拡張子4文字以降のファイルはちゃんとその通り扱われていた。 うっかり削除なんて事故も起きかねない。コマンド・プロンプトでワイルドカードを使うときは十分注意が必要だね。

Google +1ボタンをWordPressに設置する

Google +1 ボタンをWordpressに設置する方法。
+1ボタンとは、字の通りイチオシといったところかな。


Google +1
  Add +1 to your pages to help your site stand out


上のリンク先に行って、SizeとLanguageを選ぶと埋め込みコードができるよ。

SizeをMedium(20px)、LanguageをJapaneseにした場合は次のようなコードができあがる。

<!-- Place this tag in your head or just before your close body tag -->
<script type="text/javascript" src="http://apis.google.com/js/plusone.js">
  {lang: 'ja'}
</script>

<!-- Place this tag where you want the +1 button to render -->
<g:plusone size="medium"></g:plusone>

あとはこのコードのコメントにあるとおりにすればOK。
外観→テーマ編集で
ヘッダー(header.php)のの直前に上の埋め込みコードの前半部分を貼り付ける。

<script type="text/javascript" src="http://apis.google.com/js/plusone.js">
  {lang: 'ja'}
</script>

単一記事の投稿(single.php)で表示したい部分に後半の

<g:plusone size="medium"></g:plusone>

を貼り付ければOK。

ところで、このブログのホームには記事が何件も並んでるけど、メインインデックスのテンプレート(index.php)に上のコードをそのまま貼り付けると、
記事ごとに+1ボタンをつけたつもりが、どれを押してもホームのURLに対しての+1になってしまう。

そんなときは、Wordpressのメインインデックスのテンプレート(index.php)で、href属性に記事のパーマリンクを指定すれば、個別の記事ごとへの+1ボタンが作れるよ。

<g:plusone size="medium" href="<?php the_permalink(); ?>"></g:plusone>

このURLを作為的にどこかのURLにしておけば、そうとは知らないユーザーが見ているページに+1をつけたつもりがほかのページがイチオシされちゃうわけだね。

たとえば、
個別記事の+1ボタンのhrefにすべてサイトのホームのURLを指定しておけば、どの記事で+1を押されてもサイト全体の+1として集約したりできるね。
これはFacebookのいいね!やTwitterのボタンでも同様だね。

その他の詳しい属性などについては、

+1 ボタンをサイトに追加(Google Code)

を見てくださいね。