01 Jun 2014, 08:20

TaskJugglerを利用してorg-modeからガントチャートを作成してみる

はじめに

org-modeでタスク管理をしているのだけれども、 いくつかのプロジェクトをガントチャートで見る方法がないか調べてみた。

TaskJugglerというツールが使えそうなので、ちょっくら試してみた。

TaskJugglerについて

TaskJugglerは、オープンソースのプロジェクト管理ツール。

特徴は、以下。

  • ガントチャート
  • コマンドラインベース
  • プレーンテキスト管理

なんとも自分にとってはうれしい内容。

10年以上つづいているプロジェクトらしく、 ドキュメントが充実しているところがさらにうれしい。

Install

<div class="outline-text-3" id="text-2-1">
  <p>
    Rubyでかかれているので、gem installでいける。簡単簡単。
  </p>

  <div class="org-src-container">
    <pre class="src src-language">% gem install taskjuggler

% tj3 –version TaskJuggler v3.5.0 - A Project Management Software

  <ul class="org-ul">
    <li>
      <a href="http://www.taskjuggler.org/tj3/manual/Installation.html#Installation">Installation</a>
    </li>
  </ul>

  <p>
    サンプルプロジェクトを試してみる。
  </p>

  <div class="org-src-container">
    <pre class="src src-language">wget http://taskjuggler.org/tj3/examples/Tutorial/tutorial.tjp

tj3 tutorial.tjp

  <p>
    htmlが生成される。Overview.htmlを開いてみる。
  </p></p>
</div></p>

Org-modeでつかう

org-modeには、taskjugglerを使うためのelがすでにはいっている。以下をrequireする。

(require 'ox-taskjuggler)

<p>
  以下のコマンドでorgからtjpに変換できる。
</p>

<ul class="org-ul">
  <li>
    org-taskjuggler-export
  </li>
  <li>
    org-taskjuggler-export-and-
  </li>
  <li>
    org-taskjuggler-export-process-and-open
  </li>
</ul>

<p>
  org-exportの一部として動くのでよい。
</p></p>

サンプル

Resourceを設定しないと、デフォルトでリソースが tsu-neraになるが、 -という文字でsyntax errorになるので、allocate属性をつけた。

 * TaskJuggler search                   :taskjuggler_project:
 ** test
    :PROPERTIES:
    :task_id:  taskjuggler
    :allocate: tsune
    :Effort:   2h
    :END: 
  
 * Resources                           :taskjuggler_resource:
 ** Developers
    :PROPERTIES:
    :resource_id: tsune
    :END:

<p>
  <img src="http://lh4.ggpht.com/-PRa1tPiOxow/U4rhSe3INKI/AAAAAAAABEo/9u73Ez3Pp1s/2014-06-01-171555_796x882_scrot.png" /> </div>
</p>

まとめ

<div class="outline-text-2" id="text-5">
  <p>
    これは、使いこなせば強力なツールになりそうだ。org-modeとの連携がいい。
  </p></p>
</div></p>

その他。

<div class="outline-text-2" id="text-6">
</div>

<div id="outline-container-sec-6-1" class="outline-3">
  <h3 id="sec-6-1">
    Special Thanks
  </h3>

  <div class="outline-text-3" id="text-6-1">
    <p>
      TaskJuggler Offical Document
    </p>

    <ul class="org-ul">
      <li>
        <a href="http://www.taskjuggler.org/tj3/manual/toc.html">Index</a>
      </li>
    </ul>

    <p>
      org-manual
    </p>

    <ul class="org-ul">
      <li>
        <a href="http://www.gnu.org/software/emacs/manual/html_node/org/TaskJuggler-export.html">TaskJuggler export &#8211; The Org Manual</a>
      </li>
    </ul>

    <p>
      github
    </p>

    <ul class="org-ul">
      <li>
        <a href="https://github.com/taskjuggler/TaskJuggler">taskjuggler/TaskJuggler</a>
      </li>
    </ul>

    <p>
      ちょっとふるい。
    </p>

    <ul class="org-ul">
      <li>
        <a href="http://orgmode.org/worg/org-tutorials/org-taskjuggler.html">Creating Gantt charts by Exporting to TaskJuggler</a>
      </li>
    </ul>

    <p>
      TaskJuggler 3に対応した記事。
    </p>

    <ul class="org-ul">
      <li>
        <a href="http://orgmode.org/worg/exporters/taskjuggler/ox-taskjuggler.html">Exporting Gantt charts with Taskjuggler v3 (tj3)</a>
      </li>
    </ul>

    <p>
      日本語の記事。
    </p>

    <ul class="org-ul">
      <li>
        <a href="http://ichiroc.hatenablog.com/entry/2010/05/16/000500#">org-mode で管理しているプロジェクトをガントチャートにする &#8211; ichiroc subset</a>
      </li>
    </ul>
  </div></p>
</div>

<div id="outline-container-sec-6-2" class="outline-3">
  <h3 id="sec-6-2">
    Environment
  </h3>

  <div class="outline-text-3" id="text-6-2">
    <ul class="org-ul">
      <li>
        Ruby 2.0.0
      </li>
      <li>
        TaskJuggler 3.5
      </li>
      <li>
        Linux Mint 16
      </li>
    </ul>
  </div></p>
</div></p>

01 Jun 2014, 05:01

Lets Noteを買ったのでとりあえずWindows8とArchLinuxのデュアルブートにしてみた

はじめに

新しいノートPCを買った。Panasonicの Let’s Note.

いままで散々弄りまわしてきたVAIOだけれど、 最近になって裏のネジがなくなってしまった。 そのため、ディスプレイが今にも外れそうな危ない状態だ。

VAIOには名残惜しいものの、このままだといつ壊れてもおかしくない。 そんなわけで、新しいPCを買うことになった。 本心は、再びVAIOを購入したいところだったが、VAIOがヨドバシに売っていなかった。

ヨドバシの店頭においてある一番高い、30万に届くような高スペックのLet’s Noteを購入。

最高スペックには最高のOSを!

ということで、Windows8とArchLinuxとのデュアルブートにすることにした。

以下は、インストールするまでの作業メモです。

[toc]

Windows側での事前準備

まず、購入時にはWindows8.1がすでにインストールされている。 デュアルブート化のための準備をWindows側でする。

ArchLinux ディストリビューションを取得

<div class="outline-text-3" id="text-2-1">
  <p>
    以下から、最新版をダウンロード。日本のミラーサイトからダウンロードする。
  </p>

  <ul class="org-ul">
    <li>
      <a href="https://www.archlinux.org/download/">Arch Linux &#8211; Downloads</a> <ul class="org-ul">
        <li>
          archlinux-2014.05.01-dual.iso
        </li>
      </ul>
    </li>
  </ul>
</div></p>

インストール用にUSBメモリ作成

<div class="outline-text-3" id="text-2-2">
  <p>
    USBWriter for Windowsで、ダウンロードしたISOファイルをUSBメモリに焼く。
  </p>

  <ul class="org-ul">
    <li>
      <a href="http://sourceforge.net/projects/usbwriter/">USBWriter | Free software downloads at SourceForge.net</a>
    </li>
  </ul>
</div></p>

高速スタートアップ解除

<div class="outline-text-3" id="text-2-3">
  <p>
    手順にしたがって、高速スタートアップを無効にする。
  </p>

  <ul class="org-ul">
    <li>
      <a href="http://www.eightforums.com/tutorials/6320-fast-startup-turn-off-windows-8-a.html">Fast Startup &#8211; Turn On or Off in Windows 8</a>
    </li>
  </ul>
</div></p>

パーティションを切る

<div class="outline-text-3" id="text-2-4">
  <p>
    コントロールパネル→管理ツール→コンピュータの管理→記憶域→ディスクの管理を機動起動。
  </p>

  <p>
    購入時、ドライブ構成はこんな感じ。
  </p>

  <ul class="org-ul">
    <li>
      合計 240GB <ul class="org-ul">
        <li>
          回復パーティション 800MB
        </li>
        <li>
          EFIシステムパーティション 260MB
        </li>
        <li>
          Cドライブ 221GB
        </li>
        <li>
          回復パーティション 15GB
        </li>
      </ul>
    </li>
  </ul>

  <p>
    CドライブからArchLinux用のパーティションを切り出す。 150GB/70GBの 2対1くらいの比率にしておくか。適当だけど。
  </p></p>
</div></p>

リカバリディスク作成

<div class="outline-text-3" id="text-2-5">
  <p>
    いざというときのために、リカバリディスクを作成。 これはノートPCの説明書にしたがった。
  </p></p>
</div></p>

FAQを読む/ArchWayを読む

<div class="outline-text-3" id="text-2-6">
  <p>
    FAQとArch Wayを読んで、インストールして後悔しないか再度確認。
  </p>

  <ul class="org-ul">
    <li>
      <a href="https://wiki.archlinux.org/index.php/FAQ_(%E6%97%A5%E6%9C%AC%E8%AA%9E)">FAQ (日本語) &#8211; ArchWiki</a>
    </li>
    <li>
      <a href="https://wiki.archlinux.org/index.php/The_Arch_Way_(%E6%97%A5%E6%9C%AC%E8%AA%9E)">The Arch Way (日本語) &#8211; ArchWiki</a>
    </li>
  </ul>
</div>

<div id="outline-container-sec-2-6-1" class="outline-4">
  <h4 id="sec-2-6-1">
    KISS
  </h4>

  <div class="outline-text-4" id="text-2-6-1">
    <p>
      Keep It Simple, Stupid.
    </p>

    <p>
      シンプルにしとけよ、このバカチンが
    </p></p>
  </div></p>
</div></p>

ArchLinuxのインストール

基本的には以下のページにしたがう。

USBメモリから起動

<div class="outline-text-3" id="text-3-1">
  <p>
    F2からBIOSの設定を変更して、USBメモリから起動する。
  </p>

  <p>
    いきなりエラーしてワクワクするO(〃⌒▼⌒〃)O
  </p>

  <div class="org-src-container">
    <pre class="src src-language">failed to start loader

  <ul class="org-ul">
    <li>
      <a href="https://teksyndicate.com/forum/linux/loaderefi-error-arch-linux/168495">Loader.efi error Arch Linux | Tek Syndicate</a>
    </li>
  </ul>

  <p>
    Secure Bootが怪しいということで、以下のガイダンスにしたがう。
  </p>

  <ul class="org-ul">
    <li>
      <a href="https://wiki.archlinux.org/index.php/Unified_Extensible_Firmware_Interface#Secure_Boot">Unified Extensible Firmware Interface &#8211; ArchWiki</a>
    </li>
  </ul>

  <p>
    rootでログイン成功。
  </p></p>
</div></p>

言語の選択

<div class="outline-text-3" id="text-3-2">
  <p>
    キーマップで日本語を設定。
  </p>

  <div class="org-src-container">
    <pre class="src src-sh">loadkeys jp106

  <p>
    文字コードも設定。
  </p>

  <div class="org-src-container">
    <pre class="src src-sh">nano /etc/locale.gen

ja_JP.UTF-8 UTF-8

locale-gen export LANG=ja_JP.UTF-8

無線の設定

<div class="outline-text-3" id="text-3-3">
  <p>
    pingしてダメなことを確認する。unknown hostと出てきた。
  </p>

  <div class="org-src-container">
    <pre class="src src-sh">ping -c 3 www.google.com

  <div class="org-src-container">
    <pre class="src src-sh">iw dev

phy#0 Interface wlp2s0

ip link set wlp2s0 up

  <p>
    エラーした。
  </p>

  <div class="org-src-container">
    <pre class="src src-sh">RTNELINK answerss: Operation not possible do to RF-kill

  <p>
    wifiの物理スイッチがOffになってただけだった。スイッチオンしたら成功。
  </p>

  <div class="org-src-container">
    <pre class="src src-sh">wifi-menu wlp2s0

  <p>
    wifi-menuではdhcp設定がうまくいかない。手動設定でうまくいった。pingも通る。
  </p>

  <div class="org-src-container">
    <pre class="src src-sh">wpa_supplicant -B -i wlp2s0 -c &lt;(wpa_passphrase <span style="color: #e6db74;">"ssid"</span> <span style="color: #e6db74;">"psk"</span>)

dhcpcd wlp2s0

パーティションを切る

<div class="outline-text-3" id="text-3-4">
  <p>
    以下を参考にパーティションを考える。
  </p>

  <ul class="org-ul">
    <li>
      <a href="https://wiki.archlinux.org/index.php/Partitioning_(%E6%97%A5%E6%9C%AC%E8%AA%9E)#GPT_.E3.81.8B_MBR_.E3.81.AE.E9.81.B8.E6.8A.9E">Partitioning (日本語) &#8211; ArchWiki</a>
    </li>
  </ul>

  <p>
    こんな感じ。swap領域はwikiを信じて作成しない。 rootとhomeを分けておくと rm -rfしたときにデータ復旧できる。
  </p>

  <ul class="org-ul">
    <li>
      / 20GB
    </li>
    <li>
      /home 130GB
    </li>
  </ul>

  <p>
    /bootは、EFI system partitionがあるのでそれをつかう。 (この用語についてはあとでまたでてくる)
  </p></p>
</div>

<div id="outline-container-sec-3-4-1" class="outline-4">
  <h4 id="sec-3-4-1">
    gdisk
  </h4>

  <div class="outline-text-4" id="text-3-4-1">
    <p>
      パーティションツールは、SSDを長持ちさせるために、GPTに対応したgdiskを利用する。
    </p>

    <p>
      (以前つかったことがある GPartedを試みたものの、GPTの設定方法がわからなかった。 どうも一旦すべてのパーティションを削除しないとgptは設定できないようだった)
    </p>

    <div class="org-src-container">
      <pre class="src src-sh">gdisk /dev/sda

    <p>
      nコマンドでパーティション追加。
    </p>

    <ul class="org-ul">
      <li>
        Parttition number は defaultなので Enter
      </li>
      <li>
        First sector は defaultなので Enter
      </li>
      <li>
        Last sector は +20G/Enter
      </li>
      <li>
        GUIDは は defaultなので Enter
      </li>
    </ul>

    <p>
      最後にwでディスクに書き込む。
    </p></p>
  </div></p>
</div></p>

ファイルシステムの作成

<div class="outline-text-3" id="text-3-5">
  <p>
    ext4でパーティションをフォーマットする。
  </p>

  <p>
    まずは、lsblkで device nameを確認
  </p>

  <div class="org-src-container">
    <pre class="src src-sh">lsblk

  <p>
    容量と見比べて、今回は以下が対象。
  </p>

  <ul class="org-ul">
    <li>
      sda7 20G Root用
    </li>
    <li>
      sda8 126G home用
    </li>
  </ul>

  <div class="org-src-container">
    <pre class="src src-sh">mkfs.ext4 /dev/sda7

mkfs.ext4 /dev/sda8

  <p>
    lsblk -fでFSTYPEがext4であることを確認。
  </p></p>
</div></p>

パーティションのマウント

<div class="outline-text-3" id="text-3-6">
  <p>
    パーティションをマウントする。
  </p>

  <div class="org-src-container">
    <pre class="src src-sh">mount /dev/sda7 /mnt

mkdir /mnt/home mount /dev/sda8 /mnt/home

  <p>
    EFI system partitionを /boot/efiにマウントする。
  </p>

  <div class="org-src-container">
    <pre class="src src-sh">mkdir -p /mnt/boot/efi

mount /dev/sda2 /mnt/boot/efi

ミラーの選択

<div class="outline-text-3" id="text-3-7">
  <p>
    とりあえず、jaistとtukubaを最優先に設定。
  </p></p>
</div></p>

ベースシステムのインストール

<div class="outline-text-3" id="text-3-8">
  <p>
    ついにインストール。
  </p>

  <div class="org-src-container">
    <pre class="src src-sh">pacstrap -i /mnt base base-devel

fstabの生成

<div class="outline-text-3" id="text-3-9">
  <div class="org-src-container">
    <pre class="src src-sh">genfstab -U -p /mnt &gt;&gt; /mnt/etc/fstab

Chroot とベースシステムの設定

arch-chroot /mnt /bin/bash

<p>
  ごちゃごちゃしているのでメモは省略。
</p></p>

ブートローダ設定

ブートローダは使ったことがあるGRUBにする。

べんきょ

<div class="outline-text-3" id="text-5-1">
  <p>
    まずは、用語がわからないので、wikiをざっとながめる。
  </p>

  <ul class="org-ul">
    <li>
      <a href="https://wiki.archlinux.org/index.php/Unified_Extensible_Firmware_Interface_(%E6%97%A5%E6%9C%AC%E8%AA%9E)">Unified Extensible Firmware Interface (日本語) &#8211; ArchWiki</a>
    </li>
    <li>
      <a href="https://wiki.archlinux.org/index.php/GUID_Partition_Table_(%E6%97%A5%E6%9C%AC%E8%AA%9E)">GUID Partition Table (日本語) &#8211; ArchWiki</a>
    </li>
    <li>
      <a href="https://wiki.archlinux.org/index.php/UEFI_Bootloaders_(%E6%97%A5%E6%9C%AC%E8%AA%9E)">Boot Loaders (日本語) &#8211; ArchWiki</a>
    </li>
  </ul>

  <p>
    つぎに自分のシステムがUEFIとGPTに対応しているか調べる。
  </p>

  <div class="org-src-container">
    <pre class="src src-sh">parted /dev/sda print

  <p>
    冒頭にPartition Table:gpt, リストの2番目に EFI system partitionとかいてある。 どうやらGPTとESPがあるもよう。さすが、最新式。
  </p></p>
</div></p>

GRUBインストール

<div class="outline-text-3" id="text-5-2">
  <p>
    Arch WikiのUEFIシステムのインストール手順にしたがう。ツールを入れる。
  </p>

  <div class="org-src-container">
    <pre class="src src-sh">pacman -S grub efibootmgr dosfstools

  <p>
    以下のコマンドでインストール
  </p>

  <div class="org-src-container">
    <pre class="src src-sh">grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=grub --recheck --debug

デュアルブート対応

<div class="outline-text-3" id="text-5-3">
  <p>
    これもwikiにしたがう。
  </p>

  <div class="org-src-container">
    <pre class="src src-sh">pacman -S os-prober

grub-mkconfig -o /boot/grub/grub.cfg

  <p>
    grub-mkconfigがエラーする。 os-proberを単体で実行しても同じエラーメッセージがでる。 os-proberを削除するとエラーがでない。どうもこれが悪いみたい。
  </p>

  <ul class="org-ul">
    <li>
      <a href="http://unix.stackexchange.com/questions/105389/arch-grub-asking-for-run-lvm-lvmetad-socket-on-a-non-lvm-disk">partition &#8211; Arch GRUB asking for /run/lvm/lvmetad.socket on a non lvm disk &#8211; Unix & Linux Stack Exchange</a>
    </li>
  </ul>

  <p>
    manualで grub menuを設定する。/etc/grub.d/40_customを編集。 以下を書くことで、grubのmenuにwindowsを表示できる。ArchLinuxはかってに表示される。
  </p>

  <div class="org-src-container">
    <pre class="src src-language">#!/bin/sh

exec tail -n +3 $0

This file provides an easy way to add custom menu entries. Simply type the

menu entries you want to add after this comment. Be careful not to change

the ‘exec tail’ line above.

if [ “${grub_platform}” == “efi” ]; then menuentry “Microsoft Windows 8.1 x86_64 UEFI-GPT” { echo “Loading Microsoft Windows 8.1…” insmod part_gpt insmod fat insmod search_fs_uuid insmod chain search –fs-uuid –set=root $hints_string $uuid chainloader /EFI/Microsoft/Boot/bootmgfw.efi } fi

menuentry “System shutdown” { echo “System shutting down…” halt }

menuentry “System restart” { echo “System rebooting…” reboot }

  <div class="org-src-container">
    <pre class="src src-sh"><span style="color: #a9a9a9;"># </span><span style="color: #a9a9a9;">uuid</span>

grub-probe –target=fs_uuid /boot/efi/EFI/Microsoft/Boot/bootmgfw.efi 1231-C3B2 # hints_string grub-probe –target=hints_string /boot/efi/EFI/Microsoft/Boot/bootmgfw.efi –hint-bios=hd0,gpt2 –hint-efi=hd0,gpt2 –hint-baremetal=ahci0,gpt2

  <p>
    /boot/grub/grub.cfgに反映させる。このコマンドでgrub.cfgに追記される。
  </p>

  <div class="org-src-container">
    <pre class="src src-sh">grub-mkconfig -o /boot//grub/grub.cfg

  <p>
    ここまで完了したら、reboot!
  </p>

  <p>
    再起動してgrubメニューにArchLinuxとWindowsが表示されていることを確認。今日はつかれたので、ここまで。
  </p></p>
</div></p>

参考にしたページのBookMarks

ArchLinuxとは

<div class="outline-text-3" id="text-6-1">
  <ul class="org-ul">
    <li>
      <a href="http://dic.nicovideo.jp/a/arch%20linux">Arch Linuxとは (アーチリナックスとは ) &#8211; ニコニコ大百科</a>
    </li>
    <li>
      <a href="http://divide-et-impera.org/archives/1388">Ubuntuに飽きた俺達の楽園はArch Linuxにあった | Divide et impera</a>
    </li>
    <li>
      <a href="http://zaka-think.com/linux/archlinux/archlinux%E3%82%92%E3%82%84%E3%82%81%E3%81%9F%E7%90%86%E7%94%B1/">Archlinuxをやめた理由 | ざかしんく</a>
    </li>
  </ul>
</div></p>

インストール

<div class="outline-text-3" id="text-6-2">
  <ul class="org-ul">
    <li>
      <a href="https://wiki.archlinux.org/index.php/Installation_Guide_(%E6%97%A5%E6%9C%AC%E8%AA%9E)">Installation Guide (日本語) &#8211; ArchWiki</a>
    </li>
    <li>
      <a href="https://wiki.archlinux.org/index.php/Beginners'_Guide_(%E6%97%A5%E6%9C%AC%E8%AA%9E)">Beginners&#8217; Guide (日本語) &#8211; ArchWiki</a>
    </li>
  </ul>
</div>

<div id="outline-container-sec-6-2-1" class="outline-4">
  <h4 id="sec-6-2-1">
    Arch Linux のリリースを USB ドライブに書き込む方法
  </h4>

  <div class="outline-text-4" id="text-6-2-1">
    <ul class="org-ul">
      <li>
        <a href="https://wiki.archlinux.org/index.php/USB_Installation_Media_(%E6%97%A5%E6%9C%AC%E8%AA%9E)">USB Installation Media (日本語) &#8211; ArchWiki</a>
      </li>
      <li>
        <a href="https://wiki.archlinux.org/index.php/Installing_Arch_Linux_on_a_USB_key">Installing Arch Linux on a USB key &#8211; ArchWiki</a>
      </li>
    </ul>
  </div></p>
</div>

<div id="outline-container-sec-6-2-2" class="outline-4">
  <h4 id="sec-6-2-2">
    パーティションの切り方
  </h4>

  <div class="outline-text-4" id="text-6-2-2">
    <ul class="org-ul">
      <li>
        <a href="https://wiki.archlinux.org/index.php/Partitioning_(%E6%97%A5%E6%9C%AC%E8%AA%9E)#GPT_.E3.81.8B_MBR_.E3.81.AE.E9.81.B8.E6.8A.9E">Partitioning (日本語) &#8211; ArchWiki</a>
      </li>
      <li>
        <a href="http://blog.volment.com/archives/=47">実は簡単Arch Linuxのインストール手順! | volment</a>
      </li>
      <li>
        <a href="http://qiita.com/syui/items/1ffec0f12c253cda122b">awesome &#8211; ArchLinuxのGUI環境設を整える vol.1 &#8211; Qiita</a>
      </li>
    </ul>
  </div></p>
</div>

<div id="outline-container-sec-6-2-3" class="outline-4">
  <h4 id="sec-6-2-3">
    デュアルブート関係
  </h4>

  <div class="outline-text-4" id="text-6-2-3">
    <ul class="org-ul">
      <li>
        <a href="https://wiki.archlinux.org/index.php/Windows_and_Arch_Dual_Boot_(%E6%97%A5%E6%9C%AC%E8%AA%9E)">Windows and Arch Dual Boot (日本語) &#8211; ArchWiki</a>
      </li>
      <li>
        <a href="https://wiki.archlinux.org/index.php/GRUB_(%E6%97%A5%E6%9C%AC%E8%AA%9E)#UEFI-GPT_.E3.83.A2.E3.83.BC.E3.83.89.E3.81.A7.E3.82.A4.E3.83.B3.E3.82.B9.E3.83.88.E3.83.BC.E3.83.AB.E3.81.95.E3.82.8C.E3.81.9F_Windows_.E3.81.AE.E3.83.A1.E3.83.8B.E3.83.A5.E3.83.BC.E3.82.A8.E3.83.B3.E3.83.88.E3.83.AA">GRUB (日本語) &#8211; ArchWiki</a>
      </li>
      <li>
        <a href="http://d.hatena.ne.jp/godai_0519/20140128/1390919028">ThinkPad X240をArch Linuxとのデュアルブートにするメモ &#8211; 堕(惰)プログラマ開発記録</a>
      </li>
      <li>
        <a href="https://spica.pw/blog/archives/=157">x240にArchとWindows8.1を共存させる | In the Spica</a>
      </li>
    </ul>
  </div></p>
</div></p>

その他

<div class="outline-text-3" id="text-6-3">
  <ul class="org-ul">
    <li>
      <a href="https://qiita.com/tags/archlinux">archLinuxに関する32件の投稿 &#8211; Qiita</a>
    </li>
    <li>
      <a href="http://qiita.com/xorphitus/items/3711895eb5d9f946c782">Arch Linux快適デスクトップ環境の構築 &#8211; Qiita</a>
    </li>
    <li>
      <a href="http://futurismo.biz/archives/2064">Windowsと Mint Linuxのデュアルブート環境をVAIOに構築した手順メモ | Futurismo</a>
    </li>
  </ul>
</div></p>

30 May 2014, 14:25

今の仕事のプロジェクト状況について

はじめに

今日は、愚痴な日記です。

不快に感じる人もいると思うので、そう感じたらreturnをお願いします。

ブログに個人的な感情をスケッチすることも、 あとで見返したときに懐かしく思うかもしれないので、 とりあえず今の感情を残しておく。

会議室によびだされる

今、会社で関わっているプロジェクトがうまくいっていない。

うまくいっていないというのは、 このままだと投資したお金を回収できないと言う意味。

今日は、会社で上司に呼ばれてこんなことをいわれた。

社員ひとりを1ヶ月養うのに、xx万円かかる。

なので、プロジェクトをxヶ月続けるとxx万円かかる。

つまり、1500万円回収しないといけないのにこのままだとぜんぜんダメだよ!

みんなが汗水たらして働いたお金を投資しているのに、こんなこと許されないよ!

この危機感自体は自分も常々感じていて全く同感なのだけれども、 会議室に呼ばれて対面でいわれると心がとてもイタい。

自分の市場価値って

このままだと、数ヶ月携わってきたプロジェクトが打ち切りになってしまう。

このままだと、自分は会社で利益を生み出すどころか、 会社にいくだけで毎日xx万円を消費するだけになってしまう。

自分の1行書くプログラムにどれだけの価値があるのだろうか?

プログラマはスキルによって市場価値が決まるのだときいて、 必死で毎日スキルを磨いているはずなのだが、 自分の生み出す珍妙なプログラムがお金を生み出すのか全く実感として沸かない。 プログラムをビジネスとしてお金につなげる感覚がまるでない。

ましてや、そこから1000万を越えるような利益が生まれるのだろうか?

日本の平均年収が400万円って、スゴいことではないか? 自分には、100万円も自力で稼ぐ自信がない。。。 生産性も平均以下だし、いつも工程遅延を起こすし。 自分の市場価値ってそもそもプラスなのだろうか??

先日先輩に、どうすればお金儲けができるか考えています、と言ったら、

残業すれば?

といわれた。それは、完全にズレている!

inovativeが降りてくるのを待っている

もう少し具体的に今関わっているプロジェクトのことを書くと、いわゆる

“Software-Defined” xxx

に関わるものを作っている。

自分のつくっているものは、世の中にあるものに対して 新規性がなく差別化ができてないというところが、転覆寸前なところだ。

敵はGoogleであり、Amazonであり、EMCであり、HPであり、 とにかく低予算と行き当たりバッタリなスキルでは 東郷平八郎もはだし逃げ出すような状況なのだ。

しかし、方向性は間違っていないと信じている。 Software-Definedを調べれば調べるほど、 これは単なるブームではなくて大きなうねりなることを感じる。 きっと、波に乗ればどんどん追加予算も投資してくれるはず。風は追い風なのだ。

Chuck’s Blogというブログで、 Software-Defined Storageに関する記事が怒涛のように投稿されて刺激された。

インフラまわりに関する知識はまるでシロウトなので、 まずは知識を頭に入れている。タイムリーにCourseraで SDNとOpenStackの講義が始まった。

Chucks氏は、Software-Definedの世界は、新しいなにかが生まれるといっている。

When it gets down to software-defined anything, the real question is — what the heck are we trying to do here?
Is our goal simply to do what we’re doing today, only do it incrementally better?
Or is our goal to re-invent the model of how things get done?

そのなにかをみつけて、実現させたい。 思いつかなければ1500万円がドブにすてられることになる。

お金が稼げるかという観点では、 プロジェクトがいつ打ち切りにされてもしかたがない状況。 それは、妥当な判断だとおもうし、それは早く判断してほしい。 このままだと生きているだけでリソースを食いつぶしてしまうので。

しかし、ようやくプロジェクトに愛着が沸いてきたのだ。 個人的にはなんとか延命させたい。 こんな状況でも、潰れる最後の日まで、希望を信ることにする。

29 May 2014, 12:36

Seleniumをブラウザなしで起動するための方法を調べた

やりたいこと

Seleniumでテストを実行するとき、いちいちブラウザを立ち上げると重くて遅い。

そこで、ブラウザを立ち上げずに、 ヘッドレス(headless)にSeleniumを実行する方法を調べてみた。

Seleniumは実行するブラウザを自由にいれかえることができる。 そこで、特殊なブラウザを指定することによって実現できそうだ。

Environment

<div class="outline-text-3" id="text-1-1">
  <ul class="org-ul">
    <li>
      windows 7 64bit
    </li>
    <li>
      ruby 2.0
    </li>
  </ul>

  <p>
    環境はRuby & Windowsです。
  </p>

  <p>
    [toc]
  </p></p>
</div></p>

Base

このコードを改造する。ベースのドライバは firefox

require "selenium-webdriver"

driver = Selenium::WebDriver.for :firefox
driver.navigate.to "http://google.com"
element = driver.find_element(:name, 'q')
element.send_keys "PhantomJS"
element.submit
puts driver.title

driver.quit

HtmlUnit Driver

HtmlUnit Driverの特徴は、

  • HtmlUnit は GUI を持たない WebBrowser の Java ベースの実装
  • ava 以外の言語でこのドライバーを使用するには Selenium サーバーが必要

ということで、以下からSelenium Serverを取ってくる。 検索窓から selenium-serverと検索して、最新版のjarファイルを落とす。

コマンドラインから起動。

> java -jar selenium-server-standalone-2.39.0.jar

<p>
  <a href="http://www.storklab.com/seleniumhq.org/docs/03_webdriver.html#htmlunit-driver">この</a> ページに従って、以下のように書く。
</p>

<div class="org-src-container">
  <pre class="src src-language">driver = Selenium::WebDriver.for :remote, :url =&gt; "http://localhost:4444/wd/hub", :desired_capabilities =&gt; :htmlunit

<p>
  ページの取得は成功したけれども、検索窓を探すことができなかった。別の手段をば。
</p></p>

PhantomJS Driver

PhantomJS Driverは、No Browserなブラウザ。(意味不明)

PhantomJSの内部でGhostDriverというものを利用して、 これでNo GUIなブラウザを実現しているらしい。

以下のサイトからwindows用のバイナリをダウンロードして、 phantomjs.exeするだけ。

phantomjs.exe --webdriver=9134

<div class="org-src-container">
  <pre class="src src-language">require "selenium-webdriver"

driver = Selenium::WebDriver.for(:remote, :url => “http://localhost:9134")

driver.navigate.to “http://google.com" element = driver.find_element(:name, ‘q’) element.send_keys “PhantomJS” element.submit puts driver.title driver.quit

<p>
  また、phantom.exeに環境変数PATHを通すことで、 以下のように書くことができる。
</p>

<p>
  こうすると、 rubyスクリプト起動の延長でphantomjsを起動してportに接続してくれる。
</p>

<div class="org-src-container">
  <pre class="src src-language"># driver = Selenium::WebDriver.for(:remote, :url =&gt; "http://localhost:9134")

driver = Selenium::WebDriver.for :phantomjs

gem headless

linuxだとこういう方法もある。

Xvfbという仮想ブラウザウ利用するのでwindowsではできない。

Special Thanks

25 May 2014, 05:37

Rubyの無名関数についての整理メモ

はじめに

Scalaで関数型プログラミングを勉強しているが、無名関数がよくわからない。

無名関数はRubyでいうところのブロックとのこと。

なので、慣れ親しんだ言語のRubyで整理してみることにした。

スタート地点

単純に、足し算について考えてみます。

# -*- coding: utf-8 -*-
# ふつうの足し算
def add2(x, y)
  x + y
end

p add2(1, 2)

# 関数の抽象
def add3(x, y)
  add2(x, y)
end

p add3(1, 2)

<p>
  ここまではさすがに理解できる。
</p></p>

ブロック渡し

無名関数

<div class="outline-text-3" id="text-3-1">
  <p>
    そもそも無名関数(Annonimous Functions)とは、 名前付けされずに定義された関数。 Function Literal(関数リテラル)、匿名関数といわれることもある。
  </p>

  <ul class="org-ul">
    <li>
      <a href="http://ja.wikipedia.org/wiki/%E7%84%A1%E5%90%8D%E9%96%A2%E6%95%B0">無名関数 &#8211; Wikipedia</a>
    </li>
  </ul>
</div>

<div id="outline-container-sec-3-1-1" class="outline-4">
  <h4 id="sec-3-1-1">
    メリット
  </h4>

  <div class="outline-text-4" id="text-3-1-1">
    <ul class="org-ul">
      <li>
        一度しか使わない関数の名前を付けなくて済む。
      </li>
      <li>
        名前の衝突を考えなくて済む。
      </li>
      <li>
        関数の引数などに直接渡せる
      </li>
    </ul>

    <p>
      Rubyだと、無名関数はブロックで表現される。do endでも表現される。
    </p>

    <p>
      明示的に変数として表現する方法とそうでない方法がある。
    </p>

    <ul class="org-ul">
      <li>
        明示的に渡すときは、引数に&をつけて、callメソッドで呼び出す
      </li>
      <li>
        暗示的に渡すときは、yieldで呼び出す
      </li>
    </ul>

    <div class="org-src-container">
      <pre class="src src-language"># ブロック渡し(明示的)

def add5(x, y, &proc) proc.call(x, y) end

p add5(1, 2){|x, y| x + y}

ブロック渡し(暗示的)

def add6(x, y) yield(x, y) end

p add6(1, 2){|x, y| x + y}

関数値

Procedure Values。関数を値としてメモリ上に保持すること。

Rubyでは、ブロックをProcオブジェクトとして、 メモリ上に名前をつけて束縛したものが、それにあたる。

lambda, procとして表現する方法がある。callメソッドで呼び出す。

# 関数値の導入
def add4(x, y, proc)
  proc.call(x, y)
end
proc = lambda{|x, y| x + y}
p add4(1, 2, proc)

# ラムダの糖衣構文
p add4(1, 2, ->(x, y){x + y})

カリー化

そして、よく分からない概念が、カリー化。

複数の引数をとる関数を、

  • 引数が「もとの関数の最初の引数」で
  • 戻り値が「もとの関数の残りの引数を取り結果を返す関数」

であるような関数にすること。

部分適用を容易にすることが可能になるというメリットがあるらしい。

# カリー化
curry = lambda{|x| lambda{|y| x + y}}
p curry.call(1).call(2)

# ラムダの糖衣構文
curry2 = ->(x){->(y) {x + y}}
p curry2.call(1)
p curry2.call(1).call(2)

# カリーの糖衣構文
curried_proc = proc.curry
p curried_proc.call(1)
p curried_proc.call(1).call(2)

実行結果

<div class="outline-text-3" id="text-5-1">
  <p>
    この結果をみると、Procオブジェクトとしてメモリ上にあることがよくわかる。
  </p>

  <div class="org-src-container">
    <pre class="src src-language">3

#<Proc:0x007fd286805e48@sample.rb:45 (lambda)> 3 #<Proc:0x007fd286805b28 (lambda)> 3

24 May 2014, 06:18

Sikuli, Selenium, WSH, 3つの自動化ツールでGoogle検索自動化に挑め!

はじめに

前回、Sikuliの使い方を調べてみました。

今回は、Sikuliと別のツールを組み合わせてみます。前回記事の続編です。

やること

以下の手順を自動化します。

  1. firefoxを立ち上げる
  2. 検索窓にSikuliと入力する
  3. 検索ボタンをおす

以下のツールを利用します。

  • Sikuli … 画像認識による自動化ツール
  • Selenium … HTML解析による自動化ツール
  • WSH … キー操作の自動化ツール

なんだか、ヨットに対して戦車と軍艦と戦闘機で総攻撃をかけるような感じになってきた。

使う手段

JRubyです。以下を利用。

  • win32ole
  • sikulixapi
  • selenium-webdriver

win32oleはデフォルトで入っている。sikuliは前回記事を参照。

selenium-webdriverは、jgem install selenium-webdriverで問題なくインストール。

結果

自動化がキマるとけっこうきもちいい。

24 May 2014, 05:11

画像認識でアプリケーション操作の自動化を実現!Sikuliがあまりに革命的で興奮した

はじめに

アプリケーションの自動操作をスクリプトで実現するために、Sikuliを調べてみました。

Sikuliとは

Sikuliとは、

  • OpenCVをつかった画像認識
  • OCRをつかった文字認識

で、アプリケーションの自動操作を実現するためのツール、スクリプト言語。

Javaで実装されているため、JVM上で動作するスクリプト言語から利用できる。

スクリプト編集のためのIDEは、 画像とプログラム言語を合わせて表示できるという、革命的なソフトウェア。 久々に、スゴイ!とおもったソフトウェアだ。

インストール

sikuli-setup.jarをダウンロードして、インストーラをダブルクリックで起動するだけ。

すると、いろいろとインストールオブションがきかれる。JRubyを選択。

slkulix.jarをダブルクリックで起動。IDEが立ち上がる。

インストールは、以下のドキュメントが詳しい。

WinUtil.dllが見つからないエラーではまる

<div class="outline-text-3" id="text-3-1">
  <p>
    runsikulix.cmdで起動するとエラーした。
  </p>

  <div class="org-src-container">
    <pre class="src src-sh">[error] ResourceLoader: loadLib: Fatal Error 110: loading: WinUtil.dll

[error] ResourceLoader: loadLib: Since native library was found, it might be a problem with needed dependent libraries C:\sikuliX\libs\WinUtil.dll: 指定されたプロシージャが見つかりません。ﴀ＀ [error] ResourceLoader: loadLib: Check, wether a valid Sikuli libs folder is in system path at runtime!

  <p>
    よくわからないのだが、環境変数のパスを通して(C:)、JDK 7 を最新版にしたらなおった。
  </p></p>
</div></p>

Hello Sikuli

以下のようなコード。

App.open("notepad.exe")
  
find("1400849474303.png")
  
type("Hello Sikuli!!")

<p>
  <a href="https://picasaweb.google.com/lh/photo/lRDJ9IcUEEb0SOkEeZUtAjyD6hjDXGH6XyE6iLrzolo?feat=embedwebsite"><img src="https://lh6.googleusercontent.com/-MTSQnqO-6L8/U4AlKQuYAII/AAAAAAAABEI/aW-X9CjdRYo/s800/HelloSikuli.png" height="137" width="307" /></a>
</p>

<p>
  実行結果はこんな感じ。驚きの結果である。
</p>

<p>
  <iframe width="420" height="315" src="//www.youtube.com/embed/SoN_zfuG1E8?rel=0" frameborder="0" allowfullscreen></iframe> </div>
</p>

実行ファイルから実行する

<div class="outline-text-2" id="text-5">
  <p>
    もちろん、IDE を経由しないでコマンドラインから実行できる。
  </p>

  <p>
    ツールバーのファイルから実行ファイルとしてエクスポートを選択。 .skl拡張子のバイナリファイルができる。(ここではtest.skl) なかみは、たんなるzipだったりする。
  </p>

  <p>
    runsikulix.cmdの引数として、.sklを渡す(注意: 1.1からの仕様)
  </p>

  <div class="org-src-container">
    <pre class="src src-language">E:\test&gt;C:\sikuliX\runsikulix.cmd -r test.skl

  <p>
    これで、コマンドラインから実行できた。
  </p></p>
</div></p>

Rubyから実行する

<div class="outline-text-2" id="text-6">
  <p>
    Sikuliの素晴らしいところは、JVM上で動作スクリプト言語を利用できる。
  </p>

  <p>
    JPython, JRubyとか。つまりは、Rubyが使える!
  </p></p>
</div>

<div id="outline-container-sec-6-1" class="outline-3">
  <h3 id="sec-6-1">
    IDEで Rubyをつかう
  </h3>

  <div class="outline-text-3" id="text-6-1">
    <p>
      保存フォルダをのぞくと、たんなる.rbファイルがある。 IDEから実行すると、Lib配下にあるsikkulix.rbがrequireされるようだ。 ようするに、rubyの文法をつかってかけるということ。
    </p>

    <p>
      たとえば、さっきのHelloSikuliをメソッド化してみる。
    </p>

    <div class="org-src-container">
      <pre class="src src-language">def hello

App.open(“notepad.exe”)

find(“1400849474303.png”)

type(“Hello Sikuli!!”) end

hello()

    <p>
      すごい。
    </p></p>
  </div></p>
</div>

<div id="outline-container-sec-6-2" class="outline-3">
  <h3 id="sec-6-2">
    Ruby scriptとしてつかう
  </h3>

  <div class="outline-text-3" id="text-6-2">
    <p>
      Sikuli IDEでは、実行時にsikkulix.rbを読み込んでいろいろやっているようなので、 このファイルに書いてあることを真似すると、純粋なrubyとして実行できる。
    </p>

    <blockquote>
      <p>
        But be aware: Since the interpreters used are based on Java, the modules available for Python or Ruby might not be available in the Jython or JRuby environment. So before trying to use any non-standard modules or extension packages, you have to check, wether they are supported in this SikuliX environment.
      </p>
    </blockquote>

    <p>
      Java APIを JRubyを経由して呼び出すため、 JRubyのちからを借りる。以下のガイダンスに従う。
    </p>

    <ul class="org-ul">
      <li>
        <a href="http://sikulix-2014.readthedocs.org/en/latest/faq/030-java-dev.html">How to use SikuliX API in your JAVA programs — SikuliX 1.1+ documentation</a>
      </li>
    </ul>
  </div></p>
</div>

<div id="outline-container-sec-6-3" class="outline-3">
  <h3 id="sec-6-3">
    JRubyをインストール
  </h3>

  <div class="outline-text-3" id="text-6-3">
    <p>
      以下から、インストール。インストールしたら、binフォルダにパスを通す。
    </p>

    <ul class="org-ul">
      <li>
        <a href="http://jruby.org/">Home — JRuby.org</a>
      </li>
    </ul>

    <p>
      実行は、jrubyコマンドで実行。
    </p></p>
  </div></p>
</div>

<div id="outline-container-sec-6-4" class="outline-3">
  <h3 id="sec-6-4">
    sikulixapi.jarをクラスパスに追加
  </h3>

  <div class="outline-text-3" id="text-6-4">
    <p>
      sikulixapi.jarのなかに、sikuliを制御する処理が入っているので、ここにクラスパスを通す。
    </p>

    <div class="org-src-container">
      <pre class="src src-language">require 'java'

$CLASSPATH << ‘C:\sikuliX\‘ require ‘sikulixapi.jar’

<div id="outline-container-sec-6-5" class="outline-3">
  <h3 id="sec-6-5">
    必要なSikuliクラスをimport
  </h3>

  <div class="outline-text-3" id="text-6-5">
    <p>
      つづいて、必要なクラスをインポートする。
    </p>

    <div class="org-src-container">
      <pre class="src src-language">java_import "org.sikuli.script.Screen"

    <p>
      あとは、一生懸命書くだけだ。なんどでも思う、これはスゴイ。
    </p></p>
  </div></p>
</div>

<div id="outline-container-sec-6-6" class="outline-3">
  <h3 id="sec-6-6">
    結果
  </h3>

  <div class="outline-text-3" id="text-6-6">
  </div></p>
</div>

<div id="outline-container-sec-6-7" class="outline-3">
  <h3 id="sec-6-7">
    Environment
  </h3>

  <div class="outline-text-3" id="text-6-7">
    <ul class="org-ul">
      <li>
        windows 7 64bit
      </li>
      <li>
        JDK 7 64bit
      </li>
      <li>
        JRuby 1.7.12
      </li>
    </ul>
  </div></p>
</div>

<div id="outline-container-sec-6-8" class="outline-3">
  <h3 id="sec-6-8">
    Special Thanks
  </h3>

  <div class="outline-text-3" id="text-6-8">
    <p>
      Official
    </p>

    <ul class="org-ul">
      <li>
        <a href="http://www.sikulix.com/">SikuliX powered by RaiMan &#8211; Home</a>
      </li>
    </ul>

    <p>
      Java Doc
    </p>

    <ul class="org-ul">
      <li>
        <a href="https://dl.dropboxusercontent.com/u/42895525/docs/index.html">https://dl.dropboxusercontent.com/u/42895525/docs/index.html</a>
      </li>
    </ul>

    <p>
      Document
    </p>

    <ul class="org-ul">
      <li>
        <a href="http://sikulix-2014.readthedocs.org/en/latest/index.html">Sikuli / SikuliX Documentation for version 1.1+ (01/2014 and later) — SikuliX 1.1+ documentation</a>
      </li>
    </ul>

    <p>
      よくまとまっている日本語のまとめ
    </p>

    <ul class="org-ul">
      <li>
        <a href="http://safx-dev.blogspot.jp/2013/02/sikuliui.html">Safx: SikuliスクリプトでのUI操作自動化を試してみる</a>
      </li>
      <li>
        <a href="http://hontech.xii.jp/blog/archives/28">sikuliの簡単な使い方 | hontech</a>
      </li>
      <li>
        <a href="http://www-he.scphys.kyoto-u.ac.jp/member/n.kamo/wiki/doku.php?id=study:software:sikuli">Sikuli KamonoWiki</a>
      </li>
    </ul>

    <p>
      Ruby関連
    </p>

    <ul class="org-ul">
      <li>
        <a href="http://blackrat.org/ruby/getting-sikuli-script-working-with-jruby-on-the-mac/">Getting Sikuli Script working with Ruby(JRuby) on the Mac | blackrat.org</a>
      </li>
      <li>
        <a href="https://answers.launchpad.net/sikuli/+question/221083">Question #221083 : Questions : Sikuli</a>
      </li>
      <li>
        <a href="http://www.software-testing.com.au/blog/2010/08/16/automating-flash-ajax-popups-and-more-using-ruby-watir-and-sikuli/">Automating Flash, AJAX, Popups and more using Ruby, Watir and Sikuli | Illiteration –</a>
      </li>
    </ul>
  </div></p>
</div></p>

18 May 2014, 10:47

Eclim で Emacs と Eclipse のいいとこどり!Emacs で Java 開発環境を構築した (副題 打倒 Eclipse!)

[toc]

はじめに

よし, 認めよう. 私は, Eclipse フリークだった.

Eclipse ですべての開発環境の統合を夢見て, あらゆるプラグインを試した.

全 C/C++ プログラマに捧ぐ!Eclipse CDT を使う時のオススメ機能/ プラグインまとめ | Futurismo

歳をとるにつれて, 若かりし誤った考えを改めた. 真の統合開発環境は Emacs なのでは?

いや, うすうすは気づいている. Java 開発では Eclipse が最強なことくらい.

しかし, それを分かっていてあえて Emacs を使うことは美しい行為ではないか?

それは, 死を覚悟して決戦に挑む武士のように.

この記事は, そんな不安と挑戦の記録です.

Environment

<div class="outline-text-3" id="text-1-1">
  <ul class="org-ul">
    <li>
      Linux Mint 16
    </li>
    <li>
      Eclipe 4.3 Kepler
    </li>
    <li>
      Emacs 24
    </li>
  </ul>
</div>

Java 開発環境について

まずは, Emacs における Java 開発環境を調べた.

以下の 3 つが選択肢としてある. 詳細な解説はリンク先に譲る.

JDEE

<div class="outline-text-3" id="text-2-1">
  CEDET ベースのツール. あまりメンテナンスされていないようだ.</p> 

  <ul class="org-ul">
    <li>
      <a href="http://mikio.github.io/article/2012/12/23_emacsjdeejava.html">Emacs 中毒者に贈る JDEE による Java 開発環境の構築|ざる魂</a>
    </li>
    <li>
      <a href="http://epian-wiki.appspot.com/wiki/Emacs/JDEEEmacs/JDEE%20-%20epian-wiki">http://epian-wiki.appspot.com/wiki/Emacs/JDEEEmacs/JDEE%20-%20epian-wiki</a>
    </li>
    <li>
      <a href="http://www.emacswiki.org/emacs/JavaDevelopmentEnvironment">EmacsWiki: Java Development Environment</a>
    </li>
  </ul>
</div>

malabar-mode

<div class="outline-text-3" id="text-2-2">
  JDEE にかわってでてきたモダンな java のメジャーモード.</p> 

  <ul class="org-ul">
    <li>
      <a href="http://d.hatena.ne.jp/nekop/20101215/1292380225">Emacs で Java を書く &#8211; nekop の日記</a>
    </li>
    <li>
      <a href="http://d.hatena.ne.jp/lranran123/20130404/1365088550">Emacs で Java の環境構築, CEDET と yasnippet と malabar-mode &#8211; 趣味プログラマがまれになんかしたことの記録</a>
    </li>
  </ul>
</div>

Eclim

<div class="outline-text-3" id="text-2-3">
  Emacs から Eclipse をつかう. その発想があったか!</p> 

  <ul class="org-ul">
    <li>
      <a href="http://sleepboy-zzz.blogspot.jp/2014/02/emacsjava_22.html">memo: Emacs で Java の設定</a>
    </li>
    <li>
      <a href="http://d.hatena.ne.jp/clairvy/20100630/1277854580">Emacs-Eclim を試す &#8211; クラなんとか or くらなんとか or cla なんとかの日記</a>
    </li>
  </ul>
</div>

選定する

<div class="outline-text-3" id="text-2-4">
  <p>
    選ぶに当たって重視する機能は,
  </p>

  <ul class="org-ul">
    <li>
      JUnit 連携機能
    </li>
    <li>
      リファクタリング
    </li>
    <li>
      コード補完・タグジャンプ
    </li>
    <li>
      Android 開発連携
    </li>
  </ul>

  <p>
    malabar-mode に挑戦したが, maven がよくわからずに挫折.
  </p>

  <p>
    なので, eclim を試す.
  </p>
</div>

開発環境を整える

eclim

<div class="outline-text-3" id="text-3-1">
  インストーラがあるので, 指示にしたがって入れればよい.</p> 

  <ul class="org-ul">
    <li>
      <a href="http://eclim.org/install.html">Download / Install &#8211; eclim (eclipse + vim)</a>
    </li>
  </ul>
</div>

eclim-emacs

<div class="outline-text-3" id="text-3-2">
  emacs から利用するためには, eclim-emacs を入れる.</p> 

  <ul class="org-ul">
    <li>
      <a href="https://github.com/senny/emacs-eclim">senny/emacs-eclim</a>
    </li>
  </ul>
</div>

使い方

設定ファイルに以下を追記.

[sourcecode language=”emacs-lisp” title=””]
(require ‘eclim)
(require ‘eclimd)

;; java-mode で有効
(add-hook ‘java-mode-hook ‘eclim-mode)
[/sourcecode]

M-x start-eclimd で eclipse を eclim デーモンとして起動.

M-x eclim-project-mode で workspace にあるプロジェクト一覧が表示される.

適当にソースを選んでごにょごにょ. 詳しくは, README 参照. まだ, あんまりいじくりまわしていない.

M-x stop-eclimd で eclipse を eclim デーモンを終了.

このページがとても詳しいのでリンクをはっておきます.

[[http://www.skybert.net/emacs/java/][.:: skybert.net :: emacs
java ::.]]

auto-complete/company-mode で自動補完

<div class="outline-text-3" id="text-4-1">
  <p>
    auto-complete/company-mode で eclipse の補完機能と連携できる.
  </p>

  <p>
    [sourcecode language=&#8221;emacs-lisp&#8221; title=&#8221;&#8221;]<br /> ;; regular auto-complete initialization<br /> (require &#8216;auto-complete-config)<br /> (ac-config-default)<br /> ;; add the emacs-eclim source<br /> (require &#8216;ac-emacs-eclim-source)<br /> (ac-emacs-eclim-config)
  </p>

  <p>
    ;; for company-mode<br /> ;; (require &#8216;company-emacs-eclim)<br /> ;; (company-emacs-eclim-setup)<br /> [/sourcecode]
  </p>
</div>

タグジャンプ

<div class="outline-text-3" id="text-4-2">
  <p>
    &#8216;eclim-java-find-references で定義元にジャンプできる. しかし, gtags をしてもいい.
  </p>

  <p>
    [sourcecode language=&#8221;elisp&#8221; title=&#8221;&#8221;]<br /> (define-key eclim-mode-map (kbd "C-c C-e l") &#8216;eclim-java-find-references)<br /> [/sourcecode]
  </p>
</div>

Program 起動

<div class="outline-text-3" id="text-4-3">
  <p>
    org.eclim.java.run.mainclass にメインクラスを設定.
  </p>

  <ul class="org-ul">
    <li>
      <a href="http://eclim.org/vim/java/java.html">Java / Jps &#8211; eclim (eclipse + vim)</a>
    </li>
    <li>
      <a href="http://eclim.org/vim/settings.html">Settings &#8211; eclim (eclipse + vim)</a>
    </li>
    <li>
      <a href="http://stackoverflow.com/questions/7394811/eclim-what-to-set-org-eclim-java-run-mainclass-to">vim &#8211; Eclim &#8211; What to set org.eclim.java.run.mainclass to? &#8211; Stack Overflow</a>
    </li>
  </ul>

  <p>
    設定方法は, .settings/org.eclim.prefs というファイルを作成して,以下を書き込む
  </p>

  <p>
    [sourcecode language=&#8221;text&#8221; title=&#8221;&#8221;]<br /> org.eclim.java.run.mainclass=<Class Name><br /> [/sourcecode]
  </p>

  <p>
    しかし, これだけでは動作しなかった. main メソッドの場所で eclim-run-class を実行すると, ようやく eclim 経由で java program が起動.
  </p>

  <p>
    起動は, eclim の機能を利用するのではなくて, 別のビルドツールを利用したほうがいいな.
  </p>
</div>

JUnit を動かす

<div class="outline-text-3" id="text-4-4">
  <p>
    これで JUnit が動いた. これはいいな.
  </p>

  <ul class="org-ul">
    <li>
      <a href="https://groups.google.com/forum/#!topic/emacs-eclim/Bj0kyZ2mUSk">https://groups.google.com/forum/#!topic/emacs-eclim/Bj0kyZ2mUSk</a>
    </li>
  </ul>

  <p>
    [sourcecode language=&#8221;elisp&#8221; title=&#8221;&#8221;]<br /> (defun eclim-run-test ()<br /> (interactive)<br /> (if (not (string= major-mode "java-mode"))<br /> (message "Sorry cannot run current buffer."))<br /> (compile (concat eclim-executable " -command java_junit -p " eclim&#8211;project-name " -t " (eclim-package-and-class))))<br /> [/sourcecode]
  </p>
</div>

最後に

使いこなすには, 時間がかかりそうな.

今は, まだ eclipse のほうがいいと思っている. いや, 負けるな Emacs!

.emacs の設定

<div class="outline-text-3" id="text-5-1">
  <p>
    最後に設定を張り付けておく.
  </p>

  <p>
    [sourcecode language=&#8221;emacs-lisp&#8221; title=&#8221;&#8221;]<br /> (require &#8216;eclim)
  </p>

  <p>
    ;; java-mode で有効<br /> (add-hook &#8216;java-mode-hook &#8216;eclim-mode)
  </p>

  <p>
    ;; eclim daemon<br /> (require &#8216;eclimd)
  </p>

  <p>
    ;; regular auto-complete initialization<br /> (require &#8216;auto-complete-config)<br /> (ac-config-default)<br /> ;; add the emacs-eclim source<br /> (require &#8216;ac-emacs-eclim-source)<br /> (ac-emacs-eclim-config)
  </p>

  <p>
    ;; for company-mode<br /> ;; (require &#8216;company-emacs-eclim)<br /> ;; (company-emacs-eclim-setup)
  </p>

  <p>
    ;; Displaying compilation error messages in the echo area<br /> (setq help-at-pt-display-when-idle t)<br /> (setq help-at-pt-timer-delay 0.1)<br /> (help-at-pt-set-timer)
  </p>

  <p>
    ;; add keybinds<br /> (define-key eclim-mode-map (kbd "C-c C-e p q") &#8216;eclim-problems)<br /> (define-key eclim-mode-map (kbd "C-c C-e p o") &#8216;eclim-problems-open)<br /> (define-key eclim-mode-map (kbd "C-c C-e p n") &#8216;eclim-problems-next)<br /> (define-key eclim-mode-map (kbd "C-c C-e p p") &#8216;eclim-problems-previous)<br /> ;; Re-map `eclim-project-create&#8217; to C so that I can use c for<br /> ;; `eclim-problems-correct&#8217;<br /> (define-key eclim-mode-map (kbd "C-c C-e p C") &#8216;eclim-project-create)<br /> (define-key eclim-mode-map (kbd "C-c C-e p c") &#8216;eclim-problems-correct)<br /> (define-key eclim-mode-map (kbd "M-.") &#8216;eclim-java-find-declaration)<br /> ;; find-references = list-callers.<br /> (define-key eclim-mode-map (kbd "C-c C-e l") &#8216;eclim-java-find-references)
  </p>

  <p>
    ;; skip warning error<br /> (setq compilation-skip-threshold 2)
  </p>

  <p>
    (setq eclim-eclipse-dirs "/opt/eclipse/kepler")<br /> (setq eclim-executable "/opt/eclipse/kepler/eclim")<br /> (setq eclimd-executable "/opt/eclipse/kepler/eclimd")<br /> (setq eclimd-default-workspace "/mnt/win/src/coursera")<br /> [/sourcecode]
  </p>
</div>

15 May 2014, 14:47

Web操作手順書を自動生成!Emacs org-babelで実現するRun Book Automation(RBA)

はじめに

RunBookAutomationや Code As Infrastructureという単語をよく耳にする今日この頃。 仕事でなにかと手順書を作成することがだれにでもあるはず。

今日は、文芸的プログラミングと、RunBookAutomationの概念を合体させて、 Web操作の作業手順書を自動作成してみます。

これは、以下の記事の続編です。つまり、selenium-webdriverを Web操作自動化のためのエンジンとして利用します。

以下の過去記事と関係があります。

[toc]

出力のためのツール org-babel

org-babelを利用する。

org-babelとは、文芸的プログラミングを実現するためのemacsの機能。

Babel: active code in Org-mode

Ruby Codeに出力

org-babelを利用して出力するには、rubyのcodeを以下のように囲む。

  #+begin_src ruby :tangle ./hello_rba.rb :exports none

<ul class="org-ul">
  <li>
    begin_src ruby &#x2026; rubyのコード
  </li>
  <li>
    :tangle ./hello_rba.rb &#x2026; rubyの出力ファイル指定
  </li>
  <li>
    exports none &#x2026; org-modeのexport機能ではcodeをexportしない。
  </li>
</ul>

<p>
  Rubyコードに書き出すには、以下を実施。
</p>

<div class="org-src-container">
  <pre class="src src-language">M-x org-babel-tangle

<p>
  これで、動作する手順書(RBA)が自動生成される。
</p></p>

HTMLに出力

org-export-dispatchから htmlを選択することで、htmlに変換可能。

このとき:exports noneのオブションのおかげで、rubyのコードは出力されない。

github風にオシャレな出力

<div class="outline-text-3" id="text-4-1">
  <p>
    pandocを利用して md から htmlに変換することで、cssがつかえる。
  </p>

  <ul class="org-ul">
    <li>
      <a href="http://shuzo-kino.hateblo.jp/entry/2014/02/16/220708">Pandocでドキュメント変換で楽する &#8211; Bye Bye Moore</a>
    </li>
  </ul>

  <p>
    このデザインがとても気に入った!Special Thanks
  </p>

  <div class="org-src-container">
    <pre class="src src-sh">wget https://gist.github.com/andyferra/2554919/raw/2e66cabdafe1c9a7f354aa2ebf5bc38265e638e5/github.css

pandoc hello_rba.md -c github.css -s -o hello_rba.html

PDFに出力

pandocを利用してpdfに変換したかったけど、深刻な容量不足のため断念。

代替手段として、firefoxのプラグインでHTMLをpdfに変換した。

スクリーンショットを撮影

selenium-webdriverには、スクリーンショット撮影機能がある。

これを手順ごとに実施して、画像ファイルもorg-modeに含める。

wd.save_screenshot('screenshot.png')

<p>
  org-modeにはこんな感じで書く
</p>

<div class="org-src-container">
  <pre class="src src-language">[[./screenshot.png]]

<p>
  これで、画像がついてよりわかりやすくなった。
</p></p>

Code

RunBook

<div class="outline-text-3" id="text-7-1">
  <p>
    表示のために、冒頭に#を入れています。
  </p>

  <div class="org-src-container">
    <pre class="src src-language">#   * Hello RBA

** はじめに

Selenium Webdriverをつかって、Google検索します。

#+begin_src ruby :tangle ./hello_rba.rb :exports none

require ‘pp’

require ‘selenium-webdriver’

#+end_src

** 手順

まずは、firefoxを立ち上げます。

#+begin_src ruby :tangle ./hello_rba.rb :exports none

wd = Selenium::WebDriver.for :firefox

#+end_src

次に、https://www.google.co.jp/ にアクセスします。

#+begin_src ruby :tangle ./hello_rba.rb :exports none

wd.get “https://www.google.co.jp/"

wd.save_screenshot(‘screenshot.png’)

#+end_src

[[./screenshot.png]]

次に、検索窓に以下を入力します。

- “Selenium Builder”

#+begin_src ruby :tangle ./hello_rba.rb :exports none

wd.find_element(:id, “lst-ib”).click

wd.find_element(:id, “lst-ib”).clear

wd.find_element(:id, “lst-ib”).send_keys “Selenium Builder”

wd.save_screenshot(‘screenshot2.png’)

#+end_src

[[./screenshot2.png]]

最後に、検索ボタンを押します。

#+begin_src ruby :tangle ./hello_rba.rb :exports none

wd.find_element(:name, “btnK”).click

#+end_src

#+begin_src ruby :tangle ./hello_rba.rb :exports none

sleep 3

wd.save_screenshot(‘screenshot3.png’)

wd.quit

#+end_src

[[./screenshot3.png]]

生成したCode

<div class="outline-text-3" id="text-7-2">
  <div class="org-src-container">
    <pre class="src src-language">require 'pp'

require ‘selenium-webdriver’

wd = Selenium::WebDriver.for :firefox

wd.get “https://www.google.co.jp/" wd.save_screenshot(‘screenshot.png’)

wd.find_element(:id, “lst-ib”).click wd.find_element(:id, “lst-ib”).clear wd.find_element(:id, “lst-ib”).send_keys “Selenium Builder” wd.save_screenshot(‘screenshot2.png’)

wd.find_element(:name, “btnK”).click

sleep 3 wd.save_screenshot(‘screenshot3.png’) wd.quit

Sample

11 May 2014, 10:39

Emacs で Scala 開発環境を構築 (Ensime)

はじめに

edX で受けた プログラミングパラダイム の講義のなかで,

” これからは, Scala と Erlang だ!C++ と Java はレガシーになりつつある!”

とのことだったので, ちょっと scala をいじってみようと思います.

[toc]

Environment

<div class="outline-text-3" id="text-unnumbered-2">
  <ul class="org-ul">
    <li>
      Linux Mint 16 64bit
    </li>
    <li>
      Scala 2.9
    </li>
  </ul>
</div>

Installing Scalas

Installing the JDK

<div class="outline-text-3" id="text-unnumbered-4">
  <p>
    Scala は JVM 上で動作する. まずは JDK をインストール.
  </p>

  <p>
    [sourcecode language=&#8221;sh&#8221; title=&#8221;&#8221;]<br /> sudo apt-get install openjdk-7-jdk<br /> [/sourcecode]
  </p>
</div>

Installing sbt

<div class="outline-text-3" id="text-unnumbered-5">
  <p>
    Scala のビルドツールである sbt を入れる. 以下から Download して, 解凍. なかにある bin ディレクトリにパスを通す.
  </p>

  <ul class="org-ul">
    <li>
      <a href="http://www.scala-sbt.org/release/docs/Getting-Started/Setup.html">Setup &#8211; sbt Documentation</a>
    </li>
  </ul>

  <p>
    日本語のドキュメントがあった.
  </p>

  <ul class="org-ul">
    <li>
      <a href="http://scalajp.github.io/sbt-getting-started-guide-ja/">始める sbt &#8211; ようこそ</a>
    </li>
    <li>
      <a href="http://www.scala-sbt.org/">sbt &#8211; sbt Documentation</a>
    </li>
  </ul>
</div>

Installing Scala

<div class="outline-text-3" id="text-unnumbered-6">
  [sourcecode language=&#8221;sh&#8221; title=&#8221;&#8221;]<br /> sudo apt-get install scala<br /> [/sourcecode]</p> 

  <p>
    以下から最新版をダウンロードしてもよい.
  </p>

  <ul class="org-ul">
    <li>
      <a href="http://www.scala-lang.org/download/">Download | The Scala Programming Language</a>
    </li>
  </ul>

  <p>
    ダウンロードしたら bin ディレクトリにパスを通す.
  </p>

  <p>
    [sourcecode language=&#8221;sh&#8221; title=&#8221;&#8221;]<br /> # Scala<br /> export PATH=$HOME/app/sbt/bin:$PATH<br /> export PATH=$HOME/app/scala/bin:$PATH<br /> [/sourcecode]
  </p>
</div>

Hello Scala

<div class="outline-text-3" id="text-unnumbered-7">
  <p>
    それでは, お決まりの儀式から.
  </p>

  <p>
    [sourcecode language=&#8221;scala&#8221; title=&#8221;&#8221;]<br /> object Hello extends App {<br /> println ("Hello, Scala!")<br /> }<br /> [/sourcecode]
  </p>

  <p>
    以下で実行.
  </p>

  <p>
    [sourcecode language=&#8221;sh&#8221; title=&#8221;&#8221;]<br /> % scalac Hello.scala<br /> % scala Hello<br /> Hello, Scala!<br /> [/sourcecode]
  </p>
</div>

Installing Emacs

Emacs 自体のインストール方法は省略.

Installing scala-mode

<div class="outline-text-3" id="text-unnumbered-9">
  <p>
    scala-mode と scala-mode2 がある. 2 を入れた.
  </p>

  <ul class="org-ul">
    <li>
      <a href="https://github.com/hvesalai/scala-mode2">hvesalai/scala-mode2</a>
    </li>
  </ul>
</div>

Installing Ensime

<div class="outline-text-3" id="text-unnumbered-10">
  <p>
    Scala 用の統合開発環境. インストールはは github にしたがえばよい.
  </p>

  <ul class="org-ul">
    <li>
      <a href="https://github.com/ensime/ensime-src">ensime/ensime-src</a>
    </li>
  </ul>

  <p>
    Ensime Server をダウンロードしてロードパスの通った場所におく.
  </p>

  <ul class="org-ul">
    <li>
      <a href="https://www.dropbox.com/sh/ryd981hq08swyqr/V9o9rDvxkS/ENSIME%20Releases">Dropbox &#8211; ENSIME Releases</a>
    </li>
  </ul>

  <p>
    (ハマリメモ. github から落としてきたやつではなくて, Dropbox から落とした Reliese 番でないとダメなんだね. めちゃくちゃハマった)
  </p>
</div>

<div id="outline-container-unnumbered-11" class="outline-4">
  <h4 id="unnumbered-11">
    .ensime を作成
  </h4>

  <div class="outline-text-4" id="text-unnumbered-11">
    <p>
      ensime を利用するには, .ensime という設定ファイルが必要.
    </p>

    <ul class="org-ul">
      <li>
        <a href="http://d.hatena.ne.jp/masaaki1001/20121226/1356539103">ensime の設定方法 &#8211; masaaki1001 の日記</a>
      </li>
      <li>
        <a href="http://d.hatena.ne.jp/lranran123/20130409/1365515128">Emacs での Scala 開発には Ensime というプラグインらしい -q 趣味プログラマがまれになんかしたことの記録</a>
      </li>
      <li>
        <a href="https://github.com/ensime/ensime-sbt-cmd">https://github.com/ensime/ensime-sbt-cmd</a>
      </li>
    </ul>

    <p>
      上記を参考に~/.sbt/plugins/plugins.sbt を作成し, 以下を記入.
    </p>

    <p>
      [sourcecode language=&#8221;language&#8221; title=&#8221;&#8221;]<br /> resolvers += Resolver.sonatypeRepo ("snapshots")
    </p>

    <p>
      addSbtPlugin ("org.ensime" % "ensime-sbt" % "0.1.5-SNAPSHOT")<br /> [/sourcecode]
    </p>

    <p>
      M-x ensime-config-gen というコマンドでも対話的に設定ファイルが作成できるらしい.
    </p>

    <p>
      Hello.scala を開いたディレクトリで以下を実行.
    </p>

    <p>
      [sourcecode language=&#8221;language&#8221; title=&#8221;&#8221;]<br /> sbt "ensime generate"<br /> [/sourcecode]
    </p>
  </div>
</div>

<div id="outline-container-unnumbered-12" class="outline-4">
  <h4 id="unnumbered-12">
    emsime 実行
  </h4>

  <div class="outline-text-4" id="text-unnumbered-12">
    <p>
      これで, .ensime が生成される.
    </p>

    <p>
      Emacs 上で M-x ensime を実行. 先ほど生成した.ensime の場所を教える.
    </p>

    <p>
      今日はこんなところで. 逐次, 追記予定.
    </p>
  </div>
</div>

追記 2014-06-21

sbt-mode というものもある.

機能的には ensime とおなじようなことができるし, ensime ファイルを作成しなくてもいいので導入が楽.

ensime よりよいところは, M-x sbt-send-region で Scala REPL にリージョンを送信することができるところ. これは便利そう.

また, repl を autoload する方法もあるようだ.