読者です 読者をやめる 読者になる 読者になる

Xojo日本語ブログ

マルチプラットフォーム対応アプリが開発できるXojoのブログです。

Xojoのリストボックスを使う

Tips リストボックス

Xojoライブラリの一つ、リストボックスはテーブルのようにデータを一覧表示するのに使えます。今回はその初期設定について紹介します。

ライブラリから追加する

まず画面への配置はライブラリからListBoxをドラッグ&ドロップで追加します。

f:id:moongift:20160815154230p:plain

デフォルトではこのような白い枠だけが表示されます。

f:id:moongift:20160815154136p:plain

ヘッダーを追加する

次にインスペクタを表示して、HasHeadingをオンにします。

f:id:moongift:20160815154346p:plain

これで0というヘッダーが追加されました。

f:id:moongift:20160815154427p:plainf:id:moongift:20160815154455p:plain

さらにColumnCountを設定して、任意の数のカラムにします(今回は3としています)。

f:id:moongift:20160815154455p:plain

ヘッダーを編集する

ListBoxの右下にマウスを当てて、鉛筆アイコンを表示&クリックします。

f:id:moongift:20160815154529p:plain

表示されたモーダルのAddボタンをクリックします。

f:id:moongift:20160815154638p:plain

そうするとヘッダー行の編集状態になるので、任意のカラム名を入力します。

f:id:moongift:20160815154700p:plain

終わったら右上のバツアイコンをクリックします。

f:id:moongift:20160815154714p:plain

これで初期設定が完了です。

f:id:moongift:20160815154723p:plain


インスペクタにあるInitialValueプロパティでも編集できるのですが、各カラムの区切りにTab文字を使わないといけないので若干面倒です(Tabを押すとHeadingIndexにフォーカスが移動してしまいます)。鉛筆アイコンをクリックして編集するようにしてください。

Xojo × Raspberry Piでの開発を楽に行うテクニック

Tips Raspberry Pi

XojoはRaspberry Pi向けのビルドにも対応しています。Raspberry Piといえば、小型PCの一つでRasbianというDebianベースのOSが動きます(他のOSも出ています)。しかし現状、XojoのRaspberry Pi向けにはデバッグビルド機能がなく、ブレークポイントを差し込んだり変数をチェックするのが困難です。

また、各種センサーの値を取得するためのサンプルコードも多くないため、配線やデータの取得に苦戦するのではないでしょうか。そこで、すでに数多ある外部の資産を使いつつXojoらしい使い方を考えてみたいと思います。

Xojo × Raspberry Piの組み合わせについて

1. XojoでGPIO/I2Cを直接操作する

一つはXojoでGPIO、I2Cを操作する方法です。もちろんこれはできない訳ではありません。しかしサンプルになるコードが多くないため、新しいセンサーを使おうと思うと仕様を調べたり、Xojoでの結果の受け取り方を調べた上で計算処理が必要になります。

デジタルデータのIN/OUTといった程度であればさほど難しくありません。例えば以下はLEDを光らせるサンプルです。

GPIO.SetupGPIO
  
Const kLEDPin = 4
  
GPIO.PinMode(kLEDPin, GPIO.OUTPUT)

GPIO.DigitalWrite(kLEDPin, GPIO.ON)

しかしアナログセンサーから値をとったり、LCDにメッセージを出したりするのは複雑なコードが必要になります。そのためにはセンサーの仕様を調べたり、ビット演算の伴うコーディングが必要になるでしょう。

2. シェルを使う

センサーのデータを授受する部分についてはPythonやNode.jsで作られた既存の資産がたくさん存在します。それらをXojoにトランスコードすることもできますが、直接シェルコマンドとして実行してしまうことで簡略化可能です。

Dim sh as new Shell
sh.Execute("hostname") // コマンドを実行

// sh.ReadAll で結果が受け取れます

開発中はリモートシェルを使いましょう

シェルコマンドを実行するとして、そのまま実行するとWindowsやMac OSX(またはLinux)上で実行されてしまい、Raspberry Piに繋がったセンサーの値は取得できません。そこで、開発時にはリモートシェルを使ってRaspberry Pi上でコマンドを実行するようにします。

リモートシェルは簡単で、SSHでログインしながらコマンドを実行するだけです。

$ ssh pi@raspberrypi.local ls -al
total 40
drwxr-xr-x 5 pi   pi   4096 Aug  1 05:47 .
drwxr-xr-x 3 root root 4096 May 27 11:09 ..
-rw------- 1 pi   pi    330 Aug  1 05:54 .bash_history
-rw-r--r-- 1 pi   pi    220 May 27 11:09 .bash_logout
-rw-r--r-- 1 pi   pi   3540 Aug  1 05:35 .bashrc
drwx------ 3 pi   pi   4096 Aug  1 05:26 .emacs.d
-rw-r--r-- 1 pi   pi    675 May 27 11:09 .profile
drwxr-xr-x 2 pi   pi   4096 Aug  1 05:26 .ssh

後は開発時(デスクトップ)と本番実行時(Raspberry Pi)が区別できるように処理を追加します。なお、公開鍵認証に設定しておく必要があります(そうしないとパスワードが求められるようになります)。

// XOJO_ENVは自分で追加した環境変数です
if System.EnvironmentVariable("XOJO_ENV") = "development" then
  App.command = "ssh pi@raspberrypi.local "
end

後はコマンドを実行する際にApp.commandを追加するだけです。デフォルトでは空文字なので、

  • Mac OSX : ssh pi@raspberrypi.local hostname
  • Raspberry Pi : hostname

が実行されるようになります。

Dim sh as new Shell
sh.Execute(App.command + "hostname")

// sh.ReadAll

後は普通に開発するだけです。デスクトップで実行した結果をそのままRaspberry Piで受け取れるようになります。ブレークポイントも使えますし、実際にセンサーの値も使えますので実データを使った開発ができるようになるはずです。

ライセンスの違い

ここで挙げておきたいのがやり方によってXojoのライセンスが異なるという点です。Raspberry Pi向けのCUIアプリケーションを作る場合、Raspbery Piのライセンスが必要になります。しかし例えばRaspberry Pi上で動作するWebアプリケーションを開発するのであればWebライセンスになります。つまりすでにWeb開発のライセンスを持っているのであれば、Raspberry Pi用のライセンスを買い足すことなく、IoTに関係するプロジェクトに踏み出せるようになります。


シェルやリモートシェルを使った方法であれば、これまでの一般的なシステム開発とは少し毛色の違うIoT/センサー部分を疎結合にし、実行結果だけをこれまでのXojoらしく使えるようになります。ブレークポイントデバッグも使えますので、従来の生産性の高い方法を使ったRaspberry Piアプリケーションの開発が実現するでしょう。

XojoでEndとEnd If、どちらがオススメか

Tips

Xojoは外部のプログラミング言語から良いところを取り込んで成長してきました。そのため、様々な書き方ができます。例えばコメントも、

' コメント
// コメント
REM コメント

のいずれも使えます。 'を使ったコメントはVBA風、//はJavaScriptなど、REMはBasic風です。

If 〜 Thenについても同様で、EndまたはEnd Ifが使えます。どちらが正しいという訳ではありませんが、

If ... Then

まで書いた後、Shift + Enterを押すと、

If ... Then
  
End If

と入力補完されます。他にも、

While ... do

と書いたところでShift + Enterを押すと、

While true do 
  
Wend

が入力されます。Shift + Enterで入力がぐっと楽になりますのでぜひお試しください。標準の方式として End If が補完されますので、そちらを使っていくのがXojoの基本構文と言えそうです。

Xojoでの共有メソッド、クラスメソッドの使い方

Tips

JavaRubyPythonなどで言うところのスタティックメソッド、クラスメソッドと呼ばれる機能はXojoでは共有メソッドと呼ばれます。共有メソッドを定義することで、クラスをインスタンス化しなくともメソッドが呼び出せるようになります。

共有メソッドと通常のクラスメソッドの違いは次の通りです。

  • 共有メソッドはクラスのインスタンス化せずに呼び出せる
  • 共有メソッドからはクラスのプロパティへアクセス不可

もしプロパティ的なものが必要な場合は、共有プロパティを使います。

共有プロパティの注意

共有プロパティはRubyでいうところのクラス変数に相当します。継承したクラスも含めて、インスタンス化されたクラスも影響を受ける変数になります。

もし ClassSample.shared_method があり、

System.DebugLog(shared_property)

といった形で共有プロパティを出力するだけだとします。デフォルト値は foo だとすると、

ClassSample.shared_method
-> foo
SubclassSample.shared_method
-> foo

// ここで書き換え
ClassSample.shared_property = "new"

SubclassSample.shared_method
-> new

といった形で継承したSubclassSampleも影響を受けます。これはインスタンス化されたクラスも同じで、

Dim c1 as new ClassSample
Dim c2 as new ClassSample

c1.shared_method
-> new

// ここで書き換え
c1.shared_property = "old"

SubclassSample.shared_method
-> old

c2.shared_method
-> old

となります。なお、継承したクラスの方で共有プロパティが定義されていたとしても、親クラスの共有プロパティが優先されます。影響範囲を考えると、共有プロパティは上書きしない方が良さそうです。またはデータベース接続などを共通の親クラスに持たせておくことで、全体で同じ接続を使えるようになるでしょう。

クラスをインスタンス化せずに使いたいメソッドは多いと思いますので、その際には共有メソッドとして定義しましょう。

重たい処理はスレッド&コールバックを使いましょう

Tips スレッド

XojoでWebアプリケーションを開発すると分かるのですが、JavaScript側では殆ど処理は行っていません。データをサーバサイドに送り、サーバ側で処理を行った結果をWebブラウザに返却します。その結果を受け取り、UIの更新を行うのがクライアントサイドの役割です。

つまり、処理的にはクライアントサイドだけで済むものであったとしても、一旦サーバ側に送られるのでネットワーク処理分の遅延が発生します。これにさらにデータベース側の処理であったり、メール処理などが重なると処理の遅れが気になるようになるかも知れません。

そこで使ってみたいのがスレッド処理になります。スレッド処理はメインとは別なプロセスを立ち上げて処理を行う仕組みです。

スレッドを使わない場合

スレッドを使わない場合、処理は次のように行われます。

f:id:moongift:20160718095733p:plain

処理は線形で、データベースなどの処理が終わらないと次の処理に進めません。JavaScriptのコールバック方式で苦しんだ経験がある人にとってはこちらの方が分かりやすいかも知れませんが、UIが絡む場合はユーザのストレスにつながりやすいのが欠点です。

スレッドを使う場合

スレッドを使うと次のようになります。

f:id:moongift:20160718095748p:plain

メインの処理とは別なプロセスになるので、まずは画面を更新してしまって、その後データベースなどの重たい処理を行うようになります。ユーザは別な処理が行えますので続けてデータ入力を行うと言った場合にも利用できます。

スレッドはライブラリのスレッドから追加できます。

f:id:moongift:20160722170611p:plain

また、Webアプリケーションとしてスレッドを使う場合は Superクラスを WebThread に設定してください。右上のインスペクタボタンを押して、スレッドのSuperの設定を変更してください。

f:id:moongift:20160725152404p:plain

なお、スレッドは引数を渡せないので注意してください。情報を渡す場合にはプロパティを使います。

' スレッドのインスタンス作成
Dim t as new backThread

' スレッドのプロパティに情報追加
t.message = TaskField.Text

' UIの処理は最初に行ってしまう
TaskList.AddRow(TaskField.Text)
TaskField.Text = ""

' スレッドの実行
t.run

スレッドの後はコールバックを呼びましょう

スレッド処理からのUIの操作や更新は基本的には避けたほうが良いでしょう。スレッド側は並列処理になるので、予期しないタイミングでUIが更新されたり、入力した内容が消えたりする可能性があります。

そこでスレッド側では最後にメッセージを返すようにし、それをメソッド側で受け取るようにしましょう。

Sub Run()
  // 何かの処理
  
  // 処理が成功した場合は空文字
  TaskManagerPage.Callback("")
  
  // エラーが起きた場合はエラーメッセージ
  TaskManagerPage.Callback("Error!")
End Sub

UIの変更はコールバック側で行うようにした方が良いでしょう。

Sub Callback(str as String)
  // 文字列の有無で処理判定
  If str <> "" Then
    // エラー
    // 画面にエラーメッセージを表示など
  Else
    // 何もしない
  End If
End Sub

重たい処理をメインスレッドで行おうとすると、UIが固まったようになってしまったり、ユーザは次の入力を行えずにイライラしてしまいます。スレッド化による並列処理を使ってスムーズな操作を実現してください。

面倒なWeb UIの操作はJavaScriptで行ってみましょう

XojoではWebアプリケーションであってもUI操作周りを含め、Xojoだけで記述ができます。しかし中にはクライアントサイドだけで行った方が早い処理もあるかも知れません。そんな時には無理せずJavaScriptを使うことも考えてみてはいかがでしょうか。

jQueryを使ってみる

今回はJavaScriptのライブラリとして有名なjQueryを使ってみたいと思います。まず App のインスペクタを表示し、HTML Headerを編集します。

f:id:moongift:20160718112656p:plain

例えば次のようにします。

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script>
<script src="/public.js"></script>

ここでjQueryについては外部CDNのもの、public.jsについてはこれから編集するものを指定しておきます。

JavaScriptファイルの追加

次にJavaScriptファイルを追加します。Xojoのプロジェクト外にあるファイル(例えばpublic.js)をXojoのプロジェクトにドラッグ&ドロップします。今回は分かりやすいようにResourcesというフォルダを作成し、その中に追加しました。名前がpublic1となっているのを確認します。

f:id:moongift:20160718112803p:plain

HandleURLの設定

AppのイベントハンドラとしてHandleURLを追加します。そして、次のように記述します。

if Request.Path = "public.js" then
  Request.MIMEType = "application/json"
  request.Status = 200
  Request.Print public1
  return true
end if

これは、リクエストされたパスが public.js だったら(/public.jsではないので注意してください)、リソースとして追加したpublic1の内容を返却するという指定です。最近のWebブラウザではmime-typeが正しく設定されていないと動かないこと、HTTPステータスを正しく返さないといけない点に注意してください。

JavaScriptイベントの設定

通常、jQueryであればDOM構築されたタイミングのイベントを使って次のようの記述するでしょう。

$(function() {
  
});

しかしXojoの場合、このタイミングではまだ周りのガワの部分しか描画されていません。この状態でDOMイベントを設定しても動きません。

そこで、JavaScriptを使用するWebPageのイベントハンドラとして Shownイベント(描画完了)を追加し、次のように記述します。

ExecuteJavaScript("XojoPageLoaded();")

これでJavaScriptを実行します。最後にpublic.jsの内容を次のようにします。関数名は自由に決めてもらって構いません。

function XojoPageLoaded() {
  // 例
  $("input[name='AddButton']").on('click', function(e) {
    alert("処理を開始します");
  })
}

注意点

Xojoで描画されるWebアプリケーションのコンポーネントはIDがランダムな文字列となっています。そのため、name属性を使ってCSSセレクタを記述するのが良いでしょう。


処理が開始したらインジケータを表示したり、フローティングメッセージを出す、キーボードの入力制御を行うといった仕組みはJavaScriptの方が簡単に実現できるでしょう。XojoとJavaScript、お互いの良さを使い分けてみてください。

Xojo 2016 リリース2、アイディアソン開催など! - Xojo ニュースレター 2016年7月号

ニュースレター

Xojo 2016 リリース2の登場です!

Xojo 2016 リリース2では iOS とWebアプリに大きな変更が、さらに全体として150 ヶ所以上の改良が行われました。 WebアプリでのHiDPI対応やWindowsのHiDPIでの大きな改良など、HiDPI(Retina)の対応も引き続き行われています。

iOSのサポートをリリースして以来、数多くの機能追加についてのリクエストをいただいてきました。 今回のリリースではいろいろな見逃せない機能が追加されています。 新しいiOSの機能として、以下のような機能が利用できるようになりました。
  • 大幅に改善されたTable
  • 位置情報サービス
  • 加速度センサーとジャイロスコープなどのモーションデータの取得
  • カメラロールやフォトライブラリから写真を選択したり、また新しく撮影した写真を選択することもできる PicturePicker コントロール
  • 画面の大きさよりも大きいUIレイアウトを表示することができる Scrollable Area を使うと、すべてのフィールドとコントロールが見られるように簡単に画面のスクロールをさせることができます。
  • テキスト、URL、写真などを他の登録されたアプリケーションと共有できるSharingPane
また、このリリースでは新しいビジュアル・ツールバー・エディタが搭載され、ツールバーの作成がより簡単になりました。 さらに起動時の画像設定が必須でなくなったためアプリ開発がシンプルになりました。

≫≫ 2016リリース2の改良点一覧(リリースノート)はこちら
≫≫ 2016リリース2のダウンロードはこちら
≫≫ ライセンスの更新はこちら



IoTのアイデアをみんなで考えるRaspberry Piアプリのアイデアソンを開催

イメージ画像



日経Linux/ソフトウエアが主催する「みんなのラズパイコンテスト」の協賛を記念してIoTの分野からも注目されているRaspberry Piを使ってIoTのアイデアを考えるアイデアソンを7月31日に神田・小川町にて開催します。チームを組んでコンテスト応募作品のアイデアを考えたり、センサーの使い方を学んだりできます。

会場には「ラズパイマガジン公式 Raspberry Pi販売サイト」で購入できる「電子工作入門キット」のセンサーなどを用意しておきますので、IoTに関心のある方はお気軽にご参加ください。
≫≫アイデアソンの詳細はこちら

7月22日開催のWebセミナー

Webセミナーでは、Xojoでアプリケーションを開発する具体的な方法を講師が解説します。7月22日はWebアプリケーション作成の基礎について学びます。Webアプリケーションの概念とコーディングの基本、HTML5による帳票の作成方法を解説します。Webセミナーの参加方法は下記のWebサイトから申し込みボタンをクリックし参加登録を行ってください。
≫≫ Webセミナーの参加登録


Xojo Inc.からの最新情報(英語)

Xojoデザイン・アワード

Xojo デザイン・アワードでは優秀なソフトウエアデザインに対して賞が贈られます。各賞はクリエイティビティを讃え、独立開発者を応援するために、高品質の製品を開発している開発者に対して授与されます。デザイン・アワードには以下の部門が用意されています。
  • 大賞(Best Overall)
  • ベスト iOS アプリ賞
  • ベストビジネスアプリ賞
  • ベストコンシューマアプリ賞
  • ストクロスプラットフォーム賞
  • ベストデベロッパーツール賞

審査対象は、創造性、簡便性、デザイン、機能、Xojo テクノロジーの利用などです。Xojoデザインアワードにエントリーするソフトウエアが(ベータ版ではなく)完成した製品としてリリースされている必要があります。受賞者には表彰盾とマーケティング素材として利用できる Xojo デザインアワードロゴの使用権が授与されます。
≫≫エントリー申し込みについての詳しい情報はこちら(英語サイト)

XDC にご参加ください

1年で最大のXojoイベントまであと数ヶ月を残すだけになりました。イベントでは基調演説、3つのパネルディスカッション、29のセッションをご用意。 また、夕食会はライブ音楽演奏や評判の高いイタリア料理などでお楽しみいただきます。
≫≫XDCの参加申し込みはこちら(英語サイト)

英語版Webセミナー開催予定

Microsoft Office Automation
Windows ユーザーのほとんどが導入しているMicrosoft OfficeをXojoで利用する方法を紹介します。Word、ExcelPowerPoint のファイルの読み書きと処理ができるアプリケーションの作成方法を解説します。
開催時刻:7月26日 アメリカ東部時間 PM1:00(日本時間7月27日 AM2:00)
≫≫ 参加登録

最近のブログ記事(英語)