2014年1月11日土曜日

Ubuntuの画面にUnityパネルが表示されなくなった?

Core2Duoのマシンに入れているUbuntu13で、kernel 3.8.0.-35に更新したところ、ログイン後の画面がおかしくなりました。(電源onでログインする設定にしていますので、通常ならUnityのパネルがでてくるところですが、、、、)
  • なんか画面解像度が小さくなり、縦横にやたら真っ黒な空白が(モニタ設定や画面設定が壊れているっぽい)
  • Unityパネルが表示されない。(通常なら以下のような画面になります)


しばし悩みましたが、そういえばこのPCにはビデオカードにnVidia(GT8900、ちょっと古いやつ)が入れてあり、ドライバを変更していました。ためしに古いKernelで起動すると、画面設定は以前のとおりフルスクリーンで表示されますが、あいかわらずまっさらなログイン画面です。


これでもマウスの右クリックで画面設定のwindowは表示されるので、そこからシステム設定に移り、ドライバをXorgのデフォルトを使用するに戻してから最新Kernelで起動すると画面解像度は正しく表示されるようになりました。(なぜか、その状態で再度nVidiaのドライバを使用するようにしても、画面解像度がおかしくなることなくなりました)

こんな画面ですがgnome window managerは一応動いているらしく、ショートカットキーで端末(shell)は起動できます。(CTRL + ALT + T)shellさえ開いてくれれば、ファイル操作のexplorerもどきも「nautilus」で直接コマンド起動してやればいいし、ブラウザも「chromium-browser」とコマンド実行してやれば動きます。システムを止めるにはログアウトしてやればログイン画面になり、そこから再起動、シャットダウンが実行できます。(CTRL + ALT + DEL)


普段使いにはなんの不自由もありません。かえって画面がすっきりして気持ちいくらいです。(実はUnityの画面パネルがどうしても好きになれない)
もうすぐメジャーバージョンアップでUbuntu14がReleaseされるという話があるので、しばらくこのまま使っていこうと思います。


20140118追記
あれから時々調査して、やっと解決しました。window-manager自体には本当に問題がないか試しに新規アカウントを作成し、ログインしてみるとUnityパネルは通常どおり表示されました。ということは、普段使っているアカウントのgnomeに関する設定ファイルのどれかがおかしくなったということです。
ネットで見ると色々な解決方法が出てくるんですが、全部ダメでした。最後に試したのが、~/.config/dconf/以下にあるuserファイル(バイナリのdataファイルです。ログイン毎に更新されるようです)を初期化(要は削除してしまえということです)することでした。自分は一応念のため別のディレクトリにmvしておきました。(注意:もちろんこの作業をするときは、別のアカウント、例えば先程新規に作成したアカウント等でログインして行います)これでUnityパネルは復活しました。
もちろんそれまでのパネル設定は初期設定に戻ってしまっていますので、再度設定しなおしです。またそれ以外にもアプリによっては設定が入っている可能性があります。現状、chromeを開いたらgoogleアカウントのパスワードを聞かれてきて、2段階認証コードを再度要求されました。(例の携帯に数字をメールしてくるやつです)他にも設定が初期化されてしまっているアプリがあるかもしれません。
しかしここにいたるまで何種類の解決方法があったことか、、、しかもそこに記載されているファイルの位置や名前が微妙に違っており、「Unityまだ安定していないな〜」というのを改めて感じました。嫌いなんだけどこれがUbuntuの標準なのでシステムアップデートの度に設定変更するのが面倒なため、unityを渋々使っています。

Nexus7 KitKat更新(その2)

4.2.2に続けて更新され、しばらく使っていましたがあいかわらずいまいちな使い勝手です。
(前回記事)Nexus7 KitKat更新
これって自分のNexus7が初代だからなんでしょうかね?不満は以下の通りです。
  • あいかわらず画面の回転に対する反応が遅い。(回転しても、アプリ側にスクリーンサイズが縦横変わったのが十分反映されず、画面端っこが黒抜きの状態のときも)
  • WiFiの暗号キーを忘れることはなくなりましたが、電源ボタンOn(といってもSleepからの起動)時にそもそもWiFiとの接続が切れていて、自分で操作してもWiFiの回路が動かないのか親機が全然表示されない、時間がかかることがよくある。
  • アプリの切り替えに時間がかかるようになった?
確かにバッテリーの持ちは良くなった実感はあります。アプリの切り替えが多少遅いのも我慢できる範囲内なんですが、WiFiの接続はなんとかしてほしい!

2014年1月6日月曜日

Ubuntuのnode.js実装

今度はnode.jsを少しかじってみようと思い、手元のUbuntu13に環境を準備します。(こういうこと考えると、vagrantで仮想環境の自動構築って便利だと初めて実感しました。最初は、なんでそんな気機能が必要なのか思いつかなったんで)

ググってみると、ソースをDLしてビルドする人、Ubuntuのapt-getで済ます人、半々のようです。どちらがいいか迷ったんですが、ソースからビルドすると大抵後で削除するのが面倒なことが多いです。他のものに影響を与えても原因追究しづらいし。
ということで、まずはすなおにUbuntuのapt-getでインストールします。


$ sudo apt-get install nodejs npm
[sudo] password for hoge:
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています    

node.js本体とパッケージを管理するnpmを個別にインストールするようです。
メッセージが大量に流れますが、特に問題なくインストールは終了しました。

簡単なプログラムを以下に示します。(JavaScriptになります)
hello.js
var http = require('http');
var server = http.createServer();
server.on('request', function(req, res) {
res.writeHead(200, {'Content-Type': 'text/plain'});
res.write('Hello World!');
res.end();
});
server.listen(1337, '192.168.24.64');
console.log('Server running at 1337');


赤字はport番号と、(自PCの)IPアドレスです。
これで実行は以下の通りです。


$ nodejs  hello.js
Server running at 1337


(注:他のサイトの例では'node’コマンドでしたが、今回なぜか'nodejs’に変わっていました。おそらくubuntuだけの実装だと思われます)


あとはブラウザで当該port番号で開いてみれば動作を確認できます。無事"Hello World!"の表示を確認できたので、いくつかサンプルを試してみました。

そのうち「ejs」というテンプレートを処理するパッケージを使用するサンプルがでてきて(よく使われるようです)、まずそれをインストールしないといけません。ここでパッケージ管理のnpmの出番になります。

$ npm install ejs
npm http GET https://registry.npmjs.org/ejs


npm ERR! Error: failed to fetch from registry: ejs
npm ERR!     at /usr/share/npm/lib/utils/npm-registry-client/get.js:139:12
npm ERR!     at cb (/usr/share/npm/lib/utils/npm-registry-client/request.js:31:9)


なんだろう?Ubuntu独自実装のnodejsに問題があるのか?

後日、VMPlayer上に試験環境として用意してある別のPC上のUbuntuにソースからDLしてインストールしてみました。

$  ./configure
$  make
$  sudo make install

(/usr/local以下にinstallされた。わりと行儀がいい。)
次にnpmをインストールしようと思ったが、サイトにあったやり方を見ると、何をしようとしているのかよく意味がわからない。他のサイトではnode.jsと一緒にインストールされるとあったが、調べてみると、/usr/local/bin/npmと既に存在していた。

$ npm install ejs
npm http GET https://registry.npmjs.org/ejs
npm http 200 https://registry.npmjs.org/ejs
npm http GET https://registry.npmjs.org/ejs/-/ejs-0.8.5.tgz
npm http 200 https://registry.npmjs.org/ejs/-/ejs-0.8.5.tgz
ejs@0.8.5 node_modules/ejs
$

サイトの出力例とは若干違うが(バージョンも違うし)、普通にインストールできた。

やはり、Ubuntu独自の実装に問題がありそうだ。

2013年12月10日火曜日

Javaによる画像入出力プログラム

ちょっとWindowsの画面をキャプチャする機能が欲しくなったんで、調べてみたんですが、、、、いろんな関数があって大変(;゜ロ゜)
手動でやれば簡単なんですが、枚数があるもんですからプログラムと思ったんですけどね。しばし考えて、「Javaにも同じような機能あるんじゃない?」調べたらありました。しかも非常に簡単です。

キャプチャ自体は以下の関数になります。

// 指定領域をキャプチャしてスクリーンショットのBufferedImageを返す createScreenCapture(Rectangle screenRect);

それで簡単に画面の一部(左上の512x512)をファイルに保存するものを作ってみました。

import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.image.BufferedImage;
import java.io.File;
import javax.imageio.ImageIO;

public class test {

 /**
  * @param args
  */
 public static void main(String[] args) {

  // スクリーンキャプチャのテスト
  Robot r =null;
  try {
   r = new Robot();
  } catch (Exception e){
   System.out.println("can't get Robot");
  }

  BufferedImage dd = r.createScreenCapture(new Rectangle(0, 0, 512, 512));

  // jpgで保存
  try {
   File savedImage = new File("sss.jpg");
   ImageIO.write(dd, "jpg", savedImage);
  } catch (Exception e) {
   System.out.println("can't write file");
  }

 }

}

このプログラムはファイルを作成するだけですが、読み込むときは以下の通りになります。

BufferedImage img = ImageIO.read(File);

後は、BufferedImageで適当に調べればpixel単位の操作も簡単にできます。


PS:
あ、念のためいっときますが、これはローカルでjavaを動かして自分のPCの画面をキャプチャしたい目的で調べました。(ですからローカルに画像ファイルを保存しちゃってますし)リモートでこれ実行したらどうなるんでしょうねえ?セキュリティにひっかかるかな。(それにBufferedImageデータをどうやって返信するんだという問題がありますが。取得したイメージデータを返信する方法がなければゲームなんかで使えるテクニックなんですが。)

Nexus7 KitKat更新

少し前にNexus7のOSが4.4(KitKat)に更新されました。最初は、動きがいい、電池の持ちがよくなったと喜んでいたんですが、どうも動作におかしなところが目立つようになってきました。


  1. 画面の回転が遅い。センサへの問い合わせをアプリごとにするんじゃなくOS側でまとめてやるようにして、電力消費を減らしたとはききましたが、アプリによっては中々回転したのを反応してくれないものがでてきました。
  2. WiFiがなかなかつながらない。これは家が1階、2階と別々の親機を設置しているせいもあるかもしれませんが、電源On直後などなかなかWiFiを認識してくれないことがあります。
  3. WiFiの接続キーを忘れる。これが一番困ります。WPSで簡単に接続設定はできますが、何らかの関係でWiFiのAPリストから消えると、接続キーも忘れてしまうようです。数回設定しなおしました。

昨夜、VerUpの連絡が来ていました。(4.4.2へ更新です)セキュリティ強化が主眼のようですが、使いがってはどうでしょう。

2013年12月2日月曜日

3Dモデルの表示がしたい:WebGL編

少し前までAndroidでのOpenGLプログラムやら、Blenderからのモデル出力を調べていました。目的は3Dモデルを表示するのに楽な方法は現状だとなんだろうと試行錯誤していたわけです。
昔はc++なんかでガリガリViewerプログラムをInventorなんかつかったりして作っていたんです。Inventor自体は好きなんですが、肝心のSGIがどうもダメダメ(今ではGraphicsは完全に撤退して、スーパーコンピューティングの会社になってしまってます。唯一Graphicsの部門をNECに売却して日本SGIとして細々とやっているくらいですか。。。)で、Inventorを使い続けるのに不安をずっと感じていたんです。仕事でやるならもう自分でViewerは作りません、できあいの製品かってきます。その方が安心です。

ただそれでもどうしても特注のカスタマイズしたViewerが欲しい場合どうしたらいいか?と考えて、様子を見てたんですが、どうも結局OpenGLでガリガリ書くのが時流のような気がします。それでまあ、特注で必要になるとすると今時のタブレット用アプリくらいかとAndroidを見てたんですが、やはりOpenGLをガリガリするのは疲れます。何より、モデルデータの読み込みを自分で用意しないといけないのがしんどいです。そこでモデルデータ作成にBlenderを調べて、今度はモデルデータのエクスポートから表示方法を考えていました。
実は前から気になっていた技術に「WebGL」があります。JavaにもOpenGLの実装がありますが、それをブラウザのJavaScriptでやってしまおうというものです。可能性を非常に感じていたんですがいかんせん「重い!」に当時はつきました。ブラウザを使うPC性能(正確にはGraphicsボードの性能になります)に依存しますし、それでも素でアプリから動かすより数倍重く感じました。(昔々、SGIが同じような考えでVRMLというのを考えてましたが、結局今じゃ聞かなくなってしまいましたね)その後、セキュリティ上の問題がJavaScriptおよびWebGLの両方に見つかり、一時停滞したようですが、また最近記事がでるようになり、JavaScript用のライブラリもScene.jsとかThree.jsとかさかんにでてくるようになりました。ところで現状WebGLが使えるのは、以下のブラウザだけとのことです。

  • Chrome
  • FireFox
  • Safari
  • Opera(機能限定らしい)
  • IE11(やっとMSも実装したらしいけど、どの程度の実力かは不明)


そんなところで、ChromeとFireFoxを使いながらThree.jsで様子を見てみることにしました。(理由は、BlenderからモデルデータをThree.jsが読み込める形式にする方法があるから)ところがこれが非常に難航しました。まずWebの記事のようにThree.jsが動かない。(表示がおかしい)これの原因究明にかなり時間がかかりましたが、大体わかってきたのでメモしておきます。(利用したブラウザはChromeとFireFoxです)

1.簡単なサンプルしか表示されない
簡単な立方体を表示するJavaScriptのプログラムは問題なく動きました。

ところが、これにjpegのテクスチャを張ろうとすると、、、
何コレ?っていう感じですが、本当は以下の様に表示される(予定)ものです。
(これはその後、試行錯誤の結果表示できるようになったものです)
球体に、地球表面のjpegを用意してそれをテクスチャとして貼り付けているはず、なんですがうまくいきません。

2.ChromeとFireFoxで挙動が違う
上記の地球のサンプルですが、実はFireFoxだとうまく表示できるんです。Chromeはだめ。ブラウザの開発コンソールを見ても特にエラーは返してこないし、なんでだ!?と悩みましたが、確かJavaScriptのセキュリティ問題で、ローカルなファイルはJavaScriptでは読めないようにしたのを思い出しました。(IEは、今更そんな制限つけれるかという感じのようですが)FireFoxも緩いようですが、テクスチャとしての読み込みだけは許可してくれたようです。(注:WebGLはさらにメモリリークの問題も発生していたため、Chromeではテクスチャデータだろうがローカルからの読み込みを禁止しているんでしょうね)

Three.jsのサンプルにテクスチャを貼ったものがありますが、Chromeだと全滅ですね。FireFoxじゃないとローカルな環境ではまともに表示してくれません。

3.Blenderのモデルデータを読み込んでくれない
さあここまでくれば問題はあきらかです。肝心のBlenderのモデルデータファイルを読みこもうとするとChromeやらの開発コンソールに明確に、ローカルファイルは読み込めませんといってきます。(正確にはローカルなファイルを指定するfile://というURLでは不正と判断され、http経由じゃなきゃだめ、みたいな感じ)
これにはまいりました。Webで見つかった記事には一言もそんなこと書いていてくれません。あきらめてLinuxマシンにapache2をインストールしましたよ。(設定はデフォルトのまま。特に外部のPCから見たいわけではないんで。URLはhttp:://localhostで参照できれば十分です。)そうしたら無事表示されました。(基本、ローカルでしか使いません。ローカルなファイル見るのにapache経由というのも変な感じがしますが、そうしないとセキュリティをクリアできない!)
何表示してるの?って感じですが、まずBlenderでモデル作成したとき、XYZ軸の+方向がどう表示されるのか確認しないといけなかったので、Blenderで四角すいを3つ、XYZ軸(RGB)方向に作成した(ついでに各四角すいはそれぞれの軸の色にしてあります)モデルデータを表示してみたものです。(下図のモデルを出力したものです)

WebGLには軸表示としてHelperを使っています。なんかX軸(R)で90度回転してますね・・・
ところで、Three.jsのGitHubにあるエクスポートスクリプト(python)はBlender2.66用です。自分は現状最新の2.69を使っており、これが表示されない原因かとも一時思いました。しかし、結果的にはBlender2.66だろうが、2.69だろうがエクスポートされるファイル(JSON形式です)は同じものでした。Blenderを両方インストールして確認してみました。モデルがもっと複雑になると違ってくるかもしれませんが。

3.5 Blenderモデルのエクスポートオプション
上述の結果は、Blenderにてthree.js用にモデルデータをエクスポートするさい、デフォルト設定で行ったものです。改めてオプションを見てみたら、座標軸を変換するオプションがありました。
下部の「Flip YZ」がデフォルトではオンになっていますが、これをオフにして出力してみると、以下のようになりました。
XYZ(RGB)軸がきちんと同じ方向に表示されるようになりました。しかし、なんでこんなオプションがあるんだか…


色々試行錯誤して、「Blnederで作成したモデルデータをWebGLで表示する」という目的は達成できました。ついでにかなりまだクセが強いのも理解できましたが。(最後のモデルが回転してしまう、というのはよくある話なんで、理解できてればそんなに苦にはなりません。)

結局、Three.jsに多数格納されているexampleですが、テクスチャ関係使っているものはFireFoxでないとローカル環境だけでは見れません。apache動かして、http経由で見ればChromeでも見ることができます。(逆にいうと、これ気づかないと大多数の人が「Three.jsってこんな表現しかできないのか」と勘違いしてしまいそうです。

2013年11月22日金曜日

Windows, Mac, Linux共通のエディタが欲しい:Windowsのsublime text2その後

結局、色々やってるうちに知らないうちに画面表示までくずれていることに気づき、あきらめて再インストールすることにしました。


  1. sublime text2のアンストール
  2. python 3.xのアンインストール
python 3.xを入れていたのは、Blender2.69がpython 3.xを推奨していたからですが、同時にインストールしていたLinuxの方はpython 2.xなんですが特にBlenderの動作に問題は見られないし、Blenderのサイトをよく読むと、推奨はするけどまだpython 3.xでは動かないplug-inがあるよ、と必須ではないようです。(特にpython入ってなくても、手動操作でBlender動かすだけならそんなに問題ないようす)
次に再度インストールです。


  1. python 2.xのインストール(2.7.6にしました)
  2. sublime text2のインストール
さあこれで再度パッケージとか入れなおしていけばいいだろうと思いきや、画面が変です。例によってwindowの最下段に情報表示がされていないし、Tabのファイル名表示もおかしい。おまけになぜかまだパッケージのインストールをしていないのに、日本語のインライン入力までできちゃう???

あきらからにどこかに設定ファイルを残しています。大体予想はつきますが、以下のところに見つけました。

個人設定の「AppData」以下のRoamingというところにありました。sublime text2をインストールしたばかりですが、終了してこのフォルダを削除してしまいます。(中身はpythonがそのまま入っているかとおもったら、わけわからないXMLでした)ここでsublime text2を起動すると、おそらくProgram Dataのところからでしょうがデフォルトのデータをまたここに作ります。
今度はPackage Installすらないまっさらな状態なので、再度環境構築です。結果として日本語入力しても画面表示の乱れない状態で動くようになりました。


最下段の情報ラインが表示されますし、日本語のインライン入力もできます。さらにTabの表示もよくなりました。

python 3.x系がリリースされたのは2008年12月ですからもう5年たっています。このとき後方互換性が犠牲にされたため、いまだにpython 2.xからpython 3.xへの移行は進んでいないようです。言語としての「美しさ」を求めるのはわかるけど、なんらかの移行手段を考えてくれないと困ったことになるといういい見本ですな。(話変わりますが、そういえばc++の第4版、夏ごろ決まった聞きましたがかなり揉めたようですね。新しい機能が欲しい、でもStrupがダメだ!と議論がもめたと聞いています。互換性の問題を保ちつつ、言語はシンプルかつ高機能にすることのせめぎあいですね。)