<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>PC日記</title>
        <link>https://www.wizard-limit.net/mt/pc/</link>
        <description>PCに関するもろもろもろ・・・</description>
        <language>ja</language>
        <copyright>Copyright 2022</copyright>
        <lastBuildDate>Wed, 04 Jan 2017 21:31:30 +0900</lastBuildDate>
        <generator>http://www.sixapart.com/movabletype/</generator>
        <docs>http://www.rssboard.org/rss-specification</docs>
        <atom:link href="https://www.wizard-limit.net/mt/pc/feed.xml" rel="self" type="application/rss+xml" />
        <atom:link rel="hub" href="http://pubsubhubbub.appspot.com" />
        
        <item>
            <title>テスト</title>
            <description>テストの記事投稿</description>
            <link>https://www.wizard-limit.net/mt/pc/archives/005552.html</link>
            <guid>https://www.wizard-limit.net/mt/pc/archives/005552.html</guid>
            
            
            <pubDate>Wed, 04 Jan 2017 21:31:30 +0900</pubDate>
        </item>
        
        <item>
            <title>MT 6.1.1バージョンアップ</title>
            <description><![CDATA[PostgreSQLでの文字化けは変わらず。<br/>
対策も以前と一緒。]]></description>
            <link>https://www.wizard-limit.net/mt/pc/archives/005311.html</link>
            <guid>https://www.wizard-limit.net/mt/pc/archives/005311.html</guid>
            
                <category domain="http://www.sixapart.com/ns/types#category">MovableType</category>
            
            
            <pubDate>Sun, 31 May 2015 08:40:50 +0900</pubDate>
        </item>
        
        <item>
            <title>git の基本</title>
            <description><![CDATA[git を使うようになってだいぶ経つんだけど、ちっとも使い方を覚えなくて、毎回検索してやり方を調べるようなことをしているので、いい加減まとめておくことにする。<br/>
主にsubversionとの比較で。<br/>
<br/>
<h2>init</h2>
<pre class="commandline">
% git init
</pre>
そのまま。subversionと一緒。<br/>
githubなんかと組み合わせて使うときは、github上でリポジトリを作ってからcloneするのが楽。<br/>
たぶんほとんどやらないけど、ファイルシステム上にリポジトリを作って他人とコラボレーションしようかな、とか言うときは--bareオプションをつける。<br/>
<br/>
<h2>clone</h2>
どこか他にあるリポジトリをローカルに持ってくるのに使う。svn checkoutと一緒。<br/>
<br/>
<h2>checkout</h2>
たぶんsubversionからの移行でいちばんわかりにくいコマンド。<br/>
<pre class="commandline">
% git checkout -b <i>&lt;branch&gt;</i>
</pre>
新しいbranchを作成し、そのブランチに切り替える。svn copy と(ほぼ)同義。<br/>
<pre class="commandline">
% git checkout <i>&lt;branch&gt;</i>
</pre>
ブランチに切り替える。svn switch相当。ってsvn switch使ったことないけど。<br/>
<pre class="commandline">
% git checkout <i>&lt;pathes&gt;</i>
</pre>
ローカルの編集を取り消して、元に戻す。svn revert相当。ただし、後述のstageに乗っていないとき(git addしていないとき)<br/>
<br/>
<h2>add</h2>
リポジトリにないファイルをstageに上げる(svn add相当)、もしくは修正したファイルをstageに上げる。(svn相当なし)
あるいは、mergeでconflictしたファイルを修正して解決する(svn resolved相当)<br/>
<br/>
<h2>commit</h2>
stageにあるファイルをcommitする。-aオプションをつけると、stageに上げるのとcommitを同時に行う。<br/>
<br/>
<h2>fetch</h2>
リモートの変更をローカルに持ってくる。(svn相当なし)<br/>
<br/>
<h2>merge</h2>
別のブランチの修正をカレントブランチにマージする。<br/>
オプションの違いについては<a href="http://d.hatena.ne.jp/sinsoku/20111025/1319497900">図で分かるgit-mergeの--ff, --no-ff, --squashの違い - アジャイルSEを目指すブログ</a>に詳しい。<br/>
<br/>
<h2>pull</h2>
fetch + merge(svn merge + commit相当)<br/>
<br/>
<h2>push</h2>
ローカルリポジトリのcommitをリモートにpushする。(svn commit相当？)<br/>
<br/>
<h2>status</h2>
状態を見る。(svn status相当)
<pre class="commandline">
% git status
On branch feature3 <font color="green">←現在のブランチ</font>
Changes to be committed: <font color="green">←stageにあるファイル一覧</font>
  (use "git reset HEAD <file>..." to unstage)

        new file:   test.txt

Changes not staged for commit: <font color="green">←変更されたがstageに上がっていないファイル一覧</font>
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        modified:   README.md

Untracked files: <font color="green">←リポジトリに追加されていないファイル一覧</font>
  (use "git add <file>..." to include in what will be committed)

        test2.txt
</pre>
-sbオプションをつけると、short formatで表示する。
<pre class="commandline">
% git status -sb
## feature3
 M README.md
A  test.txt
?? test2.txt
</pre>
1行目は現在のブランチで、2行目以降にファイルリストが並ぶ。<br/>
1文字目がstageの状態、2文字目がunstageの状態。<br/>
文字の意味は、git status --helpで見られる。svnだとCがconflictだが、gitではCはcopied、Uがconflictになる。<br/>
<br/>
<h2>diff</h2>
svn diff相当。subversionではrevision/changesetと言う考え方で、リビジョン番号で管理するが、gitはcommitで管理する。commitには1e53ba53322a3112eacc5b7813684bf19f28c6fdみたいなSHA-1 hashがつくので、hashで指定する。全部指定するのは面倒なので、頭4文字程度で指定することが可能(指定した文字数でcommitが一意に識別できる必要があるので、同じリポジトリに頭4文字が同じcommitがあると、もっと長い文字数を指定しないといけない)<br/>
diffの引数は、commitだったり、別のブランチだったり、いろいろできるのでgit diff --help参照。<br/>
<br/>
<h2>log</h2>
svn log相当。<br/>
--graphをつけると、どのようなブランチを辿ってcommitされてきたのかをグラフで見ることができる。<br/>
--mergesをつけると、merge commitだけをフィルタして見ることができる。<br/>
<br/>
<h2>show</h2>
git show <i>commit</i>で、特定のcommitのdiff(svnのchangeset)を見ることができる。
<br/>
<h2>stash</h2>
現在の変更を、一時的に待避する。(svn相当なし)<br/>
stash popで待避したものを現在のカレントに適用する。<br/>
内部的には、stashもHEADを動かさないcommit？<br/>
<br/>
<h2>tag</h2>
git tag -a <i>tagname</i> で、現在のワーキングツリーにタグを打つことができる。(tagnameの後にcommit を指定することも可能)<br/>
<br/>
<h2>archive</h2>
svn export相当。(実際には、checkout-indexと言うコマンドもあり、そちらの方がsvn exportに近い)<br/>
<br/>
<h2>取り消し</h2>
<ol>
<li>編集したファイルを取り消したい<br/>
→git checkout ファイル名</li>
<li>編集した上にgit addした(stageに上げた)ファイルを取り消したい<br/>
→git reset HEAD ファイル名</li>
<li>commitを取り消したい<br/>
→git reset --soft HEAD~ (ワークファイルは変更が加わったまま)<br/>
→git reset --hard HEAD~ (ワークファイルもcommit前に戻る)</li>
<li>commitをやり直したい<br/>
→git commit --amend</li>
<li>複数のcommitをまとめたい<br/>
→git rebase -i HEAD~<i>n</i> (ぐぐるとやり方がたくさん見つかる)</li>
</ol>

まだ書き途中。<br/>
commitの指定方法とか<br/>
remoteの指定方法とか<br/>
commitをまとめるとか]]></description>
            <link>https://www.wizard-limit.net/mt/pc/archives/005261.html</link>
            <guid>https://www.wizard-limit.net/mt/pc/archives/005261.html</guid>
            
                <category domain="http://www.sixapart.com/ns/types#category">git</category>
            
            
            <pubDate>Wed, 04 Mar 2015 15:29:32 +0900</pubDate>
        </item>
        
        <item>
            <title>MovableTypeとPostgresqlでの文字化け</title>
            <description><![CDATA[FreeBSDのメンテをしていたら、いつのまにかrubyが1.9から2.0になったり、perlが5.16から5.18になったり、共有ライブラリの*.laファイルを使わない方針になったりといろいろ変わっている。<br/>
/usr/ports/UPDATINGを見ながら、それぞれアップデートする。<br/>
rubyのバージョンが上がったので、passengerを入れ直したり、bundle installしたりして、なんとなく動いたかな〜、と思っていたら、MovableTypeで文字化けが発生。<br/>
状況としては、以下のような感じ。
<ol>
<li>管理コンソールは普通に表示できる。</li>
<li>新しい記事を書いて公開しようとすると、テンプレート「ヘッダー」がないよ的なエラーが出た上に保存した記事が文字化けしている。</li>
<li>DBを覗くと、DBに入っている時点で文字化けしている。</li>
</ol>

化け方としては、「あ」と入れたものが、psqlで表示すると「ã\u0081\u0082」のようになる。「あ」のUTF-8でのurlencodeが「%E3%81%82」であることから、おそらく「\u00e3\u0081\u0082」のように化けているものと思われる。<br/>

*.laファイル削除の関係で、文字コード変換系のライブラリが読めてないのかな？と思ってperlとperlのモジュールを全て再インストールしてみたけど変化無し。<br/>
もともと、非推奨のPostgreSQLを使っているので、サポート的な物は期待できないし、検索しても似たような例は見当たらない。<br/>
そこで、現象の切り分けと推測を始める。<br/>
まず、管理コンソールが普通に表示できて、過去に保存した記事が読めることから、DB→cgi→ブラウザでの表示は問題ないことがわかる。<br/>
そして、新しく入力した記事が文字化けすること、存在するはずのテンプレート「ヘッダー」が見つからないと言われることから、cgi→DBで文字化けが発生していると考えられる。<br/>
後は、ソースからDBとの入出力をしている箇所が特定できれば良いのだが、MovableTypeは自前のOR Mapperを使っているらしく、なかなか該当の箇所が探せない。<br/>
諦めかけて、MySQLに移行しようかと思ったりもしたけど、MySQLはあまり好きではない。さらに、SQLレベルでの移行ではなく管理コンソールを使ってのexport/importらしく、試しにexportしてみようとしたが、途中で接続が切れてしまった。<br/>
もう少し現象を理解しようと思って、自分でperlのプログラムを書いて検証したところ、DBIモジュールでDBと出し入れするときは、utf8::is_utf8()がtrueを返す文字列(つまり、utf8のperl内部表現の文字列)を使うことになっているが、生のutf-8の文字列を渡すと同じように文字化けすることがわかった。<br/>
この辺については、<a href="http://bayashi.net/wiki/perl/unicode">Perl: 文字コードとutf8フラグについて - @bayashi Wiki</a>とか、<a href="http://blog.livedoor.jp/dankogai/archives/51004472.html">404 Blog Not Found:perl - utf8::is_utf8("\x{ff}") == 0</a>あたりが詳しい。<br/>
とにかく、文字化けしているデータをEncode::decode_utf8(xxx)すると文字化けが治ることがわかったので、後はソースから余計にEncode::encode_utf8(xxx) もしくはEncode::encode('utf8', xxx)している箇所を探せば良い。<br/>
のだが、私の力ではMovableTypeのソースが読みこなせなかったので、次はDBに入れるところ(SQLのパラメータをDBIに渡しているところ)が探せれば良いのだが、前述の通りOR Mapper(ObjectDriverと言う名前らしい)を使っているのと、DBIとかPgとか同じ名前のクラスが複数パッケージに存在していて、効きそうな場所が見つけられない。<br/>
諦めかけたところで、lib/MT/Object.pm に辿り着く。こいつがOR MapperのObjectのスーパークラスのようで、__core_final_pre_save とか、 __core_final_pre_search とか言うトリガを登録しているところで、Encode::encode()している箇所が怪しそうだと当たりをつける。<br/>
そこで、encodeしているところをコメントアウトしてみたところ、無事に文字化けが発生しなくなった。<br/>

<script src="https://gist.github.com/false-git/852c47bfe1179cb6a5a0.js"></script>

しかし、この対応が正しいとは思えないので、どなたか正しい原因と対策を教えてください〜。
]]></description>
            <link>https://www.wizard-limit.net/mt/pc/archives/005232.html</link>
            <guid>https://www.wizard-limit.net/mt/pc/archives/005232.html</guid>
            
                <category domain="http://www.sixapart.com/ns/types#category">MovableType</category>
            
            
            <pubDate>Sat, 27 Dec 2014 13:21:28 +0900</pubDate>
        </item>
        
        <item>
            <title>fm3マイコンで遊ぶ(4)</title>
            <description><![CDATA[<b>諸君、私はprintfデバッグが好きだ。</b><br/>
でネタを書こうと思ったんけど、元ネタがとても長かったので、改変するのも面倒でやめた。<br/><br/>
今どきのARMのマイコンの開発であれば、JTAGを使ってIDE上からデバッグができて、printfなど使わなくても変数の中身は見られるし、ブレークポイントははれるし、ステップ実行もできるのだろう。<br/>
しかし、私はJTAGを持っていない。fm3マイコンがもう一枚とか、NXPの安いボードを持っていれば、Open OCDを使ってデバッグができるのだろうが、私は持っていない。<br/>
そこで、printfデバッグの出番ですよ！となるのだが、printfの出力をどうやって受けるか？と言う問題がある。<br/>
雑誌の付録のfm3マイコンは、USBが2ポートと、多数のマルチファンクションシリアルがあるが、マルチファンクションシリアルはレベル変換をしてあげないと通常のPCのシリアルとは繋げないし、そもそも今どきのPCにはシリアルポートがないので、USB-シリアル変換ケーブルなんぞが必要になる。これも個人では持っていない。<br/>
よろしい、ならばUSBだ！(改変を諦めたとか言いながら引きずってる)<br/>
基板にあるミニUSBは、FLASH Programmerで書き込みをした後は電源供給にしか役に立っていない。<br/>
これを使わない手はないだろうと思って調べてみたところ、さすがUSB、通常のシリアルのように、RxDとTxDだけ押さえれば良いと言うような簡単なものではない。端子の抜き差しから、相手とのネゴシエーション、通信まで全部面倒見てやらないといけないらしい。<br/>
とりあえず、USBデバイスにはUSBメモリやHDDみたいなmass storageや、USBオーディオのようなクラスと呼ばれるものがあり、シリアル通信を行うものは CDC と言うらしい。<br/>
当然、そこら辺にミドルウェアが転がっているよね？と調べてみたが、open sourceの実装は見つけられず。<br/>
Keil MDKの場合は、Proを買うとUSB Deviceのミドルウェアが付いてくるが、試用版では当然使えない。<br/>
そして、IAR Embedded Workbenchには、Virtual COM Portと言うCDCのサンプル(相手からのデータをエコーバックするもの)が入っていることを発見。<br/>
このサンプルが前回作ったgccでビルドできれば、USB経由で夢のprintfデバッグができるようになるのだ。<br/>
試行錯誤ののち、なんとか動くようになったので、いつものようにgithubに上げてある。(<a href="https://github.com/false-git/fm3/tree/master/sample3">fm3/sample3 at master · false-git/fm3</a>><br/>
今回のはまりポイントは、以下。<br/>
<ul>
<li>intrinsics.h<br/>
IAR EW のヘッダファイルには、intrinsics.hと言うものがあるが、MDKにもgccにも該当するファイルはない。このため、空のファイルを作って、アドホックなdefineを入れてみた。</li>
<li>startup_ARMCM3.S<br/>
gccに入っていた startup_ARMCM3.Sだと、isr_vectorが少なくて、今回使うようなUSB関連の割り込みベクタの設定がない。そこで、startup_mb9bf61x.s を参考に、不足している割り込みベクタを補完した。</li>
<li>Makefile<br/>
今回ビルドしたコードには、for(int i = ...)みたいなコードがあり、gccのデフォルトだと怒られるので、--std=c99オプションを追加した。</li>
<li>arm_comm.h<br/>
これは、IAR EWのプロジェクトに含まれるヘッダなのだが、CriticalSecCntrと言う変数の型が、このヘッダとmain.cで違うためエラーになっていたので型を揃えた。<br/>
また、中にinlineなメソッドがあるのだが、そのままビルドすると何故かリンク時に Undefined Referenceになるので、staticをつけた。<br/>
インラインアセンブラの記述に、asm()を使っていたので、gccで通るように__asm__()にした。(上述のintrinsics.hでdefine)<br/>
ArmV7以前とV7の分岐があったので、V7用のコードがコンパイルされるように、__CORE__を7にdefineした(上述のintrinsics.h)</li>
<li>system_mb9bf61x.[ch]<br/>
最初、sample2と同じくSysTickのサンプルから持ってきていたのだが、このコードだと SystemInit()の中でUSB/Etherのクロック設定が行われない。<br/>
そこで、Virtual COM Portのサンプルから持ってきたら動いた。<br/>
SysTickサンプルではなく、Spansionからダウンロードできるtemplateも見てみたが、バージョンは新しいのにUSBクロックの初期化コードや、UCCR等のレジスタのdefineもなかった。</li>
</ul>

書き出してみるとこんな感じだけど、USBクロックの初期化が足りないのはなかなか気が付かなくて、なんで動かないのか非常に悩んだ。<br/>
その過程で調べた、Virtual COM PortのSystemInit()でやっているUSBクロックの初期化について簡単に書いておこう。<br/>
基本は、ペリフェラルマニュアルの通信マクロ編である。<br/>
<ol>
<li>UCCRレジスタに0を入れて、UCCRの読出しが0になるまで待つ<br/>
UCCRレジスタに0を入れるということは、USB/Etherのクロック出力を停止していると思えば良い。</li>
<li>UPCR1レジスタに0を入れる<br/>
これは、USB-PLLの発振停止</li>
<li>UPCR2〜UPCR7のレジスタを初期化<br/>
細かく書かないけど、今回大事なのはUPCR6のUSBRに2を入れて、PLLCLKの3分周をUSBのクロックとして使用すると言うこと。</li>
<li>UPCR1レジスタに1を入れ、読出しが1になるまで待つ。<br/>
USP-PLLの発振開始。</li>
<li>UCCRレジスタに0x3Dを入れる<br/>
これも細かいことは割愛するけど、USBのクロックとしてCLKPLLを使うと言う設定。</li>
<li>USBコントローラをonにする前に、5cycleクロック供給</li>
<li>USBEN0/1レジスタに1を入れる<br/>
USBコントローラを有効にする。
</ol>
PLLCLKは何かって言うと、CLKMO(外部から供給されている4MHzのクロック)にPLLN(36) を掛けて PLLK(1) で割ったもの = 144MHz。これを、上記設定で3分周するのでUSBで使用する48MHzのクロックが得られるらしい。<br/>
書いてて自分で何を言ってるのかさっぱりわからないけど。<br/>
]]></description>
            <link>https://www.wizard-limit.net/mt/pc/archives/005194.html</link>
            <guid>https://www.wizard-limit.net/mt/pc/archives/005194.html</guid>
            
                <category domain="http://www.sixapart.com/ns/types#category">Hardware</category>
            
            
            <pubDate>Fri, 30 May 2014 14:50:22 +0900</pubDate>
        </item>
        
        <item>
            <title>fm3マイコンで遊ぶ(3)</title>
            <description><![CDATA[引き続き、gccでSysTickのサンプルがビルドできるようにする。<br/>
必要なのは、<a href="http://www.arm.com/cmsis">CMSIS</a>関連のヘッダファイルと、デバイス用のヘッダファイルになる。<br/>
上記リンクを見ると、CMSISの仕様とテンプレートは無償でダウンロードできるとある。<br/>
しかし、ダウンロードしようとすると、ユーザ登録を求められる。メールアドレスと個人情報を登録すると、しばらくするとアクティベーションのメールが届くので、URLにアクセスすると登録が完了する。<br/>
ダウンロードしたのは CMSIS-SP-00300-r3p1-00rel0.zip と言うファイル。<br/>
展開すると、ドキュメントと、共通のヘッダ、ライブラリ、デバイス用のテンプレートファイルがある。<br/>
残念ながら、ここにはfm3マイコン用の定義は含まれていないようだ。(※ spansionからダウンロードできる)<br/>
しょうがないので、SysTickのサンプルや、MDKの中から必要なファイルをかき集めて、なんとかビルドできるようになった。<br/>
<a href="https://github.com/false-git/fm3/tree/master/sample2">fm3/sample2 at master · false-git/fm3</a><br/>
かき集めたファイルは、ライセンスがいまいちわからなかったり、CMSISのEULAを読むのが面倒だったので、上記リポジトリには含めていない。READMEにどこから入手するかを書いたので、必要であれば持ってきて欲しい。<br/>
RTXカーネルもBSDライセンスだと書いてあるのでダウンロードしてみたが、試してみるのはまた今度にしよう。]]></description>
            <link>https://www.wizard-limit.net/mt/pc/archives/005193.html</link>
            <guid>https://www.wizard-limit.net/mt/pc/archives/005193.html</guid>
            
                <category domain="http://www.sixapart.com/ns/types#category">Hardware</category>
            
            
            <pubDate>Wed, 28 May 2014 15:15:27 +0900</pubDate>
        </item>
        
        <item>
            <title>fm3マイコンで遊ぶ(2)</title>
            <description><![CDATA[さて、KEIL MDKでビルドできるようにはなったけど、試用版だと作成できるプログラムに32kBの制限がある。また、scatterファイルも使えないみたいな記述もある。なにより、ダウンロードするのに登録が必要なのが嫌だ(したけど)。<br/>
他の開発環境としては、IAR Embedded Workbench と言うのもあるが、こちらも登録が必要＆機能制限版だ。<br/>
他にないかと思って調べていた所、<a href="http://avr.paslog.jp/article/2545802.html">マイコン風雲録: arm-none-eabi-gcc / 2012年メモ</a>と言うページを発見。<a href="https://launchpad.net/gcc-arm-embedded">GCC ARM Embedded in Launchpad</a>と言うものがあるようだ。<br/>
これは、本家ARMの人が開発に携わっていて、登録不要でダウンロードできる。さらに、WindowsのみでなくLinux用やMac用も存在する。<br/>
早速、上記ページからMac用の gcc-arm-none-eabi-4_8-2014q1-20140314-mac.tar.bz2 をダウンロードし、$HOMEに展開、$HOME/gcc-arm-none-eabi-4_8-2014q1/bin に PATH を通す。<br/>
前回MDKで利用したSysTickタイマを使ったLED点滅プログラムを試そうと思ったが、includeしているmcu.hと、それがincludeしている各種ヘッダがないため、そのままだとビルドできない。<br/>
そこで、まずは予習。fm3のデータシートと、ペリフェラルマニュアル、前回のサンプルプログラムと、それがincludeしているヘッダファイルを読む。<br/>
<h3 class="h3c">メモリマップ</h3>
メモリマップは、データシートに載っている。<br/>
知っておかないといけないことは、以下くらいか。<br/>
<ul>
<li>flash ROM は、1Mbyteで、0x0000_0000〜0x000f_ffff</li>
<li>SRAMは64kbyteの領域が2つあり、0x1fff_0000〜0x0x1fff_ffffと0x2000_0000〜0x2000_ffff</li>
<li>ペリフェラルは0x4000_0000〜0x43ff_ffffに割り当てられている</li>
</ul>
<h3 class="h3c">GPIO</h3>
GPIOを使うために押さえないといけない情報は、Interfaceのページからダウンロードできる「拡張コネクタピン配置図」と、チップのペリフェラルマニュアルにある。<br/>
ペリフェラルマニュアルのレジスタの説明を見ると、IO関連のレジスタとしてPFR, PCR, DDR, PDIR, PDOR, PZRがあることがわかる。(他に、E***もあるが、当面無視)<br/>
<dl>
<dt>PFR</dt>
<dd>ポートをGPIOで使用する(0)か、周辺機器として使用する(1)か</dd>
<dt>PCR</dt>
<dd>内蔵プルアップ抵抗を接続する(1)か、切断する(0)か</dd>
<dt>DDR</dt>
<dd>入力端子で使用する(0)か、出力端子で使用する(1)か</dd>
<dt>PDIR</dt>
<dd>現在のレベル状態を読出し</dd>
<dt>PDOR</dt>
<dd>出力レベル設定。1: high, 0: low</dd>
<dt>PZR</dt>
<dd>オープンドレイン(1)</dd>
</dl>
雑誌の付属基板の場合、IOポートのPF3(ポートは、16進二桁で表す。PF3は0xF3のポートと言う意味)に負論理で繋がっているらしい。<br/>
ここで、負論理とかオープンドレインとか知らない用語が出てくる。<br/>
オープンドレインについて調べたところ、<a href="http://www2.ocn.ne.jp/~mhage/PIC_Trap/RA4.html">RA4の罠</a>がわかりやすかった。このページの最後の図を見ると、意味が理解できると思う。<br/>
とにかく、基板上のLEDは、「ポートF3をGPIOで使う設定にし、オープンドレインにし、入出力を出力にし」た上で、出力をlowにすれば点灯し、highにすれば消灯するのだ。<br/>
<br/>
ここまでの前提知識を入れた上でSysTickタイマのサンプルプログラムを見ると、FM3_GPIO->*F_f.P3 にアクセスして上記の内容を実現していることがわかる。<br/>
FM3_GPIOの正体は、mb9b610t.h で宣言されている構造体のポインタであり、0x40033000を指している。<br/>
この構造体は、レジスタ毎に PFR*_fやPZR*_f のような構造体を持っており、その中に P0〜PFのようなメンバ(ビットフィールド)を持っている。*の部分と、P?の部分でポートを特定するのだ。<br/>
さらにこのヘッダを読み込むと、bFM3_GPIO_PFR0_P0 のような define があることに気づく。<br/>
コメントには、「Peripheral Bit Band Alias declaration」とある。<br>
上記構造体がビットフィールドでメンバを持っているため、ビット毎にunsigned intでアクセスできるようにしたアドレスエイリアスがあるようだ。<br/>
ここまでわかれば、アプリケーションは書けそうだ。後はコンパイル＆リンクの方法だ。<br/>
まず読むのは、gccの<a href="https://launchpadlibrarian.net/170926122/readme.txt">readme.txt</a>。<br/>
ここを読むと、アーキテクチャ毎のコマンドラインオプション、libcであるnewlibとnewlib-nano、gcc-arm-none-eabi-*/share/gcc-arm-none-eabi/samplesにサンプルがあることがわかる。<br/>
早速サンプルディレクトリを見ると、startupコード、リンカスクリプト、Makefile等のサンプルを見ることができる。<br/>
サンプルプログラムのコード自身は、無限ループだったり、printfだったりしてあまり参考にならない。<br/>
<br/>
まずはstartupコード。gcc-arm-none-eabi-4_8-2014q1/share/gcc-arm-none-eabi/samples/startup/startup_ARMCM3.Sを使う。<br/>
試しに、MDK用のstartupコード startup_mb9bf61x.s と比較すると、アセンブラの文法が違う！<br/>
最初は、MDKのサンプルのstartupコードをそのまま使おうと思ったのだが、アセンブラが文句を言うので諦めた。<br/>
startupコードを眺めると、stackセクション、heapセクションに続き、isr_vectorの定義が続く。MDKのと比べると、stack size は0x200と0xc00でgccの方が大きく、heap size は両方共0、isr_vectorはgccの方はSysTick_Handlerで終わっているが、MDKの方はその後にいろいろある。<br/>
isr_vectorと言うのは、大雑把に言うとアドレス0x0から配置されるアドレステーブルで、割り込みがあったときにそこに書いてあるアドレスの割り込みハンドラを実行するためのもの。<br/>
続いて、Reset_Handler。MDKのものは、SystemInitを呼んで、__mainを呼ぶと言うものだが、gccのものは初期値付データのROMからRAMへのコピーと、BSSの0クリアがあったあとSystemInitの呼出、_startの呼び出しとなる。<br/>
__mainも、_startも、ユーザが書くコードではなく、libcに含まれるCのスタートアップルーチンと思われる。<br/>
その後は、isr_vectorに並べた割り込みハンドラとして、何もしないDefault_Handlerがweakで定義される。<br/>
知識がないので推測だが、ユーザがXXX_Handlerを書いてリンクするとそちらが採用され、書かないとデフォルトハンドラがリンクされるのだと思う。<br/>
<br/>
続いて、リンカスクリプト。gcc-arm-none-eabi-4_8-2014q1/share/gcc-arm-none-eabi/samples/ldscripts/gcc.ld を採用する。<br/>
中を見ると、MEMORYと言うセクションにFLASH, RAMと言う定義があり、開始アドレスとサイズが書いてあるので、データシートから読み取った値に変更する。(<a href="https://github.com/false-git/fm3/commit/cd4fcca37f27b52383254f1adead54be0266e951#diff-7f8e513b65c54dc92951c4658fe25e0d">rename and modify for target · cd4fcca · false-git/fm3</a>)<br/>
後は、サンプルのMakefileを参考にMakefileを書く。(<a href="https://github.com/false-git/fm3/blob/master/sample1/Makefile">fm3/sample1/Makefile at master · false-git/fm3</a>)<br/>
そうそう、gccでビルドしてできるのはaxfファイルなので、USB DIRECT Programmerで焼けるように hex 形式に変換してあげないといけない。<br/>
調べてみたところ、objcopyを使うと変換できるらしいので、Makefileに書いておいた。<br/>
一応 Makefile の解説をしておく。<br/>
<ul>
<li>NAME はアプリケーションの名前。この名前の.cがあることを想定していて、この名前の.axf, .hexができる</li>
<li>ARCH_FLAGS は readmeに書いてあったアーキテクチャ毎のオプション</li>
<li>STARTUP は、startupコードの.o</li>
<li>CFLAGS/CXXFLAGS/ASFLAGSは説明は不要か</li>
<li>USE_NANO は、newlib-nanoを使うときに定義する。使わない場合は空にする。ちなみに、nanoだとバイナリが2kくらい。nanoじゃないと10kくらいになる</li>
<li>USE_SEMIHOSTとUSE_NOHOSTはsemihostかそうじゃないかでどちらを使うか決める。JTAGを持っていないので、NOHOSTの方を使っている(参考: <a href="http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0205f/Bgbjjgij.html">ARM Information Center</a>)</li>
<li>GCは良くわからない。サンプルからそのまま</li>
<li>MAPはmapファイルの出力を指示する</li>
<li>LDSCRIPTSは、リンカスクリプトの指定</li>
<li>LFLAGSはリンク時のオプション</li>
</ul>
と、言うわけでビルドできるようになった一式は、githubに上げてある。(<a href="https://github.com/false-git/fm3/tree/master/sample1">fm3/sample1 at master · false-git/fm3</a>)<br/>
あ、sample1.cの説明をしていなかった。<br/>
これは単に、基板上のLEDを点灯させるだけのプログラムである。<br/>
MDKのサンプルだと、SysTick_Config()とか呼んで、SysTick_Handlerで点滅させていたのだけれど、gccでこの辺が使えるかわからなかったので、点灯させるだけで無限ループに入るようにしてある。<br/>
SystemInit()は、startupコードを__NO_SYSTEM_INITを定義せずにビルドすると呼ばれるので、空の関数を入れてある。<br/>
次回は、MDKのサンプルが動くように、CMSISをgccで動かす話をしようと思う。]]></description>
            <link>https://www.wizard-limit.net/mt/pc/archives/005192.html</link>
            <guid>https://www.wizard-limit.net/mt/pc/archives/005192.html</guid>
            
                <category domain="http://www.sixapart.com/ns/types#category">Hardware</category>
            
            
            <pubDate>Wed, 28 May 2014 11:06:27 +0900</pubDate>
        </item>
        
        <item>
            <title>fm3マイコンで遊ぶ(1)</title>
            <description><![CDATA[Interfaceと言う雑誌の2012年6月号に、Cortex-M3が乗った<a href="http://www.kumikomi.net/interface/contents/fm3.php">fm3マイコン基板</a>と言う付録がついていたので、購入したまま寝かせていた。<br/>
最近無電圧の接点出力が欲しくて、簡単な電子工作をしたくていろいろ試していた。接点の先に何が繋がるかわからないので、CPUのGPIOの出力に直接繋ぐわけにはいかず、リレーと、リレードライブ回路をCPUに繋ぐ必要があることがわかった。<br/>
まずは Raspberry pi を購入してちょっと遊んでみたが、RaspbianはLinuxなので、終了処理をちゃんとやってあげないとファイルシステムが壊れるのではないかとの不安があった。<br/>
そこで、fm3基板があったことを思い出し、若松通商で「FM3 マイコン基板 部品キット」を購入。<br/>
たくさん部品が付いてきたが、全部ハンダ付けするのは骨が折れると思い、最低限必要な部品をセレクトした。<br/>
<ul>
<li>JP1〜JP3(ピンヘッダ)</li>
<li>リセットスイッチ</li>
<li>CN4(7PIN×2列ピンヘッダ)</li>
<li>32.768kHz水晶振動子</li>
<li>リセットIC</li>
<li>CN5(10PIN×2列ピンBOX型ヘッダ</li>
<li>2.2μHインダクタ</li>
<li>USBホストコネクタ標準A</li>
</ul>
を選択。CN1〜CN4の中で、CN4のみを選択したのは、CN4にはVCC/GNDとGPIOの入出力が揃っているため、使い勝手が良いと判断したため。<br/>
まずは、リセットスイッチと2PINコネクタ付ケーブルをハンダ付け。黒いビニールチューブが付いてきていたので、半分に切ってケーブルに通した状態でハンダ付けした。<br/>
続いて、JP1〜JP3のピンヘッダをハンダ付けするために、3PIN×2列のピンヘッダを折って3つに分ける必要がある。<br/>
雑な性格なので、ニッパーでピンヘッダを折ろうとしたところ、一つ目は飛んでいって行方不明になり、2つ目は壊してしまい、一つしか残らなかった。<br/>
JP1とJP2の分は最低限必要なので、使わないことにした44ピンのピンヘッダを折って使うことに。<br/>
同じ失敗をしないように、カッターで切れ込みを入れて、ラジオペンチで挟んで折ってみた。<br/>
次に、部品を基板に嵌めてみて、「背の低いものから」ハンダ付け開始。<br/>
しかし、この基板はハードウェア初心者向けでは絶対ない。<br/>
32.768kHzのクリスタルなんて、ピンの幅が2mmくらいしかない。<br/>
泣きながらハンダ付けしつつ、JTAG(CN5)と電源系(インダクタのハンダ付けと、パターンカットとハンダ盛り)を残してギブアップ。<br/>
とりあえずJP1とJP2がついていればLEDをつけるくらいはできるはずなので、USBケーブルを探してきてMacに繋いでみる。<br/>
うんともすんとも言いません。<br/>
基板をよく見てみると、リセットICの足のハンダが、隣のC22と短絡しているように見えたので、修正したりしてみる。<br/>
が、やはりうんともすんとも・・・。<br/>
いろいろやる前に、最初にUSBケーブルを繋ぐくらいはやっておくべきだった・・・。<br/>
その日はそのまま諦めて、後日別のPCに別のケーブルで繋いでみたところ、USB機器として認識。冷やしたのが良かった？<br/>
さて、これでハードの準備ができたので、次は載せるアプリが必要。<br/>
デフォルトの開発環境は、KEILのMDK(μVision)で、基板のflashにプログラムを焼くのは富士通提供のFLASH USB DIRECT。<br/>
しかし、雑誌が出てからの2年の間に、μVisionは4から5にバージョンが上がり、fm3は富士通からSpansionに売却されてしまっていた。<br/>
富士通のfm3のページにはSpansionに売却された旨の記載があり、Spansionへのリンクがあったので、Spansionからデータシートやペリフェラルマニュアル等をダウンロードし、FLASH USB DIRECTをダウンロード。<br/>
ダウンロードには個人情報の提供が必要だ。<br/>
μVisionの方も、KEILに個人情報を提供すると、期間制限版か容量制限版の試用版がダウンロードできる。<br/>
雑誌のサンプルプログラム(SysTickタイマ割り込みLED点灯制御サンプル・プログラム)は、μVision5でもそのままビルドできるので、ビルドするとhexファイルが出来上がる。<br/>
基板のJP1にショートピンを刺した状態でUSBでPCと繋ぐと、USB機器として認識されるので、USB DIRECT Programmerのインストールディレクトリのdriverの下にあるデバイスドライバをインストールする。<br/>
デバドラのインストールに成功すると、COMポートが増えるので、USB DIRECT Programmerでポート番号を指定する。<br/>
Target MCUでMB9BF618S/Tを選択し、先ほどできあがったhexファイルを指定して、Full Operationボタンを押す。<br/>
実機をリセットしてOKを押せ、と言われるので、JP2に繋いだリセットスイッチを押す。<br/>
少し待ってからOKを押すと、flashの書き込みが行われる。<br/>
JP1のショートピンを外し、再度リセットすると、無事に基板上にあるLEDが点滅した。<br/>
ここまで来るのにすごく時間がかかっていて、ハマりポイントを列挙しておく。<br/>
<ul>
<li>JP1がショートしている状態でないと、USBケーブルを繋いでもUSB機器として認識されない。(JP1がショートしていなくても、USBデバイスとして動作するようなアプリが書かれていれば別だが)</li>
<li>Mac上のVMware Fusion 上のWindowsにつなごうとしてもうまくいかない。Fusion 4系でも6系でも駄目。デバイスとして認識して、デバイスドライバのインストールまでいけるが、その先が駄目だった。</li>
</ul>
長くなったので、続きは別のエントリで。]]></description>
            <link>https://www.wizard-limit.net/mt/pc/archives/005191.html</link>
            <guid>https://www.wizard-limit.net/mt/pc/archives/005191.html</guid>
            
                <category domain="http://www.sixapart.com/ns/types#category">Hardware</category>
            
            
            <pubDate>Wed, 28 May 2014 09:57:27 +0900</pubDate>
        </item>
        
        <item>
            <title>Raspberry pi</title>
            <description><![CDATA[ここのところ、デジタル回路の勉強がしてみたくって、昔のinterfaceのおまけの<a href="http://www.kumikomi.net/interface/contents/fm3.php">fm3ボード</a>を取り出してきたりしてみてたんだけど、すでに富士通セミコンダクタは半導体関連をSpansionに譲渡していたりして、いろいろページが見られなくなったりしている。<br/>
そもそも、このボードは単体では使えなくて、いろいろくっつけたりしないといけない。<br/>
どうせなら、LEDとか抵抗とかブレッドボードとか買っておこうと思って、何年ぶりかで秋葉原に買い物に行くことにする。<br/>
が、その前にいろいろ調べていたら、Raspberry piと言うものがあることを知る。<br/>
ArduinoとかNetduinoとかも良かったんだけど、入り口として使いなれたLinuxが動くのは良いかなとおもってamazonでポチる。<br/>
単体であっても使えないので、ケースと、<a href="http://lchikaamazon.hatenablog.com/">Raspberry Pi 電子工作</a>の電子工作入門キット、そしてBUFFALOの極小USB無線LAN(WLI-UC-GNIM)を注文した。<br/>
Raspberry piはSDカードにOSを入れて使うので、まずはSDカードが必要。<br/>
うちに余っていたのは4GのSDカード。こいつに<a href="http://www.raspberrypi.org/downloads/">Downloads | Raspberry Pi</a>からダウンロードしたNOOBSのイメージを焼いて、USBのキーボード、マウスを繋ぎ、HDMIでTVに繋いで、PS4のmicroUSBケーブルを繋ぐと起動した。<br/>
で、推奨と書いてあるRaspbianを選択して、Installを・・・押せない。<br/>
どうも、4GのSDだとぎりぎり足りないらしい。<br/>
そこで、NOOBSからコピーするときに、osディレクトリの中身をRaspbianだけコピーして、他のイメージは入れないようにしたら、無事にインストールできた。<br/>
この状態でSDカードの空きは770MB。<br/>
これからいろいろ遊ぶには心許ない領域である。<br/>
そこで、秋葉に買い物。<br/>
まずは、昔行っていたころとは場所が変わっていた若松通商に行って、<a href="http://www.wakamatsu-net.com/cgibin/biz/page.cgi?cate=3831&page=#38310028">Interface2012年6月号附録FM3マイコン基板周辺取り付け部品セット</a>を探すが見つからず。2Fはやっていなくて、1Fと3Fだけ覗く。<br/>
素人なので何を買って良いか全然わからず。ブレッドボードとジャンパケーブル、安売りしてたテスタだけ買う。<br/>
その後もいろいろ回って。LEDとかリレーとか探したけど、なかなか思い通りのものが見つからず。<br/>
とりあえず安そうな店で64GBのmicroSDカードを2枚と、MacbookPro用って言う少し短いmicroSD→SDの変換アダプタを購入した。(本当はRaspberry pi用のもっと短い奴がほしかったのだけれど、短い奴はケースに干渉するらしい)<br/>
なんか、自分の中では今は電子工作が流行っていて、秋葉に行けば抵抗とかLEDとかリレーとか初心者にもわかりやすく並べてあって、いろいろ買い込んでうはうはー、と言うイメージができあがっていたのだけれど、現実は初心者が入り込めるような店は見つけられなかった。<br/>
うちに帰って、早速新しい64GのmicroSDにNOOBSの中身を焼いて、Raspberry piの電源をon！<br/>
画面が映りません・・・。<br/>
調べてみたところ、大容量のSDXCとかだとFATじゃなくてexFATになるからRaspberry piでbootできない、みたいな記述を発見。(4GでもexFATじゃない？FAT32とexFATって違う？)<br/>
FATでフォーマットする方法がわからなかったので、NOOBSじゃなくて直接ターゲットのOSのイメージを焼くと言う方法を選択してみる。<br/>
Raspbianのimgファイルを持ってきて、Macでddで焼き始めたところ、いくら経っても終わらない。アクティビティモニタで見てみると、100kb/sくらいのスピードで書いてるらしい。<br/>
いつまで待っても終わりそうになかったので、Windowsで書いてみたところ、数分で終わった。MacのSDカードデバイスは駄目なんじゃないか疑惑。<br/>
今度こそこれで起動する〜と思って電源on！<br/>
画面が映りません・・・。<br/>
え〜っと。<br/>
泣きそうになりながら、NOOBSでインストールした4GBのSDカードと、Raspbianのimgを焼いた64GのmicroSDカードをMacで見比べてみる。<br/>
4Gのカードは4つのパーティションがあり、Macで読めるのはBOOTとRECOVERYの二つ。<br/>
64Gのカードは、2つのパーティションがあり、Macで読めるのはbootのみ。<br/>
bootを比較してみると、config.txtと言うファイルに差があるのと、os_config.jsonと言うファイルの有無(4Gの方にはある)<br/>
そこで、4Gのカードのconfig.txtを64Gの方にコピーしてみる。ちなみに差分は
<pre class="textfile">
# NOOBS Auto-generated Settings:
hdmi_force_hotplug=1
config_hdmi_boost=4
overscan_left=24
overscan_right=24
overscan_top=16
overscan_bottom=16
disable_overscan=0
</pre>
と言う部分が最後に追加されてる。画面が出ないと言う症状から見て、hdmi_force_hotplug=1が必要だったのかな？<br/>
これで、無事にRaspbianが起動し、画面が出た。<br/>
初回なので、しばらくごにょごにょやったあと、raspi-configが立ち上がり、LOCALEとかTIMEZONEとか選んで再起動するとインストール完了。<br/>
後は、USBマウスを外して無線LANを繋ぎ、<a href="http://ag.hatenablog.com/entry/2014/01/13/182102">Raspberry Pi 無線 LAN 設定おぼえ書き - Ag Blog</a>の手順に従って/etc/network/interfacesを修正し、/etc/wpa_supplicant/wpa_supplicant.confにSSIDとパスフレーズを入れてあげれば、無事に無線LANも使えるようになった。<br/>
デフォルトでsshdは起動しているので、後はキーボードやHDMIを外してしまっても、ネットワークからsshでログインして使うことができる。<br/>
<br/>
]]></description>
            <link>https://www.wizard-limit.net/mt/pc/archives/005189.html</link>
            <guid>https://www.wizard-limit.net/mt/pc/archives/005189.html</guid>
            
                <category domain="http://www.sixapart.com/ns/types#category">Hardware</category>
            
            
            <pubDate>Sat, 17 May 2014 16:56:31 +0900</pubDate>
        </item>
        
        <item>
            <title>MacBook Proも逝く</title>
            <description><![CDATA[どうも最近呪われているようで、NASに続いてMacBook Proがお亡くなりになった。<br/>
スリープから復帰して使おうとしたら、画面が乱れたかと思うとグレー画面になり、動く気配がないので電源ボタン長押しで落とした後、起動してもAppleマークが消えた後先に進まなくなった。<br/>
この後、以下を試してみたが改善せず。<br/>
<ul>
<li>command + option + p + r(PRAMリセット？最近のmacの場合はPRAMはないらしいが)</li>
<li>shift + control + option(SMCリセット)</li>
<li>shift(セーフブート)<br/>
同じ症状が出た後、長時間待つとブルースクリーンに</li>
<li>command + r(リカバリ)</li>
<li>option(ブート選択)<br/>
選択画面は出るので、リカバリ領域や、外部USB HDD(過去にレスキュー用に作ったもの)を選択してみても起動せず</li>
<li>command + s(シングルユーザ)<br/>
起動するので、そのままfsck -fyすると最後まで行ったが、control + d でシングルユーザモードを抜けると同じ現象発生</li>
</ul>
この辺でお手上げと判断して、Appleの修理を受け付けているクイックガレージに持って行った。<br/>
有線LANから起動する診断ツールを使っていろいろなテストをしてもらったが、原因の特定まで行かず。<br/>
疑わしいのは、非純正のDRAMか、メイン基板で、純正のメモリが残っていたら刺し直せばもう少し特定できるかもとのこと。<br/>
メイン基板の交換の場合は55,000円+税になり、5日くらいかかると言うので、そのまま返してもらい隣の販売店へ。<br/>
2013年秋モデルのMacBook Pro Retina 15インチを、現在と同じスペック(メモリ16G、SSD512G)で購入した。<br/>
うちに帰ると、早速箱を開けて、TimeCapsuleにあるTimeMachineバックアップから移行・・・と思ったらうまくいかない。<br/>
移行ウィザードにTimeCapsuleは認識されるけど、選択すると「バックアップにボリュームがありません」とか言って先に進めない。<br/>
<a href="https://discussionsjapan.apple.com/message/100810704">10.9 Mavericksインストール時TimeMachineから移行できない。 | Apple サポートコミュニティ</a>みたいな記事を見つけたけど、どうも少し違う現象のようで、そもそもTimeCapsule上にあるsparsebundleをマウントしようとすると、エラーが出て成功しない。(メッセージ忘れちゃった)<br/>
この間に、古いmbpのメモリを１枚ずつ抜いて見たりしたが症状は改善せず。いよいよメイン基板っぽい。<br/>
せっかく開けたので、SSDを取り出してUSBで新しいmbpに接続。<br/>
中身は普通に読めたので、TimeMachineからの復旧は諦めてUSB HDDを指定しての移行ウィザード。<br/>
やっぱり何もコピーされない・・・。なんで？<br/>
もう移行ウィザードは捨てて、rsyncでホームディレクトリをコピー。<br/>
後は、App Storeのアプリを再インストールしたり、flash playerやJava VMを入れたりしながらクリーン環境からの復旧を進めていく。<br/>
以前は日本語入力はGoogle日本語入力を使っていたのだけれど、せっかくクリーンな環境になったのだからと言うことでATOKの試用版を入れてみたら、一発で動いた。(以前は、ATOKを入れるとレインボーカーソルで何もできない状態になった)<br/>
さらに、ATOK Passportはベーシックと言う選択肢ができ、月額286円+税らしいので、１ヶ月使ってみて課金するか決めようと思う。<br/>
<br/>
この後、だいたい環境が整ったら、TimeCapsuleは一度ディスクを初期化し、再度TimeMachineの設定をしてフルバックアップ。<br/>
しかし、いざってときに使えないバックアップは意味がないよなあ。]]></description>
            <link>https://www.wizard-limit.net/mt/pc/archives/005188.html</link>
            <guid>https://www.wizard-limit.net/mt/pc/archives/005188.html</guid>
            
                <category domain="http://www.sixapart.com/ns/types#category">Mac</category>
            
            
            <pubDate>Sun, 11 May 2014 05:47:34 +0900</pubDate>
        </item>
        
        <item>
            <title>NASのバックアップをFreeBSDで</title>
            <description><![CDATA[前回の続き。<br/>
お亡くなりになったTeraStationの代わりに購入したLAN DISKと、合わせて買った USB HDDでバックアップが取れないことがわかったので、USB HDDをFreeBSDに繋いでなんとかLAN DISKのバックアップが取れないかと検討した結果、mount_smbfsとrsyncで普通に行けるんじゃないの?と言うことになったのでその記録。<br/>
<br/>
まず、USB HDDをFreeBSDに繋いだら、dmesgでどのように認識されたか見てみる。<br/>
<pre class="commandline">
# dmesg
ugen0.2: &lt;Western Digital&gt; at usbus0
umass1: &lt;Western Digital My Book 1230, class 0/0, rev 3.00/10.50, addr 1> on usbus0
umass1:  SCSI over Bulk-Only; quirks = 0x4001
umass1:5:1:-1: Attached to scbus5
da5 at umass-sim1 bus 1 scbus5 target 0 lun 0
da5: &lt;WD My Book 1230 1050&gt; Fixed Direct Access SCSI-6 device
da5: Serial Number <i>xxxxxxxxxxxxxxxxxxxxxxxxxxxx</i>
da5: 400.000MB/s transfers
da5: 3815415MB (976746240 4096 byte sectors: 255H 63S/T 60799C)
da5: quirks=0x2&lt;NO_6_BYTE&gt;
ses0 at umass-sim1 bus 1 scbus5 target 0 lun 1
ses0: &lt;WD SES Device 1050&gt; Fixed Enclosure Services SCSI-6 device
ses0: Serial Number <i>xxxxxxxxxxxxxxxxxxxxxxxxxxxx</i>
ses0: 400.000MB/s transfers
ses0: SCSI-3 ENC Device
GEOM: da5: the primary GPT table is corrupt or invalid.
GEOM: da5: using the secondary instead -- recovery strongly advised.
</pre>
ここからわかることは、HDDはusb mass storageとしてda5で認識されたこと、ses0とか言う名前でセキュリティデバイスっぽいものが認識されたこと、GEOMがGPTテーブルがおかしいよと報告していることがわかる。<br/>
GPTテーブルがおかしいのは、一度GPTでフォーマットした後にMBRで再フォーマットして、さらにLAN DISKがフォーマットに失敗しているから。<br/>
この状態で、一度GPTの情報を消去して、単一パーティションとしてフォーマットする。(zfsにするかufsにするか迷ったんだけど、zfsはメモリが潤沢なシステム向け、かつディスクの玉がたくさんある環境向け、と読んだ気がするので、ufsにする)
<pre class="commandline">
# gpart show da5
=&gt;        6  976746229  da5  GPT  (3.7T) [CORRUPT]
          6      32768    1  ms-reserved  (128M)
      32774        250       - free -  (1M)
      33024  976712960    2  linux-data  (3.7T)
  976745984        251       - free -  (1M)
# gpart destroy -F da5
da5 destroyed
# gpart create -s GPT da5
da5 created
# gpart show da5
=&gt;        6  976746229  da5  GPT  (3.7T)
          6  976746229       - free -  (3.7T)
# gpart add -t freebsd-ufs da5
da5p1 added
# gpart show da5
=>        6  976746229  da5  GPT  (3.7T)
          6  976746229    1  freebsd-ufs  (3.7T)
# newfs /dev/da5p1
# tunefs -n enable /dev/da5p1
</pre>
ここまででufsのファイルシステムができたので、後は好きなところにマウントする。<br/>
バックアップ用に使うので、/backup2にマウントすることにした。(/backupは既に使っていたので)<br/>
<pre class="commandline">
# mkdir /backup2
# grep backup2 /etc/fstab
/dev/da5p1      /backup2        ufs     rw,noauto       0       0
# mount /backup2
# df -h /backup2
Filesystem              Size    Used   Avail Capacity  Mounted on
/dev/da5p1              3.5T    8.0k    3.2T     0%    /backup2
</pre>
後は、どうにかこの新しい領域にLAN DISKのデータをバックアップすれば良いのである。<br/>
過去に試したのは、主にsmbclientを使った方法で、文字コードの問題でなかなかうまくいかなかった。<br/>
最近の動向はどうなっているのか調べがてら、mount_smbfs のマニュアルをつらつらと眺めていたら、文字コードの変換も-Eオプションとか言うのでなんとか行けそうに見える。<br/>
そこで、
<pre class="commandline">
# mkdir /mnt/disk
# mount_smbfs -E utf-8:cp932 //landisk/disk /mnt/disk
</pre>
みたいにやってみたところ、マウントはできるが日本語のファイル名が化ける。(あ、localeはja_JP.UTF-8)<br/>
なんでだろ〜、と調べてみたところ、<a href="https://www.mail-archive.com/freebsd-users-jp@jp.freebsd.org/msg03919.html">[FreeBSD-users-jp 92712] mount_smbfs で CP932 を UTF-8 として mount できない</a>と言うスレッドを発見。<br/>
これは、RELENG_8だからFreeBSD8の頃の議論なのだけれど、「utf-8→UTF-8のaliasが動作しないのは、・・・」と言う一節を発見。<br/>
<pre class="commandline">
# mount_smbfs -E UTF-8:cp932 //landisk/disk /mnt/disk
</pre>
に変えてみたところ、無事に日本語のファイル名が見られるようになった。<br/>
さらに、いつも困っていたパスワード周りの話も、/etc/nsmb.conf または ~/.nsmb.conf に書けることを発見。<br/>
早速/etc/nsmb.conf に以下を記述。
<pre class="textfile">
[LANDISK:<i>USER</i>]
password=$$1xxxxxxxxxx
charsets=UTF-8:CP932
</pre>
はまりポイントとしては、以下。
<ul>
<li>セクション[LANDISK:USER]は大文字で書く必要がある</li>
<li>password=の値は、smbutilと言うコマンドがあるので、smbutil crypt で生成することができる</li>
<li>mount_smbfs でマウントした場所のファイルのオーナーは、見かけ上マウントしたディレクトリのオーナーになる(上記の例の場合、/mnt/disk のマウント前のオーナーになる)。-u, -g オプションで上書き可能だが、smbfsの特性上サーバ側から見ると「samba maount した人」からのアクセスになるし、クライアントから見ると「samba mount した人に許可された操作」しかできないことになるので、こう言うことになるのだろう。</li>
</ul>
簡単な暗号化をかけるとは言ってもパスワードを書くファイルなので、/etc/nsmb.conf は root のみrwである。<br/>
ここまでくれば、後は普通にrsync で mount_smbfsしたディレクトリから、/backup2にバックアップしてやれば良いことになる。<br/>
家庭内だし、バックアップ目的なのでrootで全部やっても良いかなとは思ったんだけど、なんとなく一般ユーザでやるようにしてみた。(mountだけはrootでやらないといけない)<br/>
これで手動でのバックアップはできるようになったので、後は自動化するスクリプトを書けば良いんだけど、面倒だなあ・・・。]]></description>
            <link>https://www.wizard-limit.net/mt/pc/archives/005185.html</link>
            <guid>https://www.wizard-limit.net/mt/pc/archives/005185.html</guid>
            
                <category domain="http://www.sixapart.com/ns/types#category">FreeBSD</category>
            
            
            <pubDate>Sun, 27 Apr 2014 21:41:40 +0900</pubDate>
        </item>
        
        <item>
            <title>TeraStationの最期</title>
            <description><![CDATA[2006年の8月からずっと使っていた、TeraStationがついに最期を迎えた。<br/>
最初は、HUBのlink ledがつかなくて、TeraStationのLCDにも何かエラーが出ている状態で、その後TeraStationを再起動したら、LCDにはエラーが出ずに起動するんだけど、pingには応答するけどサービス(web/smb)には接続できない状態に。<br/>
今まで2回くらい玉を変えてだましだまし使ってきていたけれど、このへんが潮時だと思われた。<br/>
TeraStationの使用用途は、家庭内用のNASとして、過去の写真、動画、音楽(iTunesのライブラリ)、後は確定申告等のデータなどを置いていた。<br/>
過去の写真などはなくなると困るので、同じメーカーのLinkStationを購入し、週次でバックアップを取っていた。<br/>
TeraStationの復旧を諦めるとして、代替の手段を検討する必要がある。<br/>
<ol>
<li>TeraStationのようなNAS専用機を買う</li>
<li>TimeCapsuleにUSBでHDDを増設して、そこを使う</li>
<li>FreeBSDにHDDを増設して、そこを使う</li>
</ol>
3番目が一番柔軟にできるのだが、FreeBSDが死んだ時の影響が大きくなってしまう。<br/>
そこで、今回も1番目のNAS専用機を購入することに決定。<br/>
ヨドバシを覗いたら、I-O DATAの<a href="http://www.iodata.jp/product/hdd/lanhdd/hdl2-a/">HDL2-A4.0</a>と言うのが安くなっていたので、早速購入。<br/>
自宅に帰ってLANに繋いで起動してみると、起動に3分くらいかかる。これにはびっくり。<br/>
早速バックアップが入っているLinkStationを起動して、データのコピーを始めて見たが、途中で読み出せないファイルがいくつも出てきた。<br/>
どうも、Macから書いたファイルの一部が、読み込みできないらしい。<br/>
LinkStationの場合、ゲストユーザでNASに書き込むと、adminと言うユーザがオーナーになるようなのだが、バックアップ機能でバックアップしたファイルについてはオーナーがrootになるらしい。<br/>
さらに、今回読み出せなかったファイルは、ファイルのパーミッションが rw-rw--w- みたいになっていて、otherの read パーミッションがない状態になっているようだ。(ftpで繋いでlsで確認)<br/>
LinkStationを開けて中のhddを取り出して、ext2が読めるマシンに繋げばサルベージできそうではあったけれど、開けるのが面倒そうなので当面ほっておくことに。<br/>
<br/>
バックアップから新しいNASへのコピーが終わったら、次は新しいバックアップ体制をどうするか決めないといけない。<br/>
良く調べないで安い方を選んだのがいけないのだけれど、BuffaloとI-O DATAではバックアップの考え方(考え方だけじゃなく方式も違うけど)が違うらしく、Buffaloはバックアップのソース側が主体になってバックアップ先にファイルを送るのに対し、I-O DATAはバックアップ先の方が主体になってバックアップ元に取りに行く形式らしい。<br/>
なので、今までどおりメインのNASからLinkStationにバックアップを取ると言うのは不可能になってしまった。<br/>
そこで、LAN DISKにUSBでHDDを繋いで、LAN DISKのバックアップ機能でバックアップすることに。<br/>
ここでも良く調べないで、適当に安そうだったWestern Digitalの<a href="http://www.wdc.com/jp/products/products.aspx?id=870">WDBFJK0040HBK-SESN</a>と言うのを買ってみた。<br/>
が、こいつをLAN DISKに繋いでみてもmountに失敗する。フォーマットにも失敗する。MacやWindowsにつなぐと認識するので、そっちでフォーマットしてみても同じ。(GPT/NTFS/4Tとか、MBR/FAT32/2Tとか試してみたけど駄目)<br/>
これはハズレを引いちゃったかな〜と思いながら、FreeBSDに繋いでufsで4Tフォーマットしてみた。<br/>
TeraStationは、root奪取ができたので、自分でrsync使えるようにしたり、snmpdを入れてみたり、apcupsdを入れてみたりして快適に使えていたんだけど、LAN DISKは今のところそこら辺を試してみれていないので、手軽にFreeBSDに繋いだhddにバックアップする方法が思いつかない。<br/>
<br/>
こんなことなら、案3を採用して、SATAのHDDを2台買った方が良かったな〜とため息しきりなのです。
]]></description>
            <link>https://www.wizard-limit.net/mt/pc/archives/005184.html</link>
            <guid>https://www.wizard-limit.net/mt/pc/archives/005184.html</guid>
            
                <category domain="http://www.sixapart.com/ns/types#category">Hardware</category>
            
            
            <pubDate>Sun, 27 Apr 2014 19:33:00 +0900</pubDate>
        </item>
        
        <item>
            <title>Macでsamba</title>
            <description><![CDATA[会社で仕事をするのに、メインマシンはMacを使っているのだけれど、どうしてもWindowsも使う必要があるので、VMware FusionにWindows 7を入れて使っている。<br/>
vmwareにはホストのディレクトリをゲストからアクセスするためのhgfsと言う仕組みがあるのだが、こいつがいまいち使えないのでMacのファイル共有を有効にして、Windowsからマウントして使っていた。<br/>
が、どうもこの OS X 標準のファイル共有には問題があるらしく、svn checkoutがうまくいかないとか、PowerPointのファイルが開けないとか変な動作をしていた。<br/>
そこで、ファイル共有を捨てて、sambaを使ってみることに。<br/>
参考にしたのは、<a href="http://archives.studiotwain.jp/1909.html">スタジオとぅえいん アーカイブス | Lion/Mountain Lion環境下でSambaを起動するための手順メモ</a><br/>
参考手順だと、netbiosdとsmbdを止めることになっているが、Macの設定でファイル共有をoffにするとsmbdは死んでくれる。netbiosdは生き続けるようだ。<br/>
で、brewからsambaをインストール。本日時点では samba-3.6.20がインストールされた。/usr/local/Celler/samba/3.6.20ディレクトリに入る。<br/>
他のサイトとかを見ていると、古いFormulaだとprivateディレクトリが作られない問題があったらしいが、現時点のものだとprivateディレクトリは作成された。<br/>
/usr/local/Celler/samba/3.6.20/etc/smb.confも作成されるようだが、中身は空だった。<br/>
そこで、/Library/Caches/Homebrew/samba-3.6.20.tar.gz を展開し、中からexamples/smb.conf.default を取り出して/usr/local/Celler/samba/3.6.20/etc/smb.confにコピー。<br/>
smb.confの中身を適宜修正。
<ul>
<li>workgroupを適当に修正</li>
<li>server stringを適当に修正</li>
<li>load printers を no に修正(プリンタは別で共有していたので)</li>
<li>[global]セクションに以下を追加
<pre class="textfile">
unix charset = UTF-8-MAC
</pre></li>
<li>[printers]セクションを全部コメントアウト</li>
</ul>
気になったのは、log file のところで /usr/local/samba/var を指定していたこと。brewでインストールすると /usr/local/samba ディレクトリは存在しない。<br/>
ここを/usr/local/Celler...に修正しても良いのだが、将来バージョンが変わった時のことを考えて、/usr/local/Celler/samba/3.6.20 から /usr/local/samba にシンボリックリンクを張った。<br/>
この状態で、手でnmbdとsmbdを起動してみる。<br/>
<pre class="commandline">
# /usr/local/sbin/nmbd -D
# /usr/local/sbin/smbd -D
</pre>
で、psコマンドで見てみるとsmbdはいるがnmbdがいない。/usr/local/Celler/samba/3.6.20/var/log.nmbdを見ると、
<pre class="textfile">
[2014/01/10 14:18:52,  0] nmbd/nmbd.c:861(main)
  nmbd version 3.6.20 started.
  Copyright Andrew Tridgell and the Samba Team 1992-2011
[2014/01/10 14:18:52,  0] lib/util_sock.c:667(open_socket_in)
  bind failed on port 137 socket_addr = 0.0.0.0.
  Error = Address already in use
</pre>
とか出てる。ポート137がLISTENできないらしい。<br/>
おそらく、nmbdの役目をnetbiosdがやっているのだろう。<br/>
参考サイトの手順通りにnetbiosdを止めても良かったのだが、ここはnetbiosdにまかせてみることにする。<br/>
後は、smbpasswd -a でアクセスしたいユーザを追加し、パスワードを設定してやると、無事にWindowsからアクセスできた。<br/>
特に文字コード系の設定はsmb.confには入っていないのだが、日本語のファイル名もちゃんと見えている。「が」みたいなMac特有のNFD/NFCの問題も大丈夫そうだ。(実は、最初unix charset=UTF-8-MACを書かなかったら、見た目は問題なかったがブリーフケースによるファイルの同期で問題があった)<br/>
後は、OSの起動時に起動して欲しいので、参考サイトに従ってsmbd用のplistファイルを作成し、一度smbdを殺した後、launchctl load でlaunchdから起動できるようにした。<br/>
一応plistファイルとコマンドラインを転載しておく。<br/>
<b>org.samba.smbd.plist</b><br/>
<script src="https://gist.github.com/false-git/8347736.js"></script>
<br/>
上記ファイルを /Library/LaunchDaemons/に置き、
<pre class="commandline">
# launchctl load -w /Library/LaunchDaemons/org.samba.smbd.plist
</pre>
で有効化。<br/>
参考サイトだと、smbdの起動オプションが-Dになっていたけど、それだとlaunchdがsambaが死んだと思って10秒置きに再起動してくれる。<br/>
<pre class="textfile">
2014/01/10 16:29:55.831 com.apple.launchd[1]: (org.samba.smbd) Throttling respawn: Will start in 10 seconds
</pre>
んで、samba側は死んでいないので、ERROR: smbd is already running. とか言い続ける。<br/>
-Dオプションの代わりに、-Fオプションを使うようにすれば、launchdに死んだと誤解されないようになった。<br/>
さらにlog.smbdを見ていると、以下のログが出ている。
<pre class="textfile">
[2014/01/10 18:41:25,  0] smbd/server.c:1072(main)
  smbd version 3.6.20 started.
  Copyright Andrew Tridgell and the Samba Team 1992-2011
[2014/01/10 18:41:25.999537,  0] smbd/server.c:1128(main)
  standard input is not a socket, assuming -D option
[2014/01/10 18:41:26.005124,  0] lib/util.c:1723(set_maxfiles)
  set_maxfiles: setrlimit for RLIMIT_NOFILE for 16404 files failed with error Invalid argument
</pre>
最初の standard input is not a socket, assuming -D option の方は、launchdが標準入力を与えてくれないせいだと思うので、ほっておいて良いと思われる。<br/>
次の、set_maxfilesの方は、一度に開けるファイルの上限を16404にしようとして失敗したよ？というもので、実際にWindowsで大量のファイルをコピーしようとしたら失敗した。<br/>
調べてみると、<a href="http://miff.blog.so-net.ne.jp/2013-06-23-1">MacでHomeBrewのSambaは使えました（ちょっと面倒）。：毎回サブタイトル考えるの面倒いなぁ：So-net blog</a>と言うページがヒット。<br/>
ここから(とか他のところを見て)わかったことは、
<ul>
<li>smb.confにmax open filesと言うパラメータがあるが、16404より小さくできないこと。</li>
<li>macの場合、setrlimitでRLIMIT_NOFILEに設定できる値の上限はkern.maxfilesperprocになっていること</li>
</ul>
そして、実際に試してみてわかったことは、kern.maxfilesperprocはkern.maxfilesに依存していること。(これは、ulimit -nが失敗するかどうかで判断したので、本当はmaxfilesの方は不要かもしれない)<br/>
と、言うわけで、以下を実行してからsmbdを再起動したら、このメッセージは出なくなった。
<pre class="commandline">
sysctl -w kern.maxfiles=16404
sysctl -w kern.maxfilesperproc=16404
</pre>
sysctl -w で設定した内容は、再起動したら消えてしまうので、/etc/sysctl.confに以下を書いておいた。(Macの場合、デフォルトではこのファイルは存在していないが、あれば読んでくれるらしい。試してないけど)
<pre class="textfile">
kern.maxfiles=16404
kern.maxfilesperproc=16404
</pre>
<br/>
しっかし、この16404って言う数字、Windows 7から来てるらしいけど、なんでそんなに大きくしたかねえ。(ちなみに、macのデフォルトは12288/10240だった。)]]></description>
            <link>https://www.wizard-limit.net/mt/pc/archives/005140.html</link>
            <guid>https://www.wizard-limit.net/mt/pc/archives/005140.html</guid>
            
                <category domain="http://www.sixapart.com/ns/types#category">Mac</category>
            
            
            <pubDate>Fri, 10 Jan 2014 15:00:08 +0900</pubDate>
        </item>
        
        <item>
            <title>asteriskの導入 (3)</title>
            <description><![CDATA[サーバが新しくなってから放置状態だったasteriskを復活させてみる。以前のエントリは<a href="http://www.wizard-limit.net/mt/pc/archives/003422.html">asteriskの導入 (1) - PC日記</a>。<br/>
まずは、portsからnet/asteriskをインストール。現在のバージョンは1.8系になっている。(ちなみに、最新版はasterisk11系らしい)<br/>
configのオプションはSPANDSPを追加(後でfax系をやるため)<br/>
インストールが終わったら、続いてjapanese/asterisk-soundsをインストール。<br/>
<pre class="commandline">
=============================================================================
[FYI]

 To get natural word order in Japanese sentences
 you can patch to /usr/ports/net/asterisk and reinstall it as below.

 For example,
 1. Download app_voicemail.c.yymmdd-01.patch and say.c.yymmdd-01.patch from
    ftp://ftp.voip-info.jp/asterisk/patch/1.8.X.Y/
    where 1.8.X.Y is corresponding to PORTVERSION in
    /usr/ports/net/asterisk/Makefile.
 2. Put them to /usr/ports/net/asterisk/files as
    patch-apps::app_voicemail.c and patch-main::say.c, respectively.
 3. Reinstall /usr/ports/net/asterisk.
 4. Add the following options section to
    /usr/local/etc/asterisk/asterisk.conf.

     [options]
     languageprefix=yes

=============================================================================
</pre>
インストールされたのは1.8.25.0だが、ftp://ftp.voip-info.jp/asterisk/patch/ には 1.8.20.1までしかない。しかし、1.8系はすべて1.8.0へのシンボリックリンクのようなので、1.8.0から2つのファイルを持って来る。<br/>
このとき、何故かfetchコマンド等だとtimeoutで失敗するので、ブラウザで表示させてファイルに保存した。<br/>
これを指示通りにリネームして/usr/ports/net/asterisk/filesに置き、asteriskを再インストール。<br/>
昔の環境から設定ファイルをコピーしてきて起動したところ、エラーが出てうまく動かない。<br/>
ぷちぷち潰したので、違いについて記述していく。<br/>
<br/>
<b>asterisk.conf</b><br/>
asterisk-soundsの指示に従ってlanguageprefix = yes を有効に。(何故昔のが無効だったのか謎)<br/>
live_dangerously = no を有効化。(<a href="https://wiki.asterisk.org/wiki/display/AST/Privilege+Escalations+with+Dialplan+Functions">Privilege Escalations with Dialplan Functions - Asterisk Project - Asterisk Project Wiki</a>には、asterisk12からはデフォルトがnoって書いてあるけど、コメントをはずさないと文句を言われた)<br/>
<b>sip.conf</b><br/>
language=jpをjaに変更。<br/>
username=の行を全てdefaultuser=に変更<br/>
insecure=veryの行をinsecure=invite,portに変更。これをやらないと、ひかり電話の着信でasteriskが応答しない。(<a href="http://forums.digium.com/viewtopic.php?p=70908">Asterisk Forums • View topic - insecure=very Unknown insecure mode 'very'</a>)<br/>
<b>modules.conf</b><br/>
エラーではないのだが、起動時にログにずらずらとWARNINGが出るので、未使用のモジュールの内警告が出るものをnoload指定
<pre class="textfile">
noload => pbx_ael.so
noload => chan_dahdi.so
noload => codec_dahdi.so
noload => res_config_sqlite.so
noload => res_smdi.so
noload => cel_tds.so
noload => cel_custom.so
noload => cel_pgsql.so
noload => cdr_sqlite.so
noload => cdr_radius.so
noload => chan_skinny.so
noload => chan_unistim.so
</pre>
<b>cdr_pgsql.conf</b><br/>
Encoding not specified.とか言われたので、encoding=UTF-8を追加。<br/>
<br/>
ここまでで、以前と同じように使えるようになった。以前はSIPクライアントにWindowsのExpress Talkを使っていたのだが、今はMacなのでLinphoneと言うアプリを入れてみた。(設定がわかりにくい)<br/>
続いて、voicemail機能を使ってみようと思いたち、voicemail.confを眺める。<br/>
こちらは、前回の記事で内容を晒していないので、有効な行だけ掲載する。
<pre class="textfile">
[general]
format=wav49
serveremail=asterisk@wizard-limit.net
attach=yes
skipms=3000
maxsilence=10
silencethreshold=128
maxlogins=3
emaildateformat=%Y/%m/%d(%a) %H:%M:%S
sendvoicemail=yes
[zonemessages]
eastern=America/New_York|'vm-received' Q 'digits/at' IMp
central=America/Chicago|'vm-received' Q 'digits/at' IMp
central24=America/Chicago|'vm-received' q 'digits/at' H N 'hours'
military=Zulu|'vm-received' q 'digits/at' H N 'hours' 'phonetic/z_p'
european=Europe/Copenhagen|'vm-received' a d b 'digits/at' HM
japan=Asia/Tokyo|Q PHM 'jp-ni' 'vm-received'
[default]
1234 => <i>password</i>,mailbox,<i>to address</i>,,tz=japan
</pre>
注意点は以下。
<ul>
<li>serveremailは、デフォルトのasteriskだけだと、正しいホスト名がつかなかったので、ドメインまで含めるようにした。</li>
<li>emaildateformatは、メールに含まれる日時のフォーマットが気に入らなかったので修正した</li>
<li>zonemessagesのjapan=の後は、<a href="http://www.voip-info.jp/index.php/Asterisk_%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB%E8%A8%AD%E5%AE%9A%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB_voicemail.conf">Asterisk サンプル設定ファイル voicemail.conf - VOIP-Info.jp Wiki</a>の通りにJapanだとタイムゾーンが正しくならない。/usr/share/zoneinfoにあるものでないといけないらしいので、FreeBSDの場合はAsia/Tokyoとする</li>
<li>defaultの1234はメールボックス名。変えても良いが、数字でないといけないらしい。/var/spool/asterisk/voicemail/default/にディレクトリが存在する必要があるので、面倒だからデフォルトのまま1234とした</li>
</ul>
後は、extensions.confでVoicemail()アプリを呼んであげれば良いのだが、voip-info.jpのサンプルだと内線毎のメールボックスなので、外線着信で使えるように以下のようにした。
<pre class="textfile">
exten => 200,1,Dial(SIP/201&SIP/202&SIP/203&SIP/204,30,tT)
exten => 200,n,NoOp(${DIALSTATUS})
exten => 200,n,GotoIf($["${DIALSTATUS}"!="CHANUNAVAIL"]?vm-rec)
exten => 200,n,Ringing()
exten => 200,n,Wait(30)
exten => 200,n(vm-rec),Answer()
exten => 200,n,Wait(1)
exten => 200,n,Voicemail(1234)
exten => 200,n,Hangup
</pre>
200は、ひかり電話の外線が着信したときに呼び出されるextenで、最初の行で201〜204を30秒間呼び出す。この間にひかり電話の子機を含むどれかの端末が応答すればそれで終わり。<br/>
30秒間誰も応答しなかった場合は、次の行のNoOpが実行されるが、これはログにDIALSTATUSを出すためだけで、何もしない。<br/>
次のGotoIfで、DIALSTATUSがCHANUNAVAIL以外のときは、vm_recの行に飛ぶ。<br/>
これは、MacのLinphoneが起動していないときなど、SIPクライアントが一つもいないときは、30秒呼び出す前にCHANUNAVAILでDialが終了してしまうため、ひかり電話の子機が電話に出られないのを防ぐため。<br/>
CHANUNAVAILのときは、Ringing()で相手に着信を知らせ、次の行のWait(30)で30秒待つ。(Ringing()がないと、Wait()が異常終了してしまう)<br/>
それでも誰も電話に出ない時は、Answer()で着信する。<br/>
Wait(1)で1秒待つ。<br/>
Voicemail(1234)で、voicemail.confで設定したメールボックス1234に録音される。<br/>
これだと、例えばSIPの子機が一台だけで、それが内線通話中のときにもWait(30)に行かずにいきなりAnswer()に行ってしまうので、もう少し調整が必要かもしれない。<br/>
とりあえずこの設定で、asteriskのvoicemailが留守電として機能し、録音されると指定した宛先にメールが飛ぶ。<br/>
私の場合はiPhoneに届くようにしているので、iPhoneのメールアプリから添付ファイルをタッチすればそのまま録音内容を聞くことができる。iPhone自体の留守電は、ソフトバンクの「留守番電話プラス」を契約していないので、いちいち留守番電話センターに電話しないと聞けないのと比べると非常に良い。<br/>
<br/>
voip-info.jpのサンプルだと、録音がある状態で内線から298にかけるとVoicemailMain()が呼ばれるので、ガイダンスに従ってメールボックス番号とパスワードを入れると、録音を聞くことができる。<br/>
しかし、ひかり電話の子機からは操作できないし、いちいちガイダンスを聞きながら操作をするのもだるいので、webインターフェイスを使うことにする。参考にしたのは<a href="http://www.aconus.com/~oyaji/centos/asterisk_centos4.2_2.htm">AsteriskによるIP-PBXの構築(CentOS4.2編)</a><br/>
portsから入れた場合、vmail.cgiはどこにもインストールされないので、ソースから持って来る必要がある。/usr/port/net/asteriskでmakeした後、cleanしなければworkの下にソースが残っているので、そこから必要なファイルを取り出すことにする。<br/>
まずは、cgiを入れる先を決める必要がある。私の場合は、過去のしがらみ等の関係で /var/www/docs/lan/asteriskとした。以下の説明はそのつもりで読んで欲しい。
<pre class="commandline">
# mkdir /var/www/docs/lan/asterisk
# cd /usr/ports/net/asterisk/work/asterisk-1.8.25.0
# cp contrib/scripts/vmail.cgi /var/www/docs/lan/asterisk/
# cp images/*.gif /var/www/docs/lan/asterisk/
</pre>
次に、vmail.cgiを編集する。<br/>
<script src="https://gist.github.com/false-git/8330415.js"></script>
<br/>
変更点は、以下。
<ul>
<li>設定ファイル系が、/etc/asteriskになっているので、/usr/local/etc/asteriskに変更</li>
<li>日時が、UTCで送られてしまうので、Asia/Tokyoのタイムゾーンで、かつ日本人に馴染みのあるフォーマットで表示するようにしてみた</li>
</ul>
後は、apacheの設定でvmail.cgiをブラウザからアクセスできるようにすれば良いのだが、メールボックス名、パスワード共に電話で入力できるように数字なので、プライバシーを大事にしたい場合は別の方法で認証するようにすると良い。私の場合は、httpsのクライアント証明書がないとアクセスできないページに配置した。<br/>
ここまでで、録音の一覧の参照と再生ができるようになる。<br/>
始めて再生するときは、コーデックを選択する画面が出るが、GSM Compressed WAV を選べば voicemail.confで指定した wav49 を指定したことになる。<br/>
Macのfirefoxだとこれで再生できたが、iPhoneのSafariだと再生できなかった。<br/>
<br/>
ここまでだと、削除ができないので、なんとかする必要がある。<br/>
voicemailの録音データは/var/spool/asterisk/voicemail/default/1234/INBOXにある(新規の録音の場合)<br/>
このディレクトリは、asteriskユーザしか書き込みができないので、cgiを動かすユーザが書き込みできるようにしてやる必要がある。<br/>
<ol>
<li>cgiを動かすユーザ(FreeBSD/apacheの場合はwww)を、/etc/groupでasteriskグループに追加する</li>
<li>メールボックスディレクトリを、グループ権限で書けるようにする
<pre class="commandline">
# cd /var/spool/asterisk/voicemail/default/1234
# chmod g+ws INBOX
</pre>
※ setgidしているのは、BSDのファイルシステムではディレクトリにsetgidすると中に作られるファイルのグループがディレクトリと一致するようになるため。別に不要だが。<br/>
※ 中の録音データは、0644だが、ディレクトリに書き込み権があれば削除、移動はできる。<br/>
※ vmail.cgiでは、削除だけでなくフォルダの移動もできるので、この機能を使いたい場合はINBOX以外のフォルダも用意し、chmod g+wsする必要がある</li>
</ol>
次回は、iaxmodem + hylafaxでfax関連をやってみようと思う。<br/>
# どうせ、電話もFAXも全然使わないんだけどさ。
]]></description>
            <link>https://www.wizard-limit.net/mt/pc/archives/005139.html</link>
            <guid>https://www.wizard-limit.net/mt/pc/archives/005139.html</guid>
            
                <category domain="http://www.sixapart.com/ns/types#category">FreeBSD</category>
            
            
            <pubDate>Thu, 09 Jan 2014 14:59:30 +0900</pubDate>
        </item>
        
        <item>
            <title>FreeBSDで日本語マニュアル</title>
            <description><![CDATA[FreeBSDで日本語のマニュアルを読むには、ports/japanese/man でインストールされるjmanを使う。<br/>
のだが、そろそろ jman が使っている groff が古い(FreeBSD9に入っている英語のマニュアルが正しく清書できない)とか、UTF-8 の環境だと使いにくい(LANG=ja_JP.eucJP jman する必要がある)とか問題があるので、別の手段を検討する。<br/>
参考にしたのは、<a href="http://d.hatena.ne.jp/akira_you/20120316/p1">FreeBSD 9.0RELASEで日本語manを使う - akira_youの私見</a><br/>
当初、/usr/doc/ja_JP.eucJP/man/Makefile.inc を書き換えて、/usr/share/man/ja_JP.UTF-8 にutf-8のマニュアルソースを入れたりしてみたのだが、それだと ports/japanese/* 等でインストールされる /usr/local/man/ja が見られないので、結局マニュアルソースは今まで通り euc-jpでインストールして、manコマンドでのフォーマット時に utf-8 に変換することにした。<br/>
以下、試行錯誤の末の最終手順。<br/>
<br/>
<ol>
<li>ports/japanese/nkf をインストールする</li>
<li>ports/textpfoc/groff をインストールする<br/>
このとき、ports/textproc/groff/Makefileを修正して、依存関係の ghostscript8をghostscript9にしておく</li>
<li>日本語のマニュアルページをインストールする。<br/>
ports/japanese/man-doc をインストールしても良いし、/usr/doc/ja_JP.eucJP/man でmake installしても良い</li>
<li>man/ja から man/ja_JP.UTF-8 にシンボリックリンクを張る
<pre class="commandline">
# ln -s /usr/share/man/ja /usr/share/man/ja_JP.UTF-8
# ln -s /usr/local/man/ja /usr/local/man/ja_JP.UTF-8
</pre></li>
<li>/usr/bin/man を /usr/local/bin/man にコピーする</li>
<li>/usr/local/bin/man を編集する<br/>
<script src="https://gist.github.com/false-git/8293307.js"></script>
</li>
</ol>
PAGERは私の場合はlvを使っているが、jmanが入れるjlessでも良いと思う。<br/>
これで、/usr/local/bin/man を使えば日本語のマニュアルも見られるようになる。<br/>
日本語のマニュアルは内容が古かったりするので、そう言う時は man -oを使えば英語のマニュアルが読める。<br/>
]]></description>
            <link>https://www.wizard-limit.net/mt/pc/archives/005138.html</link>
            <guid>https://www.wizard-limit.net/mt/pc/archives/005138.html</guid>
            
                <category domain="http://www.sixapart.com/ns/types#category">FreeBSD</category>
            
            
            <pubDate>Tue, 07 Jan 2014 10:24:23 +0900</pubDate>
        </item>
        
    </channel>
</rss>
