tag:blogger.com,1999:blog-376375352024-03-14T05:38:48.485+09:00親知らずの日記mikoto2000http://www.blogger.com/profile/08084647632974947669noreply@blogger.comBlogger167125tag:blogger.com,1999:blog-37637535.post-36442900864689235392017-03-17T02:53:00.000+09:002017-03-17T02:53:42.623+09:00Windows 環境で Gradle 3.4.1 を使う<nav id="TOC">
<ul>
<li><a href="#環境構築">環境構築</a><ul>
<li><a href="#バイナリの入手">バイナリの入手</a></li>
<li><a href="#展開してパスを通す">展開してパスを通す</a></li>
<li><a href="#動作確認">動作確認</a></li>
<li><a href="#設定ファイル作成">設定ファイル作成</a></li>
</ul></li>
</ul>
</nav>
<p>ギョームで Java を使うことになったので、 Gradle の復習をしていく。</p>
<h1 id="環境構築">環境構築</h1>
<p>Chocolatey なんて使わせてもらえないから手動構築を行う。 手順は <a href="https://gradle.org/install#manually">Gradle | Installation</a> 参照。</p>
<h3 id="バイナリの入手">バイナリの入手</h3>
<p>Binary-Only のリンクからファイルをダウンロード。 (2017/3/16 時点では、<code>gradle-3.4.1-bin.zip</code> がダウンロードされる)</p>
<h3 id="展開してパスを通す">展開してパスを通す</h3>
<ol type="1">
<li><code>%USERPROFILE%\develop\</code> ディレクトリを作成</li>
<li>「1.」で作成したディレクトリで <code>gradle-3.4.1-bin.zip</code> を展開し、できたディレクトリを <code>gradle-3.4.1</code> にリネーム
<ul>
<li><code>%USERPROFILE%\develop\gradle-3.4.1</code> というディレクトリができる</li>
</ul></li>
<li><code>%USERPROFILE%\develop\gradle-3.4.1\bin</code> にパスを通す</li>
<li>環境変数 <code>JAVA_HOME</code> を設定する</li>
</ol>
<h3 id="動作確認">動作確認</h3>
<pre class="bat"><code>> cd %USERPROFILE%\project\
> mkdir GradleTest
> cd GradleTest
> gradle init --type java-application</code></pre>
<p>これでプロジェクトのひな型ができたので、早速ビルドする。</p>
<pre class="bat"><code>> gradlew.bat build</code></pre>
<p>本来は <code>gradlew.bat</code> を使う必要はない(すでに環境構築してあるホストだから)けど、配布された側になったつもりで <code>gradlew.bat</code> を使う。</p>
<p>gradle や、依存ライブラリをダウンロードしたうえでビルドしてくれる。</p>
<pre class="bat"><code>>gradlew.bat run
:compileJava UP-TO-DATE
:processResources NO-SOURCE
:classes UP-TO-DATE
:run
Hello world.</code></pre>
<p>大丈夫そう。</p>
<h3 id="設定ファイル作成">設定ファイル作成</h3>
<ul>
<li>eclipse で実装</li>
<li>JUnit でテスト</li>
<li>findbugs 使う(html レポート)</li>
<li>jacoco 使う(html レポート)</li>
<li>checkstyle 使う(html レポート)</li>
<li>build するだけで findbugs, jacoco, checkstyle のレポートを出力する</li>
<li>lombok 使う</li>
<li>args4j 使う</li>
</ul>
<p>あたりの設定を追加。</p>
<pre class="gradle"><code>/*
* This build file was generated by the Gradle 'init' task.
*
* This generated file contains a sample Java project to get you started.
* For more details take a look at the Java Quickstart chapter in the Gradle
* user guide available at https://docs.gradle.org/3.4.1/userguide/tutorial_java_projects.html
*/
// Apply the java plugin to add support for Java
apply plugin: 'java'
// Apply the application plugin to add support for building an application
apply plugin: 'application'
apply {
plugin 'eclipse'
plugin 'checkstyle'
plugin 'findbugs'
plugin 'jacoco'
}
sourceCompatibility = 1.8
targetCompatibility = 1.8
version = 1.0
[compileJava, compileTestJava]*.options*.encoding = "UTF-8"
// In this section you declare where to find the dependencies of your project
repositories {
// Use jcenter for resolving your dependencies.
// You can declare any Maven/Ivy/file repository here.
jcenter()
}
[checkstyleMain, checkstyleTest, findbugsMain, findbugsTest]*.ignoreFailures = true
configurations {
provided
}
sourceSets {
main {
compileClasspath += configurations.provided
}
}
eclipse.classpath {
plusConfigurations += [ configurations.provided ]
minusConfigurations += [ configurations.provided ]
}
dependencies {
// This dependency is found on compile classpath of this component and consumers.
compile 'com.google.guava:guava:20.0'
// Use JUnit test framework
testCompile 'junit:junit:4.12'
testCompile "org.hamcrest:hamcrest-all:1.3"
compile 'args4j:args4j:2.0.16'
provided 'org.projectlombok:lombok:1.16.4'
}
// Define the main class for the application
mainClassName = 'App'
test {
doLast {
tasks.jacocoTestReport.execute()
}
}
jacocoTestReport {
reports {
xml.enabled = false
html.enabled = true
html.destination = "${buildDir}/reports/jacoco"
}
}
tasks.withType(FindBugs) {
reports {
xml.enabled = false
html.enabled = true
}
}
tasks.withType(Checkstyle) {
reports {
xml.enabled false
html.enabled true
html.destination = "${buildDir}/reports/checkstyle/checkstyle.html"
}
}
jar {
manifest {
attributes 'Implementation-Title': 'Test App.'
attributes 'Implementation-Version': 1.0
attributes "Main-Class" : "App"
}
from configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }
}</code></pre>
<p>動くか試す。</p>
<pre class="cmd"><code>> gradlew.bat build</code></pre>
<p>うん、一通りレポート出力されているっぽい。</p>
<p>とりあえずこんなものでいいか。</p>
mikoto2000http://www.blogger.com/profile/08084647632974947669noreply@blogger.com0tag:blogger.com,1999:blog-37637535.post-45741599664236829582017-03-09T03:32:00.001+09:002017-03-09T03:32:12.875+09:00YukiTask を MSYS2 on Windows 環境で試した<nav id="TOC">
<ul>
<li><a href="#前提環境">前提環境</a></li>
<li><a href="#作業ログ">作業ログ</a></li>
<li><a href="#感想">感想</a></li>
<li><a href="#参考資料">参考資料</a></li>
</ul>
</nav>
<p><a href="http://yukitask.textfile.org/">結城タスク / YukiTask - A Simple Task Manager for Command Line Lovers.</a> が気になったので、 Windows で使えないか試行錯誤してみた。その作業記録。</p>
<h1 id="前提環境">前提環境</h1>
<ul>
<li>OS : Windows 10 Pro 64bit</li>
<li>MSYS2 環境インストール済み
<ul>
<li><code>/etc/fstab</code> に <code>/C/Users/mikoto</code> を指定しているので、「Windows のホームディレクトリ == MSYS2 環境のホームディレクトリ」になっている状態</li>
</ul></li>
<li><a href="https://rubyinstaller.org/">RubyInstaller for Windows</a> の 2.3.3 をインストール済みなので、これを使用する</li>
</ul>
<h1 id="作業ログ">作業ログ</h1>
<p><a href="http://yukitask.textfile.org/setup.html">Setup YukiTask</a> を参照しながらセットアップ。 (今回はお試しなので、 <code>.bashrc</code> に追記しないで試している。)</p>
<div class="sourceCode"><pre class="sourceCode sh"><code class="sourceCode bash">$ <span class="bu">cd</span> ~project
$ <span class="fu">wget</span> https://github.com/hyuki0000/yukitask/archive/master.zip
$ <span class="fu">unzip</span> master.zip
$ <span class="bu">cd</span> yukitask-master
$ <span class="fu">mv</span> yukitask/ ~
$ <span class="bu">export</span> <span class="va">EDITOR=</span>~/app/vim80-kaoriya-win64/gvim.exe
$ <span class="bu">export</span> <span class="va">PATH=</span>~/yukitask:<span class="va">$PATH</span>
$ <span class="bu">export</span> <span class="va">PATH=$PATH</span>:/C/Ruby23-x64/bin/
$ <span class="bu">source</span> ~/yukitask/command_aliases
$ <span class="bu">source</span> ~/yukitask/here_aliases</code></pre></div>
<p>導入はできたはずなので <a href="http://yukitask.textfile.org/todo.html">YukiTask TODO management</a> を試してみる。</p>
<div class="sourceCode"><pre class="sourceCode sh"><code class="sourceCode bash">$ <span class="fu">mkdir</span> ~/project/yukitask_practice
$ <span class="bu">cd</span> ~/project/yukitask_practice
$ <span class="ex">here</span> yukitask_practice
<span class="st">'pbcopy'</span> は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。
<span class="ex">~/yukitask/here_aliases</span> is updated.
<span class="bu">alias</span> yukitask_practice=<span class="st">'pushd C:/Users/mikoto/project/yukitask_practice; show_todo'</span>
<span class="ex">Execute</span> Command+V on the command line to update aliases.</code></pre></div>
<p><code>pbcopy</code> がないのか...。 <code>pbcopy</code> の代替設定を行って再挑戦。</p>
<div class="sourceCode"><pre class="sourceCode sh"><code class="sourceCode bash">$ <span class="kw">function</span><span class="fu"> pbcopy()</span> <span class="kw">{</span>
<span class="op">></span> <span class="bu">echo</span> <span class="va">$*</span> <span class="op">></span> /dev/clipboard
<span class="op">></span> <span class="kw">}</span>
$ <span class="bu">cd</span> ~/project/yukitask_practice
$ <span class="ex">here</span> yukitask_practice
<span class="st">'pbcopy'</span> は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。
<span class="ex">~/yukitask/here_aliases</span> is updated.
<span class="bu">alias</span> yukitask_practice=<span class="st">'pushd C:/Users/mikoto/project/yukitask_practice; show_todo'</span>
<span class="ex">Execute</span> Command+V on the command line to update aliases.</code></pre></div>
<p>あー...。 <code>~/yukitask/here</code> が Ruby スクリプトで、 <code>system()</code> でコマンド実行しているから <code>functioin</code> で関数定義するだけじゃ無理なのか。</p>
<p>処理内容を見る限り、ペーストでの <code>~/yukitask/here_aliases</code> の再読み込みができないだけで <code>~/yukitask/here_aliases</code> の更新自体はされているようなので保留とする。</p>
<p>更新時は <code>source ~/yukitask/here_aliases</code> を自力で打つ感じで。</p>
<p>ということで続きをやってみる。</p>
<div class="sourceCode"><pre class="sourceCode sh"><code class="sourceCode bash">$ <span class="bu">cd</span>
$ <span class="ex">yukitask_practice</span>
<span class="ex">~/project/yukitask_practice</span> ~
<span class="ex">bash</span>: /home/mikoto/yukitask/show_todo: /usr/bin/ruby: 誤ったインタプリタです: No such file or directory</code></pre></div>
<p>oh...。<code>~/yukitask/show_todo</code> の shebang が <code>/usr/bin/ruby</code> になっているから ruby が見つからない。 <code>#!/usr/bin/ruby</code> を <code>#!/usr/bin/env ruby</code> に書き換えて実行。</p>
<p>あ、あと、関係ないけど移動は <code>pushd</code> でやっているのね。</p>
<div class="sourceCode"><pre class="sourceCode sh"><code class="sourceCode bash">$ <span class="bu">cd</span>
$ <span class="ex">yukitask_practice</span>
<span class="ex">~/project/yukitask_practice</span> ~
<span class="ex">cat</span>: <span class="st">'$HOME/yukitask/TODO'</span>: No such file or directory</code></pre></div>
<p>えーと、今度は、ホームディレクトリを表すのに <code>$HOME</code> を使用しているから、 Windows ネイティブのの Ruby からだと環境変数が見えないのか。</p>
<p><code>$HOME</code> を <code>~</code> に修正して試してみる。</p>
<div class="sourceCode"><pre class="sourceCode sh"><code class="sourceCode bash">$ <span class="ex">yukitask_practice</span>
<span class="ex">~/project/yukitask_practice</span> ~
<span class="ex">This</span> is your global TODO file.
<span class="ex">Use</span> <span class="st">'TT'</span> command to edit this file.</code></pre></div>
<p>ok。 続きを実施。</p>
<div class="sourceCode"><pre class="sourceCode sh"><code class="sourceCode bash">$ <span class="ex">T</span> <span class="co"># TODO 修正</span>
$ <span class="bu">cd</span>
$ <span class="ex">yukitask_practice</span>
<span class="ex">~/project/yukitask_practice</span> ~ ~
<span class="ex">This</span> is your global TODO file.
<span class="ex">Use</span> <span class="st">'TT'</span> command to edit this file.
<span class="ex">yukitask_practice</span><span class="st">'s TODO</span></code></pre></div>
<p>ちゃんと動いているっぽい。</p>
<p>続いて <a href="http://yukitask.textfile.org/make.html">YukiTask Make</a> を試す。 さっき使ったプロジェクトをそのまま流用。</p>
<div class="sourceCode"><pre class="sourceCode sh"><code class="sourceCode bash">$ <span class="bu">cd</span> ~/project/yukitask_practice
$ <span class="fu">cp</span> ~/yukitask/makefile.default makefile
$ <span class="ex">m</span> <span class="co"># エディタで makefile が開かれる</span>
$ <span class="ex">mk</span>
<span class="ex">You</span> are executing <span class="st">'mk'</span> command. Please edit your <span class="st">'makefile'</span>.</code></pre></div>
<p>こちらも大丈夫そう。</p>
<p>ちゃちゃっと試していきましょう。 次は <a href="http://yukitask.textfile.org/graph.html">YukiTask Graph</a>。</p>
<div class="sourceCode"><pre class="sourceCode sh"><code class="sourceCode bash">$ <span class="ex">start</span> ~/yukitask/graph-recent.html <span class="co"># 空白のページが表示された</span></code></pre></div>
<p>あれー??? <code>~/yukitask/touch_task</code> あたりが原因かな?とあたりを付けてソースを読む。</p>
<p><code>~/yukitask/touch_task</code> の <code>system("update_graph")</code> が怪しいので、 とりあえず <code>~/yukitask/update_graph</code> 単独で実行してみる。</p>
<div class="sourceCode"><pre class="sourceCode sh"><code class="sourceCode bash">$ <span class="bu">cd</span> ~/project/yukitask_practice
$ <span class="ex">update_graph</span>
$ <span class="ex">start</span> ~/yukitask/graph-recent.html <span class="co"># グラフが表示された</span></code></pre></div>
<p>これは、 Windows ネイティブの Ruby 使っているから PATH が通っていないんだなきっと。</p>
<p>うーん、MSYS2 環境から Windows ネイティブ Ruby 呼ぶのが間違いなきがしてきた。 とはいえ MSYS2 の Ruby 入れると使い分けとかいろいろややこしくなりそう。</p>
<p>面倒なので bash 経由で呼び出すように修正した。 bash なら環境変数よしなに取り扱ってくれそうだし。</p>
<p><code>%s/system("update_graph")/system("bash -c \\\"\~\/yukitask\/update_graph\\\"")</code> 的な感じで書き換えて再挑戦。</p>
<div class="sourceCode"><pre class="sourceCode sh"><code class="sourceCode bash">$ <span class="fu">cat</span> /dev/null <span class="op">></span> ~/yukitask/graph-recent.html
$ <span class="ex">mk</span>
$ <span class="ex">start</span> ~/yukitask/graph-recent.html <span class="co"># グラフが表示された</span></code></pre></div>
<p>何となく <code>mk</code> の実行時間長くなった気がするけどとりあえずグラフの更新は成功した。</p>
<h1 id="感想">感想</h1>
<p>MSYS2 の <code>packman</code> でインストールできる ruby を使うようにすれば、 今回つまずいた中のいくつかは回避できるんじゃないかな? 特にこだわりが無いのであればそちらを推奨。</p>
<p>yukitask 自体の設定ファイル的な存在が <code>makefile</code> なので、 プロジェクトルートに <code>Makefile</code> が存在するようなプロジェクトの管理はできなそう。 (昨今そんなプロジェクトはめったにないけれど)</p>
<p>基本的な設定は <code>~/yukitask</code> 下で管理されているので、 プロジェクトルート直下の <code>TODO</code> と <code>makefile</code> を <code>.gitignore</code> に登録すれば、 公開前提のプロジェクトでもいい感じに管理できそう。 (場合によっては <code>TODO</code> すら ignore 設定しなくてもよい感じ)</p>
<p>ここまで試してみて、グラフ表示に魅力を感じてきているので、使い方を模索しつつなるべく体をなじませていきたい感じ。</p>
<h1 id="参考資料">参考資料</h1>
<ul>
<li><a href="https://differentialengine.wordpress.com/2015/05/18/yukitask-on-windows/">Windows に YukiTask を導入する(メモ) | 萌えとかプログラミングとか</a>
<ul>
<li><code>pbcopy</code> の代替方法や、 Winddows ネイティブの Ruby を使う Tips、 Haskell プロジェクトを例にした makefile の書き方などがわかりやすくまとまっている。</li>
</ul></li>
</ul>
mikoto2000http://www.blogger.com/profile/08084647632974947669noreply@blogger.com0tag:blogger.com,1999:blog-37637535.post-56654520704463551832017-02-19T11:43:00.000+09:002017-02-19T11:43:01.845+09:00AArch64 armasm の勉強 システムレジスタの値を取得する実習<nav id="TOC">
<ul>
<li><a href="#前提">前提</a></li>
<li><a href="#作成したプログラム">作成したプログラム</a></li>
</ul>
</nav>
<p><a href="http://oyasirazu.blogspot.jp/2017/02/aarch64-armasm.html">前々回</a>、<a href="http://oyasirazu.blogspot.jp/2017/02/aarch64-armasm_16.html">前回</a>で、システムレジスタについてと、 C 言語から armasm のサブルーチンを呼び出す方法が分かった気がする。 なので、実際にプログラムを作成してレジスタの値が取得できるかを確かめる。</p>
<h1 id="前提">前提</h1>
<p>この辺の作業で使った環境を引き続き使用している。</p>
<ul>
<li><a href="http://oyasirazu.blogspot.jp/2016/12/raspberry-pi-3-model-b-os-l.html">親知らずの日記: Raspberry Pi 3 Model B+ で、 OS 無し L チカした</a></li>
<li><a href="http://oyasirazu.blogspot.jp/2016/12/raspberry-pi-3-model-b-uart.html">親知らずの日記: Raspberry Pi 3 Model B+ でベアメタル UART 出力</a></li>
<li><a href="http://oyasirazu.blogspot.jp/2016/12/raspberry-pi-model-b-uart.html">親知らずの日記: Raspberry Pi Model B+ でベアメタル UART 出力ユーティリティ化</a></li>
<li><a href="http://oyasirazu.blogspot.jp/2017/01/bash-on-ubuntu-on-windows-raspberry-pi.html">親知らずの日記: Windows 上で Raspberry Pi 3 Model B+ 64 bit の U-Boot イメージをビルド</a></li>
</ul>
<h1 id="作成したプログラム">作成したプログラム</h1>
<p>main.c</p>
<div class="sourceCode"><pre class="sourceCode c"><code class="sourceCode c"><span class="pp">#include </span><span class="im"><string.h></span>
<span class="pp">#include </span><span class="im"><types.h></span>
<span class="pp">#include </span><span class="im"><uart.h></span>
<span class="pp">#include </span><span class="im">"SystemRegisters.h"</span>
<span class="pp">#define BUF_LENGTH 255</span>
<span class="dt">int</span> main() {
<span class="dt">char</span> cbuf[BUF_LENGTH];
uint32 daifFlags = daif();
ltoa(daifFlags, cbuf, BUF_LENGTH, <span class="dv">2</span>);
print(<span class="st">"daifFlags = "</span>);
println(cbuf);
uint32 nzcvFlags = nzcv();
ltoa(nzcvFlags, cbuf, BUF_LENGTH, <span class="dv">2</span>);
print(<span class="st">"nzcvFlags = "</span>);
println(cbuf);
<span class="cf">while</span> (<span class="dv">1</span>);
<span class="cf">return</span> <span class="dv">0</span>;
}</code></pre></div>
<p>SystemRegisters.h</p>
<div class="sourceCode"><pre class="sourceCode h"><code class="sourceCode c"><span class="pp">#include </span><span class="im"><types.h></span>
<span class="kw">extern</span> uint32 daif();
<span class="kw">extern</span> uint32 nzcv();</code></pre></div>
<p>SystemRegisters.S</p>
<div class="sourceCode"><pre class="sourceCode s"><code class="sourceCode gnuassembler"><span class="kw">.global</span> daif
<span class="kw">daif:</span>
MRS X0, DAIF
RET
<span class="kw">.global</span> nzcv
<span class="kw">nzcv:</span>
MRS X0, NZCV
RET</code></pre></div>
<p>とりあえずこれで確認してみる。</p>
<p>実行結果は下記。</p>
<pre><code>daifFlags = 1111000000
nzcvFlags = 1100000000000000000000000000000</code></pre>
<p><code>printf</code> を実装してないから表示がちょっと残念だけど、 下記、条件フラグの記載を見る限り、 DAIF フラグが全部立ってるので、割り込みはすべて Disable であることと、 Z, C フラグが立ってることを確認できた???</p>
<ul>
<li><a href="http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.den0024a/BABJGFCI.html">ARM Information Center - 10.1. Exception handling registers</a></li>
</ul>
<p>とりあえず今日はここまで。 明日はこれでいろいろなレジスタの状態を確認していってみようか。</p>
mikoto2000http://www.blogger.com/profile/08084647632974947669noreply@blogger.com0tag:blogger.com,1999:blog-37637535.post-13753075706257027252017-02-16T21:04:00.000+09:002017-02-16T21:04:30.093+09:00AArch64 armasm の勉強 サブルーチン編<nav id="TOC">
<ul>
<li><a href="#座学">座学</a></li>
<li><a href="#実践">実践</a><ul>
<li><a href="#検証環境">検証環境</a></li>
<li><a href="#検証用プログラムの作成">検証用プログラムの作成</a></li>
<li><a href="#アセンブリコードの確認">アセンブリコードの確認</a></li>
</ul></li>
<li><a href="#まとめ">まとめ</a></li>
</ul>
</nav>
<p>前回(<a href="http://oyasirazu.blogspot.jp/2017/02/aarch64-armasm.html">親知らずの日記: AArch64 armasm の勉強 システムレジスタ編</a>)、システムレジスタの値を MRS, MSR で読み書きできそうということが分かったので、取得した値を表示してみたい。</p>
<p>そのためには、 C 言語から armasm のサブルーチンを呼び出せるようにしないといけない。</p>
<p>そのあたりの勉強をする。</p>
<h1 id="座学">座学</h1>
<p><a href="http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0801cj/index.html">ARM Information Center - ARM® コンパイラ armasm ユーザガイド</a> を見てみたが、 AArch64 の章に、サブルーチンに関する話が載っていなかった。</p>
<p>仕方がないので <a href="http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0801cj/dom1359731145503_00013.html">ARM Information Center - 6.3 サブルーチン呼び出しでのレジスタの使用方法</a> を参照する。</p>
<p>これによると、</p>
<ul>
<li>レジスタ 0 から 3 までを引数用に使用</li>
<li>レジスタ 0 を 戻り値用に使用</li>
<li>サブルーチン呼び出しには <code>BL</code> 命令を使用</li>
<li>サブルーチンからの復帰には <code>BX LR</code> 命令を使用</li>
</ul>
<p>のようだ。</p>
<p>それぞれの命令の意味を確認しようと思ったら、 <a href="http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0801cj/pge1427898258836_00003.html">ARM Information Center</a> に <code>BX</code> 命令がない...。「復帰」で検索かけたら <code>RET</code> 命令が見つかった。AArch64 では <code>RET</code> 命令でサブルーチンからの復帰を行うみたい。</p>
<p>ここまでわかったので、実際作ったプログラムをアセンブリプログラムに変換して確かめてみる。</p>
<h1 id="実践">実践</h1>
<h2 id="検証環境">検証環境</h2>
<p>ツールチェインは <code>gcc-linaro-6.2.1-2016.11-i686-mingw32_aarch64-linux-gnu</code>。</p>
<h2 id="検証用プログラムの作成">検証用プログラムの作成</h2>
<p>caller.c</p>
<div class="sourceCode"><pre class="sourceCode c"><code class="sourceCode c"><span class="kw">extern</span> <span class="dt">int</span> getOne(<span class="dt">void</span>);
<span class="kw">extern</span> <span class="dt">int</span> add(<span class="dt">int</span> a, <span class="dt">int</span> b);
<span class="dt">int</span> main() {
<span class="dt">int</span> one = getOne();
<span class="dt">int</span> number = add(<span class="dv">1</span>, <span class="dv">2</span>);
<span class="cf">while</span> (<span class="dv">1</span>);
<span class="cf">return</span> <span class="dv">0</span>;
}</code></pre></div>
<p>callee.c</p>
<div class="sourceCode"><pre class="sourceCode c"><code class="sourceCode c"><span class="dt">int</span> getOne() {
<span class="cf">return</span> <span class="dv">1</span>;
}
<span class="dt">int</span> add(<span class="dt">int</span> a, <span class="dt">int</span> b) {
<span class="cf">return</span> a + b;
}</code></pre></div>
<p>上記の C コードをアセンブリコードへ変換する。</p>
<h2 id="アセンブリコードの確認">アセンブリコードの確認</h2>
<div class="sourceCode"><pre class="sourceCode sh"><code class="sourceCode bash"><span class="ex">aarch64-linux-gnu-gcc</span> -S ./caller.c -o caller.S
<span class="ex">aarch64-linux-gnu-gcc</span> -S ./callee.c -o callee.S</code></pre></div>
<p>で、結果が下記。</p>
<p>caller.S</p>
<div class="sourceCode"><pre class="sourceCode s"><code class="sourceCode gnuassembler"> .arch armv8-a
<span class="kw">.file</span> <span class="st">"caller.c"</span>
<span class="kw">.text</span>
<span class="kw">.align</span> <span class="dv">2</span>
<span class="kw">.global</span> main
<span class="kw">.type</span> main, %function
<span class="kw">main:</span>
stp x29, x30, [sp, -<span class="dv">32</span>]!
add x29, sp, <span class="dv">0</span>
bl getOne
str w0, [x29, <span class="dv">28</span>]
mov w1, <span class="dv">2</span>
mov w0, <span class="dv">1</span>
bl add
str w0, [x29, <span class="dv">24</span>]
.L2<span class="kw">:</span>
b .L2
<span class="kw">.size</span> main, .-main
<span class="kw">.ident</span> <span class="st">"GCC: (Linaro GCC 6.2-2016.11) 6.2.1 20161016"</span>
<span class="kw">.section</span> .note.GNU-stack,<span class="st">""</span>,<span class="co">@progbits</span></code></pre></div>
<p>callee.S</p>
<div class="sourceCode"><pre class="sourceCode s"><code class="sourceCode gnuassembler"> .arch armv8-a
<span class="kw">.file</span> <span class="st">"callee.c"</span>
<span class="kw">.text</span>
<span class="kw">.align</span> <span class="dv">2</span>
<span class="kw">.global</span> getOne
<span class="kw">.type</span> getOne, %function
<span class="kw">getOne:</span>
mov w0, <span class="dv">1</span>
ret
<span class="kw">.size</span> getOne, .-getOne
<span class="kw">.align</span> <span class="dv">2</span>
<span class="kw">.global</span> add
<span class="kw">.type</span> add, %function
<span class="kw">add:</span>
sub sp, sp, <span class="co">#16</span>
str w0, [sp, <span class="dv">12</span>]
str w1, [sp, <span class="dv">8</span>]
ldr w1, [sp, <span class="dv">12</span>]
ldr w0, [sp, <span class="dv">8</span>]
add w0, w1, w0
add sp, sp, <span class="dv">16</span>
ret
<span class="kw">.size</span> add, .-add
<span class="kw">.ident</span> <span class="st">"GCC: (Linaro GCC 6.2-2016.11) 6.2.1 20161016"</span>
<span class="kw">.section</span> .note.GNU-stack,<span class="st">""</span>,<span class="co">@progbits</span></code></pre></div>
<h1 id="まとめ">まとめ</h1>
<p>ドキュメントに書いてある通り、引数と戻り値を設定しているみたい。 そして、復帰は <code>RET</code> 使っている。</p>
<p>サブルーチン側では、</p>
<ol type="1">
<li>スタック領域確保する</li>
<li>スタックに引数を積み上げる</li>
<li>サブルーチンの処理結果をレジスタ 0 に格納する</li>
<li>確保したスタック領域を返却する</li>
</ol>
<p>のような流れっぽい。 スタックは、アドレスの少ないほうに伸びていくっぽい。</p>
<p>本日はここまで。 明日、余裕があったら引数の数増やして確認してみる。</p>
mikoto2000http://www.blogger.com/profile/08084647632974947669noreply@blogger.com0tag:blogger.com,1999:blog-37637535.post-42849684690932157582017-02-15T22:24:00.000+09:002017-02-15T22:24:49.551+09:00AArch64 armasm の勉強 システムレジスタ編<p><a href="http://tatsu-zine.com/books/raspi-bm">BareMetalで遊ぶ Raspberry Pi - 達人出版会</a> を参照しながら Raspberry Pi 3 Model B+ でベアメタルタイマー割り込みやろうとしたのだけど、 AArch64 でやろうとするといろいろ勝手が違うらしいのでそこのところを勉強する。</p>
<p>元ネタ資料はこれら</p>
<ul>
<li><a href="http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0801cj/index.html">ARM Information Center - ARM® コンパイラ armasm ユーザガイド</a></li>
<li><a href="http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0500g/index.html">ARM Information Center - ARM Cortex-A53 MPCore Processor Technical Reference Manual</a></li>
</ul>
<p>レジスタ概要を把握するため、<a href="http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0801cj/pge1424433161541_00002.html">ARM Information Center - 章 4 AArch64 状態の概要</a> を一通り読んだ。</p>
<p>不正確な箇条書きで書くとこんな感じらしい。</p>
<ul>
<li>レジスタ概要
<ul>
<li>汎用レジスタ 30 本
<ul>
<li>プログラム内で好き勝手適当に使えるレジスタ群</li>
<li>X30 で 64 bit レジスタとしてアクセス</li>
<li>W30 で 32 bit レジスタとしてアクセス(上 32 bit はゼロクリアされる)</li>
<li>X30, W30 はリンクレジスタ</li>
</ul></li>
<li>PC(プログラムカウンタ)
<ul>
<li>次に実行するアドレスが格納されるレジスタ</li>
<li>直接値を変更することはできない、特定の命令で書き換えるらしい</li>
</ul></li>
<li>SP(スタックポインタレジスタ)
<ul>
<li>スタックを実現するために使うレジスタ</li>
<li>命令一つで格納とインクリメントをしてくれるとかそういうの???</li>
<li>サブルーチンの引数なんかをスタックするのに使うらしい</li>
<li>例外レベル 0 から 3 までにそれぞれ専用のレジスタをもつ</li>
<li>アセンブラの命令によっては X31, W31 でアクセスできるらしい</li>
</ul></li>
<li>SPSR(セーブドプログラムステータスレジスタ)
<ul>
<li>例外発生時にその時点での状態を記録してくれるレジスタ</li>
<li>例外レベル 1 から 3 までに専用のレジスタが一つずつある</li>
<li>例外が発生すると、現在のステータスが遷移先の SPSR に格納される</li>
<li>SPSR が格納する情報は下記の通り
<ul>
<li>N, Z, C, V フラグ</li>
<li>D, A, I, F 割り込み Disable ビット</li>
<li>レジスタ幅</li>
<li>実行モード</li>
<li>IL, SS ビット</li>
</ul></li>
</ul></li>
<li>LR(リンクレジスタ)
<ul>
<li>サブルーチン呼び出し時に復帰アドレスを格納する</li>
</ul></li>
<li>ELR(例外リンクレジスタ)
<ul>
<li>例外発生時に復帰アドレスを格納する</li>
<li>例外レベル 1 から 3 にそれぞれ専用のレジスタがある
<ul>
<li>設定によっては例外レベルでレジスタを使い分けないこともできるらしい</li>
</ul></li>
</ul></li>
</ul></li>
<li>例外レベルとは
<ul>
<li>それぞれのレベルで下記のような感じらしい。それぞれの意味はよく分からない。
<ul>
<li>EL0 : アプリケーション</li>
<li>EL1 : 特権付き</li>
<li>EL2 : ハイパーバイザ</li>
<li>EL3 : セキュアモニタ</li>
</ul></li>
</ul></li>
<li>AArch64 でのプロセス状態書き込み・読み込み方法
<ul>
<li>プロセス状態としてアクセスできる情報は下記の通り
<ul>
<li>N,Z,C,V フラグ(NZCV)</li>
<li>現在のレジスタ幅(nRW)</li>
<li>スタックポインタ選択ビット(SPSel)</li>
<li>割り込み Disable フラグ(DAIF)</li>
<li>現在の例外レベル(EL)</li>
<li>シングルステッププロセス状態ビット(SS)</li>
<li>不正な例外復帰状態ビット(IL)</li>
</ul></li>
<li>MSR 命令で書き込めるもの
<ul>
<li>NZCV</li>
<li>DAIF</li>
<li>SPSel(EL1以上)</li>
</ul></li>
<li>MRS 命令で読み取れるもの
<ul>
<li>NZCV</li>
<li>DAIF</li>
<li>CurrentEL の例外レベルビット(EL1 以上)</li>
<li>SPSel(EL1 以上)</li>
</ul></li>
</ul></li>
</ul>
<p><a href="http://tatsu-zine.com/books/raspi-bm">BareMetalで遊ぶ Raspberry Pi - 達人出版会</a> 内で CPSR にアクセスしている部分は、大体 MSR, MRS で置き換えられるのかな?</p>
<p><a href="http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0500g/index.html">ARM Information Center - ARM Cortex-A53 MPCore Processor Technical Reference Manual</a> に書かれているレジスタなんかも、 MSR, MRS 命令で読み書きするみたい。</p>
<p>とりあえず今日はここまで。</p>
mikoto2000http://www.blogger.com/profile/08084647632974947669noreply@blogger.com0tag:blogger.com,1999:blog-37637535.post-89624634241958479712017-01-22T21:25:00.000+09:002017-01-24T01:42:59.983+09:00Windows 上で Raspberry Pi 3 Model B+ 64 bit の U-Boot イメージをビルド<nav id="TOC">
<ul>
<li><a href="#前提条件">前提条件</a></li>
<li><a href="#u-boot-の準備">U-Boot の準備</a><ul>
<li><a href="#必要パッケージのインストール">必要パッケージのインストール</a></li>
<li><a href="#u-boot-の取得とビルド">U-Boot の取得とビルド</a></li>
<li><a href="#ブートスクリプトの作成">ブートスクリプトの作成</a></li>
</ul></li>
<li><a href="#ネットワーク設定">ネットワーク設定</a></li>
<li><a href="#sd-カードの準備">SD カードの準備</a><ul>
<li><a href="#config.txt-の書き換え後の内容"><code>config.txt</code> の書き換え後の内容</a></li>
</ul></li>
<li><a href="#tftpd-の準備">TFTPD の準備</a><ul>
<li><a href="#tftpd-の取得">TFTPD の取得</a></li>
<li><a href="#tftpd-の設定">TFTPD の設定</a></li>
</ul></li>
<li><a href="#物理的な準備">物理的な準備</a></li>
<li><a href="#ファイルの準備">ファイルの準備</a></li>
<li><a href="#実行">実行</a></li>
<li><a href="#感想">感想</a></li>
</ul>
</nav>
<p>Windows 上で Raspberry Pi 3 Model B+ の U-Boot イメージをビルドする手順を書いていく。</p>
<p>ただし、 U-Boot イメージのビルドには Bash on Ubuntu on Windows を使用する。</p>
<h1 id="前提条件">前提条件</h1>
<ul>
<li>この記事<a href="http://oyasirazu.blogspot.jp/2016/08/ubuntu-on-windows-mintty.html">この記事(Ubuntu on Windows を導入して mintty から操作できるようにする)</a> の通り Bash on Ubuntu on Windows 導入していること</li>
<li>MSYS2 で U-Boot のビルドに挑戦したけれどうまくいかなかったので、仕方なく Bash on Ubuntu on Windows を使う</li>
</ul>
<h1 id="u-boot-の準備">U-Boot の準備</h1>
<p>ネットワークブートに必要な U-Boot のビルドと設定を行う。 MSYS2 上でのビルドに成功しないので、この作業は Bash on Ubuntu on Windows 上で行う。 このセクションの作業はすべて Bash on Ubuntu on Windows 上で行う。</p>
<h2 id="必要パッケージのインストール">必要パッケージのインストール</h2>
<div class="sourceCode"><pre class="sourceCode sh"><code class="sourceCode bash"><span class="fu">sudo</span> apt install git gcc-aarch64-linux-gnu device-tree-compiler</code></pre></div>
<h2 id="u-boot-の取得とビルド">U-Boot の取得とビルド</h2>
<div class="sourceCode"><pre class="sourceCode sh"><code class="sourceCode bash"><span class="fu">mkdir</span> ~/project
<span class="bu">cd</span> ~/project
<span class="fu">git</span> clone git://git.denx.de/u-boot.git
<span class="bu">cd</span> ~/project/u-boot
<span class="bu">export</span> <span class="va">CROSS_COMPILE=</span>aarch64-linux-gnu-
<span class="fu">make</span> rpi_3_defconfig
<span class="fu">make</span> all</code></pre></div>
<h2 id="ブートスクリプトの作成">ブートスクリプトの作成</h2>
<p>Raspberry Pi 起動時に、 TFTP サーバーへ接続してイメージのロードと実行を行うスクリプトを作成する。</p>
<p><code>boot.txt</code> を、下記の通り作成する。</p>
<pre class="txt"><code>dhcp 0x80000 192.168.2.100:kernel8.img
go 0x80000</code></pre>
<p><code>boot.txt</code> を、 <code>boot.scr</code> に変換する。</p>
<div class="sourceCode"><pre class="sourceCode sh"><code class="sourceCode bash"><span class="ex">/PATH/TO/u-boot/tools/mkimage</span> -A arm -O linux -T script -C none -a 0 -e 0 -n <span class="st">"PXE Boot"</span> -d boot.txt ./boot.scr</code></pre></div>
<p>ここで作成した <code>boot.scr</code> を、 U-Boot 起動時に読み込ませることで、 TFTP サーバー <code>192.168.2.100</code> の <code>kernel8.img</code> をイメージとして取得・ロードしてくれるようになる。</p>
<h1 id="ネットワーク設定">ネットワーク設定</h1>
<p>ノート PC の無線 LAN を WAN に、有線を Raspberry Pi 3 に接続する。 そのままだと、有線が優先されるせいか WAN に出れないので、有線 LAN アダプタの設定を行う。</p>
<ol type="1">
<li>「タスクトレイのネットワークアイコンを右クリック -> ネットワーク共有センターを開く」選択</li>
<li>「アダプターの設定の変更」を選択</li>
<li>「イーサネットを右クリック -> プロパティ」を選択</li>
<li>「インターネットプロトコル バージョン 4(TCP/IPv4)」をダブルクリック</li>
<li>「次の IP アドレスを使う」を選択</li>
<li>下記通りに設定
<ul>
<li>IP アドレス : 192.168.2.100</li>
<li>サブネットマスク : 255.255.255.0</li>
<li>デフォルトゲートウェイ : 192.168.2.1</li>
<li>他は空欄のままでよい</li>
</ul></li>
</ol>
<h1 id="sd-カードの準備">SD カードの準備</h1>
<ol type="1">
<li>ビルドした成果物の <code>u-boot.bin</code> を SD カードのルートにコピーする</li>
<li>下記ページのファイルをすべて SD カードのルートにコピーする。
<ul>
<li><a href="https://github.com/raspberrypi/firmware/tree/master/boot">raspberrypi/firmware/boot</a></li>
</ul></li>
<li><code>boot.scr</code> を SD カードのルートにコピーする</li>
<li><code>config.txt</code> を書き換える</li>
</ol>
<h2 id="config.txt-の書き換え後の内容"><code>config.txt</code> の書き換え後の内容</h2>
<pre class="txt"><code>enable_uart=1
arm_control=0x200
kernel=u-boot.bin</code></pre>
<h1 id="tftpd-の準備">TFTPD の準備</h1>
<h2 id="tftpd-の取得">TFTPD の取得</h2>
<p>下記ページから <code>tftpd64 standard edition (zip)</code> をダウンロードする。</p>
<ul>
<li><a href="http://tftpd32.jounin.net/tftpd32_download.html">TFTP server</a></li>
</ul>
<h2 id="tftpd-の設定">TFTPD の設定</h2>
<p>ダウンロード・展開してできた <code>tftpd64.exe</code> を起動し、 Setting ボタンを押下。</p>
<div class="separator" style="clear: both; text-align: center;"><a href="https://3.bp.blogspot.com/-bKCk40ULlLs/WIShp41M2eI/AAAAAAAAGaU/HYETVSNsXtkUH9NPJ8H1aNKgap0qyajZwCPcB/s1600/uboot_01.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://3.bp.blogspot.com/-bKCk40ULlLs/WIShp41M2eI/AAAAAAAAGaU/HYETVSNsXtkUH9NPJ8H1aNKgap0qyajZwCPcB/s400/uboot_01.png" width="400" height="342" /></a></div>
<p>グローバル設定画面で、 TFTP Server と DHCP Server を使用するように設定。</p>
<div class="separator" style="clear: both; text-align: center;"><a href="https://3.bp.blogspot.com/-UtdW9U8JXm8/WIShp0wzI4I/AAAAAAAAGaU/wwXqmrUskk4oEJjnsRmFgKGjNxrmpXY6QCPcB/s1600/uboot_02.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://3.bp.blogspot.com/-UtdW9U8JXm8/WIShp0wzI4I/AAAAAAAAGaU/wwXqmrUskk4oEJjnsRmFgKGjNxrmpXY6QCPcB/s400/uboot_02.png" width="276" height="400" /></a></div>
<p>TFTPD 設定画面でいろいろ設定する。</p>
<ul>
<li>Base Directory
<ul>
<li>TFTP で公開するディレクトリのルート( <code>kernel8.img</code> を置く。今回は <code>C:\\Users\\mikoto\\project\\raspberrypi_bare_metal\\ftproot</code> を設定)</li>
</ul></li>
<li>下記チェックボックスにチェック
<ul>
<li>Option negotiation</li>
<li>Show Progress bar</li>
<li>Translate Unix file names</li>
<li>Bind TFTP to this address
<ul>
<li><code>192.168.2.100</code> (自分が Listen する IP アドレスを入力)</li>
</ul></li>
</ul></li>
</ul>
<div class="separator" style="clear: both; text-align: center;"><a href="https://4.bp.blogspot.com/-d_uwnE3dvio/WIShp1orEBI/AAAAAAAAGaU/tTtfvRHepKsm364tllCp938nLpzm5rNNwCPcB/s1600/uboot_03.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://4.bp.blogspot.com/-d_uwnE3dvio/WIShp1orEBI/AAAAAAAAGaU/tTtfvRHepKsm364tllCp938nLpzm5rNNwCPcB/s400/uboot_03.png" width="276" height="400" /></a></div>
<p>DHCPD 設定画面でもいろいろ設定する。</p>
<ul>
<li>この辺直感で設定したので根拠なし。誰かツッコミあればお願いしますって感じで。</li>
</ul>
<div class="separator" style="clear: both; text-align: center;"><a href="https://4.bp.blogspot.com/-HU6Yla8D0O0/WIShqcIYeKI/AAAAAAAAGaU/DEz5H4RaNyEtDVKQQhkUSEWIHw4aVgqWwCPcB/s1600/uboot_04.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://4.bp.blogspot.com/-HU6Yla8D0O0/WIShqcIYeKI/AAAAAAAAGaU/DEz5H4RaNyEtDVKQQhkUSEWIHw4aVgqWwCPcB/s400/uboot_04.png" width="276" height="400" /></a></div>
<p>OK ボタンを押下。</p>
<p>これで、TFTP のファイルを公開すると同時に、 PC と Raspberry Pi を繋げたときに、 Raspberry Pi に対して IP を設定してくれるようになる。</p>
<h1 id="物理的な準備">物理的な準備</h1>
<ol type="1">
<li>SD カードを Raspberry Pi に挿入</li>
<li>PC と Raspberry Pi を LAN ケーブルで繋げる</li>
<li>PC と Raspberry Pi を UART ケーブルでつなげる</li>
</ol>
<h1 id="ファイルの準備">ファイルの準備</h1>
<p>実行したいプログラム( <code>kernel8.img</code> ) を TFTP のルートディレクトリにコピー</p>
<h1 id="実行">実行</h1>
<p>Raspberry Pi の電源を入れる</p>
<p>Raspberry Pi を再起動するたび、 TFTP のルートディレクトリに格納した <code>kernel8.img</code> が実行されるようになっている。</p>
<div class="separator" style="clear: both; text-align: center;"><a href="https://1.bp.blogspot.com/-Lchz74S7RbM/WIShq3bXnHI/AAAAAAAAGaU/AxffWOx9GwQb2b8XHNb05LTYGsfts76ZwCPcB/s1600/uboot_05.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://1.bp.blogspot.com/-Lchz74S7RbM/WIShq3bXnHI/AAAAAAAAGaU/AxffWOx9GwQb2b8XHNb05LTYGsfts76ZwCPcB/s400/uboot_05.gif" width="400" height="230" /></a></div>
<h1 id="感想">感想</h1>
<ul>
<li>U-Boot, 積極的に使っていきたい。</li>
<li>とりあえず目的は達成できたので満足。</li>
<li>U-Boot のビルドに Ubuntu を使ったのが悔しくて仕方ない。</li>
</ul>
<h1 id="参考文献">参考文献</h1>
<ul>
<li><a href="http://d.hatena.ne.jp/cupnes/20160529/1464512815">ラズパイ3でベアメタル - U-Bootでネットワーク起動 - へにゃぺんて@日々勉強のまとめ</a></li>
<li><a href="http://tokyodebian.alioth.debian.org/pdf/debianmeetingresume201606-rpi3-presentation.pdf">Raspberry Pi3 / arm64 - Debian/Ubuntu ミートアップ in 札幌 - debianmeetingresume201606-rpi3-presentation.pdf</a></li>
</ul>
<p>以上。</p>
mikoto2000http://www.blogger.com/profile/08084647632974947669noreply@blogger.com0tag:blogger.com,1999:blog-37637535.post-57189639808863530282016-12-25T21:22:00.000+09:002016-12-25T21:22:09.429+09:00Raspberry Pi Model B+ でベアメタル UART 出力ユーティリティ化<nav id="TOC">
<ul>
<li><a href="#目的">目的</a></li>
<li><a href="#要素技術">要素技術</a></li>
<li><a href="#uart-出力">UART 出力</a></li>
<li><a href="#数値---文字列-変換">'数値 -> 文字列' 変換</a></li>
<li><a href="#使い方">使い方</a></li>
<li><a href="#成果物">成果物</a></li>
</ul>
</nav>
<p>前回、 <a href="http://oyasirazu.blogspot.jp/2016/12/raspberry-pi-3-model-b-uart.html">親知らずの日記: Raspberry Pi 3 Model B+ でベアメタル UART 出力</a> では、 UART で受信した文字をエコーバックするプログラムを作成した。</p>
<p>プログラム内で任意の文字列を出力させるため、ユーティリティ化したい。</p>
<h1 id="目的">目的</h1>
<p>デバッグ目的で UART に任意文字列を出力したい。</p>
<p>こんな感じで使いたい。</p>
<div class="sourceCode"><pre class="sourceCode c"><code class="sourceCode c"><span class="dt">int</span> main(<span class="dt">void</span>) {
println(<span class="st">"Hello, World!"</span>);
error_code = function();
print(<span class="st">"error_code: "</span>);
print(error_code);
println(<span class="st">"."</span>);
<span class="cf">return</span> <span class="dv">0</span>;
}</code></pre></div>
<h1 id="要素技術">要素技術</h1>
<ol type="1">
<li>UART 出力</li>
<li>'数値 -> 文字列' 変換</li>
</ol>
<h1 id="uart-出力">UART 出力</h1>
<p>こんな感じになった。</p>
<p>uart.h</p>
<div class="sourceCode"><pre class="sourceCode c"><code class="sourceCode c"><span class="pp">#ifndef __UART_H__</span>
<span class="pp">#define __UART_H__</span>
<span class="co">/**</span>
<span class="co"> * Mini Uart 送受信に使用するレジスタ。</span>
<span class="co"> *</span>
<span class="co"> * 書き込むと送信 FIFO にプッシュ,</span>
<span class="co"> * 読み込むと 受信 FIFO からポップしてくれる素敵仕様らしい。</span>
<span class="co"> */</span>
<span class="pp">#define MU_IO (*(volatile unsigned int *)0x3F215040)</span>
<span class="co">/**</span>
<span class="co"> * Mini Uart 送信 FIFO の状態確認をするための情報が入ったレジスタ。</span>
<span class="co"> *</span>
<span class="co"> * 6 ビット目 : Transmitter idle, アイドル状態か?</span>
<span class="co"> * 1: アイドル状態, 0: ビジー状態</span>
<span class="co"> * 5 ビット目 : Transmitter empty, 1 バイト以上送信受付可能か?</span>
<span class="co"> * 1: 可能, 0: 不可能</span>
<span class="co"> * 0 ビット目 : Data ready, 1 バイト以上受信しているか?</span>
<span class="co"> * 1: 受信している, 0: 受信していない</span>
<span class="co"> */</span>
<span class="pp">#define MU_LSR (*(volatile unsigned int *)0X3F215054)</span>
<span class="co">/* Transmitter idle のビットマスク */</span>
<span class="pp">#define MU_LSR_TX_IDLE (1U << 6)</span>
<span class="co">/* Transmitter empty のビットマスク */</span>
<span class="pp">#define MU_LSR_TX_EMPTY (1U << 5)</span>
<span class="co">/* Data ready のビットマスク*/</span>
<span class="pp">#define MU_LSR_RX_RDY (1U << 0)</span>
<span class="dt">void</span> println(<span class="dt">const</span> <span class="dt">char</span>* chars);
<span class="dt">void</span> print(<span class="dt">const</span> <span class="dt">char</span>* chars);
<span class="dt">void</span> uart_put(<span class="dt">const</span> <span class="dt">char</span> c);
<span class="pp">#endif </span><span class="co">// __UART_H__</span></code></pre></div>
<p>uart.c</p>
<div class="sourceCode"><pre class="sourceCode c"><code class="sourceCode c"><span class="pp">#include </span><span class="im">"uart.h"</span>
<span class="co">/* あとで types.h に追い出す */</span>
<span class="kw">typedef</span> <span class="dt">unsigned</span> <span class="dt">int</span> <span class="dt">size_t</span>;
<span class="dt">void</span> println(<span class="dt">const</span> <span class="dt">char</span>* chars) {
print(chars);
print(<span class="st">"</span><span class="sc">\n\r</span><span class="st">"</span>);
}
<span class="dt">void</span> print(<span class="dt">const</span> <span class="dt">char</span>* chars) {
<span class="dt">char</span>* char_ptr = (<span class="dt">char</span>*) chars;
<span class="cf">while</span> (*char_ptr != '\<span class="dv">0</span>') {
uart_put(*char_ptr);
char_ptr++;
}
}
<span class="dt">void</span> uart_put(<span class="dt">const</span> <span class="dt">char</span> c) {
<span class="co">// 送信受付可能状態になるまでビジーループ</span>
<span class="cf">while</span> (!(MU_LSR & MU_LSR_TX_IDLE) && !(MU_LSR & MU_LSR_TX_EMPTY));
<span class="co">// IO レジスタにデータ書き込み</span>
MU_IO = c;
}</code></pre></div>
<h1 id="数値---文字列-変換">'数値 -> 文字列' 変換</h1>
<p>これはこんな感じ。</p>
<p>string.h</p>
<div class="sourceCode"><pre class="sourceCode c"><code class="sourceCode c"><span class="pp">#ifndef __STRING_H__</span>
<span class="pp">#define __STRING_H__</span>
<span class="dt">unsigned</span> <span class="dt">char</span> ltoa_10(<span class="dt">const</span> <span class="dt">long</span> l, <span class="dt">char</span>* str, <span class="dt">const</span> <span class="dt">int</span> max_length);
<span class="pp">#endif </span><span class="co">// __STRING_H__</span></code></pre></div>
<p>string.c</p>
<div class="sourceCode"><pre class="sourceCode c"><code class="sourceCode c"><span class="pp">#include </span><span class="im">"string.h"</span>
<span class="co">/**</span>
<span class="co"> * </span><span class="an">@fn</span><span class="co"> </span><span class="do">10</span><span class="co"> </span><span class="do">進数値を文字列へ変換する</span>
<span class="co"> * </span><span class="an">@param</span><span class="co"> </span><span class="cv">(l</span><span class="co">) 変換対象数値</span>
<span class="co"> * </span><span class="an">@param</span><span class="co"> </span><span class="cv">(str</span><span class="co">) 変換後の文字列を格納するバッファへのポインタ</span>
<span class="co"> * </span><span class="an">@param</span><span class="co"> </span><span class="cv">(max_length</span><span class="co">) 変換後の文字列を格納するバッファの長さ</span>
<span class="co"> * </span><span class="an">@return</span><span class="co"> エラーコード</span>
<span class="co"> * 0 : 正常終了</span>
<span class="co"> * 1 : 変換後文字列を格納するバッファの長さが足りなかった</span>
<span class="co"> */</span>
<span class="dt">unsigned</span> <span class="dt">char</span> ltoa_10(<span class="dt">const</span> <span class="dt">long</span> l, <span class="dt">char</span>* str, <span class="dt">const</span> <span class="dt">int</span> max_length) {
<span class="dt">unsigned</span> <span class="dt">int</span> i;
<span class="dt">unsigned</span> <span class="dt">long</span> tmp_long_value = l < <span class="dv">0</span> ? -l : l;
<span class="dt">unsigned</span> <span class="dt">char</span> tmp_digit_value;
<span class="dt">unsigned</span> <span class="dt">int</span> length = <span class="dv">0</span>;
<span class="co">// 桁の数値と文字を対応付けする配列</span>
<span class="dt">const</span> <span class="dt">char</span> cmap[]
= { '<span class="dv">0</span>', '<span class="dv">1</span>', '<span class="dv">2</span>', '<span class="dv">3</span>', '<span class="dv">4</span>', '<span class="dv">5</span>', '<span class="dv">6</span>', '<span class="dv">7</span>', '<span class="dv">8</span>', '<span class="dv">9</span>' };
<span class="co">// ゼロ判定, ゼロならさっさと返却する</span>
<span class="cf">if</span> (l == <span class="dv">0</span>) {
<span class="cf">if</span> (max_length < <span class="dv">2</span>) {
<span class="cf">return</span> <span class="dv">1</span>;
}
str[<span class="dv">0</span>] = '<span class="dv">0</span>';
str[<span class="dv">1</span>] = '\<span class="dv">0</span>';
<span class="cf">return</span> <span class="dv">0</span>;
}
<span class="co">// 桁数判定</span>
<span class="cf">while</span> (tmp_long_value != <span class="dv">0</span>) {
tmp_long_value = tmp_long_value / <span class="dv">10</span>;
length++;
}
<span class="cf">if</span> (l < <span class="dv">0</span>) {
length++;
}
<span class="co">// バッファ長上限判定(NULL 文字を含めるので +1 する)</span>
<span class="co">// 上限を超えていたら 1 を返却</span>
<span class="cf">if</span> (length + <span class="dv">1</span> > max_length) {
<span class="cf">return</span> <span class="dv">1</span>;
}
<span class="co">// 文字列変換</span>
<span class="co">// 文字列変換開始インデックス</span>
i = length - <span class="dv">1</span>;
<span class="co">// NULL 文字追加</span>
str[length] = '\<span class="dv">0</span>';
<span class="co">// 各桁の変換</span>
tmp_long_value = l < <span class="dv">0</span> ? -l : l;
<span class="cf">while</span> (tmp_long_value != <span class="dv">0</span>) {
tmp_digit_value = tmp_long_value % <span class="dv">10</span>;
str[i] = cmap[tmp_digit_value];
i--;
tmp_long_value = tmp_long_value / <span class="dv">10</span>;
}
<span class="co">// 負数処理</span>
<span class="cf">if</span> (l < <span class="dv">0</span>) {
str[<span class="dv">0</span>] = '-';
}
<span class="cf">return</span> <span class="dv">0</span>;
}</code></pre></div>
<h1 id="使い方">使い方</h1>
<p>こんな感じで使えるようになった。</p>
<div class="sourceCode"><pre class="sourceCode c"><code class="sourceCode c"><span class="pp">#include </span><span class="im"><string.h></span>
<span class="pp">#include </span><span class="im"><uart.h></span>
<span class="pp">#define BUF_LENGTH 5</span>
<span class="dt">int</span> main(<span class="dt">void</span>) {
<span class="dt">char</span> cbuf[BUF_LENGTH];
println(<span class="st">"Hello, World!"</span>);
error_code = function();
ltoa_10(error_code, cbuf, BUF_LENGTH);
print(<span class="st">"error_code: "</span>);
print(error_code);
println(<span class="st">"."</span>);
<span class="cf">return</span> <span class="dv">0</span>;
}</code></pre></div>
<h1 id="成果物">成果物</h1>
<p>この辺りをユーティリティとしてまとめたうえで、 gcc で挙動テスト(string.c のみ)するようにしたものが下記 URL にある。</p>
<ul>
<li><a href="https://github.com/mikoto2000/raspberrypi_bare_metal/tree/master/util">raspberrypi_bare_metal/util at master · mikoto2000/raspberrypi_bare_metal</a></li>
</ul>
<p>これでデバッグプリントできるようになったので、 HDMI 出力できない問題を追いかけていく。 (しかし SD カード抜き差しが非常に厳しい...)</p>
<p>以上。</p>
mikoto2000http://www.blogger.com/profile/08084647632974947669noreply@blogger.com0tag:blogger.com,1999:blog-37637535.post-64387853131241522332016-12-24T06:49:00.000+09:002016-12-24T06:49:14.580+09:00Windows 10 に mikutter 3.4.8 をインストールした<nav id="TOC">
<ul>
<li><a href="#環境まとめ">環境まとめ</a></li>
<li><a href="#ruby-入手">Ruby 入手</a></li>
<li><a href="#mikutter-ソースコード入手">mikutter ソースコード入手</a></li>
<li><a href="#mikutter-に必要な-gem-たちのインストール">mikutter に必要な gem たちのインストール</a></li>
<li><a href="#mikutter-実行">mikutter 実行</a></li>
<li><a href="#ショートカット作成">ショートカット作成</a></li>
<li><a href="#todo">TODO</a></li>
</ul>
</nav>
<p>わけあって <a href="https://github.com/moguno/mikutter-windows">moguno/mikutter-windows</a> に頼らずに windows にインストールしてみたいと思い、実際やってみたので作業を記録する。</p>
<h1 id="環境まとめ">環境まとめ</h1>
<ul>
<li>OS: Windows 10 Pro</li>
<li>Ruby: 2.3.3</li>
</ul>
<h1 id="ruby-入手">Ruby 入手</h1>
<ul>
<li><a href="https://rubyinstaller.org/downloads/">RubyInstaller Downloads</a>
<ul>
<li><code>Ruby 2.3.3 (x64)</code> をダウンロード
<ul>
<li>パスを通す設定をしてください</li>
</ul></li>
<li><code>DevKit-mingw64-64-4.7.2-20130224-1432-sfx.exe</code> をダウンロード</li>
</ul></li>
</ul>
<h1 id="mikutter-ソースコード入手">mikutter ソースコード入手</h1>
<p>git インストール済みなのでクローンする。</p>
<div class="sourceCode"><pre class="sourceCode sh"><code class="sourceCode bash"><span class="fu">git</span> clone git://toshia.dip.jp/mikutter.git</code></pre></div>
<h1 id="mikutter-に必要な-gem-たちのインストール">mikutter に必要な gem たちのインストール</h1>
<p>DevKit を展開してできた <code>msys.bat</code> を実行。</p>
<div class="sourceCode"><pre class="sourceCode sh"><code class="sourceCode bash"><span class="bu">cd</span> /PATH/TO/mikutter
<span class="ex">gem</span> install bundler
<span class="ex">bundle</span> install --path vendor/bundler</code></pre></div>
<h1 id="mikutter-実行">mikutter 実行</h1>
<p><code>bundle exec</code> で起動。</p>
<pre class="cmd"><code>cd /PATH/TO/mikutter
bundle exec ruby mikutter.rb</code></pre>
<h1 id="ショートカット作成">ショートカット作成</h1>
<p>まずはスタート用のバッチファイルを作る。</p>
<pre class="cmd"><code>cd /PATH/TO/mikutter
echo start rubyw mikutter.rb> mikutter.bat</code></pre>
<p>作成したバッチファイルへのショートカットをデスクトップに作る。</p>
<h1 id="todo">TODO</h1>
<ul>
<li>display_display_requirements</li>
<li>別窓で画像開くやつの画像が表示されない</li>
<li>音を出す
<ul>
<li>今は音が鳴らない <a href="https://github.com/moguno/mikutter-windows">moguno/mikutter-windows</a> のサウンドプラグイン単独配布してくれないかなぁ...。</li>
</ul></li>
<li>アイコン
<ul>
<li>ショートカットアイコンに png 指定できないの辛い</li>
</ul></li>
</ul>
<p>音とアイコンについては <a href="https://github.com/moguno/mikutter-windows">moguno/mikutter-windows</a> で実現されているので、真似して作業していく。</p>
mikoto2000http://www.blogger.com/profile/08084647632974947669noreply@blogger.com0tag:blogger.com,1999:blog-37637535.post-55324520638336989992016-12-24T01:11:00.000+09:002016-12-24T01:11:46.174+09:00Raspberry Pi 3 Model B+ でベアメタル UART 出力<nav id="TOC">
<ul>
<li><a href="#必要なハードウェアの調達">必要なハードウェアの調達</a></li>
<li><a href="#uart-を使用するための設定">UART を使用するための設定</a></li>
<li><a href="#uart-を使うためのレジスタの確認">UART を使うためのレジスタの確認</a><ul>
<li><a href="#使うレジスタ">使うレジスタ</a></li>
<li><a href="#ステータスレジスタについて">ステータスレジスタについて</a></li>
</ul></li>
<li><a href="#プログラム作成">プログラム作成</a></li>
<li><a href="#配線">配線</a></li>
<li><a href="#動作確認">動作確認</a><ul>
<li><a href="#シリアルコンソールについて">シリアルコンソールについて</a></li>
</ul></li>
</ul>
</nav>
<p><a href="http://oyasirazu.blogspot.jp/2016/12/raspberry-pi-3-model-b-os-l.html">前回</a>に引き続き、今回も下記サイトを参考にベアメタルプログラミングをしていく。</p>
<p>今回は UART でのデータ送受信。</p>
<p>参考ページは下記。</p>
<ul>
<li><a href="http://d.hatena.ne.jp/cupnes/20160529/1464512231">ラズパイ3でベアメタル - その3:シリアル通信(UART)でデータ送信(割り込みなし) - へにゃぺんて@日々勉強のまとめ</a></li>
<li><a href="http://d.hatena.ne.jp/cupnes/20160529/1464512638">ラズパイ3でベアメタル - その4:シリアル通信(UART)でエコーバック(割り込みなし) - へにゃぺんて@日々勉強のまとめ</a></li>
</ul>
<h1 id="必要なハードウェアの調達">必要なハードウェアの調達</h1>
<p>UART するには通信ケーブルが必要なので調達した。</p>
<ul>
<li><a href="http://amzn.to/2hWxD4c">Amazon | Aukru Raspberry Pi 用 PL2303HX USB to TTL UART RS232 COM シリアルケーブル 変換アダプタ モジュール ブラック 1m | Aukru | シリアルケーブル通販</a></li>
</ul>
<p>ドライバは下記ページを参考にした。</p>
<ul>
<li><a href="http://ehbtj.com/info/pl2303-windows10/">Windows10でPL2303を無理やり動かす | なんでも独り言</a></li>
</ul>
<h1 id="uart-を使用するための設定">UART を使用するための設定</h1>
<p><code>config.txt</code> を作成し、 <code>enable_uart=1</code> を記述。 あとで SD カードのルートに格納する。</p>
<p>この辺は今のところ「おまじない」としておく。</p>
<p>このおまじないをすると、 GPU が Mini UART を使えるようにしてくれるようになるらしい。 そのため、我々は、 UART の初期化コードを書くことなくプログラミングできるっぽい。</p>
<h1 id="uart-を使うためのレジスタの確認">UART を使うためのレジスタの確認</h1>
<h2 id="使うレジスタ">使うレジスタ</h2>
<p><code>BCM-ARM-Peripherals.pdf</code> の 8 ページ目から UART のレジスタについて説明されている。</p>
<p>今回使うのは、 <code>AUX_MU_LSR_REG(Mini Uart Line Status)</code> と <code>AUX_MU_IO_REG(Mini Uart I/O Data)</code> 。</p>
<p>Raspberry Pi 3 なので、上位アドレスを読みかえ、それぞれ <code>0x3F215054</code>, <code>0x3F215040</code> となる。</p>
<h2 id="ステータスレジスタについて">ステータスレジスタについて</h2>
<p><code>AUX_MU_LSR</code> については、<code>BCM-ARM-Peripherals.pdf</code> の 15 ページ目に説明が書いてあるみたい。</p>
<h1 id="プログラム作成">プログラム作成</h1>
<div class="sourceCode"><pre class="sourceCode c"><code class="sourceCode c"><span class="co">/**</span>
<span class="co"> * Mini Uart 送受信に使用するレジスタ。</span>
<span class="co"> *</span>
<span class="co"> * 書き込むと送信 FIFO にプッシュ,</span>
<span class="co"> * 読み込むと 受信 FIFO からポップしてくれる素敵仕様らしい。</span>
<span class="co"> */</span>
<span class="pp">#define MU_IO (*(volatile unsigned int *)0x3F215040)</span>
<span class="co">/**</span>
<span class="co"> * Mini Uart 送信 FIFO の状態確認をするための情報が入ったレジスタ。</span>
<span class="co"> *</span>
<span class="co"> * 6 ビット目 : Transmitter idle, アイドル状態か?</span>
<span class="co"> * 1: アイドル状態, 0: ビジー状態</span>
<span class="co"> * 5 ビット目 : Transmitter empty, 1 バイト以上送信受付可能か?</span>
<span class="co"> * 1: 可能, 0: 不可能</span>
<span class="co"> * 0 ビット目 : Data ready, 1 バイト以上受信しているか?</span>
<span class="co"> * 1: 受信している, 0: 受信していない</span>
<span class="co"> */</span>
<span class="pp">#define MU_LSR (*(volatile unsigned int *)0X3F215054)</span>
<span class="pp">#define MU_LSR_TX_IDLE (1U << 6) </span><span class="co">/* Transmitter idle のビットマスク */</span>
<span class="pp">#define MU_LSR_TX_EMPTY (1U << 5) </span><span class="co">/* Transmitter empty のビットマスク */</span>
<span class="pp">#define MU_LSR_RX_RDY (1U << 0) </span><span class="co">/* Data ready のビットマスク*/</span>
<span class="dt">int</span> main(<span class="dt">void</span>) {
<span class="co">// 受信文字列格納用</span>
<span class="dt">volatile</span> <span class="dt">char</span> ch;
<span class="cf">while</span> (<span class="dv">1</span>) {
<span class="co">// 受信するまでビジーループ</span>
<span class="cf">while</span> (!(MU_LSR & MU_LSR_RX_RDY));
<span class="co">// 受信データ記録</span>
ch = (<span class="dt">char</span>)MU_IO;
<span class="co">// 送信受付可能状態になるまでビジーループ</span>
<span class="cf">while</span> (!(MU_LSR & MU_LSR_TX_IDLE) && !(MU_LSR & MU_LSR_TX_EMPTY));
<span class="co">// IO レジスタにデータ書き込み</span>
MU_IO = (<span class="dt">unsigned</span> <span class="dt">int</span>)ch;
}
<span class="cf">return</span> <span class="dv">0</span>;
}</code></pre></div>
<h1 id="配線">配線</h1>
<p>元ネタのページにも記載されているが、ピン番号はこちらで確認した。</p>
<ul>
<li><a href="http://www.hiramine.com/physicalcomputing/raspberrypi3/serial_howtoconnectpc.html">パソコンとシリアル通信する方法</a></li>
</ul>
<p>まじめな人はこれと <code>BCM2835-ARM-Peripherals.pdf</code> を見比べて、 仕様書の見方に慣れていくのが良いかと。 (多分 102 ページ目からの説明とか 176 ページ目からの説明とかが対応する記述なのだと思う。)</p>
<p>購入した変換ケーブルの説明を見ると、下記のようになっている。</p>
<pre><code>ブラックケーブル ----- GND
グリーンケーブル ----- TXD
ホワイトケーブル ----- RXD
レッドケーブル ------- VCC - 5V</code></pre>
<p>というわけで、下記感じで配線する。</p>
<pre><code>PIN 6(GND) ----- ブラック(GND)
PIN 8(GPIO14) -- ホワイト(RXD)
PIN 10(GPIO15) -- グリーン(TXD)</code></pre>
<h1 id="動作確認">動作確認</h1>
<ol type="1">
<li>SD カードに <code>bootcode.bin</code>, <code>start.elf</code>, <code>config.txt</code>, <code>kernel8.img</code> をコピーして、Raspberry Pi に挿す</li>
<li>PC に変換ケーブルを挿す</li>
<li>シリアルコンソールを起動し、 Com の設定を行う(後述)</li>
<li>Raspberry Pi に電源供給</li>
<li>入力文字がエコーバックされれば OK</li>
</ol>
<h2 id="シリアルコンソールについて">シリアルコンソールについて</h2>
<p>今回は、 RLogin を使用することとした。 sixel 関係で使っていて、使い慣れていたので。</p>
<ul>
<li><a href="http://nanno.dip.jp/softlib/man/rlogin/">rlogin/telnet/ssh(クライアント)ターミナルソフト</a></li>
</ul>
<p>設定は、下記のようにすれば OK のはず。</p>
<ul>
<li>ビット/秒 : 115200</li>
<li>データビット : 8</li>
<li>パリティ : なし</li>
<li>ストップビット : 1</li>
<li>フロー制御 : ハードウェア</li>
</ul>
<a href="https://3.bp.blogspot.com/-oEB_yCZHIec/WF1LGymUWBI/AAAAAAAAGSY/kt5RQKzFPfArfYy03YNGXKR38o9A5YwAACLcB/s1600/rlogin.png" imageanchor="1" ><img border="0" src="https://3.bp.blogspot.com/-oEB_yCZHIec/WF1LGymUWBI/AAAAAAAAGSY/kt5RQKzFPfArfYy03YNGXKR38o9A5YwAACLcB/s320/rlogin.png" width="320" height="280" /></a>
<p>以上。</p>
mikoto2000http://www.blogger.com/profile/08084647632974947669noreply@blogger.com0tag:blogger.com,1999:blog-37637535.post-37949400788179523232016-12-19T01:45:00.000+09:002016-12-19T01:45:55.298+09:00Raspberry Pi 3 Model B+ で、 OS 無し L チカした<nav id="TOC">
<ul>
<li><a href="#参考資料を探す">参考資料を探す</a></li>
<li><a href="#必要なハードウェア類の調達">必要なハードウェア類の調達</a></li>
<li><a href="#必要なソフトウェア類の調達">必要なソフトウェア類の調達</a></li>
<li><a href="#ビルド環境構築">ビルド環境構築</a></li>
<li><a href="#l-チカプログラムの作成">L チカプログラムの作成</a><ul>
<li><a href="#ファイル作成">ファイル作成</a><ul>
<li><a href="#start.s">start.S</a></li>
<li><a href="#main.c">main.c</a></li>
<li><a href="#makefile">Makefile</a></li>
</ul></li>
<li><a href="#ビルド">ビルド</a></li>
</ul></li>
<li><a href="#raspberry-pi-の準備">Raspberry Pi の準備</a><ul>
<li><a href="#ファイルの配置">ファイルの配置</a></li>
<li><a href="#配線">配線</a></li>
<li><a href="#実行">実行</a></li>
</ul></li>
<li><a href="#参考資料">参考資料</a></li>
</ul>
</nav>
<p>Raspberry Pi でベアメタルプログラミンしたかったので、 いろいろ調べた作業記録を残す。</p>
<h1 id="参考資料を探す">参考資料を探す</h1>
<p>とりあえず、自分のレベルに合っていて、 かつ、わかりやすそうなサイトを探す。</p>
<p>...で、見つかったのがこのサイト。</p>
<ul>
<li><a href="http://d.hatena.ne.jp/cupnes/20160529/1464513206">Raspberry Pi 3で64bitベアメタル(bare metal)プログラミング - へにゃぺんて@日々勉強のまとめ</a></li>
</ul>
<p>基本ここを参考に環境構築とかしていくこととする。</p>
<h1 id="必要なハードウェア類の調達">必要なハードウェア類の調達</h1>
<p>L チカに必要なものを買い集める。</p>
<ul>
<li>Raspberry Pi 3 Model B+</li>
<li>micro SD カード 32GB(1 GB でも十分)</li>
<li>ブレッドボード</li>
<li><a href="http://www.marutsu.co.jp/pc/i/69683/">ブレッドボード用JPワイヤー 200mm×10本 オス-メス 20PS-MIX Linkman製|マルツオンライン</a></li>
<li><a href="http://www.marutsu.co.jp/pc/i/13392/">1/4W金属皮膜抵抗 スモールサイズ 330Ω 橙橙黒黒茶 MFS1/4CC3300F KOA製|マルツオンライン</a></li>
<li><a href="http://www.marutsu.co.jp/pc/i/68263/">スモークLED(3mm・白・3.3V・20mA・1000mcd(min)) LSLED-W301 Linkman製|マルツオンライン</a></li>
</ul>
<h1 id="必要なソフトウェア類の調達">必要なソフトウェア類の調達</h1>
<ul>
<li>Raspberry Pi ファームウェア
<ul>
<li><a href="https://github.com/raspberrypi/firmware/issues/579#issuecomment-205525205">64-bit boot stub? · Issue #579 · raspberrypi/firmware</a></li>
<li><code>https://dl.dropboxusercontent.com/u/3669512/temp/firmware_armstub.zip</code> をダウンロード</li>
</ul></li>
<li>Linaro toolchain
<ul>
<li><a href="https://releases.linaro.org/components/toolchain/binaries/latest/aarch64-linux-gnu/">Linaro Releases</a></li>
<li><code>gcc-linaro-6.2.1-2016.11-i686-mingw32_aarch64-linux-gnu.tar.xz</code> をダウンロード。</li>
</ul></li>
</ul>
<h1 id="ビルド環境構築">ビルド環境構築</h1>
<p>ダウンロードした <code>gcc-linaro-6.2.1-2016.11-i686-mingw32_aarch64-linux-gnu.tar.xz</code> を適当な場所に展開し、 <code>bin</code> ディレクトリにパスを通す。</p>
<h1 id="l-チカプログラムの作成">L チカプログラムの作成</h1>
<p>プログラムを作ってビルドする。</p>
<h2 id="ファイル作成">ファイル作成</h2>
<p>こんな配置でファイルを作成する。</p>
<pre><code>led_blink_GPIO16
├── main.c
├── Makefile
└── start.S</code></pre>
<h3 id="start.s">start.S</h3>
<div class="sourceCode"><pre class="sourceCode s"><code class="sourceCode gnuassembler"><span class="co">/* 現時点ではおまじないスタート地点を調整しているはず */</span>
mov sp, <span class="co">#0x80000</span>
bl main</code></pre></div>
<h3 id="main.c">main.c</h3>
<div class="sourceCode"><pre class="sourceCode c"><code class="sourceCode c"><span class="pp">#define GPFSEL1 0x3F200004 </span><span class="co">/* GPIO のピン設定をするためのレジスタ */</span>
<span class="pp">#define GPSET0 0x3F20001C </span><span class="co">/* GPIO を HIGH にするためのレジスタ */</span>
<span class="pp">#define GPCLR0 0x3F200028 </span><span class="co">/* GPIO を LOW にするためのレジスタ */</span>
<span class="kw">typedef</span> <span class="dt">unsigned</span> <span class="dt">char</span> bool;
<span class="pp">#define TRUE 1</span>
<span class="pp">#define FALSE 0</span>
<span class="pp">#define WAIT_COUNT 3000000</span>
<span class="co">/*</span>
<span class="co"> * @fn wait_count だけビジーウェイトする</span>
<span class="co"> * @param (wait_count) このカウント数だけビジーウェイトする</span>
<span class="co"> */</span>
<span class="dt">void</span> busy_wait(<span class="dt">int</span> wait_count);
<span class="co">/*</span>
<span class="co"> * @fn L チカする</span>
<span class="co"> */</span>
<span class="dt">int</span> main(<span class="dt">void</span>) {
<span class="co">// GPIO 出力に設定。</span>
<span class="co">// Peripheral specification の</span>
<span class="co">// 92 ページ、Field Name が FSEL16 の行の</span>
<span class="co">// Bit(s) を見ると、18 から 20 ビット目までに</span>
<span class="co">// 0x001 を設定すればよいことがわかる感じ。</span>
*(<span class="dt">volatile</span> <span class="dt">unsigned</span> <span class="dt">int</span>*)GPFSEL1 = (<span class="dv">1</span> << (<span class="dv">18</span>));
<span class="co">// セットして待つ、クリアして待つ、を繰り返す。</span>
<span class="cf">while</span> (<span class="dv">1</span>) {
*(<span class="dt">volatile</span> <span class="dt">unsigned</span> <span class="dt">int</span>*)GPSET0 = (<span class="dv">1</span> << <span class="dv">16</span>);
busy_wait(WAIT_COUNT);
*(<span class="dt">volatile</span> <span class="dt">unsigned</span> <span class="dt">int</span>*)GPCLR0 = (<span class="dv">1</span> << <span class="dv">16</span>);
busy_wait(WAIT_COUNT);
}
<span class="cf">return</span> <span class="dv">0</span>;
}
<span class="dt">void</span> busy_wait(<span class="dt">int</span> wait_count) {
<span class="dt">volatile</span> <span class="dt">unsigned</span> <span class="dt">int</span> i;
<span class="cf">for</span> (i = <span class="dv">0</span>; i < WAIT_COUNT; i++);
}</code></pre></div>
<h3 id="makefile">Makefile</h3>
<div class="sourceCode"><pre class="sourceCode makefile"><code class="sourceCode makefile"><span class="dt">CC</span><span class="ch">=</span><span class="st">aarch64-linux-gnu-gcc</span>
<span class="dt">LD</span><span class="ch">=</span><span class="st">aarch64-linux-gnu-ld</span>
<span class="dt">AS</span><span class="ch">=</span><span class="st">aarch64-linux-gnu-as</span>
<span class="dt">OBJCOPY</span><span class="ch">=</span><span class="st">aarch64-linux-gnu-objcopy</span>
<span class="dt">OBJECTS</span><span class="ch">=</span><span class="st">start.o main.o</span>
<span class="dv">all:</span><span class="dt"> build link objcopy</span>
<span class="dv">objcopy:</span><span class="dt"> kernel8.img</span>
<span class="dv">kernel8.img:</span><span class="dt"> kernel8.elf</span>
<span class="ch">$(</span><span class="dt">OBJCOPY</span><span class="ch">)</span> -O binary kernel8.elf kernel8.img
<span class="dv">link:</span><span class="dt"> kernel8.elf</span>
<span class="dv">kernel8.elf:</span><span class="dt"> </span><span class="ch">$(</span><span class="dt">OBJECTS</span><span class="ch">)</span>
<span class="ch">$(</span><span class="dt">LD</span><span class="ch">)</span> -Ttext 0x80000 -o kernel8.elf <span class="ch">$(</span><span class="dt">OBJECTS</span><span class="ch">)</span>
<span class="dv">build:</span><span class="dt"> </span><span class="ch">$(</span><span class="dt">OBJECTS</span><span class="ch">)</span>
<span class="dv">start.o:</span><span class="dt"> start.S</span>
<span class="ch">$(</span><span class="dt">AS</span><span class="ch">)</span> -o start.o start.S
<span class="dv">main.o:</span><span class="dt"> main.c</span>
<span class="ch">$(</span><span class="dt">CC</span><span class="ch">)</span> -c -o main.o main.c
<span class="dv">clean:</span>
rm *.o *.elf *.img</code></pre></div>
<h2 id="ビルド">ビルド</h2>
<p><code>make</code> して <code>kernel8.img</code> を作成する。</p>
<div class="sourceCode"><pre class="sourceCode sh"><code class="sourceCode bash">$ <span class="fu">make</span>
<span class="ex">aarch64-linux-gnu-as</span> -o start.o start.S
<span class="ex">aarch64-linux-gnu-gcc</span> -c -o main.o main.c
<span class="ex">aarch64-linux-gnu-ld</span> -Ttext 0x80000 -o kernel8.elf start.o main.o
<span class="ex">C</span>:\Users\mikoto\app\gcc-linaro-6.2.1-2016.11-i686-mingw32_aarch64-linux-gnu\bin\aarch64-linux-gnu-ld.exe: warning: cannot find entry symbol _start<span class="kw">;</span> <span class="ex">defaulting</span> to 0000000000080000
<span class="ex">aarch64-linux-gnu-objcopy</span> -O binary kernel8.elf kernel8.img</code></pre></div>
<p>リンカスクリプトを作っていないため、 警告が出ているけど、今回動かす分には問題ない。</p>
<h1 id="raspberry-pi-の準備">Raspberry Pi の準備</h1>
<h2 id="ファイルの配置">ファイルの配置</h2>
<ol type="1">
<li>ダウンロードした <code>firmware_armstub.zip</code> を展開し、<code>bootcode.bin</code>, <code>start.elf</code> を SD カードのルートにコピーする</li>
<li>ビルドした、 <code>kernel8.img</code> を SD カードのルートにコピーする</li>
</ol>
<p>最終的に、 SD カードに下記感じでファイルを配置する。</p>
<pre><code>SD カード
├── bootcode.bin
├── start.elf
└── kernel8.img</code></pre>
<h2 id="配線">配線</h2>
<p>下記感じで配線する。</p>
<pre><code>PIN 36(GPIO16) ─ 抵抗 ─ LED
PIN 6(GND) ────────┘</code></pre>
<h2 id="実行">実行</h2>
<ol type="1">
<li>Raspberry Pi に SD カードを入れる</li>
<li>Raspberry Pi に電源供給</li>
</ol>
<a href="https://2.bp.blogspot.com/-S22nKQSw4ig/WFa8r9FfQTI/AAAAAAAAGQ0/82BQ2bTGyKQYMgwfyruu6LmM6A603Gb3gCLcB/s1600/wiring.jpg" imageanchor="1" ><img border="0" src="https://2.bp.blogspot.com/-S22nKQSw4ig/WFa8r9FfQTI/AAAAAAAAGQ0/82BQ2bTGyKQYMgwfyruu6LmM6A603Gb3gCLcB/s320/wiring.jpg" width="320" height="195" /></a>
<p>以上。</p>
<h1 id="参考資料">参考資料</h1>
<p>この辺を見て試したはず...。ぬけもれあるかも。</p>
<ul>
<li><a href="http://d.hatena.ne.jp/cupnes/20160529/1464513206">Raspberry Pi 3で64bitベアメタル(bare metal)プログラミング - へにゃぺんて@日々勉強のまとめ</a></li>
<li><a href="http://blog.techlab-xe.net/archives/3315">ARMのプログラムを作成してデバッグする 第2回</a></li>
<li><a href="http://animod.jp/contents/2016/05/08/raspberry-pi-cross-compile-windows-eclipse/">Raspberry Piのクロスコンパイル環境をWindowsパソコン上のEclipceで構築する</a> <a href="https://releases.linaro.org/components/toolchain/binaries/latest/aarch64-linux-gnu/">Linaro Releases</a></li>
<li><a href="https://github.com/raspberrypi/firmware/issues/579#issuecomment-205525205">64-bit boot stub? · Issue #579 · raspberrypi/firmware</a></li>
<li><a href="http://qiita.com/moutend/items/534d597cf5c867273319">Lチカ Raspberry PiでC言語からSoCのレジスタを操作してGPIOを制御する - Qiita</a></li>
<li><a href="http://elinux.org/RPi_Low-level_peripherals">RPi Low-level peripherals - eLinux.org</a></li>
<li><a href="https://www.raspberrypi.org/documentation/hardware/raspberrypi/bcm2835/README.md">BCM2835 - Raspberry Pi Documentation</a></li>
</ul>
mikoto2000http://www.blogger.com/profile/08084647632974947669noreply@blogger.com0tag:blogger.com,1999:blog-37637535.post-3066553684736663332016-12-13T22:04:00.001+09:002016-12-13T22:04:31.724+09:00vim のアウトライン表示プラグイン outline.vim を作った<nav id="TOC">
<ul>
<li><a href="#目的">目的</a></li>
<li><a href="#何を考えたか">何を考えたか?</a></li>
<li><a href="#アウトライン抽出">アウトライン抽出</a></li>
<li><a href="#対象にジャンプ">対象にジャンプ</a></li>
</ul>
</nav>
<p>c 言語の関数一覧が欲しかったので作ったので、 そのあたりの作業について備忘メモしておく。</p>
<p>名前負けはご愛敬。</p>
<h1 id="目的">目的</h1>
<p>c 言語の関数一覧が欲しかった。</p>
<h1 id="何を考えたか">何を考えたか?</h1>
<p>c 言語の関数一覧が欲しいけど、 自分で抽出処理はかけない。</p>
<p>そんなわけで、方針としては</p>
<ul>
<li>関数抽出は ctags を使う</li>
<li>ctags で一覧を抜き出してからは <a href="https://github.com/mikoto2000/buffer_selector.vim/blob/master/autoload/buffer_selector.vim">mikoto2000/buffer_selector.vim</a> と同じ感じで</li>
</ul>
<p>以下、各要素について書いていく。</p>
<h1 id="アウトライン抽出">アウトライン抽出</h1>
<p>アウトライン抽出は ctags を使う。</p>
<div class="sourceCode"><pre class="sourceCode sh"><code class="sourceCode bash"><span class="ex">ctags</span> -x FILE_NAME --sort=no</code></pre></div>
<p>これで member, struct, function のリストが表示される。 ここから member を取り除き、awk で無用な列を削除する。</p>
<div class="sourceCode"><pre class="sourceCode sh"><code class="sourceCode bash"><span class="ex">ctags</span> -x FILE_PATH --sort=no <span class="kw">|</span> <span class="fu">grep</span> -v member <span class="kw">|</span> <span class="fu">awk</span> <span class="st">'{$1=\"\";$2=\"\";$3=\"\" + $3;$4=\"\";print}'</span></code></pre></div>
<p>これを、vim のバッファに読み込ませるには、 <code>read!</code> コマンドを使う。</p>
<pre class="vim"><code>silent execute "read !ctags -x " . file_path . " --sort=no | grep -v member | awk '{$1=\"\";$2=\"\";$3=\"\" + $3;$4=\"\";print}'"</code></pre>
<p>これで、 ctags の実行結果を成形したものをバッファに読み込むことができる。</p>
<h1 id="対象にジャンプ">対象にジャンプ</h1>
<p>ctags を成形した結果は、各行が <code>行番号 関数名</code> となっているので、 <code>split</code> してリストの 0 番目をとってきて、元のバッファに戻って <code>[count]gg</code> すれば OK。</p>
<p>で、できたのが下記な感じ。</p>
<div class="separator" style="clear: both; text-align: center;"><a href="https://4.bp.blogspot.com/-5bdbEy5CAEg/WE_xNO1wX_I/AAAAAAAAGO4/KEuL7PhWHP83HCdNLDkDDZSneKSSngrkgCLcB/s1600/outline.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://4.bp.blogspot.com/-5bdbEy5CAEg/WE_xNO1wX_I/AAAAAAAAGO4/KEuL7PhWHP83HCdNLDkDDZSneKSSngrkgCLcB/s400/outline.gif" width="353" height="400" /></a></div>
<p>以上。</p>
mikoto2000http://www.blogger.com/profile/08084647632974947669noreply@blogger.com0tag:blogger.com,1999:blog-37637535.post-9317841806536025302016-12-04T20:10:00.000+09:002016-12-04T20:10:21.238+09:00ファイル検索プラグイン file_selector.vim を作った<nav id="TOC">
<ul>
<li><a href="#目的">目的</a></li>
<li><a href="#何を考えたか">何を考えたか?</a></li>
<li><a href="#構成要素の実現方法を考える">構成要素の実現方法を考える</a><ul>
<li><a href="#ファイル一覧取得">ファイル一覧取得</a></li>
<li><a href="#入力文字列取得">入力文字列取得</a></li>
<li><a href="#入力文字列を使った絞り込み処理-バッファへの反映">入力文字列を使った絞り込み処理 + バッファへの反映</a></li>
<li><a href="#文字列のハンドリング">文字列のハンドリング</a></li>
</ul></li>
<li><a href="#所感">所感</a></li>
</ul>
</nav>
<p>ファイル一覧を絞り込んで選択するやつを作ったので、 そのあたりの作業について備忘メモしておく。</p>
<h1 id="目的">目的</h1>
<p>netrw でファイルを開くのが面倒。 プロジェクト内のファイル一覧から、文字列打ち込んで絞り込みつつファイル選択したい。 この欲望を満たすプラグインを作る。</p>
<h1 id="何を考えたか">何を考えたか?</h1>
<p>ファイル絞り込みの構成要素としては、</p>
<ol type="1">
<li>ファイル一覧取得</li>
<li>入力文字列取得</li>
<li>入力文字列を使った絞り込み処理</li>
<li>バッファへの反映</li>
</ol>
<p>みたいなのがあると思っていて、 2 と 4 のイメージがついてなくって途方に暮れていたところ、 <span class="citation" data-cites="pink_bangbi">@pink_bangbi</span> さんにつぶやきを拾っていただいた。</p>
<blockquote class="twitter-tweet" data-lang="ja">
<p lang="ja" dir="ltr">
vim で絞り込み機能を実装する方法気になる。入門としてどのプラグインの実装を見るのがよさげだろうか...
</p>
— 大雪 命 (<span class="citation" data-cites="mikoto2000">@mikoto2000</span>) <a href="https://twitter.com/mikoto2000/status/804283754772447232">2016年12月1日</a>
</blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>
<p>そんなわけで、方針としては</p>
<ul>
<li>文字列取得は <code>InsertCharPre</code> から一文字ずつ取得</li>
<li>バッファは全部書き直し</li>
</ul>
<p>の方針で考えた。</p>
<h1 id="構成要素の実現方法を考える">構成要素の実現方法を考える</h1>
<p>それぞれ考えていく。</p>
<h2 id="ファイル一覧取得">ファイル一覧取得</h2>
<p>単純に <code>glob("./**/*")</code> とする。</p>
<h2 id="入力文字列取得">入力文字列取得</h2>
<p><code>autocmd</code> で <code>InsertCharPre</code> を捕まえる。</p>
<h2 id="入力文字列を使った絞り込み処理-バッファへの反映">入力文字列を使った絞り込み処理 + バッファへの反映</h2>
<p><code>v/文字列/d</code> で、文字列が含まれていない行を削除できるので、</p>
<ol type="1">
<li>バッファクリア</li>
<li><code>glob("./**/*")</code> で取得した一覧をバッファに流し込む</li>
<li><code>v/文字列/d</code> で関係ない行を削除</li>
</ol>
<p>を、文字列入力・削除が行われるたびに実行する。</p>
<h2 id="文字列のハンドリング">文字列のハンドリング</h2>
<p>「<code>InsertCharPre</code> で取得するのはいいけど、それどう管理するの?」を考える。</p>
<ul>
<li>ファイル一覧
<ul>
<li>ファイル一覧はスクリプト変数</li>
<li>ファイル絞り込み用バッファを開くときに、``glob("./**/*") する</li>
</ul></li>
<li>絞り込み文字列
<ul>
<li>絞り込み文字列はスクリプト変数</li>
<li>ファイル絞り込み用バッファを開くときに、空文字で初期化する</li>
<li><code>InsertCharPre</code> で取得した文字列を絞り込み文字列に追加する</li>
<li><code><BS></code> 押下で絞り込み文字列の末尾の文字を消す</li>
</ul></li>
</ul>
<p>file_selector をクラスとして考えると、下図のような感じ。</p>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/--IG1Aphosxk/WEPpXLoQY9I/AAAAAAAAGOE/z-Z25M4vdaQcAyITHKn0NOxjwF24Ua58ACLcB/s1600/file_selector.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://1.bp.blogspot.com/--IG1Aphosxk/WEPpXLoQY9I/AAAAAAAAGOE/z-Z25M4vdaQcAyITHKn0NOxjwF24Ua58ACLcB/s1600/file_selector.png" /></a>
</div>
<ul>
<li><code>OpenFileSelector()</code> を呼ぶたびに <code>s:pattern</code> と <code>s:all_file_list</code> を初期化する。</li>
<li>文字入力されるたび( <code>InsertCharPre</code> が呼ばれるたび) <code>AddChar()</code> で <code>s:pattern</code> 更新
<ul>
<li><code>InsertCharPre</code> 内でバッファの更新ができないようなので、バッファの更新は <code>TextChangedI</code> で行う</li>
</ul></li>
<li><code><BS></code> が押されたら、 <code>DelChar()</code> -> <code>UpdateBuffer()</code> する。</li>
</ul>
<p>上記のような方針で実装して、下記のような挙動が実現できた。</p>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://3.bp.blogspot.com/-NC7hkX8DdSY/WEP1jDEeoKI/AAAAAAAAGOY/lxpzasxDFLgB_jtAaGIoD6Z7t9XL7Ho-QCLcB/s1600/file_selector.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://3.bp.blogspot.com/-NC7hkX8DdSY/WEP1jDEeoKI/AAAAAAAAGOY/lxpzasxDFLgB_jtAaGIoD6Z7t9XL7Ho-QCLcB/s320/file_selector.gif" width="299" height="320" /></a>
</div>
<h1 id="所感">所感</h1>
<p>「OpenFileSelector() を呼び出したバッファでファイルを開きたい」とか、 すでに気に入らないところがあるが、とりあえず絞り込み UI の習作として使用・改良していきたい。</p>
<p>リポジトリはこちら。</p>
<ul>
<li><a href="https://github.com/mikoto2000/file_selector.vim">mikoto2000/file_selector.vim: シンプルなファイルセレクター</a></li>
</ul>
<p>以上。</p>
mikoto2000http://www.blogger.com/profile/08084647632974947669noreply@blogger.com0tag:blogger.com,1999:blog-37637535.post-68059296946574913302016-11-28T22:59:00.000+09:002016-11-28T22:59:32.727+09:00vim-themis, vital-power-assert を使って vim plugin の単体テストを書いてみた<nav id="TOC">
<ul>
<li><a href="#手順概要">手順概要</a></li>
<li><a href="#vim-themis-導入">1. <code>vim-themis</code> 導入</a></li>
<li><a href="#themisrc-を作成する">2. <code>.themisrc</code> を作成する</a></li>
<li><a href="#テストコードを書く">3. テストコードを書く</a></li>
<li><a href="#テストを実行する">4. テストを実行する</a></li>
<li><a href="#実際にやってみたプロジェクトはこちら">実際にやってみたプロジェクトはこちら</a></li>
</ul>
</nav>
<p>vim-themis, vital-power-assert を使って単体テストのコードを書いたので、ここに作業を記録する。</p>
<h1 id="手順概要">手順概要</h1>
<ol type="1">
<li>必要なパッケージを導入</li>
<li><code>.themisrc</code> を作成する</li>
<li>テストコードを書く</li>
<li>テストを実行する</li>
</ol>
<p>以下、各手順を説明していく。</p>
<h1 id="vim-themis-導入">1. <code>vim-themis</code> 導入</h1>
<p>vim 標準のパッケージマネージャを使っているので、下記構成で <code>git submodule add</code> した。</p>
<div class="sourceCode"><pre class="sourceCode sh"><code class="sourceCode bash"><span class="ex">.vim</span>
└── <span class="ex">pack</span>
└── <span class="bu">test</span>
└── <span class="ex">opt</span>
├── <span class="ex">vim-themis</span>
├── <span class="ex">vital.vim</span>
├── <span class="ex">vital-power-assert</span>
├── <span class="ex">vital-safe-string</span>
└── <span class="ex">vital-vimlcompiler</span></code></pre></div>
<p>注意点 :</p>
<ul>
<li><code>vital-power-assert</code> は、 <code>vital.vim</code>, <code>vital-vimlcompiler</code>, <code>vital-safe-string</code> に依存しているので忘れず導入する</li>
<li>テスト時しか使用しないので、 <code>opt</code> に入れる</li>
</ul>
<h1 id="themisrc-を作成する">2. <code>.themisrc</code> を作成する</h1>
<p><a href="https://github.com/haya14busa/vital-power-assert#themisrc">vital-power-assert の README, '.themisrc'</a> を参照しつつ <code>.themisrc</code> を作成。</p>
<pre class="vim"><code>packadd! vital.vim
packadd! vital-vimlcompiler
packadd! vital-safe-string
packadd! vital-power-assert
"
let g:__vital_power_assert_config = {
\ '__debug__': 1,
\ '__pseudo_throw__': 0
\ }</code></pre>
<p>注意点 :</p>
<ul>
<li>必要なパッケージを <code>packadd!</code> で追加</li>
<li>themis へのランタイムパス追加は必要なかった。(<code>packadd!</code> で追加されるのかな?)</li>
</ul>
<h1 id="テストコードを書く">3. テストコードを書く</h1>
<p>テストコードは、プラグインディレクトリ直下に <code>test</code> ディレクトリを作ってその中に書いていく。</p>
<p><a href="https://github.com/haya14busa/vital-power-assert#testexamplevimspec">vital-power-assert の README, 'test/Example.vimspec'</a> をマネして <a href="https://github.com/thinca/vim-themis/blob/master/doc/themis.txt#L455">Vimspeck-style</a> で記述した。</p>
<pre class="vimspec"><code>Describe Test for buffer_selector
Before all
let V = vital#of('vital')
let PowerAssert = V.import('Vim.PowerAssert')
let s:assert = PowerAssert.assert
End
It test_GetBufNo
let buffers_buffer = ' 1 h "[無名]" 行 0'
\ . "\n" . ' 9 h "[無名]" 行 0'
\ . "\n" . ' 10 h "[無名]" 行 0'
\ . "\n" . '119 %a "[無名]" 行 1'
put!=buffers_buffer
call cursor(1, 1)
let bufno = buffer_selector#GetBufNo()
execute s:assert('bufno is# "1"')
call cursor(2, 1)
let bufno = buffer_selector#GetBufNo()
execute s:assert('bufno is# "9"')
call cursor(3, 1)
let bufno = buffer_selector#GetBufNo()
execute s:assert('bufno is# "10"')
call cursor(4, 1)
let bufno = buffer_selector#GetBufNo()
execute s:assert('bufno is# "119"')
End
End</code></pre>
<h1 id="テストを実行する">4. テストを実行する</h1>
<p>ターミナルでプラグインのルートディレクトリに移動して、themis を実行すると、 <code>vimspec</code> ファイルを探して実行してくれる。</p>
<div class="sourceCode"><pre class="sourceCode sh"><code class="sourceCode bash"> <span class="ex">~/.vim/pack/test/opt/vim-themis/bin/themis</span> --reporter spec
<span class="ex">Test</span> for buffer_selector
[✓] <span class="ex">test_GetBufNo</span>
<span class="ex">tests</span> 1
<span class="ex">passes</span> 1</code></pre></div>
<p>fail の場合は下記のようになる。</p>
<div class="sourceCode"><pre class="sourceCode sh"><code class="sourceCode bash"><span class="ex">~/.vim/pack/test/opt/vim-themis/bin/themis</span> --reporter spec
<span class="ex">Test</span> for buffer_selector
[✖] <span class="ex">test_GetBufNo</span>
<span class="kw">function</span> <span class="ex">89</span>() <span class="ex">abort</span> dict Line:22 ()
<span class="ex">vital</span>: PowerAssert:
<span class="ex">bufno</span> is# <span class="st">"120"</span>
<span class="kw">|</span> <span class="kw">|</span>
<span class="st">'119'</span> <span class="ex">0</span>
<span class="ex">tests</span> 1
<span class="ex">passes</span> 0
<span class="ex">fails</span> 1</code></pre></div>
<h1 id="実際にやってみたプロジェクトはこちら">実際にやってみたプロジェクトはこちら</h1>
<p><a href="https://github.com/mikoto2000/buffer_selector.vim/commit/18940c90df4888c50f55c2098b3e66997ffaece0">buffer_selector.vim - Added test code.</a></p>
<p>「どうすればテストしやすいか」と、「どうやってテストするか」はまだまだ勉強が必要だ...。</p>
<p>以上。</p>
mikoto2000http://www.blogger.com/profile/08084647632974947669noreply@blogger.com0tag:blogger.com,1999:blog-37637535.post-14545022523573836062016-11-21T01:26:00.000+09:002016-11-21T01:26:42.832+09:00シンプルバッファーセレクタープラグイン buffer_selector.vim を作成した<nav id="TOC">
<ul>
<li><a href="#目的と経緯">目的と経緯</a></li>
<li><a href="#手順概要">手順概要</a></li>
<li><a href="#とりあえず書く">1. とりあえず書く</a></li>
<li><a href="#関数化してそれっぽい場所に移動">2. 関数化して、それっぽい場所に移動</a></li>
<li><a href="#help-ドキュメントを書く">3. help ドキュメントを書く</a></li>
<li><a href="#plugin-として切り出す">4. plugin として切り出す</a></li>
<li><a href="#所感">所感</a></li>
</ul>
</nav>
<p>シンプルバッファーセレクタープラグイン <code>buffer_selector.vim</code> を作成した。</p>
<p><a href="https://github.com/mikoto2000/buffer_selector.vim">mikoto2000/buffer_selector.vim: シンプルで簡単に使えるバッファーセレクター</a></p>
<h1 id="目的と経緯">目的と経緯</h1>
<p>目的のバッファーへの切り替えをもっと簡単に行いたい。</p>
<p>今までは、<code>:buffers</code> してバッファー番号を確認した後 <code>:buffer number</code> でバッファを切り替えていた。 これが意外とつらい。</p>
<ol type="1">
<li><code>:Unite buffer</code> みたいに選びたいけど、Unite ヘビーなので入れたくない</li>
<li><code>bufferlist.vim</code> を試したけど、縦分割が気に入らない</li>
<li>勉強がてら作ってみようか</li>
</ol>
<p>という感じ。</p>
<p>これ書きながら思ったのが、バッファーセレクターじゃなくて、 ファイルセレクターあたりも視野に入れてプラグイン探したほうが良かった気がする。</p>
<h1 id="手順概要">手順概要</h1>
<p>大体こんな流れで実装していった。</p>
<ol type="1">
<li>とりあえず書く</li>
<li>関数化して、それっぽい場所に移動</li>
<li>help ドキュメントを書く</li>
<li>plugin として切り出す</li>
</ol>
<p>以下、各手順について説明していく。</p>
<h1 id="とりあえず書く">1. とりあえず書く</h1>
<p>適当なファイルにスクリプトを書いて、都度都度 <code>source %</code> で実行していった。</p>
<p>最初は、こんな感じのスクリプトを書いてバッファ一覧がとれるか確認した。</p>
<pre class="vim"><code>""" 変数 buffer_list に ``ls`` の結果を格納
let buffer_list=""
redir => buffer_list
silent ls
redir END
""" 新しいバッファを作成
new __BUFFERLIST__
""" __BUFFERLIST__ に ``ls`` の結果を表示
put!=buffer_list</code></pre>
<p>その後、インクリメンタルに <code>source %</code> しながら実装していき、最終的にできたのがこれ。</p>
<pre><code>""" 変数 buffer_list に ``:ls`` の結果を格納
let buffer_list=""
redir => buffer_list
silent ls
redir END
""" 新しいバッファを作成
if bufexists(bufnr('__BUFFERLIST__'))
bwipeout! __BUFFERLIST__
endif
silent bo new __BUFFERLIST__
""" __BUFFERLIST__ に ``:ls`` の結果を表示
silent put!=buffer_list
""" 先頭と末尾が空行になるのでそれを削除
normal G"_dd
normal gg"_dd
""" ウィンドウサイズ調整
let current_win_height=winheight('%')
let line_num=line('$')
if current_win_height - line_num > 0
execute "normal z" . line_num . "\<Return>"
endif
""" バッファリスト用バッファの設定
setlocal noshowcmd
setlocal noswapfile
setlocal buftype=nofile
setlocal bufhidden=delete
setlocal nobuflisted
setlocal nomodifiable
setlocal nowrap
setlocal nonumber
""" 選択したバッファに移動
map <buffer> <Return> ^viwy:bwipeout!<Return>:buffer <C-r>"<Return>
map <buffer> q :bwipeout!<Return></code></pre>
<h1 id="関数化してそれっぽい場所に移動">2. 関数化して、それっぽい場所に移動</h1>
<p>「1.」の段階で、 <code>source %</code> すれば所望の動きになることが確認できているので、 あとは</p>
<ol type="1">
<li>関数化して <code>autoload</code> に突っ込む</li>
<li><code>.vimrc</code> で関数を呼び出すマッピングを定義する</li>
</ol>
<p>をすれば OK。</p>
<p>具体的に、どこにどう配置したかは、 コミット見るのが早そうなのでリンク張る。</p>
<p><a href="https://github.com/mikoto2000/dotvim/commit/5d0e594997fddd9f2a86f7c033d9bd01684de3ae">Added simple buffer select process</a></p>
<h1 id="help-ドキュメントを書く">3. help ドキュメントを書く</h1>
<p><a href="http://cohama.hateblo.jp/entry/20130403/1364999731">はじめてプラグインを作ってみた。それとhelpの書き方など - 反省はしても後悔はしない</a> を参考に、 jax ファイルを作成。</p>
<p>これもコミットへのリンクのほうがわかりやすいか。</p>
<p><a href="https://github.com/mikoto2000/dotvim/commit/cdc2dcb6429e6a1ad01ea27acbdf8bdd2a1fb148">Added document of 'buffer_selector'.</a></p>
<h1 id="plugin-として切り出す">4. plugin として切り出す</h1>
<p>新しいリポジトリを作って作成したファイルを追加。</p>
<p><a href="https://github.com/mikoto2000/buffer_selector.vim">mikoto2000/buffer_selector.vim: シンプルで簡単に使えるバッファーセレクター</a></p>
<p>その後、もともと作っていたソースを削除し、代わりに、新しく作ったリポジトリをパッケージに登録。</p>
<p><a href="https://github.com/mikoto2000/dotvim/commit/2d80f599d1f6996bd6714d8a6ba26e458c2b276b">Carve out 'buffer_selector.vim' to external plugin.</a></p>
<p>プラグイン作成作業は以上。</p>
<h1 id="所感">所感</h1>
<p>だらだら作っていったけど、 プラグイン管理の仕組みを使ってすぐインストールできる vim プラグインが作れたからとりあえず満足した。</p>
<p>以上。</p>
mikoto2000http://www.blogger.com/profile/08084647632974947669noreply@blogger.com0tag:blogger.com,1999:blog-37637535.post-79557986582426594272016-11-15T01:12:00.000+09:002016-11-15T01:12:57.193+09:00Sphinx によるドキュメント執筆管理環境の検討<nav id="TOC">
<ul>
<li><a href="#管理方法">管理方法</a><ul>
<li><a href="#メリット">メリット</a></li>
<li><a href="#弱点">弱点</a></li>
<li><a href="#restructuredtext-執筆のコツ">reStructuredText 執筆のコツ</a></li>
</ul></li>
<li><a href="#ディレクトリ構成">ディレクトリ構成</a></li>
</ul>
</nav>
<p>ここ数週間、隙間時間で悶々と考えていたことを吐き出す。</p>
<h2 id="管理方法">管理方法</h2>
<p>一行で : 『Sphinx + VCS + Redmine + redmine_code_review』</p>
<ul>
<li>Sphinx でドキュメントを作成する</li>
<li>ソースは VCS で管理</li>
<li>ビルドしたドキュメントはドキュメントサーバーにデプロイ & 共有ディレクトリに格納</li>
<li>ドキュメントのレビューは、 redmine_code_review プラグインを使い実施、管理する</li>
</ul>
<p>※ VCS: できれば git + LFS, 次点で SVN</p>
<h3 id="メリット">メリット</h3>
<ul>
<li>Excel 共有と比べて
<ul>
<li>誰がいつ変更したかが失われない</li>
<li>コミットコメントのルールを決めることで、「何故」も記録できる</li>
<li>redmine_code_review の仕組みを使うことで、レビュー記録も Redmine に集約できる</li>
</ul></li>
<li>Redmine の wiki と比べて
<ul>
<li>ビルドしてしまえばサーバーなしで参照できる</li>
</ul></li>
</ul>
<h3 id="弱点">弱点</h3>
<ul>
<li>Excel のようにシームレスな作図ができない</li>
<li>reStructuredText がマイナー</li>
</ul>
<h3 id="restructuredtext-執筆のコツ">reStructuredText 執筆のコツ</h3>
<p>reStructuredText は、 tex, html などから続く『文章の意味と見た目が分離されているドキュメント』の一族。 執筆時には、文章構造に意識を集中すること。</p>
<p>これができると、あとは reStructuredText のルールに従って .rst に書き下していくだけで、誰でも同じ見た目の文章が作成できる。</p>
<p>Word, Excel と違い、編集するファイルの中に『見た目の情報』が存在しないため、 『うっかりフォントが変わった』や『ここだけインデントがずれた』 みたいなことがない。</p>
<h2 id="ディレクトリ構成">ディレクトリ構成</h2>
<pre><code>docroot
+- ワーキンググループ/
| +- ワーキンググループ_XXX/
| | +- work/
| | +- image/
| | +- attachment/
| | +- xxx.rst
| | +- ワーキンググループの規模によってはサブディレクトリ作成も辞さない/
| | +- work/
| | +- image/
| | +- attachment/
| | +- yyy.rst
| |
| +- ワーキンググループ_ZZZ/
| +- ...(略)
|
+- 開発資料
| +- ...(略)
|
+- 運用資料
+- ...(略)</code></pre>
<ul>
<li>image : 本文に表示する画像(png)を格納</li>
<li>work : image 加工用の元ネタを格納(xlsx, xcf 等)</li>
<li>attachment : 添付ファイルを格納</li>
</ul>
<p>うーん、もやもやする。</p>
mikoto2000http://www.blogger.com/profile/08084647632974947669noreply@blogger.com0tag:blogger.com,1999:blog-37637535.post-62641784411715454642016-11-09T00:45:00.000+09:002016-11-09T00:45:11.329+09:00オープンソースカンファレンス 2016 Tokyo/Fall にいってきました<nav id="TOC">
<ul>
<li><a href="#netで動くチケット管理ツールプリザンター">.NETで動くチケット管理ツール「プリザンター」</a></li>
<li><a href="#分で分かるosの作り方自作osもくもく会出張版">30分で分かるOSの作り方──自作OSもくもく会・出張版</a></li>
<li><a href="#ロケットや自動車にも搭載高品質な組込み向けオープンソースを開発するtoppersプロジェクトのご紹介">ロケットや自動車にも搭載!高品質な組込み向けオープンソースを開発するTOPPERSプロジェクトのご紹介</a></li>
<li><a href="#mikutter会議2016東京">mikutter会議2016東京</a></li>
<li><a href="#azureでossを気軽に試そう-lampからdevopsまで">AzureでOSSを気軽に試そう!~ LAMPからDevOpsまで ~</a></li>
<li><a href="#lt">LT</a></li>
</ul>
</nav>
<p>オープンソースカンファレンス 2016 Tokyo/Fall への参加記録として、殴り書きメモを張り付けていきます。</p>
<h1 id="netで動くチケット管理ツールプリザンター">.NETで動くチケット管理ツール「プリザンター」</h1>
<p>デフォルトで Redmine よりリッチなチケットトラッキングシステム。</p>
<ul>
<li>OS は Windows 前提</li>
<li>デフォルトで WBS, ガントチャート, バーンダウンチャート, カンバンが使用可能</li>
<li>既存の、 Excel, メール, 共有フォルダをプリザンターで置き換えられる</li>
<li>カスタムフィールドでグルーピングして集計みたいなことがリッチ UI でできる</li>
<li>VCS との連携がないのが残念</li>
</ul>
<p>VCS 連携機能がないのが残念だけど、 全体的に Redmine よりリッチで使いやすそうな印象だった。 今の現場、管理用サーバーが Windows Server なので、これ使ってみたいが、 VCS 連携あたりでメンバに文句言われそう...。</p>
<p>今の現場ならいいけど、 「他の現場でノウハウが使えるか」とか考えてしまうと、 やっぱり導入ためらってしまう感じというのが正直なところか。</p>
<p>とりあえず触ってみないとか。</p>
<h1 id="分で分かるosの作り方自作osもくもく会出張版">30分で分かるOSの作り方──自作OSもくもく会・出張版</h1>
<ul>
<li>OS とは
<ul>
<li>他の OS の力を借りずに起動するソフトウェアのこと。</li>
<li>それぞれの作者が「OS」だと言い張って、周りが「まぁそうかな」と納得すればそれが OS。</li>
</ul></li>
<li>方向性
<ul>
<li>システムプログラミングを楽しむ</li>
<li>OS 理論を学ぶ</li>
<li>実用的な OS を作る</li>
<li>既存 OS を改良する
<ul>
<li>この発表でいう「OS 自作」ではない</li>
</ul></li>
</ul></li>
<li>OS 自作方法
<ul>
<li>入門書を手に入れる</li>
<li>とりあえずその通りやる
<ul>
<li>1 日 2 時間 x 30 日 くらい。</li>
</ul></li>
<li>改造する</li>
</ul></li>
<li>参考書
<ul>
<li>30日でできる! OS自作入門</li>
<li>12 ステップで作る組み込み OS 自作入門</li>
</ul></li>
<li>2016, osdev-jp 結成</li>
<li>第 4 回 自作 OS もくもく会 11/26(土) 14:00 から</li>
</ul>
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">OS自作入門の川合さん、12ステップ本の坂井さんに来ていただけることになりました(超豪華!)。皆様も是非ご参加ください!<br>第4回 自作OSもくもく会 <a href="https://twitter.com/hashtag/atnd?src=hash">#atnd</a> <a href="https://twitter.com/hashtag/osdev_moku2?src=hash">#osdev_moku2</a> <a href="https://t.co/D4q1mdHTAJ">https://t.co/D4q1mdHTAJ</a></p>— OS作れないマン (@uchan_nos) <a href="https://twitter.com/uchan_nos/status/791941214069071880">2016年10月28日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>
<p>最近低レイヤの仕事してるのもあって、この辺への興味が増してしてきた。 実際作るかは置いておいて、OS 理論的なものの勉強はちょっとやっていかねば...。</p>
<h1 id="ロケットや自動車にも搭載高品質な組込み向けオープンソースを開発するtoppersプロジェクトのご紹介">ロケットや自動車にも搭載!高品質な組込み向けオープンソースを開発するTOPPERSプロジェクトのご紹介</h1>
<p>遅刻。</p>
<ul>
<li>Sessalelt
<ul>
<li>SESSAME(状態遷移図の設計セミナー)の成果物を実際に実装したもの</li>
<li>TOPPERS/EV3RT</li>
<li>言語 : C or mruby</li>
<li>状態の入れ子, 入れ子のない状態が存在するモデル</li>
</ul></li>
<li>状態マシン図設計セミナー
<ul>
<li>11/28,29</li>
<li>Sessalet のモデルを持ち寄ってレビュー大会を開く</li>
<li>メーカーで設計していた人が講師
<ul>
<li>今は社内でレビューを行っている</li>
</ul></li>
<li>http://www.sessame.jp/seminar/Seminar2016_11/index.htm</li>
</ul></li>
</ul>
<h1 id="mikutter会議2016東京">mikutter会議2016東京</h1>
<ul>
<li>mikutter は Twitter クライアントではない</li>
<li>Pluggaloid
<ul>
<li>Yukari for Android
<ul>
<li>Pluggaloid on mruby on Androi!</li>
</ul></li>
</ul></li>
<li>mikutter 3.5
<ul>
<li>Model
<ul>
<li>ツイート, ユーザー, リストなど</li>
<li>ユーザーがカスタムモデルを作れるようになった
<ul>
<li>適当なモデルを作ってタイムラインに流し込むと、よしなに表示してくれる</li>
</ul></li>
</ul></li>
</ul></li>
</ul>
<p>この辺からライブコーディングに夢中になってメモを忘れている...。</p>
<p>エンターテイメントなプレゼンだった。</p>
<p>進化の方向としては、モデルをさばくためのフレームワークだけ提供して、 モデルを作る(引っ張ってくる)部分とモデルを処理する部分は プラグインに任せる形になっていくっていう認識でいいのかな? この辺 Embulk とか Fluentd とかを思い出した。 この手のソフトウェア大好き。</p>
<p>ツイート以外のモデルを流しやすくなっているようなので、いろいろ触っていきたい。</p>
<h1 id="azureでossを気軽に試そう-lampからdevopsまで">AzureでOSSを気軽に試そう!~ LAMPからDevOpsまで ~</h1>
<ul>
<li>Microsoft には OS ハラスメントは無いみたい(Mac 使えるみたい)</li>
<li>けど、検索エンジンハラスメントはあるみたい(Bing 使えっていわれるみたい)</li>
</ul>
<p>Azure で VM 作る実演。 Bitnami に、要求にマッチするイメージが存在すれば、数分で作成作業終わる感じ。 初期設定とかイメージの説明書読まないとだけど、その辺に慣れればすごい便利そうだった。</p>
<h1 id="lt">LT</h1>
<p>みなさんネタと勢いのある素晴らしいプレゼン。見習いたい。(会社でやったら怒られるか...) Marp って初めて聞いたので試してみようと思った。</p>
mikoto2000http://www.blogger.com/profile/08084647632974947669noreply@blogger.com1tag:blogger.com,1999:blog-37637535.post-57138945780816523952016-11-08T08:08:00.000+09:002016-11-08T08:08:20.555+09:00VimConf 2016 に参加しました<nav id="TOC">
<ul>
<li><a href="#introduction-to-vim-8.0">Introduction to Vim 8.0</a></li>
<li><a href="#vim-as-the-main-text-editor">VIM AS THE MAIN TEXT EDITOR</a></li>
<li><a href="#denite.nvim-the-next-generation-of-unite">Denite.nvim ~The next generation of unite~</a></li>
<li><a href="#gocpythonのためのdeoplete.nvimのソースの紹介とneovim専用にpure-goでvim-goをスクラッチした話">Go、C、Pythonのためのdeoplete.nvimのソースの紹介と、Neovim専用にpure Goでvim-goをスクラッチした話</a></li>
<li><a href="#エディタの壁を超える-go-の開発ツールの文化と作成方法">エディタの壁を超える Go の開発ツールの文化と作成方法</a></li>
<li><a href="#vim-mode-plus-for-atom-editor">vim-mode-plus for Atom editor</a></li>
<li><a href="#vimの日本語ドキュメント">Vimの日本語ドキュメント</a></li>
<li><a href="#vim-script-parser-written-in-go">Vim script parser written in Go</a></li>
<li><a href="#僕の友達を紹介するよ">僕の友達を紹介するよ</a></li>
<li><a href="#best-practices-for-building-vim-plugins">Best practices for building Vim plugins</a></li>
<li><a href="#所感">所感</a></li>
</ul>
</nav>
<p>VimConf 2016 への参加記録として、殴り書きメモを張り付けていきます。</p>
<h1 id="introduction-to-vim-8.0">Introduction to Vim 8.0</h1>
<ul>
<li>See <code>:help version8</code></li>
<li>See <code>:help channel-demo</code></li>
<li>See <code>:help job_start()</code></li>
<li>See <code>:help timer_start()</code></li>
<li>See <code>:help Partial</code>
<ul>
<li>Partial : 部分適用, コールバック等で便利らしい</li>
</ul></li>
<li>See <code>:help lambda</code></li>
<li>See <code>:help closure</code></li>
<li>See <code>:help window-id</code>
<ul>
<li>Window に、不変の、一意な Window ID がつくようになったらしい。</li>
</ul></li>
<li>See <code>:help test-functions</code></li>
<li>See <code>:help breakindent</code>
<ul>
<li>マージに 10 年!</li>
</ul></li>
<li>See <code>:help renderoptions</code></li>
<li>Search <code>Coveralls</code></li>
</ul>
<p>知らない機能たくさん。特に、「Partial」「window-id」「breakindent」は今の自分に有用そうなので調べる。</p>
<h1 id="vim-as-the-main-text-editor">VIM AS THE MAIN TEXT EDITOR</h1>
<ul>
<li>「vimrc をオリジナルにする」、同感。</li>
<li>Vim に移行するためのモチベーションは何だろうか?
<ul>
<li>仕事で使う必要があった</li>
</ul></li>
<li>Vim を使うための準備運動
<ul>
<li>vim tutorial</li>
<li>VIMIUM</li>
</ul></li>
<li>Vim を育てる
<ul>
<li>github で vimrc を検索</li>
<li>内容を把握してコピペ</li>
<li>気になったことを issue で書く</li>
</ul></li>
<li>Q: Vim に移行して一番テンションの上がった機能は?
<ul>
<li>A: VimFiler, UI, 操作性が直感的で感動した</li>
</ul></li>
</ul>
<p>プロジェクトメンバに Vim 布教するにあたりこの辺のステップを参考にしていきたい。</p>
<h1 id="denite.nvim-the-next-generation-of-unite">Denite.nvim ~The next generation of unite~</h1>
<p>NeoVim かー、 Python かー、速いのかー、うらやましいなー。って聞いてた。 (NeoVim 専用と誤解してた、NeoVim が Linux でしか動かないと思ってた。)</p>
<p>※ 懇親会にて Shougo さんに NeoVim は Windows ネイティブでも動くようになってるし、Bash on Ubuntu on Windows なら完璧に動くという話をしていただいたので試す。</p>
<h1 id="gocpythonのためのdeoplete.nvimのソースの紹介とneovim専用にpure-goでvim-goをスクラッチした話">Go、C、Pythonのためのdeoplete.nvimのソースの紹介と、Neovim専用にpure Goでvim-goをスクラッチした話</h1>
<p>NeoVim かー、 Python かー、速いのかー、うらやましいなー。って聞いてた。</p>
<h1 id="エディタの壁を超える-go-の開発ツールの文化と作成方法">エディタの壁を超える Go の開発ツールの文化と作成方法</h1>
<ul>
<li>特徴
<ul>
<li>強力でシンプルな言語設計と文法</li>
<li>平行プログラミング</li>
<li>豊富なライブラリ</li>
<li>豊富なツール</li>
<li>シングルバイナリ/クロスコンパイル
<ul>
<li>Windows 界隈だとシングルバイナリ便利</li>
</ul></li>
</ul></li>
<li>ツール群
<ul>
<li>govet</li>
<li>guru</li>
<li>gocode</li>
<li>errcheck</li>
<li>gorename</li>
<li>gomvpkg</li>
</ul></li>
<li>Search <code>gofmt -s</code></li>
</ul>
<p>社内ツールで Go 使うときの宣伝文句としてスライド <del>ぱくりたい</del> 超参考になった。</p>
<h1 id="vim-mode-plus-for-atom-editor">vim-mode-plus for Atom editor</h1>
<ul>
<li>Search <code>operation-stack</code></li>
<li>Search Vim で <C-^></li>
<li>Search occurrence</li>
<li>Search Vim で vip</li>
<li>Search Vim で「キャメルケース/スネークケース」変換</li>
</ul>
<p>モーションとオペレータの考え方がわかりやすかった。 そのあたりを意識しながらコマンド使っていきたいと思った。</p>
<h1 id="vimの日本語ドキュメント">Vimの日本語ドキュメント</h1>
<ul>
<li>vim のドキュメント
<ul>
<li>vim-jp/vimdoc-ja
<ul>
<li>リファレンスとユーザーマニュアル</li>
</ul></li>
<li>vim-jp/lang-ja
<ul>
<li>メニュー・メッセージ</li>
</ul></li>
<li>Vim のユーザーマニュアルは、 <code>usr_</code> で始まるやつ</li>
</ul></li>
<li>Travis-CI 上で表記ゆれチェック
<ul>
<li>koron/nvcheck</li>
</ul></li>
<li>vimdoc-ja の課題
<ul>
<li>訳文の統一
<ul>
<li>表記ゆれ</li>
<li>文体の統一</li>
</ul></li>
<li>翻訳支援ツールの利用
<ul>
<li>原文成形済み
<ul>
<li>なので、差分検出が難しい
<ul>
<li>なので、マークアップと成形ツールがほしい</li>
</ul></li>
</ul></li>
<li>これで、翻訳の品質向上を目指す</li>
</ul></li>
</ul></li>
</ul>
<p>ドキュメント翻訳って、翻訳そのものも大変だけど、翻訳のための仕組み作りもまた大変なんだなぁ。 表記ゆれチェックはうちのプロジェクトに取り込めたら取り込んでいきたい。</p>
<h1 id="vim-script-parser-written-in-go">Vim script parser written in Go</h1>
<ul>
<li>Linter</li>
<li>Fixer</li>
<li>Formatter</li>
<li>Completion</li>
</ul>
<p>殴り書きで上記単語だけ書かれていた...。完全に内容についていけてなかった...。</p>
<h1 id="僕の友達を紹介するよ">僕の友達を紹介するよ</h1>
<ul>
<li>Search <code>vim-alignta</code>
<ul>
<li>Search <code>vim-easy-align</code>(<a href="https://twitter.com/mozi_kke/status/794824522687868928">つじけんさんのツイート: "vim-alignta と vim-easy-align だっけ? の 違いが気になるところ #vimconf2016"</a> より)</li>
</ul></li>
<li>Search <code>undotree</code></li>
<li>Search <code>vim-textobj-indent</code></li>
<li>Search <code>unite-session</code></li>
</ul>
<p>この辺試していきたい。</p>
<h1 id="best-practices-for-building-vim-plugins">Best practices for building Vim plugins</h1>
<ul>
<li>ドキュメントを書きましょう
<ul>
<li>README を置くだけでは不十分</li>
<li>See <code>:help design-documented</code></li>
</ul></li>
<li>namespace を意識しましょう
<ul>
<li>他プラグインと名前がバッティングしないように注意</li>
<li>プラグイン名を prefix にする
<ul>
<li>勝手に省略するのはダメ</li>
<li>実際どう呼ぶかはユーザーに任せる</li>
</ul></li>
<li>プラグイン名を決める前にググる</li>
<li>外部インターフェースの関数, 変数名も同じなので注意</li>
</ul></li>
<li>autoload を使いましょう
<ul>
<li><code>plugin/xxx.vim</code> には UI 定義のみ</li>
<li>逆に言うと、 <code>plugin/xxx.vim</code> から autoload 内のコードを呼ぶのは残念な感じ</li>
</ul></li>
<li>カスタマイズできるようにするのが Vim っぽい
<ul>
<li>高カスタマイズ性</li>
</ul></li>
<li><code><Plut></code> キーマッピングを使いましょう</li>
<li>Plugin original buffer is useful
<ul>
<li>実際のバッファに紐づかないバッファ?</li>
<li><code>BufReadCmd</code>, <code>BufWriteCmd</code></li>
<li><code>{plugin-name}://...</code></li>
<li>バッファを使うプラグインはスコープに注意</li>
</ul></li>
<li>デフォルトで移動するキーのマッピングを上書きしちゃうと顰蹙を買うかも...</li>
<li>See <code><Leader></code>, <code><LocalReader></code></li>
<li>Open API</li>
<li>マルチプラットフォーム対応しましょう
<ul>
<li>See <code>:help design-multi-platform</code></li>
</ul></li>
<li>テスト書くとよい</li>
<li>スクリプト内で省略形を使うのはダメ
<ul>
<li>省略形はコマンドモードで楽に入力するためのもの</li>
</ul></li>
</ul>
<p>もりだくさん。 Vim script 書くときに意識していきたい。</p>
<h1 id="所感">所感</h1>
<ul>
<li>書き殴ったことを消化・吸収しつつ、Vim 力を高めていきたい</li>
<li>NeoVim, Go を全くウォッチしていなかったのが悔やまれる</li>
<li>Windows で NeoVim 動かして deoplete.nvim を使ってみよう</li>
</ul>
mikoto2000http://www.blogger.com/profile/08084647632974947669noreply@blogger.com0tag:blogger.com,1999:blog-37637535.post-70062976303454936682016-11-01T23:01:00.000+09:002016-11-01T23:01:51.740+09:00[Vim] Vim で、カーソル下の数値を変換したい<p>上から順に、</p>
<ul>
<li>2 進数変換</li>
<li>10 進数変換</li>
<li>16 進数変換</li>
<li>数値の桁(ゼロオリジン)のマスク値に変換</li>
<li>数値の桁(1オリジン)のマスク値に変換</li>
</ul>
<p>という感じ。</p>
<p>マクロ</p>
<pre class="vim"><code>viwc^R=printf("0b%b", ^R")^M^[
viwc^R=printf("%d", ^R")^M^[
viwc^R=printf("0x%04X", ^R")^M^[
viwc^R=printf("0x%04X", printf("%.f", pow(2, ^R")))^M^[
viwc^R=printf("0x%04X", printf("%.f", pow(2, ^R"-1)))^M^[</code></pre>
<p>コマンドバージョン</p>
<pre class="vim"><code>command! Num2b execute "normal viwc<C-R>=printf(\"0b%b\", <C-R>\")<Return><Esc>"
command! Num2d execute "normal viwc<C-R>=printf(\"%d\", <C-R>\")<Return><Esc>"
command! Num2x execute "normal viwc<C-R>=printf(\"0x%04X\", <C-R>\")<Return><Esc>"
command! Num2Mask0 execute "normal viwc<C-R>=printf(\"0x%04X\", printf(\"%.f\", pow(2, <C-R>\")))<Return><Esc>"
command! Num2Mask1 execute "normal viwc<C-R>=printf(\"0x%04X\", printf(\"%.f\", pow(2, <C-R>\"-1)))<Return><Esc>"</code></pre>
mikoto2000http://www.blogger.com/profile/08084647632974947669noreply@blogger.com0tag:blogger.com,1999:blog-37637535.post-35709061242819800402016-10-28T22:54:00.000+09:002016-10-28T22:54:04.014+09:00[作業記録][Debian] Debian 8.5 最小構成インストールから Redmine3 + redmine_code_review を使えるようになるまで<nav id="TOC">
<ul>
<li><a href="#環境">環境</a></li>
<li><a href="#目標">目標</a></li>
<li><a href="#作業概要">作業概要</a></li>
<li><a href="#redmie-の準備">Redmie の準備</a><ul>
<li><a href="#必要パッケージのインストール">必要パッケージのインストール</a></li>
<li><a href="#redmine-ソースコードの取得">Redmine ソースコードの取得</a></li>
<li><a href="#データベース設定">データベース設定</a><ul>
<li><a href="#ひな形コピー">1. ひな形コピー</a></li>
<li><a href="#設定ファイル編集">2. 設定ファイル編集</a></li>
</ul></li>
<li><a href="#必要な-gem-のインストール">必要な gem のインストール</a></li>
<li><a href="#デフォルトデータ作成">デフォルトデータ作成</a></li>
<li><a href="#secret-token-の準備">secret token の準備</a></li>
<li><a href="#動作確認">動作確認</a></li>
</ul></li>
<li><a href="#redmine_code_review-の準備">redmine_code_review の準備</a><ul>
<li><a href="#redmine_code_review-ソースコードの取得と配置">redmine_code_review ソースコードの取得と配置</a></li>
<li><a href="#データベースのマイグレーション">データベースのマイグレーション</a></li>
<li><a href="#動作確認-1">動作確認</a></li>
</ul></li>
</ul>
</nav>
<h1 id="環境">環境</h1>
<ul>
<li>Debian 8.5 最小構成インストール</li>
<li>sudo, vim, ssh はインストール済み</li>
</ul>
<h1 id="目標">目標</h1>
<p>Debian 8.5 で、Redmine を使いたい、そしてコードレビューもしたい。</p>
<p>そのため、下記組み合わせで Redmine を使用できるようにする。</p>
<ul>
<li>Redmine 3.3.1</li>
<li>redmine_code_review</li>
<li>sqlite3</li>
<li>Unicorn</li>
<li>nginx</li>
</ul>
<p>Redmine と Nginx, Unicorn の連携については、<a href="http://oyasirazu.blogspot.jp/2016/10/debian-debian-redmine-2-unicorn.html">このあたり</a> の投稿を参考にすれば問題ないはずなので省略。</p>
<h1 id="作業概要">作業概要</h1>
<ol type="1">
<li>Redmine の準備
<ol type="1">
<li>必要パッケージのインストール</li>
<li>Redmine ソースコードの取得</li>
<li>データベース設定</li>
<li>必要な gem のインストール</li>
<li>デフォルトデータ作成</li>
<li>secret token の準備</li>
<li>動作確認</li>
</ol></li>
<li>redmine_code_review の準備
<ol type="1">
<li>redmine_code_review ソースコードの取得と配置</li>
<li>データベースのマイグレーション</li>
<li>動作確認</li>
</ol></li>
</ol>
<p>以下、各作業の詳細を記述していく。</p>
<h1 id="redmie-の準備">Redmie の準備</h1>
<h2 id="必要パッケージのインストール">必要パッケージのインストール</h2>
<p>Redmine インストールにあたり、いろいろ必要なので apt でインストールする。</p>
<div class="sourceCode"><pre class="sourceCode sh"><code class="sourceCode bash"><span class="co"># ベースの最新化</span>
<span class="kw">sudo</span> apt update
<span class="kw">sudo</span> apt upgrade
<span class="co"># rails のためのパッケージ</span>
<span class="kw">sudo</span> apt install ruby-rails
<span class="co"># redmine の gem インストール時に必要になるものたち</span>
<span class="kw">sudo</span> apt install zlib1g-dev pkg-config libmagickcore-dev libmagickwand-dev libsqlite3-dev
<span class="co"># Redmine を svn で取得してこれるように</span>
<span class="kw">sudo</span> apt install subversion</code></pre></div>
<h2 id="redmine-ソースコードの取得">Redmine ソースコードの取得</h2>
<p>svn の stable ブランチからソースを取得する。今回は、 <code>3.3-stable</code> を取得する。</p>
<p>今回は、Redmine のルートディレクトリは <code>/var/redmine</code> とする。</p>
<div class="sourceCode"><pre class="sourceCode sh"><code class="sourceCode bash"><span class="kw">sudo</span> mkdir /var/redmine
<span class="kw">sudo</span> svn co https://svn.redmine.org/redmine/branches/3.3-stable /var/redmine
<span class="kw">sudo</span> chown -R www-data:www-data /var/redmine</code></pre></div>
<h2 id="データベース設定">データベース設定</h2>
<p>今回は、 <code>/var/redmine/db/redmine.sqlite3</code> を Redmine 用のデータベースとする。</p>
<h3 id="ひな形コピー">1. ひな形コピー</h3>
<div class="sourceCode"><pre class="sourceCode sh"><code class="sourceCode bash"><span class="kw">cd</span> /var/redmine
<span class="kw">sudo</span> -u www-data cp config/database.yml.example config/database.yml
<span class="kw">sudo</span> -u www-data vim config/database.yml</code></pre></div>
<h3 id="設定ファイル編集">2. 設定ファイル編集</h3>
<p><code>/var/redmine/db/redmine.sqlite3</code> を編集する。</p>
<div class="sourceCode"><pre class="sourceCode yml"><code class="sourceCode yaml"><span class="co"># SQLite3 configuration example</span>
<span class="fu">production:</span>
<span class="fu">adapter:</span> sqlite3
<span class="fu">database:</span> db/redmine.sqlite3</code></pre></div>
<h2 id="必要な-gem-のインストール">必要な gem のインストール</h2>
<p>gem をインストール</p>
<div class="sourceCode"><pre class="sourceCode sh"><code class="sourceCode bash"><span class="kw">cd</span> /var/redmine
<span class="kw">sudo</span> -u www-data bundle install --path vendor/bundle</code></pre></div>
<h2 id="デフォルトデータ作成">デフォルトデータ作成</h2>
<div class="sourceCode"><pre class="sourceCode sh"><code class="sourceCode bash"><span class="kw">cd</span> /var/redmine
<span class="kw">sudo</span> -u www-data bundle exec rake db:migrate RAILS_ENV=production
<span class="kw">sudo</span> -u www-data bundle exec rake redmine:load_default_data RAILS_ENV=production</code></pre></div>
<h2 id="secret-token-の準備">secret token の準備</h2>
<p>セッション関係で使うトークンを生成するらしい。</p>
<div class="sourceCode"><pre class="sourceCode sh"><code class="sourceCode bash"><span class="kw">cd</span> /var/redmine
<span class="kw">sudo</span> -u www-data bundle exec rake generate_session_store</code></pre></div>
<h2 id="動作確認">動作確認</h2>
<div class="sourceCode"><pre class="sourceCode sh"><code class="sourceCode bash"><span class="kw">cd</span> /var/redmine
<span class="kw">sudo</span> -u www-data bundle exec rails server webrick -b 0.0.0.0 -e production</code></pre></div>
<h1 id="redmine_code_review-の準備">redmine_code_review の準備</h1>
<h2 id="redmine_code_review-ソースコードの取得と配置">redmine_code_review ソースコードの取得と配置</h2>
<div class="sourceCode"><pre class="sourceCode sh"><code class="sourceCode bash"><span class="kw">cd</span> ~
<span class="kw">wget</span> https://bitbucket.org/haru_iida/redmine_code_review/downloads/redmine_code_review-0.7.0.zip
<span class="kw">unzip</span> redmine_code_review-0.7.0.zip
<span class="kw">sudo</span> -u www-data cp -r redmine_code_review /var/redmine/plugins</code></pre></div>
<h2 id="データベースのマイグレーション">データベースのマイグレーション</h2>
<div class="sourceCode"><pre class="sourceCode sh"><code class="sourceCode bash"><span class="kw">cd</span> /var/redmine
<span class="kw">sudo</span> -u www-data bundle exec rake redmine:plugins:migrate RAILS_ENV=production</code></pre></div>
<h2 id="動作確認-1">動作確認</h2>
<div class="sourceCode"><pre class="sourceCode sh"><code class="sourceCode bash"><span class="kw">cd</span> /var/redmine
<span class="kw">sudo</span> -u www-data bundle exec rails server webrick -b 0.0.0.0 -e production</code></pre></div>
<p>2016/10/26 時点では、「コードレビュー」タブをクリックすると Internal Error になってしまう。 そのため、プロジェクトの設定で「コードレビュータブを隠す」にチェックを入れてタブを隠す。</p>
<p>以上。</p>
mikoto2000http://www.blogger.com/profile/08084647632974947669noreply@blogger.com0tag:blogger.com,1999:blog-37637535.post-11542791061064430292016-10-20T01:56:00.000+09:002016-10-20T01:56:07.751+09:00[作業記録] Windows で、Sphinx のスタンドアロンインストーラを試してみる<nav id="TOC">
<ul>
<li><a href="#目標">目標</a></li>
<li><a href="#環境">環境</a></li>
<li><a href="#作業概要">作業概要</a></li>
<li><a href="#インストーラーのダウンロード">インストーラーのダウンロード</a></li>
<li><a href="#インストール">インストール</a></li>
<li><a href="#動作確認">動作確認</a></li>
<li><a href="#動作確認-on-コマンドプロンプト">動作確認 on コマンドプロンプト</a></li>
</ul>
</nav>
<h1 id="目標">目標</h1>
<p>Windows で Sphinx を使えるようにする。</p>
<h1 id="環境">環境</h1>
<ul>
<li>Windows Insider Build 14936</li>
<li>msys2 インストール済み
<ul>
<li>なので、コマンドプロンプトでも <code>python</code> 叩くと python 3.4.3 が起動する状態</li>
</ul></li>
</ul>
<h1 id="作業概要">作業概要</h1>
<ol type="1">
<li>インストーラーのダウンロード</li>
<li>インストール</li>
</ol>
<p>以下、各作業についての詳細を記述。</p>
<h1 id="インストーラーのダウンロード">インストーラーのダウンロード</h1>
<p>下記ページからインストーラーをダウンロードする。</p>
<p><a href="http://sphinx-users.jp/gettingstarted/install_windows_standalone.html">Windowsへのインストール(スタンドアロンインストール) — Python製ドキュメンテーションビルダー、Sphinxの日本ユーザ会 : http://sphinx-users.jp/gettingstarted/install_windows_standalone.html</a></p>
<p>今回は、<code>SphinxInstaller-1.4.1.20160416-py2.7-win32.zip</code> をダウンロードした。</p>
<h1 id="インストール">インストール</h1>
<p>展開して出てきた <code>SphinxInstaller-1.4.1.20160416-py2.7-win32.exe</code> を管理者として実行する。</p>
<p>基本、デフォルトで OK, 好みがあれば適宜変更すればよい感じ。</p>
<h1 id="動作確認">動作確認</h1>
<p>msys2 環境で実行。</p>
<div class="sourceCode"><pre class="sourceCode sh"><code class="sourceCode bash"><span class="kw">mikoto@mnhomewin</span> ~
$ <span class="kw">mkdir</span> -p project/sphinx-test
<span class="kw">mikoto@mnhomewin</span> ~
$ <span class="kw">cd</span> project/sphinx-test/
<span class="kw">mikoto@mnhomewin</span> ~/project/sphinx-test
$ <span class="kw">sphinx-quickstart</span>
<span class="kw">Welcome</span> to the Sphinx 1.4.1 quickstart utility.
<span class="kw">Please</span> enter values for the following settings (just press Enter to
<span class="kw">accept</span> a default value, if one is given in brackets)<span class="kw">.</span>
<span class="kw">Enter</span> the root path for documentation.
<span class="kw">></span> <span class="kw">Root</span> path for the documentation [.]:
<span class="kw">You</span> have two options for placing the build directory for Sphinx output.
<span class="kw">Either</span>, you use a directory <span class="st">"_build"</span> within the root path, or you separate
<span class="st">"source"</span> <span class="kw">and</span> <span class="st">"build"</span> directories within the root path.
<span class="kw">></span> <span class="kw">Separate</span> source and build directories (y/n) [<span class="kw">n</span>]: y
<span class="kw">Inside</span> the root directory, two more directories will be created<span class="kw">;</span> <span class="st">"_templates"</span>
<span class="kw">for</span> <span class="kw">custom</span> HTML templates and <span class="st">"_static"</span> for custom stylesheets and other static
<span class="kw">files.</span> You can enter another prefix (such as <span class="st">"."</span>) <span class="kw">to</span> replace the underscore.
<span class="kw">></span> <span class="kw">Name</span> prefix for templates and static dir [_]:
<span class="kw">The</span> project name will occur in several places in the built documentation.
<span class="kw">></span> <span class="kw">Project</span> name: Test
<span class="kw">></span> <span class="kw">Author</span> name(s)<span class="kw">:</span> Mikoto2000
<span class="kw">Sphinx</span> has the notion of a <span class="st">"version"</span> and a <span class="st">"release"</span> for the
<span class="kw">software.</span> Each version can have multiple releases. For example, for
<span class="kw">Python</span> the version is something like 2.5 or 3.0, while the release is
<span class="kw">something</span> like 2.5.1 or 3.0a1. If you don<span class="st">'t need this dual structure,</span>
<span class="st">just set both to the same value.</span>
<span class="st">> Project version: 1.0.0</span>
<span class="st">> Project release [1.0.0]:</span>
<span class="st">If the documents are to be written in a language other than English,</span>
<span class="st">you can select a language here by its language code. Sphinx will then</span>
<span class="st">translate text that it generates into that language.</span>
<span class="st">For a list of supported codes, see</span>
<span class="st">http://sphinx-doc.org/config.html#confval-language.</span>
<span class="st">> Project language [en]: ja</span>
<span class="st">The file name suffix for source files. Commonly, this is either ".txt"</span>
<span class="st">or ".rst". Only files with this suffix are considered documents.</span>
<span class="st">> Source file suffix [.rst]:</span>
<span class="st">One document is special in that it is considered the top node of the</span>
<span class="st">"contents tree", that is, it is the root of the hierarchical structure</span>
<span class="st">of the documents. Normally, this is "index", but if your "index"</span>
<span class="st">document is a custom template, you can also set this to another filename.</span>
<span class="st">> Name of your master document (without suffix) [index]:</span>
<span class="st">Sphinx can also add configuration for epub output:</span>
<span class="st">> Do you want to use the epub builder (y/n) [n]:</span>
<span class="st">Please indicate if you want to use one of the following Sphinx extensions:</span>
<span class="st">> autodoc: automatically insert docstrings from modules (y/n) [n]:</span>
<span class="st">> doctest: automatically test code snippets in doctest blocks (y/n) [n]:</span>
<span class="st">> intersphinx: link between Sphinx documentation of different projects (y/n) [n]:</span>
<span class="st">> todo: write "todo" entries that can be shown or hidden on build (y/n) [n]:</span>
<span class="st">> coverage: checks for documentation coverage (y/n) [n]:</span>
<span class="st">> imgmath: include math, rendered as PNG or SVG images (y/n) [n]:</span>
<span class="st">> mathjax: include math, rendered in the browser by MathJax (y/n) [n]:</span>
<span class="st">> ifconfig: conditional inclusion of content based on config values (y/n) [n]:</span>
<span class="st">> viewcode: include links to the source code of documented Python objects (y/n) [n]:</span>
<span class="st">> githubpages: create .nojekyll file to publish the document on GitHub pages (y/n) [n]:</span>
<span class="st">A Makefile and a Windows command file can be generated for you so that you</span>
<span class="st">only have to run e.g. `make html'</span> instead of invoking sphinx-build
<span class="kw">directly.</span>
<span class="kw">></span> <span class="kw">Create</span> Makefile? (y/n) [<span class="kw">y</span>]:
<span class="kw">></span> <span class="kw">Create</span> Windows command file? (y/n) [<span class="kw">y</span>]:
<span class="kw">Creating</span> file .\source\conf.py.
<span class="kw">Creating</span> file .\source\index.rst.
<span class="kw">Creating</span> file .\Makefile.
<span class="kw">Creating</span> file .\make.bat.
<span class="kw">Finished</span>: An initial directory structure has been created.
<span class="kw">You</span> should now populate your master file .\source\index.rst and create other documentation
<span class="kw">source</span> files. Use the Makefile to build the docs, like so:
<span class="kw">make</span> builder
<span class="kw">where</span> <span class="st">"builder"</span> is one of the supported builders, e.g. html, latex or linkcheck.
<span class="kw">mikoto@mnhomewin</span> ~/project/sphinx-test
$ <span class="kw">make</span> html
<span class="kw">sphinx-build</span> -b html -d build/doctrees source build/html
<span class="kw">Running</span> Sphinx v1.4.1
<span class="kw">making</span> output directory...
<span class="kw">loading</span> translations [ja]... done
<span class="kw">loading</span> pickled environment... not yet created
<span class="kw">building</span> [mo]: targets for 0 po files that are out of date
<span class="kw">building</span> [html]: targets for 1 source files that are out of date
<span class="kw">updating</span> environment: 1 added, 0 changed, 0 removed
<span class="kw">reading</span> sources... [100%] index
<span class="kw">looking</span> for now-outdated files... none found
<span class="kw">pickling</span> environment... done
<span class="kw">checking</span> consistency... done
<span class="kw">preparing</span> documents... done
<span class="kw">writing</span> output... [100%] index
<span class="kw">generating</span> indices... genindex
<span class="kw">writing</span> additional pages... search
<span class="kw">copying</span> static files... done
<span class="kw">copying</span> extra files... done
<span class="kw">dumping</span> search index in Japanese (code: ja) <span class="kw">...</span> done
<span class="kw">dumping</span> object inventory... done
<span class="kw">build</span> succeeded.
<span class="kw">Build</span> finished. The HTML pages are in build/html.
<span class="kw">mikoto@mnhomewin</span> ~/project/sphinx-test
$ <span class="kw">start</span> build/html/index.html</code></pre></div>
<p>これで、 sphinx のウェルカムページが見えるはず。 ...msys2 環境でやるなら <code>pacman</code> で入れたほうが良くなかったか?</p>
<h1 id="動作確認-on-コマンドプロンプト">動作確認 on コマンドプロンプト</h1>
<p>ということでコマンドプロンプトで試す。</p>
<pre class="cmd"><code>C:\Users\mikoto>mkdir -p project\sphinx-test
C:\Users\mikoto>cd project\sphinx-test
C:\Users\mikoto\project\sphinx-test>sphinx-quickstart
Welcome to the Sphinx 1.4.1 quickstart utility.
Please enter values for the following settings (just press Enter to
accept a default value, if one is given in brackets).
Enter the root path for documentation.
> Root path for the documentation [.]:
You have two options for placing the build directory for Sphinx output.
Either, you use a directory "_build" within the root path, or you separate
"source" and "build" directories within the root path.
> Separate source and build directories (y/n) [n]: y
Inside the root directory, two more directories will be created; "_templates"
for custom HTML templates and "_static" for custom stylesheets and other static
files. You can enter another prefix (such as ".") to replace the underscore.
> Name prefix for templates and static dir [_]:
The project name will occur in several places in the built documentation.
> Project name: Test2
> Author name(s): Mikoto2000
Sphinx has the notion of a "version" and a "release" for the
software. Each version can have multiple releases. For example, for
Python the version is something like 2.5 or 3.0, while the release is
something like 2.5.1 or 3.0a1. If you don't need this dual structure,
just set both to the same value.
> Project version: 1.0.0
> Project release [1.0.0]:
If the documents are to be written in a language other than English,
you can select a language here by its language code. Sphinx will then
translate text that it generates into that language.
For a list of supported codes, see
http://sphinx-doc.org/config.html#confval-language.
> Project language [en]: ja
The file name suffix for source files. Commonly, this is either ".txt"
or ".rst". Only files with this suffix are considered documents.
> Source file suffix [.rst]:
One document is special in that it is considered the top node of the
"contents tree", that is, it is the root of the hierarchical structure
of the documents. Normally, this is "index", but if your "index"
document is a custom template, you can also set this to another filename.
> Name of your master document (without suffix) [index]:
Sphinx can also add configuration for epub output:
> Do you want to use the epub builder (y/n) [n]:
Please indicate if you want to use one of the following Sphinx extensions:
> autodoc: automatically insert docstrings from modules (y/n) [n]:
> doctest: automatically test code snippets in doctest blocks (y/n) [n]:
> intersphinx: link between Sphinx documentation of different projects (y/n) [n]:
> todo: write "todo" entries that can be shown or hidden on build (y/n) [n]:
> coverage: checks for documentation coverage (y/n) [n]:
> imgmath: include math, rendered as PNG or SVG images (y/n) [n]:
> mathjax: include math, rendered in the browser by MathJax (y/n) [n]:
> ifconfig: conditional inclusion of content based on config values (y/n) [n]:
> viewcode: include links to the source code of documented Python objects (y/n) [n]:
> githubpages: create .nojekyll file to publish the document on GitHub pages (y/n) [n]:
A Makefile and a Windows command file can be generated for you so that you
only have to run e.g. `make html' instead of invoking sphinx-build
directly.
> Create Makefile? (y/n) [y]:
> Create Windows command file? (y/n) [y]:
Creating file .\source\conf.py.
Creating file .\source\index.rst.
Creating file .\Makefile.
Creating file .\make.bat.
Finished: An initial directory structure has been created.
You should now populate your master file .\source\index.rst and create other documentation
source files. Use the Makefile to build the docs, like so:
make builder
where "builder" is one of the supported builders, e.g. html, latex or linkcheck.
C:\Users\mikoto\project\sphinx-test>make.bat html
Running Sphinx v1.4.1
making output directory...
loading translations [ja]... done
loading pickled environment... not yet created
building [mo]: targets for 0 po files that are out of date
building [html]: targets for 1 source files that are out of date
updating environment: 1 added, 0 changed, 0 removed
reading sources... [100%] index
looking for now-outdated files... none found
pickling environment... done
checking consistency... done
preparing documents... done
writing output... [100%] index
generating indices... genindex
writing additional pages... search
copying static files... done
copying extra files... done
dumping search index in Japanese (code: ja) ... done
dumping object inventory... done
build succeeded.
Build finished. The HTML pages are in build/html.
C:\Users\mikoto\project\sphinx-test>start build\html\index.html</code></pre>
<p>うん、OK です。</p>
<p>msys2 環境が悪さしないで良かった。</p>
</body>
</html>
mikoto2000http://www.blogger.com/profile/08084647632974947669noreply@blogger.com0tag:blogger.com,1999:blog-37637535.post-46345762320965475762016-10-19T00:32:00.000+09:002016-10-20T01:56:31.997+09:00[作業記録][Debian] Sphinx を使ってみたい<nav id="TOC">
<ul>
<li><a href="#環境">環境</a></li>
<li><a href="#目標">目標</a></li>
<li><a href="#作業">作業</a><ul>
<li><a href="#必要パッケージのインストール">必要パッケージのインストール</a></li>
<li><a href="#sphinx-プロジェクトの作成">sphinx プロジェクトの作成</a></li>
<li><a href="#ドキュメント作成">ドキュメント作成</a></li>
<li><a href="#ドキュメントビルド">ドキュメントビルド</a></li>
<li><a href="#html-を配置">html を配置</a></li>
</ul></li>
</ul>
</nav>
<h2 id="環境">環境</h2>
<ul>
<li>Debian 8.5 最小構成インストール</li>
<li>sudo, vim, ssh はインストール済み</li>
</ul>
<h2 id="目標">目標</h2>
<p>Sphinx でドキュメントを作成し、生成した html を Nginx で公開する。</p>
<h2 id="作業">作業</h2>
<p>下記手順で作業を行う。</p>
<ol type="1">
<li>必要パッケージのインストール</li>
<li>sphinx プロジェクトの作成</li>
<li>ドキュメント作成</li>
<li>ドキュメントビルド</li>
<li>html を配置</li>
</ol>
<h3 id="必要パッケージのインストール">必要パッケージのインストール</h3>
<p><code>make</code> が必要なの注意。</p>
<div class="sourceCode"><pre class="sourceCode sh"><code class="sourceCode bash"><span class="kw">sudo</span> apt install python3-sphinx
<span class="kw">sudo</span> apt install nginx
<span class="kw">sudo</span> apt install make</code></pre></div>
<h3 id="sphinx-プロジェクトの作成">sphinx プロジェクトの作成</h3>
<p><code>Separate source and build directories</code> は <code>y</code> のほうが管理しやすい感じがした。 その他はよしなにする感じで。</p>
<div class="sourceCode"><pre class="sourceCode sh"><code class="sourceCode bash"><span class="kw">mikoto@debian-base</span>:~$ mkdir -p sphinx/test
<span class="kw">mikoto@debian-base</span>:~$ cd sphinx/test/
<span class="kw">mikoto@debian-base</span>:~/sphinx/test$ sphinx-quickstart
<span class="kw">Welcome</span> to the Sphinx 1.2.3 quickstart utility.
<span class="kw">Please</span> enter values for the following settings (just press Enter to
<span class="kw">accept</span> a default value, if one is given in brackets)<span class="kw">.</span>
<span class="kw">Enter</span> the root path for documentation.
<span class="kw">></span> <span class="kw">Root</span> path for the documentation [.]:
<span class="kw">You</span> have two options for placing the build directory for Sphinx output.
<span class="kw">Either</span>, you use a directory <span class="st">"_build"</span> within the root path, or you separate
<span class="st">"source"</span> <span class="kw">and</span> <span class="st">"build"</span> directories within the root path.
<span class="kw">></span> <span class="kw">Separate</span> source and build directories (y/n) [<span class="kw">n</span>]: y
<span class="kw">Inside</span> the root directory, two more directories will be created<span class="kw">;</span> <span class="st">"_templates"</span>
<span class="kw">for</span> <span class="kw">custom</span> HTML templates and <span class="st">"_static"</span> for custom stylesheets and other static
<span class="kw">files.</span> You can enter another prefix (such as <span class="st">"."</span>) <span class="kw">to</span> replace the underscore.
<span class="kw">></span> <span class="kw">Name</span> prefix for templates and static dir [_]:
<span class="kw">The</span> project name will occur in several places in the built documentation.
<span class="kw">></span> <span class="kw">Project</span> name: Test
<span class="kw">></span> <span class="kw">Author</span> name(s)<span class="kw">:</span> Mikoto2000
<span class="kw">Sphinx</span> has the notion of a <span class="st">"version"</span> and a <span class="st">"release"</span> for the
<span class="kw">software.</span> Each version can have multiple releases. For example, for
<span class="kw">Python</span> the version is something like 2.5 or 3.0, while the release is
<span class="kw">something</span> like 2.5.1 or 3.0a1. If you don<span class="st">'t need this dual structure,</span>
<span class="st">just set both to the same value.</span>
<span class="st">> Project version: 1.0.0</span>
<span class="st">> Project release [1.0.0]: </span>
<span class="st">The file name suffix for source files. Commonly, this is either ".txt"</span>
<span class="st">or ".rst". Only files with this suffix are considered documents.</span>
<span class="st">> Source file suffix [.rst]: </span>
<span class="st">One document is special in that it is considered the top node of the</span>
<span class="st">"contents tree", that is, it is the root of the hierarchical structure</span>
<span class="st">of the documents. Normally, this is "index", but if your "index"</span>
<span class="st">document is a custom template, you can also set this to another filename.</span>
<span class="st">> Name of your master document (without suffix) [index]: </span>
<span class="st">Sphinx can also add configuration for epub output:</span>
<span class="st">> Do you want to use the epub builder (y/n) [n]: </span>
<span class="st">Please indicate if you want to use one of the following Sphinx extensions:</span>
<span class="st">> autodoc: automatically insert docstrings from modules (y/n) [n]: </span>
<span class="st">> doctest: automatically test code snippets in doctest blocks (y/n) [n]: </span>
<span class="st">> intersphinx: link between Sphinx documentation of different projects (y/n) [n]: </span>
<span class="st">> todo: write "todo" entries that can be shown or hidden on build (y/n) [n]: </span>
<span class="st">> coverage: checks for documentation coverage (y/n) [n]: </span>
<span class="st">> pngmath: include math, rendered as PNG images (y/n) [n]: </span>
<span class="st">> mathjax: include math, rendered in the browser by MathJax (y/n) [n]: </span>
<span class="st">> ifconfig: conditional inclusion of content based on config values (y/n) [n]: </span>
<span class="st">> viewcode: include links to the source code of documented Python objects (y/n) [n]: </span>
<span class="st">A Makefile and a Windows command file can be generated for you so that you</span>
<span class="st">only have to run e.g. `make html'</span> instead of invoking sphinx-build
<span class="kw">directly.</span>
<span class="kw">></span> <span class="kw">Create</span> Makefile? (y/n) [<span class="kw">y</span>]:
<span class="kw">></span> <span class="kw">Create</span> Windows command file? (y/n) [<span class="kw">y</span>]: n
<span class="kw">Creating</span> file ./source/conf.py.
<span class="kw">Creating</span> file ./source/index.rst.
<span class="kw">Creating</span> file ./Makefile.
<span class="kw">Finished</span>: An initial directory structure has been created.
<span class="kw">You</span> should now populate your master file ./source/index.rst and create other documentation
<span class="kw">source</span> files. Use the Makefile to build the docs, like so:
<span class="kw">make</span> builder
<span class="kw">where</span> <span class="st">"builder"</span> is one of the supported builders, e.g. html, latex or linkcheck.</code></pre></div>
<p>こんな感じのディレクトリ構成になります。</p>
<div class="sourceCode"><pre class="sourceCode sh"><code class="sourceCode bash"><span class="kw">mikoto@debian-base</span>:~/sphinx/test$ find ./ -maxdepth 2
<span class="kw">./</span>
<span class="kw">./build</span>
<span class="kw">./Makefile</span>
<span class="kw">./source</span>
<span class="kw">./source/conf.py</span>
<span class="kw">./source/index.rst</span>
<span class="kw">./source/_templates</span>
<span class="kw">./source/_static</span></code></pre></div>
<h3 id="ドキュメント作成">ドキュメント作成</h3>
<p>適当にドキュメントを作ります。</p>
<p>今回は、<code>test.rst</code> を作成して、 <code>index.rst</code> の <code>toctree</code> に <code>test.rst</code> を追加。</p>
<div class="sourceCode"><pre class="sourceCode sh"><code class="sourceCode bash"><span class="kw">mikoto@debian-base</span>:~/sphinx/test$ cat source/test.rst
====
<span class="kw">test</span>
====
<span class="kw">Hello</span> Sphinx document!
<span class="kw">mikoto@debian-base</span>:~/sphinx/test$ cat source/index.rst
<span class="kw">..</span> Test documentation master file, created by
<span class="kw">sphinx-quickstart</span> on Tue Oct 18 23:52:34 2016.
<span class="kw">You</span> can adapt this file completely to your liking, but it should at least
<span class="kw">contain</span> the root <span class="kw">`toctree`</span> directive.
<span class="kw">Welcome</span> to Test<span class="st">'s documentation!</span>
<span class="st">================================</span>
<span class="st">Contents:</span>
<span class="st">.. toctree::</span>
<span class="st"> :maxdepth: 2</span>
<span class="st"> test</span>
<span class="st">Indices and tables</span>
<span class="st">==================</span>
<span class="st">* :ref:`genindex`</span>
<span class="st">* :ref:`modindex`</span>
<span class="st">* :ref:`search`</span></code></pre></div>
<h3 id="ドキュメントビルド">ドキュメントビルド</h3>
<p>プロジェクトルートで <code>make html</code> するだけ。</p>
<div class="sourceCode"><pre class="sourceCode sh"><code class="sourceCode bash"><span class="kw">mikoto@debian-base</span>:~/sphinx/test$ make html
<span class="kw">sphinx-build</span> -b html -d build/doctrees source build/html
<span class="kw">Making</span> output directory...
<span class="kw">Running</span> Sphinx v1.2.3
<span class="kw">loading</span> pickled environment... failed: [Errno 2] No such file or directory: <span class="st">'/home/mikoto/sphinx/test/build/doctrees/environment.pickle'</span>
<span class="kw">building</span> [html]: targets for 2 source files that are out of date
<span class="kw">updating</span> environment: 2 added, 0 changed, 0 removed
<span class="kw">reading</span> sources... [100%] test looking for now-outdated files... none found
<span class="kw">pickling</span> environment... done
<span class="kw">checking</span> consistency... done
<span class="kw">preparing</span> documents... done
<span class="kw">writing</span> output... [100%] test writing additional files... genindex search
<span class="kw">copying</span> static files... done
<span class="kw">copying</span> extra files... done
<span class="kw">dumping</span> search index... done
<span class="kw">dumping</span> object inventory... done
<span class="kw">build</span> succeeded.</code></pre></div>
<p><code>build/html</code> に html ファイルが生成される。</p>
<h3 id="html-を配置">html を配置</h3>
<p>生成された heml ファイルをそのまま nginx のドキュメントルートに突っ込んでしまえば OK。</p>
<div class="sourceCode"><pre class="sourceCode sh"><code class="sourceCode bash"><span class="kw">mikoto@debian-base</span>:~/sphinx/test$ sudo cp -r build/html/* /var/www/html/</code></pre></div>
<p>これで、 <code>http://ホスト名/</code> にアクセスすると、生成した Sphinx ドキュメントが参照できるようになっているはず。</p>
<p>以上。</p>
mikoto2000http://www.blogger.com/profile/08084647632974947669noreply@blogger.com0tag:blogger.com,1999:blog-37637535.post-56534894557238161262016-10-18T23:18:00.000+09:002016-10-18T23:18:43.279+09:00[作業記録][Debian] Debian 最小構成から Redmine を動かすまで(3) - Nginx インストールから自動起動設定まで -<nav id="TOC">
<ul>
<li><a href="#環境">環境</a></li>
<li><a href="#目標">目標</a></li>
<li><a href="#unicorn-の準備">Unicorn の準備</a></li>
<li><a href="#nginx-の準備">Nginx の準備</a><ul>
<li><a href="#nginx-のインストール">Nginx のインストール</a></li>
<li><a href="#nginx-の設定">Nginx の設定</a><ul>
<li><a href="#デフォルトの設定を無効化">デフォルトの設定を無効化</a></li>
<li><a href="#redmine-用の設定ファイル作成">redmine 用の設定ファイル作成</a></li>
<li><a href="#redmine-用の設定を有効化">redmine 用の設定を有効化</a></li>
</ul></li>
<li><a href="#nginx-の動作確認">Nginx の動作確認</a></li>
</ul></li>
</ul>
</nav>
<h2 id="環境">環境</h2>
<ul>
<li>Debian 8.5 最小構成インストール</li>
<li>sudo, vim, ssh はインストール済み</li>
<li>Redmine は準備済み(<a href="http://oyasirazu.blogspot.jp/2016/09/debiandebian-redmine-1.html">前々回</a>の投稿)</li>
<li>Unicorn はインストール済み(<a href="http://oyasirazu.blogspot.jp/2016/10/debian-debian-redmine-2-unicorn.html">前回</a>の投稿)</li>
</ul>
<h2 id="目標">目標</h2>
<p>Redmine + sqlite3 + Nginx + Unicorn な環境を作る。</p>
<p>今回は、 Nginx のインストールから、デーモンとして自動起動するための設定まで。</p>
<h2 id="unicorn-の準備">Unicorn の準備</h2>
<p>nginx と unicorn を socket で連携させるための設定を行う。</p>
<ol type="1">
<li><code>/var/redmine/config/unicorn.rb</code> に <code>listen "/var/redmine/tmp/unicorn.sock"</code> を追加</li>
<li>unicorn リスタート</li>
</ol>
<h2 id="nginx-の準備">Nginx の準備</h2>
<p>Nginx をインストールし、 Unicorn との連携するための設定を行う。</p>
<h3 id="nginx-のインストール">Nginx のインストール</h3>
<div class="sourceCode"><pre class="sourceCode sh"><code class="sourceCode bash"><span class="kw">sudo</span> apt install nginx</code></pre></div>
<h3 id="nginx-の設定">Nginx の設定</h3>
<ol type="1">
<li>デフォルトの設定を無効化</li>
<li>redmine 用の設定ファイル作成</li>
<li>redmine 用の設定を有効化</li>
</ol>
<h4 id="デフォルトの設定を無効化">デフォルトの設定を無効化</h4>
<div class="sourceCode"><pre class="sourceCode sh"><code class="sourceCode bash"><span class="kw">sudo</span> rm /etc/nginx/sites-enabled/default</code></pre></div>
<h4 id="redmine-用の設定ファイル作成">redmine 用の設定ファイル作成</h4>
<p>デフォルト設定をコピーし、redmine 用の設定ファイルにする。</p>
<div class="sourceCode"><pre class="sourceCode sh"><code class="sourceCode bash"><span class="kw">sudo</span> cp /etc/nginx/sites-available/default /etc/nginx/sites-available/redmine.conf</code></pre></div>
<p>redmine 用設定ファイル <code>/etc/nginx/sites-available/redmine.conf</code> を修正する。</p>
<pre class="conf"><code># redmine minimum configuration
server {
listen 80 default_server;
listen [::]:80 default_server;
# Add index.php to the list if you are using PHP
index index.html index.htm index.nginx-debian.html;
location / {
proxy_pass http://unix:/var/redmine/tmp/unicorn.sock;
}
}</code></pre>
<h4 id="redmine-用の設定を有効化">redmine 用の設定を有効化</h4>
<div class="sourceCode"><pre class="sourceCode sh"><code class="sourceCode bash"><span class="kw">sudo</span> ln -s /etc/nginx/sites-available/redmine.conf /etc/nginx/sites-enabled/redmine.conf</code></pre></div>
<h3 id="nginx-の動作確認">Nginx の動作確認</h3>
<div class="sourceCode"><pre class="sourceCode sh"><code class="sourceCode bash"><span class="kw">sudo</span> service nginx restart</code></pre></div>
<p>この後、<code>http://ホスト名:80/</code> にアクセスすれば、 redmine のトップページが見れるはず。</p>
<p>以上。</p>
mikoto2000http://www.blogger.com/profile/08084647632974947669noreply@blogger.com0tag:blogger.com,1999:blog-37637535.post-34087245393907848922016-10-02T02:26:00.000+09:002016-10-02T02:28:08.937+09:00[作業記録][Debian] Debian 最小構成から Redmine を動かすまで(2) - Unicorn インストールから自動起動設定まで -<h2 id="環境">環境</h2>
<ul>
<li>Debian 8.5 最小構成インストール</li>
<li>sudo, vim, ssh はインストール済み</li>
<li>Redmine は準備済み(<a href="http://oyasirazu.blogspot.jp/2016/09/debiandebian-redmine-1.html">前回の投稿</a>)</li>
</ul>
<h2 id="目標">目標</h2>
<p>Redmine + sqlite3 + Nginx + Unicorn な環境を作る。</p>
<p>今回は、 Unicorn のインストールから、デーモンとして自動起動するための設定まで。</p>
<h2 id="手順概要">手順概要</h2>
<nav id="TOC">
<ol>
<li><a href="#環境">環境</a></li>
<li><a href="#目標">目標</a></li>
<li><a href="#手順概要">手順概要</a></li>
<li><a href="#unicorn-の準備">Unicorn の準備</a><ol>
<li><a href="#unicorn-のインストール">Unicorn のインストール</a></li>
<li><a href="#unicorn-の設定">Unicorn の設定</a><ol>
<li><a href="#etcdefaoltunicorn">/etc/defaolt/unicorn</a></li>
<li><a href="#varredmineconfigunicorn.rb">/var/redmine/config/unicorn.rb</a></li>
<li><a href="#ディレクトリ作成">ディレクトリ作成</a></li>
</ol></li>
<li><a href="#unicorn-の動作確認手動">Unicorn の動作確認(手動)</a></li>
<li><a href="#起動スクリプトの準備">起動スクリプトの準備</a><ol>
<li><a href="#起動スクリプト修正">起動スクリプト修正</a></li>
<li><a href="#systemctl-更新">systemctl 更新</a></li>
<li><a href="#動作確認">動作確認</a></li>
</ol></li>
</ol></li>
</ol>
</nav>
<h2 id="unicorn-の準備">Unicorn の準備</h2>
<h3 id="unicorn-のインストール">Unicorn のインストール</h3>
<div class="sourceCode"><pre class="sourceCode sh"><code class="sourceCode bash"><span class="kw">sudo</span> apt install unicorn</code></pre></div>
<h3 id="unicorn-の設定">Unicorn の設定</h3>
<h4 id="etcdefaultunicorn">/etc/default/unicorn</h4>
<p>デフォルトで起動する unicorn の起動スクリプト設定ファイルは <code>/etc/default/unicorn</code> にあるのでこれを編集。 <code>APP_ROOT</code> を Redmine のルートディレクトリに修正。</p>
<p>これと、起動スクリプトをコピーして、 Rails アプリごとに Unicorn サーバーを立てるのが普通なのかな?動なんだろうか。</p>
<pre class="/etc/default/unicorn"><code># Change paramentres below to appropriate values and set CONFIGURED to yes.
# CONFIGURED=no
CONFIGURED=yes
# Default timeout until child process is killed during server upgrade,
# it has *no* relation to option "timeout" in server's config.rb.
TIMEOUT=60
# Path to your web application, sh'ld be also set in server's config.rb,
# option "working_directory". Rack's config.ru is located here.
# APP_ROOT=/path/to/your/web/application
APP_ROOT=/var/redmine
# Server's config.rb, it's not a rack's config.ru
# CONFIG_RB="$APP_ROOT/unicorn.conf.rb"
CONFIG_RB="$APP_ROOT/config/unicorn.rb"
# Where to store PID, sh'ld be also set in server's config.rb, option "pid".
# PID=/run/unicorn.pid
PID=/var/redmine/run/unicorn.pid
# Additional arguments passed to unicorn, see man (1) unicorn.
# UNICORN_OPTS="-D -c $CONFIG_RB"
UNICORN_OPTS="/var/redmine/config.ru -D -c $CONFIG_RB -E production"</code></pre>
<h4 id="varredmineconfigunicorn.rb">/var/redmine/config/unicorn.rb</h4>
<p>unicorn の設定ファイルは、ひな形が <code>/usr/share/doc/unicorn/examples/unicorn.conf.minimal.rb</code> にあるので、それをコピーして使用する。コピー先は、 <code>/etc/default/unicorn</code> 内の <code>CONFIG_RB</code> の設定値(今回は <code>/var/redmine/config/unicorn.rb</code>)。</p>
<div class="sourceCode"><pre class="sourceCode sh"><code class="sourceCode bash"><span class="kw">sudo</span> -u www-data cp /usr/share/doc/unicorn/examples/unicorn.conf.minimal.rb /var/redmine/config/unicorn.rb</code></pre></div>
<p>下記のように修正。</p>
<div class="sourceCode"><pre class="sourceCode /var/redmine/config/unicorn.rb"><code class="sourceCode ruby"><span class="co"># Minimal sample configuration file for Unicorn (not Rack) when used</span>
<span class="co"># with daemonization (unicorn -D) started in your working directory.</span>
<span class="co">#</span>
<span class="co"># See http://unicorn.bogomips.org/Unicorn/Configurator.html for complete</span>
<span class="co"># documentation.</span>
<span class="co"># See also http://unicorn.bogomips.org/examples/unicorn.conf.rb for</span>
<span class="co"># a more verbose configuration using more features.</span>
listen <span class="dv">2007</span> <span class="co"># by default Unicorn listens on port 8080</span>
worker_processes <span class="dv">2</span> <span class="co"># this should be >= nr_cpus</span>
<span class="co"># pid "/path/to/app/shared/pids/unicorn.pid"</span>
pid <span class="st">"/var/redmine/run/unicorn.pid"</span>
stderr_path <span class="st">"/var/redmine/log/unicorn_stderr.log"</span>
<span class="co"># stderr_path "/path/to/app/shared/log/unicorn.log"</span>
stdout_path <span class="st">"/var/redmine/log/unicorn_stdout.log"</span>
<span class="co"># stdout_path "/path/to/app/shared/log/unicorn.log"</span></code></pre></div>
<h4 id="ディレクトリ作成">ディレクトリ作成</h4>
<p>ログ出力先と PID 出力先を作成。</p>
<div class="sourceCode"><pre class="sourceCode sh"><code class="sourceCode bash"><span class="kw">cd</span> /var/redmine
<span class="kw">sudo</span> -u www-data mkdir run log</code></pre></div>
<h3 id="unicorn-の動作確認手動">Unicorn の動作確認(手動)</h3>
<div class="sourceCode"><pre class="sourceCode sh"><code class="sourceCode bash"><span class="kw">cd</span> /var/redmine
<span class="kw">sudo</span> -u www-data unicorn -c config/unicorn.rb -E production</code></pre></div>
<p>これで、ホストの 2007 ポートにアクセスすれば、 Redmine のトップページが見れるはず。 終了は <code>Ctrl-D</code> で。</p>
<h3 id="起動スクリプトの準備">起動スクリプトの準備</h3>
<p><code>/etc/init.c/unicorn</code> がそのままだと動かなかったので修正。</p>
<p>PID と、起動時のオプションを変えた。</p>
<h4 id="起動スクリプト修正">起動スクリプト修正</h4>
<pre class="/etc/init.c/unicorn"><code>#!/bin/sh
### BEGIN INIT INFO
# Provides: unicorn
# Required-Start: $local_fs $remote_fs
# Required-Stop: $local_fs $remote_fs
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: unicorn initscript
# Description: unicorn
### END INIT INFO
set -e
NAME=unicorn
DESC="Unicorn web server"
. /lib/lsb/init-functions
if [ -f /etc/default/unicorn ]; then
. /etc/default/unicorn
fi
DAEMON=/usr/bin/unicorn
# PID=${PID-/run/unicorn.pid}
PID=/var/redmine/run/unicorn.pid
run_by_init() {
([ "${previous-}" ] && [ "${runlevel-}" ]) || [ "${runlevel-}" = S ]
}
exit_with_message() {
if ! run_by_init; then
log_action_msg "$1 Not starting."
fi
exit 0
}
check_config() {
if [ $CONFIGURED != "yes" ]; then
exit_with_message "Unicorn is not configured (see /etc/default/unicorn)."
fi
}
check_app_root() {
if ! [ -d $APP_ROOT ]; then
exit_with_message "Application directory $APP_ROOT is not exist."
fi
}
set -u
case "$1" in
start)
check_config
check_app_root
log_daemon_msg "Starting $DESC" $NAME || true
# if start-stop-daemon --start --quiet --oknodo --pidfile $PID --exec $DAEMON -- $UNICORN_OPTS; then
if start-stop-daemon --start --chdir /var/redmine --quiet --oknodo --pidfile $PID --exec $DAEMON -- $UNICORN_OPTS; then
log_end_msg 0 || true
else
log_end_msg 1 || true
fi
;;
stop)
log_daemon_msg "Stopping $DESC" $NAME || true
if start-stop-daemon --stop --signal QUIT --quiet --oknodo --pidfile $PID; then
log_end_msg 0 || true
else
log_end_msg 1 || true
fi
;;
force-stop)
log_daemon_msg "Forcing stop of $DESC" $NAME || true
if start-stop-daemon --stop --quiet --oknodo --pidfile $PID; then
log_end_msg 0 || true
else
log_end_msg 1 || true
fi
;;
restart|force-reload)
log_daemon_msg "Restarting $DESC" $NAME || true
start-stop-daemon --stop --quiet --oknodo --pidfile $PID
sleep 1
if start-stop-daemon --start --quiet --oknodo --pidfile $PID --exec $DAEMON -- $UNICORN_OPTS; then
log_end_msg 0 || true
else
log_end_msg 1 || true
fi
;;
reload)
log_daemon_msg "Reloading $DESC" $NAME || true
if start-stop-daemon --stop --signal HUP --quiet --oknodo --pidfile $PID; then
log_end_msg 0 || true
else
log_end_msg 1 || true
fi
;;
reopen-logs)
log_daemon_msg "Relopening log files of $DESC" $NAME || true
if start-stop-daemon --stop --signal USR1 --quiet --oknodo --pidfile $PID; then
log_end_msg 0 || true
else
log_end_msg 1 || true
fi
;;
status)
status_of_proc -p $PID $DAEMON $NAME && exit 0 || exit $?
;;
*)
log_action_msg "Usage: $0 <start|stop|restart|force-reload|reload|force-stop|reopen-logs|status>" || true
exit 1
;;
esac</code></pre>
<h4 id="systemctl-更新">systemctl 更新</h4>
<div class="sourceCode"><pre class="sourceCode sh"><code class="sourceCode bash"><span class="kw">sudo</span> systemctl daemon-reload</code></pre></div>
<h4 id="動作確認">動作確認</h4>
<p>起動確認</p>
<div class="sourceCode"><pre class="sourceCode sh"><code class="sourceCode bash"><span class="kw">sudo</span> service unicorn start</code></pre></div>
<p>終了確認</p>
<div class="sourceCode"><pre class="sourceCode sh"><code class="sourceCode bash"><span class="kw">sudo</span> service unicorn stop</code></pre></div>
mikoto2000http://www.blogger.com/profile/08084647632974947669noreply@blogger.com0tag:blogger.com,1999:blog-37637535.post-43528551814522271422016-09-30T21:32:00.000+09:002016-09-30T21:32:00.023+09:00[作業記録][Debian]Debian 最小構成から Redmine を動かすまで(1)<nav id="TOC">
<ul>
<li><a href="#debian-最小構成から-redmine-を動かすまで1">Debian 最小構成から Redmine を動かすまで(1)</a><ul>
<li><a href="#環境">環境</a></li>
<li><a href="#目標">目標</a></li>
<li><a href="#手順概要">手順概要</a></li>
<li><a href="#redmine-の準備">Redmine の準備</a><ul>
<li><a href="#redmine-のインストール">Redmine のインストール</a></li>
<li><a href="#redmine-の動作確認">Redmine の動作確認</a></li>
</ul></li>
</ul></li>
</ul>
</nav>
<h1 id="debian-最小構成から-redmine-を動かすまで1">Debian 最小構成から Redmine を動かすまで(1)</h1>
<h2 id="環境">環境</h2>
<ul>
<li>Debian 8.5 最小構成インストール</li>
<li>sudo, vim, ssh はインストール済み</li>
</ul>
<h2 id="目標">目標</h2>
<p>Redmine + sqlite3 + Nginx + Unicorn な環境を作る。</p>
<p>...が、今回は、Redmine をインストールして、 動作確認のため WEBRick でトップページを拝むまで。</p>
<p>Apache2 は昔やっていたらしい。</p>
<p><a href="http://oyasirazu.blogspot.jp/2012/09/debian-debian-apache2-redmine-indexhtml.html">親知らずの日記: [Debian][鯖][作業記録] Debian 最小構成インストールから Apache2 + Redmine の index.html を拝むまで : http://oyasirazu.blogspot.jp/2012/09/debian-debian-apache2-redmine-indexhtml.html</a></p>
<h2 id="手順概要">手順概要</h2>
<ol type="1">
<li>Redmine の準備
<ol type="1">
<li>Redmine のインストール</li>
<li>Redmine の動作確認</li>
</ol></li>
</ol>
<h2 id="redmine-の準備">Redmine の準備</h2>
<h3 id="redmine-のインストール">Redmine のインストール</h3>
<div class="sourceCode"><pre class="sourceCode sh"><code class="sourceCode bash"><span class="fu">sudo</span> apt install redmine
<span class="ex">...</span>(略、次のは Yes を選択)
┌────────────────────────────────────┤ <span class="ex">Configuring</span> redmine ├
│ │ <span class="ex">The</span> redmine/instances/default package must have a database installed and configured before │
│ <span class="ex">it</span> can be used. This can be optionally handled with dbconfig-common. │
│ │
│ <span class="ex">If</span> you are an advanced database administrator and know that you want to perform this │
│ <span class="ex">configuration</span> manually, or if your database has already been installed and configured, you │
│ <span class="ex">should</span> refuse this option. Details on what needs to be done should most likely be provided │
│ <span class="kw">in</span> <span class="ex">/usr/share/doc/redmine/instances/default.</span> │
│ │
│ <span class="ex">Otherwise</span>, you should probably choose this option. │
│ │
│ <span class="ex">Configure</span> database for redmine/instances/default with dbconfig-common? │
│ │
│ <span class="op"><</span><span class="ex">Yes</span><span class="op">>></span> <span class="op"><</span>No<span class="op">>></span> │
│ │
└─────────────────────────────────────────────────
<span class="ex">....</span>(略、次のは sqlite3 を選択)
┌─────────────────────────────────┤ <span class="ex">Configuring</span> redmine ├
│ <span class="ex">The</span> redmine/instances/default package can be configured to use one of several database │
│ <span class="ex">types.</span> Below, you will be presented with the available choices. │
│ │
│ <span class="ex">Database</span> type to be used by redmine/instances/default: │
│ │
│ <span class="ex">sqlite3</span> │
│ <span class="ex">pgsql</span> │
│ <span class="ex">mysql</span> │
│ │
│ │
│ <span class="op"><</span><span class="ex">Ok</span><span class="op">></span> <span class="op"><</span>Cancel<span class="op">></span> │
│ │
└──────────────────────────────────────────────
<span class="ex">....</span>(略)</code></pre></div>
<h3 id="redmine-の動作確認">Redmine の動作確認</h3>
<p>デフォルトの場所が気に入らないので移動して動作確認する。</p>
<div class="sourceCode"><pre class="sourceCode sh"><code class="sourceCode bash"><span class="fu">sudo</span> mkdir /var/redmine
<span class="bu">cd</span> /var/redmine
<span class="fu">sudo</span> cp -a /usr/share/redmine/* /var/redmine/
<span class="fu">sudo</span> chown -R www-data:www-data /var/redmine/
<span class="fu">sudo</span> -u www-data ruby bin/rails server webrick -e production</code></pre></div>
<p>この状態でホストの 3000 ポートにアクセスすれば、 Redmine のトップページが拝める。</p>mikoto2000http://www.blogger.com/profile/08084647632974947669noreply@blogger.com1tag:blogger.com,1999:blog-37637535.post-41917102298084735472016-09-28T07:30:00.002+09:002016-09-28T07:36:32.320+09:00[作業記録] TOPPERS/ATK2 のソースコードを Doxygen と Graphviz を使って HTML ドキュメント化<br />
<nav id="TOC">
<ul>
<li><a href="#目標">目標</a></li>
<li><a href="#やることリスト">やることリスト</a></li>
<li><a href="#ソフト類ダウンロードインストール">ソフト類ダウンロード・インストール</a><ul>
<li><a href="#ドキュメント生成に必要なソフト">ドキュメント生成に必要なソフト</a></li>
<li><a href="#toppersatk2-に必要なソフト">TOPPERS/ATK2 に必要なソフト</a></li>
</ul></li>
<li><a href="#toppersatk2-関係のファイル取得">TOPPERS/ATK2 関係のファイル取得</a></li>
<li><a href="#展開配置">展開・配置</a></li>
<li><a href="#ターゲット外のファイルを削除">ターゲット外のファイルを削除</a></li>
<li><a href="#自動生成ファイルを作る">自動生成ファイルを作る</a></li>
<li><a href="#doxygen-でドキュメント作成">Doxygen でドキュメント作成</a></li>
</ul>
</nav>
<br />
<h1 id="目標">
目標</h1>
TOPPERS/ATK2 のソースコードを Doxygen と Graphviz を使って HTML ドキュメント化したい。<br />
以下、TOPPERS/ATK2 というか、「<a href="http://dev.toppers.jp/trac_user/contrib/browser/rc_autosar_rh850">AUTOSAR開発教材</a>」の HTML ドキュメント化手順になってしまっているが、気にしないことにする。
<h1 id="やることリスト">
やることリスト</h1>
<ol>
<li>ソフト類ダウンロード・インストール</li>
<li>TOPPERS/ATK2 関係のファイル取得
<ol>
<li>AUTOSAR開発入門用プログラム</li>
<li>TOPPERS/ATK2 カーネル簡易パッケージ</li>
<li>TOPPERS/A-RTEGEN</li>
<li>TOPPERS/A-COMSTACK</li>
<li>TOPPERS/A-COMSTACK CAN ターゲット依存部</li>
<li>AUTOSAR XML スキーマファイル</li>
</ol>
</li>
<li>展開・配置</li>
<li>ターゲット外のファイルを削除</li>
<li>自動生成ファイルを作る</li>
<li>Doxygen でドキュメント作成</li>
</ol>
<h1 id="ソフト類ダウンロードインストール">
ソフト類ダウンロード・インストール</h1>
インストール手順は省略。それぞれインストールしてパスを通しておく。<br />
<h2 id="ドキュメント生成に必要なソフト">
ドキュメント生成に必要なソフト</h2>
<ul>
<li><a href="http://www.stack.nl/~dimitri/doxygen/download.html">Doxygen: Downloads : http://www.stack.nl/~dimitri/doxygen/download.html</a></li>
<li><a href="http://www.graphviz.org/Download_windows.php">windows | Graphviz - Graph Visualization Software : http://www.graphviz.org/Download_windows.php</a></li>
<li><a href="http://www.vector.co.jp/soft/dl/win95/util/se295331.html">nkf.exe nkf32.dll Windows用の詳細情報 : Vector ソフトを探す! : http://www.vector.co.jp/soft/dl/win95/util/se295331.html</a></li>
</ul>
<h2 id="toppersatk2-に必要なソフト">
TOPPERS/ATK2 に必要なソフト</h2>
<ul>
<li><a href="http://www.oracle.com/technetwork/java/javase/downloads/index.html">Java SE - Downloads | Oracle Technology Network | Oracle : http://www.oracle.com/technetwork/java/javase/downloads/index.html</a></li>
<li><a href="http://rubyinstaller.org/">RubyInstaller for Windows : http://rubyinstaller.org/</a></li>
</ul>
<h1 id="toppersatk2-関係のファイル取得">
TOPPERS/ATK2 関係のファイル取得</h1>
<ul>
<li><a href="http://dev.toppers.jp/trac_user/contrib/browser/rc_autosar_rh850">rc_autosar_rh850 – Contributed Software : http://dev.toppers.jp/trac_user/contrib/browser/rc_autosar_rh850</a> から Zip Archive をダウンロード</li>
<li><a href="https://www.toppers.jp/atk2-e-download.html">TOPPERSプロジェクト/ATK2カーネル : https://www.toppers.jp/atk2-e-download.html</a> から「atk2-sc1_hsbrh850f1l_ccrh-20150526.tar.gz」をダウンロード</li>
<li><a href="https://www.toppers.jp/a-rtegen-download.html">TOPPERSプロジェクト/ダウンロード : https://www.toppers.jp/a-rtegen-download.html</a> から「A-RTEGEN Release 1.2.2(バイナリのみ)」をダウンロード</li>
<li><a href="https://www.toppers.jp/a-comstack-download.html">TOPPERSプロジェクト/ダウンロード : https://www.toppers.jp/a-comstack-download.html</a> から「A-COMSTACK Release 1.2.1」をダウンロード</li>
<li><a href="https://www.toppers.jp/a-can-download.html">TOPPERSプロジェクト/A-CAN簡易パッケージ : https://www.toppers.jp/a-can-download.html</a> から「a-can_hsbrh850f1l_ccrh-20150715.tar.gz」をダウンロード</li>
<li><a href="https://www.autosar.org/specifications/release-40/methodology-and-templates/templates/">Templates : AUTOSAR : https://www.autosar.org/specifications/release-40/methodology-and-templates/templates/</a> の「AUTOSAR MMOD XMLSchema」をダウンロード</li>
</ul>
<h1 id="展開配置">
展開・配置</h1>
下記リンク先、「AUTOSAR開発入門用プログラム」の README の記述を参照し、ファイルを配置する。<br />
<a href="http://dev.toppers.jp/trac_user/contrib/browser/rc_autosar_rh850/trunk/README.txt#L108">README.txt in rc_autosar_rh850/trunk – Contributed Software : http://dev.toppers.jp/trac_user/contrib/browser/rc_autosar_rh850/trunk/README.txt#L108</a><br />
<h1 id="ターゲット外のファイルを削除">
ターゲット外のファイルを削除</h1>
<ul>
<li>a-comstack/canif/sample</li>
<li>a-comstack/com/sample</li>
<li>a-comstack/pdur/sample</li>
<li>a-rtegen/sample</li>
<li>atk2-sc1/sample</li>
<li>os-application</li>
<li>swc-application/1ecu</li>
<li>swc-application/2ecu_co_b</li>
<li>swc-application/2ecu_cod_b</li>
<li>swc-application/2ecu_od_cb</li>
</ul>
<h1 id="自動生成ファイルを作る">
自動生成ファイルを作る</h1>
下記バッチファイルを実行し、ジェネレータにファイルを自動生成させる。<br />
<ul>
<li>swc-application/3ecu/ecu_extract.bat</li>
<li>swc-application/3ecu/ecu_b/generator.bat</li>
<li>swc-application/3ecu/ecu_c/generator.bat</li>
<li>swc-application/3ecu/ecu_od/generator.bat</li>
</ul>
<code>generator.bat</code> 実行時に、<code>cfg: error: cannot open file `cfg1_out.srec'</code> といわれるが、今回は無視。CS+ インストールする元気がなかった...。<br />
<h1 id="doxygen-でドキュメント作成">
Doxygen でドキュメント作成</h1>
スタートから Doxywizard を起動する。<br />
ウィザードにしたがって設定を入力する。<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://4.bp.blogspot.com/-8ZjN22VCGyE/V-rvp_KnQdI/AAAAAAAAFks/IwD-O0fQhbsS7-ebnlaudDKBYkbiThtNQCLcB/s1600/01.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="264" src="https://4.bp.blogspot.com/-8ZjN22VCGyE/V-rvp_KnQdI/AAAAAAAAFks/IwD-O0fQhbsS7-ebnlaudDKBYkbiThtNQCLcB/s320/01.png" width="320" /></a></div><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://2.bp.blogspot.com/-fpD0mPVf94A/V-rvpxAiRSI/AAAAAAAAFkw/PTE3xJUZI2UoMF6XauP6ivraIhpaBZk2gCLcB/s1600/02.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="264" src="https://2.bp.blogspot.com/-fpD0mPVf94A/V-rvpxAiRSI/AAAAAAAAFkw/PTE3xJUZI2UoMF6XauP6ivraIhpaBZk2gCLcB/s320/02.png" width="320" /></a></div><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://2.bp.blogspot.com/-nRraKQPJjws/V-rvp-QyQ9I/AAAAAAAAFko/rBpWgXUItfQptd1n6rG46WMWFnwIlLN7gCLcB/s1600/03.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="264" src="https://2.bp.blogspot.com/-nRraKQPJjws/V-rvp-QyQ9I/AAAAAAAAFko/rBpWgXUItfQptd1n6rG46WMWFnwIlLN7gCLcB/s320/03.png" width="320" /></a></div><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://2.bp.blogspot.com/-yJYN5TbD6kQ/V-rvqbAse9I/AAAAAAAAFk0/H0nqWh97CA8dUq6KjwrQQCCooldISZ2YQCLcB/s1600/04.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="264" src="https://2.bp.blogspot.com/-yJYN5TbD6kQ/V-rvqbAse9I/AAAAAAAAFk0/H0nqWh97CA8dUq6KjwrQQCCooldISZ2YQCLcB/s320/04.png" width="320" /></a></div><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://2.bp.blogspot.com/-kNTVHupjp98/V-rvqqnog7I/AAAAAAAAFk8/BCedAYGVGCE6F0VLtsl4nlruRpah2RbCQCLcB/s1600/05.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="264" src="https://2.bp.blogspot.com/-kNTVHupjp98/V-rvqqnog7I/AAAAAAAAFk8/BCedAYGVGCE6F0VLtsl4nlruRpah2RbCQCLcB/s320/05.png" width="320" /></a></div><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://3.bp.blogspot.com/-SmZG7hDOJDQ/V-rvqYaJAxI/AAAAAAAAFk4/W4uBTdZ1eLECqPM-hClXG1r_VtT0Y9XoACLcB/s1600/06.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="264" src="https://3.bp.blogspot.com/-SmZG7hDOJDQ/V-rvqYaJAxI/AAAAAAAAFk4/W4uBTdZ1eLECqPM-hClXG1r_VtT0Y9XoACLcB/s320/06.png" width="320" /></a></div><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://4.bp.blogspot.com/-x_wlIPOLAyI/V-rvq40wm0I/AAAAAAAAFlA/JHmGTy8I-D4sF-crEP5Osxaw5CDaS7dQwCLcB/s1600/07.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="264" src="https://4.bp.blogspot.com/-x_wlIPOLAyI/V-rvq40wm0I/AAAAAAAAFlA/JHmGTy8I-D4sF-crEP5Osxaw5CDaS7dQwCLcB/s320/07.png" width="320" /></a></div>
<div style="text-align: center;">
OUTPUT_LANGUAGE を「Japanese」に変更。</div><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://3.bp.blogspot.com/-YVBA8X-dT7Y/V-rvqyZz_tI/AAAAAAAAFlE/t0rbuWer0X82EnQTGXB--Flwo-pEifkXwCPcB/s1600/08.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="264" src="https://3.bp.blogspot.com/-YVBA8X-dT7Y/V-rvqyZz_tI/AAAAAAAAFlE/t0rbuWer0X82EnQTGXB--Flwo-pEifkXwCPcB/s320/08.png" width="320" /></a></div>
<div style="text-align: center;">
INPUT_FILTER を「nkf -w」に変更。<br />FILTER_SOURCE_FILES にチェックを入れる。<br />FILTER_SOURCE_PATTERNS に「*」を追加。</div><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-f1h7cRWO6CE/V-rvrHIsshI/AAAAAAAAFlI/sZv5e73juwoQApsxUB3m2Gc62EF7JY4RgCPcB/s1600/09.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="264" src="https://1.bp.blogspot.com/-f1h7cRWO6CE/V-rvrHIsshI/AAAAAAAAFlI/sZv5e73juwoQApsxUB3m2Gc62EF7JY4RgCPcB/s320/09.png" width="320" /></a></div>
こんな感じのドキュメントが生成される。<br />
...とはいえ、Doxygen が認識できる形式でコメントが書かれていないので、残念な感じは否めない。<br />
以上。mikoto2000http://www.blogger.com/profile/08084647632974947669noreply@blogger.com0