ラベル Linux の投稿を表示しています。 すべての投稿を表示
ラベル Linux の投稿を表示しています。 すべての投稿を表示

4/30/2016

UbuntuにGoogle Noto Fonts を導入する (Adobe Source Han Sans 源ノ角ゴシック)

フォント大事。特にソースコードを読み書きするのに、一日中付き合うわけですから。美しくて読みやすいということは、生産性に影響します。

で、Adobeの 源ノ角ゴシック(Source Han Sans)という、結構よさげなフォントの存在を知ったのですが、どうやら、これはGoogleとAdobeの共同開発で、Google的には Noto Sans。その日本語フォントをAdobe的には、Source Han Sansの一部として 源ノ角ゴシックとしているみたい。

今回はGoogle Noto Fontを使うことにする。

まず、ダウンロード。以下のページダウンロードボタンクリックして、全部入りの「Noto-hinted.zip」をダウンロード 。もしくは、他の言語いらね。という場合は、日本語だけでもいいかも。CJK JPとついてるやつが日本語フォント。

https://www.google.com/get/noto/


そしてインストール。方法も丁寧に書かれてます。

https://www.google.com/get/noto/help/install/

システム全体で使いたい場合は、ちょっと面倒くさい感じですね。
シングルユーザーでの使用で、GnomeやUnity Desktopであれば、ホームフォルダの所定の場所に解凍するだけっぽいので、今回はこっちでいってみます。

$ cd ~/
$ mkdir .fonts
$ cd .fonts
$ mkdir noto
$ cd noto
$ cp ~/Downloads/Noto-hinted.zip .
$ unzip Noto-hinted.zip
$ rm Noto-hinted.zip

コマンドで書くと面倒くさげですが、GUIでもできます。要するに、ホームディレクトリに「./font/noto」というディレクトリ作って、その中にフォントファイル一式を解凍するだけ。(.font直下でもよい)

これだけ。
あとは、Unity Tweak Toolで、フォント変更する。


Notoフォントファミリーは全部入れると、様々な国の言語をサポートしてて、結構膨大。Noto Sans CJK JPととついてるのが、日本語フォントです。CJK JPだけインストールしればいい気がしてきた(笑)。

以下、Takao Gothicと比較

Takao Gothic

Noto Sans CJK Jp Regular

Noto Sansは、のびのびした感じ。フォルムも綺麗。うん、なかなかいいかも。しばらくこれでやってみることにする。



参考URL:
https://ja.wikipedia.org/wiki/Noto 
https://ja.wikipedia.org/wiki/Source_Han_Sans
https://hakatashi.github.io/exhibit/noto-fonts/


4/27/2016

Intel Parallel Studio XE Professional Edition For Linuxの無償版をゲットする

IntelのCコンパイラ(通称 ICC)はプロセッサメーカーだけあって、最適化がかなり強力です。
これが、Intel Parallel Studioという製品に含まれています。

http://www.xlsoft.com/jp/products/intel/studio_xe/index.html

マス・カーネル・ライブラリ(MKL)だとか、 スレッディング・ビルディング・ブロック(TBB)とか、インテグレーテッド・パフォーマンス・プリミティブ(IPP)等、強力なライブラリも使えたり。

(ちなみに、インテルのライブラリだけ使いたい場合はコミュニティライセンスの元、誰でも無償で使えます。https://software.intel.com/sites/campaigns/nest/)

魅力的な製品ですが、買うと結構高いです。それが非商用でオープンソースソフトウェアの開発には無償で利用できます。
入手条件として、なんらかのオープンソースソフトウェアを実際にGithub等に公開して開発している必要があります。

入手に結構手間取ったので、困ってる人のために共有。

まず、Intelのフリー開発ツールのFree Tools For Open Source Contributorのページに行きます。

https://software.intel.com/en-us/qualify-for-free-software/opensourcecontributor



下の方の Offer: Get Intel® Parallel Studio XE Professional Edition: For Linuxのリンクをクリックします。



利用条件が書いてあるので、一通り読んで、チェックしてAcceptをクリック



すると、メールや氏名を入力する画面になるので、入力。問題は、URLのところ。ここに、自身のオープンソースプロジェクトの公開先URLを入力する必要があります。下のProject Descriptionにはプロジェクトの説明を入力。

そして、このプロジェクトの審査があります。数日後にメールに返信があります。お馬鹿なURL入力しても、却下されます。私は過去に2〜3回却下されました。(笑)

却下されたパターンとしては、ブログ等のページを指定とか、内容が無いに等しいプロジェクトとか。もしかすると、製品の性質上、C/C++や、Fortranのプロジェクトじゃないとダメな可能性も。

 今回は、自身のGithubで公開しているLinux用のメモリーとか物理アドレス読み書きプロジェクトを指定したら通りました。内容はまったく薄いです。Cのファイルが3つだけ、Makefileすら作ってない。でもちゃんと動いて、目的のことができて、Description通り。ちゃんと開発するし。このくらいで、審査通るみたいです。
https://github.com/sig-ishihara/linux_pysical_address_rw_cmd

で、審査通ると以下のようなメールが来ます。


ダウンロードリンクと、シリアルナンバーもらえます。


自分のIntelアカウントのプロダクトみるとこんなんです。


 色々使えるようになりました〜。わーい。

早速、ダウンロードしてインストール。.tgzになってるので、解凍。install_GUI.shを実行するとインストーラが立ち上がる。あとは、黙々とインストールを進める。



インストーラがムサ苦しい。上に重くて待たされまくり。インテルさん、こういうGUIツールへたくそなんだよね。(笑)


完了!

したらば、以下を実行してコンポーネントを初期化

$ cd /opt/intel/parallel_studio_xe_2016.2.062
$ sudo ./psxevars.sh

これで、コマンドラインからは使えるっぽ。
次にEclipseに統合。予めCDTは入れとく。

Help ->Install New Software で、AddしてLocal以下を追加してプラグインをインストール
 /opt/intel/parallel_studio_xe_2016.2.062/ide_support_2016/eclipse/compiler_xe
 /opt/intel/parallel_studio_xe_2016.2.062/ide_support_2016/eclipse/gdb_xe

これでOK


統合できたっぽ。


新しいCプロジェクト作るとIntelコンパイラ選べるようになってる!


ツールチェインも追加されてる 。


他にも、V Tune Ampilifierなる最適化指南ツールが使えたりする。UIはセンスの微塵もありませんが(笑)

よし。これで、もりもりハイパフォーマンスなブツ作れます。


11/06/2015

Ubuntuで、Android本体(Android Open Source Project)のソースコードをビルドしてみる

AndroidのOS基本部分はソースが公開されていることは、ご存じの方も多いと思いますが、最近ちょっと、Androidのアーキテクチャをリサーチしてみたり、手を加えてみたい欲求が出てきたので、ソースコード取得&ビルドまでをやってみる。の記録。

本家ページは以下。手順も書いてある。
http://source.android.com/source/index.html


サポートされている開発環境は、Ubuntu14.04 or Macで、メモリー16GB、ディスク100GB以上(ソース)、ビルドするなら150GB〜200GBいるとか書いてある。

うちには、そんな贅沢なスペックのマシンはありません。でもやる。最近中古で買ったメインマシンのHP Spectre(Ivy Bridge)がメモリー4GB、SSD250GBと、きわどいスペックですが、きっとビルド遅いだけで済むでしょう。Windows10マシンとして使っていたところ、急遽Ubuntu14.04 64bitをインストール。ハードウェアも、ほどよく枯れているので、とくにトラブルもなく快適動作。SkylakeのPCほしー。コスパ的に私が買うのは2年後の中古かなー。


まずは、要るものインストール

JDKから

$ sudo apt-get update
$ sudo apt-get install openjdk-7-jdk



別のJDKをデフォルトにしている人は以下で、切り替える

$ sudo update-alternatives --config java
$ sudo update-alternatives --config javac

なんだか、OpenJDK使えとな。Oracleのじゃなくて。ここはとりあえず、従っておく。Googleさんのスタンスとして、このへんどうなんだろう。AndroidStudioだとOracleのリンクが指定されていたり。AOSPは、別扱いなのだろうか。まあ、今はいいや。今度、ちゃんとドキュメントちゃんと読みます。


コンパイルに必要なものをインストール

$ sudo apt-get install bison g++-multilib git gperf libxml2-utils make python-networkx zlib1g-dev:i386 zip


USBでAndroidデバイスを認識できるようudev設定追加。ハードウェアにデプロイしないのなら要らないと思われ。

$ wget -S -O - http://source.android.com/source/51-android.rules | sed "s/<username>/$USER/" | sudo tee >/dev/null /etc/udev/rules.d/51-android.rules; sudo udevadm control --reload-rules


ソースをダウンロードするのに、repoというコマンドを使うので、その下ごしらえ

$ mkdir ~/bin
$ PATH=~/bin:$PATH
$ curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
$ chmod a+x ~/bin/repo


ソースを取得するディレクトリ作成。私はとりあえずaospとしましたが、好きな名前でOKです。

$ mkdir aosp
$ cd aosp


repo初期化

$ repo init -u https://android.googlesource.com/platform/manifest


ブランチ指定したい人は、以下のように指定。ブランチ一覧はここを参考に。

$ repo init -u https://android.googlesource.com/platform/manifest -b android-4.0.1_r1

ソース取得

$ repo sync


家のネット環境がイモ(Wimax)なせいか、頻繁にエラーで中断される。何度かやり直して、Done。
この時点でソースの総容量が、約13GB、うーん。推奨環境では100GBという話だったが、ちゃんと全部取得できてるんやろか。

とりあえず、ビルドまで通してみる。

$ source build/envsetup.sh
$ lunch aosp_arm-eng

引数のビルドタイプはプロセッサアーキやハードウェアの指定+user, userdebug, engとある。eng(多分エンジニアリングとかの意と思われ)はデバッグ可能な開発者向けビルド的なやつっぽ。タブで補完すれば、指定可能なオプションが確認できる。

現時点で選択可能なのは以下だった。

aosp_angler-userdebug
aosp_arm-eng
aosp_arm64-eng
aosp_bullhead-userdebug
aosp_deb-userdebug
aosp_flo-userdebug
aosp_flounder-userdebug
aosp_fugu-userdebug
aosp_hammerhead-userdebug
aosp_hammerhead_fp-userdebug
aosp_mips-eng
aosp_mips64-eng
aosp_shamu-userdebug
aosp_x86-eng
aosp_x86_64-eng
full_fugu-userdebug
m_e_arm-userdebug
mini_emulator_arm64-userdebug
mini_emulator_mips-userdebug
mini_emulator_x86-userdebug
mini_emulator_x86_64-userdebug



$ make -j4

知ってる人は多いと思いますが、-j4は並列コンパイルのスレッド数を指定。ホストマシンのコア数によって加減する。当然、多くすれば、コンパイルが早いが、マシン性能を超えて指定しても、早くはならない。一般にコア数の2倍程度が良好とされるが(昔の目安)、最近は4コア8スレッドとか、物理コア1つにつき、ハイパースレッディングで仮想コア2つみたいなアーキになってきたりしてるので、そのあたりも踏まえて、自分のマシンで、いろいろ試して、いい感じの並列数を探すのがいいのかもしれない。

で、ビルドが、なんとか終わる、正確に測ってなかったが、 Core i7-3517U  1.90GHz (2Core, 4Thread) のCPUで、-j4オプションで、約4時間くらい。

早速、実行してみる。実機デバイスに焼くというてもありますが、今、デプロイしちゃっていい端末や、開発ボードもないので、エミュレーターで起動させてみる。

$ emulator





なんとも言えない、やっちまった感漂うブートスプラッシュの趣。



うーん。なんだか、しょぼいホーム画面です。Nexus5を愛用してるので、それに近いものが出てくると勝手に予想してましたが、思いの外、オープンソースになってる部分だけでは、しょぼい感じのようです。ビルド指定が、ただのarmだからだろうか。hammerhead(nexus5のコードネーム)というビルドオプションもあるので、次はそれでやってみようかな。


ちょっと、目を疑ったので、ビルド情報確認。

Android6.0で、ビルドナンバーには今日の日付と、私の名前入ってます。どうやら、私がビルドしたものに間違いないようです。

ちなみに、ビルド後の作業ディレクトリの総容量は約41GBでした。ごにょごにょしていくと増えていくんでしょうが、思ったほどでかくなくて、助かりました。最近、ラップトップの内蔵ストレージが、SSDやeMMCになって容量あたりのコスト高いですからねえ。足りなくなりがち。 とりあえず、当初の目標であるソース取得からビルドまでは、無事できましたので、これからイジって行きたいと思います。

今回はこんなところで。



11/03/2015

Asus x205taでUbuntu14.04LTSを使う タッチパッド対策

5月くらいから、Asus x205taにUbuntu14.04をインストールして使っておりましたが、(LinuxMintはやめた)タッチパッドが、スクロールできなかったり、タップ無効にできなかったりで、不便でしたが治りました。

LinuxMint等、Ubuntu派生ディストリはこの方法で行けると思われます。

といっても、カーネルが対応したというだけのこと。ただのマウスっぽく認識していたところ、カーネル4.3以上でタッチパッドとして認識するようになりました。

4.3以上で対応するということは、前情報で知っていたので、kernel ppaにて、 まだか、まだかと、こまめにチェックしてカーネル取っ替え引っ替えしていたところ、4.3の安定版が提供され始めたのでインストール

http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.3-wily/

↑から、

linux-headers-4.3.0-040300-generic_4.3.0-040300.201511020949_amd64.deb
linux-headers-4.3.0-040300_4.3.0-040300.201511020949_all.deb
linux-image-4.3.0-040300-generic_4.3.0-040300.201511020949_amd64.deb

をもらってきて、$sudo dpkg -i linux*

だけで、タッチパッドがまともになりました。カーネルモジュールや、X11関連の設定ファイルは特にイジらなくてもよさげ。これで、2本指スクロール。タップ無効ができて快適になりました。



が、しばらく使っていて、よくフリーズする。経験即で、カーネル4.2以上だとx205taは固まる頻度が高い感じがする。acpiとi2cのなんかっぽい情報は、web上で、ちらほら見かけますが、このカーネルバージョン(あるいはビルドオプション)でも、今一つのよう。現時点で、安定性を重視するならタッチパッド諦めて、4.1系を使っていたほうが無難かも。

あと、サウンドとblue toothは依然、認識せず。パーフェクトになるには、まだまだカーネル開発が進むのを待つ必要がありそうです。カーネルソースを自力でイジればいいんでしょうが、ヘタレなので今の所、待ちのスタンスで(笑)

今日は以上です。


8/29/2015

Asus x205ta にLinuxMintインストール&Wifi、MicroSD有効化(Ubuntu, Debianにも)

最近、商売気が強くなってきたUbuntuより、LinuxMintに乗り換えたほうが幸せな予感と思い、試運転も含めてインストール。

インストール手順を記録。

1. http://www.linuxmint.com/よりLinux Mint 17.2 Cinnamon 64bit版をダウンロード

2. Universal USB Installerを使ってUSBメモリにインストールディスクを書き込む

3. bootia32.efiをもらってきてUSBメモリの「/EFI/BOOT/」にコピー

4. x205taのBIOS設定でSecure Boot ControlをDisableにしておく、インストール段階では内蔵Wifiが使えないのでUSBのWifiアダプタか、有線LANアダプタでもつないで、どうにかインターネットに繋がるようにしておく。

5. USBメモリから起動して、普通にインストール。キーボードが勝手に連打されたりする現象があったりするのでパスワード入力とか気をつける。現象は後でアップデートすると治るのでとりあえず我慢。

6. インストール後、このままでは、32bitUEFIの関係で再起動してもSSDから起動しないので、USBメモリのGrubを使ってSSD内のLinuxMintを起動する。USBメモリから起動し、Grubの起動選択画面で、「ctrl-c」でプロンプトに落ちて、以下を入力。(ちなみにタブで補完できる)

> linux (hd1,gpt2)/boot/vmlinuz-3.16-0-38-generic root=/dev/mmcblk0p2 reboot=pci,force
> initrd (hd1,gpt2)/boot/initrd-3.16-0-38-generic 
> boot

7. 32bitUEFI用Grubをインストール。これでSSDから直接起動できる。以前、Ubuntu14.04のインストールを試した時はEFIバリアブルへブートローダーの登録に失敗していて、面倒くさいことになっていたが、このバージョンのLinuxMintでは問題なかった。これでUSBメモリ無しで自力で起動。

$ sudo apt-get install grub-efi-ia32

7. このままだと、内蔵Wifi、MicroSDカードリーダー等が使えない。これはカーネルをかなり新しめにバージョンアップし、ゴニョゴニョすると解決する。チップセットが新しいのでカーネルのドライバ対応が追いついていないんですね。http://kernel.ubuntu.com/~kernel-ppa/mainline/より新し目のカーネルパッケージをもらってくる。今回はv4.1.6-unstable/を使用。

$ wget http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.1.6-unstable/linux-headers-4.1.6-040106-generic_4.1.6-040106.201508170230_amd64.deb
$ wget http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.1.6-unstable/linux-headers-4.1.6-040106_4.1.6-040106.201508170230_all.deb
$ wget http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.1.6-unstable/linux-image-4.1.6-040106-generic_4.1.6-040106.201508170230_amd64.deb
$ sudo dpkg -i linux*


8. Wifiチップのファームウェアをセットアップ

$ wget https://android.googlesource.com/platform/hardware/broadcom/wlan/+archive/master/bcmdhd/firmware/bcm43341.tar.gz
$ tar -zxvf bcm43341.tar.gz
$ sudo cp fw_bcm43341.bin /lib/firmware/brcm/brcmfmac43340-sdio.bin
$ sudo cp /sys/firmware/efi/efivars/nvram-74b00bd9-805a-4d61-b51f-43268123d113 /lib/firmware/brcm/brcmfmac43340-sdio.txt


sysfsutilsをインストール

$ sudo apt-get install sysfsutils


「/etc/sysfs.conf 」に以下を追記

bus/platform/drivers/sdhci-acpi/INT33BB:00/power/control = on


7. MicroSDカードリーダーを有効化する。「/etc/modprobe.d/sdhci.conf」に以下を追記(無ければ新規作成)

options sdhci debug_quirks=0x8000

で、以下を実行

$ sudo update-initramfs -u -k all

これで、再起動すれば、めでたく、内蔵Wifiとカードリーダーが使えてるはず。これで、かなり実用度アップ。

現時点では、オーディオはダメですが、いずれカーネルが対応すれば使える日もくることを期待しつつ。あと、タッチパッドの2本指スクロールや、タップ無効が効かないのが地味に不便。ただのマウスとして認識しているのかもしれない。対策知っている方いらっしゃいましたら、ぜひ教えて頂きたいです。

今回はこれくらいで。


参考URL: https://wiki.debian.org/InstallingDebianOn/Asus/X205TA



7/17/2015

aptコマンド小ネタ

LinuxでUbuntuやLinuxMint、Debian等のaptがパッケージマネージャのディストリビューションで便利なネタのメモ

apt-get update

で、システムに登録されているパッケージ情報を更新し、

apt-get install software-name

とすると、ソフトウェアパッケージをネットからダウンロードしてきてインストールできるわけですが、一字一句違わず正確なパッケージ名が分からないとインストールできないわけです。

そこで、便利なのが、apt-cacheというコマンド

apt-cache search keyword

とすると、その文字列を含むパッケージ名を検索できます。また、何かコードを書いて、ビルドしようとしたり、サンプルソースコードをビルドしようとしてヘッダーやライブラリが無くてエラーということはよくある話です。そんな時は、apt-fileが便利です。

apt-file update
apt-file search "file-name"

とやると、そのファイルが含まれるパッケージが検索できます。


あと、ディスク容量を節約するのに以下が役に立ちます。

apt-get clean

とすると、過去にインストールするためにダウンロードされたパッケージのキャッシュをクリアできます。一度インストールしてしまえば、再インストールするとき意外、不要なので、積極的にクリアしても問題ないです。再インストールするときは、キャッシュが無ければ再ダウンロードされるだけで、同じパッケージを何回もインストールし直すこと自体あまり無いことなので、このキャッシュが活躍することはあまり無いと思われます。

それから

apt-get auto-remove

とやると、使われていないパッケージを一括削除できます。aptパッケージマネージャでは、一つのアプリケーションをインストールする際、そのアプリケーションを動作させるのに必要な依存パッケージを芋づる式にインストールしてくれて便利なのですが、パッケージを削除したり更新したりしていると、そうした芋づるインストールされたパッケージが、実は今はもう使っていないということがよくあります。ですが、自動的にインストールされたものは何に使われているのか判断が難しいという問題があり、このコマンドがそのあたりをうまいことやってくれます。



今回はこのへんで。


5/13/2015

Asus x205taにUbuntu14.04LTSをインストール

Asus x205taがコスパが良くUbuntuマシンにしようと思って買ったもののBay trailのPCはすんなりとはインストールできないとわかって、Windowsで我慢してたが、重い腰を上げてチャレンジ。

問題は、BIOSが32bit UEFIでレガシBIOS互換モジュール無しなところ。
つまり32bit UEFIブートしかできない。がしかし、Ubuntuを含め、32bit版のインストールディスクではUEFIブートをサポートしていない。(というか、Linuxカーネルが32bitでUEFIをサポートしない方針っぽい)64bitのインストールディスクは64bitUEFIブートしかサポートしていない。というめんどくさいことになっているのです。Linuxサイドでは、64bit CPUにわざわざ32bit UEFIを使うなんてことが想定外なのでしょう。

Bay trailは64bitでも動くのだが、このマシンを含め、最近の低価格タブレットのマシンでは、なぜか、32bit UEFIを実装している。インテルさんの都合か、BIOSベンダーさんの都合か、大した理由などないのか、まあいいや。

一日こねくりまわして、何とかできたので手順をざっくりまとめておく。


1. Ubuntu14.04の64bit版インストールディスクをダウンロードする。
    http://www.ubuntu.com/download/desktop

2. Universal USB Installerをダウンロードする。(Windowsで作業する場合。別のLinuxマシンがある人はddとかで。)
    http://www.pendrivelinux.com/universal-usb-installer-easy-as-1-2-3/

3. Universal USB Installerを使って、USBメモリにUbuntuのインストールディスクを書き込む。

4. bootia32.efiをダウンロード。32bitUEFIブートしてGrubを起動させるためのEFIアプリケーション。自力でビルドすることもできそうだが、せっかくなので、実績ある有志の成果物を使わせて頂く。
    https://github.com/jfwells/linux-asus-t100ta/blob/master/boot/bootia32.efi
    (ちなみに、LinuxMintやUbuntu14.10、Ubuntu15.04のインストールディスクももこいつで起動できた)

5. USBに書き込んだインストールディスクの中の「/EFI/BOOT/」ディレクトリにbootia32.efiをコピー。

6. x205ta側の設定。起動時に「f2」キーを押してBIOS設定画面に入り、Security->Secure Boot Menu->Secure Boot ControlをDisableに。いわゆるセキュアブートを無効にする。あと、Advanced->USB Configuration->USB Controller SelectをEHCIにしておいたほうが無難なようだ。あと、内臓Wifiが使えないので、USBのWifiアダプタをつけとく。

7. USB刺して、再起動。起動時に「esc」キーで、ブートデバイス選択画面に入って、「UEFI: USB MassStorage Device」を選択。USBから起動。

8. Ubuntuを普通にインストールして、再起動。だが、このままでは起動してくれない。というのも、64bitのインストールディスクは64bitUEFIマシンを想定していて32bitUEFIブート用のGrubをインストールしてくれないから。なので、まずは、USBインストールディスクのGrubでマシンにインストールされたUbuntuを立ち上げるという方法を採る。USBインストールディスクからマシンを起動Grubメニューで「c」キーを押し、Grubのコマンドラインに入り、以下を入力

$ linux (hd1,gpt2)/boot/vmlinuz-3.13-0-52-generic root=/dev/mmcblk0p2 reboot=pci,force
$ initrd (hd1,gpt2)/boot/initrd-3.13-0-52-generic 
$ boot

めでたく起動したら、32bit UEFIブートを何とかする。ネットを見て回っていると、grubのソースをビルドしてバイナリ作ってインストールという方法を取っている記事を見かけることが多かったが、パッケージで何とかしてみる。「grub-efi-ia32」をインストール。

$ sudo apt-get install grub-efi-ia32

で、たぶん、本来これだけでいいっぽいのだが、これのインストール中に「efibootmgr」が実行され、EFIのバリアブルにブートローダーを登録するのに失敗している。というか、EFIバリアブルにアクセスできてなさそうな感じ。「Try modprobe efivars」とでるが、やっても駄目だった。これはカーネルモジュールの問題なのか、UEFIが32bitだからなのか、原因不明。とは言え、モノはそろっているし、そもそもファイル名だけの話っぽいので、さしあたって、今回はファイル入れ替え作戦で回避

$ cd /boot/efi/EFI/ubuntu
$ sudo cp grubx64.efi grubx64.efi.bak
$ sudo cp grubia32.efi grubx64.efi

ちょっとスマートではないが、他にいい方法思いついたらまた試してみる。恐らく、何らかの方法でEFIバリアブルに、grubia32.efiを登録できればいいと思われる。不思議なのは、どこかの段階で、ubuntu/grubx64.efiは登録されているということ。

なので、この環境で、手順さえ踏めば行ける気がするのだが。(これをやる前に、15.04のインストールを試みたので、その名残の可能性もある) 

追記:その後、改めてUbuntu15.04のインストールを試したところ、Ubuntuのインストール途中で、grub-efi-amd64-signedのエラーでクラッシュ。これを無視して、USBから起動させ、apt-get install grub-efi-ia32したところ、efivarsに関する問題も出ず。

ファイル入れ替えはせずに普通に起動。インストーラがクラッシュしているので、なんか気持ち悪いが、使えるには使えそうな感触。逆に言えば、15.04のカーネルか、efibootmgrあたりで問題が修正されているのかもしれない。 で、再起動。試行錯誤したなかで、上手く行った部分だけ、まとめるとこんな感じ。手順抜けてる可能性もあります。この通りやっても上手く行かないこともあるかも。そしたら、連絡ください。試行錯誤思い出します。以下のページが非常に参考になりました。先人の知恵に感謝致します。


http://brownbro.github.io/blog/2015/01/15/asus-x205ta-with-lubuntu/ http://sturmflut.github.io/linux/ubuntu/2015/01/21/installing-ubuntu-15.04-on-baytrail-tablets/ http://www.geocities.jp/cowfish_lactoria/mstick1-euc.html http://orumin.blogspot.jp/2013/01/grubefi.html

1/27/2014

Ubuntu12.04でCUDA5.5開発環境

Ubuntu12.04でCUDAの開発環境を整えてみるメモ


CUDA5.5のTookKitを以下からダウンロード
https://developer.nvidia.com/cuda-downloads

うちのマシンはUbuntu12.04 64bitなので、それようのdebパッケージをもらってくる。これはレポジトリ追加するだけのもののようだ。
で、これを普通にパッケージマネージャでインストールして
$ sudo apt-get install cudaとかやると依存関係のエラーが出てきて、にんともかんともな感じに突入。


仕切り直し。

まず、nvidia関連のパッケージを削除しまくる。
$ sudo dpkg -l | grep nvidia | grep '^ii'

とかで出てきたやつをapt-get removeで片っ端から削除。

$ sudo gdebi cuda-repo-ubuntu1204_5.5-0_amd64.deb

でリポジトリを追加して、

$ sudo apt-get update
$ sudo apt-get install cuda

でインストールできた。

/usr/local/cuda-5.5に一式インストールされる。このままだとパスが通ってなくて不便なので
.bashrcの末尾に以下を追加

export PATH=/usr/local/cuda-5.5/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda-5.5/lib64:$LD_LIBRARY_PATH

64bit版じゃない場合はlib64じゃなくて単にlib

で、eclipseベースのIDE環境でnsightというのが、もれなくインストールされるらしいので試す。/usr/local/cuda-5.5/binにインストールされているので、パスが通ってれば適当にターミナルから以下のコマンドで起動。

$ nsight


















/usr/loca/cuda-5.5/samplesに諸々サンプルがあるので、homeにコピーする。
適当なやつをeclipse(nsight)にインポートしてビルドしてみる。

いくつかサンプルをビルドしてみたが問題なく通る。が、Runしようとするとバイナリがないとか言われる。ターミナルから直接バイナリを実行するとできるので、インポートの方法がまずいのかなー。
eclipseのプロジェクトのプロパティからRun/Debug Settingで直接バイナリを指定したらEclipse側でRunできた。


2_Graphics/simpleTexture3D を実行



















Runができたところで、EclipseのパースペクティブをProfileに切り替えて、試しにプロファイルをとってみた。

















へー。真面目にパフォーマンスを分析するには有用かも。

そんなこんなで、今日は終了。


1/15/2014

LinuxでOpenGL

今日も寒いなー。金沢に活動拠点を移して早3ヶ月。転職して、キャリアや趣向にも変化があり、x86や組み込みという路線から、VRを軸に画処理、射影変換や3D/2Dグラフィックス路線に以降ぎみであります。気づいたらkinectやOculusとか、レンズやら、へんな3D眼鏡でいっぱいになってる。

そんなこんなで、気づいたら去年はほとんどブログ書いてないと気づく。(下書きはちょいちょいあるんだが)
で、なんとなく久々にブログ書いてみる。というか、ほぼメモ


LinuxでOpenGLプログラミングをするメモ。現在、Ubuntu12.04を使用。まあディストリ変わってもパッケージマネージャの違いだけで、やることは大差ないと思われる。

glutを使います。OpenGLプログラミングでウインドウ周りの描画の面倒を見てくれる、よく使われるライブラリ。結構枯れたライブラリでWindowsでもよく使われるので、サンプルコードはググればいろいろ出てきます。


さしあたって以下をインストール

$ sudo apt-get install freeglut3-dev libglew1.6-dev

ほかにも以前に入れたものでいるものがあったかも。

コンパイラ一式の導入がまだなら以下でがっぽり入ります。

$ sudo apt-get install build-essential


で、テストコード
test.c

#include <GL/glut.h>

int main(int argc, char *argv[])
{
  glutInit(&argc, argv);
  glutCreateWindow(argv[0]);
  glutMainLoop();
  return 0;
}


コンパイル

$ gcc test.c -lglut


実行

$ ./a.out

でコンパイルが成功してればウインドウが出る。



続いてEclipseでやる方法

Eclipseの導入とCDTのインストールは、端折りまして
普通にコード書いてもコンパイル通らないはず。
プロジェクトのプロパティで「GCC C++ Linker」の「Libraries」に「glut」を追加。
でRunできる。


そんなところ。

今日は、ライトな内容ですが以上っす。





12/27/2011

Linux ハードウェア デバッグコマンド その2

昨日は力尽きたので、今日投稿するっす。
先週に引き続き、Linuxでユーザーランドからの物理メモリの読み書きコマンドです。
mmapを使って仮想メモリ経由で読み書きするようにしてみました。

例によってソースを晒しておきます。


/*
 * mem.c
 * ver.0.1:  Dec 26, 2011  S.Ishihara
 */


#include <stdio.h>
#include <unistd.h>
#include <sys/io.h>
#include <sys/mman.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>




#define DEV_PATH "/dev/mem"


int
main(int argc, char *argv[])
{
    int             opt;
    extern char     *optarg;
    extern int      optind, opterr;
    int             width = 1;  /* default byte access */
    unsigned int    memaddr, wdata;
    unsigned int    pgoffset, pgaddr;
    unsigned int    pagesize = sysconf(_SC_PAGESIZE);
    unsigned char   *p;
    int             fd;


    while ((opt = getopt(argc, argv, "w:")) != -1) {
        if (opt == 'w') {
            width = atoi(optarg);
        } else {
            goto error;
        }
    }


    argc -= optind;
    argv += optind;


    fd = open(DEV_PATH, O_RDWR);
    if (fd <= 0) {
        fprintf(stderr, "open error: %s\n", DEV_PATH);
        return 1;
    }


    if (argc == 1) {
        /* Read Mem */
        memaddr  = strtoul(argv[0], NULL, 16);
        pgoffset = memaddr & (pagesize -1);
        pgaddr   = memaddr & ~(pagesize -1);
        p = mmap(NULL, pagesize, PROT_READ, MAP_SHARED, fd, pgaddr);
        if (p < 0) {
            fprintf(stderr, "mmap error\n");
            return 1;
        }
        if (width == 1) {
            printf("0x%08x: 0x%02x\n", memaddr, *(p + pgoffset));
        } else if (width == 2) {
            printf("0x%08x: 0x%04x\n", memaddr, *((unsigned short *)(p + pgoffset)));
        } else if (width == 4) {
            printf("0x%08x: 0x%08x\n", memaddr, *((unsigned int *)(p + pgoffset)));
        } else {
            goto error;
        }
    } else if (argc == 2) {
        /* Write Mem */
        memaddr  = strtoul(argv[0], NULL, 16);
        pgoffset = memaddr & (pagesize -1);
        pgaddr   = memaddr & ~(pagesize -1);
        p = mmap(NULL, pagesize, PROT_WRITE, MAP_SHARED, fd, pgaddr);
        if (p < 0) {
            fprintf(stderr, "mmap error\n");
            return 1;
        }
        wdata  = strtoul(argv[1], NULL, 16);
        if (width == 1) {
            *(p + pgoffset) = (unsigned char)wdata;
        } else if(width == 2) {
            *((unsigned short *)(p + pgoffset)) = (unsigned short)wdata;
        } else if(width == 4) {
            *((unsigned int *)(p + pgoffset)) = (unsigned int)wdata;
        } else {
            goto error;
        }
    } else {
        goto error;
    }
    munmap(p, pagesize);
    close(fd);
    return 0;


error:
    printf("Usage: Mem [-w WIDTH] ADDRESS [DATA]\n"
            "Mem read or write.\n"
            "  -w        number of byte width. permit 1(default), 2, 4\n"
            "\n"
            "This command executable only root user.\n"
            "Mem address possible range 32bit.\n"
            "\n"
            "Examples:\n"
            "  Mem a0000               Read memory from address 0xa0000.\n"
            "  Mem a0000 31            Write memory address 0xa0000 to 0x31.\n"
            "  Mem -w4 20000 5a5a5a5a  Write memory address 0x20000 to 0x5a5a5a5a.\n"
            "\n");
    return 1;
}


試行錯誤しながら、ごそっと書いたので、冗長だったり、手抜きな部分もありますが、ぼちぼち動作するので、とりあえずよしとします。
目的としては、PCIデバイスのMMIOを直接読み書きしたいわけなんですが、あんまし真面目に動作確認できてないっす。使いながら確認してみます。

12/19/2011

Linux ハードウェア デバッグコマンド その1

今日は、Tx50の開発はお休みして、表題の件にちょっと時間を割くことにしました。

なんというか、本業のほうで、やっかいなデバッグをやることになりまして、
Linuxからハードウェアの状態を手軽に知る術が欲しくなって、コマンド作ることにしました。本業では結果を出すのに追われて、なかなか腰を据えてこういった開発補助ツールを作ることに時間が割けないわけです。

ユーザーランドからハードウェアに直接アクセスすることは、なにかと問題があったりで、本来ドライバを作るべきですが、開発段階でハードウェアの状態をちょっと確認したいというときは、さくっとコマンドで済ませたいところです。

というわけで、今回はユーザーランドから直接I/OとPCIのコンフィグレーション空間を読み書きできるコマンドを作成します。ホントは物理メモリとPCI Expressの拡張コンフィグレーション空間の読み書きコマンドも作りたかったんですが、時間が足りなかったので、それはまた今度にします。

で、おもむろにソースです。たぶん組み込み開発でLinux使ったプロジェクトのハード屋さんには、需要があるんじゃなかろうかと思いソースを晒しときます。(自分が会社からソースをゲットする目的もありますが)


/*
 * io.c
 * ver.0.1:  Dec 18, 2011  S.Ishihara
 */


#include <stdio.h>
#include <unistd.h>
#include <sys/io.h>


int
main(int argc, char *argv[])
{
    int             opt;
    extern char     *optarg;
    extern int      optind, opterr;
    int             width = 1;  /* default byte access */
    unsigned short  ioaddr;
    unsigned int    wdata;


    while ((opt = getopt(argc, argv, "w:")) != -1) {
        if (opt == 'w') {
            width = atoi(optarg);
        } else {
            goto error;
        }
    }


    argc -= optind;
    argv += optind;


    iopl(3);


    if (argc == 1) {
        /* Read I/O */
        ioaddr = strtoul(argv[0], NULL, 16);
        if (width == 1) {
            printf("0x%04x: 0x%02x\n", ioaddr, inb(ioaddr));
        } else if (width == 2) {
            printf("0x%04x: 0x%04x\n", ioaddr, inw(ioaddr));
        } else if (width == 4) {
            printf("0x%04x: 0x%08x\n", ioaddr, inl(ioaddr));
        } else {
            goto error;
        }
    } else if (argc == 2) {
        /* Write I/O */
        ioaddr = strtoul(argv[0], NULL, 16);
        wdata  = strtoul(argv[1], NULL, 16);
        if (width == 1) {
            outb(wdata, ioaddr);
        } else if(width == 2) {
            outw(wdata, ioaddr);
        } else if(width == 4) {
            outl(wdata, ioaddr);
        } else {
            goto error;
        }
    } else {
        goto error;
    }
    return 0;


error:
    printf("Usage: io [-w WIDTH] ADDRESS [DATA]\n"
            "I/O read or write.\n"
            "  -w        number of byte width. permit 1(default), 2, 4\n"
            "\n"
            "This command executable only root user.\n"
            "I/O address possible range 16bit.\n"
            "\n"
            "Examples:\n"
            "  io 3f8               Read I/O from address 0x3f8.\n"
            "  io 3f8 0x31          Write I/O address 0x3f8 to 0x31.\n"
            "  io -w4 cf8 80000000  Write I/O address 0xcf8 to 0x80000000 double word.\n"
            "\n");
    return 1;
}





/*
 * pci.c
 * ver.0.1:  Dec 18, 2011  S.Ishihara
 */

#include <stdio.h>
#include <unistd.h>
#include <sys/io.h>

#define PCI_INDEX 0xcf8
#define PCI_DATA  0xcfc

unsigned char
pciRead8(unsigned char bus, unsigned char dev, unsigned char fnc, unsigned char reg)
{
    outl((1 << 31) + (bus << 16) + ((dev & 0x1f) << 11) +\
            ((fnc & 0x07) << 8) + (reg & ~(0x03)), PCI_INDEX);
    return inb(PCI_DATA + (reg & 0x03));
}

unsigned short
pciRead16(unsigned char bus, unsigned char dev, unsigned char fnc, unsigned char reg)
{
    outl((1 << 31) + (bus << 16) + ((dev & 0x1f) << 11) +\
            ((fnc & 0x07) << 8) + (reg & ~(0x03)), PCI_INDEX);
    return inw(PCI_DATA + (reg & 0x02));
}

unsigned int
pciRead32(unsigned char bus, unsigned char dev, unsigned char fnc, unsigned char reg)
{
    outl((1 << 31) + (bus << 16) + ((dev & 0x1f) << 11) +\
            ((fnc & 0x07) << 8) + (reg & ~(0x03)), PCI_INDEX);
    return inl(PCI_DATA);
}

void
pciWrite8(unsigned char bus, unsigned char dev, unsigned char fnc, unsigned char reg, unsigned char value)
{
    outl((1 << 31) + (bus << 16) + ((dev & 0x1f) << 11) +\
            ((fnc & 0x07) << 8) + (reg & ~(0x03)), PCI_INDEX);
    outb(value, PCI_DATA + (reg & 0x03));
}

void
pciWrite16(unsigned char bus, unsigned char dev, unsigned char fnc, unsigned char reg, unsigned short value)
{
    outl((1 << 31) + (bus << 16) + ((dev & 0x1f) << 11) +\
            ((fnc & 0x07) << 8) + (reg & ~(0x03)), PCI_INDEX);
    outw(value, PCI_DATA + (reg & 0x02));
}

void
pciWrite32(unsigned char bus, unsigned char dev, unsigned char fnc, unsigned char reg, unsigned int value)
{
    outl((1 << 31) + (bus << 16) + ((dev & 0x1f) << 11) +\
            ((fnc & 0x07) << 8) + (reg & ~(0x03)), PCI_INDEX);
    outl(value, PCI_DATA);
}


int
main(int argc, char *argv[])
{
    int             opt;
    extern char     *optarg;
    extern int      optind, opterr;
    int             width = 1;  /* default byte access */
    unsigned char   bus, dev, fnc, reg;
    unsigned int    wdata;

    while ((opt = getopt(argc, argv, "w:")) != -1) {
        if (opt == 'w') {
            width = atoi(optarg);
        } else {
            goto error;
        }
    }

    argc -= optind;
    argv += optind;

    iopl(3);

    if (argc == 4) {
        /* Read Pci */
        bus = strtoul(argv[0], NULL, 16);
        dev = strtoul(argv[1], NULL, 16);
        fnc = strtoul(argv[2], NULL, 16);
        reg = strtoul(argv[3], NULL, 16);
        if (width == 1) {
            printf("B:0x%02x/ D:0x%02x/ F:0x%02x/ R:0x%02x: 0x%02x\n",
                    bus, dev, fnc, reg, pciRead8(bus, dev, fnc, reg));
        } else if (width == 2) {
            printf("B:0x%02x/ D:0x%02x/ F:0x%02x/ R:0x%02x: 0x%04x\n",
                    bus, dev, fnc, reg, pciRead16(bus, dev, fnc, reg));
        } else if (width == 4) {
            printf("B:0x%02x/ D:0x%02x/ F:0x%02x/ R:0x%02x: 0x%08x\n",
                    bus, dev, fnc, reg, pciRead32(bus, dev, fnc, reg));
        } else {
            goto error;
        }
    } else if (argc == 5) {
        /* Write Pci */
        bus   = strtoul(argv[0], NULL, 16);
        dev   = strtoul(argv[1], NULL, 16);
        fnc   = strtoul(argv[2], NULL, 16);
        reg   = strtoul(argv[3], NULL, 16);
        wdata = strtoul(argv[4], NULL, 16);
        if (width == 1) {
            pciWrite8(bus, dev, fnc, reg, wdata);
        } else if(width == 2) {
            pciWrite16(bus, dev, fnc, reg, wdata);
        } else if(width == 4) {
            pciWrite32(bus, dev, fnc, reg, wdata);
        } else {
            goto error;
        }
    } else {
        goto error;
    }
    return 0;

error:
    printf("Usage: pci [-w WIDTH] BUS DEVICE FUNCTION REGISTER [DATA]\n"
            "Pci configuration space read or write.\n"
            "  -w        number of byte width. permit 1(default), 2, 4\n"
            "\n"
            "This command executable only root user.\n"
            "\n"
            "Examples:\n"
            "  pci 00 1f 00 00          Read pci from bus 0x00 dev 0x1f func 0x00 reg 0x00.\n"
            "  pci -w2 00 1f 00 10 500  Write pci bus 0x00 dev 0x1f func 0x00 reg 0x10 to 0x500.\n"
            "\n");
    return 1;
}


とりあえず、ばさっと書いただけで、細かく動作確認していなかったり、処理内容もちょっとエラー処理が手抜きぎみだったり、usageがカタコト英語だったりと、つっこみどころはありますが、まあ、個人利用レベルではなんとか使えそうな感じです。

*このブログをみて、プログラムを利用しようとしている方へ
    まったくもって、動作は保証しません。自己責任で使ってください。使用方法はコマンドのUsage参照
     バグに関する報告は歓迎します。それからプログラムの性格上、使いようによっては、
     簡単にシステムを破壊できてしまいます。I/OやPciコンフィグレーション空間について
     知識を有していない方は、使わないほうが懸命です。
     このプログラムを使ってあなたのPCや基板が燃えたり、レンガになっても責任は負いかねます。
   

ビルドはgccが使えるLinux環境で

$ gcc -o io io.c
$ gcc -o pci pci.c

って感じです。あれ、組み込みだとLinuxのファームにコンパイラ入ってなくて別の環境でビルドすることもあると思います。そんときにcライブラリの問題があったりするので、「-static」オプションをつけてビルドすることで、回避できることがあったりなかったりです。


ああ、明日もデバッグもりもりやります。