私の記録ブログ

趣味の記録

2# GARMIN ConnectIQ プログラミング 環境構築 後編

2021年8月
f:id:naolllab:20210811020436p:plain
GARMINのウォッチフェイスが可愛くない!!!
そこでウォッチフェイスを自作することを決意し,そのメモを残す.



目次

Eclipseのダウンロードと設定

Eclipseのダウンロード

Java 開発環境 - Eclipse 日本語化 Pleiades プラグイン
①上のリンクから,Pleiades All in One Eclipse をダウンロードする.
最新版を選択する.2021年8月現在では Eclipse 2021 が最新版となっている.

②自分のOSに合う且つ,Full Edition,Java版を選択する.

f:id:naolllab:20210811024607p:plain

③ダウンロードしたZIPファイルを「作業用フォルダ」に移動させ,7-Zipで展開する.

Eclipseのインストール

①展開した Pleiades All in One Eclipse フォルダを開き,pleiades > eclipse の中にある eclipse.exe を実行.勝手にインストールしてくれるみたい.

f:id:naolllab:20210811025426p:plain

②起動するとワークスペースの場所を聞いてくるので変更したい場合は指定する.
ワークスペースは開発したプログラムのソースコードやリソースなどプロジェクトファイルを保存する場所になる.

f:id:naolllab:20210811025446p:plain

③ショートカットは自動生成されないようなので,欲しい人は自分で作ってデスクトップに置いておく.

XMLプラグインをインストール

① 「ヘルプ」 → ② 「新規ソフトウェアのインストール」

→ ③ 「作業対象:」のプルダウンを開いて,「--すべての使用可能なサイト--」を選択

→ ④ ソフトウェア一覧が表示されてから「フィルター」に「Eclipse XML」と入力

→ ⑤ 「Eclipse XML エディターおよびツール」という項目が現れるのでチェックをつける

→ ⑥ 「次へ」をクリック → ⑦ プラグインインストール完了

f:id:naolllab:20210811031114p:plain

Connect IQプラグインをインストール

① 「ヘルプ」 → ② 「新規ソフトウェアのインストール」

→ ③ 「作業対象:」のテキストボックスに以下のURLを入力し,「追加」ボタン.

http://developer.garmin.com/downloads/connect-iq/eclipse/

→ ④ リポジトリの追加ダイアログで,「名前:」に「ConnectIQplugin」と入力

→ ⑤ リスト中の「Connect IQ IDE」と「SDK Manager」の両方にチェックを付け、「次へ」

→ ⑥インストール中にいろいろ確認されるので了解する

→ ⑦ メニューバーに Connect IQ メニューが表示されていれば、プラグインインストール完了

f:id:naolllab:20210811033214p:plain

Connect IQプラグインを設定

Connect IQ のSDKがあるところを指定する.

① 「ウィンドウ」 → ② 「設定」 → ③ 左側項目で「Connect IQ」を選択する →

④ 「Use the SDK Path specified by the SDK Manager」にチェックが付いていることを確認する.

この欄が無かったら「SDK Root Directory :」にSDKのフォルダを指定して「適用」を選択する.
※指定するフォルダはbinではないので注意. → ⑤ 閉じる

f:id:naolllab:20210811092858p:plain

Connect IQ が使いやすいレイアウトを設定する.

⑥「ウィンドウ」→ ⑦ 「パースペクティブ」>「パースペクティブを開く」>「その他」

→ ⑧ 「Connect IQ」を選択して「OK」→ ⑨設定完了

f:id:naolllab:20210811091526p:plain

BMFontのダウンロード

BMFont - AngelCode.com
上のリンクからサイトへ飛び,「Downloads」のリンクからダウンロードする.
使い方は今後説明する.

今回は以上です.

最後に


ここまでで何か質問やご意見はございませんでしょうか?
気になることがあれば遠慮なくメッセージを飛ばして下さい.

もし返信が遅いと思われた方は,お手数をお掛けしますが ツイッター@nao_cyclin2 までご連絡ください.DMでも,リプでも構いません.

3# GARMIN ConnectIQ プログラミング サンプルプロジェクト編

2021年8月
f:id:naolllab:20210811020436p:plain
GARMINのウォッチフェイスが可愛くない!!!
そこでウォッチフェイスを自作することを決意し,そのメモを残す.


今回は Connect IQ SDK に含まれているサンプルプロジェクトをインポートします.そして,含まれているプロジェクトをシミュレーションしてみたり,自作のプロジェクト(設定ほとんどなし)を作成しデバイスで表示したりします.

f:id:naolllab:20210812214630p:plain




目次

開発環境

PC OS : Windows 10 Pro 64bit
WATCH : GARMIN Venu 2S

手順

サンプルプロジェクトのインポート

①「ファイル」 > 「インポート」

②インポート画面の 「一般」 > 「既存のプロジェクトをワークスペースへ」 > 「次へ」

f:id:naolllab:20210812001905p:plain

③Connect IQ SDK をダウンロードしたときのフォルダから「Sample」を選択

>プロジェクト欄にサンプルプログラムが表示されるので,すべて選択されていることを確認

>「プロジェクトをワークスペースにコピー」にチェックを入れて「完了」

f:id:naolllab:20210812001948p:plain

※「Sample」が見つけられない人へ
「Connect IQ」 > 「サンプル」 を選択すると,サンプルフォルダが開く.ここのパスをコピペする.

f:id:naolllab:20210812002018p:plain

④Ecilipse 左側のプロジェクトブラウザにインポートしたプロジェクトが表示されていれば成功.

f:id:naolllab:20210812002032p:plain

サンプルプロジェクトの選択

今回はサンプルプロジェクトに含まれる「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」>「適用」>「実行」

f:id:naolllab:20210812043304p:plain

コンパイルが成功すると,このようなシミュレータが別ウインドウで立ち上がる.

f:id:naolllab:20210812043321p:plain

シミュレーション操作

こちらの記事はIOSでの解説になっていますが,Windowsでの操作と変わらないのでご覧ください.
【ConnectIQプログラミング2】サンプルプロジェクトの実行(実機とシミュレータ) - 旅に出たり、走ったり、旅に出て走ったり

プロジェクトの作成

簡単なソースを作成する.

①「ファイル」>「新規」>「Connect IQ Project」

②プロジェクト名:「naoDigital」(適当に)>「次へ」

f:id:naolllab:20210812214713p:plain

③プロジェクト・タイプの選択「Watch Face」>Veresion「0.0.0」>Level「4.0x」(最新)>「次へ」

④左の一覧から「Simple」(適当)>「次へ」

f:id:naolllab:20210812214734p:plain

⑤デバイスの一覧から,自分が持っているものを選択>「完了」

⑥ビルドが成功すると,プロジェクトエクスプローラに②でつけたプロジェクト名が追加されている.

f:id:naolllab:20210812214846p:plain

ビルドとシミュレータでの実行

ソースが完成したので,シミュレーションを実行する.

①先ほどと同じ要領で,変更点は
プロジェクトの選択「naoDigital」>デバイス「Venu2S」>レベル「4.0x」

②自分のと同じデバイスが表示されれば成功.

f:id:naolllab:20210812214909p:plain

実機テスト

実行プログラムをデバイスに送信しテストする.

①充電器でPCーデバイスを接続する.USB認識が出来ればデバイスの名前が表示される.

エクスプローラの「Venu S2」>「Primary」>「GARMIN」>「APPS」を開く

③ビルドしたプログラムは「.pro」拡張子なので,これをコピーする.

Ecilipseの「naoDigital」>「bin」を開き,「naoDigital.pro」をコピー

f:id:naolllab:20210812215000p:plain

エクスプローラの「APPS」に貼り付け,USBからスマートウォッチを外したのち、ウォッチフェイスを変更することで動かすことが出来る.

f:id:naolllab:20210812215023p:plain

⑤このウォッチフェイスの削除は,またPCとつないでAPPから削除する.

最後に

▼次回
なににしようかしら・・・


▼関連記事
0# GARMIN ConnectIQ プログラミング 関連記事まとめ - 私の記録ブログ


ここまでで何か質問やご意見はございませんでしょうか?
気になることがあれば遠慮なくメッセージを飛ばして下さい.

もし返信が遅いと思われた方は,お手数をお掛けしますが ツイッター@nao_cyclin2 までご連絡ください.DMでも,リプでも構いません.

0# GARMIN ConnectIQ プログラミング 関連記事まとめ

2021年8月
f:id:naolllab:20210811020436p:plain
GARMINのウォッチフェイスが可愛くない!!!
そこでウォッチフェイスを自作することを決意し,そのメモを残す.


目次

GARMIN ConnectIQ プログラミング

GARMIN のウォッチフェイスを自作したい方は,以下の記事を参考にしてください.

1# 環境構構築 前編

Coneccte IQ SDK のインストールについて,詳細に解説しています.
naolllab.hatenablog.com


2# 環境構構築 後編

1#の続きです.
EclipseとBMFontのインストールについて,詳細に解説しています.
naolllab.hatenablog.com


3# サンプルプログラミング実行編

ついにシミュレーターを動かして,開発の方法を学んでいきます.
naolllab.hatenablog.com

1# GARMIN ConnectIQ プログラミング 環境構築 前編

2021年8月
f:id:naolllab:20210811020436p:plain
GARMINのウォッチフェイスが可愛くない!!!
そこでウォッチフェイスを自作することを決意し,そのメモを残す.



長くなりそうなので,今回は前半・後半に分けて環境構築について詳しく説明する.


目次

  • 開発環境
  • 参考記事
  • ダウンロード・インストールするモノ紹介
  • 手順
    • 初めに
    • Connect IQ SDKの導入
      • 1 - SDKマネージャーのダウンロード
      • 2 - SDKのダウンロード
      • 3 - 環境変数設定
      • 4 - DevelopperKeyの生成

開発環境

PC OS : Windows 10 Pro 64bit
WATCH : GARMIN Venu 2S

参考記事

以下の記事を参考にしながら2021年8月現在での環境構築方法をまとめます.
げんまい様,やお様,本当にありがとうございます.

  1. やおの備忘録: Garmin Connect IQ プログラミング【SDKおよび開発環境の導入】
  2. 【ConnectIQプログラミング1】SDKおよび開発環境の導入 - 旅に出たり、走ったり、旅に出て走ったり

ダウンロード・インストールするモノ紹介

Connect IQ SDK - ソフトウェア開発キット

Get the SDK | Connect IQ | Garmin Developers

続きを読む

Atcoder ABC 143 を解いてみた(python3)

解説動画【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個を選ぶ方法は\frac{N×(N-1)}{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 ≦ 10^{5}
  • |S| = 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

問題文

N 本の棒があり、 i 本目の棒の長さは L_{i} です。

これらのうち3本の棒を使って三角形を作ります。このとき、棒の長さを a, b, c として、以下の条件がすべて成り立たなければなりません。

  • a\ <\ b\ +\ c
  • b\ <\ c\ +\ a
  • c\ <\ a\ +\ b

作れる三角形は何種類あるでしょうか。ただし、2つの三角形は、そのうちー方のみに使われている棒が存在するときに異なるとします。

制約

  • 入力は全て整数。
  • 3\ ≦\ N\ ≦\ 2\ ×\ 10^3
  • 1\ ≦\ L_i\ ≦\ 10^3


考え

※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 ≦ 10^{5}
  • 1 ≦ Ai ≦ 10^{9}


考え

与えられた数列から一つ数字を飛ばして最大公約数を求める。
その一つ飛ばす位置を変えながら、最大になる最大公約数を探したい。

実装したら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

-D. Flipping Signs

問題ページ【D - Flipping Signs

今度やります。TT

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ループで、どこが白と黒の境目になったときに変更する文字が少なくなるかを探している。

-D. Three Colors

問題ページ【D - Three Colors

今度やります。TT