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 する方法もあるようだ.

10 May 2014, 23:16

[edX]Embedded Systems – Shape The World ずっと受けたかった組み込みソフト開発の授業

はじめに

レジスタも触ったことのないニセエセ組込みエンジニアなので、 リアル組込みエンジニアになりたくて、edXで組込み開発の学習をしました。

結果は、途中で挫折しました。全15週の10週目くらいで挫折。 なので、この記事も中途半端な記事になります。

自分はリアル組み込みエンジニアにはなれませんでしたorz.

[toc]

内容

0,1のフリップフロップから電子回路、レジスタへと、基礎からしっかり解説される。 オームの法則とか、忘れた。電子回路は読んで読まないふりをした。

期待していた?電子回路の知識は十分過ぎるほど出てきた。 ADC,DACあたりはほんとうに挫折。

言語はC言語

<div class="outline-text-3" id="text-2-1">
  <p>
    言語はもちろん、C言語だ。補足的にアセンブラ言語もでてくる。楽勝楽勝。
  </p></p>
</div></p>

実践も重視

<div class="outline-text-3" id="text-2-2">
  <p>
    知識的な部分だけではなく、開発プロセスや品質の考え方、デバッグ手法など 実践的な部分も説明される。
  </p>

  <p>
    開発プロセスでは、フローチャートやサブルーチンといった、 手続き型用語が解説されて、やや時代遅れを感じた。
  </p></p>
</div></p>

進め方

講義の流れ

<div class="outline-text-3" id="text-3-1">
  <p>
    イントロダクションとして、2人のコント?から始まる。 動画よりも、文章の方が多め。
  </p>

  <p>
    動画ではとくにパワーポイントは使わずにホワイトボードで解説されるので、 字がきれいでなく読みにくい。
  </p></p>
</div></p>

Labについて

<div class="outline-text-3" id="text-3-2">
  <p>
    講義よりも比重が置かれているのが、Labと呼ばれている実機学習。
  </p>

  <p>
    毎週課題が出されて、それに取り組むことで講義の内容の理解を深める。
  </p>

  <p>
    課題の評価はテストコードで自動でチェックされる。 シミュレータと実機の両方で評価することが求められる。
  </p>

  <p>
    評価ボードは、Texas Instrumentsの EK-LM4F120XLというものを買った。 ネットで注文して購入する必要がある。ARMの Cortex-Mが載っている。
  </p>

  <ul class="org-ul">
    <li>
      <a href="http://www.tij.co.jp/tool/jp/ek-lm4f120xl">Stellaris LM4F120 LaunchPad 評価ボード &#8211; EK-LM4F120XL &#8211; TI ツール・フォルダ</a>
    </li>
  </ul>

  <p>
    開発環境としては、Keil uVision for the ARM, MDK-Lite (32KB) Editionを利用する。 ARMの開発をするためのIDE.
  </p>

  <ul class="org-ul">
    <li>
      <a href="http://www.keil.com/uvision/default.asp">µVision IDE &#8211; Overview</a>
    </li>
  </ul>
</div>

<div id="outline-container-sec-3-2-1" class="outline-4">
  <h4 id="sec-3-2-1">
    Lチカ
  </h4>

  <div class="outline-text-4" id="text-3-2-1">
    <iframe width="560" height="315" src="//www.youtube.com/embed/32fij3U6SUo" frameborder="0" allowfullscreen></iframe>
  </div></p>
</div></p>

感想

自己紹介

<div class="outline-text-3" id="text-4-1">
  <p>
    まず、なぜ私がニセエセ組込みエンジニアなのかを説明したい。 そのために、まずは自分のしていた仕事を書こうと思う。 このブログに仕事の話を書くのも初めてな気がする。
  </p>

  <p>
    今は別のこと(社内ニートとも)をしているけれども、ちょっと前までは、 ストレージ装置の組込みソフトエンジニアだった。
  </p>

  <p>
    開発はそこそこ大規模で、機能モジュールごとに担当チームが別れている。
  </p>

  <p>
    自分の所属していたチームは、エラー発生時のリカバリが担当。 つまり、装置でエラーが発生したときに、 可用性を失わないためにあらゆる手段をつかってあれこれする役目。
  </p>

  <p>
    そのなかでも、自分が担当していた部分は、 ハードエラーが発生して装置内の各種ドライバから通知を受けたときに、 装置の可用性を失わないためはどうすればいいかを一生懸命考える部分。
  </p>

  <div class="figure">
    <p>
      <img src="http://futurismo.biz/wp-content/uploads/wpid-sample5.png" alt="sample.png" />
    </p></p>
  </div>

  <p>
    ハードと接するinterfaceはドライバ層で隠蔽されているため、 実は自分はレジスタを触ったことがない!
  </p>

  <p>
    そもそもレジスタがなんだかわからない。 雑誌『Interface』や『トランジスタ技術』が 会社の休憩ゾーンにおいてあるが、書いてあることがほぼわからない。
  </p>

  <p>
    これって、組込みエンジニアとしてどうなの? これが、ニセエセ組込みエンジニアたる所以である。
  </p></p>
</div></p>

課題

<div class="outline-text-3" id="text-4-2">
  <p>
    自分は、組込みエンジニアという肩書きではあるものの、 実際はハードウェアを理解していない。
  </p>

  <p>
    以下の記事にとても共感する。
  </p>

  <p>
    <a href="http://monoist.atmarkit.co.jp/mn/articles/0703/26/news101.html">組み込みギョーカイの常識・非常識(8):組み込みソフトウェアって何</a>
  </p>

  <p>
    ちなみに、この記事を書いた著者のことを調べてみるとこんな本を書いてた。
  </p>

  <div class='amazlink-box' style='text-align:left;padding-bottom:20px;font-size:small;/zoom: 1;overflow: hidden;'>
    <div class='amazlink-list' style='clear: both;'>
      <div class='amazlink-image' style='float:left;margin:0px 12px 1px 0px;'>
        <a href='http://www.amazon.co.jp/%E7%B5%84%E8%BE%BC%E3%81%BF%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE%E3%83%8F%E3%83%BC%E3%83%89%E3%82%A6%E3%82%A7%E3%82%A2%E5%85%A5%E9%96%80-%E7%B5%84%E8%BE%BC%E3%81%BF%E3%83%97%E3%83%AC%E3%82%B9Selection-%E3%81%BF%E3%82%8F-%E3%82%88%E3%81%97%E3%81%93/dp/4774140155%3FSubscriptionId%3DAKIAJDINZW45GEGLXQQQ%26tag%3Dsleephacker-22%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D4774140155' target='_blank' rel='nofollow'><img src='http://ecx.images-amazon.com/images/I/41MIz39174L._SL160_.jpg' style='border: none;' /></a>
      </div>

      <div class='amazlink-info' style='height:160; margin-bottom: 10px'>
        <div class='amazlink-name' style='margin-bottom:10px;line-height:120%'>
          <a href='http://www.amazon.co.jp/%E7%B5%84%E8%BE%BC%E3%81%BF%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE%E3%83%8F%E3%83%BC%E3%83%89%E3%82%A6%E3%82%A7%E3%82%A2%E5%85%A5%E9%96%80-%E7%B5%84%E8%BE%BC%E3%81%BF%E3%83%97%E3%83%AC%E3%82%B9Selection-%E3%81%BF%E3%82%8F-%E3%82%88%E3%81%97%E3%81%93/dp/4774140155%3FSubscriptionId%3DAKIAJDINZW45GEGLXQQQ%26tag%3Dsleephacker-22%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D4774140155' rel='nofollow' target='_blank'>組込みソフトウェアエンジニアのためのハードウェア入門 (組込みプレスSelection)</a>
        </div>

        <div class='amazlink-powered' style='font-size:80%;margin-top:5px;line-height:120%'>
          posted with <a href='http://amazlink.keizoku.com/' title='アマゾンアフィリエイトリンク作成ツール' target='_blank'>amazlink</a> at 14.05.11
        </div>

        <div class='amazlink-detail'>
          みわ よしこ
        </div>

        <div class='amazlink-sub-info' style='float: left;'>
          <div class='amazlink-link' style='margin-top: 5px'>
            <img src='http://amazlink.fuyu.gs/icon_amazon.png' width='18' /><a href='http://www.amazon.co.jp/%E7%B5%84%E8%BE%BC%E3%81%BF%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE%E3%83%8F%E3%83%BC%E3%83%89%E3%82%A6%E3%82%A7%E3%82%A2%E5%85%A5%E9%96%80-%E7%B5%84%E8%BE%BC%E3%81%BF%E3%83%97%E3%83%AC%E3%82%B9Selection-%E3%81%BF%E3%82%8F-%E3%82%88%E3%81%97%E3%81%93/dp/4774140155%3FSubscriptionId%3DAKIAJDINZW45GEGLXQQQ%26tag%3Dsleephacker-22%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D4774140155' rel='nofollow' target='_blank'>Amazon</a> <img src='http://amazlink.fuyu.gs/icon_rakuten.gif' width='18' /><a href='http://hb.afl.rakuten.co.jp/hgc/g00q0724.n763w947.g00q0724.n763x2b4/archives/c=http%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F6186429%2F&#038;m=http%3A%2F%2Fm.rakuten.co.jp%2Frms%2Fmsv%2FItem%3Fn%3D6186429%26surl%3Dbook' rel='nofollow' target='_blank'>楽天</a>
          </div>
        </div>
      </div>
    </div>
  </div>

  <p>
    ハードウェアの担当者と一緒の打ち合わせに参加しても、正直ちんぷんかんぷん。
  </p>

  <p>
    ということで、以下が学習目標。
  </p></p>
</div></p>

学習目標

<div class="outline-text-3" id="text-4-3">
  <p>
    DMA Driver が DMA Portのハードエラーを検出して、 そのエラー要因ごとに異常を通知する仕組みを理解すること。
  </p>

  <p>
    DriverがDMAなのは、 仕事で一番お世話になったのが DMA Driverの担当の人だったから。
  </p>

  <p>
    ここからは、勉強メモ。
  </p></p>
</div></p>

Embeded System

組み込みシステム。

特定の機能を実現するために機械や機器に組み込まれるコンピュータシステム。

組み込みシステムの主な構成要素は以下。

  • Embedded Systems
    • MicroCotroller
      • Memory
        • RAM
        • ROM
      • Processor(CPU)
      • I/O Ports
      • DAC
      • Bas
      • Timer
    • External Circuits
    • Physical Device
      • Sensor
      • ADC

以下のような特徴をもつ。

  • A microcontroller hidden inside
  • A dedicated purpose
  • Run in real time
  • Input/output is important
  • High volume, low cost
  • Extremely reliable
  • Low power
  • Small size and weight

MicroController

マイクロコントローラー。いわゆる、マイコン。

Microcontrollers, which are microcomputers incorporating the processor,
RAM, ROM and I/O ports into a single package,
are often employed in an embedded system because of their low cost,
small size, and low power requirements.

I/O Port

<div class="outline-text-3" id="text-6-1">
  <p>
    Input Port/Output Portの略。 Input Portは 外部の世界(外部の集積回路、sensor, etc) からの情報をコンピュータのなかに入れる。Output Portはその逆。
  </p>

  <p>
    A port is a physical connection between the computer and its outside world.
  </p></p>
</div>

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

  <div class="outline-text-4" id="text-6-1-1">
    <p>
      a set of software functions that facilitate the use of an I/O port.
    </p></p>
  </div></p>
</div>

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

  <div class="outline-text-4" id="text-6-1-2">
    <p>
      GPIOはGeneral Purpose Input/Output(汎用入出力)の略語。
    </p>

    <p>
      <a href="http://ja.wikipedia.org/wiki/GPIO">GPIO &#8211; Wikipedia</a>
    </p>

    <p>
      LSIチップや電子機器の備える入出力端子の一種で、 設定次第で様々な用途に利用できるもの。
    </p>

    <p>
      ソフトウェアの指示によって任意の入力あるいは出力に利用することができる。 複数の端子がGPIOに割り当てられている場合には、 これを一つのグループとして一括して制御することができ「GPIOポート」などと呼ばれる
    </p>

    <p>
      <a href="http://e-words.jp/w/GPIO.html">GPIOとは 【 General Purpose Input/Output 】 &#8211; 意味/解説/説明/定義 : IT用語辞典</a>
    </p>

    <p>
      PinはGPIOの構成要素。たとえば、GPIO PortAは、PA0-PA7の8つのPinからできている。
    </p>

    <p>
      Pins can be configured for digital I/O, analog input, timer I/O, or serial I/O. For example PA0 can be digital I/O or serial input.
    </p>

    <p>
      Pinのそれぞれが外部デバイスに接続される。 用途は、レジスタの設定によって自由にできる。
    </p>

    <ul class="org-ul">
      <li>
        PA1 &#x2026; LEDへのOutput用
      </li>
      <li>
        PA2 &#x2026; Switch からの Input用
      </li>
      <li>
        PA3 &#x2026; UART の Input用
      </li>
      <li>
        PA4 &#x2026; UART の Output用
      </li>
    </ul>
  </div></p>
</div></p>

Register

<div class="outline-text-3" id="text-6-2">
  <p>
    コンピュータのプロセッサなどが内蔵する記憶回路で、 制御装置や演算装置や実行ユニットに直結した、 操作に要する速度が最速の、比較的少量のものを指す。
  </p>

  <p>
    一般に、論理回路において、フリップフロップなどにより状態を保持する装置をレジスタと呼ぶ。 コンピュータにおいては、プロセッサが内蔵しているそれを指す。 プロセッサには、プログラムが読み書きできるレジスタ以外に、 プロセッサ自身が動作するためのレジスタがあり、内部レジスタなどと呼ばれる。
  </p>

  <p>
    <a href="http://ja.wikipedia.org/wiki/%E3%83%AC%E3%82%B8%E3%82%B9%E3%82%BF_(%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF)">レジスタ (コンピュータ) &#8211; Wikipedia</a>
  </p>

  <p>
    Registers are high-speed storage inside the processor.
  </p></p>
</div>

<div id="outline-container-sec-6-2-1" class="outline-4">
  <h4 id="sec-6-2-1">
    Registerのプログラムでの扱い
  </h4>

  <div class="outline-text-4" id="text-6-2-1">
    <p>
      Pinを操作するためのレジスタには、 アドレス空間の決められたアドレスが割り振られている。(仕様)
    </p>

    <p>
      プログラムでは、あらかじめDefineを利用してレジスタのアドレスを宣言するのが王道。 volatileをつけることで、コンパイラが最適化してアドレスを変更するのを防ぐ。
    </p>

    <div class="org-src-container">
      <pre class="src src-language">#define PA5   (*((volatile unsigned long *)0x40004080))

    <p>
      これは以下と同値。
    </p>

    <div class="org-src-container">
      <pre class="src src-language">data = (*((volatile unsigned long *)0x40004080));

data = 0x40004080; data = (*0x40004080);

    <p>
      そうすると、以下のようにして Registerの値を Read/Writeできる。
    </p>

    <div class="org-src-container">
      <pre class="src src-language"># Register Write

PA5 = 0x20;

Register Read

data = PA5;

    <p>
      初期設定はこんな感じ。
    </p>

    <div class="org-src-container">
      <pre class="src src-language">void PortF_Init(void){ volatile unsigned long delay;

SYSCTL_RCGC2_R |= 0x00000020; // 1) F clock delay = SYSCTL_RCGC2_R; // delay
GPIO_PORTF_LOCK_R = 0x4C4F434B; // 2) unlock PortF PF0 GPIO_PORTF_CR_R |= 0x1F; // allow changes to PF4-0
GPIO_PORTF_AMSEL_R &= 0x00; // 3) disable analog function GPIO_PORTF_PCTL_R &= 0x00000000; // 4) GPIO clear bit PCTL GPIO_PORTF_DIR_R &= ~0x11; // 5.1) PF4,PF0 input, GPIO_PORTF_DIR_R |= 0x08; // 5.2) PF3 output GPIO_PORTF_AFSEL_R &= 0x00; // 6) no alternate function GPIO_PORTF_PUR_R |= 0x11; // enable pullup resistors on PF4,PF0
GPIO_PORTF_DEN_R |= 0x1F; // 7) enable digital pins PF4-PF0
}

<div id="outline-container-sec-6-2-2" class="outline-4">
  <h4 id="sec-6-2-2">
    LチカExample抜粋
  </h4>

  <div class="outline-text-4" id="text-6-2-2">
    <div class="org-src-container">
      <pre class="src src-language">// symbolic names instead of addresses

#define GPIO_PORTF_DATA_R (*((volatile unsigned long )0x400253FC)) #define GPIO_PORTF_DIR_R (((volatile unsigned long )0x40025400)) #define GPIO_PORTF_AFSEL_R (((volatile unsigned long )0x40025420)) #define GPIO_PORTF_PUR_R (((volatile unsigned long )0x40025510)) #define GPIO_PORTF_DEN_R (((volatile unsigned long )0x4002551C)) #define GPIO_PORTF_LOCK_R (((volatile unsigned long )0x40025520)) #define GPIO_PORTF_CR_R (((volatile unsigned long )0x40025524)) #define GPIO_PORTF_AMSEL_R (((volatile unsigned long )0x40025528)) #define GPIO_PORTF_PCTL_R (((volatile unsigned long )0x4002552C)) #define SYSCTL_RCGC2_R (((volatile unsigned long *)0x400FE108))

// 2. Declarations Section // Global Variables unsigned long SW1; // input from PF4 unsigned long SW2; // input from PF0

// Subroutine to initialize port F pins for input and output // PF4 is input SW1 and PF2 is output Blue LED void PortF_Init(void){ volatile unsigned long delay; SYSCTL_RCGC2_R |= 0x00000020; // 1) F clock delay = SYSCTL_RCGC2_R; // delay
GPIO_PORTF_LOCK_R = 0x4C4F434B; // 2) unlock PortF PF0 GPIO_PORTF_CR_R |= 0x1F; // allow changes to PF4-0
GPIO_PORTF_AMSEL_R &= 0x00; // 3) disable analog function GPIO_PORTF_PCTL_R &= 0x00000000; // 4) GPIO clear bit PCTL GPIO_PORTF_DIR_R &= ~0x11; // 5.1) PF4,PF0 input, GPIO_PORTF_DIR_R |= 0x08; // 5.2) PF3 output GPIO_PORTF_AFSEL_R &= 0x00; // 6) no alternate function GPIO_PORTF_PUR_R |= 0x11; // enable pullup resistors on PF4,PF0
GPIO_PORTF_DEN_R |= 0x1F; // 7) enable digital pins PF4-PF0
}

void FlashSOS(void){ //S GPIO_PORTF_DATA_R |= 0x08; delay(1); GPIO_PORTF_DATA_R &= ~0x08; delay(1); GPIO_PORTF_DATA_R |= 0x08; delay(1); GPIO_PORTF_DATA_R &= ~0x08; delay(1); GPIO_PORTF_DATA_R |= 0x08; delay(1); GPIO_PORTF_DATA_R &= ~0x08; delay(1); //O GPIO_PORTF_DATA_R |= 0x08; delay(4); GPIO_PORTF_DATA_R &= ~0x08;delay(4); GPIO_PORTF_DATA_R |= 0x08; delay(4); GPIO_PORTF_DATA_R &= ~0x08;delay(4); GPIO_PORTF_DATA_R |= 0x08; delay(4); GPIO_PORTF_DATA_R &= ~0x08;delay(4); //S GPIO_PORTF_DATA_R |= 0x08; delay(1); GPIO_PORTF_DATA_R &= ~0x08;delay(1); GPIO_PORTF_DATA_R |= 0x08; delay(1); GPIO_PORTF_DATA_R &= ~0x08;delay(1); GPIO_PORTF_DATA_R |= 0x08; delay(1); GPIO_PORTF_DATA_R &= ~0x08;delay(1); delay(10); // Delay for 5 secs in between flashes }

Memory

ROM

<div class="outline-text-3" id="text-7-1">
  <p>
    書き込んだデータは消去できないが、電源を切ってもデータが消えない読み出し専用のメモリ.
  </p></p>
</div></p>

RAM

<div class="outline-text-3" id="text-7-2">
  <p>
    データの読み書きは自由に行えるが、電源を切ると内容が消えるメモリ(Random Access Memory)
  </p></p>
</div></p>

Interface

ハードウェアとソフトウェアを結ぶもの。ここでいうところは、ハードウェアインタフェース。

interface is defined as the hardware and software that combine to allow the computer to communicate with the external hardware.

I/O Port, 外部電子回路、物理的デバイス、ソフトウェアなどを集めたもの。

An interface is defined as the collection of the I/O port, external electronics, physical devices, and the software, which combine to allow the computer to communicate with the external world.

以下の4つに分類される。

  • Parallel – binary data are available simultaneously on a group of lines
  • Serial – binary data are available one bit at a time on a single line
  • Analog – data are encoded as an electrical voltage, current, or power
  • Time – data are encoded as a period, frequency, pulse width, or phase shift

Parallel Interface

<div class="outline-text-3" id="text-8-1">
  <p>
    パラレルポートとは、コンピュータシステム内で、 ばらばらの周辺機器をケーブルで接続するために使われる物理的なインタフェースの一種。
  </p>

  <ul class="org-ul">
    <li>
      <a href="http://ja.wikipedia.org/wiki/%E3%83%91%E3%83%A9%E3%83%AC%E3%83%AB%E3%83%9D%E3%83%BC%E3%83%88">パラレルポート &#8211; Wikipedia</a>
    </li>
    <li>
      <a href="http://www.sophia-it.com/content/%E3%83%91%E3%83%A9%E3%83%AC%E3%83%AB%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%BC%E3%83%95%E3%82%A7%E3%83%BC%E3%82%B9">パラレルインターフェースとは 「パラレルインタフェース」 (parallel interface): &#8211; IT用語辞典バイナリ</a>
    </li>
  </ul>
</div></p>

Syncronization

<div class="outline-text-3" id="text-8-2">
  <p>
    ハードウェアとソフトウェアの同期処理。
  </p>

  <p>
    ハードウェアのスピードとソフトウェアのスピードは、 ソフトウェアの方が早いため相互でやりとりするためには以下の手段がある。
  </p></p>
</div>

<div id="outline-container-sec-8-2-1" class="outline-4">
  <h4 id="sec-8-2-1">
    Blind-Cycle
  </h4>

  <div class="outline-text-4" id="text-8-2-1">
    <p>
      決められた時間SleepしたあとにI/Oステータスをチェックする.
    </p>

    <p>
      the software writes data to the output device, triggers (starts) the device, then waits a specified time. We call this method blind, because there is no status information about the I/O device reported to the software.
    </p></p>
  </div></p>
</div>

<div id="outline-container-sec-8-2-2" class="outline-4">
  <h4 id="sec-8-2-2">
    Busy-Wait
  </h4>

  <div class="outline-text-4" id="text-8-2-2">
    <p>
      Input deviceのデータが更新されたときにI/Oステータスをチェックする。
    </p>

    <p>
      状態がBusyならばWait(loop), Readyならば次のステップへ。
    </p>

    <p>
      Busy Wait is a software loop that checks the I/O status waiting for the done state. For an input device, the software waits until the input device has new data, and then reads it from the input device,
    </p></p>
  </div></p>
</div>

<div id="outline-container-sec-8-2-3" class="outline-4">
  <h4 id="sec-8-2-3">
    Interrupt
  </h4>

  <div class="outline-text-4" id="text-8-2-3">
    <p>
      ハードウェアが発生させる特別な通知。
    </p>

    <p>
      An interrupt uses hardware to cause special software execution. With an input device, the hardware will request an interrupt when input device has new data. The software interrupt service will read from the input device and save in global RAM,
    </p></p>
  </div></p>
</div>

<div id="outline-container-sec-8-2-4" class="outline-4">
  <h4 id="sec-8-2-4">
    Periodic Polling
  </h4>

  <div class="outline-text-4" id="text-8-2-4">
    <p>
      クロックタイマの割り込み契機でI/Oのステータスをチェック
    </p></p>
  </div></p>
</div>

<div id="outline-container-sec-8-2-5" class="outline-4">
  <h4 id="sec-8-2-5">
    DMA
  </h4>

  <div class="outline-text-4" id="text-8-2-5">
    <p>
      Direct Memory Access あるメモリから別のメモリに直接情報を書き込む
    </p></p>
  </div></p>
</div></p>

Serial Interface

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

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

  <div class="outline-text-4" id="text-8-3-1">
    <p>
      Universal Asynchronous Receiver/Transmitter (UART). 調歩同期方式によるシリアル通信をするための汎用I/F。
    </p>

    <ul class="org-ul">
      <li>
        <a href="http://ja.wikipedia.org/wiki/UART">UART &#8211; Wikipedia</a>
      </li>
    </ul>

    <p>
      有名なので、最近のほとんどのマイコンに搭載されているらしい。
    </p></p>
  </div></p>
</div></p>

Thread/Process/Task

Thread

<div class="outline-text-3" id="text-9-1">
  <p>
    A thread is defined as the path of action of software as it executes.
  </p></p>
</div></p>

Process

<div class="outline-text-3" id="text-9-2">
  <p>
    A process is defined as the action of software as it executes.
  </p>

  <p>
    スレッドとプロセスの違いは、変数のスコープの違い?
  </p>

  <p>
    Threads share access to I/O devices, system resources, and global variables, while processes have separate global variables and system resources. Processes do not share I/O devices.
  </p>

  <p>
    実際は、OSによってバラバラ。
  </p>

  <ul class="org-ul">
    <li>
      <a href="http://futurismo.biz/archives/2245">スレッドとタスクの違いについてしらべてみた(C++/Linux) | Futurismo</a>
    </li>
  </ul>
</div></p>

Interrupt

Hardware Interrupt Software Action.

Busy-Waitの制御で待ってられない場合は、Interruptを利用する。

ここからは、一般的な説明ではなくてedXの中だけの定義。

Arm/DisArm

<div class="outline-text-4" id="text-10-0-1">
  <p>
    Armとは、ハードウェアが割り込みをあげることを有効化する。
  </p>

  <p>
    DisArmとは、ハードウェアが割り込みをあげることを無効化する。
  </p></p>
</div></p>

Enable/Disable

<div class="outline-text-4" id="text-10-0-2">
  <p>
    Enableは一時的に割り込みを有効化する。
  </p>

  <p>
    Disbleは一時的に割り込みを無効化する。
  </p>

  <p>
    Disable中に発生したInterupptは Pendingされて、Enable時に通知される。
  </p></p>
</div></p>

Interruputの初期化処理

<div class="outline-text-4" id="text-10-0-3">
  <ol class="org-ol">
    <li>
      Trigger flag set by hardware
    </li>
    <li>
      the device is armed by software
    </li>
    <li>
      the device is enabled for interrupts in the NVIC
    </li>
    <li>
      the processor is enabled for interrupts (PRIMASK I bit is clear)
    </li>
    <li>
      the interrupt level must be less than the BASEPRI.
    </li>
  </ol>
</div></p>

Context Switch

<div class="outline-text-4" id="text-10-0-4">
  <p>
    割り込みをハードウェアが検知したときに、 foregroundとbackgroundのスレッドを入れ替える。
  </p>

  <ul class="org-ul">
    <li>
      <a href="http://ja.wikipedia.org/wiki/%E3%82%B3%E3%83%B3%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%82%B9%E3%82%A4%E3%83%83%E3%83%81">コンテキストスイッチ &#8211; Wikipedia</a>
    </li>
  </ul>

  <p>
    現在のプロセスの実行を一時停止して、 スタックにレジスタ情報を覚えておく。
  </p>

  <p>
    割り込みハンドラを実行して、 ハンドラの実行が終了したらもとのプロセスを再開する。
  </p>

  <ol class="org-ol">
    <li>
      Current instruction is finished,
    </li>
    <li>
      Eight registers are pushed on the stack,
    </li>
    <li>
      LR is set to 0xFFFFFFF9,
    </li>
    <li>
      IPSR is set to the interrupt number,
    </li>
    <li>
      PC is loaded with the interrupt vector
    </li>
  </ol>
</div></p>

Interrupt Service Routine(ISR)

<div class="outline-text-3" id="text-10-1">
  <p>
    割り込みサービスルーチン。割り込みハンドラともいう。
  </p>

  <p>
    <a href="http://ja.wikipedia.org/wiki/%E5%89%B2%E3%82%8A%E8%BE%BC%E3%81%BF%E3%83%8F%E3%83%B3%E3%83%89%E3%83%A9">割り込みハンドラ &#8211; Wikipedia</a>
  </p>

  <p>
    コンテキストスイッチによって、 foregroundで動作している busy-waitなスレッドとISRがスワップされる。
  </p>

  <p>
    割り込み受け付けによって起動されるオペレーティングシステムや デバイスドライバのコールバックルーチン。 割り込みハンドラは割り込み原因によってそれぞれ存在し、 割り込みハンドラがそのタスクを完了するまでにかかる時間も様々である。
  </p></p>
</div>

<div id="outline-container-sec-10-1-1" class="outline-4">
  <h4 id="sec-10-1-1">
    NVIC
  </h4>

  <div class="outline-text-4" id="text-10-1-1">
    <p>
      割り込みハンドラに対応させたい関数は、 startup scriptに事前に登録しておく。
    </p>

    <p>
      vectorというメモリ領域にシステムにどの関数を実行すればいいかをアドレスとして教える。
    </p>

    <p>
      interrupt発生時は vectorを参照して、それに対応する割り込みルーチンの関数を呼ぶ。
    </p>

    <p>
      nested vectored interrupt controller (NVIC) manages interrupts, which are hardware-triggered software functions. Some internal peripherals, like the NVIC communicate directly with the processor via the private peripheral bus (PPB). The tight integration of the processor and interrupt controller provides fast execution of interrupt service routines (ISRs), dramatically reducing the interrupt latency.
    </p></p>
  </div></p>
</div>

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

  <div class="outline-text-4" id="text-10-1-2">
    <p>
      割り込みをISRが認識すること。 ISRが割り込みの認識を行った後、同じデバイスからの割り込みが発生しないよう割り込みマスクをする必要がある。 そうしないと、クラッシュする恐れがある。
    </p>

    <ul class="org-ul">
      <li>
        <a href="http://d241445.hosting-sv.jp/community/report/report31.html">レポート31:割り込みサービスルーチン(ISR)の処理</a>
      </li>
    </ul>

    <p>
      実装でやってはいけないことは以下。
    </p>

    <ul class="org-ul">
      <li>
        長時間の処理はしてはいけない。
      </li>
      <li>
        待ち状態になってはいけない、Delay Loopはつかわないほうがよい。
      </li>
      <li>
        呼んではいけない関数がある。
      </li>
    </ul>

    <p>
      割り込みハンドラでは必要最小限の処理のみを行い、別のタスクに通知して、 メインの処理はそっちでさせるように実装すべき。
    </p></p>
  </div></p>
</div>

<div id="outline-container-sec-10-1-3" class="outline-4">
  <h4 id="sec-10-1-3">
    ISRからメイン処理への通知方法
  </h4>

  <div class="outline-text-4" id="text-10-1-3">
    <p>
      ISRとメイン処理はグローバルなメモリ領域を介して情報を受渡しする。
    </p>

    <ul class="org-ul">
      <li>
        Binary Semaphore
      </li>
    </ul>

    <p>
      ISRで 決められたflagを立てて、メイン処理でそのフラグを監視する。 flagが1ならば、それのフラグに対応する処理を実施する。
    </p>

    <ul class="org-ul">
      <li>
        MailBox
      </li>
    </ul>

    <p>
      flagとともにデータも渡すこともある。
    </p>

    <p>
      flagをStatusといい、flagとdataを合わせたデータ構造をMailという。 (MailBox Pruducer-Consumer Pattern)
    </p>

    <ul class="org-ul">
      <li>
        FIFO queue
      </li>
    </ul>

    <p>
      ISRでFifoなメモリ領域にデータをPUTし、 メイン処理のloop処理でで定期的にFifoなdataをチェックし、順次実行する。
    </p></p>
  </div></p>
</div></p>