2# GARMIN ConnectIQ プログラミング 環境構築 後編
1# GARMIN ConnectIQ プログラミング 環境構築編 - 私の記録ブログ
目次
Eclipseのダウンロードと設定
Eclipseのダウンロード
Java 開発環境 - Eclipse 日本語化 Pleiades プラグイン
①上のリンクから,Pleiades All in One Eclipse をダウンロードする.
最新版を選択する.2021年8月現在では Eclipse 2021 が最新版となっている.
②自分のOSに合う且つ,Full Edition,Java版を選択する.
③ダウンロードしたZIPファイルを「作業用フォルダ」に移動させ,「7-Zip」で展開する.
Eclipseのインストール
①展開した Pleiades All in One Eclipse フォルダを開き,pleiades > eclipse の中にある eclipse.exe を実行.勝手にインストールしてくれるみたい.
②起動するとワークスペースの場所を聞いてくるので変更したい場合は指定する.
ワークスペースは開発したプログラムのソースコードやリソースなどプロジェクトファイルを保存する場所になる.
③ショートカットは自動生成されないようなので,欲しい人は自分で作ってデスクトップに置いておく.
XMLプラグインをインストール
① 「ヘルプ」 → ② 「新規ソフトウェアのインストール」
→ ③ 「作業対象:」のプルダウンを開いて,「--すべての使用可能なサイト--」を選択
→ ④ ソフトウェア一覧が表示されてから「フィルター」に「Eclipse XML」と入力
→ ⑤ 「Eclipse XML エディターおよびツール」という項目が現れるのでチェックをつける
→ ⑥ 「次へ」をクリック → ⑦ プラグインインストール完了
Connect IQプラグインをインストール
① 「ヘルプ」 → ② 「新規ソフトウェアのインストール」
→ ③ 「作業対象:」のテキストボックスに以下のURLを入力し,「追加」ボタン.
http://developer.garmin.com/downloads/connect-iq/eclipse/
→ ④ リポジトリの追加ダイアログで,「名前:」に「ConnectIQplugin」と入力
→ ⑤ リスト中の「Connect IQ IDE」と「SDK Manager」の両方にチェックを付け、「次へ」
→ ⑥インストール中にいろいろ確認されるので了解する
→ ⑦ メニューバーに Connect IQ メニューが表示されていれば、プラグインインストール完了
Connect IQプラグインを設定
Connect IQ のSDKがあるところを指定する.
① 「ウィンドウ」 → ② 「設定」 → ③ 左側項目で「Connect IQ」を選択する →
④ 「Use the SDK Path specified by the SDK Manager」にチェックが付いていることを確認する.
この欄が無かったら「SDK Root Directory :」にSDKのフォルダを指定して「適用」を選択する.
※指定するフォルダはbinではないので注意. → ⑤ 閉じる
Connect IQ が使いやすいレイアウトを設定する.
⑥「ウィンドウ」→ ⑦ 「パースペクティブ」>「パースペクティブを開く」>「その他」
→ ⑧ 「Connect IQ」を選択して「OK」→ ⑨設定完了
最後に
ここまでで何か質問やご意見はございませんでしょうか?
気になることがあれば遠慮なくメッセージを飛ばして下さい.
もし返信が遅いと思われた方は,お手数をお掛けしますが ツイッター@nao_cyclin2 までご連絡ください.DMでも,リプでも構いません.
3# GARMIN ConnectIQ プログラミング サンプルプロジェクト編
今回は Connect IQ SDK に含まれているサンプルプロジェクトをインポートします.そして,含まれているプロジェクトをシミュレーションしてみたり,自作のプロジェクト(設定ほとんどなし)を作成しデバイスで表示したりします.
1# GARMIN ConnectIQ プログラミング 環境構築 前編 - 私の記録ブログ
目次
参考記事
以下の記事を参考にしながら2021年8月現在でのシミュレーション方法をまとめます.
げんまい様,やお様,Take4-blue様,本当にありがとうございます.
手順
サンプルプロジェクトのインポート
①「ファイル」 > 「インポート」
②インポート画面の 「一般」 > 「既存のプロジェクトをワークスペースへ」 > 「次へ」
③Connect IQ SDK をダウンロードしたときのフォルダから「Sample」を選択
>プロジェクト欄にサンプルプログラムが表示されるので,すべて選択されていることを確認
>「プロジェクトをワークスペースにコピー」にチェックを入れて「完了」
※「Sample」が見つけられない人へ
「Connect IQ」 > 「サンプル」 を選択すると,サンプルフォルダが開く.ここのパスをコピペする.
④Ecilipse 左側のプロジェクトブラウザにインポートしたプロジェクトが表示されていれば成功.
サンプルプロジェクトの選択
今回はサンプルプロジェクトに含まれる「SimpleDataField」を実行する.その前に,ソースコードを確認する.
①サンプルエクスプローラー内の 「SimpleDataField」>「source」>「SimpleDataFieldApp.mc」を開く.
②11~13行目のコメントアウトを確認する
//! This app is a simple data field that alternates //! between showing heart rate, distance and total time. //! It also uses the data field settings and alerts.
分かりやすそうな内容なので,このプロジェクトを実行する.
シミュレーション実行
①「実行」>「実行構成」
②実行構成の左の一覧から「Connect IQ App」>「新規構成」
③プロジェクトの選択「SimpleDataField」>デバイス「ForeAthlete945」>「適用」>「実行」
④コンパイルが成功すると,このようなシミュレータが別ウインドウで立ち上がる.
シミュレーション操作
こちらの記事はIOSでの解説になっていますが,Windowsでの操作と変わらないのでご覧ください.
【ConnectIQプログラミング2】サンプルプロジェクトの実行(実機とシミュレータ) - 旅に出たり、走ったり、旅に出て走ったり
プロジェクトの作成
簡単なソースを作成する.
①「ファイル」>「新規」>「Connect IQ Project」
②プロジェクト名:「naoDigital」(適当に)>「次へ」
③プロジェクト・タイプの選択「Watch Face」>Veresion「0.0.0」>Level「4.0x」(最新)>「次へ」
④左の一覧から「Simple」(適当)>「次へ」
⑤デバイスの一覧から,自分が持っているものを選択>「完了」
⑥ビルドが成功すると,プロジェクトエクスプローラに②でつけたプロジェクト名が追加されている.
ビルドとシミュレータでの実行
ソースが完成したので,シミュレーションを実行する.
①先ほどと同じ要領で,変更点は
プロジェクトの選択「naoDigital」>デバイス「Venu2S」>レベル「4.0x」
②自分のと同じデバイスが表示されれば成功.
実機テスト
実行プログラムをデバイスに送信しテストする.
①充電器でPCーデバイスを接続する.USB認識が出来ればデバイスの名前が表示される.
②エクスプローラの「Venu S2」>「Primary」>「GARMIN」>「APPS」を開く
③ビルドしたプログラムは「.pro」拡張子なので,これをコピーする.
Ecilipseの「naoDigital」>「bin」を開き,「naoDigital.pro」をコピー
④エクスプローラの「APPS」に貼り付け,USBからスマートウォッチを外したのち、ウォッチフェイスを変更することで動かすことが出来る.
⑤このウォッチフェイスの削除は,またPCとつないでAPPから削除する.
最後に
ここまでで何か質問やご意見はございませんでしょうか?
気になることがあれば遠慮なくメッセージを飛ばして下さい.
もし返信が遅いと思われた方は,お手数をお掛けしますが ツイッター@nao_cyclin2 までご連絡ください.DMでも,リプでも構いません.
0# GARMIN ConnectIQ プログラミング 関連記事まとめ
目次
3# サンプルプログラミング実行編
naolllab.hatenablog.com
1# GARMIN ConnectIQ プログラミング 環境構築 前編
Atcoder ABC 143 を解いてみた(python3)
- -A. Curtain
- -B. TAKOYAKI FESTIVAL 2019
- -C. Slimes
- -D. Triangles
- -E. Travel by Car
- -F. Distinct Numbers
解説動画【YouTube】
-A. Curtain
問題ページ【A - Curtain】
問題文
窓の横方向の長さはAであり、横方向の長さがBのカーテンが2枚取り付けられています。
(カーテンは縦方向には窓を覆うのに十分な長さがあります。)
窓のうちカーテンで隠されていない部分の横方向の長さが最小になるようにカーテンを閉めます。このとき、カーテンで隠されていない部分の合計の横方向の長さを求めてください。
制約
- 1 ≦ A ≦ 100
- 1 ≦ B ≦ 100
- A, B は整数である。
考え
与えられたカーテンの長さを二倍にして窓の長さと比較する。
カーテンが長い場合は 0 を出力し、それ以外の場合は余った窓の長さを出力する。
解法
私のコンテスト中の解法
# -*- coding: utf-8 -*- a, b = map(int, input().split()) if a <= b*2: print('0') else: print(a-b*2)
実行時間:17 ms メモリ:2940 KB
-B. TAKOYAKI FESTIVAL 2019
問題ページ【B - TAKOYAKI FESTIVAL 2019】
問題文
N個のたこ焼きがふるまわれる予定です。このうち i 個目のたこ焼きのおいしさは di です。
ところで、おいしさが x と y であるたこ焼きを一緒に食べると、体力が x × y 回復することが一般に知られています。
N個のたこ焼きから、2個を選ぶ方法は通り考えられます。それぞれについて、一緒に食べたときの体力の回復量を求めて、その総和を出力してください。
制約
- 入力は全て整数である。
- 2≦ N ≦ 50
- 1≦ di ≦ 100
考え
愚直に全組み合わせを計算して、合計値に足していく。
解法
私のコンテスト中の解法
# -*- coding: utf-8 -*- n = int(input()) d = list(map(int, input().split(' '))) ans = 0 for i in range(n-1): for j in range(i+1, n): ans = ans + d[i]*d[j] print(ans)
実行時間:17 ms メモリ:2940 KB
-C. Slimes
問題ページ【C - Slimes】
問題文
N匹のスライムが横一列に並んでいます。これらの色に関する情報が、長さNの英小文字からなる文字列Sで与えられています。左から i 番目のスライムは、Sの i 文字目に対応する色を持っています。
同じ色を持ち隣接するスライムは融合し、色は変わらずに1匹のスライムとなります。このとき、融合した後のスライムは、融合する前の各スライムが隣接していた他のスライムと隣接した状態になります。
最終的に存在するスライムは何匹となるでしょうか。
制約
- 1 ≦ N ≦
- = N
- Sは小文字からなる。
考え
文字列のすべての隣接関係を調べて、それが異なったときカウントを増やす。
解法
私のコンテスト中の解法
# -*- coding: utf-8 -*- n = int(input()) s = list(input()) # 1種類は確実にいる ans = 1 s1 = s[0] for i in range(1, n): s2 = s[i] if s1 != s2: ans += 1 s1 = s[i] print(ans)
実行時間:182 ms メモリ:13476 KB
-D. Triangles
問題ページ【D - Triangles】
問題文
本の棒があり、 本目の棒の長さは です。
これらのうち3本の棒を使って三角形を作ります。このとき、棒の長さを として、以下の条件がすべて成り立たなければなりません。
作れる三角形は何種類あるでしょうか。ただし、2つの三角形は、そのうちー方のみに使われている棒が存在するときに異なるとします。
制約
- 入力は全て整数。
考え
※3重ループで愚直に解いたらTLEになりました。(じつはC++だと通るらしい。)
AtCoder の解説動画を参考にしました。
ここでの条件を以下とする
a < b < c
a + b > c
棒が7本あるとする
L = 2, 3, 4, 6, 6, 7, 10
a = 3, b = 6
と置くと a+b = 9 となり、条件より c = 6, 7となる。つまり
b < c < a+b
a+b の境目を探すのに時間がかかっちゃうので、にぶたん(二分探索)を使う。
にぶたんとは
【YouTube】
python標準ライブラリで簡単にぶたん
【Python標準ライブラリ:順序維持のbisect - Qiita】
解法
解説をpythonで書き直してみました。
# -*- coding: utf-8 -*- # にぶたん用 from bisect import bisect_left n = int(input()) l = sorted(list(map(int, input().split(' ')))) ans = 0 for i in range(n-1): for j in range(i+1, n): a = l[i] b = l[j] ab = a+b idx = bisect_left(l, ab) # b < c < idx ans += max(0, idx-j-1) print(ans)
実行時間:1918 ms メモリ:3188 KB
-E. Travel by Car
問題ページ【E - Travel by Car】
-F. Distinct Numbers
問題ページ【F - Distinct Numbers】
Atcoder ABC 125 を解いてみた(python3)
-A. Biscuit Generator
問題ページ【A - Biscuit Generator】
問題文
ビスケット生産装置を起動すると、起動してから A 秒後、2A 秒後、3A 秒後、... (A の倍数秒後) にB枚ずつビスケットを生産します。
ビスケット生産装置を起動してから T+0.5秒後までに生産されるビスケットの合計枚数を求めてください。
規約
- 入力は全て整数である。
- 1 ≦ A, B, T ≦ 20
考え
時間内に何回ビスケットを生産出来るか求める。
あとは一回の生産で、生産できるビスケットの枚数を掛けてあげればいい。
解法
私のコンテスト中の解法
# -*- coding: utf-8 -*- a, b, t = map(int, input().split()) # 何回生産出来るか p = (t+0.5)//a ans = p*b print(ans)
実行時間:17 ms メモリ:2940 KB
-B. Resale
問題ページ【B - Resale】
問題文
N 個の宝石があり、i 番目の宝石の価値は Viです。
あなたはこれらの宝石の中からいくつかを選んで手に入れます。
このとき、1つも選ばなくとも、全て選んでも構いません。
ただし、i番目の宝石を手に入れる場合コスト Ciを支払わなければいけません。
手に入れた宝石の価値の合計を X、支払ったコストの合計を Yとします。
X−Yの最大値を求めてください。
規約
- 入力は全て整数である。
- 1≦ N ≦ 20
- 1≦ Ci, Vi ≦ 50
考え
つまり宝石を手に入れて、利益が最大になるときを求めるってこと。
N個の宝石それぞれについて利益を求めて、正になったとき合計に足していけばいい。
解法
私のコンテスト中の解法
# -*- coding: utf-8 -*- n = int(input()) v = list(map(int, input().split())) c = list(map(int, input().split())) sum = 0 for i in range(n): xy = v[i]-c[i] if xy >0: sum = sum+xy print(sum)
実行時間:18 ms メモリ:3060 KB
-C. GCD on Blackboard
問題ページ【C - GCD on Blackboard】
問題文
N 個の整数 A1,A2,...,ANが黒板に書かれています。
あなたはこの中から整数を 1つ選んで、1 以上 109
以下の好きな整数に書き換えます。
元の整数と同じ整数に書き換えても構いません。
書き換えた後の N個の整数の最大公約数の最大値を求めてください。
規約
- 入力は全て整数である。
- 2 ≦ N ≦
- 1 ≦ Ai ≦
考え
与えられた数列から一つ数字を飛ばして最大公約数を求める。
その一つ飛ばす位置を変えながら、最大になる最大公約数を探したい。
実装したらTLEになってしまったので、けんちょんさんの精進ブログを参考にさせていただきました。
http://drken1215.hatenablog.com/entry/2019/04/27/224100_1drken1215.hatenablog.com
解法
pythonで実装してみました。
# -*- coding: utf-8 -*- # 最大公約数を求める def gcd(a,b): if b==0:return a return gcd(b,a%b) # 入力 n = int(input()) a = list(map(int, input().split())) # 累積GCD left = [0]*(n+1) right = [0]*(n+1) for i in range(n): left[i+1] = gcd(left[i], a[i]) for i in reversed(range(n)): right[i] = gcd(right[i+1], a[i]) # 集計 ans = 0 for i in range(n): l = left[i] r = right[i+1] print(l,r) ans = max(ans, gcd(l, r)) print(ans)
実行時間:234 ms メモリ:14584 KB
Tenka1 Programmer Beginner Contest 2019 を解いてみた(python3)
-A. [AC] On the Way
問題ページ【A - On the Way】
私のコンテスト中の解法(解説も同じような解法)
# -*- coding: utf-8 -*- a,b,c = map(int,input().split() ) if a<c<b or b<c<a: print('Yes') else: print('No')
実行時間:17 ms メモリ:2940 KB
-B. [AC] *e**** ********e* *e****e* ****e**
問題ページ【B - *e**** ********e* *e****e* ****e**】
私のコンテスト中の解法(解説も同じような解法)
# -*- coding: utf-8 -*- n = int(input()) s = list(input()) k = int(input()) c = s[k-1] for i in range(n): if s[i] != c: s[i] = '*' # 文字列に直す ans = "".join(s) print(ans)
実行時間:17 ms メモリ:3060 KB
K番目の文字を[k-1]で取得して、cに代入。
文字列Sを全部調べて、cと同じ時 '*' と置き換える。
最後にlistからstringに直して出力。
-C. Stones
問題ページ【C - Stones】
解説を参考に解いたが
解き方が合っているは分からない
# サンプル1 # . # この問題の場合、色を変更し終わったあと 次のうちどれかになる # # # # (すべて黒) # . # # (途中で白から黒に変わる) # . . # (途中で白から黒に変わる) # . . . (すべて白) どのときに一番変更が少なくなるのかを探す。
# -*- coding: utf-8 -*- n = int(input()) s = list(input()) # 黒の累積和 sum_b = [0]*(n+1) # 白の累積和 sum_w = [0]*(n+1) # 例えば # # . # (問題) # 0 1 1 2 (黒の累積和) # 0 0 1 1 (白の累積和) for i in range(n): if s[i] == '#': sum_b[i+1] = sum_b[i] + 1 else: sum_b[i+1] = sum_b[i] if s[i] == '.': sum_w[i+1] = sum_w[i] + 1 else: sum_w[i+1] = sum_w[i] ans = n for i in range(n+1): # 0番目からi番目までの黒の数 black = sum_b[i] # i+1番目からn番目(最後)までの白の数 white = sum_w[n]-sum_w[i] ans = min(ans, black + white) print(ans)
実行時間:233 ms メモリ:14148 KB
白と黒の累積和を別々に求めた。
最後のforループで、どこが白と黒の境目になったときに変更する文字が少なくなるかを探している。